{"version":3,"file":"cometchat-chat-uikit-angular.mjs","sources":["../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/localize-data.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/localize-helpers.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/cometchat-localize.ts","../../../projects/cometchat-uikit/src/lib/UIKitSettings.ts","../../../projects/cometchat-uikit/src/lib/utils/CometChatLogger.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatSoundManager/CometChatSoundManager.ts","../../../projects/cometchat-uikit/src/lib/CometChatUIKitLoginListener.ts","../../../projects/cometchat-uikit/src/lib/events/event-utils.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatMessageEvents.ts","../../../projects/cometchat-uikit/src/lib/constants.ts","../../../projects/cometchat-uikit/src/lib/utils/ChatSdkEventInitializer.ts","../../../projects/cometchat-uikit/src/lib/CometChatCalls.ts","../../../projects/cometchat-uikit/src/lib/Enums/Enums.ts","../../../projects/cometchat-uikit/src/lib/CometChatUIKitUtility.ts","../../../projects/cometchat-uikit/src/lib/cometchat-uikit.utils.ts","../../../projects/cometchat-uikit/src/lib/cometchat-uikit.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/translate.pipe.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/calendar-date.pipe.ts","../../../projects/cometchat-uikit/src/lib/resources/CometChatLocalize/index.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatActions.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatActionsIcon.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatActionsView.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatMessageComposerAction.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatOption.ts","../../../projects/cometchat-uikit/src/lib/modals/CometChatAIAssistantTools.ts","../../../projects/cometchat-uikit/src/lib/modals/index.ts","../../../projects/cometchat-uikit/src/lib/interfaces/index.ts","../../../projects/cometchat-uikit/src/lib/services/connection-state.service.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatConversationEvents.ts","../../../projects/cometchat-uikit/src/lib/services/conversations.listeners.ts","../../../projects/cometchat-uikit/src/lib/services/conversations.utils.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatCallEvents.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatGroupEvents.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatUserEvents.ts","../../../projects/cometchat-uikit/src/lib/services/conversations.ui-events.ts","../../../projects/cometchat-uikit/src/lib/services/conversations.service.ts","../../../projects/cometchat-uikit/src/lib/services/chat-state.service.ts","../../../projects/cometchat-uikit/src/lib/services/templates.service.ts","../../../projects/cometchat-uikit/src/lib/services/message-header.listeners.ts","../../../projects/cometchat-uikit/src/lib/services/message-header.utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-header.service.ts","../../../projects/cometchat-uikit/src/lib/utils/message-metadata-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-composer.utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-composer.service.ts","../../../projects/cometchat-uikit/src/lib/services/content-editable-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/selection-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/format-manager.dom.ts","../../../projects/cometchat-uikit/src/lib/services/format-manager.utils.ts","../../../projects/cometchat-uikit/src/lib/services/format-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/history-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/list-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/link-manager.class.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-text-formatter.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-mentions-formatter.types.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-mentions-formatter.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.markdown-utils.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.mention-utils.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.keydown-handler.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.paste-handler.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.custom-formatters.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.format-ops.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.selection-ops.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.mention-ops-class.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.input-handler.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.markdown-detector.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.block-exit.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.mention-deletion.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.class.ts","../../../projects/cometchat-uikit/src/lib/services/rich-text-editor.service.ts","../../../projects/cometchat-uikit/src/lib/services/message-utils.service.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.error-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.reaction-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.listeners.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.sent-handler.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.message-ops.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.fetch-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.reaction-ops.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.read-ops.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.typing-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.translation-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.request-builder.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.conversation-utils.ts","../../../projects/cometchat-uikit/src/lib/services/message-list.service.ts","../../../projects/cometchat-uikit/src/lib/services/message-bubble-config.service.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-url-formatter.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-markdown-formatter.ts","../../../projects/cometchat-uikit/src/lib/services/formatter-config.service.ts","../../../projects/cometchat-uikit/src/lib/services/html-sanitizer.service.ts","../../../projects/cometchat-uikit/src/lib/events/CometChatUIEvents.ts","../../../projects/cometchat-uikit/src/lib/services/incoming-call.service.ts","../../../projects/cometchat-uikit/src/lib/services/outgoing-call.service.ts","../../../projects/cometchat-uikit/src/lib/services/call-buttons.service.ts","../../../projects/cometchat-uikit/src/lib/services/ongoing-call.service.ts","../../../projects/cometchat-uikit/src/lib/utils/GroupMemberUtils.ts","../../../projects/cometchat-uikit/src/lib/services/group-members.service.ts","../../../projects/cometchat-uikit/src/lib/services/call-logs.service.ts","../../../projects/cometchat-uikit/src/lib/services/global-config.service.ts","../../../projects/cometchat-uikit/src/lib/utils/keyboard-utils.ts","../../../projects/cometchat-uikit/src/lib/services/focus-trap.service.ts","../../../projects/cometchat-uikit/src/lib/services/live-announcer.service.ts","../../../projects/cometchat-uikit/src/lib/services/list-navigation.service.ts","../../../projects/cometchat-uikit/src/lib/services/grid-navigation.service.ts","../../../projects/cometchat-uikit/src/lib/services/call-announcer.service.ts","../../../projects/cometchat-uikit/src/lib/services/dialog-focus-manager.service.ts","../../../projects/cometchat-uikit/src/lib/services/type-ahead.service.ts","../../../projects/cometchat-uikit/src/lib/services/list-selection-manager.class.ts","../../../projects/cometchat-uikit/src/lib/services/media-controls.service.ts","../../../projects/cometchat-uikit/src/lib/services/mentions-navigation.service.ts","../../../projects/cometchat-uikit/src/lib/services/conversation-subtitle.service.ts","../../../projects/cometchat-uikit/src/lib/services/theme.service.ts","../../../projects/cometchat-uikit/src/lib/services/cometchat-ai-streaming.service.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/search-filter.utils.ts","../../../projects/cometchat-uikit/src/lib/services/search-messages.service.ts","../../../projects/cometchat-uikit/src/lib/services/search-conversations.service.ts","../../../projects/cometchat-uikit/src/lib/services/notification-unread-count.service.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-error-boundary/cometchat-error-boundary.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-error-boundary/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-action-sheet/cometchat-action-sheet.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-action-sheet/cometchat-action-sheet.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-avatar/cometchat-avatar.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-avatar/cometchat-avatar.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-button/cometchat-button.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-button/cometchat-button.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-confirm-dialog/cometchat-confirm-dialog.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-confirm-dialog/cometchat-confirm-dialog.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-link-dialog/cometchat-link-dialog.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-link-dialog/cometchat-link-dialog.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-link-popover/cometchat-link-popover.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-link-popover/cometchat-link-popover.component.html","../../../projects/cometchat-uikit/src/lib/utils/util.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-context-menu/cometchat-context-menu.utils.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-context-menu/cometchat-context-menu.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-context-menu/cometchat-context-menu.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-date/cometchat-date.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-date/cometchat-date.component.html","../../../projects/cometchat-uikit/src/lib/utils/message-preview-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversation-item/cometchat-conversation-item.utils.ts","../../../projects/cometchat-uikit/src/lib/utils/agent-message-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversation-item/cometchat-conversation-item.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversation-item/cometchat-conversation-item.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversation-item/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-create-poll/cometchat-create-poll.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-create-poll/cometchat-create-poll.component.html","../../../projects/cometchat-uikit/src/lib/utils/safe-effect.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-paginated-list/cometchat-paginated-list.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-paginated-list/cometchat-paginated-list.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-paginated-list/cometchat-paginated-list.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-search-bar/cometchat-search-bar.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-search-bar/cometchat-search-bar.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-checkbox/cometchat-checkbox.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-checkbox/cometchat-checkbox.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-radio-button/cometchat-radio-button.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-radio-button/cometchat-radio-button.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversations/cometchat-conversations.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversations/cometchat-conversations.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-conversations/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people-3.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people-4.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people-5.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-people.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-animals-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-animals-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-animals.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-food-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-food-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-food.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-activity-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-activity-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-activity.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-travel-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-travel-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-travel.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-objects-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-objects-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-objects-3.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-objects.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-symbols-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-symbols-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-symbols-3.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-symbols.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-flags-1.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-flags-2.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-flags-3.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis-flags.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/emojis.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/cometchat-emoji-keyboard.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-emoji-keyboard/cometchat-emoji-keyboard.component.html","../../../projects/cometchat-uikit/src/lib/utils/media-download.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.utils.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-list-item/cometchat-list-item.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-list-item/cometchat-list-item.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-stickers-keyboard/cometchat-stickers-keyboard.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-stickers-keyboard/cometchat-stickers-keyboard.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-stickers-keyboard/cometchat-stickers-keyboard.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/event-emitter.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/base-plugin.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/decoder.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/dom.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/fetcher.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/player.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/draggable.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/renderer.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/renderer.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/timer.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/webaudio.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/wavesurfer.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/wavesurfer/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-media-recorder/cometchat-media-recorder.utils.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-media-recorder/cometchat-media-recorder.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-media-recorder/cometchat-media-recorder.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-popover/cometchat-popover.utils.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-popover/cometchat-popover.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-popover/cometchat-popover.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-message-preview/cometchat-message-preview.types.ts","../../../projects/cometchat-uikit/src/lib/utils/inline-markdown.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-message-preview/cometchat-message-preview.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-message-preview/cometchat-message-preview.component.html","../../../projects/cometchat-uikit/src/lib/services/voice-recording-coordinator.service.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-toast/cometchat-toast.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-toast/cometchat-toast.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-toast/cometchat-toast.service.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.file-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.voice-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.send-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.drag-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.editor-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.mentions-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.link-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.keyboard-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.typing-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.toolbar-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.subscriptions.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.edit-mode.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.announcements.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.popover-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.attachment-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.focus-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.reply-edit-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.collab-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.event-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.formatter-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.lifecycle-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-file-bubble/cometchat-file-bubble.types.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-attachment-tile/cometchat-attachment-tile.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-attachment-tile/cometchat-attachment-tile.component.html","../../../projects/cometchat-uikit/src/lib/services/media-upload-tray.service.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-attachment-tray/cometchat-attachment-tray.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-attachment-tray/cometchat-attachment-tray.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/cometchat-message-composer.component.html","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-emoji-formatter.constants.ts","../../../projects/cometchat-uikit/src/lib/formatters/cometchat-emoji-formatter.ts","../../../projects/cometchat-uikit/src/lib/formatters/formatter-pipeline.ts","../../../projects/cometchat-uikit/src/lib/formatters/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-composer/index.ts","../../../projects/cometchat-uikit/src/lib/utils/call-error-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-outgoing-call/cometchat-outgoing-call.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-outgoing-call/cometchat-outgoing-call.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-ongoing-call/cometchat-ongoing-call.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-ongoing-call/cometchat-ongoing-call.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-buttons/cometchat-call-buttons.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-buttons/cometchat-call-buttons.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-header/cometchat-message-header.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-header/cometchat-message-header.accessibility.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-header/cometchat-message-header.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-header/cometchat-message-header.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-header/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-paginated-list/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-text-bubble/cometchat-text-bubble.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-text-bubble/cometchat-text-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-text-bubble/cometchat-text-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-text-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/utils/card-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-card-bubble/cometchat-card-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-card-bubble/cometchat-card-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-card-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/utils/media-bubble-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-image-bubble/cometchat-image-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-image-bubble/cometchat-image-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-image-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-video-bubble/cometchat-video-bubble.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-video-bubble/cometchat-video-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-video-bubble/cometchat-video-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-video-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-file-bubble/cometchat-file-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-file-bubble/cometchat-file-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-file-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-images-bubble/cometchat-images-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-videos-bubble/cometchat-videos-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/cometchat-audio-bubble.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audios-bubble/cometchat-audios-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audios-bubble/cometchat-audios-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/cometchat-audio-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/cometchat-audio-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-voice-note-bubble/cometchat-voice-note-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-files-bubble/cometchat-files-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-user-item/cometchat-user-item.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-user-item/cometchat-user-item.component.html","../../../projects/cometchat-uikit/src/lib/services/users.service.ts","../../../projects/cometchat-uikit/src/lib/utils/list-keyboard-handler.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-users/cometchat-users.keyboard.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-users/cometchat-users.selection.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-users/cometchat-users.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-users/cometchat-users.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-users/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-item/cometchat-group-item.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-item/cometchat-group-item.component.html","../../../projects/cometchat-uikit/src/lib/services/groups.service.utils.ts","../../../projects/cometchat-uikit/src/lib/services/groups.service.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-groups/cometchat-groups.keyboard.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-groups/cometchat-groups.selection.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-groups/cometchat-groups.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-groups/cometchat-groups.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-groups/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-member-item/cometchat-group-member-item.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-member-item/cometchat-group-member-item.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-change-scope/cometchat-change-scope.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-change-scope/cometchat-change-scope.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-members/cometchat-group-members.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-members/cometchat-group-members.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-members/cometchat-group-members.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-members/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-user-item/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-group-item/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-action-bubble/cometchat-action-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-action-bubble/cometchat-action-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-action-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/utils/extension-url-extractor.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-document-bubble/cometchat-collaborative-document-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-document-bubble/cometchat-collaborative-document-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-document-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-whiteboard-bubble/cometchat-collaborative-whiteboard-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-whiteboard-bubble/cometchat-collaborative-whiteboard-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-collaborative-whiteboard-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-audio-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-bubble/cometchat-call-bubble.types.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-bubble/cometchat-call-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-bubble/cometchat-call-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-delete-bubble/cometchat-delete-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-delete-bubble/cometchat-delete-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-delete-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-poll-bubble/cometchat-poll-bubble.types.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-poll-bubble/cometchat-poll-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-poll-bubble/cometchat-poll-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-poll-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-sticker-bubble/cometchat-sticker-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-sticker-bubble/cometchat-sticker-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-sticker-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-thread-view/cometchat-thread-view.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-thread-view/cometchat-thread-view.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-reaction-info/cometchat-reaction-info.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-reaction-info/cometchat-reaction-info.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-reaction-list/cometchat-reaction-list.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-reaction-list/cometchat-reaction-list.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-reactions/cometchat-reactions.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-reactions/cometchat-reactions.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-reactions/cometchat-reactions.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-markdown-renderer/cometchat-markdown-parser.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-markdown-renderer/cometchat-markdown-renderer.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-markdown-renderer/cometchat-markdown-renderer.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-message-bubble/cometchat-ai-assistant-message-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-message-bubble/cometchat-ai-assistant-message-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-toolcall-argument-bubble/cometchat-toolcall-argument-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-toolcall-argument-bubble/cometchat-toolcall-argument-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-toolcall-result-bubble/cometchat-toolcall-result-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-toolcall-result-bubble/cometchat-toolcall-result-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-bubble/cometchat-message-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-bubble/cometchat-message-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-bubble/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-smart-replies/cometchat-smart-replies.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-smart-replies/cometchat-smart-replies.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-conversation-starter/cometchat-conversation-starter.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-conversation-starter/cometchat-conversation-starter.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-conversation-summary/cometchat-conversation-summary.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-conversation-summary/cometchat-conversation-summary.component.html","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-flag-message-dialog/cometchat-flag-message-dialog.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-flag-message-dialog/cometchat-flag-message-dialog.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-information/cometchat-message-information.types.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-information/cometchat-message-information.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-information/cometchat-message-information.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-information/cometchat-message-information.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.receipt-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.options-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.types.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.scroll-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.event-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.option-builders.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.scroll-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.reaction-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.delete-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.translate-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.conversation-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.message-state.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.read-handlers.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.init-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.option-click.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.announce-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.interaction-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.keyboard-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.lifecycle-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.helper-utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/cometchat-message-list.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-list/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-thread-header/cometchat-thread-header.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-thread-header/cometchat-thread-header.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-thread-header/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-typing-indicator/cometchat-typing-indicator.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-typing-indicator/cometchat-typing-indicator.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-message-information/index.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-dropdown/cometchat-dropdown.component.ts","../../../projects/cometchat-uikit/src/lib/components/base-elements/cometchat-dropdown/cometchat-dropdown.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-incoming-call/cometchat-incoming-call.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-incoming-call/cometchat-incoming-call.component.html","../../../projects/cometchat-uikit/src/lib/utils/CallLogUtils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-logs/cometchat-call-logs.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-logs/cometchat-call-logs.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-logs/cometchat-call-logs.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-call-logs/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-stream-message-bubble/cometchat-stream-message-bubble.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-stream-message-bubble/cometchat-stream-message-bubble.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-chat-history/cometchat-ai-assistant-chat-history.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-chat-history/cometchat-ai-assistant-chat-history.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-chat/cometchat-ai-assistant-chat.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-ai-assistant-chat/cometchat-ai-assistant-chat.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search-conversations-list/cometchat-search-conversations-list.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search-conversations-list/cometchat-search-conversations-list.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search-messages-list/cometchat-search-messages-list.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-search/cometchat-search-messages-list/cometchat-search-messages-list.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/cometchat-notification-feed.utils.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/cometchat-notification-feed-view-model.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/cometchat-notification-feed.pipes.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/cometchat-notification-feed.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/cometchat-notification-feed.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-feed/index.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-badge/cometchat-notification-badge.component.ts","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-badge/cometchat-notification-badge.component.html","../../../projects/cometchat-uikit/src/lib/components/cometchat-notification-badge/index.ts","../../../projects/cometchat-uikit/src/lib/components/index.ts","../../../projects/cometchat-uikit/src/public-api.ts","../../../projects/cometchat-uikit/src/cometchat-chat-uikit-angular.ts"],"sourcesContent":["import { CalendarObject } from './localization.interfaces';\n\n/**\n * Language-specific default CalendarObjects for date formatting.\n * Keys are BCP 47 language tags.\n */\nexport const LANGUAGE_CALENDAR_DEFAULTS: Record<string, CalendarObject> = {\n  'en-US': { today: 'hh:mm A', yesterday: '[Yesterday]', lastWeek: 'dddd', otherDays: 'MM/DD/YYYY' },\n  'en-GB': { today: 'HH:mm', yesterday: '[Yesterday]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  de: { today: 'HH:mm', yesterday: '[Gestern]', lastWeek: 'dddd', otherDays: 'DD.MM.YYYY' },\n  fr: { today: 'HH:mm', yesterday: '[Hier]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  es: { today: 'HH:mm', yesterday: '[Ayer]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  ja: { today: 'HH:mm', yesterday: '[昨日]', lastWeek: 'dddd', otherDays: 'YYYY/MM/DD' },\n  ko: { today: 'HH:mm', yesterday: '[어제]', lastWeek: 'dddd', otherDays: 'YYYY/MM/DD' },\n  zh: { today: 'HH:mm', yesterday: '[昨天]', lastWeek: 'dddd', otherDays: 'YYYY/MM/DD' },\n  'zh-TW': { today: 'HH:mm', yesterday: '[昨天]', lastWeek: 'dddd', otherDays: 'YYYY/MM/DD' },\n  ru: { today: 'HH:mm', yesterday: '[Вчера]', lastWeek: 'dddd', otherDays: 'DD.MM.YYYY' },\n  hi: { today: 'hh:mm A', yesterday: '[कल]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  ms: { today: 'HH:mm', yesterday: '[Semalam]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  pt: { today: 'HH:mm', yesterday: '[Ontem]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  sv: { today: 'HH:mm', yesterday: '[Igår]', lastWeek: 'dddd', otherDays: 'YYYY-MM-DD' },\n  lt: { today: 'HH:mm', yesterday: '[Vakar]', lastWeek: 'dddd', otherDays: 'YYYY-MM-DD' },\n  hu: { today: 'HH:mm', yesterday: '[Tegnap]', lastWeek: 'dddd', otherDays: 'YYYY.MM.DD' },\n  it: { today: 'HH:mm', yesterday: '[Ieri]', lastWeek: 'dddd', otherDays: 'DD/MM/YYYY' },\n  nl: { today: 'HH:mm', yesterday: '[Gisteren]', lastWeek: 'dddd', otherDays: 'DD-MM-YYYY' },\n  tr: { today: 'HH:mm', yesterday: '[Dün]', lastWeek: 'dddd', otherDays: 'DD.MM.YYYY' },\n};\n\n/**\n * Default IANA timezone identifiers for each supported language.\n */\nexport const DEFAULT_TIMEZONES: Record<string, string> = {\n  'en-US': 'America/New_York',\n  'en-GB': 'Europe/London',\n  ru: 'Europe/Moscow',\n  fr: 'Europe/Paris',\n  de: 'Europe/Berlin',\n  zh: 'Asia/Shanghai',\n  'zh-TW': 'Asia/Taipei',\n  es: 'Europe/Madrid',\n  hi: 'Asia/Kolkata',\n  ms: 'Asia/Kuala_Lumpur',\n  pt: 'Europe/Lisbon',\n  sv: 'Europe/Stockholm',\n  lt: 'Europe/Vilnius',\n  hu: 'Europe/Budapest',\n  it: 'Europe/Rome',\n  ja: 'Asia/Tokyo',\n  ko: 'Asia/Seoul',\n  nl: 'Europe/Amsterdam',\n  tr: 'Europe/Istanbul',\n};\n","import { CalendarObject } from './localization.interfaces';\n\n/**\n * Formats a date using a given pattern with localization support.\n *\n * @param date - The date to format\n * @param format - The format pattern (e.g. 'HH:mm', 'DD/MM/YYYY', 'dddd')\n * @param timezone - IANA timezone string\n * @param dateLocaleLanguage - BCP 47 language tag for Intl formatting\n * @param getLocalizedString - Callback to resolve localized month/weekday names\n * @returns The formatted date string\n */\nexport function formatDateFromPattern(\n  date: Date,\n  format: string,\n  timezone: string,\n  dateLocaleLanguage: string,\n  getLocalizedString: (key: string) => string\n): string {\n  const options: Intl.DateTimeFormatOptions = {\n    day: format.includes('D') ? '2-digit' : undefined,\n    month:\n      format.includes('MMMM') ||\n      format.includes('MMM') ||\n      format.includes('MM') ||\n      format.includes('M')\n        ? '2-digit'\n        : undefined,\n    year: format.includes('YYYY') ? 'numeric' : format.includes('YY') ? '2-digit' : undefined,\n    hour: format.includes('hh') ? '2-digit' : format.includes('h') ? 'numeric' : undefined,\n    minute: format.includes('mm') ? '2-digit' : format.includes('m') ? 'numeric' : undefined,\n    hour12: format.includes('A'),\n    weekday: format.includes('dddd')\n      ? 'long'\n      : format.includes('ddd') || format.includes('dd')\n        ? 'short'\n        : undefined,\n    timeZone: timezone,\n  };\n\n  const monthNames = {\n    short: [\n      getLocalizedString('month_january_short'),\n      getLocalizedString('month_february_short'),\n      getLocalizedString('month_march_short'),\n      getLocalizedString('month_april_short'),\n      getLocalizedString('month_may_short'),\n      getLocalizedString('month_june_short'),\n      getLocalizedString('month_july_short'),\n      getLocalizedString('month_august_short'),\n      getLocalizedString('month_september_short'),\n      getLocalizedString('month_october_short'),\n      getLocalizedString('month_november_short'),\n      getLocalizedString('month_december_short'),\n    ],\n    long: [\n      getLocalizedString('month_january_full'),\n      getLocalizedString('month_february_full'),\n      getLocalizedString('month_march_full'),\n      getLocalizedString('month_april_full'),\n      getLocalizedString('month_may_full'),\n      getLocalizedString('month_june_full'),\n      getLocalizedString('month_july_full'),\n      getLocalizedString('month_august_full'),\n      getLocalizedString('month_september_full'),\n      getLocalizedString('month_october_full'),\n      getLocalizedString('month_november_full'),\n      getLocalizedString('month_december_full'),\n    ],\n  };\n\n  const weekdays = {\n    min: [\n      getLocalizedString('weekday_sunday_min'),\n      getLocalizedString('weekday_monday_min'),\n      getLocalizedString('weekday_tuesday_min'),\n      getLocalizedString('weekday_wednesday_min'),\n      getLocalizedString('weekday_thursday_min'),\n      getLocalizedString('weekday_friday_min'),\n      getLocalizedString('weekday_saturday_min'),\n    ],\n    short: [\n      getLocalizedString('weekday_sunday_short'),\n      getLocalizedString('weekday_monday_short'),\n      getLocalizedString('weekday_tuesday_short'),\n      getLocalizedString('weekday_wednesday_short'),\n      getLocalizedString('weekday_thursday_short'),\n      getLocalizedString('weekday_friday_short'),\n      getLocalizedString('weekday_saturday_short'),\n    ],\n    long: [\n      getLocalizedString('weekday_sunday_full'),\n      getLocalizedString('weekday_monday_full'),\n      getLocalizedString('weekday_tuesday_full'),\n      getLocalizedString('weekday_wednesday_full'),\n      getLocalizedString('weekday_thursday_full'),\n      getLocalizedString('weekday_friday_full'),\n      getLocalizedString('weekday_saturday_full'),\n    ],\n  };\n\n  const formatter = new Intl.DateTimeFormat(dateLocaleLanguage, options);\n  const parts = formatter.formatToParts(date);\n  const dayIndex = date.getDay();\n\n  const replacements: Record<string, string> = {};\n  parts.forEach(part => {\n    if (part.type === 'day') {\n      replacements['DD'] = part.value;\n      replacements['D'] = parseInt(part.value).toString();\n    }\n    if (part.type === 'month') {\n      const monthIndex = parseInt(part.value) - 1;\n      replacements['MM'] = part.value;\n      replacements['M'] = parseInt(part.value).toString();\n      replacements['MMM'] = monthNames.short[monthIndex] || part.value;\n      replacements['MMMM'] = monthNames.long[monthIndex] || part.value;\n    }\n    if (part.type === 'year') {\n      replacements['YYYY'] = part.value;\n      replacements['YY'] = part.value.slice(-2);\n    }\n    if (part.type === 'hour') {\n      replacements['hh'] = part.value;\n      replacements['h'] = parseInt(part.value).toString();\n    }\n    if (part.type === 'minute') {\n      replacements['mm'] = part.value;\n      replacements['m'] = parseInt(part.value).toString();\n    }\n    if (part.type === 'dayPeriod') {\n      replacements['A'] = part.value;\n    }\n    if (part.type === 'weekday') {\n      replacements['dddd'] = weekdays.long[dayIndex] || '';\n      replacements['ddd'] = weekdays.short[dayIndex] || '';\n      replacements['dd'] = weekdays.min[dayIndex] || '';\n    }\n  });\n\n  return format\n    .replace(/\\[(.*?)\\]/g, '$1')\n    .replace(/\\bDD\\b/g, replacements['DD'] || '')\n    .replace(/\\bD\\b/g, replacements['D'] || '')\n    .replace(/\\bMMMM\\b/g, replacements['MMMM'] || '')\n    .replace(/\\bMMM\\b/g, replacements['MMM'] || '')\n    .replace(/\\bMM\\b/g, replacements['MM'] || '')\n    .replace(/\\bM\\b/g, replacements['M'] || '')\n    .replace(/\\bYYYY\\b/g, replacements['YYYY'] || '')\n    .replace(/\\bYY\\b/g, replacements['YY'] || '')\n    .replace(/\\bhh\\b/g, replacements['hh'] || '')\n    .replace(/\\bh\\b/g, replacements['h'] || '')\n    .replace(/\\bmm\\b/g, replacements['mm'] || '')\n    .replace(/\\bm\\b/g, replacements['m'] || '')\n    .replace(/\\bdddd\\b/g, replacements['dddd'] || '')\n    .replace(/\\bddd\\b/g, replacements['ddd'] || '')\n    .replace(/\\bdd\\b/g, replacements['dd'] || '')\n    .replace(/\\sA\\s/g, ` ${replacements['A'] || 'A'} `)\n    .replace(/^A\\s/g, `${replacements['A'] || 'A'} `)\n    .replace(/\\sA$/, ` ${replacements['A'] || 'A'}`)\n    .replace(/^A$/, `${replacements['A'] || 'A'}`);\n}\n\n/**\n * Checks if a Unix timestamp (seconds) represents yesterday's date in the given timezone.\n *\n * @param timestamp - Unix timestamp in seconds\n * @param timeZone - IANA timezone string\n * @returns True if the timestamp falls on yesterday's date\n */\nexport function isYesterday(timestamp: number, timeZone: string): boolean {\n  const today = new Date();\n  const yesterday = new Date(today);\n  yesterday.setDate(today.getDate() - 1);\n\n  const fmt = (d: Date) =>\n    new Intl.DateTimeFormat('en-US', {\n      timeZone,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    }).format(d);\n\n  return fmt(new Date(timestamp * 1000)) === fmt(yesterday);\n}\n\n/**\n * Formats a Unix timestamp based on the provided calendar configuration.\n *\n * @param timestamp - Unix timestamp in seconds\n * @param calendarObject - Calendar configuration for formatting\n * @param timezone - IANA timezone string\n * @param dateLocaleLanguage - BCP 47 language tag for Intl formatting\n * @param getLocalizedString - Callback to resolve localized strings\n * @returns Formatted date string\n */\nexport function formatDate(\n  timestamp: number,\n  calendarObject: CalendarObject,\n  timezone: string,\n  dateLocaleLanguage: string,\n  getLocalizedString: (key: string) => string\n): string {\n  const now = new Date();\n  const date = new Date(timestamp.toString().length <= 10 ? timestamp * 1000 : timestamp);\n\n  const fmt = (d: Date) =>\n    new Intl.DateTimeFormat('en-US', {\n      timeZone: timezone,\n      year: 'numeric',\n      month: '2-digit',\n      day: '2-digit',\n    }).format(d);\n\n  const nowFormatted = fmt(now);\n  const dateFormatted = fmt(date);\n\n  const diffInSeconds = Math.floor((now.getTime() - date.getTime()) / 1000);\n  const diffInMinutes = Math.floor(diffInSeconds / 60);\n  const diffInHours = Math.floor(diffInMinutes / 60);\n  const diffInDays = Math.floor(diffInHours / 24);\n\n  const applyPattern = (pattern: string) =>\n    formatDateFromPattern(date, pattern, timezone, dateLocaleLanguage, getLocalizedString);\n\n  // Handle relative time\n  if (calendarObject.relativeTime && Object.keys(calendarObject.relativeTime).length > 0) {\n    if (diffInSeconds < 60) {\n      if (calendarObject.relativeTime.minute) {\n        return calendarObject.relativeTime.minute.includes('%d')\n          ? calendarObject.relativeTime.minute.replace('%d', '1')\n          : calendarObject.relativeTime.minute;\n      } else if (calendarObject.today) {\n        return applyPattern(calendarObject.today);\n      }\n    }\n    if (diffInMinutes < 60) {\n      if (calendarObject.relativeTime.minutes) {\n        return calendarObject.relativeTime.minutes.includes('%d')\n          ? calendarObject.relativeTime.minutes.replace('%d', String(diffInMinutes))\n          : calendarObject.relativeTime.minutes;\n      } else if (calendarObject.today) {\n        return applyPattern(calendarObject.today);\n      }\n    }\n    if (diffInHours < 24) {\n      if (calendarObject.relativeTime.hour && diffInHours === 1) {\n        return calendarObject.relativeTime.hour.replace('%d', '1');\n      }\n      if (calendarObject.relativeTime.hours) {\n        return calendarObject.relativeTime.hours.replace('%d', String(diffInHours));\n      }\n    }\n  }\n\n  if (nowFormatted === dateFormatted && calendarObject.today) {\n    return applyPattern(calendarObject.today);\n  }\n  if (isYesterday(timestamp, timezone) && calendarObject.yesterday) {\n    return applyPattern(calendarObject.yesterday);\n  }\n  if (diffInDays <= 7 && calendarObject.lastWeek) {\n    return applyPattern(calendarObject.lastWeek);\n  }\n  return applyPattern(calendarObject.otherDays || 'DD/MM/YYYY');\n}\n","import { LocalizationSettings, CalendarObject } from './localization.interfaces';\nimport { LANGUAGE_CALENDAR_DEFAULTS, DEFAULT_TIMEZONES } from './localize-data';\nimport { formatDateFromPattern, formatDate as formatDateHelper, isYesterday } from './localize-helpers';\n\n// Import all translation files\nimport translationDE from './resources/de/translation.json';\nimport translationENUS from './resources/en-us/translation.json';\nimport translationENGB from './resources/en-gb/translation.json';\nimport translationES from './resources/es/translation.json';\nimport translationFR from './resources/fr/translation.json';\nimport translationHI from './resources/hi/translation.json';\nimport translationMS from './resources/ms/translation.json';\nimport translationPT from './resources/pt/translation.json';\nimport translationRU from './resources/ru/translation.json';\nimport translationZH from './resources/zh/translation.json';\nimport translationZHTW from './resources/zh-tw/translation.json';\nimport translationSV from './resources/sv/translation.json';\nimport translationLT from './resources/lt/translation.json';\nimport translationHU from './resources/hu/translation.json';\nimport translationTR from './resources/tr/translation.json';\nimport translationNL from './resources/nl/translation.json';\nimport translationIT from './resources/it/translation.json';\nimport translationJA from './resources/ja/translation.json';\nimport translationKO from './resources/ko/translation.json';\n\n/**\n * The `CometChatLocalize` class handles localization for the CometChat Angular UIKit.\n *\n * It provides functionality to:\n * - Detect the user's browser language settings\n * - Set and switch the application's language at runtime\n * - Translate keys to localized strings\n * - Format dates with localization support\n * - Add custom translations\n *\n * @example\n * // Initialize with settings\n * CometChatLocalize.init({\n *   language: 'es',\n *   timezone: 'Europe/Madrid'\n * });\n *\n * // Get a translated string\n * const text = CometChatLocalize.getLocalizedString('conversation_chat_title');\n *\n * // Switch language at runtime\n * CometChatLocalize.setCurrentLanguage('fr');\n */\nexport class CometChatLocalize {\n  /** Current active language */\n  private static language = 'en-US';\n\n  /** Fallback language when translation is not found */\n  private static fallbackLanguage = 'en-US';\n\n  /** Current timezone for date formatting */\n  private static timezone = 'America/New_York';\n\n  /** All available translations */\n  private static translations: Record<string, Record<string, string>> = {\n    'en-US': translationENUS,\n    'en-GB': translationENGB,\n    ru: translationRU,\n    fr: translationFR,\n    de: translationDE,\n    zh: translationZH,\n    'zh-TW': translationZHTW,\n    es: translationES,\n    hi: translationHI,\n    ms: translationMS,\n    pt: translationPT,\n    sv: translationSV,\n    lt: translationLT,\n    hu: translationHU,\n    it: translationIT,\n    ja: translationJA,\n    ko: translationKO,\n    nl: translationNL,\n    tr: translationTR,\n  };\n\n  /** Current localization settings */\n  private static localizationSettings: LocalizationSettings = {};\n\n  /** Calendar object for date formatting */\n  private static calendarObject: CalendarObject = {};\n\n  /** Whether a custom global CalendarObject was explicitly set by the developer */\n  private static customCalendarObjectSet = false;\n\n  /** Language-specific default CalendarObjects */\n  private static languageCalendarDefaults: Record<string, CalendarObject> = LANGUAGE_CALENDAR_DEFAULTS;\n\n  /** Whether to disable automatic language detection */\n  private static disableAutoDetection = false;\n\n  /** Whether to disable date/time localization */\n  private static disableDateTimeLocalization = false;\n\n  /** Default timezones for each language */\n  private static defaultTimezones: Record<string, string> = DEFAULT_TIMEZONES;\n\n  /**\n   * Initializes the localization service with the provided settings.\n   *\n   * @param settings - The localization settings to apply\n   *\n   * @example\n   * CometChatLocalize.init({\n   *   language: 'es',\n   *   timezone: 'Europe/Madrid',\n   *   fallbackLanguage: 'en-US',\n   *   disableAutoDetection: false\n   * });\n   */\n  static init(settings: LocalizationSettings): void {\n    this.localizationSettings = settings;\n    this.disableAutoDetection = settings.disableAutoDetection || false;\n    this.disableDateTimeLocalization = settings.disableDateTimeLocalization || false;\n\n    if (!settings.language) {\n      this.language = this.getDefaultLanguage();\n    } else {\n      this.language = settings.language;\n    }\n\n    this.timezone = settings.timezone || this.getDefaultTimeZone();\n\n    if (settings.calendarObject) {\n      this.calendarObject = settings.calendarObject;\n      this.customCalendarObjectSet = true;\n    }\n\n    this.fallbackLanguage = settings.fallbackLanguage || this.fallbackLanguage;\n\n    if (settings.translationsForLanguage) {\n      this.addTranslation(settings.translationsForLanguage);\n    }\n  }\n\n  /**\n   * Adds custom translations to the existing translations.\n   *\n   * @param resources - Object containing language codes as keys and translation objects as values\n   *\n   * @example\n   * CometChatLocalize.addTranslation({\n   *   'en-US': { 'custom_key': 'Custom Value' },\n   *   'es': { 'custom_key': 'Valor Personalizado' }\n   * });\n   */\n  static addTranslation(resources: Record<string, Record<string, string>>): void {\n    for (const resource in resources) {\n      if (!this.translations[resource]) {\n        this.translations[resource] = resources[resource];\n      } else {\n        Object.assign(this.translations[resource], resources[resource]);\n      }\n    }\n  }\n\n  /**\n   * Returns the browser's preferred language.\n   *\n   * @returns The browser language code (e.g., 'en-US')\n   */\n  static getBrowserLanguage(): string {\n    if (typeof navigator === 'undefined') {\n      return 'en-US';\n    }\n    return (navigator.languages && navigator.languages[0]) || navigator.language || 'en-US';\n  }\n\n  /**\n   * Translates a key to the localized string in the current language.\n   *\n   * @param key - The translation key to look up\n   * @returns The translated string, or empty string if not found\n   *\n   * @example\n   * const title = CometChatLocalize.getLocalizedString('conversation_chat_title');\n   * // Returns \"Chats\" in English\n   */\n  static getLocalizedString(key: string): string {\n    const language = this.getCurrentLanguage();\n    const translations = this.translations[language];\n\n    if (key && translations && translations[key] && translations[key] !== '') {\n      return translations[key];\n    }\n\n    // Try fallback language\n    const fallbackTranslations = this.translations[this.fallbackLanguage];\n    if (key && fallbackTranslations && fallbackTranslations[key]) {\n      return fallbackTranslations[key];\n    }\n\n    // Call missing key handler if provided\n    if (this.localizationSettings.missingKeyHandler) {\n      this.localizationSettings.missingKeyHandler(key);\n    }\n\n    return '';\n  }\n\n  /**\n   * Gets the current active language.\n   *\n   * @returns The current language code\n   */\n  static getCurrentLanguage(): string {\n    return this.translations[this.language] ? this.language : this.fallbackLanguage;\n  }\n\n  /**\n   * Sets the current language and reinitializes with the new language.\n   *\n   * @param language - The language code to set\n   *\n   * @example\n   * CometChatLocalize.setCurrentLanguage('fr');\n   */\n  static setCurrentLanguage(language: string): void {\n    this.language = language;\n    if (!this.customCalendarObjectSet) {\n      this.calendarObject = this.languageCalendarDefaults[language] || {};\n    }\n    CometChatLocalize.init({ ...this.localizationSettings, language });\n  }\n\n  /**\n   * Gets the default language based on settings or browser detection.\n   *\n   * @returns The default language code\n   */\n  static getDefaultLanguage(): string {\n    if (this.disableAutoDetection) {\n      return this.fallbackLanguage;\n    }\n    return this.getBrowserLanguage();\n  }\n\n  /**\n   * Gets the language to use for date localization.\n   *\n   * @returns The language code for date formatting\n   */\n  static getDateLocaleLanguage(): string {\n    if (this.disableDateTimeLocalization) {\n      return 'en-US';\n    }\n    return this.language;\n  }\n\n  /**\n   * Gets the current timezone.\n   *\n   * @returns The current timezone string\n   */\n  static getTimezone(): string {\n    return this.timezone;\n  }\n\n  /**\n   * Gets the calendar object for date formatting.\n   * Returns: custom CalendarObject if explicitly set, else language-specific default, else empty object.\n   *\n   * @returns The calendar object configuration\n   */\n  static getCalendarObject(): CalendarObject {\n    if (this.customCalendarObjectSet) {\n      return this.calendarObject;\n    }\n    return this.languageCalendarDefaults[this.language] || {};\n  }\n\n  /**\n   * Sets the global CalendarObject at runtime.\n   * Marks the CalendarObject as explicitly set so language switching won't override it.\n   *\n   * @param calendarObject - The CalendarObject to set globally\n   *\n   * @example\n   * CometChatLocalize.setGlobalCalendarObject({\n   *   today: 'HH:mm',\n   *   yesterday: '[Yesterday]',\n   *   lastWeek: 'dddd',\n   *   otherDays: 'DD/MM/YYYY'\n   * });\n   */\n  static setGlobalCalendarObject(calendarObject: CalendarObject): void {\n    this.calendarObject = calendarObject;\n    this.customCalendarObjectSet = true;\n  }\n\n  /**\n   * Gets the default timezone based on language or system detection.\n   */\n  private static getDefaultTimeZone(): string {\n    try {\n      if (this.disableAutoDetection) {\n        return this.defaultTimezones[this.language] || 'UTC';\n      }\n      return Intl.DateTimeFormat().resolvedOptions().timeZone;\n    } catch {\n      return this.defaultTimezones[this.language] || 'UTC';\n    }\n  }\n\n  /**\n   * Formats a date using a given pattern with localization support.\n   * Delegates to the standalone helper in localize-helpers.ts.\n   */\n  private static formatDateFromPattern(date: Date, format: string): string {\n    return formatDateFromPattern(\n      date,\n      format,\n      this.timezone,\n      this.getDateLocaleLanguage(),\n      (key: string) => this.getLocalizedString(key)\n    );\n  }\n\n  /**\n   * Formats a Unix timestamp based on the provided calendar configuration.\n   *\n   * @param timestamp - Unix timestamp in seconds\n   * @param calendarObject - Calendar configuration for formatting\n   * @returns Formatted date string\n   *\n   * @example\n   * const formatted = CometChatLocalize.formatDate(1640000000, {\n   *   today: 'h:mm A',\n   *   yesterday: '[Yesterday] h:mm A',\n   *   lastWeek: 'dddd h:mm A',\n   *   otherDays: 'DD/MM/YYYY'\n   * });\n   */\n  static formatDate(timestamp: number, calendarObject: CalendarObject): string {\n    return formatDateHelper(\n      timestamp,\n      calendarObject,\n      this.timezone,\n      this.getDateLocaleLanguage(),\n      (key: string) => this.getLocalizedString(key)\n    );\n  }\n\n  /**\n   * Gets all available language codes.\n   *\n   * @returns Array of available language codes\n   */\n  static getAvailableLanguages(): string[] {\n    return Object.keys(this.translations);\n  }\n\n  /**\n   * Checks if a language is available.\n   *\n   * @param language - The language code to check\n   * @returns True if the language is available\n   */\n  static isLanguageAvailable(language: string): boolean {\n    return !!this.translations[language];\n  }\n}\n\n/**\n * Helper function to get a localized string.\n * Shorthand for CometChatLocalize.getLocalizedString()\n *\n * @param key - The translation key\n * @returns The translated string\n */\nexport const getLocalizedString = (key: string): string =>\n  CometChatLocalize.getLocalizedString(key);\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Represents the settings required to initialize the CometChat UIKit.\n * Use `UIKitSettingsBuilder` to create an instance of this class.\n *\n * @example\n * const settings = new UIKitSettingsBuilder()\n *   .setAppId('YOUR_APP_ID')\n *   .setRegion('us')\n *   .setAuthKey('YOUR_AUTH_KEY')\n *   .build();\n *\n * CometChatUIKit.init(settings);\n */\nexport class UIKitSettings {\n  appId?: string;\n  region?: string;\n  subscriptionType?: string;\n  autoEstablishSocketConnection: boolean;\n  authKey?: string;\n  roles?: string[];\n  adminHost?: string;\n  clientHost?: string;\n  storageMode: CometChat.StorageMode;\n  /**\n   * Whether calling features (voice/video) are enabled.\n   * When `false` (default), the Calls SDK is not initialized and\n   * call buttons are hidden across all components.\n   * @default false\n   */\n  callingEnabled: boolean;\n\n  /**\n   * Custom CallAppSettings to use when initializing the Calls SDK.\n   * If not provided, the UIKit builds default settings from appId and region.\n   * Typed as `any` because `@cometchat/calls-sdk-javascript` is an optional dependency.\n   */\n  callAppSettings?: any;\n\n  /**\n   * Creates a new UIKitSettings instance.\n   * Prefer using UIKitSettingsBuilder for a fluent API.\n   */\n  constructor(builder?: UIKitSettingsBuilder) {\n    if (builder) {\n      this.appId = builder.appId;\n      this.region = builder.region;\n      this.subscriptionType = builder.subscriptionType;\n      this.autoEstablishSocketConnection = builder.autoEstablishSocketConnection ?? true;\n      this.authKey = builder.authKey;\n      this.adminHost = builder.adminHost;\n      this.clientHost = builder.clientHost;\n      this.roles = builder.roles;\n      this.storageMode = builder.storageMode ?? CometChat.StorageMode.LOCAL;\n      this.callingEnabled = builder.callingEnabled ?? false;\n      this.callAppSettings = builder.callAppSettings;\n    } else {\n      this.autoEstablishSocketConnection = true;\n      this.storageMode = CometChat.StorageMode.LOCAL;\n      this.callingEnabled = false;\n    }\n  }\n\n  static fromBuilder(builder: UIKitSettingsBuilder): UIKitSettings {\n    return new UIKitSettings(builder);\n  }\n\n  getAppId(): string | undefined {\n    return this.appId;\n  }\n  getRegion(): string | undefined {\n    return this.region;\n  }\n  getRoles(): string[] | undefined {\n    return this.roles;\n  }\n  getSubscriptionType(): string | undefined {\n    return this.subscriptionType;\n  }\n  getAuthKey(): string | undefined {\n    return this.authKey;\n  }\n  isAutoEstablishSocketConnection(): boolean {\n    return this.autoEstablishSocketConnection;\n  }\n  getAdminHost(): string | undefined {\n    return this.adminHost;\n  }\n  getClientHost(): string | undefined {\n    return this.clientHost;\n  }\n  getStorageMode(): CometChat.StorageMode {\n    return this.storageMode;\n  }\n  isCallingEnabled(): boolean {\n    return this.callingEnabled;\n  }\n  getCallAppSettings(): any | undefined {\n    return this.callAppSettings;\n  }\n}\n\n/**\n * Builder class for creating UIKitSettings instances.\n * Provides a fluent API for configuring CometChat UIKit settings.\n *\n * @example\n * const settings = new UIKitSettingsBuilder()\n *   .setAppId('YOUR_APP_ID')\n *   .setRegion('us')\n *   .setAuthKey('YOUR_AUTH_KEY')\n *   .build();\n */\nexport class UIKitSettingsBuilder {\n  appId?: string;\n  region?: string;\n  subscriptionType?: string;\n  roles?: string[];\n  autoEstablishSocketConnection?: boolean;\n  authKey?: string;\n  adminHost?: string;\n  clientHost?: string;\n  storageMode?: CometChat.StorageMode;\n  callingEnabled?: boolean;\n  callAppSettings?: any;\n\n  build(): UIKitSettings {\n    return UIKitSettings.fromBuilder(this);\n  }\n\n  setAppId(appId: string): UIKitSettingsBuilder {\n    this.appId = appId;\n    return this;\n  }\n\n  setRegion(region: string): UIKitSettingsBuilder {\n    this.region = region;\n    return this;\n  }\n\n  setAuthKey(authKey: string): UIKitSettingsBuilder {\n    this.authKey = authKey;\n    return this;\n  }\n\n  subscribePresenceForAllUsers(): UIKitSettingsBuilder {\n    this.subscriptionType = 'ALL_USERS';\n    return this;\n  }\n\n  subscribePresenceForFriends(): UIKitSettingsBuilder {\n    this.subscriptionType = 'FRIENDS';\n    return this;\n  }\n\n  subscribePresenceForRoles(roles: string[]): UIKitSettingsBuilder {\n    this.subscriptionType = 'ROLES';\n    this.roles = roles;\n    return this;\n  }\n\n  setRoles(roles: string[]): UIKitSettingsBuilder {\n    this.roles = roles;\n    return this;\n  }\n\n  setAutoEstablishSocketConnection(autoEstablish: boolean): UIKitSettingsBuilder {\n    this.autoEstablishSocketConnection = autoEstablish;\n    return this;\n  }\n\n  setAdminHost(adminHost: string): UIKitSettingsBuilder {\n    this.adminHost = adminHost;\n    return this;\n  }\n\n  setClientHost(clientHost: string): UIKitSettingsBuilder {\n    this.clientHost = clientHost;\n    return this;\n  }\n\n  setStorageMode(storageMode: CometChat.StorageMode): UIKitSettingsBuilder {\n    this.storageMode = storageMode;\n    return this;\n  }\n\n  /**\n   * Enables or disables calling features (voice/video).\n   * When `true`, the Calls SDK is initialized after login and call buttons\n   * become visible in components like MessageHeader and CallLogs.\n   * @default false\n   */\n  setCallingEnabled(enabled: boolean): UIKitSettingsBuilder {\n    this.callingEnabled = enabled;\n    return this;\n  }\n\n  /**\n   * Sets a custom `CallAppSettings` object to use when initializing the Calls SDK.\n   * If not set, the UIKit builds default settings from `appId` and `region`.\n   *\n   * Build the settings using `CometChatUIKitCalls.CallAppSettingsBuilder`.\n   *\n   * @example\n   * import { CometChatUIKitCalls } from '@cometchat/calls-sdk-javascript';\n   *\n   * const callAppSettings = new CometChatUIKitCalls.CallAppSettingsBuilder()\n   *   .setAppId('APP_ID')\n   *   .setRegion('REGION')\n   *   .build();\n   *\n   * const settings = new UIKitSettingsBuilder()\n   *   .setAppId('APP_ID')\n   *   .setRegion('REGION')\n   *   .setCallingEnabled(true)\n   *   .setCallAppSettings(callAppSettings)\n   *   .build();\n   */\n  setCallAppSettings(callAppSettings: any): UIKitSettingsBuilder {\n    this.callAppSettings = callAppSettings;\n    return this;\n  }\n}\n","/**\n * Log level enum defining verbosity levels.\n * Ordered from least verbose (none) to most verbose (debug).\n */\nexport enum LogLevel {\n  none = 0,\n  error = 1,\n  warn = 2,\n  info = 3,\n  debug = 4,\n}\n\n/**\n * Centralized logging utility for the CometChat UIKit.\n * All internal logging goes through this class so consumers can control verbosity.\n *\n * @example\n * // Set log level during app initialization\n * CometChatUIKit.setLogLevel(LogLevel.debug);\n *\n * @example\n * // Or directly\n * CometChatLogger.setLogLevel(LogLevel.error);\n *\n * @example\n * // Usage inside services\n * CometChatLogger.error('ConversationsService', 'Error fetching conversations:', error);\n * CometChatLogger.debug('MessageListService', 'handleReceipt called', { messageId });\n */\nexport class CometChatLogger {\n  private static currentLevel: LogLevel = LogLevel.error;\n\n  /**\n   * Sets the active log level. Only messages at this level or below will be output.\n   * @param level - The desired log level.\n   */\n  static setLogLevel(level: LogLevel): void {\n    CometChatLogger.currentLevel = level;\n  }\n\n  /**\n   * Returns the current log level.\n   * @returns The active LogLevel value.\n   */\n  static getLogLevel(): LogLevel {\n    return CometChatLogger.currentLevel;\n  }\n\n  /**\n   * Logs an error message if the current level permits.\n   * @param tag - The source identifier (e.g. service or component name).\n   * @param message - The log message.\n   * @param args - Additional arguments forwarded to `console.error`.\n   */\n  static error(tag: string, message: string, ...args: unknown[]): void {\n    if (CometChatLogger.currentLevel >= LogLevel.error) {\n      console.error(`[${tag}]`, message, ...args);\n    }\n  }\n\n  /**\n   * Logs a warning message if the current level permits.\n   * @param tag - The source identifier (e.g. service or component name).\n   * @param message - The log message.\n   * @param args - Additional arguments forwarded to `console.warn`.\n   */\n  static warn(tag: string, message: string, ...args: unknown[]): void {\n    if (CometChatLogger.currentLevel >= LogLevel.warn) {\n      console.warn(`[${tag}]`, message, ...args);\n    }\n  }\n\n  /**\n   * Logs an informational message if the current level permits.\n   * @param tag - The source identifier (e.g. service or component name).\n   * @param message - The log message.\n   * @param args - Additional arguments forwarded to `console.info`.\n   */\n  static info(tag: string, message: string, ...args: unknown[]): void {\n    if (CometChatLogger.currentLevel >= LogLevel.info) {\n      console.info(`[${tag}]`, message, ...args);\n    }\n  }\n\n  /**\n   * Logs a debug message if the current level permits.\n   * @param tag - The source identifier (e.g. service or component name).\n   * @param message - The log message.\n   * @param args - Additional arguments forwarded to `console.debug`.\n   */\n  static debug(tag: string, message: string, ...args: unknown[]): void {\n    if (CometChatLogger.currentLevel >= LogLevel.debug) {\n      console.debug(`[${tag}]`, message, ...args);\n    }\n  }\n}\n","/**\n * Manages and plays various types of audio for CometChat events.\n * The class provides methods to play sounds for incoming and outgoing messages and calls.\n * It is used in CometChatCallButtons, CometChatIncomingCall, CometChatConversations, CometChatMessageComposer components.\n */\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nexport class CometChatSoundManager {\n  static audio: string | null | HTMLAudioElement = null;\n  static Sound: Sounds = Object.freeze({\n    incomingCall: 'incomingCall',\n    incomingMessage: 'incomingMessage',\n    incomingMessageFromOther: 'incomingMessageFromOther',\n    outgoingCall: 'outgoingCall',\n    outgoingMessage: 'outgoingMessage',\n  });\n\n  /**\n   * Plays the sound for an incoming message.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   *\n   * @example\n   * // Trigger the audio sound for an incoming message\n   * CometChatSoundManager.onIncomingMessage();\n   *\n   * @example\n   * // Trigger the audio sound of your choice for an incoming message\n   * CometChatSoundManager.onIncomingMessage(\"MP3_FILE_ASSET_PATH\");\n   */\n  static onIncomingMessage = (customSound: string | null = null): void => {\n    CometChatSoundManager.audio = new Audio(\n      customSound || 'https://assets.cc-cluster-2.io/uikits/static/audio/incomingmessage.wav'\n    );\n    CometChatSoundManager.audio.currentTime = 0;\n    if (this.hasInteracted()) CometChatSoundManager.audio.play();\n  };\n\n  /**\n   * Plays the sound for an incoming message from another user.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   *\n   * @example\n   * // Trigger the audio sound for an incoming message from another user\n   * CometChatSoundManager.onIncomingOtherMessage();\n   *\n   * @example\n   * // Trigger the audio sound of your choice for an incoming message from another user\n   * CometChatSoundManager.onIncomingOtherMessage(\"MP3_FILE_ASSET_PATH\");\n   */\n  static onIncomingOtherMessage = (customSound: string | null = null) => {\n    CometChatSoundManager.audio = new Audio(\n      customSound || 'https://assets.cc-cluster-2.io/uikits/static/audio/incomingothermessage.wav'\n    );\n    CometChatSoundManager.audio.currentTime = 0;\n    if (this.hasInteracted()) CometChatSoundManager.audio.play();\n  };\n\n  /**\n   * Plays the sound for an outgoing message.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   *\n   * @example\n   * // Trigger the audio sound for an outgoing message\n   * CometChatSoundManager.onOutgoingMessage();\n   *\n   * @example\n   * // Trigger the audio sound of your choice for an outgoing message\n   * CometChatSoundManager.onOutgoingMessage(\"MP3_FILE_ASSET_PATH\");\n   */\n  static onOutgoingMessage = (customSound: string | null = null) => {\n    CometChatSoundManager.audio = new Audio(\n      customSound || 'https://assets.cc-cluster-2.io/uikits/static/audio/outgoingmessage.wav'\n    );\n    CometChatSoundManager.audio.currentTime = 0;\n    if (this.hasInteracted()) CometChatSoundManager.audio.play();\n  };\n\n  /**\n   * Plays the sound for an incoming call.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   *\n   * @example\n   * // Trigger the audio sound for an incoming call\n   * CometChatSoundManager.onIncomingCall();\n   *\n   * @example\n   * // Trigger the audio sound of your choice for an incoming call\n   * CometChatSoundManager.onIncomingCall(\"MP3_FILE_ASSET_PATH\");\n   */\n  static onIncomingCall = (customSound: string | null = null) => {\n    try {\n      CometChatSoundManager.audio = new Audio(\n        customSound || 'https://assets.cc-cluster-2.io/uikits/static/audio/incomingcall.wav'\n      );\n      CometChatSoundManager.audio.currentTime = 0;\n      if (typeof CometChatSoundManager.audio.loop == 'boolean') {\n        CometChatSoundManager.audio.loop = true;\n      } else {\n        CometChatSoundManager.audio.addEventListener(\n          'ended',\n          function (this) {\n            this.currentTime = 0;\n            this.play();\n          },\n          false\n        );\n      }\n      if (this.hasInteracted()) CometChatSoundManager.audio.play();\n    } catch (error: unknown) {\n      CometChatLogger.error('CometChatSoundManager', 'Error playing sound:', error);\n    }\n  };\n\n  /**\n   * Plays the sound for an outgoing call.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   *\n   * @example\n   * // Trigger the audio sound for an outgoing call\n   * CometChatSoundManager.onOutgoingCall();\n   *\n   * @example\n   * // Trigger the audio sound of your choice for an outgoing call\n   * CometChatSoundManager.onOutgoingCall(\"MP3_FILE_ASSET_PATH\");\n   */\n  static onOutgoingCall = (customSound: string | null = null) => {\n    try {\n      CometChatSoundManager.audio = new Audio(\n        customSound || 'https://assets.cc-cluster-2.io/uikits/static/audio/outgoingcall.wav'\n      );\n      CometChatSoundManager.audio.currentTime = 0;\n      if (typeof CometChatSoundManager.audio.loop == 'boolean') {\n        CometChatSoundManager.audio.loop = true;\n      } else {\n        CometChatSoundManager.audio.addEventListener(\n          'ended',\n          function (this) {\n            this.currentTime = 0;\n            this.play();\n          },\n          false\n        );\n      }\n      if (this.hasInteracted()) CometChatSoundManager.audio.play();\n    } catch (error: unknown) {\n      CometChatLogger.error('CometChatSoundManager', 'Error playing sound:', error);\n    }\n  };\n\n  /**\n   * Contains mappings of sound types to their respective handler functions.\n   *\n   * The handlers are functions that trigger the playback of sounds for different events.\n   *\n   * @type {Object}\n   * @property {Function} incomingCall - Handler function for playing the incoming call sound.\n   * @property {Function} outgoingCall - Handler function for playing the outgoing call sound.\n   * @property {Function} incomingMessage - Handler function for playing the incoming message sound.\n   * @property {Function} incomingMessageFromOther - Handler function for playing the incoming message from other sound.\n   * @property {Function} outgoingMessage - Handler function for playing the outgoing message sound.\n   */\n  static handlers = {\n    incomingCall: CometChatSoundManager.onIncomingCall,\n    outgoingCall: CometChatSoundManager.onOutgoingCall,\n    incomingMessage: CometChatSoundManager.onIncomingMessage,\n    incomingMessageFromOther: CometChatSoundManager.onIncomingOtherMessage,\n    outgoingMessage: CometChatSoundManager.onOutgoingMessage,\n  };\n\n  /**\n   * Plays a predefined sound based on the provided sound type.\n   * @param {\"incomingCall\" | \"incomingMessage\" | \"incomingMessageFromOther\" | \"outgoingCall\" | \"outgoingMessage\"} sound - The sound type to play.\n   * @param {string|null} customSound - The custom sound URL or null to use the default.\n   * @returns {boolean} - Returns false if the sound handler is not found.\n   *\n   * @example\n   * // Play the sound for incoming messages\n   * CometChatSoundManager.play(\"incomingMessage\");\n   *\n   * @example\n   * // Play a custom sound for outgoing messages\n   * CometChatSoundManager.play(\"outgoingMessage\", \"MP3_FILE_ASSET_PATH\");\n   */\n  static play(\n    sound:\n      | 'incomingCall'\n      | 'incomingMessage'\n      | 'incomingMessageFromOther'\n      | 'outgoingCall'\n      | 'outgoingMessage',\n    customSound: string | null = null\n  ) {\n    if (!this.hasInteracted()) return;\n\n    const resource = CometChatSoundManager.Sound[sound]!;\n    const handler = CometChatSoundManager.handlers[resource];\n    if (!handler) {\n      return false;\n    }\n    return handler(customSound);\n  }\n\n  /**\n   * Pauses the currently playing sound and resets its position.\n   *\n   * @example\n   * // Pause the ongoing audio sound\n   * CometChatSoundManager.pause();\n   */\n  static pause() {\n    if (CometChatSoundManager.audio) {\n      (CometChatSoundManager.audio as HTMLAudioElement).pause();\n      (CometChatSoundManager.audio as HTMLAudioElement).currentTime = 0;\n      CometChatSoundManager.audio = null;\n    }\n  }\n\n  /**\n   * Checks if the user has interacted with the page.\n   * @returns {boolean} True if the user has interacted, false otherwise.\n   */\n  static hasInteracted() {\n    if ('userActivation' in window.navigator) {\n      return (\n        (window.navigator.userActivation as { isActive: boolean }).isActive ||\n        (window.navigator.userActivation as { hasBeenActive: boolean }).hasBeenActive\n      );\n    } else {\n      return true;\n    }\n  }\n}\n\nexport interface Sounds {\n  incomingCall?: 'incomingCall';\n  incomingMessage?: 'incomingMessage';\n  incomingMessageFromOther: 'incomingMessageFromOther';\n  outgoingCall?: 'outgoingCall';\n  outgoingMessage?: 'outgoingMessage';\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\n\nexport class CometChatUIKitLoginListener {\n  static setLoggedInUser(user: CometChat.User): void {}\n  static removeLoggedInUser(): void {}\n  static attachListener(): void {}\n}\n","import { DestroyRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\n\n/**\n * Subscribe to a Subject with an optional DestroyRef for automatic cleanup.\n * If destroyRef is provided, the subscription is unsubscribed when the\n * component/service is destroyed.\n */\nexport function subscribeWithOptionalCleanup<T>(\n  subject: Subject<T>,\n  callback: (data: T) => void,\n  destroyRef?: DestroyRef\n): Subscription {\n  const subscription = subject.subscribe(callback);\n  if (destroyRef) {\n    destroyRef.onDestroy(() => {\n      if (!subscription.closed) {\n        subscription.unsubscribe();\n      }\n    });\n  }\n  return subscription;\n}\n","import { DestroyRef } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageStatus } from '../Enums/Enums';\nimport { Subject, Subscription } from 'rxjs';\nimport { subscribeWithOptionalCleanup } from './event-utils';\nimport { IMessages } from './CometChatMessageEvents.types';\n\nexport type { IMessages };\n\n/**\n * Payload for the `ccCardActionClicked` event (Card Messages).\n * `message` is the owning message — the `CardMessage` for a developer card or\n * the `AIAssistantMessage` for a nested agent-card block. `action` is the raw\n * renderer action object, forwarded untouched (the kit performs no behavior).\n */\nexport interface ICardActionEvent {\n  /**\n   * The owning message — `CardMessage` (developer) or `AIAssistantMessage`\n   * (persisted agent card). `null` only for a card tapped while the agent run is\n   * still streaming (no persisted message exists yet; the persisted bubble that\n   * follows is the source of truth).\n   */\n  message: CometChat.BaseMessage | null;\n  /** The renderer's raw discriminated action (`CometChatCardAction`) — forwarded untouched. */\n  action: unknown;\n  /** The renderer element id that emitted the action (for `customCallback`). */\n  elementId?: string;\n  /** The raw card JSON the action originated from (for `customCallback`). */\n  cardJson?: string;\n}\n\n/**\n * Message event subjects for handling actions related to messages (e.g., message sent, edited, deleted, etc.)\n */\n\nexport class CometChatMessageEvents {\n  // ── UI-level Subjects ──\n  static ccMessageSent: Subject<IMessages> = new Subject<IMessages>();\n  static ccMessageEdited: Subject<IMessages> = new Subject<IMessages>();\n  static ccReplyToMessage: Subject<IMessages> = new Subject<IMessages>();\n  static ccMessageTranslated: Subject<IMessages> = new Subject<IMessages>();\n  /**\n   * Event for message read in message list.\n   * Emitted when a message is marked as read.\n   * @see Requirement 9.1 - Notify conversations component when messages are read\n   */\n  static ccMessageRead: Subject<CometChat.BaseMessage> = new Subject<CometChat.BaseMessage>();\n  static ccMessageDeleted: Subject<CometChat.BaseMessage> = new Subject<CometChat.BaseMessage>();\n  /**\n   * Emitted when a user taps an action on a card (developer card or nested\n   * agent-card block). Pure forward — the kit performs no behavior; the app\n   * subscribes once and runs the action.\n   */\n  static ccCardActionClicked: Subject<ICardActionEvent> = new Subject<ICardActionEvent>();\n\n  // ── SDK-wrapper Subjects ──\n  static onTextMessageReceived: Subject<CometChat.TextMessage> =\n    new Subject<CometChat.TextMessage>();\n  static onMessageModerated: Subject<CometChat.BaseMessage> = new Subject<CometChat.BaseMessage>();\n  static onMediaMessageReceived: Subject<CometChat.MediaMessage> =\n    new Subject<CometChat.MediaMessage>();\n  static onCustomMessageReceived: Subject<CometChat.CustomMessage> =\n    new Subject<CometChat.CustomMessage>();\n  static onTypingStarted: Subject<CometChat.TypingIndicator> =\n    new Subject<CometChat.TypingIndicator>();\n  static onTypingEnded: Subject<CometChat.TypingIndicator> =\n    new Subject<CometChat.TypingIndicator>();\n  static onMessagesDelivered: Subject<CometChat.MessageReceipt> =\n    new Subject<CometChat.MessageReceipt>();\n  static onMessagesRead: Subject<CometChat.MessageReceipt> =\n    new Subject<CometChat.MessageReceipt>();\n  static onMessagesDeliveredToAll: Subject<CometChat.MessageReceipt> =\n    new Subject<CometChat.MessageReceipt>();\n  static onMessagesReadByAll: Subject<CometChat.MessageReceipt> =\n    new Subject<CometChat.MessageReceipt>();\n  static onMessageEdited: Subject<CometChat.BaseMessage> = new Subject<CometChat.BaseMessage>();\n  static onMessageDeleted: Subject<CometChat.BaseMessage> = new Subject<CometChat.BaseMessage>();\n  static onMessageReactionAdded: Subject<CometChat.ReactionEvent> =\n    new Subject<CometChat.ReactionEvent>();\n  static onMessageReactionRemoved: Subject<CometChat.ReactionEvent> =\n    new Subject<CometChat.ReactionEvent>();\n  static onCustomInteractiveMessageReceived: Subject<CometChat.InteractiveMessage> =\n    new Subject<CometChat.InteractiveMessage>();\n  static onFormMessageReceived: Subject<CometChat.InteractiveMessage> =\n    new Subject<CometChat.InteractiveMessage>();\n  // Retyped from InteractiveMessage to the new CardMessage and\n  // wired to onCardMessageReceived (category \"card\").\n  static onCardMessageReceived: Subject<CometChat.CardMessage> =\n    new Subject<CometChat.CardMessage>();\n  static onSchedulerMessageReceived: Subject<CometChat.InteractiveMessage> =\n    new Subject<CometChat.InteractiveMessage>();\n  static onAIAssistantMessageReceived: Subject<CometChat.AIAssistantMessage> =\n    new Subject<CometChat.AIAssistantMessage>();\n  static onAIToolResultReceived: Subject<CometChat.AIToolResultMessage> =\n    new Subject<CometChat.AIToolResultMessage>();\n  static onAIToolArgumentsReceived: Subject<CometChat.AIToolArgumentMessage> =\n    new Subject<CometChat.AIToolArgumentMessage>();\n\n  // ── Deprecated generic method ──\n\n  /** @deprecated Use typed publish methods instead (e.g., publishMessageSent). */\n  static publishEvent(event: Subject<unknown>, item: unknown = null) {\n    event.next(item);\n  }\n\n  // ── Typed Publish Methods (UI-level) ──\n\n  static publishMessageSent(data: IMessages): void {\n    CometChatMessageEvents.ccMessageSent.next(data);\n  }\n\n  static publishMessageEdited(data: IMessages): void {\n    CometChatMessageEvents.ccMessageEdited.next(data);\n  }\n\n  static publishReplyToMessage(data: IMessages): void {\n    CometChatMessageEvents.ccReplyToMessage.next(data);\n  }\n\n  static publishMessageTranslated(data: IMessages): void {\n    CometChatMessageEvents.ccMessageTranslated.next(data);\n  }\n\n  static publishMessageRead(message: CometChat.BaseMessage): void {\n    CometChatMessageEvents.ccMessageRead.next(message);\n  }\n\n  static publishMessageDeleted(message: CometChat.BaseMessage): void {\n    CometChatMessageEvents.ccMessageDeleted.next(message);\n  }\n\n  // ── Typed Publish Methods (SDK-wrapper) ──\n\n  static publishTextMessageReceived(message: CometChat.TextMessage): void {\n    CometChatMessageEvents.onTextMessageReceived.next(message);\n  }\n\n  static publishMediaMessageReceived(message: CometChat.MediaMessage): void {\n    CometChatMessageEvents.onMediaMessageReceived.next(message);\n  }\n\n  static publishCustomMessageReceived(message: CometChat.CustomMessage): void {\n    CometChatMessageEvents.onCustomMessageReceived.next(message);\n  }\n\n  static publishTypingStarted(indicator: CometChat.TypingIndicator): void {\n    CometChatMessageEvents.onTypingStarted.next(indicator);\n  }\n\n  static publishTypingEnded(indicator: CometChat.TypingIndicator): void {\n    CometChatMessageEvents.onTypingEnded.next(indicator);\n  }\n\n  static publishMessagesDelivered(receipt: CometChat.MessageReceipt): void {\n    CometChatMessageEvents.onMessagesDelivered.next(receipt);\n  }\n\n  static publishMessagesRead(receipt: CometChat.MessageReceipt): void {\n    CometChatMessageEvents.onMessagesRead.next(receipt);\n  }\n\n  static publishMessagesDeliveredToAll(receipt: CometChat.MessageReceipt): void {\n    CometChatMessageEvents.onMessagesDeliveredToAll.next(receipt);\n  }\n\n  static publishMessagesReadByAll(receipt: CometChat.MessageReceipt): void {\n    CometChatMessageEvents.onMessagesReadByAll.next(receipt);\n  }\n\n  static publishMessageModerated(message: CometChat.BaseMessage): void {\n    CometChatMessageEvents.onMessageModerated.next(message);\n  }\n\n  static publishOnMessageEdited(message: CometChat.BaseMessage): void {\n    CometChatMessageEvents.onMessageEdited.next(message);\n  }\n\n  static publishOnMessageDeleted(message: CometChat.BaseMessage): void {\n    CometChatMessageEvents.onMessageDeleted.next(message);\n  }\n\n  static publishMessageReactionAdded(event: CometChat.ReactionEvent): void {\n    CometChatMessageEvents.onMessageReactionAdded.next(event);\n  }\n\n  static publishMessageReactionRemoved(event: CometChat.ReactionEvent): void {\n    CometChatMessageEvents.onMessageReactionRemoved.next(event);\n  }\n\n  static publishCustomInteractiveMessageReceived(message: CometChat.InteractiveMessage): void {\n    CometChatMessageEvents.onCustomInteractiveMessageReceived.next(message);\n  }\n\n  static publishFormMessageReceived(message: CometChat.InteractiveMessage): void {\n    CometChatMessageEvents.onFormMessageReceived.next(message);\n  }\n\n  static publishCardMessageReceived(message: CometChat.CardMessage): void {\n    CometChatMessageEvents.onCardMessageReceived.next(message);\n  }\n\n  static publishSchedulerMessageReceived(message: CometChat.InteractiveMessage): void {\n    CometChatMessageEvents.onSchedulerMessageReceived.next(message);\n  }\n\n  static publishAIAssistantMessageReceived(message: CometChat.AIAssistantMessage): void {\n    CometChatMessageEvents.onAIAssistantMessageReceived.next(message);\n  }\n\n  static publishAIToolResultReceived(message: CometChat.AIToolResultMessage): void {\n    CometChatMessageEvents.onAIToolResultReceived.next(message);\n  }\n\n  static publishAIToolArgumentsReceived(message: CometChat.AIToolArgumentMessage): void {\n    CometChatMessageEvents.onAIToolArgumentsReceived.next(message);\n  }\n\n  // ── Typed Subscribe Helpers (UI-level) ──\n\n  static onMessageSent(cb: (data: IMessages) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccMessageSent, cb, destroyRef);\n  }\n\n  static onCcMessageEdited(cb: (data: IMessages) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccMessageEdited, cb, destroyRef);\n  }\n\n  static onReplyToMessage(cb: (data: IMessages) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccReplyToMessage, cb, destroyRef);\n  }\n\n  static onMessageTranslated(cb: (data: IMessages) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccMessageTranslated, cb, destroyRef);\n  }\n\n  static onCcMessageRead(\n    cb: (data: CometChat.BaseMessage) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccMessageRead, cb, destroyRef);\n  }\n\n  static onCcMessageDeleted(\n    cb: (data: CometChat.BaseMessage) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccMessageDeleted, cb, destroyRef);\n  }\n\n  // ── Typed Subscribe Helpers (SDK-wrapper) ──\n\n  static subscribeOnTextMessageReceived(cb: (data: CometChat.TextMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onTextMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnMediaMessageReceived(cb: (data: CometChat.MediaMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMediaMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnCustomMessageReceived(cb: (data: CometChat.CustomMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onCustomMessageReceived, cb, destroyRef);\n    \n  }\n\n  static subscribeOnTypingStarted(\n    cb: (data: CometChat.TypingIndicator) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onTypingStarted, cb, destroyRef);\n  }\n\n  static subscribeOnTypingEnded(cb: (data: CometChat.TypingIndicator) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onTypingEnded, cb, destroyRef);\n  }\n\n  static subscribeOnMessagesDelivered(cb: (data: CometChat.MessageReceipt) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessagesDelivered, cb, destroyRef);\n  }\n\n  static subscribeOnMessagesRead(cb: (data: CometChat.MessageReceipt) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessagesRead, cb, destroyRef);\n  }\n\n  static subscribeOnMessagesDeliveredToAll(cb: (data: CometChat.MessageReceipt) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessagesDeliveredToAll, cb, destroyRef);\n  }\n\n  static subscribeOnMessagesReadByAll(cb: (data: CometChat.MessageReceipt) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessagesReadByAll, cb, destroyRef);\n  }\n\n  static subscribeOnMessageModerated(cb: (data: CometChat.BaseMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessageModerated, cb, destroyRef);\n  }\n\n  static subscribeOnMessageEdited(cb: (data: CometChat.BaseMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessageEdited, cb, destroyRef);\n  }\n\n  static subscribeOnMessageDeleted(cb: (data: CometChat.BaseMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessageDeleted, cb, destroyRef);\n  }\n\n  static subscribeOnMessageReactionAdded(cb: (data: CometChat.ReactionEvent) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessageReactionAdded, cb, destroyRef);\n  }\n\n  static subscribeOnMessageReactionRemoved(cb: (data: CometChat.ReactionEvent) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onMessageReactionRemoved, cb, destroyRef);\n  }\n\n  static subscribeOnCustomInteractiveMessageReceived(cb: (data: CometChat.InteractiveMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onCustomInteractiveMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnFormMessageReceived(cb: (data: CometChat.InteractiveMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onFormMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnCardMessageReceived(cb: (data: CometChat.CardMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onCardMessageReceived, cb, destroyRef);\n  }\n\n  /** Subscribes to card-action clicks; auto-cleans up when destroyRef is given. */\n  static subscribeOnCardActionClicked(cb: (data: ICardActionEvent) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.ccCardActionClicked, cb, destroyRef);\n  }\n\n  static subscribeOnSchedulerMessageReceived(cb: (data: CometChat.InteractiveMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onSchedulerMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnAIAssistantMessageReceived(cb: (data: CometChat.AIAssistantMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onAIAssistantMessageReceived, cb, destroyRef);\n  }\n\n  static subscribeOnAIToolResultReceived(cb: (data: CometChat.AIToolResultMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onAIToolResultReceived, cb, destroyRef);\n  }\n\n  static subscribeOnAIToolArgumentsReceived(cb: (data: CometChat.AIToolArgumentMessage) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatMessageEvents.onAIToolArgumentsReceived, cb, destroyRef);\n  }\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\n\nexport class CometChatUIKitConstants {\n  static MessageCategory = Object.freeze({\n    message: CometChat.CATEGORY_MESSAGE,\n    custom: CometChat.CATEGORY_CUSTOM,\n    action: CometChat.CATEGORY_ACTION,\n    call: CometChat.CATEGORY_CALL,\n    interactive: CometChat.CATEGORY_INTERACTIVE,\n    agentic: CometChat.MessageCategory.AGENTIC,\n    // Card Messages — new first-party developer-card category.\n    // Distinct from the legacy interactive `card` *type*; the SDK beta exposes\n    // no CATEGORY_CARD constant, so the literal \"card\" is used intentionally.\n    card: 'card',\n  });\n  static moderationStatus = Object.freeze({\n    pending: CometChat.ModerationStatus.PENDING,\n    approved: CometChat.ModerationStatus.APPROVED,\n    disapproved: CometChat.ModerationStatus.DISAPPROVED,\n    unmoderated: CometChat.ModerationStatus.UNMODERATED,\n  });\n\n  /**\n   * UI Kit-owned message metadata keys for the multi-attachments feature.\n   * `batchId` is the render-time grouping key shared across all messages produced by one\n   * send; `audioType` disambiguates an attached audio file from a recorded voice note.\n   */\n  static MetadataKeys = Object.freeze({\n    batchId: 'batchId',\n    audioType: 'audioType',\n  });\n\n  /**\n   * Values for the `audioType` metadata key. A recorded voice note is explicitly tagged\n   * `voice_note`; audio WITHOUT the tag (attached files, legacy audio) is a normal audio\n   * message — absence never means voice note.\n   *\n   * `legacyVoiceNote` is the camelCase value this kit wrote before aligning with the\n   * React/iOS/Android kits. It is READ for backward compatibility but never written, so\n   * voice notes already in a conversation keep rendering as waveforms.\n   */\n  static AudioType = Object.freeze({\n    voiceNote: 'voice_note',\n    legacyVoiceNote: 'voiceNote',\n  });\n  static MessageTypes = Object.freeze({\n    text: CometChat.MESSAGE_TYPE.TEXT,\n    file: CometChat.MESSAGE_TYPE.FILE,\n    image: CometChat.MESSAGE_TYPE.IMAGE,\n    audio: CometChat.MESSAGE_TYPE.AUDIO,\n    video: CometChat.MESSAGE_TYPE.VIDEO,\n    delete: 'delete',\n    edited: 'edited',\n    groupMember: 'groupMember',\n    form: 'form',\n    card: 'card',\n    customInteractive: 'customInteractive',\n    scheduler: 'scheduler',\n    assistant: CometChat.MESSAGE_TYPE.ASSISTANT,\n    toolArguments: CometChat.MESSAGE_TYPE.TOOL_ARGUMENTS,\n    toolResults: CometChat.MESSAGE_TYPE.TOOL_RESULT,\n  });\n  static ExtensionTypes = Object.freeze({\n    poll: 'extension_poll',\n    sticker: 'extension_sticker',\n    whiteboard: 'extension_whiteboard',\n    document: 'extension_document',\n  });\n  static ComposerAttachmentOption = Object.freeze({\n    image: 'image',\n    video: 'video',\n    audio: 'audio',\n    file: 'file',\n    poll: 'polls',\n    collaborativeDocument: 'collaborative-document',\n    collaborativeWhiteboard: 'collaborative-whiteboard',\n  });\n  static groupMemberAction = Object.freeze({\n    ROLE: 'role',\n    BLOCK: 'block',\n    REMOVE: 'remove',\n    JOINED: CometChat.ACTION_TYPE.MEMBER_JOINED,\n    LEFT: CometChat.ACTION_TYPE.MEMBER_LEFT,\n    ADDED: CometChat.ACTION_TYPE.MEMBER_ADDED,\n    BANNED: CometChat.ACTION_TYPE.MEMBER_BANNED,\n    UNBANNED: CometChat.ACTION_TYPE.MEMBER_UNBANNED,\n    KICKED: CometChat.ACTION_TYPE.MEMBER_KICKED,\n    INVITED: CometChat.ACTION_TYPE.MEMBER_INVITED,\n    SCOPE_CHANGE: CometChat.ACTION_TYPE.MEMBER_SCOPE_CHANGED,\n  });\n  static MessageReceiverType = Object.freeze({\n    user: CometChat.RECEIVER_TYPE.USER,\n    group: CometChat.RECEIVER_TYPE.GROUP,\n  });\n  static userStatusType = Object.freeze({\n    online: CometChat.USER_STATUS.ONLINE,\n    offline: CometChat.USER_STATUS.OFFLINE,\n  });\n  static MessageOption = Object.freeze({\n    editMessage: 'edit',\n    deleteMessage: 'delete',\n    replyMessage: 'reply',\n    replyInThread: 'replyInThread',\n    translateMessage: 'translate',\n    reactToMessage: 'react',\n    messageInformation: 'info',\n    flagMessage: 'flagMessage',\n    copyMessage: 'copy',\n    shareMessage: 'share',\n    forwardMessage: 'forward',\n    sendMessagePrivately: 'sendMessagePrivately',\n    replyMessagePrivately: 'replyMessagePrivately',\n    markAsUnread: 'markAsUnread',\n  });\n\n  static GroupOptions = Object.freeze({\n    leave: 'leave',\n    delete: 'delete',\n    viewMembers: 'viewMembers',\n    addMembers: 'addMembers',\n    bannedMembers: 'bannedMembers',\n  });\n  static GroupMemberOptions = Object.freeze({\n    kick: 'kick',\n    ban: 'ban',\n    unban: 'unban',\n    changeScope: 'changeScope',\n  });\n  static groupMemberScope = Object.freeze({\n    owner: 'owner',\n    admin: CometChat.GROUP_MEMBER_SCOPE.ADMIN,\n    participant: CometChat.GROUP_MEMBER_SCOPE.PARTICIPANT,\n    moderator: CometChat.GROUP_MEMBER_SCOPE.MODERATOR,\n  });\n  static UserOptions = Object.freeze({\n    block: 'block',\n    unblock: 'unblock',\n    viewProfile: 'viewProfile',\n  });\n  static ConversationOptions = Object.freeze({\n    delete: 'delete',\n  });\n  static GroupTypes = Object.freeze({\n    private: CometChat.GROUP_TYPE.PRIVATE,\n    password: CometChat.GROUP_TYPE.PASSWORD,\n    public: CometChat.GROUP_TYPE.PUBLIC,\n  });\n  static liveReaction = Object.freeze({\n    timeout: 1500,\n  });\n  static messages = Object.freeze({\n    MESSAGE_DELIVERED: 'onMessagesDelivered',\n    MESSAGE_READ: 'onMessagesRead',\n    MESSAGE_DELETED: 'onMessageDeleted',\n    MESSAGE_EDITED: 'onMessageEdited',\n    MESSAGE_SENT: 'messageSent',\n    TEXT_MESSAGE_RECEIVED: 'onTextMessageReceived',\n    MEDIA_MESSAGE_RECEIVED: 'onMediaMessageReceived',\n    CUSTOM_MESSAGE_RECEIVED: 'onCustomMessageReceived',\n    TRANSIENT_MESSAGE_RECEIVED: 'onTransientMessageReceived',\n    INTERACTIVE_MESSAGE_RECEIVED: 'onInteractiveMessageReceived',\n    DELIVERY: 'delivery',\n    READ: 'read',\n    APP_SYSTEM: 'app_system',\n    MESSAGE_REACTION_ADDED: 'onMessageReactionAdded',\n    MESSAGE_REACTION_REMOVED: 'onMessageReactionRemoved',\n  });\n  static details = Object.freeze({\n    primary: 'primary',\n    secondary: 'secondary',\n  });\n  static calls = Object.freeze({\n    meeting: 'meeting',\n    ongoing: CometChat.CALL_STATUS.ONGOING,\n    ended: CometChat.CALL_STATUS.ENDED,\n    initiated: CometChat.CALL_STATUS.INITIATED,\n    cancelled: CometChat.CALL_STATUS.CANCELLED,\n    rejected: CometChat.CALL_STATUS.REJECTED,\n    unanswered: CometChat.CALL_STATUS.UNANSWERED,\n    busy: CometChat.CALL_STATUS.BUSY,\n    activecall: 'cometchat:activecall',\n    default: CometChat.CALL_MODE.DEFAULT,\n    grid: CometChat.CALL_MODE.GRID,\n    single: CometChat.CALL_MODE.SINGLE,\n    spotlight: CometChat.CALL_MODE.SPOTLIGHT,\n    tile: CometChat.CALL_MODE.TILE,\n  });\n  static goalType = Object.freeze({\n    allOf: CometChat.GoalType.ALL_OF,\n    anyOf: CometChat.GoalType.ANY_OF,\n    anyAction: CometChat.GoalType.ANY_ACTION,\n    none: CometChat.GoalType.NONE,\n  });\n\n  static requestBuilderLimits = Object.freeze({\n    reactionListLimit: 10,\n    reactionInfoLimit: 10,\n    messageListLimit: 30,\n    usersLimit: 30,\n    groupsLimit: 30,\n  });\n\n  static radioNames = Object.freeze({\n    conversations: 'conversations',\n    users: 'users',\n    groups: 'groups',\n    changeScope: 'changeScope',\n    groupMembers: 'groupMembers',\n  });\n\n  static mimeTypes = Object.freeze({\n    audio:\n      'audio/*, .aac, .aif, .aiff, .caf, .mp3, .mp4, .wav, .m4a, .wma, .flac, .alac, .oga, .ra, .ram, .mid, .midi, .mka, .opus, .ac3, .amr, .ape, .dts, .wv, .tta, .pcm, .snd, .au, .cda, .vox, .m4b, .m3u, .pls, .ogg',\n    video:\n      'video/*, .mov, .mp4, .m4v, .avi, .mpg, .mpeg, .m2ts, .mts, .3gp, .3g2, .flv, .wmv, .vob, .ts, .webm, .f4v, .f4a, .f4b, .swf, .rm, .rmvb, .divx, .xvid, .mxf, .asf, .amv, .smv, .avchd, .qt',\n    image:\n      'image/*, .heic, .heif, .jpg, .jpeg, .png, .gif, .bmp, .tiff, .tif, .psd, .svg, .ico, .raw, .dng, .eps, .webp, .jfif, .jp2, .jpf, .jpx, .jpm, .mj2, .hdr, .exr, .pbm, .pgm, .ppm, .pnm, .tga, .dds, .svgz, .djvu, .ai, .cdr',\n  });\n  static shimmerList: readonly number[] = Object.freeze(\n    Array.from({ length: 12 }, (_, i) => i + 1)\n  );\n\n  static streamMessageTypes = Object.freeze({\n    run_started: CometChat.AI_ASSISTANT_EVENTS.RUN_STARTED,\n    text_message_start: CometChat.AI_ASSISTANT_EVENTS.TEXT_MESSAGE_START,\n    text_message_content: CometChat.AI_ASSISTANT_EVENTS.TEXT_MESSAGE_CONTENT,\n    text_message_end: CometChat.AI_ASSISTANT_EVENTS.TEXT_MESSAGE_END,\n    run_finished: CometChat.AI_ASSISTANT_EVENTS.RUN_FINISHED,\n    tool_call_start: CometChat.AI_ASSISTANT_EVENTS.TOOL_CALL_STARTED,\n    tool_call_end: CometChat.AI_ASSISTANT_EVENTS.TOOL_CALL_ENDED,\n    tool_call_args: CometChat.AI_ASSISTANT_EVENTS.TOOL_CALL_ARGUMENT,\n    tool_call_result: CometChat.AI_ASSISTANT_EVENTS.TOOL_CALL_RESULT,\n  });\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMessageEvents } from '../events/CometChatMessageEvents';\nimport { CometChatUIKitConstants } from '../constants';\n\n/**\n * Initializes and manages CometChat SDK message listeners.\n *\n * This class attaches SDK-level message listeners and forwards events\n * to the UIKit's RxJS-based event system (CometChatMessageEvents).\n *\n * Listeners are attached after login and detached on logout.\n */\nexport class ChatSdkEventInitializer {\n  private static messageListenerId = `message_listener_${Date.now()}`;\n\n  /**\n   * Attaches CometChat SDK message listeners.\n   * Called automatically after successful login in CometChatUIKit.\n   */\n  static attachListeners(): void {\n    CometChat.addMessageListener(this.messageListenerId, this.getMessageListenerObject());\n  }\n\n  /**\n   * Detaches CometChat SDK message listeners.\n   * Called automatically on logout in CometChatUIKit.\n   */\n  static detachListeners(): void {\n    CometChat.removeMessageListener(this.messageListenerId);\n  }\n\n  /**\n   * Creates the message listener object with handlers for all message events.\n   * Each handler forwards the event to the corresponding CometChatMessageEvents subject.\n   */\n  private static getMessageListenerObject(): CometChat.MessageListener {\n    return new CometChat.MessageListener({\n      onTextMessageReceived: (textMessage: CometChat.TextMessage) => {\n        CometChatMessageEvents.onTextMessageReceived.next(textMessage);\n      },\n      onMediaMessageReceived: (mediaMessage: CometChat.MediaMessage) => {\n        CometChatMessageEvents.onMediaMessageReceived.next(mediaMessage);\n      },\n      onMessageModerated: (moderatedMessage: CometChat.BaseMessage) => {\n        CometChatMessageEvents.onMessageModerated.next(moderatedMessage);\n      },\n      onCustomMessageReceived: (customMessage: CometChat.CustomMessage) => {\n        CometChatMessageEvents.onCustomMessageReceived.next(customMessage);\n      },\n      onTypingStarted: (typingIndicator: CometChat.TypingIndicator) => {\n        CometChatMessageEvents.onTypingStarted.next(typingIndicator);\n      },\n      onTypingEnded: (typingIndicator: CometChat.TypingIndicator) => {\n        CometChatMessageEvents.onTypingEnded.next(typingIndicator);\n      },\n      onMessagesDelivered: (messageReceipt: CometChat.MessageReceipt) => {\n        CometChatMessageEvents.onMessagesDelivered.next(messageReceipt);\n      },\n      onMessagesRead: (messageReceipt: CometChat.MessageReceipt) => {\n        CometChatMessageEvents.onMessagesRead.next(messageReceipt);\n      },\n      onMessagesDeliveredToAll: (messageReceipt: CometChat.MessageReceipt) => {\n        CometChatMessageEvents.onMessagesDeliveredToAll.next(messageReceipt);\n      },\n      onMessagesReadByAll: (messageReceipt: CometChat.MessageReceipt) => {\n        CometChatMessageEvents.onMessagesReadByAll.next(messageReceipt);\n      },\n      onMessageEdited: (message: CometChat.BaseMessage) => {\n        CometChatMessageEvents.onMessageEdited.next(message);\n      },\n      onMessageDeleted: (message: CometChat.BaseMessage) => {\n        CometChatMessageEvents.onMessageDeleted.next(message);\n      },\n      onMessageReactionAdded: (reaction: CometChat.ReactionEvent) => {\n        CometChatMessageEvents.onMessageReactionAdded.next(reaction);\n      },\n      onMessageReactionRemoved: (reaction: CometChat.ReactionEvent) => {\n        CometChatMessageEvents.onMessageReactionRemoved.next(reaction);\n      },\n      onSchedulerMessageReceived: (message: CometChat.InteractiveMessage) => {\n        CometChatMessageEvents.onSchedulerMessageReceived.next(message);\n      },\n      onInteractiveMessageReceived: (message: CometChat.InteractiveMessage) => {\n        switch (message.getType()) {\n          case CometChatUIKitConstants.MessageTypes.form:\n            CometChatMessageEvents.onFormMessageReceived.next(message);\n            break;\n          // NOTE: the legacy interactive `card` type (category\n          // \"interactive\") is NOT the new developer card. It flows through the\n          // generic interactive channel; `onCardMessageReceived` is now reserved\n          // for the new CardMessage (category \"card\") published below.\n          default:\n            CometChatMessageEvents.onCustomInteractiveMessageReceived.next(message);\n            break;\n        }\n      },\n      // New developer card (category \"card\"); publish the typed CardMessage.\n      onCardMessageReceived: (message: CometChat.CardMessage) => {\n        CometChatMessageEvents.onCardMessageReceived.next(message);\n      },\n      onAIAssistantMessageReceived: (message: CometChat.AIAssistantMessage) => {\n        CometChatMessageEvents.onAIAssistantMessageReceived.next(message);\n      },\n      onAIToolResultReceived: (message: CometChat.AIToolResultMessage) => {\n        CometChatMessageEvents.onAIToolResultReceived.next(message);\n      },\n      onAIToolArgumentsReceived: (message: CometChat.AIToolArgumentMessage) => {\n        CometChatMessageEvents.onAIToolArgumentsReceived.next(message);\n      },\n    });\n  }\n}\n","// Calls SDK is optional. We load it lazily on first access so that:\n// 1. Apps that don't use calling features don't pay the bundle cost.\n// 2. The module works in environments (jsdom, Angular 17-19) that don't\n//    support top-level await in esbuild's browser target configuration.\n\n// Stores the resolved CometChatCalls class (not the raw module namespace)\nlet _callsSDK: any = null;\nlet _loaded = false;\nlet _loadPromise: Promise<any> | null = null;\n\nasync function loadCallsSDK(): Promise<any> {\n  if (_loaded) {\n    return _callsSDK;\n  }\n  // Return the in-flight promise if already loading — prevents concurrent\n  // callers from racing and getting null before the first import resolves\n  if (_loadPromise) {\n    return _loadPromise;\n  }\n  _loadPromise = (async () => {\n    try {\n      const mod = await import('@cometchat/calls-sdk-javascript');\n      // esbuild wraps UMD modules: named exports may be on the namespace\n      // directly or nested under .default depending on bundler version\n      _callsSDK = mod?.CometChatCalls ?? mod?.default?.CometChatCalls ?? null;\n    } catch (e) {\n      // Calls SDK is optional — not available in test/jsdom environments\n      _callsSDK = null;\n    }\n    _loaded = true;\n    _loadPromise = null;\n    return _callsSDK;\n  })();\n  return _loadPromise;\n}\n\n// Synchronous accessor — returns null until loadCallsSDK() has resolved.\n// Components that need the calls SDK should call getCometChatCalls() first.\nexport var CometChatUIKitCalls: any = null;\n\n// Kick off the load immediately (non-blocking) so it's ready as soon as\n// possible, but without using top-level await.\nloadCallsSDK().then((CometChatCalls) => {\n  CometChatUIKitCalls = CometChatCalls;\n});\n\n/**\n * Returns a promise that resolves to the CometChatCalls class once the\n * SDK has loaded, or null if the SDK is not available.\n */\nexport async function getCometChatCalls(): Promise<any> {\n  if (!CometChatUIKitCalls) {\n    // Kick off the load immediately (non-blocking) so it's ready as soon as\n    // possible, but without using top-level await.\n    loadCallsSDK().then((CometChatCalls) => {\n      CometChatUIKitCalls = CometChatCalls;\n    });\n  }\n  return loadCallsSDK();\n}\n\n/**\n * Test-only helper: inject a mock Calls SDK so property-based tests\n * can exercise OngoingCallService without loading the real SDK\n * (which depends on JitsiMeetJS / browser globals).\n *\n * Pass `null` to restore the original value.\n */\nexport function _setCallsSDKForTesting(mock: any): void {\n  _loaded = true;\n  _callsSDK = mock;\n  CometChatUIKitCalls = mock;\n}\n","/**\n * It is used for specifying the position of the auxiliary buttons.\n * It is used in CometChatMessageComposer component.\n */\nexport enum AuxiliaryButtonAlignment {\n  left,\n  right,\n}\n/**\n * It is used for specifying the function of enter button\n * It is used in CometChatMessageComposer component.\n */\nexport enum EnterKeyBehavior {\n  SendMessage = 'sendMessage',\n  NewLine = 'newLine',\n  None = 'none',\n}\n\n/**\n * It is used for describing the position of the element on the UI.\n * It is used in CometChatContextualMenu, CometChatMessageBubble, CometChatUsers and CometChatGroupMembers components.\n */\nexport enum Placement {\n  top = 'top',\n  right = 'right',\n  bottom = 'bottom',\n  left = 'left',\n}\n\n/**\n * It is used for specifying the alignment of the message list.\n * It is used in CometChatMessageList component.\n */\nexport enum MessageListAlignment {\n  left,\n  standard,\n}\n\n/**\n * This is used for specifying the position of the message bubble.\n * It is used in various components where the message bubbles are used.\n */\nexport enum MessageBubbleAlignment {\n  left,\n  right,\n  center,\n}\n\n/**\n * This is used for specifying the position of the document icon.\n * It is used in Decorators like CallingExtension, CollaborativeDocument, CollaborativeWhiteboard.\n */\nexport enum DocumentIconAlignment {\n  left,\n  right,\n}\n\n/**\n * This is used to specify the alignment of the tabs.\n * It is used in CometChatTabs and CometChatContacts components.\n */\nexport enum TabAlignment {\n  top,\n  bottom,\n  left,\n  right,\n}\n\n/**\n * This is used to specify the status of the message delivery.\n * It is used in components related to messages.\n */\nexport enum MessageStatus {\n  inprogress,\n  success,\n  error,\n  cancelled,\n}\n\n/**\n * This is used to specify the types of the read receipts for the message.\n * It is used in Bubbles, CometChatMessageInformation components.\n */\nexport enum Receipts {\n  wait,\n  sent,\n  delivered,\n  read,\n  error,\n}\n\n/**\n * This is used for specifying the position of the title.\n */\nexport enum TitleAlignment {\n  left,\n  center,\n}\n\n/**\n * It is used to specify the mode of selection for the list of items.\n * It is used in components where there is a list of items involed, like users/groups etc.\n */\nexport enum SelectionMode {\n  single,\n  multiple,\n  none,\n}\n\n/**\n * This is used to specify the states of the operation on the UI.\n * It has options like:\n * loading: to be used while waiting for a particular operation,\n * empty: when there is nothing to be displayed,\n * error: when an error occurs in the operation, and\n * loaded: when the operation is completed.\n */\nexport enum States {\n  loading,\n  empty,\n  error,\n  loaded,\n}\n\n/**\n * This is used to specify the position for the time-stamp.\n * It is used in CometChatMessageList component.\n */\nexport enum TimestampAlignment {\n  top,\n  bottom,\n}\n\n/**\n * This is used to specify the alignment for the icon button.\n * It is used in CometChatTabs, CometChatOutgoingCall components.\n */\nexport enum IconButtonAlignment {\n  top = 'column',\n  bottom = 'column-reverse',\n  left = 'row',\n  right = 'row-reverse',\n}\n\n/**\n * It is used to specify the type for the recording.\n * It is used in CometChatMessageComposer component.\n */\nexport enum RecordingType {\n  audio,\n  video,\n}\n\n/**\n * It is used to specify which tabs should be visible amongst user and group.\n * It is used in CometChatContacts component.\n */\nexport enum TabsVisibility {\n  usersAndGroups,\n  users,\n  groups,\n}\n\n/**\n * This is used to specify the type of the call.\n * It is used in CometChatCallLogs, CometChatOngoingCall components.\n */\nexport enum CallWorkflow {\n  defaultCalling,\n  directCalling,\n}\n\n/**\n * This is used to provide the alignment for the panel.\n * It is used in CometChatMessageList component and AI module components.\n */\nexport enum PanelAlignment {\n  composerHeader,\n  messageListHeader,\n  messageListFooter,\n  messages,\n}\n\n/**\n * It is used to provide the alignment for the labels.\n */\nexport enum LabelAlignment {\n  top = 'column',\n  bottom = 'column-reverse',\n  left = 'row',\n  right = 'row-reverse',\n}\n\n/**\n * It is used to specify the type of the UI element.\n * It is used in modal components.\n */\nexport enum ElementType {\n  label = 'label',\n  text = 'textInput',\n  dropdown = 'dropdown',\n  checkbox = 'checkbox',\n  radio = 'radio',\n  button = 'button',\n  singleSelect = 'singleSelect',\n  dateTime = 'dateTime',\n}\n\n/**\n * It is used to specify what action a button should perform.\n * It is used in InteractiveMessageUtils function and in modal components.\n */\nexport enum ButtonAction {\n  apiAction = 'apiAction',\n  urlNavigation = 'urlNavigation',\n  custom = 'custom',\n}\n\n/**\n * It is used to specify the type of the http request call.\n * It is used in InteractiveMessageUtils function and APIAction inside modals.\n */\nexport enum HTTPSRequestMethods {\n  POST = 'POST',\n  PUT = 'PUT',\n  PATCH = 'PATCH',\n  DELETE = 'DELETE',\n}\n\n/**\n * It is used to select the mode for date time picker component.\n * It is used in DateTimePickerElement component.\n */\nexport enum DateTimePickerMode {\n  date = 'date',\n  dateTime = 'dateTime',\n  time = 'time',\n}\n\n/**\n * It is used for specifying the type of user/members list.\n * It is used in CometChatMessageComposer and CometChatUserMemberWrapper components.\n */\nexport enum UserMemberListType {\n  users,\n  groupmembers,\n}\n\n/**\n * This is used to specify the source for mouse event with mentions information.\n * It is used in CometChatMentionsFormatter util.\n */\nexport enum MouseEventSource {\n  mentions,\n}\n\n/**\n * It is used to describe the mode for previewing message.\n * It is used in CometChatMessageComposer component.\n */\nexport enum PreviewMessageMode {\n  edit,\n  none,\n}\n/**\n * It is generally used for formatting the text by providing the required data.\n * It is used in CometChatConversations, CometChatTextFormatter and CometChatMentionsFormatter.\n */\nexport enum MentionsTargetElement {\n  textinput,\n  textbubble,\n  conversation,\n}\n\n/**\n * It is used for providing the value for the mentions visibility.\n * It is used in CometChatMentionsFormatter component.\n */\nexport enum MentionsVisibility {\n  usersConversationOnly,\n  groupConversationOnly,\n  both,\n}\n\n/**\n * Specifies the scope of the search functionality.\n *\n * @remarks\n * - `Conversations`: Limits the search to conversations only.\n * - `Messages`: Limits the search to messages only.\n *\n */\nexport enum CometChatSearchScope {\n  Conversations = 'conversations',\n  Messages = 'messages',\n}\n/**\n * Specifies the filters available for the search functionality.\n *\n * @remarks\n * - `Messages`: Filters to search within messages.\n * - `Conversations`: Filters to search within conversations.\n * - `Unread`: Filters to search for unread messages.\n * - `Groups`: Filters to search within groups.\n * - `Photos`: Filters to search for photo messages.\n * - `Videos`: Filters to search for video messages.\n * - `Links`: Filters to search for links shared in messages.\n * - `Documents`: Filters to search for document files.\n * - `Audio`: Filters to search for audio messages.\n */\nexport enum CometChatSearchFilter {\n  Messages = 'messages',\n  Conversations = 'conversations',\n  Unread = 'unread',\n  Groups = 'groups',\n  Photos = 'photos',\n  Videos = 'videos',\n  Links = 'links',\n  Documents = 'files',\n  Audio = 'audio',\n}\n\nexport interface ComposerId {\n  parentMessageId: number | null;\n  user: string | null;\n  group: string | null;\n}\n\n/**\n * Mention type enumeration for styling purposes.\n * Used to determine which CSS class to apply to a mention in text bubbles.\n *\n * @remarks\n * - `self`: Mention of the current logged-in user\n * - `other`: Mention of another user\n * - `channel`: Channel mention (@all)\n *\n * It is used in CometChatTextBubble and CometChatMentionsFormatter components.\n * @see Requirements 5.1, 5.2, 5.3, 5.4\n */\nexport enum MentionType {\n  /** Mention of the current logged-in user */\n  self = 'self',\n  /** Mention of another user */\n  other = 'other',\n  /** Channel mention (@all) */\n  channel = 'channel',\n}\n","export class CometChatUIKitUtility {\n  /**\n   * Counter for generating unique IDs within the same millisecond\n   */\n  private static counter = 0;\n\n  static getUnixTimestamp(): number {\n    return Date.now();\n  }\n\n  /**\n   * Generates a unique identifier string.\n   * The ID is composed of:\n   * - 'cc_' prefix for CometChat identification\n   * - Current timestamp in milliseconds\n   * - An incrementing counter to ensure uniqueness within the same millisecond\n   * - A random alphanumeric string for additional uniqueness\n   *\n   * @returns A unique string identifier suitable for listener IDs and component identifiers\n   */\n  static ID(): string {\n    return `cc_${Date.now()}_${++CometChatUIKitUtility.counter}_${Math.random().toString(36).substring(2, 9)}`;\n  }\n\n  /**\n   * Creates a deep clone of the given object, preserving prototype chain and\n   * property descriptors. Functions are copied by reference.\n   *\n   * Mirrors the React UIKit's CometChatUIKitUtility.clone implementation.\n   * Used to create new object references for Angular change detection (OnPush).\n   *\n   * @param arg - The value to clone\n   * @returns A deep copy of the argument\n   */\n  static clone<T>(arg: T): T {\n    if (typeof arg !== 'object' || !arg) {\n      return arg;\n    }\n\n    if (Array.isArray(arg)) {\n      const res: unknown[] = [];\n      for (const value of arg) {\n        res.push(CometChatUIKitUtility.clone(value));\n      }\n      return res as T;\n    }\n\n    const res: Record<string | symbol, unknown> = {};\n    const descriptor = Object.getOwnPropertyDescriptors(arg);\n    for (const k of Reflect.ownKeys(descriptor)) {\n      const curDescriptor = descriptor[k as string];\n      if (curDescriptor.hasOwnProperty('value')) {\n        Object.defineProperty(res, k, {\n          ...curDescriptor,\n          value: CometChatUIKitUtility.clone(curDescriptor['value']),\n        });\n      } else {\n        Object.defineProperty(res, k, curDescriptor);\n      }\n    }\n    Object.setPrototypeOf(res, Object.getPrototypeOf(arg));\n    return res as T;\n  }\n}\n","/**\n * Static helper utilities for CometChatUIKit.\n * Contains message sending helpers and user management helpers\n * extracted to keep cometchat-uikit.ts under 400 lines.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMessageEvents } from './events/CometChatMessageEvents';\nimport { MessageStatus } from './Enums/Enums';\nimport { CometChatUIKitUtility } from './CometChatUIKitUtility';\n\n// ── Message Sending ───────────────────────────────────────────────────────\n\n/**\n * Sends a text message and emits inprogress/success/error events.\n */\nexport function sendTextMessage(message: CometChat.TextMessage): Promise<CometChat.BaseMessage> {\n  return new Promise((resolve, reject) => {\n    message.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    if (!message?.getMuid()) { message.setMuid(CometChatUIKitUtility.ID()); }\n    CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.inprogress });\n    CometChat.sendMessage(message)\n      .then((sent: CometChat.BaseMessage) => {\n        CometChatMessageEvents.ccMessageSent.next({ message: sent, status: MessageStatus.success });\n        return resolve(sent);\n      })\n      .catch((error: CometChat.CometChatException) => {\n        message.setMetadata({ error });\n        CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.error });\n        return reject(error);\n      });\n  });\n}\n\n/**\n * Sends a media message and emits inprogress/success/error events.\n */\nexport function sendMediaMessage(message: CometChat.MediaMessage): Promise<CometChat.BaseMessage> {\n  message.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n  if (!message?.getMuid()) { message.setMuid(CometChatUIKitUtility.ID()); }\n  return new Promise((resolve, reject) => {\n    CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.inprogress });\n    CometChat.sendMediaMessage(message)\n      .then((sent: CometChat.BaseMessage) => {\n        CometChatMessageEvents.ccMessageSent.next({ message: sent, status: MessageStatus.success });\n        return resolve(sent);\n      })\n      .catch((error: CometChat.CometChatException) => {\n        message.setMetadata({ error });\n        CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.error });\n        return reject(error);\n      });\n  });\n}\n\n/**\n * Sends a custom message and emits inprogress/success/error events.\n */\nexport function sendCustomMessage(message: CometChat.CustomMessage): Promise<CometChat.BaseMessage> {\n  return new Promise((resolve, reject) => {\n    message.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    if (!message?.getMuid()) { message.setMuid(CometChatUIKitUtility.ID()); }\n    CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.inprogress });\n    CometChat.sendCustomMessage(message)\n      .then((sent: CometChat.BaseMessage) => {\n        CometChatMessageEvents.ccMessageSent.next({ message: sent, status: MessageStatus.success });\n        return resolve(sent);\n      })\n      .catch((error: CometChat.CometChatException) => {\n        message.setMetadata({ error });\n        CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.error });\n        return reject(error);\n      });\n  });\n}\n\n// ── User Management ───────────────────────────────────────────────────────\n\n/**\n * Creates a new CometChat user using the provided auth key.\n */\nexport function createUser(user: CometChat.User, authKey: string): Promise<CometChat.User> {\n  return new Promise((resolve, reject) => {\n    CometChat.createUser(user, authKey)\n      .then((created: CometChat.User) => resolve(created))\n      .catch((error: CometChat.CometChatException) => reject(error));\n  });\n}\n\n/**\n * Updates an existing CometChat user using the provided auth key.\n */\nexport function updateUser(user: CometChat.User, authKey: string): Promise<CometChat.User> {\n  return new Promise((resolve, reject) => {\n    CometChat.updateUser(user, authKey)\n      .then((updated: CometChat.User) => resolve(updated))\n      .catch((error: CometChat.CometChatException) => reject(error));\n  });\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { CometChat, CometChatSettings } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from './resources/CometChatLocalize/cometchat-localize';\nimport { UIKitSettings, UIKitSettingsBuilder } from './UIKitSettings';\nimport { CometChatSoundManager } from './resources/CometChatSoundManager/CometChatSoundManager';\nimport { CometChatUIKitLoginListener } from './CometChatUIKitLoginListener';\nimport { ChatSdkEventInitializer } from './utils/ChatSdkEventInitializer';\nimport { InitResult, LogoutResult } from './modals/CometChatUIKitInterfaces';\nimport { CometChatLogger, LogLevel } from './utils/CometChatLogger';\nimport { CometChatUIKitCalls, getCometChatCalls } from './CometChatCalls';\nimport {\n  sendTextMessage,\n  sendMediaMessage,\n  sendCustomMessage,\n  createUser,\n  updateUser,\n} from './cometchat-uikit.utils';\n\n// Re-export types for backward compatibility\nexport type { CometChatUiKitWindow } from './cometchat-uikit.types';\n\n// Window type augmentation\ndeclare global {\n  interface Window {\n    CometChatUiKit: { name: string; version: string };\n  }\n}\n\n/**\n * `CometChatUIKit` provides a dual-API architecture for Angular applications.\n *\n * Enables SDK initialization and interaction both before Angular bootstraps\n * (via static methods in `main.ts`) and within Angular components (via DI).\n *\n * @example\n * // Static usage in main.ts\n * CometChatUIKit.init(settings).then(() => bootstrapApplication(AppComponent));\n *\n * @example\n * // Injectable usage in components\n * constructor(private uiKit: CometChatUIKit) {\n *   this.uiKit.loggedInUser$.subscribe(user => CometChatLogger.info(user));\n * }\n */\n@Injectable({ providedIn: 'root' })\nexport class CometChatUIKit {\n  private static _uiKitSettings: UIKitSettings | null = null;\n  private static _loggedInUser: BehaviorSubject<CometChat.User | null> =\n    new BehaviorSubject<CometChat.User | null>(null);\n  private static _conversationUpdateSettings: CometChat.ConversationUpdateSettings;\n  private static _themeMode: 'light' | 'dark' = 'light';\n  /**\n   * Parsed `cometchat-settings.json` captured when the kit was initialized via\n   * `initFromSettings()`. Non-null only on the AI agent / skills path — it is\n   * what tells `initCalling()` to route the Calls SDK through its own\n   * `initFromSettings()` so `integrationSource = \"ai-agent\"` propagates to the\n   * Calls SDK the same way it already does for the Chat SDK.\n   */\n  private static _cometChatSettings: CometChatSettings | null = null;\n\n  static SoundManager: typeof CometChatSoundManager = CometChatSoundManager;\n  static Localize: typeof CometChatLocalize = CometChatLocalize;\n  static callingReady: Promise<void> = Promise.resolve();\n\n  // ── Settings Accessors ────────────────────────────────────────────────────\n\n  static get uiKitSettings(): UIKitSettings | null { return CometChatUIKit._uiKitSettings; }\n  static set uiKitSettings(value: UIKitSettings | null) { CometChatUIKit._uiKitSettings = value; }\n  static get conversationUpdateSettings(): CometChat.ConversationUpdateSettings { return CometChatUIKit._conversationUpdateSettings; }\n  static set conversationUpdateSettings(value: CometChat.ConversationUpdateSettings) { CometChatUIKit._conversationUpdateSettings = value; }\n  static get themeMode(): 'light' | 'dark' { return CometChatUIKit._themeMode; }\n  static set themeMode(value: 'light' | 'dark') { CometChatUIKit._themeMode = value; }\n\n  // ── User State ────────────────────────────────────────────────────────────\n\n  static get loggedInUser$(): Observable<CometChat.User | null> {\n    return CometChatUIKit._loggedInUser.asObservable();\n  }\n  get loggedInUser$(): Observable<CometChat.User | null> { return CometChatUIKit.loggedInUser$; }\n\n  static getLoggedInUser(): CometChat.User | null { return CometChatUIKit._loggedInUser.getValue(); }\n  getLoggedInUser(): CometChat.User | null { return CometChatUIKit.getLoggedInUser(); }\n\n  // ── Initialization ────────────────────────────────────────────────────────\n\n  static init(uiKitSettings: UIKitSettings | null): Promise<InitResult> | undefined {\n    CometChatUIKit._uiKitSettings = uiKitSettings;\n    // Plain developer path — the Calls SDK must go through plain init() too.\n    CometChatUIKit._cometChatSettings = null;\n    if (!CometChatUIKit.checkAuthSettings()) return undefined;\n    const builder = new CometChat.AppSettingsBuilder();\n    if (uiKitSettings!.getRoles()) { builder.subscribePresenceForRoles(uiKitSettings!.getRoles()!); }\n    else if (uiKitSettings!.getSubscriptionType() === 'ALL_USERS') { builder.subscribePresenceForAllUsers(); }\n    else if (uiKitSettings!.getSubscriptionType() === 'FRIENDS') { builder.subscribePresenceForFriends(); }\n    builder.autoEstablishSocketConnection(uiKitSettings!.isAutoEstablishSocketConnection());\n    builder.setRegion(uiKitSettings!.getRegion());\n    if (uiKitSettings!.getAdminHost()) { builder.overrideAdminHost(uiKitSettings!.getAdminHost()!); }\n    if (uiKitSettings!.getClientHost()) { builder.overrideClientHost(uiKitSettings!.getClientHost()!); }\n    builder.setStorageMode(uiKitSettings!.getStorageMode() as any);\n    const appSettings = builder.build();\n    if (CometChat.setSource) { CometChat.setSource('uikit-v5', 'web', 'angular'); }\n    CometChatLocalize.setCurrentLanguage(CometChatLocalize.getBrowserLanguage());\n    return new Promise((resolve, reject) => {\n      window.CometChatUiKit = { name: '@cometchat/chat-uikit-angular', version: '5.0.5' };\n      CometChat.init(uiKitSettings?.appId, appSettings)\n        .then(() => {\n          CometChat.getLoggedinUser()\n            .then((user: CometChat.User | null) => {\n              if (user) { CometChatUIKitLoginListener.setLoggedInUser(user); CometChatUIKit._loggedInUser.next(user); this.initiateAfterLogin(); }\n              return resolve({ user });\n            })\n            .catch((error: CometChat.CometChatException) => { CometChatLogger.error('CometChatUIKit', 'Initialization failed:', error); return reject(error); });\n        })\n        .catch((error: CometChat.CometChatException) => reject(error));\n    });\n  }\n  init(uiKitSettings: UIKitSettings | null): Promise<InitResult> | undefined { return CometChatUIKit.init(uiKitSettings); }\n\n  /**\n   * File-based init for AI agent skills.\n   * Accepts a parsed `cometchat-settings.json` object and delegates to the\n   * Chat SDK's file-based init, which internally sets\n   * `integrationSource = \"ai-agent\"` for telemetry. The same settings object is\n   * retained so that, when calling is enabled, the Calls SDK is initialized via\n   * `CometChatCalls.initFromSettings()` and reports the same source.\n   *\n   * This method is independent of `init()` — it does NOT call `init()`.\n   * It builds UIKitSettings internally so login/createUser/updateUser keep working.\n   *\n   * @internal — excluded from public API docs\n   */\n  static initFromSettings(settings: CometChatSettings): Promise<InitResult> {\n    // Extract UIKit-specific config from the settings JSON\n    const authKey = settings.credentials?.authKey;\n    const subscribeAll = settings.uiKit?.['subscribePresenceForAllUsers'] ?? true;\n    // Calling stays opt-in on this path too — enabled only when the settings\n    // file declares a `callsSDK` block, matching the React UI Kit's key.\n    const callingEnabled = !!settings.uiKit?.['callsSDK'];\n\n    // Build UIKitSettings so downstream code (login, enableCalling, etc.) works unchanged\n    const builder = new UIKitSettingsBuilder()\n      .setAppId(settings.appId)\n      .setRegion(settings.region);\n    if (authKey) { builder.setAuthKey(authKey); }\n    if (subscribeAll) { builder.subscribePresenceForAllUsers(); }\n    if (callingEnabled) { builder.setCallingEnabled(true); }\n    CometChatUIKit._uiKitSettings = builder.build();\n\n    // Retained for the Calls SDK: initCalling() uses its presence to pick\n    // CometChatCalls.initFromSettings() over plain CometChatCalls.init().\n    CometChatUIKit._cometChatSettings = settings;\n\n    // Set source for telemetry\n    if (CometChat.setSource) { CometChat.setSource('uikit-v5', 'web', 'angular'); }\n    CometChatLocalize.setCurrentLanguage(CometChatLocalize.getBrowserLanguage());\n\n    // CRITICAL: Call CometChat.initFromSettings() (NOT CometChat.init()).\n    // This is the SDK's file-based init path which sets\n    // integrationSource = \"ai-agent\" for telemetry.\n    return new Promise((resolve, reject) => {\n      window.CometChatUiKit = { name: '@cometchat/chat-uikit-angular', version: '5.0.5' };\n\n      CometChat.initFromSettings(settings)\n        .then(() => {\n          CometChat.getLoggedinUser()\n            .then((user: CometChat.User | null) => {\n              if (user) {\n                CometChatUIKitLoginListener.setLoggedInUser(user);\n                CometChatUIKit._loggedInUser.next(user);\n                this.initiateAfterLogin();\n              }\n              return resolve({ user });\n            })\n            .catch((error: CometChat.CometChatException) => {\n              CometChatLogger.error('CometChatUIKit', 'Initialization failed:', error);\n              return reject(error);\n            });\n        })\n        .catch((error: CometChat.CometChatException) => {\n          return reject(error);\n        });\n    });\n  }\n\n  static isInitialized(): boolean {\n    try { return CometChat.isInitialized(); } catch (error) { CometChatLogger.error('CometChatUIKit', 'isInitialized check failed:', error); return false; }\n  }\n  isInitialized(): boolean { return CometChatUIKit.isInitialized(); }\n\n  static setLogLevel(level: LogLevel): void { CometChatLogger.setLogLevel(level); }\n  setLogLevel(level: LogLevel): void { CometChatUIKit.setLogLevel(level); }\n\n  static isCallingEnabled(): boolean { return CometChatUIKit._uiKitSettings?.isCallingEnabled() ?? false; }\n  isCallingEnabled(): boolean { return CometChatUIKit.isCallingEnabled(); }\n\n  // ── Post-Login Setup ──────────────────────────────────────────────────────\n\n  private static initiateAfterLogin(): void {\n    if (CometChatUIKit._uiKitSettings != null) {\n      CometChat.getConversationUpdateSettings().then((res: CometChat.ConversationUpdateSettings) => {\n        CometChatUIKit._conversationUpdateSettings = res;\n      });\n      ChatSdkEventInitializer.attachListeners();\n      CometChatUIKitLoginListener.attachListener();\n      if (CometChatUIKit.isCallingEnabled()) { CometChatUIKit.callingReady = CometChatUIKit.initCalling(); }\n    }\n  }\n\n  private static async initCalling(): Promise<void> {\n    try {\n      const callsSDK = await getCometChatCalls();\n      if (callsSDK) {\n        const settings = CometChatUIKit._cometChatSettings;\n        // On the AI agent / skills path (`initFromSettings`) route the Calls SDK\n        // through its own file-based init so it reports\n        // `integrationSource = \"ai-agent\"`, mirroring the Chat SDK. Requires\n        // @cometchat/calls-sdk-javascript >= 5.0.3 — older versions fall back to\n        // plain init(), since the Calls SDK is an optional peer dependency.\n        const initCallsSDK: Promise<unknown> =\n          settings && typeof callsSDK.initFromSettings === 'function'\n            ? callsSDK.initFromSettings(settings)\n            : callsSDK.init(\n              CometChatUIKit._uiKitSettings?.getCallAppSettings()\n              ?? new callsSDK.CallAppSettingsBuilder()\n                .setAppId(CometChatUIKit._uiKitSettings?.appId!)\n                .setRegion(CometChatUIKit._uiKitSettings?.region!)\n                .build()\n            );\n        initCallsSDK.then(\n          (result: any) => {\n            // The Calls SDK reports validation failures in the resolved value\n            // instead of rejecting, so surface those too.\n            if (result?.success === false) { CometChatLogger.error('CometChatUIKit', 'CometChatUIKitCalls initialization failed:', result.error); }\n          },\n          (error: CometChat.CometChatException) => { CometChatLogger.error('CometChatUIKit', 'CometChatUIKitCalls initialization failed:', error); }\n        );\n        const user = CometChatUIKit.getLoggedInUser();\n        if (user) {\n          await CometChatUIKitCalls.loginWithAuthToken(user.getAuthToken()).catch(\n            (error: CometChat.CometChatException) => { CometChatLogger.error('CometChatUIKit', 'CometChatUIKitCalls login failed:', error); }\n          );\n        }\n      }\n    } catch (e) { CometChatLogger.error('CometChatUIKit', 'initCalling error:', e); }\n  }\n\n  // ── Authentication ────────────────────────────────────────────────────────\n\n  static login(uid: string): Promise<CometChat.User> {\n    return new Promise((resolve, reject) => {\n      if (!CometChatUIKit.checkAuthSettings()) return reject('uiKitSettings not available');\n      CometChatUIKit.getLoggedinUser()?.then(user => {\n        if (user) {\n          CometChatUIKitLoginListener.setLoggedInUser(user); CometChatUIKit._loggedInUser.next(user);\n          this.initiateAfterLogin(); return resolve(user);\n        }\n        CometChat.login(uid, CometChatUIKit._uiKitSettings!.authKey!)\n          .then((user: CometChat.User) => {\n            CometChatUIKitLoginListener.setLoggedInUser(user); CometChatUIKit._loggedInUser.next(user);\n            this.initiateAfterLogin(); return resolve(user);\n          })\n          .catch((error: CometChat.CometChatException) => reject(error));\n      });\n    });\n  }\n  login(uid: string): Promise<CometChat.User> { return CometChatUIKit.login(uid); }\n\n  static loginWithAuthToken(authToken: string): Promise<CometChat.User> {\n    return new Promise((resolve, reject) => {\n      if (!CometChatUIKit.checkAuthSettings()) return reject('uiKitSettings not available');\n      CometChat.login(authToken)\n        .then((user: CometChat.User) => {\n          CometChatUIKitLoginListener.setLoggedInUser(user); CometChatUIKit._loggedInUser.next(user);\n          this.initiateAfterLogin(); return resolve(user);\n        })\n        .catch((error: CometChat.CometChatException) => reject(error));\n    });\n  }\n  loginWithAuthToken(authToken: string): Promise<CometChat.User> { return CometChatUIKit.loginWithAuthToken(authToken); }\n\n  static getLoggedinUser(): Promise<CometChat.User | null> {\n    return new Promise((resolve, reject) => {\n      if (!CometChatUIKit.checkAuthSettings()) return reject('uiKitSettings not available');\n      CometChat.getLoggedinUser()\n        .then((user: CometChat.User | null) => {\n          if (user) { CometChatUIKitLoginListener.setLoggedInUser(user); CometChatUIKit._loggedInUser.next(user); }\n          return resolve(user);\n        })\n        .catch((error: CometChat.CometChatException) => reject(error));\n    });\n  }\n  getLoggedinUser(): Promise<CometChat.User | null> { return CometChatUIKit.getLoggedinUser(); }\n\n  static logout(): Promise<LogoutResult> {\n    return new Promise((resolve, reject) => {\n      if (!CometChatUIKit.checkAuthSettings()) {\n        return reject({ code: 'ERROR_UIKIT_NOT_INITIALISED', message: 'UIKItSettings not available' });\n      }\n      CometChat.logout()\n        .then((message: object) => {\n          ChatSdkEventInitializer.detachListeners();\n          CometChatUIKitLoginListener.removeLoggedInUser();\n          CometChatUIKit._loggedInUser.next(null);\n          return resolve({ message: (message as { message?: string })?.message || 'Logout successful' });\n        })\n        .catch((error: CometChat.CometChatException) => reject(error));\n    });\n  }\n  logout(): Promise<LogoutResult> { return CometChatUIKit.logout(); }\n\n  static checkAuthSettings(): boolean {\n    return CometChatUIKit.uiKitSettings != null && CometChatUIKit.uiKitSettings!.appId != null;\n  }\n\n  // ── User Management ───────────────────────────────────────────────────────\n\n  static createUser(user: CometChat.User): Promise<CometChat.User> {\n    if (!CometChatUIKit.checkAuthSettings()) return Promise.reject('uiKitSettings not available');\n    return createUser(user, CometChatUIKit.uiKitSettings!.authKey!);\n  }\n  createUser(user: CometChat.User): Promise<CometChat.User> { return CometChatUIKit.createUser(user); }\n\n  static updateUser(user: CometChat.User): Promise<CometChat.User> {\n    if (!CometChatUIKit.checkAuthSettings()) return Promise.reject('uiKitSettings not available');\n    return updateUser(user, CometChatUIKit.uiKitSettings!.authKey!);\n  }\n  updateUser(user: CometChat.User): Promise<CometChat.User> { return CometChatUIKit.updateUser(user); }\n\n  // ── Message Sending ───────────────────────────────────────────────────────\n\n  static sendTextMessage(message: CometChat.TextMessage): Promise<CometChat.BaseMessage> {\n    return sendTextMessage(message);\n  }\n  sendTextMessage(message: CometChat.TextMessage): Promise<CometChat.BaseMessage> { return CometChatUIKit.sendTextMessage(message); }\n\n  static sendMediaMessage(message: CometChat.MediaMessage): Promise<CometChat.BaseMessage> {\n    return sendMediaMessage(message);\n  }\n  sendMediaMessage(message: CometChat.MediaMessage): Promise<CometChat.BaseMessage> { return CometChatUIKit.sendMediaMessage(message); }\n\n  static sendCustomMessage(message: CometChat.CustomMessage): Promise<CometChat.BaseMessage> {\n    return sendCustomMessage(message);\n  }\n  sendCustomMessage(message: CometChat.CustomMessage): Promise<CometChat.BaseMessage> { return CometChatUIKit.sendCustomMessage(message); }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { CometChatLocalize } from './cometchat-localize';\n\n/**\n * Angular pipe for translating keys to localized strings.\n *\n * This pipe uses the CometChatLocalize service to translate keys\n * to the current language. It's marked as impure to update when\n * the language changes at runtime.\n *\n * @example\n * // In your template:\n * <button>{{ 'conversation_chat_title' | translate }}</button>\n * // Outputs: \"Chats\" (in English)\n *\n * @example\n * // With parameters (using string interpolation):\n * <span>{{ 'add_n_members' | translate:{ n: 5 } }}</span>\n * // Outputs: \"Add 5 Members\"\n */\n@Pipe({\n  name: 'translate',\n  standalone: true,\n  pure: false, // Impure to update when language changes\n})\nexport class TranslatePipe implements PipeTransform {\n  /**\n   * Transforms a translation key to its localized string value.\n   *\n   * @param key - The translation key to look up\n   * @param params - Optional params object for string interpolation\n   * @returns The translated string with parameters replaced\n   */\n  transform(\n    key: string,\n    params?: Record<string, string | number>\n  ): string {\n    if (!key) {\n      return '';\n    }\n\n    let translated = CometChatLocalize.getLocalizedString(key);\n\n    // If no translation found, return the key\n    if (!translated) {\n      return key;\n    }\n\n    // Replace parameters if provided\n    if (params) {\n      Object.keys(params).forEach(paramKey => {\n        const regex = new RegExp(`\\\\{${paramKey}\\\\}`, 'g');\n        translated = translated.replace(regex, String(params![paramKey]));\n      });\n    }\n\n    return translated;\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { CometChatLocalize } from './cometchat-localize';\nimport { CalendarObject } from './localization.interfaces';\n\n/**\n * Default calendar configuration for date formatting.\n */\nconst DEFAULT_CALENDAR: CalendarObject = {\n  today: 'h:mm A',\n  yesterday: '[Yesterday]',\n  lastWeek: 'dddd',\n  otherDays: 'DD/MM/YYYY',\n  relativeTime: {\n    minute: '%d minute ago',\n    minutes: '%d minutes ago',\n    hour: '%d hour ago',\n    hours: '%d hours ago',\n  },\n};\n\n/**\n * Angular pipe for formatting dates with localization and relative time support.\n *\n * This pipe extends Angular's built-in DatePipe functionality by adding:\n * - Relative time formatting (\"5 minutes ago\", \"Yesterday\")\n * - Localized day and month names\n * - Configurable calendar patterns\n *\n * @example\n * // Basic usage with Unix timestamp (seconds):\n * <span>{{ message.sentAt | calendarDate }}</span>\n * // Outputs: \"5 minutes ago\" or \"Yesterday\" or \"Monday\" or \"15/01/2024\"\n *\n * @example\n * // With custom calendar configuration:\n * <span>{{ timestamp | calendarDate:customCalendar }}</span>\n *\n * @example\n * // In component:\n * customCalendar: CalendarObject = {\n *   today: 'h:mm A',\n *   yesterday: '[Yesterday at] h:mm A',\n *   lastWeek: 'dddd [at] h:mm A',\n *   otherDays: 'MMMM D, YYYY'\n * };\n */\n@Pipe({\n  name: 'calendarDate',\n  standalone: true,\n  pure: false, // Impure to update when language changes\n})\nexport class CalendarDatePipe implements PipeTransform {\n  /**\n   * Transforms a timestamp to a formatted date string.\n   *\n   * @param value - Unix timestamp in seconds, milliseconds, Date object, or date string\n   * @param calendarObject - Optional custom calendar configuration\n   * @returns Formatted date string\n   */\n  transform(\n    value: number | Date | string | null | undefined,\n    calendarObject?: CalendarObject\n  ): string {\n    if (value === null || value === undefined) {\n      return '';\n    }\n\n    // Convert to Unix timestamp in seconds\n    let timestamp: number;\n\n    if (typeof value === 'number') {\n      // Check if it's milliseconds (13 digits) or seconds (10 digits)\n      timestamp = value > 9999999999 ? Math.floor(value / 1000) : value;\n    } else if (value instanceof Date) {\n      timestamp = Math.floor(value.getTime() / 1000);\n    } else if (typeof value === 'string') {\n      const parsed = Date.parse(value);\n      if (isNaN(parsed)) {\n        return '';\n      }\n      timestamp = Math.floor(parsed / 1000);\n    } else {\n      return '';\n    }\n\n    // Use provided calendar object or fall back to stored/default\n    const calendar = calendarObject || CometChatLocalize.getCalendarObject() || DEFAULT_CALENDAR;\n\n    return CometChatLocalize.formatDate(timestamp, calendar);\n  }\n}\n\n/**\n * Simplified calendar date pipe for conversation list timestamps.\n *\n * Uses a compact format suitable for conversation list items.\n */\n@Pipe({\n  name: 'conversationDate',\n  standalone: true,\n  pure: false,\n})\nexport class ConversationDatePipe implements PipeTransform {\n  private calendarDatePipe = new CalendarDatePipe();\n\n  private conversationCalendar: CalendarObject = {\n    today: 'h:mm A',\n    yesterday: '[Yesterday]',\n    lastWeek: 'ddd',\n    otherDays: 'DD/MM/YY',\n  };\n\n  transform(value: number | Date | string | null | undefined): string {\n    return this.calendarDatePipe.transform(value, this.conversationCalendar);\n  }\n}\n\n/**\n * Calendar date pipe for message timestamps.\n *\n * Uses a format suitable for message bubbles with time display.\n */\n@Pipe({\n  name: 'messageDate',\n  standalone: true,\n  pure: false,\n})\nexport class MessageDatePipe implements PipeTransform {\n  private calendarDatePipe = new CalendarDatePipe();\n\n  private messageCalendar: CalendarObject = {\n    today: 'h:mm A',\n    yesterday: '[Yesterday] h:mm A',\n    lastWeek: 'dddd h:mm A',\n    otherDays: 'MMM D, YYYY h:mm A',\n  };\n\n  transform(value: number | Date | string | null | undefined): string {\n    return this.calendarDatePipe.transform(value, this.messageCalendar);\n  }\n}\n","// Main localization class\nexport { CometChatLocalize, getLocalizedString } from './cometchat-localize';\n\n// Interfaces (type-only exports for isolatedModules compatibility)\nexport type {\n  LocalizationSettings,\n  CalendarObject,\n  RelativeTimeConfig,\n} from './localization.interfaces';\n\n// Angular pipes\nexport { TranslatePipe } from './translate.pipe';\nexport { CalendarDatePipe, ConversationDatePipe, MessageDatePipe } from './calendar-date.pipe';\n","/**\n * CometChatActions is a pre-defined structure for creating actions\n * that the user can perform on a message, with properties to customize\n * the appearance and behavior of the action.\n * It is used in CometChatActionsIcon and CometChatActionsView components.\n */\nexport class CometChatActions {\n  /**\n   * Unique identifier for the message action.\n   * @type {string}\n   */\n  id: string;\n\n  /**\n   * Heading text for the message action.\n   * @type {string}\n   */\n  title: string;\n\n  /**\n   * Asset URL for the icon to symbolize a message action.\n   * @type {string | undefined}\n   */\n  iconURL?: string;\n\n  /**\n   * Creates an instance of CometChatActions.\n   *\n   * @param {Object} options - Options to initialize the action.\n   * @param {string} options.id - Unique identifier for the message action.\n   * @param {string} options.title - Heading text for the message action.\n   * @param {string} [options.iconURL] - Asset URL for the icon to symbolize a message action.\n   */\n  constructor(options: { id: string; title: string; iconURL?: string }) {\n    this.id = options.id;\n    this.title = options.title;\n    this.iconURL = options.iconURL;\n  }\n}\n","import { CometChatActions } from './CometChatActions';\n\n/**\n * CometChatActionsIcon is a pre-defined structure for creating actions\n * that the user can perform on a message with an icon representation.\n * It is used in CometChatContextMenu, CometChatMessageBubble, CometChatMessageList components.\n */\nexport class CometChatActionsIcon extends CometChatActions {\n  /**\n   * Function invoked when the user clicks on the message action.\n   * @type {(id: number) => void}\n   */\n  onClick: (id: number) => void;\n\n  /**\n   * Creates an instance of CometChatActionsIcon.\n   */\n  constructor(options: {\n    /**\n     * Unique identifier for the message action.\n     * @type {string}\n     */\n    id: string;\n\n    /**\n     * Heading text for the message action.\n     * @type {string}\n     */\n    title: string;\n\n    /**\n     * Asset URL for the icon to symbolize a message action.\n     * @type {string}\n     */\n    iconURL: string;\n\n    /**\n     * Function invoked when the user clicks on the message action.\n     * This function should handle the action related to the provided message id.\n     * @type {(id: number) => void}\n     */\n    onClick: (id: number) => void;\n  }) {\n    super(options);\n    this.onClick = options.onClick;\n  }\n}\n","import { TemplateRef } from '@angular/core';\nimport { CometChatActions } from './CometChatActions';\n\n/**\n * CometChatActionsView is a pre-defined structure for creating actions\n * that the user can perform on a message with a customized UI view representation.\n * It is used in AI module, CometChatMessageBubble, CometChatMessageComposer, CometChatMessageList components.\n */\nexport class CometChatActionsView extends CometChatActions {\n  /**\n   * User-defined template to customize the action view for each option in the template.\n   * In Angular, we use TemplateRef instead of JSX.Element.\n   * @type {TemplateRef<unknown> | ((callbacks: Record<string, unknown>) => TemplateRef<unknown>) | undefined}\n   */\n  customView?: TemplateRef<unknown> | ((callbacks: Record<string, unknown>) => TemplateRef<unknown>);\n\n  /**\n   * Creates an instance of CometChatActionsView.\n   */\n  constructor(options: {\n    /**\n     * Unique identifier for the message action.\n     * @type {string}\n     */\n    id: string;\n\n    /**\n     * Heading text for the message action.\n     * @type {string}\n     */\n    title: string;\n\n    /**\n     * Asset URL for the icon to symbolize a message action. This is optional and can be omitted.\n     * @type {string}\n     */\n    iconURL?: string;\n\n    /**\n     * User-defined template to customize the action view. This is optional and can be omitted.\n     * @type {TemplateRef<unknown> | ((callbacks: Record<string, unknown>) => TemplateRef<unknown>)}\n     */\n    customView?: TemplateRef<unknown> | ((callbacks: Record<string, unknown>) => TemplateRef<unknown>);\n  }) {\n    super(options);\n    this.customView = options.customView;\n  }\n}\n","/**\n * CometChatMessageComposerAction is a pre-defined structure for creating an attachment option\n * in the CometChatMessageComposer component that the user can perform in addition to composing a message.\n * It is used in AI module, CometChatMessageComposer component and Poll extension.\n */\nexport class CometChatMessageComposerAction {\n  /**\n   * Unique identifier for the attachment option.\n   * @type {string}\n   */\n  id = '';\n\n  /**\n   * Asset URL for the icon to symbolize an attachment option.\n   * @type {string}\n   */\n  iconURL = '';\n\n  /**\n   * Function invoked when the user clicks on the attachment option.\n   * @type {(() => void) | null}\n   */\n  onClick: (() => void) | null = null;\n\n  /**\n   * Heading text for the attachment option.\n   * @type {string}\n   */\n  title?: string = '';\n\n  /**\n   * Creates an instance of CometChatMessageComposerAction.\n   *\n   * @param {Partial<CometChatMessageComposerAction>} props - Partial properties to initialize the action item.\n   */\n  constructor(props: Partial<CometChatMessageComposerAction>) {\n    Object.assign(this, props);\n  }\n}\n","/**\n * Defines an option for message actions like edit or delete.\n * Allows customization of text, icon, and click behavior.\n * It is used in CometChatConversations, CometChatGroupMembers, CometChatGroups, CometChatUsers components.\n */\nexport class CometChatOption {\n  /** Unique identifier for the option. */\n  public id?: string = '';\n\n  /** Text label for the option. */\n  public title?: string = '';\n\n  /** URL of the icon representing the option. */\n  public iconURL?: string = '';\n\n  /** Function to be called when the option is clicked. */\n  public onClick?: () => void;\n\n  /**\n   * Creates a new CometChatOption instance.\n   * @param {Partial<CometChatOption>} props - Properties to initialize the option.\n   */\n  constructor(props: Partial<CometChatOption>) {\n    Object.assign(this, props);\n  }\n}\n","/**\n * Model class that maps tool function names to handler functions for the AI Assistant.\n * This is a plain model class — NOT an Angular service.\n */\nexport class CometChatAIAssistantTools {\n  [key: string]: unknown;\n\n  private readonly actions: Record<string, (...args: unknown[]) => unknown>;\n\n  constructor(actions: Record<string, (...args: unknown[]) => unknown>) {\n    this.actions = Object.assign(Object.create(null), actions);\n    // Expose each action as a direct property for convenience\n    for (const [name, handler] of Object.entries(actions)) {\n      if (!(name in this)) {\n        (this as any)[name] = handler;\n      }\n    }\n  }\n\n  /**\n   * Returns the handler function for the given tool name, or undefined if not registered.\n   */\n  getAction(name: string): ((...args: unknown[]) => unknown) | undefined {\n    return this.actions[name];\n  }\n\n  /**\n   * Returns a shallow copy of the internal actions map.\n   * Mutations to the returned object do not affect this instance.\n   */\n  getActions(): Record<string, (...args: unknown[]) => unknown> {\n    // Use Object.create(null) to avoid __proto__ prototype pollution issues\n    const copy = Object.create(null) as Record<string, (...args: unknown[]) => unknown>;\n    for (const [key, val] of Object.entries(this.actions)) {\n      copy[key] = val;\n    }\n    return copy;\n  }\n}\n","/**\n * Public API for CometChat UIKit modals/interfaces\n */\n\n// Base action class\nexport { CometChatActions } from './CometChatActions';\n\n// Action interfaces\nexport { CometChatActionsIcon } from './CometChatActionsIcon';\nexport { CometChatActionsView } from './CometChatActionsView';\nexport { CometChatMessageComposerAction } from './CometChatMessageComposerAction';\nexport { CometChatOption } from './CometChatOption';\n\n\n// Emoji interfaces\nexport type { CometChatEmoji, CometChatEmojiCategory } from './CometChatEmoji';\n\n// UIKit result interfaces\nexport type { InitResult, LogoutResult } from './CometChatUIKitInterfaces';\n\n// Media attachment interfaces\nexport type { MediaAttachment, MediaLayoutType } from './MediaAttachment';\n\n// Audio attachment interfaces\nexport type { AudioAttachment, AudioState } from './AudioAttachment';\n\n// Selection state interface for list components\nexport type { SelectionState } from './SelectionState';\n\n\n// AI Assistant Tools model class\nexport { CometChatAIAssistantTools } from './CometChatAIAssistantTools';\n\n// Note: CalendarObject is exported from CometChatLocalize (localization.interfaces.ts)\n","/**\n * Public API for CometChat UIKit interfaces\n *\n * This module exports all shared interfaces used across the UIKit components.\n */\n\n// Conversation slot interfaces for granular customization\nexport type { ConversationSlotContext, ConversationSlots } from './conversation-slots.interface';\n\n// Message list interfaces for MessageListService configuration and callbacks\n// Note: ErrorCallback is exported from services/message-composer.service.ts to avoid duplication\nexport type {\n  MessageListConfig,\n  FetchResult,\n  MessageUpdatePayload,\n} from './message-list.interfaces';\n","import { Injectable } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { signal } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { filter, skip } from 'rxjs/operators';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * ConnectionStateService\n *\n * A single, root-level service that owns exactly ONE CometChat ConnectionListener\n * for the entire application. All components and services that need to react to\n * WebSocket connect/disconnect events should inject this service instead of\n * registering their own listeners.\n *\n * Why one listener?\n * - The SDK fires the same event to every registered listener simultaneously.\n *   Having N listeners (one per list component) causes N parallel refetches on\n *   reconnect, which is wasteful and can cause race conditions.\n * - A single shared signal/observable lets any part of the UI (e.g. a\n *   \"reconnecting…\" banner) read connection state without extra wiring.\n *\n * Usage in services:\n * ```typescript\n * private connectionState = inject(ConnectionStateService);\n *\n * constructor() {\n *   this.connectionState.reconnected$\n *     .pipe(takeUntilDestroyed(this.destroyRef))\n *     .subscribe(() => this.refresh());\n * }\n * ```\n *\n * Usage in templates:\n * ```html\n * @if (connectionState.connected() === false) {\n *   <div class=\"reconnecting-banner\">Reconnecting…</div>\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ConnectionStateService {\n  // null  = unknown (before first SDK event)\n  // true  = connected\n  // false = disconnected\n  private readonly _connected = signal<boolean | null>(null);\n\n  /** Current connection state as a read-only signal. */\n  readonly connected = this._connected.asReadonly();\n\n  /**\n   * Observable that emits `true` every time the WebSocket reconnects.\n   * Skips the initial `null → true` transition that happens at app startup\n   * (that is not a reconnect, it is the first connect).\n   */\n  readonly reconnected$: Observable<boolean>;\n\n  private readonly listenerId = `global_conn_${Date.now()}`;\n\n  constructor() {\n    // Skip the very first emission (null → true at startup) so subscribers\n    // only fire on genuine reconnects after a disconnect.\n    this.reconnected$ = toObservable(this._connected).pipe(\n      skip(1),\n      filter((v): v is true => v === true)\n    );\n\n    try {\n      CometChat.addConnectionListener(\n        this.listenerId,\n        new CometChat.ConnectionListener({\n          onConnected: () => {\n            CometChatLogger.info('ConnectionStateService', 'WebSocket connected');\n            this._connected.set(true);\n          },\n          onDisconnected: () => {\n            CometChatLogger.info('ConnectionStateService', 'WebSocket disconnected');\n            this._connected.set(false);\n          },\n        })\n      );\n    } catch (error) {\n      CometChatLogger.error('ConnectionStateService', 'Error attaching connection listener:', error);\n    }\n  }\n}\n","import { DestroyRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { subscribeWithOptionalCleanup } from './event-utils';\n\n/**\n * Conversation event subjects for handling actions related to conversations (e.g., conversation deletion)\n */\nexport class CometChatConversationEvents {\n  static ccConversationDeleted = new Subject<CometChat.Conversation>();\n\n  /**\n   * Emitted when a conversation is updated (e.g., after marking a message as unread).\n   * Subscribers (e.g., CometChatConversations) should refresh the conversation's unread badge.\n   */\n  static ccUpdateConversation = new Subject<CometChat.Conversation>();\n\n  // ── Deprecated generic method ──\n\n  /**\n   * Publishes a conversation event.\n   * @param {Subject<CometChat.Conversation>} event - The event to publish.\n   * @param {CometChat.Conversation} conversation - The conversation associated with the event.\n   * @deprecated Use publishConversationDeleted() instead.\n   */\n  static publishEvent(\n    event: Subject<CometChat.Conversation>,\n    conversation: CometChat.Conversation\n  ) {\n    event.next(conversation);\n  }\n\n  // ── Typed Publish Methods ──\n\n  static publishConversationDeleted(conversation: CometChat.Conversation): void {\n    CometChatConversationEvents.ccConversationDeleted.next(conversation);\n  }\n\n  // ── Typed Subscribe Helpers ──\n\n  static onConversationDeleted(\n    cb: (conversation: CometChat.Conversation) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(\n      CometChatConversationEvents.ccConversationDeleted,\n      cb,\n      destroyRef\n    );\n  }\n}\n","/**\n * SDK listener setup helpers for ConversationsService.\n *\n * Registers and removes CometChat SDK listeners (message, user, group, call)\n * and keeps that boilerplate out of the main service file.\n */\n\nimport { NgZone } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n// ─── Message Listener ─────────────────────────────────────────────────────────\n\nexport interface MessageListenerCallbacks {\n  onTextMessageReceived: (m: CometChat.TextMessage) => void;\n  onMediaMessageReceived: (m: CometChat.MediaMessage) => void;\n  onCustomMessageReceived: (m: CometChat.CustomMessage) => void;\n  onInteractiveMessageReceived: (m: CometChat.InteractiveMessage) => void;\n  onCardMessageReceived: (m: CometChat.CardMessage) => void;\n  onAIAssistantMessageReceived: (m: CometChat.BaseMessage) => void;\n  onMessageEdited: (m: CometChat.BaseMessage) => void;\n  onMessageDeleted: (m: CometChat.BaseMessage) => void;\n  onMessagesDelivered: (r: CometChat.MessageReceipt) => void;\n  onMessagesRead: (r: CometChat.MessageReceipt) => void;\n  onMessagesDeliveredToAll: (r: CometChat.MessageReceipt) => void;\n  onMessagesReadByAll: (r: CometChat.MessageReceipt) => void;\n  onTypingStarted: (t: CometChat.TypingIndicator) => void;\n  onTypingEnded: (t: CometChat.TypingIndicator) => void;\n}\n\nexport function setupMessageListener(\n  listenerId: string,\n  callbacks: MessageListenerCallbacks,\n  ngZone: NgZone\n): void {\n  try {\n    CometChat.addMessageListener(\n      listenerId,\n      new CometChat.MessageListener({\n        onTextMessageReceived: (m: CometChat.TextMessage) => ngZone.run(() => callbacks.onTextMessageReceived(m)),\n        onMediaMessageReceived: (m: CometChat.MediaMessage) => ngZone.run(() => callbacks.onMediaMessageReceived(m)),\n        onCustomMessageReceived: (m: CometChat.CustomMessage) => ngZone.run(() => callbacks.onCustomMessageReceived(m)),\n        onInteractiveMessageReceived: (m: CometChat.InteractiveMessage) => ngZone.run(() => callbacks.onInteractiveMessageReceived(m)),\n        // Developer card (category \"card\"); keep the conversation list's\n        // last message in sync, same as text/media/custom/interactive.\n        onCardMessageReceived: (m: CometChat.CardMessage) => ngZone.run(() => callbacks.onCardMessageReceived(m)),\n        onAIAssistantMessageReceived: (m: CometChat.BaseMessage) => ngZone.run(() => callbacks.onAIAssistantMessageReceived(m)),\n        onMessageEdited: (m: CometChat.BaseMessage) => ngZone.run(() => callbacks.onMessageEdited(m)),\n        onMessageDeleted: (m: CometChat.BaseMessage) => ngZone.run(() => callbacks.onMessageDeleted(m)),\n        onMessagesDelivered: (r: CometChat.MessageReceipt) => ngZone.run(() => callbacks.onMessagesDelivered(r)),\n        onMessagesRead: (r: CometChat.MessageReceipt) => ngZone.run(() => callbacks.onMessagesRead(r)),\n        onMessagesDeliveredToAll: (r: CometChat.MessageReceipt) => ngZone.run(() => callbacks.onMessagesDeliveredToAll(r)),\n        onMessagesReadByAll: (r: CometChat.MessageReceipt) => ngZone.run(() => callbacks.onMessagesReadByAll(r)),\n        onTypingStarted: (t: CometChat.TypingIndicator) => ngZone.run(() => callbacks.onTypingStarted(t)),\n        onTypingEnded: (t: CometChat.TypingIndicator) => ngZone.run(() => callbacks.onTypingEnded(t)),\n      })\n    );\n  } catch (error) {\n    CometChatLogger.error('conversations.listeners', 'Error setting up message listener:', error);\n  }\n}\n\nexport function removeMessageListener(listenerId: string): void {\n  try { CometChat.removeMessageListener(listenerId); }\n  catch (e) { CometChatLogger.error('conversations.listeners', 'Error removing message listener:', e); }\n}\n\n// ─── User Listener ────────────────────────────────────────────────────────────\n\nexport function setupUserListener(\n  listenerId: string,\n  onStatusChange: (user: CometChat.User) => void,\n  ngZone: NgZone\n): void {\n  try {\n    CometChat.addUserListener(\n      listenerId,\n      new CometChat.UserListener({\n        onUserOnline: (u: CometChat.User) => ngZone.run(() => onStatusChange(u)),\n        onUserOffline: (u: CometChat.User) => ngZone.run(() => onStatusChange(u)),\n      })\n    );\n  } catch (error) {\n    CometChatLogger.error('conversations.listeners', 'Error setting up user listener:', error);\n  }\n}\n\nexport function removeUserListener(listenerId: string): void {\n  try { CometChat.removeUserListener(listenerId); }\n  catch (e) { CometChatLogger.error('conversations.listeners', 'Error removing user listener:', e); }\n}\n\n// ─── Group Listener ───────────────────────────────────────────────────────────\n\nexport function setupGroupListener(\n  listenerId: string,\n  onGroupAction: (message: CometChat.Action) => void,\n  ngZone: NgZone\n): void {\n  try {\n    CometChat.addGroupListener(\n      listenerId,\n      new CometChat.GroupListener({\n        onGroupMemberJoined: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onGroupMemberLeft: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onGroupMemberKicked: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onGroupMemberBanned: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onGroupMemberUnbanned: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onGroupMemberScopeChanged: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n        onMemberAddedToGroup: (m: CometChat.Action) => ngZone.run(() => onGroupAction(m)),\n      })\n    );\n  } catch (error) {\n    CometChatLogger.error('conversations.listeners', 'Error setting up group listener:', error);\n  }\n}\n\nexport function removeGroupListener(listenerId: string): void {\n  try { CometChat.removeGroupListener(listenerId); }\n  catch (e) { CometChatLogger.error('conversations.listeners', 'Error removing group listener:', e); }\n}\n\n// ─── Call Listener ────────────────────────────────────────────────────────────\n\nexport function setupCallListener(\n  listenerId: string,\n  onCallEvent: (call: CometChat.Call) => void,\n  ngZone: NgZone\n): void {\n  try {\n    CometChat.addCallListener(\n      listenerId,\n      new CometChat.CallListener({\n        onIncomingCallReceived: (c: CometChat.Call) => ngZone.run(() => onCallEvent(c)),\n        onIncomingCallCancelled: (c: CometChat.Call) => ngZone.run(() => onCallEvent(c)),\n        onOutgoingCallAccepted: (c: CometChat.Call) => ngZone.run(() => onCallEvent(c)),\n        onOutgoingCallRejected: (c: CometChat.Call) => ngZone.run(() => onCallEvent(c)),\n        onCallEndedMessageReceived: (c: CometChat.Call) => ngZone.run(() => onCallEvent(c)),\n      })\n    );\n  } catch (error) {\n    CometChatLogger.error('conversations.listeners', 'Error setting up call listener:', error);\n  }\n}\n\nexport function removeCallListener(listenerId: string): void {\n  try { CometChat.removeCallListener(listenerId); }\n  catch (e) { CometChatLogger.error('conversations.listeners', 'Error removing call listener:', e); }\n}\n","/**\n * Utility helpers for ConversationsService.\n * Contains error handling, retry logic, conversation update settings checks,\n * and receipt handling helpers.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatUIKit } from '../cometchat-uikit';\nimport { CometChatUIKitConstants } from '../constants';\n\n// ─── Error Helpers ────────────────────────────────────────────────────────────\n\nconst RETRY_DELAYS = [1000, 2000, 4000] as const;\nconst MAX_RETRY_ATTEMPTS = 3;\n\nexport function isRecoverableError(error: unknown): boolean {\n  if (!error) return false;\n  const err = error as Record<string, unknown>;\n  const msg = (typeof err['message'] === 'string' ? err['message'] : '').toLowerCase();\n  const code = (typeof err['code'] === 'string' ? err['code'] : '') as string;\n  const networkKeywords = ['network', 'timeout', 'connection', 'fetch', 'econnrefused', 'enotfound', 'etimedout', 'socket', 'offline'] as const;\n  const recoverableCodes = ['ERR_NETWORK', 'ERR_TIMEOUT', 'ERR_CONNECTION_REFUSED', 'ERR_CONNECTION_RESET', 'NETWORK_ERROR', 'TIMEOUT_ERROR'] as const;\n  return networkKeywords.some(k => msg.includes(k)) || recoverableCodes.some(c => code === c || msg.includes(c.toLowerCase()));\n}\n\nexport function getUserFriendlyErrorMessage(error: unknown, context: string): string {\n  if (!error) return 'An unknown error occurred';\n  const msg = ((error as Record<string, unknown>)['message'] as string || '').toLowerCase();\n  if (msg.includes('network') || msg.includes('offline')) return 'Unable to connect. Please check your internet connection and try again.';\n  if (msg.includes('timeout')) return 'The request took too long. Please try again.';\n  if (msg.includes('auth') || msg.includes('unauthorized')) return 'Authentication failed. Please log in again.';\n  if (msg.includes('permission') || msg.includes('forbidden')) return \"You don't have permission to perform this action.\";\n  if (msg.includes('not found') || msg.includes('404')) return 'The requested resource was not found.';\n  if (msg.includes('server') || msg.includes('500')) return 'Server error. Please try again later.';\n  switch (context) {\n    case 'fetchConversations': return 'Failed to load conversations. Please try again.';\n    case 'deleteConversation': return 'Failed to delete conversation. Please try again.';\n    case 'fetchNextConversations': return 'Failed to load more conversations. Please try again.';\n    default: return ((error as Record<string, unknown>)['message'] as string) || 'An error occurred. Please try again.';\n  }\n}\n\nexport function createEnhancedError(error: unknown, context: string): Error {\n  const msg = getUserFriendlyErrorMessage(error, context);\n  const enhanced = new Error(msg);\n  (enhanced as Error & { originalError: unknown }).originalError = error;\n  (enhanced as Error & { context: string }).context = context;\n  return enhanced;\n}\n\nexport async function handleErrorWithRetry(\n  error: unknown,\n  context: string,\n  retryAttempts: Map<string, number>,\n  setError: (e: Error) => void,\n  retryFn?: () => Promise<void>\n): Promise<void> {\n  CometChatLogger.error('ConversationsService', `Error in ${context}:`, error);\n  const currentAttempt = retryAttempts.get(context) || 0;\n\n  if (isRecoverableError(error) && currentAttempt < MAX_RETRY_ATTEMPTS && retryFn) {\n    retryAttempts.set(context, currentAttempt + 1);\n    const delay = RETRY_DELAYS[currentAttempt] ?? RETRY_DELAYS[RETRY_DELAYS.length - 1];\n    await new Promise(resolve => setTimeout(resolve, delay));\n    try {\n      await retryFn();\n      retryAttempts.delete(context);\n      return;\n    } catch (retryError) {\n      return handleErrorWithRetry(retryError, context, retryAttempts, setError, retryFn);\n    }\n  }\n\n  retryAttempts.delete(context);\n  setError(createEnhancedError(error, context));\n  throw createEnhancedError(error, context);\n}\n\n// ─── Conversation ID Helpers ──────────────────────────────────────────────────\n\nexport function getConversationEntityId(conversation: CometChat.Conversation): string {\n  const convWith = conversation.getConversationWith();\n  return convWith instanceof CometChat.User ? convWith.getUid() : (convWith as CometChat.Group).getGuid();\n}\n\nexport function findConversationIndex(conversations: CometChat.Conversation[], entityId: string): number {\n  return conversations.findIndex(conv => getConversationEntityId(conv) === entityId);\n}\n\n/**\n * Removes duplicate conversations, keeping the first occurrence of each entity id.\n *\n * Guards against the race between the initial ConversationsRequest fetch and the\n * realtime message/group listeners: a newly-created conversation can be inserted\n * by `CometChatHelper.getConversationFromMessage()` (async) and also arrive in the\n * fetched page, which would otherwise list it twice. Callers order the list so the\n * entry they want to keep (e.g. the most-recent realtime copy at the top) comes\n * first; the later duplicate is dropped — \"replace if it exists, never add twice\".\n */\nexport function dedupeConversations(conversations: CometChat.Conversation[]): CometChat.Conversation[] {\n  const seen = new Set<string>();\n  const result: CometChat.Conversation[] = [];\n  for (const conv of conversations) {\n    const id = getConversationEntityId(conv);\n    if (seen.has(id)) continue;\n    seen.add(id);\n    result.push(conv);\n  }\n  return result;\n}\n\n// ─── Conversation Update Settings ────────────────────────────────────────────\n\nexport function isAMessage(message: unknown): message is CometChat.BaseMessage {\n  return (\n    message instanceof CometChat.TextMessage ||\n    message instanceof CometChat.MediaMessage ||\n    message instanceof CometChat.CustomMessage ||\n    message instanceof CometChat.InteractiveMessage ||\n    // Developer card; without this the conversation list ignores\n    // cards as a \"last message\" and never updates/re-sorts on a new card.\n    message instanceof CometChat.CardMessage ||\n    message instanceof CometChat.Action ||\n    message instanceof CometChat.Call ||\n    message instanceof CometChat.AIAssistantMessage\n  );\n}\n\nexport function shouldIncrementForCustomMessage(message: CometChat.CustomMessage): boolean {\n  try {\n    const metadata = message.getMetadata() as Record<string, unknown>;\n    return (\n      message.willUpdateConversation() ||\n      (metadata && metadata.hasOwnProperty('incrementUnreadCount') && !!metadata['incrementUnreadCount']) ||\n      (CometChatUIKit.conversationUpdateSettings?.shouldUpdateOnCustomMessages?.() ?? false)\n    );\n  } catch { return false; }\n}\n\nexport function shouldLastMessageAndUnreadCountBeUpdated(message: CometChat.BaseMessage): boolean {\n  try {\n    const settings = CometChatUIKit.conversationUpdateSettings;\n    const isCustom = message.getCategory() === CometChatUIKitConstants.MessageCategory.custom;\n\n    if (message.getParentMessageId() && !settings?.shouldUpdateOnMessageReplies?.()) return false;\n\n    if (isCustom) {\n      if (message.getParentMessageId() && settings?.shouldUpdateOnMessageReplies?.() && shouldIncrementForCustomMessage(message as CometChat.CustomMessage)) return true;\n      return shouldIncrementForCustomMessage(message as CometChat.CustomMessage);\n    }\n\n    if (message.getCategory() === CometChatUIKitConstants.MessageCategory.action) {\n      if (message.getType() === CometChatUIKitConstants.MessageTypes.groupMember) {\n        return settings?.shouldUpdateOnGroupActions?.() ?? true;\n      }\n      return true;\n    }\n\n    if (\n      message.getCategory() === CometChatUIKitConstants.MessageCategory.call &&\n      (message.getType() === CometChatUIKitConstants.MessageTypes.audio || message.getType() === CometChatUIKitConstants.MessageTypes.video)\n    ) {\n      return settings?.shouldUpdateOnCallActivities?.() ?? true;\n    }\n\n    return true;\n  } catch { return true; }\n}\n\n// ─── Receipt Handling ─────────────────────────────────────────────────────────\n\nexport function applyReceiptToConversations(\n  conversations: CometChat.Conversation[],\n  receipt: CometChat.MessageReceipt,\n  isGroupReceipt: boolean\n): { updated: boolean; conversations: CometChat.Conversation[] } {\n  const receiptMessageId = parseInt(receipt.getMessageId(), 10);\n  const readAt = receipt.getReadAt();\n  const deliveredAt = receipt.getDeliveredAt();\n  const sender = receipt.getSender();\n  const receiverId = receipt.getReceiver();\n\n  if (isNaN(receiptMessageId)) return { updated: false, conversations };\n\n  let updated = false;\n  for (let i = 0; i < conversations.length; i++) {\n    const conversation = conversations[i];\n    const isGroup = conversation.getConversationType() === CometChatUIKitConstants.MessageReceiverType.group;\n    if (isGroup !== isGroupReceipt) continue;\n\n    const convWith = conversation.getConversationWith();\n    const convId = convWith instanceof CometChat.User ? convWith.getUid() : (convWith as CometChat.Group).getGuid();\n\n    const matches = isGroup ? convId === receiverId : convId === sender?.getUid?.();\n    if (!matches) continue;\n\n    const lastMessage = conversation.getLastMessage();\n    if (!lastMessage) continue;\n\n    const lastMessageId = lastMessage.getId();\n    if (receiptMessageId >= lastMessageId || lastMessageId === 0) {\n      if (readAt) {\n        lastMessage.setReadAt(readAt);\n        if (!lastMessage.getDeliveredAt()) lastMessage.setDeliveredAt(readAt);\n      } else if (deliveredAt && !lastMessage.getReadAt()) {\n        lastMessage.setDeliveredAt(deliveredAt);\n      }\n      conversation.setLastMessage(lastMessage);\n      updated = true;\n    }\n    break;\n  }\n\n  return { updated, conversations };\n}\n\n// ─── Typing Indicator Key ─────────────────────────────────────────────────────\n\nexport function getTypingIndicatorKey(typingIndicator: CometChat.TypingIndicator): string {\n  const receiverType = typingIndicator.getReceiverType();\n  return receiverType === 'user'\n    ? typingIndicator.getSender().getUid()\n    : typingIndicator.getReceiverId();\n}\n","import { DestroyRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { subscribeWithOptionalCleanup } from './event-utils';\n\n/**\n * Call event subjects for handling various call-related actions (like outgoing calls, call acceptance, rejections, etc.)\n */\nexport class CometChatCallEvents {\n  static ccOutgoingCall: Subject<CometChat.Call> = new Subject<CometChat.Call>();\n  static ccCallAccepted: Subject<CometChat.Call> = new Subject<CometChat.Call>();\n  static ccCallRejected: Subject<CometChat.Call> = new Subject<CometChat.Call>();\n  static ccCallEnded: Subject<CometChat.Call> = new Subject<CometChat.Call>();\n\n  // ── Typed Publish Methods ──\n\n  static publishOutgoingCall(call: CometChat.Call): void {\n    CometChatCallEvents.ccOutgoingCall.next(call);\n  }\n\n  static publishCallAccepted(call: CometChat.Call): void {\n    CometChatCallEvents.ccCallAccepted.next(call);\n  }\n\n  static publishCallRejected(call: CometChat.Call): void {\n    CometChatCallEvents.ccCallRejected.next(call);\n  }\n\n  static publishCallEnded(call: CometChat.Call): void {\n    CometChatCallEvents.ccCallEnded.next(call);\n  }\n\n  // ── Typed Subscribe Helpers ──\n\n  static onOutgoingCall(cb: (call: CometChat.Call) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatCallEvents.ccOutgoingCall, cb, destroyRef);\n  }\n\n  static onCallAccepted(cb: (call: CometChat.Call) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatCallEvents.ccCallAccepted, cb, destroyRef);\n  }\n\n  static onCallRejected(cb: (call: CometChat.Call) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatCallEvents.ccCallRejected, cb, destroyRef);\n  }\n\n  static onCallEnded(cb: (call: CometChat.Call) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatCallEvents.ccCallEnded, cb, destroyRef);\n  }\n}\n","import { DestroyRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { subscribeWithOptionalCleanup } from './event-utils';\n\n/**\n * Group event subjects for handling various group-related actions (e.g., group creation, member actions, ownership changes, etc.)\n */\nexport class CometChatGroupEvents {\n  static ccGroupCreated: Subject<CometChat.Group> = new Subject<CometChat.Group>();\n  static ccGroupDeleted: Subject<CometChat.Group> = new Subject<CometChat.Group>();\n  static ccGroupMemberJoined: Subject<IGroupMemberJoined> = new Subject<IGroupMemberJoined>();\n  static ccGroupLeft: Subject<IGroupLeft> = new Subject<IGroupLeft>();\n  static ccGroupMemberAdded: Subject<IGroupMemberAdded> = new Subject<IGroupMemberAdded>();\n  static ccGroupMemberScopeChanged: Subject<IGroupMemberScopeChanged> =\n    new Subject<IGroupMemberScopeChanged>();\n  static ccGroupMemberKicked: Subject<IGroupMemberKickedBanned> =\n    new Subject<IGroupMemberKickedBanned>();\n  static ccGroupMemberBanned: Subject<IGroupMemberKickedBanned> =\n    new Subject<IGroupMemberKickedBanned>();\n  static ccGroupMemberUnbanned: Subject<IGroupMemberUnBanned> = new Subject<IGroupMemberUnBanned>();\n  static ccOwnershipChanged: Subject<IOwnershipChanged> = new Subject<IOwnershipChanged>();\n  // ── Deprecated generic method ──\n\n  /** @deprecated Use typed publish methods instead (e.g., publishGroupCreated). */\n  static publishEvent(event: Subject<CometChat.Group>, group: CometChat.Group) {\n    event.next(group);\n  }\n\n  // ── Typed Publish Methods ──\n\n  static publishGroupCreated(group: CometChat.Group): void {\n    CometChatGroupEvents.ccGroupCreated.next(group);\n  }\n\n  static publishGroupDeleted(group: CometChat.Group): void {\n    CometChatGroupEvents.ccGroupDeleted.next(group);\n  }\n\n  static publishGroupMemberJoined(data: IGroupMemberJoined): void {\n    CometChatGroupEvents.ccGroupMemberJoined.next(data);\n  }\n\n  static publishGroupLeft(data: IGroupLeft): void {\n    CometChatGroupEvents.ccGroupLeft.next(data);\n  }\n\n  static publishGroupMemberAdded(data: IGroupMemberAdded): void {\n    CometChatGroupEvents.ccGroupMemberAdded.next(data);\n  }\n\n  static publishGroupMemberScopeChanged(data: IGroupMemberScopeChanged): void {\n    CometChatGroupEvents.ccGroupMemberScopeChanged.next(data);\n  }\n\n  static publishGroupMemberKicked(data: IGroupMemberKickedBanned): void {\n    CometChatGroupEvents.ccGroupMemberKicked.next(data);\n  }\n\n  static publishGroupMemberBanned(data: IGroupMemberKickedBanned): void {\n    CometChatGroupEvents.ccGroupMemberBanned.next(data);\n  }\n\n  static publishGroupMemberUnbanned(data: IGroupMemberUnBanned): void {\n    CometChatGroupEvents.ccGroupMemberUnbanned.next(data);\n  }\n\n  static publishOwnershipChanged(data: IOwnershipChanged): void {\n    CometChatGroupEvents.ccOwnershipChanged.next(data);\n  }\n\n  // ── Typed Subscribe Helpers ──\n\n  static onGroupCreated(\n    cb: (group: CometChat.Group) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupCreated, cb, destroyRef);\n  }\n\n  static onGroupDeleted(\n    cb: (group: CometChat.Group) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupDeleted, cb, destroyRef);\n  }\n\n  static onGroupMemberJoined(\n    cb: (data: IGroupMemberJoined) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupMemberJoined, cb, destroyRef);\n  }\n\n  static onGroupLeft(cb: (data: IGroupLeft) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupLeft, cb, destroyRef);\n  }\n\n  static onGroupMemberAdded(\n    cb: (data: IGroupMemberAdded) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupMemberAdded, cb, destroyRef);\n  }\n\n  static onGroupMemberScopeChanged(\n    cb: (data: IGroupMemberScopeChanged) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(\n      CometChatGroupEvents.ccGroupMemberScopeChanged,\n      cb,\n      destroyRef\n    );\n  }\n\n  static onGroupMemberKicked(\n    cb: (data: IGroupMemberKickedBanned) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupMemberKicked, cb, destroyRef);\n  }\n\n  static onGroupMemberBanned(\n    cb: (data: IGroupMemberKickedBanned) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupMemberBanned, cb, destroyRef);\n  }\n\n  static onGroupMemberUnbanned(\n    cb: (data: IGroupMemberUnBanned) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccGroupMemberUnbanned, cb, destroyRef);\n  }\n\n  static onOwnershipChanged(\n    cb: (data: IOwnershipChanged) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatGroupEvents.ccOwnershipChanged, cb, destroyRef);\n  }\n}\n\n/**\n * Interfaces for various group-related events\n */\nexport interface IGroupMemberScopeChanged {\n  message: CometChat.Action;\n  updatedUser: CometChat.GroupMember;\n  scopeChangedTo: string;\n  scopeChangedFrom: string;\n  group: CometChat.Group;\n}\nexport interface IOwnershipChanged {\n  group: CometChat.Group;\n  newOwner: CometChat.GroupMember;\n}\n\nexport interface IGroupMemberKickedBanned {\n  message: CometChat.Action;\n  kickedFrom: CometChat.Group;\n  kickedUser: CometChat.User;\n  kickedBy: CometChat.User;\n}\nexport interface IGroupMemberUnBanned {\n  message?: CometChat.Action;\n  unbannedUser: CometChat.User;\n  unbannedBy: CometChat.User;\n  unbannedFrom: CometChat.Group;\n}\nexport interface IGroupMemberAdded {\n  messages: CometChat.Action[];\n  usersAdded: CometChat.User[];\n  userAddedIn: CometChat.Group;\n  userAddedBy: CometChat.User;\n}\nexport interface IGroupMemberJoined {\n  joinedUser: CometChat.User;\n  joinedGroup: CometChat.Group;\n}\n// group left\nexport interface IGroupLeft {\n  userLeft: CometChat.User;\n  leftGroup: CometChat.Group;\n  message: CometChat.Action;\n}\n","import { DestroyRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { subscribeWithOptionalCleanup } from './event-utils';\n\n/**\n * Class to handle user-related events such as blocking and unblocking users\n */\nexport class CometChatUserEvents {\n  static ccUserBlocked: Subject<CometChat.User> = new Subject<CometChat.User>();\n  static ccUserUnblocked: Subject<CometChat.User> = new Subject<CometChat.User>();\n\n  // ── Deprecated generic method ──\n\n  /** @deprecated Use typed publish methods instead (e.g., publishUserBlocked). */\n  static publishEvent(event: Subject<CometChat.User>, item: CometChat.User) {\n    event.next(item);\n  }\n\n  // ── Typed Publish Methods ──\n\n  static publishUserBlocked(user: CometChat.User): void {\n    CometChatUserEvents.ccUserBlocked.next(user);\n  }\n\n  static publishUserUnblocked(user: CometChat.User): void {\n    CometChatUserEvents.ccUserUnblocked.next(user);\n  }\n\n  // ── Typed Subscribe Helpers ──\n\n  static onUserBlocked(cb: (user: CometChat.User) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUserEvents.ccUserBlocked, cb, destroyRef);\n  }\n\n  static onUserUnblocked(\n    cb: (user: CometChat.User) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUserEvents.ccUserUnblocked, cb, destroyRef);\n  }\n}\n","/**\n * UI event subscription setup for ConversationsService.\n *\n * Subscribes to CometChatGroupEvents, CometChatUserEvents,\n * CometChatMessageEvents, and CometChatConversationEvents so the\n * conversations list stays in sync with actions taken by the logged-in user.\n */\n\nimport { Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMessageEvents, IMessages } from '../events/CometChatMessageEvents';\nimport { CometChatConversationEvents } from '../events/CometChatConversationEvents';\nimport { CometChatCallEvents } from '../events/CometChatCallEvents';\nimport {\n  CometChatGroupEvents,\n  IGroupMemberAdded,\n  IGroupMemberKickedBanned,\n  IGroupMemberScopeChanged,\n  IGroupLeft,\n} from '../events/CometChatGroupEvents';\nimport { CometChatUserEvents } from '../events/CometChatUserEvents';\nimport { MessageStatus } from '../Enums/Enums';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { getConversationEntityId } from './conversations.utils';\n\nexport interface UIEventHandlers {\n  refreshSingleConversation: (message: CometChat.BaseMessage) => void;\n  removeConversationSilently: (id: string) => void;\n  updateGroupOnConversation: (group: CometChat.Group) => void;\n  updateUserOnConversation: (user: CometChat.User) => void;\n  addConversationToTop: (conv: CometChat.Conversation) => void;\n  removeConversationFromList: (id: string) => void;\n  requestBuilder?: CometChat.ConversationsRequestBuilder;\n}\n\nexport function setupUIEventSubscriptions(handlers: UIEventHandlers): Subscription[] {\n  const subs: Subscription[] = [];\n\n  // ccGroupCreated: fetch conversation from SDK and add to list\n  subs.push(\n    CometChatGroupEvents.ccGroupCreated.subscribe((group: CometChat.Group) => {\n      CometChat.getConversation(group.getGuid(), CometChatUIKitConstants.MessageReceiverType.group)\n        .then((conv: CometChat.Conversation) => { if (conv) handlers.addConversationToTop(conv); })\n        .catch((e: CometChat.CometChatException) =>\n          CometChatLogger.error('conversations.ui-events', 'Error fetching conversation for created group:', e)\n        );\n    })\n  );\n\n  // ccGroupDeleted / ccGroupLeft: remove from list\n  subs.push(CometChatGroupEvents.ccGroupDeleted.subscribe((g: CometChat.Group) => handlers.removeConversationSilently(g.getGuid())));\n  subs.push(CometChatGroupEvents.ccGroupLeft.subscribe((item: IGroupLeft) => handlers.removeConversationSilently(item.leftGroup.getGuid())));\n\n  // ccGroupMemberScopeChanged: update last message\n  subs.push(CometChatGroupEvents.ccGroupMemberScopeChanged.subscribe((item: IGroupMemberScopeChanged) =>\n    handlers.refreshSingleConversation(item.message)\n  ));\n\n  // ccGroupMemberAdded: update group + last message\n  subs.push(CometChatGroupEvents.ccGroupMemberAdded.subscribe((item: IGroupMemberAdded) => {\n    const message = item.messages[item.messages.length - 1];\n    if (message) { handlers.updateGroupOnConversation(item.userAddedIn); handlers.refreshSingleConversation(message); }\n  }));\n\n  // ccGroupMemberKicked / ccGroupMemberBanned\n  subs.push(CometChatGroupEvents.ccGroupMemberKicked.subscribe((item: IGroupMemberKickedBanned) => {\n    handlers.updateGroupOnConversation(item.kickedFrom); handlers.refreshSingleConversation(item.message);\n  }));\n  subs.push(CometChatGroupEvents.ccGroupMemberBanned.subscribe((item: IGroupMemberKickedBanned) => {\n    handlers.updateGroupOnConversation(item.kickedFrom); handlers.refreshSingleConversation(item.message);\n  }));\n\n  // ccUserBlocked: remove or update depending on request builder setting\n  subs.push(CometChatUserEvents.ccUserBlocked.subscribe((user: CometChat.User) => {\n    const req = handlers.requestBuilder;\n    if (req && req.build()?.isIncludeBlockedUsers?.()) { handlers.updateUserOnConversation(user); return; }\n    handlers.removeConversationSilently(user.getUid());\n  }));\n\n  // ccUserUnblocked: update user on conversation\n  subs.push(CometChatUserEvents.ccUserUnblocked.subscribe((user: CometChat.User) => handlers.updateUserOnConversation(user)));\n\n  // ccMessageEdited: update last message on success\n  subs.push(CometChatMessageEvents.ccMessageEdited.subscribe((data: IMessages) => {\n    if (data.status === MessageStatus.success) handlers.refreshSingleConversation(data.message);\n  }));\n\n  // ccConversationDeleted: remove from list without re-publishing event\n  subs.push(CometChatConversationEvents.ccConversationDeleted.subscribe((conversation: CometChat.Conversation) => {\n    if (conversation) handlers.removeConversationFromList(getConversationEntityId(conversation));\n  }));\n\n  return subs;\n}\n\nexport function setupCallEventSubscriptions(\n  onCallEvent: (call: CometChat.Call) => void\n): Subscription[] {\n  return [\n    CometChatCallEvents.ccOutgoingCall.subscribe((c: CometChat.Call) => { if (c) onCallEvent(c); }),\n    CometChatCallEvents.ccCallAccepted.subscribe((c: CometChat.Call) => { if (c) onCallEvent(c); }),\n    CometChatCallEvents.ccCallRejected.subscribe((c: CometChat.Call) => { if (c) onCallEvent(c); }),\n    CometChatCallEvents.ccCallEnded.subscribe((c: CometChat.Call) => { if (c) onCallEvent(c); }),\n  ];\n}\n","import { Injectable, signal, computed, inject, DestroyRef, NgZone } from '@angular/core';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Observable, Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMessageEvents, IMessages } from '../events/CometChatMessageEvents';\nimport { CometChatConversationEvents } from '../events/CometChatConversationEvents';\nimport { MessageStatus } from '../Enums/Enums';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatUIKit } from '../cometchat-uikit';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport {\n  setupMessageListener, removeMessageListener,\n  setupUserListener, removeUserListener,\n  setupGroupListener, removeGroupListener,\n  setupCallListener, removeCallListener,\n} from './conversations.listeners';\nimport {\n  handleErrorWithRetry, createEnhancedError,\n  getConversationEntityId, findConversationIndex,\n  isAMessage, shouldLastMessageAndUnreadCountBeUpdated,\n  applyReceiptToConversations, getTypingIndicatorKey,\n  dedupeConversations,\n} from './conversations.utils';\nimport {\n  setupUIEventSubscriptions, setupCallEventSubscriptions,\n} from './conversations.ui-events';\nimport { ConnectionStateService } from './connection-state.service';\n\n// Re-export types for backward compatibility\nexport type { ConversationId, ConversationOperationContext } from './conversations.types';\n\n/**\n * ConversationsService\n *\n * Singleton service managing conversation list state and SDK interactions.\n * Uses Angular Signals for reactive state with Observable API for backward compatibility.\n *\n * @Injectable providedIn: 'root'\n */\n@Injectable({ providedIn: 'root' })\nexport class ConversationsService {\n  private destroyRef = inject(DestroyRef);\n  private ngZone = inject(NgZone);\n  private connectionState = inject(ConnectionStateService);\n\n  // ==================== State Signals ====================\n  private conversationsSignal = signal<CometChat.Conversation[]>([]);\n  private loadingStateSignal = signal<boolean>(false);\n  private errorStateSignal = signal<Error | null>(null);\n  private activeConversationSignal = signal<CometChat.Conversation | null>(null);\n  private typingIndicatorsSignal = signal<Map<string, CometChat.TypingIndicator>>(new Map());\n  private allConversationsSignal = signal<CometChat.Conversation[]>([]);\n\n  // ==================== Public Signal API ====================\n  readonly conversations = this.conversationsSignal.asReadonly();\n  readonly loadingState = this.loadingStateSignal.asReadonly();\n  readonly errorState = this.errorStateSignal.asReadonly();\n  readonly activeConversation = this.activeConversationSignal.asReadonly();\n  readonly typingIndicators = this.typingIndicatorsSignal.asReadonly();\n\n  // ==================== Observable API (backward compat) ====================\n  readonly conversations$: Observable<CometChat.Conversation[]> = toObservable(this.conversationsSignal);\n  readonly loadingState$: Observable<boolean> = toObservable(this.loadingStateSignal);\n  readonly errorState$: Observable<Error | null> = toObservable(this.errorStateSignal);\n  readonly activeConversation$: Observable<CometChat.Conversation | null> = toObservable(this.activeConversationSignal);\n  readonly typingIndicators$: Observable<Map<string, CometChat.TypingIndicator>> = toObservable(this.typingIndicatorsSignal);\n\n  readonly hasConversations = computed(() => this.conversationsSignal().length > 0);\n  readonly isLoading = computed(() => this.loadingStateSignal());\n  readonly hasError = computed(() => this.errorStateSignal() !== null);\n\n  // Tracks whether more pages are available for pagination.\n  // Reset to true whenever a fresh first-page fetch completes (e.g. on reconnect).\n  private hasMoreSignal = signal<boolean>(true);\n  readonly hasMore = this.hasMoreSignal.asReadonly();\n\n  // ==================== Configuration ====================\n  private conversationsRequest?: CometChat.ConversationsRequest;\n  private requestBuilder?: CometChat.ConversationsRequestBuilder;\n  private messageListenerId = `conversations_${Date.now()}`;\n  private userListenerId = `conversations_user_${Date.now()}`;\n  private groupListenerId = `conversations_group_${Date.now()}`;\n  private callListenerId = `conversations_call_${Date.now()}`;\n  private retryAttempts = new Map<string, number>();\n  /** Guard: only re-fetch on reconnect after the first fetch has completed. */\n  private initialFetchDone = false;\n\n  private ccMessageSentSubscription: Subscription | null = null;\n  private ccMessageDeletedSubscription: Subscription | null = null;\n  private callEventSubscriptions: Subscription[] = [];\n  private uiEventSubscriptions: Subscription[] = [];\n\n  constructor() {\n    this.setupSDKListeners();\n    this.setupSentMessageListener();\n    this.setupDeletedMessageListener();\n    this.callEventSubscriptions = setupCallEventSubscriptions(c => this.refreshSingleConversation(c));\n    this.uiEventSubscriptions = setupUIEventSubscriptions({\n      refreshSingleConversation: m => this.refreshSingleConversation(m),\n      removeConversationSilently: id => this.removeConversationSilently(id),\n      updateGroupOnConversation: g => this.updateGroupOnConversation(g),\n      updateUserOnConversation: u => this.updateUserOnConversation(u),\n      addConversationToTop: conv => { const c = dedupeConversations([conv, ...this.allConversationsSignal()]); this.allConversationsSignal.set(c); this.conversationsSignal.set(c); },\n      removeConversationFromList: id => this.removeConversationSilently(id),\n      requestBuilder: this.requestBuilder,\n    });\n\n    // Single shared connection listener — re-fetch on WebSocket reconnect.\n    // Guard: only fires after the initial fetch has completed, so the startup\n    // onConnected event (which arrives around the same time as the first fetch)\n    // does not cause a duplicate load.\n    this.connectionState.reconnected$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        if (!this.initialFetchDone) return;\n        CometChatLogger.info('ConversationsService', 'WebSocket reconnected — refreshing conversation list');\n        const builder = this.requestBuilder\n          ?? new CometChat.ConversationsRequestBuilder().setLimit(30);\n        // silent=true: skip loading state and shimmer delay — just swap the list\n        this.fetchConversations(builder, true).catch(e =>\n          CometChatLogger.error('ConversationsService', 'Error refreshing conversations on reconnect:', e)\n        );\n      });\n\n    this.destroyRef.onDestroy(() => { this.removeListeners(); this.resetState(); });\n  }\n\n  // ==================== Error Handling ====================\n  clearError(): void { this.errorStateSignal.set(null); }\n  private setError(e: Error): void { this.errorStateSignal.set(e); }\n\n  // ==================== Public Methods ====================\n  setConversationsRequestBuilder(builder: CometChat.ConversationsRequestBuilder): void { this.requestBuilder = builder; this.conversationsRequest = undefined; }\n  setActiveConversation(conversation: CometChat.Conversation | null): void { this.activeConversationSignal.set(conversation); }\n  getConversations(): CometChat.Conversation[] { return this.conversationsSignal(); }\n\n  async fetchConversations(builder?: CometChat.ConversationsRequestBuilder, silent = false): Promise<void> {\n    try {\n      if (!silent) {\n        // Normal load: clear immediately and show shimmer\n        this.allConversationsSignal.set([]); this.conversationsSignal.set([]);\n        this.loadingStateSignal.set(true);\n      }\n      // Silent reconnect load: keep existing list visible until new data arrives\n      this.errorStateSignal.set(null);\n      const t0 = Date.now();\n      const b = builder || this.requestBuilder || new CometChat.ConversationsRequestBuilder().setLimit(30);\n      this.conversationsRequest = b.build();\n      const conversations = await this.conversationsRequest.fetchNext();\n      // A realtime listener (e.g. a group-action message for a just-created group)\n      // can insert a conversation while this fetch is in flight. Merge those in front\n      // of the fetched page and dedupe by entity id so the same conversation is never\n      // listed twice — keep the realtime copy, drop the duplicate from the page.\n      const merged = dedupeConversations([...this.allConversationsSignal(), ...conversations]);\n      this.allConversationsSignal.set(merged); this.conversationsSignal.set(merged);\n      // Only apply shimmer minimum delay on the initial (non-silent) fetch\n      if (!silent) {\n        await new Promise<void>(r => setTimeout(r, Math.max(0, 1000 - (Date.now() - t0))));\n      }\n      this.loadingStateSignal.set(false);\n      // After a fresh first-page fetch, pagination is available again\n      this.hasMoreSignal.set(true);\n      this.initialFetchDone = true;\n    } catch (error) {\n      this.loadingStateSignal.set(false);\n      await handleErrorWithRetry(error, 'fetchConversations', this.retryAttempts, this.setError.bind(this), () => this.fetchConversations(builder));\n    }\n  }\n\n  async fetchNextConversations(): Promise<boolean> {\n    if (!this.conversationsRequest) return false;\n    if (this.loadingStateSignal()) return true;\n    try {\n      this.loadingStateSignal.set(true); this.errorStateSignal.set(null);\n      const next = await this.conversationsRequest.fetchNext();\n      // Dedupe so a conversation already promoted to the list by a realtime event\n      // isn't added again when it also comes back in the next page.\n      const updated = dedupeConversations([...this.conversationsSignal(), ...next]);\n      this.allConversationsSignal.set(updated); this.conversationsSignal.set(updated);\n      this.loadingStateSignal.set(false);\n      const hasMore = next.length > 0;\n      this.hasMoreSignal.set(hasMore);\n      return hasMore;\n    } catch (error) {\n      this.loadingStateSignal.set(false);\n      this.errorStateSignal.set(createEnhancedError(error, 'fetchNextConversations'));\n      return false;\n    }\n  }\n\n  async deleteConversation(conversationWith: string, conversationType: string): Promise<void> {\n    try {\n      this.errorStateSignal.set(null);\n      await CometChat.deleteConversation(conversationWith, conversationType);\n      this.removeConversation(conversationWith);\n    } catch (error) {\n      await handleErrorWithRetry(error, 'deleteConversation', this.retryAttempts, this.setError.bind(this), () => this.deleteConversation(conversationWith, conversationType));\n    }\n  }\n\n  searchConversations(searchText: string): void {\n    if (!searchText?.trim()) { this.conversationsSignal.set([...this.allConversationsSignal()]); return; }\n    const lower = searchText.toLowerCase();\n    this.conversationsSignal.set(this.allConversationsSignal().filter(conv => {\n      const name = conv.getConversationWith().getName().toLowerCase();\n      const last = conv.getLastMessage();\n      const text = last instanceof CometChat.TextMessage ? last.getText().toLowerCase() : '';\n      return name.includes(lower) || text.includes(lower);\n    }));\n  }\n\n  removeConversation(id: string): void {\n    const convs = [...this.allConversationsSignal()];\n    const toRemove = convs.find(c => getConversationEntityId(c) === id);\n    const filtered = convs.filter(c => getConversationEntityId(c) !== id);\n    this.allConversationsSignal.set(filtered); this.conversationsSignal.set(filtered);\n    if (toRemove) CometChatConversationEvents.ccConversationDeleted.next(toRemove);\n  }\n\n  findConversation(id: string): CometChat.Conversation | null {\n    return this.allConversationsSignal().find(c => getConversationEntityId(c) === id) || null;\n  }\n\n  updateConversationList(conversation: CometChat.Conversation, message?: CometChat.BaseMessage): void {\n    const msg = message || conversation.getLastMessage();\n    if (msg) {\n      if (!isAMessage(msg) || !shouldLastMessageAndUnreadCountBeUpdated(msg)) return;\n      const me = CometChatUIKit.getLoggedInUser();\n      const active = this.activeConversationSignal();\n      const isActiveConversation = active && msg.getConversationId() === active.getConversationId();\n      // Only increment unread count if:\n      // 1. The message is not from the logged-in user\n      // 2. The conversation is NOT currently active (open)\n      // When the conversation is active, the message list handles the unread count:\n      // - If user is at bottom: markAsRead keeps count at 0 (no flash)\n      // - If user is scrolled up: handleNewMessagesImpl explicitly calls\n      //   updateConversationUnreadCount to increment the count\n      if (me && msg.getSender().getUid() !== me.getUid() && !isActiveConversation)\n        conversation.setUnreadMessageCount((conversation.getUnreadMessageCount() ?? 0) + 1);\n      if (msg instanceof CometChat.Action &&\n          msg.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group &&\n          conversation.getConversationType() === CometChatUIKitConstants.MessageReceiverType.group) {\n        const af = msg.getActionFor(); const rv = msg.getReceiver();\n        if (af instanceof CometChat.Group && rv instanceof CometChat.Group && rv.getGuid() === af.getGuid()) {\n          const g = conversation.getConversationWith() as CometChat.Group;\n          g.setMembersCount(af.getMembersCount()); conversation.setConversationWith(g);\n        }\n      }\n      conversation.setLastMessage(msg);\n    }\n    const convs = [...this.allConversationsSignal()];\n    const idx = findConversationIndex(convs, getConversationEntityId(conversation));\n    if (idx !== -1) convs.splice(idx, 1);\n    const updated = [conversation, ...convs];\n    this.allConversationsSignal.set(updated); this.conversationsSignal.set(updated);\n  }\n\n  replaceConversation(newConversation: CometChat.Conversation): boolean {\n    const id = getConversationEntityId(newConversation);\n    const convs = [...this.allConversationsSignal()];\n    const idx = findConversationIndex(convs, id);\n    if (idx === -1) return false;\n    convs[idx] = newConversation;\n    this.allConversationsSignal.set(convs); this.conversationsSignal.set(convs);\n    return true;\n  }\n\n  moveConversationToTop(id: string): boolean {\n    const convs = [...this.allConversationsSignal()];\n    const idx = findConversationIndex(convs, id);\n    if (idx === -1) return false;\n    convs.unshift(...convs.splice(idx, 1));\n    this.allConversationsSignal.set(convs); this.conversationsSignal.set(convs);\n    return true;\n  }\n\n  insertConversationAt(conversation: CometChat.Conversation, index: number): void {\n    const convs = [...this.allConversationsSignal()];\n    convs.splice(Math.max(0, Math.min(index, convs.length)), 0, conversation);\n    this.allConversationsSignal.set(convs); this.conversationsSignal.set(convs);\n  }\n\n  getConversationIndex(id: string): number { return findConversationIndex(this.allConversationsSignal(), id); }\n\n  // ==================== Receipt Methods ====================\n\n  updateConversationUnreadCount(id: string, count: number): void {\n    try {\n      const convs = [...this.allConversationsSignal()];\n      const idx = findConversationIndex(convs, id);\n      if (idx === -1) return;\n      convs[idx].setUnreadMessageCount(count);\n      this.allConversationsSignal.set(convs); this.conversationsSignal.set(convs);\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error updating unread count:', e); }\n  }\n\n  updateConversationReadStatus(id: string, message: CometChat.BaseMessage): void {\n    try {\n      const convs = [...this.allConversationsSignal()];\n      const idx = findConversationIndex(convs, id);\n      if (idx === -1) return;\n      const conv = convs[idx];\n      conv.setUnreadMessageCount(0);\n      const last = conv.getLastMessage();\n      if (last && last.getId() === message.getId()) {\n        const readAt = message.getReadAt();\n        if (readAt) { last.setReadAt(readAt); conv.setLastMessage(last); }\n      }\n      this.allConversationsSignal.set(convs); this.conversationsSignal.set(convs);\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error updating read status:', e); }\n  }\n\n  private handleReceipt(receipt: CometChat.MessageReceipt, isGroup: boolean): void {\n    try {\n      const { updated, conversations } = applyReceiptToConversations([...this.allConversationsSignal()], receipt, isGroup);\n      if (updated) { this.allConversationsSignal.set(conversations); this.conversationsSignal.set(conversations); }\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error handling receipt:', e); }\n  }\n\n  // ==================== Cleanup ====================\n\n  cleanup(): void { this.removeListeners(); this.resetState(); }\n\n  removeListeners(): void {\n    removeMessageListener(this.messageListenerId); removeUserListener(this.userListenerId);\n    removeGroupListener(this.groupListenerId); removeCallListener(this.callListenerId);\n    // Connection listener is owned by ConnectionStateService — nothing to remove here.\n    this.ccMessageSentSubscription?.unsubscribe(); this.ccMessageSentSubscription = null;\n    this.ccMessageDeletedSubscription?.unsubscribe(); this.ccMessageDeletedSubscription = null;\n    this.callEventSubscriptions.forEach(s => s.unsubscribe()); this.callEventSubscriptions = [];\n    this.uiEventSubscriptions.forEach(s => s.unsubscribe()); this.uiEventSubscriptions = [];\n  }\n\n  private resetState(): void {\n    this.allConversationsSignal.set([]); this.conversationsSignal.set([]);\n    this.loadingStateSignal.set(false); this.errorStateSignal.set(null);\n    this.activeConversationSignal.set(null); this.typingIndicatorsSignal.set(new Map());\n    this.retryAttempts.clear();\n    this.hasMoreSignal.set(true);\n    this.initialFetchDone = false;\n  }\n\n  // ==================== SDK Listener Setup ====================\n\n  private setupSDKListeners(): void {\n    const nm = (m: CometChat.BaseMessage) => this.handleNewMessage(m);\n    setupMessageListener(this.messageListenerId, {\n      onTextMessageReceived: nm, onMediaMessageReceived: nm,\n      onCustomMessageReceived: nm, onInteractiveMessageReceived: nm,\n      onCardMessageReceived: nm,\n      onAIAssistantMessageReceived: nm,\n      onMessageEdited: m => this.handleMessageUpdate(m),\n      onMessageDeleted: m => this.handleMessageDelete(m),\n      onMessagesDelivered: r => this.handleReceipt(r, false),\n      onMessagesRead: r => this.handleReceipt(r, false),\n      onMessagesDeliveredToAll: r => this.handleReceipt(r, true),\n      onMessagesReadByAll: r => this.handleReceipt(r, true),\n      onTypingStarted: t => this.handleTypingStarted(t),\n      onTypingEnded: t => this.handleTypingEnded(t),\n    }, this.ngZone);\n    setupUserListener(this.userListenerId, u => this.handleUserStatusChange(u), this.ngZone);\n    setupGroupListener(this.groupListenerId, nm, this.ngZone);\n    setupCallListener(this.callListenerId, c => this.refreshSingleConversation(c), this.ngZone);\n  }\n\n  private setupSentMessageListener(): void {\n    this.ccMessageSentSubscription = CometChatMessageEvents.ccMessageSent.subscribe((data: IMessages) => {\n      if (data.status === MessageStatus.success) this.refreshSingleConversation(data.message);\n    });\n  }\n\n  private setupDeletedMessageListener(): void {\n    this.ccMessageDeletedSubscription = CometChatMessageEvents.ccMessageDeleted.subscribe(\n      (message: CometChat.BaseMessage) => this.handleMessageDelete(message)\n    );\n  }\n\n  // ==================== Private Message Handlers ====================\n\n  private handleNewMessage(message: CometChat.BaseMessage): void {\n    try {\n      const s = CometChatUIKit.conversationUpdateSettings;\n      const cat = message.getCategory();\n      if (s && !s.shouldUpdateOnCustomMessages?.() && cat === CometChatUIKitConstants.MessageCategory.custom) return;\n      if (s && !s.shouldUpdateOnGroupActions?.() && cat === CometChatUIKitConstants.MessageCategory.action) return;\n      const active = this.activeConversationSignal();\n      const isActive = active && message.getConversationId() === active.getConversationId();\n      const me = CometChatUIKit.getLoggedInUser();\n      if (me && message.getSender().getUid() !== me.getUid() && !message.getDeliveredAt() && !isActive)\n        CometChat.markAsDelivered(message).catch(() => {});\n      this.refreshSingleConversation(message);\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error handling new message:', e); }\n  }\n\n  private handleMessageUpdate(m: CometChat.BaseMessage): void { try { this.refreshSingleConversation(m); } catch (e) { CometChatLogger.error('ConversationsService', 'Error handling message update:', e); } }\n  private handleMessageDelete(m: CometChat.BaseMessage): void { try { this.refreshSingleConversation(m); } catch (e) { CometChatLogger.error('ConversationsService', 'Error handling message delete:', e); } }\n\n  private refreshSingleConversation(message: CometChat.BaseMessage, removeConv = false): void {\n    try {\n      const idx = this.allConversationsSignal().findIndex(c => c.getConversationId() === message.getConversationId());\n      if (idx >= 0) {\n        const conv = this.allConversationsSignal()[idx];\n        removeConv ? this.removeConversation(getConversationEntityId(conv)) : this.updateConversationList(conv, message);\n      } else {\n        CometChat.CometChatHelper.getConversationFromMessage(message)\n          .then((c: CometChat.Conversation) => this.updateConversationList(c, message))\n          .catch((e: CometChat.CometChatException) => CometChatLogger.error('ConversationsService', 'Error getting conversation from message:', e));\n      }\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error in refreshSingleConversation:', e); }\n  }\n\n  private handleTypingStarted(t: CometChat.TypingIndicator): void {\n    try { const m = new Map(this.typingIndicatorsSignal()); m.set(getTypingIndicatorKey(t), t); this.typingIndicatorsSignal.set(m); }\n    catch (e) { CometChatLogger.error('ConversationsService', 'Error handling typing started:', e); }\n  }\n\n  private handleTypingEnded(t: CometChat.TypingIndicator): void {\n    try { const m = new Map(this.typingIndicatorsSignal()); m.delete(getTypingIndicatorKey(t)); this.typingIndicatorsSignal.set(m); }\n    catch (e) { CometChatLogger.error('ConversationsService', 'Error handling typing ended:', e); }\n  }\n\n  private handleUserStatusChange(user: CometChat.User): void {\n    try {\n      this.conversationsSignal.set(this.conversationsSignal().map(conv => {\n        const cw = conv.getConversationWith();\n        if (cw instanceof CometChat.User && cw.getUid() === user.getUid()) cw.setStatus(user.getStatus());\n        return conv;\n      }));\n    } catch (e) { CometChatLogger.error('ConversationsService', 'Error handling user status change:', e); }\n  }\n\n  private updateGroupOnConversation(group: CometChat.Group): void {\n    const guid = group.getGuid();\n    const updated = this.allConversationsSignal().map(conv => {\n      const cw = conv.getConversationWith();\n      if (cw instanceof CometChat.Group && cw.getGuid() === guid) conv.setConversationWith(group);\n      return conv;\n    });\n    this.allConversationsSignal.set([...updated]); this.conversationsSignal.set([...updated]);\n  }\n\n  private updateUserOnConversation(user: CometChat.User): void {\n    const uid = user.getUid();\n    const updated = this.allConversationsSignal().map(conv => {\n      const cw = conv.getConversationWith();\n      if (cw instanceof CometChat.User && cw.getUid() === uid) conv.setConversationWith(user);\n      return conv;\n    });\n    this.allConversationsSignal.set([...updated]); this.conversationsSignal.set([...updated]);\n  }\n\n  private removeConversationSilently(id: string): void {\n    const filtered = this.allConversationsSignal().filter(c => getConversationEntityId(c) !== id);\n    this.allConversationsSignal.set(filtered); this.conversationsSignal.set(filtered);\n  }\n}\n","import { Injectable, signal, inject } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { Observable } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { ConversationsService } from './conversations.service';\n\n/**\n * ChatStateService\n *\n * Centralized service for managing active chat state across the CometChat Angular UIKit.\n * Provides a single source of truth for the currently active chat entity\n * (User, Group, or Conversation) using Angular Signals with Observable API for RxJS integration.\n *\n * Enforces mutual exclusivity: setting a User clears the active Group and vice versa.\n *\n * @Injectable providedIn: 'root'\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class ChatStateService {\n  private conversationsService = inject(ConversationsService);\n\n  // ==================== Private Signals ====================\n\n  private activeUserSignal = signal<CometChat.User | null>(null);\n  private activeGroupSignal = signal<CometChat.Group | null>(null);\n  private activeConversationSignal = signal<CometChat.Conversation | null>(null);\n\n  // ==================== Public Readonly Signals ====================\n\n  /**\n   * Readonly signal for the currently active user.\n   * @example\n   * ```typescript\n   * activeUser = this.chatStateService.activeUser;\n   * // In template: {{ activeUser()?.getName() }}\n   * ```\n   */\n  readonly activeUser = this.activeUserSignal.asReadonly();\n\n  /**\n   * Readonly signal for the currently active group.\n   * @example\n   * ```typescript\n   * activeGroup = this.chatStateService.activeGroup;\n   * // In template: {{ activeGroup()?.getName() }}\n   * ```\n   */\n  readonly activeGroup = this.activeGroupSignal.asReadonly();\n\n  /**\n   * Readonly signal for the currently active conversation.\n   */\n  readonly activeConversation = this.activeConversationSignal.asReadonly();\n\n  // ==================== Public Observables ====================\n\n  /**\n   * Observable stream for the currently active user.\n   * @example\n   * ```typescript\n   * this.chatStateService.activeUser$.subscribe(user => { ... });\n   * ```\n   */\n  readonly activeUser$: Observable<CometChat.User | null> = toObservable(this.activeUserSignal);\n\n  /**\n   * Observable stream for the currently active group.\n   */\n  readonly activeGroup$: Observable<CometChat.Group | null> = toObservable(this.activeGroupSignal);\n\n  /**\n   * Observable stream for the currently active conversation.\n   */\n  readonly activeConversation$: Observable<CometChat.Conversation | null> = toObservable(\n    this.activeConversationSignal\n  );\n\n  // ==================== Setters ====================\n\n  /**\n   * Sets the active user and clears the active group (mutual exclusivity).\n   * @param user - The user to set as active, or null to clear\n   */\n  setActiveUser(user: CometChat.User | null): void {\n    this.activeUserSignal.set(user);\n    if (user !== null) {\n      this.activeGroupSignal.set(null);\n    }\n  }\n\n  /**\n   * Sets the active group and clears the active user (mutual exclusivity).\n   * @param group - The group to set as active, or null to clear\n   */\n  setActiveGroup(group: CometChat.Group | null): void {\n    this.activeGroupSignal.set(group);\n    if (group !== null) {\n      this.activeUserSignal.set(null);\n    }\n  }\n\n  /**\n   * Sets the active conversation and extracts user/group from it.\n   * Automatically calls setActiveUser or setActiveGroup based on conversation type.\n   * @param conversation - The conversation to set as active, or null to clear\n   */\n  setActiveConversation(conversation: CometChat.Conversation | null): void {\n    this.activeConversationSignal.set(conversation);\n\n    if (conversation != null) {\n      const conversationWith = conversation.getConversationWith();\n      if (conversationWith instanceof CometChat.User) {\n        this.setActiveUser(conversationWith);\n      } else if (conversationWith instanceof CometChat.Group) {\n        this.setActiveGroup(conversationWith);\n      }\n    } else {\n      this.activeUserSignal.set(null);\n      this.activeGroupSignal.set(null);\n    }\n  }\n\n  // ==================== Getters (Snapshot Values) ====================\n\n  /**\n   * Gets the current active user (snapshot, non-reactive).\n   * @returns The currently active user, or null\n   */\n  getActiveUser(): CometChat.User | null {\n    return this.activeUserSignal();\n  }\n\n  /**\n   * Gets the current active group (snapshot, non-reactive).\n   * @returns The currently active group, or null\n   */\n  getActiveGroup(): CometChat.Group | null {\n    return this.activeGroupSignal();\n  }\n\n  /**\n   * Gets the current active conversation (snapshot, non-reactive).\n   * @returns The currently active conversation, or null\n   */\n  getActiveConversation(): CometChat.Conversation | null {\n    return this.activeConversationSignal();\n  }\n\n  // ==================== Utility Methods ====================\n\n  /**\n   * Gets the currently active chat entity (User or Group).\n   * Returns User if set, otherwise Group, otherwise null.\n   * @returns The active User, Group, or null\n   */\n  getActiveChatEntity(): CometChat.User | CometChat.Group | null {\n    const user = this.activeUserSignal();\n    if (user !== null) {\n      return user;\n    }\n    return this.activeGroupSignal();\n  }\n\n  /**\n   * Clears all active chat states (user, group, conversation).\n   * Also clears the internal active conversation in ConversationsService.\n   */\n  clearActiveChat(): void {\n    this.activeUserSignal.set(null);\n    this.activeGroupSignal.set(null);\n    this.activeConversationSignal.set(null);\n    this.conversationsService.setActiveConversation(null);\n  }\n}\n","/**\n * CometChatTemplatesService\n *\n * A centralized service for SDK-wide template customization. Register templates once\n * at the SDK level and have them available across all CometChat list components.\n *\n * ### Template Priority\n *\n * `Component @Input > Component-specific service templates > Shared service templates > Default`\n *\n * ### Shared Templates\n *\n * Use `setSharedTemplates()` to set loading/empty/error templates that apply to ALL list\n * components at once. Component-specific templates (e.g. `setUserTemplates()`) override shared.\n *\n * ### Component-Specific Templates\n *\n * Each list component has its own typed template section:\n * - `setConversationTemplates()` — CometChatConversations\n * - `setUserTemplates()` — CometChatUsers\n * - `setGroupTemplates()` — CometChatGroups\n * - `setGroupMemberTemplates()` — CometChatGroupMembers\n * - `setCallLogTemplates()` — CometChatCallLogs\n * - `setMessageListTemplates()` — CometChatMessageList\n *\n * @example\n * ```typescript\n * // Set a branded loading spinner for ALL lists\n * templatesService.setSharedTemplates({ loadingView: mySpinner });\n *\n * // Override just the users list empty state\n * templatesService.setUserTemplates({ emptyView: myUsersEmpty });\n * ```\n */\nimport { Injectable, TemplateRef, DestroyRef, signal, inject } from '@angular/core';\nimport { Observable, BehaviorSubject } from 'rxjs';\n\n// Re-export all types for backward compatibility\nexport type {\n  SharedListTemplates,\n  ConversationTemplates,\n  UserTemplates,\n  GroupTemplates,\n  GroupMemberTemplates,\n  CallLogTemplates,\n  MessageListTemplates,\n  SearchTemplates,\n  ListTemplates,\n} from './templates.types';\n\nimport {\n  SharedListTemplates,\n  ConversationTemplates,\n  UserTemplates,\n  GroupTemplates,\n  GroupMemberTemplates,\n  CallLogTemplates,\n  MessageListTemplates,\n  SearchTemplates,\n  ListTemplates,\n} from './templates.types';\n\n@Injectable({ providedIn: 'root' })\nexport class CometChatTemplatesService {\n  private readonly _destroyRef = inject(DestroyRef);\n\n  // ============================================\n  // Shared Templates (apply to ALL lists as fallback)\n  // ============================================\n  private sharedTemplatesSignal = signal<SharedListTemplates>({});\n  private sharedTemplatesSubject = new BehaviorSubject<SharedListTemplates>({});\n  readonly sharedTemplates = this.sharedTemplatesSignal.asReadonly();\n  readonly sharedTemplates$: Observable<SharedListTemplates> =\n    this.sharedTemplatesSubject.asObservable();\n\n  // ============================================\n  // Conversation Templates\n  // ============================================\n  private conversationTemplatesSignal = signal<ConversationTemplates>({});\n  private conversationTemplatesSubject = new BehaviorSubject<ConversationTemplates>({});\n  readonly conversationTemplates = this.conversationTemplatesSignal.asReadonly();\n  readonly conversationTemplates$: Observable<ConversationTemplates> =\n    this.conversationTemplatesSubject.asObservable();\n\n  // ============================================\n  // User Templates\n  // ============================================\n  private userTemplatesSignal = signal<UserTemplates>({});\n  private userTemplatesSubject = new BehaviorSubject<UserTemplates>({});\n  readonly userTemplates = this.userTemplatesSignal.asReadonly();\n  readonly userTemplates$: Observable<UserTemplates> =\n    this.userTemplatesSubject.asObservable();\n\n  // ============================================\n  // Group Templates\n  // ============================================\n  private groupTemplatesSignal = signal<GroupTemplates>({});\n  private groupTemplatesSubject = new BehaviorSubject<GroupTemplates>({});\n  readonly groupTemplates = this.groupTemplatesSignal.asReadonly();\n  readonly groupTemplates$: Observable<GroupTemplates> =\n    this.groupTemplatesSubject.asObservable();\n\n  // ============================================\n  // Group Member Templates\n  // ============================================\n  private groupMemberTemplatesSignal = signal<GroupMemberTemplates>({});\n  private groupMemberTemplatesSubject = new BehaviorSubject<GroupMemberTemplates>({});\n  readonly groupMemberTemplates = this.groupMemberTemplatesSignal.asReadonly();\n  readonly groupMemberTemplates$: Observable<GroupMemberTemplates> =\n    this.groupMemberTemplatesSubject.asObservable();\n\n  // ============================================\n  // Call Log Templates\n  // ============================================\n  private callLogTemplatesSignal = signal<CallLogTemplates>({});\n  private callLogTemplatesSubject = new BehaviorSubject<CallLogTemplates>({});\n  readonly callLogTemplates = this.callLogTemplatesSignal.asReadonly();\n  readonly callLogTemplates$: Observable<CallLogTemplates> =\n    this.callLogTemplatesSubject.asObservable();\n\n  // ============================================\n  // Message List Templates\n  // ============================================\n  private messageListTemplatesSignal = signal<MessageListTemplates>({});\n  private messageListTemplatesSubject = new BehaviorSubject<MessageListTemplates>({});\n  readonly messageListTemplates = this.messageListTemplatesSignal.asReadonly();\n  readonly messageListTemplates$: Observable<MessageListTemplates> =\n    this.messageListTemplatesSubject.asObservable();\n\n  // ============================================\n  // Search Templates\n  // ============================================\n  private searchTemplatesSignal = signal<SearchTemplates>({});\n  private searchTemplatesSubject = new BehaviorSubject<SearchTemplates>({});\n  readonly searchTemplates = this.searchTemplatesSignal.asReadonly();\n  readonly searchTemplates$: Observable<SearchTemplates> =\n    this.searchTemplatesSubject.asObservable();\n\n  // ============================================\n  // Legacy Generic List Templates (backward compat)\n  // ============================================\n  private listTemplatesSignal = signal<ListTemplates<unknown>>({});\n  private listTemplatesSubject = new BehaviorSubject<ListTemplates<unknown>>({});\n  readonly listTemplates = this.listTemplatesSignal.asReadonly();\n  readonly listTemplates$: Observable<ListTemplates<unknown>> =\n    this.listTemplatesSubject.asObservable();\n\n  constructor() {\n    this._destroyRef.onDestroy(() => this._completeAllSubjects());\n  }\n\n  // ============================================\n  // Shared Template Methods\n  // ============================================\n\n  /**\n   * Sets templates that apply to ALL list components as a fallback.\n   * Component-specific templates take priority over shared templates.\n   */\n  setSharedTemplates(templates: Partial<SharedListTemplates>): void {\n    const current = this.sharedTemplatesSignal();\n    const updated = { ...current, ...templates };\n    this.sharedTemplatesSignal.set(updated);\n    this.sharedTemplatesSubject.next(updated);\n  }\n\n  /** Gets the current shared templates synchronously. */\n  getSharedTemplates(): SharedListTemplates {\n    return this.sharedTemplatesSignal();\n  }\n\n  /** Clears all shared templates, resetting to defaults. */\n  clearSharedTemplates(): void {\n    this.sharedTemplatesSignal.set({});\n    this.sharedTemplatesSubject.next({});\n  }\n\n  // ============================================\n  // Conversation Template Methods\n  // ============================================\n\n  setConversationItemTemplate(template: TemplateRef<any>): void { this.updateConversationTemplates({ itemView: template }); }\n  setConversationLeadingTemplate(template: TemplateRef<any>): void { this.updateConversationTemplates({ leadingView: template }); }\n  setConversationTitleTemplate(template: TemplateRef<any>): void { this.updateConversationTemplates({ titleView: template }); }\n  setConversationSubtitleTemplate(template: TemplateRef<any>): void { this.updateConversationTemplates({ subtitleView: template }); }\n  setConversationTrailingTemplate(template: TemplateRef<any>): void { this.updateConversationTemplates({ trailingView: template }); }\n  setConversationLoadingTemplate(template: TemplateRef<void>): void { this.updateConversationTemplates({ loadingView: template }); }\n  setConversationEmptyTemplate(template: TemplateRef<void>): void { this.updateConversationTemplates({ emptyView: template }); }\n  setConversationErrorTemplate(template: TemplateRef<{ $implicit: Error }>): void { this.updateConversationTemplates({ errorView: template }); }\n\n  /** Sets multiple conversation templates at once. */\n  setConversationTemplates(templates: Partial<ConversationTemplates>): void {\n    this.updateConversationTemplates(templates);\n  }\n\n  /** Gets the current conversation templates synchronously. */\n  getConversationTemplates(): ConversationTemplates {\n    return this.conversationTemplatesSignal();\n  }\n\n  /** Clears all conversation templates, resetting to defaults. */\n  clearConversationTemplates(): void {\n    this.conversationTemplatesSignal.set({});\n    this.conversationTemplatesSubject.next({});\n  }\n\n  // ============================================\n  // User Template Methods\n  // ============================================\n\n  setUserTemplates(templates: Partial<UserTemplates>): void {\n    const updated = { ...this.userTemplatesSignal(), ...templates };\n    this.userTemplatesSignal.set(updated);\n    this.userTemplatesSubject.next(updated);\n  }\n  getUserTemplates(): UserTemplates { return this.userTemplatesSignal(); }\n  clearUserTemplates(): void { this.userTemplatesSignal.set({}); this.userTemplatesSubject.next({}); }\n\n  // ============================================\n  // Group Template Methods\n  // ============================================\n\n  setGroupTemplates(templates: Partial<GroupTemplates>): void {\n    const updated = { ...this.groupTemplatesSignal(), ...templates };\n    this.groupTemplatesSignal.set(updated);\n    this.groupTemplatesSubject.next(updated);\n  }\n  getGroupTemplates(): GroupTemplates { return this.groupTemplatesSignal(); }\n  clearGroupTemplates(): void { this.groupTemplatesSignal.set({}); this.groupTemplatesSubject.next({}); }\n\n  // ============================================\n  // Group Member Template Methods\n  // ============================================\n\n  setGroupMemberTemplates(templates: Partial<GroupMemberTemplates>): void {\n    const updated = { ...this.groupMemberTemplatesSignal(), ...templates };\n    this.groupMemberTemplatesSignal.set(updated);\n    this.groupMemberTemplatesSubject.next(updated);\n  }\n  getGroupMemberTemplates(): GroupMemberTemplates { return this.groupMemberTemplatesSignal(); }\n  clearGroupMemberTemplates(): void { this.groupMemberTemplatesSignal.set({}); this.groupMemberTemplatesSubject.next({}); }\n\n  // ============================================\n  // Call Log Template Methods\n  // ============================================\n\n  setCallLogTemplates(templates: Partial<CallLogTemplates>): void {\n    const updated = { ...this.callLogTemplatesSignal(), ...templates };\n    this.callLogTemplatesSignal.set(updated);\n    this.callLogTemplatesSubject.next(updated);\n  }\n  getCallLogTemplates(): CallLogTemplates { return this.callLogTemplatesSignal(); }\n  clearCallLogTemplates(): void { this.callLogTemplatesSignal.set({}); this.callLogTemplatesSubject.next({}); }\n\n  // ============================================\n  // Message List Template Methods\n  // ============================================\n\n  setMessageListTemplates(templates: Partial<MessageListTemplates>): void {\n    const updated = { ...this.messageListTemplatesSignal(), ...templates };\n    this.messageListTemplatesSignal.set(updated);\n    this.messageListTemplatesSubject.next(updated);\n  }\n  getMessageListTemplates(): MessageListTemplates { return this.messageListTemplatesSignal(); }\n  clearMessageListTemplates(): void { this.messageListTemplatesSignal.set({}); this.messageListTemplatesSubject.next({}); }\n\n  // ============================================\n  // Search Template Methods\n  // ============================================\n\n  setSearchTemplates(templates: Partial<SearchTemplates>): void {\n    const updated = { ...this.searchTemplatesSignal(), ...templates };\n    this.searchTemplatesSignal.set(updated);\n    this.searchTemplatesSubject.next(updated);\n  }\n  getSearchTemplates(): SearchTemplates { return this.searchTemplatesSignal(); }\n  clearSearchTemplates(): void { this.searchTemplatesSignal.set({}); this.searchTemplatesSubject.next({}); }\n\n  // ============================================\n  // Legacy Generic List Template Methods\n  // ============================================\n\n  /** @deprecated Use typed methods (setUserTemplates, setGroupTemplates, etc.) instead. */\n  getListTemplates(): ListTemplates<unknown> { return this.listTemplatesSignal(); }\n\n  /** @deprecated Use typed methods instead. */\n  setListTemplates<T>(templates: Partial<ListTemplates<T>>): void {\n    const updated = { ...this.listTemplatesSignal(), ...templates } as ListTemplates<unknown>;\n    this.listTemplatesSignal.set(updated);\n    this.listTemplatesSubject.next(updated);\n  }\n\n  /** @deprecated Use typed clear methods instead. */\n  clearListTemplates(): void { this.listTemplatesSignal.set({}); this.listTemplatesSubject.next({}); }\n\n  // ============================================\n  // Bulk Operations\n  // ============================================\n\n  /** Clears ALL templates (shared + all component-specific), resetting everything to defaults. */\n  clearAllTemplates(): void {\n    this.clearSharedTemplates();\n    this.clearConversationTemplates();\n    this.clearUserTemplates();\n    this.clearGroupTemplates();\n    this.clearGroupMemberTemplates();\n    this.clearCallLogTemplates();\n    this.clearMessageListTemplates();\n    this.clearSearchTemplates();\n    this.clearListTemplates();\n  }\n\n  // ============================================\n  // Resolved Template Helpers\n  // ============================================\n\n  /**\n   * Resolves a template for a specific slot using the priority chain:\n   * Component-specific > Shared > undefined (component uses its default).\n   *\n   * @param componentTemplates - The component-specific templates object\n   * @param slot - The template slot name (e.g. 'loadingView', 'emptyView', 'errorView')\n   * @returns The resolved TemplateRef or undefined\n   */\n  resolveTemplate<T extends Record<string, any>>(\n    componentTemplates: T,\n    slot: keyof T & keyof SharedListTemplates\n  ): TemplateRef<any> | undefined {\n    return componentTemplates[slot] || this.sharedTemplatesSignal()[slot];\n  }\n\n  // ============================================\n  // Private Helper Methods\n  // ============================================\n\n  private updateConversationTemplates(updates: Partial<ConversationTemplates>): void {\n    const current = this.conversationTemplatesSignal();\n    const updated = { ...current, ...updates };\n    this.conversationTemplatesSignal.set(updated);\n    this.conversationTemplatesSubject.next(updated);\n  }\n\n  private _completeAllSubjects(): void {\n    this.sharedTemplatesSubject.complete();\n    this.conversationTemplatesSubject.complete();\n    this.userTemplatesSubject.complete();\n    this.groupTemplatesSubject.complete();\n    this.groupMemberTemplatesSubject.complete();\n    this.callLogTemplatesSubject.complete();\n    this.messageListTemplatesSubject.complete();\n    this.searchTemplatesSubject.complete();\n    this.listTemplatesSubject.complete();\n  }\n}\n","/**\n * SDK listener setup helpers for MessageHeaderService.\n *\n * These functions set up and tear down CometChat SDK listeners\n * (user status, typing, group member, connection) and are called\n * from MessageHeaderService to keep the main service file lean.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n// ─── User Status Listener ────────────────────────────────────────────────────\n\n/**\n * Register a CometChat UserListener under the given ID.\n * Calls `onOnline` / `onOffline` when any user's status changes.\n */\nexport function addUserStatusListener(\n  listenerId: string,\n  onOnline: (user: CometChat.User) => void,\n  onOffline: (user: CometChat.User) => void\n): void {\n  CometChat.addUserListener(\n    listenerId,\n    new CometChat.UserListener({\n      onUserOnline: onOnline,\n      onUserOffline: onOffline,\n    })\n  );\n}\n\n/** Remove the user status listener registered under `listenerId`. */\nexport function removeUserStatusListener(listenerId: string): void {\n  try {\n    CometChat.removeUserListener(listenerId);\n  } catch (error) {\n    CometChatLogger.error('message-header.listeners', 'Error removing user status listener:', error);\n  }\n}\n\n// ─── Typing Listener ─────────────────────────────────────────────────────────\n\n/**\n * Register a CometChat MessageListener under the given ID.\n * Calls `onStarted` / `onEnded` for typing indicator events.\n */\nexport function addTypingListener(\n  listenerId: string,\n  onStarted: (indicator: CometChat.TypingIndicator) => void,\n  onEnded: (indicator: CometChat.TypingIndicator) => void\n): void {\n  CometChat.addMessageListener(\n    listenerId,\n    new CometChat.MessageListener({\n      onTypingStarted: onStarted,\n      onTypingEnded: onEnded,\n    })\n  );\n}\n\n/** Remove the message (typing) listener registered under `listenerId`. */\nexport function removeTypingListener(listenerId: string): void {\n  try {\n    CometChat.removeMessageListener(listenerId);\n  } catch (error) {\n    CometChatLogger.error('message-header.listeners', 'Error removing typing listener:', error);\n  }\n}\n\n// ─── Group Member Listener ───────────────────────────────────────────────────\n\nexport interface GroupMemberListenerCallbacks {\n  onJoined: (message: CometChat.Action, user: CometChat.User, group: CometChat.Group) => void;\n  onLeft: (message: CometChat.Action, user: CometChat.User, group: CometChat.Group) => void;\n  onKicked: (\n    message: CometChat.Action,\n    kicked: CometChat.User,\n    by: CometChat.User,\n    from: CometChat.Group\n  ) => void;\n  onBanned: (\n    message: CometChat.Action,\n    banned: CometChat.User,\n    by: CometChat.User,\n    from: CometChat.Group\n  ) => void;\n  onAdded: (\n    message: CometChat.Action,\n    added: CometChat.User,\n    by: CometChat.User,\n    into: CometChat.Group\n  ) => void;\n  onScopeChanged: (\n    message: CometChat.Action,\n    user: CometChat.User,\n    newScope: string,\n    oldScope: string,\n    group: CometChat.Group\n  ) => void;\n}\n\n/**\n * Register a CometChat GroupListener under the given ID.\n */\nexport function addGroupMemberListener(\n  listenerId: string,\n  callbacks: GroupMemberListenerCallbacks\n): void {\n  CometChat.addGroupListener(\n    listenerId,\n    new CometChat.GroupListener({\n      onGroupMemberJoined: callbacks.onJoined,\n      onGroupMemberLeft: callbacks.onLeft,\n      onGroupMemberKicked: callbacks.onKicked,\n      onGroupMemberBanned: callbacks.onBanned,\n      onMemberAddedToGroup: callbacks.onAdded,\n      onGroupMemberScopeChanged: callbacks.onScopeChanged,\n    })\n  );\n}\n\n/** Remove the group listener registered under `listenerId`. */\nexport function removeGroupMemberListener(listenerId: string): void {\n  try {\n    CometChat.removeGroupListener(listenerId);\n  } catch (error) {\n    CometChatLogger.error('message-header.listeners', 'Error removing group member listener:', error);\n  }\n}\n\n// ─── Connection Listener ─────────────────────────────────────────────────────\n\n/**\n * Register a CometChat ConnectionListener under the given ID.\n */\nexport function addConnectionListener(\n  listenerId: string,\n  onConnected: () => void,\n  onDisconnected: () => void\n): void {\n  CometChat.addConnectionListener(\n    listenerId,\n    new CometChat.ConnectionListener({\n      onConnected,\n      onDisconnected,\n    })\n  );\n}\n\n/** Remove the connection listener registered under `listenerId`. */\nexport function removeConnectionListener(listenerId: string): void {\n  try {\n    CometChat.removeConnectionListener(listenerId);\n  } catch (error) {\n    CometChatLogger.error('message-header.listeners', 'Error removing connection listener:', error);\n  }\n}\n","/**\n * Utility helpers for MessageHeaderService.\n * Contains error handling, retry logic, and typing-user map helpers.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport type { ErrorCallback } from './message-header.types';\n\n// ─── Error Helpers ────────────────────────────────────────────────────────────\n\nexport function toCometchatException(error: unknown, context: string): CometChat.CometChatException {\n  if (error instanceof CometChat.CometChatException) return error;\n  if (error instanceof Error) {\n    return new CometChat.CometChatException({\n      code: 'SERVICE_ERROR',\n      message: `${context}: ${error.message}`,\n      details: error.stack || '',\n    });\n  }\n  return new CometChat.CometChatException({\n    code: 'UNKNOWN_ERROR',\n    message: `${context}: ${String(error)}`,\n    details: '',\n  });\n}\n\nexport function handleServiceError(\n  error: unknown,\n  context: string,\n  errorCallback: ErrorCallback | null\n): void {\n  CometChatLogger.error('MessageHeaderService', `${context}:`, error);\n  if (errorCallback) {\n    errorCallback(toCometchatException(error, context));\n  }\n}\n\nexport function isRecoverableError(error: unknown): boolean {\n  const msg = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();\n  const code =\n    error instanceof CometChat.CometChatException ? String(error.code || '').toLowerCase() : '';\n  const patterns = [\n    'network', 'timeout', 'connection', 'econnrefused',\n    'enotfound', 'socket', 'websocket', 'err_network', 'err_connection',\n  ] as const;\n  return patterns.some(p => msg.includes(p) || code.includes(p));\n}\n\nexport function delay(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport async function executeWithRetry<T>(\n  operation: () => Promise<T>,\n  context: string,\n  errorCallback: ErrorCallback | null,\n  maxRetries = 3,\n  retryDelayMs = 1000\n): Promise<T | null> {\n  let lastError: unknown;\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      return await operation();\n    } catch (error) {\n      lastError = error;\n      if (!isRecoverableError(error) || attempt === maxRetries) {\n        handleServiceError(error, context, errorCallback);\n        return null;\n      }\n      CometChatLogger.warn(\n        'MessageHeaderService',\n        `${context} failed (attempt ${attempt + 1}/${maxRetries + 1}), retrying...`\n      );\n      await delay(retryDelayMs * Math.pow(2, attempt));\n    }\n  }\n  handleServiceError(lastError, context, errorCallback);\n  return null;\n}\n\n// ─── Typing Users Map Helpers ─────────────────────────────────────────────────\n\nexport interface TypingUserEntry {\n  user: CometChat.User;\n  timestamp: number;\n}\n\nexport function addTypingUser(\n  map: Map<string, TypingUserEntry>,\n  userId: string,\n  user: CometChat.User\n): void {\n  map.set(userId, { user, timestamp: Date.now() });\n}\n\nexport function removeTypingUserFromMap(\n  map: Map<string, TypingUserEntry>,\n  userId: string\n): boolean {\n  return map.delete(userId);\n}\n\nexport function getTypingUsersArray(map: Map<string, TypingUserEntry>): CometChat.User[] {\n  return Array.from(map.values()).map(e => e.user);\n}\n\n// ─── Typing Relevance Check ───────────────────────────────────────────────────\n\nexport function isTypingEventRelevant(\n  typingIndicator: CometChat.TypingIndicator,\n  entityId: string,\n  entityType: 'user' | 'group'\n): boolean {\n  const receiverId = typingIndicator.getReceiverId();\n  const receiverType = typingIndicator.getReceiverType();\n  const senderId = typingIndicator.getSender()?.getUid();\n\n  if (entityType === 'user') {\n    return senderId === entityId;\n  }\n  return receiverType === CometChat.RECEIVER_TYPE.GROUP && receiverId === entityId;\n}\n","import { DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport type { ErrorCallback } from './message-header.types';\nimport {\n  addUserStatusListener,\n  removeUserStatusListener,\n  addTypingListener,\n  removeTypingListener,\n  addGroupMemberListener,\n  removeGroupMemberListener,\n  addConnectionListener,\n  removeConnectionListener,\n} from './message-header.listeners';\nimport {\n  handleServiceError,\n  executeWithRetry,\n  isTypingEventRelevant,\n  addTypingUser,\n  removeTypingUserFromMap,\n  getTypingUsersArray,\n  type TypingUserEntry,\n} from './message-header.utils';\n\n// Re-export types for backward compatibility\nexport type { ErrorCallback } from './message-header.types';\n\n/**\n * MessageHeaderService\n *\n * Service responsible for managing message header state and SDK interactions.\n * Implements the Hybrid Approach pattern where service provides defaults\n * but component @Input properties can override them.\n *\n * Uses Angular Signals for reactive state management.\n *\n * @Injectable\n * @see Requirements 14.1, 14.2, 14.3, 14.4, 14.5\n */\n@Injectable()\nexport class MessageHeaderService {\n  // ==================== Listener IDs ====================\n  private userListenerId = `message_header_user_${Date.now()}`;\n  private messageListenerId = `message_header_message_${Date.now()}`;\n  private groupListenerId = `message_header_group_${Date.now()}`;\n  private connectionListenerId = `message_header_connection_${Date.now()}`;\n\n  // ==================== Typing Configuration ====================\n  private typingTimeout?: ReturnType<typeof setTimeout>;\n  private readonly TYPING_TIMEOUT_MS = 2000;\n  private currentTypingEntityId: string | null = null;\n  private currentTypingEntityType: 'user' | 'group' | null = null;\n  private currentGroupId: string | null = null;\n  private typingUsersMap = new Map<string, TypingUserEntry>();\n\n  // ==================== State Signals ====================\n  private userSignal = signal<CometChat.User | null>(null);\n  private groupSignal = signal<CometChat.Group | null>(null);\n  private userStatusSignal = signal<string>('offline');\n  private typingIndicatorSignal = signal<CometChat.TypingIndicator | null>(null);\n  private typingUsersSignal = signal<CometChat.User[]>([]);\n  private groupMemberCountSignal = signal<number>(0);\n  private lastActiveAtSignal = signal<number | null>(null);\n  private connectionStatusSignal = signal<'connected' | 'disconnected'>('connected');\n\n  // ==================== Error Handling ====================\n  private errorCallback: ErrorCallback | null = null;\n\n  // ==================== Public Signal API (read-only) ====================\n  readonly user = this.userSignal.asReadonly();\n  readonly group = this.groupSignal.asReadonly();\n  readonly userStatus = this.userStatusSignal.asReadonly();\n  readonly typingIndicator = this.typingIndicatorSignal.asReadonly();\n  readonly typingUsers = this.typingUsersSignal.asReadonly();\n  readonly groupMemberCount = this.groupMemberCountSignal.asReadonly();\n  readonly lastActiveAt = this.lastActiveAtSignal.asReadonly();\n  readonly connectionStatus = this.connectionStatusSignal.asReadonly();\n\n  private destroyRef = inject(DestroyRef);\n\n  constructor() {\n    this.destroyRef.onDestroy(() => {\n      try {\n        this.removeAllListeners();\n        this.resetState();\n      } catch (error) {\n        CometChatLogger.error('MessageHeaderService', 'Error during DestroyRef cleanup:', error);\n      }\n    });\n  }\n\n  // ==================== Error Callback ====================\n\n  setErrorCallback(callback: ErrorCallback | null): void {\n    this.errorCallback = callback;\n  }\n\n  private handleError(error: unknown, context: string): void {\n    handleServiceError(error, context, this.errorCallback);\n  }\n\n  // ==================== Public State Methods ====================\n\n  setUser(user: CometChat.User): void {\n    try {\n      if (!user) throw new Error('User object is required');\n      this.groupSignal.set(null);\n      this.groupMemberCountSignal.set(0);\n      this.userSignal.set(user);\n      this.userStatusSignal.set(user.getStatus?.() || 'offline');\n      this.lastActiveAtSignal.set(user.getLastActiveAt?.() || null);\n      this.typingIndicatorSignal.set(null);\n      this.typingUsersMap.clear();\n      this.typingUsersSignal.set([]);\n    } catch (error) { this.handleError(error, 'Error setting user'); }\n  }\n\n  setGroup(group: CometChat.Group): void {\n    try {\n      if (!group) throw new Error('Group object is required');\n      this.userSignal.set(null);\n      this.userStatusSignal.set('offline');\n      this.lastActiveAtSignal.set(null);\n      this.groupSignal.set(group);\n      this.groupMemberCountSignal.set(group.getMembersCount?.() || 0);\n      this.typingIndicatorSignal.set(null);\n      this.typingUsersMap.clear();\n      this.typingUsersSignal.set([]);\n    } catch (error) { this.handleError(error, 'Error setting group'); }\n  }\n\n  updateUserStatus(status: string): void { this.userStatusSignal.set(status); }\n  updateLastActiveAt(timestamp: number | null): void { this.lastActiveAtSignal.set(timestamp); }\n  setTypingIndicator(typingIndicator: CometChat.TypingIndicator | null): void { this.typingIndicatorSignal.set(typingIndicator); }\n  updateGroupMemberCount(count: number): void { this.groupMemberCountSignal.set(count); }\n  incrementGroupMemberCount(): void { this.groupMemberCountSignal.set(this.groupMemberCountSignal() + 1); }\n  decrementGroupMemberCount(): void { this.groupMemberCountSignal.set(Math.max(0, this.groupMemberCountSignal() - 1)); }\n\n  resetState(): void {\n    try {\n      this.userSignal.set(null);\n      this.groupSignal.set(null);\n      this.userStatusSignal.set('offline');\n      this.typingIndicatorSignal.set(null);\n      this.typingUsersMap.clear();\n      this.typingUsersSignal.set([]);\n      this.groupMemberCountSignal.set(0);\n      this.lastActiveAtSignal.set(null);\n      this.connectionStatusSignal.set('connected');\n      this.errorCallback = null;\n    } catch (error) {\n      CometChatLogger.error('MessageHeaderService', 'Error resetting state:', error);\n    }\n  }\n\n  // ==================== Listener Setup ====================\n\n  setupListeners(entityId: string, entityType: 'user' | 'group'): void {\n    try {\n      if (!entityId) throw new Error('Entity ID is required for setting up listeners');\n      this.removeAllListeners();\n      if (entityType === 'user') {\n        this.setupUserStatusListener(entityId);\n        this.setupTypingListener(entityId, 'user');\n      } else {\n        this.setupGroupMemberListener(entityId);\n        this.setupTypingListener(entityId, 'group');\n      }\n      this.setupConnectionListener();\n    } catch (error) { this.handleError(error, 'Error setting up listeners'); }\n  }\n\n  setupUserStatusListener(userId: string): void {\n    try {\n      if (!userId) throw new Error('User ID is required for status listener');\n      removeUserStatusListener(this.userListenerId);\n      addUserStatusListener(\n        this.userListenerId,\n        (user) => this.handleUserStatusChange(user, 'online'),\n        (user) => this.handleUserStatusChange(user, 'offline')\n      );\n    } catch (error) { this.handleError(error, 'Error setting up user status listener'); }\n  }\n\n  setupTypingListener(entityId: string, entityType: 'user' | 'group'): void {\n    try {\n      if (!entityId) throw new Error('Entity ID is required for typing listener');\n      this.currentTypingEntityId = entityId;\n      this.currentTypingEntityType = entityType;\n      removeTypingListener(this.messageListenerId);\n      this.clearTypingTimeout();\n      this.typingIndicatorSignal.set(null);\n      addTypingListener(\n        this.messageListenerId,\n        (indicator) => this.handleTypingStarted(indicator),\n        (indicator) => this.handleTypingEnded(indicator)\n      );\n    } catch (error) { this.handleError(error, 'Error setting up typing listener'); }\n  }\n\n  setupGroupMemberListener(groupId: string): void {\n    try {\n      if (!groupId) throw new Error('Group ID is required for member listener');\n      this.currentGroupId = groupId;\n      removeGroupMemberListener(this.groupListenerId);\n      addGroupMemberListener(this.groupListenerId, {\n        onJoined: (_, __, g) => this.handleGroupMemberJoined(g),\n        onLeft: (_, __, g) => this.handleGroupMemberLeft(g),\n        onKicked: (_, __, ___, g) => this.handleGroupMemberKicked(g),\n        onBanned: (_, __, ___, g) => this.handleGroupMemberBanned(g),\n        onAdded: (_, __, ___, g) => this.handleMemberAddedToGroup(g),\n        onScopeChanged: (_m, _u, _ns, _os, _g) => { /* scope changes don't affect member count */ },\n      });\n    } catch (error) { this.handleError(error, 'Error setting up group member listener'); }\n  }\n\n  setupConnectionListener(): void {\n    try {\n      removeConnectionListener(this.connectionListenerId);\n      addConnectionListener(\n        this.connectionListenerId,\n        () => this.handleConnected(),\n        () => this.handleDisconnected()\n      );\n    } catch (error) { this.handleError(error, 'Error setting up connection listener'); }\n  }\n\n  // ==================== Listener Removal ====================\n\n  removeUserStatusListener(): void {\n    try { removeUserStatusListener(this.userListenerId); }\n    catch (e) { CometChatLogger.error('MessageHeaderService', 'Error removing user status listener:', e); }\n  }\n\n  removeTypingListener(): void {\n    try {\n      removeTypingListener(this.messageListenerId);\n      this.clearTypingTimeout();\n      this.typingIndicatorSignal.set(null);\n      this.typingUsersMap.clear();\n      this.typingUsersSignal.set([]);\n      this.currentTypingEntityId = null;\n      this.currentTypingEntityType = null;\n    } catch (e) { CometChatLogger.error('MessageHeaderService', 'Error removing typing listener:', e); }\n  }\n\n  removeGroupMemberListener(): void {\n    try { removeGroupMemberListener(this.groupListenerId); this.currentGroupId = null; }\n    catch (e) { CometChatLogger.error('MessageHeaderService', 'Error removing group member listener:', e); }\n  }\n\n  removeConnectionListener(): void {\n    try { removeConnectionListener(this.connectionListenerId); }\n    catch (e) { CometChatLogger.error('MessageHeaderService', 'Error removing connection listener:', e); }\n  }\n\n  private removeAllListeners(): void {\n    try {\n      this.removeUserStatusListener();\n      this.removeTypingListener();\n      this.removeGroupMemberListener();\n      this.removeConnectionListener();\n    } catch (e) { CometChatLogger.error('MessageHeaderService', 'Error removing all listeners:', e); }\n  }\n\n  cleanup(): void {\n    try { this.removeAllListeners(); this.resetState(); }\n    catch (e) { CometChatLogger.error('MessageHeaderService', 'Error during cleanup:', e); }\n  }\n\n  // ==================== Private Event Handlers ====================\n\n  private handleUserStatusChange(user: CometChat.User, status: 'online' | 'offline'): void {\n    try {\n      const current = this.userSignal();\n      if (current && current.getUid() === user.getUid()) {\n        this.userStatusSignal.set(status);\n        if (status === 'offline') {\n          this.lastActiveAtSignal.set(user.getLastActiveAt?.() || Date.now());\n        } else {\n          this.lastActiveAtSignal.set(null);\n        }\n      }\n    } catch (e) { this.handleError(e, 'Error handling user status change'); }\n  }\n\n  private handleTypingStarted(typingIndicator: CometChat.TypingIndicator): void {\n    try {\n      if (!this.currentTypingEntityId || !this.currentTypingEntityType) return;\n      if (!isTypingEventRelevant(typingIndicator, this.currentTypingEntityId, this.currentTypingEntityType)) return;\n\n      this.clearTypingTimeout();\n      this.typingIndicatorSignal.set(typingIndicator);\n\n      const sender = typingIndicator.getSender();\n      const senderId = sender?.getUid();\n      if (this.currentTypingEntityType === 'group' && sender && senderId) {\n        addTypingUser(this.typingUsersMap, senderId, sender);\n        this.typingUsersSignal.set(getTypingUsersArray(this.typingUsersMap));\n        setTimeout(() => {\n          if (removeTypingUserFromMap(this.typingUsersMap, senderId)) {\n            this.typingUsersSignal.set(getTypingUsersArray(this.typingUsersMap));\n          }\n        }, this.TYPING_TIMEOUT_MS);\n      }\n\n      this.typingTimeout = setTimeout(() => {\n        this.typingIndicatorSignal.set(null);\n        if (this.currentTypingEntityType === 'group') {\n          this.typingUsersMap.clear();\n          this.typingUsersSignal.set([]);\n        }\n      }, this.TYPING_TIMEOUT_MS);\n    } catch (e) { this.handleError(e, 'Error handling typing started'); }\n  }\n\n  private handleTypingEnded(typingIndicator: CometChat.TypingIndicator): void {\n    try {\n      if (!this.currentTypingEntityId || !this.currentTypingEntityType) return;\n      if (!isTypingEventRelevant(typingIndicator, this.currentTypingEntityId, this.currentTypingEntityType)) return;\n\n      const senderId = typingIndicator.getSender()?.getUid();\n      if (this.currentTypingEntityType === 'group' && senderId) {\n        removeTypingUserFromMap(this.typingUsersMap, senderId);\n        this.typingUsersSignal.set(getTypingUsersArray(this.typingUsersMap));\n        if (this.typingUsersMap.size === 0) {\n          this.clearTypingTimeout();\n          this.typingIndicatorSignal.set(null);\n        }\n      } else {\n        this.clearTypingTimeout();\n        this.typingIndicatorSignal.set(null);\n      }\n    } catch (e) { this.handleError(e, 'Error handling typing ended'); }\n  }\n\n  private clearTypingTimeout(): void {\n    if (this.typingTimeout) { clearTimeout(this.typingTimeout); this.typingTimeout = undefined; }\n  }\n\n  /** Increment count if the event is for the current group. */\n  private handleGroupMemberJoined(group: CometChat.Group): void {\n    if (this.currentGroupId && group.getGuid() === this.currentGroupId) this.incrementGroupMemberCount();\n  }\n\n  /** Decrement count if the event is for the current group. */\n  private handleGroupMemberLeft(group: CometChat.Group): void {\n    if (this.currentGroupId && group.getGuid() === this.currentGroupId) this.decrementGroupMemberCount();\n  }\n\n  private handleGroupMemberKicked(group: CometChat.Group): void {\n    if (this.currentGroupId && group.getGuid() === this.currentGroupId) this.decrementGroupMemberCount();\n  }\n\n  private handleGroupMemberBanned(group: CometChat.Group): void {\n    if (this.currentGroupId && group.getGuid() === this.currentGroupId) this.decrementGroupMemberCount();\n  }\n\n  private handleMemberAddedToGroup(group: CometChat.Group): void {\n    if (this.currentGroupId && group.getGuid() === this.currentGroupId) this.incrementGroupMemberCount();\n  }\n\n  private handleConnected(): void {\n    try {\n      this.connectionStatusSignal.set('connected');\n      const currentUser = this.userSignal();\n      if (currentUser) this.refreshUserStatus(currentUser.getUid());\n    } catch (e) { this.handleError(e, 'Error handling connected event'); }\n  }\n\n  private handleDisconnected(): void {\n    try { this.connectionStatusSignal.set('disconnected'); }\n    catch (e) { this.handleError(e, 'Error handling disconnected event'); }\n  }\n\n  private async refreshUserStatus(userId: string): Promise<void> {\n    const result = await executeWithRetry(\n      async () => CometChat.getUser(userId),\n      'Error refreshing user status',\n      this.errorCallback\n    );\n    if (result) {\n      try {\n        const status = result.getStatus?.();\n        this.userStatusSignal.set(status || 'offline');\n        this.lastActiveAtSignal.set(status === 'offline' ? (result.getLastActiveAt?.() || null) : null);\n      } catch (e) { this.handleError(e, 'Error processing refreshed user status'); }\n    }\n  }\n}\n","/**\n * Helpers for the UI Kit-owned message metadata keys (`batchId`, `audioType`).\n *\n * These are the ONLY places the raw key/value strings should appear — routing, sending and\n * grouping all go through here so the wire format stays consistent with the React, iOS and\n * Android kits.\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatUIKitConstants } from '../constants';\n\ntype MetadataBearer = { getMetadata?: () => Record<string, unknown> | null };\n\n/** Read a message's metadata object, tolerating messages that predate/lack the method. */\nexport function readMetadata(\n  message: CometChat.BaseMessage | null | undefined\n): Record<string, unknown> | null {\n  if (!message) {\n    return null;\n  }\n  try {\n    return (message as unknown as MetadataBearer).getMetadata?.() ?? null;\n  } catch {\n    return null;\n  }\n}\n\n/** Read the `batchId` grouping key, or `null` when the message is not part of a batch. */\nexport function getBatchId(message: CometChat.BaseMessage | null | undefined): string | null {\n  const value = readMetadata(message)?.[CometChatUIKitConstants.MetadataKeys.batchId];\n  return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\n/** Read the raw `audioType` tag, or `undefined` when absent. */\nexport function getAudioType(\n  message: CometChat.BaseMessage | null | undefined\n): string | undefined {\n  const value = readMetadata(message)?.[CometChatUIKitConstants.MetadataKeys.audioType];\n  return typeof value === 'string' ? value : undefined;\n}\n\n/**\n * Whether an audio message should render as a voice note (waveform) rather than a plain\n * audio bubble.\n *\n * Accepts BOTH the cross-platform `voice_note` value and the legacy camelCase `voiceNote`\n * this kit used to write, so voice notes already persisted in a conversation keep rendering\n * correctly. Absence of the tag is NOT a voice note.\n */\nexport function isVoiceNote(message: CometChat.BaseMessage | null | undefined): boolean {\n  const value = getAudioType(message);\n  return (\n    value === CometChatUIKitConstants.AudioType.voiceNote ||\n    value === CometChatUIKitConstants.AudioType.legacyVoiceNote\n  );\n}\n\n/** The four media message types that can carry a caption. */\nconst MEDIA_TYPES: readonly string[] = [\n  CometChatUIKitConstants.MessageTypes.image,\n  CometChatUIKitConstants.MessageTypes.video,\n  CometChatUIKitConstants.MessageTypes.audio,\n  CometChatUIKitConstants.MessageTypes.file,\n];\n\n/** Whether the message is an image/video/audio/file message in the `message` category. */\nexport function isMediaMessage(message: CometChat.BaseMessage | null | undefined): boolean {\n  if (!message) {\n    return false;\n  }\n  return (\n    message.getCategory() === CometChatUIKitConstants.MessageCategory.message &&\n    MEDIA_TYPES.includes(message.getType())\n  );\n}\n\n/**\n * The caption of a media message, or `''` when it has none. Mirrors the React kit: `getCaption()`\n * first, then `getData().text` for messages whose caption only round-trips through `data`.\n */\nexport function getMediaCaption(message: CometChat.BaseMessage | null | undefined): string {\n  if (!message) {\n    return '';\n  }\n  try {\n    const mediaMessage = message as CometChat.MediaMessage;\n    const caption = mediaMessage.getCaption?.();\n    if (typeof caption === 'string' && caption.trim().length > 0) {\n      return caption;\n    }\n    const data = mediaMessage.getData?.() as { text?: unknown } | null | undefined;\n    const text = data?.text;\n    return typeof text === 'string' ? text : '';\n  } catch {\n    return '';\n  }\n}\n\n/** True when the message is media AND carries a non-blank caption (gates Copy/Edit, per React). */\nexport function hasMediaCaption(message: CometChat.BaseMessage | null | undefined): boolean {\n  return isMediaMessage(message) && getMediaCaption(message).trim().length > 0;\n}\n\n/**\n * Merge UI Kit metadata onto a message without dropping keys the SDK or the app already set\n * (a bare `setMetadata({ batchId })` would clobber them). Sets the caption via `setCaption`.\n */\n/**\n * Record a send failure ON the message, so the bubble can render it.\n *\n * The message bubble decides its error tick (and the permission-denied notice) from\n * `message.error` — see its `messageError`/`hasMessageError` getters. Emitting\n * `ccMessageSent` with `MessageStatus.error` is NOT enough on its own: the list swaps the pending\n * bubble for this same object, so an unmarked message re-renders identically and sits on the\n * pending clock forever.\n *\n * `error` is not part of BaseMessage's public shape, hence the cast — the bubble reads it the same\n * loose way (`m.error || m.getMetadata?.()?.error`).\n */\nexport function markMessageFailed(message: CometChat.BaseMessage, error: unknown): void {\n  const err = error as { code?: string; message?: string } | undefined;\n  (message as unknown as { error: { code?: string; message?: string } }).error = {\n    code: err?.code ?? 'ERR_MESSAGE_SEND_FAILED',\n    message: err?.message ?? String(error ?? ''),\n  };\n}\n\nexport function stampBatchMetadata(\n  message: CometChat.BaseMessage,\n  options: { batchId?: string; audioType?: string; caption?: string }\n): void {\n  const mediaMessage = message as CometChat.MediaMessage;\n  const metadata: Record<string, unknown> = { ...(readMetadata(message) ?? {}) };\n\n  if (options.batchId !== undefined) {\n    metadata[CometChatUIKitConstants.MetadataKeys.batchId] = options.batchId;\n  }\n  if (options.audioType !== undefined) {\n    metadata[CometChatUIKitConstants.MetadataKeys.audioType] = options.audioType;\n  }\n  mediaMessage.setMetadata(metadata);\n\n  if (options.caption !== undefined) {\n    mediaMessage.setCaption(options.caption);\n  }\n}\n","/**\n * Utility helpers for MessageComposerService.\n * Contains error handling, mention fetching observables, and pagination helpers.\n */\n\nimport { Observable } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport type { ErrorCallback, MentionSuggestion } from './message-composer.types';\n\n// ─── Error Helpers ────────────────────────────────────────────────────────────\n\nexport function toCometchatException(error: unknown, context: string): CometChat.CometChatException {\n  if (error instanceof CometChat.CometChatException) return error;\n  if (error instanceof Error) {\n    return new CometChat.CometChatException({\n      code: 'COMPOSER_ERROR',\n      message: `${context}: ${error.message}`,\n      details: error.stack || '',\n    });\n  }\n  return new CometChat.CometChatException({\n    code: 'UNKNOWN_ERROR',\n    message: `${context}: ${String(error)}`,\n    details: '',\n  });\n}\n\nexport function handleComposerError(\n  error: unknown,\n  context: string,\n  errorCallback: ErrorCallback | null\n): void {\n  CometChatLogger.error('MessageComposerService', `${context}:`, error);\n  if (errorCallback) {\n    errorCallback(toCometchatException(error, context));\n  }\n}\n\n// ─── Receiver Helpers ─────────────────────────────────────────────────────────\n\nexport function getReceiverId(receiver: CometChat.User | CometChat.Group): string {\n  return receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n}\n\nexport function getReceiverType(receiver: CometChat.User | CometChat.Group): string {\n  return receiver instanceof CometChat.User\n    ? CometChat.RECEIVER_TYPE.USER\n    : CometChat.RECEIVER_TYPE.GROUP;\n}\n\n// ─── Mention Fetch Observables ────────────────────────────────────────────────\n\n/**\n * Fetch users for mention suggestions as an Observable.\n */\nexport function fetchUsersForMention(\n  searchText: string,\n  customRequestBuilder?: CometChat.UsersRequestBuilder\n): Observable<MentionSuggestion[]> {\n  return new Observable<MentionSuggestion[]>(observer => {\n    let requestBuilder: CometChat.UsersRequestBuilder;\n    if (customRequestBuilder) {\n      requestBuilder = searchText\n        ? customRequestBuilder.setSearchKeyword(searchText)\n        : customRequestBuilder;\n    } else {\n      requestBuilder = new CometChat.UsersRequestBuilder().setLimit(20);\n      if (searchText) requestBuilder = requestBuilder.setSearchKeyword(searchText);\n    }\n\n    requestBuilder\n      .build()\n      .fetchNext()\n      .then((users: CometChat.User[]) => {\n        observer.next(\n          users.map(user => ({\n            uid: user.getUid(),\n            name: user.getName(),\n            avatar: user.getAvatar(),\n            isAllMention: false,\n            entity: user,\n          }))\n        );\n        observer.complete();\n      })\n      .catch((error: unknown) => observer.error(error));\n  });\n}\n\n/**\n * Fetch group members for mention suggestions as an Observable.\n */\nexport function fetchGroupMembersForMention(\n  group: CometChat.Group,\n  searchText: string,\n  customRequestBuilder?: CometChat.GroupMembersRequestBuilder,\n  disableMentionAll = false,\n  mentionAllLabel = 'all'\n): Observable<MentionSuggestion[]> {\n  return new Observable<MentionSuggestion[]>(observer => {\n    let requestBuilder: CometChat.GroupMembersRequestBuilder;\n    if (customRequestBuilder) {\n      requestBuilder = searchText\n        ? customRequestBuilder.setSearchKeyword(searchText)\n        : customRequestBuilder;\n    } else {\n      requestBuilder = new CometChat.GroupMembersRequestBuilder(group.getGuid()).setLimit(20);\n      if (searchText) requestBuilder = requestBuilder.setSearchKeyword(searchText);\n    }\n\n    requestBuilder\n      .build()\n      .fetchNext()\n      .then((members: CometChat.GroupMember[]) => {\n        const suggestions: MentionSuggestion[] = [];\n\n        if (\n          !disableMentionAll &&\n          (!searchText || mentionAllLabel.toLowerCase().includes(searchText.toLowerCase()))\n        ) {\n          suggestions.push({ uid: 'all', name: mentionAllLabel, isAllMention: true });\n        }\n\n        members.forEach(member => {\n          suggestions.push({\n            uid: member.getUid(),\n            name: member.getName(),\n            avatar: member.getAvatar(),\n            isAllMention: false,\n            entity: member,\n          });\n        });\n\n        observer.next(suggestions);\n        observer.complete();\n      })\n      .catch((error: unknown) => observer.error(error));\n  });\n}\n\n// ─── Pagination Request Builder ───────────────────────────────────────────────\n\n/**\n * Build a pagination request for mentions (users or group members).\n * Returns the built request object ready for fetchNext() calls.\n */\nexport function buildMentionsPaginationRequest(\n  searchText: string,\n  group?: CometChat.Group,\n  customUsersRequestBuilder?: CometChat.UsersRequestBuilder,\n  customGroupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder\n): CometChat.UsersRequest | CometChat.GroupMembersRequest {\n  if (group) {\n    let builder: CometChat.GroupMembersRequestBuilder;\n    if (customGroupMembersRequestBuilder) {\n      builder = searchText\n        ? customGroupMembersRequestBuilder.setSearchKeyword(searchText)\n        : customGroupMembersRequestBuilder;\n    } else {\n      builder = new CometChat.GroupMembersRequestBuilder(group.getGuid()).setLimit(20);\n      if (searchText) builder = builder.setSearchKeyword(searchText);\n    }\n    return builder.build();\n  } else {\n    let builder: CometChat.UsersRequestBuilder;\n    if (customUsersRequestBuilder) {\n      builder = searchText\n        ? customUsersRequestBuilder.setSearchKeyword(searchText)\n        : customUsersRequestBuilder;\n    } else {\n      builder = new CometChat.UsersRequestBuilder().setLimit(20);\n      if (searchText) builder = builder.setSearchKeyword(searchText);\n    }\n    return builder.build();\n  }\n}\n\n/**\n * Convert raw fetchNext() results to MentionSuggestion array.\n */\nexport function resultsToMentionSuggestions(\n  results: CometChat.User[] | CometChat.GroupMember[],\n  isGroupContext: boolean\n): MentionSuggestion[] {\n  if (isGroupContext) {\n    return (results as CometChat.GroupMember[]).map(member => ({\n      uid: member.getUid(),\n      name: member.getName(),\n      avatar: member.getAvatar(),\n      isAllMention: false,\n      entity: member,\n    }));\n  }\n  return (results as CometChat.User[]).map(user => ({\n    uid: user.getUid(),\n    name: user.getName(),\n    avatar: user.getAvatar(),\n    isAllMention: false,\n    entity: user,\n  }));\n}\n","import { Injectable, signal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { Subject, debounceTime, switchMap, of, catchError } from 'rxjs';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { isMediaMessage } from '../utils/message-metadata-utils';\nimport type { ErrorCallback, MentionSuggestion, PollCreatePayload, CollaborativePayload } from './message-composer.types';\nimport {\n  handleComposerError,\n  getReceiverId,\n  getReceiverType,\n  fetchUsersForMention,\n  fetchGroupMembersForMention,\n  buildMentionsPaginationRequest,\n  resultsToMentionSuggestions,\n} from './message-composer.utils';\n\n// Re-export types for backward compatibility\nexport type { ErrorCallback, MentionSuggestion, PollCreatePayload, CollaborativePayload } from './message-composer.types';\n\n/**\n * MessageComposerService\n *\n * Manages message composer state and SDK interactions.\n * Handles sending text/media messages, editing, typing indicators,\n * file upload progress, and mention suggestions.\n *\n * @Injectable — provided at component level via CometChatMessageComposerComponent providers\n * @see Requirements 29.1–29.10\n */\n@Injectable()\nexport class MessageComposerService {\n  // ==================== State Signals ====================\n  private isSendingSignal = signal<boolean>(false);\n  private uploadProgressSignal = signal<Map<string, number>>(new Map());\n  private isRecordingSignal = signal<boolean>(false);\n  private recordingDurationSignal = signal<number>(0);\n  private mentionSuggestionsSignal = signal<MentionSuggestion[]>([]);\n  private isFetchingMentionsSignal = signal<boolean>(false);\n  private isFetchingMoreMentionsSignal = signal<boolean>(false);\n  private hasMoreMentionsSignal = signal<boolean>(true);\n  private mentionsPaginationRequest: any = null;\n\n  private mentionSearchSubject = new Subject<{\n    searchText: string;\n    group?: CometChat.Group;\n    usersRequestBuilder?: CometChat.UsersRequestBuilder;\n    groupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder;\n    disableMentionAll?: boolean;\n    mentionAllLabel?: string;\n  }>();\n\n  private mentionSearchSubscription: import('rxjs').Subscription | null = null;\n\n  // ==================== Public Read-Only Signals ====================\n  readonly isSending = this.isSendingSignal.asReadonly();\n  readonly uploadProgress = this.uploadProgressSignal.asReadonly();\n  readonly isRecording = this.isRecordingSignal.asReadonly();\n  readonly recordingDuration = this.recordingDurationSignal.asReadonly();\n  readonly mentionSuggestions = this.mentionSuggestionsSignal.asReadonly();\n  readonly isFetchingMentions = this.isFetchingMentionsSignal.asReadonly();\n  readonly isFetchingMoreMentions = this.isFetchingMoreMentionsSignal.asReadonly();\n  readonly hasMoreMentions = this.hasMoreMentionsSignal.asReadonly();\n\n  private errorCallback: ErrorCallback | null = null;\n\n  constructor() {\n    this.setupMentionSearchSubscription();\n  }\n\n  private setupMentionSearchSubscription(): void {\n    this.mentionSearchSubscription = this.mentionSearchSubject\n      .pipe(\n        debounceTime(150),\n        switchMap(({ searchText, group, usersRequestBuilder, groupMembersRequestBuilder, disableMentionAll, mentionAllLabel }) => {\n          this.isFetchingMentionsSignal.set(true);\n          if (group) {\n            return fetchGroupMembersForMention(group, searchText, groupMembersRequestBuilder, disableMentionAll, mentionAllLabel).pipe(\n              catchError(error => { this.handleError(error, 'Error fetching group members for mention'); return of([]); })\n            );\n          }\n          return fetchUsersForMention(searchText, usersRequestBuilder).pipe(\n            catchError(error => { this.handleError(error, 'Error fetching users for mention'); return of([]); })\n          );\n        })\n      )\n      .subscribe(suggestions => {\n        this.mentionSuggestionsSignal.set(suggestions);\n        this.isFetchingMentionsSignal.set(false);\n      });\n  }\n\n  // ==================== Error Callback ====================\n\n  setErrorCallback(callback: ErrorCallback | null): void { this.errorCallback = callback; }\n\n  private handleError(error: unknown, context: string): void {\n    handleComposerError(error, context, this.errorCallback);\n  }\n\n  // ==================== Message Sending ====================\n\n  async sendTextMessage(\n    receiver: CometChat.User | CometChat.Group,\n    text: string,\n    metadata?: Record<string, unknown>,\n    parentMessageId?: number,\n    quotedMessage?: CometChat.BaseMessage,\n    message?: CometChat.TextMessage\n  ): Promise<CometChat.TextMessage | null> {\n    if (!receiver && !message) { this.handleError(new Error('Receiver is required'), 'sendTextMessage'); return null; }\n    try {\n      this.isSendingSignal.set(true);\n      let textMessage: CometChat.TextMessage;\n      if (message) {\n        textMessage = message;\n      } else {\n        textMessage = new CometChat.TextMessage(getReceiverId(receiver), text, getReceiverType(receiver));\n        if (metadata) textMessage.setMetadata(metadata);\n        if (parentMessageId) textMessage.setParentMessageId(parentMessageId);\n        if (quotedMessage) { textMessage.setQuotedMessage(quotedMessage); textMessage.setQuotedMessageId(quotedMessage.getId()); }\n      }\n      return (await CometChat.sendMessage(textMessage)) as CometChat.TextMessage;\n    } catch (error) { this.handleError(error, 'Error sending text message'); return null; }\n    finally { this.isSendingSignal.set(false); }\n  }\n\n  async sendMediaMessage(\n    receiver: CometChat.User | CometChat.Group,\n    file: File,\n    type: string,\n    metadata?: Record<string, unknown>,\n    parentMessageId?: number,\n    quotedMessage?: CometChat.BaseMessage,\n    message?: CometChat.MediaMessage\n  ): Promise<CometChat.MediaMessage | null> {\n    if (!receiver && !message) { this.handleError(new Error('Receiver is required'), 'sendMediaMessage'); return null; }\n    try {\n      this.isSendingSignal.set(true);\n      let mediaMessage: CometChat.MediaMessage;\n      if (message) {\n        mediaMessage = message;\n      } else {\n        mediaMessage = new CometChat.MediaMessage(getReceiverId(receiver), file, type, getReceiverType(receiver));\n        if (metadata) mediaMessage.setMetadata(metadata);\n        if (parentMessageId) mediaMessage.setParentMessageId(parentMessageId);\n        if (quotedMessage) { mediaMessage.setQuotedMessage(quotedMessage); mediaMessage.setQuotedMessageId(quotedMessage.getId()); }\n      }\n      return (await CometChat.sendMediaMessage(mediaMessage)) as CometChat.MediaMessage;\n    } catch (error) { this.handleError(error, 'Error sending media message'); return null; }\n    finally { this.isSendingSignal.set(false); }\n  }\n\n  /**\n   * Edit a message's text. For a media message the edited value is its CAPTION — sending a\n   * MediaMessage shell carrying only the id + caption, since `setText` is meaningless there.\n   */\n  async editMessage(message: CometChat.BaseMessage, newText: string): Promise<CometChat.BaseMessage | null> {\n    try {\n      this.isSendingSignal.set(true);\n      if (isMediaMessage(message)) {\n        const shell = new CometChat.MediaMessage('', null as unknown as object, '', '');\n        shell.setId(message.getId());\n        shell.setCaption(newText);\n        const mentioned = message.getMentionedUsers?.() ?? [];\n        if (mentioned.length > 0) { shell.setMentionedUsers(mentioned); }\n        return await CometChat.editMessage(shell);\n      }\n      const textMessage = message as CometChat.TextMessage;\n      textMessage.setText(newText);\n      return await CometChat.editMessage(textMessage);\n    } catch (error) { this.handleError(error, 'Error editing message'); return null; }\n    finally { this.isSendingSignal.set(false); }\n  }\n\n  async sendStickerMessage(\n    receiver: CometChat.User | CometChat.Group,\n    stickerUrl: string,\n    stickerName: string,\n    parentMessageId?: number,\n    quotedMessage?: CometChat.BaseMessage,\n    message?: CometChat.CustomMessage\n  ): Promise<CometChat.CustomMessage | null> {\n    if (!receiver && !message) { this.handleError(new Error('Receiver is required'), 'sendStickerMessage'); return null; }\n    try {\n      this.isSendingSignal.set(true);\n      let customMessage: CometChat.CustomMessage;\n      if (message) {\n        customMessage = message;\n      } else {\n        customMessage = new CometChat.CustomMessage(getReceiverId(receiver), getReceiverType(receiver), 'extension_sticker', { sticker_url: stickerUrl, sticker_name: stickerName });\n        if (parentMessageId) customMessage.setParentMessageId(parentMessageId);\n        if (quotedMessage) { customMessage.setQuotedMessage(quotedMessage); customMessage.setQuotedMessageId(quotedMessage.getId()); }\n      }\n      return (await CometChat.sendCustomMessage(customMessage)) as CometChat.CustomMessage;\n    } catch (error) { this.handleError(error, 'Error sending sticker message'); return null; }\n    finally { this.isSendingSignal.set(false); }\n  }\n\n  // ==================== Extension API ====================\n\n  async createPoll(question: string, options: string[], receiverId: string, receiverType: string, quotedMessageId?: number): Promise<unknown> {\n    try {\n      const payload: PollCreatePayload = { question, options, receiver: receiverId, receiverType };\n      if (quotedMessageId) payload.quotedMessageId = quotedMessageId;\n      return await CometChat.callExtension('polls', 'POST', 'v2/create', payload);\n    } catch (error) { this.handleError(error, 'Error creating poll'); return null; }\n  }\n\n  async createCollaborativeDocument(receiverId: string, receiverType: string, quotedMessageId?: number): Promise<unknown> {\n    try {\n      const payload: CollaborativePayload = { receiver: receiverId, receiverType };\n      if (quotedMessageId) payload.quotedMessageId = quotedMessageId;\n      return await CometChat.callExtension('document', 'POST', 'v1/create', payload);\n    } catch (error) { this.handleError(error, 'Error creating collaborative document'); return null; }\n  }\n\n  async createCollaborativeWhiteboard(receiverId: string, receiverType: string, quotedMessageId?: number): Promise<unknown> {\n    try {\n      const payload: CollaborativePayload = { receiver: receiverId, receiverType };\n      if (quotedMessageId) payload.quotedMessageId = quotedMessageId;\n      return await CometChat.callExtension('whiteboard', 'POST', 'v1/create', payload);\n    } catch (error) { this.handleError(error, 'Error creating collaborative whiteboard'); return null; }\n  }\n\n  // ==================== Typing Indicators ====================\n\n  startTyping(receiver: CometChat.User | CometChat.Group): void {\n    if (!receiver) { CometChatLogger.error('MessageComposerService', 'startTyping: Receiver is required'); return; }\n    try {\n      const indicator = new CometChat.TypingIndicator(getReceiverId(receiver), getReceiverType(receiver));\n      CometChat.startTyping(indicator);\n    } catch (error) { CometChatLogger.error('MessageComposerService', 'Error starting typing:', error); }\n  }\n\n  endTyping(receiver: CometChat.User | CometChat.Group): void {\n    if (!receiver) { CometChatLogger.error('MessageComposerService', 'endTyping: Receiver is required'); return; }\n    try {\n      const indicator = new CometChat.TypingIndicator(getReceiverId(receiver), getReceiverType(receiver));\n      CometChat.endTyping(indicator);\n    } catch (error) { CometChatLogger.error('MessageComposerService', 'Error ending typing:', error); }\n  }\n\n  // ==================== Upload Progress ====================\n\n  updateUploadProgress(fileId: string, progress: number): void {\n    const map = new Map(this.uploadProgressSignal());\n    map.set(fileId, progress);\n    this.uploadProgressSignal.set(map);\n  }\n\n  clearUploadProgress(fileId: string): void {\n    const map = new Map(this.uploadProgressSignal());\n    map.delete(fileId);\n    this.uploadProgressSignal.set(map);\n  }\n\n  clearAllUploadProgress(): void { this.uploadProgressSignal.set(new Map()); }\n\n  // ==================== Recording State ====================\n\n  setRecordingState(isRecording: boolean): void {\n    this.isRecordingSignal.set(isRecording);\n    if (!isRecording) this.recordingDurationSignal.set(0);\n  }\n\n  updateRecordingDuration(duration: number): void { this.recordingDurationSignal.set(duration); }\n\n  // ==================== Mention Methods ====================\n\n  searchMentions(\n    searchText: string,\n    group?: CometChat.Group,\n    usersRequestBuilder?: CometChat.UsersRequestBuilder,\n    groupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder,\n    disableMentionAll = false,\n    mentionAllLabel = 'all'\n  ): void {\n    this.isFetchingMentionsSignal.set(true);\n    this.mentionSearchSubject.next({ searchText, group, usersRequestBuilder, groupMembersRequestBuilder, disableMentionAll, mentionAllLabel });\n  }\n\n  initializeMentionsPagination(\n    searchText: string,\n    group?: CometChat.Group,\n    customUsersRequestBuilder?: CometChat.UsersRequestBuilder,\n    customGroupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder\n  ): void {\n    this.mentionsPaginationRequest = buildMentionsPaginationRequest(searchText, group, customUsersRequestBuilder, customGroupMembersRequestBuilder);\n    this.hasMoreMentionsSignal.set(true);\n    this.isFetchingMoreMentionsSignal.set(false);\n  }\n\n  async fetchMoreMentions(isGroupContext: boolean): Promise<void> {\n    if (!this.hasMoreMentionsSignal() || this.isFetchingMoreMentionsSignal() || !this.mentionsPaginationRequest) return;\n    this.isFetchingMoreMentionsSignal.set(true);\n    try {\n      const results = await this.mentionsPaginationRequest.fetchNext();\n      const newSuggestions = resultsToMentionSuggestions(results, isGroupContext);\n      this.mentionSuggestionsSignal.set([...this.mentionSuggestionsSignal(), ...newSuggestions]);\n      this.hasMoreMentionsSignal.set(newSuggestions.length >= 20);\n    } catch (error) {\n      this.hasMoreMentionsSignal.set(false);\n      this.handleError(error, 'Error fetching more mentions');\n    } finally { this.isFetchingMoreMentionsSignal.set(false); }\n  }\n\n  appendMentionSuggestions(suggestions: MentionSuggestion[]): void {\n    this.mentionSuggestionsSignal.set([...this.mentionSuggestionsSignal(), ...suggestions]);\n  }\n\n  async checkIfSelfMention(userId: string): Promise<boolean> {\n    try {\n      const loggedInUser = await CometChat.getLoggedinUser();\n      return loggedInUser?.getUid() === userId;\n    } catch (error) { this.handleError(error, 'Error checking self mention'); return false; }\n  }\n\n  clearMentionSuggestions(): void { this.mentionSuggestionsSignal.set([]); }\n\n  stopMentionSearch(): void {\n    this.isFetchingMentionsSignal.set(false);\n    this.isFetchingMoreMentionsSignal.set(false);\n  }\n\n  // ==================== Cleanup ====================\n\n  cleanup(): void {\n    try {\n      this.isSendingSignal.set(false);\n      this.uploadProgressSignal.set(new Map());\n      this.isRecordingSignal.set(false);\n      this.recordingDurationSignal.set(0);\n      this.mentionSuggestionsSignal.set([]);\n      this.isFetchingMentionsSignal.set(false);\n      this.isFetchingMoreMentionsSignal.set(false);\n      this.hasMoreMentionsSignal.set(true);\n      this.mentionsPaginationRequest = null;\n      this.errorCallback = null;\n    } catch (error) { CometChatLogger.error('MessageComposerService', 'Error during cleanup:', error); }\n  }\n}\n","/**\n * ContentEditableManager Class\n *\n * Manages the contenteditable element and DOM operations for the rich text editor.\n * Handles initialization, content operations, and HTML sanitization.\n *\n * @module services/content-editable-manager\n * @see Requirements 6.3, 6.4, 6.5, 8.1, 8.2, 8.3, 8.4, 8.5, 9.4\n */\n\n/**\n * Configuration options for ContentEditableManager initialization\n */\nexport interface ContentEditableConfig {\n  /** Placeholder text to display when editor is empty */\n  placeholder?: string;\n  /** Whether the editor should be editable */\n  editable?: boolean;\n}\n\n/**\n * ContentEditableManager manages a contenteditable element and provides\n * methods for content manipulation, HTML sanitization, and DOM operations.\n *\n * This class is responsible for:\n * - Initializing the contenteditable element with proper attributes\n * - Getting and setting HTML/text content\n * - Sanitizing HTML to prevent XSS attacks\n * - Parsing and serializing HTML\n * - Checking if the editor is empty\n *\n * @example\n * ```typescript\n * const element = document.createElement('div');\n * const manager = new ContentEditableManager(element);\n * manager.initialize({ placeholder: 'Type here...', editable: true });\n * manager.setHTML('<p>Hello world</p>');\n * const html = manager.getHTML();\n * ```\n */\nexport class ContentEditableManager {\n  private element: HTMLElement;\n\n  /**\n   * Whitelist of allowed HTML tags for sanitization\n   * @private\n   */\n  private readonly ALLOWED_TAGS = [\n    'p',\n    'br',\n    'strong',\n    'b',\n    'em',\n    'i',\n    'u',\n    's',\n    'strike',\n    'code',\n    'pre',\n    'blockquote',\n    'ol',\n    'ul',\n    'li',\n    'a',\n    'span',\n    'div',\n  ];\n\n  /**\n   * Whitelist of allowed HTML attributes for sanitization\n   * @private\n   */\n  private readonly ALLOWED_ATTRIBUTES = [\n    'href',\n    'target',\n    'rel',\n    'class',\n    'contenteditable',\n    'data-mention-id',\n    'data-mention-label',\n    'data-mention-self',\n    'data-uid',\n    'data-mention-type',\n    'data-self',\n  ];\n\n  /**\n   * Create a new ContentEditableManager instance\n   * @param element - The contenteditable element to manage\n   */\n  constructor(element: HTMLElement) {\n    this.element = element;\n  }\n\n  // ==================== Setup ====================\n\n  /**\n   * Initialize the contenteditable element with configuration\n   * Sets up ARIA attributes, editable state, and placeholder\n   *\n   * @param config - Configuration options\n   * @see Requirements 6.3, 6.4\n   */\n  initialize(config: ContentEditableConfig): void {\n    // Set contenteditable attribute\n    const editable = config.editable !== false;\n    this.element.contentEditable = editable ? 'true' : 'false';\n\n    // Set ARIA attributes for accessibility\n    this.element.setAttribute('role', 'textbox');\n    this.element.setAttribute('aria-multiline', 'true');\n\n    // Set placeholder if provided\n    if (config.placeholder) {\n      this.element.setAttribute('aria-placeholder', config.placeholder);\n    }\n  }\n\n  // ==================== Content Operations ====================\n\n  /**\n   * Get the HTML content from the editor\n   * Returns the raw innerHTML of the contenteditable element\n   *\n   * @returns HTML string\n   * @see Requirements 9.1\n   */\n  getHTML(): string {\n    return this.element.innerHTML;\n  }\n\n  /**\n   * Get the plain text content from the editor\n   * Converts block-level elements and <br> tags to newlines\n   * to preserve multiline text structure\n   *\n   * @returns Plain text string with newlines preserved\n   * @see Requirements 9.2\n   */\n  getText(): string {\n    return this.extractTextWithNewlines(this.element);\n  }\n\n  /**\n   * Recursively extract text from a node, converting block elements\n   * and <br> tags to newline characters, and inline formatting to markdown.\n   *\n   * @param node - The DOM node to extract text from\n   * @returns Plain text with newlines and markdown formatting\n   * @private\n   */\n  private extractTextWithNewlines(node: Node): string {\n    let result = '';\n\n    for (const child of Array.from(node.childNodes)) {\n      if (child.nodeType === Node.TEXT_NODE) {\n        result += child.textContent || '';\n      } else if (child.nodeType === Node.ELEMENT_NODE) {\n        const el = child as HTMLElement;\n        const tagName = el.tagName.toLowerCase();\n\n        if (tagName === 'br') {\n          result += '\\n';\n        } else if (['p', 'div', 'blockquote', 'pre', 'li'].includes(tagName)) {\n          const content = this.extractTextWithNewlines(el);\n          if (content) {\n            // Add newline before block element if there's already content\n            if (result.length > 0 && !result.endsWith('\\n')) {\n              result += '\\n';\n            }\n            result += content;\n          }\n        } else if (tagName === 'strong' || tagName === 'b') {\n          const content = this.extractTextWithNewlines(el);\n          if (content) result += `**${content}**`;\n        } else if (tagName === 'em' || tagName === 'i') {\n          const content = this.extractTextWithNewlines(el);\n          if (content) result += `*${content}*`;\n        } else if (tagName === 'u') {\n          const content = this.extractTextWithNewlines(el);\n          if (content) result += `__${content}__`;\n        } else if (tagName === 's' || tagName === 'del' || tagName === 'strike') {\n          const content = this.extractTextWithNewlines(el);\n          if (content) result += `~~${content}~~`;\n        } else if (tagName === 'code') {\n          // ENG-35159: Only wrap with backticks if there's actual content.\n          // An empty <code></code> from the formatter should not produce `\\`` markers\n          // that make getText() non-empty, which would falsely activate the send button.\n          const content = this.extractTextWithNewlines(el);\n          if (content) result += `\\`${content}\\``;\n        } else {\n          result += this.extractTextWithNewlines(el);\n        }\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Set the HTML content of the editor\n   * Sanitizes the HTML before setting to prevent XSS attacks\n   *\n   * @param html - HTML string to set\n   * @see Requirements 9.1, 9.4\n   */\n  setHTML(html: string): void {\n    const sanitized = this.sanitizeHTML(html);\n    this.element.innerHTML = sanitized;\n  }\n\n  /**\n   * Clear all content from the editor\n   * Removes all HTML and text content\n   *\n   * @see Requirements 6.5\n   */\n  clear(): void {\n    this.element.innerHTML = '';\n  }\n\n  /**\n   * Check if the editor is empty\n   * Returns true if there is no text content (ignoring whitespace)\n   *\n   * @returns True if editor is empty\n   * @see Requirements 6.3\n   */\n  isEmpty(): boolean {\n    const text = this.getText().trim();\n    return text.length === 0;\n  }\n\n  // ==================== HTML Sanitization ====================\n\n  /**\n   * Sanitize HTML to prevent XSS attacks\n   * Removes script tags, event handlers, and dangerous attributes\n   * Only allows whitelisted tags and attributes\n   *\n   * @param html - HTML string to sanitize\n   * @returns Sanitized HTML string\n   * @see Requirements 9.4\n   */\n  sanitizeHTML(html: string): string {\n    // Use DOMParser instead of innerHTML to prevent script execution during parsing.\n    // Setting innerHTML on a live DOM element executes event handlers (e.g. <img onerror=...>)\n    // immediately during parsing. DOMParser parses inertly without executing scripts.\n    const parser = new DOMParser();\n    const doc = parser.parseFromString(`<body>${html}</body>`, 'text/html');\n    const temp = doc.body;\n\n    // Recursively sanitize all nodes\n    this.sanitizeNode(temp);\n\n    return temp.innerHTML;\n  }\n\n  /**\n   * Recursively sanitize a DOM node and its children\n   * Removes disallowed tags and attributes\n   *\n   * @param node - Node to sanitize\n   * @private\n   */\n  private sanitizeNode(node: Node): void {\n    // Process child nodes first (in reverse to handle removals)\n    const children = Array.from(node.childNodes);\n    for (let i = children.length - 1; i >= 0; i--) {\n      const child = children[i];\n\n      if (child.nodeType === Node.ELEMENT_NODE) {\n        const element = child as Element;\n        const tagName = element.tagName.toLowerCase();\n\n        // Check if tag is allowed\n        if (!this.ALLOWED_TAGS.includes(tagName)) {\n          // For dangerous tags like script, style, remove completely with content\n          if (tagName === 'script' || tagName === 'style' || tagName === 'iframe') {\n            node.removeChild(element);\n          } else {\n            // For other disallowed tags, remove tag but keep content\n            while (element.firstChild) {\n              node.insertBefore(element.firstChild, element);\n            }\n            node.removeChild(element);\n          }\n          continue;\n        }\n\n        // Sanitize attributes\n        this.sanitizeAttributes(element);\n\n        // Recursively sanitize children\n        this.sanitizeNode(element);\n      } else if (child.nodeType === Node.TEXT_NODE) {\n        // Text nodes are safe, keep them\n        continue;\n      } else {\n        // Remove other node types (comments, etc.)\n        node.removeChild(child);\n      }\n    }\n  }\n\n  /**\n   * Sanitize attributes of an element\n   * Removes disallowed attributes and dangerous values\n   *\n   * @param element - Element to sanitize\n   * @private\n   */\n  private sanitizeAttributes(element: Element): void {\n    const attributes = Array.from(element.attributes);\n\n    for (const attr of attributes) {\n      const attrName = attr.name.toLowerCase();\n\n      // Remove event handler attributes (onclick, onload, etc.)\n      if (attrName.startsWith('on')) {\n        element.removeAttribute(attr.name);\n        continue;\n      }\n\n      // Remove disallowed attributes\n      if (!this.ALLOWED_ATTRIBUTES.includes(attrName)) {\n        element.removeAttribute(attr.name);\n        continue;\n      }\n\n      // Sanitize href attributes to prevent javascript: URLs\n      if (attrName === 'href') {\n        const href = attr.value.trim().toLowerCase();\n        if (\n          href.startsWith('javascript:') ||\n          href.startsWith('data:') ||\n          href.startsWith('vbscript:')\n        ) {\n          element.removeAttribute(attr.name);\n        }\n      }\n    }\n  }\n\n  // ==================== DOM Utilities ====================\n\n  /**\n   * Parse HTML string into a DocumentFragment\n   * Useful for inserting HTML content into the editor\n   *\n   * @param html - HTML string to parse\n   * @returns DocumentFragment containing parsed nodes\n   * @see Requirements 8.1, 8.2, 8.3, 8.4, 8.5\n   */\n  parseHTML(html: string): DocumentFragment {\n    const template = document.createElement('template');\n    template.innerHTML = html.trim();\n    return template.content;\n  }\n\n  /**\n   * Serialize a DOM node to HTML string\n   * Converts a node and its children to an HTML string\n   *\n   * @param node - Node to serialize\n   * @returns HTML string\n   * @see Requirements 8.1, 8.2, 8.3, 8.4, 8.5\n   */\n  serializeToHTML(node: Node): string {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      return (node as Element).outerHTML;\n    } else if (node.nodeType === Node.TEXT_NODE) {\n      return node.textContent || '';\n    } else if (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n      const temp = document.createElement('div');\n      temp.appendChild(node.cloneNode(true));\n      return temp.innerHTML;\n    }\n    return '';\n  }\n}\n","/**\n * SelectionManager Class\n *\n * Manages text selection and cursor position for the rich text editor.\n * Provides methods for saving/restoring selection state and manipulating cursor position.\n *\n * @module services/selection-manager\n * @see Requirements 2.8\n */\n\nimport { SelectionState } from './rich-text-editor.interfaces';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * SelectionManager handles all selection-related operations for a contenteditable element.\n *\n * This class is responsible for:\n * - Getting and manipulating the current selection\n * - Saving and restoring selection state\n * - Setting and getting cursor position\n * - Querying selection properties (hasSelection, getSelectedText, etc.)\n * - Utility operations (selectAll, collapseToEnd)\n *\n * @example\n * ```typescript\n * const element = document.querySelector('.editor');\n * const manager = new SelectionManager(element);\n *\n * // Save and restore selection\n * const state = manager.saveSelection();\n * // ... do some operations ...\n * manager.restoreSelection(state);\n *\n * // Set cursor position\n * manager.setCursorPosition('end');\n *\n * // Get selected text\n * const text = manager.getSelectedText();\n * ```\n */\nexport class SelectionManager {\n  private element: HTMLElement;\n\n  /**\n   * Create a new SelectionManager instance\n   * @param element - The contenteditable element to manage selection for\n   */\n  constructor(element: HTMLElement) {\n    this.element = element;\n  }\n\n  // ==================== Selection Operations ====================\n\n  /**\n   * Get the current selection object\n   * Returns null if no selection exists\n   *\n   * @returns Selection object or null\n   * @see Requirements 2.8\n   */\n  getSelection(): Selection | null {\n    return typeof window !== 'undefined' ? window.getSelection() : null;\n  }\n\n  /**\n   * Get the current selection range\n   * Returns null if no selection exists or selection has no ranges\n   *\n   * @returns Range object or null\n   * @see Requirements 2.8\n   */\n  getRange(): Range | null {\n    const selection = this.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return null;\n    }\n    return selection.getRangeAt(0);\n  }\n\n  /**\n   * Save the current selection state\n   * Returns a SelectionState object that can be used to restore the selection later\n   *\n   * @returns SelectionState object\n   * @see Requirements 2.8\n   */\n  saveSelection(): SelectionState {\n    const selection = this.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return {\n        anchorNode: null,\n        anchorOffset: 0,\n        focusNode: null,\n        focusOffset: 0,\n      };\n    }\n\n    return {\n      anchorNode: selection.anchorNode,\n      anchorOffset: selection.anchorOffset,\n      focusNode: selection.focusNode,\n      focusOffset: selection.focusOffset,\n    };\n  }\n\n  /**\n   * Restore a previously saved selection state\n   * Does nothing if the state is invalid (null nodes)\n   *\n   * @param state - SelectionState to restore\n   * @see Requirements 2.8\n   */\n  restoreSelection(state: SelectionState): void {\n    if (!state.anchorNode || !state.focusNode) {\n      return;\n    }\n\n    const selection = this.getSelection();\n    if (!selection) {\n      return;\n    }\n\n    try {\n      const range = document.createRange();\n      range.setStart(state.anchorNode, state.anchorOffset);\n      range.setEnd(state.focusNode, state.focusOffset);\n\n      selection.removeAllRanges();\n      selection.addRange(range);\n    } catch (error) {\n      // Selection restoration can fail if nodes are no longer in the DOM\n      // or if offsets are invalid. Fail silently.\n      CometChatLogger.warn('SelectionManager', 'Failed to restore selection:', error);\n    }\n  }\n\n  // ==================== Cursor Operations ====================\n\n  /**\n   * Set the cursor position in the editor\n   * Supports 'start', 'end', or a numeric character offset\n   *\n   * @param position - Where to place the cursor ('start', 'end', or number)\n   * @see Requirements 2.8\n   */\n  setCursorPosition(position: 'start' | 'end' | number): void {\n    const selection = this.getSelection();\n    if (!selection) {\n      return;\n    }\n\n    const range = document.createRange();\n\n    if (position === 'start') {\n      // Place cursor at the start of the element\n      range.setStart(this.element, 0);\n      range.collapse(true);\n    } else if (position === 'end') {\n      // Place cursor at the end of the element\n      range.selectNodeContents(this.element);\n      range.collapse(false);\n    } else if (typeof position === 'number') {\n      // Place cursor at specific character offset\n      const textNode = this.getTextNodeAtOffset(position);\n      if (textNode) {\n        range.setStart(textNode.node, textNode.offset);\n        range.collapse(true);\n      } else {\n        // If offset is out of bounds, place at end\n        range.selectNodeContents(this.element);\n        range.collapse(false);\n      }\n    }\n\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n\n  /**\n   * Get the current cursor position as a character offset\n   * Returns 0 if no selection exists\n   *\n   * @returns Character offset from start of element\n   * @see Requirements 2.8\n   */\n  getCursorPosition(): number {\n    const selection = this.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return 0;\n    }\n\n    const range = selection.getRangeAt(0);\n    const preCaretRange = range.cloneRange();\n    preCaretRange.selectNodeContents(this.element);\n    preCaretRange.setEnd(range.endContainer, range.endOffset);\n\n    return preCaretRange.toString().length;\n  }\n\n  // ==================== Selection Queries ====================\n\n  /**\n   * Check if there is an active selection (not just a cursor)\n   * Returns true if selection has non-zero length\n   *\n   * @returns True if there is a selection\n   * @see Requirements 2.8\n   */\n  hasSelection(): boolean {\n    const selection = this.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return false;\n    }\n\n    const range = selection.getRangeAt(0);\n    return !range.collapsed;\n  }\n\n  /**\n   * Get the selected text as a plain string\n   * Returns empty string if no selection\n   *\n   * @returns Selected text\n   * @see Requirements 2.8\n   */\n  getSelectedText(): string {\n    const selection = this.getSelection();\n    if (!selection) {\n      return '';\n    }\n    return selection.toString();\n  }\n\n  /**\n   * Get the selected content as HTML\n   * Returns empty string if no selection\n   *\n   * @returns Selected HTML\n   * @see Requirements 2.8\n   */\n  getSelectedHTML(): string {\n    const range = this.getRange();\n    if (!range) {\n      return '';\n    }\n\n    const fragment = range.cloneContents();\n    const div = document.createElement('div');\n    div.appendChild(fragment);\n    return div.innerHTML;\n  }\n\n  // ==================== Utilities ====================\n\n  /**\n   * Select all content in the editor\n   * @see Requirements 2.8\n   */\n  selectAll(): void {\n    const selection = this.getSelection();\n    if (!selection) {\n      return;\n    }\n\n    const range = document.createRange();\n    range.selectNodeContents(this.element);\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n\n  /**\n   * Collapse the selection to the end (place cursor at end of selection)\n   * @see Requirements 2.8\n   */\n  collapseToEnd(): void {\n    const selection = this.getSelection();\n    if (!selection) {\n      return;\n    }\n\n    selection.collapseToEnd();\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Get the text node and offset at a specific character position\n   * Used for setting cursor position by character offset\n   *\n   * @param offset - Character offset from start of element\n   * @returns Object with node and offset, or null if not found\n   * @private\n   */\n  private getTextNodeAtOffset(offset: number): { node: Node; offset: number } | null {\n    const walker = document.createTreeWalker(this.element, NodeFilter.SHOW_TEXT, null);\n\n    let currentOffset = 0;\n    let node: Node | null;\n\n    while ((node = walker.nextNode())) {\n      const textLength = node.textContent?.length || 0;\n      if (currentOffset + textLength >= offset) {\n        return { node, offset: offset - currentOffset };\n      }\n      currentOffset += textLength;\n    }\n\n    return null;\n  }\n}\n","/**\n * format-manager.dom.ts\n *\n * Low-level DOM helpers for FormatManager: node/range queries,\n * mention snapshot/strip utilities, and wrap/unwrap selection.\n */\n\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n// ==================== Node/Range Helpers ====================\n\n/** Check if a node intersects with a range. */\nexport function isNodeInRange(node: Node, range: Range): boolean {\n  try {\n    const nodeRange = document.createRange();\n    nodeRange.selectNode(node);\n    return (\n      range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0 &&\n      range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0\n    );\n  } catch { return false; }\n}\n\n/** Get all block-level elements within the selection range. */\nexport function getSelectedBlocks(range: Range, element: HTMLElement): HTMLElement[] {\n  const blocks: HTMLElement[] = [];\n  const commonAncestor = range.commonAncestorContainer;\n  const searchRoot: HTMLElement = commonAncestor.nodeType === Node.ELEMENT_NODE\n    ? commonAncestor as HTMLElement\n    : commonAncestor.parentElement || element;\n\n  const blockTags = ['p', 'div', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'li'];\n  blockTags.forEach(tag => {\n    searchRoot.querySelectorAll(tag).forEach(el => {\n      if (isNodeInRange(el, range)) blocks.push(el as HTMLElement);\n    });\n  });\n\n  if (blocks.length === 0) {\n    let node: Node | null = range.startContainer;\n    while (node && node !== element) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        const el = node as HTMLElement;\n        if (blockTags.includes(el.tagName.toLowerCase())) { blocks.push(el); break; }\n      }\n      node = node.parentNode;\n    }\n  }\n  return blocks;\n}\n\n/** Get all blocks of a specific tag type within the selection range. */\nexport function getSelectedBlocksOfType(range: Range, tagName: string, element: HTMLElement): HTMLElement[] {\n  const blocks: HTMLElement[] = [];\n  const commonAncestor = range.commonAncestorContainer;\n  const searchRoot: HTMLElement = commonAncestor.nodeType === Node.ELEMENT_NODE\n    ? commonAncestor as HTMLElement\n    : commonAncestor.parentElement || element;\n\n  searchRoot.querySelectorAll(tagName).forEach(el => {\n    if (isNodeInRange(el, range)) blocks.push(el as HTMLElement);\n  });\n\n  if (blocks.length === 0) {\n    let node: Node | null = range.startContainer;\n    while (node && node !== element) {\n      if (node.nodeType === Node.ELEMENT_NODE &&\n          (node as HTMLElement).tagName.toLowerCase() === tagName.toLowerCase()) {\n        blocks.push(node as HTMLElement);\n        break;\n      }\n      node = node.parentNode;\n    }\n  }\n  return blocks;\n}\n\n/** Check if cursor is inside an element with the given tag name. */\nexport function isInsideFormattedElement(tagName: string, element: HTMLElement): boolean {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return false;\n  let node = selection.anchorNode;\n  while (node && node !== element) {\n    if (node.nodeType === Node.ELEMENT_NODE &&\n        (node as HTMLElement).tagName.toLowerCase() === tagName.toLowerCase()) return true;\n    node = node.parentNode;\n  }\n  return false;\n}\n\n/** Check if cursor is inside or selection contains an element with the given tag. */\nexport function isInsideOrContainsFormattedElement(tagName: string, element: HTMLElement): boolean {\n  if (isInsideFormattedElement(tagName, element)) return true;\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return false;\n  const range = selection.getRangeAt(0);\n  const container = range.commonAncestorContainer;\n  const searchRoot = container.nodeType === Node.ELEMENT_NODE\n    ? container as HTMLElement\n    : container.parentElement || element;\n  if (searchRoot.tagName?.toLowerCase() === tagName.toLowerCase()) return true;\n  return searchRoot.querySelector(tagName) !== null;\n}\n\n// ==================== Mention Snapshot Helpers ====================\n\nexport type MentionSnapshot = { uid: string; label: string; type: string; className: string };\n\n/** Snapshot mention metadata from a wrapper before stripping. */\nexport function snapshotMentions(wrapper: HTMLElement): void {\n  const mentions = wrapper.querySelectorAll('[data-uid]');\n  if (mentions.length === 0) return;\n  const data: MentionSnapshot[] = [];\n  mentions.forEach(m => {\n    data.push({\n      uid: m.getAttribute('data-uid') || '',\n      label: m.textContent || '',\n      type: m.getAttribute('data-mention-type') || 'other',\n      className: (m as HTMLElement).className || '',\n    });\n  });\n  wrapper.setAttribute('data-mention-snapshot', JSON.stringify(data));\n}\n\n/** Strip inline formatting tags from a wrapper (for code blocks). */\nexport function stripInlineFormatting(wrapper: HTMLElement): void {\n  wrapper.querySelectorAll('strong, em, u, s, b, i, del, strike').forEach(tag => {\n    const parent = tag.parentNode;\n    while (tag.firstChild) parent?.insertBefore(tag.firstChild, tag);\n    parent?.removeChild(tag);\n  });\n}\n\n/** Strip mention spans from a wrapper, replacing with plain text. */\nexport function stripMentions(wrapper: HTMLElement): void {\n  wrapper.querySelectorAll('[data-mention-id], [data-uid]').forEach(mention => {\n    mention.parentNode?.replaceChild(document.createTextNode(mention.textContent || ''), mention);\n  });\n}\n\n/** Strip inline formatting ancestor elements wrapping a node. */\nexport function stripInlineAncestors(wrapper: HTMLElement, element: HTMLElement): void {\n  const inlineAncestorTags = ['strong', 'em', 'u', 's', 'b', 'i', 'del', 'strike'];\n  let ancestor = wrapper.parentElement;\n  while (ancestor && ancestor !== element) {\n    const nextAncestor = ancestor.parentElement;\n    if (inlineAncestorTags.includes(ancestor.tagName.toLowerCase())) {\n      const parent = ancestor.parentNode;\n      if (parent) {\n        while (ancestor.firstChild) parent.insertBefore(ancestor.firstChild, ancestor);\n        parent.removeChild(ancestor);\n      }\n    }\n    ancestor = nextAncestor;\n  }\n}\n\n// ==================== Wrap/Unwrap Selection ====================\n\n/** Wrap the current selection in a tag, or unwrap if already inside that tag. */\nexport function wrapSelection(tagName: string, className: string | undefined, element: HTMLElement): void {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return;\n  const range = selection.getRangeAt(0);\n\n  if (isInsideFormattedElement(tagName, element)) {\n    unwrapSelection(tagName, element);\n    return;\n  }\n\n  const selectedContent = range.extractContents();\n  const wrapper = document.createElement(tagName);\n  if (className) wrapper.className = className;\n  wrapper.appendChild(selectedContent);\n\n  if (tagName === 'pre') {\n    stripInlineFormatting(wrapper);\n    snapshotMentions(wrapper);\n    stripMentions(wrapper);\n  }\n  if (tagName === 'pre' || tagName === 'code') stripMentions(wrapper);\n\n  const isEmptyInline = wrapper.textContent === '' && tagName !== 'pre';\n  if (isEmptyInline) wrapper.appendChild(document.createTextNode('\\u200B'));\n\n  range.insertNode(wrapper);\n  if (tagName === 'pre') stripInlineAncestors(wrapper, element);\n\n  selection.removeAllRanges();\n  const newRange = document.createRange();\n  if (isEmptyInline) {\n    const textNode = wrapper.firstChild!;\n    newRange.setStart(textNode, 1);\n    newRange.collapse(true);\n  } else {\n    newRange.selectNodeContents(wrapper);\n  }\n  selection.addRange(newRange);\n}\n\n/** Unwrap content from a tag, preserving selection. */\nexport function unwrapSelection(tagName: string, element: HTMLElement): void {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return;\n  const range = selection.getRangeAt(0);\n  const startOffset = range.startOffset;\n  const endOffset = range.endOffset;\n  const startContainer = range.startContainer;\n  const endContainer = range.endContainer;\n\n  let node = selection.anchorNode;\n  let targetElement: HTMLElement | null = null;\n  while (node && node !== element) {\n    if (node.nodeType === Node.ELEMENT_NODE &&\n        (node as HTMLElement).tagName.toLowerCase() === tagName.toLowerCase()) {\n      targetElement = node as HTMLElement;\n      break;\n    }\n    node = node.parentNode;\n  }\n  if (!targetElement) return;\n\n  const parent = targetElement.parentNode;\n  if (!parent) return;\n\n  const movedNodes: Node[] = [];\n  while (targetElement.firstChild) {\n    const child = targetElement.firstChild;\n    parent.insertBefore(child, targetElement);\n    movedNodes.push(child);\n  }\n  parent.removeChild(targetElement);\n\n  if (movedNodes.length > 0) {\n    const newRange = document.createRange();\n    try {\n      if (startContainer === endContainer && movedNodes.length === 1) {\n        const textNode = movedNodes[0];\n        if (textNode.nodeType === Node.TEXT_NODE) {\n          newRange.setStart(textNode, Math.min(startOffset, textNode.textContent?.length || 0));\n          newRange.setEnd(textNode, Math.min(endOffset, textNode.textContent?.length || 0));\n        } else {\n          newRange.selectNodeContents(textNode);\n        }\n      } else {\n        newRange.setStartBefore(movedNodes[0]);\n        newRange.setEndAfter(movedNodes[movedNodes.length - 1]);\n      }\n      selection.removeAllRanges();\n      selection.addRange(newRange);\n    } catch {\n      try {\n        newRange.setStartBefore(movedNodes[0]);\n        newRange.setEndAfter(movedNodes[movedNodes.length - 1]);\n        selection.removeAllRanges();\n        selection.addRange(newRange);\n      } catch (fallbackError) {\n        CometChatLogger.warn('FormatManager', 'Failed to restore selection after unwrap', fallbackError);\n      }\n    }\n  }\n}\n","/**\n * format-manager.utils.ts\n *\n * Higher-level formatting operations: block format apply/exit,\n * inline format skipping mentions, and list helpers.\n * Low-level DOM helpers live in format-manager.dom.ts.\n */\n\nimport {\n  getSelectedBlocks,\n  getSelectedBlocksOfType,\n  isInsideFormattedElement,\n  MentionSnapshot,\n  snapshotMentions,\n  stripInlineAncestors,\n  stripInlineFormatting,\n  stripMentions,\n  wrapSelection,\n  unwrapSelection,\n} from './format-manager.dom';\n\n// Re-export DOM helpers so format-manager.class.ts only needs one import\nexport {\n  isInsideFormattedElement,\n  isInsideOrContainsFormattedElement,\n  wrapSelection,\n} from './format-manager.dom';\n\n// ==================== Block Format Apply/Exit ====================\n\n/** Apply block formatting (pre/blockquote) to all selected blocks. */\nexport function applyBlockFormat(tagName: string, className: string | undefined, element: HTMLElement): void {\n  const selection = window.getSelection();\n\n  // ENG-35732 (Safari): same fix as applyFormatSkippingMentions — synthesise a\n  // collapsed range when the editor just regained focus and selection is empty.\n  if (!selection || selection.rangeCount === 0) {\n    if (!selection) return;\n    const syntheticRange = document.createRange();\n    if (element.lastChild) {\n      syntheticRange.setStartAfter(element.lastChild);\n    } else {\n      syntheticRange.setStart(element, 0);\n    }\n    syntheticRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(syntheticRange);\n  }\n\n  const range = selection.getRangeAt(0);\n  const blocks = getSelectedBlocks(range, element);\n\n  if (blocks.length === 0) {\n    wrapSelection(tagName, className, element);\n    setTimeout(() => {\n      const sel = window.getSelection();\n      if (!sel || sel.rangeCount === 0) return;\n      const rng = sel.getRangeAt(0);\n      const container = rng.commonAncestorContainer;\n      const wrapper: HTMLElement | null = container.nodeType === Node.ELEMENT_NODE\n        ? container as HTMLElement\n        : (container as HTMLElement).parentElement;\n      if (wrapper && wrapper.tagName.toLowerCase() === tagName.toLowerCase()) {\n        if (!wrapper.textContent || wrapper.textContent.trim() === '') {\n          if (!wrapper.querySelector('br')) wrapper.appendChild(document.createElement('br'));\n          const newRange = document.createRange();\n          newRange.setStart(wrapper, 0);\n          newRange.collapse(true);\n          sel.removeAllRanges();\n          sel.addRange(newRange);\n        }\n      }\n    }, 0);\n    return;\n  }\n\n  blocks.forEach(block => {\n    const wrapper = document.createElement(tagName);\n    if (className) wrapper.className = className;\n    wrapper.innerHTML = block.innerHTML || '<br>';\n    if (tagName === 'pre') {\n      stripInlineFormatting(wrapper);\n      snapshotMentions(wrapper);\n      stripMentions(wrapper);\n    }\n    if (block.parentNode) block.parentNode.replaceChild(wrapper, block);\n    if (tagName === 'pre') stripInlineAncestors(wrapper, element);\n  });\n\n  if (blocks.length > 0 && selection) {\n    const newRange = document.createRange();\n    newRange.setStart(blocks[0].parentNode || element, 0);\n    newRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n}\n\n/** Exit block formatting, converting blocks back to text nodes with br tags. */\nexport function exitBlockFormat(tagName: string, element: HTMLElement): void {\n  const selection = window.getSelection();\n\n  // ENG-35732 (Safari): synthesise collapsed range on empty selection.\n  if (!selection || selection.rangeCount === 0) {\n    if (!selection) return;\n    const syntheticRange = document.createRange();\n    if (element.lastChild) {\n      syntheticRange.setStartAfter(element.lastChild);\n    } else {\n      syntheticRange.setStart(element, 0);\n    }\n    syntheticRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(syntheticRange);\n  }\n\n  const range = selection.getRangeAt(0);\n  const blocks = getSelectedBlocksOfType(range, tagName, element);\n\n  if (blocks.length === 0) {\n    unwrapSelection(tagName, element);\n    return;\n  }\n\n  const firstBlock = blocks[0];\n  const fragment = document.createDocumentFragment();\n  const insertedNodes: Node[] = [];\n\n  blocks.forEach((block, index) => {\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = block.innerHTML || '';\n    Array.from(tempDiv.childNodes).forEach(node => {\n      if (node.nodeType === Node.TEXT_NODE) {\n        const tn = document.createTextNode(node.textContent || '');\n        fragment.appendChild(tn);\n        insertedNodes.push(tn);\n      } else if (node.nodeType === Node.ELEMENT_NODE) {\n        const el = node as HTMLElement;\n        if (el.tagName.toLowerCase() === 'br') {\n          const br = document.createElement('br');\n          fragment.appendChild(br);\n          insertedNodes.push(br);\n        } else {\n          const tc = el.textContent || '';\n          if (tc) { const tn = document.createTextNode(tc); fragment.appendChild(tn); insertedNodes.push(tn); }\n        }\n      }\n    });\n    if (index < blocks.length - 1) {\n      const br = document.createElement('br');\n      fragment.appendChild(br);\n      insertedNodes.push(br);\n    }\n  });\n\n  // Restore mentions from snapshot when exiting code block\n  if (tagName === 'pre') {\n    restoreMentionsFromSnapshot(blocks, fragment, insertedNodes);\n  }\n\n  if (firstBlock.parentNode) firstBlock.parentNode.insertBefore(fragment, firstBlock);\n  blocks.forEach(block => block.remove());\n\n  if (insertedNodes.length > 0) {\n    const newRange = document.createRange();\n    newRange.setStartBefore(insertedNodes[0]);\n    newRange.setEndAfter(insertedNodes[insertedNodes.length - 1]);\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n}\n\n/** Restore mention spans from data-mention-snapshot attribute after exiting a code block. */\nfunction restoreMentionsFromSnapshot(\n  blocks: HTMLElement[],\n  fragment: DocumentFragment,\n  insertedNodes: Node[]\n): void {\n  blocks.forEach(block => {\n    const snapshotAttr = block.getAttribute('data-mention-snapshot');\n    if (!snapshotAttr) return;\n    try {\n      const mentionData = JSON.parse(snapshotAttr) as MentionSnapshot[];\n      for (const mention of mentionData) {\n        const label = mention.label;\n        if (!label) continue;\n        const walker = document.createTreeWalker(fragment, NodeFilter.SHOW_TEXT);\n        let textNode: Text | null;\n        let found = false;\n        while (!found && (textNode = walker.nextNode() as Text | null)) {\n          const content = textNode.textContent || '';\n          const idx = content.indexOf(label);\n          if (idx < 0 || !textNode.parentNode) continue;\n          found = true;\n          const before = content.substring(0, idx);\n          const after = content.substring(idx + label.length);\n          const mentionSpan = document.createElement('span');\n          mentionSpan.className = mention.className;\n          mentionSpan.setAttribute('data-uid', mention.uid);\n          mentionSpan.setAttribute('data-mention-type', mention.type);\n          mentionSpan.setAttribute('contenteditable', 'false');\n          mentionSpan.textContent = label;\n          const parent = textNode.parentNode;\n          if (before) {\n            const beforeNode = document.createTextNode(before);\n            parent.insertBefore(beforeNode, textNode);\n            const tnIdx = insertedNodes.indexOf(textNode);\n            if (tnIdx >= 0) insertedNodes.splice(tnIdx, 0, beforeNode);\n          }\n          parent.insertBefore(mentionSpan, textNode);\n          insertedNodes.push(mentionSpan);\n          if (after) {\n            const afterNode = document.createTextNode(after);\n            parent.insertBefore(afterNode, textNode);\n            insertedNodes.push(afterNode);\n          }\n          const origIdx = insertedNodes.indexOf(textNode);\n          if (origIdx >= 0) insertedNodes.splice(origIdx, 1);\n          parent.removeChild(textNode);\n        }\n      }\n    } catch { /* JSON parse error, skip */ }\n  });\n}\n\n// ==================== Inline Format Skipping Mentions ====================\n\n/** Apply inline formatting while skipping mention spans. */\nexport function applyFormatSkippingMentions(command: string, tagName: string, element: HTMLElement): void {\n  const selection = window.getSelection();\n\n  // ENG-35732 (Safari): Clicking a toolbar button blurs the contenteditable.\n  // Safari does not synchronously restore window.getSelection() after a\n  // programmatic element.focus() call — rangeCount stays 0 right after focus().\n  // When the editor is empty (or focus was just restored), synthesise a\n  // collapsed range at the end of the content so execCommand has a valid\n  // anchor and can toggle the format mark even without a text selection.\n  if (!selection || selection.rangeCount === 0) {\n    if (!selection) return;\n    const syntheticRange = document.createRange();\n    if (element.lastChild) {\n      syntheticRange.setStartAfter(element.lastChild);\n    } else {\n      syntheticRange.setStart(element, 0);\n    }\n    syntheticRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(syntheticRange);\n  }\n\n  const range = selection.getRangeAt(0);\n\n  const container = range.commonAncestorContainer;\n  const searchRoot = container.nodeType === Node.ELEMENT_NODE\n    ? container as HTMLElement\n    : container.parentElement || element;\n\n  const mentionsInRange: Element[] = [];\n  searchRoot.querySelectorAll('[data-uid]').forEach(mention => {\n    try {\n      const mentionRange = document.createRange();\n      mentionRange.selectNode(mention);\n      if (\n        range.compareBoundaryPoints(Range.START_TO_END, mentionRange) > 0 &&\n        range.compareBoundaryPoints(Range.END_TO_START, mentionRange) < 0\n      ) mentionsInRange.push(mention);\n    } catch { /* node not in document */ }\n  });\n\n  if (mentionsInRange.length === 0) {\n    try {\n      if (document.execCommand) { document.execCommand(command, false); }\n      else { wrapSelection(tagName, undefined, element); }\n    } catch { wrapSelection(tagName, undefined, element); }\n    return;\n  }\n\n  const textNodes: Text[] = [];\n  const walker = document.createTreeWalker(searchRoot, NodeFilter.SHOW_TEXT, {\n    acceptNode: (node: Node) => {\n      try {\n        const nodeRange = document.createRange();\n        nodeRange.selectNode(node);\n        const inRange =\n          range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0 &&\n          range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0;\n        if (!inRange) return NodeFilter.FILTER_REJECT;\n      } catch { return NodeFilter.FILTER_REJECT; }\n      let parent = (node as Text).parentElement;\n      while (parent && parent !== searchRoot) {\n        if (parent.hasAttribute('data-uid')) return NodeFilter.FILTER_REJECT;\n        parent = parent.parentElement;\n      }\n      return NodeFilter.FILTER_ACCEPT;\n    },\n  });\n\n  let textNode: Text | null;\n  while ((textNode = walker.nextNode() as Text | null)) {\n    if (textNode.textContent && textNode.textContent.length > 0) textNodes.push(textNode);\n  }\n\n  for (const tn of textNodes) {\n    let alreadyWrapped = false;\n    let p = tn.parentElement;\n    while (p && p !== element) {\n      if (p.tagName.toLowerCase() === tagName.toLowerCase()) { alreadyWrapped = true; break; }\n      p = p.parentElement;\n    }\n    if (alreadyWrapped) continue;\n    const wrapper = document.createElement(tagName);\n    tn.parentNode?.insertBefore(wrapper, tn);\n    wrapper.appendChild(tn);\n  }\n\n  try { selection.removeAllRanges(); selection.addRange(range); } catch { /* best-effort */ }\n}\n\n// ==================== List Helpers ====================\n\n/** Manually create a list from the current selection. */\nexport function manuallyCreateList(listTag: string): void {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return;\n  const range = selection.getRangeAt(0);\n  const textContent = range.extractContents().textContent || '';\n  const list = document.createElement(listTag);\n  const lines = textContent.split('\\n').filter(l => l.trim().length > 0);\n  if (lines.length === 0) lines.push(textContent || '');\n  lines.forEach(line => {\n    const li = document.createElement('li');\n    li.textContent = line;\n    list.appendChild(li);\n  });\n  range.insertNode(list);\n  const newRange = document.createRange();\n  newRange.selectNodeContents(list);\n  selection.removeAllRanges();\n  selection.addRange(newRange);\n}\n\n/** Ensure current selection content is wrapped in a block element (for execCommand compatibility). */\nexport function ensureBlockWrapping(): void {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) return;\n  const range = selection.getRangeAt(0);\n  const content = range.extractContents();\n  const div = document.createElement('div');\n  div.appendChild(content);\n  range.insertNode(div);\n  const newRange = document.createRange();\n  newRange.selectNodeContents(div);\n  selection.removeAllRanges();\n  selection.addRange(newRange);\n}\n","/**\n * FormatManager Class\n *\n * Handles text formatting operations using document.execCommand and Selection API.\n * Provides methods for applying inline and block formatting to contenteditable content.\n *\n * @module services/format-manager\n * @see Requirements 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7\n */\n\nimport { RichTextFormatState } from './rich-text-editor.interfaces';\n\n/** Inline marks whose active state is driven by execCommand (no DOM inserted). */\ntype PendingInlineFormat = 'bold' | 'italic' | 'underline' | 'strikethrough';\nimport {\n  applyBlockFormat,\n  applyFormatSkippingMentions,\n  ensureBlockWrapping,\n  exitBlockFormat,\n  isInsideFormattedElement,\n  isInsideOrContainsFormattedElement,\n  manuallyCreateList,\n  wrapSelection,\n} from './format-manager.utils';\n/**\n * FormatManager handles all text formatting operations for a contenteditable element.\n * It uses document.execCommand with fallbacks for browser compatibility.\n * Heavy DOM logic is delegated to format-manager.utils.ts.\n */\nexport class FormatManager {\n  private element: HTMLElement;\n\n  /**\n   * Pending inline-mark state for an EMPTY editor.\n   *\n   * bold/italic/underline/strikethrough are applied via document.execCommand,\n   * which only toggles the browser's pending \"typing state\" and inserts no DOM.\n   * On an empty composer the editor stays empty, so getCurrentFormats() — which\n   * returns all-false when empty to avoid stale queryCommandState after a clear —\n   * would never reflect a toolbar toggle until the user starts typing.\n   *\n   * We mirror the real command state here right after each toggle so the toolbar\n   * can show active/inactive immediately on an empty composer, and reset it on\n   * clear() so stale state never leaks across messages.\n   */\n  private pendingEmptyInlineFormats: Record<PendingInlineFormat, boolean> = {\n    bold: false,\n    italic: false,\n    underline: false,\n    strikethrough: false,\n  };\n\n  constructor(element: HTMLElement) {\n    this.element = element;\n  }\n\n  /** True when the editor has no meaningful content (only whitespace / <br>). */\n  private isEditorEmpty(): boolean {\n    return (\n      !this.element.textContent?.trim() &&\n      (!this.element.innerHTML.trim() || /^(<br\\s*\\/?>)*$/i.test(this.element.innerHTML.trim()))\n    );\n  }\n\n  /**\n   * Record the pending state of an inline mark after a toolbar toggle.\n   * On an empty editor we capture the real command state so the toolbar reflects\n   * what the next typed character will be; once content exists, queryCommandState\n   * is authoritative and the pending value is cleared so it can't go stale.\n   */\n  private syncPendingEmptyFormat(format: PendingInlineFormat, command: string): void {\n    this.pendingEmptyInlineFormats[format] = this.isEditorEmpty() ? this.isActive(command) : false;\n  }\n\n  /** Clear pending inline-mark state. Called when the editor content is cleared. */\n  resetPendingEmptyFormats(): void {\n    this.pendingEmptyInlineFormats = { bold: false, italic: false, underline: false, strikethrough: false };\n  }\n\n  // ==================== Inline Formatting ====================\n\n  /** Apply bold formatting. Skips mention spans. @see Req 2.1 */\n  applyBold(): void {\n    this.element.focus();\n    if (isInsideFormattedElement('pre', this.element)) return;\n    applyFormatSkippingMentions('bold', 'strong', this.element);\n    this.syncPendingEmptyFormat('bold', 'bold');\n  }\n\n  /** Apply italic formatting. Skips mention spans. @see Req 2.2 */\n  applyItalic(): void {\n    this.element.focus();\n    if (isInsideFormattedElement('pre', this.element)) return;\n    applyFormatSkippingMentions('italic', 'em', this.element);\n    this.syncPendingEmptyFormat('italic', 'italic');\n  }\n\n  /** Apply underline formatting. Skips mention spans. @see Req 2.3 */\n  applyUnderline(): void {\n    this.element.focus();\n    if (isInsideFormattedElement('pre', this.element)) return;\n    applyFormatSkippingMentions('underline', 'u', this.element);\n    this.syncPendingEmptyFormat('underline', 'underline');\n  }\n\n  /** Apply strikethrough formatting. Skips mention spans. @see Req 2.4 */\n  applyStrikethrough(): void {\n    this.element.focus();\n    if (isInsideFormattedElement('pre', this.element)) return;\n    applyFormatSkippingMentions('strikeThrough', 's', this.element);\n    this.syncPendingEmptyFormat('strikethrough', 'strikeThrough');\n  }\n\n  /** Apply inline code formatting. Wraps selection in &lt;code&gt;. @see Req 2.5 */\n  applyInlineCode(): void {\n    this.element.focus();\n    wrapSelection('code', 'cometchat-rich-text__code', this.element);\n  }\n\n  // ==================== Block Formatting ====================\n\n  /**\n   * Apply code block formatting (&lt;pre&gt;).\n   * Exits if already in a code block. Removes blockquote first (mutual exclusivity).\n   * @see Req 2.6\n   */\n  applyCodeBlock(): void {\n    this.element.focus();\n    // ENG-35732 (Safari): ensure a valid range exists after focus() before\n    // querying the selection — Safari may return rangeCount === 0 synchronously.\n    this.ensureSafariSelection();\n    const selection = window.getSelection();\n    if (!selection || selection.rangeCount === 0) return;\n\n    if (isInsideOrContainsFormattedElement('pre', this.element)) {\n      exitBlockFormat('pre', this.element);\n      return;\n    }\n    if (isInsideOrContainsFormattedElement('blockquote', this.element)) {\n      exitBlockFormat('blockquote', this.element);\n    }\n    applyBlockFormat('pre', 'cometchat-rich-text__code-block', this.element);\n  }\n\n  /**\n   * Apply blockquote formatting.\n   * Exits if already in a blockquote. Removes code block first (mutual exclusivity).\n   * @see Req 2.7\n   */\n  applyBlockquote(): void {\n    this.element.focus();\n    // ENG-35732 (Safari): ensure a valid range exists after focus().\n    this.ensureSafariSelection();\n    const selection = window.getSelection();\n    if (!selection || selection.rangeCount === 0) return;\n\n    if (isInsideOrContainsFormattedElement('blockquote', this.element)) {\n      exitBlockFormat('blockquote', this.element);\n      return;\n    }\n    if (isInsideOrContainsFormattedElement('pre', this.element)) {\n      exitBlockFormat('pre', this.element);\n    }\n    applyBlockFormat('blockquote', 'cometchat-rich-text__blockquote', this.element);\n  }\n\n  /**\n   * Apply ordered list formatting.\n   * Removes code block first (mutual exclusivity). @see Req 3.1\n   */\n  applyOrderedList(): void {\n    this.element.focus();\n    if (isInsideOrContainsFormattedElement('pre', this.element)) {\n      exitBlockFormat('pre', this.element);\n      ensureBlockWrapping();\n    }\n    try {\n      let success = false;\n      if (document.execCommand) success = document.execCommand('insertOrderedList', false);\n      if (!success && !this.element.querySelector('ol')) manuallyCreateList('ol');\n    } catch {\n      manuallyCreateList('ol');\n    }\n  }\n\n  /**\n   * Apply bullet list formatting.\n   * Removes code block first (mutual exclusivity). @see Req 3.2\n   */\n  applyBulletList(): void {\n    this.element.focus();\n    if (isInsideOrContainsFormattedElement('pre', this.element)) {\n      exitBlockFormat('pre', this.element);\n      ensureBlockWrapping();\n    }\n    try {\n      let success = false;\n      if (document.execCommand) success = document.execCommand('insertUnorderedList', false);\n      if (!success && !this.element.querySelector('ul')) manuallyCreateList('ul');\n    } catch {\n      manuallyCreateList('ul');\n    }\n  }\n\n  // ==================== Safari Selection Helper ====================\n\n  /**\n   * ENG-35732: Safari does not synchronously restore window.getSelection()\n   * after a programmatic element.focus() call. When the toolbar button is\n   * clicked, the contenteditable loses focus and rangeCount drops to 0.\n   * This helper synthesises a collapsed range at the end of the element's\n   * content so that subsequent formatting calls have a valid anchor point.\n   */\n  private ensureSafariSelection(): void {\n    const selection = window.getSelection();\n    if (!selection || selection.rangeCount > 0) return;\n    const range = document.createRange();\n    if (this.element.lastChild) {\n      range.setStartAfter(this.element.lastChild);\n    } else {\n      range.setStart(this.element, 0);\n    }\n    range.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n\n  // ==================== Format State ====================\n\n  /** Check if a specific format is currently active at the cursor position. */\n  isActive(format: string): boolean {    try {\n      if (document.queryCommandState) return document.queryCommandState(format);\n    } catch {\n      return isInsideFormattedElement(format, this.element);\n    }\n    return false;\n  }\n\n  /** Get the current format state for all supported formats. */\n  getCurrentFormats(): RichTextFormatState {\n    // If the editor is empty, return all-false immediately.\n    // Browsers can return stale queryCommandState('bold') = true on empty\n    // contenteditables if formatting was active before the content was cleared.\n    const isEmpty = this.isEditorEmpty();\n    if (isEmpty) {\n      // Inline marks (bold/italic/underline/strikethrough) leave no DOM, so reflect\n      // the pending toolbar toggle state captured at apply time. Block/list/code/link\n      // formats can't be active on truly empty content, so they stay false.\n      return {\n        ...this.pendingEmptyInlineFormats,\n        code: false, blockquote: false, codeBlock: false, orderedList: false, bulletList: false, link: false,\n      };\n    }\n\n    const isLink = isInsideFormattedElement('a', this.element);\n    // Never use queryCommandState('underline') — browsers return true when the cursor\n    // is inside or adjacent to an <a> tag due to text-decoration, causing false positives.\n    // Always check for an actual <u> element in the ancestor chain instead.\n    const isUnderline = isInsideFormattedElement('u', this.element);\n\n    return {\n      bold: this.isActive('bold'),\n      italic: this.isActive('italic'),\n      underline: isUnderline,\n      strikethrough: this.isActive('strikeThrough'),\n      code: isInsideFormattedElement('code', this.element),\n      blockquote: isInsideFormattedElement('blockquote', this.element),\n      codeBlock: isInsideFormattedElement('pre', this.element),\n      orderedList: this.isActive('insertOrderedList'),\n      bulletList: this.isActive('insertUnorderedList'),\n      link: isLink,\n    };\n  }\n}\n","/**\n * HistoryManager Class\n *\n * Implements undo/redo functionality using a command pattern with history stacks.\n * Groups rapid typing into single undo steps for better user experience.\n *\n * @module services/history-manager\n * @see Requirements 6.1, 6.2\n */\n\nimport { HistoryEntry } from './rich-text-editor.interfaces';\n\n/**\n * HistoryManager handles undo/redo operations for the rich text editor.\n *\n * Features:\n * - Maintains separate undo and redo stacks\n * - Groups rapid typing (within 500ms) into single undo steps\n * - Stores cursor position with each history entry\n * - Limits stack size to prevent memory issues\n * - Provides canUndo/canRedo queries\n *\n * @example\n * ```typescript\n * const manager = new HistoryManager();\n *\n * // Push a new history entry\n * manager.push({\n *   html: '<p>Hello</p>',\n *   cursorPosition: 5,\n *   timestamp: Date.now()\n * });\n *\n * // Undo\n * const previous = manager.undo();\n * if (previous) {\n *   // Restore previous state\n * }\n *\n * // Redo\n * const next = manager.redo();\n * ```\n */\nexport class HistoryManager {\n  private undoStack: HistoryEntry[] = [];\n  private redoStack: HistoryEntry[] = [];\n  private maxStackSize = 100;\n  private groupDelay = 500; // milliseconds\n  private lastTimestamp = 0;\n\n  /**\n   * Create a new HistoryManager instance\n   * @param maxStackSize - Maximum number of entries to keep (default: 100)\n   * @param groupDelay - Time window for grouping operations in ms (default: 500)\n   */\n  constructor(maxStackSize = 100, groupDelay = 500) {\n    this.maxStackSize = maxStackSize;\n    this.groupDelay = groupDelay;\n  }\n\n  // ==================== Operations ====================\n\n  /**\n   * Push a new history entry onto the undo stack\n   * Groups entries if they occur within the groupDelay window\n   * Clears the redo stack when a new entry is pushed\n   *\n   * @param entry - History entry to push\n   * @see Requirements 6.1, 6.2\n   */\n  push(entry: HistoryEntry): void {\n    // Check if we should group this entry with the previous one\n    if (this.shouldGroup(entry.timestamp)) {\n      // Replace the last entry instead of adding a new one\n      if (this.undoStack.length > 0) {\n        this.undoStack[this.undoStack.length - 1] = entry;\n      } else {\n        this.undoStack.push(entry);\n      }\n    } else {\n      // Add as a new entry\n      this.undoStack.push(entry);\n\n      // Handle stack overflow\n      if (this.undoStack.length > this.maxStackSize) {\n        this.undoStack.shift(); // Remove oldest entry\n      }\n    }\n\n    // Update last timestamp\n    this.lastTimestamp = entry.timestamp;\n\n    // Clear redo stack when new entry is pushed\n    this.redoStack = [];\n  }\n\n  /**\n   * Undo the last operation\n   * Moves the current state to the redo stack and returns the previous state\n   *\n   * @returns Previous history entry, or null if nothing to undo\n   * @see Requirements 6.1\n   */\n  undo(): HistoryEntry | null {\n    if (!this.canUndo()) {\n      return null;\n    }\n\n    // Pop from undo stack\n    const current = this.undoStack.pop()!;\n\n    // Push to redo stack\n    this.redoStack.push(current);\n\n    // Handle redo stack overflow\n    if (this.redoStack.length > this.maxStackSize) {\n      this.redoStack.shift();\n    }\n\n    // Return the previous entry (now at top of undo stack)\n    // If undo stack is empty, return null (we're at the initial state)\n    return this.undoStack.length > 0 ? this.undoStack[this.undoStack.length - 1] : null;\n  }\n\n  /**\n   * Redo the last undone operation\n   * Moves the state from redo stack back to undo stack\n   *\n   * @returns Next history entry, or null if nothing to redo\n   * @see Requirements 6.2\n   */\n  redo(): HistoryEntry | null {\n    if (!this.canRedo()) {\n      return null;\n    }\n\n    // Pop from redo stack\n    const next = this.redoStack.pop()!;\n\n    // Push back to undo stack\n    this.undoStack.push(next);\n\n    // Handle undo stack overflow\n    if (this.undoStack.length > this.maxStackSize) {\n      this.undoStack.shift();\n    }\n\n    return next;\n  }\n\n  // ==================== Queries ====================\n\n  /**\n   * Check if undo is available\n   * @returns True if there are entries in the undo stack\n   * @see Requirements 6.1\n   */\n  canUndo(): boolean {\n    return this.undoStack.length > 1; // Need at least 2 entries (current + previous)\n  }\n\n  /**\n   * Check if redo is available\n   * @returns True if there are entries in the redo stack\n   * @see Requirements 6.2\n   */\n  canRedo(): boolean {\n    return this.redoStack.length > 0;\n  }\n\n  // ==================== Utilities ====================\n\n  /**\n   * Determine if a new entry should be grouped with the previous one\n   * Groups entries that occur within the groupDelay window\n   *\n   * @param timestamp - Timestamp of the new entry\n   * @returns True if should group with previous entry\n   * @see Requirements 6.1, 6.2\n   */\n  shouldGroup(timestamp: number): boolean {\n    if (this.undoStack.length === 0) {\n      return false;\n    }\n\n    const timeSinceLastEntry = timestamp - this.lastTimestamp;\n    return timeSinceLastEntry < this.groupDelay;\n  }\n\n  /**\n   * Clear all history\n   * Resets both undo and redo stacks\n   * @see Requirements 6.1, 6.2\n   */\n  clear(): void {\n    this.undoStack = [];\n    this.redoStack = [];\n    this.lastTimestamp = 0;\n  }\n\n  /**\n   * Get the current history entry (top of undo stack)\n   * @returns Current history entry, or null if stack is empty\n   */\n  getCurrent(): HistoryEntry | null {\n    return this.undoStack.length > 0 ? this.undoStack[this.undoStack.length - 1] : null;\n  }\n\n  /**\n   * Get the size of the undo stack\n   * @returns Number of entries in undo stack\n   */\n  getUndoStackSize(): number {\n    return this.undoStack.length;\n  }\n\n  /**\n   * Get the size of the redo stack\n   * @returns Number of entries in redo stack\n   */\n  getRedoStackSize(): number {\n    return this.redoStack.length;\n  }\n}\n","/**\n * ListManager Class\n *\n * Manages ordered and unordered lists in the rich text editor.\n * Handles list creation, toggling, indentation, and Enter key behavior.\n *\n * @module services/list-manager\n * @see Requirements 3.1, 3.2, 3.3, 3.4, 3.5\n */\n\nimport { SelectionManager } from './selection-manager.class';\n\nexport class ListManager {\n  private element: HTMLElement;\n  private selectionManager: SelectionManager;\n\n  constructor(element: HTMLElement, selectionManager: SelectionManager) {\n    this.element = element;\n    this.selectionManager = selectionManager;\n  }\n\n  // ==================== List Operations ====================\n\n  /** Toggle ordered list. Exits if already in OL, converts UL→OL, or creates new OL. @see Req 3.1 */\n  toggleOrderedList(): void {\n    this.element.focus();\n    const listType = this.getListType();\n    if (listType === 'ol') { this.exitList(); }\n    else if (listType === 'ul') { this.convertListType('ol'); }\n    else { this.convertToList('ol'); }\n  }\n\n  /** Toggle bullet list. Exits if already in UL, converts OL→UL, or creates new UL. @see Req 3.2 */\n  toggleBulletList(): void {\n    this.element.focus();\n    const listType = this.getListType();\n    if (listType === 'ul') { this.exitList(); }\n    else if (listType === 'ol') { this.convertListType('ul'); }\n    else { this.convertToList('ul'); }\n  }\n\n  /**\n   * Handle Enter key: creates new list item or exits list on empty item.\n   * @returns True if handled. @see Requirements 3.3, 3.4\n   */\n  handleEnterKey(event?: KeyboardEvent): boolean {\n    if (!this.isInList()) return false;\n    const listItem = this.getCurrentListItem();\n    if (!listItem) return false;\n    event?.preventDefault();\n    if (listItem.textContent?.trim() === '') { this.exitList(); }\n    else { this.createNewListItem(); }\n    return true;\n  }\n\n  /** Handle Tab key: indents current list item. @returns True if handled. @see Req 3.5 */\n  handleTabKey(event?: KeyboardEvent): boolean {\n    if (!this.isInList()) return false;\n    event?.preventDefault();\n    this.indentListItem();\n    return true;\n  }\n\n  /** Handle Shift+Tab key: outdents current list item. @returns True if handled. @see Req 3.5 */\n  handleShiftTabKey(event?: KeyboardEvent): boolean {\n    if (!this.isInList()) return false;\n    event?.preventDefault();\n    this.outdentListItem();\n    return true;\n  }\n\n  // ==================== List Queries ====================\n\n  /** @returns True if cursor is inside a list (ol or ul). */\n  isInList(): boolean { return this.getListType() !== null; }\n\n  /** @returns 'ol', 'ul', or null depending on cursor position. */\n  getListType(): 'ol' | 'ul' | null {\n    const listElement = this.getParentList();\n    if (!listElement) return null;\n    const tagName = listElement.tagName.toLowerCase();\n    return tagName === 'ol' || tagName === 'ul' ? tagName : null;\n  }\n\n  // ==================== List Utilities ====================\n\n  /** Convert current selection to a list of the given type. */\n  convertToList(type: 'ol' | 'ul'): void {\n    const selection = this.selectionManager.getSelection();\n    if (!selection) return;\n    try {\n      if (document.execCommand) {\n        document.execCommand(type === 'ol' ? 'insertOrderedList' : 'insertUnorderedList', false);\n      } else {\n        this.manuallyCreateList(type);\n      }\n    } catch {\n      this.manuallyCreateList(type);\n    }\n  }\n\n  /** Exit the current list, converting items back to text nodes with br tags. */\n  exitList(): void {\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) return;\n    const listItem = this.getCurrentListItem();\n    if (!listItem) return;\n    const list = listItem.parentElement;\n    if (!list || (list.tagName.toLowerCase() !== 'ol' && list.tagName.toLowerCase() !== 'ul')) return;\n\n    const isEmpty = listItem.textContent?.trim() === '';\n    const hasOnlyBr = listItem.innerHTML.trim() === '<br>' || listItem.innerHTML.trim() === '';\n\n    if (isEmpty || hasOnlyBr) {\n      listItem.remove();\n      const br = document.createElement('br');\n      if (list.parentNode) list.parentNode.insertBefore(br, list.nextSibling);\n      if (list.children.length === 0) list.remove();\n      const newRange = document.createRange();\n      newRange.setStart(br.parentNode!, Array.from(br.parentNode!.childNodes).indexOf(br));\n      newRange.collapse(true);\n      selection.removeAllRanges();\n      selection.addRange(newRange);\n      return;\n    }\n\n    const range = selection.getRangeAt(0);\n    const selectedListItems = this.getSelectedListItems(range);\n    if (selectedListItems.length === 0) selectedListItems.push(listItem);\n\n    const fragment = document.createDocumentFragment();\n    const insertedNodes: Node[] = [];\n\n    selectedListItems.forEach((item, index) => {\n      const textNode = document.createTextNode(item.textContent || '');\n      fragment.appendChild(textNode);\n      insertedNodes.push(textNode);\n      if (index < selectedListItems.length - 1) {\n        const br = document.createElement('br');\n        fragment.appendChild(br);\n        insertedNodes.push(br);\n      }\n    });\n\n    if (list.parentNode) list.parentNode.insertBefore(fragment, list.nextSibling);\n    selectedListItems.forEach(item => item.remove());\n    if (list.children.length === 0) list.remove();\n\n    if (insertedNodes.length > 0) {\n      const newRange = document.createRange();\n      newRange.setStartBefore(insertedNodes[0]);\n      newRange.setEndAfter(insertedNodes[insertedNodes.length - 1]);\n      selection.removeAllRanges();\n      selection.addRange(newRange);\n    }\n  }\n\n  /** Indent the current list item (creates nested list, max 5 levels). */\n  indentListItem(): void {\n    const listItem = this.getCurrentListItem();\n    if (!listItem) return;\n    const previousSibling = listItem.previousElementSibling;\n    if (!previousSibling || previousSibling.tagName.toLowerCase() !== 'li') return;\n    const listType = this.getListType();\n    if (!listType) return;\n\n    let currentDepth = 0;\n    let ancestor: Element | null = listItem.parentElement;\n    while (ancestor && ancestor !== this.element) {\n      if (ancestor.tagName.toLowerCase() === 'ol' || ancestor.tagName.toLowerCase() === 'ul') currentDepth++;\n      ancestor = ancestor.parentElement;\n    }\n    if (currentDepth >= 5) return;\n\n    let nestedList = previousSibling.querySelector(`:scope > ${listType}`);\n    if (!nestedList) {\n      nestedList = document.createElement(listType);\n      previousSibling.appendChild(nestedList);\n    }\n    nestedList.appendChild(listItem);\n\n    const ulStyles = ['disc', 'circle', 'square'];\n    const olStyles = ['decimal', 'lower-alpha', 'lower-roman'];\n    const styles = listType === 'ul' ? ulStyles : olStyles;\n    let depth = 0;\n    let el: Element | null = nestedList.parentElement;\n    while (el && el !== this.element) {\n      if (el.tagName.toLowerCase() === listType) depth++;\n      el = el.parentElement;\n    }\n    (nestedList as HTMLElement).style.listStyleType = styles[depth % 3];\n  }\n\n  /** Outdent the current list item (moves up one level, or exits list at top level). */\n  outdentListItem(): void {\n    const listItem = this.getCurrentListItem();\n    if (!listItem) return;\n    const parentList = listItem.parentElement;\n    if (!parentList || (parentList.tagName.toLowerCase() !== 'ol' && parentList.tagName.toLowerCase() !== 'ul')) return;\n    const grandparentListItem = parentList.parentElement;\n    if (!grandparentListItem || grandparentListItem.tagName.toLowerCase() !== 'li') {\n      this.exitList();\n      return;\n    }\n    const grandparentList = grandparentListItem.parentElement;\n    if (!grandparentList) return;\n    grandparentList.insertBefore(listItem, grandparentListItem.nextSibling);\n    if (parentList.children.length === 0) parentList.remove();\n  }\n\n  // ==================== Private Helpers ====================\n\n  private getSelectedListItems(range: Range): HTMLElement[] {\n    const listItems: HTMLElement[] = [];\n    const commonAncestor = range.commonAncestorContainer;\n    const searchRoot: HTMLElement = commonAncestor.nodeType === Node.ELEMENT_NODE\n      ? commonAncestor as HTMLElement\n      : commonAncestor.parentElement || this.element;\n\n    searchRoot.querySelectorAll('li').forEach(li => {\n      if (this.isNodeInRange(li, range)) listItems.push(li as HTMLElement);\n    });\n\n    if (listItems.length === 0) {\n      const currentItem = this.getCurrentListItem();\n      if (currentItem) listItems.push(currentItem);\n    }\n    return listItems;\n  }\n\n  private isNodeInRange(node: Node, range: Range): boolean {\n    try {\n      const nodeRange = document.createRange();\n      nodeRange.selectNode(node);\n      return (\n        range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0 &&\n        range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0\n      );\n    } catch { return false; }\n  }\n\n  private getParentList(): HTMLElement | null {\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) return null;\n    let node = selection.anchorNode;\n    while (node && node !== this.element) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        const el = node as HTMLElement;\n        const tag = el.tagName.toLowerCase();\n        if (tag === 'ol' || tag === 'ul') return el;\n      }\n      node = node.parentNode;\n    }\n    return null;\n  }\n\n  private getCurrentListItem(): HTMLElement | null {\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) return null;\n    let node = selection.anchorNode;\n    while (node && node !== this.element) {\n      if (node.nodeType === Node.ELEMENT_NODE && (node as HTMLElement).tagName.toLowerCase() === 'li') {\n        return node as HTMLElement;\n      }\n      node = node.parentNode;\n    }\n    return null;\n  }\n\n  createNewListItem(): void {\n    const listItem = this.getCurrentListItem();\n    if (!listItem) return;\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) return;\n\n    const currentRange = selection.getRangeAt(0);\n    const afterCursorRange = document.createRange();\n    afterCursorRange.setStart(currentRange.endContainer, currentRange.endOffset);\n    afterCursorRange.setEnd(listItem, listItem.childNodes.length);\n    const afterContent = afterCursorRange.extractContents();\n\n    const newItem = document.createElement('li');\n    if ((afterContent.textContent || '').trim()) {\n      newItem.appendChild(afterContent);\n    } else {\n      newItem.innerHTML = '<br>';\n    }\n    if (!listItem.textContent?.trim()) listItem.innerHTML = '<br>';\n\n    if (listItem.nextSibling) {\n      listItem.parentNode?.insertBefore(newItem, listItem.nextSibling);\n    } else {\n      listItem.parentNode?.appendChild(newItem);\n    }\n\n    const newRange = document.createRange();\n    newRange.setStart(newItem, 0);\n    newRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n\n  private convertListType(newType: 'ol' | 'ul'): void {\n    const list = this.getParentList();\n    if (!list) return;\n    const newList = document.createElement(newType);\n    newList.className = list.className;\n    while (list.firstChild) newList.appendChild(list.firstChild);\n    list.parentNode?.replaceChild(newList, list);\n\n    // ENG-35758: When converting UL→OL the browser retains the internal list\n    // counter from the transplanted <li> nodes and may render them all as \"1.\".\n    // Force a counter reset by toggling the list-style and restoring it so the\n    // browser recalculates the ordinal values from 1.\n    if (newType === 'ol') {\n      newList.setAttribute('start', '1');\n      // Remove and re-append each <li> so the browser recounts from scratch.\n      const items = Array.from(newList.querySelectorAll(':scope > li'));\n      items.forEach(li => {\n        newList.removeChild(li);\n        newList.appendChild(li);\n      });\n    }\n  }\n\n  private manuallyCreateList(type: 'ol' | 'ul'): void {\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) return;\n    const range = selection.getRangeAt(0);\n    const selectedText = selection.toString() || 'List item';\n    const list = document.createElement(type);\n    const listItem = document.createElement('li');\n    listItem.textContent = selectedText;\n    list.appendChild(listItem);\n    range.deleteContents();\n    range.insertNode(list);\n    const newRange = document.createRange();\n    newRange.setStart(listItem, listItem.childNodes.length);\n    newRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n  }\n}\n","/**\n * LinkManager Class\n *\n * Handles link insertion, editing, and validation in the rich text editor.\n * Provides URL validation and auto-linking on paste.\n *\n * @module services/link-manager\n * @see Requirements 4.1, 4.2, 4.3, 4.4, 4.5\n */\n\nimport { SelectionManager } from './selection-manager.class';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * LinkManager handles all link-related operations for a contenteditable element.\n *\n * Features:\n * - Insert links with selected text\n * - Update existing links\n * - Remove links\n * - Validate URLs\n * - Normalize URLs (add protocol if missing)\n * - Auto-link URLs on paste\n *\n * @example\n * ```typescript\n * const element = document.querySelector('.editor');\n * const selectionManager = new SelectionManager(element);\n * const manager = new LinkManager(element, selectionManager);\n *\n * // Insert a link\n * manager.insertLink('https://example.com');\n *\n * // Check if cursor is on a link\n * if (manager.isLinkActive()) {\n *   const url = manager.getCurrentLink();\n *   console.log('Current link:', url);\n * }\n *\n * // Validate URL\n * if (manager.validateURL('example.com')) {\n *   const normalized = manager.normalizeURL('example.com');\n *   // normalized = 'https://example.com'\n * }\n * ```\n */\nexport class LinkManager {\n  private element: HTMLElement;\n  private selectionManager: SelectionManager;\n\n  // URL validation regex (avoids nested quantifiers to prevent catastrophic backtracking)\n  private urlPattern = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([\\/\\w .?#&=%-]*)$/i;\n  private protocolPattern = /^https?:\\/\\//i;\n\n  /**\n   * Create a new LinkManager instance\n   * @param element - The contenteditable element to manage\n   * @param selectionManager - SelectionManager instance for cursor operations\n   */\n  constructor(element: HTMLElement, selectionManager: SelectionManager) {\n    this.element = element;\n    this.selectionManager = selectionManager;\n  }\n\n  // ==================== Link Operations ====================\n\n  /**\n   * Insert a link at the current selection\n   * If text is selected, wraps it in a link\n   * If no text is selected, inserts the URL as both text and link\n   *\n   * @param url - URL to link to\n   * @param text - Optional text to display (if not provided, uses selected text or URL)\n   * @returns True if link was inserted successfully\n   * @see Requirements 4.1, 4.4\n   */\n  insertLink(url: string, text?: string): boolean {\n    // Validate URL\n    if (!this.validateURL(url)) {\n      CometChatLogger.warn('LinkManager', 'Invalid URL:', url);\n      return false;\n    }\n\n    // Normalize URL (add protocol if missing)\n    const normalizedUrl = this.normalizeURL(url);\n\n    this.element.focus();\n\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return false;\n    }\n\n    const range = selection.getRangeAt(0);\n    const selectedText = selection.toString();\n\n    // Create link element\n    const link = document.createElement('a');\n    link.href = normalizedUrl;\n    link.className = 'cometchat-rich-text__link';\n    link.target = '_blank';\n    link.rel = 'noopener noreferrer';\n\n    // Determine what text to display\n    const displayText = text || selectedText || normalizedUrl;\n    link.textContent = displayText;\n\n    // Delete selected content and insert link\n    range.deleteContents();\n    range.insertNode(link);\n\n    // Place cursor after the link\n    const newRange = document.createRange();\n    newRange.setStartAfter(link);\n    newRange.collapse(true);\n    selection.removeAllRanges();\n    selection.addRange(newRange);\n\n    return true;\n  }\n\n  /**\n   * Update the URL and/or text of an existing link at the cursor position\n   * @param url - New URL\n   * @param text - Optional new text to display\n   * @returns True if link was updated successfully\n   * @see Requirements 4.2\n   */\n  updateLink(url: string, text?: string): boolean {\n    // Validate URL\n    if (!this.validateURL(url)) {\n      CometChatLogger.warn('LinkManager', 'Invalid URL:', url);\n      return false;\n    }\n\n    const link = this.getCurrentLinkElement();\n    if (!link) {\n      return false;\n    }\n\n    // Normalize URL\n    const normalizedUrl = this.normalizeURL(url);\n\n    // Update the link's href\n    link.href = normalizedUrl;\n\n    // Update the link's text if provided\n    if (text !== undefined && text !== null) {\n      link.textContent = text;\n    }\n\n    return true;\n  }\n\n  /**\n   * Remove the link at the cursor position\n   * Preserves the link text but removes the anchor element\n   * @returns True if link was removed successfully\n   * @see Requirements 4.1, 4.2\n   */\n  removeLink(): boolean {\n    const link = this.getCurrentLinkElement();\n    if (!link) {\n      return false;\n    }\n\n    // Replace link with its text content\n    const textNode = document.createTextNode(link.textContent || '');\n    link.parentNode?.replaceChild(textNode, link);\n\n    return true;\n  }\n\n  // ==================== Link Queries ====================\n\n  /**\n   * Check if the cursor is currently on a link\n   * @returns True if cursor is inside a link element\n   * @see Requirements 4.1, 4.2\n   */\n  isLinkActive(): boolean {\n    return this.getCurrentLinkElement() !== null;\n  }\n\n  /**\n   * Get the URL of the link at the cursor position\n   * @returns URL string or null if not on a link\n   * @see Requirements 4.2\n   */\n  getCurrentLink(): string | null {\n    const link = this.getCurrentLinkElement();\n    return link ? link.href : null;\n  }\n\n  /**\n   * Get the text content of the link at the cursor position\n   * @returns Link text or null if not on a link\n   * @see Requirements 4.2\n   */\n  getCurrentLinkText(): string | null {\n    const link = this.getCurrentLinkElement();\n    return link ? link.textContent : null;\n  }\n\n  // ==================== URL Validation ====================\n\n  /**\n   * Validate a URL string\n   * Checks if the URL has a valid format\n   *\n   * @param url - URL to validate\n   * @returns True if URL is valid\n   * @see Requirement 4.3\n   */\n  validateURL(url: string): boolean {\n    if (!url || url.trim() === '') {\n      return false;\n    }\n    // Accept any non-empty URL string (Req 2.20)\n    return true;\n  }\n\n  /**\n   * Normalize a URL by adding protocol if missing\n   * Defaults to https:// if no protocol is present\n   *\n   * @param url - URL to normalize\n   * @returns Normalized URL with protocol\n   * @see Requirement 4.3\n   */\n  normalizeURL(url: string): string {\n    const trimmedUrl = url.trim();\n\n    // Check if URL already has any protocol (not just http/https)\n    if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//i.test(trimmedUrl) || /^mailto:/i.test(trimmedUrl)) {\n      return trimmedUrl;\n    }\n\n    // Add https:// protocol for URLs without one\n    return `https://${trimmedUrl}`;\n  }\n\n  /**\n   * Get validation error message for an invalid URL\n   * @param url - URL to validate\n   * @returns Error message or null if valid\n   * @see Requirement 4.3\n   */\n  getValidationError(url: string): string | null {\n    if (!url || url.trim() === '') {\n      return 'URL cannot be empty';\n    }\n    return null;\n  }\n\n  // ==================== Auto-Link on Paste ====================\n\n  /**\n   * Detect and convert URLs in pasted text to clickable links\n   * Should be called from the paste event handler\n   *\n   * @param text - Pasted text content\n   * @returns HTML with URLs converted to links\n   * @see Requirement 4.5\n   */\n  autoLinkText(text: string): string {\n    // Pattern to match URLs in text\n    const urlRegex =\n      /(https?:\\/\\/[^\\s]+)|(www\\.[^\\s]+)|([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]\\.[a-zA-Z]{2,}[^\\s]*)/g;\n\n    return text.replace(urlRegex, match => {\n      // Validate the matched URL\n      if (this.validateURL(match)) {\n        const normalizedUrl = this.normalizeURL(match);\n        return `<a href=\"${normalizedUrl}\" class=\"cometchat-rich-text__link\" target=\"_blank\" rel=\"noopener noreferrer\">${match}</a>`;\n      }\n      return match;\n    });\n  }\n\n  /**\n   * Process pasted content and auto-link URLs\n   * @param html - Pasted HTML content\n   * @returns Processed HTML with auto-linked URLs\n   * @see Requirement 4.5\n   */\n  processAutoLink(html: string): string {\n    // Create a temporary div to parse HTML\n    const temp = document.createElement('div');\n    temp.innerHTML = html;\n\n    // Process text nodes to auto-link URLs\n    this.processTextNodes(temp);\n\n    return temp.innerHTML;\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Get the link element at the current cursor position\n   * @returns Link element or null\n   * @private\n   */\n  private getCurrentLinkElement(): HTMLAnchorElement | null {\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) {\n      return null;\n    }\n\n    let node = selection.anchorNode;\n\n    while (node && node !== this.element) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        const element = node as HTMLElement;\n        if (element.tagName.toLowerCase() === 'a') {\n          return element as HTMLAnchorElement;\n        }\n      }\n      node = node.parentNode;\n    }\n\n    return null;\n  }\n\n  /**\n   * Process text nodes in an element to auto-link URLs\n   * @param element - Element to process\n   * @private\n   */\n  private processTextNodes(element: HTMLElement): void {\n    const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null);\n\n    const nodesToReplace: { node: Node; html: string }[] = [];\n\n    let node: Node | null;\n    while ((node = walker.nextNode())) {\n      // Skip if parent is already a link\n      if (node.parentElement?.tagName.toLowerCase() === 'a') {\n        continue;\n      }\n\n      const text = node.textContent || '';\n      const linkedText = this.autoLinkText(text);\n\n      if (linkedText !== text) {\n        nodesToReplace.push({ node, html: linkedText });\n      }\n    }\n\n    // Replace nodes with linked versions\n    for (const { node, html } of nodesToReplace) {\n      const temp = document.createElement('span');\n      temp.innerHTML = html;\n\n      // Replace the text node with the new content\n      const parent = node.parentNode;\n      if (parent) {\n        while (temp.firstChild) {\n          parent.insertBefore(temp.firstChild, node);\n        }\n        parent.removeChild(node);\n      }\n    }\n  }\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Context object for text formatters.\n * Provides additional information that formatters may need during processing.\n *\n * @see Requirements 5.1, 5.5\n */\nexport interface TextFormatterContext {\n  /** The logged-in user */\n  loggedInUser?: CometChat.User;\n  /** The group (if applicable) */\n  group?: CometChat.Group;\n  /** Additional metadata */\n  metadata?: Record<string, any>;\n}\n\n/**\n * Abstract base class for text formatters\n *\n * Formatters detect patterns in text and apply formatting transformations.\n * Text formatters are used to detect and transform patterns in text content,\n * such as @mentions, URLs, or custom patterns. They can be chained together\n * to apply multiple transformations in sequence.\n *\n * Formatters are applied in order of their priority property (lower = earlier in pipeline).\n * Each formatter can optionally implement shouldFormat() to conditionally skip processing.\n *\n * @abstract\n * @see Requirements 5.1, 5.5, 21.1-21.7\n *\n * @example\n * ```typescript\n * class MyFormatter extends CometChatTextFormatter {\n *   readonly id = 'my-formatter';\n *   priority = 50;\n *\n *   getRegex(): RegExp {\n *     return /pattern/g;\n *   }\n *\n *   format(text: string): string {\n *     return text.replace(this.getRegex(), 'replacement');\n *   }\n *\n *   shouldFormat(text: string, message?: CometChat.BaseMessage): boolean {\n *     return text.includes('pattern');\n *   }\n * }\n * ```\n */\nexport abstract class CometChatTextFormatter {\n  /**\n   * Formatter priority (lower = earlier in pipeline).\n   * Formatters are sorted by priority before being applied.\n   * Default is 100.\n   *\n   * @see Requirements 5.5\n   */\n  priority = 100;\n\n  /**\n   * Unique identifier for this formatter.\n   * Used for debugging and to identify formatters in the pipeline.\n   * Subclasses should provide a unique, descriptive id.\n   *\n   * @abstract\n   * @see Requirements 5.1\n   */\n  abstract readonly id: string;\n\n  /**\n   * The original unformatted text\n   * @protected\n   */\n  protected originalText = '';\n\n  /**\n   * The formatted text after applying transformations\n   * @protected\n   */\n  protected formattedText = '';\n\n  /**\n   * Metadata extracted during formatting (e.g., mentions, URLs)\n   * @protected\n   */\n  protected metadata: Record<string, unknown> = {};\n\n  /**\n   * Get the regex pattern for this formatter.\n   * This pattern is used to detect the text patterns that should be formatted.\n   *\n   * @abstract\n   * @returns The RegExp pattern for detecting formattable content\n   */\n  abstract getRegex(): RegExp;\n\n  /**\n   * Format the input text by applying transformations.\n   *\n   * Implementations should:\n   * 1. Store the original text in this.originalText\n   * 2. Apply transformations and store result in this.formattedText\n   * 3. Extract any metadata and store in this.metadata\n   * 4. Return the formatted text\n   *\n   * @abstract\n   * @param text - The text to format\n   * @returns The formatted text with transformations applied\n   */\n  abstract format(text: string): string;\n\n  /**\n   * Get the formatted text after format() has been called.\n   *\n   * @returns The formatted text, or empty string if format() hasn't been called\n   */\n  getFormattedText(): string {\n    return this.formattedText;\n  }\n\n  /**\n   * Get the original unformatted text.\n   *\n   * @returns The original text before formatting, or empty string if format() hasn't been called\n   */\n  getOriginalText(): string {\n    return this.originalText;\n  }\n\n  /**\n   * Get metadata extracted during formatting.\n   *\n   * Metadata can include information like detected mentions, URLs, or other\n   * pattern-specific data that was extracted during the format() operation.\n   *\n   * @returns A record containing formatter-specific metadata\n   */\n  getMetadata(): Record<string, unknown> {\n    return this.metadata;\n  }\n\n  /**\n   * Reset the formatter state to initial values.\n   *\n   * This clears the original text, formatted text, and metadata.\n   * Call this method before reusing a formatter instance for new text.\n   */\n  reset(): void {\n    this.originalText = '';\n    this.formattedText = '';\n    this.metadata = {};\n  }\n\n  /**\n   * Check if this formatter should process the given text.\n   *\n   * Override this method to conditionally skip formatting based on\n   * the text content or message properties. By default, returns true\n   * to always apply formatting.\n   *\n   * @param text - The text to check\n   * @param message - The message containing the text (optional)\n   * @returns Whether to apply this formatter (default: true)\n   * @see Requirements 5.1\n   *\n   * @example\n   * ```typescript\n   * // Skip formatting for very short messages\n   * shouldFormat(text: string, message?: CometChat.BaseMessage): boolean {\n   *   return text.length > 10;\n   * }\n   *\n   * // Skip formatting for certain message types\n   * shouldFormat(text: string, message?: CometChat.BaseMessage): boolean {\n   *   return message?.getType() !== 'custom';\n   * }\n   * ```\n   */\n  shouldFormat(text: string, message?: CometChat.BaseMessage): boolean {\n    return true;\n  }\n}\n","/**\n * Types, interfaces, and regex constants for CometChatMentionsFormatter.\n */\n\nimport { MentionType } from '../Enums/Enums';\n\n/**\n * Represents mention metadata extracted from text.\n */\nexport interface MentionData {\n  /** The unique identifier of the mentioned user */\n  uid: string;\n  /** The display name of the mentioned user */\n  name: string;\n  /** The starting index of the mention in the original text */\n  startIndex: number;\n  /** The ending index of the mention in the original text (exclusive) */\n  endIndex: number;\n  /** The type of mention (self, other, or channel) */\n  type?: MentionType;\n}\n\n/** Regex pattern for parsing user mentions in SDK format: `<@uid:{uid}>` */\nexport const USER_MENTION_REGEX = /<@uid:(.*?)>/g;\n\n/** Regex pattern for parsing channel mentions: `<@all:{label}>` */\nexport const CHANNEL_MENTION_REGEX = /<@all:(.*?)>/g;\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatTextFormatter } from './cometchat-text-formatter';\nimport { MentionType, MessageBubbleAlignment } from '../Enums/Enums';\nimport type { MentionData } from './cometchat-mentions-formatter.types';\nimport { USER_MENTION_REGEX, CHANNEL_MENTION_REGEX } from './cometchat-mentions-formatter.types';\n\n// Re-export for backward compatibility\nexport type { MentionData } from './cometchat-mentions-formatter.types';\nexport { USER_MENTION_REGEX, CHANNEL_MENTION_REGEX } from './cometchat-mentions-formatter.types';\n\n/** Escapes special HTML characters to prevent XSS. */\nfunction escapeHtml(str: string): string {\n  return str\n    .replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;').replace(/'/g, '&#39;');\n}\n\n/**\n * Formatter for @mentions in text.\n *\n * Detects @username patterns and SDK format mentions (`<@uid:{uid}>`, `<@all:{label}>`)\n * and renders them as styled spans with BEM CSS classes.\n */\nexport class CometChatMentionsFormatter extends CometChatTextFormatter {\n  readonly id = 'mentions-formatter';\n  override priority = 20;\n\n  private mentions: MentionData[] = [];\n  private users = new Map<string, CometChat.User | CometChat.GroupMember>();\n  private enableAllMention = true;\n  private allMentionLabel = 'all';\n  private loggedInUser: CometChat.User | null = null;\n  private messageBubbleAlignment: MessageBubbleAlignment | undefined;\n\n  // ── Configuration ─────────────────────────────────────────────────────────\n\n  setLoggedInUser(user: CometChat.User | null): void { this.loggedInUser = user; }\n  getLoggedInUser(): CometChat.User | null { return this.loggedInUser; }\n\n  setMessageBubbleAlignment(alignment: MessageBubbleAlignment | undefined): void {\n    this.messageBubbleAlignment = alignment;\n  }\n  getMessageBubbleAlignment(): MessageBubbleAlignment | undefined { return this.messageBubbleAlignment; }\n\n  setUsers(users: (CometChat.User | CometChat.GroupMember)[]): void {\n    this.users.clear();\n    users.forEach(user => this.users.set(user.getName().toLowerCase(), user));\n  }\n\n  setAllMentionConfig(enabled: boolean, label = 'all'): void {\n    this.enableAllMention = enabled;\n    this.allMentionLabel = label;\n  }\n\n  // ── Regex ─────────────────────────────────────────────────────────────────\n\n  getRegex(): RegExp { return /@(\\w+)/g; }\n  getUserMentionRegex(): RegExp { return new RegExp(USER_MENTION_REGEX.source, 'g'); }\n  getChannelMentionRegex(): RegExp { return new RegExp(CHANNEL_MENTION_REGEX.source, 'g'); }\n\n  // ── Format (plain text @mentions) ────────────────────────────────────────\n\n  format(text: string): string {\n    if (text == null) { this.originalText = ''; this.formattedText = ''; this.metadata = { mentions: [] }; return ''; }\n    this.originalText = text;\n    this.mentions = [];\n    let lastIndex = 0;\n    let result = '';\n    const regex = this.getRegex();\n    let match: RegExpExecArray | null;\n\n    while ((match = regex.exec(text)) !== null) {\n      const fullMatch = match[0];\n      const username = match[1];\n      const start = match.index;\n      const end = start + fullMatch.length;\n      result += text.slice(lastIndex, start);\n\n      if (this.enableAllMention && username.toLowerCase() === this.allMentionLabel.toLowerCase()) {\n        this.mentions.push({ uid: 'all', name: this.allMentionLabel, startIndex: start, endIndex: end, type: MentionType.channel });\n        const css = this.buildMentionCssClasses(MentionType.channel);\n        result += `<span class=\"${css}\" data-uid=\"all\" data-mention-type=\"channel\" data-self=\"true\">@${escapeHtml(this.allMentionLabel)}</span>`;\n      } else {\n        const user = this.users.get(username.toLowerCase());\n        if (user) {\n          const uid = user.getUid();\n          const displayName = user.getName();\n          const mentionType = this.getMentionType(uid);\n          this.mentions.push({ uid, name: displayName, startIndex: start, endIndex: end, type: mentionType });\n          const css = this.buildMentionCssClasses(mentionType);\n          const isSelf = mentionType === MentionType.self;\n          result += `<span class=\"${css}\" data-uid=\"${escapeHtml(uid)}\" data-mention-type=\"${mentionType}\" data-self=\"${isSelf}\">@${escapeHtml(displayName)}</span>`;\n        } else {\n          result += fullMatch;\n        }\n      }\n      lastIndex = end;\n    }\n\n    result += text.slice(lastIndex);\n    this.formattedText = result;\n    this.metadata = { mentions: this.mentions };\n    return this.formattedText;\n  }\n\n  // ── Format SDK mentions ───────────────────────────────────────────────────\n\n  formatSdkMentions(\n    text: string,\n    mentionedUsers: (CometChat.User | CometChat.GroupMember)[] = []\n  ): string {\n    this.originalText = text;\n    this.mentions = [];\n    const userMap = new Map<string, CometChat.User | CometChat.GroupMember>();\n    mentionedUsers.forEach(user => userMap.set(user.getUid(), user));\n\n    let result = text;\n\n    // Process channel mentions first\n    result = result.replace(this.getChannelMentionRegex(), (fullMatch, label, offset) => {\n      this.mentions.push({ uid: 'all', name: label || this.allMentionLabel, startIndex: offset, endIndex: offset + fullMatch.length, type: MentionType.channel });\n      const css = this.buildMentionCssClasses(MentionType.channel);\n      const displayLabel = label || this.allMentionLabel;\n      return `<span class=\"${css}\" data-uid=\"all\" data-mention-type=\"channel\" data-self=\"true\" contenteditable=\"false\">@${escapeHtml(displayLabel)}</span>`;\n    });\n\n    // Process user mentions\n    result = result.replace(this.getUserMentionRegex(), (fullMatch, uid, offset) => {\n      if (!uid || uid.trim() === '') return '';\n      const user = userMap.get(uid);\n      const displayName = user ? user.getName() : uid;\n      if (!displayName || displayName.trim() === '') return '';\n      const mentionType = this.getMentionType(uid);\n      this.mentions.push({ uid, name: displayName, startIndex: offset, endIndex: offset + fullMatch.length, type: mentionType });\n      const css = this.buildMentionCssClasses(mentionType);\n      const isSelf = mentionType === MentionType.self;\n      return `<span class=\"${css}\" data-uid=\"${escapeHtml(uid)}\" data-mention-type=\"${mentionType}\" data-self=\"${isSelf}\" contenteditable=\"false\">@${escapeHtml(displayName)}</span>`;\n    });\n\n    this.formattedText = result;\n    this.metadata = { mentions: this.mentions };\n    return this.formattedText;\n  }\n\n  // ── Extraction Helpers ────────────────────────────────────────────────────\n\n  extractUserUids(text: string): string[] {\n    const uids: string[] = [];\n    const regex = this.getUserMentionRegex();\n    let match: RegExpExecArray | null;\n    while ((match = regex.exec(text)) !== null) {\n      const uid = match[1];\n      if (uid && !uids.includes(uid)) { uids.push(uid); }\n    }\n    return uids;\n  }\n\n  extractChannelLabels(text: string): string[] {\n    const labels: string[] = [];\n    const regex = this.getChannelMentionRegex();\n    let match: RegExpExecArray | null;\n    while ((match = regex.exec(text)) !== null) {\n      const label = match[1];\n      if (label && !labels.includes(label)) { labels.push(label); }\n    }\n    return labels;\n  }\n\n  hasSdkMentions(text: string): boolean {\n    return this.getUserMentionRegex().test(text) || this.getChannelMentionRegex().test(text);\n  }\n\n  getMentions(): MentionData[] { return [...this.mentions]; }\n  hasMentions(): boolean { return this.mentions.length > 0; }\n  hasAllMention(): boolean { return this.mentions.some(m => m.uid === 'all'); }\n\n  override reset(): void { super.reset(); this.mentions = []; }\n\n  // ── Private Helpers ───────────────────────────────────────────────────────\n\n  private getMentionType(uid: string): MentionType {\n    return this.loggedInUser && this.loggedInUser.getUid() === uid\n      ? MentionType.self\n      : MentionType.other;\n  }\n\n  private buildMentionCssClasses(mentionType: MentionType): string {\n    const classes = ['cometchat-mentions'];\n    classes.push(mentionType === MentionType.self || mentionType === MentionType.channel\n      ? 'cometchat-mentions-you'\n      : 'cometchat-mentions-other');\n    if (this.messageBubbleAlignment === MessageBubbleAlignment.left) { classes.push('cometchat-mentions-incoming'); }\n    else if (this.messageBubbleAlignment === MessageBubbleAlignment.right) { classes.push('cometchat-mentions-outgoing'); }\n    return classes.join(' ');\n  }\n}\n","/**\n * Markdown conversion utilities for RichTextEditor.\n *\n * Extracted from rich-text-editor.class.ts to isolate markdown-to-HTML\n * and HTML-to-markdown conversion logic in a focused, testable module.\n */\n\n// ==================== Markdown → HTML ====================\n\n/**\n * Converts a markdown string to an HTML string.\n * Handles block-level elements (headings, lists, blockquotes, code blocks)\n * and inline elements (bold, italic, code, links, strikethrough).\n *\n * @param text - Raw markdown text\n * @returns HTML string\n */\nexport function markdownToHtml(text: string): string {\n  if (!text) return '';\n\n  let html = text;\n\n  // Escape HTML entities first to prevent XSS\n  html = escapeHtmlEntities(html);\n\n  // ── Step 1: Extract multi-line block elements into placeholders ──────────\n  // wrapParagraphs splits on \\n, so any block element that spans multiple\n  // lines (pre/code blocks, multi-line blockquotes) must be pulled out first,\n  // processed, then restored after paragraph-wrapping is done.\n  const blockPlaceholders: string[] = [];\n\n  // Code blocks (``` ... ```) — must come before inline code\n  html = html.replace(/```([\\s\\S]*?)```/g, (_match, code: string) => {\n    const idx = blockPlaceholders.length;\n    // Trim leading/trailing newlines from the code content to avoid extra whitespace\n    const trimmedCode = code.replace(/^\\n/, '').replace(/\\n$/, '');\n    blockPlaceholders.push(`<pre class=\"cometchat-rich-text__code-block\"><code class=\"cometchat-rich-text__code\">${trimmedCode}</code></pre>`);\n    return `\\x00BLOCK${idx}\\x00`;\n  });\n\n  // ── Step 2: Single-line block elements ───────────────────────────────────\n\n  // Blockquotes (> text) — after escaping, \">\" becomes \"&gt;\"\n  html = html.replace(/^&gt; (.+)$/gm, '<blockquote class=\"cometchat-rich-text__blockquote\">$1</blockquote>');\n\n  // Ordered lists (1. item)\n  html = convertOrderedLists(html);\n\n  // Unordered lists (- item or * item)\n  html = convertUnorderedLists(html);\n\n  // Headings (# H1, ## H2, ### H3)\n  html = html.replace(/^### (.+)$/gm, '<h3>$1</h3>');\n  html = html.replace(/^## (.+)$/gm, '<h2>$1</h2>');\n  html = html.replace(/^# (.+)$/gm, '<h1>$1</h1>');\n\n  // ── Step 3: Inline elements ───────────────────────────────────────────────\n  html = convertInlineMarkdown(html);\n\n  // ── Step 4: Wrap bare lines in <p> tags ──────────────────────────────────\n  html = wrapParagraphs(html);\n\n  // ── Step 5: Restore multi-line block placeholders ────────────────────────\n  html = html.replace(/\\x00BLOCK(\\d+)\\x00/g, (_match, idx: string) => {\n    return blockPlaceholders[parseInt(idx, 10)];\n  });\n\n  return html;\n}\n\n/**\n * Converts inline markdown syntax to HTML.\n * Handles bold, italic, strikethrough, inline code, and links.\n *\n * Uses a placeholder strategy to protect link syntax from being mangled\n * by bold/italic regexes:\n *  1. Extract all [label](url) patterns into indexed placeholders\n *  2. Run bold/italic/strikethrough/code on the placeholder-safe text\n *  3. Restore placeholders as proper <a> tags\n *\n * This prevents underscores or asterisks inside link labels or URLs\n * (e.g. target=\"_blank\") from being misinterpreted as italic/bold markers.\n */\nexport function convertInlineMarkdown(text: string): string {\n  // Step 1: Extract markdown links into placeholders\n  const linkPlaceholders: Array<{ label: string; url: string }> = [];\n  let result = text.replace(\n    /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n    (_match, label: string, url: string) => {\n      const idx = linkPlaceholders.length;\n      linkPlaceholders.push({ label, url });\n      return `\\x00LINK${idx}\\x00`;\n    }\n  );\n\n  // Step 2: Apply bold/italic/strikethrough/underline/code on placeholder-safe text\n  // Bold (**text**)\n  result = result.replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>');\n\n  // Underline (__text__)\n  result = result.replace(/__(.+?)__/g, '<u>$1</u>');\n\n  // Italic (*text* or _text_) — must come after bold and underline\n  // Use negative lookbehind/lookahead to prevent matching _ inside __\n  result = result.replace(/\\*(.+?)\\*/g, '<em>$1</em>');\n  result = result.replace(/(?<!_)_([^_]+)_(?!_)/g, '<em>$1</em>');\n\n  // Strikethrough (~~text~~)\n  result = result.replace(/~~(.+?)~~/g, '<s>$1</s>');\n\n  // Inline code (`code`)\n  result = result.replace(/`([^`]+)`/g, '<code class=\"cometchat-rich-text__code\">$1</code>');\n\n  // Step 3: Restore link placeholders as <a> tags\n  result = result.replace(/\\x00LINK(\\d+)\\x00/g, (_match, idx: string) => {\n    const { label, url } = linkPlaceholders[parseInt(idx, 10)];\n    return `<a href=\"${url}\" target=\"_blank\" rel=\"noopener noreferrer\">${label}</a>`;\n  });\n\n  return result;\n}\n\n// ==================== HTML → Markdown ====================\n\n/**\n * Converts an HTML element's content to a markdown string.\n * Used when extracting plain text with formatting from the editor.\n *\n * @param element - Root HTML element to convert\n * @returns Markdown string\n */\nexport function htmlToMarkdown(element: HTMLElement): string {\n  return convertNodeToMarkdown(element).trim();\n}\n\nfunction convertNodeToMarkdown(node: Node): string {\n  if (node.nodeType === Node.TEXT_NODE) {\n    return node.textContent ?? '';\n  }\n\n  if (node.nodeType !== Node.ELEMENT_NODE) return '';\n\n  const el = node as HTMLElement;\n  const tag = el.tagName.toLowerCase();\n  const children = Array.from(el.childNodes).map(convertNodeToMarkdown).join('');\n\n  switch (tag) {\n    case 'span': {\n      // ENG-35081: Convert mention spans back to SDK mention format so that\n      // copy-pasting @all or @user mentions preserves the structured mention data.\n      const uid = el.getAttribute('data-uid');\n      const mentionType = el.getAttribute('data-mention-type');\n      if (uid !== null) {\n        if (mentionType === 'channel' || uid === 'all') {\n          const label = (el.textContent || '@all').replace(/^@/, '');\n          return `<@all:${label}>`;\n        }\n        return `<@uid:${uid}>`;\n      }\n      return children;\n    }\n    case 'strong':\n    case 'b':\n      return `**${children}**`;\n    case 'em':\n    case 'i':\n      return `_${children}_`;\n    case 'u':\n      return `__${children}__`;\n    case 's':\n    case 'del':\n    case 'strike':\n      return `~~${children}~~`;\n    case 'code':\n      return el.closest('pre') ? children : `\\`${children}\\``;\n    case 'pre':\n      return `\\`\\`\\`\\n${children}\\n\\`\\`\\``;\n    case 'blockquote':\n      return children\n        .split('\\n')\n        .map(line => `> ${line}`)\n        .join('\\n');\n    case 'a': {\n      const href = el.getAttribute('href') ?? '';\n      return `[${children}](${href})`;\n    }\n    case 'br':\n      return '\\n';\n    case 'p':\n    case 'div':\n      return `${children}\\n`;\n    case 'li': {\n      const parent = el.parentElement;\n      // Calculate nesting depth for indentation\n      let depth = 0;\n      let ancestor: Element | null = parent?.parentElement ?? null;\n      while (ancestor) {\n        if (ancestor.tagName.toLowerCase() === 'ol' || ancestor.tagName.toLowerCase() === 'ul') depth++;\n        ancestor = ancestor.parentElement;\n      }\n      const indent = '    '.repeat(depth); // 4 spaces per level (matches CometChatMarkdownFormatter)\n      if (parent && parent.tagName.toLowerCase() === 'ol') {\n        const index = Array.from(parent.children).indexOf(el) + 1;\n        return `${indent}${index}. ${children}\\n`;\n      }\n      return `${indent}- ${children}\\n`;\n    }\n    case 'ul':\n    case 'ol':\n      // Add leading newline so nested lists start on a new line after parent text\n      return `\\n${children}`;\n    case 'h1':\n      return `# ${children}\\n`;\n    case 'h2':\n      return `## ${children}\\n`;\n    case 'h3':\n      return `### ${children}\\n`;\n    default:\n      return children;\n  }\n}\n\n// ==================== Auto-list Detection ====================\n\n/**\n * Checks whether the given text at the cursor position matches an auto-list trigger.\n * Returns the list type if matched, or null if not.\n *\n * Triggers:\n * - \"- \" or \"* \" → bullet list\n * - \"1. \" → ordered list\n */\nexport function detectAutoListTrigger(\n  textBeforeCursor: string\n): 'bullet' | 'ordered' | null {\n  if (/^[-*]\\s$/.test(textBeforeCursor)) return 'bullet';\n  if (/^\\d+\\.\\s$/.test(textBeforeCursor)) return 'ordered';\n  return null;\n}\n\n// ==================== Private Helpers ====================\n\nfunction escapeHtmlEntities(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\n}\n\nfunction convertOrderedLists(html: string): string {\n  return html.replace(/((?:^[ ]*\\d+\\. .+\\n?)+)/gm, match => {\n    return buildNestedList(match.trim().split('\\n'), 'ol');\n  });\n}\n\nfunction convertUnorderedLists(html: string): string {\n  return html.replace(/((?:^[ ]*[-*] .+\\n?)+)/gm, match => {\n    return buildNestedList(match.trim().split('\\n'), 'ul');\n  });\n}\n\n/**\n * Builds nested HTML list structure from indented markdown lines.\n * Each 4-space indent level creates a nested list.\n */\nfunction buildNestedList(lines: string[], defaultType: 'ol' | 'ul'): string {\n  let result = '';\n  const stack: { type: string; indent: number }[] = [];\n  \n  for (const line of lines) {\n    const indentMatch = line.match(/^( *)/);\n    const indent = indentMatch ? indentMatch[1].length : 0;\n    const depth = Math.floor(indent / 4); // 4 spaces per level (matches CometChatMarkdownFormatter)\n    const content = line.replace(/^ *(?:\\d+\\. |[-*] )/, '');\n    const lineType = /^ *\\d+\\./.test(line) ? 'ol' : 'ul';\n\n    // Close deeper levels\n    while (stack.length > depth + 1) {\n      const popped = stack.pop()!;\n      result += `</li></${popped.type}>`;\n    }\n\n    if (stack.length === 0) {\n      // Start the top-level list\n      result += `<${lineType}>`;\n      stack.push({ type: lineType, indent: 0 });\n    } else if (depth >= stack.length) {\n      // Go deeper — open a nested list inside the current <li>\n      result += `<${lineType}>`;\n      stack.push({ type: lineType, indent: depth });\n    } else {\n      // Same level — close previous <li>\n      result += '</li>';\n    }\n\n    result += `<li>${content}`;\n  }\n\n  // Close all remaining open tags\n  while (stack.length > 0) {\n    const popped = stack.pop()!;\n    result += `</li></${popped.type}>`;\n  }\n\n  return result;\n}\nfunction wrapParagraphs(html: string): string {\n  // Only wrap lines that aren't already block elements or don't contain block elements\n  const blockTags = /^<(h[1-6]|ul|ol|li|pre|blockquote|div|p)/i;\n  // Lines that ARE a block element (possibly with closing tag on same line)\n  const isBlockLine = /^<(h[1-6]|ul|ol|li|pre|blockquote|div|p)[\\s>]/i;\n  // Lines that contain a block-level element as their primary content\n  const containsBlock = /<(blockquote|pre|ul|ol|h[1-6]|div)[\\s>]/i;\n  return html\n    .split('\\n')\n    .map(line => {\n      if (!line.trim()) return '';\n      if (blockTags.test(line.trim())) return line;\n      if (isBlockLine.test(line.trim())) return line;\n      if (containsBlock.test(line)) return line;\n      return `<p>${line}</p>`;\n    })\n    .join('\\n');\n}\n","/**\n * Mention handling utilities for RichTextEditor class.\n *\n * Extracted from rich-text-editor.class.ts to isolate\n * mention node detection, boundary movement, and range intersection logic.\n */\n\n// ==================== Mention Node Detection ====================\n\n/**\n * CSS class applied to mention chip elements in the editor DOM.\n */\nexport const MENTION_CHIP_CLASS = 'cometchat-mention-chip';\n\n/**\n * Checks whether a DOM node is a mention chip element.\n */\nexport function isMentionNode(node: Node): boolean {\n  if (node.nodeType !== Node.ELEMENT_NODE) return false;\n  return (node as HTMLElement).classList.contains(MENTION_CHIP_CLASS);\n}\n\n/**\n * Walks up the DOM tree to find the nearest mention ancestor of a node.\n * Returns null if no mention ancestor is found.\n */\nexport function findMentionAncestor(node: Node): HTMLElement | null {\n  let current: Node | null = node;\n  while (current) {\n    if (isMentionNode(current)) return current as HTMLElement;\n    current = current.parentNode;\n  }\n  return null;\n}\n\n// ==================== Mention Range Helpers ====================\n\n/**\n * Collects all mention nodes that intersect with a given selection range.\n *\n * @param range - The current selection range\n * @param container - The editor's content-editable container\n */\nexport function getMentionsInRange(\n  range: Range,\n  container: HTMLElement\n): HTMLElement[] {\n  const mentions = Array.from(\n    container.querySelectorAll<HTMLElement>(`.${MENTION_CHIP_CLASS}`)\n  );\n  return mentions.filter(mention => doesRangeIntersectNode(range, mention));\n}\n\n/**\n * Checks whether a range intersects with a given node.\n */\nexport function doesRangeIntersectNode(range: Range, node: Node): boolean {\n  const nodeRange = document.createRange();\n  nodeRange.selectNode(node);\n  return (\n    range.compareBoundaryPoints(Range.END_TO_START, nodeRange) < 0 &&\n    range.compareBoundaryPoints(Range.START_TO_END, nodeRange) > 0\n  );\n}\n\n/**\n * Extends a selection range to fully include any partially-selected mention nodes.\n *\n * @param range - The range to extend (modified in place)\n * @param mentions - Mention nodes that intersect the range\n */\nexport function extendSelectionToIncludeMentions(\n  range: Range,\n  mentions: HTMLElement[]\n): void {\n  if (mentions.length === 0) return;\n\n  const first = mentions[0];\n  const last = mentions[mentions.length - 1];\n\n  // Extend start to include first mention if partially selected\n  const firstRange = document.createRange();\n  firstRange.selectNode(first);\n  if (range.compareBoundaryPoints(Range.START_TO_START, firstRange) > 0) {\n    range.setStartBefore(first);\n  }\n\n  // Extend end to include last mention if partially selected\n  const lastRange = document.createRange();\n  lastRange.selectNode(last);\n  if (range.compareBoundaryPoints(Range.END_TO_END, lastRange) < 0) {\n    range.setEndAfter(last);\n  }\n}\n\n// ==================== Cursor Boundary Movement ====================\n\n/**\n * Moves the cursor to the appropriate boundary of a mention node\n * when the cursor is placed inside it.\n *\n * @param mentionNode - The mention chip element\n * @param range - The current selection range\n */\nexport function moveCursorToMentionBoundary(\n  mentionNode: HTMLElement,\n  range: Range\n): void {\n  const mentionRange = document.createRange();\n  mentionRange.selectNode(mentionNode);\n\n  const mentionMidpoint =\n    (mentionRange.getBoundingClientRect().left +\n      mentionRange.getBoundingClientRect().right) /\n    2;\n\n  const cursorX = range.getBoundingClientRect().left;\n\n  if (cursorX <= mentionMidpoint) {\n    // Move cursor before the mention\n    range.setStartBefore(mentionNode);\n    range.setEndBefore(mentionNode);\n  } else {\n    // Move cursor after the mention\n    range.setStartAfter(mentionNode);\n    range.setEndAfter(mentionNode);\n  }\n\n  const selection = window.getSelection();\n  if (selection) {\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n}\n\n// ==================== Mention Text Extraction ====================\n\n/**\n * Extracts all unique mention UIDs from the editor's content.\n *\n * @param container - The editor's content-editable container\n */\nexport function getUniqueMentionUids(container: HTMLElement): Set<string> {\n  const uids = new Set<string>();\n  const mentions = container.querySelectorAll<HTMLElement>(`.${MENTION_CHIP_CLASS}`);\n  mentions.forEach(mention => {\n    const uid = mention.getAttribute('data-uid');\n    if (uid) uids.add(uid);\n  });\n  return uids;\n}\n\n/**\n * Converts mention chip elements to SDK mention format (@uid).\n * Used when extracting text for message sending.\n *\n * @param container - The editor's content-editable container\n */\nexport function convertMentionsToPlainText(container: Element): void {\n  const mentions = container.querySelectorAll<HTMLElement>(`.${MENTION_CHIP_CLASS}`);\n  mentions.forEach(mention => {\n    const uid = mention.getAttribute('data-uid') || '';\n    const textNode = document.createTextNode(`@${uid}`);\n    mention.parentNode?.replaceChild(textNode, mention);\n  });\n}\n","/**\n * Extracted keyboard handler logic for RichTextEditor.\n * Called from RichTextEditor.handleKeyDown via delegation.\n */\n\nexport interface KeyDownHandlerContext {\n  config: { enableFormatting?: boolean };\n  handleMentionDeletion(event: KeyboardEvent): boolean;\n  applyBold(): void;\n  applyItalic(): void;\n  applyUnderline(): void;\n  undo(): boolean;\n  redo(): boolean;\n  isInBlockquote(): boolean;\n  shouldExitBlockquote(): boolean;\n  exitBlockquote(): void;\n  pushToHistory(): void;\n  emitUpdate(): void;\n  isInCodeBlock(): boolean;\n  shouldExitCodeBlock(): boolean;\n  exitCodeBlock(): void;\n  getCurrentListItem(): HTMLElement | null;\n  listManager: {\n    exitList(): void;\n    createNewListItem(): void;\n    handleTabKey(event: KeyboardEvent): boolean;\n    handleShiftTabKey(event: KeyboardEvent): boolean;\n  };\n  scrollCursorIntoView(): void;\n}\n\nexport function handleKeyDownImpl(ctx: KeyDownHandlerContext, event: KeyboardEvent): void {\n  const isCtrlOrCmd = event.ctrlKey || event.metaKey;\n  if (event.key === 'Backspace' || event.key === 'Delete') {\n    if (ctx.handleMentionDeletion(event)) { return; }\n  }\n  if (isCtrlOrCmd && !event.shiftKey && ctx.config.enableFormatting !== false) {\n    if (event.key === 'b' || event.key === 'B') { event.preventDefault(); ctx.applyBold(); return; }\n    if (event.key === 'i' || event.key === 'I') { event.preventDefault(); ctx.applyItalic(); return; }\n    if (event.key === 'u' || event.key === 'U') { event.preventDefault(); ctx.applyUnderline(); return; }\n  }\n  if (isCtrlOrCmd && event.key === 'z' && !event.shiftKey) { event.preventDefault(); ctx.undo(); return; }\n  if (\n    isCtrlOrCmd &&\n    (event.key === 'y' ||\n      event.key === 'Y' ||\n      (event.key === 'z' && event.shiftKey) ||\n      (event.key === 'Z' && event.shiftKey))\n  ) {\n    event.preventDefault();\n    ctx.redo();\n    return;\n  }\n  if (event.key === 'Enter') {\n    if (ctx.isInBlockquote()) {\n      if (event.shiftKey) {\n        if (ctx.shouldExitBlockquote()) {\n          event.preventDefault();\n          ctx.exitBlockquote();\n          ctx.pushToHistory();\n          ctx.emitUpdate();\n          return;\n        }\n        // ENG-35733: Shift+Enter inside a blockquote that isn't at the exit\n        // boundary should insert a line break. Let the browser handle it by\n        // not returning early here — fall through to the default behaviour.\n        return;\n      }\n      return;\n    }\n    if (ctx.isInCodeBlock()) {\n      if (event.shiftKey) {\n        if (ctx.shouldExitCodeBlock()) {\n          event.preventDefault();\n          ctx.exitCodeBlock();\n          ctx.pushToHistory();\n          ctx.emitUpdate();\n          return;\n        }\n        // ENG-35733: Shift+Enter inside a code block that isn't at the exit\n        // boundary should insert a newline. Let the browser handle it.\n        return;\n      }\n      // Plain Enter inside a code block → browser inserts newline naturally.\n      return;\n    }\n    const listItem = ctx.getCurrentListItem();\n    if (listItem) {\n      // In a list, both Enter and Shift+Enter create a new list item or exit.\n      // The composer layer (handleRichTextKeydownImpl) is responsible for\n      // intercepting plain Enter to send the message BEFORE this handler runs.\n      // If we reach here, it means the key wasn't consumed upstream.\n      //\n      // Behavior:\n      // - Enter OR Shift+Enter on non-empty item → create next list item\n      // - Enter OR Shift+Enter on empty item → exit the list\n      event.preventDefault();\n      const isEmpty = listItem.textContent?.trim() === '';\n      const hasOnlyBr = listItem.innerHTML.trim() === '<br>' || listItem.innerHTML.trim() === '';\n      if (isEmpty || hasOnlyBr) {\n        ctx.listManager.exitList();\n        ctx.pushToHistory();\n        ctx.emitUpdate();\n        return;\n      } else {\n        ctx.listManager.createNewListItem();\n        ctx.pushToHistory();\n        ctx.emitUpdate();\n        return;\n      }\n    }\n    // Safari fires insertParagraph (not insertLineBreak) for Shift+Enter in\n    // contenteditable, and our beforeinput handler blocks insertParagraph when\n    // enterKeyBehavior is SendMessage. To ensure Shift+Enter consistently\n    // inserts a line break across all browsers, explicitly insert a <br>.\n    if (event.shiftKey) {\n      event.preventDefault();\n      const selection = (ctx as any).selectionManager?.getSelection() as Selection | null;\n      if (selection && selection.rangeCount > 0) {\n        const r = selection.getRangeAt(0);\n        r.deleteContents();\n        const br = document.createElement('br');\n        r.insertNode(br);\n        // Browsers collapse a trailing <br> at the end of a contenteditable.\n        // If the <br> we just inserted has no visible content after it, we\n        // must insert a second <br> so the cursor actually appears on a new\n        // line. This is the standard contenteditable line-break technique.\n        const afterBr = br.nextSibling;\n        const isAtEnd = !afterBr ||\n          (afterBr.nodeType === Node.TEXT_NODE && afterBr.textContent === '') ||\n          (afterBr.nodeType === Node.ELEMENT_NODE && (afterBr as HTMLElement).tagName === 'BR');\n        if (isAtEnd) {\n          const extraBr = document.createElement('br');\n          br.parentNode!.insertBefore(extraBr, br.nextSibling);\n        }\n        // Move cursor after the first <br> (between the two if extra was added)\n        const newRange = document.createRange();\n        newRange.setStartAfter(br);\n        newRange.collapse(true);\n        selection.removeAllRanges();\n        selection.addRange(newRange);\n        ctx.pushToHistory();\n        ctx.emitUpdate();\n      }\n      return;\n    }\n  }\n  if (event.key === 'Tab' && !event.shiftKey) {\n    if (ctx.listManager.handleTabKey(event)) { ctx.pushToHistory(); ctx.emitUpdate(); return; }\n  }\n  if (event.key === 'Tab' && event.shiftKey) {\n    if (ctx.listManager.handleShiftTabKey(event)) { ctx.pushToHistory(); ctx.emitUpdate(); return; }\n  }\n  if (['ArrowUp', 'ArrowDown', 'Enter', 'Backspace', 'Delete'].includes(event.key)) { ctx.scrollCursorIntoView(); }\n}\n","/**\n * Extracted paste/copy/drop handler logic for RichTextEditor.\n */\n\nexport interface PasteHandlerContext {\n  config: { enableFormatting?: boolean; onUpdate?: (html: string, text: string) => void };\n  selectionManager: {\n    getSelection(): Selection | null;\n    getSelectedHTML(): string;\n  };\n  contentEditableManager: {\n    sanitizeHTML(html: string): string;\n  };\n  linkManager: {\n    validateURL(url: string): boolean;\n    normalizeURL(url: string): string;\n    processAutoLink(html: string): string;\n  };\n  markdownToHtml(text: string): string;\n  htmlToMarkdown(element: HTMLElement): string;\n  pushToHistory(): void;\n  emitUpdate(): void;\n}\n\nexport function handlePasteImpl(ctx: PasteHandlerContext, event: ClipboardEvent): void {\n  const clipboardData = event.clipboardData;\n  if (!clipboardData) { return; }\n  const enableFormatting = ctx.config.enableFormatting !== false;\n  let pastedContent = clipboardData.getData('text/html');\n  const isHtml = !!pastedContent;\n  if (!pastedContent) { pastedContent = clipboardData.getData('text/plain'); }\n  if (!pastedContent) { return; }\n  event.preventDefault();\n  if (!enableFormatting) {\n    const plainText = clipboardData.getData('text/plain');\n    if (plainText) {\n      const selection = ctx.selectionManager.getSelection();\n      if (selection && selection.rangeCount > 0) {\n        const range = selection.getRangeAt(0);\n        range.deleteContents();\n        const textNode = document.createTextNode(plainText);\n        range.insertNode(textNode);\n        range.setStartAfter(textNode);\n        range.collapse(true);\n        selection.removeAllRanges();\n        selection.addRange(range);\n      }\n      ctx.pushToHistory();\n      ctx.emitUpdate();\n    }\n    return;\n  }\n  const plainText = clipboardData.getData('text/plain').trim();\n  if (plainText && ctx.linkManager.validateURL(plainText)) {\n    const selection = ctx.selectionManager.getSelection();\n    if (selection && selection.rangeCount > 0) {\n      const selectedText = selection.toString();\n      if (selectedText.length > 0) {\n        const normalizedUrl = ctx.linkManager.normalizeURL(plainText);\n        const range = selection.getRangeAt(0);\n        const link = document.createElement('a');\n        link.href = normalizedUrl;\n        link.className = 'cometchat-rich-text__link';\n        link.target = '_blank';\n        link.rel = 'noopener noreferrer';\n        link.textContent = selectedText;\n        range.deleteContents();\n        range.insertNode(link);\n        const newRange = document.createRange();\n        newRange.setStartAfter(link);\n        newRange.collapse(true);\n        selection.removeAllRanges();\n        selection.addRange(newRange);\n        ctx.pushToHistory();\n        ctx.emitUpdate();\n        return;\n      }\n    }\n  }\n  let processedContent: string;\n  if (isHtml) {\n    // ENG-35081: If the HTML contains mention spans (data-uid attribute), preserve\n    // the HTML to keep the structured mention data. Using the plain text fallback\n    // would lose the @all/@user mention structure, causing broken content in the editor.\n    const hasMentionSpans = pastedContent.includes('data-uid=');\n    const plainFallback = clipboardData.getData('text/plain');\n    if (plainFallback && !hasMentionSpans) {\n      processedContent = ctx.linkManager.processAutoLink(ctx.markdownToHtml(plainFallback));\n    } else {\n      processedContent = ctx.linkManager.processAutoLink(\n        ctx.contentEditableManager.sanitizeHTML(pastedContent)\n      );\n    }\n  } else {\n    processedContent = ctx.linkManager.processAutoLink(ctx.markdownToHtml(pastedContent));\n  }\n  const selection = ctx.selectionManager.getSelection();\n  if (selection && selection.rangeCount > 0) {\n    const range = selection.getRangeAt(0);\n    range.deleteContents();\n    const temp = document.createElement('div');\n    temp.innerHTML = processedContent;\n\n    // Flatten pasted lists when cursor is inside an existing list.\n    // Instead of nesting <ol> inside <ol>, extract the <li> items and\n    // append them to the current list (like Slack does).\n    let cursorInList = false;\n    let anchorNode: Node | null = range.startContainer;\n    while (anchorNode) {\n      if (anchorNode.nodeType === Node.ELEMENT_NODE) {\n        const tag = (anchorNode as HTMLElement).tagName?.toLowerCase();\n        if (tag === 'ol' || tag === 'ul') { cursorInList = true; break; }\n      }\n      anchorNode = anchorNode.parentNode;\n    }\n    if (cursorInList) {\n      // Extract <li> items from pasted list elements and insert them flat\n      const listElements = temp.querySelectorAll('ol, ul');\n      listElements.forEach((list) => {\n        const parent = list.parentNode;\n        while (list.firstChild) {\n          parent?.insertBefore(list.firstChild, list);\n        }\n        parent?.removeChild(list);\n      });\n    }\n\n    const fragment = document.createDocumentFragment();\n    let lastChild: Node | null = null;\n    while (temp.firstChild) {\n      lastChild = temp.firstChild;\n      fragment.appendChild(temp.firstChild);\n    }\n    range.insertNode(fragment);\n    // Place cursor at the deepest end of the last pasted node so it remains\n    // INSIDE formatting wrappers (e.g. <u>, <strong>) for format state detection.\n    if (lastChild) {\n      let cursorTarget: Node = lastChild;\n      while (cursorTarget.lastChild) {\n        cursorTarget = cursorTarget.lastChild;\n      }\n      const newRange = document.createRange();\n      if (cursorTarget.nodeType === Node.TEXT_NODE) {\n        newRange.setStart(cursorTarget, cursorTarget.textContent?.length || 0);\n      } else {\n        newRange.setStartAfter(cursorTarget);\n      }\n      newRange.collapse(true);\n      selection.removeAllRanges();\n      selection.addRange(newRange);\n    } else {\n      range.collapse(false);\n      selection.removeAllRanges();\n      selection.addRange(range);\n    }\n  }\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n  // Update toolbar format state to reflect the pasted content's formatting\n  // (e.g., underline active indicator after pasting underlined text)\n  if ((ctx as any).updateFormatState) { (ctx as any).updateFormatState(); }\n}\n\nexport function handleCopyImpl(ctx: PasteHandlerContext, event: ClipboardEvent): void {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return; }\n  const range = selection.getRangeAt(0);\n  if (range.collapsed) { return; }\n  const selectedHTML = ctx.selectionManager.getSelectedHTML();\n  const temp = document.createElement('div');\n  temp.innerHTML = selectedHTML;\n  const markdownText = ctx.htmlToMarkdown(temp);\n  if (event.clipboardData) { event.preventDefault(); event.clipboardData.setData('text/html', selectedHTML); event.clipboardData.setData('text/plain', markdownText); }\n}\n\nexport function handleDropImpl(ctx: PasteHandlerContext, event: DragEvent): void {\n  event.preventDefault();\n  const dataTransfer = event.dataTransfer;\n  if (!dataTransfer) { return; }\n  let droppedContent = dataTransfer.getData('text/html');\n  if (!droppedContent) { droppedContent = dataTransfer.getData('text/plain'); }\n  if (!droppedContent) { return; }\n  const range = document.caretRangeFromPoint?.(event.clientX, event.clientY);\n  if (!range) { return; }\n  const selection = ctx.selectionManager.getSelection();\n  if (selection) {\n    selection.removeAllRanges();\n    selection.addRange(range);\n    const temp = document.createElement('div');\n    temp.innerHTML = droppedContent;\n    const fragment = document.createDocumentFragment();\n    while (temp.firstChild) {\n      fragment.appendChild(temp.firstChild);\n    }\n    range.insertNode(fragment);\n    range.collapse(false);\n    selection.removeAllRanges();\n    selection.addRange(range);\n  }\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n}\n","/**\n * Extracted custom formatter logic for RichTextEditor.\n */\nimport {CometChatTextFormatter} from '../formatters/cometchat-text-formatter';\n\nexport interface CustomFormattersContext {\n  customFormatters: CometChatTextFormatter[];\n  contentEditable: HTMLDivElement;\n  isInBlockquote(): boolean;\n  getCharacterOffset(): number;\n  restoreCharacterOffset(offset: number): void;\n  selectionManager: { getSelection(): Selection | null };\n}\n\nexport function scheduleCustomFormattersImpl(\n  ctx: CustomFormattersContext,\n  timerRef: { value: ReturnType<typeof setTimeout> | null },\n  applyFn: () => void\n): void {\n  if (ctx.customFormatters.length === 0) return;\n  if (timerRef.value !== null) { clearTimeout(timerRef.value); }\n  timerRef.value = setTimeout(() => {\n    timerRef.value = null;\n    if (ctx.contentEditable.isConnected) { applyFn(); }\n  }, 150);\n}\n\nexport function applyCustomFormattersImpl(ctx: CustomFormattersContext): void {\n  if (ctx.customFormatters.length === 0) return;\n  const fullText = ctx.contentEditable.textContent || '';\n  const hasAnyMatch = ctx.customFormatters.some(f => {\n    const regex = f.getRegex();\n    if (!regex) return false;\n    const fresh = new RegExp(regex.source, regex.flags);\n    return fresh.test(fullText);\n  });\n  const existingSpans = ctx.contentEditable.querySelectorAll('span[data-custom-format]');\n  if (!hasAnyMatch && existingSpans.length === 0) return;\n  const insideBlockquote = ctx.isInBlockquote();\n  const charOffsetBackup = insideBlockquote ? ctx.getCharacterOffset() : -1;\n  const selection = ctx.selectionManager.getSelection();\n  const marker = document.createElement('span');\n  marker.setAttribute('data-cursor-marker', 'true');\n  marker.style.display = 'none';\n  let hasMarker = false;\n  if (selection && selection.rangeCount > 0) {\n    try {\n      const range = selection.getRangeAt(0).cloneRange();\n      range.collapse(true);\n      range.insertNode(marker);\n      hasMarker = true;\n    } catch {\n    }\n  }\n  existingSpans.forEach(span => {\n    const parent = span.parentNode;\n    if (!parent) return;\n    const textNode = document.createTextNode(span.textContent || '');\n    parent.replaceChild(textNode, span);\n  });\n  ctx.contentEditable.normalize();\n  const textNodes: Text[] = [];\n  const walker = document.createTreeWalker(\n    ctx.contentEditable,\n    NodeFilter.SHOW_TEXT,\n    {\n      acceptNode: (node: Node) => {\n        const parent = (node as Text).parentElement;\n        if (parent && (\n          parent.hasAttribute('data-uid') ||\n          parent.hasAttribute('data-mention-type') ||\n          parent.hasAttribute('data-cursor-marker')\n        )) {\n          return NodeFilter.FILTER_REJECT;\n        }\n        return NodeFilter.FILTER_ACCEPT;\n      }\n    }\n  );\n  let node: Node | null;\n  while ((node = walker.nextNode())) {\n    textNodes.push(node as Text);\n  }\n  for (const textNode of textNodes) {\n    const text = textNode.textContent || '';\n    if (!text) continue;\n    const matches: { start: number; end: number; matchText: string; formatter: CometChatTextFormatter }[] = [];\n    for (const formatter of ctx.customFormatters) {\n      const regex = formatter.getRegex();\n      if (!regex) continue;\n      const freshRegex = new RegExp(regex.source, regex.flags);\n      let match: RegExpExecArray | null;\n      while ((match = freshRegex.exec(text)) !== null) {\n        matches.push({\n          start: match.index,\n          end: match.index + match[0].length,\n          matchText: match[0],\n          formatter,\n        });\n      }\n    }\n    if (matches.length === 0) continue;\n    matches.sort((a, b) => a.start - b.start);\n    const fragment = document.createDocumentFragment();\n    let lastIndex = 0;\n    for (const m of matches) {\n      if (m.start > lastIndex) { fragment.appendChild(document.createTextNode(text.substring(lastIndex, m.start))); }\n      const formattedHtml = m.formatter.format(m.matchText);\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = formattedHtml;\n      const formattedSpan = tempDiv.querySelector('span');\n      const span = document.createElement('span');\n      span.setAttribute('data-custom-format', m.formatter.id);\n      if (formattedSpan) {\n        if (formattedSpan.className) span.className = formattedSpan.className;\n        if (formattedSpan.getAttribute('style')) span.setAttribute('style', formattedSpan.getAttribute('style')!);\n        for (const attr of Array.from(formattedSpan.attributes)) {\n          if (attr.name.startsWith('data-') && attr.name !== 'data-custom-format') { span.setAttribute(attr.name, attr.value); }\n        }\n      }\n      span.textContent = m.matchText;\n      fragment.appendChild(span);\n      lastIndex = m.end;\n    }\n    if (lastIndex < text.length) { fragment.appendChild(document.createTextNode(text.substring(lastIndex))); }\n    const parent = textNode.parentNode;\n    if (parent) { parent.replaceChild(fragment, textNode); }\n  }\n  if (hasMarker && marker.parentNode) {\n    const range = document.createRange();\n    range.setStartAfter(marker);\n    range.collapse(true);\n    if (selection) { selection.removeAllRanges(); selection.addRange(range); }\n    marker.parentNode.removeChild(marker);\n    if (insideBlockquote && charOffsetBackup >= 0) {\n      const restoredOffset = ctx.getCharacterOffset();\n      if (restoredOffset !== charOffsetBackup) { ctx.restoreCharacterOffset(charOffsetBackup); }\n    }\n  } else {\n    if (marker.parentNode) { marker.parentNode.removeChild(marker); }\n    if (insideBlockquote && charOffsetBackup >= 0) { ctx.restoreCharacterOffset(charOffsetBackup); }\n  }\n}\n","/**\n * Format application methods for RichTextEditor.\n * Extracted to reduce class file size.\n */\n\nimport { RichTextFormatState } from './rich-text-editor.interfaces';\n\nexport interface FormatOpsContext {\n  formatManager: any;\n  listManager: any;\n  linkManager: any;\n  contentEditable: HTMLDivElement;\n  currentFormatState: RichTextFormatState;\n  justAppliedFormatting: boolean;\n  protectMentionsFromFormatting: () => void;\n  convertMentionsToPlainText: (container: Element) => void;\n  updateFormatState: () => void;\n  emitUpdate: () => void;\n  pushToHistory: () => void;\n  announceToScreenReader: (msg: string) => void;\n}\n\nexport function applyBoldImpl(ctx: FormatOpsContext): void {\n  ctx.formatManager.applyBold();\n  ctx.protectMentionsFromFormatting();\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.bold ? 'Bold applied' : 'Bold removed');\n}\n\nexport function applyItalicImpl(ctx: FormatOpsContext): void {\n  ctx.formatManager.applyItalic();\n  ctx.protectMentionsFromFormatting();\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.italic ? 'Italic applied' : 'Italic removed');\n}\n\nexport function applyUnderlineImpl(ctx: FormatOpsContext): void {\n  ctx.formatManager.applyUnderline();\n  ctx.protectMentionsFromFormatting();\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.underline ? 'Underline applied' : 'Underline removed');\n}\n\nexport function applyStrikethroughImpl(ctx: FormatOpsContext): void {\n  ctx.formatManager.applyStrikethrough();\n  ctx.protectMentionsFromFormatting();\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.strikethrough ? 'Strikethrough applied' : 'Strikethrough removed');\n}\n\nexport function applyInlineCodeImpl(ctx: FormatOpsContext): void {\n  (ctx as any).justAppliedFormatting = true;\n  ctx.formatManager.applyInlineCode();\n  ctx.contentEditable.querySelectorAll('code').forEach((c: Element) => ctx.convertMentionsToPlainText(c));\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.code ? 'Code formatting applied' : 'Code formatting removed');\n}\n\nexport function applyCodeBlockImpl(ctx: FormatOpsContext): void {\n  (ctx as any).justAppliedFormatting = true;\n  if (ctx.currentFormatState.orderedList || ctx.currentFormatState.bulletList) {\n    ctx.listManager.exitList();\n    ctx.updateFormatState();\n  }\n  ctx.formatManager.applyCodeBlock();\n  ctx.contentEditable.querySelectorAll('pre').forEach((p: Element) => ctx.convertMentionsToPlainText(p));\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.codeBlock ? 'Code block applied' : 'Code block removed');\n}\n\nexport function applyBlockquoteImpl(ctx: FormatOpsContext): void {\n  (ctx as any).justAppliedFormatting = true;\n  ctx.formatManager.applyBlockquote();\n  ctx.updateFormatState();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.blockquote ? 'Blockquote applied' : 'Blockquote removed');\n}\n\nexport function applyOrderedListImpl(ctx: FormatOpsContext): void {\n  (ctx as any).justAppliedFormatting = true;\n  if (ctx.currentFormatState.codeBlock || ctx.contentEditable.querySelector('pre')) {\n    ctx.formatManager.applyCodeBlock();\n    ctx.updateFormatState();\n  }\n  // ENG-35096: Restore the saved selection before applying list formatting.\n  // Clicking the toolbar button blurs the contenteditable, losing the cursor\n  // position. Without restoring, the list manager's focus() call resets the\n  // cursor to position 0 instead of the user's current position.\n  const savedRange = (ctx as any).lastSavedRange as Range | null;\n  if (savedRange) {\n    const selection = window.getSelection();\n    if (selection) {\n      selection.removeAllRanges();\n      selection.addRange(savedRange);\n    }\n  }\n  ctx.listManager.toggleOrderedList();\n  ctx.updateFormatState();\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.orderedList ? 'Ordered list applied' : 'Ordered list removed');\n}\n\nexport function applyBulletListImpl(ctx: FormatOpsContext): void {\n  (ctx as any).justAppliedFormatting = true;\n  if (ctx.currentFormatState.codeBlock || ctx.contentEditable.querySelector('pre')) {\n    ctx.formatManager.applyCodeBlock();\n    ctx.updateFormatState();\n  }\n  // ENG-35096: Same fix — restore saved selection before applying bullet list.\n  const savedRange = (ctx as any).lastSavedRange as Range | null;\n  if (savedRange) {\n    const selection = window.getSelection();\n    if (selection) {\n      selection.removeAllRanges();\n      selection.addRange(savedRange);\n    }\n  }\n  ctx.listManager.toggleBulletList();\n  ctx.updateFormatState();\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(ctx.currentFormatState.bulletList ? 'Bullet list applied' : 'Bullet list removed');\n}\n\nexport function setLinkImpl(ctx: FormatOpsContext, url: string | null, text?: string): void {\n  if (url === null) { ctx.linkManager.removeLink(); } else if (ctx.linkManager.isLinkActive()) { ctx.linkManager.updateLink(url, text); } else { ctx.linkManager.insertLink(url, text); }\n  ctx.updateFormatState();\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n}\n\nexport function isLinkActiveImpl(ctx: FormatOpsContext): boolean { return ctx.linkManager.isLinkActive(); }\nexport function getCurrentLinkImpl(ctx: FormatOpsContext): string | null { return ctx.linkManager.getCurrentLink(); }\nexport function getCurrentLinkTextImpl(ctx: FormatOpsContext): string | null { return ctx.linkManager.getCurrentLinkText(); }\nexport function isInListImpl(ctx: FormatOpsContext): boolean { return ctx.listManager.isInList(); }\n","/**\n * Selection/cursor operation methods for RichTextEditor.\n * Extracted to reduce class file size.\n */\n\nimport { SelectionState } from './rich-text-editor.interfaces';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\nexport interface SelectionOpsContext {\n  selectionManager: any;\n  contentEditable: HTMLDivElement;\n  lastSavedRange: Range | null;\n  pushToHistory: () => void;\n  emitUpdate: () => void;\n}\n\nexport function setCursorPositionImpl(ctx: SelectionOpsContext, position: 'start' | 'end' | number): void {\n  ctx.selectionManager.setCursorPosition(position);\n}\n\nexport function selectAllImpl(ctx: SelectionOpsContext): void {\n  ctx.selectionManager.selectAll();\n}\n\nexport function getSelectionImpl(ctx: SelectionOpsContext): Selection | null {\n  return ctx.selectionManager.getSelection();\n}\n\nexport function getSelectedTextImpl(ctx: SelectionOpsContext): string {\n  return ctx.selectionManager.getSelectedText();\n}\n\nexport function saveSelectionImpl(ctx: SelectionOpsContext): SelectionState {\n  return ctx.selectionManager.saveSelection();\n}\n\nexport function restoreSelectionImpl(ctx: SelectionOpsContext, state: SelectionState): void {\n  ctx.selectionManager.restoreSelection(state);\n}\n\nexport function getFormatStateImpl(ctx: SelectionOpsContext): any {\n  return (ctx as any).currentFormatState;\n}\n\nexport function insertTextImpl(ctx: SelectionOpsContext, text: string): void {\n  if (!ctx.contentEditable.contains(document.activeElement)) { ctx.contentEditable.focus(); }\n  let selection = ctx.selectionManager.getSelection();\n  let range: Range;\n  if (selection && selection.rangeCount > 0) { range = selection.getRangeAt(0); } else if (ctx.lastSavedRange) {\n    range = ctx.lastSavedRange;\n    if (selection) { selection.removeAllRanges(); selection.addRange(range); }\n  } else {\n    range = document.createRange();\n    range.selectNodeContents(ctx.contentEditable);\n    range.collapse(false);\n    if (selection) { selection.removeAllRanges(); selection.addRange(range); }\n  }\n  range.deleteContents();\n  const textNode = document.createTextNode(text);\n  range.insertNode(textNode);\n  range.setStartAfter(textNode);\n  range.collapse(true);\n  selection = ctx.selectionManager.getSelection();\n  if (selection) { selection.removeAllRanges(); selection.addRange(range); }\n  (ctx as any).lastSavedRange = null;\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n}\n\nexport function deleteRangeImpl(ctx: SelectionOpsContext, from: number, to: number): void {\n  if (from < 0 || to < from) { CometChatLogger.warn('RichTextEditor', 'Invalid range for deleteRange:', from, to); return; }\n  const startNode = ctx.selectionManager['getTextNodeAtOffset'](from);\n  const endNode = ctx.selectionManager['getTextNodeAtOffset'](to);\n  if (!startNode || !endNode) { CometChatLogger.warn('RichTextEditor', 'Could not find nodes at specified positions'); return; }\n  const range = document.createRange();\n  range.setStart(startNode.node, startNode.offset);\n  range.setEnd(endNode.node, endNode.offset);\n  range.deleteContents();\n  const selection = ctx.selectionManager.getSelection();\n  if (selection) { range.collapse(true); selection.removeAllRanges(); selection.addRange(range); }\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n}\n\nexport function getCharacterOffsetImpl(ctx: SelectionOpsContext): number {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) return 0;\n  const range = selection.getRangeAt(0);\n  const preRange = document.createRange();\n  preRange.selectNodeContents(ctx.contentEditable);\n  preRange.setEnd(range.startContainer, range.startOffset);\n  return preRange.toString().length;\n}\n\nexport function restoreCharacterOffsetImpl(ctx: SelectionOpsContext, targetOffset: number): void {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection) return;\n  let currentOffset = 0;\n  const walker = document.createTreeWalker(ctx.contentEditable, NodeFilter.SHOW_TEXT);\n  let textNode: Text | null;\n  while ((textNode = walker.nextNode() as Text | null)) {\n    const nodeLength = (textNode.textContent || '').length;\n    if (currentOffset + nodeLength >= targetOffset) {\n      const range = document.createRange();\n      range.setStart(textNode, targetOffset - currentOffset);\n      range.collapse(true);\n      selection.removeAllRanges();\n      selection.addRange(range);\n      return;\n    }\n    currentOffset += nodeLength;\n  }\n  const range = document.createRange();\n  range.selectNodeContents(ctx.contentEditable);\n  range.collapse(false);\n  selection.removeAllRanges();\n  selection.addRange(range);\n}\n","/**\n * Mention insertion/extraction methods for RichTextEditor.\n * Extracted to reduce class file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { markdownToHtml as markdownToHtmlUtil } from './rich-text-editor.markdown-utils';\n\nexport interface MentionOpsContext {\n  contentEditable: HTMLDivElement;\n  selectionManager: any;\n  mentionsFormatter: any;\n  linkManager: { processAutoLink(html: string): string };\n  pushToHistory: () => void;\n  emitUpdate: () => void;\n  announceToScreenReader: (msg: string) => void;\n  getHTML: () => string;\n  setHTML: (html: string) => void;\n  getText: () => string;\n  initializeMentionsFormatter: (formatter?: any) => void;\n  convertInlineMarkdown: (text: string) => string;\n  escapeUserHtmlForEditor: (text: string) => string;\n  htmlToMarkdown: (element: HTMLElement) => string;\n}\n\nexport function insertMentionImpl(ctx: MentionOpsContext, id: string, label: string, charsToDelete: number, isSelf = false): void {\n  if (!id || id.trim() === '') { CometChatLogger.warn('RichTextEditor', 'Cannot insert mention with empty ID'); return; }\n  if (!label || label.trim() === '') { CometChatLogger.warn('RichTextEditor', 'Cannot insert mention with empty label'); return; }\n  const currentMentions = getUniqueMentionUidsImpl(ctx);\n  if (currentMentions.size >= 10 && !currentMentions.has(id)) { CometChatLogger.warn('RichTextEditor', 'Cannot add more than 10 unique mentions'); return; }\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return; }\n  const range = selection.getRangeAt(0);\n  if (charsToDelete > 0) { range.setStart(range.startContainer, Math.max(0, range.startOffset - charsToDelete)); range.deleteContents(); }\n  const isChannelMention = id === 'all';\n  let mentionType: string;\n  let cssClass: string;\n  if (isChannelMention) { mentionType = 'channel'; cssClass = 'cometchat-mentions cometchat-mentions-you'; } else if (isSelf) {\n    mentionType = 'self'; cssClass = 'cometchat-mentions cometchat-mentions-you';\n  } else {\n    mentionType = 'other'; cssClass = 'cometchat-mentions cometchat-mentions-other';\n  }\n  const mentionSpan = document.createElement('span');\n  mentionSpan.className = cssClass;\n  mentionSpan.setAttribute('data-uid', id);\n  mentionSpan.setAttribute('data-mention-type', mentionType);\n  mentionSpan.setAttribute('contenteditable', 'false');\n  mentionSpan.textContent = `@${label}`;\n  range.insertNode(mentionSpan);\n  const spaceNode = document.createTextNode('\\u00A0');\n  range.setStartAfter(mentionSpan);\n  range.insertNode(spaceNode);\n  range.setStartAfter(spaceNode);\n  range.collapse(true);\n  selection.removeAllRanges();\n  selection.addRange(range);\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n  ctx.announceToScreenReader(`Mentioned ${label}`);\n}\n\nexport function getUniqueMentionUidsImpl(ctx: MentionOpsContext): Set<string> {\n  const uids = new Set<string>();\n  const mentionSpans = ctx.contentEditable.querySelectorAll('span[data-uid]');\n  mentionSpans.forEach(span => {\n    const uid = span.getAttribute('data-uid');\n    if (uid && uid !== 'all') { uids.add(uid); }\n  });\n  return uids;\n}\n\nexport function getTextWithMentionFormatImpl(ctx: MentionOpsContext): string {\n  const html = ctx.getHTML();\n  const temp = document.createElement('div');\n  temp.innerHTML = html;\n  const mentionSpans = temp.querySelectorAll('span[data-uid]');\n  mentionSpans.forEach(span => {\n    const uid = span.getAttribute('data-uid');\n    const mentionType = span.getAttribute('data-mention-type');\n    if (uid === 'all' && mentionType === 'channel') {\n      const label = span.textContent?.replace('@', '') || 'all';\n      const textNode = document.createTextNode(`<@all:${label}>`);\n      span.parentNode?.replaceChild(textNode, span);\n    } else if (uid && uid.trim() !== '') {\n      const textNode = document.createTextNode(`<@uid:${uid}>`);\n      span.parentNode?.replaceChild(textNode, span);\n    } else {\n      const textContent = span.textContent || '';\n      const textNode = document.createTextNode(textContent);\n      span.parentNode?.replaceChild(textNode, span);\n    }\n  });\n  return ctx.htmlToMarkdown(temp);\n}\n\nexport function setContentWithMentionsImpl(ctx: MentionOpsContext, text: string, mentionedUsers: (CometChat.User | CometChat.GroupMember)[]): void {\n  if (!ctx.mentionsFormatter) { ctx.initializeMentionsFormatter(); }\n  // ENG-35077: Use the full markdownToHtml conversion (not just inline markdown)\n  // so that block-level formatting like blockquotes (>) and lists (-) are properly\n  // rendered in the editor when editing a formatted message.\n  // Protect SDK mention tags (<@uid:xxx>, <@all:label>) from being processed.\n  const sdkMentionRegex = /<@(uid|all):[^>]*>/g;\n  const mentionPlaceholders: string[] = [];\n  const textWithPlaceholders = text.replace(sdkMentionRegex, (match: string) => {\n    const idx = mentionPlaceholders.length;\n    mentionPlaceholders.push(match);\n    return `\\x00SDKMENTION${idx}\\x00`;\n  });\n  // Use full markdown-to-HTML conversion (handles blockquotes, lists, inline formatting)\n  let formattedHtml = markdownToHtmlUtil(textWithPlaceholders);\n  // Restore SDK mention placeholders\n  formattedHtml = formattedHtml.replace(/\\x00SDKMENTION(\\d+)\\x00/g, (_: string, idx: string) => {\n    return mentionPlaceholders[parseInt(idx, 10)];\n  });\n  // Auto-link URLs in the converted HTML\n  formattedHtml = ctx.linkManager.processAutoLink(formattedHtml);\n  const finalHtml = ctx.mentionsFormatter!.formatSdkMentions(formattedHtml, mentionedUsers);\n  ctx.setHTML(finalHtml);\n}\n\nexport function escapeUserHtmlForEditorImpl(_ctx: MentionOpsContext, text: string): string {\n  if (!text) { return text; }\n  const sdkMentionRegex = /<@(uid|all):[^>]*>/g;\n  const placeholders: string[] = [];\n  let escaped = text.replace(sdkMentionRegex, (match: string) => {\n    const idx = placeholders.length;\n    placeholders.push(match);\n    return `\\x00SDKMENTION${idx}\\x00`;\n  });\n  escaped = escaped\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n  escaped = escaped.replace(/\\x00SDKMENTION(\\d+)\\x00/g, (_: string, idx: string) => {\n    return placeholders[parseInt(idx, 10)];\n  });\n  return escaped;\n}\n","export function handleInputImpl(ctx: any): void {\n  if (ctx.justAppliedFormatting) {\n    ctx.justAppliedFormatting = false;\n    ctx.pushToHistory();\n    ctx.emitUpdate();\n    return;\n  }\n  // When typing inside an inline <code> element, skip all DOM manipulation\n  // (ZWS cleanup, markdown detection, auto-list) to prevent cursor jumps.\n  // Only push history and emit the update so the composer stays in sync.\n  const sel = ctx.selectionManager?.getSelection?.() ?? window.getSelection();\n  if (sel && sel.rangeCount > 0) {\n    let anchorNode: Node | null = sel.anchorNode;\n    while (anchorNode && anchorNode !== ctx.contentEditable) {\n      if (anchorNode.nodeType === Node.ELEMENT_NODE) {\n        const tag = (anchorNode as HTMLElement).tagName?.toLowerCase();\n        // <code> inside <pre> is a code block — only skip for inline <code>\n        if (tag === 'code' && !(anchorNode as HTMLElement).closest?.('pre')) {\n          ctx.pushToHistory();\n          ctx.emitUpdate();\n          return;\n        }\n      }\n      anchorNode = anchorNode.parentNode;\n    }\n  }\n  const insideBlockquote = ctx.isInBlockquote();\n  let savedOffset = -1;\n  if (insideBlockquote) { savedOffset = ctx.getCharacterOffset(); }\n  cleanupZeroWidthSpacesImpl(ctx);\n  if (ctx.config.enableFormatting !== false) {\n    if (ctx.detectAndConvertMarkdown()) { ctx.pushToHistory(); ctx.emitUpdate(); return; }\n    if (!ctx.listManager.isInList()) {\n      if (ctx.detectAndConvertAutoList()) { ctx.pushToHistory(); ctx.emitUpdate(); return; }\n    }\n  }\n  const text = ctx.getText().trim();\n  if (text === '') {\n    const html = ctx.contentEditable.innerHTML.trim();\n    if (html === '' || /^(<br\\s*\\/?>)+$/i.test(html)) {\n      ctx.contentEditable.innerHTML = '';\n      // Composer was emptied by manual deletion (backspace / select-all + delete).\n      // Drop any pending inline-mark state so the toolbar buttons go inactive too.\n      ctx.formatManager?.resetPendingEmptyFormats?.();\n      ctx.updateFormatState();\n      ctx.pushToHistory();\n      ctx.emitUpdate();\n      return;\n    }\n    const tempDiv = document.createElement('div');\n    tempDiv.innerHTML = html;\n    const allTextContent = tempDiv.textContent || '';\n    if (allTextContent.trim() === '') {\n      // No visible text content — clear the editor entirely\n      ctx.contentEditable.innerHTML = '';\n      ctx.formatManager?.resetPendingEmptyFormats?.();\n      ctx.updateFormatState();\n      ctx.pushToHistory();\n      ctx.emitUpdate();\n      return;\n    }\n  }\n  ctx.scheduleCustomFormatters();\n  if (insideBlockquote && savedOffset >= 0) {\n    const currentOffset = ctx.getCharacterOffset();\n    if (currentOffset !== savedOffset) { ctx.restoreCharacterOffset(savedOffset); }\n  }\n  // Sync link href when the visible text of a link is itself a URL that was edited.\n  // e.g., <a href=\"https://www.google.com\">www.facebook.com</a> → update href to match text.\n  syncLinkHrefsWithText(ctx);\n  ctx.pushToHistory();\n  ctx.emitUpdate();\n  scrollCursorIntoViewImpl(ctx);\n}\n\n/**\n * For all <a> links in the editor where the visible text is a URL,\n * sync the href to match the text content. This handles the case where\n * a user edits the displayed URL text (e.g., google → facebook) but\n * the href stays stale.\n */\nfunction syncLinkHrefsWithText(ctx: any): void {\n  const links = ctx.contentEditable.querySelectorAll('a.cometchat-rich-text__link');\n  for (const link of Array.from(links) as HTMLAnchorElement[]) {\n    const text = (link.textContent || '').trim();\n    if (!text) continue;\n    // Check if the visible text looks like a URL\n    const urlPattern = /^(https?:\\/\\/|www\\.)[^\\s]+$/i;\n    if (urlPattern.test(text)) {\n      const normalizedText = text.startsWith('http') ? text : `https://${text}`;\n      if (link.href !== normalizedText) {\n        link.href = normalizedText;\n      }\n    }\n  }\n}\n\nexport function handleBeforeInputImpl(ctx: any, event: InputEvent): void {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) return;\n  const range = selection.getRangeAt(0);\n  const node = range.startContainer;\n  const mentionAncestor = ctx.findMentionAncestor(node);\n  if (mentionAncestor) { event.preventDefault(); return; }\n  if (!range.collapsed) {\n    const endMention = ctx.findMentionAncestor(range.endContainer);\n    if (endMention) { event.preventDefault(); return; }\n  }\n}\n\nexport function cleanupZeroWidthSpacesImpl(ctx: any): void {\n  const selection = ctx.selectionManager.getSelection();\n  const range = selection && selection.rangeCount > 0 ? selection.getRangeAt(0) : null;\n  const codeElements = ctx.contentEditable.querySelectorAll('code');\n  let didCleanup = false;\n  codeElements.forEach((code: HTMLElement) => {\n    const text = code.textContent || '';\n    // Only remove ZWS when there are at least 2 real (non-ZWS) characters.\n    // This prevents cursor instability on the 2nd keystroke — the browser\n    // needs the text node to be stable between the 1st and 2nd input events.\n    const realCharCount = text.replace(/\\u200B/g, '').length;\n    if (realCharCount >= 2 && text.includes('\\u200B')) {\n      const walker = document.createTreeWalker(code, NodeFilter.SHOW_TEXT);\n      let node: Text | null;\n      while ((node = walker.nextNode() as Text | null)) {\n        if (node.data.includes('\\u200B')) {\n          if (range && range.startContainer === node) {\n            const zwsBeforeStart = (node.data.slice(0, range.startOffset).match(/\\u200B/g) || []).length;\n            if (zwsBeforeStart > 0) {\n              range.setStart(node, Math.max(0, range.startOffset - zwsBeforeStart));\n            }\n          }\n          if (range && range.endContainer === node) {\n            const zwsBeforeEnd = (node.data.slice(0, range.endOffset).match(/\\u200B/g) || []).length;\n            if (zwsBeforeEnd > 0) {\n              range.setEnd(node, Math.max(0, range.endOffset - zwsBeforeEnd));\n            }\n          }\n          node.data = node.data.replace(/\\u200B/g, '');\n          didCleanup = true;\n        }\n      }\n    }\n  });\n  // Only restore selection when ZWS was actually removed — otherwise the\n  // removeAllRanges/addRange call resets the cursor to a stale position,\n  // causing the cursor to jump to the start on the 2nd character typed.\n  if (didCleanup && range && selection) { selection.removeAllRanges(); selection.addRange(range); }\n}\n\nexport function scrollCursorIntoViewImpl(ctx: any): void {\n  requestAnimationFrame(() => {\n    if (ctx.destroyed) { return; }\n    const selection = window.getSelection();\n    if (!selection || selection.rangeCount === 0) { return; }\n    // Skip scroll-into-view when cursor is inside an inline <code> element —\n    // inline code is always short and the scroll logic's getBoundingClientRect\n    // calls can destabilize the cursor position in some browsers.\n    let node: Node | null = selection.anchorNode;\n    while (node && node !== ctx.contentEditable) {\n      if (node.nodeType === Node.ELEMENT_NODE) {\n        const tag = (node as HTMLElement).tagName?.toLowerCase();\n        if (tag === 'code') return;\n      }\n      node = node.parentNode;\n    }\n    let scrollContainer: HTMLElement | null = ctx.contentEditable.parentElement;\n    while (scrollContainer) {\n      const style = window.getComputedStyle(scrollContainer);\n      if (style.overflowY === 'auto' || style.overflowY === 'scroll') { break; }\n      scrollContainer = scrollContainer.parentElement;\n    }\n    if (!scrollContainer || scrollContainer.scrollHeight <= scrollContainer.clientHeight) { return; }\n    const range = selection.getRangeAt(0).cloneRange();\n    range.collapse(false);\n    let cursorRect = range.getBoundingClientRect();\n    if (cursorRect.height === 0) {\n      const node = selection.focusNode;\n      const el = node?.nodeType === Node.ELEMENT_NODE\n        ? node as HTMLElement\n        : node?.parentElement;\n      if (el) { cursorRect = el.getBoundingClientRect(); }\n    }\n    const containerRect = scrollContainer.getBoundingClientRect();\n    const padding = 4;\n    if (cursorRect.bottom > containerRect.bottom - padding) {\n      scrollContainer.scrollTop += cursorRect.bottom - containerRect.bottom + padding;\n    } else if (cursorRect.top < containerRect.top + padding) {\n      scrollContainer.scrollTop -= containerRect.top - cursorRect.top + padding;\n    }\n  });\n}\n","export function detectAndConvertMarkdownImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  const range = selection.getRangeAt(0);\n  const textNode = range.startContainer;\n  if (textNode.nodeType !== Node.TEXT_NODE) { return false; }\n  const text = textNode.textContent || '';\n  const cursorPos = range.startOffset;\n  const textBeforeCursor = text.substring(0, cursorPos);\n\n  const boldMatch = textBeforeCursor.match(/\\*\\*([^\\*]+)\\*\\*$/);\n  if (boldMatch) { applyMarkdownFormatImpl(ctx, textNode, range, boldMatch, 'bold', 2); return true; }\n\n  const singleBoldMatch = textBeforeCursor.match(/(?<!\\*)\\*([^\\*]+)\\*$/);\n  if (singleBoldMatch) { applyMarkdownFormatImpl(ctx, textNode, range, singleBoldMatch, 'bold', 1); return true; }\n\n  const italicUnderscoreMatch = textBeforeCursor.match(/(?<!_)_([^_]+)_$/);\n  if (italicUnderscoreMatch) { applyMarkdownFormatImpl(ctx, textNode, range, italicUnderscoreMatch, 'italic', 1); return true; }\n\n  const underlineMatch = textBeforeCursor.match(/__([^_]+)__$/);\n  if (underlineMatch) { applyMarkdownFormatImpl(ctx, textNode, range, underlineMatch, 'underline', 2); return true; }\n\n  const strikethroughMatch = textBeforeCursor.match(/~~([^~]+)~~$/);\n  if (strikethroughMatch) { applyMarkdownFormatImpl(ctx, textNode, range, strikethroughMatch, 'strikethrough', 2); return true; }\n\n  const codeMatch = textBeforeCursor.match(/`([^`]+)`$/);\n  if (codeMatch) { applyMarkdownFormatImpl(ctx, textNode, range, codeMatch, 'code', 1); return true; }\n\n  return false;\n}\n\nexport function applyMarkdownFormatImpl(\n  ctx: any,\n  textNode: Node,\n  range: Range,\n  match: RegExpMatchArray,\n  format: 'bold' | 'italic' | 'underline' | 'strikethrough' | 'code',\n  markerLength: number\n): void {\n  const fullMatch = match[0];\n  const content = match[1];\n  const matchStart = (textNode.textContent || '').lastIndexOf(fullMatch);\n  const matchEnd = matchStart + fullMatch.length;\n  const matchRange = document.createRange();\n  matchRange.setStart(textNode, matchStart);\n  matchRange.setEnd(textNode, matchEnd);\n  matchRange.deleteContents();\n  let formattedElement: HTMLElement;\n  switch (format) {\n    case 'bold': formattedElement = document.createElement('strong'); break;\n    case 'italic': formattedElement = document.createElement('em'); break;\n    case 'underline': formattedElement = document.createElement('u'); break;\n    case 'strikethrough': formattedElement = document.createElement('s'); break;\n    case 'code': formattedElement = document.createElement('code'); break;\n  }\n  formattedElement.textContent = content;\n  matchRange.insertNode(formattedElement);\n  const zeroWidthSpace = document.createTextNode('\\u200B');\n  matchRange.setStartAfter(formattedElement);\n  matchRange.insertNode(zeroWidthSpace);\n  matchRange.setStartAfter(zeroWidthSpace);\n  matchRange.collapse(true);\n  const selection = ctx.selectionManager.getSelection();\n  if (selection) { selection.removeAllRanges(); selection.addRange(matchRange); }\n  ctx.justAppliedFormatting = true;\n  ctx.updateFormatState();\n}\n\nexport function detectAndConvertAutoListImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  const range = selection.getRangeAt(0);\n  const textNode = range.startContainer;\n  if (textNode.nodeType !== Node.TEXT_NODE) { return false; }\n  const text = textNode.textContent || '';\n  const cursorPos = range.startOffset;\n  const textBeforeCursor = text.substring(0, cursorPos);\n\n  const orderedListMatch = textBeforeCursor.match(/^(\\d+)(\\.|\\))\\s$/);\n  if (orderedListMatch) {\n    const patternLength = orderedListMatch[0].length;\n    range.setStart(textNode, 0);\n    range.setEnd(textNode, patternLength);\n    range.deleteContents();\n    ctx.justAppliedFormatting = true;\n    ctx.listManager.toggleOrderedList();\n    ctx.updateFormatState();\n    return true;\n  }\n\n  const bulletListMatch = textBeforeCursor.match(/^(-|\\*)\\s$/);\n  if (bulletListMatch) {\n    const patternLength = bulletListMatch[0].length;\n    range.setStart(textNode, 0);\n    range.setEnd(textNode, patternLength);\n    range.deleteContents();\n    ctx.justAppliedFormatting = true;\n    ctx.listManager.toggleBulletList();\n    ctx.updateFormatState();\n    return true;\n  }\n\n  return false;\n}\n","export function isInBlockquoteImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  let node = selection.anchorNode;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'blockquote') return true;\n    }\n    node = node.parentNode;\n  }\n  return false;\n}\n\nexport function shouldExitBlockquoteImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  let node = selection.anchorNode;\n  let blockquoteElement: HTMLElement | null = null;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'blockquote') { blockquoteElement = element; break; }\n    }\n    node = node.parentNode;\n  }\n  if (!blockquoteElement) { return false; }\n  const lastChild = blockquoteElement.lastChild;\n  let brCount = 0;\n  let currentNode = lastChild;\n  while (currentNode) {\n    if (currentNode.nodeType === Node.ELEMENT_NODE) {\n      const element = currentNode as HTMLElement;\n      if (element.tagName.toLowerCase() === 'br') { brCount++; currentNode = currentNode.previousSibling; continue; }\n      if (\n        (element.tagName.toLowerCase() === 'p' || element.tagName.toLowerCase() === 'div') &&\n        element.textContent?.trim() === ''\n      ) { brCount++; currentNode = currentNode.previousSibling; continue; }\n      break;\n    } else if (currentNode.nodeType === Node.TEXT_NODE) {\n      const text = currentNode.textContent || '';\n      if (text.trim() === '') { currentNode = currentNode.previousSibling; continue; }\n      const trimmedText = text.trimEnd();\n      const trailingNewlines = text.length - trimmedText.length;\n      if (trailingNewlines > 0) { brCount += trailingNewlines; }\n      break;\n    } else { break; }\n  }\n  if (brCount >= 2) { return true; }\n  const range = selection.getRangeAt(0);\n  const textNode = range.startContainer;\n  if (textNode.nodeType === Node.TEXT_NODE) {\n    const nodeText = textNode.textContent || '';\n    const cursorPos = range.startOffset;\n    if (cursorPos > 0 && nodeText[cursorPos - 1] === '\\n') return true;\n  }\n  return false;\n}\n\nexport function exitBlockquoteImpl(ctx: any): void {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return; }\n  let node = selection.anchorNode;\n  let blockquoteElement: HTMLElement | null = null;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'blockquote') { blockquoteElement = element; break; }\n    }\n    node = node.parentNode;\n  }\n  if (!blockquoteElement) { return; }\n  const br = document.createElement('br');\n  if (blockquoteElement.nextSibling) {\n    blockquoteElement.parentNode?.insertBefore(br, blockquoteElement.nextSibling);\n  } else {\n    blockquoteElement.parentNode?.appendChild(br);\n  }\n  const newRange = document.createRange();\n  newRange.setStart(br.parentNode!, Array.from(br.parentNode!.childNodes).indexOf(br));\n  newRange.collapse(true);\n  selection.removeAllRanges();\n  selection.addRange(newRange);\n}\n\nexport function isInCodeBlockImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  let node = selection.anchorNode;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'pre') return true;\n    }\n    node = node.parentNode;\n  }\n  return false;\n}\n\nexport function shouldExitCodeBlockImpl(ctx: any): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  let node = selection.anchorNode;\n  let preElement: HTMLElement | null = null;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'pre') { preElement = element; break; }\n    }\n    node = node.parentNode;\n  }\n  if (!preElement) { return false; }\n  const text = preElement.textContent || '';\n  const trimmedText = text.trimEnd();\n  const trailingNewlines = text.length - trimmedText.length;\n  if (trailingNewlines >= 2) { return true; }\n  const range = selection.getRangeAt(0);\n  const textNode = range.startContainer;\n  if (textNode.nodeType === Node.TEXT_NODE) {\n    const nodeText = textNode.textContent || '';\n    const cursorPos = range.startOffset;\n    if (cursorPos > 0 && nodeText[cursorPos - 1] === '\\n') return true;\n  }\n  return false;\n}\n\nexport function exitCodeBlockImpl(ctx: any): void {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return; }\n  let node = selection.anchorNode;\n  let preElement: HTMLElement | null = null;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'pre') { preElement = element; break; }\n    }\n    node = node.parentNode;\n  }\n  if (!preElement) { return; }\n  const br = document.createElement('br');\n  if (preElement.nextSibling) {\n    preElement.parentNode?.insertBefore(br, preElement.nextSibling);\n  } else {\n    preElement.parentNode?.appendChild(br);\n  }\n  const newRange = document.createRange();\n  newRange.setStart(br.parentNode!, Array.from(br.parentNode!.childNodes).indexOf(br));\n  newRange.collapse(true);\n  selection.removeAllRanges();\n  selection.addRange(newRange);\n}\n\nexport function shouldExitListImpl(ctx: any): boolean {\n  const listItem = getCurrentListItemImpl(ctx);\n  if (!listItem) { return false; }\n  const isEmpty = listItem.textContent?.trim() === '';\n  const hasOnlyBr = listItem.innerHTML.trim() === '<br>' || listItem.innerHTML.trim() === '';\n  return isEmpty || hasOnlyBr;\n}\n\nexport function getCurrentListItemImpl(ctx: any): HTMLElement | null {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return null; }\n  let node = selection.anchorNode;\n  while (node && node !== ctx.contentEditable) {\n    if (node.nodeType === Node.ELEMENT_NODE) {\n      const element = node as HTMLElement;\n      if (element.tagName.toLowerCase() === 'li') return element;\n    }\n    node = node.parentNode;\n  }\n  return null;\n}\n","export function handleMentionDeletionImpl(ctx: any, event: KeyboardEvent): boolean {\n  const selection = ctx.selectionManager.getSelection();\n  if (!selection || selection.rangeCount === 0) { return false; }\n  const range = selection.getRangeAt(0);\n  if (!range.collapsed) {\n    const mentionsInRange = ctx.getMentionsInRange(range);\n    if (mentionsInRange.length > 0) {\n      event.preventDefault();\n      mentionsInRange.forEach((mention: Node) => {\n        mention.parentNode?.removeChild(mention);\n      });\n      range.deleteContents();\n      ctx.pushToHistory();\n      ctx.emitUpdate();\n      return true;\n    }\n    return false;\n  }\n  let mentionNode: Node | null = null;\n  let trailingTextNode: Node | null = null;\n  if (event.key === 'Backspace') {\n    if (range.startContainer.nodeType === Node.TEXT_NODE) {\n      const textNode = range.startContainer as Text;\n      const offset = range.startOffset;\n      if (offset === 0 && textNode.previousSibling && ctx.isMentionNode(textNode.previousSibling)) {\n        mentionNode = textNode.previousSibling;\n      } else if (\n        offset <= 1 &&\n        textNode.previousSibling &&\n        ctx.isMentionNode(textNode.previousSibling)\n      ) {\n        mentionNode = textNode.previousSibling;\n        trailingTextNode = textNode;\n      } else if (\n        textNode.textContent &&\n        textNode.textContent.length <= 2 &&\n        offset === textNode.textContent.length &&\n        textNode.previousSibling &&\n        ctx.isMentionNode(textNode.previousSibling)\n      ) {\n        mentionNode = textNode.previousSibling;\n        trailingTextNode = textNode;\n      }\n    } else {\n      const nodeBefore = range.startContainer.childNodes[range.startOffset - 1];\n      if (nodeBefore && ctx.isMentionNode(nodeBefore)) { mentionNode = nodeBefore; }\n    }\n  } else if (event.key === 'Delete') {\n    if (range.startContainer.nodeType === Node.TEXT_NODE) {\n      const textNode = range.startContainer as Text;\n      const offset = range.startOffset;\n      const len = textNode.textContent?.length ?? 0;\n      if (offset === len && textNode.nextSibling && ctx.isMentionNode(textNode.nextSibling)) {\n        mentionNode = textNode.nextSibling;\n      } else if (textNode.nextSibling && ctx.isMentionNode(textNode.nextSibling)) {\n        if (offset === len) { mentionNode = textNode.nextSibling; }\n      }\n    } else {\n      const nodeAfter = range.startContainer.childNodes[range.startOffset];\n      if (nodeAfter && ctx.isMentionNode(nodeAfter)) { mentionNode = nodeAfter; }\n    }\n  }\n  if (mentionNode) {\n    event.preventDefault();\n    const parent = mentionNode.parentNode;\n    if (trailingTextNode && trailingTextNode.parentNode) {\n      trailingTextNode.parentNode.removeChild(trailingTextNode);\n    }\n    if (event.key === 'Backspace' && !trailingTextNode) {\n      const nextSibling = mentionNode.nextSibling;\n      if (nextSibling && nextSibling.nodeType === Node.TEXT_NODE) {\n        const text = nextSibling.textContent || '';\n        if (text === '\\u00A0' || text === ' ') { nextSibling.parentNode?.removeChild(nextSibling); }\n      }\n    }\n    parent?.removeChild(mentionNode);\n    ctx.pushToHistory();\n    ctx.emitUpdate();\n    return true;\n  }\n  return false;\n}\n\nexport function protectMentionsFromFormattingImpl(ctx: any): void {\n  const mentions = ctx.contentEditable.querySelectorAll('span[data-uid]');\n  const inlineTags = ['strong', 'em', 'u', 's', 'b', 'i', 'del', 'strike'];\n  mentions.forEach((mention: Element) => {\n    const innerFormatTags = mention.querySelectorAll(inlineTags.join(', '));\n    innerFormatTags.forEach((tag: Element) => {\n      const parent = tag.parentNode;\n      while (tag.firstChild) { parent?.insertBefore(tag.firstChild, tag); }\n      parent?.removeChild(tag);\n    });\n    let ancestor = mention.parentElement;\n    while (ancestor && ancestor !== ctx.contentEditable) {\n      const nextAncestor = ancestor.parentElement;\n      if (inlineTags.includes(ancestor.tagName.toLowerCase())) {\n        const parent = ancestor.parentNode;\n        if (parent) {\n          while (ancestor.firstChild) { parent.insertBefore(ancestor.firstChild, ancestor); }\n          parent.removeChild(ancestor);\n        }\n      }\n      ancestor = nextAncestor;\n    }\n  });\n}\n\nexport function convertMentionsToPlainTextImpl(ctx: any, container: Element): void {\n  const mentions = container.querySelectorAll('[data-uid]');\n  mentions.forEach((mention: Element) => {\n    const textNode = document.createTextNode(mention.textContent || '');\n    mention.parentNode?.replaceChild(textNode, mention);\n  });\n}\n","\n\nimport {RichTextEditorConfig, RichTextFormatState, SelectionState, HistoryEntry,} from './rich-text-editor.interfaces';\nimport {ContentEditableManager} from './content-editable-manager.class';\nimport {SelectionManager} from './selection-manager.class';\nimport {FormatManager} from './format-manager.class';\nimport {HistoryManager} from './history-manager.class';\nimport {ListManager} from './list-manager.class';\nimport {LinkManager} from './link-manager.class';\nimport {CometChatMentionsFormatter} from '../formatters/cometchat-mentions-formatter';\nimport {CometChatTextFormatter} from '../formatters/cometchat-text-formatter';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLogger} from '../utils/CometChatLogger';\nimport {markdownToHtml as markdownToHtmlUtil, htmlToMarkdown as htmlToMarkdownUtil} from './rich-text-editor.markdown-utils';\nimport {isMentionNode as isMentionNodeUtil, findMentionAncestor as findMentionAncestorUtil, moveCursorToMentionBoundary as moveCursorToMentionBoundaryUtil, getMentionsInRange as getMentionsInRangeUtil, doesRangeIntersectNode as doesRangeIntersectNodeUtil, extendSelectionToIncludeMentions as extendSelectionToIncludeMentionsUtil} from './rich-text-editor.mention-utils';\nimport {handleKeyDownImpl} from './rich-text-editor.keydown-handler';\nimport {handlePasteImpl, handleCopyImpl, handleDropImpl} from './rich-text-editor.paste-handler';\nimport {scheduleCustomFormattersImpl, applyCustomFormattersImpl} from './rich-text-editor.custom-formatters';\nimport {applyBoldImpl, applyItalicImpl, applyUnderlineImpl, applyStrikethroughImpl, applyInlineCodeImpl, applyCodeBlockImpl, applyBlockquoteImpl, applyOrderedListImpl, applyBulletListImpl, setLinkImpl, isLinkActiveImpl, getCurrentLinkImpl, getCurrentLinkTextImpl, isInListImpl} from './rich-text-editor.format-ops';\nimport {setCursorPositionImpl, selectAllImpl, getSelectionImpl, getSelectedTextImpl, saveSelectionImpl, restoreSelectionImpl, getFormatStateImpl, insertTextImpl, deleteRangeImpl, getCharacterOffsetImpl, restoreCharacterOffsetImpl} from './rich-text-editor.selection-ops';\nimport {insertMentionImpl, getUniqueMentionUidsImpl, getTextWithMentionFormatImpl, setContentWithMentionsImpl, escapeUserHtmlForEditorImpl} from './rich-text-editor.mention-ops-class';\nimport {handleInputImpl, handleBeforeInputImpl, cleanupZeroWidthSpacesImpl, scrollCursorIntoViewImpl} from './rich-text-editor.input-handler';\nimport {detectAndConvertMarkdownImpl, applyMarkdownFormatImpl, detectAndConvertAutoListImpl} from './rich-text-editor.markdown-detector';\nimport {isInBlockquoteImpl, shouldExitBlockquoteImpl, exitBlockquoteImpl, isInCodeBlockImpl, shouldExitCodeBlockImpl, exitCodeBlockImpl, shouldExitListImpl, getCurrentListItemImpl} from './rich-text-editor.block-exit';\nimport {handleMentionDeletionImpl, protectMentionsFromFormattingImpl, convertMentionsToPlainTextImpl} from './rich-text-editor.mention-deletion';\n\nexport class RichTextEditor {\n  private element: HTMLElement;\n  private contentEditable: HTMLDivElement;\n  private config: RichTextEditorConfig;\n  private destroyed = false;\n  private eventListeners: {\n    target: EventTarget;\n    type: string;\n    listener: EventListener;\n  }[] = [];\n\n  private justAppliedFormatting = false; private customFormatterTimer: ReturnType<typeof setTimeout> | null = null;\n\n  private contentEditableManager: ContentEditableManager; private selectionManager: SelectionManager; private formatManager: FormatManager;\n  private historyManager: HistoryManager; private listManager: ListManager; private linkManager: LinkManager; private mentionsFormatter: CometChatMentionsFormatter | null = null;\n  private customFormatters: CometChatTextFormatter[] = []; private ariaLiveRegion: HTMLDivElement | null = null;\n  private _pendingLinkClick: { url: string; text: string; x: number; y: number } | null = null; private lastSavedRange: Range | null = null;\n  private autofocusTimer: ReturnType<typeof setTimeout> | null = null;\n\n  private currentFormatState: RichTextFormatState = {\n    bold: false,\n    italic: false,\n    underline: false,\n    strikethrough: false,\n    code: false,\n    blockquote: false,\n    codeBlock: false,\n    orderedList: false,\n    bulletList: false,\n    link: false,\n  };\n\n  constructor(config: RichTextEditorConfig, element?: HTMLElement) {\n    this.config = config;\n    if (element) { this.element = element; } else {\n      this.element = document.createElement('div');\n      this.element.className = 'cometchat-rich-text-editor';\n    }\n    this.contentEditable = document.createElement('div');\n    this.contentEditable.className = 'cometchat-rich-text-editor__content';\n    this.contentEditable.contentEditable = 'true';\n    this.contentEditable.setAttribute('role', 'textbox');\n    this.contentEditable.setAttribute('aria-multiline', 'true');\n    this.contentEditable.setAttribute('aria-label', config.ariaLabel || 'Rich text editor');\n    this.contentEditable.setAttribute('data-placeholder', config.placeholder || '');\n    this.contentEditableManager = new ContentEditableManager(this.contentEditable);\n    this.contentEditableManager.initialize({\n      editable: config.editable,\n    });\n    this.selectionManager = new SelectionManager(this.contentEditable); this.formatManager = new FormatManager(this.contentEditable);\n    this.historyManager = new HistoryManager(); this.listManager = new ListManager(this.contentEditable, this.selectionManager); this.linkManager = new LinkManager(this.contentEditable, this.selectionManager);\n    this.element.appendChild(this.contentEditable); this.createAriaLiveRegion();\n    if (config.content) { this.setHTML(config.content); }\n    this.attachEventListeners();\n    if (config.autofocus) {\n      this.autofocusTimer = setTimeout(() => {\n        this.autofocusTimer = null;\n        if (!this.destroyed) this.focus(config.autofocus);\n      }, 0);\n    }\n  }\n  private createAriaLiveRegion(): void {\n    this.ariaLiveRegion = document.createElement('div');\n    this.ariaLiveRegion.className = 'cometchat-rich-text-editor__aria-live';\n    this.ariaLiveRegion.setAttribute('role', 'status');\n    this.ariaLiveRegion.setAttribute('aria-live', 'polite');\n    this.ariaLiveRegion.setAttribute('aria-atomic', 'true');\n    this.ariaLiveRegion.style.position = 'absolute';\n    this.ariaLiveRegion.style.left = '-10000px';\n    this.ariaLiveRegion.style.width = '1px';\n    this.ariaLiveRegion.style.height = '1px';\n    this.ariaLiveRegion.style.overflow = 'hidden';\n    this.element.appendChild(this.ariaLiveRegion);\n  }\n  private announceToScreenReader(message: string): void {\n    if (!this.ariaLiveRegion) return;\n    this.ariaLiveRegion.textContent = '';\n    setTimeout(() => {\n      if (this.ariaLiveRegion) { this.ariaLiveRegion.textContent = message; }\n    }, 100);\n  }\n  private attachEventListeners(): void {\n    const inputListener = () => this.handleInput();\n    this.addEventListener(this.contentEditable, 'input', inputListener);\n    const beforeInputListener = (e: Event) => this.handleBeforeInput(e as InputEvent);\n    this.addEventListener(this.contentEditable, 'beforeinput', beforeInputListener);\n    const keydownListener = (e: Event) => this.handleKeyDown(e as KeyboardEvent);\n    this.addEventListener(this.contentEditable, 'keydown', keydownListener);\n    const selectionListener = () => this.handleSelectionChange();\n    this.addEventListener(document, 'selectionchange', selectionListener);\n    const focusListener = () => this.handleFocus();\n    this.addEventListener(this.contentEditable, 'focus', focusListener);\n    const blurListener = () => this.handleBlur();\n    this.addEventListener(this.contentEditable, 'blur', blurListener);\n    const pasteListener = (e: Event) => this.handlePaste(e as ClipboardEvent);\n    this.addEventListener(this.contentEditable, 'paste', pasteListener);\n    const copyListener = (e: Event) => this.handleCopy(e as ClipboardEvent);\n    this.addEventListener(this.contentEditable, 'copy', copyListener);\n    const dropListener = (e: Event) => this.handleDrop(e as DragEvent);\n    this.addEventListener(this.contentEditable, 'drop', dropListener);\n    const clickListener = (e: Event) => this.handleClick(e as MouseEvent);\n    this.addEventListener(this.contentEditable, 'click', clickListener);\n    const mousedownListener = (e: Event) => this.handleMouseDown(e as MouseEvent);\n    this.addEventListener(this.contentEditable, 'mousedown', mousedownListener);\n  }\n  private addEventListener(target: EventTarget, type: string, listener: EventListener): void {\n    target.addEventListener(type, listener);\n    this.eventListeners.push({ target, type, listener });\n  }\n  private handleBeforeInput(event: InputEvent): void { handleBeforeInputImpl(this as any, event); }\n  private handleInput(): void { handleInputImpl(this as any); }\n  private cleanupZeroWidthSpaces(): void { cleanupZeroWidthSpacesImpl(this as any); }\n  private scrollCursorIntoView(): void { scrollCursorIntoViewImpl(this as any); }\n  private detectAndConvertMarkdown(): boolean { return detectAndConvertMarkdownImpl(this as any); }\n  private applyMarkdownFormat(textNode: Node, range: Range, match: RegExpMatchArray, format: 'bold' | 'italic' | 'underline' | 'strikethrough' | 'code', markerLength: number): void { applyMarkdownFormatImpl(this as any, textNode, range, match, format, markerLength); }\n  private detectAndConvertAutoList(): boolean { return detectAndConvertAutoListImpl(this as any); }\n  private handleKeyDown(event: KeyboardEvent): void { handleKeyDownImpl(this as any, event); }\n  private isInBlockquote(): boolean { return isInBlockquoteImpl(this as any); }\n  private shouldExitBlockquote(): boolean { return shouldExitBlockquoteImpl(this as any); }\n  private exitBlockquote(): void { exitBlockquoteImpl(this as any); }\n  private isInCodeBlock(): boolean { return isInCodeBlockImpl(this as any); }\n  private shouldExitCodeBlock(): boolean { return shouldExitCodeBlockImpl(this as any); }\n  private exitCodeBlock(): void { exitCodeBlockImpl(this as any); }\n  private shouldExitList(): boolean { return shouldExitListImpl(this as any); }\n  private getCurrentListItem(): HTMLElement | null { return getCurrentListItemImpl(this as any); }\n  private handleMentionDeletion(event: KeyboardEvent): boolean { return handleMentionDeletionImpl(this as any, event); }\n  private protectMentionsFromFormatting(): void { protectMentionsFromFormattingImpl(this as any); }\n  private convertMentionsToPlainText(container: Element): void { convertMentionsToPlainTextImpl(this as any, container); }\n  private isMentionNode(node: Node): boolean { return isMentionNodeUtil(node); }\n  private findMentionAncestor(node: Node): HTMLElement | null { return findMentionAncestorUtil(node); }\n  private moveCursorToMentionBoundary(mentionNode: HTMLElement, range: Range): void { moveCursorToMentionBoundaryUtil(mentionNode, range); }\n  private getMentionsInRange(range: Range): HTMLElement[] { return getMentionsInRangeUtil(range, this.contentEditable); }\n  private doesRangeIntersectNode(range: Range, node: Node): boolean { return doesRangeIntersectNodeUtil(range, node); }\n  private extendSelectionToIncludeMentions(range: Range, mentions: HTMLElement[]): void { extendSelectionToIncludeMentionsUtil(range, mentions); }\n  private handleSelectionChange(): void {\n    if (document.activeElement !== this.contentEditable) { return; }\n    const selection = this.selectionManager.getSelection();\n    if (!selection || selection.rangeCount === 0) { this.updateFormatState(); return; }\n    const range = selection.getRangeAt(0);\n    if (range.collapsed) {\n      const node = range.startContainer;\n      const mentionNode = this.findMentionAncestor(node);\n      if (mentionNode) { this.moveCursorToMentionBoundary(mentionNode, range); }\n    } else {\n      const mentionsInRange = this.getMentionsInRange(range);\n      if (mentionsInRange.length > 0) { this.extendSelectionToIncludeMentions(range, mentionsInRange); }\n    }\n    this.updateFormatState();\n  }\n  private handleFocus(): void {\n    this.element.classList.add('cometchat-rich-text-editor--focused');\n    if (this.config.onFocus) { this.config.onFocus(); }\n  }\n  private handleBlur(): void {\n    const selection = this.selectionManager.getSelection();\n    if (selection && selection.rangeCount > 0) { this.lastSavedRange = selection.getRangeAt(0).cloneRange(); }\n    this.element.classList.remove('cometchat-rich-text-editor--focused');\n    if (this.config.onBlur) { this.config.onBlur(); }\n  }\n  private markdownToHtml(text: string): string { return markdownToHtmlUtil(text); }\n  private convertInlineMarkdown(text: string): string {\n    text = text.replace(/\\*\\*([^\\*]+)\\*\\*/g, '<strong>$1</strong>');\n    text = text.replace(/(?<!\\*)\\*([^\\*]+)\\*(?!\\*)/g, '<strong>$1</strong>');\n    text = text.replace(/__([^_]+)__/g, '<u>$1</u>');\n    text = text.replace(/(?<!_)_([^_]+)_(?!_)/g, '<em>$1</em>');\n    text = text.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n    text = text.replace(/`([^`]+)`/g, '<code>$1</code>');\n    text = text.replace(\n      /\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\n      '<a href=\"$2\" class=\"cometchat-rich-text__link\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n    );\n    return text;\n  }\n  private handlePaste(event: ClipboardEvent): void { handlePasteImpl(this as any, event); }\n  private handleCopy(event: ClipboardEvent): void { handleCopyImpl(this as any, event); }\n  private handleDrop(event: DragEvent): void { handleDropImpl(this as any, event); }\n  private handleClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement;\n    const linkElement = target.closest('a') as HTMLAnchorElement | null;\n    if (linkElement && this.contentEditable.contains(linkElement) && this.config.onLinkClick) {\n      event.preventDefault();\n      event.stopPropagation();\n      this._pendingLinkClick = null;\n      const url = linkElement.href;\n      const text = linkElement.textContent || '';\n      // Use the link element's bounding rect for accurate positioning\n      // (clientX/Y can be off when the editor is scrolled or in a modal)\n      const rect = linkElement.getBoundingClientRect();\n      const x = rect.left + rect.width / 2;\n      const y = rect.top;\n      this.config.onLinkClick(url, text, x, y);\n    }\n  }\n  private handleMouseDown(_event: MouseEvent): void {\n    // mousedown on links is handled by handleClick — no action needed here.\n    // Previously this used a _pendingLinkClick timeout which raced with handleClick.\n  }\n  private updateFormatState(): void {\n    this.currentFormatState = this.formatManager.getCurrentFormats();\n    if (this.config.onSelectionUpdate) { this.config.onSelectionUpdate(this.currentFormatState); }\n  }\n  private emitUpdate(): void {\n    if (this.config.onUpdate) { const html = this.getHTML(); const text = this.getText(); this.config.onUpdate(html, text); }\n  }\n  getElement(): HTMLElement { return this.element; }\n  getContentEditable(): HTMLDivElement { return this.contentEditable; }\n  isDestroyed(): boolean { return this.destroyed; }\n  getHTML(): string { return this.contentEditableManager.getHTML(); }\n  getText(): string { return this.contentEditableManager.getText(); }\n  setHTML(html: string): void { this.contentEditableManager.setHTML(html); }\n  clear(): void { this.justAppliedFormatting = false; this.contentEditableManager.clear(); this.formatManager.resetPendingEmptyFormats(); this.updateFormatState(); }\n  isEmpty(): boolean { return this.contentEditableManager.isEmpty(); }\n  focus(position?: boolean | 'start' | 'end' | 'all' | number): void {\n    this.contentEditable.focus();\n    if (position === 'start') { this.selectionManager.setCursorPosition(0); } else if (position === 'end' || position === true) { this.selectionManager.setCursorPosition('end'); } else if (position === 'all') { this.selectionManager.selectAll(); } else if (typeof position === 'number') { this.selectionManager.setCursorPosition(position); }\n  }\n  blur(): void { this.contentEditable.blur(); }\n  setCursorPosition(position: 'start' | 'end' | number): void { setCursorPositionImpl(this as any, position); }\n  selectAll(): void { selectAllImpl(this as any); }\n  getSelection(): Selection | null { return getSelectionImpl(this as any); }\n  getSelectedText(): string { return getSelectedTextImpl(this as any); }\n  saveSelection(): any { return saveSelectionImpl(this as any); }\n  restoreSelection(state: any): void { restoreSelectionImpl(this as any, state); }\n  getFormatState(): any { return getFormatStateImpl(this as any); }\n  applyBold(): void { applyBoldImpl(this as any); }\n  applyItalic(): void { applyItalicImpl(this as any); }\n  applyUnderline(): void { applyUnderlineImpl(this as any); }\n  applyStrikethrough(): void { applyStrikethroughImpl(this as any); }\n  applyInlineCode(): void { applyInlineCodeImpl(this as any); }\n  applyCodeBlock(): void { applyCodeBlockImpl(this as any); }\n  applyBlockquote(): void { applyBlockquoteImpl(this as any); }\n  applyOrderedList(): void { applyOrderedListImpl(this as any); }\n  applyBulletList(): void { applyBulletListImpl(this as any); }\n  isInList(): boolean { return isInListImpl(this as any); }\n  setLink(url: string | null, text?: string): void { setLinkImpl(this as any, url, text); }\n  isLinkActive(): boolean { return isLinkActiveImpl(this as any); }\n  getCurrentLink(): string | null { return getCurrentLinkImpl(this as any); }\n  getCurrentLinkText(): string | null { return getCurrentLinkTextImpl(this as any); }\n  private pushToHistory(): void {\n    const entry: HistoryEntry = {\n      html: this.getHTML(),\n      cursorPosition: this.selectionManager.getCursorPosition(),\n      timestamp: Date.now(),\n    };\n    this.historyManager.push(entry);\n  }\n  undo(): boolean {\n    const previous = this.historyManager.undo();\n    if (previous) {\n      this.setHTML(previous.html);\n      this.selectionManager.setCursorPosition(previous.cursorPosition);\n      this.updateFormatState();\n      this.emitUpdate();\n      this.announceToScreenReader('Undo');\n      return true;\n    }\n    return false;\n  }\n  redo(): boolean {\n    const next = this.historyManager.redo();\n    if (next) {\n      this.setHTML(next.html);\n      this.selectionManager.setCursorPosition(next.cursorPosition);\n      this.updateFormatState();\n      this.emitUpdate();\n      this.announceToScreenReader('Redo');\n      return true;\n    }\n    return false;\n  }\n  canUndo(): boolean { return this.historyManager.canUndo(); }\n  canRedo(): boolean { return this.historyManager.canRedo(); }\n  insertText(text: string): void { insertTextImpl(this as any, text); }\n  deleteRange(from: number, to: number): void { deleteRangeImpl(this as any, from, to); }\n  private getCharacterOffset(): number { return getCharacterOffsetImpl(this as any); }\n  private restoreCharacterOffset(targetOffset: number): void { restoreCharacterOffsetImpl(this as any, targetOffset); }\n  insertMention(id: string, label: string, charsToDelete: number, isSelf = false): void { insertMentionImpl(this as any, id, label, charsToDelete, isSelf); }\n  getUniqueMentionUids(): Set<string> { return getUniqueMentionUidsImpl(this as any); }\n  getTextWithMentionFormat(): string { return getTextWithMentionFormatImpl(this as any); }\n  setContentWithMentions(text: string, mentionedUsers: (CometChat.User | CometChat.GroupMember)[]): void { setContentWithMentionsImpl(this as any, text, mentionedUsers); }\n  private escapeUserHtmlForEditor(text: string): string { return escapeUserHtmlForEditorImpl(this as any, text); }\n  initializeMentionsFormatter(formatter?: CometChatMentionsFormatter): void { this.mentionsFormatter = formatter || new CometChatMentionsFormatter(); }\n  setCustomFormatters(formatters: CometChatTextFormatter[]): void {\n    this.customFormatters = formatters.filter(\n      f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'url-formatter' && f.id !== 'tiptap-formatter'\n    );\n  }\n  private scheduleCustomFormatters(): void {\n    if (this.customFormatters.length === 0) return;\n    if (this.customFormatterTimer !== null) { clearTimeout(this.customFormatterTimer); }\n    this.customFormatterTimer = setTimeout(() => {\n      this.customFormatterTimer = null;\n      if (this.contentEditable.isConnected) { this.applyCustomFormatters(); }\n    }, 150);\n  }\n  private applyCustomFormatters(): void { applyCustomFormattersImpl(this as any); }\n  private htmlToMarkdown(element: HTMLElement): string { return htmlToMarkdownUtil(element); }\n  destroy(): void {\n    if (this.destroyed) return;\n    if (this.autofocusTimer !== null) { clearTimeout(this.autofocusTimer); this.autofocusTimer = null; }\n    if (this.customFormatterTimer !== null) { clearTimeout(this.customFormatterTimer); this.customFormatterTimer = null; }\n    for (const { target, type, listener } of this.eventListeners) {\n      target.removeEventListener(type, listener);\n    }\n    this.eventListeners = [];\n    this.contentEditable.innerHTML = '';\n    this.lastSavedRange = null;\n    if (this.element.parentNode) { this.element.parentNode.removeChild(this.element); }\n    this.destroyed = true;\n  }\n}\n","/**\n * RichTextEditorService manages rich text editor instances using native contenteditable.\n * @see Requirements 12.1-12.5\n */\n\nimport { Injectable, signal } from '@angular/core';\nimport { RichTextEditor } from './rich-text-editor.class';\nimport {\n  RichTextEditorConfig,\n  RichTextFormatState,\n  RichTextMetadata,\n} from './rich-text-editor.interfaces';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class RichTextEditorService {\n  private formatStateSignal = signal<RichTextFormatState>(this.getDefaultFormatState());\n  readonly formatState = this.formatStateSignal.asReadonly();\n\n  /** Create a new rich text editor instance. @see Requirements 12.1-12.4 */\n  createEditor(config: RichTextEditorConfig = {}, element?: HTMLElement): RichTextEditor {\n    // Wrap callbacks to update format state signal\n    const wrappedConfig: RichTextEditorConfig = {\n      ...config,\n      onSelectionUpdate: (formatState: RichTextFormatState) => {\n        this.formatStateSignal.set(formatState);\n        if (config.onSelectionUpdate) {\n          config.onSelectionUpdate(formatState);\n        }\n      },\n    };\n\n    const editor = new RichTextEditor(wrappedConfig, element);\n    return editor;\n  }\n\n  /** Destroy an editor instance and clean up resources. */\n  destroyEditor(editor: RichTextEditor): void {\n    if (editor && !editor.isDestroyed()) editor.destroy();\n  }\n\n  /** Reset the format state signal to default. */\n  resetFormatState(): void {\n    this.formatStateSignal.set(this.getDefaultFormatState());\n  }\n\n  private getDefaultFormatState(): RichTextFormatState {\n    return { bold: false, italic: false, underline: false, strikethrough: false, code: false, blockquote: false, codeBlock: false, orderedList: false, bulletList: false, link: false };\n  }\n\n  /** Get the current format state for an editor. */\n  getFormatState(editor: RichTextEditor): RichTextFormatState {\n    if (editor.isDestroyed()) return this.getDefaultFormatState();\n    return editor.getFormatState();\n  }\n\n  /** Toggle bold formatting. @see Requirement 2.1 */\n  toggleBold(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyBold(); }\n\n  /** Toggle italic formatting. @see Requirement 2.2 */\n  toggleItalic(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyItalic(); }\n\n  /** Toggle underline formatting. @see Requirement 2.3 */\n  toggleUnderline(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyUnderline(); }\n\n  /** Toggle strikethrough formatting. @see Requirement 2.4 */\n  toggleStrikethrough(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyStrikethrough(); }\n\n  /** Toggle inline code formatting. @see Requirement 2.5 */\n  toggleCode(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyInlineCode(); }\n\n  /** Toggle code block formatting. @see Requirement 2.6 */\n  toggleCodeBlock(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyCodeBlock(); }\n\n  /** Toggle blockquote formatting. @see Requirement 2.7 */\n  toggleBlockquote(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyBlockquote(); }\n\n  /** Toggle ordered list formatting. @see Requirement 3.1 */\n  toggleOrderedList(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyOrderedList(); }\n\n  /** Toggle bullet list formatting. @see Requirement 3.2 */\n  toggleBulletList(editor: RichTextEditor): void { if (editor.isDestroyed()) return; editor.applyBulletList(); }\n\n  /** Set or remove a link. @see Requirements 4.1, 4.2 */\n  setLink(editor: RichTextEditor, url: string | null, text?: string): void {\n    if (editor.isDestroyed()) return;\n    editor.setLink(url, text);\n  }\n\n  /** Undo the last action. @see Requirement 6.1 */\n  undo(editor: RichTextEditor): boolean { return editor.isDestroyed() ? false : editor.undo(); }\n\n  /** Redo the last undone action. @see Requirement 6.2 */\n  redo(editor: RichTextEditor): boolean { return editor.isDestroyed() ? false : editor.redo(); }\n\n  /** Check if undo is available. @see Requirement 6.1 */\n  canUndo(editor: RichTextEditor): boolean { return editor.isDestroyed() ? false : editor.canUndo(); }\n\n  /** Check if redo is available. @see Requirement 6.2 */\n  canRedo(editor: RichTextEditor): boolean { return editor.isDestroyed() ? false : editor.canRedo(); }\n\n  /** Get the HTML content from an editor. @see Requirements 9.1, 9.4 */\n  getHTML(editor: RichTextEditor): string { return editor.isDestroyed() ? '' : editor.getHTML(); }\n\n  /** Get the plain text content from an editor. @see Requirement 9.2 */\n  getText(editor: RichTextEditor): string { return editor.isDestroyed() ? '' : editor.getText(); }\n\n  /** Set the content of an editor. */\n  setContent(editor: RichTextEditor, content: string, _emitUpdate = false): void { editor.setHTML(content); }\n\n  /** Set the content with mentions properly formatted. @see Requirements 5.2, 15.5 */\n  setContentWithMentions(editor: RichTextEditor, text: string, mentionedUsers: (CometChat.User | CometChat.GroupMember)[], _emitUpdate = false): void {\n    if (editor.isDestroyed()) return;\n    editor.setContentWithMentions(text, mentionedUsers);\n  }\n\n  /** Clear the editor content. */\n  clearContent(editor: RichTextEditor): void { editor.clear(); }\n\n  /** Insert text at the current cursor position. @see Requirement 9.1 */\n  insertText(editor: RichTextEditor, text: string): void { if (editor.isDestroyed()) return; editor.insertText(text); }\n\n  /** Delete a range of content from the editor. @see Requirement 9.1 */\n  deleteRange(editor: RichTextEditor, from: number, to: number): void { if (editor.isDestroyed()) return; editor.deleteRange(from, to); }\n\n  /** Check if the editor content is empty. */\n  isEmpty(editor: RichTextEditor): boolean { return editor.isEmpty(); }\n\n  /** Check if the content has any rich text formatting. */\n  hasFormatting(editor: RichTextEditor): boolean {\n    const html = editor.getHTML();\n    const text = editor.getText();\n    const plainHtml = `<p>${text}</p>`;\n    return html !== plainHtml && html !== '' && html !== '<p></p>';\n  }\n\n  /** Check if the cursor is currently inside a list. @see Requirement 2.17 */\n  isInList(editor: RichTextEditor): boolean { return editor.isDestroyed() ? false : editor.isInList(); }\n\n  /** Insert a mention at the current cursor position. @see Requirements 5.2, 5.4, 5.5, 8.1, 8.2 */\n  insertMention(editor: RichTextEditor, id: string, label: string, charsToDelete: number, isSelf = false): void {\n    if (editor.isDestroyed()) return;\n    editor.insertMention(id, label, charsToDelete, isSelf);\n  }\n\n  /** Convert editor content to CometChat mention format. @see Requirements 5.2, 9.5 */\n  getTextWithMentionFormat(editor: RichTextEditor): string { return editor.isDestroyed() ? '' : editor.getTextWithMentionFormat(); }\n\n  /** Get the set of unique mention UIDs. @see Requirement 5.6 */\n  getUniqueMentionUids(editor: RichTextEditor): Set<string> { return editor.isDestroyed() ? new Set<string>() : editor.getUniqueMentionUids(); }\n\n  /** Get rich text metadata for a message. @see Requirements 9.3, 9.5 */\n  getRichTextMetadata(editor: RichTextEditor): RichTextMetadata {\n    if (editor.isDestroyed()) return { html: '', plainText: '', hasFormatting: false };\n    return { html: this.getHTML(editor), plainText: this.getText(editor), hasFormatting: this.hasFormatting(editor) };\n  }\n\n  /** Focus the editor. */\n  focus(editor: RichTextEditor, position: 'start' | 'end' | 'all' | number = 'end'): void { editor.focus(position); }\n\n  /** Blur the editor (remove focus). */\n  blur(editor: RichTextEditor): void { editor.blur(); }\n}\n","import { Injectable, TemplateRef } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatTextFormatter } from '../formatters/cometchat-text-formatter';\nimport { MessageBubbleAlignment } from '../Enums/Enums';\nimport { CalendarObject } from '../resources/CometChatLocalize/localization.interfaces';\nimport { CometChatActionsIcon } from '../modals/CometChatActionsIcon';\nimport { CometChatActionsView } from '../modals/CometChatActionsView';\nimport { CometChatLocalize } from '../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatUIKitConstants } from '../constants';\n\n/**\n * MessageUtilsService provides utility functions for message-related operations\n * in the CometChat Angular UIKit.\n *\n * This service is used for:\n * - Getting action message text (joined, left, kicked, etc.)\n * - Distributing message options into quick and overflow groups\n * - Determining options position based on bubble alignment\n * - Building message bubbles from templates\n * - Determining user status visibility\n */\n@Injectable({ providedIn: 'root' })\nexport class MessageUtilsService {\n  // ============================================================================\n  // View Retrieval Methods\n  // ============================================================================\n\n\n  // ============================================================================\n  // Message Options Utilities\n  // ============================================================================\n\n  /**\n   * Distributes message options into quick options and overflow options.\n   *\n   * Quick options are shown directly on the bubble for fast access.\n   * Overflow options go into a context menu.\n   *\n   * @param options - The array of message options to distribute\n   * @param quickOptionsCount - Number of options to show as quick options (default: 2)\n   * @returns Object with `quickOptions` and `overflowOptions` arrays\n   */\n  distributeMessageOptions(\n    options: (CometChatActionsIcon | CometChatActionsView)[],\n    quickOptionsCount = 2\n  ): {\n    quickOptions: (CometChatActionsIcon | CometChatActionsView)[];\n    overflowOptions: (CometChatActionsIcon | CometChatActionsView)[];\n  } {\n    if (!options || options.length === 0) {\n      return { quickOptions: [], overflowOptions: [] };\n    }\n    if (quickOptionsCount <= 0) {\n      return { quickOptions: [], overflowOptions: [...options] };\n    }\n    const splitPoint = Math.min(options.length, quickOptionsCount);\n    return {\n      quickOptions: options.slice(0, splitPoint),\n      overflowOptions: options.slice(splitPoint),\n    };\n  }\n\n  /**\n   * Gets the CSS class for options positioning based on message bubble alignment.\n   *\n   * - Left alignment (incoming): options on the right side\n   * - Right alignment (outgoing): options on the left side\n   * - Center alignment (action): no options\n   *\n   * @param alignment - The message bubble alignment\n   * @returns CSS class name for options positioning\n   */\n  getOptionsPositionClass(alignment: MessageBubbleAlignment): string {\n    switch (alignment) {\n      case MessageBubbleAlignment.left:\n        return 'cometchat-message-bubble__options--right';\n      case MessageBubbleAlignment.right:\n        return 'cometchat-message-bubble__options--left';\n      case MessageBubbleAlignment.center:\n        return '';\n      default:\n        return 'cometchat-message-bubble__options--left';\n    }\n  }\n\n  // ============================================================================\n  // Utility Methods\n  // ============================================================================\n\n  /**\n   * Determines if the user's online status should be visible.\n   */\n  getUserStatusVisible(user: CometChat.User | CometChat.GroupMember): boolean {\n    if (!user) {\n      return false;\n    }\n    if (typeof user.getStatus !== 'function') {\n      return false;\n    }\n    const status = user.getStatus();\n    if (status === 'online' || status === 'available') {\n      return true;\n    }\n    return status !== undefined && status !== null && status !== '';\n  }\n\n  /**\n   * Gets the localized action message text for group action messages.\n   *\n   * Supported actions: ADDED, JOINED, LEFT, KICKED, BANNED, UNBANNED, SCOPE_CHANGE\n   *\n   * @param message - The CometChat action message\n   * @returns Localized action message text\n   */\n  getActionMessage(message: CometChat.Action | CometChat.BaseMessage): string {\n    if (!message) return '';\n    let actionMessage = '';\n    const actionMsg = message as any;\n\n    if (!actionMsg.hasOwnProperty('actionBy') || !actionMsg.hasOwnProperty('actionOn')) {\n      return actionMessage;\n    }\n\n    const action = actionMsg.action;\n\n    if (\n      action !== CometChatUIKitConstants.groupMemberAction.JOINED &&\n      action !== CometChatUIKitConstants.groupMemberAction.LEFT &&\n      (!actionMsg.actionBy?.hasOwnProperty('name') || !actionMsg.actionOn?.hasOwnProperty('name'))\n    ) {\n      return actionMessage;\n    }\n\n    if (action === CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE) {\n      if (!actionMsg.data?.extras?.scope?.new) {\n        return actionMessage;\n      }\n    }\n\n    const byEntity = actionMsg.actionBy;\n    const onEntity = actionMsg.actionOn;\n    const byString = byEntity?.name || '';\n    const forString =\n      action !== CometChatUIKitConstants.groupMemberAction.JOINED &&\n      action !== CometChatUIKitConstants.groupMemberAction.LEFT\n        ? onEntity?.name || ''\n        : '';\n\n    switch (action) {\n      case CometChatUIKitConstants.groupMemberAction.ADDED:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_added')} ${forString}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.JOINED:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_joined')}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.LEFT:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_left')}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.KICKED:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_kicked')} ${forString}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.BANNED:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_banned')} ${forString}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.UNBANNED:\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_unbanned')} ${forString}`;\n        break;\n      case CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE: {\n        const newScope = actionMsg.data?.extras?.scope?.new || '';\n        const scopeKey = `member_scope_${newScope}`;\n        const localizedScope = CometChatLocalize.getLocalizedString(scopeKey) || newScope;\n        actionMessage = `${byString} ${CometChatLocalize.getLocalizedString('message_list_action_made')} ${forString} ${localizedScope}`;\n        break;\n      }\n      default:\n        break;\n    }\n\n    return actionMessage;\n  }\n}\n","/**\n * Error handling utilities for MessageListService.\n *\n * Extracted from message-list.service.ts to keep error classification,\n * user-friendly message generation, and retry logic in a focused module.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n// ==================== Error Classification ====================\n\n/**\n * Determines whether an error is recoverable (worth retrying).\n *\n * Recoverable errors are transient network/server issues that may resolve\n * on their own. Non-recoverable errors are permanent failures (auth, not found, etc.)\n * that should not be retried.\n */\nexport function isRecoverableError(error: unknown): boolean {\n  if (!error) return false;\n\n  // CometChat SDK errors\n  if (error instanceof Object && 'code' in error) {\n    const code = String((error as { code: unknown }).code);\n    return isRecoverableErrorCode(code);\n  }\n\n  // Standard JS errors — check message\n  if (error instanceof Error) {\n    return isRecoverableErrorMessage(error.message);\n  }\n\n  // String errors\n  if (typeof error === 'string') {\n    return isRecoverableErrorMessage(error);\n  }\n\n  return false;\n}\n\n/**\n * Checks if a CometChat error code indicates a recoverable error.\n */\nfunction isRecoverableErrorCode(code: string): boolean {\n  const recoverableCodes = new Set([\n    'ERR_INTERNET_DISCONNECTED',\n    'ERR_NETWORK_CHANGED',\n    'ERR_CONNECTION_RESET',\n    'ERR_CONNECTION_REFUSED',\n    'ERR_CONNECTION_TIMED_OUT',\n    'ERR_TIMED_OUT',\n    'ERR_SOCKET_NOT_CONNECTED',\n    'NETWORK_ERROR',\n    'TIMEOUT',\n    'SERVICE_UNAVAILABLE',\n    '503',\n    '504',\n    '429', // Rate limiting — retry after backoff\n  ]);\n  return recoverableCodes.has(code);\n}\n\n/**\n * Checks if an error message string indicates a recoverable error.\n */\nexport function isRecoverableErrorMessage(message: string): boolean {\n  if (!message) return false;\n  const lower = message.toLowerCase();\n  const recoverablePatterns = [\n    'network',\n    'timeout',\n    'timed out',\n    'connection',\n    'disconnected',\n    'socket',\n    'service unavailable',\n    'too many requests',\n    'rate limit',\n    'temporarily unavailable',\n    'try again',\n    'retry',\n  ];\n  return recoverablePatterns.some(pattern => lower.includes(pattern));\n}\n\n/**\n * Checks if an error is retryable (subset of recoverable — used for receipt operations).\n */\nexport function isRetryableError(error: unknown): boolean {\n  return isRecoverableError(error);\n}\n\n// ==================== User-Friendly Error Messages ====================\n\n/**\n * Converts a raw error into a user-friendly message string.\n *\n * @param error - The error to convert\n * @param context - Human-readable context (e.g., \"fetching messages\")\n */\nexport function getUserFriendlyErrorMessage(error: unknown, context: string): string {\n  if (!error) return `An error occurred while ${context}.`;\n\n  const errorString = extractErrorString(error);\n  return getMessageFromErrorString(errorString, context);\n}\n\n/**\n * Extracts a string representation from any error type.\n */\nfunction extractErrorString(error: unknown): string {\n  if (typeof error === 'string') return error;\n  if (error instanceof Error) return error.message;\n  if (error instanceof Object) {\n    if ('message' in error) return String((error as { message: unknown }).message);\n    if ('details' in error) return String((error as { details: unknown }).details);\n    if ('code' in error) return String((error as { code: unknown }).code);\n  }\n  return String(error);\n}\n\n/**\n * Maps an error string to a user-friendly message.\n */\nfunction getMessageFromErrorString(errorString: string, context: string): string {\n  const lower = errorString.toLowerCase();\n\n  if (lower.includes('network') || lower.includes('internet') || lower.includes('disconnected')) {\n    return 'No internet connection. Please check your network and try again.';\n  }\n  if (lower.includes('timeout') || lower.includes('timed out')) {\n    return 'The request timed out. Please try again.';\n  }\n  if (lower.includes('unauthorized') || lower.includes('auth') || lower.includes('403')) {\n    return 'You are not authorized to perform this action.';\n  }\n  if (lower.includes('not found') || lower.includes('404')) {\n    return 'The requested resource was not found.';\n  }\n  if (lower.includes('rate limit') || lower.includes('too many requests') || lower.includes('429')) {\n    return 'Too many requests. Please wait a moment and try again.';\n  }\n  if (lower.includes('service unavailable') || lower.includes('503')) {\n    return 'The service is temporarily unavailable. Please try again later.';\n  }\n\n  return `An error occurred while ${context}. Please try again.`;\n}\n\n// ==================== Retry Delay Utilities ====================\n\n/**\n * Returns the retry delay for a given attempt index using exponential backoff.\n *\n * @param attempt - Zero-based attempt index\n * @param delays - Array of delay values in ms (defaults to [1000, 2000, 4000])\n */\nexport function getRetryDelay(\n  attempt: number,\n  delays: readonly number[] = [1000, 2000, 4000]\n): number {\n  return delays[Math.min(attempt, delays.length - 1)];\n}\n\n/**\n * Creates a promise that resolves after the specified delay.\n */\nexport function delay(ms: number): Promise<void> {\n  return new Promise(resolve => setTimeout(resolve, ms));\n}\n","/**\n * Reaction handling utilities for MessageListService.\n *\n * Extracted from message-list.service.ts to isolate\n * reaction event processing and reaction count update logic.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n// ==================== Reaction Count Helpers ====================\n\n/**\n * Applies a reaction event to an existing reactions array.\n * Returns a new array with the updated reaction counts.\n *\n * @param reactions - Current reactions on the message\n * @param emoji - The emoji being reacted with\n * @param action - Whether the reaction was added or removed\n * @param reactedBy - The user who reacted\n */\nexport function applyReactionEvent(\n  reactions: CometChat.ReactionCount[],\n  emoji: string,\n  action: 'added' | 'removed',\n  reactedBy: CometChat.User\n): CometChat.ReactionCount[] {\n  const existing = reactions.find(r => r.getReaction() === emoji);\n\n  if (action === 'added') {\n    if (existing) {\n      // Increment count\n      const updated = reactions.map(r => {\n        if (r.getReaction() !== emoji) return r;\n        const newReaction = new CometChat.ReactionCount(\n          r.getReaction(),\n          r.getCount() + 1,\n          r.getReactedByMe()\n        );\n        return newReaction;\n      });\n      return updated;\n    } else {\n      // Add new reaction\n      const newReaction = new CometChat.ReactionCount(emoji, 1, false);\n      return [...reactions, newReaction];\n    }\n  } else {\n    // removed\n    if (!existing) return reactions;\n\n    const newCount = existing.getCount() - 1;\n    if (newCount <= 0) {\n      return reactions.filter(r => r.getReaction() !== emoji);\n    }\n    return reactions.map(r => {\n      if (r.getReaction() !== emoji) return r;\n      return new CometChat.ReactionCount(r.getReaction(), newCount, r.getReactedByMe());\n    });\n  }\n}\n\n/**\n * Checks whether a reaction event belongs to the current conversation.\n *\n * @param reactionEvent - The reaction event from the SDK\n * @param currentUser - Active user (for 1-on-1 chats)\n * @param currentGroup - Active group (for group chats)\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function isReactionForCurrentConversation(\n  reactionEvent: CometChat.ReactionEvent,\n  currentUser: CometChat.User | null,\n  currentGroup: CometChat.Group | null,\n  loggedInUid: string\n): boolean {\n  const receiverId = reactionEvent.getReceiverId?.() || '';\n  const receiverType = reactionEvent.getReceiverType?.() || '';\n\n  if (currentUser) {\n    return (\n      receiverType === CometChat.RECEIVER_TYPE.USER &&\n      (receiverId === currentUser.getUid() || receiverId === loggedInUid)\n    );\n  }\n\n  if (currentGroup) {\n    return (\n      receiverType === CometChat.RECEIVER_TYPE.GROUP &&\n      receiverId === currentGroup.getGuid()\n    );\n  }\n\n  return false;\n}\n\n// ==================== Receipt Update Helpers ====================\n\n/**\n * Checks whether a receipt event belongs to the current conversation.\n *\n * @param receipt - The message receipt from the SDK\n * @param currentUser - Active user (for 1-on-1 chats)\n * @param currentGroup - Active group (for group chats)\n */\nexport function isReceiptForCurrentConversation(\n  receipt: CometChat.MessageReceipt,\n  currentUser: CometChat.User | null,\n  currentGroup: CometChat.Group | null\n): boolean {\n  const senderId = receipt.getSender()?.getUid() || '';\n  const receiverId = (receipt.getReceiver() as any)?.getUid?.() || '';\n  const receiverType = receipt.getReceiverType() || '';\n\n  if (currentUser) {\n    return (\n      receiverType === CometChat.RECEIVER_TYPE.USER &&\n      senderId === currentUser.getUid()\n    );\n  }\n\n  if (currentGroup) {\n    return (\n      receiverType === CometChat.RECEIVER_TYPE.GROUP &&\n      receiverId === currentGroup.getGuid()\n    );\n  }\n\n  return false;\n}\n\n/**\n * Applies a read receipt to a message, returning the updated message.\n * Returns null if the message doesn't need updating.\n *\n * @param message - The message to update\n * @param receipt - The read receipt\n */\nexport function applyReadReceipt(\n  message: CometChat.BaseMessage,\n  receipt: CometChat.MessageReceipt\n): boolean {\n  const messageId = message.getId();\n  const receiptMessageId = Number(receipt.getMessageId());\n\n  if (!messageId || messageId > receiptMessageId) return false;\n  if (message.getReadAt()) return false; // Already marked as read\n\n  return true;\n}\n\n/**\n * Applies a delivery receipt to a message.\n * Returns true if the message should be updated.\n */\nexport function applyDeliveryReceipt(\n  message: CometChat.BaseMessage,\n  receipt: CometChat.MessageReceipt\n): boolean {\n  const messageId = message.getId();\n  const receiptMessageId = Number(receipt.getMessageId());\n\n  if (!messageId || messageId > receiptMessageId) return false;\n  if (message.getDeliveredAt()) return false; // Already marked as delivered\n\n  return true;\n}\n","/**\n * SDK listener setup functions for MessageListService.\n * Extracted to keep message-list.service.ts under 400 lines.\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { NgZone } from '@angular/core';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatUIKitConstants } from '../constants';\n\nexport interface MessageListListenerHost {\n  getMessageListenerId(): string;\n  getGroupListenerId(): string;\n  getCallListenerId(): string;\n  getConnectionListenerId(): string;\n  handleNewMessage(message: CometChat.BaseMessage): void;\n  handleMessageEdited(message: CometChat.BaseMessage): void;\n  handleMessageDeleted(message: CometChat.BaseMessage): void;\n  handleReceipt(receipt: CometChat.MessageReceipt, isGroupReceipt: boolean): void;\n  handleReactionEvent(reactionEvent: CometChat.ReactionEvent, action: 'added' | 'removed'): void;\n  handleGroupAction(message: CometChat.Action, group: CometChat.Group): void;\n  handleCallAction(call: CometChat.Call): void;\n  handleReconnection(): Promise<void>;\n  getMessageById(id: number): CometChat.BaseMessage | undefined;\n  updateMessageById(id: number, message: CometChat.BaseMessage): boolean;\n  addMessage(message: CometChat.BaseMessage): void;\n  setConnectionStatus(status: 'connected' | 'disconnected'): void;\n}\n\nexport function setupMessageListener(host: MessageListListenerHost, ngZone: NgZone): void {\n  CometChat.addMessageListener(\n    host.getMessageListenerId(),\n    new CometChat.MessageListener({\n      onTextMessageReceived: (m: CometChat.TextMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onTextMessageReceived', e); } },\n      onMediaMessageReceived: (m: CometChat.MediaMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onMediaMessageReceived', e); } },\n      onCustomMessageReceived: (m: CometChat.CustomMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onCustomMessageReceived', e); } },\n      onInteractiveMessageReceived: (m: CometChat.InteractiveMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onInteractiveMessageReceived', e); } },\n      onMessageEdited: (m: CometChat.BaseMessage) => { try { host.handleMessageEdited(m); } catch (e) { CometChatLogger.error('MessageListService', 'onMessageEdited', e); } },\n      onMessageDeleted: (m: CometChat.BaseMessage) => { try { host.handleMessageDeleted(m); } catch (e) { CometChatLogger.error('MessageListService', 'onMessageDeleted', e); } },\n      onMessagesDelivered: (r: CometChat.MessageReceipt) => { try { ngZone.run(() => host.handleReceipt(r, false)); } catch (e) { CometChatLogger.error('MessageListService', 'onMessagesDelivered', e); } },\n      onMessagesRead: (r: CometChat.MessageReceipt) => { try { ngZone.run(() => host.handleReceipt(r, false)); } catch (e) { CometChatLogger.error('MessageListService', 'onMessagesRead', e); } },\n      onMessagesDeliveredToAll: (r: CometChat.MessageReceipt) => { try { ngZone.run(() => host.handleReceipt(r, true)); } catch (e) { CometChatLogger.error('MessageListService', 'onMessagesDeliveredToAll', e); } },\n      onMessagesReadByAll: (r: CometChat.MessageReceipt) => { try { ngZone.run(() => host.handleReceipt(r, true)); } catch (e) { CometChatLogger.error('MessageListService', 'onMessagesReadByAll', e); } },\n      onMessageReactionAdded: (e: CometChat.ReactionEvent) => { try { host.handleReactionEvent(e, 'added'); } catch (err) { CometChatLogger.error('MessageListService', 'onMessageReactionAdded', err); } },\n      onMessageReactionRemoved: (e: CometChat.ReactionEvent) => { try { host.handleReactionEvent(e, 'removed'); } catch (err) { CometChatLogger.error('MessageListService', 'onMessageReactionRemoved', err); } },\n      onAIAssistantMessageReceived: (m: CometChat.BaseMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onAIAssistantMessageReceived', e); } },\n      // Persisted developer cards (category \"card\"). Agent cards keep\n      // arriving on onAIAssistantMessageReceived above; no agent-card listener added.\n      onCardMessageReceived: (m: CometChat.BaseMessage) => { try { host.handleNewMessage(m); } catch (e) { CometChatLogger.error('MessageListService', 'onCardMessageReceived', e); } },\n    })\n  );\n}\n\nexport function setupGroupListener(host: MessageListListenerHost): void {\n  CometChat.addGroupListener(\n    host.getGroupListenerId(),\n    new CometChat.GroupListener({\n      onGroupMemberJoined: (msg: CometChat.Action, _u: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberJoined', e); } },\n      onGroupMemberLeft: (msg: CometChat.Action, _u: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberLeft', e); } },\n      onGroupMemberKicked: (msg: CometChat.Action, _ku: CometChat.User, _kb: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberKicked', e); } },\n      onGroupMemberBanned: (msg: CometChat.Action, _bu: CometChat.User, _bb: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberBanned', e); } },\n      onGroupMemberUnbanned: (msg: CometChat.Action, _uu: CometChat.User, _ub: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberUnbanned', e); } },\n      onGroupMemberScopeChanged: (msg: CometChat.Action, _cu: CometChat.User, _ns: string, _os: string, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onGroupMemberScopeChanged', e); } },\n      onMemberAddedToGroup: (msg: CometChat.Action, _ua: CometChat.User, _ub: CometChat.User, g: CometChat.Group) => { try { host.handleGroupAction(msg, g); } catch (e) { CometChatLogger.error('MessageListService', 'onMemberAddedToGroup', e); } },\n    })\n  );\n}\n\nexport function setupCallListener(host: MessageListListenerHost): void {\n  CometChat.addCallListener(\n    host.getCallListenerId(),\n    new CometChat.CallListener({\n      onIncomingCallReceived: (c: CometChat.Call) => { try { host.handleCallAction(c); } catch (e) { CometChatLogger.error('MessageListService', 'onIncomingCallReceived', e); } },\n      onIncomingCallCancelled: (c: CometChat.Call) => { try { host.handleCallAction(c); } catch (e) { CometChatLogger.error('MessageListService', 'onIncomingCallCancelled', e); } },\n      onOutgoingCallRejected: (c: CometChat.Call) => { try { host.handleCallAction(c); } catch (e) { CometChatLogger.error('MessageListService', 'onOutgoingCallRejected', e); } },\n      onOutgoingCallAccepted: (c: CometChat.Call) => { try { host.handleCallAction(c); } catch (e) { CometChatLogger.error('MessageListService', 'onOutgoingCallAccepted', e); } },\n      onCallEndedMessageReceived: (c: CometChat.Call) => { try { host.handleCallAction(c); } catch (e) { CometChatLogger.error('MessageListService', 'onCallEndedMessageReceived', e); } },\n    })\n  );\n}\n\nexport function setupConnectionListener(\n  host: MessageListListenerHost,\n  listenerId: string\n): void {\n  try {\n    CometChat.removeConnectionListener(listenerId);\n    CometChat.addConnectionListener(\n      listenerId,\n      new CometChat.ConnectionListener({\n        onConnected: () => {\n          try { host.setConnectionStatus('connected'); host.handleReconnection(); }\n          catch (e) { CometChatLogger.error('MessageListService', 'onConnected', e); }\n        },\n        onDisconnected: () => {\n          try { host.setConnectionStatus('disconnected'); }\n          catch (e) { CometChatLogger.error('MessageListService', 'onDisconnected', e); }\n        },\n      })\n    );\n  } catch (e) {\n    CometChatLogger.error('MessageListService', 'setupConnectionListener', e);\n  }\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents, IMessages} from '../events/CometChatMessageEvents';\nimport {MessageStatus} from '../Enums/Enums';\nimport {CometChatUIKitUtility} from '../CometChatUIKitUtility';\nimport {CometChatLogger} from '../utils/CometChatLogger';\n\n/**\n * Queue of sent-message events received while the message list was still loading.\n * Flushed once loading completes (see flushPendingSentMessages).\n */\nconst pendingSentMessages = new WeakMap<object, IMessages[]>();\n\nexport function setupSentMessageListenerImpl(ctx: any): void {\n  ctx.ccMessageSentSubscription = CometChatMessageEvents.ccMessageSent.subscribe(\n    (data: IMessages) => {\n      handleSentMessageImpl(ctx, data);\n    }\n  );\n}\n\nexport function setupEditedMessageListenerImpl(ctx: any): void {\n  ctx.ccMessageEditedSubscription = CometChatMessageEvents.ccMessageEdited.subscribe(\n    (data: IMessages) => {\n      if (data.status === MessageStatus.success && data.message) {\n        handleEditedMessageImpl(ctx, data.message);\n      }\n    }\n  );\n}\n\nexport function handleSentMessageImpl(ctx: any, data: IMessages): void {\n  const { message, status } = data;\n  if (\n    !ctx.parentMessageId &&\n    message.getParentMessageId() &&\n    status === MessageStatus.success &&\n    !ctx.isAgentChatMode\n  ) {\n    if (ctx.isThreadReplyForCurrentConversation(message)) {\n      updateSentMessageReplyCountImpl(ctx, message);\n    }\n    return;\n  }\n  if (!ctx.isMessageForCurrentConversation(message)) { return; }\n\n  // If the list is still loading (initial fetch in progress), queue the event\n  // and process it after loading completes to avoid error-state race conditions.\n  if (ctx.loadingStateSignal() === true) {\n    let queue = pendingSentMessages.get(ctx);\n    if (!queue) {\n      queue = [];\n      pendingSentMessages.set(ctx, queue);\n    }\n    queue.push(data);\n    return;\n  }\n\n  switch (status) {\n    case MessageStatus.inprogress:\n      ctx.addMessage(message);\n      break;\n    case MessageStatus.success:\n      updateSentMessageByMuidImpl(ctx, message);\n      break;\n    case MessageStatus.error:\n      updateSentMessageByMuidImpl(ctx, message);\n      break;\n  }\n}\n\n/**\n * Flush any sent-message events that were queued while loading.\n * Called by the service after fetchPreviousMessages / fetchNextMessages completes.\n *\n * Skips `inprogress` messages whose final `success` version is already present\n * in the fetched list (matched by MUID or message ID) to avoid duplicates.\n */\nexport function flushPendingSentMessages(ctx: any): void {\n  const queue = pendingSentMessages.get(ctx);\n  if (!queue || queue.length === 0) return;\n  pendingSentMessages.delete(ctx);\n  for (const data of queue) {\n    const { message, status } = data;\n    if (!ctx.isMessageForCurrentConversation(message)) continue;\n    switch (status) {\n      case MessageStatus.inprogress: {\n        // Skip if the message already exists in the list (fetched from server)\n        const muid = message.getMuid?.();\n        const alreadyByMuid = muid ? ctx.messageMuidMap.get(muid) : undefined;\n        const messageId = message.getId();\n        const alreadyById = messageId ? ctx.messageIdMap.get(ctx.normalizeMessageId(messageId)) : undefined;\n        if (!alreadyByMuid && !alreadyById) {\n          ctx.addMessage(message);\n        }\n        break;\n      }\n      case MessageStatus.success:\n        updateSentMessageByMuidImpl(ctx, message);\n        break;\n      case MessageStatus.error:\n        updateSentMessageByMuidImpl(ctx, message);\n        break;\n    }\n  }\n}\n\nexport function updateSentMessageByMuidImpl(ctx: any, message: CometChat.BaseMessage): void {\n  const muid = message.getMuid?.();\n  if (!muid) {\n    const messageId = message.getId();\n    if (messageId) { ctx.updateMessageById(messageId, message); }\n    return;\n  }\n  const existingMessage = ctx.messageMuidMap.get(muid);\n  if (existingMessage) {\n    ctx.updateMessageByMuid(muid, message);\n  } else {\n    const messageId = message.getId();\n    if (messageId) { ctx.updateMessageById(messageId, message); }\n  }\n}\n\nexport function updateSentMessageReplyCountImpl(ctx: any, message: CometChat.BaseMessage): void {\n  const parentId = message.getParentMessageId();\n  if (!parentId) { return; }\n  const parentMessage = ctx.messageIdMap.get(ctx.normalizeMessageId(parentId));\n  if (!parentMessage) { return; }\n  const clonedParent = CometChatUIKitUtility.clone(parentMessage);\n  const currentCount = clonedParent.getReplyCount() || 0;\n  clonedParent.setReplyCount(currentCount + 1);\n  ctx.updateMessageById(parentId, clonedParent);\n}\n\nexport function handleEditedMessageImpl(ctx: any, message: CometChat.BaseMessage): void {\n  if (!ctx.isMessageForCurrentConversation(message)) { return; }\n  ctx.updateMessageById(message.getId(), message);\n  CometChatMessageEvents.onMessageEdited.next(message);\n}\n","/**\n * Message CRUD operation functions for MessageListService.\n * Extracted to reduce service file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { CometChatUIKitConstants } from '../constants';\n\nexport interface MessageOpsContext {\n  messagesSignal: any;\n  allMessagesSignal: any;\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  messageMuidMap: Map<string, CometChat.BaseMessage>;\n  nextMessageIdSignal: any;\n  errorCallback: any;\n  normalizeMessageId: (id: string | number) => number;\n  updateMessageById: (id: number, msg: CometChat.BaseMessage) => boolean;\n  updateMessageReactions: (id: number, reactions: CometChat.ReactionCount[]) => boolean;\n}\n\n/**\n * The subset of the service needed to tell whether a message is already listed.\n * Kept separate so the fetch helpers can reuse the check without depending on\n * the full message-ops surface.\n */\nexport interface MessageLookupContext {\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  messageMuidMap: Map<string, CometChat.BaseMessage>;\n  normalizeMessageId: (id: string | number) => number;\n}\n\n/**\n * Reports whether a message is already in the list.\n *\n * Matches on muid first so a message added optimistically is recognised when the\n * server copy of it arrives, then falls back to id. Both lookups are guarded:\n * a message that has not been sent yet carries a muid but no usable id, and\n * treating those absent ids as equal would collapse distinct pending messages\n * into one. Negative ids are sentinels (the streaming placeholder) and are\n * matched by muid rather than id.\n */\nexport function isDuplicateMessageImpl(ctx: MessageLookupContext, message: CometChat.BaseMessage): boolean {\n  const muid = message.getMuid?.();\n  if (muid && ctx.messageMuidMap.has(muid)) { return true; }\n  const rawId = message.getId();\n  if (!rawId) { return false; }\n  const messageId = ctx.normalizeMessageId(rawId);\n  return messageId > 0 && ctx.messageIdMap.has(messageId);\n}\n\nexport function addMessageImpl(ctx: MessageOpsContext, message: CometChat.BaseMessage): void {\n  // A message can be pushed at us more than once — a socket re-delivery after a\n  // reconnect, or a re-emitted event — and appending it again renders it twice.\n  if (isDuplicateMessageImpl(ctx, message)) { return; }\n  ctx.allMessagesSignal.update((current: CometChat.BaseMessage[]) => [...current, message]);\n  ctx.messagesSignal.update((current: CometChat.BaseMessage[]) => [...current, message]);\n  const messageId = ctx.normalizeMessageId(message.getId());\n  ctx.messageIdMap.set(messageId, message);\n  const muid = message.getMuid?.();\n  if (muid) { ctx.messageMuidMap.set(muid, message); }\n  if (messageId > ctx.nextMessageIdSignal()) { ctx.nextMessageIdSignal.set(messageId); }\n}\n\nexport function updateMessageByIdImpl(ctx: MessageOpsContext, messageId: number, message: CometChat.BaseMessage): boolean {\n  const normalizedId = ctx.normalizeMessageId(messageId);\n  const index = ctx.allMessagesSignal().findIndex((m: CometChat.BaseMessage) => ctx.normalizeMessageId(m.getId()) === normalizedId);\n  if (index === -1) { CometChatLogger.warn('MessageListService', `Message with ID ${messageId} not found for update`); return false; }\n  ctx.allMessagesSignal.update((current: CometChat.BaseMessage[]) => { const u = [...current]; u[index] = message; return u; });\n  const mi = ctx.messagesSignal().findIndex((m: CometChat.BaseMessage) => ctx.normalizeMessageId(m.getId()) === normalizedId);\n  if (mi !== -1) ctx.messagesSignal.update((current: CometChat.BaseMessage[]) => { const u = [...current]; u[mi] = message; return u; });\n  ctx.messageIdMap.set(normalizedId, message);\n  const muid = message.getMuid?.(); if (muid) ctx.messageMuidMap.set(muid, message);\n  return true;\n}\n\nexport function updateMessageByMuidImpl(ctx: MessageOpsContext, muid: string, message: CometChat.BaseMessage): boolean {\n  const existing = ctx.messageMuidMap.get(muid);\n  if (!existing) { CometChatLogger.warn('MessageListService', `Message with MUID ${muid} not found for update`); return false; }\n  const index = ctx.allMessagesSignal().findIndex((m: CometChat.BaseMessage) => m.getMuid?.() === muid);\n  if (index === -1) { CometChatLogger.warn('MessageListService', `Message with MUID ${muid} found in map but not in array`); ctx.messageMuidMap.delete(muid); return false; }\n  const oldId = existing.getId();\n  ctx.allMessagesSignal.update((current: CometChat.BaseMessage[]) => { const u = [...current]; u[index] = message; return u; });\n  const mi = ctx.messagesSignal().findIndex((m: CometChat.BaseMessage) => m.getMuid?.() === muid);\n  if (mi !== -1) ctx.messagesSignal.update((current: CometChat.BaseMessage[]) => { const u = [...current]; u[mi] = message; return u; });\n  const newId = message.getId(); if (newId) ctx.messageIdMap.set(ctx.normalizeMessageId(newId), message);\n  if (oldId && oldId !== newId) ctx.messageIdMap.delete(ctx.normalizeMessageId(oldId));\n  const newMuid = message.getMuid?.(); if (newMuid) ctx.messageMuidMap.set(newMuid, message);\n  if (newMuid !== muid) ctx.messageMuidMap.delete(muid);\n  return true;\n}\n\nexport function deleteMessageImpl(ctx: MessageOpsContext, messageId: number): boolean {\n  const existingMessage = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!existingMessage) { CometChatLogger.warn('MessageListService', `Message with ID ${messageId} not found for deletion`); return false; }\n  const deletedAtTimestamp = Math.floor(Date.now() / 1000);\n  const clonedMessage = Object.create(Object.getPrototypeOf(existingMessage), Object.getOwnPropertyDescriptors(existingMessage)) as CometChat.BaseMessage;\n  clonedMessage.setDeletedAt(deletedAtTimestamp);\n  return ctx.updateMessageById(messageId, clonedMessage);\n}\n\nexport async function editMessageImpl(ctx: MessageOpsContext, message: CometChat.BaseMessage, newText: string): Promise<CometChat.BaseMessage> {\n  const existingMessage = ctx.messageIdMap.get(message.getId());\n  if (!existingMessage) {\n    const error = new Error(`[MessageListService] editMessage: Message with ID ${message.getId()} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) {\n    const error = new Error(`[MessageListService] editMessage: Only text messages can be edited`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  const textMessage = message as CometChat.TextMessage;\n  const originalText = textMessage.getText();\n  textMessage.setText(newText);\n  ctx.updateMessageById(message.getId(), textMessage);\n  try {\n    const editedMessage = await CometChat.editMessage(textMessage);\n    ctx.updateMessageById(editedMessage.getId(), editedMessage);\n    return editedMessage;\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'editMessage: Failed to edit message', error);\n    textMessage.setText(originalText);\n    ctx.updateMessageById(message.getId(), textMessage);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    return message;\n  }\n}\n\nexport function removeMessageImpl(ctx: MessageOpsContext, messageId: number): boolean {\n  const existingMessage = ctx.messageIdMap.get(messageId);\n  if (!existingMessage) { CometChatLogger.warn('MessageListService', `Message with ID ${messageId} not found for removal`); return false; }\n  const muid = existingMessage.getMuid();\n  ctx.allMessagesSignal.set(ctx.allMessagesSignal().filter((msg: CometChat.BaseMessage) => msg.getId() !== messageId));\n  ctx.messagesSignal.set(ctx.messagesSignal().filter((msg: CometChat.BaseMessage) => msg.getId() !== messageId));\n  ctx.messageIdMap.delete(messageId);\n  if (muid) { ctx.messageMuidMap.delete(muid); }\n  return true;\n}\n\nexport function getMessageByIdImpl(ctx: MessageOpsContext, messageId: number): CometChat.BaseMessage | undefined {\n  return ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n}\n\nexport function updateReplyCountImpl(ctx: MessageOpsContext, parentMessageId: number, count: number): boolean {\n  const parentMessage = ctx.messageIdMap.get(parentMessageId);\n  if (!parentMessage) { CometChatLogger.warn('MessageListService', `updateReplyCount: Parent message with ID ${parentMessageId} not found`); return false; }\n  const cloned = CometChatUIKitUtility.clone(parentMessage); cloned.setReplyCount(count);\n  return ctx.updateMessageById(parentMessageId, cloned);\n}\n\nexport function updateMessageReactionsImpl(ctx: MessageOpsContext, messageId: number, reactions: CometChat.ReactionCount[]): boolean {\n  const message = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!message) { CometChatLogger.warn('MessageListService', `updateMessageReactions: Message with ID ${messageId} not found`); return false; }\n  message.setReactions(reactions); return ctx.updateMessageById(messageId, message);\n}\n\nexport function deduplicateMessagesImpl(_ctx: MessageOpsContext, messages: CometChat.BaseMessage[]): CometChat.BaseMessage[] {\n  const seenIds = new Set<number>();\n  const uniqueMessages: CometChat.BaseMessage[] = [];\n  for (const message of messages) {\n    const id = message.getId();\n    if (!seenIds.has(id)) { seenIds.add(id); uniqueMessages.push(message); }\n  }\n  return uniqueMessages;\n}\n\nexport function clearMessagesImpl(ctx: MessageOpsContext): void {\n  ctx.allMessagesSignal.set([]);\n  ctx.messagesSignal.set([]);\n  ctx.messageIdMap.clear();\n  ctx.messageMuidMap.clear();\n  (ctx as any).prevMessageIdSignal?.set(0);\n  ctx.nextMessageIdSignal.set(0);\n}\n\nexport function clearMessagesAndStateImpl(ctx: MessageOpsContext): void {\n  (ctx as any).fetchGeneration++;\n  ctx.messagesSignal.set([]);\n  ctx.allMessagesSignal.set([]);\n  ctx.messageIdMap.clear();\n  ctx.messageMuidMap.clear();\n  (ctx as any).prevMessageIdSignal?.set(0);\n  ctx.nextMessageIdSignal.set(0);\n  (ctx as any).unreadCountSignal?.set(0);\n  (ctx as any).errorStateSignal?.set(null);\n  (ctx as any).messagesRequest = null;\n  (ctx as any).nextMessagesRequest = null;\n}\n","/**\n * Extracted fetch and receipt logic for MessageListService.\n */\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {WritableSignal} from '@angular/core';\nimport {CometChatLogger} from '../utils/CometChatLogger';\nimport {CometChatUIKit} from '../cometchat-uikit';\nimport {CometChatUIKitUtility} from '../CometChatUIKitUtility';\nimport {ErrorCallback} from './message-composer.service';\nimport {flushPendingSentMessages} from './message-list.sent-handler';\nimport {isDuplicateMessageImpl} from './message-list.message-ops';\n\n/**\n * Drops messages the list already holds, and any repeated within the batch itself.\n *\n * A fetch can overlap what is already on screen: messages that arrive live do not\n * come through a fetch, so a re-fetch anchored on an older cursor — as happens on\n * reconnect — returns messages that were already appended in real time.\n */\nfunction excludeAlreadyListed(ctx: FetchContext, messages: CometChat.BaseMessage[]): CometChat.BaseMessage[] {\n  const seenIds = new Set<number>();\n  return messages.filter(message => {\n    if (isDuplicateMessageImpl(ctx, message)) { return false; }\n    const rawId = message.getId();\n    if (!rawId) { return true; }\n    const messageId = ctx.normalizeMessageId(rawId);\n    if (seenIds.has(messageId)) { return false; }\n    seenIds.add(messageId);\n    return true;\n  });\n}\n\nexport interface FetchContext {\n  messagesRequest: CometChat.MessagesRequest | null;\n  nextMessagesRequest: CometChat.MessagesRequest | null;\n  fetchGeneration: number;\n  isAgentChatMode: boolean;\n  parentMessageId: number | null;\n  currentUser: CometChat.User | null;\n  currentGroup: CometChat.Group | null;\n  errorCallback: ErrorCallback | null;\n  readonly DEFAULT_MESSAGE_LIMIT: number;\n  loadingStateSignal: WritableSignal<boolean>;\n  errorStateSignal: WritableSignal<Error | null>;\n  prevMessageIdSignal: WritableSignal<number>;\n  nextMessageIdSignal: WritableSignal<number>;\n  allMessagesSignal: WritableSignal<CometChat.BaseMessage[]>;\n  messagesSignal: WritableSignal<CometChat.BaseMessage[]>;\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  messageMuidMap: Map<string, CometChat.BaseMessage>;\n  normalizeMessageId(id: string | number): number;\n  markInitialMessagesAsRead(): Promise<void>;\n  buildMessagesRequest(messageId?: number): CometChat.MessagesRequest;\n  buildNextMessagesRequest(messageId?: number): CometChat.MessagesRequest;\n  clearMessagesAndState(): void;\n}\n\nexport async function fetchPreviousMessagesImpl(ctx: FetchContext): Promise<boolean> {\n  if (!ctx.messagesRequest) {\n    CometChatLogger.warn('MessageListService', 'Cannot fetch messages: No conversation context set. Call setUser() or setGroup() first.');\n    return false;\n  }\n  if (ctx.isAgentChatMode && ctx.parentMessageId === null) {\n    CometChatLogger.warn('MessageListService', 'fetchPreviousMessages blocked in agent chat mode: parentMessageId is null. Messages are only fetched when loading a historical thread.');\n    return false;\n  }\n  const generation = ctx.fetchGeneration;\n  ctx.loadingStateSignal.set(true);\n  try {\n    const messages: CometChat.BaseMessage[] = await ctx.messagesRequest.fetchPrevious();\n    if (generation !== ctx.fetchGeneration) return false;\n    if (messages && messages.length > 0) {\n      // Cursors and the has-more result track what the server returned, not what\n      // survived deduplication, so paging stays correct even if the whole page\n      // was already on screen.\n      const newMessages = excludeAlreadyListed(ctx, messages);\n      if (newMessages.length > 0) {\n        ctx.allMessagesSignal.update(current => [...newMessages, ...current]);\n        ctx.messagesSignal.update(current => [...newMessages, ...current]);\n      }\n      const oldestMessage = messages[0];\n      const isFirstFetch = ctx.prevMessageIdSignal() === 0;\n      ctx.prevMessageIdSignal.set(oldestMessage.getId());\n      if (ctx.nextMessageIdSignal() === 0) {\n        const newestMessage = messages[messages.length - 1];\n        ctx.nextMessageIdSignal.set(newestMessage.getId());\n        // Rebuild nextMessagesRequest with the anchor ID so fetchNext() has the required MessageId\n        ctx.nextMessagesRequest = ctx.buildNextMessagesRequest(newestMessage.getId());\n      }\n      for (const message of newMessages) {\n        const messageId = ctx.normalizeMessageId(message.getId());\n        ctx.messageIdMap.set(messageId, message);\n        const muid = message.getMuid?.();\n        if (muid) { ctx.messageMuidMap.set(muid, message); }\n      }\n      if (isFirstFetch) {\n        setTimeout(() => { ctx.markInitialMessagesAsRead(); }, 100);\n      }\n    }\n    ctx.loadingStateSignal.set(false);\n    flushPendingSentMessages(ctx);\n    return messages.length === ctx.DEFAULT_MESSAGE_LIMIT;\n  } catch (error) {\n    if (generation !== ctx.fetchGeneration) return false;\n    ctx.loadingStateSignal.set(false);\n    ctx.errorStateSignal.set(error as Error);\n    CometChatLogger.error('MessageListService', 'Error fetching previous messages:', error);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    flushPendingSentMessages(ctx);\n    return false;\n  }\n}\n\nexport async function fetchNextMessagesImpl(ctx: FetchContext): Promise<boolean> {\n  if (!ctx.nextMessagesRequest) {\n    CometChatLogger.warn('MessageListService', 'Cannot fetch next messages: No conversation context set. Call setUser() or setGroup() first.');\n    return false;\n  }\n  const generation = ctx.fetchGeneration;\n  ctx.loadingStateSignal.set(true);\n  try {\n    const messages: CometChat.BaseMessage[] = await ctx.nextMessagesRequest.fetchNext();\n    if (generation !== ctx.fetchGeneration) return false;\n    if (messages && messages.length > 0) {\n      // On reconnect this request is rebuilt from the stored cursor and re-runs,\n      // so it commonly returns messages that already arrived over the socket.\n      const newMessages = excludeAlreadyListed(ctx, messages);\n      if (newMessages.length > 0) {\n        ctx.allMessagesSignal.update(current => [...current, ...newMessages]);\n        ctx.messagesSignal.update(current => [...current, ...newMessages]);\n      }\n      const newestMessage = messages[messages.length - 1];\n      ctx.nextMessageIdSignal.set(newestMessage.getId());\n      if (ctx.prevMessageIdSignal() === 0) { const oldestMessage = messages[0]; ctx.prevMessageIdSignal.set(oldestMessage.getId()); }\n      for (const message of newMessages) {\n        const messageId = ctx.normalizeMessageId(message.getId());\n        ctx.messageIdMap.set(messageId, message);\n        const muid = message.getMuid?.();\n        if (muid) { ctx.messageMuidMap.set(muid, message); }\n      }\n    }\n    ctx.loadingStateSignal.set(false);\n    flushPendingSentMessages(ctx);\n    return messages.length === ctx.DEFAULT_MESSAGE_LIMIT;\n  } catch (error) {\n    if (generation !== ctx.fetchGeneration) return false;\n    ctx.loadingStateSignal.set(false);\n    ctx.errorStateSignal.set(error as Error);\n    CometChatLogger.error('MessageListService', 'Error fetching next messages:', error);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    flushPendingSentMessages(ctx);\n    return false;\n  }\n}\n\nexport async function fetchMessagesAroundIdImpl(ctx: FetchContext, messageId: number): Promise<void> {\n  if (!ctx.currentUser && !ctx.currentGroup) {\n    const error = new Error('[MessageListService] Cannot fetch messages around ID: No conversation context set. Call setUser() or setGroup() first.');\n    CometChatLogger.error('MessageListService', error.message);\n    ctx.errorStateSignal.set(error);\n    throw error;\n  }\n  ctx.clearMessagesAndState();\n  const generation = ctx.fetchGeneration;\n  ctx.loadingStateSignal.set(true);\n  try {\n    const beforeRequest = ctx.buildMessagesRequest(messageId);\n    const messagesBefore: CometChat.BaseMessage[] = await beforeRequest.fetchPrevious();\n    if (generation !== ctx.fetchGeneration) { return; }\n    let messagesAfter: CometChat.BaseMessage[] = [];\n    let targetMessage: CometChat.BaseMessage | null = null;\n    if (messagesBefore.length > 0) {\n      const afterAnchorId = messagesBefore[messagesBefore.length - 1].getId();\n      const afterRequest = ctx.buildNextMessagesRequest(afterAnchorId);\n      messagesAfter = await afterRequest.fetchNext();\n    } else {\n      try { targetMessage = await CometChat.getMessageDetails(messageId); } catch (e) { CometChatLogger.error('MessageListService', 'Failed to fetch target message:', e); }\n      const afterRequest = ctx.buildNextMessagesRequest(messageId);\n      messagesAfter = await afterRequest.fetchNext();\n    }\n    if (generation !== ctx.fetchGeneration) { return; }\n    const allMessages: CometChat.BaseMessage[] = [\n      ...messagesBefore,\n      ...(targetMessage ? [targetMessage] : []),\n      ...messagesAfter,\n    ];\n    const seenIds = new Set<number>();\n    const uniqueMessages = allMessages.filter(m => { const id = m.getId(); if (seenIds.has(id)) return false; seenIds.add(id); return true; });\n    if (uniqueMessages.length > 0) {\n      ctx.allMessagesSignal.set(uniqueMessages);\n      ctx.messagesSignal.set(uniqueMessages);\n      ctx.prevMessageIdSignal.set(uniqueMessages[0].getId());\n      ctx.nextMessageIdSignal.set(uniqueMessages[uniqueMessages.length - 1].getId());\n      for (const message of uniqueMessages) {\n        const msgId = ctx.normalizeMessageId(message.getId());\n        ctx.messageIdMap.set(msgId, message);\n        const muid = message.getMuid?.();\n        if (muid) { ctx.messageMuidMap.set(muid, message); }\n      }\n    }\n    const oldestId = ctx.prevMessageIdSignal();\n    const newestId = ctx.nextMessageIdSignal();\n    ctx.messagesRequest = ctx.buildMessagesRequest(oldestId || undefined);\n    ctx.nextMessagesRequest = ctx.buildNextMessagesRequest(newestId || undefined);\n    ctx.loadingStateSignal.set(false);\n    flushPendingSentMessages(ctx);\n  } catch (error) {\n    if (generation !== ctx.fetchGeneration) { return; }\n    ctx.loadingStateSignal.set(false);\n    ctx.errorStateSignal.set(error as Error);\n    CometChatLogger.error('MessageListService', 'Error fetching messages around ID:', error);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    flushPendingSentMessages(ctx);\n  }\n}\n\nexport interface ReceiptContext {\n  currentGroup: CometChat.Group | null;\n  currentUser: CometChat.User | null;\n  allMessagesSignal: WritableSignal<CometChat.BaseMessage[]>;\n  messagesSignal: WritableSignal<CometChat.BaseMessage[]>;\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  messageMuidMap: Map<string, CometChat.BaseMessage>;\n  normalizeMessageId(id: string | number): number;\n}\n\nexport function handleReceiptImpl(ctx: ReceiptContext, receipt: CometChat.MessageReceipt, isGroupReceipt: boolean): void {\n  if (ctx.currentGroup && !isGroupReceipt) { return; }\n  if (ctx.currentUser && isGroupReceipt) { return; }\n  const messageIdStr = receipt.getMessageId();\n  const messageId = parseInt(messageIdStr, 10);\n  if (isNaN(messageId)) { CometChatLogger.warn('MessageListService', 'Invalid message ID in receipt:', messageIdStr); return; }\n  const readAt = receipt.getReadAt();\n  const deliveredAt = receipt.getDeliveredAt();\n  const loggedInUser = CometChatUIKit.getLoggedInUser();\n  if (!loggedInUser) { return; }\n  const loggedInUserId = loggedInUser.getUid();\n  let needsUpdate = false;\n  ctx.allMessagesSignal.update(current => {\n    let targetIndex = current.findIndex(m => ctx.normalizeMessageId(m.getId()) === messageId);\n    if (targetIndex === -1) { targetIndex = current.length - 1; }\n    const updated = [...current];\n    for (let i = targetIndex; i >= 0; i--) {\n      const msg = updated[i];\n      const sender = msg.getSender();\n      const senderUid = sender ? sender.getUid() : '';\n      if (senderUid !== loggedInUserId) { continue; }\n      const msgId = ctx.normalizeMessageId(msg.getId());\n      if (msgId > messageId && msgId !== 0) { continue; }\n      if (readAt) {\n        if (msg.getReadAt()) { break; }\n        const cloned = CometChatUIKitUtility.clone(msg);\n        cloned.setReadAt(readAt);\n        if (!cloned.getDeliveredAt()) { cloned.setDeliveredAt(readAt); }\n        updated[i] = cloned;\n        const clonedId = ctx.normalizeMessageId(cloned.getId());\n        if (clonedId) { ctx.messageIdMap.set(clonedId, cloned); }\n        const clonedMuid = cloned.getMuid?.();\n        if (clonedMuid) { ctx.messageMuidMap.set(clonedMuid, cloned); }\n        needsUpdate = true;\n      } else if (deliveredAt) {\n        if (msg.getDeliveredAt()) { break; }\n        const cloned = CometChatUIKitUtility.clone(msg);\n        cloned.setDeliveredAt(deliveredAt);\n        updated[i] = cloned;\n        const clonedId = ctx.normalizeMessageId(cloned.getId());\n        if (clonedId) { ctx.messageIdMap.set(clonedId, cloned); }\n        const clonedMuid = cloned.getMuid?.();\n        if (clonedMuid) { ctx.messageMuidMap.set(clonedMuid, cloned); }\n        needsUpdate = true;\n      }\n    }\n    return needsUpdate ? updated : current;\n  });\n  if (needsUpdate) {\n    ctx.messagesSignal.update(current => {\n      let targetIndex = current.findIndex(m => ctx.normalizeMessageId(m.getId()) === messageId);\n      if (targetIndex === -1) { targetIndex = current.length - 1; }\n      const updated = [...current];\n      for (let i = targetIndex; i >= 0; i--) {\n        const msg = updated[i];\n        const sender = msg.getSender();\n        const senderUid = sender ? sender.getUid() : '';\n        if (senderUid !== loggedInUserId) { continue; }\n        const msgId = ctx.normalizeMessageId(msg.getId());\n        if (msgId > messageId && msgId !== 0) { continue; }\n        if (readAt) {\n          if (msg.getReadAt()) { break; }\n          const cloned = ctx.messageIdMap.get(ctx.normalizeMessageId(msgId)) || CometChatUIKitUtility.clone(msg);\n          if (!cloned.getReadAt()) { cloned.setReadAt(readAt); if (!cloned.getDeliveredAt()) { cloned.setDeliveredAt(readAt); } }\n          updated[i] = cloned;\n        } else if (deliveredAt) {\n          if (msg.getDeliveredAt()) { break; }\n          const cloned = ctx.messageIdMap.get(ctx.normalizeMessageId(msg.getId())) || CometChatUIKitUtility.clone(msg);\n          if (!cloned.getDeliveredAt()) { cloned.setDeliveredAt(deliveredAt); }\n          updated[i] = cloned;\n        }\n      }\n      return updated;\n    });\n  }\n}\n","/**\n * Reaction operation functions for MessageListService.\n * Extracted to reduce service file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\nexport interface ReactionOpsContext {\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  errorCallback: any;\n  normalizeMessageId: (id: string | number) => number;\n  updateMessageReactions: (id: number, reactions: CometChat.ReactionCount[]) => boolean;\n}\n\nexport async function addReactionImpl(ctx: ReactionOpsContext, messageId: number, emoji: string): Promise<void> {\n  const message = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!message) {\n    const error = new Error(`[MessageListService] addReaction: Message with ID ${messageId} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  const originalReactions = message.getReactions() || [];\n  const updatedReactions: CometChat.ReactionCount[] = [];\n  let reactionFound = false;\n  let alreadyReacted = false;\n  originalReactions.forEach(reaction => {\n    if (reaction.getReaction() === emoji) {\n      reactionFound = true;\n      if (reaction.getReactedByMe()) {\n        // ENG-35038: User already reacted with this emoji — toggle off (decrement/remove).\n        alreadyReacted = true;\n        const newCount = reaction.getCount() - 1;\n        if (newCount > 0) {\n          reaction.setCount(newCount);\n          reaction.setReactedByMe(false);\n          updatedReactions.push(reaction);\n        }\n        // If count reaches 0, drop the reaction entirely (don't push)\n      } else {\n        reaction.setCount(reaction.getCount() + 1);\n        reaction.setReactedByMe(true);\n        updatedReactions.push(reaction);\n      }\n    } else {\n      updatedReactions.push(reaction);\n    }\n  });\n  if (!reactionFound) { const newReaction = new CometChat.ReactionCount(emoji, 1, true); updatedReactions.push(newReaction); }\n  ctx.updateMessageReactions(messageId, updatedReactions);\n  try {\n    if (alreadyReacted) {\n      // Toggle off — call removeReaction on the SDK\n      await CometChat.removeReaction(messageId, emoji);\n    } else {\n      await CometChat.addReaction(messageId, emoji);\n    }\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'addReaction: Failed to add/remove reaction', error);\n    ctx.updateMessageReactions(messageId, originalReactions);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n  }\n}\n\nexport async function removeReactionImpl(ctx: ReactionOpsContext, messageId: number, emoji: string): Promise<void> {\n  const message = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!message) {\n    const error = new Error(`[MessageListService] removeReaction: Message with ID ${messageId} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  const originalReactions = message.getReactions() || [];\n  const updatedReactions: CometChat.ReactionCount[] = [];\n  originalReactions.forEach(reaction => {\n    if (reaction.getReaction() === emoji) {\n      if (reaction.getCount() > 1) { reaction.setCount(reaction.getCount() - 1); reaction.setReactedByMe(false); updatedReactions.push(reaction); }\n    } else {\n      updatedReactions.push(reaction);\n    }\n  });\n  ctx.updateMessageReactions(messageId, updatedReactions);\n  try {\n    await CometChat.removeReaction(messageId, emoji);\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'removeReaction: Failed to remove reaction', error);\n    ctx.updateMessageReactions(messageId, originalReactions);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n  }\n}\n\nexport async function fetchReactionsImpl(ctx: ReactionOpsContext, messageId: number, builder?: CometChat.ReactionsRequestBuilder): Promise<CometChat.Reaction[]> {\n  try {\n    let reactionsRequestBuilder: CometChat.ReactionsRequestBuilder;\n    if (builder) { reactionsRequestBuilder = builder.setMessageId(messageId); } else {\n      reactionsRequestBuilder = new CometChat.ReactionsRequestBuilder().setMessageId(messageId);\n    }\n    const reactionsRequest = reactionsRequestBuilder.build();\n    const reactions: CometChat.Reaction[] = await reactionsRequest.fetchNext();\n    return reactions;\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'fetchReactions: Failed to fetch reactions', error);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    return [];\n  }\n}\n","/**\n * Read/delivery/unread operation functions for MessageListService.\n * Extracted to reduce service file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatMessageEvents } from '../events/CometChatMessageEvents';\nimport { isRetryableError } from './message-list.error-utils';\n\nexport interface ReadOpsContext {\n  messageIdMap: Map<number, CometChat.BaseMessage>;\n  messagesSignal: any;\n  allMessagesSignal: any;\n  normalizeMessageId: (id: string | number) => number;\n  updateMessageById: (id: number, msg: CometChat.BaseMessage) => boolean;\n}\n\nexport async function markAsReadImpl(ctx: ReadOpsContext, message: CometChat.BaseMessage): Promise<void> {\n  // Guard: don't attempt markAsRead on messages without a valid server ID\n  // (e.g., pending/optimistic messages that haven't received their ID yet)\n  if (!message.getId()) { return; }\n  const maxRetries = 2;\n  const retryDelays = [1000, 2000];\n  for (let attempt = 0; attempt <= maxRetries; attempt++) {\n    try {\n      await CometChat.markAsRead(message);\n      return;\n    } catch (error: unknown) {\n      const isLastAttempt = attempt === maxRetries;\n      const isRetryable = isRetryableError(error);\n      if (!isRetryable || isLastAttempt) {\n        CometChatLogger.error('MessageListService', `markAsRead: Failed after ${attempt + 1} attempt(s)`, { messageId: message.getId(), error, isRetryable });\n        return;\n      }\n      await new Promise(resolve => setTimeout(resolve, retryDelays[attempt]));\n    }\n  }\n}\n\nexport function updateLocalReadStatusImpl(ctx: ReadOpsContext, messageIds: number[]): void {\n  const idSet = new Set(messageIds.map(id => ctx.normalizeMessageId(id)));\n  const updateMessages = (messages: CometChat.BaseMessage[]): CometChat.BaseMessage[] => {\n    return messages.map(msg => {\n      const msgId = ctx.normalizeMessageId(msg.getId());\n      if (idSet.has(msgId) && !msg.getReadAt()) {\n        const cloned = Object.create(Object.getPrototypeOf(msg), Object.getOwnPropertyDescriptors(msg)) as CometChat.BaseMessage;\n        cloned.setReadAt(Math.floor(Date.now() / 1000));\n        ctx.messageIdMap.set(msgId, cloned);\n        return cloned;\n      }\n      return msg;\n    });\n  };\n  ctx.allMessagesSignal.update(updateMessages);\n  ctx.messagesSignal.update(updateMessages);\n}\n\nexport async function markInitialMessagesAsReadImpl(ctx: ReadOpsContext, messages: CometChat.BaseMessage[], loggedInUser: CometChat.User | null, markAsRead: (msg: CometChat.BaseMessage) => Promise<void>): Promise<void> {\n  if (messages.length === 0 || !loggedInUser) { return; }\n  for (let i = messages.length - 1; i >= 0; i--) {\n    const msg = messages[i];\n    const sender = msg.getSender();\n    if (!msg.getReadAt() && sender && sender.getUid() !== loggedInUser.getUid()) {\n      try {\n        await markAsRead(msg);\n        const messageId = msg.getId();\n        if (messageId) { updateLocalReadStatusImpl(ctx, [messageId]); }\n        CometChatMessageEvents.ccMessageRead.next(msg);\n        break;\n      } catch (error) {\n        CometChatLogger.error('MessageListService', 'Error marking messages as read on initial load:', error);\n      }\n    }\n  }\n}\n\nexport async function markAsDeliveredImpl(_ctx: ReadOpsContext, message: CometChat.BaseMessage): Promise<void> {\n  try {\n    await CometChat.markAsDelivered(message);\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'markAsDelivered: Failed to mark message as delivered', error);\n  }\n}\n\nexport async function markAsUnreadImpl(ctx: ReadOpsContext, message: CometChat.BaseMessage): Promise<CometChat.Conversation> {\n  const messageId = message.getId();\n  const existingMessage = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!existingMessage) {\n    const error = new Error(`[MessageListService] markAsUnread: Message with ID ${messageId} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  try {\n    const updatedConversation = await CometChat.markMessageAsUnread(existingMessage) as CometChat.Conversation;\n    return updatedConversation;\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'markAsUnread: SDK call failed', error);\n    throw error;\n  }\n}\n\nexport function getMessagesInRangeImpl(ctx: ReadOpsContext, startIndex: number, endIndex: number): CometChat.BaseMessage[] {\n  const allMessages = ctx.allMessagesSignal();\n  const totalCount = allMessages.length;\n  if (totalCount === 0) { return []; }\n  if (startIndex < 0 || endIndex < 0 || startIndex > endIndex || startIndex >= totalCount) {\n    CometChatLogger.warn('MessageListService', `getMessagesInRange: Invalid range [${startIndex}, ${endIndex}] for totalCount ${totalCount}`);\n    return [];\n  }\n  const clampedEndIndex = Math.min(endIndex, totalCount - 1);\n  return allMessages.slice(startIndex, clampedEndIndex + 1);\n}\n\nexport function getTotalMessageCountImpl(ctx: ReadOpsContext): number {\n  return ctx.allMessagesSignal().length;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIKit} from '../cometchat-uikit';\nimport {CometChatUIKitConstants} from '../constants';\nimport {CometChatLogger} from '../utils/CometChatLogger';\n\nexport function handleTypingStartedImpl(ctx: any, indicator: CometChat.TypingIndicator): void {\n  try {\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    if (!loggedInUser) { return; }\n    const sender = indicator.getSender();\n    if (!sender) { return; }\n    const senderUid = sender.getUid();\n    if (senderUid === loggedInUser.getUid()) { return; }\n    if (!isTypingIndicatorForCurrentConversationImpl(ctx, indicator)) { return; }\n    const existingTimeout = ctx.typingTimeoutsMap.get(senderUid);\n    if (existingTimeout) {\n      clearTimeout(existingTimeout);\n      ctx.typingTimeoutsMap.delete(senderUid);\n    }\n    const currentTypingUsers = new Map(ctx.typingUsersSignal());\n    currentTypingUsers.set(senderUid, indicator);\n    ctx.typingUsersSignal.set(currentTypingUsers);\n    const timeoutId = setTimeout(() => {\n      clearTypingIndicatorImpl(ctx, senderUid);\n    }, ctx.TYPING_INDICATOR_TIMEOUT);\n    ctx.typingTimeoutsMap.set(senderUid, timeoutId);\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'Error handling typing started:', error);\n  }\n}\n\nexport function handleTypingEndedImpl(ctx: any, indicator: CometChat.TypingIndicator): void {\n  try {\n    const sender = indicator.getSender();\n    if (!sender) { return; }\n    const senderUid = sender.getUid();\n    clearTypingIndicatorImpl(ctx, senderUid);\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'Error handling typing ended:', error);\n  }\n}\n\nexport function clearTypingIndicatorImpl(ctx: any, userUid: string): void {\n  const existingTimeout = ctx.typingTimeoutsMap.get(userUid);\n  if (existingTimeout) {\n    clearTimeout(existingTimeout);\n    ctx.typingTimeoutsMap.delete(userUid);\n  }\n  const currentTypingUsers = new Map(ctx.typingUsersSignal());\n  if (currentTypingUsers.has(userUid)) {\n    currentTypingUsers.delete(userUid);\n    ctx.typingUsersSignal.set(currentTypingUsers);\n  }\n}\n\nexport function isTypingIndicatorForCurrentConversationImpl(ctx: any, indicator: CometChat.TypingIndicator): boolean {\n  if (!ctx.currentUser && !ctx.currentGroup) { return false; }\n  const receiverType = indicator.getReceiverType();\n  const receiverId = indicator.getReceiverId();\n  if (ctx.currentUser) {\n    if (receiverType !== CometChatUIKitConstants.MessageReceiverType.user) return false;\n    const sender = indicator.getSender();\n    if (!sender) return false;\n    if (sender.getUid() !== ctx.currentUser.getUid()) return false;\n  }\n  if (ctx.currentGroup) {\n    if (receiverType !== CometChatUIKitConstants.MessageReceiverType.group) return false;\n    if (receiverId !== ctx.currentGroup.getGuid()) return false;\n  }\n  return true;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIKitConstants} from '../constants';\nimport {CometChatLogger} from '../utils/CometChatLogger';\n\nexport async function translateMessageImpl(ctx: any, message: CometChat.BaseMessage, language: string): Promise<string> {\n  const messageId = message.getId();\n  const cacheKey = `${messageId}_${language}`;\n  const cachedTranslation = ctx.translationCache.get(cacheKey);\n  if (cachedTranslation) { return cachedTranslation; }\n  const existingMessage = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!existingMessage) {\n    const error = new Error(`[MessageListService] translateMessage: Message with ID ${messageId} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) {\n    const error = new Error(`[MessageListService] translateMessage: Only text messages can be translated`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  try {\n    const textMessage = message as CometChat.TextMessage;\n    const originalText = textMessage.getText();\n    const response = (await CometChat.callExtension(\n      'message-translation',\n      'POST',\n      'v2/translate',\n      { msgId: messageId, text: originalText, languages: [language] }\n    )) as { translations: { language_translated: string; message_translated: string }[] };\n    const translations = response?.translations || [];\n    const translation = translations.find(t => t.language_translated === language);\n    if (!translation) { throw new Error(`Translation for language '${language}' not found in response`); }\n    const translatedText = translation.message_translated;\n    ctx.translationCache.set(cacheKey, translatedText);\n    return translatedText;\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'translateMessage: Failed to translate message', error);\n    if (ctx.errorCallback) { ctx.errorCallback(error as CometChat.CometChatException); }\n    return '';\n  }\n}\n\nexport function getCachedTranslationImpl(ctx: any, messageId: number, language: string): string | undefined {\n  const cacheKey = `${messageId}_${language}`;\n  return ctx.translationCache.get(cacheKey);\n}\n\nexport function clearTranslationCacheImpl(ctx: any): void {\n  ctx.translationCache.clear();\n}\n\nexport async function flagMessageImpl(\n  ctx: any,\n  message: CometChat.BaseMessage,\n  reasonId: string,\n  remark?: string\n): Promise<void> {\n  const messageId = message.getId();\n  const existingMessage = ctx.messageIdMap.get(ctx.normalizeMessageId(messageId));\n  if (!existingMessage) {\n    const error = new Error(`[MessageListService] flagMessage: Message with ID ${messageId} not found`);\n    CometChatLogger.error('MessageListService', error.message);\n    throw error;\n  }\n  try {\n    await CometChat.flagMessage(String(messageId), {\n      reasonId,\n      ...(remark && remark.trim().length > 0 ? { remark: remark.trim() } : {}),\n    });\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'flagMessage: Failed to flag message', error);\n    throw error;\n  }\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIKitConstants} from '../constants';\n\n/**\n * Default message types fetched by the MessageList when no custom\n * `messagesRequestBuilder` is supplied. Exported so consumers can derive their\n * own type list (e.g. keep all defaults but drop a single extension):\n *\n *   const types = DEFAULT_MESSAGE_TYPES.filter(t => t !== 'extension_poll');\n */\nexport const DEFAULT_MESSAGE_TYPES: readonly string[] = [\n  CometChatUIKitConstants.MessageTypes.text,\n  CometChatUIKitConstants.MessageTypes.file,\n  CometChatUIKitConstants.MessageTypes.image,\n  CometChatUIKitConstants.MessageTypes.audio,\n  CometChatUIKitConstants.MessageTypes.video,\n  CometChatUIKitConstants.MessageTypes.groupMember,\n  CometChatUIKitConstants.MessageTypes.form,\n  CometChatUIKitConstants.MessageTypes.scheduler,\n  CometChatUIKitConstants.MessageTypes.card,\n  CometChatUIKitConstants.MessageTypes.assistant,\n  CometChatUIKitConstants.ExtensionTypes.sticker,\n  CometChatUIKitConstants.ExtensionTypes.poll,\n  CometChatUIKitConstants.ExtensionTypes.whiteboard,\n  CometChatUIKitConstants.ExtensionTypes.document,\n  CometChatUIKitConstants.calls.meeting,\n\n];\n\n/**\n * Default message categories fetched by the MessageList when no custom\n * `messagesRequestBuilder` is supplied. Includes the `action` category, which\n * the MessageList omits at runtime when `hideGroupActionMessages` is set.\n */\nexport const DEFAULT_MESSAGE_CATEGORIES: readonly string[] = [\n  CometChatUIKitConstants.MessageCategory.message,\n  CometChatUIKitConstants.MessageCategory.custom,\n  CometChatUIKitConstants.MessageCategory.call,\n  CometChatUIKitConstants.MessageCategory.interactive,\n  CometChatUIKitConstants.MessageCategory.agentic,\n  CometChatUIKitConstants.MessageCategory.action,\n   CometChatUIKitConstants.MessageCategory.card\n];\n\nexport function buildMessagesRequestImpl(self: any, messageId?: number): CometChat.MessagesRequest {\n  let builder: CometChat.MessagesRequestBuilder;\n  if (self.messagesRequestBuilder) { builder = self.messagesRequestBuilder; } else {\n    const messageTypes = getDefaultMessageTypesImpl(self);\n    const messageCategories = getDefaultMessageCategoriesImpl(self);\n    builder = new CometChat.MessagesRequestBuilder()\n      .setLimit(self.DEFAULT_MESSAGE_LIMIT)\n      .setTypes(messageTypes)\n      .setCategories(messageCategories);\n  }\n  const isThreadMode = self.parentMessageId !== null;\n  builder.hideReplies(!isThreadMode);\n  if (self.currentUser) { builder.setUID(self.currentUser.getUid()); } else if (self.currentGroup) { builder.setGUID(self.currentGroup.getGuid()); }\n  if (self.parentMessageId !== null) {\n    builder.setParentMessageId(self.parentMessageId);\n    if (self.isAgentChatMode) { builder.withParent(true); }\n  }\n  if (messageId !== undefined) { builder.setMessageId(messageId); }\n  return builder.build();\n}\n\nexport function buildNextMessagesRequestImpl(self: any, messageId?: number): CometChat.MessagesRequest {\n  let builder: CometChat.MessagesRequestBuilder;\n  if (self.messagesRequestBuilder) { builder = self.messagesRequestBuilder; } else {\n    const messageTypes = getDefaultMessageTypesImpl(self);\n    const messageCategories = getDefaultMessageCategoriesImpl(self);\n    builder = new CometChat.MessagesRequestBuilder()\n      .setLimit(self.DEFAULT_MESSAGE_LIMIT)\n      .setTypes(messageTypes)\n      .setCategories(messageCategories);\n  }\n  const isThreadMode = self.parentMessageId !== null;\n  builder.hideReplies(!isThreadMode);\n  if (self.currentUser) { builder.setUID(self.currentUser.getUid()); } else if (self.currentGroup) { builder.setGUID(self.currentGroup.getGuid()); }\n  if (self.parentMessageId !== null) {\n    builder.setParentMessageId(self.parentMessageId);\n    if (self.isAgentChatMode) { builder.withParent(true); }\n  }\n  if (messageId !== undefined) { builder.setMessageId(messageId); }\n  return builder.build();\n}\n\nexport function getDefaultMessageTypesImpl(self: any): string[] {\n  if (self.replacedMessageTypes) { return Array.from(self.replacedMessageTypes) as string[]; }\n  const defaults = [...DEFAULT_MESSAGE_TYPES];\n  if (self.customMessageTypes.size > 0) { const merged = new Set(defaults); self.customMessageTypes.forEach((type: string) => merged.add(type)); return Array.from(merged); }\n  return defaults;\n}\n\nexport function getDefaultMessageCategoriesImpl(self: any): string[] {\n  if (self.replacedMessageCategories) { return Array.from(self.replacedMessageCategories) as string[]; }\n  const categories = self.hideGroupActionMessages\n    ? DEFAULT_MESSAGE_CATEGORIES.filter(c => c !== CometChatUIKitConstants.MessageCategory.action)\n    : [...DEFAULT_MESSAGE_CATEGORIES];\n  if (self.customMessageCategories.size > 0) { const merged = new Set(categories); self.customMessageCategories.forEach((cat: string) => merged.add(cat)); return Array.from(merged); }\n  return categories;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIKitConstants} from '../constants';\nimport {CometChatUIKit} from '../cometchat-uikit';\nimport {CometChatLogger} from '../utils/CometChatLogger';\n\nexport function isMessageForCurrentConversationImpl(self: any, message: CometChat.BaseMessage): boolean {\n  if (!self.currentUser && !self.currentGroup) { return false; }\n  const receiverType = message.getReceiverType();\n  if (self.currentUser) {\n    if (receiverType !== CometChatUIKitConstants.MessageReceiverType.user) return false;\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    if (!loggedInUser) return false;\n    const loggedInUserId = loggedInUser.getUid();\n    const currentUserId = self.currentUser.getUid();\n    const sender = message.getSender();\n    const senderId = sender ? sender.getUid() : '';\n    const receiverId = message.getReceiverId();\n    const sentByLoggedInUser = (!sender || senderId === loggedInUserId) && receiverId === currentUserId;\n    const sentByCurrentUser = (!sender || senderId === currentUserId) && receiverId === loggedInUserId;\n    if (!sentByLoggedInUser && !sentByCurrentUser) return false;\n  }\n  if (self.currentGroup) {\n    if (receiverType !== CometChatUIKitConstants.MessageReceiverType.group) return false;\n    const receiver = message.getReceiverId();\n    if (receiver != self.currentGroup.getGuid()) return false;\n  }\n  if (self.parentMessageId !== null) {\n    const messageParentId = message.getParentMessageId();\n    if (messageParentId !== self.parentMessageId) return false;\n  } else {\n    if (message.getParentMessageId() && !self.isAgentChatMode) return false;\n  }\n  return true;\n}\n\nexport function isThreadReplyForCurrentConversationImpl(self: any, message: CometChat.BaseMessage): boolean {\n  if (!self.currentUser && !self.currentGroup) { return false; }\n  const receiverId = message.getReceiverId();\n  const senderId = message.getSender()?.getUid() || '';\n  if (self.currentUser) {\n    if (message.getReceiverType() !== CometChatUIKitConstants.MessageReceiverType.user) return false;\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    if (!loggedInUser) return false;\n    const loggedInUserId = loggedInUser.getUid();\n    const currentUserId = self.currentUser.getUid();\n    return (\n      (senderId === loggedInUserId && receiverId === currentUserId) ||\n      (senderId === currentUserId && receiverId === loggedInUserId)\n    );\n  }\n  if (self.currentGroup) {\n    if (message.getReceiverType() !== CometChatUIKitConstants.MessageReceiverType.group) return false;\n    return receiverId === self.currentGroup.getGuid();\n  }\n  return false;\n}\n\nexport function handleGroupActionImpl(self: any, message: CometChat.Action, group: CometChat.Group): void {\n  if (!self.currentGroup) return;\n  if (group.getGuid() !== self.currentGroup.getGuid()) return;\n  if (self.hideGroupActionMessages) return;\n  self.addMessage(message);\n}\n\nexport function handleCallActionImpl(self: any, call: CometChat.Call): void {\n  if (!self.currentUser && !self.currentGroup) return;\n  const receiverType = call.getReceiverType();\n  const receiver = call.getReceiver();\n  const sender = call.getSender();\n  if (self.currentUser) {\n    const currentUid = self.currentUser.getUid();\n    const receiverUid = receiverType === CometChatUIKitConstants.MessageReceiverType.user ? (receiver as CometChat.User)?.getUid?.() : null;\n    const senderUid = sender?.getUid?.();\n    if (receiverUid !== currentUid && senderUid !== currentUid) return;\n  } else if (self.currentGroup) {\n    if (receiverType !== CometChatUIKitConstants.MessageReceiverType.group) return;\n    if ((receiver as CometChat.Group)?.getGuid?.() !== self.currentGroup.getGuid()) return;\n  }\n  const existing = self.getMessageById(call.getId());\n  if (existing) { self.updateMessageById(call.getId(), call); } else { self.addMessage(call); }\n}\n\nexport async function handleReconnectionImpl(self: any): Promise<void> {\n  try {\n    if (!self.currentUser && !self.currentGroup) { return; }\n    const lastMessageId = self.nextMessageIdSignal();\n    if (lastMessageId === 0) { return; }\n    self.nextMessagesRequest = self.buildNextMessagesRequest(lastMessageId);\n    await self.fetchNextMessages();\n  } catch (error) {\n    CometChatLogger.error('MessageListService', 'Error handling reconnection:', error);\n  }\n}\n","import {inject, DestroyRef, signal, WritableSignal, Signal, NgZone} from '@angular/core';\nimport {toObservable} from '@angular/core/rxjs-interop';\nimport {Observable, Subscription} from 'rxjs';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {ErrorCallback} from './message-composer.service';\nimport {CometChatUIKitConstants} from '../constants';\nimport {CometChatUIKit} from '../cometchat-uikit';\nimport {CometChatMessageEvents, IMessages} from '../events/CometChatMessageEvents';\nimport {MessageStatus} from '../Enums/Enums';\nimport {CometChatUIKitUtility} from '../CometChatUIKitUtility';\nimport {CometChatLogger} from '../utils/CometChatLogger';\nimport {isRecoverableError, isRecoverableErrorMessage, isRetryableError, getUserFriendlyErrorMessage, getRetryDelay, delay as delayUtil} from './message-list.error-utils';\nimport {applyReactionEvent, isReactionForCurrentConversation, isReceiptForCurrentConversation, applyReadReceipt, applyDeliveryReceipt} from './message-list.reaction-utils';\nimport {setupMessageListener as setupMsgListener, setupGroupListener as setupGrpListener, setupCallListener as setupCallLstnr, setupConnectionListener as setupConnListener} from './message-list.listeners';\nimport {fetchPreviousMessagesImpl, fetchNextMessagesImpl, fetchMessagesAroundIdImpl, handleReceiptImpl} from './message-list.fetch-utils';\nimport {addMessageImpl, updateMessageByIdImpl, updateMessageByMuidImpl, deleteMessageImpl, editMessageImpl, removeMessageImpl, getMessageByIdImpl, updateReplyCountImpl, updateMessageReactionsImpl, deduplicateMessagesImpl, clearMessagesImpl, clearMessagesAndStateImpl} from './message-list.message-ops';\nimport {addReactionImpl, removeReactionImpl, fetchReactionsImpl} from './message-list.reaction-ops';\nimport {markAsReadImpl, updateLocalReadStatusImpl, markInitialMessagesAsReadImpl, markAsDeliveredImpl, markAsUnreadImpl, getMessagesInRangeImpl, getTotalMessageCountImpl} from './message-list.read-ops';\nimport {handleTypingStartedImpl, handleTypingEndedImpl, clearTypingIndicatorImpl, isTypingIndicatorForCurrentConversationImpl} from './message-list.typing-utils';\nimport {translateMessageImpl, getCachedTranslationImpl, clearTranslationCacheImpl, flagMessageImpl} from './message-list.translation-utils';\nimport {setupSentMessageListenerImpl, setupEditedMessageListenerImpl, handleSentMessageImpl, updateSentMessageByMuidImpl, updateSentMessageReplyCountImpl, handleEditedMessageImpl} from './message-list.sent-handler';\nimport {buildMessagesRequestImpl, buildNextMessagesRequestImpl, getDefaultMessageTypesImpl, getDefaultMessageCategoriesImpl} from './message-list.request-builder';\nimport {isMessageForCurrentConversationImpl, isThreadReplyForCurrentConversationImpl, handleGroupActionImpl, handleCallActionImpl, handleReconnectionImpl} from './message-list.conversation-utils';\n\nexport class MessageListService {\n  private destroyRef = inject(DestroyRef);\n  private ngZone = inject(NgZone);\n\n  private messageListenerId = `message_list_${Date.now()}`; private groupListenerId = `message_list_group_${Date.now()}`;\n  private callListenerId = `message_list_call_${Date.now()}`; private connectionListenerId = `message_list_connection_${Date.now()}`;\n\n  private ccMessageSentSubscription: Subscription | null = null; private ccMessageEditedSubscription: Subscription | null = null;\n\n  private messagesSignal: WritableSignal<CometChat.BaseMessage[]> = signal<CometChat.BaseMessage[]>([]);\n  private allMessagesSignal: WritableSignal<CometChat.BaseMessage[]> = signal<CometChat.BaseMessage[]>([]);\n\n  private loadingStateSignal: WritableSignal<boolean> = signal<boolean>(false); private errorStateSignal: WritableSignal<Error | null> = signal<Error | null>(null);\n  private prevMessageIdSignal: WritableSignal<number> = signal<number>(0); private nextMessageIdSignal: WritableSignal<number> = signal<number>(0); private unreadCountSignal: WritableSignal<number> = signal<number>(0);\n\n  private connectionStatusSignal: WritableSignal<'connected' | 'disconnected'> = signal<'connected' | 'disconnected'>('connected');\n\n  private typingUsersSignal: WritableSignal<Map<string, CometChat.TypingIndicator>> = signal<Map<string, CometChat.TypingIndicator>>(new Map());\n\n  private typingTimeoutsMap = new Map<string, ReturnType<typeof setTimeout>>(); private messageIdMap = new Map<number, CometChat.BaseMessage>(); private messageMuidMap = new Map<string, CometChat.BaseMessage>();\n\n  private currentUser: CometChat.User | null = null; private currentGroup: CometChat.Group | null = null; private parentMessageId: number | null = null;\n  private isAgentChatMode = false; private messagesRequestBuilder: CometChat.MessagesRequestBuilder | null = null; private hideGroupActionMessages = false;\n  private messagesRequest: CometChat.MessagesRequest | null = null; private nextMessagesRequest: CometChat.MessagesRequest | null = null; private errorCallback: ErrorCallback | null = null;\n  private customMessageTypes: Set<string> = new Set(); private customMessageCategories: Set<string> = new Set(); private replacedMessageTypes: Set<string> | null = null; private replacedMessageCategories: Set<string> | null = null;\n  private readonly DEFAULT_MESSAGE_LIMIT = 30; private readonly TYPING_INDICATOR_TIMEOUT = 5000; private readonly MAX_RETRY_ATTEMPTS = 3; private readonly RETRY_DELAYS = [1000, 2000, 4000] as const;\n  private fetchGeneration = 0; private retryAttempts = new Map<string, number>(); private translationCache = new Map<string, string>();\n\n  private buildMessagesRequest(messageId?: number): CometChat.MessagesRequest { return buildMessagesRequestImpl(this as any, messageId); }\n  private buildNextMessagesRequest(messageId?: number): CometChat.MessagesRequest { return buildNextMessagesRequestImpl(this as any, messageId); }\n  private getDefaultMessageTypes(): string[] { return getDefaultMessageTypesImpl(this as any); }\n  private getDefaultMessageCategories(): string[] { return getDefaultMessageCategoriesImpl(this as any); }\n  readonly messages: Signal<CometChat.BaseMessage[]> = this.messagesSignal.asReadonly();\n\n  readonly allMessages: Signal<CometChat.BaseMessage[]> = this.allMessagesSignal.asReadonly();\n\n  readonly loadingState: Signal<boolean> = this.loadingStateSignal.asReadonly();\n\n  readonly errorState: Signal<Error | null> = this.errorStateSignal.asReadonly();\n\n  readonly prevMessageId: Signal<number> = this.prevMessageIdSignal.asReadonly();\n\n  readonly nextMessageId: Signal<number> = this.nextMessageIdSignal.asReadonly();\n\n  readonly unreadCount: Signal<number> = this.unreadCountSignal.asReadonly();\n\n  readonly connectionStatus: Signal<'connected' | 'disconnected'> =\n    this.connectionStatusSignal.asReadonly();\n\n  readonly typingUsers: Signal<Map<string, CometChat.TypingIndicator>> =\n    this.typingUsersSignal.asReadonly();\n\n  readonly messages$: Observable<CometChat.BaseMessage[]> = toObservable(this.messagesSignal);\n\n  readonly loadingState$: Observable<boolean> = toObservable(this.loadingStateSignal);\n\n  readonly errorState$: Observable<Error | null> = toObservable(this.errorStateSignal);\n\n  constructor() {\n    this.destroyRef.onDestroy(() => {\n      this.cleanup();\n    });\n    this.setupSentMessageListener();\n    this.setupEditedMessageListener();\n    this.setupMessageListener();\n  }\n  cleanup(): void {\n    this.removeMessageListener();\n    this.removeGroupListener();\n    this.removeCallListener();\n    this.removeConnectionListener();\n    this.removeSentMessageListener();\n    this.removeEditedMessageListener();\n    this.resetState();\n    this.errorCallback = null;\n    this.regenerateListenerIds();\n  }\n  private resetState(): void {\n    this.messagesSignal.set([]);\n    this.allMessagesSignal.set([]);\n    this.loadingStateSignal.set(false);\n    this.errorStateSignal.set(null);\n    this.prevMessageIdSignal.set(0);\n    this.nextMessageIdSignal.set(0);\n    this.unreadCountSignal.set(0);\n    this.connectionStatusSignal.set('connected');\n    this.messageIdMap.clear();\n    this.messageMuidMap.clear();\n    this.retryAttempts.clear();\n    this.typingTimeoutsMap.forEach(timeoutId => {\n      clearTimeout(timeoutId);\n    });\n    this.typingTimeoutsMap.clear();\n    this.typingUsersSignal.set(new Map());\n    this.currentUser = null;\n    this.currentGroup = null;\n    this.parentMessageId = null;\n    this.messagesRequestBuilder = null;\n    this.hideGroupActionMessages = false;\n    this.messagesRequest = null;\n    this.nextMessagesRequest = null;\n    this.translationCache.clear();\n  }\n  private regenerateListenerIds(): void {\n    const timestamp = Date.now();\n    this.messageListenerId = `message_list_${timestamp}`;\n    this.groupListenerId = `message_list_group_${timestamp}`;\n    this.callListenerId = `message_list_call_${timestamp}`;\n    this.connectionListenerId = `message_list_connection_${timestamp}`;\n  }\n  private normalizeMessageId(messageId: string | number): number { return typeof messageId === 'string' ? parseInt(messageId, 10) : messageId; }\n  private removeMessageListener(): void {\n    try {\n      CometChat.removeMessageListener(this.messageListenerId);\n    } catch (error) {\n      CometChatLogger.error('MessageListService', 'Error removing message listener:', error);\n    }\n  }\n  private removeGroupListener(): void {\n    try {\n      CometChat.removeGroupListener(this.groupListenerId);\n    } catch (error) {\n      CometChatLogger.error('MessageListService', 'Error removing group listener:', error);\n    }\n  }\n  private removeCallListener(): void {\n    try {\n      CometChat.removeCallListener(this.callListenerId);\n    } catch (error) {\n      CometChatLogger.error('MessageListService', 'Error removing call listener:', error);\n    }\n  }\n  private removeConnectionListener(): void {\n    try {\n      CometChat.removeConnectionListener(this.connectionListenerId);\n    } catch (error) {\n      CometChatLogger.error('MessageListService', 'Error removing connection listener:', error);\n    }\n  }\n  private removeSentMessageListener(): void {\n    if (this.ccMessageSentSubscription) { this.ccMessageSentSubscription.unsubscribe(); this.ccMessageSentSubscription = null; }\n  }\n  private removeEditedMessageListener(): void {\n    if (this.ccMessageEditedSubscription) { this.ccMessageEditedSubscription.unsubscribe(); this.ccMessageEditedSubscription = null; }\n  }\n  getMessageListenerId(): string { return this.messageListenerId; }\n  getGroupListenerId(): string { return this.groupListenerId; }\n  getCallListenerId(): string { return this.callListenerId; }\n  getConnectionListenerId(): string { return this.connectionListenerId; }\n  setUser(user: CometChat.User): void {\n    if (!user) { const e = new Error('[MessageListService] setUser: User is required'); CometChatLogger.error('MessageListService', e.message); if (this.errorCallback) this.errorCallback(e as unknown as CometChat.CometChatException); return; }\n    this.clearMessagesAndState(); this.removeGroupListener(); this.removeCallListener(); this.removeConnectionListener();\n    this.currentUser = user; this.currentGroup = null; this.messagesRequest = this.buildMessagesRequest(); this.nextMessagesRequest = this.buildNextMessagesRequest();\n  }\n  setGroup(group: CometChat.Group): void {\n    if (!group) { const e = new Error('[MessageListService] setGroup: Group is required'); CometChatLogger.error('MessageListService', e.message); if (this.errorCallback) this.errorCallback(e as unknown as CometChat.CometChatException); return; }\n    this.clearMessagesAndState(); this.removeGroupListener(); this.removeCallListener(); this.removeConnectionListener();\n    this.currentGroup = group; this.currentUser = null; this.messagesRequest = this.buildMessagesRequest(); this.nextMessagesRequest = this.buildNextMessagesRequest();\n  }\n  clearConversation(): void {\n    this.clearMessagesAndState();\n    this.removeGroupListener();\n    this.removeCallListener();\n    this.removeConnectionListener();\n    this.currentUser = null;\n    this.currentGroup = null;\n    this.messagesRequest = null;\n    this.nextMessagesRequest = null;\n  }\n  setIsAgentChat(value: boolean): void { this.isAgentChatMode = value; }\n  setParentMessageId(parentMessageId: number | null): void {\n    this.parentMessageId = parentMessageId;\n    if (this.currentUser || this.currentGroup) {\n      this.clearMessagesAndState();\n      this.messagesRequest = this.buildMessagesRequest();\n      this.nextMessagesRequest = this.buildNextMessagesRequest();\n    }\n  }\n  updateParentMessageIdInPlace(parentMessageId: number): void {\n    this.parentMessageId = parentMessageId;\n    if (this.currentUser || this.currentGroup) { this.messagesRequest = this.buildMessagesRequest(); this.nextMessagesRequest = this.buildNextMessagesRequest(); }\n  }\n  setMessagesRequestBuilder(builder: CometChat.MessagesRequestBuilder | null): void {\n    this.messagesRequestBuilder = builder;\n    if (this.currentUser || this.currentGroup) { this.messagesRequest = this.buildMessagesRequest(); this.nextMessagesRequest = this.buildNextMessagesRequest(); }\n  }\n  setHideGroupActionMessages(hide: boolean): void {\n    this.hideGroupActionMessages = hide;\n    if (this.currentUser || this.currentGroup) { this.messagesRequest = this.buildMessagesRequest(); this.nextMessagesRequest = this.buildNextMessagesRequest(); }\n  }\n  addCustomMessageTypes(types: string[]): void { if (!types) return; types.filter(t => t != null && t !== '').forEach(t => this.customMessageTypes.add(t)); }\n  addCustomMessageCategories(categories: string[]): void { if (!categories) return; categories.filter(c => c != null && c !== '').forEach(c => this.customMessageCategories.add(c)); }\n  removeCustomMessageTypes(types: string[]): void { if (!types) return; types.forEach(t => this.customMessageTypes.delete(t)); }\n  removeCustomMessageCategories(categories: string[]): void { if (!categories) return; categories.forEach(c => this.customMessageCategories.delete(c)); }\n  setMessageTypes(types: string[] | null): void {\n    if (types === null) { this.replacedMessageTypes = null; return; }\n    this.replacedMessageTypes = new Set(types.filter(t => t != null && t !== ''));\n  }\n  setMessageCategories(categories: string[] | null): void {\n    if (categories === null) { this.replacedMessageCategories = null; return; }\n    this.replacedMessageCategories = new Set(categories.filter(c => c != null && c !== ''));\n  }\n  getAllMessageTypes(): string[] {\n    return this.getDefaultMessageTypes();\n  }\n  getAllMessageCategories(): string[] {\n    return this.getDefaultMessageCategories();\n  }\n  setErrorCallback(callback: ErrorCallback | null): void { this.errorCallback = callback; }\n  private clearMessagesAndState(): void {\n    this.fetchGeneration++;\n    this.messagesSignal.set([]);\n    this.allMessagesSignal.set([]);\n    this.messageIdMap.clear();\n    this.messageMuidMap.clear();\n    this.prevMessageIdSignal.set(0);\n    this.nextMessageIdSignal.set(0);\n    this.unreadCountSignal.set(0);\n    this.errorStateSignal.set(null);\n    // Set loading to true immediately so the UI shows shimmer right away\n    // (prevents blank flash between clearing messages and fetch starting)\n    this.loadingStateSignal.set(true);\n    this.messagesRequest = null;\n    this.nextMessagesRequest = null;\n  }\n  async fetchPreviousMessages(): Promise<boolean> { return fetchPreviousMessagesImpl(this as any); }\n  async fetchNextMessages(): Promise<boolean> { return fetchNextMessagesImpl(this as any); }\n  async fetchMessagesAroundId(messageId: number): Promise<void> { return fetchMessagesAroundIdImpl(this as any, messageId); }\n  /** Returns the current fetch generation — used by fetchWithUnreadPivot to detect stale async calls. */\n  getFetchGeneration(): number { return this.fetchGeneration; }\n  private deduplicateMessages(messages: CometChat.BaseMessage[]): CometChat.BaseMessage[] { return deduplicateMessagesImpl(this as any, messages); }\n  private isRecoverableError(error: unknown): boolean { return isRecoverableError(error); }\n  private isRecoverableErrorMessage(message: string): boolean { return isRecoverableErrorMessage(message); }\n  private getUserFriendlyErrorMessage(error: unknown, context: string): string { return getUserFriendlyErrorMessage(error, context); }\n  private delay(ms: number): Promise<void> { return delayUtil(ms); }\n  private async handleErrorWithRetry(error: unknown, context: string, retryFn?: () => Promise<void>): Promise<void> {\n    CometChatLogger.error('MessageListService', `Error in ${context}:`, error);\n    const currentAttempt = this.retryAttempts.get(context) || 0;\n    if (this.isRecoverableError(error) && currentAttempt < this.MAX_RETRY_ATTEMPTS && retryFn) {\n      this.retryAttempts.set(context, currentAttempt + 1);\n      const retryDelay = this.RETRY_DELAYS[currentAttempt] || this.RETRY_DELAYS[this.RETRY_DELAYS.length - 1];\n      await this.delay(retryDelay);\n      try { await retryFn(); this.retryAttempts.delete(context); return; } catch (retryError) { return this.handleErrorWithRetry(retryError, context, retryFn); }\n    }\n    this.retryAttempts.delete(context);\n    const enhancedError = new Error(this.getUserFriendlyErrorMessage(error, context));\n    (enhancedError as Error & { originalError: unknown }).originalError = error;\n    (enhancedError as Error & { context: string }).context = context;\n    if (this.errorCallback) this.errorCallback(error as CometChat.CometChatException);\n  }\n  clearError(): void { this.errorStateSignal.set(null); }\n  setLoadingState(value: boolean): void { this.loadingStateSignal.set(value); }\n  addMessage(message: CometChat.BaseMessage): void { addMessageImpl(this as any, message); }\n  updateMessageById(messageId: number, message: CometChat.BaseMessage): boolean { return updateMessageByIdImpl(this as any, messageId, message); }\n  updateMessageByMuid(muid: string, message: CometChat.BaseMessage): boolean { return updateMessageByMuidImpl(this as any, muid, message); }\n  deleteMessage(messageId: number): boolean { return deleteMessageImpl(this as any, messageId); }\n  async editMessage(message: CometChat.BaseMessage, newText: string): Promise<CometChat.BaseMessage> { return editMessageImpl(this as any, message, newText); }\n  removeMessage(messageId: number): boolean { return removeMessageImpl(this as any, messageId); }\n  getMessageById(messageId: number): CometChat.BaseMessage | undefined { return getMessageByIdImpl(this as any, messageId); }\n  updateReplyCount(parentMessageId: number, count: number): boolean { return updateReplyCountImpl(this as any, parentMessageId, count); }\n  updateMessageReactions(messageId: number, reactions: CometChat.ReactionCount[]): boolean { return updateMessageReactionsImpl(this as any, messageId, reactions); }\n  async addReaction(messageId: number, emoji: string): Promise<void> { return addReactionImpl(this as any, messageId, emoji); }\n  async removeReaction(messageId: number, emoji: string): Promise<void> { return removeReactionImpl(this as any, messageId, emoji); }\n  async fetchReactions(messageId: number, builder?: CometChat.ReactionsRequestBuilder): Promise<CometChat.Reaction[]> { return fetchReactionsImpl(this as any, messageId, builder); }\n  async markAsRead(message: CometChat.BaseMessage): Promise<void> { return markAsReadImpl(this as any, message); }\n  async markInitialMessagesAsRead(): Promise<void> {\n    const messages = this.messagesSignal();\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    return markInitialMessagesAsReadImpl(this as any, messages, loggedInUser, (msg) => this.markAsRead(msg));\n  }\n  updateLocalReadStatus(messageIds: number[]): void { updateLocalReadStatusImpl(this as any, messageIds); }\n  async markAsDelivered(message: CometChat.BaseMessage): Promise<void> { return markAsDeliveredImpl(this as any, message); }\n  getMessagesInRange(startIndex: number, endIndex: number): CometChat.BaseMessage[] { return getMessagesInRangeImpl(this as any, startIndex, endIndex); }\n  getTotalMessageCount(): number { return getTotalMessageCountImpl(this as any); }\n  clearMessages(): void { clearMessagesImpl(this as any); }\n  async markAsUnread(message: CometChat.BaseMessage): Promise<CometChat.Conversation> { return markAsUnreadImpl(this as any, message); }\n  private isRetryableError(error: unknown): boolean { return isRetryableError(error); }\n  private setupSentMessageListener(): void { setupSentMessageListenerImpl(this as any); }\n  private setupEditedMessageListener(): void { setupEditedMessageListenerImpl(this as any); }\n  private handleEditedMessage(message: CometChat.BaseMessage): void { handleEditedMessageImpl(this as any, message); }\n  private handleSentMessage(data: IMessages): void { handleSentMessageImpl(this as any, data); }\n  private updateSentMessageByMuid(message: CometChat.BaseMessage): void { updateSentMessageByMuidImpl(this as any, message); }\n  private updateSentMessageReplyCount(message: CometChat.BaseMessage): void { updateSentMessageReplyCountImpl(this as any, message); }\n  private setupMessageListener(): void { setupMsgListener(this, this.ngZone); }\n  private isMessageForCurrentConversation(message: CometChat.BaseMessage): boolean { return isMessageForCurrentConversationImpl(this as any, message); }\n  handleNewMessage(message: CometChat.BaseMessage): void {\n    if (!this.parentMessageId && message.getParentMessageId() && !this.isAgentChatMode) {\n      if (this.isThreadReplyForCurrentConversation(message)) { this.updateSentMessageReplyCount(message); }\n      return;\n    }\n    if (!this.isMessageForCurrentConversation(message)) { return; }\n    // In agent chat mode without parentMessageId: don't add incoming messages\n    // if the list is empty (user hasn't sent anything in this session yet).\n    // This prevents stale AI responses from a previous session appearing in a new chat.\n    if (this.isAgentChatMode && !this.parentMessageId && this.messagesSignal().length === 0) {\n      return;\n    }\n    this.addMessage(message);\n  }\n  private isThreadReplyForCurrentConversation(message: CometChat.BaseMessage): boolean { return isThreadReplyForCurrentConversationImpl(this as any, message); }\n  handleMessageEdited(message: CometChat.BaseMessage): void {\n    if (!this.isMessageForCurrentConversation(message)) { return; }\n    this.updateMessageById(message.getId(), message);\n    CometChatMessageEvents.onMessageEdited.next(message);\n  }\n  handleMessageDeleted(message: CometChat.BaseMessage): void {\n    if (!this.isMessageForCurrentConversation(message)) { return; }\n    this.deleteMessage(message.getId());\n    CometChatMessageEvents.onMessageDeleted.next(message);\n  }\n  handleReceipt(receipt: CometChat.MessageReceipt, isGroupReceipt: boolean): void { handleReceiptImpl(this as any, receipt, isGroupReceipt); }\n  handleReactionEvent(reactionEvent: CometChat.ReactionEvent, action: 'added' | 'removed'): void {\n    const reaction = reactionEvent.getReaction();\n    if (!reaction) { CometChatLogger.warn('MessageListService', 'handleReactionEvent: No reaction in event'); return; }\n    const messageId = reaction.getMessageId();\n    const numericMessageId = typeof messageId === 'string' ? parseInt(messageId, 10) : Number(messageId);\n    if (!numericMessageId || isNaN(numericMessageId)) { CometChatLogger.warn('MessageListService', 'handleReactionEvent: Invalid message ID:', messageId); return; }\n    const message = this.getMessageById(numericMessageId);\n    if (!message) { return; }\n    const emoji = reaction.getReaction();\n    const reactedBy = reaction.getReactedBy();\n    if (!emoji || !reactedBy) { return; }\n    const currentReactions = message.getReactions() || [];\n    const updatedReactions = applyReactionEvent(currentReactions, emoji, action, reactedBy);\n    this.updateMessageReactions(numericMessageId, updatedReactions);\n  }\n  private setupGroupListener(): void { setupGrpListener(this); }\n  private setupCallListener(): void { setupCallLstnr(this); }\n  private setupConnectionListener(): void { setupConnListener(this, this.connectionListenerId); }\n  setConnectionStatus(status: 'connected' | 'disconnected'): void { this.connectionStatusSignal.set(status); }\n  handleGroupAction(message: CometChat.Action, group: CometChat.Group): void { handleGroupActionImpl(this as any, message, group); }\n  handleCallAction(call: CometChat.Call): void { handleCallActionImpl(this as any, call); }\n  async handleReconnection(): Promise<void> { return handleReconnectionImpl(this as any); }\n  handleTypingStarted(indicator: CometChat.TypingIndicator): void { handleTypingStartedImpl(this as any, indicator); }\n  handleTypingEnded(indicator: CometChat.TypingIndicator): void { handleTypingEndedImpl(this as any, indicator); }\n  private clearTypingIndicator(userUid: string): void { clearTypingIndicatorImpl(this as any, userUid); }\n  private isTypingIndicatorForCurrentConversation(indicator: CometChat.TypingIndicator): boolean { return isTypingIndicatorForCurrentConversationImpl(this as any, indicator); }\n  async translateMessage(message: CometChat.BaseMessage, language: string): Promise<string> { return translateMessageImpl(this as any, message, language); }\n  getCachedTranslation(messageId: number, language: string): string | undefined { return getCachedTranslationImpl(this as any, messageId, language); }\n  clearTranslationCache(): void { clearTranslationCacheImpl(this as any); }\n  async flagMessage(message: CometChat.BaseMessage, reasonId: string, remark?: string): Promise<void> { return flagMessageImpl(this as any, message, reasonId, remark); }\n}\n","import { Injectable, TemplateRef, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { BubblePart, MessageTypeKey, BubblePartMap } from './message-bubble-config.types';\n\nexport type { BubblePart, MessageTypeKey, BubblePartMap };\n\n/**\n * MessageBubbleConfigService\n *\n * Centralized service for configuring message bubble views globally or per message type.\n * Maintains two maps: typeViewMap (type-specific) and globalViewMap (global fallback).\n * Priority: type-specific > global > null (default rendering).\n *\n * @Injectable providedIn: 'root'\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class MessageBubbleConfigService {\n  /** Type-specific view configurations. Key: MessageTypeKey, Value: BubblePartMap */\n  private typeViewMap = new Map<MessageTypeKey, BubblePartMap>();\n\n  /** Global view configurations used as fallbacks. */\n  private globalViewMap: BubblePartMap = {};\n\n  /** Reactive signal that increments whenever any configuration changes. */\n  readonly configVersion = signal(0);\n\n  /** Observable that emits whenever any configuration changes. */\n  readonly configChanged$ = new Subject<void>();\n\n  constructor() {\n    // Service is ready to use immediately\n    // No initialization required\n  }\n\n  // ==================== Public Methods ====================\n\n  /**\n   * Sets a bubble view for a specific message type.\n   *\n   * This method allows you to customize how specific parts of the message bubble\n   * are rendered for a particular message type. Type-specific views take priority\n   * over global views when retrieving configurations.\n   *\n   * @param messageType - The message type key (e.g., \"text_message\", \"image_message\")\n   * @param partMap - Map of bubble parts to their view templates\n   *\n   * @example\n   * ```typescript\n   * // Customize content view for text messages\n   * this.bubbleConfigService.setBubbleView('text_message', {\n   *   contentView: this.customTextContentTemplate,\n   *   footerView: this.customFooterTemplate,\n   * });\n   *\n   * // Customize multiple parts for image messages\n   * this.bubbleConfigService.setBubbleView('image_message', {\n   *   contentView: this.imageContentTemplate,\n   *   headerView: this.imageHeaderTemplate,\n   * });\n   * ```\n   *\n   * @see {@link getView} for retrieving configured views\n   * @see {@link BubblePartMap} for available bubble parts\n   *\n  \n   */\n  setBubbleView(messageType: MessageTypeKey, partMap: BubblePartMap): void {\n    // Get existing configuration for this message type, or create empty object\n    const existingConfig = this.typeViewMap.get(messageType) || {};\n\n    // Merge the new part map with existing configuration\n    // This allows incremental updates without losing previously set views\n    const mergedConfig: BubblePartMap = {\n      ...existingConfig,\n      ...partMap,\n    };\n\n    // Store the merged configuration\n    this.typeViewMap.set(messageType, mergedConfig);\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n\n  /**\n   * Sets a global view that applies to all message types.\n   *\n   * Global views serve as fallbacks when no type-specific view is configured\n   * for a particular message type and bubble part. This is useful for applying\n   * consistent customizations across all message types.\n   *\n   * @param part - The bubble part to set (e.g., \"footerView\", \"statusInfoView\")\n   * @param view - The template to use, or null to clear the global view for this part\n   *\n   * @example\n   * ```typescript\n   * // Set a global footer view for all message types\n   * this.bubbleConfigService.setGlobalView('footerView', this.customFooterTemplate);\n   *\n   * // Set a global status info view\n   * this.bubbleConfigService.setGlobalView('statusInfoView', this.customStatusTemplate);\n   *\n   * // Clear a global view\n   * this.bubbleConfigService.setGlobalView('footerView', null);\n   * ```\n   *\n   * @see {@link setGlobalViews} for setting multiple global views at once\n   * @see {@link setBubbleView} for setting type-specific views\n   * @see {@link getView} for retrieving configured views\n   *\n  \n   */\n  setGlobalView(part: BubblePart, view: TemplateRef<any> | null): void {\n    this.globalViewMap[part] = view;\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n\n  /**\n   * Sets multiple global views at once.\n   *\n   * This method allows batch configuration of global views, which is more\n   * convenient when setting up multiple customizations at once. The provided\n   * part map is merged with existing global views, allowing incremental updates.\n   *\n   * @param partMap - Map of bubble parts to their view templates\n   *\n   * @example\n   * ```typescript\n   * // Set multiple global views at once\n   * this.bubbleConfigService.setGlobalViews({\n   *   footerView: this.customFooterTemplate,\n   *   statusInfoView: this.customStatusTemplate,\n   *   leadingView: this.customAvatarTemplate,\n   * });\n   *\n   * // Clear multiple global views\n   * this.bubbleConfigService.setGlobalViews({\n   *   footerView: null,\n   *   statusInfoView: null,\n   * });\n   * ```\n   *\n   * @see {@link setGlobalView} for setting a single global view\n   * @see {@link setBubbleView} for setting type-specific views\n   * @see {@link getView} for retrieving configured views\n   *\n  \n   */\n  setGlobalViews(partMap: BubblePartMap): void {\n    // Merge the provided part map with existing global views\n    // This allows incremental updates without losing previously set views\n    this.globalViewMap = {\n      ...this.globalViewMap,\n      ...partMap,\n    };\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n\n  /**\n   * Gets the configured view for a specific message type and bubble part.\n   *\n   * This method implements the priority logic for view resolution:\n   * 1. First, check if a type-specific view is configured for the given message type and part\n   * 2. If not found, fall back to the global view for that part\n   * 3. If neither is configured, return null (component should use default rendering)\n   *\n   * @param messageType - The message type key (e.g., \"text_message\", \"image_message\")\n   * @param part - The bubble part to retrieve (e.g., \"contentView\", \"footerView\")\n   * @returns The configured TemplateRef for the specified part, or null if not configured\n   *\n   * @example\n   * ```typescript\n   * // Get content view for text messages\n   * const contentView = this.bubbleConfigService.getView('text_message', 'contentView');\n   *\n   * // Use in component template\n   * if (contentView) {\n   *   // Use custom template\n   * } else {\n   *   // Use default rendering\n   * }\n   * ```\n   *\n   * @see {@link setBubbleView} for setting type-specific views\n   * @see {@link setGlobalView} for setting global views\n   *\n  \n   */\n  getView(messageType: MessageTypeKey, part: BubblePart): TemplateRef<any> | null {\n    // Step 1: Check for type-specific view\n    const typeConfig = this.typeViewMap.get(messageType);\n    if (typeConfig && typeConfig[part] !== undefined) {\n      // Return the type-specific view (could be a TemplateRef or null if explicitly cleared)\n      return typeConfig[part] ?? null;\n    }\n\n    // Step 2: Fall back to global view\n    if (this.globalViewMap[part] !== undefined) {\n      return this.globalViewMap[part] ?? null;\n    }\n\n    // Step 3: No configuration found, return null\n    return null;\n  }\n\n  /**\n   * Sets multiple message templates at once.\n   *\n   * This method allows batch configuration of multiple message types in a single call,\n   * which is more efficient and convenient when setting up customizations for multiple\n   * message types at once. Each template in the record is merged with any existing\n   * configuration for that message type.\n   *\n   * @param templates - Record of message type keys to their part maps\n   *\n   * @example\n   * ```typescript\n   * // Configure multiple message types at once\n   * this.bubbleConfigService.setMessageTemplates({\n   *   'text_message': {\n   *     contentView: this.textContentTemplate,\n   *     footerView: this.textFooterTemplate,\n   *   },\n   *   'image_message': {\n   *     contentView: this.imageContentTemplate,\n   *     headerView: this.imageHeaderTemplate,\n   *   },\n   *   'video_message': {\n   *     contentView: this.videoContentTemplate,\n   *   },\n   * });\n   * ```\n   *\n   * @see {@link setBubbleView} for setting a single message type configuration\n   * @see {@link clearAll} for clearing all configurations\n   *\n  \n   */\n  setMessageTemplates(templates: Record<MessageTypeKey, BubblePartMap>): void {\n    if (!templates) return;\n    // Iterate over each message type in the provided templates\n    for (const messageType of Object.keys(templates)) {\n      const partMap = templates[messageType];\n      // Use setBubbleView to ensure consistent merging behavior\n      this.setBubbleView(messageType, partMap);\n    }\n  }\n\n  /**\n   * Clears all configurations (both type-specific and global views).\n   *\n   * This method resets the service to its initial state, removing all configured\n   * views. After calling this method, `getView()` will return null for all\n   * message types and bubble parts until new configurations are set.\n   *\n   * This is useful when:\n   * - Resetting the UI to default rendering\n   * - Switching between different configuration presets\n   * - Cleaning up before applying a completely new configuration\n   *\n   * @example\n   * ```typescript\n   * // Clear all configurations\n   * this.bubbleConfigService.clearAll();\n   *\n   * // After clearing, getView returns null\n   * const view = this.bubbleConfigService.getView('text_message', 'contentView');\n   * console.log(view); // null\n   * ```\n   *\n   * @see {@link clearType} for clearing a specific message type\n   * @see {@link clearGlobalViews} for clearing only global views\n   *\n  \n   */\n  clearAll(): void {\n    // Clear all type-specific configurations\n    this.typeViewMap.clear();\n\n    // Reset global views to empty object\n    this.globalViewMap = {};\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n\n  /**\n   * Clears configuration for a specific message type.\n   *\n   * This method removes all view configurations for the specified message type,\n   * while leaving configurations for other message types and global views intact.\n   * After calling this method, `getView()` for the cleared message type will\n   * fall back to global views (if configured) or return null.\n   *\n   * @param messageType - The message type key to clear (e.g., \"text_message\")\n   *\n   * @example\n   * ```typescript\n   * // Clear only text message configuration\n   * this.bubbleConfigService.clearType('text_message');\n   *\n   * // Text messages now use global views or defaults\n   * const textView = this.bubbleConfigService.getView('text_message', 'contentView');\n   * // Returns global view if set, otherwise null\n   *\n   * // Other message types are unaffected\n   * const imageView = this.bubbleConfigService.getView('image_message', 'contentView');\n   * // Returns previously configured view\n   * ```\n   *\n   * @see {@link clearAll} for clearing all configurations\n   * @see {@link clearGlobalViews} for clearing only global views\n   *\n  \n   */\n  clearType(messageType: MessageTypeKey): void {\n    // Remove the configuration for the specified message type\n    this.typeViewMap.delete(messageType);\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n\n  /**\n   * Clears all global views.\n   *\n   * This method removes all global view configurations while leaving type-specific\n   * configurations intact. After calling this method, message types without\n   * type-specific configurations will use default rendering.\n   *\n   * This is useful when:\n   * - Removing global customizations while keeping type-specific ones\n   * - Resetting to type-specific-only configuration\n   *\n   * @example\n   * ```typescript\n   * // Clear all global views\n   * this.bubbleConfigService.clearGlobalViews();\n   *\n   * // Type-specific views are still available\n   * const textView = this.bubbleConfigService.getView('text_message', 'contentView');\n   * // Returns type-specific view if configured\n   *\n   * // Global fallback is now null\n   * const audioView = this.bubbleConfigService.getView('audio_message', 'footerView');\n   * // Returns null if no type-specific view was set\n   * ```\n   *\n   * @see {@link clearAll} for clearing all configurations\n   * @see {@link clearType} for clearing a specific message type\n   *\n  \n   */\n  clearGlobalViews(): void {\n    // Reset global views to empty object\n    this.globalViewMap = {};\n    this.configVersion.update(v => v + 1);\n    this.configChanged$.next();\n  }\n}\n","import { CometChatTextFormatter } from './cometchat-text-formatter';\n\n/**\n * Formatter for URLs in text.\n *\n * Detects URL patterns (http://, https://, www.) in text and converts them\n * to clickable links. URLs are opened in a new tab with security attributes.\n *\n * @example\n * ```typescript\n * const formatter = new CometChatUrlFormatter();\n *\n * // Format text with URLs\n * const formatted = formatter.format('Check out https://example.com for more info');\n *\n * // Get detected URLs\n * const urls = formatter.getUrls();\n * // ['https://example.com']\n * ```\n *\n * @see Requirements 23.1-23.5\n */\nexport class CometChatUrlFormatter extends CometChatTextFormatter {\n  /**\n   * Unique identifier for this formatter.\n   * @see Requirements 5.1\n   */\n  readonly id = 'url-formatter';\n\n  /**\n   * Formatter priority (lower = earlier in pipeline).\n   * URLs are processed with priority 10 (before mentions).\n   * @see Requirements 5.5\n   */\n  override priority = 10;\n\n  /**\n   * Array of detected URLs from the last format() call\n   * @private\n   */\n  private urls: string[] = [];\n\n  /**\n   * Get the regex pattern for detecting URLs.\n   *\n   * Matches:\n   * - http:// or https:// followed by non-whitespace characters\n   * - www. followed by non-whitespace characters\n   *\n   * The pattern uses the global and case-insensitive flags.\n   *\n   * @returns RegExp pattern for URL detection\n   */\n  getRegex(): RegExp {\n    return /(https?:\\/\\/[^\\s]+)|(www\\.[^\\s]+)/gi;\n  }\n\n  /**\n   * Format the input text by detecting URLs and converting them to links.\n   *\n   * This method:\n   * 1. Stores the original text\n   * 2. Detects all URL patterns\n   * 3. Converts URLs to clickable anchor tags\n   * 4. Stores detected URLs in metadata\n   * 5. Returns formatted text with clickable links\n   *\n   * Links are created with:\n   * - target=\"_blank\" to open in new tab\n   * - rel=\"noopener noreferrer\" for security\n   * - class=\"cometchat-link\" for styling\n   *\n   * @param text - The text to format\n   * @returns The formatted text with clickable links\n   */\n  format(text: string): string {\n    if (text == null) {\n      this.originalText = '';\n      this.formattedText = '';\n      this.urls = [];\n      this.metadata = { urls: this.urls };\n      return '';\n    }\n\n    this.originalText = text;\n    this.urls = [];\n\n    // Protect markdown links [text](url) from being double-processed.\n    // Replace them with placeholders, process bare URLs, then restore.\n    const markdownLinkRegex = /\\[([^\\]]+)\\]\\(([^\\)]+)\\)/g;\n    const placeholders: string[] = [];\n    let protectedText = text.replace(markdownLinkRegex, match => {\n      const idx = placeholders.length;\n      placeholders.push(match);\n      return `\\x00MDLINK${idx}\\x00`;\n    });\n\n    // Also protect URLs already wrapped in <a> tags (from previous formatters)\n    const existingLinkRegex = /<a\\s[^>]*href=\"[^\"]*\"[^>]*>[^<]*<\\/a>/gi;\n    protectedText = protectedText.replace(existingLinkRegex, match => {\n      const idx = placeholders.length;\n      placeholders.push(match);\n      return `\\x00MDLINK${idx}\\x00`;\n    });\n\n    // Now process bare URLs in the remaining text\n    this.formattedText = protectedText.replace(this.getRegex(), match => {\n      // Clean trailing punctuation that's likely not part of the URL\n      const cleaned = match.replace(/[).,;:!?]+$/, '');\n      const trailing = match.slice(cleaned.length);\n\n      this.urls.push(cleaned);\n\n      const href = cleaned.startsWith('www.') ? `https://${cleaned}` : cleaned;\n      return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"cometchat-link\">${cleaned}</a>${trailing}`;\n    });\n\n    // Restore markdown link placeholders\n    this.formattedText = this.formattedText.replace(/\\x00MDLINK(\\d+)\\x00/g, (_, idx) => {\n      return placeholders[parseInt(idx, 10)];\n    });\n\n    this.metadata = { urls: this.urls };\n    return this.formattedText;\n  }\n\n  /**\n   * Get the array of detected URLs from the last format() call.\n   *\n   * @returns Array of URL strings detected in the text\n   */\n  getUrls(): string[] {\n    return [...this.urls];\n  }\n\n  /**\n   * Check if the text contains any URLs.\n   *\n   * @returns true if URLs were detected, false otherwise\n   */\n  hasUrls(): boolean {\n    return this.urls.length > 0;\n  }\n\n  /**\n   * Reset the formatter state to initial values.\n   *\n   * Clears original text, formatted text, metadata, and detected URLs.\n   */\n  override reset(): void {\n    super.reset();\n    this.urls = [];\n  }\n}\n","import { CometChatTextFormatter } from './cometchat-text-formatter';\n\n/**\n * CometChatMarkdownFormatter\n *\n * Formats markdown syntax in text messages to HTML.\n * Supports bold, italic, underline, strikethrough, inline code, code blocks,\n * blockquotes, ordered lists, unordered lists, and links.\n *\n * Markdown Syntax Supported:\n * - **bold** → <strong>bold</strong>\n * - *italic* → <em>italic</em>\n * - __underline__ → <u>underline</u>\n * - ~~strikethrough~~ → <s>strikethrough</s>\n * - `code` → <code>code</code>\n * - ```code block``` → <pre><code>code block</code></pre>\n * - > quote → <blockquote>quote</blockquote>\n * - 1. item → <ol><li>item</li></ol>\n * - - item or * item → <ul><li>item</li></ul>\n * - [text](url) → <a href=\"url\">text</a>\n *\n * @see Requirements 2.1, 2.3, 2.4\n */\nexport class CometChatMarkdownFormatter extends CometChatTextFormatter {\n  readonly id = 'markdown-formatter';\n  override priority = 30; // Run after mentions (20) but before URLs (40)\n\n  /**\n   * Get the regex pattern for markdown detection.\n   * This is a simple pattern that matches common markdown syntax.\n   * @returns RegExp pattern\n   */\n  override getRegex(): RegExp {\n    // Match any markdown syntax including blockquotes, lists (with indentation), inline formatting, and links\n    // Use multiline flag to match patterns at start of any line\n    // Match both raw > and HTML-escaped &gt; for blockquotes (text is HTML-escaped before formatters run)\n    // (?<!\\*)\\*(?!\\*|\\s) detects single * for italic (not ** for bold, not * followed by space for lists)\n    // (?<!_)_(?!_|\\s) detects single _ for italic (not __ for underline)\n    return /(\\*\\*|__|~~|`|(?<!\\*)\\*(?!\\*|\\s)|(?<!_)_(?!_|\\s)|^>\\s.+|^&gt;\\s.+|^ *[-*]\\s|^ *\\d+\\.\\s|\\[.*?\\]\\(.*?\\))/m;\n  }\n\n  /**\n   * Format markdown text to HTML\n   * @param text - The text to format\n   * @returns Formatted HTML text\n   */\n  override format(text: string): string {\n    if (text == null) {\n      this.originalText = '';\n      this.formattedText = '';\n      return '';\n    }\n\n    this.originalText = text;\n    this.formattedText = this.markdownToHtml(text);\n    return this.formattedText;\n  }\n\n  /**\n   * Convert markdown to HTML\n   * @param markdown - Markdown text\n   * @returns HTML text\n   * @private\n   */\n  private markdownToHtml(markdown: string): string {\n    let html = markdown;\n\n    // Code blocks (must be processed first to avoid conflicts)\n    html = html.replace(/```([\\s\\S]*?)```/g, (_match, code: string) => {\n      const trimmedCode = code.replace(/^\\n/, '').replace(/\\n$/, '');\n      return `<pre class=\"cometchat-rich-text__code-block\"><code class=\"cometchat-rich-text__code\">${trimmedCode}</code></pre>`;\n    });\n\n    // Blockquotes (process before other inline formatting)\n    // Group consecutive lines starting with > into a single blockquote\n    html = this.formatBlockquotes(html);\n\n    // Bold: **text** (must be processed before italic to avoid conflicts)\n    html = html.replace(/\\*\\*([^\\*]+?)\\*\\*/g, '<strong>$1</strong>');\n\n    // Strikethrough: ~~text~~ (process before other formatting)\n    html = html.replace(/~~([^~]+?)~~/g, '<s>$1</s>');\n\n    // Underline: __text__\n    html = html.replace(/__([^_]+?)__/g, '<u>$1</u>');\n\n    // Italic: *text* (single asterisk, not preceded or followed by another asterisk)\n    // Use negative lookbehind and lookahead to avoid matching ** from bold\n    html = html.replace(/(?<!\\*)\\*([^\\*\\n]+?)\\*(?!\\*)/g, '<em>$1</em>');\n\n    // Italic: _text_ (single underscore, not preceded or followed by another underscore)\n    // Use negative lookbehind and lookahead to avoid matching __ from underline\n    html = html.replace(/(?<!_)_([^_\\n]+?)_(?!_)/g, '<em>$1</em>');\n\n    // Inline code: `code` (but not inside code blocks)\n    html = html.replace(/`([^`]+?)`/g, '<code class=\"cometchat-rich-text__code\">$1</code>');\n\n    // Links: [text](url)\n    html = html.replace(\n      /\\[([^\\]]+)\\]\\(([^\\)]+)\\)/g,\n      '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n    );\n\n    // Ordered lists: 1. item\n    html = this.formatOrderedLists(html);\n\n    // Unordered lists: - item or * item\n    html = this.formatUnorderedLists(html);\n\n    return html;\n  }\n\n  /**\n   * Format blockquotes - group consecutive lines starting with > into a single blockquote\n   * @param text - Text with markdown blockquotes\n   * @returns Text with HTML blockquotes\n   * @private\n   */\n  private formatBlockquotes(text: string): string {\n    const lines = text.split('\\n');\n    const result: string[] = [];\n    let inBlockquote = false;\n    const blockquoteLines: string[] = [];\n    const rawBlockquoteLines: string[] = [];\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      // Match lines starting with > or &gt; (HTML-escaped) followed by optional space and content\n      // Allow both \"> text\" and \">text\" formats, and their escaped equivalents\n      // Text is HTML-escaped by escapeUserHtml() before formatters run, so > becomes &gt;\n      const match = line.match(/^(?:>|&gt;)\\s*(.*)$/);\n\n      if (match) {\n        // This line is part of a blockquote\n        if (!inBlockquote) {\n          inBlockquote = true;\n        }\n        rawBlockquoteLines.push(line);\n        // Only add non-empty content\n        const content = match[1].trim();\n        if (content) {\n          blockquoteLines.push(content);\n        }\n      } else {\n        // Not a blockquote line\n        if (inBlockquote) {\n          // Close the previous blockquote\n          if (blockquoteLines.length > 0) {\n            result.push(`<blockquote class=\"cometchat-rich-text__blockquote\">${blockquoteLines.join('<br>')}</blockquote>`);\n          } else {\n            // No content after > — output original lines as-is (not a blockquote)\n            result.push(...rawBlockquoteLines);\n          }\n          blockquoteLines.length = 0;\n          rawBlockquoteLines.length = 0;\n          inBlockquote = false;\n        }\n        result.push(line);\n      }\n    }\n\n    // Close any remaining blockquote\n    if (inBlockquote) {\n      if (blockquoteLines.length > 0) {\n        result.push(`<blockquote class=\"cometchat-rich-text__blockquote\">${blockquoteLines.join('<br>')}</blockquote>`);\n      } else {\n        // No content after > — output original lines as-is (not a blockquote)\n        result.push(...rawBlockquoteLines);\n      }\n    }\n\n    return result.join('\\n');\n  }\n\n  /**\n   * Format ordered lists with nested indentation support.\n   * Indentation is 4 spaces per nesting level.\n   * Nested ordered lists cycle: decimal → lower-alpha → lower-roman.\n   * @param text - Text with markdown lists\n   * @returns Text with HTML lists\n   * @private\n   */\n  private formatOrderedLists(text: string): string {\n    const lines = text.split('\\n');\n    const result: string[] = [];\n    let currentDepth = -1; // -1 means not in a list\n\n    const olStyles = ['decimal', 'lower-alpha', 'lower-roman'];\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      // Match indented ordered list items: optional leading spaces + number + dot + space + content\n      const match = line.match(/^( *)(\\d+)\\.\\s+(.+)$/);\n\n      if (match) {\n        const indent = match[1].length;\n        const content = match[3];\n        const depth = Math.floor(indent / 4); // 4 spaces per level\n\n        if (currentDepth === -1) {\n          // Starting a new list\n          result.push(`<ol style=\"list-style-type: ${olStyles[0]}\">`);\n          currentDepth = 0;\n        }\n\n        // Open nested lists to reach the target depth\n        while (currentDepth < depth) {\n          currentDepth++;\n          const style = olStyles[currentDepth % olStyles.length];\n          result.push(`<ol style=\"list-style-type: ${style}\">`);\n        }\n\n        // Close nested lists to come back up\n        while (currentDepth > depth) {\n          result.push('</ol>');\n          currentDepth--;\n        }\n\n        result.push(`<li>${content}</li>`);\n      } else {\n        // Not a list item — close all open lists\n        while (currentDepth >= 0) {\n          result.push('</ol>');\n          currentDepth--;\n        }\n        result.push(line);\n      }\n    }\n\n    // Close any remaining open lists\n    while (currentDepth >= 0) {\n      result.push('</ol>');\n      currentDepth--;\n    }\n\n    return result.join('\\n');\n  }\n\n  /**\n   * Format unordered lists with nested indentation support.\n   * Indentation is 4 spaces per nesting level.\n   * Nested unordered lists cycle: disc → circle → square.\n   * @param text - Text with markdown lists\n   * @returns Text with HTML lists\n   * @private\n   */\n  private formatUnorderedLists(text: string): string {\n    const lines = text.split('\\n');\n    const result: string[] = [];\n    let currentDepth = -1; // -1 means not in a list\n\n    const ulStyles = ['disc', 'circle', 'square'];\n\n    for (let i = 0; i < lines.length; i++) {\n      const line = lines[i];\n      // Match indented unordered list items: optional leading spaces + dash/asterisk + space + content\n      const match = line.match(/^( *)[-*]\\s+(.+)$/);\n\n      if (match) {\n        const indent = match[1].length;\n        const content = match[2];\n        const depth = Math.floor(indent / 4); // 4 spaces per level\n\n        if (currentDepth === -1) {\n          // Starting a new list\n          result.push(`<ul style=\"list-style-type: ${ulStyles[0]}\">`);\n          currentDepth = 0;\n        }\n\n        // Open nested lists to reach the target depth\n        while (currentDepth < depth) {\n          currentDepth++;\n          const style = ulStyles[currentDepth % ulStyles.length];\n          result.push(`<ul style=\"list-style-type: ${style}\">`);\n        }\n\n        // Close nested lists to come back up\n        while (currentDepth > depth) {\n          result.push('</ul>');\n          currentDepth--;\n        }\n\n        result.push(`<li>${content}</li>`);\n      } else {\n        // Not a list item — close all open lists\n        while (currentDepth >= 0) {\n          result.push('</ul>');\n          currentDepth--;\n        }\n        result.push(line);\n      }\n    }\n\n    // Close any remaining open lists\n    while (currentDepth >= 0) {\n      result.push('</ul>');\n      currentDepth--;\n    }\n\n    return result.join('\\n');\n  }\n\n  /**\n   * Check if this formatter should process the given text\n   * @param text - The text to check\n   * @returns Whether to apply this formatter\n   */\n  override shouldFormat(text: string): boolean {\n    // Only format if text contains markdown syntax\n    const regex = this.getRegex();\n    const result = regex.test(text);\n    return result;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatTextFormatter } from '../formatters/cometchat-text-formatter';\nimport { CometChatMentionsFormatter } from '../formatters/cometchat-mentions-formatter';\nimport { CometChatUrlFormatter } from '../formatters/cometchat-url-formatter';\nimport { CometChatMarkdownFormatter } from '../formatters/cometchat-markdown-formatter';\nimport { MessageBubbleAlignment } from '../Enums/Enums';\n\n/**\n * FormatterConfigService manages default text formatters (mentions, markdown, URLs).\n * Singleton by default. Supports custom formatters, additional formatters, and context configuration.\n * @Injectable providedIn: 'root'\n * @see Requirements 11.1-11.6\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class FormatterConfigService {\n  private defaultMentionsFormatter: CometChatMentionsFormatter | null = null;\n  private defaultMarkdownFormatter: CometChatMarkdownFormatter | null = null;\n  private defaultUrlFormatter: CometChatUrlFormatter | null = null;\n  private customFormatters: CometChatTextFormatter[] | null = null;\n  private additionalFormatters: CometChatTextFormatter[] = [];\n\n  constructor() {}\n\n  /** Get the default text formatters. @see Requirements 11.1-11.3, 11.6 */\n  getDefaultFormatters(): CometChatTextFormatter[] {\n    // If custom formatters are set, return them\n    if (this.customFormatters !== null) {\n      return [...this.customFormatters];\n    }\n\n    // Otherwise, return built-in defaults + additional formatters\n    const defaults = this.getBuiltInDefaults();\n    return [...defaults, ...this.additionalFormatters];\n  }\n\n  /**\n   * Set custom formatters to replace the defaults.\n   *\n   * This method replaces the built-in default formatters (mentions + URLs)\n   * with the provided custom formatters. The custom formatters will be used\n   * by all components that call getDefaultFormatters().\n   *\n   * To reset to built-in defaults, call resetToDefaults().\n   *\n   * @param formatters - Array of custom formatters to use as defaults\n   * @see Requirements 11.4\n   *\n   * @example\n   * ```typescript\n   * // Replace defaults with custom formatters\n   * const customFormatters = [\n   *   new MyCustomMentionsFormatter(),\n   *   new MyCustomUrlFormatter(),\n   *   new HashtagFormatter()\n   * ];\n   * this.formatterConfig.setDefaultFormatters(customFormatters);\n   * ```\n   */\n  setDefaultFormatters(formatters: CometChatTextFormatter[]): void {\n    this.customFormatters = formatters ? [...formatters] : [];\n  }\n\n  /** Add additional formatters to the default set. @see Requirements 11.5 */\n  addFormatters(formatters: CometChatTextFormatter[]): void {\n    if (!formatters) return;\n    this.additionalFormatters.push(...formatters);\n  }\n\n  /** Reset to built-in default formatters. @see Requirements 11.6 */\n  resetToDefaults(): void {\n    this.customFormatters = null;\n    this.additionalFormatters = [];\n  }\n\n  /** Get formatters configured with logged-in user and alignment context. @see Requirements 11.2, 11.3 */\n  getFormattersWithContext(loggedInUser?: CometChat.User, alignment?: MessageBubbleAlignment): CometChatTextFormatter[] {\n    const formatters = this.getDefaultFormatters();\n\n    return formatters.map(formatter => {\n      if (formatter instanceof CometChatMentionsFormatter) {\n        const cloned = new CometChatMentionsFormatter();\n        if (loggedInUser) cloned.setLoggedInUser(loggedInUser);\n        cloned.setMessageBubbleAlignment(alignment !== undefined ? alignment : undefined);\n        return cloned;\n      }\n      return formatter;\n    });\n  }\n\n  private getBuiltInDefaults(): CometChatTextFormatter[] {\n    if (!this.defaultMentionsFormatter) this.defaultMentionsFormatter = new CometChatMentionsFormatter();\n    if (!this.defaultMarkdownFormatter) this.defaultMarkdownFormatter = new CometChatMarkdownFormatter();\n    if (!this.defaultUrlFormatter) this.defaultUrlFormatter = new CometChatUrlFormatter();\n    return [this.defaultMentionsFormatter, this.defaultMarkdownFormatter, this.defaultUrlFormatter];\n  }\n}\n","import { Injectable } from '@angular/core';\nimport DOMPurify, { Config as DOMPurifyConfig } from 'dompurify';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * HtmlSanitizerService\n *\n * Centralized HTML sanitization service using DOMPurify.\n * Allows only safe HTML tags/attributes, prevents XSS attacks.\n * Caches up to 1000 sanitized strings (LRU eviction).\n * Ensures links have target=\"_blank\" and rel=\"noopener noreferrer\".\n *\n * @Injectable providedIn: 'root'\n * @see Requirements 13.1-13.6\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class HtmlSanitizerService {\n  private sanitizationCache = new Map<string, string>();\n  private readonly MAX_CACHE_SIZE = 1000;\n  private readonly DEFAULT_CONFIG: DOMPurifyConfig = {\n    // Allowed HTML tags\n    ALLOWED_TAGS: [\n      'span',\n      'strong',\n      'em',\n      'u',\n      's',\n      'code',\n      'pre',\n      'blockquote',\n      'ul',\n      'ol',\n      'li',\n      'a',\n      'br',\n      'p',\n    ],\n\n    // Allowed attributes\n    ALLOWED_ATTR: ['class', 'style', 'data-uid', 'data-mention-type', 'data-self', 'href', 'target', 'rel'],\n\n    // Do not allow data-* attributes by default (only explicitly listed ones)\n    ALLOW_DATA_ATTR: false,\n\n    // Keep content of removed tags (don't delete text inside disallowed tags)\n    KEEP_CONTENT: true,\n\n    // Add target=\"_blank\" and rel=\"noopener noreferrer\" to all links\n    ADD_ATTR: ['target', 'rel'],\n  };\n\n  constructor() {\n    this.configureDOMPurifyHooks();\n  }\n\n  /** Sanitize HTML with default configuration. Results are cached. @see Requirements 13.1-13.6 */\n  sanitize(html: string): string {\n    if (!html || html.trim() === '') return '';\n\n    const cached = this.sanitizationCache.get(html);\n    if (cached !== undefined) return cached;\n\n    try {\n      const sanitized = DOMPurify.sanitize(html, this.DEFAULT_CONFIG) as string;\n      this.cacheResult(html, sanitized);\n      return sanitized;\n    } catch (error) {\n      CometChatLogger.error('HtmlSanitizerService', 'Sanitization failed:', error);\n      return '';\n    }\n  }\n\n  /** Sanitize HTML with custom configuration. Results are NOT cached. @see Requirements 13.1 */\n  sanitizeWithConfig(html: string, config: DOMPurifyConfig): string {\n    if (!html || html.trim() === '') return '';\n\n    try {\n      return DOMPurify.sanitize(html, config) as string;\n    } catch (error) {\n      CometChatLogger.error('HtmlSanitizerService', 'Sanitization with custom config failed:', error);\n      return '';\n    }\n  }\n\n\n  getDefaultConfig(): DOMPurifyConfig {\n    return {\n      ...this.DEFAULT_CONFIG,\n      ALLOWED_TAGS: Array.isArray(this.DEFAULT_CONFIG.ALLOWED_TAGS) ? [...this.DEFAULT_CONFIG.ALLOWED_TAGS] : this.DEFAULT_CONFIG.ALLOWED_TAGS,\n      ALLOWED_ATTR: Array.isArray(this.DEFAULT_CONFIG.ALLOWED_ATTR) ? [...this.DEFAULT_CONFIG.ALLOWED_ATTR] : this.DEFAULT_CONFIG.ALLOWED_ATTR,\n      ADD_ATTR: Array.isArray(this.DEFAULT_CONFIG.ADD_ATTR) ? [...this.DEFAULT_CONFIG.ADD_ATTR] : this.DEFAULT_CONFIG.ADD_ATTR,\n    };\n  }\n\n  /**\n   * Escape HTML entities in raw user text before formatter processing.\n   * Preserves SDK mention patterns (`<@uid:...>` and `<@all:...>`).\n   */\n  escapeUserHtml(text: string): string {\n    if (!text) return text;\n\n    const sdkMentionRegex = /<@(uid|all):[^>]*>/g;\n    const placeholders: string[] = [];\n    let escaped = text.replace(sdkMentionRegex, match => {\n      const idx = placeholders.length;\n      placeholders.push(match);\n      return `\\x00SDKMENTION${idx}\\x00`;\n    });\n\n    escaped = escaped\n      .replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;')\n      .replace(/'/g, '&#39;');\n\n    return escaped.replace(/\\x00SDKMENTION(\\d+)\\x00/g, (_, idx) => placeholders[parseInt(idx, 10)]);\n  }\n\n  private cacheResult(original: string, sanitized: string): void {\n    if (this.sanitizationCache.size >= this.MAX_CACHE_SIZE) {\n      const firstKey = this.sanitizationCache.keys().next().value;\n      if (firstKey !== undefined) this.sanitizationCache.delete(firstKey);\n    }\n    this.sanitizationCache.set(original, sanitized);\n  }\n\n  /** Configure DOMPurify hooks for link security. @see Requirements 13.6 */\n  private configureDOMPurifyHooks(): void {\n    DOMPurify.addHook('afterSanitizeAttributes', (node: Element) => {\n      if (node.tagName === 'A') {\n        if (!node.hasAttribute('target')) node.setAttribute('target', '_blank');\n        const rel = node.getAttribute('rel');\n        if (!rel || !rel.includes('noopener') || !rel.includes('noreferrer')) {\n          node.setAttribute('rel', 'noopener noreferrer');\n        }\n      }\n    });\n  }\n}\n","import { DestroyRef, TemplateRef } from '@angular/core';\nimport { Subject, Subscription } from 'rxjs';\nimport { MouseEventSource, PanelAlignment } from '../Enums/Enums';\nimport { ComposerId } from '../Enums/Enums';\nimport { subscribeWithOptionalCleanup } from './event-utils';\n\n/**\n * UI event subjects for handling various UI-related actions (e.g., showing panels, modals, dialogs, etc.)\n */\nexport class CometChatUIEvents {\n  static ccHidePanel: Subject<PanelAlignment | void> = new Subject<PanelAlignment | void>();\n  static ccShowPanel: Subject<IPanel> = new Subject<IPanel>();\n  static ccShowModal: Subject<IModal> = new Subject<IModal>();\n  static ccHideModal: Subject<void> = new Subject<void>();\n  static ccShowDialog: Subject<IDialog> = new Subject<IDialog>();\n  static ccHideDialog: Subject<void> = new Subject<void>();\n  static ccActiveChatChanged: Subject<IActiveChatChanged> = new Subject<IActiveChatChanged>();\n  static ccShowOngoingCall: Subject<IShowOngoingCall> = new Subject<IShowOngoingCall>();\n  static ccOpenChat: Subject<IOpenChat> = new Subject<IOpenChat>();\n  static ccComposeMessage: Subject<string> = new Subject<string>();\n  static ccMouseEvent: Subject<IMouseEvent> = new Subject<IMouseEvent>();\n  static ccShowMentionsCountWarning: Subject<IMentionsCountWarning> =\n    new Subject<IMentionsCountWarning>();\n  static ccActivePopover: Subject<string> = new Subject<string>();\n\n  // ── Typed Publish Methods ──\n\n  static publishShowPanel(panel: IPanel): void {\n    CometChatUIEvents.ccShowPanel.next(panel);\n  }\n\n  static publishHidePanel(alignment?: PanelAlignment): void {\n    CometChatUIEvents.ccHidePanel.next(alignment);\n  }\n\n  static publishShowModal(modal: IModal): void {\n    CometChatUIEvents.ccShowModal.next(modal);\n  }\n\n  static publishHideModal(): void {\n    CometChatUIEvents.ccHideModal.next();\n  }\n\n  static publishShowDialog(dialog: IDialog): void {\n    CometChatUIEvents.ccShowDialog.next(dialog);\n  }\n\n  static publishHideDialog(): void {\n    CometChatUIEvents.ccHideDialog.next();\n  }\n\n  static publishActiveChatChanged(data: IActiveChatChanged): void {\n    CometChatUIEvents.ccActiveChatChanged.next(data);\n  }\n\n  static publishShowOngoingCall(data: IShowOngoingCall): void {\n    CometChatUIEvents.ccShowOngoingCall.next(data);\n  }\n\n  static publishOpenChat(data: IOpenChat): void {\n    CometChatUIEvents.ccOpenChat.next(data);\n  }\n\n  static publishComposeMessage(text: string): void {\n    CometChatUIEvents.ccComposeMessage.next(text);\n  }\n\n  static publishMouseEvent(data: IMouseEvent): void {\n    CometChatUIEvents.ccMouseEvent.next(data);\n  }\n\n  static publishShowMentionsCountWarning(data: IMentionsCountWarning): void {\n    CometChatUIEvents.ccShowMentionsCountWarning.next(data);\n  }\n\n  static publishActivePopover(id: string): void {\n    CometChatUIEvents.ccActivePopover.next(id);\n  }\n\n  // ── Typed Subscribe Helpers ──\n\n  static onShowPanel(cb: (panel: IPanel) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccShowPanel, cb, destroyRef);\n  }\n\n  static onHidePanel(\n    cb: (alignment: PanelAlignment | void) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccHidePanel, cb, destroyRef);\n  }\n\n  static onShowModal(cb: (modal: IModal) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccShowModal, cb, destroyRef);\n  }\n\n  static onHideModal(cb: () => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccHideModal, cb, destroyRef);\n  }\n\n  static onShowDialog(cb: (dialog: IDialog) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccShowDialog, cb, destroyRef);\n  }\n\n  static onHideDialog(cb: () => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccHideDialog, cb, destroyRef);\n  }\n\n  static onActiveChatChanged(\n    cb: (data: IActiveChatChanged) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccActiveChatChanged, cb, destroyRef);\n  }\n\n  static onShowOngoingCall(\n    cb: (data: IShowOngoingCall) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccShowOngoingCall, cb, destroyRef);\n  }\n\n  static onOpenChat(cb: (data: IOpenChat) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccOpenChat, cb, destroyRef);\n  }\n\n  static onComposeMessage(cb: (text: string) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccComposeMessage, cb, destroyRef);\n  }\n\n  static onMouseEvent(cb: (data: IMouseEvent) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccMouseEvent, cb, destroyRef);\n  }\n\n  static onShowMentionsCountWarning(\n    cb: (data: IMentionsCountWarning) => void,\n    destroyRef?: DestroyRef\n  ): Subscription {\n    return subscribeWithOptionalCleanup(\n      CometChatUIEvents.ccShowMentionsCountWarning,\n      cb,\n      destroyRef\n    );\n  }\n\n  static onActivePopover(cb: (id: string) => void, destroyRef?: DestroyRef): Subscription {\n    return subscribeWithOptionalCleanup(CometChatUIEvents.ccActivePopover, cb, destroyRef);\n  }\n}\n\n/**\n * Interface for ui-related events\n */\nexport interface IOpenChat {\n  user?: CometChat.User;\n  group?: CometChat.Group;\n}\nexport interface IShowOngoingCall {\n  child: TemplateRef<unknown> | CometChat.Call | CometChat.Group | null;\n  message?: CometChat.CustomMessage;\n}\nexport interface IPanel {\n  child?: TemplateRef<unknown>;\n  configuration?: Record<string, unknown>;\n  message?: CometChat.BaseMessage;\n  position?: PanelAlignment;\n  composerId?: ComposerId;\n}\nexport interface IModal {\n  child?: TemplateRef<unknown>;\n  composerId?: ComposerId;\n}\nexport interface IActiveChatChanged {\n  user?: CometChat.User;\n  group?: CometChat.Group;\n  message?: CometChat.BaseMessage;\n  unreadMessageCount?: number;\n}\nexport interface IDialog {\n  child: TemplateRef<unknown>;\n  confirmCallback: () => void;\n}\n\nexport interface IMouseEvent {\n  event: Event;\n\n  source: MouseEventSource;\n  body?: Record<string, unknown>;\n}\n\nexport interface IMentionsCountWarning {\n  showWarning: boolean;\n  id?: string;\n}\n","import { Injectable, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSoundManager } from '../resources/CometChatSoundManager/CometChatSoundManager';\nimport { CometChatCallEvents } from '../events/CometChatCallEvents';\nimport { CometChatUIEvents } from '../events/CometChatUIEvents';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * IncomingCallService\n *\n * Injectable service managing incoming call state, sound playback,\n * CometChat call listener registration, and active call tracking.\n *\n * ## Overview\n *\n * This service provides a single source of truth for incoming call state.\n * It registers a CometChat CallListener to receive real-time call events,\n * manages sound playback for incoming calls, and tracks active calls to\n * auto-reject with \"busy\" when the user is already on a call.\n *\n * ## Architecture\n *\n * - **Signals**: Provide synchronous, fine-grained reactivity for call state\n * - **CallListener**: Receives real-time call events from CometChat SDK\n * - **CometChatCallEvents**: RxJS subjects for call lifecycle events\n * - **CometChatSoundManager**: Static class for sound playback\n *\n * ## Usage\n *\n * ```typescript\n * export class MyComponent {\n *   private incomingCallService = inject(IncomingCallService);\n *\n *   currentCall = this.incomingCallService.incomingCall;\n *\n *   async accept() {\n *     const call = this.currentCall();\n *     if (call) {\n *       await this.incomingCallService.acceptCall(call.getSessionId());\n *     }\n *   }\n * }\n * ```\n *\n * @Injectable providedIn: 'root'\n\n */\n@Injectable({ providedIn: 'root' })\nexport class IncomingCallService implements OnDestroy {\n  // ==================== State Signals ====================\n\n  /**\n   * The current incoming call.\n   * Set when an incoming call is received via CallListener or programmatically.\n   * Cleared when the call is accepted, declined, cancelled, or ended.\n   */\n  private _incomingCall = signal<CometChat.Call | null>(null);\n  readonly incomingCall = this._incomingCall.asReadonly();\n\n  /**\n   * The currently active call (ongoing or outgoing).\n   * Used to determine if the user is already on a call.\n   * When set, new incoming calls are auto-rejected with \"busy\" status.\n   */\n  private _activeCall = signal<CometChat.Call | null>(null);\n  readonly activeCall = this._activeCall.asReadonly();\n\n  // ==================== Configuration Signals ====================\n\n  /**\n   * When true, incoming call ringtone is not played.\n   */\n  private _disableSoundForCalls = signal<boolean>(false);\n  readonly disableSoundForCalls = this._disableSoundForCalls.asReadonly();\n\n  /**\n   * Custom sound URL for the incoming call ringtone.\n   * When empty, the default ringtone is used.\n   */\n  private _customSoundForCalls = signal<string>('');\n  readonly customSoundForCalls = this._customSoundForCalls.asReadonly();\n\n  // ==================== Private State ====================\n\n  private readonly listenerId = 'incoming_call_listener_' + Date.now();\n  private subscriptions: Subscription[] = [];\n\n  // ==================== Constructor ====================\n\n  constructor() {\n    this.registerCallListener();\n    this.subscribeToCallEvents();\n  }\n\n  // ==================== Public Setters ====================\n\n  /**\n   * Sets the current incoming call.\n   * @param call - The incoming call object, or null to clear\n   */\n  setIncomingCall(call: CometChat.Call | null): void {\n    this._incomingCall.set(call);\n  }\n\n  /**\n   * Sets the active call (ongoing or outgoing).\n   * @param call - The active call object, or null to clear\n   */\n  setActiveCall(call: CometChat.Call | null): void {\n    this._activeCall.set(call);\n  }\n\n  /**\n   * Enables or disables the incoming call ringtone.\n   * @param disable - True to disable sound, false to enable\n   */\n  setDisableSoundForCalls(disable: boolean): void {\n    this._disableSoundForCalls.set(disable);\n  }\n\n  /**\n   * Sets a custom sound URL for the incoming call ringtone.\n   * @param url - The custom sound URL, or empty string for default\n   */\n  setCustomSoundForCalls(url: string): void {\n    this._customSoundForCalls.set(url);\n  }\n\n  // ==================== Sound Management ====================\n\n  /**\n   * Plays the incoming call ringtone (looping).\n   * Respects the disableSoundForCalls and customSoundForCalls configuration.\n   *\n   * @see Requirement 2.1 - Play ringtone when call is set and sound is enabled\n   * @see Requirement 2.2 - Use custom sound URL when configured\n   * @see Requirement 2.3 - Skip playback when sound is disabled\n   */\n  playIncomingSound(): void {\n    if (this._disableSoundForCalls()) {\n      return;\n    }\n    const customUrl = this._customSoundForCalls();\n    CometChatSoundManager.play('incomingCall', customUrl || null);\n  }\n\n  /**\n   * Stops the currently playing incoming call ringtone.\n   *\n   * @see Requirement 2.4 - Pause ringtone on accept, decline, cancel, or destroy\n   */\n  stopIncomingSound(): void {\n    CometChatSoundManager.pause();\n  }\n\n  // ==================== Call Actions ====================\n\n  /**\n   * Accepts an incoming call.\n   *\n   * Calls CometChat.acceptCall() with the session ID, emits ccCallAccepted\n   * via CometChatCallEvents, emits ccShowOngoingCall via CometChatUIEvents,\n   * sets the active call, and clears the incoming call.\n   *\n   * @param sessionId - The call session ID\n   * @returns The accepted call object\n   * @throws CometChat.CometChatException on SDK error\n   *\n   * @see Requirement 3.3 - Default accept behavior\n   * @see Requirement 5.2 - Set active call after accept\n   */\n  async acceptCall(sessionId: string): Promise<CometChat.Call> {\n    try {\n      const call = await CometChat.acceptCall(sessionId);\n\n      CometChatCallEvents.ccCallAccepted.next(call);\n\n      CometChatUIEvents.ccShowOngoingCall.next({\n        child: call,\n      });\n\n      this._activeCall.set(call);\n      this._incomingCall.set(null);\n\n      return call;\n    } catch (error) {\n      CometChatLogger.error('IncomingCallService', 'Error accepting call:', error);\n      throw error;\n    }\n  }\n\n  /**\n   * Declines an incoming call.\n   *\n   * Calls CometChat.rejectCall() with the session ID and \"rejected\" status,\n   * emits ccCallRejected via CometChatCallEvents, and clears the incoming call.\n   *\n   * @param sessionId - The call session ID\n   * @throws CometChat.CometChatException on SDK error\n   *\n   * @see Requirement 4.3 - Default decline behavior\n   */\n  async declineCall(sessionId: string): Promise<void> {\n    try {\n      const call = await CometChat.rejectCall(sessionId, CometChat.CALL_STATUS.REJECTED);\n\n      CometChatCallEvents.ccCallRejected.next(call);\n\n      this._incomingCall.set(null);\n    } catch (error) {\n      CometChatLogger.error('IncomingCallService', 'Error declining call:', error);\n      throw error;\n    }\n  }\n\n  // ==================== Private: Call Listener ====================\n\n  /**\n   * Registers a CometChat CallListener to receive real-time call events.\n   *\n   * @see Requirement 5.1 - Register CallListener on init\n   */\n  private registerCallListener(): void {\n    CometChat.addCallListener(\n      this.listenerId,\n      new CometChat.CallListener({\n        /**\n         * Handle incoming call received.\n         * If no active call, set as incoming and play sound.\n         * If active call exists, auto-reject with \"busy\".\n         *\n         * @see Requirement 5.2 - Set incoming call when no active call\n         * @see Requirement 5.3 - Auto-reject with busy when active call exists\n         */\n        onIncomingCallReceived: (call: CometChat.Call) => {\n          this.handleIncomingCall(call);\n        },\n\n        /**\n         * Handle incoming call cancelled by the caller.\n         * Clear state and pause sound.\n         *\n         * @see Requirement 5.4 - Clear state on cancel\n         */\n        onIncomingCallCancelled: (call: CometChat.Call) => {\n          this.handleIncomingCallCancelled(call);\n        },\n\n        /**\n         * Handle outgoing call accepted by the recipient.\n         * Pause the ringtone.\n         */\n        onOutgoingCallAccepted: (_call: CometChat.Call) => {\n          this.stopIncomingSound();\n        },\n\n        /**\n         * Handle outgoing call rejected by the recipient.\n         * Pause the ringtone.\n         */\n        onOutgoingCallRejected: (_call: CometChat.Call) => {\n          this.stopIncomingSound();\n        },\n      })\n    );\n  }\n\n  /**\n   * Subscribes to CometChatCallEvents for call lifecycle events.\n   *\n   * @see Requirement 5.5 - Clear state on ccCallEnded\n   * @see Requirement 5.6 - Track outgoing call as active\n   */\n  private subscribeToCallEvents(): void {\n    // When a call ends, clear both active and incoming call state\n    this.subscriptions.push(\n      CometChatCallEvents.ccCallEnded.subscribe((_call: CometChat.Call) => {\n        this._activeCall.set(null);\n        this._incomingCall.set(null);\n        this.stopIncomingSound();\n      })\n    );\n\n    // Track outgoing calls as active to prevent incoming calls during outgoing\n    this.subscriptions.push(\n      CometChatCallEvents.ccOutgoingCall.subscribe((call: CometChat.Call) => {\n        this._activeCall.set(call);\n      })\n    );\n\n    // Handle call rejection events — clear both active and incoming state\n    this.subscriptions.push(\n      CometChatCallEvents.ccCallRejected.subscribe((_call: CometChat.Call) => {\n        this._activeCall.set(null);\n        this._incomingCall.set(null);\n        this.stopIncomingSound();\n      })\n    );\n  }\n\n  // ==================== Private: Event Handlers ====================\n\n  /**\n   * Handles an incoming call received via CallListener.\n   *\n   * If no active call exists, sets the incoming call and plays the ringtone.\n   * If an active call exists, auto-rejects the new call with \"busy\" status.\n   *\n   * @param call - The incoming call object\n   */\n  private handleIncomingCall(call: CometChat.Call): void {\n    if (this._activeCall() || this._incomingCall()) {\n      // Already on a call or have a pending incoming call — auto-reject with busy\n      CometChat.rejectCall(call.getSessionId(), CometChat.CALL_STATUS.BUSY).catch(\n        (error: unknown) => {\n          CometChatLogger.error(\n            'IncomingCallService',\n            'Error auto-rejecting call with busy:',\n            error\n          );\n        }\n      );\n      return;\n    }\n\n    this._incomingCall.set(call);\n    this.playIncomingSound();\n  }\n\n  /**\n   * Handles an incoming call cancelled by the caller.\n   * Clears the incoming call state and pauses the ringtone.\n   *\n   * @param call - The cancelled call object\n   */\n  private handleIncomingCallCancelled(call: CometChat.Call): void {\n    const currentIncoming = this._incomingCall();\n    if (currentIncoming && currentIncoming.getSessionId() === call.getSessionId()) {\n      this._incomingCall.set(null);\n      this.stopIncomingSound();\n    }\n  }\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Removes the call listener and unsubscribes from all event subscriptions.\n   *\n   * @see Requirement 5.7 - Cleanup on destroy\n   */\n  ngOnDestroy(): void {\n    CometChat.removeCallListener(this.listenerId);\n\n    for (const sub of this.subscriptions) {\n      sub.unsubscribe();\n    }\n    this.subscriptions = [];\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSoundManager } from '../resources/CometChatSoundManager/CometChatSoundManager';\n\n/**\n * OutgoingCallService\n *\n * Injectable service managing outgoing call state, sound playback,\n * and configuration for the outgoing call UI.\n *\n * ## Overview\n *\n * This service provides a single source of truth for outgoing call state.\n * It manages sound playback for outgoing calls and exposes reactive signals\n * for call state and configuration that any component can consume.\n *\n * ## Architecture\n *\n * - **Signals**: Provide synchronous, fine-grained reactivity for call state\n * - **CometChatSoundManager**: Static class for sound playback\n *\n * ## Usage\n *\n * ```typescript\n * export class MyComponent {\n *   private outgoingCallService = inject(OutgoingCallService);\n *\n *   currentCall = this.outgoingCallService.activeCall;\n *\n *   startCall(call: CometChat.Call) {\n *     this.outgoingCallService.setActiveCall(call);\n *     this.outgoingCallService.playOutgoingSound();\n *   }\n *\n *   cancelCall() {\n *     this.outgoingCallService.stopOutgoingSound();\n *     this.outgoingCallService.setActiveCall(null);\n *   }\n * }\n * ```\n *\n * @Injectable providedIn: 'root'\n\n */\n@Injectable({ providedIn: 'root' })\nexport class OutgoingCallService {\n  // ==================== State Signals ====================\n\n  /**\n   * The current outgoing call.\n   * Set when an outgoing call is initiated.\n   * Cleared when the call is accepted, rejected, cancelled, or ended.\n   *\n   * @see Requirement 5.2 - Expose active call as a signal\n   */\n  private _activeCall = signal<CometChat.Call | null>(null);\n  readonly activeCall = this._activeCall.asReadonly();\n\n  // ==================== Configuration Signals ====================\n\n  /**\n   * When true, outgoing call ringtone is not played.\n   *\n   * @see Requirement 2.3 - Skip playback when sound is disabled\n   */\n  private _disableSoundForCalls = signal<boolean>(false);\n  readonly disableSoundForCalls = this._disableSoundForCalls.asReadonly();\n\n  /**\n   * Custom sound URL for the outgoing call ringtone.\n   * When empty, the default ringtone is used.\n   *\n   * @see Requirement 2.2 - Use custom sound URL when configured\n   */\n  private _customSoundForCalls = signal<string>('');\n  readonly customSoundForCalls = this._customSoundForCalls.asReadonly();\n\n  // ==================== Public Setters ====================\n\n  /**\n   * Sets the current outgoing call.\n   * @param call - The outgoing call object, or null to clear\n   *\n   * @see Requirement 5.2 - Signal reflects active call\n   */\n  setActiveCall(call: CometChat.Call | null): void {\n    this._activeCall.set(call);\n  }\n\n  /**\n   * Enables or disables the outgoing call ringtone.\n   * @param disable - True to disable sound, false to enable\n   *\n   * @see Requirement 2.3 - Disable sound flag\n   */\n  setDisableSoundForCalls(disable: boolean): void {\n    this._disableSoundForCalls.set(disable);\n  }\n\n  /**\n   * Sets a custom sound URL for the outgoing call ringtone.\n   * @param url - The custom sound URL, or empty string for default\n   *\n   * @see Requirement 2.2 - Custom sound URL\n   */\n  setCustomSoundForCalls(url: string): void {\n    this._customSoundForCalls.set(url);\n  }\n\n  // ==================== Sound Management ====================\n\n  /**\n   * Plays the outgoing call ringtone (looping).\n   * Respects the disableSoundForCalls and customSoundForCalls configuration.\n   *\n   * @see Requirement 2.1 - Play ringtone when call is set and sound is enabled\n   * @see Requirement 2.2 - Use custom sound URL when configured\n   * @see Requirement 2.3 - Skip playback when sound is disabled\n   */\n  playOutgoingSound(): void {\n    if (this._disableSoundForCalls()) {\n      return;\n    }\n    const customUrl = this._customSoundForCalls();\n    CometChatSoundManager.play('outgoingCall', customUrl || null);\n  }\n\n  /**\n   * Stops the currently playing outgoing call ringtone.\n   *\n   * @see Requirement 2.4 - Pause ringtone on destroy or call cleared\n   */\n  stopOutgoingSound(): void {\n    CometChatSoundManager.pause();\n  }\n}\n","import { Injectable, OnDestroy, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSoundManager } from '../resources/CometChatSoundManager/CometChatSoundManager';\nimport { CometChatCallEvents } from '../events/CometChatCallEvents';\nimport { CometChatUIEvents } from '../events/CometChatUIEvents';\nimport { CometChatMessageEvents } from '../events/CometChatMessageEvents';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { MessageStatus } from '../Enums/Enums';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * CallButtonsService manages call state, call initiation, call listener registration,\n * event subscriptions, and button disabled state for the call buttons component.\n * @Injectable providedIn: 'root'\n */\n@Injectable({ providedIn: 'root' })\nexport class CallButtonsService implements OnDestroy {\n  private _activeCall = signal<CometChat.Call | null>(null);\n  readonly activeCall = this._activeCall.asReadonly();\n\n  private _sessionId = signal<string>('');\n  readonly sessionId = this._sessionId.asReadonly();\n\n  private _buttonsDisabled = signal<boolean>(false);\n  readonly buttonsDisabled = this._buttonsDisabled.asReadonly();\n\n  private _showOutgoingCallScreen = signal<boolean>(false);\n  readonly showOutgoingCallScreen = this._showOutgoingCallScreen.asReadonly();\n\n  private _showOngoingCall = signal<boolean>(false);\n  readonly showOngoingCall = this._showOngoingCall.asReadonly();\n\n  private _loggedInUser = signal<CometChat.User | null>(null);\n  readonly loggedInUser = this._loggedInUser.asReadonly();\n\n  private _activeUser = signal<CometChat.User | null>(null);\n  readonly activeUser = this._activeUser.asReadonly();\n\n  private _activeGroup = signal<CometChat.Group | null>(null);\n  readonly activeGroup = this._activeGroup.asReadonly();\n\n  private _isGroupAudioCall = signal<boolean>(false);\n  readonly isGroupAudioCall = this._isGroupAudioCall.asReadonly();\n\n  private _isDirectCalling = signal<boolean>(false);\n  readonly isDirectCalling = this._isDirectCalling.asReadonly();\n\n  private readonly listenerId = 'callbuttons_' + Date.now();\n  private subscriptions: Subscription[] = [];\n  private initialized = false;\n\n  /** Initializes the service. Should be called once when the component initializes. @see Requirement 6.1 */\n  initialize(): void {\n    if (this.initialized) return;\n    this.initialized = true;\n\n    CometChat.getLoggedinUser().then(\n      (user: CometChat.User | null) => { this._loggedInUser.set(user); },\n      (error: unknown) => { CometChatLogger.error('CallButtonsService', 'Error fetching logged-in user:', error); }\n    );\n\n    this.registerCallListener();\n    this.subscribeToCallEvents();\n  }\n\n  /** Sets the active user target. Clears active group. @see Requirement 6.3 */\n  setActiveUser(user: CometChat.User | null): void {\n    this._activeUser.set(user);\n    if (user) this._activeGroup.set(null);\n  }\n\n  /** Sets the active group target. Clears active user. @see Requirement 6.3 */\n  setActiveGroup(group: CometChat.Group | null): void {\n    this._activeGroup.set(group);\n    if (group) this._activeUser.set(null);\n  }\n\n  /** Initiates an audio call. @see Requirements 2.1, 3.1 */\n  async initiateAudioCall(): Promise<void> {\n    const user = this._activeUser();\n    const group = this._activeGroup();\n\n    if (user) {\n      this._isDirectCalling.set(false);\n      await this.initiateUserCall(CometChatUIKitConstants.MessageTypes.audio);\n    }\n\n    if (group) {\n      this._isDirectCalling.set(true);\n      this._isGroupAudioCall.set(true);\n      this._sessionId.set(group.getGuid());\n      await this.sendCustomMeetingMessage(CometChatUIKitConstants.MessageTypes.audio);\n      this._showOngoingCall.set(true);\n      CometChatUIEvents.ccShowOngoingCall.next({ child: group });\n    }\n  }\n\n  /** Initiates a video call. @see Requirements 2.2, 3.2 */\n  async initiateVideoCall(): Promise<void> {\n    const user = this._activeUser();\n    const group = this._activeGroup();\n\n    if (user) {\n      this._isDirectCalling.set(false);\n      await this.initiateUserCall(CometChatUIKitConstants.MessageTypes.video);\n    }\n\n    if (group) {\n      this._isDirectCalling.set(true);\n      this._isGroupAudioCall.set(false);\n      this._sessionId.set(group.getGuid());\n      await this.sendCustomMeetingMessage(CometChatUIKitConstants.MessageTypes.video);\n      this._showOngoingCall.set(true);\n      CometChatUIEvents.ccShowOngoingCall.next({ child: group });\n    }\n  }\n\n  /** Cancels the current outgoing user call. @see Requirement 5.2 */\n  async cancelOutgoingCall(): Promise<void> {\n    const call = this._activeCall();\n    if (!call) return;\n\n    CometChatSoundManager.pause();\n\n    try {\n      const sessionId = call.getSessionId();\n      const rejectedCall = await CometChat.rejectCall(sessionId, CometChatUIKitConstants.calls.cancelled);\n      CometChatCallEvents.ccCallRejected.next(rejectedCall);\n    } catch (error) {\n      CometChatLogger.error('CallButtonsService', 'Error cancelling outgoing call:', error);\n    }\n    this.resetCallState();\n  }\n\n  /** Resets all call state to defaults. @see Requirement 4.5 */\n  resetCallState(): void {\n    this._buttonsDisabled.set(false);\n    this._activeCall.set(null);\n    this._sessionId.set('');\n    this._showOutgoingCallScreen.set(false);\n    this._showOngoingCall.set(false);\n    this._isDirectCalling.set(false);\n    this._isGroupAudioCall.set(false);\n  }\n\n  /** Joins an ongoing group meeting from a call bubble message. */\n  joinMeeting(sessionId: string, isAudioOnly?: boolean): void {\n    if (!sessionId) return;\n    this._sessionId.set(sessionId);\n    // Meeting joins are always direct calling (no CometChat.endCall needed)\n    this._isDirectCalling.set(true);\n    this._isGroupAudioCall.set(isAudioOnly ?? false);\n    this._showOngoingCall.set(true);\n    CometChatUIEvents.ccShowOngoingCall.next({\n      child: null,\n    });\n  }\n\n  // ==================== Private Methods ====================\n\n  /**\n   * Initiates a user-to-user call.\n   * Creates a CometChat.Call object, calls CometChat.initiateCall(),\n   * stores the returned call, shows the outgoing call screen, and emits ccOutgoingCall.\n   *\n   * @param type - The call type ('audio' or 'video')\n   * @see Requirement 2.1 - Create call object with audio type\n   * @see Requirement 2.2 - Create call object with video type\n   */\n  private async initiateUserCall(type: string): Promise<void> {\n    const user = this._activeUser();\n    if (!user) {\n      return;\n    }\n\n    const callObj = new CometChat.Call(\n      user.getUid(),\n      type,\n      CometChatUIKitConstants.MessageReceiverType.user\n    );\n\n    const outgoingCall = await CometChat.initiateCall(callObj);\n\n    this._activeCall.set(outgoingCall);\n    this._showOutgoingCallScreen.set(true);\n    CometChatCallEvents.ccOutgoingCall.next(outgoingCall);\n  }\n\n  /**\n   * Sends a custom \"meeting\" message for group calls.\n   * Creates a CustomMessage with meeting type, custom data containing\n   * session ID and call type, metadata with incrementUnreadCount,\n   * and emits ccMessageSent events.\n   *\n   * @param callType - The call type ('audio' or 'video')\n   * @see Requirement 3.1 - Group audio call meeting message\n   * @see Requirement 3.2 - Group video call meeting message\n   * @see Requirement 3.3 - Meeting message structure\n   */\n  private async sendCustomMeetingMessage(callType: string): Promise<void> {\n    const group = this._activeGroup();\n    const loggedInUser = this._loggedInUser();\n    if (!group) {\n      return;\n    }\n\n    const sessionID = this._sessionId();\n    const customData = {\n      sessionID,\n      sessionId: sessionID,\n      callType,\n    };\n\n    const customType = CometChatUIKitConstants.calls.meeting;\n    const conversationId = `group_${sessionID}`;\n\n    const customMessage: CometChat.CustomMessage = new CometChat.CustomMessage(\n      group.getGuid(),\n      CometChatUIKitConstants.MessageReceiverType.group,\n      customType,\n      customData\n    );\n\n    customMessage.setMetadata({ incrementUnreadCount: true });\n    customMessage.shouldUpdateConversation(true);\n    if (loggedInUser) {\n      customMessage.setSender(loggedInUser);\n    }\n    customMessage.setConversationId(conversationId);\n    customMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    customMessage.setMuid(CometChatUIKitUtility.ID());\n\n    CometChatMessageEvents.ccMessageSent.next({\n      message: customMessage,\n      status: MessageStatus.inprogress,\n    });\n\n    try {\n      const sentMessage = await CometChat.sendCustomMessage(customMessage);\n\n      CometChatMessageEvents.ccMessageSent.next({\n        message: sentMessage,\n        status: MessageStatus.success,\n      });\n    } catch (error) {\n      CometChatLogger.error('CallButtonsService', 'Error sending custom meeting message:', error);\n    }\n  }\n\n  // ==================== Private: Call Listener ====================\n\n  /**\n   * Registers a CometChat CallListener to receive real-time call events.\n   *\n   * @see Requirement 6.1 - Register CallListener on init\n   */\n  private registerCallListener(): void {\n    CometChat.addCallListener(\n      this.listenerId,\n      new CometChat.CallListener({\n        /**\n         * Handle incoming call received.\n         * Disable buttons to prevent initiating calls during an incoming call.\n         *\n         * @see Requirement 4.2 - Disable buttons on incoming call\n         */\n        onIncomingCallReceived: (_call: CometChat.Call) => {\n          this._buttonsDisabled.set(true);\n        },\n\n        /**\n         * Handle incoming call cancelled by the caller.\n         * Re-enable buttons.\n         *\n         * @see Requirement 4.4 - Enable buttons on incoming call cancelled\n         */\n        onIncomingCallCancelled: (_call: CometChat.Call) => {\n          this._buttonsDisabled.set(false);\n        },\n\n        /**\n         * Handle outgoing call accepted by the recipient.\n         * If the sender UID matches the logged-in user or the session ID\n         * doesn't match the current call, reset state (ignore the event).\n         * Otherwise, transition to the ongoing call screen.\n         *\n         * @see Requirement 5.3 - Transition to ongoing call on acceptance\n         * @see Requirement 5.5 - Ignore if sender is self or session mismatch\n         */\n        onOutgoingCallAccepted: (call: CometChat.Call) => {\n          const loggedInUser = this._loggedInUser();\n          const currentCall = this._activeCall();\n\n          if (\n            call.getSender()?.getUid() === loggedInUser?.getUid() ||\n            call.getSessionId() !== currentCall?.getSessionId()\n          ) {\n            this.resetCallState();\n            return;\n          }\n\n          // Stop the outgoing call ringtone immediately when call is accepted\n          CometChatSoundManager.pause();\n\n          this._sessionId.set(call.getSessionId());\n          this._showOutgoingCallScreen.set(false);\n          this._buttonsDisabled.set(true);\n          this._showOngoingCall.set(true);\n\n          CometChatUIEvents.ccShowOngoingCall.next({\n            child: call,\n          });\n        },\n\n        /**\n         * Handle outgoing call rejected by the recipient.\n         * Reset all call state.\n         *\n         * @see Requirement 5.4 - Reset state on outgoing call rejected\n         */\n        onOutgoingCallRejected: (_call: CometChat.Call) => {\n          this.resetCallState();\n        },\n      })\n    );\n  }\n\n  // ==================== Private: Event Subscriptions ====================\n\n  /**\n   * Subscribes to CometChatCallEvents for call lifecycle events.\n   *\n   * @see Requirement 4.3 - Enable buttons on ccCallRejected\n   * @see Requirement 4.1 - Disable buttons on ccOutgoingCall\n   * @see Requirement 4.5 - Reset state on ccCallEnded\n   */\n  private subscribeToCallEvents(): void {\n    this.subscriptions.push(\n      CometChatCallEvents.ccCallRejected.subscribe((_call: CometChat.Call) => {\n        this.resetCallState();\n      })\n    );\n\n    this.subscriptions.push(\n      CometChatCallEvents.ccOutgoingCall.subscribe((_call: CometChat.Call) => {\n        this._buttonsDisabled.set(true);\n      })\n    );\n\n    this.subscriptions.push(\n      CometChatCallEvents.ccCallEnded.subscribe((_call: CometChat.Call) => {\n        // Use resetCallState() to ensure all state is properly cleared,\n        // including _isDirectCalling which is needed for workflow switching\n        this.resetCallState();\n      })\n    );\n\n    // Safety reset: when the active chat changes (user navigates to a different\n    // conversation), clear any stale disabled state left over from a previous\n    // call that may not have fired ccCallEnded properly.\n    this.subscriptions.push(\n      CometChatUIEvents.ccActiveChatChanged.subscribe(() => {\n        if (this._buttonsDisabled() && !this._showOngoingCall() && !this._showOutgoingCallScreen()) {\n          this.resetCallState();\n        }\n      })\n    );\n  }\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Removes the call listener and unsubscribes from all event subscriptions.\n   *\n   * @see Requirement 6.2 - Cleanup on destroy\n   */\n  ngOnDestroy(): void {\n    CometChat.removeCallListener(this.listenerId);\n\n    for (const sub of this.subscriptions) {\n      sub.unsubscribe();\n    }\n    this.subscriptions = [];\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CallWorkflow } from '../Enums/Enums';\nimport { CometChatCallEvents } from '../events/CometChatCallEvents';\nimport { CometChatUIKit } from '../cometchat-uikit';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatUIKitCalls } from '../CometChatCalls';\n\n/**\n * OngoingCallService manages ongoing call session state and configuration.\n * Handles session ID, call workflow type, call activity status, and call settings.\n * @Injectable providedIn: 'root'\n */\n@Injectable({ providedIn: 'root' })\nexport class OngoingCallService {\n  private _sessionID = signal<string>('');\n  readonly sessionID = this._sessionID.asReadonly();\n\n  private _callWorkflow = signal<CallWorkflow>(CallWorkflow.defaultCalling);\n  readonly callWorkflow = this._callWorkflow.asReadonly();\n\n  private _isCallActive = signal<boolean>(false);\n  readonly isCallActive = this._isCallActive.asReadonly();\n\n  private _callSettingsBuilder = signal<Record<string, any> | null>(null);\n  readonly callSettingsBuilder = this._callSettingsBuilder.asReadonly();\n\n  private _isAudioOnly = signal<boolean>(false);\n  readonly isAudioOnly = this._isAudioOnly.asReadonly();\n\n  /** Sets the current call session ID. @see Requirement 1.6 */\n  setSessionID(sessionID: string): void { this._sessionID.set(sessionID); }\n\n  /** Sets the call workflow type. @see Requirement 1.6 */\n  setCallWorkflow(workflow: CallWorkflow): void { this._callWorkflow.set(workflow); }\n\n  /** Sets a custom session settings object. @see Requirement 1.6 */\n  setCallSettingsBuilder(builder: Record<string, any> | null): void { this._callSettingsBuilder.set(builder); }\n\n  /** Sets whether the current call is audio-only. */\n  setIsAudioOnly(isAudioOnly: boolean): void { this._isAudioOnly.set(isAudioOnly); }\n\n  /** Builds and returns a v5 SessionSettings plain object. @see Requirements 3.1, 3.2 */\n  getCallSettings(_sessionID: string, _onError?: Function): any {\n    const customSettings = this._callSettingsBuilder();\n    if (customSettings) return customSettings;\n\n    return {\n      sessionType: this._isAudioOnly() ? 'VOICE' : 'VIDEO',\n      layout: 'TILE',\n      startAudioMuted: false,\n      startVideoPaused: false,\n      hideControlPanel: false,\n      hideLeaveSessionButton: false,\n      hideToggleAudioButton: false,\n      hideToggleVideoButton: false,\n      hideRecordingButton: true,\n      hideScreenSharingButton: false,\n      hideChangeLayoutButton: false,\n    };\n  }\n\n  private _eventUnsubscribers: Array<() => void> = [];\n  private _chatCallListenerId = '';\n\n  /** Registers v5 granular event listeners for the current call session. */\n  private registerSessionEventListeners(sessionID: string, onError?: Function): void {\n    const unsubSessionLeft = CometChatUIKitCalls.addEventListener('onSessionLeft', () => {\n      if (this._callWorkflow() === CallWorkflow.defaultCalling) {\n        CometChat.clearActiveCall();\n        CometChatCallEvents.ccCallEnded.next(null as any);\n      }\n      this._isCallActive.set(false);\n      this.removeChatCallListener();\n    });\n\n    const unsubLeaveBtn = CometChatUIKitCalls.addEventListener('onLeaveSessionButtonClicked', () => {\n      if (this._callWorkflow() === CallWorkflow.defaultCalling) {\n        CometChat.endCall(sessionID)\n          .then((call: CometChat.Call) => {\n            CometChatUIKitCalls.leaveSession();\n            CometChatCallEvents.ccCallEnded.next(call);\n            this._isCallActive.set(false);\n            this.removeChatCallListener();\n          })\n          .catch((err: CometChat.CometChatException) => {\n            const exception = this.toCometchatException(err, 'onLeaveSessionButtonClicked');\n            CometChatLogger.error('OngoingCallService', 'onLeaveSessionButtonClicked:', err);\n            if (onError) onError(exception);\n          });\n      } else {\n        CometChatCallEvents.ccCallEnded.next(null as any);\n        CometChatUIKitCalls.leaveSession();\n        this._isCallActive.set(false);\n        this.removeChatCallListener();\n      }\n    });\n\n    // When the other participant leaves a 1:1 default call, end the session for this user too.\n    // For group/direct calls, participants can leave independently without ending the session.\n    const unsubParticipantLeft = CometChatUIKitCalls.addEventListener('onParticipantLeft', (_participant: any) => {\n      if (this._isCallActive() && this._callWorkflow() === CallWorkflow.defaultCalling) {\n        CometChatUIKitCalls.leaveSession();\n        CometChat.clearActiveCall();\n        CometChatCallEvents.ccCallEnded.next(null as any);\n        this._isCallActive.set(false);\n        this.removeChatCallListener();\n        this.removeSessionEventListeners();\n      }\n    });\n\n    // Session timed out due to inactivity\n    const unsubSessionTimedOut = CometChatUIKitCalls.addEventListener('onSessionTimedOut', () => {\n      if (this._isCallActive()) {\n        if (this._callWorkflow() === CallWorkflow.defaultCalling) {\n          CometChat.clearActiveCall();\n        }\n        CometChatCallEvents.ccCallEnded.next(null as any);\n        this._isCallActive.set(false);\n        this.removeChatCallListener();\n      }\n    });\n\n    if (typeof unsubSessionLeft === 'function') this._eventUnsubscribers.push(unsubSessionLeft);\n    if (typeof unsubLeaveBtn === 'function') this._eventUnsubscribers.push(unsubLeaveBtn);\n    if (typeof unsubParticipantLeft === 'function') this._eventUnsubscribers.push(unsubParticipantLeft);\n    if (typeof unsubSessionTimedOut === 'function') this._eventUnsubscribers.push(unsubSessionTimedOut);\n\n    // Also register a Chat SDK CallListener to detect when the remote\n    // user ends the call. Handles 1:1 calls ended via CometChat.endCall().\n    this._chatCallListenerId = 'ongoing_call_' + Date.now();\n    CometChat.addCallListener(\n      this._chatCallListenerId,\n      new CometChat.CallListener({\n        onIncomingCallCancelled: (call: CometChat.Call) => {\n          if (this._isCallActive() && call.getSessionId() === sessionID) {\n            CometChatUIKitCalls.leaveSession();\n            CometChat.clearActiveCall();\n            CometChatCallEvents.ccCallEnded.next(null as any);\n            this._isCallActive.set(false);\n            this.removeChatCallListener();\n            this.removeSessionEventListeners();\n          }\n        },\n        onCallEndedMessageReceived: (call: CometChat.Call) => {\n          if (this._isCallActive() && call.getSessionId() === sessionID) {\n            CometChatUIKitCalls.leaveSession();\n            CometChat.clearActiveCall();\n            CometChatCallEvents.ccCallEnded.next(call);\n            this._isCallActive.set(false);\n            this.removeChatCallListener();\n            this.removeSessionEventListeners();\n          }\n        },\n      })\n    );\n  }\n\n  private removeSessionEventListeners(): void {\n    for (const unsub of this._eventUnsubscribers) {\n      try { unsub(); } catch { /* ignore */ }\n    }\n    this._eventUnsubscribers = [];\n  }\n\n  private removeChatCallListener(): void {\n    if (this._chatCallListenerId) {\n      CometChat.removeCallListener(this._chatCallListenerId);\n      this._chatCallListenerId = '';\n    }\n  }\n\n  /** Starts an ongoing call session. @see Requirements 1.2, 11.1, 11.2 */\n  async startCall(callScreenFrame: HTMLElement, onError?: Function): Promise<void> {\n    try {\n      await CometChatUIKit.callingReady;\n      const sessionID = this._sessionID();\n      this.registerSessionEventListeners(sessionID, onError);\n      const sessionSettings = this.getCallSettings(sessionID, onError);\n      const tokenResponse = await CometChatUIKitCalls.generateToken(sessionID);\n      await CometChatUIKitCalls.joinSession(tokenResponse.token, sessionSettings, callScreenFrame);\n      this._isCallActive.set(true);\n    } catch (error) {\n      this.removeSessionEventListeners();\n      const exception = this.toCometchatException(error, 'startCall');\n      CometChatLogger.error('OngoingCallService', 'startCall:', error);\n      if (onError) onError(exception);\n      throw exception;\n    }\n  }\n\n  /** Ends the current call session (local cleanup only). @see Requirement 1.3 */\n  endSession(): void {\n    CometChatUIKitCalls.leaveSession();\n    this.removeSessionEventListeners();\n    this.removeChatCallListener();\n    this._isCallActive.set(false);\n    this._sessionID.set('');\n  }\n\n  /** Ends the current call and cleans up the session. @see Requirements 1.4, 1.5, 11.3 */\n  async endCall(onError?: Function): Promise<void> {\n    const workflow = this._callWorkflow();\n    const sessionID = this._sessionID();\n\n    if (workflow === CallWorkflow.defaultCalling) {\n      try {\n        const endedCall = await CometChat.endCall(sessionID);\n        this.endSession();\n        CometChatCallEvents.ccCallEnded.next(endedCall as CometChat.Call);\n      } catch (error) {\n        const exception = this.toCometchatException(error, 'endCall');\n        CometChatLogger.error('OngoingCallService', 'endCall:', error);\n        if (onError) onError(exception);\n        throw exception;\n      }\n    } else {\n      CometChatCallEvents.ccCallEnded.next({} as CometChat.Call);\n      this.endSession();\n    }\n  }\n\n  private toCometchatException(error: unknown, context: string): CometChat.CometChatException {\n    if (error instanceof CometChat.CometChatException) return error;\n    if (error instanceof Error) {\n      return new CometChat.CometChatException({ code: 'ONGOING_CALL_ERROR', message: `${context}: ${error.message}`, details: error.stack || '' });\n    }\n    let errorMessage: string;\n    try { errorMessage = String(error); } catch { errorMessage = '[non-stringifiable error]'; }\n    return new CometChat.CometChatException({ code: 'ONGOING_CALL_ERROR', message: `${context}: ${errorMessage}`, details: '' });\n  }\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatOption } from '../modals/CometChatOption';\nimport { getLocalizedString } from '../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\n\n/**\n * Interface for the permission matrix entries.\n * Each entry maps a scope combination to allowed actions.\n */\ntype GroupMemberPermissions = Record<\n  string,\n  {\n    kick: boolean;\n    ban: boolean;\n    unban: boolean;\n    changeScope: string[];\n  }\n>;\n\n/**\n * Permission matrix mapping `loggedInUserScope + targetMemberScope` to allowed actions.\n *\n * Hierarchy: owner > admin > moderator > participant\n * - Owner can act on admin, moderator, participant\n * - Admin can kick/ban moderator and participant; can change scope for admin, moderator, participant\n * - Moderator can kick/ban participant only; can change scope for participant only\n * - Participant cannot act on anyone\n * - No user can act on the owner\n */\nconst _allowedGroupMemberOptions: GroupMemberPermissions = {\n  // Participant acting on others — no permissions\n  [CometChatUIKitConstants.groupMemberScope.participant +\n  CometChatUIKitConstants.groupMemberScope.participant]: {\n    kick: false,\n    ban: false,\n    unban: false,\n    changeScope: [],\n  },\n  [CometChatUIKitConstants.groupMemberScope.participant +\n  CometChatUIKitConstants.groupMemberScope.moderator]: {\n    kick: false,\n    ban: false,\n    unban: false,\n    changeScope: [],\n  },\n  [CometChatUIKitConstants.groupMemberScope.participant +\n  CometChatUIKitConstants.groupMemberScope.admin]: {\n    kick: false,\n    ban: false,\n    unban: false,\n    changeScope: [],\n  },\n  [CometChatUIKitConstants.groupMemberScope.participant +\n  CometChatUIKitConstants.groupMemberScope.owner]: {\n    kick: false,\n    ban: false,\n    unban: false,\n    changeScope: [],\n  },\n\n  // Moderator acting on others\n  [CometChatUIKitConstants.groupMemberScope.moderator +\n  CometChatUIKitConstants.groupMemberScope.participant]: {\n    kick: true,\n    ban: true,\n    unban: true,\n    changeScope: [\n      CometChatUIKitConstants.groupMemberScope.participant,\n      CometChatUIKitConstants.groupMemberScope.moderator,\n    ],\n  },\n  [CometChatUIKitConstants.groupMemberScope.moderator +\n  CometChatUIKitConstants.groupMemberScope.moderator]: {\n    kick: false,\n    ban: false,\n    unban: true,\n    changeScope: [],\n  },\n  [CometChatUIKitConstants.groupMemberScope.moderator +\n  CometChatUIKitConstants.groupMemberScope.admin]: {\n    kick: false,\n    ban: false,\n    unban: true,\n    changeScope: [],\n  },\n  [CometChatUIKitConstants.groupMemberScope.moderator +\n  CometChatUIKitConstants.groupMemberScope.owner]: {\n    kick: false,\n    ban: false,\n    unban: true,\n    changeScope: [],\n  },\n\n  // Admin acting on others\n  [CometChatUIKitConstants.groupMemberScope.admin +\n  CometChatUIKitConstants.groupMemberScope.participant]: {\n    kick: true,\n    ban: true,\n    unban: true,\n    changeScope: [\n      CometChatUIKitConstants.groupMemberScope.participant,\n      CometChatUIKitConstants.groupMemberScope.admin,\n      CometChatUIKitConstants.groupMemberScope.moderator,\n    ],\n  },\n  [CometChatUIKitConstants.groupMemberScope.admin +\n  CometChatUIKitConstants.groupMemberScope.moderator]: {\n    kick: true,\n    ban: true,\n    unban: true,\n    changeScope: [\n      CometChatUIKitConstants.groupMemberScope.participant,\n      CometChatUIKitConstants.groupMemberScope.admin,\n      CometChatUIKitConstants.groupMemberScope.moderator,\n    ],\n  },\n  [CometChatUIKitConstants.groupMemberScope.admin + CometChatUIKitConstants.groupMemberScope.admin]:\n    {\n      kick: false,\n      ban: false,\n      unban: true,\n      changeScope: [\n        CometChatUIKitConstants.groupMemberScope.participant,\n        CometChatUIKitConstants.groupMemberScope.admin,\n        CometChatUIKitConstants.groupMemberScope.moderator,\n      ],\n    },\n  [CometChatUIKitConstants.groupMemberScope.admin + CometChatUIKitConstants.groupMemberScope.owner]:\n    {\n      kick: false,\n      ban: false,\n      unban: true,\n      changeScope: [],\n    },\n\n  // Owner acting on others\n  [CometChatUIKitConstants.groupMemberScope.owner +\n  CometChatUIKitConstants.groupMemberScope.participant]: {\n    kick: true,\n    ban: true,\n    unban: true,\n    changeScope: [\n      CometChatUIKitConstants.groupMemberScope.participant,\n      CometChatUIKitConstants.groupMemberScope.admin,\n      CometChatUIKitConstants.groupMemberScope.moderator,\n    ],\n  },\n  [CometChatUIKitConstants.groupMemberScope.owner +\n  CometChatUIKitConstants.groupMemberScope.moderator]: {\n    kick: true,\n    ban: true,\n    unban: true,\n    changeScope: [\n      CometChatUIKitConstants.groupMemberScope.participant,\n      CometChatUIKitConstants.groupMemberScope.admin,\n      CometChatUIKitConstants.groupMemberScope.moderator,\n    ],\n  },\n  [CometChatUIKitConstants.groupMemberScope.owner + CometChatUIKitConstants.groupMemberScope.admin]:\n    {\n      kick: true,\n      ban: true,\n      unban: true,\n      changeScope: [\n        CometChatUIKitConstants.groupMemberScope.participant,\n        CometChatUIKitConstants.groupMemberScope.admin,\n        CometChatUIKitConstants.groupMemberScope.moderator,\n      ],\n    },\n};\n\n/**\n * A utility class for handling group member-related actions and options within CometChat.\n * Provides pure static methods — no Angular DI needed.\n *\n * Used by CometChatGroupMembers and CometChatBannedMembers components.\n */\nexport class GroupMemberUtils {\n  /**\n   * Returns available options for a member based on the permission matrix.\n   * Returns `CometChatOption[]` if actions are available, or the member's scope string if no actions.\n   *\n   * If the target member is the group owner, returns the owner scope string (no actions allowed).\n   *\n   * @param groupMember - The target group member\n   * @param group - The group the member belongs to\n   * @param loggedInUserUid - The UID of the currently logged-in user\n   * @param config - Optional flags to hide specific options\n   * @returns An array of CometChatOption or the member's scope string\n   */\n  static getViewMemberOptions(\n    groupMember: CometChat.GroupMember,\n    group: CometChat.Group,\n    loggedInUserUid = '',\n    config?: {\n      hideKickMemberOption?: boolean;\n      hideBanMemberOption?: boolean;\n      hideScopeChangeOption?: boolean;\n    }\n  ): CometChatOption[] | string {\n    // Owner cannot be acted upon — return scope string\n    if (group.getOwner() === groupMember.getUid()) {\n      return CometChatUIKitConstants.groupMemberScope.owner;\n    }\n\n    // Determine the logged-in user's effective scope\n    const loggedInUserScope: string =\n      group.getOwner() === loggedInUserUid\n        ? CometChatUIKitConstants.groupMemberScope.owner\n        : (group.getScope() ?? CometChatUIKitConstants.groupMemberScope.participant);\n\n    const permissionKey = loggedInUserScope + groupMember.getScope();\n    const permissions = _allowedGroupMemberOptions[permissionKey];\n\n    // If no permissions entry found, return scope string\n    if (!permissions) {\n      return groupMember.getScope();\n    }\n\n    const isKickAllowed = !config?.hideKickMemberOption && permissions.kick;\n    const isBanAllowed = !config?.hideBanMemberOption && permissions.ban;\n    const isChangeScopeAllowed =\n      !config?.hideScopeChangeOption && permissions.changeScope.length > 0;\n\n    const options: CometChatOption[] = [];\n\n    if (isKickAllowed) {\n      options.push(\n        new CometChatOption({\n          id: CometChatUIKitConstants.GroupMemberOptions.kick,\n          title: getLocalizedString('members_remove'),\n        })\n      );\n    }\n\n    if (isBanAllowed) {\n      options.push(\n        new CometChatOption({\n          id: CometChatUIKitConstants.GroupMemberOptions.ban,\n          title: getLocalizedString('members_block'),\n        })\n      );\n    }\n\n    if (isChangeScopeAllowed) {\n      options.push(\n        new CometChatOption({\n          id: CometChatUIKitConstants.GroupMemberOptions.changeScope,\n          title: getLocalizedString('members_change_role'),\n        })\n      );\n    }\n\n    // If no options available, return the member's scope string\n    if (options.length === 0) {\n      return groupMember.getScope();\n    }\n\n    return options;\n  }\n\n  /**\n   * Returns the allowed scopes for a scope change operation.\n   * The member's current scope is moved to the front of the list if present.\n   *\n   * @param group - The group the member belongs to\n   * @param groupMember - The member whose scope may be changed\n   * @returns An array of allowed scope strings\n   */\n  static allowScopeChange(group: CometChat.Group, groupMember: CometChat.GroupMember): string[] {\n    const loggedInUserScope: string =\n      group.getScope() ?? CometChatUIKitConstants.groupMemberScope.participant;\n    const permissionKey = loggedInUserScope + groupMember.getScope();\n    const permissions = _allowedGroupMemberOptions[permissionKey];\n\n    if (!permissions) {\n      return [];\n    }\n\n    // Clone the array to avoid mutating the permission matrix\n    const scopes = [...permissions.changeScope];\n\n    // Move the member's current scope to the front if present\n    if (scopes.length > 0 && scopes.includes(groupMember.getScope())) {\n      const index = scopes.indexOf(groupMember.getScope());\n      scopes.splice(index, 1);\n      scopes.unshift(groupMember.getScope());\n    }\n\n    return scopes;\n  }\n\n  /**\n   * Creates a CometChat.GroupMember from a User with participant scope.\n   *\n   * @param user - The user to convert\n   * @param group - The group the member will belong to\n   * @returns A new GroupMember with participant scope\n   */\n  static createParticipantGroupMember(\n    user: CometChat.User,\n    group: CometChat.Group\n  ): CometChat.GroupMember {\n    const groupMember = new CometChat.GroupMember(\n      user.getUid(),\n      CometChatUIKitConstants.groupMemberScope.participant as CometChat.GroupMemberScope\n    );\n    groupMember.setName(user.getName());\n    groupMember.setGuid(group.getGuid());\n    groupMember.setUid(user.getUid());\n    groupMember.setAvatar(user.getAvatar());\n    groupMember.setStatus(user.getStatus());\n    return groupMember;\n  }\n\n  /**\n   * Creates an Action message for group member operations (kick, ban, scope change).\n   *\n   * @param actionOn - The group member the action is performed on\n   * @param action - The action type (e.g., kicked, banned, scopeChanged)\n   * @param group - The group where the action occurs\n   * @param loggedInUser - The user performing the action\n   * @returns A CometChat.Action message\n   */\n  static createActionMessage(\n    actionOn: CometChat.GroupMember,\n    action: string,\n    group: CometChat.Group,\n    loggedInUser: CometChat.User\n  ): CometChat.Action {\n    const actionMessage = new CometChat.Action(\n      group.getGuid(),\n      CometChatUIKitConstants.MessageTypes.groupMember,\n      CometChatUIKitConstants.MessageReceiverType.group,\n      CometChatUIKitConstants.MessageCategory.action as CometChat.MessageCategory\n    );\n    actionMessage.setAction(action);\n    actionMessage.setActionBy(loggedInUser);\n    actionMessage.setSender(loggedInUser);\n    actionMessage.setMessage(`${loggedInUser.getUid()} ${action} ${actionOn.getUid()}`);\n    actionMessage.setActionFor(group);\n    actionMessage.setActionOn(actionOn);\n    actionMessage.setReceiver(group);\n    actionMessage.setConversationId('group_' + group.getGuid());\n    actionMessage.setMuid(CometChatUIKitUtility.ID());\n    actionMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    actionMessage.setReceiverType(CometChatUIKitConstants.MessageReceiverType.group);\n    actionMessage.setData({\n      extras: {\n        scope: {\n          new: actionOn.getScope(),\n        },\n      },\n    });\n    return actionMessage;\n  }\n}\n","import { Injectable, signal, inject, DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { States } from '../Enums/Enums';\nimport { CometChatUIKitConstants } from '../constants';\nimport { GroupMemberUtils } from '../utils/GroupMemberUtils';\nimport {\n  CometChatGroupEvents,\n  IGroupMemberKickedBanned,\n  IGroupMemberScopeChanged,\n} from '../events/CometChatGroupEvents';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { ConnectionStateService } from './connection-state.service';\n\n// Re-export for backward compatibility\nexport type { GroupMembersErrorCallback } from './group-members.types';\nimport { GroupMembersErrorCallback } from './group-members.types';\n\n/**\n * GroupMembersService\n *\n * Service responsible for managing group member state and SDK interactions.\n * NOT `providedIn: 'root'` — instantiated per component instance to avoid\n * shared state between multiple group member lists.\n *\n * Uses Angular Signals for reactive state management.\n */\n@Injectable()\nexport class GroupMembersService {\n  // ==================== State Signals ====================\n\n  private membersSignal = signal<CometChat.GroupMember[]>([]);\n  private fetchStateSignal = signal<States>(States.loading);\n  private hasMoreSignal = signal<boolean>(true);\n\n  readonly members = this.membersSignal.asReadonly();\n  readonly fetchState = this.fetchStateSignal.asReadonly();\n  readonly hasMore = this.hasMoreSignal.asReadonly();\n\n  // ==================== Private State ====================\n\n  private groupMembersRequest: CometChat.GroupMembersRequest | null = null;\n  private currentGroup: CometChat.Group | null = null;\n  private errorCallback: GroupMembersErrorCallback | null = null;\n\n  private userListenerId = `group_members_user_${CometChatUIKitUtility.ID()}`;\n  private groupListenerId = `group_members_group_${CometChatUIKitUtility.ID()}`;\n  /** Guard: only re-fetch on reconnect after the first fetch has completed. */\n  private initialFetchDone = false;\n\n  private connectionState = inject(ConnectionStateService);\n  private destroyRef = inject(DestroyRef);\n\n  private static readonly DEFAULT_LIMIT = 30;\n\n  constructor() {\n    // Silent reconnect refresh — keeps existing list visible, resets to page 1.\n    this.connectionState.reconnected$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.handleReconnect());\n  }\n\n  setErrorCallback(callback: GroupMembersErrorCallback | null): void { this.errorCallback = callback; }\n\n  /**\n   * Initialize the service with a group and optional custom request builder.\n   * Creates the GroupMembersRequestBuilder and fetches the first page.\n   */\n  initialize(group: CometChat.Group, builder?: CometChat.GroupMembersRequestBuilder): void {\n    this.currentGroup = group;\n    this.membersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n\n    const effectiveBuilder =\n      builder ||\n      new CometChat.GroupMembersRequestBuilder(group.getGuid()).setLimit(\n        GroupMembersService.DEFAULT_LIMIT\n      );\n\n    this.groupMembersRequest = effectiveBuilder.build();\n    this.fetchNext();\n  }\n\n  /**\n   * Fetch the next page of group members from the SDK.\n   * Appends results without duplicates.\n   */\n  async fetchNext(): Promise<void> {\n    if (!this.groupMembersRequest) {\n      return;\n    }\n\n    const isInitialFetch =\n      this.membersSignal().length === 0 && this.fetchStateSignal() === States.loading;\n    const startTime = Date.now();\n    const MIN_SHIMMER_TIME = 1000;\n\n    try {\n      const newMembers = await this.groupMembersRequest.fetchNext();\n\n      if (isInitialFetch) {\n        const elapsed = Date.now() - startTime;\n        const remainingTime = Math.max(0, MIN_SHIMMER_TIME - elapsed);\n        await new Promise<void>(resolve => setTimeout(resolve, remainingTime));\n      }\n\n      if (newMembers.length === 0) {\n        this.hasMoreSignal.set(false);\n        if (this.membersSignal().length === 0) {\n          this.fetchStateSignal.set(States.empty);\n        }\n        return;\n      }\n\n      this.appendMembersWithoutDuplicates(newMembers);\n\n      if (newMembers.length < GroupMembersService.DEFAULT_LIMIT) {\n        this.hasMoreSignal.set(false);\n      }\n\n      this.fetchStateSignal.set(States.loaded);\n      this.initialFetchDone = true;\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error fetching members:', error);\n      if (this.membersSignal().length === 0) {\n        this.fetchStateSignal.set(States.error);\n      }\n      this.handleError(error);\n    }\n  }\n\n  /**\n   * Search members by keyword. Resets the list and creates a new builder.\n   */\n  search(keyword: string, searchBuilder?: CometChat.GroupMembersRequestBuilder): void {\n    if (!this.currentGroup) {\n      return;\n    }\n\n    this.membersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n\n    let effectiveBuilder: CometChat.GroupMembersRequestBuilder;\n\n    if (searchBuilder) {\n      effectiveBuilder = searchBuilder;\n      effectiveBuilder.setSearchKeyword(keyword);\n    } else {\n      effectiveBuilder = new CometChat.GroupMembersRequestBuilder(this.currentGroup.getGuid())\n        .setLimit(GroupMembersService.DEFAULT_LIMIT)\n        .setSearchKeyword(keyword);\n    }\n\n    this.groupMembersRequest = effectiveBuilder.build();\n    this.fetchNext();\n  }\n\n  // ==================== Member Actions ====================\n\n  /** Kick a member from the group. Calls SDK, removes from list, emits ccGroupMemberKicked event. */\n  async kickMember(group: CometChat.Group, member: CometChat.GroupMember): Promise<void> {\n    try {\n      await CometChat.kickGroupMember(group.getGuid(), member.getUid());\n      this.removeMember(member.getUid());\n      const loggedInUser = await CometChat.getLoggedinUser();\n      if (loggedInUser) {\n        const groupClone = CometChatUIKitUtility.clone(group);\n        groupClone.setMembersCount(groupClone.getMembersCount() - 1);\n        const actionMessage = GroupMemberUtils.createActionMessage(\n          member, CometChatUIKitConstants.groupMemberAction.KICKED, groupClone, loggedInUser\n        );\n        CometChatGroupEvents.ccGroupMemberKicked.next({\n          message: actionMessage, kickedFrom: groupClone, kickedUser: member, kickedBy: loggedInUser,\n        } as IGroupMemberKickedBanned);\n      }\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error kicking member:', error);\n      this.handleError(error);\n    }\n  }\n\n  /** Ban a member from the group. Calls SDK, removes from list, emits ccGroupMemberBanned event. */\n  async banMember(group: CometChat.Group, member: CometChat.GroupMember): Promise<void> {\n    try {\n      await CometChat.banGroupMember(group.getGuid(), member.getUid());\n      this.removeMember(member.getUid());\n      const loggedInUser = await CometChat.getLoggedinUser();\n      if (loggedInUser) {\n        const groupClone = CometChatUIKitUtility.clone(group);\n        groupClone.setMembersCount(groupClone.getMembersCount() - 1);\n        const actionMessage = GroupMemberUtils.createActionMessage(\n          member, CometChatUIKitConstants.groupMemberAction.BANNED, groupClone, loggedInUser\n        );\n        CometChatGroupEvents.ccGroupMemberBanned.next({\n          message: actionMessage, kickedFrom: groupClone, kickedUser: member, kickedBy: loggedInUser,\n        } as IGroupMemberKickedBanned);\n      }\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error banning member:', error);\n      this.handleError(error);\n    }\n  }\n\n  /** Update a member's scope (role) in the group. Calls SDK, updates list, emits event. */\n  async updateMemberScope(\n    group: CometChat.Group,\n    member: CometChat.GroupMember,\n    newScope: string\n  ): Promise<void> {\n    try {\n      const oldScope = member.getScope();\n      await CometChat.updateGroupMemberScope(\n        group.getGuid(), member.getUid(), newScope as CometChat.GroupMemberScope\n      );\n      this.updateMemberScopeInList(member.getUid(), newScope as CometChat.GroupMemberScope);\n      const loggedInUser = await CometChat.getLoggedinUser();\n      if (loggedInUser) {\n        const updatedMember = CometChatUIKitUtility.clone(member);\n        updatedMember.setScope(newScope as CometChat.GroupMemberScope);\n        const groupClone = CometChatUIKitUtility.clone(group);\n        const actionMessage = GroupMemberUtils.createActionMessage(\n          updatedMember, CometChatUIKitConstants.groupMemberAction.SCOPE_CHANGE, groupClone, loggedInUser\n        );\n        CometChatGroupEvents.ccGroupMemberScopeChanged.next({\n          message: actionMessage, updatedUser: updatedMember,\n          scopeChangedTo: newScope, scopeChangedFrom: oldScope, group: groupClone,\n        } as IGroupMemberScopeChanged);\n      }\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error updating member scope:', error);\n      this.handleError(error);\n      throw error;\n    }\n  }\n\n  // ==================== List Mutation Methods ====================\n\n  removeMember(uid: string): void {\n    const filtered = this.membersSignal().filter(m => m.getUid() !== uid);\n    this.membersSignal.set(filtered);\n    if (filtered.length === 0) {\n      this.fetchStateSignal.set(States.empty);\n    }\n  }\n\n  updateMemberStatus(user: CometChat.User): void {\n    const current = this.membersSignal();\n    const index = current.findIndex(m => m.getUid() === user.getUid());\n    if (index === -1) return;\n    const updated = [...current];\n    updated[index].setStatus(user.getStatus());\n    this.membersSignal.set(updated);\n  }\n\n  updateMemberScopeInList(uid: string, newScope: CometChat.GroupMemberScope): void {\n    const current = this.membersSignal();\n    const index = current.findIndex(m => m.getUid() === uid);\n    if (index === -1) return;\n    const updated = [...current];\n    updated[index].setScope(newScope);\n    this.membersSignal.set(updated);\n  }\n\n  appendMember(member: CometChat.GroupMember): void {\n    const current = this.membersSignal();\n    if (current.some(m => m.getUid() === member.getUid())) return;\n    this.membersSignal.set([...current, member]);\n    if (this.fetchStateSignal() === States.empty) {\n      this.fetchStateSignal.set(States.loaded);\n    }\n  }\n\n  appendMembersWithoutDuplicates(members: CometChat.GroupMember[]): void {\n    const current = this.membersSignal();\n    const existingUids = new Set(current.map(m => m.getUid()));\n    const newMembers = members.filter(m => !existingUids.has(m.getUid()));\n    if (newMembers.length > 0) {\n      this.membersSignal.set([...current, ...newMembers]);\n    }\n  }\n\n  // ==================== Listener Management ====================\n\n  attachListeners(groupGuid: string, hideUserStatus: boolean): void {\n    if (!hideUserStatus) {\n      try {\n        CometChat.addUserListener(\n          this.userListenerId,\n          new CometChat.UserListener({\n            onUserOnline: (user: CometChat.User) => this.updateMemberStatus(user),\n            onUserOffline: (user: CometChat.User) => this.updateMemberStatus(user),\n          })\n        );\n      } catch (error) {\n        CometChatLogger.error('GroupMembersService', 'Error attaching user listener:', error);\n      }\n    }\n\n    try {\n      CometChat.addGroupListener(\n        this.groupListenerId,\n        new CometChat.GroupListener({\n          onGroupMemberScopeChanged: (\n            _message: CometChat.Action,\n            changedUser: CometChat.GroupMember,\n            newScope: CometChat.GroupMemberScope,\n            _oldScope: CometChat.GroupMemberScope,\n            changedGroup: CometChat.Group\n          ) => {\n            if (changedGroup.getGuid() !== groupGuid) return;\n            this.updateMemberScopeInList(changedUser.getUid(), newScope);\n          },\n          onGroupMemberKicked: (\n            _message: CometChat.Action,\n            kickedUser: CometChat.User,\n            _kickedBy: CometChat.User,\n            kickedFrom: CometChat.Group\n          ) => {\n            if (kickedFrom.getGuid() !== groupGuid) return;\n            this.removeMember(kickedUser.getUid());\n          },\n          onGroupMemberBanned: (\n            _message: CometChat.Action,\n            bannedUser: CometChat.User,\n            _bannedBy: CometChat.User,\n            bannedFrom: CometChat.Group\n          ) => {\n            if (bannedFrom.getGuid() !== groupGuid) return;\n            this.removeMember(bannedUser.getUid());\n          },\n          onMemberAddedToGroup: (\n            _message: CometChat.Action,\n            userAdded: CometChat.User,\n            _userAddedBy: CometChat.User,\n            userAddedIn: CometChat.Group\n          ) => {\n            if (userAddedIn.getGuid() !== groupGuid) return;\n            const newMember = GroupMemberUtils.createParticipantGroupMember(userAdded, userAddedIn);\n            this.appendMember(newMember);\n          },\n          onGroupMemberLeft: (\n            _message: CometChat.Action,\n            leavingUser: CometChat.User,\n            group: CometChat.Group\n          ) => {\n            if (group.getGuid() !== groupGuid) return;\n            this.removeMember(leavingUser.getUid());\n          },\n          onGroupMemberJoined: (\n            _message: CometChat.Action,\n            joinedUser: CometChat.User,\n            joinedGroup: CometChat.Group\n          ) => {\n            if (joinedGroup.getGuid() !== groupGuid) return;\n            const newMember = GroupMemberUtils.createParticipantGroupMember(joinedUser, joinedGroup);\n            this.appendMember(newMember);\n          },\n        })\n      );\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error attaching group listener:', error);\n    }\n  }\n\n  detachListeners(): void {\n    try {\n      CometChat.removeUserListener(this.userListenerId);\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error removing user listener:', error);\n    }\n    try {\n      CometChat.removeGroupListener(this.groupListenerId);\n    } catch (error) {\n      CometChatLogger.error('GroupMembersService', 'Error removing group listener:', error);\n    }\n  }\n\n  // ==================== Cleanup ====================\n\n  cleanup(): void {\n    this.detachListeners();\n    this.membersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.groupMembersRequest = null;\n    this.currentGroup = null;\n    this.errorCallback = null;\n    this.initialFetchDone = false;\n  }\n\n  // ==================== Private: Reconnect ====================\n\n  /**\n   * Called by ConnectionStateService when the WebSocket reconnects.\n   * Silently re-fetches page 1 without clearing the list or showing shimmer.\n   * Resets hasMore to true so pagination works again from the new first page.\n   */\n  private handleReconnect(): void {\n    if (!this.currentGroup || !this.initialFetchDone) return;\n    CometChatLogger.info('GroupMembersService', 'WebSocket reconnected — refreshing member list');\n    const freshRequest = new CometChat.GroupMembersRequestBuilder(this.currentGroup.getGuid())\n      .setLimit(GroupMembersService.DEFAULT_LIMIT)\n      .build();\n    freshRequest.fetchNext()\n      .then(newMembers => {\n        this.membersSignal.set(newMembers);\n        // Reset to true — back at page 1, more pages may exist\n        this.hasMoreSignal.set(true);\n        this.fetchStateSignal.set(newMembers.length === 0 ? States.empty : States.loaded);\n        this.groupMembersRequest = freshRequest;\n      })\n      .catch(e => CometChatLogger.error('GroupMembersService', 'Error refreshing members on reconnect:', e));\n  }\n\n  // ==================== Private Helpers ====================\n\n  private handleError(error: unknown): void {\n    if (this.errorCallback) {\n      this.errorCallback(this.toCometchatException(error));\n    }\n  }\n\n  private toCometchatException(error: unknown): CometChat.CometChatException {\n    if (error instanceof CometChat.CometChatException) return error;\n    if (error instanceof Error) {\n      return new CometChat.CometChatException({\n        code: 'GROUP_MEMBERS_ERROR', message: error.message, details: error.stack || '',\n      });\n    }\n    return new CometChat.CometChatException({\n      code: 'GROUP_MEMBERS_ERROR', message: String(error), details: '',\n    });\n  }\n}\n","import { Injectable, signal } from '@angular/core';\nimport { Subscription } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageStatus, States } from '../Enums/Enums';\nimport { CometChatCallEvents } from '../events/CometChatCallEvents';\nimport { CometChatMessageEvents } from '../events/CometChatMessageEvents';\nimport { CometChatUIEvents } from '../events/CometChatUIEvents';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { CometChatUIKitCalls } from '../CometChatCalls';\nimport { CometChatSoundManager } from '../resources/CometChatSoundManager/CometChatSoundManager';\n\n/**\n * CallLogsService manages call log fetching, pagination, call initiation,\n * call listeners, and event subscriptions for the CometChatCallLogs component.\n * Not providedIn: 'root' — each component gets its own instance.\n */\n@Injectable()\nexport class CallLogsService {\n  private _callLogs = signal<any[]>([]);\n  readonly callLogs = this._callLogs.asReadonly();\n\n  private _state = signal<States>(States.loading);\n  readonly state = this._state.asReadonly();\n\n  private _hasMore = signal<boolean>(true);\n  readonly hasMore = this._hasMore.asReadonly();\n\n  private _showOutgoingCallScreen = signal<boolean>(false);\n  readonly showOutgoingCallScreen = this._showOutgoingCallScreen.asReadonly();\n\n  private _showOngoingCall = signal<boolean>(false);\n  readonly showOngoingCall = this._showOngoingCall.asReadonly();\n\n  private _activeCallObject = signal<CometChat.Call | null>(null);\n  readonly activeCallObject = this._activeCallObject.asReadonly();\n\n  private _sessionId = signal<string | null>(null);\n  readonly sessionId = this._sessionId.asReadonly();\n\n  private callLogRequest: any = null;\n  private callLogRequestBuilder: any = null;\n  private loggedInUser: CometChat.User | null = null;\n  private onError: ((error: CometChat.CometChatException) => void) | null = null;\n  private readonly listenerId = 'callLogs_' + Date.now();\n  private subscriptions: Subscription[] = [];\n  private isFetching = false;\n\n  /** Sets a custom CallLogRequestBuilder. @see Requirement 2.5 */\n  setCallLogRequestBuilder(builder: any): void {\n    this.callLogRequestBuilder = builder;\n    this.callLogRequest = null;\n  }\n\n  /** Sets the logged-in user (needed for default request builder). */\n  setLoggedInUser(user: CometChat.User): void { this.loggedInUser = user; }\n\n  /** Sets the error callback. @see Requirements 7.1, 7.2 */\n  setOnError(callback: ((error: CometChat.CometChatException) => void) | null): void { this.onError = callback; }\n\n  /** Sets the current state. */\n  setState(state: States): void { this._state.set(state); }\n\n  /** Fetches the initial page of call logs. @see Requirements 1.1, 1.4-1.6 */\n  async fetchCallLogs(): Promise<void> {\n    try {\n      this._callLogs.set([]);\n      this._state.set(States.loading);\n      this.isFetching = true;\n\n      const startTime = Date.now();\n      const MIN_SHIMMER_TIME = 1000;\n\n      if (this.callLogRequestBuilder) {\n        this.callLogRequest = this.callLogRequestBuilder.build();\n      } else {\n        const authToken = this.loggedInUser?.getAuthToken();\n        this.callLogRequest = new CometChatUIKitCalls.CallLogRequestBuilder()\n          .setLimit(30)\n          .setCallCategory('call')\n          .setAuthToken(authToken!)\n          .build();\n      }\n\n      const calls: any[] = await this.callLogRequest.fetchNext();\n\n      // Ensure shimmer is visible for at least MIN_SHIMMER_TIME\n      const elapsed = Date.now() - startTime;\n      const remainingTime = Math.max(0, MIN_SHIMMER_TIME - elapsed);\n      await new Promise<void>(resolve => setTimeout(resolve, remainingTime));\n\n      if (calls && calls.length > 0) {\n        this._callLogs.set(calls);\n        this._state.set(States.loaded);\n      } else {\n        this._callLogs.set([]);\n        this._state.set(States.empty);\n        this._hasMore.set(false);\n      }\n    } catch (err: unknown) {\n      this._state.set(States.error);\n      this.handleError(err);\n    } finally {\n      this.isFetching = false;\n    }\n  }\n\n  /** Fetches the next page of call logs. @see Requirement 1.3 */\n  async fetchNextCallLogs(): Promise<boolean> {\n    if (!this.callLogRequest || this.isFetching) return false;\n    this.isFetching = true;\n\n    try {\n      const calls: any[] = await this.callLogRequest.fetchNext();\n      if (calls && calls.length > 0) {\n        this._callLogs.set([...this._callLogs(), ...calls]);\n        this._hasMore.set(true);\n        if (this._state() !== States.loaded) this._state.set(States.loaded);\n        return true;\n      } else {\n        this._hasMore.set(false);\n        return false;\n      }\n    } catch (err: unknown) {\n      if (this._callLogs().length === 0) this._state.set(States.error);\n      this.handleError(err);\n      return false;\n    } finally {\n      this.isFetching = false;\n    }\n  }\n\n  /** Initiates a new call to the specified user. @see Requirements 3.1, 3.3 */\n  async initiateCall(type: string, uid: string): Promise<void> {\n    try {\n      const receiverType = CometChatUIKitConstants.MessageReceiverType.user;\n      const callType = type === CometChat.CALL_TYPE.VIDEO ? CometChat.CALL_TYPE.VIDEO : CometChat.CALL_TYPE.AUDIO;\n      const callObj = new CometChat.Call(uid, callType, receiverType);\n      const outgoingCall = await CometChat.initiateCall(callObj);\n      this._activeCallObject.set(outgoingCall);\n      this._showOutgoingCallScreen.set(true);\n      CometChatMessageEvents.ccMessageSent.next({ message: outgoingCall, status: MessageStatus.inprogress });\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  /** Cancels the current outgoing call. @see Requirement 3.4 */\n  async cancelOutgoingCall(): Promise<void> {\n    const call = this._activeCallObject();\n    if (!call) return;\n\n    try {\n      const rejectedCall = await CometChat.rejectCall(call.getSessionId(), CometChatUIKitConstants.calls.cancelled);\n      CometChatSoundManager.pause();\n      this._activeCallObject.set(null);\n      this._showOutgoingCallScreen.set(false);\n      CometChatCallEvents.ccCallRejected.next(rejectedCall);\n      CometChatMessageEvents.ccMessageSent.next({ message: call, status: MessageStatus.success });\n    } catch (err: unknown) {\n      CometChatSoundManager.pause();\n      this._showOutgoingCallScreen.set(false);\n      this.handleError(err);\n    }\n  }\n\n  /** Initializes call listeners and event subscriptions. @see Requirements 4.1-4.3 */\n  initialize(): void {\n    CometChat.addCallListener(\n      this.listenerId,\n      new CometChat.CallListener({\n        onOutgoingCallAccepted: (call: CometChat.Call) => {\n          CometChatSoundManager.pause();\n          this._showOutgoingCallScreen.set(false);\n          this._sessionId.set(call.getSessionId());\n          this._activeCallObject.set(call);\n          this._showOngoingCall.set(true);\n          CometChatUIEvents.ccShowOngoingCall.next({ child: call });\n        },\n        onOutgoingCallRejected: (_call: CometChat.Call) => {\n          CometChatSoundManager.pause();\n          this._showOutgoingCallScreen.set(false);\n          this._activeCallObject.set(null);\n        },\n      })\n    );\n\n    this.subscriptions.push(\n      CometChatCallEvents.ccCallEnded.subscribe((_call: CometChat.Call) => {\n        this._showOngoingCall.set(false);\n        this._sessionId.set(null);\n        this._activeCallObject.set(null);\n      })\n    );\n  }\n\n  /** Removes the call listener and unsubscribes from all event subscriptions. @see Requirement 4.4 */\n  cleanup(): void {\n    CometChat.removeCallListener(this.listenerId);\n    for (const sub of this.subscriptions) sub.unsubscribe();\n    this.subscriptions = [];\n  }\n\n  private handleError(err: unknown): void {\n    let exception: CometChat.CometChatException;\n    if (err instanceof CometChat.CometChatException) {\n      exception = err;\n    } else if (err instanceof Error) {\n      exception = new CometChat.CometChatException({ code: 'CALL_LOGS_ERROR', message: err.message, details: err.stack || '' });\n    } else {\n      exception = new CometChat.CometChatException({ code: 'CALL_LOGS_ERROR', message: String(err), details: '' });\n    }\n    if (this.onError) this.onError(exception);\n    CometChatLogger.error('CometChatCallLogs', 'Error:', err);\n  }\n}\n","import { InjectionToken } from '@angular/core';\nimport { CometChatTextFormatter } from '../formatters';\n\n/**\n * Interface defining all global configuration properties.\n * All properties are optional (undefined means no global override).\n *\n * This interface is used with the COMETCHAT_GLOBAL_CONFIG InjectionToken\n * to provide centralized configuration management for UIKit components.\n * Components can read these values and apply them using a priority system\n * where @Input values take precedence over global config values.\n *\n * @example\n * ```typescript\n * // In app.config.ts or app.module.ts\n * import { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '@cometchat/chat-uikit-angular';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     {\n *       provide: COMETCHAT_GLOBAL_CONFIG,\n *       useValue: {\n *         hideReceipts: true,\n *         hideUserStatus: true,\n *         showSearchBar: false,\n *         disableSoundForMessages: true\n *       } as GlobalConfig\n *     }\n *   ]\n * };\n * ```\n */\nexport interface GlobalConfig {\n  /** Hide read receipts across all components */\n  hideReceipts?: boolean;\n  /** Hide error states across all components */\n  hideError?: boolean;\n  /** Hide user online/offline status indicators */\n  hideUserStatus?: boolean;\n  /** Hide group type badges (public/private/password) */\n  hideGroupType?: boolean;\n  /** Show scrollbar in list components */\n  showScrollbar?: boolean;\n  /** Show search bar in list components */\n  showSearchBar?: boolean;\n  /** Disable sound notifications for messages */\n  disableSoundForMessages?: boolean;\n  /** Text formatters for message rendering */\n  textFormatters?: CometChatTextFormatter[];\n  /** Disable right-click context menu across components */\n  disableDefaultContextMenu?: boolean;\n  /** Disable sound for incoming/outgoing calls */\n  disableSoundForCalls?: boolean;\n  /** Custom sound URL for calls */\n  customSoundForCalls?: string;\n  /** Custom sound URL for messages */\n  customSoundForMessages?: string;\n  /** Hide avatar across components */\n  hideAvatar?: boolean;\n  /**\n   * Custom session settings object for call components (call buttons, call logs, etc.).\n   * Pass a plain v5 SessionSettings object — the v4 CallSettingsBuilder is no longer used.\n   * @example\n   * { sessionType: 'VIDEO', layout: 'TILE', startAudioMuted: false }\n   */\n  callSettingsBuilder?: Record<string, any>;\n}\n\n/**\n * InjectionToken for providing global configuration at application bootstrap.\n *\n * Use this token to declaratively configure CometChat UIKit components\n * in your application's providers array. The configuration is static\n * and set once at application startup.\n *\n * Priority System:\n * 1. @Input value (if explicitly set on component)\n * 2. Global config value (from this token)\n * 3. Component's internal default value\n *\n * @example\n * ```typescript\n * // In app.config.ts (standalone)\n * import { COMETCHAT_GLOBAL_CONFIG } from '@cometchat/chat-uikit-angular';\n *\n * export const appConfig: ApplicationConfig = {\n *   providers: [\n *     {\n *       provide: COMETCHAT_GLOBAL_CONFIG,\n *       useValue: {\n *         hideReceipts: true,\n *         hideUserStatus: true,\n *         showSearchBar: false,\n *         disableSoundForMessages: true\n *       }\n *     }\n *   ]\n * };\n * ```\n *\n * @example\n * ```typescript\n * // In app.module.ts (NgModule)\n * @NgModule({\n *   providers: [\n *     {\n *       provide: COMETCHAT_GLOBAL_CONFIG,\n *       useValue: {\n *         hideReceipts: true,\n *         showSearchBar: false\n *       }\n *     }\n *   ]\n * })\n * export class AppModule {}\n * ```\n *\n * @example\n * ```typescript\n * // Using factory for dynamic configuration\n * {\n *   provide: COMETCHAT_GLOBAL_CONFIG,\n *   useFactory: (envService: EnvironmentService) => ({\n *     hideReceipts: envService.isProduction,\n *     showSearchBar: true\n *   }),\n *   deps: [EnvironmentService]\n * }\n * ```\n */\nexport const COMETCHAT_GLOBAL_CONFIG = new InjectionToken<Partial<GlobalConfig>>(\n  'COMETCHAT_GLOBAL_CONFIG'\n);\n","/**\n * Keyboard Utility Functions for CometChat UIKit Accessibility\n *\n * Provides stateless utility functions for keyboard event handling,\n * navigation, and focus management across components.\n */\n\n/**\n * Checks if the event key is an activation key (Enter or Space)\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is Enter or Space\n */\nexport function isActivationKey(event: KeyboardEvent): boolean {\n  return event.key === 'Enter' || event.key === ' ';\n}\n\n/**\n * Checks if the event key is an arrow key\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is an arrow key\n */\nexport function isArrowKey(event: KeyboardEvent): boolean {\n  return ['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key);\n}\n\n/**\n * Options for handleActivation function\n */\nexport interface HandleActivationOptions {\n  /** Whether to call preventDefault on the event (default: true) */\n  preventDefault?: boolean;\n  /** Whether to call stopPropagation on the event (default: false) */\n  stopPropagation?: boolean;\n}\n\n/**\n * Handles activation key press with event prevention\n * Returns true if activation occurred\n * @param event - The keyboard event to handle\n * @param callback - The callback to execute on activation\n * @param options - Optional configuration for event handling\n * @returns boolean - true if activation occurred\n */\nexport function handleActivation(\n  event: KeyboardEvent,\n  callback: () => void,\n  options?: HandleActivationOptions\n): boolean {\n  if (isActivationKey(event)) {\n    if (options?.preventDefault !== false) {\n      event.preventDefault();\n    }\n    if (options?.stopPropagation) {\n      event.stopPropagation();\n    }\n    callback();\n    return true;\n  }\n  return false;\n}\n\n/**\n * Direction type for arrow key navigation\n */\nexport type NavigationDirection = 'up' | 'down' | 'left' | 'right';\n\n/**\n * Options for getNextIndex function\n */\nexport interface GetNextIndexOptions {\n  /** Whether to wrap around at list boundaries (default: true) */\n  wrap?: boolean;\n  /** Callback to determine if an index should be skipped (e.g., disabled items) */\n  skipDisabled?: (index: number) => boolean;\n}\n\n/**\n * Calculates next index for arrow key navigation with wrap-around\n * @param currentIndex - The current focused index\n * @param direction - The navigation direction\n * @param totalItems - The total number of items in the list\n * @param options - Optional configuration for navigation behavior\n * @returns number - The next index to focus\n */\nexport function getNextIndex(\n  currentIndex: number,\n  direction: NavigationDirection,\n  totalItems: number,\n  options?: GetNextIndexOptions\n): number {\n  // Handle edge cases\n  if (totalItems <= 0) {\n    return 0;\n  }\n\n  const wrap = options?.wrap !== false;\n  const isForward = direction === 'down' || direction === 'right';\n\n  let nextIndex = isForward ? currentIndex + 1 : currentIndex - 1;\n\n  if (wrap) {\n    if (nextIndex < 0) {\n      nextIndex = totalItems - 1;\n    }\n    if (nextIndex >= totalItems) {\n      nextIndex = 0;\n    }\n  } else {\n    nextIndex = Math.max(0, Math.min(totalItems - 1, nextIndex));\n  }\n\n  // Skip disabled items if callback provided\n  if (options?.skipDisabled) {\n    const startIndex = nextIndex;\n    let iterations = 0;\n    const maxIterations = totalItems; // Prevent infinite loop\n\n    while (options.skipDisabled(nextIndex) && iterations < maxIterations) {\n      nextIndex = isForward ? nextIndex + 1 : nextIndex - 1;\n\n      if (wrap) {\n        if (nextIndex < 0) {\n          nextIndex = totalItems - 1;\n        }\n        if (nextIndex >= totalItems) {\n          nextIndex = 0;\n        }\n      } else {\n        nextIndex = Math.max(0, Math.min(totalItems - 1, nextIndex));\n      }\n\n      iterations++;\n\n      // If we've wrapped back to start, all items are disabled\n      if (nextIndex === startIndex) {\n        break;\n      }\n    }\n  }\n\n  return nextIndex;\n}\n\n/**\n * Selector for focusable elements\n */\nconst FOCUSABLE_SELECTOR = [\n  'button:not([disabled])',\n  '[href]',\n  'input:not([disabled])',\n  'select:not([disabled])',\n  'textarea:not([disabled])',\n  '[tabindex]:not([tabindex=\"-1\"])',\n].join(', ');\n\n/**\n * Gets all focusable elements within a container\n * @param container - The container element to search within\n * @returns HTMLElement[] - Array of focusable elements\n */\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n  if (!container) {\n    return [];\n  }\n\n  return Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)) as HTMLElement[];\n}\n\n/**\n * Maps a keyboard event key to a navigation direction\n * @param event - The keyboard event\n * @returns NavigationDirection | null - The direction or null if not an arrow key\n */\nexport function getNavigationDirection(event: KeyboardEvent): NavigationDirection | null {\n  switch (event.key) {\n    case 'ArrowUp':\n      return 'up';\n    case 'ArrowDown':\n      return 'down';\n    case 'ArrowLeft':\n      return 'left';\n    case 'ArrowRight':\n      return 'right';\n    default:\n      return null;\n  }\n}\n\n/**\n * Checks if the event key is the Escape key\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is Escape\n */\nexport function isEscapeKey(event: KeyboardEvent): boolean {\n  return event.key === 'Escape';\n}\n\n/**\n * Checks if the event key is the Tab key\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is Tab\n */\nexport function isTabKey(event: KeyboardEvent): boolean {\n  return event.key === 'Tab';\n}\n\n/**\n * Checks if the event key is the Home key\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is Home\n */\nexport function isHomeKey(event: KeyboardEvent): boolean {\n  return event.key === 'Home';\n}\n\n/**\n * Checks if the event key is the End key\n * @param event - The keyboard event to check\n * @returns boolean - true if the key is End\n */\nexport function isEndKey(event: KeyboardEvent): boolean {\n  return event.key === 'End';\n}\n","import { Injectable } from '@angular/core';\nimport { getFocusableElements } from '../utils/keyboard-utils';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * Configuration for focus trap behavior\n */\nexport interface FocusTrapConfig {\n  /** The container element to trap focus within */\n  container: HTMLElement;\n  /** Where to set initial focus: 'first' focusable, 'container', or specific element */\n  initialFocus?: HTMLElement | 'first' | 'container';\n  /** Whether to restore focus to previous element on deactivate (default: true) */\n  returnFocusOnDeactivate?: boolean;\n}\n\n/**\n * Internal state for an active focus trap\n */\ninterface FocusTrapState {\n  previousFocus: HTMLElement | null;\n  keydownHandler: (e: KeyboardEvent) => void;\n}\n\n/**\n * FocusTrapService manages focus trapping within modal components.\n *\n * Focus trapping ensures that Tab and Shift+Tab navigation cycles within\n * a container element, preventing focus from escaping to elements outside\n * the modal. This is essential for accessibility in dialogs, popovers,\n * and other modal components.\n *\n * @example\n * ```typescript\n * // In a dialog component\n * @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n *\n * constructor(private focusTrapService: FocusTrapService) {}\n *\n * openDialog(): void {\n *   this.focusTrapService.activate({\n *     container: this.dialogContainer.nativeElement,\n *     initialFocus: 'first',\n *     returnFocusOnDeactivate: true\n *   });\n * }\n *\n * closeDialog(): void {\n *   this.focusTrapService.deactivate(this.dialogContainer.nativeElement);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class FocusTrapService {\n  private activeTraps = new Map<HTMLElement, FocusTrapState>();\n\n  /**\n   * Activates focus trap within a container.\n   *\n   * When activated, Tab and Shift+Tab navigation will cycle within the\n   * container's focusable elements. The previously focused element is\n   * stored for restoration when the trap is deactivated.\n   *\n   * @param config - Configuration for the focus trap\n   */\n  activate(config: FocusTrapConfig): void {\n    if (!config) {\n      CometChatLogger.warn('FocusTrapService', 'Invalid config provided');\n      return;\n    }\n    const { container, initialFocus = 'first', returnFocusOnDeactivate = true } = config;\n\n    // Validate container\n    if (!container) {\n      CometChatLogger.warn('FocusTrapService', 'Invalid container provided');\n      return;\n    }\n\n    // Don't activate if already active for this container\n    if (this.activeTraps.has(container)) {\n      return;\n    }\n\n    // Store the currently focused element for restoration\n    const previousFocus = document.activeElement as HTMLElement;\n\n    // Create keydown handler for Tab cycling\n    const keydownHandler = (event: KeyboardEvent): void => {\n      if (event.key !== 'Tab') {\n        return;\n      }\n\n      const focusableElements = getFocusableElements(container);\n\n      // If no focusable elements, prevent Tab from leaving container\n      if (focusableElements.length === 0) {\n        event.preventDefault();\n        return;\n      }\n\n      const firstElement = focusableElements[0];\n      const lastElement = focusableElements[focusableElements.length - 1];\n\n      // Shift+Tab on first element -> cycle to last\n      if (event.shiftKey && document.activeElement === firstElement) {\n        event.preventDefault();\n        lastElement.focus();\n      }\n      // Tab on last element -> cycle to first\n      else if (!event.shiftKey && document.activeElement === lastElement) {\n        event.preventDefault();\n        firstElement.focus();\n      }\n    };\n\n    // Attach keydown listener to container\n    container.addEventListener('keydown', keydownHandler);\n\n    // Store trap state\n    this.activeTraps.set(container, {\n      previousFocus: returnFocusOnDeactivate ? previousFocus : null,\n      keydownHandler,\n    });\n\n    // Set initial focus (use setTimeout to ensure DOM is ready)\n    setTimeout(() => {\n      this.setInitialFocus(container, initialFocus);\n    }, 0);\n  }\n\n  /**\n   * Deactivates focus trap and optionally restores focus.\n   *\n   * Removes the keydown listener and restores focus to the element\n   * that was focused before the trap was activated (if configured).\n   *\n   * @param container - The container element to deactivate the trap for\n   */\n  deactivate(container: HTMLElement): void {\n    const trap = this.activeTraps.get(container);\n\n    if (!trap) {\n      return;\n    }\n\n    // Remove keydown listener\n    container.removeEventListener('keydown', trap.keydownHandler);\n\n    // Restore focus to previous element\n    if (trap.previousFocus && typeof trap.previousFocus.focus === 'function') {\n      // Use setTimeout to ensure focus restoration happens after any DOM updates\n      setTimeout(() => {\n        // Verify the element is still in the DOM and focusable\n        if (trap.previousFocus && document.body.contains(trap.previousFocus)) {\n          trap.previousFocus.focus({ preventScroll: true });\n        } else {\n          // Previous element was removed from DOM (e.g., deleted item).\n          // Find the closest ancestor of the container that is still in the DOM\n          // and focus it with preventScroll to avoid scroll jumps.\n          const parent = container.parentElement?.closest('[tabindex], [role], button, a, input, select, textarea, .cometchat') as HTMLElement | null;\n          if (parent && document.body.contains(parent)) {\n            parent.focus({ preventScroll: true });\n          }\n        }\n      }, 0);\n    }\n\n    // Remove from active traps\n    this.activeTraps.delete(container);\n  }\n\n  /**\n   * Checks if a container has an active focus trap.\n   *\n   * @param container - The container element to check\n   * @returns boolean - true if the container has an active focus trap\n   */\n  isActive(container: HTMLElement): boolean {\n    return this.activeTraps.has(container);\n  }\n\n  /**\n   * Checks if any focus trap is currently active.\n   *\n   * Useful for parent components (e.g., message list) to determine\n   * whether keyboard events should be suppressed because an overlay\n   * with a focus trap is open.\n   *\n   * @returns boolean - true if at least one focus trap is active\n   */\n  hasActiveTraps(): boolean {\n    return this.activeTraps.size > 0;\n  }\n\n  /**\n   * Sets initial focus based on configuration.\n   *\n   * @param container - The container element\n   * @param initialFocus - Where to set initial focus\n   */\n  private setInitialFocus(\n    container: HTMLElement,\n    initialFocus: HTMLElement | 'first' | 'container'\n  ): void {\n    if (initialFocus === 'container') {\n      // Focus the container itself (requires tabindex)\n      container.focus();\n    } else if (initialFocus === 'first') {\n      // Focus the first focusable element\n      const focusable = getFocusableElements(container);\n      if (focusable.length > 0) {\n        focusable[0].focus();\n      } else {\n        // Fallback to container if no focusable elements\n        container.focus();\n      }\n    } else if (initialFocus instanceof HTMLElement) {\n      // Focus the specified element\n      initialFocus.focus();\n    }\n  }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\n\n/**\n * ARIA live region politeness levels.\n *\n * - 'off': No announcements\n * - 'polite': Announces when user is idle (non-interruptive)\n * - 'assertive': Announces immediately (interruptive)\n */\nexport type AriaLivePoliteness = 'off' | 'polite' | 'assertive';\n\n/**\n * LiveAnnouncerService provides screen reader announcements via ARIA live regions.\n *\n * This service creates a visually hidden element that screen readers monitor\n * for changes. When content is added to this element, screen readers announce\n * it to users. This is essential for communicating dynamic content changes\n * that may not be apparent to users who cannot see the screen.\n *\n * @example\n * ```typescript\n * // In a component\n * constructor(private liveAnnouncer: LiveAnnouncerService) {}\n *\n * onItemDeleted(): void {\n *   this.liveAnnouncer.announce('Item deleted successfully');\n * }\n *\n * onError(message: string): void {\n *   this.liveAnnouncer.announceError(message);\n * }\n *\n * onStatusChange(status: string): void {\n *   this.liveAnnouncer.announceStatus(`Status changed to ${status}`);\n * }\n * ```\n *\n * @usageNotes\n * ### Politeness Levels\n *\n * - Use `'polite'` (default) for non-critical updates that can wait\n *   until the user is idle (e.g., status updates, confirmations)\n * - Use `'assertive'` for critical information that should interrupt\n *   the user immediately (e.g., errors, warnings)\n *\n * ### Best Practices\n *\n * - Keep announcements concise and meaningful\n * - Avoid announcing every minor change\n * - Use `announceError()` for error messages\n * - Use `announceStatus()` for status updates\n *\n * @see https://www.w3.org/WAI/WCAG21/Understanding/status-messages.html\n */\n@Injectable({ providedIn: 'root' })\nexport class LiveAnnouncerService implements OnDestroy {\n  private liveElement: HTMLElement | null = null;\n  private currentTimeout: ReturnType<typeof setTimeout> | null = null;\n\n  /**\n   * Announces a message to screen readers.\n   *\n   * Creates a visually hidden live region element if it doesn't exist,\n   * then updates its content to trigger a screen reader announcement.\n   *\n   * @param message - The message to announce\n   * @param politeness - 'polite' (default) or 'assertive'\n   * @param duration - How long to keep the message (ms), default 1000\n   */\n  announce(message: string, politeness: AriaLivePoliteness = 'polite', duration = 1000): void {\n    // Don't announce empty messages or if politeness is 'off'\n    if (!message || politeness === 'off') {\n      return;\n    }\n\n    this.ensureLiveElement();\n\n    // Clear any pending timeout\n    if (this.currentTimeout) {\n      clearTimeout(this.currentTimeout);\n      this.currentTimeout = null;\n    }\n\n    // Clear current content and set politeness level\n    this.liveElement!.textContent = '';\n    this.liveElement!.setAttribute('aria-live', politeness);\n\n    // Use setTimeout to ensure the change is detected by screen readers.\n    // Screen readers need to see the element empty before new content\n    // is added for the announcement to be triggered.\n    setTimeout(() => {\n      if (this.liveElement) {\n        this.liveElement.textContent = message;\n      }\n    }, 100);\n\n    // Clear the message after duration to prevent re-announcement\n    // if the user navigates back to the element\n    this.currentTimeout = setTimeout(() => {\n      if (this.liveElement) {\n        this.liveElement.textContent = '';\n      }\n      this.currentTimeout = null;\n    }, duration);\n  }\n\n  /**\n   * Announces an error message to screen readers.\n   *\n   * Uses 'assertive' politeness to ensure the error is announced\n   * immediately, interrupting any current speech.\n   *\n   * @param message - The error message to announce\n   */\n  announceError(message: string): void {\n    this.announce(message, 'assertive');\n  }\n\n  /**\n   * Announces a status update to screen readers.\n   *\n   * Uses 'polite' politeness to announce the status when the user\n   * is idle, without interrupting current speech.\n   *\n   * @param message - The status message to announce\n   */\n  announceStatus(message: string): void {\n    this.announce(message, 'polite');\n  }\n\n  /**\n   * Clears any pending announcement and removes the current message.\n   */\n  clear(): void {\n    if (this.currentTimeout) {\n      clearTimeout(this.currentTimeout);\n      this.currentTimeout = null;\n    }\n\n    if (this.liveElement) {\n      this.liveElement.textContent = '';\n    }\n  }\n\n  /**\n   * Creates the visually hidden live region element if it doesn't exist.\n   *\n   * The element is styled to be invisible but still accessible to\n   * screen readers. It uses the 'cometchat-sr-only' class and inline\n   * styles to ensure it's properly hidden across all browsers.\n   */\n  private ensureLiveElement(): void {\n    if (this.liveElement) {\n      return;\n    }\n\n    this.liveElement = document.createElement('div');\n    this.liveElement.setAttribute('aria-live', 'polite');\n    this.liveElement.setAttribute('aria-atomic', 'true');\n    this.liveElement.setAttribute('role', 'status');\n    this.liveElement.className = 'cometchat-sr-only';\n\n    // Visually hidden but accessible to screen readers\n    // Using inline styles ensures the element is hidden even if\n    // the CSS class is not loaded\n    Object.assign(this.liveElement.style, {\n      position: 'absolute',\n      width: '1px',\n      height: '1px',\n      padding: '0',\n      margin: '-1px',\n      overflow: 'hidden',\n      clip: 'rect(0, 0, 0, 0)',\n      whiteSpace: 'nowrap',\n      border: '0',\n    });\n\n    document.body.appendChild(this.liveElement);\n  }\n\n  /**\n   * Cleanup when the service is destroyed.\n   *\n   * Clears any pending timeouts and removes the live region element\n   * from the DOM to prevent memory leaks.\n   */\n  ngOnDestroy(): void {\n    if (this.currentTimeout) {\n      clearTimeout(this.currentTimeout);\n      this.currentTimeout = null;\n    }\n\n    if (this.liveElement && this.liveElement.parentNode) {\n      this.liveElement.parentNode.removeChild(this.liveElement);\n      this.liveElement = null;\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Configuration for list navigation behavior\n */\nexport interface ListNavigationConfig {\n  /** Total number of items in the list */\n  itemCount: number;\n  /** Whether navigation should wrap around at boundaries (default: true) */\n  wrap?: boolean;\n  /** Callback to check if an item at index is disabled */\n  isDisabled?: (index: number) => boolean;\n}\n\n/**\n * ListNavigationService provides keyboard navigation for list components.\n *\n * Implements roving tabindex pattern and arrow key navigation for\n * accessible list navigation. Supports ArrowUp/ArrowDown, Home/End,\n * and wrap-around behavior.\n *\n * @example\n * ```typescript\n * // In a list component\n * private listNavigationService = inject(ListNavigationService);\n * focusedIndex = signal(0);\n *\n * onKeyDown(event: KeyboardEvent): void {\n *   const newIndex = this.listNavigationService.handleKeyNavigation(\n *     event,\n *     this.focusedIndex(),\n *     { itemCount: this.items.length, wrap: true }\n *   );\n *\n *   if (newIndex !== -1 && newIndex !== this.focusedIndex()) {\n *     this.focusedIndex.set(newIndex);\n *     this.focusItem(newIndex);\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class ListNavigationService {\n  /**\n   * Handles keyboard navigation within a list.\n   * Returns the new focused index, or -1 if no navigation occurred.\n   *\n   * @param event - The keyboard event to handle\n   * @param currentIndex - The currently focused index\n   * @param config - Configuration for navigation behavior\n   * @returns number - The new index to focus, or -1 if no navigation\n   */\n  handleKeyNavigation(\n    event: KeyboardEvent,\n    currentIndex: number,\n    config: ListNavigationConfig\n  ): number {\n    if (!event || !config) return -1;\n    const { itemCount, wrap = true, isDisabled } = config;\n\n    if (itemCount === 0) return -1;\n\n    let newIndex = -1;\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        newIndex = currentIndex + 1;\n        if (newIndex >= itemCount) {\n          newIndex = wrap ? 0 : itemCount - 1;\n        }\n        break;\n\n      case 'ArrowUp':\n        event.preventDefault();\n        newIndex = currentIndex - 1;\n        if (newIndex < 0) {\n          newIndex = wrap ? itemCount - 1 : 0;\n        }\n        break;\n\n      case 'Home':\n        event.preventDefault();\n        newIndex = 0;\n        break;\n\n      case 'End':\n        event.preventDefault();\n        newIndex = itemCount - 1;\n        break;\n\n      default:\n        return -1;\n    }\n\n    // Skip disabled items\n    if (isDisabled) {\n      const startIndex = newIndex;\n      // For Home, skip forward; for End, skip backward; for arrows, use arrow direction\n      let direction: number;\n      if (event.key === 'Home') {\n        direction = 1; // Skip forward from first item\n      } else if (event.key === 'End') {\n        direction = -1; // Skip backward from last item\n      } else {\n        direction = event.key === 'ArrowDown' ? 1 : -1;\n      }\n\n      while (isDisabled(newIndex)) {\n        newIndex += direction;\n\n        if (wrap) {\n          if (newIndex < 0) newIndex = itemCount - 1;\n          if (newIndex >= itemCount) newIndex = 0;\n        } else {\n          newIndex = Math.max(0, Math.min(itemCount - 1, newIndex));\n        }\n\n        // Prevent infinite loop if all items are disabled\n        if (newIndex === startIndex) break;\n      }\n    }\n\n    return newIndex;\n  }\n\n  /**\n   * Gets tabindex for an item based on roving tabindex pattern.\n   *\n   * @param index - The item's index\n   * @param focusedIndex - The currently focused index\n   * @returns number - 0 if focused, -1 otherwise\n   */\n  getItemTabIndex(index: number, focusedIndex: number): number {\n    return index === focusedIndex ? 0 : -1;\n  }\n\n  /**\n   * Updates tabindex values for roving tabindex pattern.\n   * Returns a map of index -> tabindex value.\n   *\n   * This is useful when you need to batch-update tabindex values\n   * for all items in a list at once.\n   *\n   * @param itemCount - Total number of items in the list\n   * @param focusedIndex - The currently focused index\n   * @returns Map<number, number> - Map of index to tabindex value\n   *\n   * @example\n   * ```typescript\n   * const tabindexMap = this.listNavigationService.getRovingTabindexMap(5, 2);\n   * // Returns: Map { 0 => -1, 1 => -1, 2 => 0, 3 => -1, 4 => -1 }\n   * ```\n   */\n  getRovingTabindexMap(itemCount: number, focusedIndex: number): Map<number, number> {\n    const map = new Map<number, number>();\n    for (let i = 0; i < itemCount; i++) {\n      map.set(i, i === focusedIndex ? 0 : -1);\n    }\n    return map;\n  }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Configuration for grid navigation behavior\n */\nexport interface GridNavigationConfig {\n  /** Number of rows in the grid */\n  rowCount: number;\n  /** Number of columns in the grid */\n  columnCount: number;\n  /** Total number of items (may be less than rowCount * columnCount) */\n  totalItems: number;\n  /** Whether navigation should wrap around at boundaries (default: true) */\n  wrap?: boolean;\n  /** Callback to check if an item at index is disabled */\n  isDisabled?: (index: number) => boolean;\n}\n\n/**\n * Grid position representation\n */\nexport interface GridPosition {\n  row: number;\n  column: number;\n  index: number;\n}\n\n/**\n * GridNavigationService provides 2D keyboard navigation for grid components.\n *\n * Implements arrow key navigation for grids like sticker/emoji keyboards,\n * supporting ArrowUp/Down for rows, ArrowLeft/Right for columns,\n * Home/End for row navigation, and Ctrl+Home/Ctrl+End for grid navigation.\n *\n * @example\n * ```typescript\n * // In a sticker keyboard component\n * private gridNavigationService = inject(GridNavigationService);\n * focusedIndex = signal(0);\n * readonly COLUMNS = 4;\n *\n * onGridKeyDown(event: KeyboardEvent): void {\n *   const rowCount = Math.ceil(this.stickers.length / this.COLUMNS);\n *   const newIndex = this.gridNavigationService.handleKeyNavigation(\n *     event,\n *     this.focusedIndex(),\n *     { rowCount, columnCount: this.COLUMNS, totalItems: this.stickers.length, wrap: true }\n *   );\n *\n *   if (newIndex !== -1 && newIndex !== this.focusedIndex()) {\n *     this.focusedIndex.set(newIndex);\n *     this.focusSticker(newIndex);\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class GridNavigationService {\n  /**\n   * Converts a linear index to grid position.\n   *\n   * @param index - The linear index\n   * @param columnCount - Number of columns in the grid\n   * @returns GridPosition - The row, column, and index\n   */\n  indexToPosition(index: number, columnCount: number): GridPosition {\n    const row = Math.floor(index / columnCount);\n    const column = index % columnCount;\n    return { row, column, index };\n  }\n\n  /**\n   * Converts grid position to linear index.\n   *\n   * @param row - The row number\n   * @param column - The column number\n   * @param columnCount - Number of columns in the grid\n   * @returns number - The linear index\n   */\n  positionToIndex(row: number, column: number, columnCount: number): number {\n    return row * columnCount + column;\n  }\n\n  /**\n   * Handles keyboard navigation within a grid.\n   * Returns the new focused index, or -1 if no navigation occurred.\n   *\n   * @param event - The keyboard event to handle\n   * @param currentIndex - The currently focused index\n   * @param config - Configuration for navigation behavior\n   * @returns number - The new index to focus, or -1 if no navigation\n   */\n  handleKeyNavigation(\n    event: KeyboardEvent,\n    currentIndex: number,\n    config: GridNavigationConfig\n  ): number {\n    if (!event || !config) return -1;\n    const { rowCount, columnCount, totalItems, wrap = true, isDisabled } = config;\n\n    if (totalItems === 0) return -1;\n\n    const currentPos = this.indexToPosition(currentIndex, columnCount);\n    let newRow = currentPos.row;\n    let newColumn = currentPos.column;\n    let newIndex = -1;\n\n    switch (event.key) {\n      case 'ArrowRight':\n        event.preventDefault();\n        newColumn = currentPos.column + 1;\n        if (newColumn >= columnCount) {\n          newColumn = wrap ? 0 : columnCount - 1;\n        }\n        newIndex = this.positionToIndex(newRow, newColumn, columnCount);\n        break;\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        newColumn = currentPos.column - 1;\n        if (newColumn < 0) {\n          newColumn = wrap ? columnCount - 1 : 0;\n        }\n        newIndex = this.positionToIndex(newRow, newColumn, columnCount);\n        break;\n\n      case 'ArrowDown':\n        event.preventDefault();\n        newRow = currentPos.row + 1;\n        if (newRow >= rowCount) {\n          newRow = wrap ? 0 : rowCount - 1;\n        }\n        newIndex = this.positionToIndex(newRow, newColumn, columnCount);\n        break;\n\n      case 'ArrowUp':\n        event.preventDefault();\n        newRow = currentPos.row - 1;\n        if (newRow < 0) {\n          newRow = wrap ? rowCount - 1 : 0;\n        }\n        newIndex = this.positionToIndex(newRow, newColumn, columnCount);\n        break;\n\n      case 'Home':\n        event.preventDefault();\n        if (event.ctrlKey) {\n          // Ctrl+Home: Go to first item in grid\n          newIndex = 0;\n        } else {\n          // Home: Go to first item in current row\n          newIndex = this.positionToIndex(newRow, 0, columnCount);\n        }\n        break;\n\n      case 'End':\n        event.preventDefault();\n        if (event.ctrlKey) {\n          // Ctrl+End: Go to last item in grid\n          newIndex = totalItems - 1;\n        } else {\n          // End: Go to last item in current row\n          const lastColumnInRow = Math.min(columnCount - 1, totalItems - 1 - newRow * columnCount);\n          newIndex = this.positionToIndex(newRow, lastColumnInRow, columnCount);\n        }\n        break;\n\n      default:\n        return -1;\n    }\n\n    // Ensure index is within bounds\n    if (newIndex >= totalItems) {\n      newIndex = wrap ? newIndex % totalItems : totalItems - 1;\n    }\n\n    // Skip disabled items\n    if (newIndex !== -1 && isDisabled) {\n      const startIndex = newIndex;\n      const direction = event.key === 'ArrowRight' || event.key === 'ArrowDown' ? 1 : -1;\n\n      while (isDisabled(newIndex)) {\n        newIndex += direction;\n        if (newIndex < 0) newIndex = wrap ? totalItems - 1 : 0;\n        if (newIndex >= totalItems) newIndex = wrap ? 0 : totalItems - 1;\n        if (newIndex === startIndex) break; // Prevent infinite loop\n      }\n    }\n\n    return newIndex;\n  }\n\n  /**\n   * Gets tabindex for an item based on roving tabindex pattern.\n   *\n   * @param index - The item's index\n   * @param focusedIndex - The currently focused index\n   * @returns number - 0 if focused, -1 otherwise\n   */\n  getItemTabIndex(index: number, focusedIndex: number): number {\n    return index === focusedIndex ? 0 : -1;\n  }\n\n  /**\n   * Calculates row and column from linear index.\n   * Alias for indexToPosition with simplified return type.\n   *\n   * @param index - The linear index\n   * @param columns - Number of columns in the grid\n   * @returns Object with row and col properties\n   */\n  getRowCol(index: number, columns: number): { row: number; col: number } {\n    return {\n      row: Math.floor(index / columns),\n      col: index % columns,\n    };\n  }\n\n  /**\n   * Calculates linear index from row and column.\n   * Alias for positionToIndex.\n   *\n   * @param row - The row number\n   * @param col - The column number\n   * @param columns - Number of columns in the grid\n   * @returns The linear index\n   */\n  getIndex(row: number, col: number, columns: number): number {\n    return row * columns + col;\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { LiveAnnouncerService } from './live-announcer.service';\nimport { CometChatLocalize } from '../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Call type for announcements\n */\nexport type CallType = 'audio' | 'video';\n\n/**\n * Call status for announcements\n */\nexport type CallStatus =\n  | 'incoming'\n  | 'outgoing'\n  | 'connected'\n  | 'ended'\n  | 'declined'\n  | 'canceled'\n  | 'failed';\n\n/**\n * CallAnnouncerService provides screen reader announcements for call events.\n *\n * Uses assertive announcements for time-sensitive call events to ensure\n * screen reader users are immediately notified of incoming calls,\n * call status changes, and call termination.\n *\n * @example\n * ```typescript\n * // In an incoming call component\n * private callAnnouncer = inject(CallAnnouncerService);\n *\n * ngOnInit(): void {\n *   this.callAnnouncer.announceIncomingCall(this.callerName, 'video');\n * }\n *\n * onCallAccepted(): void {\n *   this.callAnnouncer.announceCallConnected();\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class CallAnnouncerService {\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  /**\n   * Announces an incoming call (assertive - immediate).\n   *\n   * @param callerName - Name of the caller\n   * @param callType - Type of call ('audio' or 'video')\n   */\n  announceIncomingCall(callerName: string, callType: CallType): void {\n    const typeKey = callType === 'video' ? 'video' : 'voice';\n    const typeLabel = CometChatLocalize.getLocalizedString(`accessibility_${typeKey}_call`);\n    const message = CometChatLocalize.getLocalizedString('accessibility_incoming_call')\n      .replace('{type}', typeLabel)\n      .replace('{name}', callerName);\n\n    this.liveAnnouncer.announce(message, 'assertive', 3000);\n  }\n\n  /**\n   * Announces outgoing call initiation.\n   *\n   * @param receiverName - Name of the call recipient\n   */\n  announceOutgoingCall(receiverName: string): void {\n    const message = CometChatLocalize.getLocalizedString('accessibility_calling').replace(\n      '{name}',\n      receiverName\n    );\n\n    this.liveAnnouncer.announce(message, 'assertive', 2000);\n  }\n\n  /**\n   * Announces call connected.\n   */\n  announceCallConnected(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_call_connected'),\n      'assertive',\n      2000\n    );\n  }\n\n  /**\n   * Announces call ended.\n   */\n  announceCallEnded(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_call_ended'),\n      'assertive',\n      2000\n    );\n  }\n\n  /**\n   * Announces call declined.\n   */\n  announceCallDeclined(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_call_declined'),\n      'assertive',\n      2000\n    );\n  }\n\n  /**\n   * Announces call canceled.\n   */\n  announceCallCanceled(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_call_canceled'),\n      'assertive',\n      2000\n    );\n  }\n\n  /**\n   * Announces call failed with optional reason.\n   *\n   * @param reason - Optional reason for call failure\n   */\n  announceCallFailed(reason?: string): void {\n    let message = CometChatLocalize.getLocalizedString('accessibility_call_failed');\n    if (reason) {\n      message += `: ${reason}`;\n    }\n    this.liveAnnouncer.announce(message, 'assertive', 3000);\n  }\n\n  /**\n   * Announces call initiation (starting voice/video call).\n   *\n   * @param callType - Type of call being initiated\n   */\n  announceCallInitiation(callType: CallType): void {\n    const typeKey = callType === 'video' ? 'video' : 'voice';\n    const typeLabel = CometChatLocalize.getLocalizedString(`accessibility_${typeKey}_call`);\n    const message = CometChatLocalize.getLocalizedString('accessibility_starting_call').replace(\n      '{type}',\n      typeLabel\n    );\n\n    this.liveAnnouncer.announce(message, 'polite', 2000);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { FocusTrapService, FocusTrapConfig } from './focus-trap.service';\nimport { getFocusableElements } from '../utils/keyboard-utils';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * Configuration for dialog focus management\n */\nexport interface DialogConfig extends FocusTrapConfig {\n  /** Element ID for aria-labelledby */\n  labelledById?: string;\n  /** Element ID for aria-describedby */\n  describedById?: string;\n  /** Whether to close on Escape key (default: true) */\n  closeOnEscape?: boolean;\n  /** Callback when Escape is pressed */\n  onEscape?: () => void;\n}\n\n/**\n * Internal state for an active dialog\n */\ninterface DialogState {\n  config: DialogConfig;\n  escapeHandler: (e: KeyboardEvent) => void;\n}\n\n/**\n * DialogFocusManager provides focus management for modal dialogs.\n *\n * Extends FocusTrapService with dialog-specific features including\n * ARIA attribute management, Escape key handling, and initial focus\n * management. Ensures consistent focus behavior across all dialog\n * components.\n *\n * @example\n * ```typescript\n * // In a dialog component\n * private dialogFocusManager = inject(DialogFocusManager);\n *\n * @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n * @ViewChild('closeButton') closeButton!: ElementRef<HTMLButtonElement>;\n *\n * ngAfterViewInit(): void {\n *   this.dialogFocusManager.openDialog({\n *     container: this.dialogContainer.nativeElement,\n *     initialFocus: this.closeButton.nativeElement,\n *     labelledById: 'dialog-title',\n *     closeOnEscape: true,\n *     onEscape: () => this.close(),\n *   });\n * }\n *\n * ngOnDestroy(): void {\n *   this.dialogFocusManager.closeDialog(this.dialogContainer.nativeElement);\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class DialogFocusManager {\n  private focusTrapService = inject(FocusTrapService);\n  private activeDialogs = new Map<HTMLElement, DialogState>();\n\n  /**\n   * Opens a dialog with focus management.\n   *\n   * Sets ARIA attributes, activates focus trap, and handles Escape key.\n   *\n   * @param config - Configuration for the dialog\n   */\n  openDialog(config: DialogConfig): void {\n    if (!config) {\n      CometChatLogger.warn('DialogFocusManager', 'Invalid config provided');\n      return;\n    }\n    const { container, closeOnEscape = true, onEscape } = config;\n\n    // Validate container\n    if (!container) {\n      CometChatLogger.warn('DialogFocusManager', 'Invalid container provided');\n      return;\n    }\n\n    // Don't open if already active for this container\n    if (this.activeDialogs.has(container)) {\n      return;\n    }\n\n    // Set ARIA attributes\n    container.setAttribute('aria-modal', 'true');\n\n    if (config.labelledById) {\n      container.setAttribute('aria-labelledby', config.labelledById);\n    }\n    if (config.describedById) {\n      container.setAttribute('aria-describedby', config.describedById);\n    }\n\n    // Setup escape handler\n    const escapeHandler = (event: KeyboardEvent): void => {\n      if (event.key === 'Escape' && closeOnEscape) {\n        event.preventDefault();\n        event.stopPropagation();\n        onEscape?.();\n      }\n    };\n\n    container.addEventListener('keydown', escapeHandler);\n\n    // Store dialog state\n    this.activeDialogs.set(container, { config, escapeHandler });\n\n    // Activate focus trap\n    this.focusTrapService.activate(config);\n  }\n\n  /**\n   * Closes a dialog and restores focus.\n   *\n   * Removes ARIA attributes, deactivates focus trap, and restores\n   * focus to the previously focused element.\n   *\n   * @param container - The dialog container element\n   */\n  closeDialog(container: HTMLElement): void {\n    const dialog = this.activeDialogs.get(container);\n    if (!dialog) return;\n\n    // Remove escape handler\n    container.removeEventListener('keydown', dialog.escapeHandler);\n\n    // Remove ARIA attributes\n    container.removeAttribute('aria-modal');\n    container.removeAttribute('aria-labelledby');\n    container.removeAttribute('aria-describedby');\n\n    // Deactivate focus trap (restores focus)\n    this.focusTrapService.deactivate(container);\n\n    // Clean up\n    this.activeDialogs.delete(container);\n  }\n\n  /**\n   * Focuses the first focusable element or close button in a dialog.\n   *\n   * Looks for an element with [data-dialog-close] attribute first,\n   * then falls back to the first focusable element.\n   *\n   * @param container - The dialog container element\n   */\n  focusFirstOrClose(container: HTMLElement): void {\n    if (!container) return;\n    const closeButton = container.querySelector('[data-dialog-close]') as HTMLElement;\n    if (closeButton) {\n      closeButton.focus();\n      return;\n    }\n\n    const focusable = getFocusableElements(container);\n    if (focusable.length > 0) {\n      focusable[0].focus();\n    }\n  }\n\n  /**\n   * Checks if a dialog is currently active.\n   *\n   * @param container - The dialog container element\n   * @returns boolean - true if the dialog is active\n   */\n  isDialogActive(container: HTMLElement): boolean {\n    return this.activeDialogs.has(container);\n  }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\n\n/**\n * Configuration for type-ahead search behavior\n */\nexport interface TypeAheadConfig<T> {\n  /** Function to get searchable text from an item */\n  getSearchText: (item: T) => string;\n  /** Timeout in ms before buffer resets (default: 500) */\n  timeout?: number;\n}\n\n/**\n * TypeAheadService provides character-based search for list components.\n *\n * Implements type-ahead search pattern where characters typed in quick\n * succession are collected into a buffer and matched against item names.\n * The buffer resets after a configurable timeout (default 500ms).\n *\n * Supports wrap-around search from current position to find the next\n * matching item.\n *\n * @example\n * ```typescript\n * // In a list component\n * private typeAheadService = inject(TypeAheadService);\n * focusedIndex = signal(0);\n *\n * onKeyDown(event: KeyboardEvent): void {\n *   // Only handle printable characters\n *   if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n *     const newIndex = this.typeAheadService.handleCharacter(\n *       event.key,\n *       this.items,\n *       this.focusedIndex(),\n *       { getSearchText: (item) => item.name }\n *     );\n *\n *     if (newIndex !== -1) {\n *       this.focusedIndex.set(newIndex);\n *       this.focusItem(newIndex);\n *     }\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class TypeAheadService implements OnDestroy {\n  private buffer = '';\n  private timeoutId: ReturnType<typeof setTimeout> | null = null;\n  private readonly DEFAULT_TIMEOUT = 500;\n\n  /**\n   * Handles a character input for type-ahead search.\n   * Returns the index of the matching item, or -1 if no match.\n   *\n   * Characters are collected into a buffer and matched against item names.\n   * The search starts from the current position + 1 and wraps around to\n   * find the next matching item.\n   *\n   * @param char - The character typed by the user\n   * @param items - The list of items to search\n   * @param currentIndex - The currently focused index\n   * @param config - Configuration for search behavior\n   * @returns number - The index of the matching item, or -1 if no match\n   */\n  handleCharacter<T>(\n    char: string,\n    items: T[],\n    currentIndex: number,\n    config: TypeAheadConfig<T>\n  ): number {\n    // Guard against null/undefined parameters\n    if (!char || !items || !config) {\n      return -1;\n    }\n\n    // Only handle printable characters (single character, not space)\n    if (char.length !== 1 || char === ' ') {\n      return -1;\n    }\n\n    // Clear existing timeout\n    if (this.timeoutId !== null) {\n      clearTimeout(this.timeoutId);\n    }\n\n    // Add character to buffer\n    this.buffer += char.toLowerCase();\n\n    // Set timeout to clear buffer\n    this.timeoutId = setTimeout(() => {\n      this.buffer = '';\n      this.timeoutId = null;\n    }, config.timeout ?? this.DEFAULT_TIMEOUT);\n\n    // Search for matching item starting from current index + 1\n    const searchFrom = currentIndex + 1;\n\n    // First, search from current position to end\n    for (let i = searchFrom; i < items.length; i++) {\n      const text = config.getSearchText(items[i]).toLowerCase();\n      if (text.startsWith(this.buffer)) {\n        return i;\n      }\n    }\n\n    // Then, search from start to current position (wrap around)\n    for (let i = 0; i < searchFrom && i < items.length; i++) {\n      const text = config.getSearchText(items[i]).toLowerCase();\n      if (text.startsWith(this.buffer)) {\n        return i;\n      }\n    }\n\n    return -1;\n  }\n\n  /**\n   * Clears the type-ahead buffer manually.\n   *\n   * Call this when the list loses focus or when you want to reset\n   * the search state.\n   */\n  clearBuffer(): void {\n    this.buffer = '';\n    if (this.timeoutId !== null) {\n      clearTimeout(this.timeoutId);\n      this.timeoutId = null;\n    }\n  }\n\n  /**\n   * Cleanup on service destruction.\n   */\n  ngOnDestroy(): void {\n    this.clearBuffer();\n  }\n}\n","/**\n * ListSelectionManager Class\n *\n * Manages list item selection with keyboard support for accessibility.\n * Provides methods for single/multiple selection, range selection, and selection state management.\n * @see Requirements 3.3-3.7, 5.3, 7.3, 9.3, 13.1-13.7\n */\n\nimport { signal, computed, Signal, WritableSignal } from '@angular/core';\nimport { SelectionMode } from '../Enums/Enums';\nimport { ListSelectionState } from './list-selection-manager.types';\n\nexport type { ListSelectionState };\n\n/**\n * ListSelectionManager handles all selection-related operations for list components.\n * Supports single/multiple selection, range selection, and keyboard navigation.\n * @typeParam T - The type of items being selected\n * @see Requirements 3.3-3.7, 5.3, 7.3, 9.3, 13.1-13.7\n */\nexport class ListSelectionManager<T> {\n  private _selectedIds: WritableSignal<Set<string>> = signal(new Set<string>());\n  private _lastSelectedIndex: WritableSignal<number> = signal(-1);\n  private _anchorIndex: WritableSignal<number> = signal(-1);\n\n  private _lastSelectedId: WritableSignal<string | null> = signal(null);\n\n  /** Count of selected items. @see Requirements 13.6 */\n  readonly selectedCount: Signal<number> = computed(() => this._selectedIds().size);\n  /** Whether any items are selected. */\n  readonly hasSelection: Signal<boolean> = computed(() => this._selectedIds().size > 0);\n  /** Read-only signal exposing the selected IDs set. */\n  readonly selectedIds: Signal<Set<string>> = computed(() => new Set(this._selectedIds()));\n\n  constructor(\n    private mode: SelectionMode,\n    private getId: (item: T) => string\n  ) {}\n\n  /** Toggles selection for an item (Space key behavior). @see Requirements 3.3, 5.3, 7.3, 9.3, 13.1-13.3 */\n  toggleSelection(item: T, index: number): boolean {\n    if (this.mode === SelectionMode.none) {\n      return false;\n    }\n\n    const id = this.getId(item);\n    const currentSelection = this._selectedIds();\n    const wasSelected = currentSelection.has(id);\n\n    if (this.mode === SelectionMode.single) {\n      const newSelection = new Set<string>();\n      if (!wasSelected) newSelection.add(id);\n      this._selectedIds.set(newSelection);\n    } else if (this.mode === SelectionMode.multiple) {\n      const newSelection = new Set(currentSelection);\n      if (wasSelected) { newSelection.delete(id); } else { newSelection.add(id); }\n      this._selectedIds.set(newSelection);\n    }\n\n    this._lastSelectedIndex.set(index);\n    this._anchorIndex.set(index);\n    this._lastSelectedId.set(wasSelected ? null : id);\n\n    return !wasSelected;\n  }\n\n  /** Extends selection to include an item (Shift+Arrow behavior). @see Requirements 3.4, 3.5 */\n  extendSelection(item: T, index: number): void {\n    if (this.mode !== SelectionMode.multiple) {\n      return;\n    }\n\n    const id = this.getId(item);\n    const newSelection = new Set(this._selectedIds());\n    newSelection.add(id);\n    this._selectedIds.set(newSelection);\n    this._lastSelectedIndex.set(index);\n    this._lastSelectedId.set(id);\n  }\n\n  /** Selects all items between anchor and current index (Shift+Space). @see Requirements 13.4 */\n  selectRange(items: T[], currentIndex: number): void {\n    if (this.mode !== SelectionMode.multiple) return;\n\n    const anchor = this._anchorIndex();\n    if (anchor === -1) {\n      if (currentIndex >= 0 && currentIndex < items.length) {\n        this.toggleSelection(items[currentIndex], currentIndex);\n      }\n      return;\n    }\n\n    const start = Math.min(anchor, currentIndex);\n    const end = Math.max(anchor, currentIndex);\n    const newSelection = new Set(this._selectedIds());\n    for (let i = start; i <= end; i++) {\n      if (i >= 0 && i < items.length) newSelection.add(this.getId(items[i]));\n    }\n    this._selectedIds.set(newSelection);\n    this._lastSelectedIndex.set(currentIndex);\n    if (currentIndex >= 0 && currentIndex < items.length) {\n      this._lastSelectedId.set(this.getId(items[currentIndex]));\n    }\n  }\n\n  /** Selects all items (Ctrl/Cmd+A). @see Requirements 3.6 */\n  selectAll(items: T[]): void {\n    if (this.mode !== SelectionMode.multiple) return;\n    const newSelection = new Set<string>();\n    items.forEach(item => newSelection.add(this.getId(item)));\n    this._selectedIds.set(newSelection);\n  }\n\n  /** Clears all selections (Escape). @see Requirements 3.7 */\n  clearSelection(): void {\n    this._selectedIds.set(new Set());\n    this._lastSelectedIndex.set(-1);\n    this._anchorIndex.set(-1);\n    this._lastSelectedId.set(null);\n  }\n\n  /** Checks if an item is currently selected. */\n  isSelected(item: T): boolean { return this._selectedIds().has(this.getId(item)); }\n\n  /** Checks if an item ID is currently selected. */\n  isSelectedById(id: string): boolean { return this._selectedIds().has(id); }\n\n  /** Gets the current selection state. @see Requirements 13.5 */\n  getSelectionState(): ListSelectionState {\n    return { mode: this.mode, selectedIds: new Set(this._selectedIds()), lastSelectedId: this._lastSelectedId(), anchorIndex: this._anchorIndex() };\n  }\n\n  /** Gets the array of selected item IDs. */\n  getSelectedIdsArray(): string[] { return Array.from(this._selectedIds()); }\n\n  /** Sets the selection mode. Clears selection when switching to single/none. */\n  setMode(mode: SelectionMode): void {\n    const previousMode = this.mode;\n    this.mode = mode;\n    if (previousMode === SelectionMode.multiple && mode === SelectionMode.single && this._selectedIds().size > 1) {\n      this.clearSelection();\n    }\n    if (mode === SelectionMode.none) this.clearSelection();\n  }\n\n  /** Gets the current selection mode. */\n  getMode(): SelectionMode { return this.mode; }\n\n  /** Sets the anchor index for range selection. */\n  setAnchorIndex(index: number): void { this._anchorIndex.set(index); }\n\n  /** Gets the current anchor index, or -1 if not set. */\n  getAnchorIndex(): number { return this._anchorIndex(); }\n\n  /** Gets the last selected index, or -1 if none. */\n  getLastSelectedIndex(): number { return this._lastSelectedIndex(); }\n\n  /** Programmatically selects an item without toggling. */\n  select(item: T, index: number): void {\n    if (this.mode === SelectionMode.none) return;\n    const id = this.getId(item);\n    if (this.mode === SelectionMode.single) {\n      this._selectedIds.set(new Set([id]));\n    } else {\n      const newSelection = new Set(this._selectedIds());\n      newSelection.add(id);\n      this._selectedIds.set(newSelection);\n    }\n    this._lastSelectedIndex.set(index);\n    this._anchorIndex.set(index);\n    this._lastSelectedId.set(id);\n  }\n\n  /** Programmatically deselects an item. */\n  deselect(item: T): void {\n    const newSelection = new Set(this._selectedIds());\n    newSelection.delete(this.getId(item));\n    this._selectedIds.set(newSelection);\n  }\n\n  /** Programmatically deselects an item by ID. */\n  deselectById(id: string): void {\n    const newSelection = new Set(this._selectedIds());\n    newSelection.delete(id);\n    this._selectedIds.set(newSelection);\n  }\n\n  /** Sets the selection to a specific set of items. */\n  setSelection(items: T[]): void {\n    if (this.mode === SelectionMode.none) return;\n    if (this.mode === SelectionMode.single && items.length > 1) {\n      this._selectedIds.set(new Set([this.getId(items[0])]));\n    } else {\n      const newSelection = new Set<string>();\n      items.forEach(item => newSelection.add(this.getId(item)));\n      this._selectedIds.set(newSelection);\n    }\n  }\n\n  /** Sets the selection to a specific set of item IDs. */\n  setSelectionByIds(ids: string[]): void {\n    if (this.mode === SelectionMode.none) return;\n    if (this.mode === SelectionMode.single && ids.length > 1) {\n      this._selectedIds.set(new Set([ids[0]]));\n    } else {\n      this._selectedIds.set(new Set(ids));\n    }\n  }\n}\n","import { Injectable } from '@angular/core';\n\n/**\n * Configuration for media playback controls\n */\nexport interface MediaControlsConfig {\n  /** Current playback position in seconds */\n  currentTime: number;\n  /** Total duration in seconds */\n  duration: number;\n  /** Whether media is currently playing */\n  isPlaying: boolean;\n  /** Seek increment in seconds (default: 5) */\n  seekIncrement?: number;\n}\n\n/**\n * Result of handling a media control keyboard event\n */\nexport interface MediaControlsResult {\n  /** The action to perform */\n  action: 'play' | 'pause' | 'seek' | 'seekStart' | 'seekEnd' | 'none';\n  /** The time to seek to (only present for seek actions) */\n  seekTime?: number;\n}\n\n/**\n * MediaControlsService provides keyboard controls for audio/video playback.\n *\n * Implements standard media keyboard shortcuts:\n * - Space/Enter: Toggle play/pause\n * - ArrowRight: Seek forward (default 5 seconds)\n * - ArrowLeft: Seek backward (default 5 seconds)\n * - Home: Seek to start\n * - End: Seek to end\n *\n * Also provides helper methods for screen reader accessibility:\n * - formatTimeForAnnouncement: Formats time for screen reader announcement\n * - getPlayPauseLabel: Gets aria-label for play/pause button\n * - getProgressValueText: Gets aria-valuetext for progress slider\n *\n * @example\n * ```typescript\n * // In an audio bubble component\n * private mediaControlsService = inject(MediaControlsService);\n *\n * onAudioKeyDown(event: KeyboardEvent): void {\n *   const result = this.mediaControlsService.handleKeyDown(event, {\n *     currentTime: this.currentTime(),\n *     duration: this.duration(),\n *     isPlaying: this.isPlaying(),\n *     seekIncrement: 5\n *   });\n *\n *   switch (result.action) {\n *     case 'play':\n *       this.play();\n *       break;\n *     case 'pause':\n *       this.pause();\n *       break;\n *     case 'seek':\n *     case 'seekStart':\n *     case 'seekEnd':\n *       this.seekTo(result.seekTime!);\n *       break;\n *   }\n * }\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MediaControlsService {\n  private readonly DEFAULT_SEEK_INCREMENT = 5;\n\n  /**\n   * Handles keyboard events for media playback controls.\n   * Returns the action to perform based on the key pressed.\n   *\n   * @param event - The keyboard event to handle\n   * @param config - Configuration with current playback state\n   * @returns MediaControlsResult - The action to perform\n   */\n  handleKeyDown(event: KeyboardEvent, config: MediaControlsConfig): MediaControlsResult {\n    if (!event || !config) return { action: 'none' };\n    const {\n      currentTime,\n      duration,\n      isPlaying,\n      seekIncrement = this.DEFAULT_SEEK_INCREMENT,\n    } = config;\n\n    switch (event.key) {\n      case ' ':\n      case 'Enter':\n        event.preventDefault();\n        return { action: isPlaying ? 'pause' : 'play' };\n\n      case 'ArrowRight':\n        event.preventDefault();\n        const forwardTime = Math.min(currentTime + seekIncrement, duration);\n        return { action: 'seek', seekTime: forwardTime };\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        const backwardTime = Math.max(currentTime - seekIncrement, 0);\n        return { action: 'seek', seekTime: backwardTime };\n\n      case 'Home':\n        event.preventDefault();\n        return { action: 'seekStart', seekTime: 0 };\n\n      case 'End':\n        event.preventDefault();\n        return { action: 'seekEnd', seekTime: duration };\n\n      default:\n        return { action: 'none' };\n    }\n  }\n\n  /**\n   * Formats time in seconds for screen reader announcement.\n   * Returns a human-readable string like \"2 minutes 30 seconds\" or \"45 seconds\".\n   *\n   * @param seconds - The time in seconds to format\n   * @returns string - Human-readable time string\n   */\n  formatTimeForAnnouncement(seconds: number): string {\n    const mins = Math.floor(seconds / 60);\n    const secs = Math.floor(seconds % 60);\n\n    if (mins === 0) {\n      return secs === 1 ? '1 second' : `${secs} seconds`;\n    }\n\n    const minuteText = mins === 1 ? '1 minute' : `${mins} minutes`;\n    const secondText = secs === 1 ? '1 second' : `${secs} seconds`;\n\n    if (secs === 0) {\n      return minuteText;\n    }\n\n    return `${minuteText} ${secondText}`;\n  }\n\n  /**\n   * Gets the aria-label for a play/pause button based on current state.\n   *\n   * @param isPlaying - Whether media is currently playing\n   * @returns string - \"Pause\" if playing, \"Play\" if paused\n   */\n  getPlayPauseLabel(isPlaying: boolean): string {\n    return isPlaying ? 'Pause' : 'Play';\n  }\n\n  /**\n   * Gets the aria-valuetext for a progress slider.\n   * Returns a string like \"2 minutes 30 seconds of 5 minutes\".\n   *\n   * @param currentTime - Current playback position in seconds\n   * @param duration - Total duration in seconds\n   * @returns string - Human-readable progress text\n   */\n  getProgressValueText(currentTime: number, duration: number): string {\n    const current = this.formatTimeForAnnouncement(currentTime);\n    const total = this.formatTimeForAnnouncement(duration);\n    return `${current} of ${total}`;\n  }\n}\n","import { Injectable, signal } from '@angular/core';\n\n/**\n * Represents a mention suggestion in the autocomplete panel\n */\nexport interface MentionSuggestion {\n  /** Unique identifier for the suggestion */\n  id: string;\n  /** Display name for the suggestion */\n  name: string;\n  /** Optional avatar URL */\n  avatar?: string;\n}\n\n/**\n * Callbacks for mentions navigation events\n */\nexport interface MentionsNavigationCallbacks {\n  /** Called when a suggestion is selected */\n  onSelect: (suggestion: MentionSuggestion) => void;\n  /** Called when the mentions panel should close */\n  onClose: () => void;\n}\n\n/**\n * MentionsNavigationService provides keyboard navigation for mentions autocomplete.\n *\n * Implements the combobox pattern with aria-activedescendant for accessible\n * mentions autocomplete. Supports ArrowUp/Down navigation, Enter/Tab selection,\n * and Escape to close.\n *\n * Uses Angular signals for reactive state management of the highlighted index.\n *\n * @example\n * ```typescript\n * // In a message composer component\n * private mentionsService = inject(MentionsNavigationService);\n *\n * onComposerKeyDown(event: KeyboardEvent): void {\n *   if (this.isMentionsPanelOpen()) {\n *     const handled = this.mentionsService.handleKeyDown(\n *       event,\n *       this.suggestions(),\n *       {\n *         onSelect: (suggestion) => this.insertMention(suggestion),\n *         onClose: () => this.closeMentionsPanel()\n *       }\n *     );\n *\n *     if (handled) return;\n *   }\n *   // Handle other keys...\n * }\n *\n * // In template, use aria-activedescendant\n * <input\n *   [attr.aria-activedescendant]=\"mentionsService.getActiveDescendantId('mentions-list')\"\n *   [attr.aria-controls]=\"isMentionsPanelOpen() ? 'mentions-list' : null\"\n * />\n * ```\n */\n@Injectable({ providedIn: 'root' })\nexport class MentionsNavigationService {\n  /**\n   * Signal tracking the currently highlighted suggestion index.\n   * -1 indicates no suggestion is highlighted.\n   */\n  private highlightedIndex = signal(-1);\n\n  /**\n   * Handles keyboard navigation in the mentions panel.\n   * Returns true if the event was handled, false otherwise.\n   *\n   * Supported keys:\n   * - ArrowDown: Move to next suggestion (wraps to first)\n   * - ArrowUp: Move to previous suggestion (wraps to last)\n   * - Enter/Tab: Select the highlighted suggestion\n   * - Escape: Close the mentions panel\n   *\n   * @param event - The keyboard event to handle\n   * @param suggestions - Array of available suggestions\n   * @param callbacks - Callbacks for selection and close events\n   * @returns boolean - true if the event was handled\n   */\n  handleKeyDown(\n    event: KeyboardEvent,\n    suggestions: MentionSuggestion[],\n    callbacks: MentionsNavigationCallbacks\n  ): boolean {\n    if (!event || !suggestions || !callbacks || suggestions.length === 0) return false;\n\n    const currentIndex = this.highlightedIndex();\n\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        const nextIndex = currentIndex < suggestions.length - 1 ? currentIndex + 1 : 0;\n        this.highlightedIndex.set(nextIndex);\n        return true;\n\n      case 'ArrowUp':\n        event.preventDefault();\n        const prevIndex = currentIndex > 0 ? currentIndex - 1 : suggestions.length - 1;\n        this.highlightedIndex.set(prevIndex);\n        return true;\n\n      case 'Enter':\n      case 'Tab':\n        if (currentIndex >= 0 && currentIndex < suggestions.length) {\n          event.preventDefault();\n          callbacks.onSelect(suggestions[currentIndex]);\n          this.reset();\n          return true;\n        }\n        return false;\n\n      case 'Escape':\n        event.preventDefault();\n        callbacks.onClose();\n        this.reset();\n        return true;\n\n      default:\n        return false;\n    }\n  }\n\n  /**\n   * Gets the currently highlighted index.\n   *\n   * @returns number - The highlighted index, or -1 if none\n   */\n  getHighlightedIndex(): number {\n    return this.highlightedIndex();\n  }\n\n  /**\n   * Sets the highlighted index.\n   * Use this to programmatically highlight a suggestion,\n   * for example when the suggestions list changes.\n   *\n   * @param index - The index to highlight (-1 for none)\n   */\n  setHighlightedIndex(index: number): void {\n    this.highlightedIndex.set(index);\n  }\n\n  /**\n   * Resets the highlighted index to -1 (no selection).\n   * Call this when closing the mentions panel or when\n   * the suggestions list is cleared.\n   */\n  reset(): void {\n    this.highlightedIndex.set(-1);\n  }\n\n  /**\n   * Gets the ID for aria-activedescendant attribute.\n   * Returns null if no suggestion is highlighted.\n   *\n   * The returned ID follows the pattern: `{baseId}-option-{index}`\n   *\n   * @param baseId - The base ID for the suggestions list\n   * @returns string | null - The active descendant ID, or null if none\n   *\n   * @example\n   * ```html\n   * <input\n   *   role=\"combobox\"\n   *   [attr.aria-activedescendant]=\"mentionsService.getActiveDescendantId('mentions-list')\"\n   * />\n   * <ul id=\"mentions-list\" role=\"listbox\">\n   *   <li *ngFor=\"let s of suggestions; let i = index\"\n   *       [id]=\"'mentions-list-option-' + i\"\n   *       role=\"option\">\n   *     {{ s.name }}\n   *   </li>\n   * </ul>\n   * ```\n   */\n  getActiveDescendantId(baseId: string): string | null {\n    const index = this.highlightedIndex();\n    return index >= 0 ? `${baseId}-option-${index}` : null;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageTypeKey } from './message-bubble-config.service';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * Callback type for formatting a message into subtitle text.\n *\n * @param message - The CometChat message to format\n * @returns The formatted subtitle string\n */\nexport type SubtitleFormatter = (message: CometChat.BaseMessage) => string;\n\n/**\n * ConversationSubtitleService\n *\n * Manages custom subtitle text and icon overrides for conversation items\n * based on message type/category combinations.\n *\n * Developers can register formatters to control the last message text shown\n * in conversation list items for specific message types, and override the\n * subtitle icon displayed alongside the text.\n *\n * @example\n * ```typescript\n * const subtitleService = inject(ConversationSubtitleService);\n *\n * // Register a subtitle formatter for location messages\n * subtitleService.registerSubtitleFormatter('location_custom', (message) => {\n *   const data = (message as CometChat.CustomMessage).getCustomData();\n *   return `📍 Shared a location`;\n * });\n *\n * // Register an icon override\n * subtitleService.registerSubtitleIconOverride('location_custom', 'location-pin');\n * ```\n *\n * @Injectable providedIn: 'root'\n\n */\n@Injectable({ providedIn: 'root' })\nexport class ConversationSubtitleService {\n  private subtitleFormatters = new Map<MessageTypeKey, SubtitleFormatter>();\n  private subtitleIconOverrides = new Map<MessageTypeKey, string>();\n\n  /**\n   * Register a subtitle formatter for a message type key.\n   * Re-registration replaces the previous formatter.\n   */\n  registerSubtitleFormatter(typeKey: MessageTypeKey, formatter: SubtitleFormatter): void {\n    this.subtitleFormatters.set(typeKey, formatter);\n  }\n\n  /**\n   * Unregister a subtitle formatter for a message type key.\n   */\n  unregisterSubtitleFormatter(typeKey: MessageTypeKey): void {\n    this.subtitleFormatters.delete(typeKey);\n  }\n\n  /**\n   * Register a subtitle icon override for a message type key.\n   * Re-registration replaces the previous icon name.\n   */\n  registerSubtitleIconOverride(typeKey: MessageTypeKey, iconName: string): void {\n    this.subtitleIconOverrides.set(typeKey, iconName);\n  }\n\n  /**\n   * Get the formatted subtitle for a message, or `null` if no formatter is registered.\n   * If the formatter throws, logs a warning and returns `null`.\n   */\n  getSubtitle(typeKey: MessageTypeKey, message: CometChat.BaseMessage): string | null {\n    const formatter = this.subtitleFormatters.get(typeKey);\n    if (!formatter) {\n      return null;\n    }\n    try {\n      return formatter(message);\n    } catch (error) {\n      CometChatLogger.warn(\n        'ConversationSubtitleService',\n        `Subtitle formatter for \"${typeKey}\" threw an error:`,\n        error\n      );\n      return null;\n    }\n  }\n\n  /**\n   * Get the icon override for a message type key, or `null` if none is registered.\n   */\n  getIconOverride(typeKey: MessageTypeKey): string | null {\n    return this.subtitleIconOverrides.get(typeKey) ?? null;\n  }\n\n  /**\n   * Check if a formatter is registered for a given type key.\n   */\n  hasFormatter(typeKey: MessageTypeKey): boolean {\n    return this.subtitleFormatters.has(typeKey);\n  }\n}\n","import { Injectable, OnDestroy, inject, signal } from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\n/**\n * ThemeService\n *\n * Manages light/dark theme for the CometChat Angular UIKit.\n *\n * ## Features\n * - Respects `prefers-color-scheme` OS preference on first load\n * - Persists user choice to `localStorage`\n * - Applies `data-theme` attribute to `<html>` via Angular's `DOCUMENT` token (SSR-safe)\n * - Exposes a reactive `currentTheme` signal for template bindings\n * - Cleans up the `matchMedia` listener on destroy\n *\n * ## Usage\n *\n * ### Inject and toggle\n * ```typescript\n * export class AppComponent {\n *   themeService = inject(ThemeService);\n *\n *   toggle() {\n *     const next = this.themeService.currentTheme() === 'dark' ? 'light' : 'dark';\n *     this.themeService.setTheme(next);\n *   }\n * }\n * ```\n *\n * ### Template binding\n * ```html\n * <button (click)=\"toggle()\">\n *   {{ themeService.currentTheme() === 'dark' ? 'Light mode' : 'Dark mode' }}\n * </button>\n * ```\n *\n * ### Initialize from preference on app start\n * ```typescript\n * // app.component.ts\n * export class AppComponent {\n *   constructor() {\n *     inject(ThemeService).initFromPreference();\n *   }\n * }\n * ```\n *\n * @Injectable providedIn: 'root'\n\n */\n@Injectable({ providedIn: 'root' })\nexport class ThemeService implements OnDestroy {\n  private readonly doc = inject(DOCUMENT);\n\n  /** Reactive signal reflecting the currently applied theme. */\n  readonly currentTheme = signal<'light' | 'dark'>('light');\n\n  private mediaQuery: MediaQueryList | null = null;\n  private readonly onSystemChange = (e: MediaQueryListEvent): void => {\n    // Only follow system changes if the user has not set a manual preference\n      this.applyTheme(e.matches ? 'dark' : 'light');\n    \n  };\n\n  constructor() {\n    this.initFromPreference();\n    // Wire up system preference listener (SSR guard: window may not exist)\n    if (typeof window !== 'undefined') {\n      this.mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n      this.mediaQuery.addEventListener('change', this.onSystemChange);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.mediaQuery?.removeEventListener('change', this.onSystemChange);\n  }\n\n  /**\n   * Resolves and applies the theme on startup.\n   *\n   * Priority:\n   * 1. Stored user preference (`localStorage`)\n   * 2. OS `prefers-color-scheme`\n   * 3. Fallback: `'light'`\n   */\n  initFromPreference(): void {\n    const prefersDark =\n      typeof window !== 'undefined' &&\n      window.matchMedia('(prefers-color-scheme: dark)').matches;\n    this.applyTheme(prefersDark ? 'dark' : 'light');\n  }\n\n  /**\n   * Explicitly sets the theme and persists the choice to `localStorage`.\n   *\n   * @param theme - `'light'` or `'dark'`\n   */\n  setTheme(theme: 'light' | 'dark'): void {\n    this.applyTheme(theme);\n  }\n\n  /**\n   * Toggles between light and dark, persisting the result.\n   */\n  toggleTheme(): void {\n    this.setTheme(this.currentTheme() === 'dark' ? 'light' : 'dark');\n  }\n\n \n\n  // ── Private helpers ──\n\n  private applyTheme(theme: 'light' | 'dark'): void {\n    this.currentTheme.set(theme);\n    // DOCUMENT injection is SSR-safe; documentElement is always available\n    this.doc.documentElement.setAttribute('data-theme', theme);\n  }\n\n}\n","import { Injectable, NgZone, DestroyRef, inject } from '@angular/core';\nimport { Subject, BehaviorSubject, Observable, Subscription } from 'rxjs';\nimport { concatMap, delay, tap } from 'rxjs/operators';\nimport { of } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatAIAssistantTools } from '../modals/CometChatAIAssistantTools';\n\n/**\n * Represents a single processed AI stream event emitted on messageStream$.\n * streamedContent carries the accumulated text for text_message_content events.\n */\nexport interface IAIStreamEvent {\n  message: CometChat.AIAssistantBaseEvent;\n  streamedContent?: string;\n  chatId: string;\n  runId: string;\n}\n\n/**\n * CometChatAIStreamingService\n *\n * Mirrors the React stream-message.service pattern:\n * - Single global messageQueue processed via concatMap (sequential, no drops)\n * - Single messageStream$ Subject that all subscribers share\n * - Per-chatId streaming state via BehaviorSubject\n * - NgZone.run() wraps all incoming WebSocket events so OnPush CD fires\n */\n@Injectable({ providedIn: 'root' })\nexport class CometChatAIStreamingService {\n  private readonly _zone = inject(NgZone);\n  private readonly _destroyRef = inject(DestroyRef);\n\n  // ── Global queue & stream ────────────────────────────────────────────────\n  private readonly _messageQueue = new Subject<{ event: CometChat.AIAssistantBaseEvent; chatId: string }>();\n  private readonly _messageSubject = new Subject<IAIStreamEvent>();\n  private _queueSubscription: Subscription | null = null;\n\n  // ── Accumulated text per chatId+runId (for late-mounting bubbles) ────────\n  private _accumulatedText = new Map<string, Map<string, string>>();\n\n  // ── Per-chatId streaming state ───────────────────────────────────────────\n  private _streamingSubjects = new Map<string, BehaviorSubject<boolean>>();\n  private _signalCache = new Map<string, (() => boolean) & Observable<boolean>>();\n\n  // ── Active runs per chatId ───────────────────────────────────────────────\n  private _activeRuns = new Map<string, Set<string>>();\n\n  // ── Stopped chatIds (ignore incoming events after explicit stop) ─────────\n  private _stoppedChats = new Set<string>();\n\n  // ── Tool call state ──────────────────────────────────────────────────────\n  private _toolCallName = new Map<string, string>(); // keyed by runId\n  private _toolCallArgs = new Map<string, string>(); // keyed by runId\n\n  // ── Config ───────────────────────────────────────────────────────────────\n  private _streamSpeedMs = 30;\n  private _aiTools: CometChatAIAssistantTools | null = null;\n\n  // ── Public API ────────────────────────────────────────────────────────────\n\n  /** Observable that emits every processed IAIStreamEvent. */\n  readonly messageStream$: Observable<IAIStreamEvent> = this._messageSubject.asObservable();\n\n  constructor() {\n    this._initQueue();\n    // Clean up all streaming subjects and queue subscription when service is destroyed\n    this._destroyRef.onDestroy(() => this._cleanupAll());\n  }\n\n  /** Returns a stable callable+Observable for the given chatId's streaming state. */\n  isStreamingFor(chatId: string): (() => boolean) & Observable<boolean> {\n    if (this._signalCache.has(chatId)) {\n      return this._signalCache.get(chatId)!;\n    }\n    const subject = this._getOrCreateStreamingSubject(chatId);\n    const obs = subject.asObservable();\n    // Create a callable that also acts as an Observable for backward compatibility\n    const signalLike = (() => subject.getValue()) as (() => boolean) & Observable<boolean>;\n    // Copy Observable methods onto the callable\n    signalLike.subscribe = obs.subscribe.bind(obs);\n    signalLike.pipe = obs.pipe.bind(obs);\n    (signalLike as any).forEach = (obs as any).forEach?.bind(obs);\n    (signalLike as any)[Symbol.observable] = () => obs;\n    this._signalCache.set(chatId, signalLike);\n    return signalLike;\n  }\n\n  /** Snapshot: is the given chatId currently streaming? */\n  isStreamingSnapshot(chatId: string): boolean {\n    return this._getOrCreateStreamingSubject(chatId).getValue();\n  }\n\n  /** Returns true if any chatId is currently streaming. */\n  isAnyStreaming(): boolean {\n    for (const subject of this._streamingSubjects.values()) {\n      if (subject.getValue()) return true;\n    }\n    return false;\n  }\n\n  /** Returns accumulated text for a chatId+runId (for late-mounting bubbles). */\n  getAccumulatedText(chatId: string, runId: string): string {\n    return this._accumulatedText.get(chatId)?.get(runId) ?? '';\n  }\n\n  /**\n   * Routes an incoming WebSocket event into the processing queue.\n   * Wraps in NgZone.run() so signal/state updates trigger OnPush CD.\n   */\n  handleWebsocketMessage(event: CometChat.AIAssistantBaseEvent, chatId: string): void {\n    this._zone.run(() => {\n      this._messageQueue.next({ event, chatId });\n    });\n  }\n\n  /** Prepares for a new streaming session: resets state and marks streaming=true. */\n  startStreamingMessage(chatId: string): void {\n    this._stoppedChats.delete(chatId);\n    this._accumulatedText.delete(chatId);\n    this._initQueue();\n    this._getOrCreateStreamingSubject(chatId).next(true);\n  }\n\n  /** Stops streaming for a chatId and cleans up state. */\n  stopStreamingMessage(chatId: string): void {\n    this._stoppedChats.add(chatId);\n    this._getOrCreateStreamingSubject(chatId).next(false);\n    this._accumulatedText.delete(chatId);\n    this._activeRuns.delete(chatId);\n  }\n\n  setStreamSpeed(ms: number): void {\n    this._streamSpeedMs = ms;\n  }\n\n  setAIAssistantTools(tools: CometChatAIAssistantTools): void {\n    this._aiTools = tools;\n  }\n\n  // ── Private ───────────────────────────────────────────────────────────────\n\n  private _initQueue(): void {\n    if (this._queueSubscription) {\n      this._queueSubscription.unsubscribe();\n    }\n\n    this._queueSubscription = this._messageQueue.pipe(\n      concatMap(({ event, chatId }) => {\n        const type = event.getType();\n        let delayMs = 0;\n\n        if (type === 'text_message_content') {\n          delayMs = this._streamSpeedMs;\n        } else if (type === 'tool_call_args') {\n          delayMs = 0;\n        }\n\n        if (delayMs === 0) {\n          // Process synchronously when no delay needed\n          this._processEvent(event, chatId);\n          return of(null);\n        }\n\n        return of({ event, chatId }).pipe(\n          delay(delayMs),\n          tap(({ event, chatId }) => this._processEvent(event, chatId))\n        );\n      })\n    ).subscribe();\n  }\n\n  private _processEvent(event: CometChat.AIAssistantBaseEvent, chatId: string): void {\n    // Ignore events for chats that have been explicitly stopped\n    if (this._stoppedChats.has(chatId)) return;\n\n    const type = event.getType();\n    const runId = event.getMessageId();\n\n    // Ensure accumulated text map exists\n    if (!this._accumulatedText.has(chatId)) {\n      this._accumulatedText.set(chatId, new Map());\n    }\n    const accText = this._accumulatedText.get(chatId)!;\n\n    switch (type) {\n      case 'run_started': {\n        accText.set(runId, '');\n        // Track this run as active\n        if (!this._activeRuns.has(chatId)) {\n          this._activeRuns.set(chatId, new Set());\n        }\n        this._activeRuns.get(chatId)!.add(runId);\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n\n      case 'text_message_start': {\n        accText.set(runId, '');\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n\n      case 'text_message_content': {\n        const contentEvent = event as CometChat.AIAssistantContentReceivedEvent;\n        const delta = contentEvent.getDelta?.() ?? '';\n        const prev = accText.get(runId) ?? '';\n        const accumulated = prev + delta;\n        accText.set(runId, accumulated);\n        this._messageSubject.next({ message: event, streamedContent: accumulated, chatId, runId });\n        break;\n      }\n\n      case 'text_message_end': {\n        this._messageSubject.next({\n          message: event,\n          streamedContent: accText.get(runId) ?? '',\n          chatId,\n          runId,\n        });\n        break;\n      }\n\n      case 'tool_call_start': {\n        this._toolCallName.set(runId, (event as CometChat.AIAssistantToolStartedEvent).getToolCallName?.() ?? '');\n        this._toolCallArgs.set(runId, '');\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n\n      case 'tool_call_args': {\n        const delta = (event as CometChat.AIAssistantToolArgumentEvent).getDelta?.() ?? '';\n        this._toolCallArgs.set(runId, (this._toolCallArgs.get(runId) ?? '') + delta);\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n\n      case 'tool_call_end': {\n        const toolName = this._toolCallName.get(runId);\n        const rawArgs = this._toolCallArgs.get(runId) ?? '';\n        if (toolName && this._aiTools) {\n          const handler = this._aiTools.getAction(toolName);\n          if (handler) {\n            try { handler(JSON.parse(rawArgs)); } catch { /* malformed JSON */ }\n          }\n        }\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n\n      case 'run_finished': {\n        this._messageSubject.next({\n          message: event,\n          streamedContent: accText.get(runId) ?? '',\n          chatId,\n          runId,\n        });\n        // Remove this run from active set\n        const activeRunsForChat = this._activeRuns.get(chatId);\n        if (activeRunsForChat) {\n          activeRunsForChat.delete(runId);\n        }\n        accText.delete(runId);\n        this._toolCallName.delete(runId);\n        this._toolCallArgs.delete(runId);\n        // Only set streaming to false if no more active runs\n        if (!activeRunsForChat || activeRunsForChat.size === 0) {\n          const streamingSubject = this._streamingSubjects.get(chatId);\n          if (streamingSubject) {\n            streamingSubject.next(false);\n          }\n          this._activeRuns.delete(chatId);\n        }\n        break;\n      }\n\n      default: {\n        this._messageSubject.next({ message: event, chatId, runId });\n        break;\n      }\n    }\n  }\n\n  private _getOrCreateStreamingSubject(chatId: string): BehaviorSubject<boolean> {\n    if (!this._streamingSubjects.has(chatId)) {\n      this._streamingSubjects.set(chatId, new BehaviorSubject<boolean>(false));\n    }\n    return this._streamingSubjects.get(chatId)!;\n  }\n\n  /**\n   * Completes and removes the BehaviorSubject for a given chatId from the Map.\n   * Called after streaming ends to prevent the Map from growing unbounded\n   * across long sessions with many chat IDs.\n   */\n  private _cleanupStreamingSubject(chatId: string): void {\n    const subject = this._streamingSubjects.get(chatId);\n    if (subject) {\n      subject.complete();\n      this._streamingSubjects.delete(chatId);\n    }\n    this._signalCache.delete(chatId);\n  }\n\n  /**\n   * Completes and removes all streaming subjects and tears down the queue\n   * subscription. Called by DestroyRef when the service is destroyed.\n   */\n  private _cleanupAll(): void {\n    this._queueSubscription?.unsubscribe();\n    this._queueSubscription = null;\n    this._streamingSubjects.forEach((subject) => subject.complete());\n    this._streamingSubjects.clear();\n    this._signalCache.clear();\n    this._activeRuns.clear();\n    this._accumulatedText.clear();\n    this._toolCallName.clear();\n    this._toolCallArgs.clear();\n    this._messageSubject.complete();\n    this._messageQueue.complete();\n  }\n}\n","import {\n  CometChatSearchFilter,\n  CometChatSearchScope,\n} from '../../Enums/Enums';\n\n/** Conversation-type filters */\nconst CONVERSATION_FILTERS: ReadonlySet<CometChatSearchFilter> = new Set([\n  CometChatSearchFilter.Conversations,\n  CometChatSearchFilter.Unread,\n  CometChatSearchFilter.Groups,\n]);\n\n/** Message content filters (mutually exclusive with Links) */\nconst CONTENT_FILTERS: ReadonlySet<CometChatSearchFilter> = new Set([\n  CometChatSearchFilter.Photos,\n  CometChatSearchFilter.Videos,\n  CometChatSearchFilter.Documents,\n  CometChatSearchFilter.Audio,\n]);\n\n/** All message-scope filters */\nconst MESSAGE_FILTERS: ReadonlySet<CometChatSearchFilter> = new Set([\n  CometChatSearchFilter.Messages,\n  CometChatSearchFilter.Photos,\n  CometChatSearchFilter.Videos,\n  CometChatSearchFilter.Documents,\n  CometChatSearchFilter.Audio,\n  CometChatSearchFilter.Links,\n]);\n\n/** Check if a filter belongs to the conversation category */\nexport function isConversationFilter(\n  filter: CometChatSearchFilter\n): boolean {\n  return CONVERSATION_FILTERS.has(filter);\n}\n\n/** Check if a filter belongs to the message category */\nexport function isMessageFilter(filter: CometChatSearchFilter): boolean {\n  return MESSAGE_FILTERS.has(filter);\n}\n\n/**\n * Resolve the effective search scopes.\n * Empty array means both scopes are active.\n */\nfunction resolveScopes(\n  searchIn: CometChatSearchScope[]\n): CometChatSearchScope[] {\n  return searchIn.length === 0\n    ? [CometChatSearchScope.Conversations, CometChatSearchScope.Messages]\n    : searchIn;\n}\n\n/**\n * Compute available filters based on the active search scopes\n * and the user-provided filter list.\n */\nexport function getAvailableFilters(\n  searchIn: CometChatSearchScope[],\n  searchFilters: CometChatSearchFilter[]\n): CometChatSearchFilter[] {\n  const scopes = resolveScopes(searchIn);\n  const allowed = new Set<CometChatSearchFilter>();\n\n  if (scopes.includes(CometChatSearchScope.Conversations)) {\n    CONVERSATION_FILTERS.forEach((f) => allowed.add(f));\n  }\n  if (scopes.includes(CometChatSearchScope.Messages)) {\n    MESSAGE_FILTERS.forEach((f) => allowed.add(f));\n  }\n\n  return searchFilters.filter((f) => allowed.has(f));\n}\n\n/**\n * Compute which filters should be visible given the current\n * active selections, uid/guid context, and search scopes.\n * Matches React UIKit's getVisibleFilters logic exactly.\n */\nexport function getVisibleFilters(\n  available: CometChatSearchFilter[],\n  active: CometChatSearchFilter[],\n  uid?: string,\n  guid?: string,\n  searchIn?: CometChatSearchScope[]\n): CometChatSearchFilter[] {\n  const scopes = resolveScopes(searchIn ?? []);\n\n  // Hide conversation filters when scoped to a specific user/group\n  const filtered = uid || guid\n    ? available.filter((f) => !CONVERSATION_FILTERS.has(f))\n    : available;\n\n  if (active.length === 0) {\n    return filtered;\n  }\n\n  const hasMessages = active.includes(CometChatSearchFilter.Messages);\n\n  // Content filters include Links (matching React)\n  const contentAndLinks = new Set([...CONTENT_FILTERS, CometChatSearchFilter.Links]);\n  const selectedContentFilters = active.filter((f) => contentAndLinks.has(f));\n\n  // Messages + content filter → show Messages + those content filters\n  if (hasMessages && selectedContentFilters.length > 0) {\n    return [CometChatSearchFilter.Messages, ...selectedContentFilters].filter((f) =>\n      filtered.includes(f)\n    );\n  }\n\n  // Messages only → show all message filters\n  if (hasMessages) {\n    return filtered.filter((f) => MESSAGE_FILTERS.has(f));\n  }\n\n  // Content/Links filter only (no Messages) → show only those filters\n  if (selectedContentFilters.length > 0) {\n    return selectedContentFilters.filter((f) => filtered.includes(f));\n  }\n\n  // Conversation filter active → show ALL conversation filters\n  if (\n    scopes.includes(CometChatSearchScope.Conversations) &&\n    !uid &&\n    !guid &&\n    active.some((f) => CONVERSATION_FILTERS.has(f))\n  ) {\n    return filtered.filter((f) => CONVERSATION_FILTERS.has(f));\n  }\n\n  return filtered;\n}\n\n\n/**\n * Toggle a filter on or off.\n * No mutual exclusivity logic here — visibility rules in\n * getVisibleFilters() control which filters the user can interact with.\n * This matches the React UIKit's simple toggle approach.\n */\nexport function toggleFilter(\n  active: CometChatSearchFilter[],\n  filterId: CometChatSearchFilter\n): CometChatSearchFilter[] {\n  if (active.includes(filterId)) {\n    return active.filter((f) => f !== filterId);\n  }\n  return [...active, filterId];\n}\n\n/**\n * Determine if the conversations result section should render.\n */\nexport function shouldRenderConversations(\n  searchText: string,\n  activeFilters: CometChatSearchFilter[],\n  searchIn: CometChatSearchScope[],\n  uid?: string,\n  guid?: string\n): boolean {\n  const scopes = resolveScopes(searchIn);\n\n  if (!scopes.includes(CometChatSearchScope.Conversations)) {\n    return false;\n  }\n  if (uid || guid) {\n    return false;\n  }\n  if (searchText.trim() !== '' && activeFilters.length === 0) {\n    return true;\n  }\n  if (activeFilters.length > 0) {\n    return activeFilters.some((f) => CONVERSATION_FILTERS.has(f));\n  }\n  return false;\n}\n\n/**\n * Determine if the messages result section should render.\n */\nexport function shouldRenderMessages(\n  searchText: string,\n  activeFilters: CometChatSearchFilter[],\n  searchIn: CometChatSearchScope[],\n  uid?: string,\n  guid?: string\n): boolean {\n  const scopes = resolveScopes(searchIn);\n\n  if (!scopes.includes(CometChatSearchScope.Messages)) {\n    return false;\n  }\n  if (uid || guid) {\n    return true;\n  }\n  if (searchText.trim() !== '' && activeFilters.length === 0) {\n    return true;\n  }\n  if (activeFilters.length > 0) {\n    return !activeFilters.some((f) => CONVERSATION_FILTERS.has(f));\n  }\n  return false;\n}\n\n/**\n * Check if search criteria are valid for conversation search.\n */\nexport function hasValidSearchCriteria(\n  keyword: string,\n  filters: CometChatSearchFilter[]\n): boolean {\n  if (keyword.trim() !== '') {\n    return true;\n  }\n  if (filters.length === 0) {\n    return false;\n  }\n  return filters.every((f) => CONVERSATION_FILTERS.has(f));\n}\n\n/**\n * Check if search criteria are valid for message search.\n */\nexport function hasValidMessageSearchCriteria(\n  keyword: string,\n  filters: CometChatSearchFilter[],\n  uid?: string,\n  guid?: string\n): boolean {\n  if (uid || guid) {\n    return true;\n  }\n  if (keyword.trim() !== '') {\n    return true;\n  }\n  if (filters.length === 0) {\n    return false;\n  }\n  return filters.some((f) => MESSAGE_FILTERS.has(f));\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSearchFilter, States } from '../Enums/Enums';\nimport { hasValidMessageSearchCriteria } from '../components/cometchat-search/search-filter.utils';\n\n/**\n * Service managing message search state and SDK queries.\n * Injected into CometChatSearchMessagesListComponent.\n */\n@Injectable()\nexport class SearchMessagesService {\n  /** Current message results */\n  readonly messages: WritableSignal<CometChat.BaseMessage[]> = signal<CometChat.BaseMessage[]>([]);\n  /** Current fetch state */\n  readonly fetchState: WritableSignal<States> = signal<States>(States.loaded);\n  /** Whether more pages exist */\n  readonly hasMoreResults: WritableSignal<boolean> = signal<boolean>(false);\n\n  private searchRequest: CometChat.MessagesRequest | null = null;\n  private isLoadingMore = false;\n\n  /**\n   * Initiate a message search with the given criteria.\n   */\n  async search(\n    keyword: string,\n    filters: CometChatSearchFilter[],\n    uid?: string,\n    guid?: string,\n    customBuilder?: CometChat.MessagesRequestBuilder,\n    alwaysShowSeeMore = false\n  ): Promise<void> {\n    this.fetchState.set(States.loading);\n    this.messages.set([]);\n    this.hasMoreResults.set(false);\n\n    if (!hasValidMessageSearchCriteria(keyword, filters, uid, guid)) {\n      this.fetchState.set(States.empty);\n      return;\n    }\n\n    try {\n      this.searchRequest = this.buildRequest(\n        keyword,\n        filters,\n        uid,\n        guid,\n        customBuilder,\n        alwaysShowSeeMore\n      );\n      const limit = alwaysShowSeeMore ? 3 : 30;\n      const results = await this.searchRequest.fetchPrevious();\n\n      if (results.length > 0) {\n        this.messages.set(results.reverse());\n        this.fetchState.set(States.loaded);\n        this.hasMoreResults.set(results.length >= limit);\n      } else {\n        this.fetchState.set(States.empty);\n        this.hasMoreResults.set(false);\n      }\n    } catch (error) {\n      this.fetchState.set(States.error);\n      throw error;\n    }\n  }\n\n  /**\n   * Load the next page of results.\n   */\n  async loadMore(): Promise<void> {\n    if (this.isLoadingMore || !this.searchRequest) {\n      return;\n    }\n    this.isLoadingMore = true;\n\n    try {\n      const results = await this.searchRequest.fetchPrevious();\n      if (results.length > 0) {\n        this.messages.update(prev => [...prev, ...results.reverse()]);\n        const limit = 30;\n        this.hasMoreResults.set(results.length >= limit);\n      } else {\n        this.hasMoreResults.set(false);\n      }\n    } finally {\n      this.isLoadingMore = false;\n    }\n  }\n\n  /** Reset all state. */\n  reset(): void {\n    this.messages.set([]);\n    this.fetchState.set(States.loaded);\n    this.hasMoreResults.set(false);\n    this.searchRequest = null;\n    this.isLoadingMore = false;\n  }\n\n  /**\n   * Build a MessagesRequest based on search criteria and filters.\n   */\n  private buildRequest(\n    keyword: string,\n    filters: CometChatSearchFilter[],\n    uid?: string,\n    guid?: string,\n    customBuilder?: CometChat.MessagesRequestBuilder,\n    alwaysShowSeeMore = false\n  ): CometChat.MessagesRequest {\n    let builder = customBuilder ? customBuilder : new CometChat.MessagesRequestBuilder();\n\n    builder.hideDeletedMessages(true);\n    const limit = alwaysShowSeeMore ? 3 : 30;\n\n    if (!customBuilder) {\n      builder = builder.setLimit(limit);\n    }\n\n    if (keyword.trim() !== '') {\n      builder = builder.setSearchKeyword(keyword);\n    }\n    if (uid) {\n      builder = builder.setUID(uid);\n    }\n    if (guid) {\n      builder = builder.setGUID(guid);\n    }\n\n    // Apply filter-specific attachment types (matching React UIKit approach)\n    if (filters.length > 0) {\n      if (filters.includes(CometChatSearchFilter.Links)) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        builder = (builder as any).hasLinks(true);\n      }\n\n      const attachmentTypeMap: Partial<Record<CometChatSearchFilter, CometChat.AttachmentType>> = {\n        [CometChatSearchFilter.Photos]: CometChat.AttachmentType.IMAGE,\n        [CometChatSearchFilter.Videos]: CometChat.AttachmentType.VIDEO,\n        [CometChatSearchFilter.Documents]: CometChat.AttachmentType.FILE,\n        [CometChatSearchFilter.Audio]: CometChat.AttachmentType.AUDIO,\n      };\n\n      for (const [filter, attachmentType] of Object.entries(attachmentTypeMap)) {\n        if (filters.includes(filter as CometChatSearchFilter)) {\n          builder = builder.setAttachmentTypes([attachmentType as CometChat.AttachmentType]);\n          break;\n        }\n      }\n    }\n\n    return builder.build();\n  }\n}\n","import { Injectable, signal, WritableSignal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSearchFilter, States } from '../Enums/Enums';\nimport { CometChatUIKitConstants } from '../constants';\nimport { CometChatMessageEvents } from '../events/CometChatMessageEvents';\nimport { hasValidSearchCriteria } from '../components/cometchat-search/search-filter.utils';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { Subscription } from 'rxjs';\n\n/**\n * Service managing conversation search state, SDK queries,\n * and real-time listener lifecycle.\n */\n@Injectable()\nexport class SearchConversationsService {\n  readonly conversations: WritableSignal<CometChat.Conversation[]> = signal<CometChat.Conversation[]>([]);\n  readonly fetchState: WritableSignal<States> = signal<States>(States.loaded);\n  readonly hasMoreResults: WritableSignal<boolean> = signal<boolean>(false);\n  readonly typingIndicatorMap: WritableSignal<Map<string, CometChat.TypingIndicator>> = signal<Map<string, CometChat.TypingIndicator>>(new Map());\n\n  private searchRequest: CometChat.ConversationsRequest | null = null;\n  private isLoadingMore = false;\n  private loggedInUser: CometChat.User | null = null;\n  // Listener IDs for cleanup\n  private messageListenerId = '';\n  private userListenerId = '';\n  private groupListenerId = '';\n  private callListenerId = '';\n  private typingListenerId = '';\n  private receiptSubscriptions: Subscription[] = [];\n\n  /**\n   * Initiate a conversation search.\n   */\n  async search(\n    keyword: string,\n    filters: CometChatSearchFilter[],\n    customBuilder?: CometChat.ConversationsRequestBuilder\n  ): Promise<void> {\n    this.fetchState.set(States.loading);\n    this.conversations.set([]);\n    this.hasMoreResults.set(false);\n\n    if (!hasValidSearchCriteria(keyword, filters)) {\n      this.fetchState.set(States.empty);\n      return;\n    }\n\n    try {\n      this.searchRequest = this.buildRequest(keyword, filters, customBuilder);\n      const limit = filters.length > 0 ? 30 : 3;\n      const results = await this.searchRequest.fetchNext();\n\n      if (results.length > 0) {\n        this.conversations.set(results);\n        this.fetchState.set(States.loaded);\n        this.hasMoreResults.set(results.length >= limit);\n      } else {\n        this.fetchState.set(States.empty);\n        this.hasMoreResults.set(false);\n      }\n    } catch (error) {\n      this.fetchState.set(States.error);\n      throw error;\n    }\n  }\n\n  /** Load the next page of results. */\n  async loadMore(): Promise<void> {\n    if (this.isLoadingMore || !this.searchRequest) {\n      return;\n    }\n    this.isLoadingMore = true;\n\n    try {\n      const results = await this.searchRequest.fetchNext();\n      if (results.length > 0) {\n        this.conversations.update(prev => {\n          const existingIds = new Set(prev.map(c => c.getConversationId()));\n          const newItems = results.filter(c => !existingIds.has(c.getConversationId()));\n          return [...prev, ...newItems];\n        });\n        this.hasMoreResults.set(results.length >= 30);\n      } else {\n        this.hasMoreResults.set(false);\n      }\n    } finally {\n      this.isLoadingMore = false;\n    }\n  }\n\n  /** Attach all real-time SDK listeners. */\n  attachListeners(loggedInUser: CometChat.User): void {\n    this.loggedInUser = loggedInUser;\n    this.attachMessageListener();\n    this.attachUserListener();\n    this.attachGroupListener();\n    this.attachCallListener();\n    this.attachTypingListener();\n    this.attachReceiptListener();\n  }\n\n  /** Detach all real-time SDK listeners. */\n  detachListeners(): void {\n    if (this.messageListenerId) {\n      CometChat.removeMessageListener(this.messageListenerId);\n    }\n    if (this.userListenerId) {\n      CometChat.removeUserListener(this.userListenerId);\n    }\n    if (this.groupListenerId) {\n      CometChat.removeGroupListener(this.groupListenerId);\n    }\n    if (this.callListenerId) {\n      CometChat.removeCallListener(this.callListenerId);\n    }\n    if (this.typingListenerId) {\n      CometChat.removeMessageListener(this.typingListenerId);\n    }\n    this.receiptSubscriptions.forEach(s => s.unsubscribe());\n    this.receiptSubscriptions = [];\n  }\n\n  /** Reset all state and detach listeners. */\n  reset(): void {\n    this.detachListeners();\n    this.conversations.set([]);\n    this.fetchState.set(States.loaded);\n    this.hasMoreResults.set(false);\n    this.typingIndicatorMap.set(new Map());\n    this.searchRequest = null;\n    this.isLoadingMore = false;\n    this.loggedInUser = null;\n  }\n\n  // --- Request building ---\n\n  private buildRequest(\n    keyword: string,\n    filters: CometChatSearchFilter[],\n    customBuilder?: CometChat.ConversationsRequestBuilder\n  ): CometChat.ConversationsRequest {\n    let builder = customBuilder ?? new CometChat.ConversationsRequestBuilder();\n    const limit = filters.length > 0 ? 30 : 3;\n\n    builder = builder.setLimit(limit);\n\n    if (keyword.trim() !== '') {\n      builder = builder.setSearchKeyword(keyword);\n    }\n    if (filters.includes(CometChatSearchFilter.Unread)) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      builder = (builder as any).setUnread(true);\n    }\n    if (filters.includes(CometChatSearchFilter.Groups)) {\n      builder = builder.setConversationType(\n        CometChatUIKitConstants.MessageReceiverType.group\n      );\n    }\n\n    return builder.build();\n  }\n\n  // --- Real-time listeners ---\n\n  private attachMessageListener(): void {\n    this.messageListenerId = 'SearchConv_Msg_' + Date.now();\n    CometChat.addMessageListener(\n      this.messageListenerId,\n      new CometChat.MessageListener({\n        onTextMessageReceived: (msg: CometChat.TextMessage) => this.handleNewMessage(msg),\n        onMediaMessageReceived: (msg: CometChat.MediaMessage) => this.handleNewMessage(msg),\n        onCustomMessageReceived: (msg: CometChat.CustomMessage) => this.handleNewMessage(msg),\n        onMessageEdited: (msg: CometChat.BaseMessage) => this.handleMessageUpdate(msg),\n        onMessageDeleted: (msg: CometChat.BaseMessage) => this.handleMessageUpdate(msg),\n      })\n    );\n  }\n\n  private attachUserListener(): void {\n    this.userListenerId = 'SearchConv_User_' + Date.now();\n    CometChat.addUserListener(\n      this.userListenerId,\n      new CometChat.UserListener({\n        onUserOnline: (user: CometChat.User) => this.handleUserStatusChange(user),\n        onUserOffline: (user: CometChat.User) => this.handleUserStatusChange(user),\n      })\n    );\n  }\n\n  private attachGroupListener(): void {\n    this.groupListenerId = 'SearchConv_Group_' + Date.now();\n    CometChat.addGroupListener(\n      this.groupListenerId,\n      new CometChat.GroupListener({\n        onGroupMemberJoined: (msg: CometChat.Action) => this.handleNewMessage(msg),\n        onGroupMemberLeft: (msg: CometChat.Action, user: CometChat.User) => {\n          if (this.loggedInUser?.getUid() === user.getUid()) {\n            this.removeConversationByGroup(msg);\n          } else {\n            this.handleNewMessage(msg);\n          }\n        },\n        onGroupMemberKicked: (msg: CometChat.Action, _: unknown, kicked: CometChat.User) => {\n          if (this.loggedInUser?.getUid() === kicked.getUid()) {\n            this.removeConversationByGroup(msg);\n          } else {\n            this.handleNewMessage(msg);\n          }\n        },\n        onGroupMemberBanned: (msg: CometChat.Action, banned: CometChat.User) => {\n          if (this.loggedInUser?.getUid() === banned.getUid()) {\n            this.removeConversationByGroup(msg);\n          } else {\n            this.handleNewMessage(msg);\n          }\n        },\n        onMemberAddedToGroup: (msg: CometChat.Action) => this.handleNewMessage(msg),\n        onGroupMemberScopeChanged: (msg: CometChat.Action) => this.handleNewMessage(msg),\n      })\n    );\n  }\n\n  private attachCallListener(): void {\n    this.callListenerId = 'SearchConv_Call_' + Date.now();\n    CometChat.addCallListener(\n      this.callListenerId,\n      new CometChat.CallListener({\n        onIncomingCallReceived: (call: CometChat.Call) => this.handleNewMessage(call),\n        onOutgoingCallAccepted: (call: CometChat.Call) => this.handleNewMessage(call),\n        onOutgoingCallRejected: (call: CometChat.Call) => this.handleNewMessage(call),\n        onIncomingCallCancelled: (call: CometChat.Call) => this.handleNewMessage(call),\n      })\n    );\n  }\n\n  private attachTypingListener(): void {\n    this.typingListenerId = 'SearchConv_Typing_' + Date.now();\n    CometChat.addMessageListener(\n      this.typingListenerId,\n      new CometChat.MessageListener({\n        onTypingStarted: (indicator: CometChat.TypingIndicator) => {\n          this.handleTypingStarted(indicator);\n        },\n        onTypingEnded: (indicator: CometChat.TypingIndicator) => {\n          this.handleTypingEnded(indicator);\n        },\n      })\n    );\n  }\n\n  private attachReceiptListener(): void {\n    const delivered = CometChatMessageEvents.onMessagesDelivered.subscribe(\n      (receipt: CometChat.MessageReceipt) => {\n        if (receipt.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user) {\n          this.handleReceipt(receipt, false);\n        }\n      }\n    );\n    const read = CometChatMessageEvents.onMessagesRead.subscribe(\n      (receipt: CometChat.MessageReceipt) => {\n        if (receipt.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user) {\n          this.handleReceipt(receipt, true);\n        }\n      }\n    );\n    this.receiptSubscriptions.push(delivered, read);\n  }\n\n  // --- Event handlers ---\n\n  private handleNewMessage(message: CometChat.BaseMessage): void {\n    const convId = message.getConversationId();\n    this.conversations.update(list => {\n      const idx = list.findIndex(c => c.getConversationId() === convId);\n      if (idx === -1) {\n        return list;\n      }\n      const updated = this.cloneConversation(list[idx]);\n      updated.setLastMessage(message);\n\n      // Increment unread if not sent by logged-in user\n      if (message.getSender()?.getUid() !== this.loggedInUser?.getUid()) {\n        updated.setUnreadMessageCount((updated.getUnreadMessageCount() ?? 0) + 1);\n      }\n\n      // Move to top\n      const rest = list.filter((_, i) => i !== idx);\n      return [updated, ...rest];\n    });\n  }\n\n  private handleMessageUpdate(message: CometChat.BaseMessage): void {\n    const msgId = message.getId();\n    this.conversations.update(list =>\n      list.map(conv => {\n        const lastMsg = conv.getLastMessage();\n        if (lastMsg && lastMsg.getId() === msgId) {\n          const updated = this.cloneConversation(conv);\n          updated.setLastMessage(message);\n          return updated;\n        }\n        return conv;\n      })\n    );\n  }\n\n  private handleUserStatusChange(user: CometChat.User): void {\n    const uid = user.getUid();\n    this.conversations.update(list =>\n      list.map(conv => {\n        const convWith = conv.getConversationWith();\n        if (convWith instanceof CometChat.User && convWith.getUid() === uid) {\n          const updated = this.cloneConversation(conv);\n          updated.setConversationWith(user);\n          return updated;\n        }\n        return conv;\n      })\n    );\n  }\n\n  private handleTypingStarted(indicator: CometChat.TypingIndicator): void {\n    const id = this.getTypingId(indicator);\n    if (!id) {\n      return;\n    }\n    this.typingIndicatorMap.update(map => {\n      const next = new Map(map);\n      next.set(id, indicator);\n      return next;\n    });\n  }\n\n  private handleTypingEnded(indicator: CometChat.TypingIndicator): void {\n    const id = this.getTypingId(indicator);\n    if (!id) {\n      return;\n    }\n    this.typingIndicatorMap.update(map => {\n      if (!map.has(id)) {\n        return map;\n      }\n      const next = new Map(map);\n      next.delete(id);\n      return next;\n    });\n  }\n\n  private handleReceipt(receipt: CometChat.MessageReceipt, isRead: boolean): void {\n    const receiptMsgId = typeof receipt.getMessageId === 'function' ? receipt.getMessageId() : '';\n    this.conversations.update(list =>\n      list.map(conv => {\n        const lastMsg = conv.getLastMessage();\n        if (\n          lastMsg &&\n          String(lastMsg.getId()) === receiptMsgId &&\n          conv.getConversationWith() instanceof CometChat.User\n        ) {\n          const updated = this.cloneConversation(conv);\n          if (isRead) {\n            updated.getLastMessage()?.setReadAt(receipt.getReadAt());\n            updated.setUnreadMessageCount(0);\n          } else {\n            updated.getLastMessage()?.setDeliveredAt(receipt.getDeliveredAt());\n          }\n          return updated;\n        }\n        return conv;\n      })\n    );\n  }\n\n  private removeConversationByGroup(message: CometChat.Action): void {\n    const convId = message.getConversationId();\n    this.conversations.update(list => {\n      const filtered = list.filter(c => c.getConversationId() !== convId);\n      if (filtered.length === 0) {\n        this.fetchState.set(States.empty);\n      }\n      return filtered;\n    });\n  }\n\n  // --- Helpers ---\n\n  private getTypingId(indicator: CometChat.TypingIndicator): string | null {\n    const isGroup =\n      indicator.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.group;\n    if (isGroup) {\n      return indicator.getReceiverId() ?? null;\n    }\n    return indicator.getSender()?.getUid() ?? null;\n  }\n\n  private cloneConversation(conv: CometChat.Conversation): CometChat.Conversation {\n    return CometChatUIKitUtility.clone(conv);\n  }\n}\n","import { Injectable, OnDestroy } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nexport interface NotificationUnreadCountOptions {\n  /** Filter count by category */\n  category?: string;\n  /** Polling interval in ms. Default: 30000 */\n  pollingInterval?: number;\n}\n\n/**\n * NotificationUnreadCountService\n *\n * Injectable Angular service for consuming notification feed unread count.\n * Provides real-time updates via BehaviorSubject, polling, and WebSocket listener.\n *\n * Angular equivalent of React's useNotificationUnreadCount hook.\n *\n * NOTE: When used alongside CometChatNotificationFeedComponent, both register\n * separate NotificationFeedListeners. The ViewModel handles feed item insertion,\n * while this service handles badge count. Both optimistically update on\n * onFeedItemReceived — the badge may briefly over-count by 1 until the next\n * polling re-fetch corrects it (within 1 second). This is by design to avoid\n * tight coupling between the badge and the feed component.\n *\n * @Injectable providedIn: 'root'\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class NotificationUnreadCountService implements OnDestroy {\n  /** Current unread count */\n  readonly count$ = new BehaviorSubject<number>(0);\n\n  /** Whether the initial fetch is in progress */\n  readonly isLoading$ = new BehaviorSubject<boolean>(true);\n\n  private pollingInterval: ReturnType<typeof setInterval> | null = null;\n  private listenerId: string = `unread_count_service_${Date.now()}`;\n  private isFetching = false;\n  private isStarted = false;\n  private focusHandler: (() => void) | null = null;\n\n  /**\n   * Start tracking unread count.\n   * Fetches initial count, registers WebSocket listener, and starts polling.\n   */\n  start(options?: NotificationUnreadCountOptions): void {\n    if (this.isStarted) return;\n    this.isStarted = true;\n\n    // Initial fetch\n    this.fetchCount();\n\n    // Start polling\n    const intervalMs = options?.pollingInterval ?? 30000;\n    this.pollingInterval = setInterval(() => {\n      this.fetchCount();\n    }, intervalMs);\n\n    // Register real-time listener\n    this.registerListener();\n\n    // Listen for window focus to re-sync\n    this.focusHandler = () => this.fetchCount();\n    if (typeof window !== 'undefined') {\n      window.addEventListener('focus', this.focusHandler);\n    }\n  }\n\n  /**\n   * Stop tracking unread count.\n   * Removes listener, clears polling, removes focus handler.\n   */\n  stop(): void {\n    if (!this.isStarted) return;\n    this.isStarted = false;\n\n    this.stopPolling();\n    this.removeListener();\n\n    if (this.focusHandler && typeof window !== 'undefined') {\n      window.removeEventListener('focus', this.focusHandler);\n      this.focusHandler = null;\n    }\n  }\n\n  /**\n   * Manually refresh the unread count.\n   */\n  async refresh(): Promise<void> {\n    await this.fetchCount();\n  }\n\n  ngOnDestroy(): void {\n    this.stop();\n  }\n\n  // --- Private ---\n\n  private async fetchCount(): Promise<void> {\n    if (this.isFetching) return;\n    this.isFetching = true;\n\n    try {\n      const result = await CometChat.getNotificationFeedUnreadCount();\n      const newCount = typeof result === 'number' ? result : result?.count ?? 0;\n      this.count$.next(newCount);\n      this.isLoading$.next(false);\n    } catch (error: any) {\n      if (error?.code !== 'ERR_BAD_REQUEST') {\n        console.warn('[NotificationUnreadCountService] Failed to fetch count:', error);\n      }\n    } finally {\n      this.isFetching = false;\n    }\n  }\n\n  private registerListener(): void {\n    try {\n      CometChat.addNotificationFeedListener(this.listenerId, {\n        onFeedItemReceived: () => {\n          // Optimistically increment\n          this.count$.next(this.count$.value + 1);\n          // Re-fetch for accuracy after short debounce\n          setTimeout(() => this.fetchCount(), 1000);\n        },\n      });\n    } catch (error) {\n      console.warn('[NotificationUnreadCountService] Failed to register listener:', error);\n    }\n  }\n\n  private removeListener(): void {\n    try {\n      CometChat.removeNotificationFeedListener(this.listenerId);\n    } catch (error) {\n      // Ignore cleanup errors\n    }\n  }\n\n  private stopPolling(): void {\n    if (this.pollingInterval) {\n      clearInterval(this.pollingInterval);\n      this.pollingInterval = null;\n    }\n  }\n}\n","/**\n * CometChatErrorBoundary Component\n *\n * A reusable wrapper component that catches errors from projected child content\n * and renders a fallback UI instead of crashing. Uses signal-based state management\n * and supports custom fallback templates.\n *\n * @module components/cometchat-error-boundary\n * @see Requirements 1.1, 1.2, 1.3, 1.4, 1.5, 1.6\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  signal,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\n\n/**\n * Structured error context emitted when an error is caught.\n */\nexport interface ErrorContext {\n  /** The original error that was caught */\n  error: Error;\n  /** Name identifying the source component */\n  componentName: string;\n  /** Epoch milliseconds when the error occurred */\n  timestamp: number;\n}\n\n/**\n * CometChatErrorBoundary wraps child content via `ng-content` and renders\n * a fallback UI when an error is reported via `handleError()`.\n *\n * @example\n * ```html\n * <cometchat-error-boundary componentName=\"MessageBubble\" (error)=\"onError($event)\">\n *   <cometchat-message-bubble [message]=\"msg\"></cometchat-message-bubble>\n * </cometchat-error-boundary>\n * ```\n *\n * @example Custom fallback\n * ```html\n * <cometchat-error-boundary [fallbackView]=\"customFallback\" componentName=\"MyComponent\">\n *   <my-component></my-component>\n * </cometchat-error-boundary>\n * <ng-template #customFallback let-ctx>\n *   <p>Error in {{ ctx.componentName }}: {{ ctx.error.message }}</p>\n * </ng-template>\n * ```\n */\n@Component({\n  selector: 'cometchat-error-boundary',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  template: `\n    @if (hasError()) {\n      @if (fallbackView) {\n        <ng-container\n          *ngTemplateOutlet=\"fallbackView; context: { $implicit: errorContext() }\"\n        ></ng-container>\n      } @else {\n        <div class=\"cometchat-error-boundary__fallback\">\n          <p class=\"cometchat-error-boundary__message\">\n            {{ 'error_boundary_something_went_wrong' | translate }}\n          </p>\n          <button\n            class=\"cometchat-error-boundary__retry\"\n            (click)=\"retry()\"\n            [attr.aria-label]=\"'error_boundary_retry' | translate\"\n          >\n            {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      }\n    } @else {\n      <ng-content></ng-content>\n    }\n  `,\n  styleUrls: ['./cometchat-error-boundary.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatErrorBoundaryComponent {\n  /** Optional custom fallback template rendered when an error occurs */\n  @Input() fallbackView?: TemplateRef<{ $implicit: ErrorContext }>;\n\n  /** Name identifying the wrapped component, used in ErrorContext */\n  @Input() componentName = 'Unknown';\n\n  /** Emits ErrorContext when an error is caught */\n  @Output() error = new EventEmitter<ErrorContext>();\n\n  /** Whether the component is in an error state */\n  hasError = signal(false);\n\n  /** The current error context, or null if no error */\n  errorContext = signal<ErrorContext | null>(null);\n\n  /**\n   * Report an error to the boundary. Sets error state, logs the error,\n   * and emits the ErrorContext via the `error` output.\n   */\n  handleError(err: Error): void {\n    const context: ErrorContext = {\n      error: err,\n      componentName: this.componentName,\n      timestamp: Date.now(),\n    };\n    CometChatLogger.error('CometChatErrorBoundary', `[${this.componentName}]`, err);\n    this.errorContext.set(context);\n    this.hasError.set(true);\n    this.error.emit(context);\n  }\n\n  /**\n   * Reset the error state and re-render child content.\n   * Idempotent — calling when no error has no effect.\n   */\n  retry(): void {\n    this.hasError.set(false);\n    this.errorContext.set(null);\n  }\n}\n","/**\n * Public API for CometChatErrorBoundary component\n */\nexport { CometChatErrorBoundaryComponent } from './cometchat-error-boundary.component';\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  HostListener,\n  AfterViewInit,\n  ElementRef,\n  ViewChildren,\n  QueryList, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatMessageComposerAction, CometChatActionsView } from '../../../modals';\nimport {\n  isActivationKey,\n  isEscapeKey,\n  getNextIndex,\n  getNavigationDirection,\n} from '../../../utils/keyboard-utils';\n\n/**\n * CometChatActionSheet is a composite component used to display a list of action items.\n * It accepts an array of action items as input and emits an event when any action is clicked.\n *\n * @example\n * ```html\n * <cometchat-action-sheet\n *   [actions]=\"actionItems\"\n *   (actionItemClick)=\"onActionClick($event)\"\n * ></cometchat-action-sheet>\n * ```\n */\n@Component({\n  selector: 'cometchat-action-sheet',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-action-sheet.component.html',\n  styleUrls: ['./cometchat-action-sheet.component.css'],\n})\nexport class CometChatActionSheetComponent implements AfterViewInit {\n  /**\n   * Array of action items to be displayed in the action sheet.\n   * Each action can be either a CometChatMessageComposerAction or CometChatActionsView.\n   */\n  @Input() actions: (CometChatMessageComposerAction | CometChatActionsView)[] = [];\n\n  /**\n   * Emitted when an action item is clicked.\n   * The event payload contains the clicked action item.\n   */\n  @Output() actionItemClick = new EventEmitter<\n    CometChatMessageComposerAction | CometChatActionsView\n  >();\n\n  /**\n   * Emitted when the action sheet should be closed (e.g., Escape key pressed).\n   */\n  @Output() closeSheet = new EventEmitter<void>();\n\n  /**\n   * Reference to all action item elements for keyboard navigation\n   */\n  @ViewChildren('actionItem') actionItems!: QueryList<ElementRef<HTMLDivElement>>;\n\n  /**\n   * Currently focused action index for keyboard navigation\n   * Starts at -1 so no item is highlighted by default\n   */\n  private focusedIndex = -1;\n\n  constructor(private elementRef: ElementRef) {}\n\n  ngAfterViewInit(): void {\n    // Don't auto-focus first item - let user navigate with keyboard\n  }\n\n  /**\n   * Handles click on an action item.\n   * Emits the actionItemClick event with the clicked action.\n   * @param action The action item that was clicked\n   */\n  onActionClick(action: CometChatMessageComposerAction | CometChatActionsView): void {\n    this.actionItemClick.emit(action);\n  }\n\n  /**\n   * Handles keyboard events for accessibility\n   * - Arrow Up/Down: Navigate between actions with wrap-around\n   * - Enter/Space: Select action and close sheet\n   * - Escape: Close action sheet\n   * - Tab: Allow natural tab order (no focus trap)\n   */\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    // Handle arrow key navigation\n    const direction = getNavigationDirection(event);\n    if (direction === 'up' || direction === 'down') {\n      event.preventDefault();\n      this.navigateToIndex(direction);\n      return;\n    }\n\n    // Handle activation (Enter/Space)\n    if (isActivationKey(event)) {\n      event.preventDefault();\n      this.selectCurrentAction();\n      return;\n    }\n\n    // Handle Escape to close\n    if (isEscapeKey(event)) {\n      event.preventDefault();\n      this.closeSheet.emit();\n      return;\n    }\n\n    // Tab key: Allow natural exit (no focus trap per requirement 3.6)\n    // Don't prevent default - let browser handle tab navigation\n  }\n\n  /**\n   * Navigates to the next or previous action item using keyboard utilities\n   * @param direction The navigation direction ('up' or 'down')\n   */\n  private navigateToIndex(direction: 'up' | 'down'): void {\n    if (this.actions.length === 0) return;\n\n    // Use keyboard utility for wrap-around navigation\n    const nextIndex = getNextIndex(this.focusedIndex, direction, this.actions.length, {\n      wrap: true,\n    });\n\n    this.focusedIndex = nextIndex;\n    this.setFocusToIndex(this.focusedIndex);\n  }\n\n  /**\n   * Sets focus to the action item at the specified index\n   * @param index The index of the action item to focus\n   */\n  private setFocusToIndex(index: number): void {\n    const items = this.actionItems?.toArray();\n    if (items && items[index]) {\n      items[index].nativeElement.focus();\n    }\n  }\n\n  /**\n   * Selects the currently focused action\n   */\n  private selectCurrentAction(): void {\n    if (this.actions[this.focusedIndex]) {\n      this.onActionClick(this.actions[this.focusedIndex]);\n    }\n  }\n\n  /**\n   * Handles focus event on an action item\n   * Updates the focused index when an item receives focus\n   * @param index The index of the focused item\n   */\n  onActionFocus(index: number): void {\n    this.focusedIndex = index;\n  }\n\n  /**\n   * TrackBy function for ngFor to improve rendering performance.\n   * @param index The index of the item\n   * @param action The action item\n   * @returns A unique identifier for the action\n   */\n  trackByAction(\n    index: number,\n    action: CometChatMessageComposerAction | CometChatActionsView\n  ): string {\n    return action.id || `action-${index}`;\n  }\n}\n","<div class=\"cometchat\">\n  <div \n    class=\"cometchat-action-sheet\"\n    role=\"menu\"\n    [attr.aria-label]=\"'action_sheet_aria_label' | translate\"\n  >\n    @for (action of actions; track trackByAction($index, action)) {\n      <div\n        #actionItem\n        class=\"cometchat-action-sheet__item\"\n        role=\"menuitem\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"action.title\"\n        (click)=\"onActionClick(action)\"\n        (focus)=\"onActionFocus($index)\"\n      >\n        <div\n          class=\"cometchat-action-sheet__item-icon\"\n          [style.webkitMask]=\"action.iconURL ? 'url(' + action.iconURL + ') center center no-repeat' : null\"\n          [style.mask]=\"action.iconURL ? 'url(' + action.iconURL + ') center center no-repeat' : null\"\n        ></div>\n        <div class=\"cometchat-action-sheet__item-body\">\n          {{ action.title }}\n        </div>\n      </div>\n    }\n  </div>\n</div>\n","import { Component, Input, OnChanges, SimpleChanges, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * CometChatAvatar displays an avatar image or initials derived from a name.\n * If an image URL is provided, the component displays the image.\n * If the image fails to load or no image is provided, it shows initials from the name.\n *\n * @example\n * ```html\n * <cometchat-avatar [image]=\"user.avatar\" [name]=\"user.name\"></cometchat-avatar>\n * ```\n */\n@Component({\n  selector: 'cometchat-avatar',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-avatar.component.html',\n  styleUrls: ['./cometchat-avatar.component.css'],\n})\nexport class CometChatAvatarComponent implements OnChanges {\n  /** URL of the avatar image to be displayed */\n  @Input() image = '';\n\n  /** Name used for displaying initials in the avatar */\n  @Input() name = '';\n\n  /** Controls image loading strategy. Use 'eager' for above-the-fold avatars. */\n  @Input() loading: 'lazy' | 'eager' = 'lazy';\n\n  /** Internal state to track if image failed to load */\n  imageError = false;\n\n  /**\n   * Normalizes null/undefined inputs to their default values.\n   * Prevents NG0100 ExpressionChangedAfterItHasBeenCheckedError.\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['image'] && changes['image'].currentValue == null) {\n      this.image = '';\n    }\n    if (changes['name'] && changes['name'].currentValue == null) {\n      this.name = '';\n    }\n    if (changes['image']) {\n      this.imageError = false;\n    }\n  }\n\n  /**\n   * Generates initials from the name.\n   * - If name has multiple words: first char of first word + first char of second word (uppercase)\n   * - If name is single word: first two characters (uppercase)\n   * - If name is empty: empty string\n   */\n  get initials(): string {\n    if (!this.name) return '';\n\n    const splitName = this.name\n      .trim()\n      .split(' ')\n      .filter(part => part.length > 0);\n\n    if (splitName.length > 1) {\n      return (splitName[0].substring(0, 1) + splitName[1].substring(0, 1)).toUpperCase();\n    }\n\n    return this.name.substring(0, 2).toUpperCase();\n  }\n\n  /**\n   * Determines if the image should be shown.\n   * Shows image only if image URL exists and no error occurred.\n   */\n  get showImage(): boolean {\n    return !!this.image && !this.imageError;\n  }\n\n  /**\n   * Generates an accessible label for screen readers.\n   * Describes the avatar content for assistive technologies.\n   *\n   * Falls back to a hardcoded template when the localization service has not\n   * been initialized (e.g., in unit tests) so that the aria-label always\n   * contains the name when one is provided.\n   */\n  get ariaLabel(): string {\n    if (this.name) {\n      const template = CometChatLocalize.getLocalizedString('accessibility_avatar_for');\n      // Use the localized template only when it actually contains the placeholder;\n      // fall back to a safe default so the name is always present in the label.\n      const resolved = template.includes('{name}')\n        ? template.replace('{name}', this.name)\n        : `Avatar for ${this.name}`;\n      return resolved;\n    }\n    const template = CometChatLocalize.getLocalizedString('accessibility_avatar_for');\n    return template.replace(' {name}', '').replace('{name}', '') || 'Avatar';\n  }\n\n  /**\n   * Handles image load error by setting imageError flag.\n   * This triggers fallback to initials display.\n   */\n  onImageError(): void {\n    this.imageError = true;\n  }\n\n  /**\n   * Resets error state when image input changes.\n   * Called via ngOnChanges or can be triggered manually.\n   */\n  resetImageError(): void {\n    this.imageError = false;\n  }\n}\n","<div \n  class=\"cometchat-avatar\"\n  role=\"img\"\n  [attr.aria-label]=\"ariaLabel\"\n>\n  @if (showImage) {\n    <img\n      [loading]=\"loading\"\n      [src]=\"image\"\n      class=\"cometchat-avatar__image\"\n      width=\"48\"\n      height=\"48\"\n      (error)=\"onImageError()\"\n      alt=\"\"\n      aria-hidden=\"true\"\n    />\n  } @else {\n    <span class=\"cometchat-avatar__text\" aria-hidden=\"true\">{{ initials }}</span>\n  }\n</div>\n","import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\n\n// Loading animation SVG as inline data URI for library portability\nconst LOADING_ICON_SVG = `data:image/svg+xml,%3Csvg width='24' height='24' viewBox='0 0 24 24' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 22C10.6333 22 9.34167 21.7375 8.125 21.2125C6.90833 20.6875 5.84583 19.9708 4.9375 19.0625C4.02917 18.1542 3.3125 17.0917 2.7875 15.875C2.2625 14.6583 2 13.3667 2 12C2 10.6167 2.2625 9.32083 2.7875 8.1125C3.3125 6.90417 4.02917 5.84583 4.9375 4.9375C5.84583 4.02917 6.90833 3.3125 8.125 2.7875C9.34167 2.2625 10.6333 2 12 2C12.2833 2 12.5208 2.09583 12.7125 2.2875C12.9042 2.47917 13 2.71667 13 3C13 3.28333 12.9042 3.52083 12.7125 3.7125C12.5208 3.90417 12.2833 4 12 4C9.78333 4 7.89583 4.77917 6.3375 6.3375C4.77917 7.89583 4 9.78333 4 12C4 14.2167 4.77917 16.1042 6.3375 17.6625C7.89583 19.2208 9.78333 20 12 20C14.2167 20 16.1042 19.2208 17.6625 17.6625C19.2208 16.1042 20 14.2167 20 12C20 11.7167 20.0958 11.4792 20.2875 11.2875C20.4792 11.0958 20.7167 11 21 11C21.2833 11 21.5208 11.0958 21.7125 11.2875C21.9042 11.4792 22 11.7167 22 12C22 13.3667 21.7375 14.6583 21.2125 15.875C20.6875 17.0917 19.9708 18.1542 19.0625 19.0625C18.1542 19.9708 17.0958 20.6875 15.8875 21.2125C14.6792 21.7375 13.3833 22 12 22Z' fill='%23FFFFFF'/%3E%3C/svg%3E`;\n\n/**\n * CometChatButton is a reusable button component with consistent styling.\n * Supports text, icon, loading state, and disabled state.\n *\n * @example\n * ```html\n * <cometchat-button\n *   [text]=\"'Submit'\"\n *   [iconURL]=\"'path/to/icon.svg'\"\n *   [disabled]=\"false\"\n *   [isLoading]=\"false\"\n *   (buttonClick)=\"onButtonClick($event)\"\n * ></cometchat-button>\n * ```\n */\n@Component({\n  selector: 'cometchat-button',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-button.component.html',\n  styleUrls: ['./cometchat-button.component.css'],\n})\nexport class CometChatButtonComponent implements OnChanges {\n  /** Button text label */\n  @Input() text?: string;\n\n  /** Tooltip text shown on hover */\n  @Input() hoverText?: string;\n\n  /** Icon URL for button icon (uses CSS mask) */\n  @Input() iconURL?: string;\n\n  /** Disabled state - prevents click events */\n  @Input() disabled?: boolean;\n\n  /** Loading state - shows loading animation and disables button */\n  @Input() isLoading = false;\n\n  /** Custom aria-label for accessibility (useful for icon-only buttons) */\n  @Input() ariaLabel?: string;\n\n  /** Icon-only mode - removes default width and padding for compact icon buttons */\n  @Input() iconOnly = false;\n\n  /** Emitted when button is clicked (only when not disabled and not loading) */\n  @Output() buttonClick = new EventEmitter<MouseEvent>();\n\n  /** Path to loading animation SVG (inline data URI for portability) */\n  readonly loadingIconURL = LOADING_ICON_SVG;\n\n  /**\n   * Normalizes null/undefined inputs to their default values.\n   * Prevents NG0100 ExpressionChangedAfterItHasBeenCheckedError.\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['disabled'] && changes['disabled'].currentValue == null) {\n      this.disabled = false;\n    }\n    if (changes['isLoading'] && changes['isLoading'].currentValue == null) {\n      this.isLoading = false;\n    }\n    if (changes['iconOnly'] && changes['iconOnly'].currentValue == null) {\n      this.iconOnly = false;\n    }\n  }\n\n  /**\n   * Handles button click event.\n   * Only emits if button is not disabled and not loading.\n   */\n  onButtonClick(event: MouseEvent): void {\n    if (!this.disabled && !this.isLoading) {\n      this.buttonClick.emit(event);\n    }\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * Activates button on Enter or Space key press.\n   * Requirement 11.2: Support Enter/Space key activation\n   */\n  onKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault(); // Prevent default space scrolling\n      event.stopPropagation(); // Prevent event from bubbling to parent handlers\n      if (!this.disabled && !this.isLoading) {\n        // Create a synthetic MouseEvent for consistency with click handler\n        const syntheticEvent = new MouseEvent('click', {\n          bubbles: false, // Don't bubble to prevent parent handlers from firing\n          cancelable: true,\n        });\n        this.buttonClick.emit(syntheticEvent);\n      }\n    }\n  }\n\n  /**\n   * Stops event propagation on mouse down/up to prevent parent handlers.\n   */\n  onMouseEvent(event: MouseEvent): void {\n    event.stopPropagation();\n  }\n\n  /**\n   * Determines if the button should be disabled.\n   */\n  get isDisabled(): boolean {\n    return !!this.disabled || this.isLoading;\n  }\n\n  /**\n   * Generates accessible label for the button.\n   * Priority: custom ariaLabel > text > hoverText > default\n   */\n  get accessibleLabel(): string | undefined {\n    if (this.ariaLabel) {\n      return this.ariaLabel;\n    }\n    if (this.text) {\n      return this.text;\n    }\n    if (this.hoverText) {\n      return this.hoverText;\n    }\n    // Return undefined to let native button text be used\n    return undefined;\n  }\n}\n","<div class=\"cometchat-button__wrapper\">\n  <button\n    class=\"cometchat-button\"\n    [class.cometchat-button--icon-only]=\"iconOnly && !text\"\n    type=\"button\"\n    [title]=\"hoverText || ''\"\n    [disabled]=\"isDisabled\"\n    [attr.aria-disabled]=\"isDisabled || null\"\n    [attr.aria-label]=\"accessibleLabel\"\n    [attr.aria-busy]=\"isLoading || null\"\n    (click)=\"onButtonClick($event)\"\n    (keydown)=\"onKeyDown($event)\"\n    (mouseup)=\"onMouseEvent($event)\"\n    (mousedown)=\"onMouseEvent($event)\"\n  >\n    @if (isLoading) {\n      <img\n        [src]=\"loadingIconURL\"\n        [attr.alt]=\"'button_loading_alt' | translate\"\n        aria-hidden=\"true\"\n        class=\"cometchat-button__loading-view\"\n      />\n      <span class=\"cometchat-button__sr-only\">{{ 'button_loading_text' | translate }}</span>\n    } @else {\n      @if (iconURL) {\n        <div\n          class=\"cometchat-button__icon cometchat-button__icon-default\"\n          [style.webkitMask]=\"'url(' + iconURL + ') center center no-repeat'\"\n          [style.mask]=\"'url(' + iconURL + ') center center no-repeat'\"\n          aria-hidden=\"true\"\n        ></div>\n      }\n      @if (text) {\n        <span class=\"cometchat-button__text\">{{ text }}</span>\n      }\n    }\n  </button>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ElementRef,\n  ViewChild,\n  AfterViewInit,\n  inject, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatButtonComponent } from '../cometchat-button/cometchat-button.component';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { FocusTrapService } from '../../../services/focus-trap.service';\n\n/**\n * CometChatConfirmDialog is a dialog component for confirmation actions.\n * It includes a title, description, and action buttons (confirm/cancel).\n * Can be used for displaying warning, alert, and info popups.\n *\n * Accessibility features:\n * - role=\"dialog\" and aria-modal=\"true\" for screen readers\n * - aria-labelledby references the dialog title\n * - Focus trap keeps Tab navigation within the dialog\n * - Escape key closes the dialog\n * - Focus is restored to the previously focused element on close\n *\n * @example\n * ```html\n * <cometchat-confirm-dialog\n *   [title]=\"'Delete Conversation?'\"\n *   [messageText]=\"'Are you sure you want to delete this conversation?'\"\n *   [confirmButtonText]=\"'Delete'\"\n *   [cancelButtonText]=\"'Cancel'\"\n *   (confirmClick)=\"onConfirm()\"\n *   (cancelClick)=\"onCancel()\"\n * ></cometchat-confirm-dialog>\n * ```\n */\n@Component({\n  selector: 'cometchat-confirm-dialog',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatButtonComponent],\n  templateUrl: './cometchat-confirm-dialog.component.html',\n  styleUrls: ['./cometchat-confirm-dialog.component.css'],\n})\nexport class CometChatConfirmDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** Dialog title - defaults to localized \"conversation_delete_title\" */\n  @Input() title: string = CometChatLocalize.getLocalizedString('conversation_delete_title');\n\n  /** Dialog message text - defaults to localized \"conversation_delete_subtitle\" */\n  @Input() messageText: string = CometChatLocalize.getLocalizedString(\n    'conversation_delete_subtitle'\n  );\n\n  /** Cancel button text - defaults to localized \"conversation_delete_confirm_no\" */\n  @Input() cancelButtonText: string = CometChatLocalize.getLocalizedString(\n    'conversation_delete_confirm_no'\n  );\n\n  /** Confirm button text - defaults to localized \"conversation_delete_confirm_yes\" */\n  @Input() confirmButtonText: string = CometChatLocalize.getLocalizedString(\n    'conversation_delete_confirm_yes'\n  );\n\n  /** Custom icon URL for the dialog icon. When set, overrides the default delete icon via inline style. */\n  @Input() iconURL: string = '';\n\n  /** Emitted when confirm button is clicked */\n  @Output() confirmClick = new EventEmitter<void>();\n\n  /** Emitted when cancel button is clicked */\n  @Output() cancelClick = new EventEmitter<void>();\n\n  /** Reference to the dialog container element */\n  @ViewChild('dialogContainer', { static: false }) dialogContainer!: ElementRef<HTMLDivElement>;\n\n  /** Unique ID for the title element for aria-labelledby */\n  titleId = `cometchat-confirm-dialog-title-${Math.random().toString(36).substr(2, 9)}`;\n\n  /** Internal loading state - shows loading animation on confirm button */\n  isLoading = false;\n\n  /** Internal error state - shows error message when true */\n  isError = false;\n\n  /** FocusTrapService for managing focus within the dialog */\n  private focusTrapService = inject(FocusTrapService);\n\n  /** Keyboard event listener reference for cleanup */\n  private escapeKeyListener: ((event: KeyboardEvent) => void) | null = null;\n\n  /** Error message from localization */\n  get errorMessage(): string {\n    return CometChatLocalize.getLocalizedString('conversation_delete_error');\n  }\n\n  ngOnInit(): void {\n    // Add keyboard event listener for Escape key\n    this.escapeKeyListener = this.handleEscapeKey.bind(this);\n    document.addEventListener('keydown', this.escapeKeyListener);\n  }\n\n  ngAfterViewInit(): void {\n    // Activate focus trap after view is initialized\n    if (this.dialogContainer?.nativeElement) {\n      this.focusTrapService.activate({\n        container: this.dialogContainer.nativeElement,\n        initialFocus: 'container',\n        returnFocusOnDeactivate: true,\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    // Remove keyboard event listener\n    if (this.escapeKeyListener) {\n      document.removeEventListener('keydown', this.escapeKeyListener);\n    }\n\n    // Deactivate focus trap (this also restores focus)\n    if (this.dialogContainer?.nativeElement) {\n      this.focusTrapService.deactivate(this.dialogContainer.nativeElement);\n    }\n  }\n\n  /**\n   * Handles Escape key to close the dialog.\n   * Focus trap Tab cycling is handled by FocusTrapService.\n   */\n  private handleEscapeKey(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.handleCancelClick();\n    }\n  }\n\n  /**\n   * Handles confirm button click.\n   * Sets loading state and emits confirmClick event.\n   */\n  handleSubmitClick(): void {\n    this.isLoading = true;\n    this.isError = false;\n    this.confirmClick.emit();\n  }\n\n  /**\n   * Handles cancel button click.\n   * Emits cancelClick event.\n   */\n  handleCancelClick(): void {\n    this.cancelClick.emit();\n  }\n\n  /**\n   * Called by parent to indicate success.\n   * Resets loading and error states.\n   */\n  setSuccess(): void {\n    this.isLoading = false;\n    this.isError = false;\n  }\n\n  /**\n   * Called by parent to indicate error.\n   * Shows error message and resets loading state.\n   */\n  setError(): void {\n    this.isError = true;\n    this.isLoading = false;\n  }\n}\n","<div class=\"cometchat\" style=\"width: 100%; height: fit-content;\">\n  @if (isError) {\n    <div class=\"cometchat-dialog-error-view cometchat-confirm-dialog-error-view\">\n      {{ errorMessage }}\n    </div>\n  }\n  <div \n    class=\"cometchat-confirm-dialog\" \n    #dialogContainer\n    role=\"dialog\"\n    aria-modal=\"true\"\n    [attr.aria-labelledby]=\"titleId\"\n    tabindex=\"-1\"\n  >\n    <div class=\"cometchat-confirm-dialog__icon-wrapper\">\n      <div \n        class=\"cometchat-confirm-dialog__icon-wrapper-icon\"\n        [style.-webkit-mask-image]=\"iconURL ? 'url(' + iconURL + ')' : null\"\n        [style.mask-image]=\"iconURL ? 'url(' + iconURL + ')' : null\"\n      ></div>\n    </div>\n    <div class=\"cometchat-confirm-dialog__content\">\n      <div \n        class=\"cometchat-confirm-dialog__content-title\"\n        [id]=\"titleId\"\n      >\n        {{ title }}\n      </div>\n      <div class=\"cometchat-confirm-dialog__content-description\">\n        {{ messageText }}\n      </div>\n    </div>\n    <div class=\"cometchat-confirm-dialog__button-group\">\n      <div class=\"cometchat-confirm-dialog__button-group-cancel\">\n        <cometchat-button\n          [text]=\"cancelButtonText\"\n          (buttonClick)=\"handleCancelClick()\"\n        ></cometchat-button>\n      </div>\n      <div class=\"cometchat-confirm-dialog__button-group-submit\">\n        <cometchat-button\n          [text]=\"confirmButtonText\"\n          [isLoading]=\"isLoading\"\n          (buttonClick)=\"handleSubmitClick()\"\n        ></cometchat-button>\n      </div>\n    </div>\n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ElementRef,\n  ViewChild,\n  AfterViewInit,\n  signal, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CometChatButtonComponent } from '../cometchat-button/cometchat-button.component';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\n\n/**\n * Link data interface for add/edit operations\n */\nexport interface LinkData {\n  /** Display text for the link */\n  text: string;\n  /** URL for the link */\n  url: string;\n}\n\n/**\n * CometChatLinkDialog is a dialog component for adding and editing links in rich text.\n * It includes input fields for link text and URL, with validation and action buttons.\n *\n * @example\n * ```html\n * <!-- Add Link Mode -->\n * <cometchat-link-dialog\n *   [mode]=\"'add'\"\n *   [selectedText]=\"'Click here'\"\n *   (save)=\"onSaveLink($event)\"\n *   (cancel)=\"onCancelLink()\"\n * ></cometchat-link-dialog>\n *\n * <!-- Edit Link Mode -->\n * <cometchat-link-dialog\n *   [mode]=\"'edit'\"\n *   [initialText]=\"'Example'\"\n *   [initialUrl]=\"'https://example.com'\"\n *   (save)=\"onSaveLink($event)\"\n *   (remove)=\"onRemoveLink()\"\n *   (cancel)=\"onCancelLink()\"\n * ></cometchat-link-dialog>\n * ```\n */\n@Component({\n  selector: 'cometchat-link-dialog',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, CometChatButtonComponent, TranslatePipe],\n  templateUrl: './cometchat-link-dialog.component.html',\n  styleUrls: ['./cometchat-link-dialog.component.css'],\n})\nexport class CometChatLinkDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  /**\n   * Dialog mode - 'add' for new links, 'edit' for existing links\n   * @default 'add'\n   */\n  @Input() mode: 'add' | 'edit' = 'add';\n\n  /**\n   * Initial text value (for edit mode or pre-filled add mode)\n   */\n  @Input() initialText = '';\n\n  /**\n   * Initial URL value (for edit mode)\n   */\n  @Input() initialUrl = '';\n\n  /**\n   * Selected text from editor (used as default text in add mode)\n   */\n  @Input() selectedText = '';\n\n  /**\n   * Emitted when save button is clicked with valid link data\n   */\n  @Output() save = new EventEmitter<LinkData>();\n\n  /**\n   * Emitted when cancel button is clicked\n   */\n  @Output() cancel = new EventEmitter<void>();\n\n  /**\n   * Emitted when remove button is clicked (edit mode only)\n   */\n  @Output() remove = new EventEmitter<void>();\n\n  /** Reference to the dialog container element */\n  @ViewChild('dialogContainer', { static: false }) dialogContainer!: ElementRef<HTMLDivElement>;\n\n  /** Reference to the text input element */\n  @ViewChild('textInput', { static: false }) textInput!: ElementRef<HTMLInputElement>;\n\n  /** Reference to the URL input element */\n  @ViewChild('urlInput', { static: false }) urlInput!: ElementRef<HTMLInputElement>;\n\n  /** Unique ID for the title element for aria-labelledby */\n  titleId = `cometchat-link-dialog-title-${Math.random().toString(36).substr(2, 9)}`;\n\n  /** Unique ID for the error message element for aria-describedby */\n  errorId = `cometchat-link-dialog-error-${Math.random().toString(36).substr(2, 9)}`;\n\n  /** Link text value */\n  linkText = signal<string>('');\n\n  /** Link URL value */\n  linkUrl = signal<string>('');\n\n  /** Validation error message */\n  errorMessage = signal<string>('');\n\n  /** Store the previously focused element for restoration */\n  private previouslyFocusedElement: HTMLElement | null = null;\n\n  /** Store all focusable elements within the dialog */\n  private focusableElements: HTMLElement[] = [];\n\n  /** Keyboard event listener reference for cleanup */\n  private keydownListener: ((event: KeyboardEvent) => void) | null = null;\n\n  /** URL validation regex */\n  private urlPattern = /^(https?:\\/\\/)?([\\da-z\\.-]+)\\.([a-z\\.]{2,6})([\\/\\w \\.-]*)*\\/?$/i;\n\n  ngOnInit(): void {\n    // Initialize values based on mode\n    if (this.mode === 'edit') {\n      this.linkText.set(this.initialText);\n      this.linkUrl.set(this.initialUrl);\n    } else {\n      // Add mode - use selected text or initial text\n      this.linkText.set(this.selectedText || this.initialText);\n      this.linkUrl.set(this.initialUrl);\n    }\n\n    // Store the currently focused element to restore later\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n    // Add keyboard event listener for Escape key\n    this.keydownListener = this.handleKeydown.bind(this);\n    document.addEventListener('keydown', this.keydownListener);\n  }\n\n  ngAfterViewInit(): void {\n    // Set up focus trapping after view is initialized\n    this.setupFocusTrap();\n\n    // Focus the appropriate input field\n    this.pendingTimers.push(setTimeout(() => {\n      if (this.mode === 'add' && !this.linkText()) {\n        // Add mode with no text - focus text input\n        this.textInput?.nativeElement.focus();\n      } else {\n        // Edit mode or add mode with text - focus URL input\n        this.urlInput?.nativeElement.focus();\n        // Select all text in URL input for easy replacement\n        this.urlInput?.nativeElement.select();\n      }\n    }, 0));\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    // Remove keyboard event listener\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n    }\n\n    // Restore focus to the previously focused element\n    this.restoreFocus();\n  }\n\n  /**\n   * Sets up focus trapping within the dialog.\n   * Finds all focusable elements and adds Tab key handling.\n   */\n  private setupFocusTrap(): void {\n    if (!this.dialogContainer) {\n      return;\n    }\n\n    // Find all focusable elements within the dialog\n    const focusableSelectors = [\n      'button:not([disabled])',\n      '[href]',\n      'input:not([disabled])',\n      'select:not([disabled])',\n      'textarea:not([disabled])',\n      '[tabindex]:not([tabindex=\"-1\"])',\n    ];\n\n    const elements = this.dialogContainer.nativeElement.querySelectorAll(\n      focusableSelectors.join(', ')\n    );\n\n    this.focusableElements = Array.from(elements) as HTMLElement[];\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * - Escape key: closes the dialog\n   * - Tab key: traps focus within the dialog\n   * - Enter key: saves the link (if valid)\n   */\n  private handleKeydown(event: KeyboardEvent): void {\n    // Handle Escape key to close dialog\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.handleCancelClick();\n      return;\n    }\n\n    // Handle Enter key to save (if not in a button)\n    if (event.key === 'Enter' && event.target instanceof HTMLInputElement) {\n      event.preventDefault();\n      this.handleSaveClick();\n      return;\n    }\n\n    // Handle Tab key for focus trapping\n    if (event.key === 'Tab' && this.focusableElements.length > 0) {\n      const firstElement = this.focusableElements[0];\n      const lastElement = this.focusableElements[this.focusableElements.length - 1];\n      const activeElement = document.activeElement as HTMLElement;\n\n      // If Shift+Tab on first element, move to last element\n      if (event.shiftKey && activeElement === firstElement) {\n        event.preventDefault();\n        lastElement.focus();\n      }\n      // If Tab on last element, move to first element\n      else if (!event.shiftKey && activeElement === lastElement) {\n        event.preventDefault();\n        firstElement.focus();\n      }\n    }\n  }\n\n  /**\n   * Restores focus to the element that was focused before the dialog opened.\n   */\n  private restoreFocus(): void {\n    if (\n      this.previouslyFocusedElement &&\n      typeof this.previouslyFocusedElement.focus === 'function'\n    ) {\n      // Use setTimeout to ensure the dialog is fully removed from DOM\n      this.pendingTimers.push(setTimeout(() => {\n        this.previouslyFocusedElement?.focus();\n      }, 0));\n    }\n  }\n\n  /**\n   * Validates the URL format\n   */\n  private validateUrl(url: string): boolean {\n    if (!url || url.trim() === '') {\n      return false;\n    }\n    // Accept any non-empty URL string (Req 2.20)\n    return true;\n  }\n\n  /**\n   * Normalizes URL by adding protocol if missing\n   */\n  private normalizeUrl(url: string): string {\n    const trimmedUrl = url.trim();\n\n    // Check if URL already has any protocol\n    if (/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//i.test(trimmedUrl) || /^mailto:/i.test(trimmedUrl)) {\n      return trimmedUrl;\n    }\n\n    return `https://${trimmedUrl}`;\n  }\n\n  /**\n   * Handles save button click.\n   * Validates inputs and emits save event with link data.\n   */\n  handleSaveClick(): void {\n    // Clear previous error\n    this.errorMessage.set('');\n\n    const text = this.linkText().trim();\n    const url = this.linkUrl().trim();\n\n    // Validate text (required in add mode, optional in edit mode)\n    if (this.mode === 'add' && !text) {\n      this.errorMessage.set('message_composer_link_text_required');\n      this.textInput?.nativeElement.focus();\n      return;\n    }\n\n    // Validate URL (required)\n    if (!url) {\n      this.errorMessage.set('message_composer_link_url_required');\n      this.urlInput?.nativeElement.focus();\n      return;\n    }\n\n    if (!this.validateUrl(url)) {\n      this.errorMessage.set('message_composer_link_url_invalid');\n      this.urlInput?.nativeElement.focus();\n      return;\n    }\n\n    // Normalize URL and emit save event\n    const normalizedUrl = this.normalizeUrl(url);\n    this.save.emit({\n      text: text || normalizedUrl, // Use URL as text if text is empty\n      url: normalizedUrl,\n    });\n  }\n\n  /**\n   * Handles cancel button click.\n   * Emits cancel event.\n   */\n  handleCancelClick(): void {\n    this.cancel.emit();\n  }\n\n  /**\n   * Handles remove button click (edit mode only).\n   * Emits remove event.\n   */\n  handleRemoveClick(): void {\n    this.remove.emit();\n  }\n\n  /**\n   * Handles text input change\n   */\n  onTextChange(value: string): void {\n    this.linkText.set(value);\n    // Clear error when user starts typing\n    if (this.errorMessage()) {\n      this.errorMessage.set('');\n    }\n  }\n\n  /**\n   * Handles URL input change\n   */\n  onUrlChange(value: string): void {\n    this.linkUrl.set(value);\n    // Clear error when user starts typing\n    if (this.errorMessage()) {\n      this.errorMessage.set('');\n    }\n  }\n}\n","<div class=\"cometchat\" style=\"width: 100%; height: fit-content;\">\n  <div \n    class=\"cometchat-link-dialog\" \n    #dialogContainer\n    role=\"dialog\"\n    aria-modal=\"true\"\n    [attr.aria-labelledby]=\"titleId\"\n    [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n  >\n    <!-- Dialog Title -->\n    <div \n      class=\"cometchat-link-dialog__title\"\n      [id]=\"titleId\"\n    >\n      {{ mode === 'add' ? ('message_composer_add_link' | translate) : ('message_composer_edit_link' | translate) }}\n    </div>\n\n    <!-- Input Fields -->\n    <div class=\"cometchat-link-dialog__inputs\">\n      <!-- Text Input -->\n      <div class=\"cometchat-link-dialog__input-group\">\n        <label \n          class=\"cometchat-link-dialog__label\"\n          for=\"link-text-input\"\n        >\n          {{ 'message_composer_link_text' | translate }}\n        </label>\n        <input\n          #textInput\n          id=\"link-text-input\"\n          type=\"text\"\n          class=\"cometchat-link-dialog__input\"\n          autocomplete=\"off\"\n          [value]=\"linkText()\"\n          (input)=\"onTextChange($any($event.target).value)\"\n          [placeholder]=\"'message_composer_link_text_placeholder' | translate\"\n          [attr.aria-label]=\"'message_composer_link_text' | translate\"\n          [attr.aria-required]=\"mode === 'add' ? 'true' : 'false'\"\n          [attr.aria-invalid]=\"errorMessage() ? 'true' : 'false'\"\n          [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n        />\n      </div>\n\n      <!-- URL Input -->\n      <div class=\"cometchat-link-dialog__input-group\">\n        <label \n          class=\"cometchat-link-dialog__label\"\n          for=\"link-url-input\"\n        >\n          {{ 'message_composer_link_url' | translate }}\n        </label>\n        <input\n          #urlInput\n          id=\"link-url-input\"\n          type=\"text\"\n          class=\"cometchat-link-dialog__input\"\n          autocomplete=\"off\"\n          [value]=\"linkUrl()\"\n          (input)=\"onUrlChange($any($event.target).value)\"\n          [placeholder]=\"'message_composer_link_url_placeholder' | translate\"\n          [attr.aria-label]=\"'message_composer_link_url' | translate\"\n          aria-required=\"true\"\n          [attr.aria-invalid]=\"errorMessage() ? 'true' : 'false'\"\n          [attr.aria-describedby]=\"errorMessage() ? errorId : null\"\n        />\n      </div>\n\n      <!-- Error Message -->\n      @if (errorMessage()) {\n        <div \n          [id]=\"errorId\"\n          class=\"cometchat-link-dialog__error\"\n          role=\"alert\"\n          aria-live=\"polite\"\n        >\n          {{ errorMessage() | translate }}\n        </div>\n      }\n    </div>\n\n    <!-- Button Group -->\n    <div class=\"cometchat-link-dialog__button-group\">\n      <!-- Cancel Button -->\n      <div class=\"cometchat-link-dialog__button-group-cancel\">\n        <cometchat-button\n          [text]=\"'message_composer_cancel' | translate\"\n          [ariaLabel]=\"'message_composer_cancel' | translate\"\n          (buttonClick)=\"handleCancelClick()\"\n        ></cometchat-button>\n      </div>\n\n      <!-- Save Button -->\n      <div class=\"cometchat-link-dialog__button-group-save\">\n        <cometchat-button\n          [text]=\"'message_composer_save' | translate\"\n          [ariaLabel]=\"'message_composer_save' | translate\"\n          (buttonClick)=\"handleSaveClick()\"\n        ></cometchat-button>\n      </div>\n    </div>\n  </div>\n</div>\n","import {\n  Component,\n  EventEmitter,\n  Input,\n  Output,\n  ElementRef,\n  AfterViewInit,\n  ViewChild,\n  OnInit,\n  OnDestroy, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\n\n/**\n * Link data interface\n */\nexport interface LinkPopoverData {\n  url: string;\n  text: string;\n}\n\n/**\n * CometChatLinkPopoverComponent\n *\n * A small popover that appears when clicking on a link in the editor.\n * Shows \"Edit\" and \"Remove\" buttons for quick link actions.\n * Positioned above the clicked link using viewport coordinates.\n *\n * @component\n */\n@Component({\n  selector: 'cometchat-link-popover',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-link-popover.component.html',\n  styleUrls: ['./cometchat-link-popover.component.css'],\n})\nexport class CometChatLinkPopoverComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  @ViewChild('popoverElement') popoverElement!: ElementRef<HTMLDivElement>;\n  @ViewChild('editButton') editButton!: ElementRef<HTMLButtonElement>;\n  @ViewChild('removeButton') removeButton!: ElementRef<HTMLButtonElement>;\n\n  /** The link URL to display */\n  @Input() url = '';\n\n  /** The link text */\n  @Input() text = '';\n\n  /** X coordinate (viewport-relative center of the link element) */\n  @Input() x = 0;\n\n  /** Y coordinate (viewport-relative top of the link element) */\n  @Input() y = 0;\n\n  /** Emitted when the Edit button is clicked */\n  @Output() editClick = new EventEmitter<LinkPopoverData>();\n\n  /** Emitted when the Remove button is clicked */\n  @Output() removeClick = new EventEmitter<void>();\n\n  /** Emitted when the popover should be closed */\n  @Output() closeClick = new EventEmitter<void>();\n\n  /** Whether the popover position has been calculated */\n  isPositioned = false;\n\n  /** Calculated position styles */\n  popoverTop = 0;\n  popoverLeft = 0;\n\n  /** Store the previously focused element for restoration */\n  private previouslyFocusedElement: HTMLElement | null = null;\n\n  /** Keyboard event listener reference for cleanup */\n  private keydownListener: ((event: KeyboardEvent) => void) | null = null;\n\n  /** Document click listener for closing on outside click */\n  private documentClickListener: ((event: MouseEvent) => void) | null = null;\n\n  /** Current focused menu item index (0 = edit, 1 = remove) */\n  private focusedIndex = 0;\n\n  constructor(private hostEl: ElementRef) {}\n\n  ngOnInit(): void {\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n    this.keydownListener = this.handleKeydown.bind(this);\n    document.addEventListener('keydown', this.keydownListener);\n\n    // Close on outside click — delay 150ms to avoid catching the triggering click\n    this.pendingTimers.push(setTimeout(() => {\n      this.documentClickListener = this.handleDocumentClick.bind(this);\n      document.addEventListener('click', this.documentClickListener as EventListener, true);\n    }, 150));\n  }\n\n  ngAfterViewInit(): void {\n    // Initial position estimate using link coordinates\n    this.positionAboveLink();\n    this.isPositioned = true;\n\n    // Refine with actual popover dimensions after layout\n    this.pendingTimers.push(setTimeout(() => {\n      this.refinePosition();\n      this.editButton?.nativeElement.focus();\n    }, 0));\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n    }\n    if (this.documentClickListener) {\n      document.removeEventListener('click', this.documentClickListener as EventListener, true);\n    }\n    this.restoreFocus();\n  }\n\n  private handleKeydown(event: KeyboardEvent): void {\n    switch (event.key) {\n      case 'Escape':\n        event.preventDefault();\n        this.closeClick.emit();\n        break;\n      case 'Tab':\n        this.trapTabFocus(event);\n        break;\n      case 'ArrowDown':\n      case 'ArrowRight':\n        event.preventDefault();\n        this.focusNextItem();\n        break;\n      case 'ArrowUp':\n      case 'ArrowLeft':\n        event.preventDefault();\n        this.focusPreviousItem();\n        break;\n    }\n  }\n\n  /**\n   * Keeps Tab focus cycling within the popover (dialog focus trap), so the\n   * close button and URL link are reachable instead of Tab closing the popover.\n   */\n  private trapTabFocus(event: KeyboardEvent): void {\n    const root = this.popoverElement?.nativeElement;\n    if (!root) { event.preventDefault(); return; }\n    const focusables = Array.from(\n      root.querySelectorAll<HTMLElement>(\n        'a[href], button:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n      )\n    ).filter(el => el.offsetParent !== null);\n    if (focusables.length === 0) { event.preventDefault(); return; }\n    const first = focusables[0];\n    const last = focusables[focusables.length - 1];\n    const active = document.activeElement as HTMLElement | null;\n    const inside = !!active && root.contains(active);\n    if (event.shiftKey) {\n      if (!inside || active === first) { event.preventDefault(); last.focus(); }\n    } else {\n      if (!inside || active === last) { event.preventDefault(); first.focus(); }\n    }\n  }\n\n  private focusNextItem(): void {\n    if (this.focusedIndex === 0) {\n      this.focusedIndex = 1;\n      this.removeButton?.nativeElement.focus();\n    } else {\n      this.focusedIndex = 0;\n      this.editButton?.nativeElement.focus();\n    }\n  }\n\n  private focusPreviousItem(): void {\n    if (this.focusedIndex === 1) {\n      this.focusedIndex = 0;\n      this.editButton?.nativeElement.focus();\n    } else {\n      this.focusedIndex = 1;\n      this.removeButton?.nativeElement.focus();\n    }\n  }\n\n  private restoreFocus(): void {\n    if (\n      this.previouslyFocusedElement &&\n      typeof this.previouslyFocusedElement.focus === 'function'\n    ) {\n      this.pendingTimers.push(setTimeout(() => {\n        this.previouslyFocusedElement?.focus();\n      }, 0));\n    }\n  }\n\n  /**\n   * Initial position estimate using link x/y coordinates.\n   * Uses estimated dimensions before the popover has been laid out.\n   */\n  private positionAboveLink(): void {\n    const estimatedHeight = 120;\n    const estimatedWidth = 280;\n    const gap = 8;\n\n    if (this.x > 0 && this.y > 0) {\n      let top = this.y - estimatedHeight - gap;\n      let left = this.x - estimatedWidth / 2;\n\n      // Flip below if no room above\n      if (top < gap) { top = this.y + gap; }\n      // Clamp horizontally\n      if (left < gap) { left = gap; }\n      if (left + estimatedWidth > window.innerWidth - gap) {\n        left = window.innerWidth - estimatedWidth - gap;\n      }\n\n      this.popoverTop = top;\n      this.popoverLeft = left;\n      return;\n    }\n\n    // Fallback: center above composer\n    this.positionAboveComposer();\n  }\n\n  /**\n   * Fallback positioning: center above the composer element.\n   */\n  private positionAboveComposer(): void {\n    const hostEl = this.hostEl.nativeElement as HTMLElement;\n    const gap = 8;\n\n    const container = this.findContainerAncestor(hostEl);\n    if (container) {\n      const rect = container.getBoundingClientRect();\n      this.popoverTop = rect.top + rect.height / 2 - 80;\n      this.popoverLeft = rect.left + (rect.width - 280) / 2;\n      if (this.popoverTop < rect.top + gap) { this.popoverTop = rect.top + gap; }\n      if (this.popoverLeft < rect.left + gap) { this.popoverLeft = rect.left + gap; }\n      return;\n    }\n\n    const composer = hostEl.closest('.cometchat-message-composer') as HTMLElement | null;\n    if (composer) {\n      const rect = composer.getBoundingClientRect();\n      this.popoverTop = rect.top - 160;\n      this.popoverLeft = rect.left + (rect.width - 280) / 2;\n      if (this.popoverTop < gap) { this.popoverTop = gap; }\n      if (this.popoverLeft < gap) { this.popoverLeft = gap; }\n      return;\n    }\n\n    // Last resort: use click coordinates\n    this.popoverTop = Math.max(gap, this.y - 160);\n    this.popoverLeft = Math.max(gap, this.x);\n  }\n\n  /**\n   * Refine position after layout using actual popover dimensions.\n   */\n  private refinePosition(): void {\n    if (!this.popoverElement) { return; }\n\n    const popoverEl = this.popoverElement.nativeElement;\n    const rect = popoverEl.getBoundingClientRect();\n    const gap = 8;\n\n    if (this.x > 0 && this.y > 0) {\n      let left = this.x - rect.width / 2;\n      let top = this.y - rect.height - gap;\n\n      // Flip below if no room above\n      if (top < gap) { top = this.y + gap; }\n      // Clamp horizontally\n      if (left < gap) { left = gap; }\n      if (left + rect.width > window.innerWidth - gap) {\n        left = window.innerWidth - rect.width - gap;\n      }\n      // Clamp vertically\n      if (top + rect.height > window.innerHeight - gap) {\n        top = window.innerHeight - rect.height - gap;\n      }\n\n      this.popoverLeft = left;\n      this.popoverTop = top;\n      return;\n    }\n\n    // Fallback: refine composer-centered position\n    const hostEl = this.hostEl.nativeElement as HTMLElement;\n    const container = this.findContainerAncestor(hostEl);\n    if (container) {\n      const containerRect = container.getBoundingClientRect();\n      this.popoverLeft = containerRect.left + (containerRect.width - rect.width) / 2;\n      this.popoverTop = containerRect.top + containerRect.height / 2 - rect.height / 2;\n      if (this.popoverLeft + rect.width > containerRect.right - gap) {\n        this.popoverLeft = containerRect.right - rect.width - gap;\n      }\n      if (this.popoverLeft < containerRect.left + gap) { this.popoverLeft = containerRect.left + gap; }\n      if (this.popoverTop < containerRect.top + gap) { this.popoverTop = containerRect.top + gap; }\n      return;\n    }\n\n    const composer = hostEl.closest('.cometchat-message-composer') as HTMLElement | null;\n    if (composer) {\n      const composerRect = composer.getBoundingClientRect();\n      this.popoverLeft = composerRect.left + (composerRect.width - rect.width) / 2;\n      this.popoverTop = composerRect.top - rect.height - gap;\n    }\n\n    // Clamp to viewport\n    if (this.popoverLeft + rect.width > window.innerWidth) {\n      this.popoverLeft = window.innerWidth - rect.width - gap;\n    }\n    if (this.popoverLeft < gap) { this.popoverLeft = gap; }\n    if (this.popoverTop < gap) { this.popoverTop = gap; }\n  }\n\n  /**\n   * Finds the nearest [data-cometchat-container] ancestor element.\n   * Used to scope positioning to the Storybook story container.\n   */\n  private findContainerAncestor(el: HTMLElement): HTMLElement | null {\n    let current: HTMLElement | null = el.parentElement;\n    while (current) {\n      if (current.hasAttribute('data-cometchat-container')) {\n        return current;\n      }\n      current = current.parentElement;\n    }\n    return null;\n  }\n\n  /** Handle document click to close popover when clicking outside */\n  private handleDocumentClick(event: MouseEvent): void {\n    if (!this.popoverElement) { return; }\n    const popoverEl = this.popoverElement.nativeElement;\n    if (!popoverEl.contains(event.target as Node)) {\n      this.closeClick.emit();\n    }\n  }\n\n  handleEditClick(): void {\n    this.editClick.emit({ url: this.url, text: this.text });\n  }\n\n  handleRemoveClick(): void {\n    this.removeClick.emit();\n  }\n\n  handleCloseClick(): void {\n    this.closeClick.emit();\n  }\n\n  /** Prevent clicks inside popover from bubbling to document listener */\n  handlePopoverClick(event: MouseEvent): void {\n    event.stopPropagation();\n  }\n}\n","<!-- Popover - positioned fixed to float above link text -->\n<div \n  #popoverElement\n  class=\"cometchat-link-popover\"\n  [style.top.px]=\"popoverTop\"\n  [style.left.px]=\"popoverLeft\"\n  [style.visibility]=\"isPositioned ? 'visible' : 'hidden'\"\n  (click)=\"handlePopoverClick($event)\"\n  role=\"dialog\"\n  [attr.aria-label]=\"'link_popover_aria_label' | translate\"\n>\n  <!-- Close Button -->\n  <button\n    class=\"cometchat-link-popover__close\"\n    (click)=\"handleCloseClick()\"\n    type=\"button\"\n    [attr.aria-label]=\"'close' | translate\"\n  >\n    &times;\n  </button>\n\n  <!-- Link Title -->\n  <div class=\"cometchat-link-popover__title\" aria-hidden=\"true\">\n    {{ text }}\n  </div>\n\n  <!-- Link URL Display -->\n  <a class=\"cometchat-link-popover__url\" [href]=\"url\" target=\"_blank\" rel=\"noopener noreferrer\" (click)=\"$event.stopPropagation()\">\n    {{ url }}\n  </a>\n\n  <!-- Action Buttons -->\n  <div class=\"cometchat-link-popover__actions\">\n    <button\n      #editButton\n      class=\"cometchat-link-popover__button cometchat-link-popover__button--edit\"\n      (click)=\"handleEditClick()\"\n      type=\"button\"\n      [attr.aria-label]=\"('message_composer_edit' | translate) + ' ' + ('message_composer_link' | translate)\"\n    >\n      {{ 'message_composer_edit' | translate }}\n    </button>\n\n    <button\n      #removeButton\n      class=\"cometchat-link-popover__button cometchat-link-popover__button--remove\"\n      (click)=\"handleRemoveClick()\"\n      type=\"button\"\n      [attr.aria-label]=\"('message_composer_remove' | translate) + ' ' + ('message_composer_link' | translate)\"\n    >\n      {{ 'message_composer_remove' | translate }}\n    </button>\n  </div>\n</div>\n","/**\n * Utility functions for CometChat UIKit\n */\n\n/**\n * Checks if the current device is a mobile device.\n * @returns boolean - true if the device is mobile, false otherwise\n */\nexport function isMobileDevice(): boolean {\n  return /Mobi|Android|iPhone|iPad|iPod|BlackBerry|Windows Phone/i.test(navigator.userAgent);\n}\n\n/**\n * Checks if the current browser is Safari.\n * @returns boolean - true if the browser is Safari, false otherwise\n */\nexport function isSafari(): boolean {\n  const userAgent = navigator.userAgent;\n  return /^((?!chrome|android).)*safari/i.test(userAgent);\n}\n\n/**\n * Checks if the current theme is dark mode.\n * @returns boolean - true if dark mode is enabled, false otherwise\n */\nexport function isDarkMode(): boolean {\n  return document.querySelector('[data-theme=\"dark\"]') ? true : false;\n}\n\n/**\n * Gets the value of a CSS custom property (CSS variable).\n * @param name - The name of the CSS variable (e.g., '--cometchat-primary-color')\n * @returns string - The value of the CSS variable\n */\nexport function getThemeVariable(name: string): string {\n  const root = document.documentElement;\n  return getComputedStyle(root).getPropertyValue(name).trim();\n}\n\n/**\n * Gets the current theme mode.\n * @returns 'dark' | 'light' - The current theme mode\n */\nexport function getThemeMode(): 'dark' | 'light' {\n  const isDark = document.querySelector('[data-theme=\"dark\"]') ? true : false;\n  return isDark ? 'dark' : 'light';\n}\n\n/**\n * Fires a custom click event on the window.\n * Used for overlay click handling.\n */\nexport function fireClickEvent(): void {\n  if (window) {\n    window.dispatchEvent(new CustomEvent('overlayclick'));\n  }\n}\n\n/**\n * Sanitizes a CalendarObject by removing undefined values.\n * @param calendarObject - The calendar object to sanitize\n * @returns object - The sanitized calendar object\n */\nexport function sanitizeCalendarObject<T extends object>(calendarObject?: T | null): Partial<T> {\n  if (!calendarObject) {\n    return {} as Partial<T>;\n  }\n  const sanitized: Record<string, unknown> = {};\n  Object.keys(calendarObject).forEach(key => {\n    if ((calendarObject as Record<string, unknown>)[key] !== undefined) {\n      sanitized[key] = (calendarObject as Record<string, unknown>)[key];\n    }\n  });\n  return sanitized as Partial<T>;\n}\n\n/**\n * Strips rich text formatting markers from text, converting it to plain text.\n * Removes markdown-style formatting like **bold**, *italic*, __underline__, ~~strikethrough~~,\n * `code`, and HTML tags, leaving only the text content.\n *\n * IMPORTANT: Preserves SDK mention tags (<@uid:xxx> and <@all:xxx>) so they can be\n * formatted by the mentions formatter later.\n *\n * This is useful for displaying message previews in conversation lists where\n * formatting markers would be distracting.\n *\n * @param text - The text with rich text formatting markers\n * @returns string - The plain text without formatting markers (but with SDK mentions preserved)\n *\n * @example\n * ```typescript\n * stripRichTextFormatting('**Hello** *world*') // Returns: 'Hello world'\n * stripRichTextFormatting('Check out `code` here') // Returns: 'Check out code here'\n * stripRichTextFormatting('``double backtick``') // Returns: 'double backtick'\n * stripRichTextFormatting('> quoted text') // Returns: 'quoted text'\n * stripRichTextFormatting('<p>HTML content</p>') // Returns: 'HTML content'\n * stripRichTextFormatting('**Hello** <@uid:123>') // Returns: 'Hello <@uid:123>' (mention preserved)\n * ```\n */\nexport function stripRichTextFormatting(text: string): string {\n  if (!text) {\n    return '';\n  }\n\n  let result = text;\n\n  // IMPORTANT: Preserve SDK mention tags before stripping HTML\n  // Temporarily replace SDK mentions with placeholders\n  // Use zero-width characters that won't be affected by HTML/markdown stripping\n  const mentionPlaceholders: { placeholder: string; original: string }[] = [];\n  let mentionIndex = 0;\n\n  // Preserve user mentions: <@uid:xxx>\n  result = result.replace(/<@uid:([^>]+)>/g, match => {\n    // Use a unique placeholder with zero-width characters and a unique ID\n    const placeholder = `\\u200B\\u200CSDKMENTION${mentionIndex}\\u200C\\u200B`;\n    mentionPlaceholders.push({ placeholder, original: match });\n    mentionIndex++;\n    return placeholder;\n  });\n\n  // Preserve channel mentions: <@all:xxx>\n  result = result.replace(/<@all:([^>]+)>/g, match => {\n    const placeholder = `\\u200B\\u200CSDKMENTION${mentionIndex}\\u200C\\u200B`;\n    mentionPlaceholders.push({ placeholder, original: match });\n    mentionIndex++;\n    return placeholder;\n  });\n\n  // Strip known rich text HTML tags (but preserve the content inside)\n  // Only strip tags that are used for formatting (from rich text editors).\n  // Unknown tags like <img>, <script>, etc. are left as-is so they can be:\n  // - Auto-escaped by Angular's {{ }} interpolation (non-HTML path)\n  // - Sanitized by DOMPurify when rendered via [innerHTML] (HTML path)\n  const knownFormattingTags =\n    /(<\\/?(p|br|strong|em|u|s|code|pre|blockquote|ul|ol|li|a|span|div|h[1-6])\\b[^>]*>)/gi;\n  result = result.replace(knownFormattingTags, '');\n\n  // Strip markdown formatting markers\n  // Bold: **text** or __text__\n  result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '$1');\n  result = result.replace(/__([^_]+)__/g, '$1');\n\n  // Italic: *text* or _text_ (but not if it's part of __ or **)\n  result = result.replace(/(?<!\\*)\\*(?!\\*)([^*]+)\\*(?!\\*)/g, '$1');\n  result = result.replace(/(?<!_)_(?!_)([^_]+)_(?!_)/g, '$1');\n\n  // Strikethrough: ~~text~~\n  result = result.replace(/~~([^~]+)~~/g, '$1');\n\n  // Code blocks: ```text``` (must be before inline code)\n  result = result.replace(/```[\\s\\S]*?```/g, match => {\n    // Extract content between triple backticks, remove language identifier if present\n    const content = match\n      .slice(3, -3)\n      .replace(/^\\w*\\n?/, '')\n      .trim();\n    return content;\n  });\n\n  // Double backtick code: ``text``\n  result = result.replace(/``([^`]+)``/g, '$1');\n\n  // Inline code: `text`\n  result = result.replace(/`([^`]+)`/g, '$1');\n\n  // Blockquotes: > text (at start of line or after newline) — only strip when there's content after >\n  result = result.replace(/(?:^|\\n)>\\s+(.+)/g, '\\n$1');\n\n  // Links: [text](url) -> text\n  result = result.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n\n  // Clean up any remaining HTML entities\n  result = result.replace(/&nbsp;/g, ' ');\n  result = result.replace(/&lt;/g, '<');\n  result = result.replace(/&gt;/g, '>');\n  result = result.replace(/&amp;/g, '&');\n  result = result.replace(/&quot;/g, '\"');\n  result = result.replace(/&#39;/g, \"'\");\n\n  // Clean up multiple spaces\n  result = result.replace(/\\s+/g, ' ').trim();\n\n  // Restore SDK mention tags\n  // Using replaceAll for more reliable replacement\n  mentionPlaceholders.forEach(({ placeholder, original }) => {\n    // Use a while loop to ensure all instances are replaced\n    while (result.includes(placeholder)) {\n      result = result.replace(placeholder, original);\n    }\n  });\n\n  return result;\n}\n","/**\n * Utility functions for CometChatContextMenu component.\n */\nimport { Placement } from '../../../Enums/Enums';\nimport { isMobileDevice } from '../../../utils/util';\n\n/**\n * Returns true when running inside a Storybook docs-mode iframe.\n */\nexport function isContextMenuDocsMode(): boolean {\n  try {\n    return window.parent !== window;\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Finds the nearest [data-cometchat-container] ancestor, or falls back to\n * the topmost element with the 'cometchat' class.\n */\nexport function getContextMenuTopElement(startEl: HTMLElement | null): HTMLElement | null {\n  let current: HTMLElement | null = startEl;\n\n  while (current) {\n    if (current.hasAttribute?.('data-cometchat-container')) return current;\n    current = current.parentElement;\n  }\n\n  current = startEl;\n  let topMostElement: HTMLElement | null = null;\n  while (current) {\n    if (current.classList?.contains('cometchat')) topMostElement = current;\n    current = current.parentElement;\n  }\n\n  return topMostElement;\n}\n\n/**\n * Determines the available placement for the context menu based on available space.\n */\nexport function getContextMenuPlacement(\n  rect: DOMRect,\n  height: number,\n  placement: Placement,\n  useParentContainer: boolean,\n  forceStaticPlacement: boolean,\n  parentViewRef: HTMLElement | null\n): Placement {\n  if (forceStaticPlacement) return placement;\n\n  const spaceAbove = rect.top;\n  const parentViewRect = parentViewRef?.getBoundingClientRect();\n  const spaceBelow = parentViewRect ? parentViewRect.bottom - rect.bottom : 0;\n\n  if (!useParentContainer) {\n    if (isMobileDevice()) {\n      return spaceBelow >= height + 10 ? Placement.bottom : Placement.top;\n    }\n    return placement;\n  }\n\n  if (!parentViewRect) return placement;\n\n  if (spaceBelow >= height + 10) return Placement.bottom;\n  if (spaceAbove >= height + 10) return Placement.top;\n  return placement;\n}\n\n/**\n * Calculates the position style for the context menu.\n */\nexport function calculateContextMenuPosition(\n  rect: DOMRect,\n  menuDimensions: { width: number; height: number },\n  parentRect: DOMRect | null,\n  availablePlacement: Placement,\n  positioningStrategy: 'viewport' | 'parent' | 'centered',\n  forceStaticPlacement: boolean,\n  useParentHeight: boolean\n): Record<string, string> {\n  const { width, height } = menuDimensions;\n  const positionStyle: Record<string, string> = {};\n  const padding = 10;\n\n  if (forceStaticPlacement) {\n    return calculateStaticPosition(rect, width, height, availablePlacement, padding);\n  }\n\n  if (positioningStrategy === 'parent' && parentRect) {\n    return calculateParentStrategyPosition(rect, width, height, parentRect, availablePlacement, padding, useParentHeight);\n  }\n\n  if (positioningStrategy === 'centered' && parentRect) {\n    return calculateCenteredPosition(rect, width, height, parentRect, availablePlacement, padding);\n  }\n\n  return calculateViewportStrategyPosition(rect, width, height, availablePlacement, padding);\n}\n\nfunction calculateStaticPosition(\n  rect: DOMRect, width: number, height: number, placement: Placement, padding: number\n): Record<string, string> {\n  const viewportWidth = window.innerWidth;\n  const viewportHeight = window.innerHeight;\n  const positionStyle: Record<string, string> = {};\n\n  let left = rect.left;\n  let top = rect.top;\n\n  switch (placement) {\n    case Placement.top: top = rect.top - height - padding; left = rect.left; break;\n    case Placement.bottom: top = rect.bottom + padding; left = rect.left; break;\n    case Placement.left: top = rect.top; left = rect.left - width - padding; break;\n    case Placement.right: top = rect.top; left = rect.right + padding; break;\n    default: top = rect.top; left = rect.left - width - padding; break;\n  }\n\n  if (left < padding) left = padding;\n  if (left + width > viewportWidth - padding) left = viewportWidth - width - padding;\n  if (top < padding) top = padding;\n  if (top + height > viewportHeight - padding) top = viewportHeight - height - padding;\n\n  positionStyle['top'] = `${top}px`;\n  positionStyle['left'] = `${left}px`;\n  return positionStyle;\n}\n\nfunction calculateParentStrategyPosition(\n  rect: DOMRect, width: number, height: number, parentRect: DOMRect,\n  placement: Placement, padding: number, useParentHeight: boolean\n): Record<string, string> {\n  const positionStyle: Record<string, string> = {};\n\n  if ([Placement.top, Placement.bottom].includes(placement)) {\n    if (useParentHeight) {\n      positionStyle['top'] = placement === Placement.bottom\n        ? `${Math.min(parentRect.bottom - height, rect.bottom + padding)}px`\n        : `${Math.max(parentRect.top, rect.top - height - padding)}px`;\n    } else {\n      positionStyle['top'] = placement === Placement.bottom\n        ? `${rect.bottom + padding}px`\n        : `${rect.top - height - padding}px`;\n    }\n    let adjustedLeft = Math.max(parentRect.left, rect.left);\n    adjustedLeft = Math.min(adjustedLeft, parentRect.right - width - padding);\n    positionStyle['left'] = `${adjustedLeft}px`;\n  } else {\n    positionStyle['left'] = placement === Placement.left\n      ? `${Math.max(parentRect.left, rect.left - width - padding)}px`\n      : `${Math.min(parentRect.right - width, rect.right + padding)}px`;\n\n    if (useParentHeight) {\n      let adjustedTop = Math.max(parentRect.top, rect.top);\n      adjustedTop = Math.min(adjustedTop, parentRect.bottom - height - padding);\n      positionStyle['top'] = `${adjustedTop}px`;\n    } else {\n      positionStyle['top'] = `${rect.top}px`;\n    }\n  }\n\n  return positionStyle;\n}\n\nfunction calculateCenteredPosition(\n  rect: DOMRect, width: number, height: number, parentRect: DOMRect,\n  placement: Placement, padding: number\n): Record<string, string> {\n  const positionStyle: Record<string, string> = {};\n\n  if (placement === Placement.top) {\n    positionStyle['top'] = `${rect.top - height - padding}px`;\n  } else if (placement === Placement.bottom) {\n    positionStyle['top'] = `${rect.bottom + padding}px`;\n  }\n\n  const menuLeft = rect.left + rect.width / 2 - width / 2;\n  if (menuLeft < parentRect.left) {\n    positionStyle['left'] = `${parentRect.left + padding}px`;\n  } else if (menuLeft + width > parentRect.right) {\n    positionStyle['left'] = `${parentRect.right - width - padding}px`;\n  } else {\n    positionStyle['left'] = `${menuLeft}px`;\n  }\n\n  return positionStyle;\n}\n\nfunction calculateViewportStrategyPosition(\n  rect: DOMRect, width: number, height: number, placement: Placement, padding: number\n): Record<string, string> {\n  const viewportHeight = window.innerHeight;\n  const viewportWidth = window.innerWidth;\n  const positionStyle: Record<string, string> = {};\n\n  if ([Placement.top, Placement.bottom].includes(placement)) {\n    positionStyle['top'] = placement === Placement.bottom\n      ? `${rect.bottom + height + padding > viewportHeight ? rect.top - height - padding : rect.bottom + padding}px`\n      : `${rect.top - height - padding < 0 ? rect.bottom + padding : rect.top - height - padding}px`;\n    positionStyle['left'] = rect.left + width - padding > viewportWidth\n      ? `${viewportWidth - width - padding}px`\n      : `${rect.left - padding}px`;\n  } else {\n    positionStyle['left'] = placement === Placement.left\n      ? `${rect.left - width - padding < 0 ? rect.right + padding : rect.left - width - padding}px`\n      : `${rect.right + width + padding > viewportWidth ? rect.left - width - padding : rect.right + padding}px`;\n    positionStyle['top'] = rect.top + height - padding > viewportHeight\n      ? `${viewportHeight - height - padding}px`\n      : `${rect.top - padding}px`;\n  }\n\n  return positionStyle;\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ElementRef,\n  ViewChild,\n  OnInit,\n  OnDestroy,\n  ChangeDetectorRef,\n  inject,\n  AfterViewInit,\n  HostListener,\n  QueryList,\n  ViewChildren,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize';\nimport { Placement } from '../../../Enums/Enums';\nimport { CometChatActionsIcon, CometChatActionsView, CometChatOption } from '../../../modals';\nimport {\n  getNextIndex,\n  getNavigationDirection,\n  isActivationKey,\n  isEscapeKey,\n  isTabKey,\n} from '../../../utils/keyboard-utils';\n\n// Re-export type for backward compatibility\nexport type { ContextMenuItem } from './cometchat-context-menu.types';\nimport type { ContextMenuItem } from './cometchat-context-menu.types';\nimport {\n  isContextMenuDocsMode,\n  getContextMenuTopElement,\n  getContextMenuPlacement,\n  calculateContextMenuPosition,\n} from './cometchat-context-menu.utils';\n\n/**\n * CometChatContextMenu displays menu data in a required format.\n * Accepts a data array and topMenuSize to specify how many items are visible by default.\n */\n@Component({\n  selector: 'cometchat-context-menu',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-context-menu.component.html',\n  styleUrls: ['./cometchat-context-menu.component.css'],\n})\nexport class CometChatContextMenuComponent implements OnInit, OnDestroy, AfterViewInit {\n  @Input() data: ContextMenuItem[] = [];\n  @Input() topMenuSize = 2;\n  @Input() moreIconHoverText?: string;\n  @Input() placement: Placement = Placement.left;\n  @Input() closeOnOutsideClick = false;\n  @Input() disableBackgroundInteraction = false;\n  @Input() useParentContainer = false;\n  @Input() useParentHeight = false;\n  @Input() forceStaticPlacement = false;\n\n  @Output() optionClick = new EventEmitter<ContextMenuItem>();\n\n  @ViewChild('moreButtonRef') moreButtonRef!: ElementRef<HTMLDivElement>;\n  @ViewChild('subMenuRef') subMenuRef!: ElementRef<HTMLDivElement>;\n  @ViewChildren('menuItemRef') menuItemRefs!: QueryList<ElementRef<HTMLDivElement>>;\n  @ViewChildren('topMenuItemRef') topMenuItemRefs!: QueryList<ElementRef<HTMLDivElement>>;\n\n  showSubMenu = false;\n  positionStyle: Record<string, string> = {};\n  private positionPreCalculated = false;\n  focusedItemIndex = -1;\n  focusedTopMenuIndex = -1;\n\n  private readonly cdr = inject(ChangeDetectorRef);\n  private parentViewRef: HTMLElement | null = null;\n  private resizeTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n  private boundHandleClickOutside: (event: MouseEvent) => void;\n  private boundHandleOtherMenuOpen: (event: Event) => void;\n  private readonly instanceId = Math.random().toString(36).substring(2);\n\n  constructor() {\n    this.boundHandleClickOutside = this.handleClickOutside.bind(this);\n    this.boundHandleOtherMenuOpen = this.handleOtherMenuOpen.bind(this);\n  }\n\n  ngOnInit(): void {\n    if (this.closeOnOutsideClick) {\n      document.addEventListener('click', this.boundHandleClickOutside);\n    }\n    document.addEventListener('cometchat-context-menu-open', this.boundHandleOtherMenuOpen);\n  }\n\n  ngAfterViewInit(): void {\n    if (this.useParentContainer) {\n      this.parentViewRef = getContextMenuTopElement(this.moreButtonRef?.nativeElement);\n    }\n  }\n\n  ngOnDestroy(): void {\n    document.removeEventListener('click', this.boundHandleClickOutside);\n    document.removeEventListener('cometchat-context-menu-open', this.boundHandleOtherMenuOpen);\n    window.removeEventListener('resize', this.boundHandleResize);\n    if (this.resizeTimeoutRef) clearTimeout(this.resizeTimeoutRef);\n    // If sub-menu was portaled to body, move it back before Angular destroys the view\n    if (this.subMenuRef?.nativeElement && this.subMenuRef.nativeElement.parentElement === document.body) {\n      this.subMenuRef.nativeElement.remove();\n    }\n  }\n\n  private handleOtherMenuOpen(event: Event): void {\n    const detail = (event as CustomEvent).detail;\n    if (detail?.instanceId !== this.instanceId && this.showSubMenu) {\n      this.closeSubMenu();\n    }\n  }\n\n  private boundHandleResize = this.handleResize.bind(this);\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void {\n    if (!this.showSubMenu) {\n      const isMoreButton = this.moreButtonRef?.nativeElement === event.target;\n      if (isMoreButton && isActivationKey(event)) { event.preventDefault(); this.handleMenuClick(event); }\n      return;\n    }\n\n    // This handler is bound both as a @HostListener and on the (portaled) submenu\n    // element. Stop propagation so it is not invoked twice (which would double-step\n    // arrow navigation when the submenu is not portaled out of the host).\n    event.stopPropagation();\n\n    if (isEscapeKey(event)) {\n      event.preventDefault();\n      this.closeSubMenu();\n      this.moreButtonRef?.nativeElement?.focus();\n      return;\n    }\n\n    if (isTabKey(event)) { this.closeSubMenu(); return; }\n\n    const direction = getNavigationDirection(event);\n    if (direction === 'down' || direction === 'up') {\n      event.preventDefault();\n      const items = this.menuItemRefs.toArray();\n      if (items.length === 0) return;\n      const activeEl = document.activeElement as HTMLElement;\n      const currentIndex = items.findIndex(ref => ref.nativeElement === activeEl);\n      const baseIndex = currentIndex >= 0 ? currentIndex : this.focusedItemIndex;\n      const nextIndex = getNextIndex(baseIndex, direction, items.length, { wrap: true });\n      this.focusedItemIndex = nextIndex;\n      this.focusItemAtIndex(nextIndex);\n      return;\n    }\n\n    if (isActivationKey(event)) {\n      event.preventDefault();\n      const activeEl = document.activeElement as HTMLElement;\n      const items = this.menuItemRefs.toArray();\n      const domIndex = items.findIndex(ref => ref.nativeElement === activeEl);\n      const index = domIndex >= 0 ? domIndex : this.focusedItemIndex;\n      if (index >= 0 && index < this.subMenu.length) this.onMenuItemClick(this.subMenu[index]);\n      return;\n    }\n  }\n\n  private focusItemAtIndex(index: number): void {\n    const items = this.menuItemRefs.toArray();\n    if (items[index]) items[index].nativeElement.focus();\n  }\n\n  private originalSubMenuParent: HTMLElement | null = null;\n\n  private closeSubMenu(): void {\n    this.showSubMenu = false;\n    // Move sub-menu back from document.body to its original parent\n    if (this.subMenuRef?.nativeElement && this.originalSubMenuParent) {\n      this.originalSubMenuParent.appendChild(this.subMenuRef.nativeElement);\n      this.originalSubMenuParent = null;\n    }\n    this.positionStyle = {};\n    this.positionPreCalculated = false;\n    this.focusedItemIndex = -1;\n    window.removeEventListener('resize', this.boundHandleResize);\n    this.cdr.detectChanges();\n  }\n\n  get topMenu(): ContextMenuItem[] {\n    return this.data.slice(0, this.topMenuSize > 0 ? this.topMenuSize - 1 : 0);\n  }\n\n  get subMenu(): ContextMenuItem[] {\n    return this.data.slice(this.topMenuSize > 0 ? this.topMenuSize - 1 : 0);\n  }\n\n  get shouldShowMoreButton(): boolean {\n    return this.data.length > this.topMenu.length;\n  }\n\n  private handleClickOutside(event: MouseEvent): void {\n    if (this.moreButtonRef?.nativeElement &&\n        !this.moreButtonRef.nativeElement.contains(event.target as Node)) {\n      this.showSubMenu = false;\n      this.cdr.detectChanges();\n    }\n  }\n\n  private handleResize(): void {\n    if (this.resizeTimeoutRef) clearTimeout(this.resizeTimeoutRef);\n    this.resizeTimeoutRef = setTimeout(() => {\n      if (this.showSubMenu) this.getPopoverPositionStyle();\n    }, 100);\n  }\n\n  handleMenuClick(event?: Event): void {\n    if (event) event.stopPropagation();\n    this.showSubMenu = !this.showSubMenu;\n\n    if (this.showSubMenu) {\n      document.dispatchEvent(new CustomEvent('cometchat-context-menu-open', {\n        detail: { instanceId: this.instanceId },\n      }));\n\n      if (!this.positionPreCalculated) this.getPopoverPositionStyle();\n      this.cdr.detectChanges();\n\n      // Portal the sub-menu to document.body to escape any overflow:hidden\n      // ancestors that clip position:fixed elements.\n      requestAnimationFrame(() => {\n        this.getPopoverPositionStyle();\n        if (this.subMenuRef?.nativeElement && this.subMenuRef.nativeElement.parentElement !== document.body) {\n          this.originalSubMenuParent = this.subMenuRef.nativeElement.parentElement;\n          document.body.appendChild(this.subMenuRef.nativeElement);\n        }\n      });\n\n      if (this.useParentContainer && !this.useParentHeight) {\n        window.addEventListener('resize', this.boundHandleResize);\n      }\n\n      this.focusedItemIndex = 0;\n      requestAnimationFrame(() => this.focusItemAtIndex(0));\n    } else {\n      this.closeSubMenu();\n    }\n  }\n\n  onMenuItemClick(item: ContextMenuItem, event?: Event): void {\n    if (event) event.stopPropagation();\n    this.closeSubMenu();\n    this.optionClick.emit(item);\n    if ('onClick' in item && typeof item.onClick === 'function') item.onClick(0);\n  }\n\n  onMoreButtonMouseEnter(): void {\n    this.getPopoverPositionStyle();\n    this.positionPreCalculated = true;\n  }\n\n  onOverlayClick(event: MouseEvent): void {\n    event.stopPropagation();\n    this.closeSubMenu();\n  }\n\n  isActionsView(item: ContextMenuItem): item is CometChatActionsView {\n    return item instanceof CometChatActionsView && !!item.customView;\n  }\n\n  getIconStyle(item: ContextMenuItem): Record<string, string> {\n    if (item.iconURL) {\n      return {\n        '-webkit-mask': `url(${item.iconURL}) center center no-repeat`,\n        '-webkit-mask-size': 'contain',\n        display: 'flex',\n      };\n    }\n    return {};\n  }\n\n  getItemId(item: ContextMenuItem): string { return item.id || ''; }\n  getItemTitle(item: ContextMenuItem): string { return item.title || ''; }\n\n  private getPopoverPositionStyle(): void {\n    const effectiveUseParent = this.useParentContainer || isContextMenuDocsMode();\n\n    if (effectiveUseParent) {\n      this.parentViewRef = this.parentViewRef || getContextMenuTopElement(this.moreButtonRef?.nativeElement);\n      this.calculatePopoverPosition();\n      return;\n    }\n\n    if (this.useParentHeight) { this.setMenuHeight(); return; }\n\n    const height = this.subMenuRef?.nativeElement?.clientHeight || 48 * this.subMenu.length;\n    const width = this.subMenuRef?.nativeElement?.clientWidth || 160;\n    const rect = this.moreButtonRef?.nativeElement?.getBoundingClientRect();\n    if (!rect) return;\n\n    const availablePlacement = getContextMenuPlacement(\n      rect, height, this.placement, this.useParentContainer, this.forceStaticPlacement, this.parentViewRef\n    );\n    this.positionStyle = calculateContextMenuPosition(\n      rect, { width, height }, null, availablePlacement, 'viewport', this.forceStaticPlacement, this.useParentHeight\n    );\n    this.cdr.detectChanges();\n  }\n\n  private calculatePopoverPosition(): void {\n    if (!this.moreButtonRef?.nativeElement || !this.parentViewRef) return;\n\n    const height = this.subMenuRef?.nativeElement?.clientHeight || 48 * this.data.length;\n    const width = this.subMenuRef?.nativeElement?.clientWidth || 160;\n    const rect = this.moreButtonRef.nativeElement.getBoundingClientRect();\n    const parentViewRect = this.parentViewRef.getBoundingClientRect();\n    if (!rect || !parentViewRect) return;\n\n    const availablePlacement = getContextMenuPlacement(\n      rect, height, this.placement, this.useParentContainer, this.forceStaticPlacement, this.parentViewRef\n    );\n    const positionStyle = calculateContextMenuPosition(\n      rect, { width, height }, parentViewRect, availablePlacement, 'parent', this.forceStaticPlacement, this.useParentHeight\n    );\n\n    if (isContextMenuDocsMode() && positionStyle['top'] && positionStyle['left']) {\n      const topVal = parseFloat(positionStyle['top']);\n      const leftVal = parseFloat(positionStyle['left']);\n      if (!isNaN(topVal) && !isNaN(leftVal)) {\n        positionStyle['top'] = `${topVal - parentViewRect.top}px`;\n        positionStyle['left'] = `${leftVal - parentViewRect.left}px`;\n        positionStyle['position'] = 'absolute';\n      }\n    }\n\n    this.positionStyle = positionStyle;\n    this.cdr.detectChanges();\n  }\n\n  private setMenuHeight(): void {\n    if (!this.subMenuRef?.nativeElement || !this.moreButtonRef?.nativeElement) return;\n\n    const menuWidth = this.subMenuRef.nativeElement.scrollWidth;\n    const menuHeight = this.subMenuRef.nativeElement.scrollHeight;\n    const rect = this.moreButtonRef.nativeElement.getBoundingClientRect();\n    const parentRect = this.parentViewRef?.getBoundingClientRect() || {\n      left: 0, right: window.innerWidth, width: window.innerWidth,\n      height: window.innerHeight, top: 0, bottom: window.innerHeight,\n      x: 0, y: 0, toJSON: () => ({}),\n    };\n\n    this.positionStyle = calculateContextMenuPosition(\n      rect, { width: menuWidth, height: menuHeight }, parentRect as DOMRect,\n      this.placement, 'centered', this.forceStaticPlacement, this.useParentHeight\n    );\n    this.cdr.detectChanges();\n  }\n\n  getSubMenuItemIndex(item: ContextMenuItem): number { return this.subMenu.indexOf(item); }\n\n  trackByItem(index: number, item: ContextMenuItem): string {\n    return item.id || item.title || index.toString();\n  }\n}\n","<div class=\"cometchat\">\n  <div class=\"cometchat-menu-list\" role=\"menu\" [attr.aria-label]=\"'context_menu_aria_label' | translate\">\n    <!-- Main Menu -->\n    <div class=\"cometchat-menu-list__main-menu\">\n      <!-- Top Menu Items -->\n      <ng-container *ngFor=\"let item of topMenu; let i = index; let last = last; trackBy: trackByItem\">\n        <div class=\"cometchat-menu-list__menu-wrapper\">\n          <div\n            [id]=\"getItemId(item)\"\n            [class]=\"i === 0 || topMenu.length <= 2 ? '' : 'cometchat-menu-list__menu'\"\n          >\n            <div\n              #topMenuItemRef\n              class=\"cometchat-menu-list__main-menu-item\"\n              [title]=\"getItemTitle(item)\"\n              [attr.aria-label]=\"getItemTitle(item)\"\n              [attr.aria-selected]=\"focusedTopMenuIndex === i\"\n              role=\"menuitem\"\n              tabindex=\"0\"\n              (click)=\"onMenuItemClick(item, $event)\"\n              (keydown.enter)=\"onMenuItemClick(item, $event)\"\n              (keydown.space)=\"$event.preventDefault(); onMenuItemClick(item, $event)\"\n            >\n              <div\n                class=\"cometchat-menu-list__main-menu-item-icon cometchat-menu-list__main-menu-item-icon-{{ getItemId(item) }}\"\n                [ngStyle]=\"getIconStyle(item)\"\n              ></div>\n            </div>\n          </div>\n\n          <!-- More Button (shown after last top menu item) -->\n          <ng-container *ngIf=\"last && shouldShowMoreButton\">\n            <div\n              #moreButtonRef\n              class=\"cometchat-menu-list__sub-menu\"\n              \n              [attr.aria-label]=\"moreIconHoverText || 'More options'\"\n              [attr.aria-expanded]=\"showSubMenu\"\n              aria-haspopup=\"menu\"\n              role=\"button\"\n              tabindex=\"0\"\n              [ngStyle]=\"{\n                'z-index': disableBackgroundInteraction && showSubMenu ? '1000' : 'auto',\n                'pointer-events': disableBackgroundInteraction && showSubMenu ? 'auto' : 'auto'\n              }\"\n              (click)=\"handleMenuClick($event)\"\n              (keydown.enter)=\"handleMenuClick($event)\"\n              (keydown.space)=\"$event.preventDefault(); handleMenuClick($event)\"\n              (mouseenter)=\"onMoreButtonMouseEnter()\"\n            >\n              <div class=\"cometchat-menu-list__sub-menu-icon\"></div>\n            </div>\n          </ng-container>\n        </div>\n      </ng-container>\n\n      <!-- More Button when no top menu items -->\n      <ng-container *ngIf=\"topMenu.length === 0 && shouldShowMoreButton\">\n        <div class=\"cometchat-menu-list__menu-wrapper\">\n          <div\n            #moreButtonRef\n            class=\"cometchat-menu-list__sub-menu\"\n            [attr.aria-label]=\"moreIconHoverText || 'More options'\"\n            [attr.aria-expanded]=\"showSubMenu\"\n            aria-haspopup=\"menu\"\n            role=\"button\"\n            tabindex=\"0\"\n            [ngStyle]=\"{\n              'z-index': disableBackgroundInteraction && showSubMenu ? '1000' : 'auto',\n              'pointer-events': disableBackgroundInteraction && showSubMenu ? 'auto' : 'auto'\n            }\"\n            (click)=\"handleMenuClick($event)\"\n            (keydown.enter)=\"handleMenuClick($event)\"\n            (keydown.space)=\"$event.preventDefault(); handleMenuClick($event)\"\n            (mouseenter)=\"onMoreButtonMouseEnter()\"\n          >\n            <div class=\"cometchat-menu-list__sub-menu-icon\"></div>\n          </div>\n        </div>\n      </ng-container>\n    </div>\n\n    <!-- Full Screen Overlay (when disableBackgroundInteraction is true) -->\n    <div\n      *ngIf=\"disableBackgroundInteraction && showSubMenu\"\n      class=\"cometchat-popover__overlay\"\n      (click)=\"onOverlayClick($event)\"\n      (wheel)=\"$event.stopPropagation()\"\n      (mousemove)=\"$event.stopPropagation()\"\n      (keydown)=\"$event.stopPropagation()\"\n    ></div>\n\n    <!-- Sub Menu List -->\n    <div\n      #subMenuRef\n      class=\"cometchat-menu-list__sub-menu-list\"\n      id=\"subMenuContext\"\n      role=\"menu\"\n      [attr.aria-label]=\"'Submenu options'\"\n      [attr.data-visible]=\"showSubMenu\"\n      (keydown)=\"handleKeydown($event)\"\n      [ngStyle]=\"{\n        top: positionStyle['top'] || 'auto',\n        left: positionStyle['left'] || 'auto',\n        position: positionStyle['position'] || null,\n        display: showSubMenu ? 'flex' : 'none',\n        'z-index': disableBackgroundInteraction && showSubMenu ? '1000' : '1001'\n      }\"\n    >\n      <ng-container *ngFor=\"let item of subMenu; let i = index; trackBy: trackByItem\">\n        <div\n          #menuItemRef\n          [id]=\"getItemId(item)\"\n          class=\"cometchat-menu-list__sub-menu-list-item\"\n          [title]=\"getItemTitle(item)\"\n          [attr.aria-label]=\"getItemTitle(item)\"\n          [attr.aria-selected]=\"focusedItemIndex === i\"\n          role=\"menuitem\"\n          tabindex=\"0\"\n          (click)=\"onMenuItemClick(item, $event)\"\n        >\n          <div\n            *ngIf=\"item.iconURL\"\n            class=\"cometchat-menu-list__sub-menu-list-item-icon cometchat-menu-list__sub-menu-list-item-icon-{{ getItemId(item) }}\"\n            [ngStyle]=\"getIconStyle(item)\"\n          ></div>\n          <label class=\"cometchat-menu-list__sub-menu-item-title cometchat-menu-list__sub-menu-item-title-{{ getItemId(item) }}\">\n            {{ getItemTitle(item) }}\n          </label>\n        </div>\n      </ng-container>\n    </div>\n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  OnInit,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  NgZone,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { CalendarObject } from '../../../resources/CometChatLocalize/localization.interfaces';\n\n/**\n * CometChatDate is a component for displaying formatted dates.\n * It accepts a timestamp and a calendar configuration object to format the date\n * using the CometChatLocalize service.\n *\n * Uses OnPush change detection and caches the formatted date to prevent\n * ExpressionChangedAfterItHasBeenCheckedError when relative time changes.\n *\n * @example\n * ```html\n * <cometchat-date [timestamp]=\"message.sentAt\" [calendarObject]=\"dateFormat\"></cometchat-date>\n * ```\n */\n@Component({\n  selector: 'cometchat-date',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './cometchat-date.component.html',\n  styleUrls: ['./cometchat-date.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatDateComponent implements OnInit, OnDestroy, OnChanges {\n  /** Timestamp of the time to be displayed (Unix timestamp in seconds) */\n  @Input() timestamp!: number;\n\n  /** Configuration for date formatting (optional; falls back to global then hardcoded defaults) */\n  @Input() calendarObject?: CalendarObject;\n\n  /** Hardcoded fallback CalendarObject used when no Input and no global CalendarObject is set */\n  private static readonly FALLBACK_CALENDAR: CalendarObject = {\n    today: 'hh:mm A',\n    yesterday: '[Yesterday]',\n    lastWeek: 'dddd',\n    otherDays: 'DD/MM/YYYY',\n  };\n\n  /** Cached formatted date string to prevent change detection issues */\n  formattedDate = '';\n\n  /** Interval ID for updating relative time */\n  private updateIntervalId: ReturnType<typeof setInterval> | null = null;\n\n  /** Update interval in milliseconds (60 seconds) */\n  private readonly UPDATE_INTERVAL = 60000;\n\n  constructor(\n    private cdr: ChangeDetectorRef,\n    private ngZone: NgZone\n  ) {}\n\n  ngOnInit(): void {\n    this.updateFormattedDate();\n    this.startUpdateInterval();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['timestamp'] || changes['calendarObject']) {\n      this.updateFormattedDate();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.stopUpdateInterval();\n  }\n\n  /**\n   * Resolves the effective CalendarObject using the fallback chain:\n   * 1. Component @Input (highest priority)\n   * 2. Global CalendarObject from CometChatLocalize\n   * 3. Hardcoded FALLBACK_CALENDAR\n   */\n  private getEffectiveCalendarObject(): CalendarObject {\n    if (this.calendarObject) {\n      return this.calendarObject;\n    }\n    const global = CometChatLocalize.getCalendarObject();\n    if (global && Object.keys(global).length > 0) {\n      return global;\n    }\n    return CometChatDateComponent.FALLBACK_CALENDAR;\n  }\n\n  /**\n   * Updates the cached formatted date string.\n   * Called on init, input changes, and periodically for relative time updates.\n   */\n  private updateFormattedDate(): void {\n    if (!this.timestamp) {\n      this.formattedDate = '';\n      return;\n    }\n    const calendarObj = this.getEffectiveCalendarObject();\n    this.formattedDate = CometChatLocalize.formatDate(this.timestamp, calendarObj);\n  }\n\n  /**\n   * Starts the interval to update relative time display.\n   * Runs outside Angular zone to avoid triggering unnecessary change detection.\n   */\n  private startUpdateInterval(): void {\n    // Only start interval if we have relative time configuration\n    if (!this.getEffectiveCalendarObject().relativeTime) {\n      return;\n    }\n\n    this.ngZone.runOutsideAngular(() => {\n      this.updateIntervalId = setInterval(() => {\n        const calendarObj = this.getEffectiveCalendarObject();\n        const newFormattedDate =\n          this.timestamp\n            ? CometChatLocalize.formatDate(this.timestamp, calendarObj)\n            : '';\n\n        // Only trigger change detection if the value actually changed\n        if (newFormattedDate !== this.formattedDate) {\n          this.formattedDate = newFormattedDate;\n          this.ngZone.run(() => {\n            this.cdr.markForCheck();\n          });\n        }\n      }, this.UPDATE_INTERVAL);\n    });\n  }\n\n  /**\n   * Stops the update interval.\n   */\n  private stopUpdateInterval(): void {\n    if (this.updateIntervalId !== null) {\n      clearInterval(this.updateIntervalId);\n      this.updateIntervalId = null;\n    }\n  }\n\n  /**\n   * Returns ISO 8601 formatted datetime string for the time element's datetime attribute.\n   * This provides a machine-readable format for assistive technologies.\n   */\n  get isoDateTime(): string {\n    if (!this.timestamp) {\n      return '';\n    }\n    // Convert Unix timestamp (seconds) to milliseconds and create ISO string\n    return new Date(this.timestamp * 1000).toISOString();\n  }\n\n  /**\n   * Returns an accessible label for screen readers.\n   * Provides full date and time information in a readable format.\n   */\n  get accessibleLabel(): string {\n    if (!this.timestamp) {\n      return '';\n    }\n    const date = new Date(this.timestamp * 1000);\n    // Format: \"January 15, 2026 at 3:45 PM\"\n    return date.toLocaleString('en-US', {\n      year: 'numeric',\n      month: 'long',\n      day: 'numeric',\n      hour: 'numeric',\n      minute: '2-digit',\n      hour12: true,\n    });\n  }\n}\n","<div class=\"cometchat-date__wrapper\">\n  <time \n    class=\"cometchat-date\"\n    [attr.datetime]=\"isoDateTime\"\n    [attr.aria-label]=\"accessibleLabel\"\n  >\n    {{ formattedDate }}\n  </time>\n</div>\n","/**\n * Shared last-message-preview text for media messages, used by the conversation list and by\n * search. Mirrors the React kit's per-plugin `getLastMessagePreview()` and its search subtitle.\n *\n * The two surfaces deliberately differ, so the caller picks a `style`:\n *\n * | case                        | 'conversation'      | 'search'                    |\n * |-----------------------------|---------------------|-----------------------------|\n * | 1 attachment, no caption    | \"Image\"             | \"holiday.jpg\" (filename)    |\n * | N attachments, no caption   | \"3 Images\"          | \"3 Images\"                  |\n * | 1 attachment + caption      | \"Image · <caption>\" | \"<caption>\"                 |\n * | N images/videos + caption   | \"3 Images · <cap>\"  | \"<caption>\" (count = badge) |\n * | N audio/files + caption     | \"3 Files · <cap>\"   | \"3 Files · <caption>\"       |\n * | voice note                  | \"Voice Note\"        | (audio rules apply)         |\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../resources/CometChatLocalize/cometchat-localize';\nimport { getMediaCaption, isVoiceNote } from './message-metadata-utils';\n\n/** Which surface the preview is being rendered on — the branching differs between the two. */\nexport type MediaPreviewStyle = 'conversation' | 'search';\n\n/** The four media types this helper covers. */\nexport type MediaPreviewType = 'image' | 'video' | 'audio' | 'file';\n\n/** Whether `type` is one this helper knows how to preview. */\nexport function isMediaPreviewType(type: string): type is MediaPreviewType {\n  return type === 'image' || type === 'video' || type === 'audio' || type === 'file';\n}\n\n/** Number of attachments on a media message; at least 1, since a message always shows something. */\nexport function getAttachmentCount(message: CometChat.BaseMessage): number {\n  try {\n    const attachments = (message as CometChat.MediaMessage).getAttachments?.() ?? [];\n    return Math.max(attachments.length, 1);\n  } catch {\n    return 1;\n  }\n}\n\n/** Name of the first attachment, or `''` when unavailable. */\nexport function getFirstAttachmentName(message: CometChat.BaseMessage): string {\n  try {\n    const attachments = (message as CometChat.MediaMessage).getAttachments?.() ?? [];\n    return attachments[0]?.getName?.() ?? '';\n  } catch {\n    return '';\n  }\n}\n\n/**\n * The type label for a media message: singular (\"Image\") for one attachment, pluralized with a\n * count (\"3 Images\") for several.\n *\n * A missing `_plural` key would make `getLocalizedString` return `''`; falling back to\n * `\"3 Image\"` is wrong but legible, and is what React does when the key is absent.\n */\nexport function getMediaTypeLabel(type: MediaPreviewType, count: number): string {\n  const singular = CometChatLocalize.getLocalizedString(`conversation_subtitle_${type}`);\n  if (count <= 1) {\n    return singular;\n  }\n  const plural = CometChatLocalize.getLocalizedString(`media_edit_preview_${type}_plural`);\n  return `${count} ${plural || singular}`;\n}\n\n/** Hooks that let each surface decide how the caption and the label are rendered. */\nexport interface MediaPreviewOptions {\n  /**\n   * Receives the raw caption, returns the display string; `''` suppresses it. A surface that\n   * renders sanitized HTML can return HTML here.\n   */\n  formatCaption?: (caption: string) => string;\n  /**\n   * Applied to the type label (\"3 Images\") just before it is joined to the caption. A surface\n   * whose caption is HTML must escape the label here, so the two are the same flavour of string.\n   * Always called AFTER `formatCaption`, so it may branch on what that produced.\n   */\n  formatLabel?: (label: string) => string;\n}\n\n/**\n * Preview text for a media message.\n *\n * Voice notes short-circuit to \"Voice Note\": they carry no filename worth showing, and a count is\n * meaningless for a recording.\n */\nexport function getMediaPreview(\n  message: CometChat.BaseMessage,\n  style: MediaPreviewStyle,\n  options: MediaPreviewOptions = {}\n): string {\n  const formatCaption = options.formatCaption ?? ((c: string) => c.trim());\n  const formatLabel = options.formatLabel ?? ((l: string) => l);\n\n  const type = message.getType();\n  if (!isMediaPreviewType(type)) {\n    return type;\n  }\n\n  if (type === 'audio' && isVoiceNote(message)) {\n    return CometChatLocalize.getLocalizedString('conversation_subtitle_voice_note');\n  }\n\n  const count = getAttachmentCount(message);\n  // Caption first: formatLabel may need to know what it produced (e.g. whether to escape).\n  const caption = formatCaption(getMediaCaption(message));\n  const hasCaption = caption.length > 0;\n  const label = getMediaTypeLabel(type, count);\n\n  if (style === 'search') {\n    // One attachment and nothing to say about it -> the filename is the most useful thing.\n    if (count === 1 && !hasCaption) {\n      return formatLabel(getFirstAttachmentName(message) || label);\n    }\n    if (!hasCaption) {\n      return formatLabel(label);\n    }\n    // A caption always wins for a single item, and for image/video batches the count is already\n    // visible as a \"+N\" badge on the thumbnail — repeating it in the subtitle is noise.\n    if (count === 1 || type === 'image' || type === 'video') {\n      return caption;\n    }\n    return `${formatLabel(label)} · ${caption}`;\n  }\n\n  return hasCaption ? `${formatLabel(label)} · ${caption}` : formatLabel(label);\n}\n","/**\n * Utility helpers for CometChatConversationItem component.\n *\n * Pure functions that operate on CometChat SDK objects,\n * keeping the component class lean.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Gets the avatar image URL for a conversation.\n */\nexport function getConversationAvatarImage(\n  conversationWith: CometChat.User | CometChat.Group | null\n): string {\n  if (!conversationWith) return '';\n  if (conversationWith instanceof CometChat.User) return conversationWith.getAvatar() || '';\n  return (conversationWith as CometChat.Group).getIcon() || '';\n}\n\n/**\n * Gets the display name for a conversation participant.\n */\nexport function getConversationAvatarName(\n  conversationWith: CometChat.User | CometChat.Group | null\n): string {\n  return conversationWith?.getName() || '';\n}\n\n/**\n * Gets the user status for a user conversation.\n */\nexport function getConversationUserStatus(\n  conversationWith: CometChat.User | CometChat.Group | null\n): string {\n  if (conversationWith instanceof CometChat.User) {\n    return conversationWith.getStatus() || 'offline';\n  }\n  return '';\n}\n\n/**\n * Gets the group type for a group conversation.\n */\nexport function getConversationGroupType(\n  conversationWith: CometChat.User | CometChat.Group | null\n): string {\n  if (conversationWith instanceof CometChat.Group) {\n    return conversationWith.getType() || '';\n  }\n  return '';\n}\n\n/**\n * Gets the receipt status for the last message.\n */\nexport function getReceiptStatus(\n  lastMessage: CometChat.BaseMessage | undefined,\n  isLastMessageByMe: boolean\n): 'wait' | 'sent' | 'delivered' | 'read' | null {\n  if (!lastMessage || !isLastMessageByMe || lastMessage.getDeletedAt()) return null;\n\n  const category = lastMessage.getCategory();\n  if (category === 'action' || category === 'call') return null;\n\n  const readAt = lastMessage.getReadAt();\n  const deliveredAt = lastMessage.getDeliveredAt();\n  const sentAt = lastMessage.getSentAt();\n\n  if (readAt) return 'read';\n  if (deliveredAt) return 'delivered';\n  if (sentAt) return 'sent';\n  return 'wait';\n}\n\n/**\n * Checks if a string is a URL.\n */\nexport function isURL(text: string): boolean {\n  try {\n    const url = new URL(text);\n    return url.protocol === 'http:' || url.protocol === 'https:';\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Checks if a string contains a markdown link [text](url).\n */\nexport function hasMarkdownLink(text: string): boolean {\n  return /\\[([^\\]]+)\\]\\(([^)]+)\\)/.test(text);\n}\n\n/**\n * Gets the accessible label for a conversation item.\n */\nexport function getConversationAccessibleLabel(\n  conversationWith: CometChat.User | CometChat.Group | null,\n  subtitleText: string,\n  unreadCount: number\n): string {\n  const name = conversationWith?.getName() || '';\n  const parts = [name];\n  if (subtitleText) {\n    // Strip HTML tags from subtitle to produce valid aria-label text\n    const plainText = subtitleText.replace(/<[^>]*>/g, '');\n    if (plainText) parts.push(plainText);\n  }\n  if (unreadCount > 0) {\n    parts.push(`${unreadCount} ${CometChatLocalize.getLocalizedString('conversation_unread_messages')}`);\n  }\n  return parts.join(', ');\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Extract copyable text from an AIAssistantMessage.\n *\n * Iterates over `getElements()`, skipping elements with type 'card',\n * and concatenates text from remaining elements.\n * Falls back to `getAssistantMessageData().getText()` when no elements exist.\n *\n * @param message - A BaseMessage expected to be an AIAssistantMessage\n * @returns Plain text suitable for clipboard copy\n */\nexport function getAgentMessageCopyText(message: CometChat.BaseMessage): string {\n  const aiMessage = message as CometChat.AIAssistantMessage;\n  let elements: CometChat.AIAssistantElement[] | undefined;\n\n  try {\n    elements = aiMessage.getElements?.();\n  } catch {\n    elements = undefined;\n  }\n\n  if (Array.isArray(elements) && elements.length > 0) {\n    const text = elements.reduce((prev: string, element) => {\n      // Skip card elements for copy\n      if (element.getType?.() === 'card') return prev;\n      const data = element.getData?.();\n      const elementText = typeof data === 'string' ? data : (data?.text ?? '');\n      if (!elementText) return prev;\n      return prev + elementText + '\\n';\n    }, '');\n    const trimmed = text.trim();\n    if (trimmed) return trimmed;\n  }\n\n  // Fallback: outer text field\n  try {\n    return aiMessage.getAssistantMessageData?.()?.getText?.() || '';\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Extract subtitle preview text from an AIAssistantMessage.\n *\n * Iterates over `getElements()`, including card `fallbackText` and other element texts.\n * Falls back to `getAssistantMessageData().getText()` when no elements exist.\n *\n * @param message - A BaseMessage expected to be an AIAssistantMessage\n * @returns Preview text suitable for conversation list subtitle\n */\nexport function getAgentMessageSubtitleText(message: CometChat.BaseMessage): string {\n  const aiMessage = message as CometChat.AIAssistantMessage;\n  let elements: CometChat.AIAssistantElement[] | undefined;\n\n  try {\n    elements = aiMessage.getElements?.();\n  } catch {\n    elements = undefined;\n  }\n\n  if (Array.isArray(elements) && elements.length > 0) {\n    const text = elements.reduce((prev: string, element) => {\n      const data = element.getData?.();\n      if (element.getType?.() === 'card') {\n        const cardPayload = data?.card ?? data;\n        if (!cardPayload) return prev;\n        const fallback = cardPayload.fallbackText || '';\n        return fallback ? prev + fallback + ' ' : prev;\n      }\n      const elementText = typeof data === 'string' ? data : (data?.text ?? '');\n      return elementText ? prev + elementText + ' ' : prev;\n    }, '');\n    const trimmed = text.trim();\n    if (trimmed) return trimmed;\n  }\n\n  // Fallback: outer text field\n  try {\n    return aiMessage.getAssistantMessageData?.()?.getText?.() || '';\n  } catch {\n    return '';\n  }\n}\n","\n\nimport {Component, Input, Output, EventEmitter, TemplateRef, OnInit, OnDestroy, inject, computed, signal, booleanAttribute, ChangeDetectionStrategy} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {COMETCHAT_GLOBAL_CONFIG, GlobalConfig} from '../../services/global-config.service';\n\nimport {CometChatAvatarComponent} from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport {CometChatDateComponent} from '../base-elements/cometchat-date/cometchat-date.component';\nimport {CometChatContextMenuComponent} from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\nimport {TranslatePipe} from '../../resources/CometChatLocalize/translate.pipe';\nimport {ConversationSlots, ConversationSlotContext,} from '../../interfaces/conversation-slots.interface';\nimport {CalendarObject} from '../../resources/CometChatLocalize/localization.interfaces';\nimport {CometChatOption} from '../../modals/CometChatOption';\nimport {Placement} from '../../Enums/Enums';\nimport {CometChatMentionsFormatter} from '../../formatters/cometchat-mentions-formatter';\nimport {CometChatTextFormatter} from '../../formatters/cometchat-text-formatter';\nimport {FormatterConfigService} from '../../services/formatter-config.service';\nimport {HtmlSanitizerService} from '../../services/html-sanitizer.service';\nimport {ConversationSubtitleService} from '../../services/conversation-subtitle.service';\nimport {stripRichTextFormatting} from '../../utils/util';\nimport {getMediaCaption} from '../../utils/message-metadata-utils';\nimport {getMediaPreview, isMediaPreviewType} from '../../utils/message-preview-utils';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {getConversationAvatarImage, getConversationAvatarName, getConversationUserStatus, getConversationGroupType, getReceiptStatus, isURL, hasMarkdownLink, getConversationAccessibleLabel,} from './cometchat-conversation-item.utils';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {convertMarkdownToHtml} from '../cometchat-text-bubble/cometchat-text-bubble.utils';\nimport {getAgentMessageSubtitleText} from '../../utils/agent-message-utils';\n\n@Component({\n  selector: 'cometchat-conversation-item',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatDateComponent, CometChatContextMenuComponent, TranslatePipe],\n  templateUrl: './cometchat-conversation-item.component.html',\n  styleUrls: ['./cometchat-conversation-item.component.css'],\n})\nexport class CometChatConversationItemComponent implements OnInit, OnDestroy {\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private subtitleService = inject(ConversationSubtitleService);\n  @Input({ required: true }) conversation!: CometChat.Conversation;\n  @Input() isActive = false;\n  @Input() isSelected = false;\n  @Input() isFocused = false;\n  @Input() tabIndex = -1;\n  @Input() typingIndicator: CometChat.TypingIndicator | null = null;\n  @Input() loggedInUser: CometChat.User | null = null;\n\n  private hideReceiptsExplicitlySet = signal(false); private hideUserStatusExplicitlySet = signal(false); private hideGroupTypeExplicitlySet = signal(false);\n  private disableDefaultContextMenuExplicitlySet = signal(false); private textFormattersExplicitlySet = signal(false);\n  private _hideReceipts = signal(false); private _hideUserStatus = signal(false); private _hideGroupType = signal(false);\n  private _disableDefaultContextMenu = signal(true); private _textFormatters = signal<CometChatTextFormatter[]>([]);\n  @Input({ transform: booleanAttribute })\n  set hideReceipts(value: boolean) { this._hideReceipts.set(value); this.hideReceiptsExplicitlySet.set(true); }\n  get hideReceipts(): boolean { return this._hideReceipts(); }\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n  @Input({ transform: booleanAttribute })\n  set hideGroupType(value: boolean) { this._hideGroupType.set(value); this.hideGroupTypeExplicitlySet.set(true); }\n  get hideGroupType(): boolean { return this._hideGroupType(); }\n  @Input() dateFormat?: CalendarObject;\n  @Input({ transform: booleanAttribute })\n  set disableDefaultContextMenu(value: boolean) { this._disableDefaultContextMenu.set(value); this.disableDefaultContextMenuExplicitlySet.set(true); }\n  get disableDefaultContextMenu(): boolean { return this._disableDefaultContextMenu(); }\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) { this._textFormatters.set(value); this.textFormattersExplicitlySet.set(true); }\n  get textFormatters(): CometChatTextFormatter[] { return this._textFormatters(); }\n  effectiveHideReceipts = computed(() => { if (this.hideReceiptsExplicitlySet()) return this._hideReceipts(); return this.globalConfig?.hideReceipts ?? false; });\n  effectiveHideUserStatus = computed(() => { if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus(); return this.globalConfig?.hideUserStatus ?? false; });\n  effectiveHideGroupType = computed(() => { if (this.hideGroupTypeExplicitlySet()) return this._hideGroupType(); return this.globalConfig?.hideGroupType ?? false; });\n\n  effectiveDisableDefaultContextMenu = computed(() => { if (this.disableDefaultContextMenuExplicitlySet()) return this._disableDefaultContextMenu(); return this.globalConfig?.disableDefaultContextMenu ?? true; });\n\n  effectiveTextFormatters = computed(() => { if (this.textFormattersExplicitlySet()) return this._textFormatters(); return this.globalConfig?.textFormatters ?? []; });\n  @Input() slots?: Partial<ConversationSlots>;\n  @Input() contextMenuOptions?: CometChatOption[];\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Output() itemClick = new EventEmitter<CometChat.Conversation>();\n  @Output() itemSelect = new EventEmitter<{\n    conversation: CometChat.Conversation;\n    selected: boolean;\n  }>();\n  @Output() avatarClick = new EventEmitter<CometChat.Conversation>();\n  @Output() titleClick = new EventEmitter<CometChat.Conversation>();\n  @Output() subtitleClick = new EventEmitter<CometChat.Conversation>();\n  @Output() timestampClick = new EventEmitter<CometChat.Conversation>();\n  @Output() badgeClick = new EventEmitter<CometChat.Conversation>();\n  @Output() contextMenuOpen = new EventEmitter<CometChat.Conversation>();\n  @Output() contextMenuOptionClick = new EventEmitter<{\n    option: CometChatOption;\n    conversation: CometChat.Conversation;\n  }>();\n  @Output() contextMenuKeyboardOpen = new EventEmitter<CometChat.Conversation>();\n\n  readonly Placement = Placement;\n\n  isHovered = false;\n\n  constructor(\n    private formatterConfig: FormatterConfigService,\n    private htmlSanitizer: HtmlSanitizerService\n  ) {}\n  async ngOnInit(): Promise<void> {\n    if (!this.loggedInUser) {\n      try {\n        this.loggedInUser = await CometChat.getLoggedinUser();\n      } catch (error) {\n        CometChatLogger.error('CometChatConversationItem', 'Error getting logged-in user:', error);\n      }\n    }\n  }\n  ngOnDestroy(): void {\n  }\n  get conversationWith(): CometChat.User | CometChat.Group | null {\n    try { return this.conversation?.getConversationWith() || null; }\n    catch { return null; }\n  }\n  get isUserConversation(): boolean {\n    return this.conversationWith instanceof CometChat.User;\n  }\n  get isGroupConversation(): boolean {\n    return this.conversationWith instanceof CometChat.Group;\n  }\n  get isAgentConversation(): boolean {\n    if (!(this.conversationWith instanceof CometChat.User)) return false;\n    return typeof this.conversationWith.getRole === 'function' && this.conversationWith.getRole() === '@agentic';\n  }\n  get avatarImage(): string {\n    return getConversationAvatarImage(this.conversationWith);\n  }\n  get avatarName(): string {\n    return getConversationAvatarName(this.conversationWith);\n  }\n  get userStatus(): string {\n    return getConversationUserStatus(this.conversationWith);\n  }\n  get groupType(): string {\n    return getConversationGroupType(this.conversationWith);\n  }\n  get unreadCount(): number {\n    if (this.isAgentConversation) return 0;\n    return this.conversation.getUnreadMessageCount() || 0;\n  }\n  get lastMessage(): CometChat.BaseMessage | undefined {\n    return this.conversation.getLastMessage();\n  }\n  get lastMessageTimestamp(): number {\n    return this.lastMessage?.getSentAt() || 0;\n  }\n  get isTyping(): boolean {\n    return this.typingIndicator !== null;\n  }\n  get isLastMessageByMe(): boolean {\n    if (!this.lastMessage || !this.loggedInUser) return false;\n    return this.lastMessage.getSender()?.getUid() === this.loggedInUser.getUid();\n  }\n  get hasLastMessage(): boolean {\n    return !!this.lastMessage;\n  }\n  get receiptStatus(): 'wait' | 'sent' | 'delivered' | 'read' | null {\n    if (this.isAgentConversation) return null;\n    return getReceiptStatus(this.lastMessage, this.isLastMessageByMe);\n  }\n  get subtitleText(): string {\n    // Agent chat: always show \"click to start conversation\" regardless of last message\n    if (this.isAgentConversation) {\n      return CometChatLocalize.getLocalizedString('conversation_start');\n    }\n    if (!this.lastMessage) { return CometChatLocalize.getLocalizedString('conversation_start'); }\n    const typeKey = `${this.lastMessage.getType()}_${this.lastMessage.getCategory()}`; const customSubtitle = this.subtitleService.getSubtitle(typeKey, this.lastMessage); if (customSubtitle !== null) return customSubtitle;\n    if (this.lastMessage.getDeletedAt()) { return CometChatLocalize.getLocalizedString('conversation_subtitle_deleted_message'); }\n    const messageType = this.lastMessage.getType(); const messageCategory = this.lastMessage.getCategory();\n    if (messageCategory === 'action') { return this.getActionMessageText(); }\n    if (messageCategory === 'call') { return this.getCallMessageText(); }\n    if (messageCategory === 'custom' && messageType === 'meeting') { return this.getMeetingMessageText(); }\n    // Developer card (category \"card\", arbitrary type): getText() else \"Card Message\".\n    if (messageCategory === CometChatUIKitConstants.MessageCategory.card) { return (this.lastMessage as CometChat.CardMessage).getText() || CometChatLocalize.getLocalizedString('card_message'); }\n    if (messageCategory === CometChatUIKitConstants.MessageCategory.agentic) {\n      return getAgentMessageSubtitleText(this.lastMessage) || CometChatLocalize.getLocalizedString('conversation_subtitle_ai_response');\n    }\n    switch (messageType) {\n      case 'text': { const tm = this.lastMessage as CometChat.TextMessage; const rt = tm.getText() || ''; if (this.hasMarkdownLink(rt)) return rt.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1'); if (this.isURL(rt)) return rt; return this.formatLastMessageSubtitle(); }\n      case 'image':\n      case 'video':\n      case 'audio':\n      case 'file':\n        return this.getMediaSubtitle().text;\n      case 'extension_poll': return CometChatLocalize.getLocalizedString('conversation_subtitle_poll');\n      case 'extension_sticker': return CometChatLocalize.getLocalizedString('conversation_subtitle_sticker');\n      case 'extension_document': return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_document');\n      case 'extension_whiteboard': return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_whiteboard');\n      default: if (messageCategory === 'custom') return this.getCustomMessageText() || messageType; return messageType;\n    }\n  }\n  get subtitleIconName(): string {\n    if (!this.lastMessage) { return 'none'; }\n    const typeKey = `${this.lastMessage.getType()}_${this.lastMessage.getCategory()}`; const iconOverride = this.subtitleService.getIconOverride(typeKey); if (iconOverride !== null) return iconOverride;\n    if (this.lastMessage.getDeletedAt()) { return 'deleted'; }\n    const messageType = this.lastMessage.getType(); const messageCategory = this.lastMessage.getCategory();\n    if (messageCategory === 'action') { return 'none'; }\n    if (messageCategory === 'call') { return this.getCallIconName(); }\n    if (messageCategory === 'interactive') { return 'none'; }\n    if (messageCategory === CometChatUIKitConstants.MessageCategory.agentic) { return 'none'; }\n    if (messageCategory === 'custom' && messageType === 'meeting') { return this.getMeetingIconName(); }\n    switch (messageType) {\n      case 'text': { const tm = this.lastMessage as CometChat.TextMessage; const t = tm.getText() || ''; return (this.isURL(t) || this.hasMarkdownLink(t)) ? 'link' : 'none'; }\n      case 'image': return 'image';\n      case 'video': return 'video';\n      case 'audio': return 'audio';\n      case 'file': return 'file';\n      case 'extension_poll': return 'poll';\n      case 'extension_sticker': return 'sticker';\n      case 'extension_document': return 'collaborative-document';\n      case 'extension_whiteboard': return 'collaborative-whiteboard';\n      default: return 'unsupported';\n    }\n  }\n  private getCallIconName(): string {\n    const call = this.lastMessage as CometChat.Call;\n    const callType = call.getType?.() || '';\n    const isMissed = this.isMissedCall(call);\n    if (isMissed) {\n      return callType === CometChatUIKitConstants.MessageTypes.audio\n        ? 'incoming-audio-call'\n        : 'incoming-video-call';\n    }\n    return callType === CometChatUIKitConstants.MessageTypes.audio\n      ? 'outgoing-audio-call'\n      : 'outgoing-video-call';\n  }\n  private isMissedCall(call: CometChat.Call): boolean {\n    const callStatus = call.getStatus?.() || ''; let initiatorUid = '';\n    try { initiatorUid = call.getCallInitiator?.()?.getUid?.() || ''; } catch { try { initiatorUid = (call as any).getInitiator?.()?.getUid?.() || ''; } catch {} }\n    if (!initiatorUid || initiatorUid === this.loggedInUser?.getUid()) return false;\n    return [CometChatUIKitConstants.calls.unanswered, CometChatUIKitConstants.calls.cancelled, CometChatUIKitConstants.calls.busy, CometChatUIKitConstants.calls.rejected].includes(callStatus);\n  }\n  private getMeetingIconName(): string { try { const cm = this.lastMessage as CometChat.CustomMessage; const cd = cm.getCustomData?.() as Record<string, any> | undefined; const ct = cd?.['callType'] || ''; return ct === CometChatUIKitConstants.MessageTypes.audio ? 'meeting-audio-call' : 'meeting-video-call'; } catch { return 'meeting-video-call'; } }\n  private isURL(text: string): boolean { return isURL(text); }\n  private hasMarkdownLink(text: string): boolean { return hasMarkdownLink(text); }\n  private formatLastMessageSubtitle(): string {\n    const textMessage = this.lastMessage as CometChat.TextMessage;\n    return this.formatSubtitleSource(textMessage.getText() || '', textMessage.getMentionedUsers() || []);\n  }\n\n  /** Memo for {@link getMediaSubtitle}; both subtitle getters run on every change detection. */\n  private mediaSubtitleMemo?: { key: string; text: string; isHtml: boolean };\n\n  /**\n   * Subtitle for an image/video/audio/file message: the type label with an attachment count, and\n   * the caption when there is one — e.g. \"3 Images · nice trip\". Voice notes read \"Voice Note\".\n   *\n   * `text` and `isHtml` are produced together and memoized, because `subtitleText` and\n   * `subtitleHasHtml` are independent getters: computing the caption twice risks them disagreeing\n   * about whether the string is HTML, which would render raw markup or escape real markup.\n   */\n  private getMediaSubtitle(): { text: string; isHtml: boolean } {\n    const message = this.lastMessage!;\n    const caption = getMediaCaption(message);\n    const key = `${message.getId()}|${message.getEditedAt?.() ?? 0}|${caption}`;\n    if (this.mediaSubtitleMemo?.key === key) {\n      return this.mediaSubtitleMemo;\n    }\n\n    let isHtml = false;\n    const text = getMediaPreview(message, 'conversation', {\n      formatCaption: (raw: string) => {\n        if (!raw.trim()) return '';\n        const mentioned = (message as CometChat.TextMessage).getMentionedUsers?.() ?? [];\n        const rendered = this.renderSubtitleSource(raw, mentioned, false);\n        isHtml = rendered.isHtml;\n        return rendered.text;\n      },\n      // Once the caption is HTML, the label shares the same string and must be escaped too.\n      formatLabel: (label: string) => (isHtml ? this.htmlSanitizer.escapeUserHtml(label) : label),\n    });\n\n    this.mediaSubtitleMemo = { key, text, isHtml };\n    return this.mediaSubtitleMemo;\n  }\n\n  /**\n   * Render arbitrary message text (a text message's body, or a media message's caption) for the\n   * subtitle: rich-text metadata wins, then markdown -> sanitized HTML, else plain text with SDK\n   * mention tags resolved.\n   *\n   * Reports `isHtml` alongside the string instead of leaving callers to re-derive it from the raw\n   * input: a predicate that disagreed with the branch actually taken here would either print markup\n   * as literal text or hand unescaped text to `[innerHTML]`.\n   */\n  private renderSubtitleSource(rawText: string, mentionedUsers: CometChat.User[], isMessageBody = true): { text: string; isHtml: boolean } {\n    const textMessage = this.lastMessage as CometChat.TextMessage;\n    // `metadata.richText` describes the message BODY. A media caption is not the body, so the\n    // pre-rendered HTML must not be substituted for it.\n    if (isMessageBody) {\n      try {\n        const metadata = textMessage.getMetadata?.() as Record<string, any> | undefined;\n        const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n        if (richText?.html && richText?.hasFormatting) { const sanitized = this.sanitizeSubtitleHtml(richText.html); if (sanitized) return { text: sanitized, isHtml: true }; }\n      } catch {\n      }\n    }\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s.+|^&gt;\\s.+|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText) || this.hasMarkdownLink(rawText)) { const escaped = this.htmlSanitizer.escapeUserHtml(rawText); const formatters = this.getFormattersForSubtitle(); let formattedText = escaped;\n      for (const formatter of formatters) { try { if (formatter instanceof CometChatMentionsFormatter) { if (this.hasSdkMentionTags(rawText) && formatter.shouldFormat(formattedText, this.lastMessage)) { formattedText = formatter.formatSdkMentions(formattedText, mentionedUsers); }\n          } else if (formatter.id !== 'tiptap-formatter') { if (formatter.shouldFormat(formattedText, this.lastMessage)) { formattedText = formatter.format(formattedText); }\n          } } catch {} }\n      return { text: this.sanitizeSubtitleHtml(formattedText), isHtml: true }; }\n    const plainText = stripRichTextFormatting(rawText); const formatters = this.getFormattersForSubtitle();\n    if (!formatters || formatters.length === 0) { return { text: this.formatPlainMentions(plainText, mentionedUsers), isHtml: false }; }\n    const hasSdkMentions = this.hasSdkMentionTags(plainText); const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    if (!hasSdkMentions && !hasCustomFormatters) { return { text: plainText, isHtml: false }; }\n    const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter); if (!hasMentionsFormatter && !hasCustomFormatters) { return { text: this.formatPlainMentions(plainText, mentionedUsers), isHtml: false }; }\n    const escapedText = this.htmlSanitizer.escapeUserHtml(plainText); let formattedText = escapedText;\n    for (const formatter of formatters) { try { if (formatter instanceof CometChatMentionsFormatter) { if (hasSdkMentions && formatter.shouldFormat(formattedText, this.lastMessage)) { formattedText = formatter.formatSdkMentions(formattedText, mentionedUsers); }\n        } else if (formatter.id !== 'tiptap-formatter') { if (formatter.shouldFormat(formattedText, this.lastMessage)) { formattedText = formatter.format(formattedText); }\n        } } catch (error) { CometChatLogger.error('CometChatConversationItem', 'Formatter error:', error); } }\n    return { text: this.sanitizeSubtitleHtml(formattedText), isHtml: true };\n  }\n\n  /** {@link renderSubtitleSource} for callers that only need the rendered string. */\n  private formatSubtitleSource(rawText: string, mentionedUsers: CometChat.User[], isMessageBody = true): string {\n    return this.renderSubtitleSource(rawText, mentionedUsers, isMessageBody).text;\n  }\n\n  private getFormattersForSubtitle(): CometChatTextFormatter[] {\n    const effectiveFormatters = this.effectiveTextFormatters();\n    const formatters =\n      effectiveFormatters.length > 0\n        ? effectiveFormatters\n        : this.formatterConfig.getDefaultFormatters();\n    return formatters.map(formatter => {\n      if (formatter instanceof CometChatMentionsFormatter) { const cloned = new CometChatMentionsFormatter(); cloned.setLoggedInUser(this.loggedInUser); return cloned; }\n      return formatter;\n    });\n  }\n  private hasSdkMentionTags(text: string): boolean {\n    if (!text) return false;\n    return /<@uid:[^>]+>/.test(text) || /<@all:[^>]+>/.test(text);\n  }\n  get subtitleHasHtml(): boolean {\n    if (!this.lastMessage || this.lastMessage.getDeletedAt()) return false;\n    if (this.lastMessage.getCategory() !== 'message') return false;\n    // These win over the type switch in `subtitleText`, and both yield plain text.\n    if (this.isAgentConversation) return false;\n    const typeKey = `${this.lastMessage.getType()}_${this.lastMessage.getCategory()}`;\n    if (this.subtitleService.getSubtitle(typeKey, this.lastMessage) !== null) return false;\n    // A media caption goes through the same markdown/mention pipeline as a text body.\n    if (isMediaPreviewType(this.lastMessage.getType())) return this.getMediaSubtitle().isHtml;\n    if (this.lastMessage.getType() !== 'text') return false;\n    const textMessage = this.lastMessage as CometChat.TextMessage; const rawText = textMessage.getText() || '';\n    if (!rawText) {\n      // Fallback: no text — check metadata\n      try { const metadata = textMessage.getMetadata?.() as Record<string, any> | undefined; const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined; if (richText?.html && richText?.hasFormatting) return true; } catch {}\n      return false;\n    }\n    if (this.isURL(rawText) || this.hasMarkdownLink(rawText)) return false;\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s|^&gt;\\s?|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText) || this.hasMarkdownLink(rawText)) return true;\n    const formatters = this.getFormattersForSubtitle(); if (!formatters?.length) return false;\n    const hasSdkMentions = this.hasSdkMentionTags(rawText); const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter);\n    const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    return (hasSdkMentions && hasMentionsFormatter) || hasCustomFormatters;\n  }\n  private sanitizeSubtitleHtml(html: string): string { if (!html) return ''; try { let processed = html; const tempDiv = document.createElement('div'); tempDiv.innerHTML = processed; const ols = tempDiv.querySelectorAll('ol'); ols.forEach(ol => { const items = ol.querySelectorAll(':scope > li'); items.forEach((li, idx) => { const span = document.createElement('span'); span.innerHTML = `${idx + 1}. ${li.innerHTML} `; li.replaceWith(span); }); const span = document.createElement('span'); span.innerHTML = ol.innerHTML; ol.replaceWith(span); }); const uls = tempDiv.querySelectorAll('ul'); uls.forEach(ul => { const items = ul.querySelectorAll(':scope > li'); items.forEach(li => { const span = document.createElement('span'); span.innerHTML = `\\u2022 ${li.innerHTML} `; li.replaceWith(span); }); const span = document.createElement('span'); span.innerHTML = ul.innerHTML; ul.replaceWith(span); }); processed = tempDiv.innerHTML.replace(/<br\\s*\\/?>/gi, ' ').replace(/<\\/p>/gi, ' ').replace(/<\\/blockquote>/gi, ' ').replace(/<\\/h[1-6]>/gi, ' '); let s = this.htmlSanitizer.sanitizeWithConfig(processed, { ALLOWED_TAGS: ['span', 'strong', 'em', 'b', 'i', 'u', 's', 'code', 'a'], ALLOWED_ATTR: ['class', 'data-uid', 'data-mention-type', 'data-hashtag', 'href', 'target', 'rel', 'style'] }); s = String(s).replace(/\\n/g, ' ').replace(/\\s{2,}/g, ' ').trim(); return s; } catch (error) { CometChatLogger.error('CometChatConversationItem', 'Sanitization error:', error); return ''; } }\n  private formatPlainMentions(text: string, mentionedUsers: CometChat.User[]): string {\n    if (!text) return '';\n    const userMap = new Map<string, string>(); mentionedUsers.forEach(u => userMap.set(u.getUid(), u.getName()));\n    let r = text.replace(/<@uid:(.*?)>/g, (_m, uid) => `@${userMap.get(uid) || uid}`);\n    return r.replace(/<@all:(.*?)>/g, (_m, label) => `@${label}`);\n  }\n  get senderNamePrefix(): string {\n    if (!this.lastMessage) return '';\n    const messageCategory = this.lastMessage.getCategory();\n    if (messageCategory === 'action') return '';\n    if (messageCategory === 'call') return '';\n    if (messageCategory === 'custom' && this.lastMessage.getType() === CometChatUIKitConstants.calls.meeting) return '';\n    if (this.isGroupConversation) { if (this.isLastMessageByMe) return CometChatLocalize.getLocalizedString('conversation_subtitle_you_message') + ':'; const sender = this.lastMessage.getSender(); if (sender) return sender.getName() + ':'; }\n    return '';\n  }\n  private getActionMessageText(): string {\n    const action = this.lastMessage as CometChat.Action; const actionType = action.getAction?.() || ''; const actionBy = action.getActionBy?.(); const actionOn = action.getActionOn?.();\n    let actionByName = ''; let actionOnName = '';\n    if (actionBy && 'getName' in actionBy && typeof actionBy.getName === 'function') actionByName = (actionBy as any).getName() || '';\n    if (actionOn && 'getName' in actionOn && typeof actionOn.getName === 'function') actionOnName = (actionOn as any).getName() || '';\n    switch (actionType) {\n      case 'added': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_added')} ${actionOnName}`;\n      case 'joined': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_joined')}`;\n      case 'left': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_left')}`;\n      case 'kicked': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_kicked')} ${actionOnName}`;\n      case 'banned': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_banned')} ${actionOnName}`;\n      case 'unbanned': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_unbanned')} ${actionOnName}`;\n      case 'scopeChanged': return `${actionByName} ${CometChatLocalize.getLocalizedString('conversation_subtitle_scope_changed')} ${actionOnName}`;\n      default: return actionType;\n    }\n  }\n  private getCallMessageText(): string {\n    const call = this.lastMessage as CometChat.Call; const callStatus = call.getStatus?.() || ''; const callType = call.getType?.() || ''; const isOutgoing = this.isLastMessageByMe;\n    switch (callStatus) {\n      case 'initiated': return isOutgoing ? CometChatLocalize.getLocalizedString('conversation_subtitle_outgoing_call') : CometChatLocalize.getLocalizedString('conversation_subtitle_incoming_call');\n      case 'ongoing': return callType === 'audio' ? CometChatLocalize.getLocalizedString('conversation_subtitle_voice_call') : CometChatLocalize.getLocalizedString('conversation_subtitle_video_call');\n      case 'unanswered': return CometChatLocalize.getLocalizedString('conversation_subtitle_unasnwered_call');\n      case 'rejected': return CometChatLocalize.getLocalizedString('conversation_subtitle_rejected_call');\n      case 'busy': return CometChatLocalize.getLocalizedString('conversation_subtitle_busy_call');\n      case 'cancelled': return CometChatLocalize.getLocalizedString('conversation_subtitle_cancelled_call');\n      case 'ended': return CometChatLocalize.getLocalizedString('conversation_subtitle_ended_call');\n      case 'missed': return CometChatLocalize.getLocalizedString('conversation_subtitle_missed_call');\n      default: return callType === 'audio' ? CometChatLocalize.getLocalizedString('conversation_subtitle_voice_call') : CometChatLocalize.getLocalizedString('conversation_subtitle_video_call');\n    }\n  }\n  private getCustomMessageText(): string {\n    try {\n      const customMessage = this.lastMessage as CometChat.CustomMessage;\n      const customData = customMessage.getCustomData?.();\n      if (customData && typeof customData === 'object' && 'text' in customData) return String(customData.text);\n      return '';\n    } catch {\n      return '';\n    }\n  }\n  private getMeetingMessageText(): string {\n    try {\n      const cm = this.lastMessage as CometChat.CustomMessage; const cd = cm.getCustomData?.() as Record<string, any> | undefined; const callType = cd?.['callType'] || ''; const sender = cm.getSender?.(); const isSelf = !sender || sender.getUid() === this.loggedInUser?.getUid();\n      if (isSelf) { return callType === CometChatUIKitConstants.MessageTypes.audio ? CometChatLocalize.getLocalizedString('conversation_subtitle_group_voice_call_initated_self') : CometChatLocalize.getLocalizedString('conversation_subtitle_group_video_call_initated_self'); }\n      const sn = sender?.getName() || ''; return callType === CometChatUIKitConstants.MessageTypes.audio ? `${sn} ${CometChatLocalize.getLocalizedString('conversation_subtitle_group_voice_call_initated')}` : `${sn} ${CometChatLocalize.getLocalizedString('conversation_subtitle_group_video_call_initated')}`;\n    } catch { return CometChatLocalize.getLocalizedString('conversation_subtitle_voice_call'); }\n  }\n  get slotContext(): ConversationSlotContext {\n    return {\n      $implicit: this.conversation,\n      conversation: this.conversation,\n      isActive: this.isActive,\n      isSelected: this.isSelected,\n      unreadCount: this.unreadCount,\n      isTyping: this.isTyping,\n    };\n  }\n  get accessibleLabel(): string {\n    return getConversationAccessibleLabel(this.conversationWith, this.subtitleText, this.unreadCount);\n  }\n  private getPlainSubtitleText(): string {\n    const text = this.subtitleText;\n    if (!text) return '';\n    return text.replace(/<[^>]*>/g, '').trim();\n  }\n  handleClick(): void { this.itemClick.emit(this.conversation); }\n  handleMouseDown(event: MouseEvent): void { event.preventDefault(); }\n  handleAvatarClick(event: Event): void { this.avatarClick.emit(this.conversation); }\n  handleTitleClick(event: Event): void { this.titleClick.emit(this.conversation); }\n  handleSubtitleClick(event: Event): void { this.subtitleClick.emit(this.conversation); }\n  handleTimestampClick(event: Event): void { this.timestampClick.emit(this.conversation); }\n  handleBadgeClick(event: Event): void { this.badgeClick.emit(this.conversation); }\n  handleContextMenuOpen(): void { this.contextMenuOpen.emit(this.conversation); }\n  handleContextMenu(event: MouseEvent): void {\n    if (this.effectiveDisableDefaultContextMenu()) { event.preventDefault(); }\n  }\n  handleContextMenuOptionClick(option: CometChatOption): void {\n    this.contextMenuOptionClick.emit({ option, conversation: this.conversation });\n  }\n  onKeyDown(event: KeyboardEvent): void {\n    // Stop propagation on handled keys so the parent list's container keydown\n    // handler does not also act on them (which would double-toggle selection).\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); this.handleClick(); return; }\n    if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') { event.preventDefault(); event.stopPropagation(); this.openContextMenuViaKeyboard(); return; }\n  }\n  private openContextMenuViaKeyboard(): void {\n    this.isHovered = true;\n    this.contextMenuOpen.emit(this.conversation);\n    this.contextMenuKeyboardOpen.emit(this.conversation);\n  }\n}\n","<!--\n  CometChatConversationItem Template\n  \n  A focused component for rendering a single conversation item with support for:\n  - State management (active, selected, focused, unread)\n  - Slot-based customization for fine-grained UI control\n  - Section templates for backward compatibility\n  - Granular event emission for specific user interactions\n  - Full accessibility support (ARIA labels, keyboard navigation)\n  \n  @see Requirements 2.6, 2.7, 3.4, 4.1-4.8, 5.2, 5.3\n-->\n\n<div class=\"cometchat-conversation-item\"\n     role=\"option\"\n     [attr.tabindex]=\"tabIndex\"\n     [attr.aria-selected]=\"isSelected\"\n     [class.cometchat-conversation-item--active]=\"isActive\"\n     [class.cometchat-conversation-item--selected]=\"isSelected\"\n     [class.cometchat-conversation-item--focused]=\"isFocused\"\n     [class.cometchat-conversation-item--unread]=\"unreadCount > 0\"\n     [attr.aria-label]=\"accessibleLabel\"\n     (click)=\"handleClick()\"\n     (keydown)=\"onKeyDown($event)\"\n     (mousedown)=\"handleMouseDown($event)\"\n     (mouseenter)=\"isHovered = true\"\n     (mouseleave)=\"isHovered = false\"\n     (contextmenu)=\"handleContextMenu($event)\">\n  \n  <!-- Leading Section: Avatar, Status, Group Type, Typing Indicator -->\n  @if (leadingView) {\n    <ng-container *ngTemplateOutlet=\"leadingView; context: { $implicit: conversation }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-conversation-item__leading\" \n         aria-hidden=\"true\"\n         (click)=\"handleAvatarClick($event)\">\n      <!-- Avatar slot or default -->\n      @if (slots && slots.avatar) {\n        <ng-container *ngTemplateOutlet=\"slots.avatar; context: slotContext\"></ng-container>\n      } @else {\n        <cometchat-avatar \n          [image]=\"avatarImage\" \n          [name]=\"avatarName\"\n          class=\"cometchat-conversation-item__avatar\">\n        </cometchat-avatar>\n      }\n      \n      <!-- Status indicator for user conversations (hidden when typing indicator is active) -->\n      @if (isUserConversation && !effectiveHideUserStatus() && !isTyping) {\n        @if (slots && slots.statusIndicator) {\n          <ng-container *ngTemplateOutlet=\"slots.statusIndicator; context: { \n            $implicit: conversation, \n            conversation: conversation, \n            isActive: isActive, \n            isSelected: isSelected, \n            unreadCount: unreadCount, \n            isTyping: isTyping, \n            status: userStatus \n          }\"></ng-container>\n        } @else {\n          <div class=\"cometchat-conversation-item__status\"\n               [class.cometchat-conversation-item__status--online]=\"userStatus === 'online'\"\n               [class.cometchat-conversation-item__status--offline]=\"userStatus !== 'online'\">\n          </div>\n        }\n      }\n\n      <!-- Group type icon for group conversations (aria-hidden since type is in parent) -->\n      @if (isGroupConversation && !effectiveHideGroupType()) {\n        @if (slots && slots.groupTypeIcon) {\n          <ng-container *ngTemplateOutlet=\"slots.groupTypeIcon; context: { \n            $implicit: conversation, \n            conversation: conversation, \n            isActive: isActive, \n            isSelected: isSelected, \n            unreadCount: unreadCount, \n            isTyping: isTyping, \n            groupType: groupType \n          }\"></ng-container>\n        } @else {\n          @if (groupType === 'private' || groupType === 'password') {\n            <div class=\"cometchat-conversation-item__group-type\"\n                 [class.cometchat-conversation-item__group-type--private]=\"groupType === 'private'\"\n                 [class.cometchat-conversation-item__group-type--password]=\"groupType === 'password'\"\n                 [attr.data-type]=\"groupType\">\n            </div>\n          }\n        }\n      }\n      \n      <!-- Typing indicator (shown when someone is typing) -->\n      @if (isTyping) {\n        @if (slots && slots.typingIndicator) {\n          <ng-container *ngTemplateOutlet=\"slots.typingIndicator; context: slotContext\"></ng-container>\n        } @else {\n          <div class=\"cometchat-conversation-item__typing-indicator\">\n            <span class=\"cometchat-conversation-item__typing-dot\"></span>\n            <span class=\"cometchat-conversation-item__typing-dot\"></span>\n            <span class=\"cometchat-conversation-item__typing-dot\"></span>\n          </div>\n        }\n      }\n    </div>\n  }\n  \n  <!-- Body Section: Title, Subtitle -->\n  <div class=\"cometchat-conversation-item__body\">\n    <!-- Title section -->\n    @if (titleView) {\n      <ng-container *ngTemplateOutlet=\"titleView; context: { $implicit: conversation }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-conversation-item__title\" (click)=\"handleTitleClick($event)\">\n        @if (slots && slots.title) {\n          <ng-container *ngTemplateOutlet=\"slots.title; context: { \n            $implicit: conversation, \n            conversation: conversation, \n            isActive: isActive, \n            isSelected: isSelected, \n            unreadCount: unreadCount, \n            isTyping: isTyping, \n            title: avatarName \n          }\"></ng-container>\n        } @else {\n          <span class=\"cometchat-conversation-item__title-text\"\n                [class.cometchat-conversation-item__title-text--unread]=\"unreadCount > 0\">\n            {{ avatarName }}\n          </span>\n        }\n      </div>\n    }\n    \n    <!-- Subtitle section -->\n    @if (subtitleView) {\n      <ng-container *ngTemplateOutlet=\"subtitleView; context: { $implicit: conversation }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-conversation-item__subtitle\" (click)=\"handleSubtitleClick($event)\">\n        @if (slots && slots.subtitle) {\n          <ng-container *ngTemplateOutlet=\"slots.subtitle; context: { \n            $implicit: conversation, \n            conversation: conversation, \n            isActive: isActive, \n            isSelected: isSelected, \n            unreadCount: unreadCount, \n            isTyping: isTyping, \n            subtitle: subtitleText \n          }\"></ng-container>\n        } @else {\n          @if (isTyping) {\n            <span class=\"cometchat-conversation-item__subtitle-typing\">\n              {{ 'conversation_subtitle_typing' | translate }}\n            </span>\n          } @else {\n            <!-- Receipt icon (only for messages sent by logged-in user, aria-hidden since info is decorative) -->\n            @if (!effectiveHideReceipts() && receiptStatus) {\n              <div class=\"cometchat-conversation-item__receipt\" aria-hidden=\"true\">\n                <span class=\"cometchat-conversation-item__receipt-icon\"\n                      [class.cometchat-conversation-item__receipt-icon--wait]=\"receiptStatus === 'wait'\"\n                      [class.cometchat-conversation-item__receipt-icon--sent]=\"receiptStatus === 'sent'\"\n                      [class.cometchat-conversation-item__receipt-icon--delivered]=\"receiptStatus === 'delivered'\"\n                      [class.cometchat-conversation-item__receipt-icon--read]=\"receiptStatus === 'read'\">\n                </span>\n              </div>\n            }\n            <!-- Sender name prefix for group conversations -->\n            @if (senderNamePrefix) {\n              <span class=\"cometchat-conversation-item__subtitle-sender\">{{ senderNamePrefix }}</span>\n            }\n            <!-- Message type icon -->\n            <span class=\"cometchat-conversation-item__subtitle-icon\"\n                  [class.cometchat-conversation-item__subtitle-icon--none]=\"subtitleIconName === 'none'\"\n                  [class.cometchat-conversation-item__subtitle-icon--image]=\"subtitleIconName === 'image'\"\n                  [class.cometchat-conversation-item__subtitle-icon--video]=\"subtitleIconName === 'video'\"\n                  [class.cometchat-conversation-item__subtitle-icon--audio]=\"subtitleIconName === 'audio'\"\n                  [class.cometchat-conversation-item__subtitle-icon--file]=\"subtitleIconName === 'file'\"\n                  [class.cometchat-conversation-item__subtitle-icon--poll]=\"subtitleIconName === 'poll'\"\n                  [class.cometchat-conversation-item__subtitle-icon--sticker]=\"subtitleIconName === 'sticker'\"\n                  [class.cometchat-conversation-item__subtitle-icon--collaborative-document]=\"subtitleIconName === 'collaborative-document'\"\n                  [class.cometchat-conversation-item__subtitle-icon--collaborative-whiteboard]=\"subtitleIconName === 'collaborative-whiteboard'\"\n                  [class.cometchat-conversation-item__subtitle-icon--link]=\"subtitleIconName === 'link'\"\n                  [class.cometchat-conversation-item__subtitle-icon--deleted]=\"subtitleIconName === 'deleted'\"\n                  [class.cometchat-conversation-item__subtitle-icon--incoming-audio-call]=\"subtitleIconName === 'incoming-audio-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--incoming-video-call]=\"subtitleIconName === 'incoming-video-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--outgoing-audio-call]=\"subtitleIconName === 'outgoing-audio-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--outgoing-video-call]=\"subtitleIconName === 'outgoing-video-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--meeting-audio-call]=\"subtitleIconName === 'meeting-audio-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--meeting-video-call]=\"subtitleIconName === 'meeting-video-call'\"\n                  [class.cometchat-conversation-item__subtitle-icon--unsupported]=\"subtitleIconName === 'unsupported'\">\n            </span>\n            @if (subtitleHasHtml) {\n              <span class=\"cometchat-conversation-item__subtitle-text\"\n                    [class.cometchat-conversation-item__subtitle-text--unread]=\"unreadCount > 0\"\n                    [innerHTML]=\"subtitleText\"></span>\n            } @else {\n              <span class=\"cometchat-conversation-item__subtitle-text\"\n                    [class.cometchat-conversation-item__subtitle-text--unread]=\"unreadCount > 0\">\n                {{ subtitleText }}\n              </span>\n            }\n          }\n        }\n      </div>\n    }\n  </div>\n  \n  <!-- Trailing Section: Timestamp, Unread Badge, Context Menu -->\n  @if (trailingView) {\n    <ng-container *ngTemplateOutlet=\"trailingView; context: { $implicit: conversation }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-conversation-item__trailing\">\n      <!-- Show context menu on hover/focus (replaces tail view) - same behavior for desktop and mobile -->\n      @if ((isHovered || isFocused) && contextMenuOptions && contextMenuOptions.length > 0) {\n        <div class=\"cometchat-conversation-item__context-menu\">\n          @if (slots && slots.contextMenuTrigger) {\n            <ng-container *ngTemplateOutlet=\"slots.contextMenuTrigger; context: slotContext\"></ng-container>\n          } @else {\n            <cometchat-context-menu\n              [data]=\"contextMenuOptions\"\n              [placement]=\"Placement.left\"\n              [topMenuSize]=\"2\"\n              [closeOnOutsideClick]=\"true\"\n              (optionClick)=\"handleContextMenuOptionClick($any($event))\"\n              class=\"cometchat-conversation-item__menu\">\n            </cometchat-context-menu>\n          }\n        </div>\n      } @else {\n        <!-- Tail view: Timestamp and badge -->\n        <div class=\"cometchat-conversation-item__tail-content\">\n          <!-- Timestamp (aria-hidden since last message info is in aria-label) -->\n          <div class=\"cometchat-conversation-item__timestamp\" \n               aria-hidden=\"true\"\n               (click)=\"handleTimestampClick($event)\">\n            @if (slots && slots.timestamp) {\n              <ng-container *ngTemplateOutlet=\"slots.timestamp; context: { \n                $implicit: conversation, \n                conversation: conversation, \n                isActive: isActive, \n                isSelected: isSelected, \n                unreadCount: unreadCount, \n                isTyping: isTyping, \n                timestamp: lastMessageTimestamp \n              }\"></ng-container>\n            } @else {\n              @if (lastMessageTimestamp && dateFormat) {\n                <cometchat-date \n                  [timestamp]=\"lastMessageTimestamp\" \n                  [calendarObject]=\"dateFormat\"\n                  class=\"cometchat-conversation-item__date\">\n                </cometchat-date>\n              }\n            }\n          </div>\n          \n          <!-- Unread badge (aria-hidden since count is in aria-label) -->\n          @if (unreadCount > 0) {\n            <div class=\"cometchat-conversation-item__badge\" \n                 aria-hidden=\"true\"\n                 (click)=\"handleBadgeClick($event)\">\n              @if (slots && slots.unreadBadge) {\n                <ng-container *ngTemplateOutlet=\"slots.unreadBadge; context: { \n                  $implicit: conversation, \n                  conversation: conversation, \n                  isActive: isActive, \n                  isSelected: isSelected, \n                  unreadCount: unreadCount, \n                  isTyping: isTyping, \n                  count: unreadCount \n                }\"></ng-container>\n              } @else {\n                <span class=\"cometchat-conversation-item__badge-count\">\n                  {{ unreadCount > 99 ? '99+' : unreadCount }}\n                </span>\n              }\n            </div>\n          }\n        </div>\n      }\n    </div>\n  }\n</div>\n","/**\n * CometChatConversationItem Public API\n *\n * Exports the CometChatConversationItem component for use in other modules.\n *\n * @module components/cometchat-conversation-item\n */\n\nexport { CometChatConversationItemComponent } from './cometchat-conversation-item.component';\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  signal,\n  computed,\n  inject,\n  ElementRef,\n  HostListener,\n  ViewChild,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatButtonComponent } from '../base-elements/cometchat-button/cometchat-button.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageComposerService } from '../../services/message-composer.service';\nimport { PollOption } from './cometchat-create-poll.types';\n\nexport type { PollOption };\n\n/**\n * CometChatCreatePoll is a modal component for creating poll messages (2-12 options).\n * @see Requirements 1.1-1.23\n */\n@Component({\n  selector: 'cometchat-create-poll',\n  standalone: true,\n  imports: [CommonModule, FormsModule, TranslatePipe, CometChatButtonComponent],\n  templateUrl: './cometchat-create-poll.component.html',\n  styleUrls: ['./cometchat-create-poll.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCreatePollComponent implements OnInit, OnDestroy, AfterViewInit {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n  private messageComposerService = inject(MessageComposerService);\n  private elementRef = inject(ElementRef);\n\n  @ViewChild('modalContainer') modalContainer!: ElementRef<HTMLDivElement>;\n\n  @ViewChild('closeButton') closeButton!: ElementRef<HTMLButtonElement>;\n\n  private previouslyFocusedElement: HTMLElement | null = null;\n  private focusableElements: HTMLElement[] = [];\n  private readonly FOCUSABLE_SELECTOR =\n    'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])';\n\n  @HostListener('document:keydown.escape', ['$event'])\n  onEscapeKey(event: Event): void { event.preventDefault(); event.stopPropagation(); this.onCloseClick(); }\n\n  @HostListener('keydown.tab', ['$event'])\n  onTabKey(event: Event): void { this.handleTabKey(event as KeyboardEvent); }\n\n  @HostListener('keydown.shift.tab', ['$event'])\n  onShiftTabKey(event: Event): void { this.handleTabKey(event as KeyboardEvent, true); }\n\n  @Input() title?: string;\n  @Input() user?: CometChat.User;\n  @Input() group?: CometChat.Group;\n  @Input() replyToMessage?: CometChat.BaseMessage;\n  @Input() defaultAnswers = 2;\n  @Input() questionPlaceholderText?: string;\n  @Input() answerPlaceholderText?: string;\n  @Input() answerHelpText?: string;\n  @Input() addAnswerText?: string;\n  @Input() createPollButtonText?: string;\n\n  @Output() closeClick = new EventEmitter<void>();\n  @Output() pollCreated = new EventEmitter<void>();\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  question = signal<string>('');\n  options = signal<PollOption[]>([]);\n  isLoading = signal<boolean>(false);\n  errorMessage = signal<string>('');\n  canCreate = computed(() => {\n    const q = this.question().trim();\n    const opts = this.options().filter(o => o.value.trim() !== '');\n    return q.length > 0 && opts.length >= 2 && !this.isLoading();\n  });\n  isAddDisabled = computed(() => this.options().length >= 12);\n  limitMessage = computed(() =>\n    this.options().length >= 12 ? CometChatLocalize.getLocalizedString('polls_limit_reached') : ''\n  );\n\n  ngOnInit(): void {\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n    this.initializeOptions();\n  }\n\n  ngAfterViewInit(): void {\n    this.updateFocusableElements();\n    this.pendingTimers.push(setTimeout(() => { this.closeButton?.nativeElement?.focus(); }, 0));\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.returnFocusToPreviousElement();\n  }\n\n  private updateFocusableElements(): void {\n    const element = this.elementRef.nativeElement as HTMLElement;\n    const focusable = element.querySelectorAll<HTMLElement>(this.FOCUSABLE_SELECTOR);\n    this.focusableElements = Array.from(focusable).filter(el => el.offsetParent !== null);\n  }\n\n  private handleTabKey(event: KeyboardEvent, isShiftTab = false): void {\n    this.updateFocusableElements();\n    if (this.focusableElements.length === 0) { event.preventDefault(); return; }\n    const firstElement = this.focusableElements[0];\n    const lastElement = this.focusableElements[this.focusableElements.length - 1];\n    const activeElement = document.activeElement as HTMLElement;\n    if (isShiftTab) {\n      if (activeElement === firstElement || !this.focusableElements.includes(activeElement)) { event.preventDefault(); lastElement.focus(); }\n    } else {\n      if (activeElement === lastElement || !this.focusableElements.includes(activeElement)) { event.preventDefault(); firstElement.focus(); }\n    }\n  }\n\n  private returnFocusToPreviousElement(): void {\n    if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {\n      this.pendingTimers.push(setTimeout(() => { this.previouslyFocusedElement?.focus(); }, 0));\n    }\n  }\n\n  private initializeOptions(): void {\n    const initialOptions: PollOption[] = [];\n    const count = Math.max(2, this.defaultAnswers);\n    for (let i = 0; i < count; i++) {\n      initialOptions.push({ id: this.generateUniqueId(), value: '' });\n    }\n    this.options.set(initialOptions);\n  }\n\n  /**\n   * Generates a unique ID for poll options.\n   */\n  private generateUniqueId(): string {\n    return `option-${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;\n  }\n\n  // ==================== Public Methods ====================\n\n  /**\n   * Handles close button click.\n   * Emits closeClick event.\n   */\n  onCloseClick(): void {\n    this.closeClick.emit();\n  }\n\n  /**\n   * Handles question input change.\n   * @param value - The new question value\n   */\n  onQuestionChange(value: string): void {\n    this.question.set(value);\n    // Clear error when user starts typing\n    if (this.errorMessage()) {\n      this.errorMessage.set('');\n    }\n  }\n\n  /**\n   * Handles option value change.\n   * @param index - The index of the option to update\n   * @param value - The new option value\n   */\n  onOptionChange(index: number, value: string): void {\n    this.updateOption(index, value);\n    // Clear error when user starts typing\n    if (this.errorMessage()) {\n      this.errorMessage.set('');\n    }\n  }\n\n  /**\n   * Updates an option value.\n   * @param index - The index of the option to update\n   * @param value - The new option value\n   */\n  updateOption(index: number, value: string): void {\n    const currentOptions = [...this.options()];\n    if (currentOptions[index]) {\n      currentOptions[index] = { ...currentOptions[index], value };\n      this.options.set(currentOptions);\n    }\n  }\n\n  /**\n   * Adds a new empty option to the poll.\n   * Maximum 12 options allowed.\n   * @see Requirements 1.4, 1.5\n   */\n  addOption(): void {\n    if (this.options().length >= 12) {\n      return;\n    }\n    const currentOptions = [...this.options()];\n    currentOptions.push({\n      id: this.generateUniqueId(),\n      value: '',\n    });\n    this.options.set(currentOptions);\n\n    // Update focusable elements after DOM change\n    this.pendingTimers.push(setTimeout(() => {\n      this.updateFocusableElements();\n      // Focus the newly added input\n      const inputs = this.elementRef.nativeElement.querySelectorAll(\n        '.cometchat-create-poll__option-input'\n      );\n      const lastInput = inputs[inputs.length - 1] as HTMLInputElement;\n      if (lastInput) {\n        lastInput.focus();\n      }\n    }, 0));\n  }\n\n  /**\n   * Removes an option from the poll.\n   * Minimum 2 options required.\n   * @param index - The index of the option to remove\n   * @see Requirements 1.7, 1.8\n   */\n  removeOption(index: number): void {\n    if (this.options().length <= 2) {\n      return;\n    }\n    const currentOptions = [...this.options()];\n    currentOptions.splice(index, 1);\n    this.options.set(currentOptions);\n\n    // Update focusable elements after DOM change\n    this.pendingTimers.push(setTimeout(() => {\n      this.updateFocusableElements();\n      // Focus the previous option input or the first one if we removed the first\n      const inputs = this.elementRef.nativeElement.querySelectorAll(\n        '.cometchat-create-poll__option-input'\n      );\n      const focusIndex = Math.min(index, inputs.length - 1);\n      const inputToFocus = inputs[focusIndex] as HTMLInputElement;\n      if (inputToFocus) {\n        inputToFocus.focus();\n      }\n    }, 0));\n  }\n\n  /**\n   * Determines if the remove button should be shown for an option.\n   * Only show remove button when there are more than 2 options.\n   * @param _index - The index of the option (unused, kept for template compatibility)\n   * @returns Whether to show the remove button\n   * @see Requirement 1.7\n   */\n  canRemoveOption(_index: number): boolean {\n    return this.options().length > 2;\n  }\n\n  /**\n   * Handles create poll button click.\n   * Validates input and creates the poll.\n   * @see Requirements 1.9, 1.10, 1.11, 1.12, 1.15, 1.16, 1.17\n   */\n  async onCreateClick(): Promise<void> {\n    // Validate question\n    const questionText = this.question().trim();\n    if (!questionText) {\n      this.errorMessage.set(CometChatLocalize.getLocalizedString('polls_required_fields_warning'));\n      return;\n    }\n\n    // Validate options (at least 2 non-empty)\n    const validOptions = this.getValidOptions();\n    if (validOptions.length < 2) {\n      this.errorMessage.set(CometChatLocalize.getLocalizedString('polls_required_fields_warning'));\n      return;\n    }\n\n    // Determine receiver\n    const receiver = this.user || this.group;\n    if (!receiver) {\n      this.errorMessage.set(CometChatLocalize.getLocalizedString('polls_error'));\n      return;\n    }\n\n    const receiverId = this.user ? this.user.getUid() : this.group!.getGuid();\n    const receiverType = this.user ? 'user' : 'group';\n    const quotedMessageId = this.replyToMessage?.getId();\n\n    // Set loading state\n    this.isLoading.set(true);\n    this.errorMessage.set('');\n\n    try {\n      await this.messageComposerService.createPoll(\n        questionText,\n        validOptions,\n        receiverId,\n        receiverType,\n        quotedMessageId\n      );\n\n      // Success - emit event and close\n      this.pollCreated.emit();\n    } catch (error) {\n      // Handle error\n      this.errorMessage.set(CometChatLocalize.getLocalizedString('polls_error'));\n      this.error.emit(this.toCometchatException(error));\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  /**\n   * Converts an unknown error to CometChat.CometChatException\n   * @param error - The error to convert\n   * @returns CometChat.CometChatException\n   */\n  private toCometchatException(error: unknown): CometChat.CometChatException {\n    if (error instanceof CometChat.CometChatException) {\n      return error;\n    }\n    return new CometChat.CometChatException({\n      code: 'UNKNOWN_ERROR',\n      message: error instanceof Error ? error.message : 'An unknown error occurred',\n    });\n  }\n\n  /**\n   * Gets the valid (non-empty) options.\n   * @returns Array of non-empty option values\n   */\n  getValidOptions(): string[] {\n    return this.options()\n      .map(o => o.value.trim())\n      .filter(v => v !== '');\n  }\n\n  /**\n   * Track by function for ngFor optimization.\n   * @param _index - The index of the item (unused)\n   * @param option - The poll option\n   * @returns The unique ID of the option\n   */\n  trackByOptionId(_index: number, option: PollOption): string {\n    return option.id;\n  }\n}\n","<div class=\"cometchat\">\n  <div\n    #modalContainer\n    class=\"cometchat-create-poll\"\n    role=\"dialog\"\n    aria-modal=\"true\"\n    aria-labelledby=\"cometchat-create-poll-title\"\n  >\n    <!-- Header Section -->\n    <div class=\"cometchat-create-poll__header\">\n      <h2 id=\"cometchat-create-poll-title\" class=\"cometchat-create-poll__title\">\n        {{ title || ('polls_title' | translate) }}\n      </h2>\n      <button\n        #closeButton\n        type=\"button\"\n        class=\"cometchat-create-poll__close-button\"\n        [attr.aria-label]=\"'polls_close_hover' | translate\"\n        (click)=\"onCloseClick()\"\n      >\n        <span class=\"cometchat-create-poll__close-icon\" aria-hidden=\"true\"></span>\n      </button>\n    </div>\n\n    <!-- Body Section -->\n    <div class=\"cometchat-create-poll__body\">\n      <!-- Question Section -->\n      <div class=\"cometchat-create-poll__section\">\n        <label\n          for=\"poll-question\"\n          class=\"cometchat-create-poll__label\"\n        >\n          {{ 'polls_question' | translate }}\n        </label>\n        <input\n          id=\"poll-question\"\n          type=\"text\"\n          class=\"cometchat-create-poll__input\"\n          [placeholder]=\"questionPlaceholderText || ('polls_question_placeholder' | translate)\"\n          [value]=\"question()\"\n          (input)=\"onQuestionChange($any($event.target).value)\"\n          [attr.aria-invalid]=\"errorMessage() ? 'true' : null\"\n          [attr.aria-describedby]=\"errorMessage() ? 'poll-error-message' : null\"\n          aria-required=\"true\"\n        />\n      </div>\n\n      <!-- Options Section -->\n      <div class=\"cometchat-create-poll__section\" role=\"group\" aria-labelledby=\"poll-options-label\">\n        <label id=\"poll-options-label\" class=\"cometchat-create-poll__label\">\n          {{ answerHelpText || ('polls_options' | translate) }}\n        </label>\n        \n        <div \n          class=\"cometchat-create-poll__options-list\"\n          role=\"list\"\n          [attr.aria-label]=\"'polls_options' | translate\"\n        >\n          @for (option of options(); track trackByOptionId($index, option); let i = $index) {\n            <div class=\"cometchat-create-poll__option-row\" role=\"listitem\">\n              <input\n                type=\"text\"\n                class=\"cometchat-create-poll__input cometchat-create-poll__option-input\"\n                [placeholder]=\"answerPlaceholderText || ('polls_add_placeholder' | translate)\"\n                [value]=\"option.value\"\n                (input)=\"onOptionChange(i, $any($event.target).value)\"\n                [attr.aria-label]=\"('polls_options' | translate) + ' ' + (i + 1)\"\n                aria-required=\"true\"\n              />\n              @if (canRemoveOption(i)) {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-create-poll__remove-button\"\n                  [attr.aria-label]=\"('polls_remove_option' | translate) + ' ' + (i + 1)\"\n                  (click)=\"removeOption(i)\"\n                >\n                  <span class=\"cometchat-create-poll__remove-icon\" aria-hidden=\"true\"></span>\n                </button>\n              }\n            </div>\n          }\n        </div>\n\n        <!-- Add Option Button -->\n        <button\n          type=\"button\"\n          class=\"cometchat-create-poll__add-button\"\n          [disabled]=\"isAddDisabled()\"\n          [attr.aria-disabled]=\"isAddDisabled()\"\n          [attr.aria-describedby]=\"limitMessage() ? 'poll-limit-message' : null\"\n          (click)=\"addOption()\"\n        >\n          <span class=\"cometchat-create-poll__add-icon\" aria-hidden=\"true\"></span>\n          <span class=\"cometchat-create-poll__add-text\">\n            {{ addAnswerText || ('polls_add_option_button' | translate) }}\n          </span>\n        </button>\n\n        <!-- Limit Message -->\n        @if (limitMessage()) {\n          <p \n            id=\"poll-limit-message\"\n            class=\"cometchat-create-poll__limit-message\" \n            role=\"status\"\n            aria-live=\"polite\"\n          >\n            {{ limitMessage() }}\n          </p>\n        }\n      </div>\n    </div>\n\n    <!-- Footer Section -->\n    <div class=\"cometchat-create-poll__footer\">\n      <!-- Error Message - aria-live region for screen reader announcements -->\n      <!-- @see Requirement 7.5 -->\n      <div \n        id=\"poll-error-message\"\n        class=\"cometchat-create-poll__error-container\"\n        role=\"alert\"\n        aria-live=\"assertive\"\n        aria-atomic=\"true\"\n      >\n        @if (errorMessage()) {\n          <p class=\"cometchat-create-poll__error\">\n            {{ errorMessage() }}\n          </p>\n        }\n      </div>\n\n      <!-- Create Button -->\n      <cometchat-button\n        [text]=\"createPollButtonText || ('polls_create_button' | translate)\"\n        [disabled]=\"!canCreate()\"\n        [isLoading]=\"isLoading()\"\n        [ariaLabel]=\"createPollButtonText || ('polls_create_button' | translate)\"\n        (buttonClick)=\"onCreateClick()\"\n      ></cometchat-button>\n    </div>\n  </div>\n</div>\n","import { effect, EffectRef, Injector } from '@angular/core';\n\n/**\n * Options for safeEffect — mirrors Angular's EffectOptions but always\n * includes allowSignalWrites: true so the effect works across Angular 18–21.\n *\n * Background:\n * - Angular 18/19: `allowSignalWrites` is REQUIRED when writing to signals\n *   inside an effect body. Omitting it throws a runtime error.\n * - Angular 21+: `allowSignalWrites` is deprecated and optional (signal writes\n *   inside effects are allowed by default).\n *\n * Using this wrapper means developers never need to remember to add the flag,\n * and the codebase stays compatible across all supported Angular versions.\n */\nexport interface SafeEffectOptions {\n  injector?: Injector;\n  manualCleanup?: boolean;\n}\n\n/**\n * Drop-in replacement for Angular's `effect()` that is safe to use across\n * Angular 18, 19, 20, and 21.\n *\n * Always passes `allowSignalWrites: true` so signal writes inside the effect\n * body work on Angular 18/19 without requiring each call site to remember\n * the flag. On Angular 21+ the flag is a no-op.\n *\n * @example\n * // Instead of:\n * effect(() => { this.someSignal.set(value); }, { injector: this.injector });\n *\n * // Use:\n * safeEffect(() => { this.someSignal.set(value); }, { injector: this.injector });\n *\n * @param effectFn - The reactive effect function to run\n * @param options  - Optional injector and manualCleanup settings\n * @returns EffectRef that can be used to destroy the effect manually\n */\nexport function safeEffect(\n  effectFn: () => void,\n  options?: SafeEffectOptions\n): EffectRef {\n  return effect(effectFn, {\n    ...options,\n    allowSignalWrites: true,\n  });\n}\n","/**\n * Utility helpers for CometChatPaginatedList component.\n * Extracted to keep the component file under 400 lines.\n */\n\nimport { ElementRef, QueryList } from '@angular/core';\n\n/**\n * Checks if the user is currently focused on a search input or text input.\n * Used to prevent focus stealing from the search bar when results are fetched.\n */\nexport function isUserInSearchInput(): boolean {\n  const activeElement = document.activeElement;\n  if (!activeElement) return false;\n  const tagName = activeElement.tagName.toLowerCase();\n  if (tagName === 'input' || tagName === 'textarea') return true;\n  if (activeElement.getAttribute('contenteditable') === 'true') return true;\n  return false;\n}\n\n/**\n * Focuses a list item element by index, optionally scrolling it into view.\n *\n * @param index - The index of the item to focus\n * @param listItemElements - QueryList of list item ElementRefs\n * @param scrollIntoView - Whether to scroll the item into view\n * @param initialFocusSet - Whether initial focus has already been set (controls scroll behavior)\n */\nexport function focusListItem(\n  index: number,\n  listItemElements: QueryList<ElementRef<HTMLElement>> | undefined,\n  scrollIntoView: boolean,\n  initialFocusSet: boolean\n): void {\n  const itemElements = listItemElements?.toArray();\n  if (!itemElements || !itemElements[index]) return;\n  const element = itemElements[index].nativeElement;\n  if (scrollIntoView && initialFocusSet) {\n    element.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n  }\n  element.focus({ preventScroll: true });\n}\n\n/**\n * Focuses a state container element (empty state or error state).\n *\n * @param container - The ElementRef of the container to focus\n */\nexport function focusStateContainer(container: ElementRef<HTMLElement> | undefined): void {\n  if (container?.nativeElement) {\n    container.nativeElement.focus({ preventScroll: true });\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ViewChild,\n  ElementRef,\n  OnInit,\n  OnDestroy,\n  AfterViewInit,\n  OnChanges,\n  SimpleChanges,\n  signal,\n  ChangeDetectorRef,\n  inject,\n  QueryList,\n  ViewChildren,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ListNavigationService } from '../../services/list-navigation.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport {\n  isUserInSearchInput,\n  focusListItem,\n  focusStateContainer,\n} from './cometchat-paginated-list.utils';\n\n/**\n * CometChatPaginatedList is a generic, reusable component for infinite scroll lists.\n * Handles pagination, loading states, empty states, and error states.\n * Uses IntersectionObserver for efficient scroll detection.\n */\n@Component({\n  selector: 'cometchat-paginated-list',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-paginated-list.component.html',\n  styleUrls: ['./cometchat-paginated-list.component.css'],\n})\nexport class CometChatPaginatedListComponent<T>\n  implements OnInit, OnDestroy, AfterViewInit, OnChanges\n{\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  private cdr = inject(ChangeDetectorRef);\n  private listNavigationService = inject(ListNavigationService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  // ── Data Inputs ──────────────────────────────────────────────────────────\n  @Input() items: T[] = [];\n  @Input() trackByFn: (index: number, item: T) => any = index => index;\n\n  // ── State Inputs ─────────────────────────────────────────────────────────\n  @Input() isLoading = false;\n  @Input() hasMore = true;\n  @Input() error: Error | null = null;\n\n  // ── Display Inputs ───────────────────────────────────────────────────────\n  @Input() showScrollbar = false;\n  @Input() loadingThreshold = 100;\n  /**\n   * When true, uses the viewport as the IntersectionObserver root instead of\n   * the list container. Useful when a parent container handles scrolling.\n   */\n  @Input() observeScrollFromViewport = false;\n\n  // ── Accessibility Inputs ─────────────────────────────────────────────────\n  @Input() ariaLabel = '';\n  @Input() enableKeyboardNavigation = true;\n  @Input() isMultiSelect = false;\n  @Input() emptyStateAriaLabel = '';\n  @Input() errorStateAriaLabel = '';\n  @Input() hideError = false;\n  @Input() isItemSelected: (item: T) => boolean = () => false;\n\n  // ── Template Inputs ──────────────────────────────────────────────────────\n  @Input() itemTemplate?: TemplateRef<{ $implicit: T; index: number }>;\n  @Input() loadingTemplate?: TemplateRef<void>;\n  @Input() emptyTemplate?: TemplateRef<void>;\n  @Input() errorTemplate?: TemplateRef<{ $implicit: Error }>;\n  @Input() loadingMoreTemplate?: TemplateRef<void>;\n\n  // ── Events ───────────────────────────────────────────────────────────────\n  @Output() loadMore = new EventEmitter<void>();\n  @Output() scrollToTop = new EventEmitter<void>();\n  @Output() scrollToBottom = new EventEmitter<void>();\n  @Output() itemClick = new EventEmitter<{ item: T; index: number }>();\n  @Output() focusedIndexChange = new EventEmitter<number>();\n  @Output() retry = new EventEmitter<void>();\n\n  // ── View References ──────────────────────────────────────────────────────\n  @ViewChild('listContainer') listContainer?: ElementRef<HTMLElement>;\n  @ViewChild('scrollTopAnchor') scrollTopAnchor?: ElementRef<HTMLElement>;\n  @ViewChild('scrollBottomAnchor') scrollBottomAnchor?: ElementRef<HTMLElement>;\n  @ViewChildren('listItem') listItemElements?: QueryList<ElementRef<HTMLElement>>;\n  @ViewChild('emptyStateContainer') emptyStateContainer?: ElementRef<HTMLElement>;\n  @ViewChild('errorStateContainer') errorStateContainer?: ElementRef<HTMLElement>;\n\n  // ── Internal State ───────────────────────────────────────────────────────\n  isFetchingMore = signal(false);\n  focusedIndex = signal(0);\n\n  // ── Computed State ───────────────────────────────────────────────────────\n  isEmpty(): boolean { return !this.isLoading && this.items.length === 0; }\n  hasItems(): boolean { return this.items.length > 0; }\n  showLoadingMore(): boolean { return this.isFetchingMore() && this.hasItems(); }\n\n  // ── Private Properties ───────────────────────────────────────────────────\n  private scrollTopObserver?: IntersectionObserver;\n  private scrollBottomObserver?: IntersectionObserver;\n  private previousIsLoading = false;\n  private previousItemsLength = 0;\n  private previousError: Error | null = null;\n  private initialFocusSet = false;\n\n  // ── Lifecycle ────────────────────────────────────────────────────────────\n\n  ngOnInit(): void {\n    this.previousIsLoading = this.isLoading;\n    this.previousItemsLength = this.items.length;\n    this.previousError = this.error;\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['isLoading']) {\n      const wasLoading = this.previousIsLoading;\n      const isNowLoading = this.isLoading;\n      if (wasLoading && !isNowLoading && !this.initialFocusSet) {\n        this.handleLoadingToLoadedTransition();\n      }\n      this.previousIsLoading = isNowLoading;\n    }\n\n    if (changes['items']) {\n      const previousLength = this.previousItemsLength;\n      const currentLength = this.items.length;\n\n      if (currentLength > previousLength && previousLength > 0) {\n        this.handleInfiniteScrollLoad(currentLength - previousLength);\n      }\n      if (currentLength === 0 && previousLength > 0 && !this.error) {\n        this.focusEmptyState();\n      }\n      if (currentLength > 0 && previousLength === 0 && !this.isLoading) {\n        if (this.initialFocusSet) {\n          this.focusFirstItem();\n        } else {\n          this.focusFirstItemWithoutScroll();\n          this.initialFocusSet = true;\n        }\n      }\n      this.previousItemsLength = currentLength;\n    }\n\n    if (changes['error']) {\n      const hadError = this.previousError !== null;\n      const hasError = this.error !== null;\n      if (!hadError && hasError) { this.focusErrorState(); }\n      if (hadError && !hasError && this.items.length > 0) { this.focusFirstItem(); }\n      this.previousError = this.error;\n    }\n  }\n\n  ngAfterViewInit(): void {\n    this.setupIntersectionObservers();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.disconnectObservers();\n  }\n\n  // ── IntersectionObserver ─────────────────────────────────────────────────\n\n  private setupIntersectionObservers(): void {\n    if (this.scrollBottomAnchor?.nativeElement) {\n      this.scrollBottomObserver = new IntersectionObserver(\n        entries => {\n          if (entries[0].isIntersecting && this.hasMore && !this.isFetchingMore()) {\n            if (\n              !this.observeScrollFromViewport &&\n              this.listContainer?.nativeElement &&\n              this.listContainer.nativeElement.scrollHeight <=\n                this.listContainer.nativeElement.clientHeight\n            ) {\n              return;\n            }\n            this.handleLoadMore();\n          }\n        },\n        {\n          root: this.observeScrollFromViewport ? null : this.listContainer?.nativeElement,\n          threshold: 0.1,\n        }\n      );\n      this.scrollBottomObserver.observe(this.scrollBottomAnchor.nativeElement);\n    }\n\n    if (this.scrollTopAnchor?.nativeElement) {\n      this.scrollTopObserver = new IntersectionObserver(\n        entries => {\n          if (entries[0].isIntersecting) { this.scrollToTop.emit(); }\n        },\n        {\n          root: this.observeScrollFromViewport ? null : this.listContainer?.nativeElement,\n          threshold: 0.1,\n        }\n      );\n      this.scrollTopObserver.observe(this.scrollTopAnchor.nativeElement);\n    }\n  }\n\n  private handleLoadMore(): void {\n    this.isFetchingMore.set(true);\n    this.announceLoadingMore();\n    this.cdr.detectChanges();\n    this.loadMore.emit();\n  }\n\n  private disconnectObservers(): void {\n    this.scrollTopObserver?.disconnect();\n    this.scrollBottomObserver?.disconnect();\n  }\n\n  // ── Public Methods ───────────────────────────────────────────────────────\n\n  handleItemClick(item: T, index: number): void {\n    this.itemClick.emit({ item, index });\n  }\n\n  loadComplete(): void {\n    this.isFetchingMore.set(false);\n    this.cdr.detectChanges();\n  }\n\n  scrollToTopPosition(): void {\n    if (this.listContainer?.nativeElement) {\n      this.listContainer.nativeElement.scrollTop = 0;\n    }\n  }\n\n  scrollToBottomPosition(): void {\n    if (this.listContainer?.nativeElement) {\n      const container = this.listContainer.nativeElement;\n      container.scrollTop = container.scrollHeight;\n    }\n  }\n\n  // ── Keyboard Navigation ──────────────────────────────────────────────────\n\n  onListKeyDown(event: KeyboardEvent): void {\n    if (!this.enableKeyboardNavigation || !this.hasItems()) return;\n\n    const newIndex = this.listNavigationService.handleKeyNavigation(event, this.focusedIndex(), {\n      itemCount: this.items.length,\n      wrap: false,\n    });\n\n    if (newIndex !== -1 && newIndex !== this.focusedIndex()) {\n      this.setFocusedIndex(newIndex);\n      if (newIndex === this.items.length - 1 && this.hasMore && !this.isFetchingMore()) {\n        this.handleLoadMore();\n      }\n    }\n  }\n\n  setFocusedIndex(index: number): void {\n    const clampedIndex = Math.max(0, Math.min(index, this.items.length - 1));\n    if (clampedIndex !== this.focusedIndex()) {\n      this.focusedIndex.set(clampedIndex);\n      this.focusedIndexChange.emit(clampedIndex);\n    }\n    this.scrollItemIntoView(clampedIndex);\n  }\n\n  getItemTabIndex(index: number): number {\n    return this.listNavigationService.getItemTabIndex(index, this.focusedIndex());\n  }\n\n  onItemFocus(index: number): void {\n    if (index !== this.focusedIndex()) {\n      this.focusedIndex.set(index);\n      this.focusedIndexChange.emit(index);\n    }\n  }\n\n  onRetry(): void {\n    this.retry.emit();\n  }\n\n  // ── Focus Management ─────────────────────────────────────────────────────\n\n  handleItemDeleted(deletedIndex: number): void {\n    const currentFocused = this.focusedIndex();\n    if (this.items.length === 0) { this.focusedIndex.set(0); return; }\n    if (deletedIndex === currentFocused) {\n      const newIndex = deletedIndex < this.items.length ? deletedIndex : deletedIndex - 1;\n      if (newIndex >= 0) { this.setFocusedIndex(newIndex); }\n    } else if (deletedIndex < currentFocused) {\n      this.focusedIndex.set(currentFocused - 1);\n    }\n  }\n\n  private handleLoadingToLoadedTransition(): void {\n    this.pendingTimers.push(setTimeout(() => {\n      if (this.error) {\n        this.focusErrorState();\n      } else if (this.items.length === 0) {\n        this.focusEmptyState();\n      } else {\n        this.focusFirstItemWithoutScroll();\n      }\n      this.initialFocusSet = true;\n    }, 0));\n  }\n\n  private handleInfiniteScrollLoad(newItemsCount: number): void {\n    if (newItemsCount > 0) { this.announceItemsLoaded(newItemsCount); }\n  }\n\n  focusFirstItem(): void {\n    if (this.items.length > 0) { this.setFocusedIndex(0); }\n  }\n\n  private focusFirstItemWithoutScroll(): void {\n    if (this.items.length > 0) {\n      this.focusedIndex.set(0);\n      this.focusedIndexChange.emit(0);\n      this.pendingTimers.push(setTimeout(() => {\n        if (isUserInSearchInput()) return;\n        focusListItem(0, this.listItemElements, false, this.initialFocusSet);\n      }, 0));\n    }\n  }\n\n  focusEmptyState(): void {\n    this.pendingTimers.push(setTimeout(() => {\n      if (isUserInSearchInput()) { this.focusedIndexChange.emit(-1); return; }\n      focusStateContainer(this.emptyStateContainer);\n      this.focusedIndexChange.emit(-1);\n    }, 0));\n  }\n\n  focusErrorState(): void {\n    this.pendingTimers.push(setTimeout(() => {\n      if (isUserInSearchInput()) { this.focusedIndexChange.emit(-1); return; }\n      focusStateContainer(this.errorStateContainer);\n      this.focusedIndexChange.emit(-1);\n    }, 0));\n  }\n\n  private scrollItemIntoView(index: number): void {\n    this.pendingTimers.push(setTimeout(() => {\n      if (isUserInSearchInput()) return;\n      focusListItem(index, this.listItemElements, true, this.initialFocusSet);\n    }, 0));\n  }\n\n  // ── Live Announcements ───────────────────────────────────────────────────\n\n  private announceLoadingMore(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_loading_more_items'),\n      'polite'\n    );\n  }\n\n  announceItemsLoaded(count: number): void {\n    const message = CometChatLocalize.getLocalizedString('accessibility_items_loaded').replace(\n      '{count}',\n      count.toString()\n    );\n    this.liveAnnouncer.announce(message, 'polite');\n  }\n\n  announceAllItemsLoaded(): void {\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_all_items_loaded'),\n      'polite'\n    );\n  }\n\n  announceLoadError(): void {\n    this.liveAnnouncer.announceError(\n      CometChatLocalize.getLocalizedString('accessibility_load_failed')\n    );\n  }\n}\n","<!-- \n  CometChatPaginatedList Template\n  \n  A generic, reusable component for infinite scroll lists.\n  Handles pagination, loading states, empty states, and error states.\n  Uses IntersectionObserver for efficient scroll detection.\n  \n  Accessibility Features:\n  - role=\"listbox\" on container for screen reader list semantics\n  - each projected item component provides its own role=\"option\" semantics\n  - aria-label for list identification\n  - aria-busy indicates loading state\n  - aria-multiselectable for selection mode\n  - Roving tabindex pattern for keyboard navigation\n  - Keyboard navigation with ArrowUp/ArrowDown, Home/End\n  - Scroll into view on focus change\n-->\n\n<div \n  #listContainer\n  class=\"cometchat-paginated-list\"\n  [class.cometchat-paginated-list--show-scrollbar]=\"showScrollbar\"\n  [attr.aria-label]=\"ariaLabel || null\"\n  [attr.aria-busy]=\"isFetchingMore() || isLoading\"\n  [attr.aria-multiselectable]=\"isMultiSelect || null\"\n  (keydown)=\"onListKeyDown($event)\">\n  \n  <!-- Scroll top anchor for IntersectionObserver -->\n  <div \n    #scrollTopAnchor \n    class=\"cometchat-paginated-list__scroll-anchor cometchat-paginated-list__scroll-anchor--top\"\n    aria-hidden=\"true\">\n  </div>\n  \n  <!-- Loading State (initial load only) -->\n  @if (isLoading && items.length === 0) {\n    <div class=\"cometchat-paginated-list__loading\" role=\"status\" aria-live=\"polite\">\n      @if (loadingTemplate) {\n        <ng-container *ngTemplateOutlet=\"loadingTemplate\"></ng-container>\n      } @else {\n        <!-- Default loading spinner - no text to avoid localization in generic component -->\n        <div class=\"cometchat-paginated-list__loading-default\">\n          <span class=\"cometchat-paginated-list__loading-spinner\" aria-hidden=\"true\"></span>\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Error State -->\n  @if (error && !isLoading && !hideError) {\n    <div \n      #errorStateContainer\n      class=\"cometchat-paginated-list__error\" \n      role=\"alert\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"errorStateAriaLabel || null\"\n      (keydown.enter)=\"onRetry()\">\n      @if (errorTemplate) {\n        <ng-container *ngTemplateOutlet=\"errorTemplate; context: { $implicit: error }\"></ng-container>\n      } @else {\n        <!-- Default error display - shows error message from Error object -->\n        <div class=\"cometchat-paginated-list__error-default\">\n          <span class=\"cometchat-paginated-list__error-message\">{{ error.message }}</span>\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Empty State -->\n  @if (isEmpty() && !error) {\n    <div \n      #emptyStateContainer\n      class=\"cometchat-paginated-list__empty\" \n      role=\"status\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"emptyStateAriaLabel || null\">\n      @if (emptyTemplate) {\n        <ng-container *ngTemplateOutlet=\"emptyTemplate\"></ng-container>\n      } @else {\n        <!-- Default empty state - minimal, parent should provide custom template -->\n        <div class=\"cometchat-paginated-list__empty-default\">\n          <!-- No text - parent component should provide emptyTemplate with localized text -->\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Items List -->\n  @if (hasItems()) {\n    <div class=\"cometchat-paginated-list__items\" role=\"listbox\" [attr.aria-label]=\"ariaLabel || null\" [attr.aria-multiselectable]=\"isMultiSelect || null\">\n      @for (item of items; track trackByFn($index, item); let i = $index) {\n        <!--\n          Generic scroll/keyboard container. The projected item component\n          (e.g. cometchat-conversation-item) owns role=\"option\", aria-selected\n          and aria-label, so this wrapper is intentionally left without an ARIA\n          role to avoid nesting one option inside another (which breaks the\n          listbox → option ownership required by assistive tech).\n        -->\n        <div\n          #listItem\n          class=\"cometchat-paginated-list__item\"\n          [attr.tabindex]=\"getItemTabIndex(i)\"\n          (click)=\"handleItemClick(item, i)\"\n          (focus)=\"onItemFocus(i)\">\n          @if (itemTemplate) {\n            <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: item, index: i }\"></ng-container>\n          }\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Loading More Indicator (pagination) -->\n  @if (showLoadingMore()) {\n    <div \n      class=\"cometchat-paginated-list__loading-more\" \n      aria-hidden=\"true\">\n      @if (loadingMoreTemplate) {\n        <ng-container *ngTemplateOutlet=\"loadingMoreTemplate\"></ng-container>\n      } @else {\n        <!-- Default loading more spinner -->\n        <div class=\"cometchat-paginated-list__loading-more-default\">\n          <span \n            class=\"cometchat-paginated-list__loading-spinner cometchat-paginated-list__loading-spinner--small\"\n            aria-hidden=\"true\">\n          </span>\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Scroll bottom anchor for IntersectionObserver -->\n  <div \n    #scrollBottomAnchor \n    class=\"cometchat-paginated-list__scroll-anchor cometchat-paginated-list__scroll-anchor--bottom\"\n    aria-hidden=\"true\">\n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  HostListener,\n  ViewChild,\n  ElementRef,\n  ChangeDetectionStrategy,\n  DestroyRef,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { getLocalizedString } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { handleActivation } from '../../../utils/keyboard-utils';\n\n@Component({\n  selector: 'cometchat-search-bar',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule],\n  templateUrl: './cometchat-search-bar.component.html',\n  styleUrls: ['./cometchat-search-bar.component.css'],\n})\nexport class CometChatSearchBarComponent implements OnInit, OnChanges, OnDestroy {\n  /** Initial/controlled search text value */\n  @Input() searchText = '';\n  /** Placeholder text for the search input */\n  @Input() placeholderText: string = getLocalizedString('search_placeholder');\n  /** Debounce delay in milliseconds (default: 300ms) */\n  @Input() debounceDelay = 300;\n  /** Custom aria-label for the search input (overrides placeholderText) */\n  @Input() ariaLabel?: string;\n\n  /** Emitted when search text changes (debounced) */\n  @Output() searchChanged = new EventEmitter<{ value: string }>();\n  /** Emitted when clear button is clicked */\n  @Output() clearClick = new EventEmitter<void>();\n  /**\n   * Emitted when ArrowDown is pressed to move focus to the first list item.\n   * Parent components should listen to this event and focus the first item in their list.\n   * Requirement 12.3: ArrowDown from search bar moves focus to first list item\n   */\n  @Output() focusFirstListItem = new EventEmitter<void>();\n\n  // Internal state\n  searchValue = '';\n  private searchSubject = new Subject<string>();\n  private readonly destroyRef = inject(DestroyRef);\n\n  @ViewChild('searchInput') searchInputRef!: ElementRef<HTMLInputElement>;\n\n  ngOnInit(): void {\n    this.searchValue = this.searchText;\n\n    // Set up debounced search using takeUntilDestroyed for automatic cleanup\n    this.searchSubject\n      .pipe(debounceTime(this.debounceDelay), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n      .subscribe(value => {\n        this.searchChanged.emit({ value });\n      });\n  }\n\n  ngOnChanges(): void {\n    if (this.searchValue !== this.searchText) {\n      this.searchValue = this.searchText;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.searchSubject.complete();\n  }\n\n  /**\n   * Handle keyboard events for accessibility\n   * Implements:\n   * - Escape key to clear search (Requirement 12.4)\n   * - ArrowDown to move focus to first list item (Requirement 12.3)\n   */\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void {\n    // Escape: Clear search text (Requirement 12.4)\n    if (event.key === 'Escape' && this.searchValue.length > 0) {\n      event.preventDefault();\n      this.onClearClick();\n      return;\n    }\n\n    // ArrowDown: Move focus to first list item (Requirement 12.3)\n    if (event.key === 'ArrowDown') {\n      event.preventDefault();\n      this.focusFirstListItem.emit();\n      return;\n    }\n  }\n\n  onSearchValueChange(value: string): void {\n    this.searchValue = value;\n    this.searchSubject.next(value);\n  }\n\n  /** @deprecated Use onSearchValueChange instead */\n  onInputChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.searchValue = target.value;\n    this.searchSubject.next(this.searchValue);\n  }\n\n  onClearClick(): void {\n    this.searchValue = '';\n    this.searchSubject.next('');\n    this.clearClick.emit();\n    // Maintain cursor focus after clearing\n    this.searchInputRef?.nativeElement?.focus();\n  }\n\n  get showClearButton(): boolean {\n    return this.searchValue.length > 0;\n  }\n\n  /**\n   * Get the aria-label for the search input\n   * Uses custom ariaLabel if provided, otherwise falls back to placeholderText\n   */\n  get searchAriaLabel(): string {\n    return this.ariaLabel || this.placeholderText;\n  }\n\n  /**\n   * Get the aria-label for the clear button using localization\n   * Requirement 6.5: Clear button shall have aria-label for screen reader context\n   */\n  get clearButtonAriaLabel(): string {\n    return getLocalizedString('accessibility_clear_search');\n  }\n\n  /**\n   * Handle keyboard events on the clear button\n   * Requirement 6.6: Clear button shall be activatable via Enter or Space keys\n   */\n  onClearKeyDown(event: KeyboardEvent): void {\n    handleActivation(event, () => this.onClearClick());\n  }\n}\n","<div class=\"cometchat-search-bar\" role=\"search\">\n  <div class=\"cometchat-search-bar__icon\" aria-hidden=\"true\"></div>\n  <input \n    #searchInput\n    type=\"search\"\n    class=\"cometchat-search-bar__input\" \n    [(ngModel)]=\"searchValue\"\n    (ngModelChange)=\"onSearchValueChange($event)\"\n    [placeholder]=\"placeholderText\"\n    role=\"searchbox\"\n    [attr.aria-label]=\"searchAriaLabel\"\n  />\n  @if (showClearButton) {\n    <button \n      class=\"cometchat-search-bar__clear\"\n      (click)=\"onClearClick()\"\n      (keydown)=\"onClearKeyDown($event)\"\n      type=\"button\"\n      [attr.aria-label]=\"clearButtonAriaLabel\"\n      tabindex=\"0\"\n    >\n      <div class=\"cometchat-search-bar__clear-icon\" aria-hidden=\"true\"></div>\n    </button>\n  }\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  forwardRef,\n  OnInit,\n  OnChanges, ChangeDetectionStrategy, SimpleChanges} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * CometChatCheckbox is a generic component for checkbox input.\n * It supports checked, disabled, and indeterminate states with full keyboard accessibility.\n */\n@Component({\n  selector: 'cometchat-checkbox',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-checkbox.component.html',\n  styleUrls: ['./cometchat-checkbox.component.css'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CometChatCheckboxComponent),\n      multi: true,\n    },\n  ],\n})\nexport class CometChatCheckboxComponent implements ControlValueAccessor, OnInit, OnChanges {\n  /** Checked state of the checkbox */\n  @Input() checked = false;\n\n  /** Label text for the checkbox */\n  @Input() labelText = '';\n\n  /** Disabled state */\n  @Input() disabled = false;\n\n  /** Indeterminate state (for partial selection) */\n  @Input() indeterminate = false;\n\n  /** Custom aria-label (overrides labelText for accessibility) */\n  @Input() ariaLabel?: string;\n\n  /** Emitted when checkbox value changes */\n  @Output() checkboxChanged = new EventEmitter<{ checked: boolean; labelText: string }>();\n\n  // Internal state\n  isChecked = false;\n\n  // Unique ID for label association\n  readonly checkboxId = `cometchat-checkbox-${Math.random().toString(36).substr(2, 9)}`;\n\n  // ControlValueAccessor implementation\n  private onChange: (value: boolean) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  ngOnInit(): void {\n    this.isChecked = this.checked;\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['checked']) {\n      this.isChecked = changes['checked'].currentValue;\n    }\n    if (changes['disabled'] && changes['disabled'].currentValue == null) {\n      this.disabled = false;\n    }\n    if (changes['indeterminate'] && changes['indeterminate'].currentValue == null) {\n      this.indeterminate = false;\n    }\n  }\n\n  onCheckboxChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.isChecked = target.checked;\n    this.indeterminate = false;\n\n    this.onChange(this.isChecked);\n    this.onTouched();\n\n    this.checkboxChanged.emit({\n      checked: this.isChecked,\n      labelText: this.labelText,\n    });\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * Space key toggles the checkbox (native behavior).\n   */\n  onKeyDown(event: KeyboardEvent): void {\n    // Space key is handled natively by checkbox input\n    // This method is here for potential future enhancements\n    if (event.key === ' ') {\n      // Native checkbox handles Space key, but we ensure it's not prevented\n      // by any parent handlers\n      event.stopPropagation();\n    }\n  }\n\n  /**\n   * Gets the accessible label for the checkbox.\n   * Priority: custom ariaLabel > labelText > default\n   */\n  get accessibleLabel(): string {\n    return (\n      this.ariaLabel ||\n      this.labelText ||\n      CometChatLocalize.getLocalizedString('checkbox_aria_label')\n    );\n  }\n\n  // ControlValueAccessor methods\n  writeValue(value: boolean): void {\n    this.isChecked = value;\n  }\n\n  registerOnChange(fn: (value: boolean) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n}\n","<div class=\"cometchat-checkbox\">\n  <input\n    type=\"checkbox\"\n    class=\"cometchat-checkbox__input\"\n    [id]=\"checkboxId\"\n    [checked]=\"isChecked\"\n    [disabled]=\"disabled\"\n    [indeterminate]=\"indeterminate\"\n    [attr.aria-checked]=\"indeterminate ? 'mixed' : isChecked\"\n    [attr.aria-disabled]=\"disabled || null\"\n    [attr.aria-label]=\"accessibleLabel\"\n    (change)=\"onCheckboxChange($event)\"\n    (keydown)=\"onKeyDown($event)\"\n  />\n  <label class=\"cometchat-checkbox__label\" [for]=\"checkboxId\">\n    <span class=\"cometchat-checkbox__checkmark\"></span>\n    @if (labelText) {\n      <span class=\"cometchat-checkbox__text\">{{ labelText }}</span>\n    }\n  </label>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  forwardRef,\n  OnInit,\n  OnChanges,\n  ElementRef,\n  Renderer2,\n  HostListener, ChangeDetectionStrategy, SimpleChanges} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n  getNavigationDirection,\n  getNextIndex,\n  NavigationDirection,\n} from '../../../utils/keyboard-utils';\n\n/**\n * CometChatRadioButton is a generic component for radio button input.\n * It supports grouping, keyboard navigation, and full accessibility.\n */\n@Component({\n  selector: 'cometchat-radio-button',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-radio-button.component.html',\n  styleUrls: ['./cometchat-radio-button.component.css'],\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => CometChatRadioButtonComponent),\n      multi: true,\n    },\n  ],\n})\nexport class CometChatRadioButtonComponent implements ControlValueAccessor, OnInit, OnChanges {\n  /** Checked state of the radio button */\n  @Input() checked = false;\n\n  /** Name for grouping radio buttons */\n  @Input() name = 'radio-group';\n\n  /** Label text for the radio button */\n  @Input() labelText = '';\n\n  /** Disabled state */\n  @Input() disabled = false;\n\n  /** Unique identifier for the radio button */\n  @Input() id = '';\n\n  /** Value of the radio button */\n  @Input() value: string = '';\n\n  /** Custom aria-label for accessibility */\n  @Input() ariaLabel?: string;\n\n  /** Emitted when radio button value changes */\n  @Output() radioChanged = new EventEmitter<{ checked: boolean; labelText: string; id: string }>();\n\n  // Internal state\n  isChecked = false;\n\n  // ControlValueAccessor implementation\n  private onChange: (value: string) => void = () => {};\n  private onTouched: () => void = () => {};\n\n  constructor(\n    private elementRef: ElementRef,\n    private renderer: Renderer2\n  ) {}\n\n  ngOnInit(): void {\n    this.isChecked = this.checked;\n    if (!this.id) {\n      this.id = `radio-${Math.random().toString(36).substr(2, 9)}`;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['checked']) {\n      this.isChecked = changes['checked'].currentValue;\n      this.updateRadioGroup();\n    }\n  }\n\n  onRadioChange(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    this.isChecked = target.checked;\n\n    // Update all radio buttons in the same group\n    this.updateRadioGroup();\n\n    this.onChange(this.value);\n    this.onTouched();\n\n    this.radioChanged.emit({\n      checked: this.isChecked,\n      labelText: this.labelText,\n      id: this.id,\n    });\n  }\n\n  /**\n   * Handle keyboard navigation for radio button groups\n   * Arrow keys navigate between radio buttons in the same group and select them\n   * Space key selects the current radio button\n   */\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    if (this.disabled) {\n      return;\n    }\n\n    const target = event.target as HTMLInputElement;\n\n    // Handle Space key to select radio button\n    if (event.key === ' ' || event.key === 'Spacebar') {\n      event.preventDefault();\n      if (!this.isChecked) {\n        this.selectRadioButton();\n      }\n      return;\n    }\n\n    // Handle Arrow keys for group navigation\n    const direction = getNavigationDirection(event);\n    if (direction) {\n      event.preventDefault();\n      this.navigateToNextRadio(target, direction);\n    }\n  }\n\n  /**\n   * Selects this radio button and emits the change event\n   */\n  private selectRadioButton(): void {\n    this.isChecked = true;\n    this.updateRadioGroup();\n    this.onChange(this.value);\n    this.onTouched();\n    this.radioChanged.emit({\n      checked: this.isChecked,\n      labelText: this.labelText,\n      id: this.id,\n    });\n  }\n\n  /**\n   * Navigates to the next/previous radio button in the group and selects it\n   * Skips disabled radio buttons during navigation\n   */\n  private navigateToNextRadio(\n    currentTarget: HTMLInputElement,\n    direction: NavigationDirection\n  ): void {\n    const radioButtons = Array.from(document.getElementsByName(this.name)) as HTMLInputElement[];\n\n    if (radioButtons.length === 0) {\n      return;\n    }\n\n    const currentIndex = radioButtons.findIndex(radio => radio === currentTarget);\n    if (currentIndex === -1) {\n      return;\n    }\n\n    // Use getNextIndex with skipDisabled callback to skip disabled radio buttons\n    const nextIndex = getNextIndex(currentIndex, direction, radioButtons.length, {\n      wrap: true,\n      skipDisabled: (index: number) => radioButtons[index]?.disabled ?? false,\n    });\n\n    const nextRadio = radioButtons[nextIndex];\n    if (nextRadio && !nextRadio.disabled) {\n      nextRadio.focus();\n      nextRadio.checked = true;\n\n      // Trigger change event on the next radio button\n      const changeEvent = new Event('change', { bubbles: true });\n      nextRadio.dispatchEvent(changeEvent);\n    }\n  }\n\n  /**\n   * Updates all radio buttons in the same group to ensure only one is checked.\n   * Note: In poll bubbles, this is handled by the parent component's data binding,\n   * so we don't need to manually update the DOM.\n   */\n  private updateRadioGroup(): void {\n    // Radio button state is managed by Angular's data binding via [checked] input\n    // No manual DOM manipulation needed\n  }\n\n  /**\n   * Gets the accessible label for the radio button.\n   * Priority: custom ariaLabel > labelText > default\n   */\n  get accessibleLabel(): string | undefined {\n    if (this.ariaLabel) {\n      return this.ariaLabel;\n    }\n    if (this.labelText) {\n      return this.labelText;\n    }\n    return undefined;\n  }\n\n  /**\n   * Gets the aria-checked attribute value.\n   * Returns \"true\" or \"false\" as strings for proper ARIA semantics.\n   */\n  get ariaCheckedValue(): string {\n    return this.isChecked ? 'true' : 'false';\n  }\n\n  /**\n   * Gets the aria-disabled attribute value.\n   * Returns \"true\" when disabled, null otherwise (to remove the attribute).\n   */\n  get ariaDisabledValue(): string | null {\n    return this.disabled ? 'true' : null;\n  }\n\n  // ControlValueAccessor methods\n  writeValue(value: string): void {\n    this.isChecked = value === this.value;\n  }\n\n  registerOnChange(fn: (value: string) => void): void {\n    this.onChange = fn;\n  }\n\n  registerOnTouched(fn: () => void): void {\n    this.onTouched = fn;\n  }\n\n  setDisabledState(isDisabled: boolean): void {\n    this.disabled = isDisabled;\n  }\n}\n","<div class=\"cometchat-radio-button\">\n  <label class=\"cometchat-radio-button__label\">\n    <input\n      type=\"radio\"\n      class=\"cometchat-radio-button__input\"\n      [id]=\"id\"\n      [name]=\"name\"\n      [value]=\"id\"\n      [checked]=\"isChecked\"\n      [disabled]=\"disabled\"\n      [attr.aria-checked]=\"ariaCheckedValue\"\n      [attr.aria-disabled]=\"ariaDisabledValue\"\n      [attr.aria-label]=\"accessibleLabel\"\n      (change)=\"onRadioChange($event)\"\n    />\n    <span class=\"cometchat-radio-button__custom\"></span>\n    @if (labelText) {\n      <span class=\"cometchat-radio-button__text\">{{ labelText }}</span>\n    }\n  </label>\n</div>\n","\nimport { Component, Input, Output, EventEmitter, TemplateRef, ViewChild, ContentChild, ChangeDetectionStrategy, OnInit, OnDestroy, signal, computed, Signal, inject, ElementRef, booleanAttribute, Optional, DestroyRef } from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatPaginatedListComponent } from '../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { CometChatConversationItemComponent } from '../cometchat-conversation-item/cometchat-conversation-item.component';\nimport { CometChatSearchBarComponent } from '../base-elements/cometchat-search-bar/cometchat-search-bar.component';\nimport { CometChatConfirmDialogComponent } from '../base-elements/cometchat-confirm-dialog/cometchat-confirm-dialog.component';\nimport { CometChatCheckboxComponent } from '../base-elements/cometchat-checkbox/cometchat-checkbox.component';\nimport { CometChatRadioButtonComponent } from '../base-elements/cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { ConversationsService } from '../../services/conversations.service';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { ChatStateService } from '../../services/chat-state.service';\nimport { FormatterConfigService } from '../../services/formatter-config.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { CometChatConversationEvents } from '../../events/CometChatConversationEvents';\nimport { CometChatSoundManager } from '../../resources/CometChatSoundManager/CometChatSoundManager';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatTextFormatter } from '../../formatters/cometchat-text-formatter';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { SelectionMode, Placement } from '../../Enums/Enums';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { ConversationSlots } from '../../interfaces/conversation-slots.interface';\nimport { SelectionState } from '../../modals/SelectionState';\nexport type { SelectionState } from '../../modals/SelectionState';\n\n@Component({\n  selector: 'cometchat-conversations',\n  standalone: true,\n  imports: [CommonModule, CometChatPaginatedListComponent, CometChatConversationItemComponent, CometChatSearchBarComponent, CometChatConfirmDialogComponent, CometChatCheckboxComponent, CometChatRadioButtonComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  templateUrl: './cometchat-conversations.component.html',\n  styleUrls: ['./cometchat-conversations.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatConversationsComponent implements OnInit, OnDestroy {\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n\n  private conversationsService = inject(ConversationsService);\n  private templatesService = inject(CometChatTemplatesService);\n  private chatStateService = inject(ChatStateService);\n  private formatterConfigService = inject(FormatterConfigService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private hideReceiptsExplicitlySet = signal(false); private hideErrorExplicitlySet = signal(false); private hideUserStatusExplicitlySet = signal(false);\n  private hideGroupTypeExplicitlySet = signal(false); private showScrollbarExplicitlySet = signal(false); private showSearchBarExplicitlySet = signal(false);\n  private disableSoundForMessagesExplicitlySet = signal(false); private textFormattersExplicitlySet = signal(false);\n  private disableDefaultContextMenuExplicitlySet = signal(false); private customSoundForMessagesExplicitlySet = signal(false);\n\n  private _hideReceipts = signal(false); private _hideError = signal(false); private _hideUserStatus = signal(false);\n  private _hideGroupType = signal(false); private _showScrollbar = signal(false); private _showSearchBar = signal(false);\n  private _disableSoundForMessages = signal(false); private _textFormatters = signal<any[]>([]); private _disableDefaultContextMenu = signal(true); private _customSoundForMessages = signal('');\n  @Input({ transform: booleanAttribute })\n  set hideReceipts(value: boolean) { this._hideReceipts.set(value); this.hideReceiptsExplicitlySet.set(true); }\n  get hideReceipts(): boolean { return this._hideReceipts(); }\n  @Input({ transform: booleanAttribute })\n  set hideError(value: boolean) { this._hideError.set(value); this.hideErrorExplicitlySet.set(true); }\n  get hideError(): boolean { return this._hideError(); }\n  @Input({ transform: booleanAttribute }) hideDeleteConversation = false;\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n  @Input({ transform: booleanAttribute })\n  set hideGroupType(value: boolean) { this._hideGroupType.set(value); this.hideGroupTypeExplicitlySet.set(true); }\n  get hideGroupType(): boolean { return this._hideGroupType(); }\n  @Input({ transform: booleanAttribute })\n  set disableDefaultContextMenu(value: boolean) { this._disableDefaultContextMenu.set(value); this.disableDefaultContextMenuExplicitlySet.set(true); }\n  get disableDefaultContextMenu(): boolean { return this._disableDefaultContextMenu(); }\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) { this._showScrollbar.set(value); this.showScrollbarExplicitlySet.set(true); }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n  @Input({ transform: booleanAttribute })\n  set showSearchBar(value: boolean) { this._showSearchBar.set(value); this.showSearchBarExplicitlySet.set(true); }\n  get showSearchBar(): boolean { return this._showSearchBar(); }\n  @Input() conversationsRequestBuilder?: CometChat.ConversationsRequestBuilder;\n  @Input() activeConversation?: CometChat.Conversation;\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) { this._textFormatters.set(value); this.textFormattersExplicitlySet.set(true); }\n  get textFormatters(): CometChatTextFormatter[] { return this._textFormatters(); }\n  @Input() selectionMode: SelectionMode = SelectionMode.none;\n  @Input() lastMessageDateTimeFormat?: CalendarObject;\n  @Input() options?: (conversation: CometChat.Conversation) => CometChatOption[];\n  @Input({ transform: booleanAttribute })\n  set disableSoundForMessages(value: boolean) { this._disableSoundForMessages.set(value); this.disableSoundForMessagesExplicitlySet.set(true); }\n  get disableSoundForMessages(): boolean { return this._disableSoundForMessages(); }\n  @Input()\n  set customSoundForMessages(value: string) { this._customSoundForMessages.set(value); this.customSoundForMessagesExplicitlySet.set(true); }\n  get customSoundForMessages(): string { return this._customSoundForMessages(); }\n  @Input() slots?: Partial<ConversationSlots>;\n  @Input() headerView?: TemplateRef<any>; @Input() menuView?: TemplateRef<any>; @Input() loadingView?: TemplateRef<any>;\n  @Input() emptyView?: TemplateRef<any>; @Input() errorView?: TemplateRef<any>; @Input() searchView?: TemplateRef<any>;\n  @Input() itemView?: TemplateRef<{ $implicit: CometChat.Conversation }>; @Input() leadingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.Conversation }>; @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.Conversation }>; @Input() trailingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n\n  @Input() listItemTemplate: TemplateRef<any> | null = null; @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null; @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n  @ContentChild('headerView') headerViewContent?: TemplateRef<any>; @ContentChild('menuView') menuViewContent?: TemplateRef<any>; @ContentChild('loadingView') loadingViewContent?: TemplateRef<any>;\n  @ContentChild('emptyView') emptyViewContent?: TemplateRef<any>; @ContentChild('errorView') errorViewContent?: TemplateRef<any>; @ContentChild('searchView') searchViewContent?: TemplateRef<any>;\n  @ContentChild('itemView') itemViewContent?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @ContentChild('leadingView') leadingViewContent?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @ContentChild('titleView') titleViewContent?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @ContentChild('subtitleView') subtitleViewContent?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @ContentChild('trailingView') trailingViewContent?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @ViewChild('paginatedList') paginatedList?: CometChatPaginatedListComponent<CometChat.Conversation>;\n  @ViewChild('searchBar') searchBar?: CometChatSearchBarComponent;\n  @ViewChild('dialogOverlay') dialogOverlay?: ElementRef<HTMLDivElement>;\n  @ViewChild('selectionControlTemplate') selectionControlTemplate?: TemplateRef<any>;\n\n  @Output() itemClick = new EventEmitter<CometChat.Conversation>();\n  @Output() select = new EventEmitter<{ conversation: CometChat.Conversation; selected: boolean }>();\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() searchBarClick = new EventEmitter<void>();\n  @Output() contextMenuOpen = new EventEmitter<CometChat.Conversation>();\n  @Output() contextMenuClose = new EventEmitter<CometChat.Conversation>();\n  @Output() scrollToTop = new EventEmitter<void>(); @Output() scrollToBottom = new EventEmitter<void>();\n  @Output() selectionChange = new EventEmitter<SelectionState>();\n\n  conversations!: Signal<CometChat.Conversation[]>; loadingState!: Signal<boolean>; errorState!: Signal<Error | null>;\n  activeConversationSignal!: Signal<CometChat.Conversation | null>; typingIndicators!: Signal<Map<string, CometChat.TypingIndicator>>;\n\n  selectedConversations = signal(new Set<string>()); focusedIndex = signal(-1); showDeleteConfirmDialog = signal(false);\n  conversationToDelete = signal<CometChat.Conversation | null>(null); isFetchingMore = signal(false); hasMore = signal(true);\n\n  hasSelection = computed(() => this.selectedConversations().size > 0);\n  selectedCount = computed(() => this.selectedConversations().size);\n  isSelectionModeActive = computed(() => this.selectionMode !== SelectionMode.none);\n  shouldShowDeleteDialog = computed(() => this.showDeleteConfirmDialog() && this.conversationToDelete() !== null);\n  hasConversations = computed(() => this.conversations().length > 0);\n  isLoading = computed(() => this.loadingState()); hasError = computed(() => this.errorState() !== null);\n\n  effectiveHideReceipts = computed(() => { if (this.hideReceiptsExplicitlySet()) return this._hideReceipts(); if (this.globalConfig?.hideReceipts !== undefined) return this.globalConfig.hideReceipts; return false; });\n  effectiveHideError = computed(() => { if (this.hideErrorExplicitlySet()) return this._hideError(); if (this.globalConfig?.hideError !== undefined) return this.globalConfig.hideError; return false; });\n  effectiveHideUserStatus = computed(() => { if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus(); if (this.globalConfig?.hideUserStatus !== undefined) return this.globalConfig.hideUserStatus; return false; });\n  effectiveHideGroupType = computed(() => { if (this.hideGroupTypeExplicitlySet()) return this._hideGroupType(); if (this.globalConfig?.hideGroupType !== undefined) return this.globalConfig.hideGroupType; return false; });\n  effectiveShowScrollbar = computed(() => { if (this.showScrollbarExplicitlySet()) return this._showScrollbar(); if (this.globalConfig?.showScrollbar !== undefined) return this.globalConfig.showScrollbar; return false; });\n  effectiveShowSearchBar = computed(() => { if (this.showSearchBarExplicitlySet()) return this._showSearchBar(); if (this.globalConfig?.showSearchBar !== undefined) return this.globalConfig.showSearchBar; return false; });\n  effectiveDisableSoundForMessages = computed(() => { if (this.disableSoundForMessagesExplicitlySet()) return this._disableSoundForMessages(); if (this.globalConfig?.disableSoundForMessages !== undefined) return this.globalConfig.disableSoundForMessages; return false; });\n  effectiveTextFormatters = computed(() => { if (this.textFormattersExplicitlySet()) return this._textFormatters(); if (this.globalConfig?.textFormatters !== undefined) return this.globalConfig.textFormatters; return []; });\n  effectiveDisableDefaultContextMenu = computed(() => { if (this.disableDefaultContextMenuExplicitlySet()) return this._disableDefaultContextMenu(); if (this.globalConfig?.disableDefaultContextMenu !== undefined) return this.globalConfig.disableDefaultContextMenu; return true; });\n  effectiveCustomSoundForMessages = computed(() => { if (this.customSoundForMessagesExplicitlySet()) return this._customSoundForMessages(); if (this.globalConfig?.customSoundForMessages !== undefined) return this.globalConfig.customSoundForMessages; return ''; });\n\n  private get _ct() { return this.templatesService.getConversationTemplates(); }\n  get effectiveItemView(): TemplateRef<any> | undefined { return this.listItemTemplate || this.itemView || this.itemViewContent || this._ct.itemView; }\n  get effectiveLeadingView(): TemplateRef<any> | undefined { return this.leadingView || this.leadingViewContent || this._ct.leadingView; }\n  get effectiveTitleView(): TemplateRef<any> | undefined { return this.titleView || this.titleViewContent || this._ct.titleView; }\n  get effectiveSubtitleView(): TemplateRef<any> | undefined { return this.subtitleView || this.subtitleViewContent || this._ct.subtitleView; }\n  get effectiveTrailingView(): TemplateRef<any> | undefined { return this.trailingView || this.trailingViewContent || this._ct.trailingView; }\n  get effectiveLoadingView(): TemplateRef<any> | undefined { return this.loadingStateTemplate || this.loadingView || this.loadingViewContent || this.templatesService.resolveTemplate(this._ct, 'loadingView'); }\n  get effectiveEmptyView(): TemplateRef<any> | undefined { return this.emptyStateTemplate || this.emptyView || this.emptyViewContent || this.templatesService.resolveTemplate(this._ct, 'emptyView'); }\n  get effectiveErrorView(): TemplateRef<any> | undefined { return this.errorStateTemplate || this.errorView || this.errorViewContent || this.templatesService.resolveTemplate(this._ct, 'errorView'); }\n  public loggedInUser: CometChat.User | null = null; private searchSubject$ = new Subject<string>(); public currentSearchText = '';\n  private lastSoundPlayedAt = 0; private readonly SOUND_THROTTLE_INTERVAL = 2000; private previousConversations: CometChat.Conversation[] = [];\n  private lastSelectedIndex = -1; public activeFormatters: CometChatTextFormatter[] = [];\n  private typingAnnouncementTimeout: ReturnType<typeof setTimeout> | null = null; private lastAnnouncedTypingUser: string | null = null;\n  private previousTypingSize = 0;\n  private readonly destroyRef = inject(DestroyRef);\n  readonly SelectionMode = SelectionMode; readonly Placement = Placement;\n\n  constructor() {\n    this.conversations = toSignal(this.conversationsService.conversations$, { initialValue: [] as CometChat.Conversation[] });\n    this.loadingState = toSignal(this.conversationsService.loadingState$, { initialValue: false });\n    this.errorState = toSignal(this.conversationsService.errorState$, { initialValue: null as Error | null });\n    this.activeConversationSignal = toSignal(this.conversationsService.activeConversation$, { initialValue: null as CometChat.Conversation | null });\n    this.typingIndicators = toSignal(this.conversationsService.typingIndicators$, { initialValue: new Map<string, CometChat.TypingIndicator>() });\n\n    safeEffect(() => { const c = this.conversations(); this.handleSoundNotification(c, this.previousConversations); this.detectAndAnnounceNewConversation(c, this.previousConversations); this.previousConversations = [...c]; });\n\n    safeEffect(() => { const ti = this.typingIndicators(); const currentSize = ti?.size ?? 0; if (currentSize > this.previousTypingSize && currentSize > 0) { const e = ti.entries().next().value; if (e) { const s = (e[1] as CometChat.TypingIndicator).getSender(); if (s) this.announceTyping(s.getName()); } } this.previousTypingSize = currentSize; });\n\n    safeEffect(() => { const e = this.errorState(); if (e && !this.effectiveHideError()) this.error.emit(e as CometChat.CometChatException); });\n\n    safeEffect(() => { if (this.showDeleteConfirmDialog() && this.dialogOverlay?.nativeElement) setTimeout(() => this.dialogOverlay?.nativeElement?.focus(), 0); });\n\n    // Sync hasMore from service — ensures pagination resets correctly after\n    // a silent reconnect fetch that resets the service's hasMore to true.\n    safeEffect(() => { this.hasMore.set(this.conversationsService.hasMore()); });\n  }\n  ngOnInit(): void {\n    try {\n      this.initializeLoggedInUser().then(() => {\n        // Reconfigure formatters with the now-resolved logged-in user\n        this.configureFormattersWithUser();\n      }).catch(() => { /* ignore — formatters work without user context */ });\n      this.initializeFormatters();\n      this.initializeService();\n      this.setupSearchDebouncing();\n      this.subscribeToMessagesReadEvents();\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      CometChatLogger.error('CometChatConversations', 'Error in ngOnInit:', err);\n      this.error.emit(err as CometChat.CometChatException);\n    }\n  }\n  ngOnDestroy(): void {\n    try {\n      if (this.typingAnnouncementTimeout) {\n        clearTimeout(this.typingAnnouncementTimeout);\n        this.typingAnnouncementTimeout = null;\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatConversations', 'Error in ngOnDestroy:', error);\n    }\n  }\n  private async initializeLoggedInUser(): Promise<void> { try { this.loggedInUser = await CometChat.getLoggedinUser(); } catch (error) { CometChatLogger.error('CometChatConversations', 'Error getting logged-in user:', error); } }\n  private initializeFormatters(): void { const ef = this.effectiveTextFormatters(); this.activeFormatters = (ef?.length > 0) ? [...ef] : this.formatterConfigService.getDefaultFormatters(); this.configureFormattersWithUser(); }\n  private configureFormattersWithUser(): void { if (!this.loggedInUser) return; this.activeFormatters = this.formatterConfigService.getFormattersWithContext(this.loggedInUser, undefined); }\n  private initializeService(): void { this.conversationsService.fetchConversations(this.conversationsRequestBuilder); if (this.activeConversation) this.conversationsService.setActiveConversation(this.activeConversation); }\n  handleLoadMore(): void {\n    if (this.isFetchingMore()) return;\n    this.isFetchingMore.set(true); const start = Date.now();\n    this.conversationsService.fetchNextConversations().then(h => { const rem = Math.max(0, 500 - (Date.now() - start)); setTimeout(() => { this.isFetchingMore.set(false); this.hasMore.set(h); this.paginatedList?.loadComplete(); }, rem); }).catch(e => { CometChatLogger.error('CometChatConversations', 'fetchNextConversations error:', e); this.isFetchingMore.set(false); this.paginatedList?.loadComplete(); });\n  }\n  handleScrollToTop(): void { this.scrollToTop.emit(); }\n  handleScrollToBottom(): void { this.scrollToBottom.emit(); }\n  handleConversationClick(conversation: CometChat.Conversation): void {\n    if (this.selectionMode !== SelectionMode.none) { this.handleSelection(conversation); this.announceSelectionCount(); return; }\n    // ENG-35029: Guard against clicks while the conversation list is still loading.\n    // Clicking during load can result in a \"Something went wrong\" error because the\n    // conversation object may be incomplete or the message list service isn't ready.\n    if (this.loadingState()) { return; }\n    this.conversationsService.setActiveConversation(conversation);\n    if (this.itemClick.observed) { this.itemClick.emit(conversation); } else { this.chatStateService.setActiveConversation(conversation); }\n  }\n  handleConversationSelect(event: { conversation: CometChat.Conversation; selected: boolean }): void { this.select.emit(event); }\n  handleContextMenuOpen(conversation: CometChat.Conversation): void { this.contextMenuOpen.emit(conversation); }\n  handleContextMenuOptionClick(event: { option: CometChatOption; conversation: CometChat.Conversation }): void { if (event.option.id === 'delete') this.handleDeleteConversationClick(event.conversation); if (event.option.onClick) event.option.onClick(); }\n  handleSelection(conversation: CometChat.Conversation, event?: MouseEvent): void {\n    const id = this.getConversationId(conversation); const convs = this.conversations();\n    const idx = convs.findIndex(c => this.getConversationId(c) === id);\n    if (this.selectionMode === SelectionMode.single) {\n      const wasSelected = this.selectedConversations().has(id);\n      this.selectedConversations.set(wasSelected ? new Set() : new Set([id]));\n      this.select.emit({ conversation, selected: !wasSelected }); this.lastSelectedIndex = idx;\n    } else if (this.selectionMode === SelectionMode.multiple) {\n      if (event?.shiftKey && this.lastSelectedIndex !== -1 && idx !== -1) { this.selectRange(this.lastSelectedIndex, idx); }\n      else { this.selectedConversations.update(sel => { const ns = new Set(sel); if (ns.has(id)) { ns.delete(id); this.select.emit({ conversation, selected: false }); } else { ns.add(id); this.select.emit({ conversation, selected: true }); } return ns; }); this.lastSelectedIndex = idx; }\n    }\n    this.selectionChange.emit({ mode: this.selectionMode, selectedIds: this.selectedConversations(), lastSelectedId: id });\n  }\n  selectAll(): void {\n    if (this.selectionMode !== SelectionMode.multiple) return;\n    const convs = this.conversations(); const ns = new Set<string>(); convs.forEach(c => { const id = this.getConversationId(c); ns.add(id); this.select.emit({ conversation: c, selected: true }); });\n    this.selectedConversations.set(ns); this.lastSelectedIndex = convs.length - 1;\n    this.selectionChange.emit({ mode: this.selectionMode, selectedIds: ns, lastSelectedId: null });\n  }\n  clearSelection(): void {\n    const sel = this.selectedConversations(); this.conversations().forEach(c => { if (sel.has(this.getConversationId(c))) this.select.emit({ conversation: c, selected: false }); });\n    this.selectedConversations.set(new Set()); this.lastSelectedIndex = -1;\n    this.selectionChange.emit({ mode: this.selectionMode, selectedIds: new Set(), lastSelectedId: null });\n  }\n  private selectRange(startIndex: number, endIndex: number): void {\n    const convs = this.conversations(); const [min, max] = [Math.min(startIndex, endIndex), Math.max(startIndex, endIndex)];\n    const clicked = convs[endIndex]; if (!clicked) return;\n    const clickedId = this.getConversationId(clicked); const deselect = this.selectedConversations().has(clickedId);\n    this.selectedConversations.update(sel => { const ns = new Set(sel); for (let i = min; i <= max; i++) { const c = convs[i]; if (!c) continue; const id = this.getConversationId(c); if (deselect && ns.has(id)) { ns.delete(id); this.select.emit({ conversation: c, selected: false }); } else if (!deselect && !ns.has(id)) { ns.add(id); this.select.emit({ conversation: c, selected: true }); } } return ns; });\n    this.lastSelectedIndex = endIndex;\n  }\n  handleSelectionClick(eventOrConversation: MouseEvent | CometChat.Conversation, conversation?: CometChat.Conversation): void {\n    let event: MouseEvent | undefined; let conv: CometChat.Conversation;\n    if (eventOrConversation instanceof MouseEvent) { event = eventOrConversation; conv = conversation!; event.stopPropagation(); } else { conv = eventOrConversation; }\n    this.handleSelection(conv, event);\n    if (event?.shiftKey) { this.focusedIndex.set(-1); (document.activeElement as HTMLElement)?.blur(); }\n  }\n  handleContainerClick(event: MouseEvent): void { const t = event.target as HTMLElement; if (!t.closest('.cometchat-conversation-item') && !t.closest('.cometchat-conversations__selection-control') && !t.closest('cometchat-search-bar')) { this.focusedIndex.set(-1); (document.activeElement as HTMLElement)?.blur(); } }\n  isConversationSelected(conversation: CometChat.Conversation): boolean { return this.selectedConversations().has(this.getConversationId(conversation)); }\n  isConversationActive(conversation: CometChat.Conversation): boolean { const id = this.getConversationId(conversation); if (this.activeConversation) return id === this.getConversationId(this.activeConversation); const s = this.activeConversationSignal(); return s ? id === this.getConversationId(s) : false; }\n  handleDeleteConversationClick(conversation: CometChat.Conversation): void { this.conversationToDelete.set(conversation); this.showDeleteConfirmDialog.set(true); }\n  async handleDeleteConfirm(): Promise<void> {\n    const conv = this.conversationToDelete(); if (!conv) return;\n    try { const cw = conv.getConversationWith(); const id = cw instanceof CometChat.User ? cw.getUid() : cw.getGuid(); const type = cw instanceof CometChat.User ? 'user' : 'group'; await this.conversationsService.deleteConversation(id, type); this.announceConversationDeleted(); }\n    catch (error) { this.error.emit(error as CometChat.CometChatException); } finally { this.showDeleteConfirmDialog.set(false); this.conversationToDelete.set(null); }\n  }\n  handleDeleteCancel(): void { this.showDeleteConfirmDialog.set(false); this.conversationToDelete.set(null); }\n  handleDialogKeydown(event: KeyboardEvent): void { if (event.key === 'Escape') this.handleDeleteCancel(); event.stopPropagation(); }\n  private setupSearchDebouncing(): void {\n    this.searchSubject$\n      .pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n      .subscribe(searchText => {\n        this.conversationsService.searchConversations(searchText);\n\n        if (searchText && searchText.trim() !== '') {\n          setTimeout(() => {\n            this.announceSearchResults(this.conversations().length);\n          }, 50);\n        }\n      });\n  }\n  onSearch(value: string): void {\n    this.currentSearchText = value;\n    this.searchSubject$.next(value);\n  }\n  handleSearchBarClick(): void { this.searchBarClick.emit(); }\n  handleKeydown(event: KeyboardEvent): void {\n    const conversations = this.conversations();\n    if (!conversations.length || this.showDeleteConfirmDialog()) return;\n    if (!(event.target as HTMLElement).closest('.cometchat-conversations')) return;\n\n    if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key === 'a' && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); event.stopPropagation(); this.clearSelection(); this.announceSelectionCleared(); return; }\n    if ((event.ctrlKey || event.metaKey) && event.key === 'a' && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); event.stopPropagation(); this.selectAll(); this.announceSelectionCount(); return; }\n    if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') { event.preventDefault(); event.stopPropagation(); this.openContextMenuForFocused(); return; }\n    if ((event.key === 'Delete' || event.key === 'Backspace') && !this.hideDeleteConversation) { const fc = this.getFocusedConversation(); if (fc) { event.preventDefault(); event.stopPropagation(); this.handleDeleteConversationClick(fc); return; } }\n    if (this.selectionMode !== SelectionMode.none) { const handled = this.handleSelectionKeyboard(event); if (handled) return; }\n    switch (event.key) {\n      case 'ArrowDown': event.preventDefault(); event.stopPropagation(); this.focusedIndex.set(this.focusedIndex() === -1 ? 0 : (this.focusedIndex() + 1) % conversations.length); this.focusItemAtIndex(this.focusedIndex()); break;\n      case 'ArrowUp': event.preventDefault(); event.stopPropagation(); this.focusedIndex.set(this.focusedIndex() <= 0 ? conversations.length - 1 : this.focusedIndex() - 1); this.focusItemAtIndex(this.focusedIndex()); break;\n      case 'Enter': event.preventDefault(); if (this.focusedIndex() >= 0 && this.focusedIndex() < conversations.length) this.handleConversationClick(conversations[this.focusedIndex()]); break;\n      case ' ': if (this.selectionMode === SelectionMode.none) { event.preventDefault(); if (this.focusedIndex() >= 0 && this.focusedIndex() < conversations.length) this.handleConversationClick(conversations[this.focusedIndex()]); } break;\n      case 'Escape': event.preventDefault(); if (this.selectionMode !== SelectionMode.none && this.hasSelection()) { this.clearSelection(); this.announceSelectionCleared(); } this.focusedIndex.set(-1); (document.activeElement as HTMLElement)?.blur(); break;\n    }\n  }\n  private handleSelectionKeyboard(event: KeyboardEvent): boolean {\n    const fi = this.focusedIndex(); const convs = this.conversations();\n\n    if (event.key === ' ' && !event.shiftKey) { event.preventDefault(); event.stopPropagation(); if (fi >= 0 && fi < convs.length) { this.handleSelection(convs[fi]); this.announceSelectionCount(); } return true; }\n    if (event.key === ' ' && event.shiftKey && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); event.stopPropagation(); if (fi >= 0 && fi < convs.length) { this.selectRange(this.lastSelectedIndex, fi); this.announceSelectionCount(); } return true; }\n    if (event.key === 'ArrowDown' && event.shiftKey && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); event.stopPropagation(); const ni = fi + 1; if (ni < convs.length) { this.extendSelectionTo(ni); this.focusedIndex.set(ni); this.focusItemAtIndex(ni); this.announceSelectionCount(); } return true; }\n    if (event.key === 'ArrowUp' && event.shiftKey && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); event.stopPropagation(); const pi = fi - 1; if (pi >= 0) { this.extendSelectionTo(pi); this.focusedIndex.set(pi); this.focusItemAtIndex(pi); this.announceSelectionCount(); } return true; }\n    return false;\n  }\n  private extendSelectionTo(index: number): void { const convs = this.conversations(); if (index < 0 || index >= convs.length) return; const c = convs[index]; const id = this.getConversationId(c); this.selectedConversations.update(sel => { const ns = new Set(sel); ns.add(id); return ns; }); this.select.emit({ conversation: c, selected: true }); this.lastSelectedIndex = index; this.selectionChange.emit({ mode: this.selectionMode, selectedIds: this.selectedConversations(), lastSelectedId: id }); }\n  private getFocusedConversation(): CometChat.Conversation | null { const i = this.focusedIndex(); const c = this.conversations(); return (i >= 0 && i < c.length) ? c[i] : null; }\n  private openContextMenuForFocused(): void { const c = this.getFocusedConversation(); if (c) this.handleContextMenuOpen(c); }\n  private announceSelectionCount(): void { const c = this.selectedCount(); if (c > 0) this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_items_selected').replace('{count}', c.toString()), 'polite'); }\n  private announceSelectionCleared(): void { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_selection_cleared'), 'polite'); }\n  announceSearchResults(count: number): void {\n    if (count === 0) { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_no_results'), 'polite'); }\n    else { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_results_found').replace('{count}', count.toString()), 'polite'); }\n  }\n  announceNewConversation(name: string): void { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_new_conversation').replace('{name}', name), 'polite'); }\n  announceTyping(name: string): void {\n    if (this.lastAnnouncedTypingUser === name) return;\n    if (this.typingAnnouncementTimeout) clearTimeout(this.typingAnnouncementTimeout);\n    this.typingAnnouncementTimeout = setTimeout(() => {\n      this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_user_typing').replace('{name}', name), 'polite');\n      this.lastAnnouncedTypingUser = name;\n      setTimeout(() => { if (this.lastAnnouncedTypingUser === name) this.lastAnnouncedTypingUser = null; }, 5000);\n    }, 1000);\n  }\n  announceConversationDeleted(): void { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_conversation_deleted'), 'polite'); }\n  private detectAndAnnounceNewConversation(current: CometChat.Conversation[], previous: CometChat.Conversation[]): void {\n    if (!current.length || !previous.length) return;\n    const first = current[0]; const firstId = this.getConversationId(first);\n    if (!previous.some(c => this.getConversationId(c) === firstId)) { const name = first.getConversationWith().getName(); if (name) this.announceNewConversation(name); }\n  }\n  private focusItemAtIndex(index: number): void {\n    setTimeout(() => {\n      const items = document.querySelector('.cometchat-paginated-list__items')?.querySelectorAll('.cometchat-paginated-list__item');\n      if (!items || index < 0 || index >= items.length) return;\n      const el = items[index].querySelector('.cometchat-conversation-item[tabindex]') as HTMLElement;\n      if (el) { el.focus(); el.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }\n    }, 0);\n  }\n  handleFocusIn(event: FocusEvent): void {\n    const target = event.target as HTMLElement; if (!target) return;\n    const itemDiv = target.classList.contains('cometchat-conversation-item') ? target : target.closest('.cometchat-conversation-item'); if (!itemDiv) return;\n    const paginatedListItem = itemDiv.closest('.cometchat-conversations__list-item-wrapper')?.closest('.cometchat-paginated-list__item'); if (!paginatedListItem) return;\n    const itemsContainer = paginatedListItem.parentElement; if (!itemsContainer?.classList.contains('cometchat-paginated-list__items')) return;\n    const index = Array.from(itemsContainer.children).indexOf(paginatedListItem);\n    if (index !== -1 && this.focusedIndex() !== index) this.focusedIndex.set(index);\n  }\n  getContextMenuOptions(conversation: CometChat.Conversation): CometChatOption[] {\n    if (this.options) return this.options(conversation);\n    const opts: CometChatOption[] = [];\n    if (!this.hideDeleteConversation) opts.push(new CometChatOption({ id: 'delete', title: CometChatLocalize.getLocalizedString('conversation_delete_icon_hover'), iconURL: 'assets/delete.svg', onClick: () => this.handleDeleteConversationClick(conversation) }));\n    return opts;\n  }\n  private handleSoundNotification(current: CometChat.Conversation[], previous: CometChat.Conversation[]): void {\n    if (this.effectiveDisableSoundForMessages() || !current.length) return;\n    const first = current[0]; const msg = first.getLastMessage();\n    if (!msg || !this.shouldPlaySound() || !this.isNewMessage(first, previous) || this.isConversationActive(first) || this.isMessageFromLoggedInUser(msg)) return;\n    this.playMessageSound();\n  }\n  private shouldPlaySound(): boolean { return Date.now() - this.lastSoundPlayedAt >= this.SOUND_THROTTLE_INTERVAL; }\n  private isNewMessage(conversation: CometChat.Conversation, previous: CometChat.Conversation[]): boolean {\n    const id = this.getConversationId(conversation); const msg = conversation.getLastMessage(); if (!msg) return false;\n    const prev = previous.find(c => this.getConversationId(c) === id); if (!prev) return true;\n    const prevMsg = prev.getLastMessage(); return !prevMsg || msg.getId() !== prevMsg.getId();\n  }\n  private isMessageFromLoggedInUser(message: CometChat.BaseMessage): boolean { if (!this.loggedInUser) return false; const s = message.getSender(); return s?.getUid() === this.loggedInUser.getUid(); }\n  private playMessageSound(): void { try { this.lastSoundPlayedAt = Date.now(); CometChatSoundManager.play('incomingMessage', this.effectiveCustomSoundForMessages() || null); } catch (error) { CometChatLogger.error('CometChatConversations', 'Error playing sound:', error); } }\n\n  getConversationId(conversation: CometChat.Conversation): string {\n    const cw = conversation.getConversationWith(); return cw instanceof CometChat.User ? cw.getUid() : cw.getGuid(); }\n\n  getTypingIndicator(conversation: CometChat.Conversation): CometChat.TypingIndicator | null { const ti = this.typingIndicators(); if (!ti) return null; const cw = conversation.getConversationWith(); const id = cw instanceof CometChat.User ? cw.getUid() : cw.getGuid(); return ti.get(id) || null; }\n  getDefaultDateTimeFormat(): CalendarObject {\n    return {\n      today: `hh:mm A`,\n      yesterday: `[${CometChatLocalize.getLocalizedString('yesterday')}]`,\n      otherDays: 'DD/MM/YYYY',\n    };\n  }\n  trackByConversation(_index: number, conversation: CometChat.Conversation): string { return this.getConversationId(conversation); }\n  private subscribeToMessagesReadEvents(): void {\n    CometChatMessageEvents.ccMessageRead.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((msg: CometChat.BaseMessage) => {\n      try { const r = msg.getReceiver(); const id = r instanceof CometChat.User ? r.getUid() : r instanceof CometChat.Group ? r.getGuid() : (r as any)?.uid || (r as any)?.guid || ''; if (id) this.conversationsService.updateConversationReadStatus(id, msg); }\n      catch (e) { CometChatLogger.error('CometChatConversations', 'Error handling message read event:', e); }\n    });\n    CometChatConversationEvents.ccUpdateConversation.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((conv: CometChat.Conversation) => {\n      try { const cw = conv.getConversationWith(); const id = cw instanceof CometChat.User ? cw.getUid() : (cw as CometChat.Group).getGuid(); this.conversationsService.updateConversationUnreadCount(id, conv.getUnreadMessageCount() ?? 0); }\n      catch (e) { CometChatLogger.error('CometChatConversations', 'Error handling ccUpdateConversation event:', e); }\n    });\n  }\n  handleRetryClick(): void { this.conversationsService.clearError(); this.conversationsService.fetchConversations(this.conversationsRequestBuilder); }\n}\n","<!-- CometChatConversations Component Template (Refactored)\n     Uses CometChatPaginatedList for list rendering and CometChatConversationItem for item rendering.\n     Maintains full backward compatibility with existing template inputs.\n-->\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'Conversations'\">\n<div class=\"cometchat cometchat-conversations\" \n     (keydown)=\"handleKeydown($event)\" \n     (focusin)=\"handleFocusIn($event)\"\n     (click)=\"handleContainerClick($event)\"\n     [attr.aria-label]=\"'accessibility_conversations_list' | translate\">\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-conversations__header\">\n    @if (headerView || headerViewContent) {\n      <ng-container *ngTemplateOutlet=\"headerView || headerViewContent\"></ng-container>\n    } @else {\n      <div class=\"cometchat-conversations__header-default\">\n        <h2 class=\"cometchat-conversations__title\">\n          {{ 'conversation_chat_title' | translate }}\n        </h2>\n        @if (menuView || menuViewContent) {\n          <ng-container *ngTemplateOutlet=\"menuView || menuViewContent\"></ng-container>\n        }\n      </div>\n    }\n\n    @if (effectiveShowSearchBar()) {\n      <div class=\"cometchat-conversations__search-section\">\n        @if (searchView || searchViewContent) {\n          <ng-container *ngTemplateOutlet=\"searchView || searchViewContent\"></ng-container>\n        } @else {\n          <cometchat-search-bar\n            #searchBar\n            [searchText]=\"currentSearchText\"\n            [placeholderText]=\"'conversation_search_placeholder' | translate\"\n            (searchChanged)=\"onSearch($event.value)\"\n            (clearClick)=\"onSearch('')\"\n            (click)=\"handleSearchBarClick()\">\n          </cometchat-search-bar>\n        }\n      </div>\n    }\n  </div>\n\n  <!-- ==================== List Body using CometChatPaginatedList ==================== -->\n  <cometchat-paginated-list\n    #paginatedList\n    [ariaLabel]=\"'conversation_chat_title' | translate\"\n    [items]=\"conversations()\"\n    [trackByFn]=\"trackByConversation.bind(this)\"\n    [isLoading]=\"loadingState()\"\n    [hasMore]=\"hasMore()\"\n    [error]=\"errorState()\"\n    [showScrollbar]=\"effectiveShowScrollbar()\"\n    [loadingTemplate]=\"loadingTemplateRef\"\n    [emptyTemplate]=\"emptyTemplateRef\"\n    [errorTemplate]=\"errorTemplateRef\"\n    [itemTemplate]=\"itemTemplateRef\"\n    (loadMore)=\"handleLoadMore()\"\n    (scrollToBottom)=\"handleScrollToBottom()\">\n  </cometchat-paginated-list>\n\n  <!-- ==================== Loading Template ==================== -->\n  <ng-template #loadingTemplateRef>\n    @if (effectiveLoadingView) {\n      <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-conversations__shimmer\">\n        @for (item of shimmerList; track item) {\n          <div class=\"cometchat-conversations__shimmer-item\">\n            <div class=\"cometchat-conversations__shimmer-avatar\"></div>\n            <div class=\"cometchat-conversations__shimmer-content\">\n              <div class=\"cometchat-conversations__shimmer-line cometchat-conversations__shimmer-line--long\"></div>\n              <div class=\"cometchat-conversations__shimmer-line cometchat-conversations__shimmer-line--short\"></div>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Empty Template ==================== -->\n  <ng-template #emptyTemplateRef>\n    @if (effectiveEmptyView) {\n      <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-conversations__empty-content\">\n        <div class=\"cometchat-conversations__empty-icon\">\n          <span class=\"cometchat-conversations__empty-icon-mask\" aria-hidden=\"true\"></span>\n        </div>\n        <h3 class=\"cometchat-conversations__empty-title\">{{ 'conversation_empty_title' | translate }}</h3>\n        <p class=\"cometchat-conversations__empty-message\">{{ 'conversation_empty_subtitle' | translate }}</p>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Error Template ==================== -->\n  <ng-template #errorTemplateRef let-error>\n    @if (!effectiveHideError()) {\n      @if (effectiveErrorView) {\n        <ng-container *ngTemplateOutlet=\"effectiveErrorView; context: { $implicit: error }\"></ng-container>\n      } @else {\n        <div class=\"cometchat-conversations__error-content\">\n          <div class=\"cometchat-conversations__error-icon\">\n            <span class=\"cometchat-conversations__error-icon-mask\" aria-hidden=\"true\"></span>\n          </div>\n          <h3 class=\"cometchat-conversations__error-title\">{{ 'conversation_error_title' | translate }}</h3>\n          <p class=\"cometchat-conversations__error-message\">{{ 'conversation_error_subtitle' | translate }}</p>\n          <button \n            class=\"cometchat-conversations__error-retry-button\"\n            (click)=\"handleRetryClick()\"\n            type=\"button\">\n              {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      }\n    }\n  </ng-template>\n\n  <!-- ==================== Item Template ==================== -->\n  <ng-template #itemTemplateRef let-conversation let-index=\"index\">\n    <div class=\"cometchat-conversations__list-item-wrapper\"\n         [class.cometchat-conversations__list-item-wrapper--focused]=\"focusedIndex() === index\"\n         [class.cometchat-conversations__list-item--active]=\"isConversationActive(conversation)\">\n\n      <!-- Custom Item View or CometChatConversationItem -->\n      @if (effectiveItemView) {\n        <ng-container *ngTemplateOutlet=\"effectiveItemView; context: { $implicit: conversation }\"></ng-container>\n      } @else {\n        <cometchat-conversation-item\n          [conversation]=\"conversation\"\n          [isActive]=\"isConversationActive(conversation)\"\n          [isSelected]=\"isConversationSelected(conversation)\"\n          [isFocused]=\"focusedIndex() === index\"\n          [tabIndex]=\"focusedIndex() === -1 ? (index === 0 ? 0 : -1) : (focusedIndex() === index ? 0 : -1)\"\n          [typingIndicator]=\"getTypingIndicator(conversation)\"\n          [loggedInUser]=\"loggedInUser\"\n          [hideReceipts]=\"effectiveHideReceipts()\"\n          [hideUserStatus]=\"effectiveHideUserStatus()\"\n          [hideGroupType]=\"effectiveHideGroupType()\"\n          [dateFormat]=\"lastMessageDateTimeFormat || getDefaultDateTimeFormat()\"\n          [textFormatters]=\"activeFormatters\"\n          [slots]=\"slots\"\n          [contextMenuOptions]=\"selectionMode !== SelectionMode.none ? [] : getContextMenuOptions(conversation)\"\n          [disableDefaultContextMenu]=\"effectiveDisableDefaultContextMenu()\"\n          [leadingView]=\"effectiveLeadingView\"\n          [titleView]=\"effectiveTitleView\"\n          [subtitleView]=\"effectiveSubtitleView\"\n          [trailingView]=\"selectionMode !== SelectionMode.none ? selectionControlTemplate : effectiveTrailingView\"\n          (itemClick)=\"handleConversationClick($event)\"\n          (itemSelect)=\"handleConversationSelect($event)\"\n          (contextMenuOpen)=\"handleContextMenuOpen($event)\"\n          (contextMenuOptionClick)=\"handleContextMenuOptionClick($event)\">\n        </cometchat-conversation-item>\n      }\n    </div>\n  </ng-template>\n\n  <!-- ==================== Selection Control Template (for trailing view) ==================== -->\n  <ng-template #selectionControlTemplate let-conversation>\n    <div class=\"cometchat-conversations__selection-control\" \n         (click)=\"$event.stopPropagation()\">\n      @if (selectionMode === SelectionMode.multiple) {\n        <cometchat-checkbox\n          [checked]=\"isConversationSelected(conversation)\"\n          [ariaLabel]=\"'Select ' + (conversation.getConversationWith().getName() || '')\"\n          (checkboxChanged)=\"handleSelectionClick(conversation)\">\n        </cometchat-checkbox>\n      } @else if (selectionMode === SelectionMode.single) {\n        <cometchat-radio-button\n          [checked]=\"isConversationSelected(conversation)\"\n          [ariaLabel]=\"'Select ' + (conversation.getConversationWith().getName() || '')\"\n          (radioChanged)=\"handleSelectionClick(conversation)\">\n        </cometchat-radio-button>\n      }\n    </div>\n  </ng-template>\n\n  <!-- ==================== Delete Confirmation Dialog ==================== -->\n  @if (showDeleteConfirmDialog()) {\n    <div class=\"cometchat-conversations__dialog-overlay\" \n         (click)=\"handleDeleteCancel()\"\n         (keydown)=\"handleDialogKeydown($event)\"\n         role=\"dialog\"\n         aria-modal=\"true\"\n         aria-labelledby=\"delete-dialog-title\"\n         tabindex=\"-1\"\n         #dialogOverlay>\n      <div class=\"cometchat-conversations__dialog-container\" (click)=\"$event.stopPropagation()\">\n        <cometchat-confirm-dialog\n          [title]=\"'conversation_delete_title' | translate\"\n          [messageText]=\"'conversation_delete_subtitle' | translate\"\n          [confirmButtonText]=\"'conversation_delete_confirm_yes' | translate\"\n          [cancelButtonText]=\"'conversation_delete_confirm_no' | translate\"\n          (confirmClick)=\"handleDeleteConfirm()\"\n          (cancelClick)=\"handleDeleteCancel()\">\n        </cometchat-confirm-dialog>\n      </div>\n    </div>\n  }\n</div>\n</cometchat-error-boundary>\n","/**\n * Public API for CometChatConversations component\n */\n\n// Component\nexport { CometChatConversationsComponent } from './cometchat-conversations.component';\n\n// Service\nexport { ConversationsService } from '../../services/conversations.service';\n\n// Enums (re-export from Enums for convenience)\nexport { SelectionMode } from '../../Enums/Enums';\n\n// Types and Interfaces (re-export from their original locations)\nexport type { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nexport { CometChatOption } from '../../modals/CometChatOption';\n","export const emojisPeoplePart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      grinning: {\n        keywords: ['face', 'smile', 'happy', 'joy', ':D', 'grin'],\n        char: '😀',\n      },\n      grimacing: {\n        keywords: ['face', 'grimace', 'teeth'],\n        char: '😬',\n      },\n      grin: {\n        keywords: ['face', 'happy', 'smile', 'joy', 'kawaii'],\n        char: '😁',\n      },\n      joy: {\n        keywords: ['face', 'cry', 'tears', 'weep', 'happy', 'happytears', 'haha'],\n        char: '😂',\n      },\n      rofl: {\n        keywords: ['face', 'rolling', 'floor', 'laughing', 'lol', 'haha'],\n        char: '🤣',\n      },\n      partying: {\n        keywords: ['face', 'celebration', 'woohoo'],\n        char: '🥳',\n      },\n      smiley: {\n        keywords: ['face', 'happy', 'joy', 'haha', ':D', ':)', 'smile', 'funny'],\n        char: '😃',\n      },\n      smile: {\n        keywords: ['face', 'happy', 'joy', 'funny', 'haha', 'laugh', 'like', ':D', ':)'],\n        char: '😄',\n      },\n      sweat_smile: {\n        keywords: ['face', 'hot', 'happy', 'laugh', 'sweat', 'smile', 'relief'],\n        char: '😅',\n      },\n      laughing: {\n        keywords: ['happy', 'joy', 'lol', 'satisfied', 'haha', 'face', 'glad', 'XD', 'laugh'],\n        char: '😆',\n      },\n      innocent: {\n        keywords: ['face', 'angel', 'heaven', 'halo'],\n        char: '😇',\n      },\n      wink: {\n        keywords: ['face', 'happy', 'mischievous', 'secret', ';)', 'smile', 'eye'],\n        char: '😉',\n      },\n      blush: {\n        keywords: ['face', 'smile', 'happy', 'flushed', 'crush', 'embarrassed', 'shy', 'joy'],\n        char: '😊',\n      },\n      slightly_smiling_face: {\n        keywords: ['face', 'smile'],\n        char: '🙂',\n      },\n      upside_down_face: {\n        keywords: ['face', 'flipped', 'silly', 'smile'],\n        char: '🙃',\n      },\n      relaxed: {\n        keywords: ['face', 'blush', 'massage', 'happiness'],\n        char: '☺️',\n      },\n      yum: {\n        keywords: [\n          'happy',\n          'joy',\n          'tongue',\n          'smile',\n          'face',\n          'silly',\n          'yummy',\n          'nom',\n          'delicious',\n          'savouring',\n        ],\n        char: '😋',\n      },\n      relieved: {\n        keywords: ['face', 'relaxed', 'phew', 'massage', 'happiness'],\n        char: '😌',\n      },\n      heart_eyes: {\n        keywords: [\n          'face',\n          'love',\n          'like',\n          'affection',\n          'valentines',\n          'infatuation',\n          'crush',\n          'heart',\n        ],\n        char: '😍',\n      },\n      smiling_face_with_three_hearts: {\n        keywords: [\n          'face',\n          'love',\n          'like',\n          'affection',\n          'valentines',\n          'infatuation',\n          'crush',\n          'hearts',\n          'adore',\n        ],\n        char: '🥰',\n      },\n      kissing_heart: {\n        keywords: ['face', 'love', 'like', 'affection', 'valentines', 'infatuation', 'kiss'],\n        char: '😘',\n      },\n      kissing: {\n        keywords: ['love', 'like', 'face', '3', 'valentines', 'infatuation', 'kiss'],\n        char: '😗',\n      },\n      kissing_smiling_eyes: {\n        keywords: ['face', 'affection', 'valentines', 'infatuation', 'kiss'],\n        char: '😙',\n      },\n      kissing_closed_eyes: {\n        keywords: ['face', 'love', 'like', 'affection', 'valentines', 'infatuation', 'kiss'],\n        char: '😚',\n      },\n      stuck_out_tongue_winking_eye: {\n        keywords: [\n          'face',\n          'prank',\n          'childish',\n          'playful',\n          'mischievous',\n          'smile',\n          'wink',\n          'tongue',\n        ],\n        char: '😜',\n      },\n      zany: {\n        keywords: ['face', 'goofy', 'crazy'],\n        char: '🤪',\n      },\n      raised_eyebrow: {\n        keywords: ['face', 'distrust', 'scepticism', 'disapproval', 'disbelief', 'surprise'],\n        char: '🤨',\n      },\n      monocle: {\n        keywords: ['face', 'stuffy', 'wealthy'],\n        char: '🧐',\n      },\n      stuck_out_tongue_closed_eyes: {\n        keywords: ['face', 'prank', 'playful', 'mischievous', 'smile', 'tongue'],\n        char: '😝',\n      },\n      stuck_out_tongue: {\n        keywords: ['face', 'prank', 'childish', 'playful', 'mischievous', 'smile', 'tongue'],\n        char: '😛',\n      },\n      money_mouth_face: {\n        keywords: ['face', 'rich', 'dollar', 'money'],\n        char: '🤑',\n      },\n      nerd_face: {\n        keywords: ['face', 'nerdy', 'geek', 'dork'],\n        char: '🤓',\n      },\n      sunglasses: {\n        keywords: ['face', 'cool', 'smile', 'summer', 'beach', 'sunglass'],\n        char: '😎',\n      },\n      star_struck: {\n        keywords: ['face', 'smile', 'starry', 'eyes', 'grinning'],\n        char: '🤩',\n      },\n      clown_face: {\n        keywords: ['face'],\n        char: '🤡',\n      },\n      cowboy_hat_face: {\n        keywords: ['face', 'cowgirl', 'hat'],\n        char: '🤠',\n      },\n      hugs: {\n        keywords: ['face', 'smile', 'hug'],\n        char: '🤗',\n      },\n      smirk: {\n        keywords: ['face', 'smile', 'mean', 'prank', 'smug', 'sarcasm'],\n        char: '😏',\n      },\n      no_mouth: {\n        keywords: ['face', 'hellokitty'],\n        char: '😶',\n      },\n      neutral_face: {\n        keywords: ['indifference', 'meh', ':|', 'neutral'],\n        char: '😐',\n      },\n      expressionless: {\n        keywords: ['face', 'indifferent', '-_-', 'meh', 'deadpan'],\n        char: '😑',\n      },\n      unamused: {\n        keywords: [\n          'indifference',\n          'bored',\n          'straight face',\n          'serious',\n          'sarcasm',\n          'unimpressed',\n          'skeptical',\n          'dubious',\n          'side_eye',\n        ],\n        char: '😒',\n      },\n      roll_eyes: {\n        keywords: ['face', 'eyeroll', 'frustrated'],\n        char: '🙄',\n      },\n      thinking: {\n        keywords: ['face', 'hmmm', 'think', 'consider'],\n        char: '🤔',\n      },\n      lying_face: {\n        keywords: ['face', 'lie', 'pinocchio'],\n        char: '🤥',\n      },\n      hand_over_mouth: {\n        keywords: ['face', 'whoops', 'shock', 'surprise'],\n        char: '🤭',\n      },\n      shushing: {\n        keywords: ['face', 'quiet', 'shhh'],\n        char: '🤫',\n      },\n      symbols_over_mouth: {\n        keywords: ['face', 'swearing', 'cursing', 'cussing', 'profanity', 'expletive'],\n        char: '🤬',\n      },\n      exploding_head: {\n        keywords: ['face', 'shocked', 'mind', 'blown'],\n        char: '🤯',\n      },\n      flushed: {\n        keywords: ['face', 'blush', 'shy', 'flattered'],\n        char: '😳',\n      },\n      disappointed: {\n        keywords: ['face', 'sad', 'upset', 'depressed', ':('],\n        char: '😞',\n      },\n      worried: {\n        keywords: ['face', 'concern', 'nervous', ':('],\n        char: '😟',\n      },\n      angry: {\n        keywords: ['mad', 'face', 'annoyed', 'frustrated'],\n        char: '😠',\n      },\n      rage: {\n        keywords: ['angry', 'mad', 'hate', 'despise'],\n        char: '😡',\n      },\n      pensive: {\n        keywords: ['face', 'sad', 'depressed', 'upset'],\n        char: '😔',\n      },\n      confused: {\n        keywords: ['face', 'indifference', 'huh', 'weird', 'hmmm', ':/'],\n        char: '😕',\n      },\n      slightly_frowning_face: {\n        keywords: ['face', 'frowning', 'disappointed', 'sad', 'upset'],\n        char: '🙁',\n      },\n      frowning_face: {\n        keywords: ['face', 'sad', 'upset', 'frown'],\n        char: '☹️',\n      },\n      persevere: {\n        keywords: ['face', 'sick', 'no', 'upset', 'oops'],\n        char: '😣',\n      },\n      confounded: {\n        keywords: ['face', 'confused', 'sick', 'unwell', 'oops', ':S'],\n        char: '😖',\n      },\n      tired_face: {\n        keywords: ['sick', 'whine', 'upset', 'frustrated'],\n        char: '😫',\n      },\n      weary: {\n        keywords: ['face', 'tired', 'sleepy', 'sad', 'frustrated', 'upset'],\n        char: '😩',\n      },\n      pleading: {\n        keywords: ['face', 'begging', 'mercy'],\n        char: '🥺',\n      },\n      triumph: {\n        keywords: ['face', 'gas', 'phew', 'proud', 'pride'],\n        char: '😤',\n      },\n      open_mouth: {\n        keywords: ['face', 'surprise', 'impressed', 'wow', 'whoa', ':O'],\n        char: '😮',\n      },\n      scream: {\n        keywords: ['face', 'munch', 'scared', 'omg'],\n        char: '😱',\n      },\n      fearful: {\n        keywords: ['face', 'scared', 'terrified', 'nervous', 'oops', 'huh'],\n        char: '😨',\n      },\n      cold_sweat: {\n        keywords: ['face', 'nervous', 'sweat'],\n        char: '😰',\n      },\n      hushed: {\n        keywords: ['face', 'woo', 'shh'],\n        char: '😯',\n      },\n      frowning: {\n        keywords: ['face', 'aw', 'what'],\n        char: '😦',\n      }\n};\n","export const emojisPeoplePart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      anguished: {\n        keywords: ['face', 'stunned', 'nervous'],\n        char: '😧',\n      },\n      cry: {\n        keywords: ['face', 'tears', 'sad', 'depressed', 'upset', \":'(\"],\n        char: '😢',\n      },\n      disappointed_relieved: {\n        keywords: ['face', 'phew', 'sweat', 'nervous'],\n        char: '😥',\n      },\n      drooling_face: {\n        keywords: ['face'],\n        char: '🤤',\n      },\n      sleepy: {\n        keywords: ['face', 'tired', 'rest', 'nap'],\n        char: '😪',\n      },\n      sweat: {\n        keywords: ['face', 'hot', 'sad', 'tired', 'exercise'],\n        char: '😓',\n      },\n      hot: {\n        keywords: ['face', 'feverish', 'heat', 'red', 'sweating'],\n        char: '🥵',\n      },\n      cold: {\n        keywords: ['face', 'blue', 'freezing', 'frozen', 'frostbite', 'icicles'],\n        char: '🥶',\n      },\n      sob: {\n        keywords: ['face', 'cry', 'tears', 'sad', 'upset', 'depressed'],\n        char: '😭',\n      },\n      dizzy_face: {\n        keywords: ['spent', 'unconscious', 'xox', 'dizzy'],\n        char: '😵',\n      },\n      astonished: {\n        keywords: ['face', 'xox', 'surprised', 'poisoned'],\n        char: '😲',\n      },\n      zipper_mouth_face: {\n        keywords: ['face', 'sealed', 'zipper', 'secret'],\n        char: '🤐',\n      },\n      nauseated_face: {\n        keywords: ['face', 'vomit', 'gross', 'green', 'sick', 'throw up', 'ill'],\n        char: '🤢',\n      },\n      sneezing_face: {\n        keywords: ['face', 'gesundheit', 'sneeze', 'sick', 'allergy'],\n        char: '🤧',\n      },\n      vomiting: {\n        keywords: ['face', 'sick'],\n        char: '🤮',\n      },\n      mask: {\n        keywords: ['face', 'sick', 'ill', 'disease'],\n        char: '😷',\n      },\n      face_with_thermometer: {\n        keywords: ['sick', 'temperature', 'thermometer', 'cold', 'fever'],\n        char: '🤒',\n      },\n      face_with_head_bandage: {\n        keywords: ['injured', 'clumsy', 'bandage', 'hurt'],\n        char: '🤕',\n      },\n      woozy: {\n        keywords: ['face', 'dizzy', 'intoxicated', 'tipsy', 'wavy'],\n        char: '🥴',\n      },\n      sleeping: {\n        keywords: ['face', 'tired', 'sleepy', 'night', 'zzz'],\n        char: '😴',\n      },\n      zzz: {\n        keywords: ['sleepy', 'tired', 'dream'],\n        char: '💤',\n      },\n      poop: {\n        keywords: ['hankey', 'shitface', 'fail', 'turd', 'shit'],\n        char: '💩',\n      },\n      smiling_imp: {\n        keywords: ['devil', 'horns'],\n        char: '😈',\n      },\n      imp: {\n        keywords: ['devil', 'angry', 'horns'],\n        char: '👿',\n      },\n      japanese_ogre: {\n        keywords: [\n          'monster',\n          'red',\n          'mask',\n          'halloween',\n          'scary',\n          'creepy',\n          'devil',\n          'demon',\n          'japanese',\n          'ogre',\n        ],\n        char: '👹',\n      },\n      japanese_goblin: {\n        keywords: ['red', 'evil', 'mask', 'monster', 'scary', 'creepy', 'japanese', 'goblin'],\n        char: '👺',\n      },\n      skull: {\n        keywords: ['dead', 'skeleton', 'creepy', 'death'],\n        char: '💀',\n      },\n      ghost: {\n        keywords: ['halloween', 'spooky', 'scary'],\n        char: '👻',\n      },\n      alien: {\n        keywords: ['UFO', 'paul', 'weird', 'outer_space'],\n        char: '👽',\n      },\n      robot: {\n        keywords: ['computer', 'machine', 'bot'],\n        char: '🤖',\n      },\n      smiley_cat: {\n        keywords: ['animal', 'cats', 'happy', 'smile'],\n        char: '😺',\n      },\n      smile_cat: {\n        keywords: ['animal', 'cats', 'smile'],\n        char: '😸',\n      },\n      joy_cat: {\n        keywords: ['animal', 'cats', 'haha', 'happy', 'tears'],\n        char: '😹',\n      },\n      heart_eyes_cat: {\n        keywords: ['animal', 'love', 'like', 'affection', 'cats', 'valentines', 'heart'],\n        char: '😻',\n      },\n      smirk_cat: {\n        keywords: ['animal', 'cats', 'smirk'],\n        char: '😼',\n      },\n      kissing_cat: {\n        keywords: ['animal', 'cats', 'kiss'],\n        char: '😽',\n      },\n      scream_cat: {\n        keywords: ['animal', 'cats', 'munch', 'scared', 'scream'],\n        char: '🙀',\n      },\n      crying_cat_face: {\n        keywords: ['animal', 'tears', 'weep', 'sad', 'cats', 'upset', 'cry'],\n        char: '😿',\n      },\n      pouting_cat: {\n        keywords: ['animal', 'cats'],\n        char: '😾',\n      },\n      palms_up: {\n        keywords: ['hands', 'gesture', 'cupped', 'prayer'],\n        char: '🤲',\n        fitzpatrick_scale: true,\n      },\n      raised_hands: {\n        keywords: ['gesture', 'hooray', 'yea', 'celebration', 'hands'],\n        char: '🙌',\n        fitzpatrick_scale: true,\n      },\n      clap: {\n        keywords: ['hands', 'praise', 'applause', 'congrats', 'yay'],\n        char: '👏',\n        fitzpatrick_scale: true,\n      },\n      wave: {\n        keywords: ['hands', 'gesture', 'goodbye', 'solong', 'farewell', 'hello', 'hi', 'palm'],\n        char: '👋',\n        fitzpatrick_scale: true,\n      },\n      call_me_hand: {\n        keywords: ['hands', 'gesture'],\n        char: '🤙',\n        fitzpatrick_scale: true,\n      },\n      '+1': {\n        keywords: [\n          'thumbsup',\n          'yes',\n          'awesome',\n          'good',\n          'agree',\n          'accept',\n          'cool',\n          'hand',\n          'like',\n        ],\n        char: '👍',\n        fitzpatrick_scale: true,\n      },\n      '-1': {\n        keywords: ['thumbsdown', 'no', 'dislike', 'hand'],\n        char: '👎',\n        fitzpatrick_scale: true,\n      },\n      facepunch: {\n        keywords: ['angry', 'violence', 'fist', 'hit', 'attack', 'hand'],\n        char: '👊',\n        fitzpatrick_scale: true,\n      },\n      fist: {\n        keywords: ['fingers', 'hand', 'grasp'],\n        char: '✊',\n        fitzpatrick_scale: true,\n      },\n      fist_left: {\n        keywords: ['hand', 'fistbump'],\n        char: '🤛',\n        fitzpatrick_scale: true,\n      },\n      fist_right: {\n        keywords: ['hand', 'fistbump'],\n        char: '🤜',\n        fitzpatrick_scale: true,\n      },\n      v: {\n        keywords: ['fingers', 'ohyeah', 'hand', 'peace', 'victory', 'two'],\n        char: '✌',\n        fitzpatrick_scale: true,\n      },\n      ok_hand: {\n        keywords: ['fingers', 'limbs', 'perfect', 'ok', 'okay'],\n        char: '👌',\n        fitzpatrick_scale: true,\n      },\n      raised_hand: {\n        keywords: ['fingers', 'stop', 'highfive', 'palm', 'ban'],\n        char: '✋',\n        fitzpatrick_scale: true,\n      },\n      raised_back_of_hand: {\n        keywords: ['fingers', 'raised', 'backhand'],\n        char: '🤚',\n        fitzpatrick_scale: true,\n      },\n      open_hands: {\n        keywords: ['fingers', 'butterfly', 'hands', 'open'],\n        char: '👐',\n        fitzpatrick_scale: true,\n      },\n      muscle: {\n        keywords: ['arm', 'flex', 'hand', 'summer', 'strong', 'biceps'],\n        char: '💪',\n        fitzpatrick_scale: true,\n      },\n      pray: {\n        keywords: ['please', 'hope', 'wish', 'namaste', 'highfive'],\n        char: '🙏',\n        fitzpatrick_scale: true,\n      },\n      foot: {\n        keywords: ['kick', 'stomp'],\n        char: '🦶',\n        fitzpatrick_scale: true,\n      },\n      leg: {\n        keywords: ['kick', 'limb'],\n        char: '🦵',\n        fitzpatrick_scale: true,\n      },\n      handshake: {\n        keywords: ['agreement', 'shake'],\n        char: '🤝',\n      },\n      point_up: {\n        keywords: ['hand', 'fingers', 'direction', 'up'],\n        char: '☝',\n        fitzpatrick_scale: true,\n      },\n      point_up_2: {\n        keywords: ['fingers', 'hand', 'direction', 'up'],\n        char: '👆',\n        fitzpatrick_scale: true,\n      },\n      point_down: {\n        keywords: ['fingers', 'hand', 'direction', 'down'],\n        char: '👇',\n        fitzpatrick_scale: true,\n      },\n      point_left: {\n        keywords: ['direction', 'fingers', 'hand', 'left'],\n        char: '👈',\n        fitzpatrick_scale: true,\n      },\n      point_right: {\n        keywords: ['fingers', 'hand', 'direction', 'right'],\n        char: '👉',\n        fitzpatrick_scale: true,\n      },\n      fu: {\n        keywords: ['hand', 'fingers', 'rude', 'middle', 'flipping'],\n        char: '🖕',\n        fitzpatrick_scale: true,\n      },\n      raised_hand_with_fingers_splayed: {\n        keywords: ['hand', 'fingers', 'palm'],\n        char: '🖐',\n        fitzpatrick_scale: true,\n      },\n      love_you: {\n        keywords: ['hand', 'fingers', 'gesture'],\n        char: '🤟',\n        fitzpatrick_scale: true,\n      },\n      metal: {\n        keywords: ['hand', 'fingers', 'evil_eye', 'sign_of_horns', 'rock_on'],\n        char: '🤘',\n        fitzpatrick_scale: true,\n      },\n      crossed_fingers: {\n        keywords: ['good', 'lucky'],\n        char: '🤞',\n        fitzpatrick_scale: true,\n      }\n};\n","export const emojisPeoplePart3: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      vulcan_salute: {\n        keywords: ['hand', 'fingers', 'spock', 'star trek'],\n        char: '🖖',\n        fitzpatrick_scale: true,\n      },\n      writing_hand: {\n        keywords: ['lower_left_ballpoint_pen', 'stationery', 'write', 'compose'],\n        char: '✍',\n        fitzpatrick_scale: true,\n      },\n      selfie: {\n        keywords: ['camera', 'phone'],\n        char: '🤳',\n        fitzpatrick_scale: true,\n      },\n      nail_care: {\n        keywords: ['beauty', 'manicure', 'finger', 'fashion', 'nail'],\n        char: '💅',\n        fitzpatrick_scale: true,\n      },\n      lips: {\n        keywords: ['mouth', 'kiss'],\n        char: '👄',\n      },\n      tooth: {\n        keywords: ['teeth', 'dentist'],\n        char: '🦷',\n      },\n      tongue: {\n        keywords: ['mouth', 'playful'],\n        char: '👅',\n      },\n      ear: {\n        keywords: ['face', 'hear', 'sound', 'listen'],\n        char: '👂',\n        fitzpatrick_scale: true,\n      },\n      nose: {\n        keywords: ['smell', 'sniff'],\n        char: '👃',\n        fitzpatrick_scale: true,\n      },\n      eye: {\n        keywords: ['face', 'look', 'see', 'watch', 'stare'],\n        char: '👁',\n      },\n      eyes: {\n        keywords: ['look', 'watch', 'stalk', 'peek', 'see'],\n        char: '👀',\n      },\n      brain: {\n        keywords: ['smart', 'intelligent'],\n        char: '🧠',\n      },\n      bust_in_silhouette: {\n        keywords: ['user', 'person', 'human'],\n        char: '👤',\n      },\n      busts_in_silhouette: {\n        keywords: ['user', 'person', 'human', 'group', 'team'],\n        char: '👥',\n      },\n      speaking_head: {\n        keywords: ['user', 'person', 'human', 'sing', 'say', 'talk'],\n        char: '🗣',\n      },\n      baby: {\n        keywords: ['child', 'boy', 'girl', 'toddler'],\n        char: '👶',\n        fitzpatrick_scale: true,\n      },\n      child: {\n        keywords: ['gender-neutral', 'young'],\n        char: '🧒',\n        fitzpatrick_scale: true,\n      },\n      boy: {\n        keywords: ['man', 'male', 'guy', 'teenager'],\n        char: '👦',\n        fitzpatrick_scale: true,\n      },\n      girl: {\n        keywords: ['female', 'woman', 'teenager'],\n        char: '👧',\n        fitzpatrick_scale: true,\n      },\n      adult: {\n        keywords: ['gender-neutral', 'person'],\n        char: '🧑',\n        fitzpatrick_scale: true,\n      },\n      man: {\n        keywords: ['mustache', 'father', 'dad', 'guy', 'classy', 'sir', 'moustache'],\n        char: '👨',\n        fitzpatrick_scale: true,\n      },\n      woman: {\n        keywords: ['female', 'girls', 'lady'],\n        char: '👩',\n        fitzpatrick_scale: true,\n      },\n      blonde_woman: {\n        keywords: ['woman', 'female', 'girl', 'blonde', 'person'],\n        char: '👱‍♀️',\n        fitzpatrick_scale: true,\n      },\n      blonde_man: {\n        keywords: ['man', 'male', 'boy', 'blonde', 'guy', 'person'],\n        char: '👱',\n        fitzpatrick_scale: true,\n      },\n      bearded_person: {\n        keywords: ['person', 'bewhiskered'],\n        char: '🧔',\n        fitzpatrick_scale: true,\n      },\n      older_adult: {\n        keywords: ['human', 'elder', 'senior', 'gender-neutral'],\n        char: '🧓',\n        fitzpatrick_scale: true,\n      },\n      older_man: {\n        keywords: ['human', 'male', 'men', 'old', 'elder', 'senior'],\n        char: '👴',\n        fitzpatrick_scale: true,\n      },\n      older_woman: {\n        keywords: ['human', 'female', 'women', 'lady', 'old', 'elder', 'senior'],\n        char: '👵',\n        fitzpatrick_scale: true,\n      },\n      man_with_gua_pi_mao: {\n        keywords: ['male', 'boy', 'chinese'],\n        char: '👲',\n        fitzpatrick_scale: true,\n      },\n      woman_with_headscarf: {\n        keywords: ['female', 'hijab', 'mantilla', 'tichel'],\n        char: '🧕',\n        fitzpatrick_scale: true,\n      },\n      woman_with_turban: {\n        keywords: ['female', 'indian', 'hinduism', 'arabs', 'woman'],\n        char: '👳‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_with_turban: {\n        keywords: ['male', 'indian', 'hinduism', 'arabs'],\n        char: '👳',\n        fitzpatrick_scale: true,\n      },\n      policewoman: {\n        keywords: ['woman', 'police', 'law', 'legal', 'enforcement', 'arrest', '911', 'female'],\n        char: '👮‍♀️',\n        fitzpatrick_scale: true,\n      },\n      policeman: {\n        keywords: ['man', 'police', 'law', 'legal', 'enforcement', 'arrest', '911'],\n        char: '👮',\n        fitzpatrick_scale: true,\n      },\n      construction_worker_woman: {\n        keywords: ['female', 'human', 'wip', 'build', 'construction', 'worker', 'labor', 'woman'],\n        char: '👷‍♀️',\n        fitzpatrick_scale: true,\n      },\n      construction_worker_man: {\n        keywords: ['male', 'human', 'wip', 'guy', 'build', 'construction', 'worker', 'labor'],\n        char: '👷',\n        fitzpatrick_scale: true,\n      },\n      guardswoman: {\n        keywords: ['uk', 'gb', 'british', 'female', 'royal', 'woman'],\n        char: '💂‍♀️',\n        fitzpatrick_scale: true,\n      },\n      guardsman: {\n        keywords: ['uk', 'gb', 'british', 'male', 'guy', 'royal'],\n        char: '💂',\n        fitzpatrick_scale: true,\n      },\n      female_detective: {\n        keywords: ['human', 'spy', 'detective', 'female', 'woman'],\n        char: '🕵️‍♀️',\n        fitzpatrick_scale: true,\n      },\n      male_detective: {\n        keywords: ['human', 'spy', 'detective'],\n        char: '🕵',\n        fitzpatrick_scale: true,\n      },\n      woman_health_worker: {\n        keywords: ['doctor', 'nurse', 'therapist', 'healthcare', 'woman', 'human'],\n        char: '👩‍⚕️',\n        fitzpatrick_scale: true,\n      },\n      man_health_worker: {\n        keywords: ['doctor', 'nurse', 'therapist', 'healthcare', 'man', 'human'],\n        char: '👨‍⚕️',\n        fitzpatrick_scale: true,\n      },\n      woman_farmer: {\n        keywords: ['rancher', 'gardener', 'woman', 'human'],\n        char: '👩‍🌾',\n        fitzpatrick_scale: true,\n      },\n      man_farmer: {\n        keywords: ['rancher', 'gardener', 'man', 'human'],\n        char: '👨‍🌾',\n        fitzpatrick_scale: true,\n      },\n      woman_cook: {\n        keywords: ['chef', 'woman', 'human'],\n        char: '👩‍🍳',\n        fitzpatrick_scale: true,\n      },\n      man_cook: {\n        keywords: ['chef', 'man', 'human'],\n        char: '👨‍🍳',\n        fitzpatrick_scale: true,\n      },\n      woman_student: {\n        keywords: ['graduate', 'woman', 'human'],\n        char: '👩‍🎓',\n        fitzpatrick_scale: true,\n      },\n      man_student: {\n        keywords: ['graduate', 'man', 'human'],\n        char: '👨‍🎓',\n        fitzpatrick_scale: true,\n      },\n      woman_singer: {\n        keywords: ['rockstar', 'entertainer', 'woman', 'human'],\n        char: '👩‍🎤',\n        fitzpatrick_scale: true,\n      },\n      man_singer: {\n        keywords: ['rockstar', 'entertainer', 'man', 'human'],\n        char: '👨‍🎤',\n        fitzpatrick_scale: true,\n      },\n      woman_teacher: {\n        keywords: ['instructor', 'professor', 'woman', 'human'],\n        char: '👩‍🏫',\n        fitzpatrick_scale: true,\n      },\n      man_teacher: {\n        keywords: ['instructor', 'professor', 'man', 'human'],\n        char: '👨‍🏫',\n        fitzpatrick_scale: true,\n      },\n      woman_factory_worker: {\n        keywords: ['assembly', 'industrial', 'woman', 'human'],\n        char: '👩‍🏭',\n        fitzpatrick_scale: true,\n      },\n      man_factory_worker: {\n        keywords: ['assembly', 'industrial', 'man', 'human'],\n        char: '👨‍🏭',\n        fitzpatrick_scale: true,\n      },\n      woman_technologist: {\n        keywords: [\n          'coder',\n          'developer',\n          'engineer',\n          'programmer',\n          'software',\n          'woman',\n          'human',\n          'laptop',\n          'computer',\n        ],\n        char: '👩‍💻',\n        fitzpatrick_scale: true,\n      },\n      man_technologist: {\n        keywords: [\n          'coder',\n          'developer',\n          'engineer',\n          'programmer',\n          'software',\n          'man',\n          'human',\n          'laptop',\n          'computer',\n        ],\n        char: '👨‍💻',\n        fitzpatrick_scale: true,\n      },\n      woman_office_worker: {\n        keywords: ['business', 'manager', 'woman', 'human'],\n        char: '👩‍💼',\n        fitzpatrick_scale: true,\n      },\n      man_office_worker: {\n        keywords: ['business', 'manager', 'man', 'human'],\n        char: '👨‍💼',\n        fitzpatrick_scale: true,\n      },\n      woman_mechanic: {\n        keywords: ['plumber', 'woman', 'human', 'wrench'],\n        char: '👩‍🔧',\n        fitzpatrick_scale: true,\n      },\n      man_mechanic: {\n        keywords: ['plumber', 'man', 'human', 'wrench'],\n        char: '👨‍🔧',\n        fitzpatrick_scale: true,\n      },\n      woman_scientist: {\n        keywords: ['biologist', 'chemist', 'engineer', 'physicist', 'woman', 'human'],\n        char: '👩‍🔬',\n        fitzpatrick_scale: true,\n      },\n      man_scientist: {\n        keywords: ['biologist', 'chemist', 'engineer', 'physicist', 'man', 'human'],\n        char: '👨‍🔬',\n        fitzpatrick_scale: true,\n      },\n      woman_artist: {\n        keywords: ['painter', 'woman', 'human'],\n        char: '👩‍🎨',\n        fitzpatrick_scale: true,\n      },\n      man_artist: {\n        keywords: ['painter', 'man', 'human'],\n        char: '👨‍🎨',\n        fitzpatrick_scale: true,\n      },\n      woman_firefighter: {\n        keywords: ['fireman', 'woman', 'human'],\n        char: '👩‍🚒',\n        fitzpatrick_scale: true,\n      },\n      man_firefighter: {\n        keywords: ['fireman', 'man', 'human'],\n        char: '👨‍🚒',\n        fitzpatrick_scale: true,\n      },\n      woman_pilot: {\n        keywords: ['aviator', 'plane', 'woman', 'human'],\n        char: '👩‍✈️',\n        fitzpatrick_scale: true,\n      },\n      man_pilot: {\n        keywords: ['aviator', 'plane', 'man', 'human'],\n        char: '👨‍✈️',\n        fitzpatrick_scale: true,\n      },\n      woman_astronaut: {\n        keywords: ['space', 'rocket', 'woman', 'human'],\n        char: '👩‍🚀',\n        fitzpatrick_scale: true,\n      },\n      man_astronaut: {\n        keywords: ['space', 'rocket', 'man', 'human'],\n        char: '👨‍🚀',\n        fitzpatrick_scale: true,\n      }\n};\n","export const emojisPeoplePart4: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      woman_judge: {\n        keywords: ['justice', 'court', 'woman', 'human'],\n        char: '👩‍⚖️',\n        fitzpatrick_scale: true,\n      },\n      man_judge: {\n        keywords: ['justice', 'court', 'man', 'human'],\n        char: '👨‍⚖️',\n        fitzpatrick_scale: true,\n      },\n      woman_superhero: {\n        keywords: ['woman', 'female', 'good', 'heroine', 'superpowers'],\n        char: '🦸‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_superhero: {\n        keywords: ['man', 'male', 'good', 'hero', 'superpowers'],\n        char: '🦸‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_supervillain: {\n        keywords: ['woman', 'female', 'evil', 'bad', 'criminal', 'heroine', 'superpowers'],\n        char: '🦹‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_supervillain: {\n        keywords: ['man', 'male', 'evil', 'bad', 'criminal', 'hero', 'superpowers'],\n        char: '🦹‍♂️',\n        fitzpatrick_scale: true,\n      },\n      mrs_claus: {\n        keywords: ['woman', 'female', 'xmas', 'mother christmas'],\n        char: '🤶',\n        fitzpatrick_scale: true,\n      },\n      santa: {\n        keywords: ['festival', 'man', 'male', 'xmas', 'father christmas'],\n        char: '🎅',\n        fitzpatrick_scale: true,\n      },\n      sorceress: {\n        keywords: ['woman', 'female', 'mage', 'witch'],\n        char: '🧙‍♀️',\n        fitzpatrick_scale: true,\n      },\n      wizard: {\n        keywords: ['man', 'male', 'mage', 'sorcerer'],\n        char: '🧙‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_elf: {\n        keywords: ['woman', 'female'],\n        char: '🧝‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_elf: {\n        keywords: ['man', 'male'],\n        char: '🧝‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_vampire: {\n        keywords: ['woman', 'female'],\n        char: '🧛‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_vampire: {\n        keywords: ['man', 'male', 'dracula'],\n        char: '🧛‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_zombie: {\n        keywords: ['woman', 'female', 'undead', 'walking dead'],\n        char: '🧟‍♀️',\n      },\n      man_zombie: {\n        keywords: ['man', 'male', 'dracula', 'undead', 'walking dead'],\n        char: '🧟‍♂️',\n      },\n      woman_genie: {\n        keywords: ['woman', 'female'],\n        char: '🧞‍♀️',\n      },\n      man_genie: {\n        keywords: ['man', 'male'],\n        char: '🧞‍♂️',\n      },\n      mermaid: {\n        keywords: ['woman', 'female', 'merwoman', 'ariel'],\n        char: '🧜‍♀️',\n        fitzpatrick_scale: true,\n      },\n      merman: {\n        keywords: ['man', 'male', 'triton'],\n        char: '🧜‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_fairy: {\n        keywords: ['woman', 'female'],\n        char: '🧚‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_fairy: {\n        keywords: ['man', 'male'],\n        char: '🧚‍♂️',\n        fitzpatrick_scale: true,\n      },\n      angel: {\n        keywords: ['heaven', 'wings', 'halo'],\n        char: '👼',\n        fitzpatrick_scale: true,\n      },\n      pregnant_woman: {\n        keywords: ['baby'],\n        char: '🤰',\n        fitzpatrick_scale: true,\n      },\n      breastfeeding: {\n        keywords: ['nursing', 'baby'],\n        char: '🤱',\n        fitzpatrick_scale: true,\n      },\n      princess: {\n        keywords: ['girl', 'woman', 'female', 'blond', 'crown', 'royal', 'queen'],\n        char: '👸',\n        fitzpatrick_scale: true,\n      },\n      prince: {\n        keywords: ['boy', 'man', 'male', 'crown', 'royal', 'king'],\n        char: '🤴',\n        fitzpatrick_scale: true,\n      },\n      bride_with_veil: {\n        keywords: ['couple', 'marriage', 'wedding', 'woman', 'bride'],\n        char: '👰',\n        fitzpatrick_scale: true,\n      },\n      man_in_tuxedo: {\n        keywords: ['couple', 'marriage', 'wedding', 'groom'],\n        char: '🤵',\n        fitzpatrick_scale: true,\n      },\n      running_woman: {\n        keywords: ['woman', 'walking', 'exercise', 'race', 'running', 'female'],\n        char: '🏃‍♀️',\n        fitzpatrick_scale: true,\n      },\n      running_man: {\n        keywords: ['man', 'walking', 'exercise', 'race', 'running'],\n        char: '🏃',\n        fitzpatrick_scale: true,\n      },\n      walking_woman: {\n        keywords: ['human', 'feet', 'steps', 'woman', 'female'],\n        char: '🚶‍♀️',\n        fitzpatrick_scale: true,\n      },\n      walking_man: {\n        keywords: ['human', 'feet', 'steps'],\n        char: '🚶',\n        fitzpatrick_scale: true,\n      },\n      dancer: {\n        keywords: ['female', 'girl', 'woman', 'fun'],\n        char: '💃',\n        fitzpatrick_scale: true,\n      },\n      man_dancing: {\n        keywords: ['male', 'boy', 'fun', 'dancer'],\n        char: '🕺',\n        fitzpatrick_scale: true,\n      },\n      dancing_women: {\n        keywords: ['female', 'bunny', 'women', 'girls'],\n        char: '👯',\n      },\n      dancing_men: {\n        keywords: ['male', 'bunny', 'men', 'boys'],\n        char: '👯‍♂️',\n      },\n      couple: {\n        keywords: [\n          'pair',\n          'people',\n          'human',\n          'love',\n          'date',\n          'dating',\n          'like',\n          'affection',\n          'valentines',\n          'marriage',\n        ],\n        char: '👫',\n      },\n      two_men_holding_hands: {\n        keywords: ['pair', 'couple', 'love', 'like', 'bromance', 'friendship', 'people', 'human'],\n        char: '👬',\n      },\n      two_women_holding_hands: {\n        keywords: ['pair', 'friendship', 'couple', 'love', 'like', 'female', 'people', 'human'],\n        char: '👭',\n      },\n      bowing_woman: {\n        keywords: ['woman', 'female', 'girl'],\n        char: '🙇‍♀️',\n        fitzpatrick_scale: true,\n      },\n      bowing_man: {\n        keywords: ['man', 'male', 'boy'],\n        char: '🙇',\n        fitzpatrick_scale: true,\n      },\n      man_facepalming: {\n        keywords: ['man', 'male', 'boy', 'disbelief'],\n        char: '🤦‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_facepalming: {\n        keywords: ['woman', 'female', 'girl', 'disbelief'],\n        char: '🤦‍♀️',\n        fitzpatrick_scale: true,\n      },\n      woman_shrugging: {\n        keywords: ['woman', 'female', 'girl', 'confused', 'indifferent', 'doubt'],\n        char: '🤷',\n        fitzpatrick_scale: true,\n      },\n      man_shrugging: {\n        keywords: ['man', 'male', 'boy', 'confused', 'indifferent', 'doubt'],\n        char: '🤷‍♂️',\n        fitzpatrick_scale: true,\n      },\n      tipping_hand_woman: {\n        keywords: ['female', 'girl', 'woman', 'human', 'information'],\n        char: '💁',\n        fitzpatrick_scale: true,\n      },\n      tipping_hand_man: {\n        keywords: ['male', 'boy', 'man', 'human', 'information'],\n        char: '💁‍♂️',\n        fitzpatrick_scale: true,\n      },\n      no_good_woman: {\n        keywords: ['female', 'girl', 'woman', 'nope'],\n        char: '🙅',\n        fitzpatrick_scale: true,\n      },\n      no_good_man: {\n        keywords: ['male', 'boy', 'man', 'nope'],\n        char: '🙅‍♂️',\n        fitzpatrick_scale: true,\n      },\n      ok_woman: {\n        keywords: ['women', 'girl', 'female', 'pink', 'human', 'woman'],\n        char: '🙆',\n        fitzpatrick_scale: true,\n      },\n      ok_man: {\n        keywords: ['men', 'boy', 'male', 'blue', 'human', 'man'],\n        char: '🙆‍♂️',\n        fitzpatrick_scale: true,\n      },\n      raising_hand_woman: {\n        keywords: ['female', 'girl', 'woman'],\n        char: '🙋',\n        fitzpatrick_scale: true,\n      },\n      raising_hand_man: {\n        keywords: ['male', 'boy', 'man'],\n        char: '🙋‍♂️',\n        fitzpatrick_scale: true,\n      },\n      pouting_woman: {\n        keywords: ['female', 'girl', 'woman'],\n        char: '🙎',\n        fitzpatrick_scale: true,\n      },\n      pouting_man: {\n        keywords: ['male', 'boy', 'man'],\n        char: '🙎‍♂️',\n        fitzpatrick_scale: true,\n      },\n      frowning_woman: {\n        keywords: ['female', 'girl', 'woman', 'sad', 'depressed', 'discouraged', 'unhappy'],\n        char: '🙍',\n        fitzpatrick_scale: true,\n      },\n      frowning_man: {\n        keywords: ['male', 'boy', 'man', 'sad', 'depressed', 'discouraged', 'unhappy'],\n        char: '🙍‍♂️',\n        fitzpatrick_scale: true,\n      },\n      haircut_woman: {\n        keywords: ['female', 'girl', 'woman'],\n        char: '💇',\n        fitzpatrick_scale: true,\n      },\n      haircut_man: {\n        keywords: ['male', 'boy', 'man'],\n        char: '💇‍♂️',\n        fitzpatrick_scale: true,\n      },\n      massage_woman: {\n        keywords: ['female', 'girl', 'woman', 'head'],\n        char: '💆',\n        fitzpatrick_scale: true,\n      },\n      massage_man: {\n        keywords: ['male', 'boy', 'man', 'head'],\n        char: '💆‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_in_steamy_room: {\n        keywords: ['female', 'woman', 'spa', 'steamroom', 'sauna'],\n        char: '🧖‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_in_steamy_room: {\n        keywords: ['male', 'man', 'spa', 'steamroom', 'sauna'],\n        char: '🧖‍♂️',\n        fitzpatrick_scale: true,\n      },\n      couple_with_heart_woman_man: {\n        keywords: [\n          'pair',\n          'love',\n          'like',\n          'affection',\n          'human',\n          'dating',\n          'valentines',\n          'marriage',\n        ],\n        char: '💑',\n      },\n      couple_with_heart_woman_woman: {\n        keywords: [\n          'pair',\n          'love',\n          'like',\n          'affection',\n          'human',\n          'dating',\n          'valentines',\n          'marriage',\n        ],\n        char: '👩‍❤️‍👩',\n      },\n      couple_with_heart_man_man: {\n        keywords: [\n          'pair',\n          'love',\n          'like',\n          'affection',\n          'human',\n          'dating',\n          'valentines',\n          'marriage',\n        ],\n        char: '👨‍❤️‍👨',\n      },\n      couplekiss_man_woman: {\n        keywords: ['pair', 'valentines', 'love', 'like', 'dating', 'marriage'],\n        char: '💏',\n      },\n      couplekiss_woman_woman: {\n        keywords: ['pair', 'valentines', 'love', 'like', 'dating', 'marriage'],\n        char: '👩‍❤️‍💋‍👩',\n      },\n      couplekiss_man_man: {\n        keywords: ['pair', 'valentines', 'love', 'like', 'dating', 'marriage'],\n        char: '👨‍❤️‍💋‍👨',\n      }\n};\n","export const emojisPeoplePart5: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      family_man_woman_boy: {\n        keywords: [\n          'home',\n          'parents',\n          'child',\n          'mom',\n          'dad',\n          'father',\n          'mother',\n          'people',\n          'human',\n        ],\n        char: '👪',\n      },\n      family_man_woman_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'child'],\n        char: '👨‍👩‍👧',\n      },\n      family_man_woman_girl_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👩‍👧‍👦',\n      },\n      family_man_woman_boy_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👩‍👦‍👦',\n      },\n      family_man_woman_girl_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👩‍👧‍👧',\n      },\n      family_woman_woman_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👩‍👩‍👦',\n      },\n      family_woman_woman_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👩‍👩‍👧',\n      },\n      family_woman_woman_girl_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👩‍👩‍👧‍👦',\n      },\n      family_woman_woman_boy_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👩‍👩‍👦‍👦',\n      },\n      family_woman_woman_girl_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👩‍👩‍👧‍👧',\n      },\n      family_man_man_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👨‍👦',\n      },\n      family_man_man_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👨‍👧',\n      },\n      family_man_man_girl_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👨‍👧‍👦',\n      },\n      family_man_man_boy_boy: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👨‍👦‍👦',\n      },\n      family_man_man_girl_girl: {\n        keywords: ['home', 'parents', 'people', 'human', 'children'],\n        char: '👨‍👨‍👧‍👧',\n      },\n      family_woman_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'child'],\n        char: '👩‍👦',\n      },\n      family_woman_girl: {\n        keywords: ['home', 'parent', 'people', 'human', 'child'],\n        char: '👩‍👧',\n      },\n      family_woman_girl_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👩‍👧‍👦',\n      },\n      family_woman_boy_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👩‍👦‍👦',\n      },\n      family_woman_girl_girl: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👩‍👧‍👧',\n      },\n      family_man_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'child'],\n        char: '👨‍👦',\n      },\n      family_man_girl: {\n        keywords: ['home', 'parent', 'people', 'human', 'child'],\n        char: '👨‍👧',\n      },\n      family_man_girl_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👨‍👧‍👦',\n      },\n      family_man_boy_boy: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👨‍👦‍👦',\n      },\n      family_man_girl_girl: {\n        keywords: ['home', 'parent', 'people', 'human', 'children'],\n        char: '👨‍👧‍👧',\n      },\n      yarn: {\n        keywords: ['ball', 'crochet', 'knit'],\n        char: '🧶',\n      },\n      thread: {\n        keywords: ['needle', 'sewing', 'spool', 'string'],\n        char: '🧵',\n      },\n      coat: {\n        keywords: ['jacket'],\n        char: '🧥',\n      },\n      labcoat: {\n        keywords: ['doctor', 'experiment', 'scientist', 'chemist'],\n        char: '🥼',\n      },\n      womans_clothes: {\n        keywords: ['fashion', 'shopping_bags', 'female'],\n        char: '👚',\n      },\n      tshirt: {\n        keywords: ['fashion', 'cloth', 'casual', 'shirt', 'tee'],\n        char: '👕',\n      },\n      jeans: {\n        keywords: ['fashion', 'shopping'],\n        char: '👖',\n      },\n      necktie: {\n        keywords: ['shirt', 'suitup', 'formal', 'fashion', 'cloth', 'business'],\n        char: '👔',\n      },\n      dress: {\n        keywords: ['clothes', 'fashion', 'shopping'],\n        char: '👗',\n      },\n      bikini: {\n        keywords: ['swimming', 'female', 'woman', 'girl', 'fashion', 'beach', 'summer'],\n        char: '👙',\n      },\n      kimono: {\n        keywords: ['dress', 'fashion', 'women', 'female', 'japanese'],\n        char: '👘',\n      },\n      lipstick: {\n        keywords: ['female', 'girl', 'fashion', 'woman'],\n        char: '💄',\n      },\n      kiss: {\n        keywords: ['face', 'lips', 'love', 'like', 'affection', 'valentines'],\n        char: '💋',\n      },\n      footprints: {\n        keywords: ['feet', 'tracking', 'walking', 'beach'],\n        char: '👣',\n      },\n      flat_shoe: {\n        keywords: ['ballet', 'slip-on', 'slipper'],\n        char: '🥿',\n      },\n      high_heel: {\n        keywords: ['fashion', 'shoes', 'female', 'pumps', 'stiletto'],\n        char: '👠',\n      },\n      sandal: {\n        keywords: ['shoes', 'fashion', 'flip flops'],\n        char: '👡',\n      },\n      boot: {\n        keywords: ['shoes', 'fashion'],\n        char: '👢',\n      },\n      mans_shoe: {\n        keywords: ['fashion', 'male'],\n        char: '👞',\n      },\n      athletic_shoe: {\n        keywords: ['shoes', 'sports', 'sneakers'],\n        char: '👟',\n      },\n      hiking_boot: {\n        keywords: ['backpacking', 'camping', 'hiking'],\n        char: '🥾',\n      },\n      socks: {\n        keywords: ['stockings', 'clothes'],\n        char: '🧦',\n      },\n      gloves: {\n        keywords: ['hands', 'winter', 'clothes'],\n        char: '🧤',\n      },\n      scarf: {\n        keywords: ['neck', 'winter', 'clothes'],\n        char: '🧣',\n      },\n      womans_hat: {\n        keywords: ['fashion', 'accessories', 'female', 'lady', 'spring'],\n        char: '👒',\n      },\n      tophat: {\n        keywords: ['magic', 'gentleman', 'classy', 'circus'],\n        char: '🎩',\n      },\n      billed_hat: {\n        keywords: ['cap', 'baseball'],\n        char: '🧢',\n      },\n      rescue_worker_helmet: {\n        keywords: ['construction', 'build'],\n        char: '⛑',\n      },\n      mortar_board: {\n        keywords: [\n          'school',\n          'college',\n          'degree',\n          'university',\n          'graduation',\n          'cap',\n          'hat',\n          'legal',\n          'learn',\n          'education',\n        ],\n        char: '🎓',\n      },\n      crown: {\n        keywords: ['king', 'kod', 'leader', 'royalty', 'lord'],\n        char: '👑',\n      },\n      school_satchel: {\n        keywords: ['student', 'education', 'bag', 'backpack'],\n        char: '🎒',\n      },\n      luggage: {\n        keywords: ['packing', 'travel'],\n        char: '🧳',\n      },\n      pouch: {\n        keywords: ['bag', 'accessories', 'shopping'],\n        char: '👝',\n      },\n      purse: {\n        keywords: ['fashion', 'accessories', 'money', 'sales', 'shopping'],\n        char: '👛',\n      },\n      handbag: {\n        keywords: ['fashion', 'accessory', 'accessories', 'shopping'],\n        char: '👜',\n      },\n      briefcase: {\n        keywords: ['business', 'documents', 'work', 'law', 'legal', 'job', 'career'],\n        char: '💼',\n      },\n      eyeglasses: {\n        keywords: ['fashion', 'accessories', 'eyesight', 'nerdy', 'dork', 'geek'],\n        char: '👓',\n      },\n      dark_sunglasses: {\n        keywords: ['face', 'cool', 'accessories'],\n        char: '🕶',\n      },\n      goggles: {\n        keywords: ['eyes', 'protection', 'safety'],\n        char: '🥽',\n      },\n      ring: {\n        keywords: [\n          'wedding',\n          'propose',\n          'marriage',\n          'valentines',\n          'diamond',\n          'fashion',\n          'jewelry',\n          'gem',\n          'engagement',\n        ],\n        char: '💍',\n      },\n      closed_umbrella: {\n        keywords: ['weather', 'rain', 'drizzle'],\n        char: '🌂',\n      },\n};\n","import { emojisPeoplePart1 } from './emojis-people-1';\nimport { emojisPeoplePart2 } from './emojis-people-2';\nimport { emojisPeoplePart3 } from './emojis-people-3';\nimport { emojisPeoplePart4 } from './emojis-people-4';\nimport { emojisPeoplePart5 } from './emojis-people-5';\n\nconst smileyIcon = 'assets/smileys_people.svg';\n\nexport const emojisPeople = {\n  people: {\n    id: 'people',\n    name: 'emoji_smiley_people',\n    symbol: smileyIcon,\n    emojis: {\n      ...emojisPeoplePart1,\n      ...emojisPeoplePart2,\n      ...emojisPeoplePart3,\n      ...emojisPeoplePart4,\n      ...emojisPeoplePart5,\n    }\n  }\n};\n","export const emojisAnimalsPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      dog: {\n        keywords: ['animal', 'friend', 'nature', 'woof', 'puppy', 'pet', 'faithful'],\n        char: '🐶',\n      },\n      cat: {\n        keywords: ['animal', 'meow', 'nature', 'pet', 'kitten'],\n        char: '🐱',\n      },\n      mouse: {\n        keywords: ['animal', 'nature', 'cheese_wedge', 'rodent'],\n        char: '🐭',\n      },\n      hamster: {\n        keywords: ['animal', 'nature'],\n        char: '🐹',\n      },\n      rabbit: {\n        keywords: ['animal', 'nature', 'pet', 'spring', 'magic', 'bunny'],\n        char: '🐰',\n      },\n      fox_face: {\n        keywords: ['animal', 'nature', 'face'],\n        char: '🦊',\n      },\n      bear: {\n        keywords: ['animal', 'nature', 'wild'],\n        char: '🐻',\n      },\n      panda_face: {\n        keywords: ['animal', 'nature', 'panda'],\n        char: '🐼',\n      },\n      koala: {\n        keywords: ['animal', 'nature'],\n        char: '🐨',\n      },\n      tiger: {\n        keywords: ['animal', 'cat', 'danger', 'wild', 'nature', 'roar'],\n        char: '🐯',\n      },\n      lion: {\n        keywords: ['animal', 'nature'],\n        char: '🦁',\n      },\n      cow: {\n        keywords: ['beef', 'ox', 'animal', 'nature', 'moo', 'milk'],\n        char: '🐮',\n      },\n      pig: {\n        keywords: ['animal', 'oink', 'nature'],\n        char: '🐷',\n      },\n      pig_nose: {\n        keywords: ['animal', 'oink'],\n        char: '🐽',\n      },\n      frog: {\n        keywords: ['animal', 'nature', 'croak', 'toad'],\n        char: '🐸',\n      },\n      squid: {\n        keywords: ['animal', 'nature', 'ocean', 'sea'],\n        char: '🦑',\n      },\n      octopus: {\n        keywords: ['animal', 'creature', 'ocean', 'sea', 'nature', 'beach'],\n        char: '🐙',\n      },\n      shrimp: {\n        keywords: ['animal', 'ocean', 'nature', 'seafood'],\n        char: '🦐',\n      },\n      monkey_face: {\n        keywords: ['animal', 'nature', 'circus'],\n        char: '🐵',\n      },\n      gorilla: {\n        keywords: ['animal', 'nature', 'circus'],\n        char: '🦍',\n      },\n      see_no_evil: {\n        keywords: ['monkey', 'animal', 'nature', 'haha'],\n        char: '🙈',\n      },\n      hear_no_evil: {\n        keywords: ['animal', 'monkey', 'nature'],\n        char: '🙉',\n      },\n      speak_no_evil: {\n        keywords: ['monkey', 'animal', 'nature', 'omg'],\n        char: '🙊',\n      },\n      monkey: {\n        keywords: ['animal', 'nature', 'banana', 'circus'],\n        char: '🐒',\n      },\n      chicken: {\n        keywords: ['animal', 'cluck', 'nature', 'bird'],\n        char: '🐔',\n      },\n      penguin: {\n        keywords: ['animal', 'nature'],\n        char: '🐧',\n      },\n      bird: {\n        keywords: ['animal', 'nature', 'fly', 'tweet', 'spring'],\n        char: '🐦',\n      },\n      baby_chick: {\n        keywords: ['animal', 'chicken', 'bird'],\n        char: '🐤',\n      },\n      hatching_chick: {\n        keywords: ['animal', 'chicken', 'egg', 'born', 'baby', 'bird'],\n        char: '🐣',\n      },\n      hatched_chick: {\n        keywords: ['animal', 'chicken', 'baby', 'bird'],\n        char: '🐥',\n      },\n      duck: {\n        keywords: ['animal', 'nature', 'bird', 'mallard'],\n        char: '🦆',\n      },\n      eagle: {\n        keywords: ['animal', 'nature', 'bird'],\n        char: '🦅',\n      },\n      owl: {\n        keywords: ['animal', 'nature', 'bird', 'hoot'],\n        char: '🦉',\n      },\n      bat: {\n        keywords: ['animal', 'nature', 'blind', 'vampire'],\n        char: '🦇',\n      },\n      wolf: {\n        keywords: ['animal', 'nature', 'wild'],\n        char: '🐺',\n      },\n      boar: {\n        keywords: ['animal', 'nature'],\n        char: '🐗',\n      },\n      horse: {\n        keywords: ['animal', 'brown', 'nature'],\n        char: '🐴',\n      },\n      unicorn: {\n        keywords: ['animal', 'nature', 'mystical'],\n        char: '🦄',\n      },\n      honeybee: {\n        keywords: ['animal', 'insect', 'nature', 'bug', 'spring', 'honey'],\n        char: '🐝',\n      },\n      bug: {\n        keywords: ['animal', 'insect', 'nature', 'worm'],\n        char: '🐛',\n      },\n      butterfly: {\n        keywords: ['animal', 'insect', 'nature', 'caterpillar'],\n        char: '🦋',\n      },\n      snail: {\n        keywords: ['slow', 'animal', 'shell'],\n        char: '🐌',\n      },\n      beetle: {\n        keywords: ['animal', 'insect', 'nature', 'ladybug'],\n        char: '🐞',\n      },\n      ant: {\n        keywords: ['animal', 'insect', 'nature', 'bug'],\n        char: '🐜',\n      },\n      grasshopper: {\n        keywords: ['animal', 'cricket', 'chirp'],\n        char: '🦗',\n      },\n      spider: {\n        keywords: ['animal', 'arachnid'],\n        char: '🕷',\n      },\n      scorpion: {\n        keywords: ['animal', 'arachnid'],\n        char: '🦂',\n      },\n      crab: {\n        keywords: ['animal', 'crustacean'],\n        char: '🦀',\n      },\n      snake: {\n        keywords: ['animal', 'evil', 'nature', 'hiss', 'python'],\n        char: '🐍',\n      },\n      lizard: {\n        keywords: ['animal', 'nature', 'reptile'],\n        char: '🦎',\n      },\n      't-rex': {\n        keywords: ['animal', 'nature', 'dinosaur', 'tyrannosaurus', 'extinct'],\n        char: '🦖',\n      },\n      sauropod: {\n        keywords: [\n          'animal',\n          'nature',\n          'dinosaur',\n          'brachiosaurus',\n          'brontosaurus',\n          'diplodocus',\n          'extinct',\n        ],\n        char: '🦕',\n      },\n      turtle: {\n        keywords: ['animal', 'slow', 'nature', 'tortoise'],\n        char: '🐢',\n      },\n      tropical_fish: {\n        keywords: ['animal', 'swim', 'ocean', 'beach', 'nemo'],\n        char: '🐠',\n      },\n      fish: {\n        keywords: ['animal', 'food', 'nature'],\n        char: '🐟',\n      },\n      blowfish: {\n        keywords: ['animal', 'nature', 'food', 'sea', 'ocean'],\n        char: '🐡',\n      },\n      dolphin: {\n        keywords: ['animal', 'nature', 'fish', 'sea', 'ocean', 'flipper', 'fins', 'beach'],\n        char: '🐬',\n      },\n      shark: {\n        keywords: ['animal', 'nature', 'fish', 'sea', 'ocean', 'jaws', 'fins', 'beach'],\n        char: '🦈',\n      },\n      whale: {\n        keywords: ['animal', 'nature', 'sea', 'ocean'],\n        char: '🐳',\n      },\n      whale2: {\n        keywords: ['animal', 'nature', 'sea', 'ocean'],\n        char: '🐋',\n      },\n      crocodile: {\n        keywords: ['animal', 'nature', 'reptile', 'lizard', 'alligator'],\n        char: '🐊',\n      },\n      leopard: {\n        keywords: ['animal', 'nature'],\n        char: '🐆',\n      },\n      zebra: {\n        keywords: ['animal', 'nature', 'stripes', 'safari'],\n        char: '🦓',\n      },\n      tiger2: {\n        keywords: ['animal', 'nature', 'roar'],\n        char: '🐅',\n      },\n      water_buffalo: {\n        keywords: ['animal', 'nature', 'ox', 'cow'],\n        char: '🐃',\n      },\n      ox: {\n        keywords: ['animal', 'cow', 'beef'],\n        char: '🐂',\n      },\n      cow2: {\n        keywords: ['beef', 'ox', 'animal', 'nature', 'moo', 'milk'],\n        char: '🐄',\n      },\n      deer: {\n        keywords: ['animal', 'nature', 'horns', 'venison'],\n        char: '🦌',\n      },\n      dromedary_camel: {\n        keywords: ['animal', 'hot', 'desert', 'hump'],\n        char: '🐪',\n      },\n      camel: {\n        keywords: ['animal', 'nature', 'hot', 'desert', 'hump'],\n        char: '🐫',\n      },\n      giraffe: {\n        keywords: ['animal', 'nature', 'spots', 'safari'],\n        char: '🦒',\n      },\n      elephant: {\n        keywords: ['animal', 'nature', 'nose', 'th', 'circus'],\n        char: '🐘',\n      },\n      rhinoceros: {\n        keywords: ['animal', 'nature', 'horn'],\n        char: '🦏',\n      },\n      goat: {\n        keywords: ['animal', 'nature'],\n        char: '🐐',\n      },\n      ram: {\n        keywords: ['animal', 'sheep', 'nature'],\n        char: '🐏',\n      },\n      sheep: {\n        keywords: ['animal', 'nature', 'wool', 'shipit'],\n        char: '🐑',\n      },\n      racehorse: {\n        keywords: ['animal', 'gamble', 'luck'],\n        char: '🐎',\n      },\n      pig2: {\n        keywords: ['animal', 'nature'],\n        char: '🐖',\n      },\n      rat: {\n        keywords: ['animal', 'mouse', 'rodent'],\n        char: '🐀',\n      },\n      mouse2: {\n        keywords: ['animal', 'nature', 'rodent'],\n        char: '🐁',\n      },\n      rooster: {\n        keywords: ['animal', 'nature', 'chicken'],\n        char: '🐓',\n      },\n      turkey: {\n        keywords: ['animal', 'bird'],\n        char: '🦃',\n      },\n      dove: {\n        keywords: ['animal', 'bird'],\n        char: '🕊',\n      },\n      dog2: {\n        keywords: ['animal', 'nature', 'friend', 'doge', 'pet', 'faithful'],\n        char: '🐕',\n      },\n      poodle: {\n        keywords: ['dog', 'animal', '101', 'nature', 'pet'],\n        char: '🐩',\n      },\n      cat2: {\n        keywords: ['animal', 'meow', 'pet', 'cats'],\n        char: '🐈',\n      },\n      rabbit2: {\n        keywords: ['animal', 'nature', 'pet', 'magic', 'spring'],\n        char: '🐇',\n      },\n      chipmunk: {\n        keywords: ['animal', 'nature', 'rodent', 'squirrel'],\n        char: '🐿',\n      },\n      hedgehog: {\n        keywords: ['animal', 'nature', 'spiny'],\n        char: '🦔',\n      }\n};\n","export const emojisAnimalsPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      raccoon: {\n        keywords: ['animal', 'nature'],\n        char: '🦝',\n      },\n      llama: {\n        keywords: ['animal', 'nature', 'alpaca'],\n        char: '🦙',\n      },\n      hippopotamus: {\n        keywords: ['animal', 'nature'],\n        char: '🦛',\n      },\n      kangaroo: {\n        keywords: ['animal', 'nature', 'australia', 'joey', 'hop', 'marsupial'],\n        char: '🦘',\n      },\n      badger: {\n        keywords: ['animal', 'nature', 'honey'],\n        char: '🦡',\n      },\n      swan: {\n        keywords: ['animal', 'nature', 'bird'],\n        char: '🦢',\n      },\n      peacock: {\n        keywords: ['animal', 'nature', 'peahen', 'bird'],\n        char: '🦚',\n      },\n      parrot: {\n        keywords: ['animal', 'nature', 'bird', 'pirate', 'talk'],\n        char: '🦜',\n      },\n      lobster: {\n        keywords: ['animal', 'nature', 'bisque', 'claws', 'seafood'],\n        char: '🦞',\n      },\n      mosquito: {\n        keywords: ['animal', 'nature', 'insect', 'malaria'],\n        char: '🦟',\n      },\n      paw_prints: {\n        keywords: ['animal', 'tracking', 'footprints', 'dog', 'cat', 'pet', 'feet'],\n        char: '🐾',\n      },\n      dragon: {\n        keywords: ['animal', 'myth', 'nature', 'chinese', 'green'],\n        char: '🐉',\n      },\n      dragon_face: {\n        keywords: ['animal', 'myth', 'nature', 'chinese', 'green'],\n        char: '🐲',\n      },\n      cactus: {\n        keywords: ['vegetable', 'plant', 'nature'],\n        char: '🌵',\n      },\n      christmas_tree: {\n        keywords: ['festival', 'vacation', 'december', 'xmas', 'celebration'],\n        char: '🎄',\n      },\n      evergreen_tree: {\n        keywords: ['plant', 'nature'],\n        char: '🌲',\n      },\n      deciduous_tree: {\n        keywords: ['plant', 'nature'],\n        char: '🌳',\n      },\n      palm_tree: {\n        keywords: ['plant', 'vegetable', 'nature', 'summer', 'beach', 'mojito', 'tropical'],\n        char: '🌴',\n      },\n      seedling: {\n        keywords: ['plant', 'nature', 'grass', 'lawn', 'spring'],\n        char: '🌱',\n      },\n      herb: {\n        keywords: ['vegetable', 'plant', 'medicine', 'weed', 'grass', 'lawn'],\n        char: '🌿',\n      },\n      shamrock: {\n        keywords: ['vegetable', 'plant', 'nature', 'irish', 'clover'],\n        char: '☘',\n      },\n      four_leaf_clover: {\n        keywords: ['vegetable', 'plant', 'nature', 'lucky', 'irish'],\n        char: '🍀',\n      },\n      bamboo: {\n        keywords: ['plant', 'nature', 'vegetable', 'panda', 'pine_decoration'],\n        char: '🎍',\n      },\n      tanabata_tree: {\n        keywords: ['plant', 'nature', 'branch', 'summer'],\n        char: '🎋',\n      },\n      leaves: {\n        keywords: ['nature', 'plant', 'tree', 'vegetable', 'grass', 'lawn', 'spring'],\n        char: '🍃',\n      },\n      fallen_leaf: {\n        keywords: ['nature', 'plant', 'vegetable', 'leaves'],\n        char: '🍂',\n      },\n      maple_leaf: {\n        keywords: ['nature', 'plant', 'vegetable', 'ca', 'fall'],\n        char: '🍁',\n      },\n      ear_of_rice: {\n        keywords: ['nature', 'plant'],\n        char: '🌾',\n      },\n      hibiscus: {\n        keywords: ['plant', 'vegetable', 'flowers', 'beach'],\n        char: '🌺',\n      },\n      sunflower: {\n        keywords: ['nature', 'plant', 'fall'],\n        char: '🌻',\n      },\n      rose: {\n        keywords: ['flowers', 'valentines', 'love', 'spring'],\n        char: '🌹',\n      },\n      wilted_flower: {\n        keywords: ['plant', 'nature', 'flower'],\n        char: '🥀',\n      },\n      tulip: {\n        keywords: ['flowers', 'plant', 'nature', 'summer', 'spring'],\n        char: '🌷',\n      },\n      blossom: {\n        keywords: ['nature', 'flowers', 'yellow'],\n        char: '🌼',\n      },\n      cherry_blossom: {\n        keywords: ['nature', 'plant', 'spring', 'flower'],\n        char: '🌸',\n      },\n      bouquet: {\n        keywords: ['flowers', 'nature', 'spring'],\n        char: '💐',\n      },\n      mushroom: {\n        keywords: ['plant', 'vegetable'],\n        char: '🍄',\n      },\n      chestnut: {\n        keywords: ['food', 'squirrel'],\n        char: '🌰',\n      },\n      jack_o_lantern: {\n        keywords: ['halloween', 'light', 'pumpkin', 'creepy', 'fall'],\n        char: '🎃',\n      },\n      shell: {\n        keywords: ['nature', 'sea', 'beach'],\n        char: '🐚',\n      },\n      spider_web: {\n        keywords: ['animal', 'insect', 'arachnid', 'silk'],\n        char: '🕸',\n      },\n      earth_americas: {\n        keywords: ['globe', 'world', 'USA', 'international'],\n        char: '🌎',\n      },\n      earth_africa: {\n        keywords: ['globe', 'world', 'international'],\n        char: '🌍',\n      },\n      earth_asia: {\n        keywords: ['globe', 'world', 'east', 'international'],\n        char: '🌏',\n      },\n      full_moon: {\n        keywords: [\n          'nature',\n          'yellow',\n          'twilight',\n          'planet',\n          'space',\n          'night',\n          'evening',\n          'sleep',\n        ],\n        char: '🌕',\n      },\n      waning_gibbous_moon: {\n        keywords: [\n          'nature',\n          'twilight',\n          'planet',\n          'space',\n          'night',\n          'evening',\n          'sleep',\n          'waxing_gibbous_moon',\n        ],\n        char: '🌖',\n      },\n      last_quarter_moon: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌗',\n      },\n      waning_crescent_moon: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌘',\n      },\n      new_moon: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌑',\n      },\n      waxing_crescent_moon: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌒',\n      },\n      first_quarter_moon: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌓',\n      },\n      waxing_gibbous_moon: {\n        keywords: [\n          'nature',\n          'night',\n          'sky',\n          'gray',\n          'twilight',\n          'planet',\n          'space',\n          'evening',\n          'sleep',\n        ],\n        char: '🌔',\n      },\n      new_moon_with_face: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌚',\n      },\n      full_moon_with_face: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌝',\n      },\n      first_quarter_moon_with_face: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌛',\n      },\n      last_quarter_moon_with_face: {\n        keywords: ['nature', 'twilight', 'planet', 'space', 'night', 'evening', 'sleep'],\n        char: '🌜',\n      },\n      sun_with_face: {\n        keywords: ['nature', 'morning', 'sky'],\n        char: '🌞',\n      },\n      crescent_moon: {\n        keywords: ['night', 'sleep', 'sky', 'evening', 'magic'],\n        char: '🌙',\n      },\n      star: {\n        keywords: ['night', 'yellow'],\n        char: '⭐',\n      },\n      star2: {\n        keywords: ['night', 'sparkle', 'awesome', 'good', 'magic'],\n        char: '🌟',\n      },\n      dizzy: {\n        keywords: ['star', 'sparkle', 'shoot', 'magic'],\n        char: '💫',\n      },\n      sparkles: {\n        keywords: ['stars', 'shine', 'shiny', 'cool', 'awesome', 'good', 'magic'],\n        char: '✨',\n      },\n      comet: {\n        keywords: ['space'],\n        char: '☄',\n      },\n      sunny: {\n        keywords: ['weather', 'nature', 'brightness', 'summer', 'beach', 'spring'],\n        char: '☀️',\n      },\n      sun_behind_small_cloud: {\n        keywords: ['weather'],\n        char: '🌤',\n      },\n      partly_sunny: {\n        keywords: ['weather', 'nature', 'cloudy', 'morning', 'fall', 'spring'],\n        char: '⛅',\n      },\n      sun_behind_large_cloud: {\n        keywords: ['weather'],\n        char: '🌥',\n      },\n      sun_behind_rain_cloud: {\n        keywords: ['weather'],\n        char: '🌦',\n      },\n      cloud: {\n        keywords: ['weather', 'sky'],\n        char: '☁️',\n      },\n      cloud_with_rain: {\n        keywords: ['weather'],\n        char: '🌧',\n      },\n      cloud_with_lightning_and_rain: {\n        keywords: ['weather', 'lightning'],\n        char: '⛈',\n      },\n      cloud_with_lightning: {\n        keywords: ['weather', 'thunder'],\n        char: '🌩',\n      },\n      zap: {\n        keywords: ['thunder', 'weather', 'lightning bolt', 'fast'],\n        char: '⚡',\n      },\n      fire: {\n        keywords: ['hot', 'cook', 'flame'],\n        char: '🔥',\n      },\n      boom: {\n        keywords: ['bomb', 'explode', 'explosion', 'collision', 'blown'],\n        char: '💥',\n      },\n      snowflake: {\n        keywords: ['winter', 'season', 'cold', 'weather', 'christmas', 'xmas'],\n        char: '❄️',\n      },\n      cloud_with_snow: {\n        keywords: ['weather'],\n        char: '🌨',\n      },\n      snowman: {\n        keywords: [\n          'winter',\n          'season',\n          'cold',\n          'weather',\n          'christmas',\n          'xmas',\n          'frozen',\n          'without_snow',\n        ],\n        char: '⛄',\n      },\n      snowman_with_snow: {\n        keywords: ['winter', 'season', 'cold', 'weather', 'christmas', 'xmas', 'frozen'],\n        char: '☃',\n      },\n      wind_face: {\n        keywords: ['gust', 'air'],\n        char: '🌬',\n      },\n      dash: {\n        keywords: ['wind', 'air', 'fast', 'shoo', 'fart', 'smoke', 'puff'],\n        char: '💨',\n      },\n      tornado: {\n        keywords: ['weather', 'cyclone', 'twister'],\n        char: '🌪',\n      },\n      fog: {\n        keywords: ['weather'],\n        char: '🌫',\n      },\n      open_umbrella: {\n        keywords: ['weather', 'spring'],\n        char: '☂',\n      },\n      umbrella: {\n        keywords: ['rainy', 'weather', 'spring'],\n        char: '☔',\n      },\n      droplet: {\n        keywords: ['water', 'drip', 'faucet', 'spring'],\n        char: '💧',\n      },\n      sweat_drops: {\n        keywords: ['water', 'drip', 'oops'],\n        char: '💦',\n      },\n      ocean: {\n        keywords: ['sea', 'water', 'wave', 'nature', 'tsunami', 'disaster'],\n        char: '🌊',\n      },\n};\n","import { emojisAnimalsPart1 } from './emojis-animals-1';\nimport { emojisAnimalsPart2 } from './emojis-animals-2';\n\nconst animalsIcon = 'assets/animals_nature.svg';\n\nexport const emojisAnimals = {\n  animals_and_nature: {\n    id: 'animals_and_nature',\n    name: 'emoji_animals_nature',\n    symbol: animalsIcon,\n    emojis: {\n      ...emojisAnimalsPart1,\n      ...emojisAnimalsPart2,\n    }\n  }\n};\n","export const emojisFoodPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      green_apple: {\n        keywords: ['fruit', 'nature'],\n        char: '🍏',\n      },\n      apple: {\n        keywords: ['fruit', 'mac', 'school'],\n        char: '🍎',\n      },\n      pear: {\n        keywords: ['fruit', 'nature', 'food'],\n        char: '🍐',\n      },\n      tangerine: {\n        keywords: ['food', 'fruit', 'nature', 'orange'],\n        char: '🍊',\n      },\n      lemon: {\n        keywords: ['fruit', 'nature'],\n        char: '🍋',\n      },\n      banana: {\n        keywords: ['fruit', 'food', 'monkey'],\n        char: '🍌',\n      },\n      watermelon: {\n        keywords: ['fruit', 'food', 'picnic', 'summer'],\n        char: '🍉',\n      },\n      grapes: {\n        keywords: ['fruit', 'food', 'wine'],\n        char: '🍇',\n      },\n      strawberry: {\n        keywords: ['fruit', 'food', 'nature'],\n        char: '🍓',\n      },\n      melon: {\n        keywords: ['fruit', 'nature', 'food'],\n        char: '🍈',\n      },\n      cherries: {\n        keywords: ['food', 'fruit'],\n        char: '🍒',\n      },\n      peach: {\n        keywords: ['fruit', 'nature', 'food'],\n        char: '🍑',\n      },\n      pineapple: {\n        keywords: ['fruit', 'nature', 'food'],\n        char: '🍍',\n      },\n      coconut: {\n        keywords: ['fruit', 'nature', 'food', 'palm'],\n        char: '🥥',\n      },\n      kiwi_fruit: {\n        keywords: ['fruit', 'food'],\n        char: '🥝',\n      },\n      mango: {\n        keywords: ['fruit', 'food', 'tropical'],\n        char: '🥭',\n      },\n      avocado: {\n        keywords: ['fruit', 'food'],\n        char: '🥑',\n      },\n      broccoli: {\n        keywords: ['fruit', 'food', 'vegetable'],\n        char: '🥦',\n      },\n      tomato: {\n        keywords: ['fruit', 'vegetable', 'nature', 'food'],\n        char: '🍅',\n      },\n      eggplant: {\n        keywords: ['vegetable', 'nature', 'food', 'aubergine'],\n        char: '🍆',\n      },\n      cucumber: {\n        keywords: ['fruit', 'food', 'pickle'],\n        char: '🥒',\n      },\n      carrot: {\n        keywords: ['vegetable', 'food', 'orange'],\n        char: '🥕',\n      },\n      hot_pepper: {\n        keywords: ['food', 'spicy', 'chilli', 'chili'],\n        char: '🌶',\n      },\n      potato: {\n        keywords: ['food', 'tuber', 'vegatable', 'starch'],\n        char: '🥔',\n      },\n      corn: {\n        keywords: ['food', 'vegetable', 'plant'],\n        char: '🌽',\n      },\n      leafy_greens: {\n        keywords: ['food', 'vegetable', 'plant', 'bok choy', 'cabbage', 'kale', 'lettuce'],\n        char: '🥬',\n      },\n      sweet_potato: {\n        keywords: ['food', 'nature'],\n        char: '🍠',\n      },\n      peanuts: {\n        keywords: ['food', 'nut'],\n        char: '🥜',\n      },\n      honey_pot: {\n        keywords: ['bees', 'sweet', 'kitchen'],\n        char: '🍯',\n      },\n      croissant: {\n        keywords: ['food', 'bread', 'french'],\n        char: '🥐',\n      },\n      bread: {\n        keywords: ['food', 'wheat', 'breakfast', 'toast'],\n        char: '🍞',\n      },\n      baguette_bread: {\n        keywords: ['food', 'bread', 'french'],\n        char: '🥖',\n      },\n      bagel: {\n        keywords: ['food', 'bread', 'bakery', 'schmear'],\n        char: '🥯',\n      },\n      pretzel: {\n        keywords: ['food', 'bread', 'twisted'],\n        char: '🥨',\n      },\n      cheese: {\n        keywords: ['food', 'chadder'],\n        char: '🧀',\n      },\n      egg: {\n        keywords: ['food', 'chicken', 'breakfast'],\n        char: '🥚',\n      },\n      bacon: {\n        keywords: ['food', 'breakfast', 'pork', 'pig', 'meat'],\n        char: '🥓',\n      },\n      steak: {\n        keywords: ['food', 'cow', 'meat', 'cut', 'chop', 'lambchop', 'porkchop'],\n        char: '🥩',\n      },\n      pancakes: {\n        keywords: ['food', 'breakfast', 'flapjacks', 'hotcakes'],\n        char: '🥞',\n      },\n      poultry_leg: {\n        keywords: ['food', 'meat', 'drumstick', 'bird', 'chicken', 'turkey'],\n        char: '🍗',\n      },\n      meat_on_bone: {\n        keywords: ['good', 'food', 'drumstick'],\n        char: '🍖',\n      },\n      bone: {\n        keywords: ['skeleton'],\n        char: '🦴',\n      },\n      fried_shrimp: {\n        keywords: ['food', 'animal', 'appetizer', 'summer'],\n        char: '🍤',\n      },\n      fried_egg: {\n        keywords: ['food', 'breakfast', 'kitchen', 'egg'],\n        char: '🍳',\n      },\n      hamburger: {\n        keywords: ['meat', 'fast food', 'beef', 'cheeseburger', 'mcdonalds', 'burger king'],\n        char: '🍔',\n      },\n      fries: {\n        keywords: ['chips', 'snack', 'fast food'],\n        char: '🍟',\n      },\n      stuffed_flatbread: {\n        keywords: ['food', 'flatbread', 'stuffed', 'gyro'],\n        char: '🥙',\n      },\n      hotdog: {\n        keywords: ['food', 'frankfurter'],\n        char: '🌭',\n      },\n      pizza: {\n        keywords: ['food', 'party'],\n        char: '🍕',\n      },\n      sandwich: {\n        keywords: ['food', 'lunch', 'bread'],\n        char: '🥪',\n      },\n      canned_food: {\n        keywords: ['food', 'soup'],\n        char: '🥫',\n      },\n      spaghetti: {\n        keywords: ['food', 'italian', 'noodle'],\n        char: '🍝',\n      },\n      taco: {\n        keywords: ['food', 'mexican'],\n        char: '🌮',\n      }\n};\n","export const emojisFoodPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      burrito: {\n        keywords: ['food', 'mexican'],\n        char: '🌯',\n      },\n      green_salad: {\n        keywords: ['food', 'healthy', 'lettuce'],\n        char: '🥗',\n      },\n      shallow_pan_of_food: {\n        keywords: ['food', 'cooking', 'casserole', 'paella'],\n        char: '🥘',\n      },\n      ramen: {\n        keywords: ['food', 'japanese', 'noodle', 'chopsticks'],\n        char: '🍜',\n      },\n      stew: {\n        keywords: ['food', 'meat', 'soup'],\n        char: '🍲',\n      },\n      fish_cake: {\n        keywords: [\n          'food',\n          'japan',\n          'sea',\n          'beach',\n          'narutomaki',\n          'pink',\n          'swirl',\n          'kamaboko',\n          'surimi',\n          'ramen',\n        ],\n        char: '🍥',\n      },\n      fortune_cookie: {\n        keywords: ['food', 'prophecy'],\n        char: '🥠',\n      },\n      sushi: {\n        keywords: ['food', 'fish', 'japanese', 'rice'],\n        char: '🍣',\n      },\n      bento: {\n        keywords: ['food', 'japanese', 'box'],\n        char: '🍱',\n      },\n      curry: {\n        keywords: ['food', 'spicy', 'hot', 'indian'],\n        char: '🍛',\n      },\n      rice_ball: {\n        keywords: ['food', 'japanese'],\n        char: '🍙',\n      },\n      rice: {\n        keywords: ['food', 'china', 'asian'],\n        char: '🍚',\n      },\n      rice_cracker: {\n        keywords: ['food', 'japanese'],\n        char: '🍘',\n      },\n      oden: {\n        keywords: ['food', 'japanese'],\n        char: '🍢',\n      },\n      dango: {\n        keywords: ['food', 'dessert', 'sweet', 'japanese', 'barbecue', 'meat'],\n        char: '🍡',\n      },\n      shaved_ice: {\n        keywords: ['hot', 'dessert', 'summer'],\n        char: '🍧',\n      },\n      ice_cream: {\n        keywords: ['food', 'hot', 'dessert'],\n        char: '🍨',\n      },\n      icecream: {\n        keywords: ['food', 'hot', 'dessert', 'summer'],\n        char: '🍦',\n      },\n      pie: {\n        keywords: ['food', 'dessert', 'pastry'],\n        char: '🥧',\n      },\n      cake: {\n        keywords: ['food', 'dessert'],\n        char: '🍰',\n      },\n      cupcake: {\n        keywords: ['food', 'dessert', 'bakery', 'sweet'],\n        char: '🧁',\n      },\n      moon_cake: {\n        keywords: ['food', 'autumn'],\n        char: '🥮',\n      },\n      birthday: {\n        keywords: ['food', 'dessert', 'cake'],\n        char: '🎂',\n      },\n      custard: {\n        keywords: ['dessert', 'food'],\n        char: '🍮',\n      },\n      candy: {\n        keywords: ['snack', 'dessert', 'sweet', 'lolly'],\n        char: '🍬',\n      },\n      lollipop: {\n        keywords: ['food', 'snack', 'candy', 'sweet'],\n        char: '🍭',\n      },\n      chocolate_bar: {\n        keywords: ['food', 'snack', 'dessert', 'sweet'],\n        char: '🍫',\n      },\n      popcorn: {\n        keywords: ['food', 'movie theater', 'films', 'snack'],\n        char: '🍿',\n      },\n      dumpling: {\n        keywords: ['food', 'empanada', 'pierogi', 'potsticker'],\n        char: '🥟',\n      },\n      doughnut: {\n        keywords: ['food', 'dessert', 'snack', 'sweet', 'donut'],\n        char: '🍩',\n      },\n      cookie: {\n        keywords: ['food', 'snack', 'oreo', 'chocolate', 'sweet', 'dessert'],\n        char: '🍪',\n      },\n      milk_glass: {\n        keywords: ['beverage', 'drink', 'cow'],\n        char: '🥛',\n      },\n      beer: {\n        keywords: [\n          'relax',\n          'beverage',\n          'drink',\n          'drunk',\n          'party',\n          'pub',\n          'summer',\n          'alcohol',\n          'booze',\n        ],\n        char: '🍺',\n      },\n      beers: {\n        keywords: [\n          'relax',\n          'beverage',\n          'drink',\n          'drunk',\n          'party',\n          'pub',\n          'summer',\n          'alcohol',\n          'booze',\n        ],\n        char: '🍻',\n      },\n      clinking_glasses: {\n        keywords: [\n          'beverage',\n          'drink',\n          'party',\n          'alcohol',\n          'celebrate',\n          'cheers',\n          'wine',\n          'champagne',\n          'toast',\n        ],\n        char: '🥂',\n      },\n      wine_glass: {\n        keywords: ['drink', 'beverage', 'drunk', 'alcohol', 'booze'],\n        char: '🍷',\n      },\n      tumbler_glass: {\n        keywords: [\n          'drink',\n          'beverage',\n          'drunk',\n          'alcohol',\n          'liquor',\n          'booze',\n          'bourbon',\n          'scotch',\n          'whisky',\n          'glass',\n          'shot',\n        ],\n        char: '🥃',\n      },\n      cocktail: {\n        keywords: ['drink', 'drunk', 'alcohol', 'beverage', 'booze', 'mojito'],\n        char: '🍸',\n      },\n      tropical_drink: {\n        keywords: ['beverage', 'cocktail', 'summer', 'beach', 'alcohol', 'booze', 'mojito'],\n        char: '🍹',\n      },\n      champagne: {\n        keywords: ['drink', 'wine', 'bottle', 'celebration'],\n        char: '🍾',\n      },\n      sake: {\n        keywords: ['wine', 'drink', 'drunk', 'beverage', 'japanese', 'alcohol', 'booze'],\n        char: '🍶',\n      },\n      tea: {\n        keywords: ['drink', 'bowl', 'breakfast', 'green', 'british'],\n        char: '🍵',\n      },\n      cup_with_straw: {\n        keywords: ['drink', 'soda'],\n        char: '🥤',\n      },\n      coffee: {\n        keywords: ['beverage', 'caffeine', 'latte', 'espresso'],\n        char: '☕',\n      },\n      baby_bottle: {\n        keywords: ['food', 'container', 'milk'],\n        char: '🍼',\n      },\n      salt: {\n        keywords: ['condiment', 'shaker'],\n        char: '🧂',\n      },\n      spoon: {\n        keywords: ['cutlery', 'kitchen', 'tableware'],\n        char: '🥄',\n      },\n      fork_and_knife: {\n        keywords: ['cutlery', 'kitchen'],\n        char: '🍴',\n      },\n      plate_with_cutlery: {\n        keywords: ['food', 'eat', 'meal', 'lunch', 'dinner', 'restaurant'],\n        char: '🍽',\n      },\n      bowl_with_spoon: {\n        keywords: ['food', 'breakfast', 'cereal', 'oatmeal', 'porridge'],\n        char: '🥣',\n      },\n      takeout_box: {\n        keywords: ['food', 'leftovers'],\n        char: '🥡',\n      },\n      chopsticks: {\n        keywords: ['food'],\n        char: '🥢',\n      },\n};\n","import { emojisFoodPart1 } from './emojis-food-1';\nimport { emojisFoodPart2 } from './emojis-food-2';\n\nconst foodIcon = 'assets/food_drink.svg';\n\nexport const emojisFood = {\n  food_and_drink: {\n    id: 'food_and_drink',\n    name: 'emoji_food_drinks',\n    symbol: foodIcon,\n    emojis: {\n      ...emojisFoodPart1,\n      ...emojisFoodPart2,\n    }\n  }\n};\n","export const emojisActivityPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      soccer: {\n        keywords: ['sports', 'football'],\n        char: '⚽',\n      },\n      basketball: {\n        keywords: ['sports', 'balls', 'NBA'],\n        char: '🏀',\n      },\n      football: {\n        keywords: ['sports', 'balls', 'NFL'],\n        char: '🏈',\n      },\n      baseball: {\n        keywords: ['sports', 'balls'],\n        char: '⚾',\n      },\n      softball: {\n        keywords: ['sports', 'balls'],\n        char: '🥎',\n      },\n      tennis: {\n        keywords: ['sports', 'balls', 'green'],\n        char: '🎾',\n      },\n      volleyball: {\n        keywords: ['sports', 'balls'],\n        char: '🏐',\n      },\n      rugby_football: {\n        keywords: ['sports', 'team'],\n        char: '🏉',\n      },\n      flying_disc: {\n        keywords: ['sports', 'frisbee', 'ultimate'],\n        char: '🥏',\n      },\n      '8ball': {\n        keywords: ['pool', 'hobby', 'game', 'luck', 'magic'],\n        char: '🎱',\n      },\n      golf: {\n        keywords: ['sports', 'business', 'flag', 'hole', 'summer'],\n        char: '⛳',\n      },\n      golfing_woman: {\n        keywords: ['sports', 'business', 'woman', 'female'],\n        char: '🏌️‍♀️',\n      },\n      golfing_man: {\n        keywords: ['sports', 'business'],\n        char: '🏌',\n        fitzpatrick_scale: true,\n      },\n      ping_pong: {\n        keywords: ['sports', 'pingpong'],\n        char: '🏓',\n      },\n      badminton: {\n        keywords: ['sports'],\n        char: '🏸',\n      },\n      goal_net: {\n        keywords: ['sports'],\n        char: '🥅',\n      },\n      ice_hockey: {\n        keywords: ['sports'],\n        char: '🏒',\n      },\n      field_hockey: {\n        keywords: ['sports'],\n        char: '🏑',\n      },\n      lacrosse: {\n        keywords: ['sports', 'ball', 'stick'],\n        char: '🥍',\n      },\n      cricket: {\n        keywords: ['sports'],\n        char: '🏏',\n      },\n      ski: {\n        keywords: ['sports', 'winter', 'cold', 'snow'],\n        char: '🎿',\n      },\n      skier: {\n        keywords: ['sports', 'winter', 'snow'],\n        char: '⛷',\n      },\n      snowboarder: {\n        keywords: ['sports', 'winter'],\n        char: '🏂',\n        fitzpatrick_scale: true,\n      },\n      person_fencing: {\n        keywords: ['sports', 'fencing', 'sword'],\n        char: '🤺',\n      },\n      women_wrestling: {\n        keywords: ['sports', 'wrestlers'],\n        char: '🤼‍♀️',\n      },\n      men_wrestling: {\n        keywords: ['sports', 'wrestlers'],\n        char: '🤼‍♂️',\n      },\n      woman_cartwheeling: {\n        keywords: ['gymnastics'],\n        char: '🤸‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_cartwheeling: {\n        keywords: ['gymnastics'],\n        char: '🤸‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_playing_handball: {\n        keywords: ['sports'],\n        char: '🤾‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_playing_handball: {\n        keywords: ['sports'],\n        char: '🤾‍♂️',\n        fitzpatrick_scale: true,\n      },\n      ice_skate: {\n        keywords: ['sports'],\n        char: '⛸',\n      },\n      curling_stone: {\n        keywords: ['sports'],\n        char: '🥌',\n      },\n      skateboard: {\n        keywords: ['board'],\n        char: '🛹',\n      },\n      sled: {\n        keywords: ['sleigh', 'luge', 'toboggan'],\n        char: '🛷',\n      },\n      bow_and_arrow: {\n        keywords: ['sports'],\n        char: '🏹',\n      },\n      fishing_pole_and_fish: {\n        keywords: ['food', 'hobby', 'summer'],\n        char: '🎣',\n      },\n      boxing_glove: {\n        keywords: ['sports', 'fighting'],\n        char: '🥊',\n      },\n      martial_arts_uniform: {\n        keywords: ['judo', 'karate', 'taekwondo'],\n        char: '🥋',\n      },\n      rowing_woman: {\n        keywords: ['sports', 'hobby', 'water', 'ship', 'woman', 'female'],\n        char: '🚣‍♀️',\n        fitzpatrick_scale: true,\n      },\n      rowing_man: {\n        keywords: ['sports', 'hobby', 'water', 'ship'],\n        char: '🚣',\n        fitzpatrick_scale: true,\n      },\n      climbing_woman: {\n        keywords: ['sports', 'hobby', 'woman', 'female', 'rock'],\n        char: '🧗‍♀️',\n        fitzpatrick_scale: true,\n      },\n      climbing_man: {\n        keywords: ['sports', 'hobby', 'man', 'male', 'rock'],\n        char: '🧗‍♂️',\n        fitzpatrick_scale: true,\n      },\n      swimming_woman: {\n        keywords: [\n          'sports',\n          'exercise',\n          'human',\n          'athlete',\n          'water',\n          'summer',\n          'woman',\n          'female',\n        ],\n        char: '🏊‍♀️',\n        fitzpatrick_scale: true,\n      },\n      swimming_man: {\n        keywords: ['sports', 'exercise', 'human', 'athlete', 'water', 'summer'],\n        char: '🏊',\n        fitzpatrick_scale: true,\n      },\n      woman_playing_water_polo: {\n        keywords: ['sports', 'pool'],\n        char: '🤽‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_playing_water_polo: {\n        keywords: ['sports', 'pool'],\n        char: '🤽‍♂️',\n        fitzpatrick_scale: true,\n      },\n      woman_in_lotus_position: {\n        keywords: ['woman', 'female', 'meditation', 'yoga', 'serenity', 'zen', 'mindfulness'],\n        char: '🧘‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_in_lotus_position: {\n        keywords: ['man', 'male', 'meditation', 'yoga', 'serenity', 'zen', 'mindfulness'],\n        char: '🧘‍♂️',\n        fitzpatrick_scale: true,\n      }\n};\n","export const emojisActivityPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      surfing_woman: {\n        keywords: ['sports', 'ocean', 'sea', 'summer', 'beach', 'woman', 'female'],\n        char: '🏄‍♀️',\n        fitzpatrick_scale: true,\n      },\n      surfing_man: {\n        keywords: ['sports', 'ocean', 'sea', 'summer', 'beach'],\n        char: '🏄',\n        fitzpatrick_scale: true,\n      },\n      bath: {\n        keywords: ['clean', 'shower', 'bathroom'],\n        char: '🛀',\n        fitzpatrick_scale: true,\n      },\n      basketball_woman: {\n        keywords: ['sports', 'human', 'woman', 'female'],\n        char: '⛹️‍♀️',\n        fitzpatrick_scale: true,\n      },\n      basketball_man: {\n        keywords: ['sports', 'human'],\n        char: '⛹',\n        fitzpatrick_scale: true,\n      },\n      weight_lifting_woman: {\n        keywords: ['sports', 'training', 'exercise', 'woman', 'female'],\n        char: '🏋️‍♀️',\n        fitzpatrick_scale: true,\n      },\n      weight_lifting_man: {\n        keywords: ['sports', 'training', 'exercise'],\n        char: '🏋',\n        fitzpatrick_scale: true,\n      },\n      biking_woman: {\n        keywords: ['sports', 'bike', 'exercise', 'hipster', 'woman', 'female'],\n        char: '🚴‍♀️',\n        fitzpatrick_scale: true,\n      },\n      biking_man: {\n        keywords: ['sports', 'bike', 'exercise', 'hipster'],\n        char: '🚴',\n        fitzpatrick_scale: true,\n      },\n      mountain_biking_woman: {\n        keywords: ['transportation', 'sports', 'human', 'race', 'bike', 'woman', 'female'],\n        char: '🚵‍♀️',\n        fitzpatrick_scale: true,\n      },\n      mountain_biking_man: {\n        keywords: ['transportation', 'sports', 'human', 'race', 'bike'],\n        char: '🚵',\n        fitzpatrick_scale: true,\n      },\n      horse_racing: {\n        keywords: ['animal', 'betting', 'competition', 'gambling', 'luck'],\n        char: '🏇',\n        fitzpatrick_scale: true,\n      },\n      business_suit_levitating: {\n        keywords: ['suit', 'business', 'levitate', 'hover', 'jump'],\n        char: '🕴',\n        fitzpatrick_scale: true,\n      },\n      trophy: {\n        keywords: ['win', 'award', 'contest', 'place', 'ftw', 'ceremony'],\n        char: '🏆',\n      },\n      running_shirt_with_sash: {\n        keywords: ['play', 'pageant'],\n        char: '🎽',\n      },\n      medal_sports: {\n        keywords: ['award', 'winning'],\n        char: '🏅',\n      },\n      medal_military: {\n        keywords: ['award', 'winning', 'army'],\n        char: '🎖',\n      },\n      '1st_place_medal': {\n        keywords: ['award', 'winning', 'first'],\n        char: '🥇',\n      },\n      '2nd_place_medal': {\n        keywords: ['award', 'second'],\n        char: '🥈',\n      },\n      '3rd_place_medal': {\n        keywords: ['award', 'third'],\n        char: '🥉',\n      },\n      reminder_ribbon: {\n        keywords: ['sports', 'cause', 'support', 'awareness'],\n        char: '🎗',\n      },\n      rosette: {\n        keywords: ['flower', 'decoration', 'military'],\n        char: '🏵',\n      },\n      ticket: {\n        keywords: ['event', 'concert', 'pass'],\n        char: '🎫',\n      },\n      tickets: {\n        keywords: ['sports', 'concert', 'entrance'],\n        char: '🎟',\n      },\n      performing_arts: {\n        keywords: ['acting', 'theater', 'drama'],\n        char: '🎭',\n      },\n      art: {\n        keywords: ['design', 'paint', 'draw', 'colors'],\n        char: '🎨',\n      },\n      circus_tent: {\n        keywords: ['festival', 'carnival', 'party'],\n        char: '🎪',\n      },\n      woman_juggling: {\n        keywords: ['juggle', 'balance', 'skill', 'multitask'],\n        char: '🤹‍♀️',\n        fitzpatrick_scale: true,\n      },\n      man_juggling: {\n        keywords: ['juggle', 'balance', 'skill', 'multitask'],\n        char: '🤹‍♂️',\n        fitzpatrick_scale: true,\n      },\n      microphone: {\n        keywords: ['sound', 'music', 'PA', 'sing', 'talkshow'],\n        char: '🎤',\n      },\n      headphones: {\n        keywords: ['music', 'score', 'gadgets'],\n        char: '🎧',\n      },\n      musical_score: {\n        keywords: ['treble', 'clef', 'compose'],\n        char: '🎼',\n      },\n      musical_keyboard: {\n        keywords: ['piano', 'instrument', 'compose'],\n        char: '🎹',\n      },\n      drum: {\n        keywords: ['music', 'instrument', 'drumsticks', 'snare'],\n        char: '🥁',\n      },\n      saxophone: {\n        keywords: ['music', 'instrument', 'jazz', 'blues'],\n        char: '🎷',\n      },\n      trumpet: {\n        keywords: ['music', 'brass'],\n        char: '🎺',\n      },\n      guitar: {\n        keywords: ['music', 'instrument'],\n        char: '🎸',\n      },\n      violin: {\n        keywords: ['music', 'instrument', 'orchestra', 'symphony'],\n        char: '🎻',\n      },\n      clapper: {\n        keywords: ['movie', 'film', 'record'],\n        char: '🎬',\n      },\n      video_game: {\n        keywords: ['play', 'console', 'PS4', 'controller'],\n        char: '🎮',\n      },\n      space_invader: {\n        keywords: ['game', 'arcade', 'play'],\n        char: '👾',\n      },\n      dart: {\n        keywords: ['game', 'play', 'bar', 'target', 'bullseye'],\n        char: '🎯',\n      },\n      game_die: {\n        keywords: ['dice', 'random', 'tabletop', 'play', 'luck'],\n        char: '🎲',\n      },\n      chess_pawn: {\n        keywords: ['expendable'],\n        char: '♟',\n      },\n      slot_machine: {\n        keywords: ['bet', 'gamble', 'vegas', 'fruit machine', 'luck', 'casino'],\n        char: '🎰',\n      },\n      jigsaw: {\n        keywords: ['interlocking', 'puzzle', 'piece'],\n        char: '🧩',\n      },\n      bowling: {\n        keywords: ['sports', 'fun', 'play'],\n        char: '🎳',\n      },\n};\n","import { emojisActivityPart1 } from './emojis-activity-1';\nimport { emojisActivityPart2 } from './emojis-activity-2';\n\nconst activityIcon = 'assets/activity.svg';\n\nexport const emojisActivity = {\n  activity: {\n    id: 'activity',\n    name: 'emoji_activity',\n    symbol: activityIcon,\n    emojis: {\n      ...emojisActivityPart1,\n      ...emojisActivityPart2,\n    }\n  }\n};\n","export const emojisTravelPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      red_car: {\n        keywords: ['red', 'transportation', 'vehicle'],\n        char: '🚗',\n      },\n      taxi: {\n        keywords: ['uber', 'vehicle', 'cars', 'transportation'],\n        char: '🚕',\n      },\n      blue_car: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚙',\n      },\n      bus: {\n        keywords: ['car', 'vehicle', 'transportation'],\n        char: '🚌',\n      },\n      trolleybus: {\n        keywords: ['bart', 'transportation', 'vehicle'],\n        char: '🚎',\n      },\n      racing_car: {\n        keywords: ['sports', 'race', 'fast', 'formula', 'f1'],\n        char: '🏎',\n      },\n      police_car: {\n        keywords: ['vehicle', 'cars', 'transportation', 'law', 'legal', 'enforcement'],\n        char: '🚓',\n      },\n      ambulance: {\n        keywords: ['health', '911', 'hospital'],\n        char: '🚑',\n      },\n      fire_engine: {\n        keywords: ['transportation', 'cars', 'vehicle'],\n        char: '🚒',\n      },\n      minibus: {\n        keywords: ['vehicle', 'car', 'transportation'],\n        char: '🚐',\n      },\n      truck: {\n        keywords: ['cars', 'transportation'],\n        char: '🚚',\n      },\n      articulated_lorry: {\n        keywords: ['vehicle', 'cars', 'transportation', 'express'],\n        char: '🚛',\n      },\n      tractor: {\n        keywords: ['vehicle', 'car', 'farming', 'agriculture'],\n        char: '🚜',\n      },\n      kick_scooter: {\n        keywords: ['vehicle', 'kick', 'razor'],\n        char: '🛴',\n      },\n      motorcycle: {\n        keywords: ['race', 'sports', 'fast'],\n        char: '🏍',\n      },\n      bike: {\n        keywords: ['sports', 'bicycle', 'exercise', 'hipster'],\n        char: '🚲',\n      },\n      motor_scooter: {\n        keywords: ['vehicle', 'vespa', 'sasha'],\n        char: '🛵',\n      },\n      rotating_light: {\n        keywords: [\n          'police',\n          'ambulance',\n          '911',\n          'emergency',\n          'alert',\n          'error',\n          'pinged',\n          'law',\n          'legal',\n        ],\n        char: '🚨',\n      },\n      oncoming_police_car: {\n        keywords: ['vehicle', 'law', 'legal', 'enforcement', '911'],\n        char: '🚔',\n      },\n      oncoming_bus: {\n        keywords: ['vehicle', 'transportation'],\n        char: '🚍',\n      },\n      oncoming_automobile: {\n        keywords: ['car', 'vehicle', 'transportation'],\n        char: '🚘',\n      },\n      oncoming_taxi: {\n        keywords: ['vehicle', 'cars', 'uber'],\n        char: '🚖',\n      },\n      aerial_tramway: {\n        keywords: ['transportation', 'vehicle', 'ski'],\n        char: '🚡',\n      },\n      mountain_cableway: {\n        keywords: ['transportation', 'vehicle', 'ski'],\n        char: '🚠',\n      },\n      suspension_railway: {\n        keywords: ['vehicle', 'transportation'],\n        char: '🚟',\n      },\n      railway_car: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚃',\n      },\n      train: {\n        keywords: ['transportation', 'vehicle', 'carriage', 'public', 'travel'],\n        char: '🚋',\n      },\n      monorail: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚝',\n      },\n      bullettrain_side: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚄',\n      },\n      bullettrain_front: {\n        keywords: ['transportation', 'vehicle', 'speed', 'fast', 'public', 'travel'],\n        char: '🚅',\n      },\n      light_rail: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚈',\n      },\n      mountain_railway: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚞',\n      },\n      steam_locomotive: {\n        keywords: ['transportation', 'vehicle', 'train'],\n        char: '🚂',\n      },\n      train2: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚆',\n      },\n      metro: {\n        keywords: ['transportation', 'blue-square', 'mrt', 'underground', 'tube'],\n        char: '🚇',\n      },\n      tram: {\n        keywords: ['transportation', 'vehicle'],\n        char: '🚊',\n      },\n      station: {\n        keywords: ['transportation', 'vehicle', 'public'],\n        char: '🚉',\n      },\n      flying_saucer: {\n        keywords: ['transportation', 'vehicle', 'ufo'],\n        char: '🛸',\n      },\n      helicopter: {\n        keywords: ['transportation', 'vehicle', 'fly'],\n        char: '🚁',\n      },\n      small_airplane: {\n        keywords: ['flight', 'transportation', 'fly', 'vehicle'],\n        char: '🛩',\n      },\n      airplane: {\n        keywords: ['vehicle', 'transportation', 'flight', 'fly'],\n        char: '✈️',\n      },\n      flight_departure: {\n        keywords: ['airport', 'flight', 'landing'],\n        char: '🛫',\n      },\n      flight_arrival: {\n        keywords: ['airport', 'flight', 'boarding'],\n        char: '🛬',\n      },\n      sailboat: {\n        keywords: ['ship', 'summer', 'transportation', 'water', 'sailing'],\n        char: '⛵',\n      },\n      motor_boat: {\n        keywords: ['ship'],\n        char: '🛥',\n      },\n      speedboat: {\n        keywords: ['ship', 'transportation', 'vehicle', 'summer'],\n        char: '🚤',\n      },\n      ferry: {\n        keywords: ['boat', 'ship', 'yacht'],\n        char: '⛴',\n      },\n      passenger_ship: {\n        keywords: ['yacht', 'cruise', 'ferry'],\n        char: '🛳',\n      },\n      rocket: {\n        keywords: ['launch', 'ship', 'staffmode', 'NASA', 'outer space', 'outer_space', 'fly'],\n        char: '🚀',\n      },\n      artificial_satellite: {\n        keywords: ['communication', 'gps', 'orbit', 'spaceflight', 'NASA', 'ISS'],\n        char: '🛰',\n      },\n      seat: {\n        keywords: ['sit', 'airplane', 'transport', 'bus', 'flight', 'fly'],\n        char: '💺',\n      },\n      canoe: {\n        keywords: ['boat', 'paddle', 'water', 'ship'],\n        char: '🛶',\n      },\n      anchor: {\n        keywords: ['ship', 'ferry', 'sea', 'boat'],\n        char: '⚓',\n      },\n      construction: {\n        keywords: ['wip', 'progress', 'caution', 'warning'],\n        char: '🚧',\n      },\n      fuelpump: {\n        keywords: ['gas station', 'petroleum'],\n        char: '⛽',\n      },\n      busstop: {\n        keywords: ['transportation', 'wait'],\n        char: '🚏',\n      },\n      vertical_traffic_light: {\n        keywords: ['transportation', 'driving'],\n        char: '🚦',\n      },\n      traffic_light: {\n        keywords: ['transportation', 'signal'],\n        char: '🚥',\n      },\n      checkered_flag: {\n        keywords: ['contest', 'finishline', 'race', 'gokart'],\n        char: '🏁',\n      },\n      ship: {\n        keywords: ['transportation', 'titanic', 'deploy'],\n        char: '🚢',\n      }\n};\n","export const emojisTravelPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      ferris_wheel: {\n        keywords: ['photo', 'carnival', 'londoneye'],\n        char: '🎡',\n      },\n      roller_coaster: {\n        keywords: ['carnival', 'playground', 'photo', 'fun'],\n        char: '🎢',\n      },\n      carousel_horse: {\n        keywords: ['photo', 'carnival'],\n        char: '🎠',\n      },\n      building_construction: {\n        keywords: ['wip', 'working', 'progress'],\n        char: '🏗',\n      },\n      foggy: {\n        keywords: ['photo', 'mountain'],\n        char: '🌁',\n      },\n      tokyo_tower: {\n        keywords: ['photo', 'japanese'],\n        char: '🗼',\n      },\n      factory: {\n        keywords: ['building', 'industry', 'pollution', 'smoke'],\n        char: '🏭',\n      },\n      fountain: {\n        keywords: ['photo', 'summer', 'water', 'fresh'],\n        char: '⛲',\n      },\n      rice_scene: {\n        keywords: ['photo', 'japan', 'asia', 'tsukimi'],\n        char: '🎑',\n      },\n      mountain: {\n        keywords: ['photo', 'nature', 'environment'],\n        char: '⛰',\n      },\n      mountain_snow: {\n        keywords: ['photo', 'nature', 'environment', 'winter', 'cold'],\n        char: '🏔',\n      },\n      mount_fuji: {\n        keywords: ['photo', 'mountain', 'nature', 'japanese'],\n        char: '🗻',\n      },\n      volcano: {\n        keywords: ['photo', 'nature', 'disaster'],\n        char: '🌋',\n      },\n      japan: {\n        keywords: ['nation', 'country', 'japanese', 'asia'],\n        char: '🗾',\n      },\n      camping: {\n        keywords: ['photo', 'outdoors', 'tent'],\n        char: '🏕',\n      },\n      tent: {\n        keywords: ['photo', 'camping', 'outdoors'],\n        char: '⛺',\n      },\n      national_park: {\n        keywords: ['photo', 'environment', 'nature'],\n        char: '🏞',\n      },\n      motorway: {\n        keywords: ['road', 'cupertino', 'interstate', 'highway'],\n        char: '🛣',\n      },\n      railway_track: {\n        keywords: ['train', 'transportation'],\n        char: '🛤',\n      },\n      sunrise: {\n        keywords: ['morning', 'view', 'vacation', 'photo'],\n        char: '🌅',\n      },\n      sunrise_over_mountains: {\n        keywords: ['view', 'vacation', 'photo'],\n        char: '🌄',\n      },\n      desert: {\n        keywords: ['photo', 'warm', 'saharah'],\n        char: '🏜',\n      },\n      beach_umbrella: {\n        keywords: ['weather', 'summer', 'sunny', 'sand', 'mojito'],\n        char: '🏖',\n      },\n      desert_island: {\n        keywords: ['photo', 'tropical', 'mojito'],\n        char: '🏝',\n      },\n      city_sunrise: {\n        keywords: ['photo', 'good morning', 'dawn'],\n        char: '🌇',\n      },\n      city_sunset: {\n        keywords: ['photo', 'evening', 'sky', 'buildings'],\n        char: '🌆',\n      },\n      cityscape: {\n        keywords: ['photo', 'night life', 'urban'],\n        char: '🏙',\n      },\n      night_with_stars: {\n        keywords: ['evening', 'city', 'downtown'],\n        char: '🌃',\n      },\n      bridge_at_night: {\n        keywords: ['photo', 'sanfrancisco'],\n        char: '🌉',\n      },\n      milky_way: {\n        keywords: ['photo', 'space', 'stars'],\n        char: '🌌',\n      },\n      stars: {\n        keywords: ['night', 'photo'],\n        char: '🌠',\n      },\n      sparkler: {\n        keywords: ['stars', 'night', 'shine'],\n        char: '🎇',\n      },\n      fireworks: {\n        keywords: ['photo', 'festival', 'carnival', 'congratulations'],\n        char: '🎆',\n      },\n      rainbow: {\n        keywords: ['nature', 'happy', 'unicorn_face', 'photo', 'sky', 'spring'],\n        char: '🌈',\n      },\n      houses: {\n        keywords: ['buildings', 'photo'],\n        char: '🏘',\n      },\n      european_castle: {\n        keywords: ['building', 'royalty', 'history'],\n        char: '🏰',\n      },\n      japanese_castle: {\n        keywords: ['photo', 'building'],\n        char: '🏯',\n      },\n      stadium: {\n        keywords: ['photo', 'place', 'sports', 'concert', 'venue'],\n        char: '🏟',\n      },\n      statue_of_liberty: {\n        keywords: ['american', 'newyork'],\n        char: '🗽',\n      },\n      house: {\n        keywords: ['building', 'home'],\n        char: '🏠',\n      },\n      house_with_garden: {\n        keywords: ['home', 'plant', 'nature'],\n        char: '🏡',\n      },\n      derelict_house: {\n        keywords: ['abandon', 'evict', 'broken', 'building'],\n        char: '🏚',\n      },\n      office: {\n        keywords: ['building', 'bureau', 'work'],\n        char: '🏢',\n      },\n      department_store: {\n        keywords: ['building', 'shopping', 'mall'],\n        char: '🏬',\n      },\n      post_office: {\n        keywords: ['building', 'envelope', 'communication'],\n        char: '🏣',\n      },\n      european_post_office: {\n        keywords: ['building', 'email'],\n        char: '🏤',\n      },\n      hospital: {\n        keywords: ['building', 'health', 'surgery', 'doctor'],\n        char: '🏥',\n      },\n      bank: {\n        keywords: ['building', 'money', 'sales', 'cash', 'business', 'enterprise'],\n        char: '🏦',\n      },\n      hotel: {\n        keywords: ['building', 'accomodation', 'checkin'],\n        char: '🏨',\n      },\n      convenience_store: {\n        keywords: ['building', 'shopping', 'groceries'],\n        char: '🏪',\n      },\n      school: {\n        keywords: ['building', 'student', 'education', 'learn', 'teach'],\n        char: '🏫',\n      },\n      love_hotel: {\n        keywords: ['like', 'affection', 'dating'],\n        char: '🏩',\n      },\n      wedding: {\n        keywords: ['love', 'like', 'affection', 'couple', 'marriage', 'bride', 'groom'],\n        char: '💒',\n      },\n      classical_building: {\n        keywords: ['art', 'culture', 'history'],\n        char: '🏛',\n      },\n      church: {\n        keywords: ['building', 'religion', 'christ'],\n        char: '⛪',\n      },\n      mosque: {\n        keywords: ['islam', 'worship', 'minaret'],\n        char: '🕌',\n      },\n      synagogue: {\n        keywords: ['judaism', 'worship', 'temple', 'jewish'],\n        char: '🕍',\n      },\n      kaaba: {\n        keywords: ['mecca', 'mosque', 'islam'],\n        char: '🕋',\n      },\n      shinto_shrine: {\n        keywords: ['temple', 'japan', 'kyoto'],\n        char: '⛩',\n      },\n  };\n","import { emojisTravelPart1 } from './emojis-travel-1';\nimport { emojisTravelPart2 } from './emojis-travel-2';\n\nconst travelIcon = 'assets/travel_places.svg';\n\nexport const emojisTravel = {\n  travel_and_places: {\n    id: 'travel_and_places',\n    name: 'emoji_travel_places',\n    symbol: travelIcon,\n    emojis: {\n      ...emojisTravelPart1,\n      ...emojisTravelPart2,\n    }\n  }\n};\n","export const emojisObjectsPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      watch: {\n        keywords: ['time', 'accessories'],\n        char: '⌚',\n      },\n      iphone: {\n        keywords: ['technology', 'apple', 'gadgets', 'dial'],\n        char: '📱',\n      },\n      calling: {\n        keywords: ['iphone', 'incoming'],\n        char: '📲',\n      },\n      computer: {\n        keywords: ['technology', 'laptop', 'screen', 'display', 'monitor'],\n        char: '💻',\n      },\n      keyboard: {\n        keywords: ['technology', 'computer', 'type', 'input', 'text'],\n        char: '⌨',\n      },\n      desktop_computer: {\n        keywords: ['technology', 'computing', 'screen'],\n        char: '🖥',\n      },\n      printer: {\n        keywords: ['paper', 'ink'],\n        char: '🖨',\n      },\n      computer_mouse: {\n        keywords: ['click'],\n        char: '🖱',\n      },\n      trackball: {\n        keywords: ['technology', 'trackpad'],\n        char: '🖲',\n      },\n      joystick: {\n        keywords: ['game', 'play'],\n        char: '🕹',\n      },\n      clamp: {\n        keywords: ['tool'],\n        char: '🗜',\n      },\n      minidisc: {\n        keywords: ['technology', 'record', 'emojis', 'disk', '90s'],\n        char: '💽',\n      },\n      floppy_disk: {\n        keywords: ['oldschool', 'technology', 'save', '90s', '80s'],\n        char: '💾',\n      },\n      cd: {\n        keywords: ['technology', 'dvd', 'disk', 'disc', '90s'],\n        char: '💿',\n      },\n      dvd: {\n        keywords: ['cd', 'disk', 'disc'],\n        char: '📀',\n      },\n      vhs: {\n        keywords: ['record', 'video', 'oldschool', '90s', '80s'],\n        char: '📼',\n      },\n      camera: {\n        keywords: ['gadgets', 'photography'],\n        char: '📷',\n      },\n      camera_flash: {\n        keywords: ['photography', 'gadgets'],\n        char: '📸',\n      },\n      video_camera: {\n        keywords: ['film', 'record'],\n        char: '📹',\n      },\n      movie_camera: {\n        keywords: ['film', 'record'],\n        char: '🎥',\n      },\n      film_projector: {\n        keywords: ['video', 'tape', 'record', 'movie'],\n        char: '📽',\n      },\n      film_strip: {\n        keywords: ['movie'],\n        char: '🎞',\n      },\n      telephone_receiver: {\n        keywords: ['technology', 'communication', 'dial'],\n        char: '📞',\n      },\n      phone: {\n        keywords: ['technology', 'communication', 'dial', 'telephone'],\n        char: '☎️',\n      },\n      pager: {\n        keywords: ['bbcall', 'oldschool', '90s'],\n        char: '📟',\n      },\n      fax: {\n        keywords: ['communication', 'technology'],\n        char: '📠',\n      },\n      tv: {\n        keywords: ['technology', 'program', 'oldschool', 'show', 'television'],\n        char: '📺',\n      },\n      radio: {\n        keywords: ['communication', 'music', 'podcast', 'program'],\n        char: '📻',\n      },\n      studio_microphone: {\n        keywords: ['sing', 'recording', 'artist', 'talkshow'],\n        char: '🎙',\n      },\n      level_slider: {\n        keywords: ['scale'],\n        char: '🎚',\n      },\n      control_knobs: {\n        keywords: ['dial'],\n        char: '🎛',\n      },\n      compass: {\n        keywords: ['magnetic', 'navigation', 'orienteering'],\n        char: '🧭',\n      },\n      stopwatch: {\n        keywords: ['time', 'deadline'],\n        char: '⏱',\n      },\n      timer_clock: {\n        keywords: ['alarm'],\n        char: '⏲',\n      },\n      alarm_clock: {\n        keywords: ['time', 'wake'],\n        char: '⏰',\n      },\n      mantelpiece_clock: {\n        keywords: ['time'],\n        char: '🕰',\n      },\n      hourglass_flowing_sand: {\n        keywords: ['oldschool', 'time', 'countdown'],\n        char: '⏳',\n      },\n      hourglass: {\n        keywords: ['time', 'clock', 'oldschool', 'limit', 'exam', 'quiz', 'test'],\n        char: '⌛',\n      },\n      satellite: {\n        keywords: ['communication', 'future', 'radio', 'space'],\n        char: '📡',\n      },\n      battery: {\n        keywords: ['power', 'energy', 'sustain'],\n        char: '🔋',\n      },\n      electric_plug: {\n        keywords: ['charger', 'power'],\n        char: '🔌',\n      },\n      bulb: {\n        keywords: ['light', 'electricity', 'idea'],\n        char: '💡',\n      },\n      flashlight: {\n        keywords: ['dark', 'camping', 'sight', 'night'],\n        char: '🔦',\n      },\n      candle: {\n        keywords: ['fire', 'wax'],\n        char: '🕯',\n      },\n      fire_extinguisher: {\n        keywords: ['quench'],\n        char: '🧯',\n      },\n      wastebasket: {\n        keywords: ['bin', 'trash', 'rubbish', 'garbage', 'toss'],\n        char: '🗑',\n      },\n      oil_drum: {\n        keywords: ['barrell'],\n        char: '🛢',\n      },\n      money_with_wings: {\n        keywords: ['dollar', 'bills', 'payment', 'sale'],\n        char: '💸',\n      },\n      dollar: {\n        keywords: ['money', 'sales', 'bill', 'currency'],\n        char: '💵',\n      },\n      yen: {\n        keywords: ['money', 'sales', 'japanese', 'dollar', 'currency'],\n        char: '💴',\n      },\n      euro: {\n        keywords: ['money', 'sales', 'dollar', 'currency'],\n        char: '💶',\n      },\n      pound: {\n        keywords: ['british', 'sterling', 'money', 'sales', 'bills', 'uk', 'england', 'currency'],\n        char: '💷',\n      },\n      moneybag: {\n        keywords: ['dollar', 'payment', 'coins', 'sale'],\n        char: '💰',\n      },\n      credit_card: {\n        keywords: ['money', 'sales', 'dollar', 'bill', 'payment', 'shopping'],\n        char: '💳',\n      },\n      gem: {\n        keywords: ['blue', 'ruby', 'diamond', 'jewelry'],\n        char: '💎',\n      },\n      balance_scale: {\n        keywords: ['law', 'fairness', 'weight'],\n        char: '⚖',\n      },\n      toolbox: {\n        keywords: ['tools', 'diy', 'fix', 'maintainer', 'mechanic'],\n        char: '🧰',\n      },\n      wrench: {\n        keywords: ['tools', 'diy', 'ikea', 'fix', 'maintainer'],\n        char: '🔧',\n      },\n      hammer: {\n        keywords: ['tools', 'build', 'create'],\n        char: '🔨',\n      },\n      hammer_and_pick: {\n        keywords: ['tools', 'build', 'create'],\n        char: '⚒',\n      },\n      hammer_and_wrench: {\n        keywords: ['tools', 'build', 'create'],\n        char: '🛠',\n      },\n      pick: {\n        keywords: ['tools', 'dig'],\n        char: '⛏',\n      },\n      nut_and_bolt: {\n        keywords: ['handy', 'tools', 'fix'],\n        char: '🔩',\n      },\n      gear: {\n        keywords: ['cog'],\n        char: '⚙',\n      },\n      brick: {\n        keywords: ['bricks'],\n        char: '🧱',\n      },\n      chains: {\n        keywords: ['lock', 'arrest'],\n        char: '⛓',\n      },\n      magnet: {\n        keywords: ['attraction', 'magnetic'],\n        char: '🧲',\n      },\n      gun: {\n        keywords: ['violence', 'weapon', 'pistol', 'revolver'],\n        char: '🔫',\n      }\n};\n","export const emojisObjectsPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      bomb: {\n        keywords: ['boom', 'explode', 'explosion', 'terrorism'],\n        char: '💣',\n      },\n      firecracker: {\n        keywords: ['dynamite', 'boom', 'explode', 'explosion', 'explosive'],\n        char: '🧨',\n      },\n      hocho: {\n        keywords: ['knife', 'blade', 'cutlery', 'kitchen', 'weapon'],\n        char: '🔪',\n      },\n      dagger: {\n        keywords: ['weapon'],\n        char: '🗡',\n      },\n      crossed_swords: {\n        keywords: ['weapon'],\n        char: '⚔',\n      },\n      shield: {\n        keywords: ['protection', 'security'],\n        char: '🛡',\n      },\n      smoking: {\n        keywords: ['kills', 'tobacco', 'cigarette', 'joint', 'smoke'],\n        char: '🚬',\n      },\n      skull_and_crossbones: {\n        keywords: ['poison', 'danger', 'deadly', 'scary', 'death', 'pirate', 'evil'],\n        char: '☠',\n      },\n      coffin: {\n        keywords: [\n          'vampire',\n          'dead',\n          'die',\n          'death',\n          'rip',\n          'graveyard',\n          'cemetery',\n          'casket',\n          'funeral',\n          'box',\n        ],\n        char: '⚰',\n      },\n      funeral_urn: {\n        keywords: ['dead', 'die', 'death', 'rip', 'ashes'],\n        char: '⚱',\n      },\n      amphora: {\n        keywords: ['vase', 'jar'],\n        char: '🏺',\n      },\n      crystal_ball: {\n        keywords: ['disco', 'party', 'magic', 'circus', 'fortune_teller'],\n        char: '🔮',\n      },\n      prayer_beads: {\n        keywords: ['dhikr', 'religious'],\n        char: '📿',\n      },\n      nazar_amulet: {\n        keywords: ['bead', 'charm'],\n        char: '🧿',\n      },\n      barber: {\n        keywords: ['hair', 'salon', 'style'],\n        char: '💈',\n      },\n      alembic: {\n        keywords: ['distilling', 'science', 'experiment', 'chemistry'],\n        char: '⚗',\n      },\n      telescope: {\n        keywords: ['stars', 'space', 'zoom', 'science', 'astronomy'],\n        char: '🔭',\n      },\n      microscope: {\n        keywords: ['laboratory', 'experiment', 'zoomin', 'science', 'study'],\n        char: '🔬',\n      },\n      hole: {\n        keywords: ['embarrassing'],\n        char: '🕳',\n      },\n      pill: {\n        keywords: ['health', 'medicine', 'doctor', 'pharmacy', 'drug'],\n        char: '💊',\n      },\n      syringe: {\n        keywords: [\n          'health',\n          'hospital',\n          'drugs',\n          'blood',\n          'medicine',\n          'needle',\n          'doctor',\n          'nurse',\n        ],\n        char: '💉',\n      },\n      dna: {\n        keywords: ['biologist', 'genetics', 'life'],\n        char: '🧬',\n      },\n      microbe: {\n        keywords: ['amoeba', 'bacteria', 'germs'],\n        char: '🦠',\n      },\n      petri_dish: {\n        keywords: ['bacteria', 'biology', 'culture', 'lab'],\n        char: '🧫',\n      },\n      test_tube: {\n        keywords: ['chemistry', 'experiment', 'lab', 'science'],\n        char: '🧪',\n      },\n      thermometer: {\n        keywords: ['weather', 'temperature', 'hot', 'cold'],\n        char: '🌡',\n      },\n      broom: {\n        keywords: ['cleaning', 'sweeping', 'witch'],\n        char: '🧹',\n      },\n      basket: {\n        keywords: ['laundry'],\n        char: '🧺',\n      },\n      toilet_paper: {\n        keywords: ['roll'],\n        char: '🧻',\n      },\n      label: {\n        keywords: ['sale', 'tag'],\n        char: '🏷',\n      },\n      bookmark: {\n        keywords: ['favorite', 'label', 'save'],\n        char: '🔖',\n      },\n      toilet: {\n        keywords: ['restroom', 'wc', 'washroom', 'bathroom', 'potty'],\n        char: '🚽',\n      },\n      shower: {\n        keywords: ['clean', 'water', 'bathroom'],\n        char: '🚿',\n      },\n      bathtub: {\n        keywords: ['clean', 'shower', 'bathroom'],\n        char: '🛁',\n      },\n      soap: {\n        keywords: ['bar', 'bathing', 'cleaning', 'lather'],\n        char: '🧼',\n      },\n      sponge: {\n        keywords: ['absorbing', 'cleaning', 'porous'],\n        char: '🧽',\n      },\n      lotion_bottle: {\n        keywords: ['moisturizer', 'sunscreen'],\n        char: '🧴',\n      },\n      key: {\n        keywords: ['lock', 'door', 'password'],\n        char: '🔑',\n      },\n      old_key: {\n        keywords: ['lock', 'door', 'password'],\n        char: '🗝',\n      },\n      couch_and_lamp: {\n        keywords: ['read', 'chill'],\n        char: '🛋',\n      },\n      sleeping_bed: {\n        keywords: ['bed', 'rest'],\n        char: '🛌',\n        fitzpatrick_scale: true,\n      },\n      bed: {\n        keywords: ['sleep', 'rest'],\n        char: '🛏',\n      },\n      door: {\n        keywords: ['house', 'entry', 'exit'],\n        char: '🚪',\n      },\n      bellhop_bell: {\n        keywords: ['service'],\n        char: '🛎',\n      },\n      teddy_bear: {\n        keywords: ['plush', 'stuffed'],\n        char: '🧸',\n      },\n      framed_picture: {\n        keywords: ['photography'],\n        char: '🖼',\n      },\n      world_map: {\n        keywords: ['location', 'direction'],\n        char: '🗺',\n      },\n      parasol_on_ground: {\n        keywords: ['weather', 'summer'],\n        char: '⛱',\n      },\n      moyai: {\n        keywords: ['rock', 'easter island', 'moai'],\n        char: '🗿',\n      },\n      shopping: {\n        keywords: ['mall', 'buy', 'purchase'],\n        char: '🛍',\n      },\n      shopping_cart: {\n        keywords: ['trolley'],\n        char: '🛒',\n      },\n      balloon: {\n        keywords: ['party', 'celebration', 'birthday', 'circus'],\n        char: '🎈',\n      },\n      flags: {\n        keywords: ['fish', 'japanese', 'koinobori', 'carp', 'banner'],\n        char: '🎏',\n      },\n      ribbon: {\n        keywords: ['decoration', 'pink', 'girl', 'bowtie'],\n        char: '🎀',\n      },\n      gift: {\n        keywords: ['present', 'birthday', 'christmas', 'xmas'],\n        char: '🎁',\n      },\n      confetti_ball: {\n        keywords: ['festival', 'party', 'birthday', 'circus'],\n        char: '🎊',\n      },\n      tada: {\n        keywords: ['party', 'congratulations', 'birthday', 'magic', 'circus', 'celebration'],\n        char: '🎉',\n      },\n      dolls: {\n        keywords: ['japanese', 'toy', 'kimono'],\n        char: '🎎',\n      },\n      wind_chime: {\n        keywords: ['nature', 'ding', 'spring', 'bell'],\n        char: '🎐',\n      },\n      crossed_flags: {\n        keywords: ['japanese', 'nation', 'country', 'border'],\n        char: '🎌',\n      },\n      izakaya_lantern: {\n        keywords: ['light', 'paper', 'halloween', 'spooky'],\n        char: '🏮',\n      },\n      red_envelope: {\n        keywords: ['gift'],\n        char: '🧧',\n      },\n      email: {\n        keywords: ['letter', 'postal', 'inbox', 'communication'],\n        char: '✉️',\n      },\n      envelope_with_arrow: {\n        keywords: ['email', 'communication'],\n        char: '📩',\n      },\n      incoming_envelope: {\n        keywords: ['email', 'inbox'],\n        char: '📨',\n      },\n      'e-mail': {\n        keywords: ['communication', 'inbox'],\n        char: '📧',\n      },\n      love_letter: {\n        keywords: ['email', 'like', 'affection', 'envelope', 'valentines'],\n        char: '💌',\n      },\n      postbox: {\n        keywords: ['email', 'letter', 'envelope'],\n        char: '📮',\n      }\n};\n","export const emojisObjectsPart3: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      mailbox_closed: {\n        keywords: ['email', 'communication', 'inbox'],\n        char: '📪',\n      },\n      mailbox: {\n        keywords: ['email', 'inbox', 'communication'],\n        char: '📫',\n      },\n      mailbox_with_mail: {\n        keywords: ['email', 'inbox', 'communication'],\n        char: '📬',\n      },\n      mailbox_with_no_mail: {\n        keywords: ['email', 'inbox'],\n        char: '📭',\n      },\n      package: {\n        keywords: ['mail', 'gift', 'cardboard', 'box', 'moving'],\n        char: '📦',\n      },\n      postal_horn: {\n        keywords: ['instrument', 'music'],\n        char: '📯',\n      },\n      inbox_tray: {\n        keywords: ['email', 'documents'],\n        char: '📥',\n      },\n      outbox_tray: {\n        keywords: ['inbox', 'email'],\n        char: '📤',\n      },\n      scroll: {\n        keywords: ['documents', 'ancient', 'history', 'paper'],\n        char: '📜',\n      },\n      page_with_curl: {\n        keywords: ['documents', 'office', 'paper'],\n        char: '📃',\n      },\n      bookmark_tabs: {\n        keywords: ['favorite', 'save', 'order', 'tidy'],\n        char: '📑',\n      },\n      receipt: {\n        keywords: ['accounting', 'expenses'],\n        char: '🧾',\n      },\n      bar_chart: {\n        keywords: ['graph', 'presentation', 'stats'],\n        char: '📊',\n      },\n      chart_with_upwards_trend: {\n        keywords: [\n          'graph',\n          'presentation',\n          'stats',\n          'recovery',\n          'business',\n          'economics',\n          'money',\n          'sales',\n          'good',\n          'success',\n        ],\n        char: '📈',\n      },\n      chart_with_downwards_trend: {\n        keywords: [\n          'graph',\n          'presentation',\n          'stats',\n          'recession',\n          'business',\n          'economics',\n          'money',\n          'sales',\n          'bad',\n          'failure',\n        ],\n        char: '📉',\n      },\n      page_facing_up: {\n        keywords: ['documents', 'office', 'paper', 'information'],\n        char: '📄',\n      },\n      date: {\n        keywords: ['calendar', 'schedule'],\n        char: '📅',\n      },\n      calendar: {\n        keywords: ['schedule', 'date', 'planning'],\n        char: '📆',\n      },\n      spiral_calendar: {\n        keywords: ['date', 'schedule', 'planning'],\n        char: '🗓',\n      },\n      card_index: {\n        keywords: ['business', 'stationery'],\n        char: '📇',\n      },\n      card_file_box: {\n        keywords: ['business', 'stationery'],\n        char: '🗃',\n      },\n      ballot_box: {\n        keywords: ['election', 'vote'],\n        char: '🗳',\n      },\n      file_cabinet: {\n        keywords: ['filing', 'organizing'],\n        char: '🗄',\n      },\n      clipboard: {\n        keywords: ['stationery', 'documents'],\n        char: '📋',\n      },\n      spiral_notepad: {\n        keywords: ['memo', 'stationery'],\n        char: '🗒',\n      },\n      file_folder: {\n        keywords: ['documents', 'business', 'office'],\n        char: '📁',\n      },\n      open_file_folder: {\n        keywords: ['documents', 'load'],\n        char: '📂',\n      },\n      card_index_dividers: {\n        keywords: ['organizing', 'business', 'stationery'],\n        char: '🗂',\n      },\n      newspaper_roll: {\n        keywords: ['press', 'headline'],\n        char: '🗞',\n      },\n      newspaper: {\n        keywords: ['press', 'headline'],\n        char: '📰',\n      },\n      notebook: {\n        keywords: ['stationery', 'record', 'notes', 'paper', 'study'],\n        char: '📓',\n      },\n      closed_book: {\n        keywords: ['read', 'library', 'knowledge', 'textbook', 'learn'],\n        char: '📕',\n      },\n      green_book: {\n        keywords: ['read', 'library', 'knowledge', 'study'],\n        char: '📗',\n      },\n      blue_book: {\n        keywords: ['read', 'library', 'knowledge', 'learn', 'study'],\n        char: '📘',\n      },\n      orange_book: {\n        keywords: ['read', 'library', 'knowledge', 'textbook', 'study'],\n        char: '📙',\n      },\n      notebook_with_decorative_cover: {\n        keywords: ['classroom', 'notes', 'record', 'paper', 'study'],\n        char: '📔',\n      },\n      ledger: {\n        keywords: ['notes', 'paper'],\n        char: '📒',\n      },\n      books: {\n        keywords: ['literature', 'library', 'study'],\n        char: '📚',\n      },\n      open_book: {\n        keywords: ['book', 'read', 'library', 'knowledge', 'literature', 'learn', 'study'],\n        char: '📖',\n      },\n      safety_pin: {\n        keywords: ['diaper'],\n        char: '🧷',\n      },\n      link: {\n        keywords: ['rings', 'url'],\n        char: '🔗',\n      },\n      paperclip: {\n        keywords: ['documents', 'stationery'],\n        char: '📎',\n      },\n      paperclips: {\n        keywords: ['documents', 'stationery'],\n        char: '🖇',\n      },\n      scissors: {\n        keywords: ['stationery', 'cut'],\n        char: '✂️',\n      },\n      triangular_ruler: {\n        keywords: ['stationery', 'math', 'architect', 'sketch'],\n        char: '📐',\n      },\n      straight_ruler: {\n        keywords: [\n          'stationery',\n          'calculate',\n          'length',\n          'math',\n          'school',\n          'drawing',\n          'architect',\n          'sketch',\n        ],\n        char: '📏',\n      },\n      abacus: {\n        keywords: ['calculation'],\n        char: '🧮',\n      },\n      pushpin: {\n        keywords: ['stationery', 'mark', 'here'],\n        char: '📌',\n      },\n      round_pushpin: {\n        keywords: ['stationery', 'location', 'map', 'here'],\n        char: '📍',\n      },\n      triangular_flag_on_post: {\n        keywords: ['mark', 'milestone', 'place'],\n        char: '🚩',\n      },\n      white_flag: {\n        keywords: ['losing', 'loser', 'lost', 'surrender', 'give up', 'fail'],\n        char: '🏳',\n      },\n      black_flag: {\n        keywords: ['pirate'],\n        char: '🏴',\n      },\n      rainbow_flag: {\n        keywords: [\n          'flag',\n          'rainbow',\n          'pride',\n          'gay',\n          'lgbt',\n          'glbt',\n          'queer',\n          'homosexual',\n          'lesbian',\n          'bisexual',\n          'transgender',\n        ],\n        char: '🏳️‍🌈',\n      },\n      closed_lock_with_key: {\n        keywords: ['security', 'privacy'],\n        char: '🔐',\n      },\n      lock: {\n        keywords: ['security', 'password', 'padlock'],\n        char: '🔒',\n      },\n      unlock: {\n        keywords: ['privacy', 'security'],\n        char: '🔓',\n      },\n      lock_with_ink_pen: {\n        keywords: ['security', 'secret'],\n        char: '🔏',\n      },\n      pen: {\n        keywords: ['stationery', 'writing', 'write'],\n        char: '🖊',\n      },\n      fountain_pen: {\n        keywords: ['stationery', 'writing', 'write'],\n        char: '🖋',\n      },\n      black_nib: {\n        keywords: ['pen', 'stationery', 'writing', 'write'],\n        char: '✒️',\n      },\n      memo: {\n        keywords: [\n          'write',\n          'documents',\n          'stationery',\n          'pencil',\n          'paper',\n          'writing',\n          'legal',\n          'exam',\n          'quiz',\n          'test',\n          'study',\n          'compose',\n        ],\n        char: '📝',\n      },\n      pencil2: {\n        keywords: ['stationery', 'write', 'paper', 'writing', 'school', 'study'],\n        char: '✏️',\n      },\n      crayon: {\n        keywords: ['drawing', 'creativity'],\n        char: '🖍',\n      },\n      paintbrush: {\n        keywords: ['drawing', 'creativity', 'art'],\n        char: '🖌',\n      },\n      mag: {\n        keywords: ['search', 'zoom', 'find', 'detective'],\n        char: '🔍',\n      },\n      mag_right: {\n        keywords: ['search', 'zoom', 'find', 'detective'],\n        char: '🔎',\n      },\n};\n","import { emojisObjectsPart1 } from './emojis-objects-1';\nimport { emojisObjectsPart2 } from './emojis-objects-2';\nimport { emojisObjectsPart3 } from './emojis-objects-3';\n\nconst objectsIcon = 'assets/objects.svg';\n\nexport const emojisObjects = {\n  objects: {\n    id: 'objects',\n    name: 'emoji_objects',\n    symbol: objectsIcon,\n    emojis: {\n      ...emojisObjectsPart1,\n      ...emojisObjectsPart2,\n      ...emojisObjectsPart3,\n    }\n  }\n};\n","export const emojisSymbolsPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      heart: {\n        keywords: ['love', 'like', 'valentines'],\n        char: '❤️',\n      },\n      orange_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '🧡',\n      },\n      yellow_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💛',\n      },\n      green_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💚',\n      },\n      blue_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💙',\n      },\n      purple_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💜',\n      },\n      black_heart: {\n        keywords: ['evil'],\n        char: '🖤',\n      },\n      broken_heart: {\n        keywords: ['sad', 'sorry', 'break', 'heart', 'heartbreak'],\n        char: '💔',\n      },\n      heavy_heart_exclamation: {\n        keywords: ['decoration', 'love'],\n        char: '❣',\n      },\n      two_hearts: {\n        keywords: ['love', 'like', 'affection', 'valentines', 'heart'],\n        char: '💕',\n      },\n      revolving_hearts: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💞',\n      },\n      heartbeat: {\n        keywords: ['love', 'like', 'affection', 'valentines', 'pink', 'heart'],\n        char: '💓',\n      },\n      heartpulse: {\n        keywords: ['like', 'love', 'affection', 'valentines', 'pink'],\n        char: '💗',\n      },\n      sparkling_heart: {\n        keywords: ['love', 'like', 'affection', 'valentines'],\n        char: '💖',\n      },\n      cupid: {\n        keywords: ['love', 'like', 'heart', 'affection', 'valentines'],\n        char: '💘',\n      },\n      gift_heart: {\n        keywords: ['love', 'valentines'],\n        char: '💝',\n      },\n      heart_decoration: {\n        keywords: ['purple-square', 'love', 'like'],\n        char: '💟',\n      },\n      peace_symbol: {\n        keywords: ['hippie'],\n        char: '☮',\n      },\n      latin_cross: {\n        keywords: ['christianity'],\n        char: '✝',\n      },\n      star_and_crescent: {\n        keywords: ['islam'],\n        char: '☪',\n      },\n      om: {\n        keywords: ['hinduism', 'buddhism', 'sikhism', 'jainism'],\n        char: '🕉',\n      },\n      wheel_of_dharma: {\n        keywords: ['hinduism', 'buddhism', 'sikhism', 'jainism'],\n        char: '☸',\n      },\n      star_of_david: {\n        keywords: ['judaism'],\n        char: '✡',\n      },\n      six_pointed_star: {\n        keywords: ['purple-square', 'religion', 'jewish', 'hexagram'],\n        char: '🔯',\n      },\n      menorah: {\n        keywords: ['hanukkah', 'candles', 'jewish'],\n        char: '🕎',\n      },\n      yin_yang: {\n        keywords: ['balance'],\n        char: '☯',\n      },\n      orthodox_cross: {\n        keywords: ['suppedaneum', 'religion'],\n        char: '☦',\n      },\n      place_of_worship: {\n        keywords: ['religion', 'church', 'temple', 'prayer'],\n        char: '🛐',\n      },\n      ophiuchus: {\n        keywords: ['sign', 'purple-square', 'constellation', 'astrology'],\n        char: '⛎',\n      },\n      aries: {\n        keywords: ['sign', 'purple-square', 'zodiac', 'astrology'],\n        char: '♈',\n      },\n      taurus: {\n        keywords: ['purple-square', 'sign', 'zodiac', 'astrology'],\n        char: '♉',\n      },\n      gemini: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology'],\n        char: '♊',\n      },\n      cancer: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology'],\n        char: '♋',\n      },\n      leo: {\n        keywords: ['sign', 'purple-square', 'zodiac', 'astrology'],\n        char: '♌',\n      },\n      virgo: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology'],\n        char: '♍',\n      },\n      libra: {\n        keywords: ['sign', 'purple-square', 'zodiac', 'astrology'],\n        char: '♎',\n      },\n      scorpius: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology', 'scorpio'],\n        char: '♏',\n      },\n      sagittarius: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology'],\n        char: '♐',\n      },\n      capricorn: {\n        keywords: ['sign', 'zodiac', 'purple-square', 'astrology'],\n        char: '♑',\n      },\n      aquarius: {\n        keywords: ['sign', 'purple-square', 'zodiac', 'astrology'],\n        char: '♒',\n      },\n      pisces: {\n        keywords: ['purple-square', 'sign', 'zodiac', 'astrology'],\n        char: '♓',\n      },\n      id: {\n        keywords: ['purple-square', 'words'],\n        char: '🆔',\n      },\n      atom_symbol: {\n        keywords: ['science', 'physics', 'chemistry'],\n        char: '⚛',\n      },\n      u7a7a: {\n        keywords: ['kanji', 'japanese', 'chinese', 'empty', 'sky', 'blue-square'],\n        char: '🈳',\n      },\n      u5272: {\n        keywords: ['cut', 'divide', 'chinese', 'kanji', 'pink-square'],\n        char: '🈹',\n      },\n      radioactive: {\n        keywords: ['nuclear', 'danger'],\n        char: '☢',\n      },\n      biohazard: {\n        keywords: ['danger'],\n        char: '☣',\n      },\n      mobile_phone_off: {\n        keywords: ['mute', 'orange-square', 'silence', 'quiet'],\n        char: '📴',\n      },\n      vibration_mode: {\n        keywords: ['orange-square', 'phone'],\n        char: '📳',\n      },\n      u6709: {\n        keywords: ['orange-square', 'chinese', 'have', 'kanji'],\n        char: '🈶',\n      },\n      u7121: {\n        keywords: ['nothing', 'chinese', 'kanji', 'japanese', 'orange-square'],\n        char: '🈚',\n      },\n      u7533: {\n        keywords: ['chinese', 'japanese', 'kanji', 'orange-square'],\n        char: '🈸',\n      },\n      u55b6: {\n        keywords: ['japanese', 'opening hours', 'orange-square'],\n        char: '🈺',\n      },\n      u6708: {\n        keywords: ['chinese', 'month', 'moon', 'japanese', 'orange-square', 'kanji'],\n        char: '🈷️',\n      },\n      eight_pointed_black_star: {\n        keywords: ['orange-square', 'shape', 'polygon'],\n        char: '✴️',\n      },\n      vs: {\n        keywords: ['words', 'orange-square'],\n        char: '🆚',\n      },\n      accept: {\n        keywords: ['ok', 'good', 'chinese', 'kanji', 'agree', 'yes', 'orange-circle'],\n        char: '🉑',\n      },\n      white_flower: {\n        keywords: ['japanese', 'spring'],\n        char: '💮',\n      },\n      ideograph_advantage: {\n        keywords: ['chinese', 'kanji', 'obtain', 'get', 'circle'],\n        char: '🉐',\n      },\n      secret: {\n        keywords: ['privacy', 'chinese', 'sshh', 'kanji', 'red-circle'],\n        char: '㊙️',\n      },\n      congratulations: {\n        keywords: ['chinese', 'kanji', 'japanese', 'red-circle'],\n        char: '㊗️',\n      },\n      u5408: {\n        keywords: ['japanese', 'chinese', 'join', 'kanji', 'red-square'],\n        char: '🈴',\n      },\n      u6e80: {\n        keywords: ['full', 'chinese', 'japanese', 'red-square', 'kanji'],\n        char: '🈵',\n      },\n      u7981: {\n        keywords: [\n          'kanji',\n          'japanese',\n          'chinese',\n          'forbidden',\n          'limit',\n          'restricted',\n          'red-square',\n        ],\n        char: '🈲',\n      },\n      a: {\n        keywords: ['red-square', 'alphabet', 'letter'],\n        char: '🅰️',\n      },\n      b: {\n        keywords: ['red-square', 'alphabet', 'letter'],\n        char: '🅱️',\n      },\n      ab: {\n        keywords: ['red-square', 'alphabet'],\n        char: '🆎',\n      },\n      cl: {\n        keywords: ['alphabet', 'words', 'red-square'],\n        char: '🆑',\n      },\n      o2: {\n        keywords: ['alphabet', 'red-square', 'letter'],\n        char: '🅾️',\n      },\n      sos: {\n        keywords: ['help', 'red-square', 'words', 'emergency', '911'],\n        char: '🆘',\n      },\n      no_entry: {\n        keywords: ['limit', 'security', 'privacy', 'bad', 'denied', 'stop', 'circle'],\n        char: '⛔',\n      },\n      name_badge: {\n        keywords: ['fire', 'forbid'],\n        char: '📛',\n      },\n      no_entry_sign: {\n        keywords: ['forbid', 'stop', 'limit', 'denied', 'disallow', 'circle'],\n        char: '🚫',\n      },\n      x: {\n        keywords: ['no', 'delete', 'remove', 'cancel', 'red'],\n        char: '❌',\n      },\n      o: {\n        keywords: ['circle', 'round'],\n        char: '⭕',\n      },\n      stop_sign: {\n        keywords: ['stop'],\n        char: '🛑',\n      },\n      anger: {\n        keywords: ['angry', 'mad'],\n        char: '💢',\n      },\n      hotsprings: {\n        keywords: ['bath', 'warm', 'relax'],\n        char: '♨️',\n      },\n      no_pedestrians: {\n        keywords: ['rules', 'crossing', 'walking', 'circle'],\n        char: '🚷',\n      },\n      do_not_litter: {\n        keywords: ['trash', 'bin', 'garbage', 'circle'],\n        char: '🚯',\n      },\n      no_bicycles: {\n        keywords: ['cyclist', 'prohibited', 'circle'],\n        char: '🚳',\n      },\n      'non-potable_water': {\n        keywords: ['drink', 'faucet', 'tap', 'circle'],\n        char: '🚱',\n      },\n      underage: {\n        keywords: ['18', 'drink', 'pub', 'night', 'minor', 'circle'],\n        char: '🔞',\n      },\n      no_mobile_phones: {\n        keywords: ['iphone', 'mute', 'circle'],\n        char: '📵',\n      },\n      exclamation: {\n        keywords: [\n          'heavy_exclamation_mark',\n          'danger',\n          'surprise',\n          'punctuation',\n          'wow',\n          'warning',\n        ],\n        char: '❗',\n      },\n      grey_exclamation: {\n        keywords: ['surprise', 'punctuation', 'gray', 'wow', 'warning'],\n        char: '❕',\n      },\n      question: {\n        keywords: ['doubt', 'confused'],\n        char: '❓',\n      },\n      grey_question: {\n        keywords: ['doubts', 'gray', 'huh', 'confused'],\n        char: '❔',\n      },\n      bangbang: {\n        keywords: ['exclamation', 'surprise'],\n        char: '‼️',\n      },\n      interrobang: {\n        keywords: ['wat', 'punctuation', 'surprise'],\n        char: '⁉️',\n      },\n      '100': {\n        keywords: [\n          'score',\n          'perfect',\n          'numbers',\n          'century',\n          'exam',\n          'quiz',\n          'test',\n          'pass',\n          'hundred',\n        ],\n        char: '💯',\n      },\n      low_brightness: {\n        keywords: ['sun', 'afternoon', 'warm', 'summer'],\n        char: '🔅',\n      }\n};\n","export const emojisSymbolsPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      high_brightness: {\n        keywords: ['sun', 'light'],\n        char: '🔆',\n      },\n      trident: {\n        keywords: ['weapon', 'spear'],\n        char: '🔱',\n      },\n      fleur_de_lis: {\n        keywords: ['decorative', 'scout'],\n        char: '⚜',\n      },\n      part_alternation_mark: {\n        keywords: ['graph', 'presentation', 'stats', 'business', 'economics', 'bad'],\n        char: '〽️',\n      },\n      warning: {\n        keywords: ['exclamation', 'wip', 'alert', 'error', 'problem', 'issue'],\n        char: '⚠️',\n      },\n      children_crossing: {\n        keywords: ['school', 'warning', 'danger', 'sign', 'driving', 'yellow-diamond'],\n        char: '🚸',\n      },\n      beginner: {\n        keywords: ['badge', 'shield'],\n        char: '🔰',\n      },\n      recycle: {\n        keywords: ['arrow', 'environment', 'garbage', 'trash'],\n        char: '♻️',\n      },\n      u6307: {\n        keywords: ['chinese', 'point', 'green-square', 'kanji'],\n        char: '🈯',\n      },\n      chart: {\n        keywords: ['green-square', 'graph', 'presentation', 'stats'],\n        char: '💹',\n      },\n      sparkle: {\n        keywords: ['stars', 'green-square', 'awesome', 'good', 'fireworks'],\n        char: '❇️',\n      },\n      eight_spoked_asterisk: {\n        keywords: ['star', 'sparkle', 'green-square'],\n        char: '✳️',\n      },\n      negative_squared_cross_mark: {\n        keywords: ['x', 'green-square', 'no', 'deny'],\n        char: '❎',\n      },\n      white_check_mark: {\n        keywords: ['green-square', 'ok', 'agree', 'vote', 'election', 'answer', 'tick'],\n        char: '✅',\n      },\n      diamond_shape_with_a_dot_inside: {\n        keywords: ['jewel', 'blue', 'gem', 'crystal', 'fancy'],\n        char: '💠',\n      },\n      cyclone: {\n        keywords: [\n          'weather',\n          'swirl',\n          'blue',\n          'cloud',\n          'vortex',\n          'spiral',\n          'whirlpool',\n          'spin',\n          'tornado',\n          'hurricane',\n          'typhoon',\n        ],\n        char: '🌀',\n      },\n      loop: {\n        keywords: ['tape', 'cassette'],\n        char: '➿',\n      },\n      globe_with_meridians: {\n        keywords: ['earth', 'international', 'world', 'internet', 'interweb', 'i18n'],\n        char: '🌐',\n      },\n      m: {\n        keywords: ['alphabet', 'blue-circle', 'letter'],\n        char: 'Ⓜ️',\n      },\n      atm: {\n        keywords: ['money', 'sales', 'cash', 'blue-square', 'payment', 'bank'],\n        char: '🏧',\n      },\n      sa: {\n        keywords: ['japanese', 'blue-square', 'katakana'],\n        char: '🈂️',\n      },\n      passport_control: {\n        keywords: ['custom', 'blue-square'],\n        char: '🛂',\n      },\n      customs: {\n        keywords: ['passport', 'border', 'blue-square'],\n        char: '🛃',\n      },\n      baggage_claim: {\n        keywords: ['blue-square', 'airport', 'transport'],\n        char: '🛄',\n      },\n      left_luggage: {\n        keywords: ['blue-square', 'travel'],\n        char: '🛅',\n      },\n      wheelchair: {\n        keywords: ['blue-square', 'disabled', 'a11y', 'accessibility'],\n        char: '♿',\n      },\n      no_smoking: {\n        keywords: ['cigarette', 'blue-square', 'smell', 'smoke'],\n        char: '🚭',\n      },\n      wc: {\n        keywords: ['toilet', 'restroom', 'blue-square'],\n        char: '🚾',\n      },\n      parking: {\n        keywords: ['cars', 'blue-square', 'alphabet', 'letter'],\n        char: '🅿️',\n      },\n      potable_water: {\n        keywords: ['blue-square', 'liquid', 'restroom', 'cleaning', 'faucet'],\n        char: '🚰',\n      },\n      mens: {\n        keywords: ['toilet', 'restroom', 'wc', 'blue-square', 'gender', 'male'],\n        char: '🚹',\n      },\n      womens: {\n        keywords: ['purple-square', 'woman', 'female', 'toilet', 'loo', 'restroom', 'gender'],\n        char: '🚺',\n      },\n      baby_symbol: {\n        keywords: ['orange-square', 'child'],\n        char: '🚼',\n      },\n      restroom: {\n        keywords: ['blue-square', 'toilet', 'refresh', 'wc', 'gender'],\n        char: '🚻',\n      },\n      put_litter_in_its_place: {\n        keywords: ['blue-square', 'sign', 'human', 'info'],\n        char: '🚮',\n      },\n      cinema: {\n        keywords: ['blue-square', 'record', 'film', 'movie', 'curtain', 'stage', 'theater'],\n        char: '🎦',\n      },\n      signal_strength: {\n        keywords: [\n          'blue-square',\n          'reception',\n          'phone',\n          'internet',\n          'connection',\n          'wifi',\n          'bluetooth',\n          'bars',\n        ],\n        char: '📶',\n      },\n      koko: {\n        keywords: ['blue-square', 'here', 'katakana', 'japanese', 'destination'],\n        char: '🈁',\n      },\n      ng: {\n        keywords: ['blue-square', 'words', 'shape', 'icon'],\n        char: '🆖',\n      },\n      ok: {\n        keywords: ['good', 'agree', 'yes', 'blue-square'],\n        char: '🆗',\n      },\n      up: {\n        keywords: ['blue-square', 'above', 'high'],\n        char: '🆙',\n      },\n      cool: {\n        keywords: ['words', 'blue-square'],\n        char: '🆒',\n      },\n      new: {\n        keywords: ['blue-square', 'words', 'start'],\n        char: '🆕',\n      },\n      free: {\n        keywords: ['blue-square', 'words'],\n        char: '🆓',\n      },\n      zero: {\n        keywords: ['0', 'numbers', 'blue-square', 'null'],\n        char: '0️⃣',\n      },\n      one: {\n        keywords: ['blue-square', 'numbers', '1'],\n        char: '1️⃣',\n      },\n      two: {\n        keywords: ['numbers', '2', 'prime', 'blue-square'],\n        char: '2️⃣',\n      },\n      three: {\n        keywords: ['3', 'numbers', 'prime', 'blue-square'],\n        char: '3️⃣',\n      },\n      four: {\n        keywords: ['4', 'numbers', 'blue-square'],\n        char: '4️⃣',\n      },\n      five: {\n        keywords: ['5', 'numbers', 'blue-square', 'prime'],\n        char: '5️⃣',\n      },\n      six: {\n        keywords: ['6', 'numbers', 'blue-square'],\n        char: '6️⃣',\n      },\n      seven: {\n        keywords: ['7', 'numbers', 'blue-square', 'prime'],\n        char: '7️⃣',\n      },\n      eight: {\n        keywords: ['8', 'blue-square', 'numbers'],\n        char: '8️⃣',\n      },\n      nine: {\n        keywords: ['blue-square', 'numbers', '9'],\n        char: '9️⃣',\n      },\n      keycap_ten: {\n        keywords: ['numbers', '10', 'blue-square'],\n        char: '🔟',\n      },\n      asterisk: {\n        keywords: ['star', 'keycap'],\n        char: '*⃣',\n      },\n      '1234': {\n        keywords: ['numbers', 'blue-square'],\n        char: '🔢',\n      },\n      eject_button: {\n        keywords: ['blue-square'],\n        char: '⏏️',\n      },\n      arrow_forward: {\n        keywords: ['blue-square', 'right', 'direction', 'play'],\n        char: '▶️',\n      },\n      pause_button: {\n        keywords: ['pause', 'blue-square'],\n        char: '⏸',\n      },\n      next_track_button: {\n        keywords: ['forward', 'next', 'blue-square'],\n        char: '⏭',\n      },\n      stop_button: {\n        keywords: ['blue-square'],\n        char: '⏹',\n      },\n      record_button: {\n        keywords: ['blue-square'],\n        char: '⏺',\n      },\n      play_or_pause_button: {\n        keywords: ['blue-square', 'play', 'pause'],\n        char: '⏯',\n      },\n      previous_track_button: {\n        keywords: ['backward'],\n        char: '⏮',\n      },\n      fast_forward: {\n        keywords: ['blue-square', 'play', 'speed', 'continue'],\n        char: '⏩',\n      },\n      rewind: {\n        keywords: ['play', 'blue-square'],\n        char: '⏪',\n      },\n      twisted_rightwards_arrows: {\n        keywords: ['blue-square', 'shuffle', 'music', 'random'],\n        char: '🔀',\n      },\n      repeat: {\n        keywords: ['loop', 'record'],\n        char: '🔁',\n      },\n      repeat_one: {\n        keywords: ['blue-square', 'loop'],\n        char: '🔂',\n      },\n      arrow_backward: {\n        keywords: ['blue-square', 'left', 'direction'],\n        char: '◀️',\n      },\n      arrow_up_small: {\n        keywords: ['blue-square', 'triangle', 'direction', 'point', 'forward', 'top'],\n        char: '🔼',\n      },\n      arrow_down_small: {\n        keywords: ['blue-square', 'direction', 'bottom'],\n        char: '🔽',\n      },\n      arrow_double_up: {\n        keywords: ['blue-square', 'direction', 'top'],\n        char: '⏫',\n      },\n      arrow_double_down: {\n        keywords: ['blue-square', 'direction', 'bottom'],\n        char: '⏬',\n      },\n      arrow_right: {\n        keywords: ['blue-square', 'next'],\n        char: '➡️',\n      },\n      arrow_left: {\n        keywords: ['blue-square', 'previous', 'back'],\n        char: '⬅️',\n      },\n      arrow_up: {\n        keywords: ['blue-square', 'continue', 'top', 'direction'],\n        char: '⬆️',\n      },\n      arrow_down: {\n        keywords: ['blue-square', 'direction', 'bottom'],\n        char: '⬇️',\n      },\n      arrow_upper_right: {\n        keywords: ['blue-square', 'point', 'direction', 'diagonal', 'northeast'],\n        char: '↗️',\n      },\n      arrow_lower_right: {\n        keywords: ['blue-square', 'direction', 'diagonal', 'southeast'],\n        char: '↘️',\n      },\n      arrow_lower_left: {\n        keywords: ['blue-square', 'direction', 'diagonal', 'southwest'],\n        char: '↙️',\n      },\n      arrow_upper_left: {\n        keywords: ['blue-square', 'point', 'direction', 'diagonal', 'northwest'],\n        char: '↖️',\n      },\n      arrow_up_down: {\n        keywords: ['blue-square', 'direction', 'way', 'vertical'],\n        char: '↕️',\n      },\n      left_right_arrow: {\n        keywords: ['shape', 'direction', 'horizontal', 'sideways'],\n        char: '↔️',\n      },\n      arrows_counterclockwise: {\n        keywords: ['blue-square', 'sync', 'cycle'],\n        char: '🔄',\n      },\n      arrow_right_hook: {\n        keywords: ['blue-square', 'return', 'rotate', 'direction'],\n        char: '↪️',\n      },\n      leftwards_arrow_with_hook: {\n        keywords: ['back', 'return', 'blue-square', 'undo', 'enter'],\n        char: '↩️',\n      },\n      arrow_heading_up: {\n        keywords: ['blue-square', 'direction', 'top'],\n        char: '⤴️',\n      },\n      arrow_heading_down: {\n        keywords: ['blue-square', 'direction', 'bottom'],\n        char: '⤵️',\n      },\n      hash: {\n        keywords: ['symbol', 'blue-square', 'twitter'],\n        char: '#️⃣',\n      },\n      information_source: {\n        keywords: ['blue-square', 'alphabet', 'letter'],\n        char: 'ℹ️',\n      }\n};\n","export const emojisSymbolsPart3: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      abc: {\n        keywords: ['blue-square', 'alphabet'],\n        char: '🔤',\n      },\n      abcd: {\n        keywords: ['blue-square', 'alphabet'],\n        char: '🔡',\n      },\n      capital_abcd: {\n        keywords: ['alphabet', 'words', 'blue-square'],\n        char: '🔠',\n      },\n      symbols: {\n        keywords: [\n          'blue-square',\n          'music',\n          'note',\n          'ampersand',\n          'percent',\n          'glyphs',\n          'characters',\n        ],\n        char: '🔣',\n      },\n      musical_note: {\n        keywords: ['score', 'tone', 'sound'],\n        char: '🎵',\n      },\n      notes: {\n        keywords: ['music', 'score'],\n        char: '🎶',\n      },\n      wavy_dash: {\n        keywords: ['draw', 'line', 'moustache', 'mustache', 'squiggle', 'scribble'],\n        char: '〰️',\n      },\n      curly_loop: {\n        keywords: ['scribble', 'draw', 'shape', 'squiggle'],\n        char: '➰',\n      },\n      heavy_check_mark: {\n        keywords: ['ok', 'nike', 'answer', 'yes', 'tick'],\n        char: '✔️',\n      },\n      arrows_clockwise: {\n        keywords: ['sync', 'cycle', 'round', 'repeat'],\n        char: '🔃',\n      },\n      heavy_plus_sign: {\n        keywords: ['math', 'calculation', 'addition', 'more', 'increase'],\n        char: '➕',\n      },\n      heavy_minus_sign: {\n        keywords: ['math', 'calculation', 'subtract', 'less'],\n        char: '➖',\n      },\n      heavy_division_sign: {\n        keywords: ['divide', 'math', 'calculation'],\n        char: '➗',\n      },\n      heavy_multiplication_x: {\n        keywords: ['math', 'calculation'],\n        char: '✖️',\n      },\n      infinity: {\n        keywords: ['forever'],\n        char: '♾',\n      },\n      heavy_dollar_sign: {\n        keywords: ['money', 'sales', 'payment', 'currency', 'buck'],\n        char: '💲',\n      },\n      currency_exchange: {\n        keywords: ['money', 'sales', 'dollar', 'travel'],\n        char: '💱',\n      },\n      copyright: {\n        keywords: ['ip', 'license', 'circle', 'law', 'legal'],\n        char: '©️',\n      },\n      registered: {\n        keywords: ['alphabet', 'circle'],\n        char: '®️',\n      },\n      tm: {\n        keywords: ['trademark', 'brand', 'law', 'legal'],\n        char: '™️',\n      },\n      end: {\n        keywords: ['words', 'arrow'],\n        char: '🔚',\n      },\n      back: {\n        keywords: ['arrow', 'words', 'return'],\n        char: '🔙',\n      },\n      on: {\n        keywords: ['arrow', 'words'],\n        char: '🔛',\n      },\n      top: {\n        keywords: ['words', 'blue-square'],\n        char: '🔝',\n      },\n      soon: {\n        keywords: ['arrow', 'words'],\n        char: '🔜',\n      },\n      ballot_box_with_check: {\n        keywords: ['ok', 'agree', 'confirm', 'black-square', 'vote', 'election', 'yes', 'tick'],\n        char: '☑️',\n      },\n      radio_button: {\n        keywords: ['input', 'old', 'music', 'circle'],\n        char: '🔘',\n      },\n      white_circle: {\n        keywords: ['shape', 'round'],\n        char: '⚪',\n      },\n      black_circle: {\n        keywords: ['shape', 'button', 'round'],\n        char: '⚫',\n      },\n      red_circle: {\n        keywords: ['shape', 'error', 'danger'],\n        char: '🔴',\n      },\n      large_blue_circle: {\n        keywords: ['shape', 'icon', 'button'],\n        char: '🔵',\n      },\n      small_orange_diamond: {\n        keywords: ['shape', 'jewel', 'gem'],\n        char: '🔸',\n      },\n      small_blue_diamond: {\n        keywords: ['shape', 'jewel', 'gem'],\n        char: '🔹',\n      },\n      large_orange_diamond: {\n        keywords: ['shape', 'jewel', 'gem'],\n        char: '🔶',\n      },\n      large_blue_diamond: {\n        keywords: ['shape', 'jewel', 'gem'],\n        char: '🔷',\n      },\n      small_red_triangle: {\n        keywords: ['shape', 'direction', 'up', 'top'],\n        char: '🔺',\n      },\n      black_small_square: {\n        keywords: ['shape', 'icon'],\n        char: '▪️',\n      },\n      white_small_square: {\n        keywords: ['shape', 'icon'],\n        char: '▫️',\n      },\n      black_large_square: {\n        keywords: ['shape', 'icon', 'button'],\n        char: '⬛',\n      },\n      white_large_square: {\n        keywords: ['shape', 'icon', 'stone', 'button'],\n        char: '⬜',\n      },\n      small_red_triangle_down: {\n        keywords: ['shape', 'direction', 'bottom'],\n        char: '🔻',\n      },\n      black_medium_square: {\n        keywords: ['shape', 'button', 'icon'],\n        char: '◼️',\n      },\n      white_medium_square: {\n        keywords: ['shape', 'stone', 'icon'],\n        char: '◻️',\n      },\n      black_medium_small_square: {\n        keywords: ['icon', 'shape', 'button'],\n        char: '◾',\n      },\n      white_medium_small_square: {\n        keywords: ['shape', 'stone', 'icon', 'button'],\n        char: '◽',\n      },\n      black_square_button: {\n        keywords: ['shape', 'input', 'frame'],\n        char: '🔲',\n      },\n      white_square_button: {\n        keywords: ['shape', 'input'],\n        char: '🔳',\n      },\n      speaker: {\n        keywords: ['sound', 'volume', 'silence', 'broadcast'],\n        char: '🔈',\n      },\n      sound: {\n        keywords: ['volume', 'speaker', 'broadcast'],\n        char: '🔉',\n      },\n      loud_sound: {\n        keywords: ['volume', 'noise', 'noisy', 'speaker', 'broadcast'],\n        char: '🔊',\n      },\n      mute: {\n        keywords: ['sound', 'volume', 'silence', 'quiet'],\n        char: '🔇',\n      },\n      mega: {\n        keywords: ['sound', 'speaker', 'volume'],\n        char: '📣',\n      },\n      loudspeaker: {\n        keywords: ['volume', 'sound'],\n        char: '📢',\n      },\n      bell: {\n        keywords: ['sound', 'notification', 'christmas', 'xmas', 'chime'],\n        char: '🔔',\n      },\n      no_bell: {\n        keywords: ['sound', 'volume', 'mute', 'quiet', 'silent'],\n        char: '🔕',\n      },\n      black_joker: {\n        keywords: ['poker', 'cards', 'game', 'play', 'magic'],\n        char: '🃏',\n      },\n      mahjong: {\n        keywords: ['game', 'play', 'chinese', 'kanji'],\n        char: '🀄',\n      },\n      spades: {\n        keywords: ['poker', 'cards', 'suits', 'magic'],\n        char: '♠️',\n      },\n      clubs: {\n        keywords: ['poker', 'cards', 'magic', 'suits'],\n        char: '♣️',\n      },\n      hearts: {\n        keywords: ['poker', 'cards', 'magic', 'suits'],\n        char: '♥️',\n      },\n      diamonds: {\n        keywords: ['poker', 'cards', 'magic', 'suits'],\n        char: '♦️',\n      },\n      flower_playing_cards: {\n        keywords: ['game', 'sunset', 'red'],\n        char: '🎴',\n      },\n      thought_balloon: {\n        keywords: ['bubble', 'cloud', 'speech', 'thinking', 'dream'],\n        char: '💭',\n      },\n      right_anger_bubble: {\n        keywords: ['caption', 'speech', 'thinking', 'mad'],\n        char: '🗯',\n      },\n      speech_balloon: {\n        keywords: ['bubble', 'words', 'message', 'talk', 'chatting'],\n        char: '💬',\n      },\n      left_speech_bubble: {\n        keywords: ['words', 'message', 'talk', 'chatting'],\n        char: '🗨',\n      },\n      clock1: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕐',\n      },\n      clock2: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕑',\n      },\n      clock3: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕒',\n      },\n      clock4: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕓',\n      },\n      clock5: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕔',\n      },\n      clock6: {\n        keywords: ['time', 'late', 'early', 'schedule', 'dawn', 'dusk'],\n        char: '🕕',\n      },\n      clock7: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕖',\n      },\n      clock8: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕗',\n      },\n      clock9: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕘',\n      },\n      clock10: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕙',\n      },\n      clock11: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕚',\n      },\n      clock12: {\n        keywords: ['time', 'noon', 'midnight', 'midday', 'late', 'early', 'schedule'],\n        char: '🕛',\n      },\n      clock130: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕜',\n      },\n      clock230: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕝',\n      },\n      clock330: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕞',\n      },\n      clock430: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕟',\n      },\n      clock530: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕠',\n      },\n      clock630: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕡',\n      },\n      clock730: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕢',\n      },\n      clock830: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕣',\n      },\n      clock930: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕤',\n      },\n      clock1030: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕥',\n      },\n      clock1130: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕦',\n      },\n      clock1230: {\n        keywords: ['time', 'late', 'early', 'schedule'],\n        char: '🕧',\n      },\n};\n","import { emojisSymbolsPart1 } from './emojis-symbols-1';\nimport { emojisSymbolsPart2 } from './emojis-symbols-2';\nimport { emojisSymbolsPart3 } from './emojis-symbols-3';\n\nconst symbolsIcon = 'assets/symbols.svg';\n\nexport const emojisSymbols = {\n  symbols: {\n    id: 'symbols',\n    name: 'emoji_symbols',\n    symbol: symbolsIcon,\n    emojis: {\n      ...emojisSymbolsPart1,\n      ...emojisSymbolsPart2,\n      ...emojisSymbolsPart3,\n    }\n  }\n};\n","export const emojisFlagsPart1: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      afghanistan: {\n        keywords: ['af', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇫',\n      },\n      aland_islands: {\n        keywords: ['Åland', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇽',\n      },\n      albania: {\n        keywords: ['al', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇱',\n      },\n      algeria: {\n        keywords: ['dz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇩🇿',\n      },\n      american_samoa: {\n        keywords: ['american', 'ws', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇸',\n      },\n      andorra: {\n        keywords: ['ad', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇩',\n      },\n      angola: {\n        keywords: ['ao', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇴',\n      },\n      anguilla: {\n        keywords: ['ai', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇮',\n      },\n      antarctica: {\n        keywords: ['aq', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇶',\n      },\n      antigua_barbuda: {\n        keywords: ['antigua', 'barbuda', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇬',\n      },\n      argentina: {\n        keywords: ['ar', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇷',\n      },\n      armenia: {\n        keywords: ['am', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇲',\n      },\n      aruba: {\n        keywords: ['aw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇼',\n      },\n      australia: {\n        keywords: ['au', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇺',\n      },\n      austria: {\n        keywords: ['at', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇹',\n      },\n      azerbaijan: {\n        keywords: ['az', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇿',\n      },\n      bahamas: {\n        keywords: ['bs', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇸',\n      },\n      bahrain: {\n        keywords: ['bh', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇭',\n      },\n      bangladesh: {\n        keywords: ['bd', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇩',\n      },\n      barbados: {\n        keywords: ['bb', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇧',\n      },\n      belarus: {\n        keywords: ['by', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇾',\n      },\n      belgium: {\n        keywords: ['be', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇪',\n      },\n      belize: {\n        keywords: ['bz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇿',\n      },\n      benin: {\n        keywords: ['bj', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇯',\n      },\n      bermuda: {\n        keywords: ['bm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇲',\n      },\n      bhutan: {\n        keywords: ['bt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇹',\n      },\n      bolivia: {\n        keywords: ['bo', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇴',\n      },\n      caribbean_netherlands: {\n        keywords: ['bonaire', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇶',\n      },\n      bosnia_herzegovina: {\n        keywords: ['bosnia', 'herzegovina', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇦',\n      },\n      botswana: {\n        keywords: ['bw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇼',\n      },\n      brazil: {\n        keywords: ['br', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇷',\n      },\n      british_indian_ocean_territory: {\n        keywords: [\n          'british',\n          'indian',\n          'ocean',\n          'territory',\n          'flag',\n          'nation',\n          'country',\n          'banner',\n        ],\n        char: '🇮🇴',\n      },\n      british_virgin_islands: {\n        keywords: ['british', 'virgin', 'islands', 'bvi', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇬',\n      },\n      brunei: {\n        keywords: ['bn', 'darussalam', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇳',\n      },\n      bulgaria: {\n        keywords: ['bg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇬',\n      },\n      burkina_faso: {\n        keywords: ['burkina', 'faso', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇫',\n      },\n      burundi: {\n        keywords: ['bi', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇮',\n      },\n      cape_verde: {\n        keywords: ['cabo', 'verde', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇻',\n      },\n      cambodia: {\n        keywords: ['kh', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇭',\n      },\n      cameroon: {\n        keywords: ['cm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇲',\n      },\n      canada: {\n        keywords: ['ca', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇦',\n      },\n      canary_islands: {\n        keywords: ['canary', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇨',\n      },\n      cayman_islands: {\n        keywords: ['cayman', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇾',\n      },\n      central_african_republic: {\n        keywords: ['central', 'african', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇫',\n      },\n      chad: {\n        keywords: ['td', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇩',\n      },\n      chile: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇨🇱',\n      },\n      cn: {\n        keywords: ['china', 'chinese', 'prc', 'flag', 'country', 'nation', 'banner'],\n        char: '🇨🇳',\n      },\n      christmas_island: {\n        keywords: ['christmas', 'island', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇽',\n      },\n      cocos_islands: {\n        keywords: ['cocos', 'keeling', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇨',\n      },\n      colombia: {\n        keywords: ['co', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇴',\n      },\n      comoros: {\n        keywords: ['km', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇲',\n      },\n      congo_brazzaville: {\n        keywords: ['congo', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇬',\n      },\n      congo_kinshasa: {\n        keywords: ['congo', 'democratic', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇩',\n      },\n      cook_islands: {\n        keywords: ['cook', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇰',\n      },\n      costa_rica: {\n        keywords: ['costa', 'rica', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇷',\n      },\n      croatia: {\n        keywords: ['hr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇭🇷',\n      },\n      cuba: {\n        keywords: ['cu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇺',\n      },\n      curacao: {\n        keywords: ['curaçao', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇼',\n      },\n      cyprus: {\n        keywords: ['cy', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇾',\n      },\n      czech_republic: {\n        keywords: ['cz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇿',\n      },\n      denmark: {\n        keywords: ['dk', 'flag', 'nation', 'country', 'banner'],\n        char: '🇩🇰',\n      },\n      djibouti: {\n        keywords: ['dj', 'flag', 'nation', 'country', 'banner'],\n        char: '🇩🇯',\n      },\n      dominica: {\n        keywords: ['dm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇩🇲',\n      },\n      dominican_republic: {\n        keywords: ['dominican', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇩🇴',\n      },\n      ecuador: {\n        keywords: ['ec', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇨',\n      },\n      egypt: {\n        keywords: ['eg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇬',\n      },\n      el_salvador: {\n        keywords: ['el', 'salvador', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇻',\n      },\n      equatorial_guinea: {\n        keywords: ['equatorial', 'gn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇶',\n      },\n      eritrea: {\n        keywords: ['er', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇷',\n      },\n      estonia: {\n        keywords: ['ee', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇪',\n      },\n      ethiopia: {\n        keywords: ['et', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇹',\n      },\n      eu: {\n        keywords: ['european', 'union', 'flag', 'banner'],\n        char: '🇪🇺',\n      },\n      falkland_islands: {\n        keywords: ['falkland', 'islands', 'malvinas', 'flag', 'nation', 'country', 'banner'],\n        char: '🇫🇰',\n      },\n      faroe_islands: {\n        keywords: ['faroe', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇫🇴',\n      },\n      fiji: {\n        keywords: ['fj', 'flag', 'nation', 'country', 'banner'],\n        char: '🇫🇯',\n      },\n      finland: {\n        keywords: ['fi', 'flag', 'nation', 'country', 'banner'],\n        char: '🇫🇮',\n      },\n      fr: {\n        keywords: ['banner', 'flag', 'nation', 'france', 'french', 'country'],\n        char: '🇫🇷',\n      },\n      french_guiana: {\n        keywords: ['french', 'guiana', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇫',\n      },\n      french_polynesia: {\n        keywords: ['french', 'polynesia', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇫',\n      },\n      french_southern_territories: {\n        keywords: ['french', 'southern', 'territories', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇫',\n      },\n      gabon: {\n        keywords: ['ga', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇦',\n      },\n      gambia: {\n        keywords: ['gm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇲',\n      },\n      georgia: {\n        keywords: ['ge', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇪',\n      },\n      de: {\n        keywords: ['german', 'nation', 'flag', 'country', 'banner'],\n        char: '🇩🇪',\n      }\n};\n","export const emojisFlagsPart2: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      ghana: {\n        keywords: ['gh', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇭',\n      },\n      gibraltar: {\n        keywords: ['gi', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇮',\n      },\n      greece: {\n        keywords: ['gr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇷',\n      },\n      greenland: {\n        keywords: ['gl', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇱',\n      },\n      grenada: {\n        keywords: ['gd', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇩',\n      },\n      guadeloupe: {\n        keywords: ['gp', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇵',\n      },\n      guam: {\n        keywords: ['gu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇺',\n      },\n      guatemala: {\n        keywords: ['gt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇹',\n      },\n      guernsey: {\n        keywords: ['gg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇬',\n      },\n      guinea: {\n        keywords: ['gn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇳',\n      },\n      guinea_bissau: {\n        keywords: ['gw', 'bissau', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇼',\n      },\n      guyana: {\n        keywords: ['gy', 'flag', 'nation', 'country', 'banner'],\n        char: '🇬🇾',\n      },\n      haiti: {\n        keywords: ['ht', 'flag', 'nation', 'country', 'banner'],\n        char: '🇭🇹',\n      },\n      honduras: {\n        keywords: ['hn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇭🇳',\n      },\n      hong_kong: {\n        keywords: ['hong', 'kong', 'flag', 'nation', 'country', 'banner'],\n        char: '🇭🇰',\n      },\n      hungary: {\n        keywords: ['hu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇭🇺',\n      },\n      iceland: {\n        keywords: ['is', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇸',\n      },\n      india: {\n        keywords: ['in', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇳',\n      },\n      indonesia: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇮🇩',\n      },\n      iran: {\n        keywords: ['iran,', 'islamic', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇷',\n      },\n      iraq: {\n        keywords: ['iq', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇶',\n      },\n      ireland: {\n        keywords: ['ie', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇪',\n      },\n      isle_of_man: {\n        keywords: ['isle', 'man', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇲',\n      },\n      israel: {\n        keywords: ['il', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇱',\n      },\n      it: {\n        keywords: ['italy', 'flag', 'nation', 'country', 'banner'],\n        char: '🇮🇹',\n      },\n      cote_divoire: {\n        keywords: ['ivory', 'coast', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇮',\n      },\n      jamaica: {\n        keywords: ['jm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇯🇲',\n      },\n      jp: {\n        keywords: ['japanese', 'nation', 'flag', 'country', 'banner'],\n        char: '🇯🇵',\n      },\n      jersey: {\n        keywords: ['je', 'flag', 'nation', 'country', 'banner'],\n        char: '🇯🇪',\n      },\n      jordan: {\n        keywords: ['jo', 'flag', 'nation', 'country', 'banner'],\n        char: '🇯🇴',\n      },\n      kazakhstan: {\n        keywords: ['kz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇿',\n      },\n      kenya: {\n        keywords: ['ke', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇪',\n      },\n      kiribati: {\n        keywords: ['ki', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇮',\n      },\n      kosovo: {\n        keywords: ['xk', 'flag', 'nation', 'country', 'banner'],\n        char: '🇽🇰',\n      },\n      kuwait: {\n        keywords: ['kw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇼',\n      },\n      kyrgyzstan: {\n        keywords: ['kg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇬',\n      },\n      laos: {\n        keywords: ['lao', 'democratic', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇦',\n      },\n      latvia: {\n        keywords: ['lv', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇻',\n      },\n      lebanon: {\n        keywords: ['lb', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇧',\n      },\n      lesotho: {\n        keywords: ['ls', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇸',\n      },\n      liberia: {\n        keywords: ['lr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇷',\n      },\n      libya: {\n        keywords: ['ly', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇾',\n      },\n      liechtenstein: {\n        keywords: ['li', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇮',\n      },\n      lithuania: {\n        keywords: ['lt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇹',\n      },\n      luxembourg: {\n        keywords: ['lu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇺',\n      },\n      macau: {\n        keywords: ['macao', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇴',\n      },\n      macedonia: {\n        keywords: ['macedonia,', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇰',\n      },\n      madagascar: {\n        keywords: ['mg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇬',\n      },\n      malawi: {\n        keywords: ['mw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇼',\n      },\n      malaysia: {\n        keywords: ['my', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇾',\n      },\n      maldives: {\n        keywords: ['mv', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇻',\n      },\n      mali: {\n        keywords: ['ml', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇱',\n      },\n      malta: {\n        keywords: ['mt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇹',\n      },\n      marshall_islands: {\n        keywords: ['marshall', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇭',\n      },\n      martinique: {\n        keywords: ['mq', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇶',\n      },\n      mauritania: {\n        keywords: ['mr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇷',\n      },\n      mauritius: {\n        keywords: ['mu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇺',\n      },\n      mayotte: {\n        keywords: ['yt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇾🇹',\n      },\n      mexico: {\n        keywords: ['mx', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇽',\n      },\n      micronesia: {\n        keywords: ['micronesia,', 'federated', 'states', 'flag', 'nation', 'country', 'banner'],\n        char: '🇫🇲',\n      },\n      moldova: {\n        keywords: ['moldova,', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇩',\n      },\n      monaco: {\n        keywords: ['mc', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇨',\n      },\n      mongolia: {\n        keywords: ['mn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇳',\n      },\n      montenegro: {\n        keywords: ['me', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇪',\n      },\n      montserrat: {\n        keywords: ['ms', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇸',\n      },\n      morocco: {\n        keywords: ['ma', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇦',\n      },\n      mozambique: {\n        keywords: ['mz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇿',\n      },\n      myanmar: {\n        keywords: ['mm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇲',\n      },\n      namibia: {\n        keywords: ['na', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇦',\n      },\n      nauru: {\n        keywords: ['nr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇷',\n      },\n      nepal: {\n        keywords: ['np', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇵',\n      },\n      netherlands: {\n        keywords: ['nl', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇱',\n      },\n      new_caledonia: {\n        keywords: ['new', 'caledonia', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇨',\n      },\n      new_zealand: {\n        keywords: ['new', 'zealand', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇿',\n      },\n      nicaragua: {\n        keywords: ['ni', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇮',\n      },\n      niger: {\n        keywords: ['ne', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇪',\n      },\n      nigeria: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇳🇬',\n      },\n      niue: {\n        keywords: ['nu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇺',\n      },\n      norfolk_island: {\n        keywords: ['norfolk', 'island', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇫',\n      },\n      northern_mariana_islands: {\n        keywords: ['northern', 'mariana', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇲🇵',\n      },\n      north_korea: {\n        keywords: ['north', 'korea', 'nation', 'flag', 'country', 'banner'],\n        char: '🇰🇵',\n      },\n      norway: {\n        keywords: ['no', 'flag', 'nation', 'country', 'banner'],\n        char: '🇳🇴',\n      },\n      oman: {\n        keywords: ['om_symbol', 'flag', 'nation', 'country', 'banner'],\n        char: '🇴🇲',\n      },\n      pakistan: {\n        keywords: ['pk', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇰',\n      }\n};\n","export const emojisFlagsPart3: Record<string, { keywords: string[]; char: string; fitzpatrick_scale?: boolean }> = {\n      palau: {\n        keywords: ['pw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇼',\n      },\n      palestinian_territories: {\n        keywords: [\n          'palestine',\n          'palestinian',\n          'territories',\n          'flag',\n          'nation',\n          'country',\n          'banner',\n        ],\n        char: '🇵🇸',\n      },\n      panama: {\n        keywords: ['pa', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇦',\n      },\n      papua_new_guinea: {\n        keywords: ['papua', 'new', 'guinea', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇬',\n      },\n      paraguay: {\n        keywords: ['py', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇾',\n      },\n      peru: {\n        keywords: ['pe', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇪',\n      },\n      philippines: {\n        keywords: ['ph', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇭',\n      },\n      pitcairn_islands: {\n        keywords: ['pitcairn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇳',\n      },\n      poland: {\n        keywords: ['pl', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇱',\n      },\n      portugal: {\n        keywords: ['pt', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇹',\n      },\n      puerto_rico: {\n        keywords: ['puerto', 'rico', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇷',\n      },\n      qatar: {\n        keywords: ['qa', 'flag', 'nation', 'country', 'banner'],\n        char: '🇶🇦',\n      },\n      reunion: {\n        keywords: ['réunion', 'flag', 'nation', 'country', 'banner'],\n        char: '🇷🇪',\n      },\n      romania: {\n        keywords: ['ro', 'flag', 'nation', 'country', 'banner'],\n        char: '🇷🇴',\n      },\n      ru: {\n        keywords: ['russian', 'federation', 'flag', 'nation', 'country', 'banner'],\n        char: '🇷🇺',\n      },\n      rwanda: {\n        keywords: ['rw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇷🇼',\n      },\n      st_barthelemy: {\n        keywords: ['saint', 'barthélemy', 'flag', 'nation', 'country', 'banner'],\n        char: '🇧🇱',\n      },\n      st_helena: {\n        keywords: [\n          'saint',\n          'helena',\n          'ascension',\n          'tristan',\n          'cunha',\n          'flag',\n          'nation',\n          'country',\n          'banner',\n        ],\n        char: '🇸🇭',\n      },\n      st_kitts_nevis: {\n        keywords: ['saint', 'kitts', 'nevis', 'flag', 'nation', 'country', 'banner'],\n        char: '🇰🇳',\n      },\n      st_lucia: {\n        keywords: ['saint', 'lucia', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇨',\n      },\n      st_pierre_miquelon: {\n        keywords: ['saint', 'pierre', 'miquelon', 'flag', 'nation', 'country', 'banner'],\n        char: '🇵🇲',\n      },\n      st_vincent_grenadines: {\n        keywords: ['saint', 'vincent', 'grenadines', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇨',\n      },\n      samoa: {\n        keywords: ['ws', 'flag', 'nation', 'country', 'banner'],\n        char: '🇼🇸',\n      },\n      san_marino: {\n        keywords: ['san', 'marino', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇲',\n      },\n      sao_tome_principe: {\n        keywords: ['sao', 'tome', 'principe', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇹',\n      },\n      saudi_arabia: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇸🇦',\n      },\n      senegal: {\n        keywords: ['sn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇳',\n      },\n      serbia: {\n        keywords: ['rs', 'flag', 'nation', 'country', 'banner'],\n        char: '🇷🇸',\n      },\n      seychelles: {\n        keywords: ['sc', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇨',\n      },\n      sierra_leone: {\n        keywords: ['sierra', 'leone', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇱',\n      },\n      singapore: {\n        keywords: ['sg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇬',\n      },\n      sint_maarten: {\n        keywords: ['sint', 'maarten', 'dutch', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇽',\n      },\n      slovakia: {\n        keywords: ['sk', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇰',\n      },\n      slovenia: {\n        keywords: ['si', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇮',\n      },\n      solomon_islands: {\n        keywords: ['solomon', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇧',\n      },\n      somalia: {\n        keywords: ['so', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇴',\n      },\n      south_africa: {\n        keywords: ['south', 'africa', 'flag', 'nation', 'country', 'banner'],\n        char: '🇿🇦',\n      },\n      south_georgia_south_sandwich_islands: {\n        keywords: [\n          'south',\n          'georgia',\n          'sandwich',\n          'islands',\n          'flag',\n          'nation',\n          'country',\n          'banner',\n        ],\n        char: '🇬🇸',\n      },\n      kr: {\n        keywords: ['south', 'korea', 'nation', 'flag', 'country', 'banner'],\n        char: '🇰🇷',\n      },\n      south_sudan: {\n        keywords: ['south', 'sd', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇸',\n      },\n      es: {\n        keywords: ['spain', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇸',\n      },\n      sri_lanka: {\n        keywords: ['sri', 'lanka', 'flag', 'nation', 'country', 'banner'],\n        char: '🇱🇰',\n      },\n      sudan: {\n        keywords: ['sd', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇩',\n      },\n      suriname: {\n        keywords: ['sr', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇷',\n      },\n      swaziland: {\n        keywords: ['sz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇿',\n      },\n      sweden: {\n        keywords: ['se', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇪',\n      },\n      switzerland: {\n        keywords: ['ch', 'flag', 'nation', 'country', 'banner'],\n        char: '🇨🇭',\n      },\n      syria: {\n        keywords: ['syrian', 'arab', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇸🇾',\n      },\n      taiwan: {\n        keywords: ['tw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇼',\n      },\n      tajikistan: {\n        keywords: ['tj', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇯',\n      },\n      tanzania: {\n        keywords: ['tanzania,', 'united', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇿',\n      },\n      thailand: {\n        keywords: ['th', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇭',\n      },\n      timor_leste: {\n        keywords: ['timor', 'leste', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇱',\n      },\n      togo: {\n        keywords: ['tg', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇬',\n      },\n      tokelau: {\n        keywords: ['tk', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇰',\n      },\n      tonga: {\n        keywords: ['to', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇴',\n      },\n      trinidad_tobago: {\n        keywords: ['trinidad', 'tobago', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇹',\n      },\n      tunisia: {\n        keywords: ['tn', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇳',\n      },\n      tr: {\n        keywords: ['turkey', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇷',\n      },\n      turkmenistan: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇹🇲',\n      },\n      turks_caicos_islands: {\n        keywords: ['turks', 'caicos', 'islands', 'flag', 'nation', 'country', 'banner'],\n        char: '🇹🇨',\n      },\n      tuvalu: {\n        keywords: ['flag', 'nation', 'country', 'banner'],\n        char: '🇹🇻',\n      },\n      uganda: {\n        keywords: ['ug', 'flag', 'nation', 'country', 'banner'],\n        char: '🇺🇬',\n      },\n      ukraine: {\n        keywords: ['ua', 'flag', 'nation', 'country', 'banner'],\n        char: '🇺🇦',\n      },\n      united_arab_emirates: {\n        keywords: ['united', 'arab', 'emirates', 'flag', 'nation', 'country', 'banner'],\n        char: '🇦🇪',\n      },\n      uk: {\n        keywords: [\n          'united',\n          'kingdom',\n          'great',\n          'britain',\n          'northern',\n          'ireland',\n          'flag',\n          'nation',\n          'country',\n          'banner',\n          'british',\n          'UK',\n          'english',\n          'england',\n          'union jack',\n        ],\n        char: '🇬🇧',\n      },\n      england: {\n        keywords: ['flag', 'english'],\n        char: '🏴󠁧󠁢󠁥󠁮󠁧󠁿',\n      },\n      scotland: {\n        keywords: ['flag', 'scottish'],\n        char: '🏴󠁧󠁢󠁳󠁣󠁴󠁿',\n      },\n      wales: {\n        keywords: ['flag', 'welsh'],\n        char: '🏴󠁧󠁢󠁷󠁬󠁳󠁿',\n      },\n      us: {\n        keywords: ['united', 'states', 'america', 'flag', 'nation', 'country', 'banner'],\n        char: '🇺🇸',\n      },\n      us_virgin_islands: {\n        keywords: ['virgin', 'islands', 'us', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇮',\n      },\n      uruguay: {\n        keywords: ['uy', 'flag', 'nation', 'country', 'banner'],\n        char: '🇺🇾',\n      },\n      uzbekistan: {\n        keywords: ['uz', 'flag', 'nation', 'country', 'banner'],\n        char: '🇺🇿',\n      },\n      vanuatu: {\n        keywords: ['vu', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇺',\n      },\n      vatican_city: {\n        keywords: ['vatican', 'city', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇦',\n      },\n      venezuela: {\n        keywords: ['ve', 'bolivarian', 'republic', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇪',\n      },\n      vietnam: {\n        keywords: ['viet', 'nam', 'flag', 'nation', 'country', 'banner'],\n        char: '🇻🇳',\n      },\n      wallis_futuna: {\n        keywords: ['wallis', 'futuna', 'flag', 'nation', 'country', 'banner'],\n        char: '🇼🇫',\n      },\n      western_sahara: {\n        keywords: ['western', 'sahara', 'flag', 'nation', 'country', 'banner'],\n        char: '🇪🇭',\n      },\n      yemen: {\n        keywords: ['ye', 'flag', 'nation', 'country', 'banner'],\n        char: '🇾🇪',\n      },\n      zambia: {\n        keywords: ['zm', 'flag', 'nation', 'country', 'banner'],\n        char: '🇿🇲',\n      },\n      zimbabwe: {\n        keywords: ['zw', 'flag', 'nation', 'country', 'banner'],\n        char: '🇿🇼',\n      },\n      united_nations: {\n        keywords: ['un', 'flag', 'banner'],\n        char: '🇺🇳',\n      },\n      pirate_flag: {\n        keywords: ['skull', 'crossbones', 'flag', 'banner'],\n        char: '🏴‍☠️',\n      },\n};\n","import { emojisFlagsPart1 } from './emojis-flags-1';\nimport { emojisFlagsPart2 } from './emojis-flags-2';\nimport { emojisFlagsPart3 } from './emojis-flags-3';\n\nconst flagsIcon = 'assets/flags.svg';\n\nexport const emojisFlags = {\n  flags: {\n    id: 'flags',\n    name: 'emoji_flags',\n    symbol: flagsIcon,\n    emojis: {\n      ...emojisFlagsPart1,\n      ...emojisFlagsPart2,\n      ...emojisFlagsPart3,\n    }\n  }\n};\n","import { emojisPeople } from './emojis-people';\nimport { emojisAnimals } from './emojis-animals';\nimport { emojisFood } from './emojis-food';\nimport { emojisActivity } from './emojis-activity';\nimport { emojisTravel } from './emojis-travel';\nimport { emojisObjects } from './emojis-objects';\nimport { emojisSymbols } from './emojis-symbols';\nimport { emojisFlags } from './emojis-flags';\n\nexport const Emojis = [\n  emojisPeople,\n  emojisAnimals,\n  emojisFood,\n  emojisActivity,\n  emojisTravel,\n  emojisObjects,\n  emojisSymbols,\n  emojisFlags,\n];\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ViewChild,\n  ElementRef,\n  OnInit,\n  AfterViewInit,\n  OnDestroy,\n  HostListener,\n  QueryList,\n  ViewChildren,\n  NgZone,\n  inject, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatSearchBarComponent } from '../cometchat-search-bar/cometchat-search-bar.component';\nimport { getLocalizedString } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatEmoji, CometChatEmojiCategory } from '../../../modals/CometChatEmoji';\nimport { Emojis } from './emojis';\nimport { GridNavigationService } from '../../../services/grid-navigation.service';\nimport { FocusTrapService } from '../../../services/focus-trap.service';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\n\n@Component({\n  selector: 'cometchat-emoji-keyboard',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatSearchBarComponent],\n  templateUrl: './cometchat-emoji-keyboard.component.html',\n  styleUrls: ['./cometchat-emoji-keyboard.component.css'],\n})\nexport class CometChatEmojiKeyboardComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  /** Array of emoji categories to display */\n  @Input() emojiData: CometChatEmojiCategory[] = [];\n\n  /** Custom ARIA label for the emoji picker dialog */\n  @Input() ariaLabel = '';\n\n  /** Whether to automatically focus the first tab on open */\n  @Input() autoFocus = true;\n\n  /** Whether to trap focus within the emoji keyboard */\n  @Input() trapFocus = true;\n\n  /** Emitted when an emoji is clicked - emits emoji char */\n  @Output() emojiClick = new EventEmitter<string>();\n\n  /** Emitted when Escape key is pressed to close the picker */\n  @Output() closeKeyboard = new EventEmitter<void>();\n\n  @ViewChild('scrollRef') scrollRef!: ElementRef<HTMLDivElement>;\n  @ViewChild('emojiListRef') emojiListRef!: ElementRef<HTMLDivElement>;\n  @ViewChildren('emojiItem') emojiItems!: QueryList<ElementRef<HTMLDivElement>>;\n\n  // Inject accessibility services\n  private gridNavigationService = inject(GridNavigationService);\n  private focusTrapService = inject(FocusTrapService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private elementRef = inject(ElementRef);\n\n  // Internal state\n  emojiDataState: CometChatEmojiCategory[] = [];\n  activeCategory = '';\n  searchString = '';\n  searchEmojiData: Record<string, CometChatEmoji> = {};\n  focusedEmojiIndex = 0;\n  focusedTabIndex = 0;\n  focusedEmojiRow = 0;\n  focusedEmojiCol = 0;\n  gridColumns = 8; // Approximate columns in emoji grid\n  private focusableElements: HTMLElement[] = [];\n  private scrollListener: (() => void) | null = null;\n  /** Whether the scroll was triggered programmatically by a category tab click */\n  private isProgrammaticScroll = false;\n\n  constructor(private ngZone: NgZone) {}\n\n  ngOnInit(): void {\n    this.loadEmojiCategories();\n  }\n\n  ngAfterViewInit(): void {\n    // Attach scroll listener to the emoji list container for category tracking\n    this.attachScrollListener();\n\n    // Activate focus trap using FocusTrapService\n    if (this.trapFocus) {\n      this.pendingTimers.push(setTimeout(() => {\n        this.focusTrapService.activate({\n          container: this.elementRef.nativeElement,\n          initialFocus: 'first',\n          returnFocusOnDeactivate: true,\n        });\n      }, 0));\n    } else if (this.autoFocus) {\n      // Auto-focus first tab if enabled but focus trap is disabled\n      this.pendingTimers.push(setTimeout(() => {\n        const firstTab = this.elementRef.nativeElement.querySelector(\n          '.cometchat-emoji-keyboard__tab'\n        ) as HTMLElement;\n        firstTab?.focus();\n      }, 100));\n    }\n  }\n\n  /**\n   * Load default emoji data if not provided via emojiData input\n   */\n  loadEmojiCategories(): void {\n    if (this.emojiData && this.emojiData.length > 0) {\n      this.emojiDataState = this.emojiData;\n    } else {\n      // Load default emoji data from emojis.ts\n      this.emojiDataState = Emojis.map(el => {\n        const vals = Object.values(el)[0];\n        return {\n          id: vals.id,\n          name: vals.name,\n          symbolURL: vals.symbol,\n          emojies: vals.emojis,\n        } as CometChatEmojiCategory;\n      });\n    }\n\n    // Set activeCategory early (before first CD check) to avoid NG0100\n    if (this.emojiDataState.length > 0 && !this.activeCategory) {\n      this.activeCategory = this.emojiDataState[0].id;\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.detachScrollListener();\n    // Deactivate focus trap\n    if (this.trapFocus) {\n      this.focusTrapService.deactivate(this.elementRef.nativeElement);\n    }\n  }\n\n  /** Attach a scroll event listener to the emoji list container. */\n  private attachScrollListener(): void {\n    const listEl = this.emojiListRef?.nativeElement;\n    if (!listEl) return;\n\n    this.ngZone.runOutsideAngular(() => {\n      this.scrollListener = () => this.onEmojiListScroll();\n      listEl.addEventListener('scroll', this.scrollListener, { passive: true });\n    });\n  }\n\n  /** Detach the scroll event listener from the emoji list container. */\n  private detachScrollListener(): void {\n    if (this.scrollListener && this.emojiListRef?.nativeElement) {\n      this.emojiListRef.nativeElement.removeEventListener('scroll', this.scrollListener);\n      this.scrollListener = null;\n    }\n  }\n\n  /** Handle scroll events on the emoji list container. Updates activeCategory based on scroll position. */\n  private onEmojiListScroll(): void {\n    if (this.isProgrammaticScroll || this.searchString) return;\n\n    const listEl = this.emojiListRef?.nativeElement;\n    if (!listEl || this.emojiDataState.length === 0) return;\n\n    const containerTop = listEl.getBoundingClientRect().top;\n    let activeCategoryId = this.emojiDataState[0].id;\n\n    for (const category of this.emojiDataState) {\n      const headerEl = listEl.querySelector(`#${CSS.escape(category.id)}`) as HTMLElement;\n      if (!headerEl) continue;\n      if (headerEl.getBoundingClientRect().top - containerTop <= 10) {\n        activeCategoryId = category.id;\n      }\n    }\n\n    if (activeCategoryId !== this.activeCategory) {\n      this.ngZone.run(() => { this.activeCategory = activeCategoryId; });\n    }\n  }\n\n  /** Handle category tab click - scroll to that category section. */\n  onCategoryClick(categoryId: string): void { this.scrollToElement(categoryId); }\n\n  /** Handle emoji click - emit the emoji character. */\n  handleEmojiClick(emoji: CometChatEmoji): void { this.emojiClick.emit(emoji.char); }\n\n  /**\n   * Filter emojis based on search text by matching against each emoji's keywords array (case-insensitive).\n   * When search is cleared, restores the full emoji category list view.\n   * Announces result count via LiveAnnouncerService for screen readers.\n   */\n  filterEmojis(input: { value?: string }): void {\n    const searchText = input.value || '';\n    this.searchString = searchText;\n\n    if (!searchText) {\n      this.searchEmojiData = {};\n      return;\n    }\n\n    const lowerSearch = searchText.toLowerCase();\n    const filtered: Record<string, CometChatEmoji> = {};\n    this.emojiDataState.forEach(category => {\n      Object.entries(category.emojies).forEach(([name, emoji]) => {\n        const keywords = emoji.keywords;\n        if (keywords && keywords.some(kw => kw.toLowerCase().includes(lowerSearch))) {\n          filtered[name] = emoji;\n        }\n      });\n    });\n    this.searchEmojiData = filtered;\n\n    // Announce search results count for screen readers\n    const count = Object.keys(filtered).length;\n    if (count > 0) {\n      const message = getLocalizedString('accessibility_emoji_results').replace(\n        '{count}',\n        count.toString()\n      );\n      this.liveAnnouncer.announce(message, 'polite');\n      // Reset focus to first emoji in search results\n      this.focusedEmojiIndex = 0;\n    } else {\n      this.liveAnnouncer.announce(getLocalizedString('accessibility_emoji_no_results'), 'polite');\n    }\n  }\n\n  /** Scroll to a specific category section. */\n  scrollToElement(categoryId: string): void {\n    this.activeCategory = categoryId;\n    this.searchString = '';\n    this.searchEmojiData = {};\n    this.isProgrammaticScroll = true;\n    const listEl = this.emojiListRef?.nativeElement;\n    const headerEl = listEl?.querySelector(`#${CSS.escape(categoryId)}`) as HTMLElement;\n    if (listEl && headerEl) {\n      listEl.scrollTo({ top: headerEl.offsetTop - listEl.offsetTop, behavior: 'smooth' });\n    }\n    this.pendingTimers.push(setTimeout(() => { this.isProgrammaticScroll = false; }, 500));\n  }\n\n  /** Handle horizontal scroll for category tabs with hyper scroll handling. */\n  onWheel(event: WheelEvent): void {\n    const container = this.scrollRef?.nativeElement;\n    if (container) {\n      let scrollAmount = event.deltaY * 0.5;\n      if (event.deltaMode === 1 || event.deltaY > 100) scrollAmount = event.deltaY * 0.2;\n      container.scrollTo({ top: 0, left: container.scrollLeft + scrollAmount, behavior: 'auto' });\n    }\n  }\n\n  getLocalizedCategoryName(name: string): string { return getLocalizedString(name); }\n  getEmojiData(emoji: CometChatEmoji): string { return emoji.char; }\n  getEmojiEntries(emojies: Record<string, CometChatEmoji>): [string, CometChatEmoji][] { return Object.entries(emojies); }\n  trackByEmojiName(_index: number, item: [string, CometChatEmoji]): string { return item[0]; }\n  trackByCategoryId(_index: number, category: CometChatEmojiCategory): string { return category.id; }\n\n  /** Handle keyboard navigation for emoji grid. */\n  onEmojiKeydown(event: KeyboardEvent, emoji: CometChatEmoji): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault(); event.stopPropagation(); this.handleEmojiClick(emoji);\n    } else if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(event.key)) {\n      event.preventDefault(); event.stopPropagation(); this.navigateEmojiGridWithService(event);\n    }\n  }\n\n  /** Navigate within emoji grid using GridNavigationService. */\n  navigateEmojiGridWithService(event: KeyboardEvent): void {\n    const emojiElements = Array.from(this.elementRef.nativeElement.querySelectorAll('.cometchat-emoji-keyboard__list-item')) as HTMLElement[];\n    if (emojiElements.length === 0) return;\n    const currentIndex = emojiElements.findIndex(el => el === document.activeElement);\n    if (currentIndex === -1) return;\n    const rowCount = Math.ceil(emojiElements.length / this.gridColumns);\n    const newIndex = this.gridNavigationService.handleKeyNavigation(event, currentIndex, { rowCount, columnCount: this.gridColumns, totalItems: emojiElements.length, wrap: true });\n    if (newIndex !== -1 && newIndex !== currentIndex) { this.focusedEmojiIndex = newIndex; emojiElements[newIndex]?.focus(); }\n  }\n\n  /** Handle keyboard navigation for category tabs. */\n  onTabKeydown(event: KeyboardEvent, categoryId: string, index: number): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); this.onCategoryClick(categoryId); }\n    else if (event.key === 'ArrowLeft') { event.preventDefault(); event.stopPropagation(); this.focusPreviousTab(index); }\n    else if (event.key === 'ArrowRight') { event.preventDefault(); event.stopPropagation(); this.focusNextTab(index); }\n  }\n\n  focusPreviousTab(currentIndex: number): void {\n    this.focusedTabIndex = currentIndex > 0 ? currentIndex - 1 : this.emojiDataState.length - 1;\n    const tabs = this.elementRef.nativeElement.querySelectorAll('.cometchat-emoji-keyboard__tab');\n    (tabs[this.focusedTabIndex] as HTMLElement)?.focus();\n  }\n\n  focusNextTab(currentIndex: number): void {\n    this.focusedTabIndex = currentIndex < this.emojiDataState.length - 1 ? currentIndex + 1 : 0;\n    const tabs = this.elementRef.nativeElement.querySelectorAll('.cometchat-emoji-keyboard__tab');\n    (tabs[this.focusedTabIndex] as HTMLElement)?.focus();\n  }\n\n  @HostListener('keydown', ['$event'])\n  onKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') { event.preventDefault(); event.stopPropagation(); this.closeKeyboard.emit(); return; }\n    if (event.key === '/' && document.activeElement?.tagName !== 'INPUT') {\n      event.preventDefault(); event.stopPropagation();\n      const searchInput = this.elementRef.nativeElement.querySelector('.cometchat-search-bar__input') as HTMLElement;\n      searchInput?.focus();\n    }\n  }\n\n  getEmojiTabIndex(index: number): number { return this.gridNavigationService.getItemTabIndex(index, this.focusedEmojiIndex); }\n  getTabTabIndex(index: number): number { return index === this.focusedTabIndex ? 0 : -1; }\n\n  getRowCount(): number {\n    const totalEmojis = this.searchString ? Object.keys(this.searchEmojiData).length : this.getTotalEmojiCount();\n    return Math.ceil(totalEmojis / this.gridColumns);\n  }\n\n  private getTotalEmojiCount(): number {\n    return this.emojiDataState.reduce((total, category) => total + Object.keys(category.emojies).length, 0);\n  }\n\n  getEmojiPosition(index: number): { row: number; col: number } { return this.gridNavigationService.getRowCol(index, this.gridColumns); }\n  onEmojiFocus(index: number): void { this.focusedEmojiIndex = index; }\n  getFirstEmoji(category: CometChatEmojiCategory): string { const entries = Object.values(category.emojies); return entries.length > 0 ? entries[0].char : '⬜'; }\n  getAriaLabel(): string { return this.ariaLabel || getLocalizedString('accessibility_emoji_picker'); }\n}\n","<div \n  class=\"cometchat-emoji-keyboard\"\n  role=\"dialog\"\n  [attr.aria-label]=\"getAriaLabel()\"\n  aria-modal=\"true\"\n>\n  <!-- Search bar -->\n  <div class=\"cometchat-emoji-keyboard__search\">\n    <cometchat-search-bar\n      [placeholderText]=\"getLocalizedCategoryName('emoji_search_placeholder')\"\n      (searchChanged)=\"filterEmojis($event)\"\n      [searchText]=\"searchString\"\n    ></cometchat-search-bar>\n  </div>\n  \n  <!-- Category tabs with horizontal scroll -->\n  <div \n    class=\"cometchat-emoji-keyboard__tabs\"\n    #scrollRef\n    (wheel)=\"onWheel($event)\"\n    role=\"tablist\"\n    [attr.aria-label]=\"getLocalizedCategoryName('accessibility_emoji_categories')\"\n  >\n    <div\n      *ngFor=\"let emoji of emojiDataState; let i = index; trackBy: trackByCategoryId\"\n      (click)=\"onCategoryClick(emoji.id)\"\n      (keydown)=\"onTabKeydown($event, emoji.id, i)\"\n      [title]=\"getLocalizedCategoryName(emoji.name)\"\n      [class.cometchat-emoji-keyboard__tab-active]=\"activeCategory === emoji.id\"\n      class=\"cometchat-emoji-keyboard__tab\"\n      role=\"tab\"\n      [id]=\"'emoji-tab-' + emoji.id\"\n      [attr.aria-selected]=\"activeCategory === emoji.id\"\n      [attr.aria-label]=\"getLocalizedCategoryName(emoji.name)\"\n      [attr.aria-controls]=\"'emoji-panel-' + emoji.id\"\n      [attr.tabindex]=\"getTabTabIndex(i)\"\n    >\n      <div [title]=\"getLocalizedCategoryName(emoji.name)\">\n        <div\n          *ngIf=\"emoji.symbolURL; else emojiTextIcon\"\n          [style.-webkit-mask]=\"'url(' + emoji.symbolURL + ') center center no-repeat'\"\n          [style.mask]=\"'url(' + emoji.symbolURL + ') center center no-repeat'\"\n          class=\"cometchat-emoji-keyboard__tab-icon\"\n        ></div>\n        <ng-template #emojiTextIcon>\n          <span class=\"cometchat-emoji-keyboard__tab-emoji\">{{ getFirstEmoji(emoji) }}</span>\n        </ng-template>\n      </div>\n    </div>\n  </div>\n  \n  <!-- Emoji list (scroll container; per-category panels below are the tabpanels) -->\n  <div class=\"cometchat-emoji-keyboard__list\" #emojiListRef>\n    <!-- Search results -->\n    <ng-container *ngIf=\"getEmojiEntries(searchEmojiData).length > 0\">\n      <div \n        class=\"cometchat-emoji-keyboard__emoji-list\" \n        role=\"grid\" \n        [attr.aria-label]=\"getLocalizedCategoryName('accessibility_emoji_grid')\"\n        [attr.aria-rowcount]=\"getRowCount()\"\n        [attr.aria-colcount]=\"gridColumns\"\n      >\n        <div\n          *ngFor=\"let entry of getEmojiEntries(searchEmojiData); let i = index; trackBy: trackByEmojiName\"\n          class=\"cometchat-emoji-keyboard__list-item\"\n          [title]=\"entry[0]\"\n          (click)=\"handleEmojiClick(entry[1])\"\n          (keydown)=\"onEmojiKeydown($event, entry[1])\"\n          (focus)=\"onEmojiFocus(i)\"\n          role=\"gridcell\"\n          [attr.tabindex]=\"getEmojiTabIndex(i)\"\n          [attr.aria-label]=\"entry[0]\"\n          [attr.aria-rowindex]=\"getEmojiPosition(i).row + 1\"\n          [attr.aria-colindex]=\"getEmojiPosition(i).col + 1\"\n        >\n          {{ getEmojiData(entry[1]) }}\n        </div>\n      </div>\n    </ng-container>\n    \n    <!-- All categories -->\n    <ng-container *ngIf=\"getEmojiEntries(searchEmojiData).length === 0\">\n      <div\n        *ngFor=\"let emoji of emojiDataState; trackBy: trackByCategoryId\"\n        class=\"cometchat-emoji-keyboard__list-content\"\n        role=\"tabpanel\"\n        [id]=\"'emoji-panel-' + emoji.id\"\n        [attr.aria-labelledby]=\"'emoji-tab-' + emoji.id\"\n      >\n        <div class=\"cometchat-emoji-keyboard__list-title\" [id]=\"emoji.id\">\n          <div [title]=\"getLocalizedCategoryName(emoji.name)\">\n            {{ getLocalizedCategoryName(emoji.name) }}\n          </div>\n        </div>\n        <div \n          class=\"cometchat-emoji-keyboard__emoji-list\" \n          role=\"grid\" \n          [attr.aria-label]=\"getLocalizedCategoryName(emoji.name)\"\n          [attr.aria-colcount]=\"gridColumns\"\n        >\n          <div\n            *ngFor=\"let entry of getEmojiEntries(emoji.emojies); let i = index; trackBy: trackByEmojiName\"\n            class=\"cometchat-emoji-keyboard__list-item\"\n            [title]=\"entry[0]\"\n            (click)=\"handleEmojiClick(entry[1])\"\n            (keydown)=\"onEmojiKeydown($event, entry[1])\"\n            (focus)=\"onEmojiFocus(i)\"\n            role=\"gridcell\"\n            [attr.tabindex]=\"getEmojiTabIndex(i)\"\n            [attr.aria-label]=\"entry[0]\"\n            [attr.aria-colindex]=\"(i % gridColumns) + 1\"\n          >\n            {{ getEmojiData(entry[1]) }}\n          </div>\n        </div>\n      </div>\n    </ng-container>\n  </div>\n</div>\n","/**\n * The single way the UI Kit saves a media attachment to disk.\n *\n * Every download affordance — the fullscreen viewer, the file bubble's download button, the\n * per-row button in the multi-audio bubble — must route through here. Hand-rolling an anchor at\n * the attachment URL looks like it works locally (same-origin dev media) and then silently\n * degrades to \"opens a new tab\" against the real CDN, which is the bug this module exists to\n * prevent.\n *\n * Downloads go straight to the browser's default download location; there is deliberately no\n * \"Save As\" prompt.\n */\n\nimport { CometChatLogger } from './CometChatLogger';\n\n/**\n * How a download actually resolved.\n *\n * `opened-in-new-tab` is a degraded success, not a crash: the bytes could not be fetched, so the\n * user got the media in a tab to save manually. Callers that announce progress to assistive tech\n * must not report this as a completed save.\n */\nexport type MediaDownloadOutcome = 'saved' | 'opened-in-new-tab';\n\n/**\n * Saves a media attachment to disk.\n *\n * The anchor `download` attribute is IGNORED for cross-origin URLs — a security rule so sites\n * can't force-download arbitrary third-party content. CometChat media lives on the CDN (a\n * different origin), so an anchor pointed straight at it degrades to a plain link and the browser\n * just opens the media in a new tab instead of saving it. To actually download, we fetch the\n * bytes into a same-origin `blob:` URL — for which `download` IS honored — and save that.\n *\n * If the fetch fails (CORS not allowed, network error, or an expired/403 link), we fall back to\n * the open-in-a-new-tab behavior so the user can still save the file manually.\n *\n * Never rejects — it resolves with the outcome so callers can report it accurately.\n */\nexport function triggerMediaDownload(url: string, filename: string): Promise<MediaDownloadOutcome> {\n  return fetchMediaBlob(url)\n    .then((blob): MediaDownloadOutcome => {\n      const objectUrl = URL.createObjectURL(blob);\n      saveWithAnchor(objectUrl, filename, false);\n      // Release the blob after the click has had a chance to start the download.\n      setTimeout(() => URL.revokeObjectURL(objectUrl), 10_000);\n      return 'saved';\n    })\n    .catch((error): MediaDownloadOutcome => {\n      CometChatLogger.warn('MediaDownload', 'Blob download failed; opening media in a new tab', error);\n      saveWithAnchor(url, filename, true);\n      return 'opened-in-new-tab';\n    });\n}\n\n/**\n * Fetches media bytes as a Blob, throwing on a non-OK response.\n *\n * The bare single-argument `fetch` is load-bearing, not an oversight. Media URLs are signed and\n * carry their auth in the query string, and the CDN answers a preflight `OPTIONS` with a 403 and\n * no CORS headers. Passing ANY custom header (an auth token, a tracing header) or\n * `credentials: 'include'` makes this a preflighted request, which the CDN then rejects — and a\n * wildcard `access-control-allow-origin: *` is refused outright once a request carries credentials.\n * Keep this a simple request. The same rule applies to any global `fetch` interceptor or service\n * worker added later: it must exclude media/CDN URLs.\n */\nfunction fetchMediaBlob(url: string): Promise<Blob> {\n  return fetch(url).then(response => {\n    if (!response.ok) throw new Error(`HTTP ${response.status}`);\n    return response.blob();\n  });\n}\n\n/**\n * Clicks a temporary anchor to save `href` as `filename`. When `openInNewTab` is true the anchor\n * navigates instead (used only for the cross-origin fallback, where `download` won't apply).\n */\nexport function saveWithAnchor(href: string, filename: string, openInNewTab: boolean): void {\n  const link = document.createElement('a');\n  link.href = href;\n  link.download = filename;\n  link.style.display = 'none';\n  if (openInNewTab) {\n    link.target = '_blank';\n    link.rel = 'noopener noreferrer';\n  }\n  document.body.appendChild(link);\n  try {\n    link.click();\n  } finally {\n    document.body.removeChild(link);\n  }\n}\n","/**\n * Utility helpers for CometChatFullScreenViewer component.\n * Contains file size formatting, filename generation, body scroll management,\n * and download helpers.\n */\n\nimport type { FullscreenViewerMediaType } from './cometchat-fullscreen-viewer.types';\nimport type { MediaAttachment } from '../../../modals/MediaAttachment';\n\n// ── File Helpers ──────────────────────────────────────────────────────────\n\n/**\n * Formats a file size in bytes to a human-readable string (e.g. \"1.2 MB\").\n */\nexport function formatFileSize(bytes: number | undefined): string {\n  if (!bytes) return '';\n  const units = ['B', 'KB', 'MB', 'GB'];\n  let size = bytes;\n  let unitIndex = 0;\n  while (size >= 1024 && unitIndex < units.length - 1) { size /= 1024; unitIndex++; }\n  return `${size.toFixed(unitIndex > 0 ? 1 : 0)} ${units[unitIndex]}`;\n}\n\n/**\n * Extracts the uppercased file extension from a filename.\n */\nexport function getFileExtension(fileName: string | undefined): string {\n  if (!fileName) return '';\n  const parts = fileName.split('.');\n  return parts.length > 1 ? parts[parts.length - 1].toUpperCase() : '';\n}\n\n/**\n * Generates a default filename with timestamp for a given media type.\n */\nexport function generateDefaultFilename(mediaType: string): string {\n  const timestamp = Date.now();\n  const extensions: Record<string, string> = { image: 'jpg', video: 'mp4', audio: 'mp3', file: 'bin' };\n  return `download_${timestamp}.${extensions[mediaType] || 'bin'}`;\n}\n\n// ── Body Scroll ───────────────────────────────────────────────────────────\n\n/**\n * Prevents body scroll by setting overflow to hidden.\n * Returns the original overflow value for later restoration.\n */\nexport function preventBodyScroll(): string {\n  const original = document.body.style.overflow;\n  document.body.style.overflow = 'hidden';\n  return original;\n}\n\n/**\n * Restores the original body overflow value.\n */\nexport function restoreBodyScroll(originalOverflow: string): void {\n  document.body.style.overflow = originalOverflow;\n}\n\n// ── Download ──────────────────────────────────────────────────────────────\n\n/**\n * The viewer's download button. Re-exported from the shared implementation so every download\n * affordance in the kit behaves identically — see `utils/media-download.ts` for why a plain\n * anchor is not enough and why the fetch must stay a simple request.\n */\nexport { triggerMediaDownload } from '../../../utils/media-download';\nexport type { MediaDownloadOutcome } from '../../../utils/media-download';\n\n/**\n * Resolves the media URL and filename for download in both gallery and single mode.\n */\nexport function resolveDownloadTarget(\n  isGalleryMode: boolean,\n  currentAttachment: MediaAttachment | null,\n  url: string,\n  fileName: string,\n  mediaType: FullscreenViewerMediaType\n): { mediaUrl: string; filename: string; currentMedia: MediaAttachment | string } | null {\n  if (isGalleryMode && currentAttachment) {\n    return {\n      mediaUrl: currentAttachment.url,\n      filename: currentAttachment.name || generateDefaultFilename(currentAttachment.type || 'image'),\n      currentMedia: currentAttachment,\n    };\n  }\n  if (url) {\n    return {\n      mediaUrl: url,\n      filename: fileName || generateDefaultFilename(mediaType),\n      currentMedia: url,\n    };\n  }\n  return null;\n}\n\n// ── Aria Labels ───────────────────────────────────────────────────────────\n\nimport { getLocalizedString } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Gets the appropriate aria-label for the viewer based on media type.\n */\nexport function getViewerAriaLabel(mediaType: FullscreenViewerMediaType): string {\n  switch (mediaType) {\n    case 'video': return getLocalizedString('full_screen_viewer_video');\n    case 'audio': return getLocalizedString('full_screen_viewer_audio');\n    case 'file': return getLocalizedString('full_screen_viewer_file');\n    default: return getLocalizedString('message_list_full_screen_viewer');\n  }\n}\n\n/**\n * Gets the appropriate alt text for the media based on type and sender.\n */\nexport function getMediaAltText(\n  mediaType: string | undefined,\n  senderName: string,\n  fileName: string\n): string {\n  const sender = senderName || getLocalizedString('unknown');\n  if (mediaType === 'video') {\n    return getLocalizedString('fullscreen_viewer_video_alt').replace('{sender}', sender);\n  }\n  if (mediaType === 'image') {\n    return getLocalizedString('fullscreen_viewer_image_alt').replace('{sender}', sender);\n  }\n  return fileName || getLocalizedString('message_list_full_screen_viewer');\n}\n\n/**\n * Gets the gallery position announcement text.\n */\nexport function getGalleryPositionText(current: number, total: number): string {\n  return (\n    getLocalizedString('fullscreen_viewer_index')\n      ?.replace('{current}', current.toString())\n      ?.replace('{total}', total.toString()) ||\n    `${current} of ${total}`\n  );\n}\n\n// ── Picture-in-Picture ────────────────────────────────────────────────────\n\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\n\n/**\n * Waits for a video element to be ready to play (readyState >= 2).\n */\nexport async function waitForVideoReady(video: HTMLVideoElement): Promise<void> {\n  if (video.readyState >= 2) return;\n  return new Promise<void>((resolve, reject) => {\n    const timeout = setTimeout(() => {\n      video.removeEventListener('canplay', onCanPlay);\n      video.removeEventListener('error', onError);\n      reject(new Error('Video load timeout'));\n    }, 5000);\n    const onCanPlay = () => { clearTimeout(timeout); video.removeEventListener('canplay', onCanPlay); video.removeEventListener('error', onError); resolve(); };\n    const onError = () => { clearTimeout(timeout); video.removeEventListener('canplay', onCanPlay); video.removeEventListener('error', onError); reject(new Error('Video load error')); };\n    video.addEventListener('canplay', onCanPlay);\n    video.addEventListener('error', onError);\n    if (video.readyState === 0) { video.load(); }\n  });\n}\n\n/**\n * Enters Picture-in-Picture mode for a video element.\n * Returns true on success, false on failure.\n */\nexport async function enterPip(video: HTMLVideoElement): Promise<boolean> {\n  try {\n    await waitForVideoReady(video);\n    if (video.paused) { try { await video.play(); } catch { /* continue */ } }\n    await new Promise(resolve => setTimeout(resolve, 100));\n    await video.requestPictureInPicture();\n    return true;\n  } catch (error) {\n    CometChatLogger.error('CometChatFullscreenViewer', 'Failed to enter PIP:', error);\n    return false;\n  }\n}\n\n/**\n * Exits Picture-in-Picture mode if currently active.\n */\nexport async function exitPip(): Promise<void> {\n  if (!(document as any).pictureInPictureElement) return;\n  try { await (document as any).exitPictureInPicture(); } catch (error) {\n    CometChatLogger.error('CometChatFullscreenViewer', 'Failed to exit PIP:', error);\n  }\n}\n\n// ── Legacy Image Download ─────────────────────────────────────────────────\n\n/**\n * Downloads an image via XHR with retry logic (max 5 attempts for 403 errors).\n * Calls onSuccess with the object URL when done, or onFallback with the original URL on error.\n */\nexport function downloadImageWithRetry(\n  imgUrl: string,\n  onProgress: (percent: number) => void,\n  onSuccess: (objectUrl: string) => void,\n  onFallback: (url: string) => void,\n  attemptCount = 0,\n  maxAttempts = 5\n): void {\n  const xhr = new XMLHttpRequest();\n  xhr.open('GET', imgUrl, true);\n  xhr.responseType = 'blob';\n  xhr.onprogress = event => { if (event.lengthComputable) { onProgress((event.loaded / event.total) * 100); } };\n  xhr.onload = () => {\n    if (xhr.readyState !== 4) return;\n    if (xhr.status === 200) {\n      const objectUrl = URL.createObjectURL(xhr.response);\n      const img = new Image();\n      img.src = objectUrl;\n      img.onload = () => onSuccess(objectUrl);\n    } else if (xhr.status === 403 && attemptCount < maxAttempts) {\n      setTimeout(() => downloadImageWithRetry(imgUrl, onProgress, onSuccess, onFallback, attemptCount + 1, maxAttempts), 800);\n    } else { onFallback(imgUrl); }\n  };\n  xhr.onerror = () => onFallback(imgUrl);\n  xhr.ontimeout = () => onFallback(imgUrl);\n  xhr.send();\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  OnDestroy,\n  AfterViewInit,\n  HostListener,\n  ChangeDetectorRef,\n  ViewChild,\n  ElementRef,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  CometChatLocalize,\n  getLocalizedString,\n} from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { CalendarObject } from '../../../resources/CometChatLocalize/localization.interfaces';\nimport { sanitizeCalendarObject } from '../../../utils/util';\nimport { MediaAttachment } from '../../../modals/MediaAttachment';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\nimport { FocusTrapService } from '../../../services/focus-trap.service';\nimport { MediaControlsService } from '../../../services/media-controls.service';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\nimport type { FullscreenViewerMediaType } from './cometchat-fullscreen-viewer.types';\nimport {\n  formatFileSize,\n  getFileExtension,\n  generateDefaultFilename,\n  preventBodyScroll,\n  restoreBodyScroll,\n  triggerMediaDownload,\n  resolveDownloadTarget,\n  getViewerAriaLabel,\n  getMediaAltText,\n  getGalleryPositionText,\n  enterPip,\n  exitPip,\n  downloadImageWithRetry,\n} from './cometchat-fullscreen-viewer.utils';\n\n// Re-export for backward compatibility\nexport type { FullscreenViewerMediaType } from './cometchat-fullscreen-viewer.types';\n\n@Component({\n  selector: 'cometchat-fullscreen-viewer',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-fullscreen-viewer.component.html',\n  styleUrls: ['./cometchat-fullscreen-viewer.component.css'],\n})\nexport class CometChatFullScreenViewerComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n  // ── Single-mode Inputs ────────────────────────────────────────────────────\n  @Input() url = '';\n  @Input() mediaType: FullscreenViewerMediaType = 'image';\n  @Input() fileName = '';\n  @Input() fileSize?: number;\n  @Input() placeholderImage?: string;\n  @Input() message?: CometChat.BaseMessage;\n  @Input() imageSentAtDateTimeFormat?: CalendarObject;\n\n  // ── Gallery-mode Inputs ───────────────────────────────────────────────────\n  @Input() attachments: MediaAttachment[] = [];\n  @Input() startIndex = 0;\n  @Input() isOpen = false;\n  @Input() explicitSenderName = '';\n  @Input() explicitSenderAvatarUrl = '';\n  @Input() prevIconUrl = 'assets/arrow_back.svg';\n  @Input() nextIconUrl = 'assets/arrow_forward.svg';\n  @Input() downloadIconUrl = 'assets/download.svg';\n\n  // ── PIP Inputs ────────────────────────────────────────────────────────────\n  @Input() enablePictureInPicture = true;\n  @Input() pipIconUrl = 'assets/zoom_out_map.svg';\n  @Input() pipExitIconUrl = 'assets/zoom_in_map.svg';\n\n  // ── Outputs ───────────────────────────────────────────────────────────────\n  @Output() closeClick = new EventEmitter<void>();\n  @Output() indexChange = new EventEmitter<number>();\n  @Output() downloadClick = new EventEmitter<MediaAttachment | string>();\n  @Output() pipStateChange = new EventEmitter<boolean>();\n\n  // ── View References ───────────────────────────────────────────────────────\n  @ViewChild('closeButton') closeButton?: ElementRef<HTMLButtonElement>;\n  @ViewChild('viewerContainer') viewerContainer?: ElementRef<HTMLDivElement>;\n  @ViewChild('videoElement') videoElement?: ElementRef<HTMLVideoElement>;\n\n  // ── State ─────────────────────────────────────────────────────────────────\n  currentIndex = 0;\n  image?: string;\n  isDownloading = true;\n  progress = 0;\n  videoError = false;\n  /** True when the current image can't be decoded/previewed (unsupported type, broken/expired link, 403). */\n  imageError = false;\n  isPipMode = false;\n  isPipSupported = false;\n\n  private previouslyFocusedElement: HTMLElement | null = null;\n  private originalBodyOverflow = '';\n  private pipEnterListener: (() => void) | null = null;\n  private pipLeaveListener: (() => void) | null = null;\n\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private focusTrapService = inject(FocusTrapService);\n  private mediaControlsService = inject(MediaControlsService);\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n  ngOnInit(): void {\n    this.isPipSupported =\n      'pictureInPictureEnabled' in document && (document as any).pictureInPictureEnabled;\n\n    if (this.isGalleryMode) {\n      this.currentIndex = Math.max(0, Math.min(this.startIndex, this.attachments.length - 1));\n    }\n\n    if (this.url) {\n      if (this.mediaType === 'image') { this.image = this.url; }\n      this.isDownloading = false;\n      this.progress = 100;\n    } else {\n      this.isDownloading = false;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    const isOpenChange = changes['isOpen'];\n    if (isOpenChange?.currentValue === true && !isOpenChange.previousValue) {\n      this.previouslyFocusedElement = document.activeElement as HTMLElement;\n      this.originalBodyOverflow = preventBodyScroll();\n      this.liveAnnouncer.announce(getViewerAriaLabel(this.mediaType), 'polite');\n      if (this.isGalleryMode) { setTimeout(() => this.announceGalleryPosition(), 100); }\n      setTimeout(() => {\n        if (this.viewerContainer?.nativeElement) {\n          this.focusTrapService.activate({ container: this.viewerContainer.nativeElement, initialFocus: this.closeButton?.nativeElement || 'first', returnFocusOnDeactivate: true });\n        }\n      }, 100);\n    }\n    if (isOpenChange?.currentValue === false && isOpenChange.previousValue === true) {\n      restoreBodyScroll(this.originalBodyOverflow);\n      if (this.viewerContainer?.nativeElement) { this.focusTrapService.deactivate(this.viewerContainer.nativeElement); }\n    }\n    if (changes['startIndex'] && !changes['startIndex'].firstChange && this.isGalleryMode) {\n      const idx = changes['startIndex'].currentValue;\n      if (typeof idx === 'number' && idx >= 0 && idx < this.attachments.length) { this.navigateToIndex(idx); }\n    }\n    if (changes['attachments'] && !changes['attachments'].firstChange) {\n      const arr = changes['attachments'].currentValue;\n      if (Array.isArray(arr)) {\n        if (this.currentIndex >= arr.length) { this.currentIndex = 0; this.indexChange.emit(0); }\n        this.cdr.detectChanges();\n      }\n    }\n  }\n\n  ngAfterViewInit(): void {\n    if (this.isOpen && this.viewerContainer?.nativeElement) {\n      setTimeout(() => {\n        this.focusTrapService.activate({ container: this.viewerContainer!.nativeElement, initialFocus: this.closeButton?.nativeElement || 'first', returnFocusOnDeactivate: true });\n        if (this.isGalleryMode) { this.announceGalleryPosition(); }\n      }, 100);\n    }\n    setTimeout(() => this.setupPipEventListeners(), 200);\n  }\n\n  ngOnDestroy(): void {\n    if (this.viewerContainer?.nativeElement) { this.focusTrapService.deactivate(this.viewerContainer.nativeElement); }\n    if (this.isPipMode) { this.exitPictureInPicture(); }\n    this.removePipEventListeners();\n    this.stopCurrentVideo();\n    restoreBodyScroll(this.originalBodyOverflow);\n  }\n\n  // ── Image Download (legacy) ───────────────────────────────────────────────\n\n  downloadImage(imgUrl: string, attemptCount = 0): void {\n    downloadImageWithRetry(\n      imgUrl,\n      (percent) => { this.progress = percent; },\n      (objectUrl) => { this.isDownloading = false; this.image = objectUrl; },\n      (url) => { this.image = url; this.isDownloading = false; },\n      attemptCount\n    );\n  }\n\n  // ── Close ─────────────────────────────────────────────────────────────────\n\n  close(keepPipActive = false): void {\n    if (this.isPipMode && !keepPipActive) { this.exitPictureInPicture(); }\n    if (!keepPipActive || !this.isPipMode) { this.stopCurrentVideo(); }\n    if (this.viewerContainer?.nativeElement) {\n      this.focusTrapService.deactivate(this.viewerContainer.nativeElement);\n    }\n    restoreBodyScroll(this.originalBodyOverflow);\n    this.closeClick.emit();\n    if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {\n      setTimeout(() => this.previouslyFocusedElement?.focus(), 0);\n    }\n  }\n\n  handleCloseClick(event: MouseEvent): void { event.stopPropagation(); this.close(); }\n\n  handleCloseKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); this.close(); }\n  }\n\n  // ── Keyboard ──────────────────────────────────────────────────────────────\n\n  @HostListener('document:keydown', ['$event'])\n  handleDocumentKeydown(event: KeyboardEvent): void {\n    if (!this.isOpen) return;\n    if (event.key === 'Escape') { event.preventDefault(); this.close(); return; }\n\n    const isVideoMode = this.isGalleryMode\n      ? this.currentAttachment?.type === 'video'\n      : this.mediaType === 'video';\n\n    if (isVideoMode && this.videoElement?.nativeElement && !this.videoError) {\n      const video = this.videoElement.nativeElement;\n      if ([' ', 'ArrowRight', 'ArrowLeft', 'Home', 'End'].includes(event.key)) {\n        const result = this.mediaControlsService.handleKeyDown(event, {\n          currentTime: video.currentTime, duration: video.duration || 0, isPlaying: !video.paused, seekIncrement: 5,\n        });\n        if (result.action === 'play') { video.play(); this.liveAnnouncer.announce(getLocalizedString('audio_bubble_play'), 'polite'); }\n        else if (result.action === 'pause') { video.pause(); this.liveAnnouncer.announce(getLocalizedString('audio_bubble_pause'), 'polite'); }\n        else if (result.seekTime !== undefined) {\n          video.currentTime = result.seekTime;\n          this.liveAnnouncer.announce(this.mediaControlsService.formatTimeForAnnouncement(result.seekTime), 'polite');\n        }\n        return;\n      }\n    }\n\n    if (this.isGalleryMode) {\n      if (event.key === 'ArrowRight' && this.canNavigateNext) { event.preventDefault(); this.navigateNext(); }\n      else if (event.key === 'ArrowLeft' && this.canNavigatePrev) { event.preventDefault(); this.navigatePrev(); }\n    }\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(_event: KeyboardEvent): void { /* Focus trapping handled by FocusTrapService */ }\n\n  handleVideoError(): void { this.videoError = true; this.cdr.detectChanges(); }\n\n  /** The image element failed to load — show the \"no preview available\" state instead of a broken img. */\n  handleImageError(): void { this.imageError = true; this.cdr.detectChanges(); }\n\n  // ── Getters ───────────────────────────────────────────────────────────────\n\n  getDateFormat(): CalendarObject {\n    const defaultFormat = {\n      yesterday: ` DD/M/YYYY [${getLocalizedString('full_screen_viewer_at')}] hh:mm A`,\n      otherDays: ` DD/M/YYYY [${getLocalizedString('full_screen_viewer_at')}] hh:mm A`,\n      today: ` DD/M/YYYY [${getLocalizedString('full_screen_viewer_at')}] hh:mm A`,\n    };\n    return {\n      ...defaultFormat,\n      ...sanitizeCalendarObject(CometChatLocalize.getCalendarObject()),\n      ...sanitizeCalendarObject(this.imageSentAtDateTimeFormat),\n    };\n  }\n\n  get senderName(): string { return this.explicitSenderName || this.message?.getSender()?.getName() || ''; }\n  get senderAvatar(): string { return this.explicitSenderAvatarUrl || this.message?.getSender()?.getAvatar() || ''; }\n  get formattedDate(): string { return this.message?.getSentAt ? CometChatLocalize.formatDate(this.message.getSentAt(), this.getDateFormat()) : ''; }\n  get progressStrokeDasharray(): string { return `${this.progress / 1.13} 113`; }\n  get formattedFileSize(): string { return formatFileSize(this.fileSize); }\n  get fileExtension(): string { return getFileExtension(this.fileName); }\n  get showSenderInfo(): boolean { return !!(this.explicitSenderName || this.explicitSenderAvatarUrl || (this.message && (this.senderName || this.senderAvatar))); }\n  get currentFileName(): string { return this.isGalleryMode ? (this.currentAttachment?.name || '') : (this.fileName || ''); }\n  get currentFileSize(): string { return formatFileSize(this.isGalleryMode ? this.currentAttachment?.size : this.fileSize); }\n  get currentFileExtension(): string { return getFileExtension(this.isGalleryMode ? (this.currentAttachment?.name || '') : this.fileName); }\n  getLocalizedString(key: string): string { return getLocalizedString(key); }\n  getViewerAriaLabel(): string { return getViewerAriaLabel(this.mediaType); }\n  getMediaAltText(): string { return getMediaAltText(this.isGalleryMode ? this.currentAttachment?.type : this.mediaType, this.senderName, this.fileName); }\n\n  // ── Gallery Mode ──────────────────────────────────────────────────────────\n\n  get isGalleryMode(): boolean { return this.attachments && this.attachments.length > 0; }\n  get currentAttachment(): MediaAttachment | null {\n    if (!this.isGalleryMode) return null;\n    if (this.currentIndex < 0 || this.currentIndex >= this.attachments.length) return null;\n    return this.attachments[this.currentIndex];\n  }\n  get canNavigatePrev(): boolean { return this.isGalleryMode && this.currentIndex > 0; }\n  get canNavigateNext(): boolean { return this.isGalleryMode && this.currentIndex < this.attachments.length - 1; }\n\n  navigateNext(): void {\n    if (!this.canNavigateNext) return;\n    if (this.isPipMode) { this.exitPictureInPicture(); }\n    this.stopCurrentVideo(); this.imageError = false; this.currentIndex++;\n    this.indexChange.emit(this.currentIndex);\n    this.liveAnnouncer.announce(getGalleryPositionText(this.currentIndex + 1, this.attachments.length), 'polite');\n    setTimeout(() => this.setupPipEventListeners(), 100); this.cdr.detectChanges();\n  }\n\n  navigatePrev(): void {\n    if (!this.canNavigatePrev) return;\n    if (this.isPipMode) { this.exitPictureInPicture(); }\n    this.stopCurrentVideo(); this.imageError = false; this.currentIndex--;\n    this.indexChange.emit(this.currentIndex);\n    this.liveAnnouncer.announce(getGalleryPositionText(this.currentIndex + 1, this.attachments.length), 'polite');\n    setTimeout(() => this.setupPipEventListeners(), 100); this.cdr.detectChanges();\n  }\n\n  navigateToIndex(index: number): void {\n    if (!this.isGalleryMode || index < 0 || index >= this.attachments.length) return;\n    if (this.isPipMode) { this.exitPictureInPicture(); }\n    this.stopCurrentVideo(); this.imageError = false; this.currentIndex = index;\n    this.indexChange.emit(this.currentIndex);\n    setTimeout(() => this.setupPipEventListeners(), 100); this.cdr.detectChanges();\n  }\n\n  private announceGalleryPosition(): void {\n    if (!this.isGalleryMode) return;\n    const text =\n      getLocalizedString('accessibility_gallery_position')\n        ?.replace('{current}', (this.currentIndex + 1).toString())\n        ?.replace('{total}', this.attachments.length.toString()) ||\n      `Image ${this.currentIndex + 1} of ${this.attachments.length}`;\n    this.liveAnnouncer.announce(text, 'polite');\n  }\n\n  private stopCurrentVideo(): void {\n    if (this.videoElement?.nativeElement) {\n      this.videoElement.nativeElement.pause();\n      this.videoElement.nativeElement.currentTime = 0;\n    }\n  }\n\n  // ── Download ──────────────────────────────────────────────────────────────\n\n  download(): void {\n    const target = resolveDownloadTarget(\n      this.isGalleryMode, this.currentAttachment, this.url, this.fileName, this.mediaType\n    );\n    if (!target) { CometChatLogger.warn('CometChatFullscreenViewer', 'No media URL available for download'); return; }\n    triggerMediaDownload(target.mediaUrl, target.filename);\n    this.downloadClick.emit(target.currentMedia);\n  }\n\n  // ── Picture-in-Picture ────────────────────────────────────────────────────\n\n  get showPipButton(): boolean {\n    const isVideo = this.isGalleryMode ? this.currentAttachment?.type === 'video' : this.mediaType === 'video';\n    return this.enablePictureInPicture && this.isPipSupported && isVideo && !this.videoError;\n  }\n\n  async enterPictureInPicture(): Promise<void> {\n    if (!this.isPipSupported) return;\n    if ((document as any).pictureInPictureElement) {\n      try { await (document as any).exitPictureInPicture(); } catch { /* ignore */ }\n    }\n    const video: HTMLVideoElement | null = this.videoElement?.nativeElement ||\n      this.viewerContainer?.nativeElement?.querySelector('video') || null;\n    if (!video) return;\n    const success = await enterPip(video);\n    if (success) { this.isPipMode = true; this.pipStateChange.emit(true); this.cdr.detectChanges(); }\n  }\n\n  async exitPictureInPicture(): Promise<void> {\n    await exitPip();\n    // State updated by leavepictureinpicture event listener\n  }\n\n  togglePictureInPicture(): void {\n    if (this.isPipMode) { this.exitPictureInPicture(); } else { this.enterPictureInPicture(); }\n  }\n\n  private setupPipEventListeners(): void {\n    this.removePipEventListeners();\n    const video: HTMLVideoElement | null = this.videoElement?.nativeElement ||\n      this.viewerContainer?.nativeElement?.querySelector('video') || null;\n    if (!video) return;\n    this.pipEnterListener = () => { this.isPipMode = true; this.pipStateChange.emit(true); this.cdr.detectChanges(); };\n    this.pipLeaveListener = () => { this.isPipMode = false; this.pipStateChange.emit(false); this.cdr.detectChanges(); };\n    video.addEventListener('enterpictureinpicture', this.pipEnterListener);\n    video.addEventListener('leavepictureinpicture', this.pipLeaveListener);\n  }\n\n  private removePipEventListeners(): void {\n    const video: HTMLVideoElement | null = this.videoElement?.nativeElement ||\n      this.viewerContainer?.nativeElement?.querySelector('video') || null;\n    if (!video) return;\n    if (this.pipEnterListener) { video.removeEventListener('enterpictureinpicture', this.pipEnterListener); this.pipEnterListener = null; }\n    if (this.pipLeaveListener) { video.removeEventListener('leavepictureinpicture', this.pipLeaveListener); this.pipLeaveListener = null; }\n  }\n\n  getPipButtonAriaLabel(): string {\n    return this.isPipMode\n      ? getLocalizedString('fullscreen_viewer_pip_exit')\n      : getLocalizedString('fullscreen_viewer_pip_enter');\n  }\n}\n","<div class=\"cometchat\">\n  <div \n    #viewerContainer\n    class=\"cometchat-fullscreen-viewer\"\n    [class.cometchat-fullscreen-viewer--pip-active]=\"isPipMode\"\n    role=\"dialog\"\n    aria-modal=\"true\"\n    [attr.aria-label]=\"getViewerAriaLabel()\"\n  >\n    <!-- PIP Active Indicator - Shows when video is in Picture-in-Picture mode -->\n    <div *ngIf=\"isPipMode\" class=\"cometchat-fullscreen-viewer__pip-indicator\">\n      <div class=\"cometchat-fullscreen-viewer__pip-indicator-icon\"></div>\n      <div class=\"cometchat-fullscreen-viewer__pip-indicator-text\">\n        {{ getLocalizedString('fullscreen_viewer_pip_active') }}\n      </div>\n      <div class=\"cometchat-fullscreen-viewer__pip-indicator-subtext\">\n        {{ getLocalizedString('fullscreen_viewer_pip_active_hint') }}\n      </div>\n    </div>\n\n    <!-- Header bar with 3 sections: sender info (left), file info (center), actions (right) -->\n    <div class=\"cometchat-fullscreen-viewer__header\">\n      <!-- Left section: Sender info with avatar -->\n      <div class=\"cometchat-fullscreen-viewer__header-left\">\n        <div *ngIf=\"showSenderInfo\" class=\"cometchat-fullscreen-viewer__sender-info\">\n          <!-- Avatar -->\n          <div class=\"cometchat-fullscreen-viewer__avatar\">\n            <img \n              *ngIf=\"senderAvatar\" \n              [src]=\"senderAvatar\" \n              [alt]=\"senderName\"\n              class=\"cometchat-fullscreen-viewer__avatar-image\"\n            />\n            <div \n              *ngIf=\"!senderAvatar && senderName\" \n              class=\"cometchat-fullscreen-viewer__avatar-initials\"\n            >\n              {{ senderName.substring(0, 2).toUpperCase() }}\n            </div>\n          </div>\n          \n          <!-- Sender details -->\n          <div class=\"cometchat-fullscreen-viewer__sender-details\">\n            <div class=\"cometchat-fullscreen-viewer__sender-name\">{{ senderName }}</div>\n            <div class=\"cometchat-fullscreen-viewer__sender-status\">{{ getLocalizedString('online') }}</div>\n          </div>\n        </div>\n      </div>\n\n      <!-- Center section: File info (name, size, type) -->\n      <div class=\"cometchat-fullscreen-viewer__header-center\">\n        <div class=\"cometchat-fullscreen-viewer__file-info-header\">\n          <span class=\"cometchat-fullscreen-viewer__file-info-name\">{{ currentFileName }}</span>\n          <span *ngIf=\"currentFileSize\" class=\"cometchat-fullscreen-viewer__file-info-separator\">•</span>\n          <span *ngIf=\"currentFileSize\" class=\"cometchat-fullscreen-viewer__file-info-size\">{{ currentFileSize }}</span>\n          <span *ngIf=\"currentFileExtension\" class=\"cometchat-fullscreen-viewer__file-info-separator\">•</span>\n          <span *ngIf=\"currentFileExtension\" class=\"cometchat-fullscreen-viewer__file-info-type\">{{ currentFileExtension }}</span>\n        </div>\n      </div>\n\n      <!-- Right section: Gallery index, PIP, Download, Close -->\n      <div class=\"cometchat-fullscreen-viewer__header-right\">\n        <div \n          *ngIf=\"isGalleryMode\" \n          class=\"cometchat-fullscreen-viewer__index-display\"\n          aria-live=\"polite\"\n          [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_index')\"\n        >\n          {{ currentIndex + 1 }} {{ getLocalizedString('fullscreen_viewer_of') }} {{ attachments.length }}\n        </div>\n\n        <!-- Picture-in-Picture button (Task 20.5) -->\n        <button\n          *ngIf=\"showPipButton\"\n          class=\"cometchat-fullscreen-viewer__action-button\"\n          [class.cometchat-fullscreen-viewer__action-button--active]=\"isPipMode\"\n          (click)=\"togglePictureInPicture()\"\n          [attr.aria-label]=\"getPipButtonAriaLabel()\"\n          [attr.aria-pressed]=\"isPipMode\"\n          type=\"button\"\n        >\n          <div\n            class=\"cometchat-fullscreen-viewer__action-icon\"\n            [style.-webkit-mask-image]=\"'url(' + (isPipMode ? pipExitIconUrl : pipIconUrl) + ')'\"\n            [style.mask-image]=\"'url(' + (isPipMode ? pipExitIconUrl : pipIconUrl) + ')'\"\n            aria-hidden=\"true\">\n          </div>\n        </button>\n        \n        <!-- Download button -->\n        <button\n          class=\"cometchat-fullscreen-viewer__action-button\"\n          (click)=\"download()\"\n          [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_download')\"\n          type=\"button\"\n        >\n          <div\n            class=\"cometchat-fullscreen-viewer__action-icon\"\n            [style.-webkit-mask-image]=\"'url(' + downloadIconUrl + ')'\"\n            [style.mask-image]=\"'url(' + downloadIconUrl + ')'\"\n            aria-hidden=\"true\">\n          </div>\n        </button>\n\n        <!-- Close button (in header) -->\n        <button\n          #closeButton\n          class=\"cometchat-fullscreen-viewer__action-button cometchat-fullscreen-viewer__close-btn\"\n          (click)=\"handleCloseClick($event)\"\n          (keydown)=\"handleCloseKeydown($event)\"\n          [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_close')\"\n          type=\"button\"\n          tabindex=\"0\"\n        >\n          <div class=\"cometchat-fullscreen-viewer__close-icon\"></div>\n        </button>\n      </div>\n    </div>\n    \n    <!-- Body with media content -->\n    <div class=\"cometchat-fullscreen-viewer__body\">\n      <!-- Progress indicator (for image downloads in single mode) -->\n      <div \n        *ngIf=\"isDownloading && !isGalleryMode && mediaType === 'image'\" \n        class=\"cometchat-fullscreen-viewer__body-download-progress\"\n        role=\"progressbar\"\n        [attr.aria-valuenow]=\"progress\"\n        aria-valuemin=\"0\"\n        aria-valuemax=\"100\"\n        [attr.aria-label]=\"'Loading ' + progress.toFixed(0) + '%'\"\n      >\n        <svg>\n          <circle\n            cx=\"50\"\n            cy=\"50\"\n            r=\"40\"\n            class=\"cometchat-fullscreen-viewer__body-download-progress-background\"\n          ></circle>\n          <circle\n            class=\"cometchat-fullscreen-viewer__body-download-progress-foreground\"\n            cx=\"50\"\n            cy=\"50\"\n            r=\"40\"\n            [style.stroke-dasharray]=\"progressStrokeDasharray\"\n          ></circle>\n        </svg>\n      </div>\n      \n      <!-- Image display (Task 6.3) -->\n      <!-- Gallery mode: use currentAttachment, Single mode: use url -->\n      <img\n        *ngIf=\"!isDownloading && !imageError && (isGalleryMode ? currentAttachment?.type === 'image' : mediaType === 'image') && (isGalleryMode ? currentAttachment?.url : (image || url))\"\n        [src]=\"isGalleryMode ? currentAttachment!.url : (image || url)\"\n        class=\"cometchat-fullscreen-viewer__body-image\"\n        [alt]=\"getMediaAltText()\"\n        (error)=\"handleImageError()\"\n      />\n\n      <!-- No-preview state: the image can't be decoded/previewed (unsupported type, broken/expired\n           link, 403). Show a friendly message + Download instead of a broken-image glyph. -->\n      <div\n        *ngIf=\"!isDownloading && imageError && (isGalleryMode ? currentAttachment?.type === 'image' : mediaType === 'image')\"\n        class=\"cometchat-fullscreen-viewer__no-preview\"\n        role=\"status\"\n      >\n        <div class=\"cometchat-fullscreen-viewer__no-preview-icon\" aria-hidden=\"true\">\n          <img src=\"assets/unsupported.svg\" alt=\"\" />\n        </div>\n        <div class=\"cometchat-fullscreen-viewer__no-preview-title\">\n          {{ getLocalizedString('fullscreen_viewer_no_preview') }}\n        </div>\n        <div class=\"cometchat-fullscreen-viewer__no-preview-subtitle\">\n          {{ getLocalizedString('fullscreen_viewer_no_preview_subtitle') }}\n        </div>\n        <button\n          type=\"button\"\n          class=\"cometchat-fullscreen-viewer__no-preview-download\"\n          (click)=\"download()\"\n          [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_download')\"\n        >\n          <span class=\"cometchat-fullscreen-viewer__download-icon\"></span>\n          <span>{{ getLocalizedString('fullscreen_viewer_download') }}</span>\n        </button>\n      </div>\n\n      <!-- Video display (Task 6.3) -->\n      <!-- Gallery mode: use currentAttachment, Single mode: use url -->\n      <div \n        *ngIf=\"(isGalleryMode ? currentAttachment?.type === 'video' : mediaType === 'video') && (isGalleryMode ? currentAttachment?.url : url) && !videoError\" \n        class=\"cometchat-fullscreen-viewer__video-container\"\n      >\n        <video\n          #videoElement\n          class=\"cometchat-fullscreen-viewer__body-video\"\n          [src]=\"isGalleryMode ? currentAttachment!.url : url\"\n          controls\n          autoplay\n          [attr.aria-label]=\"getMediaAltText()\"\n          (error)=\"handleVideoError()\"\n        >\n          {{ getLocalizedString('full_screen_viewer_video_not_supported') }}\n        </video>\n      </div>\n\n      <!-- Video error state -->\n      <div *ngIf=\"(isGalleryMode ? currentAttachment?.type === 'video' : mediaType === 'video') && videoError\" class=\"cometchat-fullscreen-viewer__error-state\">\n        <div class=\"cometchat-fullscreen-viewer__error-icon\"></div>\n        <div class=\"cometchat-fullscreen-viewer__error-text\">\n          {{ getLocalizedString('full_screen_viewer_video_error') }}\n        </div>\n      </div>\n\n      <!-- Audio display (single mode only) -->\n      <div *ngIf=\"!isGalleryMode && mediaType === 'audio' && url\" class=\"cometchat-fullscreen-viewer__audio-container\">\n        <div class=\"cometchat-fullscreen-viewer__audio-icon\"></div>\n        <audio\n          class=\"cometchat-fullscreen-viewer__body-audio\"\n          [src]=\"url\"\n          controls\n          autoplay\n          [attr.aria-label]=\"getMediaAltText()\"\n        >\n          {{ getLocalizedString('full_screen_viewer_audio_not_supported') }}\n        </audio>\n        <div *ngIf=\"fileName\" class=\"cometchat-fullscreen-viewer__audio-filename\">{{ fileName }}</div>\n      </div>\n\n      <!-- File preview (single mode only) -->\n      <div *ngIf=\"!isGalleryMode && mediaType === 'file'\" class=\"cometchat-fullscreen-viewer__file-preview\">\n        <div class=\"cometchat-fullscreen-viewer__file-icon\">\n          <div class=\"cometchat-fullscreen-viewer__file-icon-inner\"></div>\n          <div *ngIf=\"fileExtension\" class=\"cometchat-fullscreen-viewer__file-extension\">{{ fileExtension }}</div>\n        </div>\n        <div class=\"cometchat-fullscreen-viewer__file-info\">\n          <div class=\"cometchat-fullscreen-viewer__file-preview-name\">{{ fileName || getLocalizedString('fullscreen_viewer_file_fallback') }}</div>\n          <div *ngIf=\"formattedFileSize\" class=\"cometchat-fullscreen-viewer__file-preview-size\">{{ formattedFileSize }}</div>\n        </div>\n        <a \n          *ngIf=\"url\"\n          [href]=\"url\" \n          target=\"_blank\" \n          rel=\"noopener noreferrer\"\n          class=\"cometchat-fullscreen-viewer__download-button\"\n          [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_download') + ' ' + fileName\"\n        >\n          <span class=\"cometchat-fullscreen-viewer__download-icon\"></span>\n          <span>{{ getLocalizedString('fullscreen_viewer_download') }}</span>\n        </a>\n      </div>\n\n      <!-- Navigation buttons for gallery mode (Task 6.1) -->\n      <button\n        *ngIf=\"isGalleryMode\"\n        class=\"cometchat-fullscreen-viewer__nav-button cometchat-fullscreen-viewer__nav-button--prev\"\n        [disabled]=\"!canNavigatePrev\"\n        [attr.aria-disabled]=\"!canNavigatePrev\"\n        [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_previous')\"\n        (click)=\"navigatePrev()\"\n        type=\"button\"\n      >\n        <div\n          class=\"cometchat-fullscreen-viewer__nav-icon\"\n          [style.-webkit-mask-image]=\"'url(' + prevIconUrl + ')'\"\n          [style.mask-image]=\"'url(' + prevIconUrl + ')'\"\n          aria-hidden=\"true\">\n        </div>\n      </button>\n\n      <button\n        *ngIf=\"isGalleryMode\"\n        class=\"cometchat-fullscreen-viewer__nav-button cometchat-fullscreen-viewer__nav-button--next\"\n        [disabled]=\"!canNavigateNext\"\n        [attr.aria-disabled]=\"!canNavigateNext\"\n        [attr.aria-label]=\"getLocalizedString('fullscreen_viewer_next')\"\n        (click)=\"navigateNext()\"\n        type=\"button\"\n      >\n        <div\n          class=\"cometchat-fullscreen-viewer__nav-icon\"\n          [style.-webkit-mask-image]=\"'url(' + nextIconUrl + ')'\"\n          [style.mask-image]=\"'url(' + nextIconUrl + ')'\"\n          aria-hidden=\"true\">\n        </div>\n      </button>\n    </div>\n    \n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ElementRef,\n  ViewChild,\n  OnChanges,\n  SimpleChanges, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatAvatarComponent } from '../cometchat-avatar/cometchat-avatar.component';\n\n/**\n * CometChatListItem is a composite component used to display a list item with avatar, title, subtitle, and customizable views.\n * It accepts inputs related to the avatar and title, as well as a callback function that is triggered when the list item is clicked.\n * It supports template projection for leading, trailing, menu, title, and subtitle views.\n *\n * @example\n * ```html\n * <cometchat-list-item\n *   [id]=\"user.id\"\n *   [avatarURL]=\"user.avatar\"\n *   [avatarName]=\"user.name\"\n *   [title]=\"user.name\"\n *   (listItemClick)=\"onUserClick($event)\">\n * </cometchat-list-item>\n * ```\n */\n@Component({\n  selector: 'cometchat-list-item',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatAvatarComponent],\n  templateUrl: './cometchat-list-item.component.html',\n  styleUrls: ['./cometchat-list-item.component.css'],\n})\nexport class CometChatListItemComponent implements OnChanges {\n  /** Unique ID for the list item */\n  @Input() id = '';\n\n  /** URL of the image for avatar */\n  @Input() avatarURL = '';\n\n  /** Name initials for avatar if URL not provided */\n  @Input() avatarName = '';\n\n  /** Title text for list item */\n  @Input() title = '';\n\n  /** Subtitle text for accessibility (used in aria-label) */\n  @Input() subtitle = '';\n\n  /**\n   * Normalizes null/undefined inputs to their default values.\n   * Prevents NG0100 ExpressionChangedAfterItHasBeenCheckedError.\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['id'] && changes['id'].currentValue == null) {\n      this.id = '';\n    }\n    if (changes['avatarURL'] && changes['avatarURL'].currentValue == null) {\n      this.avatarURL = '';\n    }\n    if (changes['avatarName'] && changes['avatarName'].currentValue == null) {\n      this.avatarName = '';\n    }\n    if (changes['title'] && changes['title'].currentValue == null) {\n      this.title = '';\n    }\n    if (changes['subtitle'] && changes['subtitle'].currentValue == null) {\n      this.subtitle = '';\n    }\n  }\n\n  /** Template for menu view (shown on hover/focus, replaces trailingView) */\n  @Input() menuView: TemplateRef<any> | null = null;\n\n  /** Template for subtitle view */\n  @Input() subtitleView: TemplateRef<any> | null = null;\n\n  /** Template for trailing view (right side) */\n  @Input() trailingView: TemplateRef<any> | null = null;\n\n  /** Template for custom title view */\n  @Input() titleView: TemplateRef<any> | null = null;\n\n  /** Template for leading view (replaces avatar) */\n  @Input() leadingView: TemplateRef<any> | null = null;\n\n  /** Stop event propagation on click */\n  @Input() stopEventPropagation = false;\n\n  /** Custom ARIA label (overrides default) */\n  @Input() ariaLabel?: string;\n\n  /** Whether to disable the tabindex on the list item (when parent manages focus) */\n  @Input() disableTabIndex = false;\n\n  /** Whether the list item is currently focused (managed by parent) */\n  @Input() isFocused = false;\n\n  /**\n   * Keyboard shortcut key for toggling menu visibility.\n   * Set to empty string or null to disable the shortcut.\n   * Default is 'M' (case-insensitive).\n   * Per WCAG 2.1.4, single-character shortcuts must be configurable.\n   */\n  @Input() menuShortcutKey: string | null = 'M';\n\n  /** Emitted when list item is clicked */\n  @Output() listItemClick = new EventEmitter<{ id: string }>();\n\n  // Internal state\n  isHovering = false;\n  isMenuVisible = false;\n  isListItemFocused = false;\n\n  @ViewChild('trailingViewContainer', { read: ElementRef }) trailingViewContainer?: ElementRef;\n  @ViewChild('menuViewContainer', { read: ElementRef }) menuViewContainer?: ElementRef;\n\n  /**\n   * Determines if avatar should be shown.\n   * Shows avatar when avatarURL or avatarName is provided and no leadingView template.\n   */\n  get showAvatar(): boolean {\n    return !this.leadingView && (!!this.avatarURL?.trim() || !!this.avatarName?.trim());\n  }\n\n  /**\n   * Determines if trailing view should be visible.\n   * Hides when hovering/focused and menuView is present.\n   */\n  get showTrailingView(): boolean {\n    return (\n      !(this.isHovering || this.isMenuVisible || this.isFocused) ||\n      ((this.isHovering || this.isMenuVisible || this.isFocused) && !this.menuView)\n    );\n  }\n\n  /**\n   * Determines if menu view should be visible.\n   * Shows when hovering/focused and menuView template is provided.\n   */\n  get showMenuView(): boolean {\n    return (this.isHovering || this.isMenuVisible || this.isFocused) && !!this.menuView;\n  }\n\n  /**\n   * Generates an accessible label for screen readers.\n   * Combines title and subtitle for complete context.\n   */\n  get computedAriaLabel(): string {\n    if (this.ariaLabel) {\n      return this.ariaLabel;\n    }\n\n    if (this.subtitle) {\n      return `${this.title}, ${this.subtitle}`;\n    }\n\n    return this.title;\n  }\n\n  /**\n   * Generates unique ID for subtitle element (for aria-describedby)\n   */\n  get subtitleId(): string {\n    return `${this.id}-subtitle`;\n  }\n\n  /**\n   * Handles mouse enter event.\n   * Shows menu view and hides trailing view.\n   */\n  onMouseEnter(): void {\n    this.isHovering = true;\n  }\n\n  /**\n   * Handles mouse leave event.\n   * Hides menu view and shows trailing view.\n   */\n  onMouseLeave(): void {\n    this.isHovering = false;\n    // Only hide menu if list item doesn't have focus\n    if (!this.isListItemFocused) {\n      this.isMenuVisible = false;\n    }\n  }\n\n  /**\n   * Handles list item focus event.\n   * Shows menu view when list item receives focus.\n   */\n  onListItemFocus(): void {\n    this.isListItemFocused = true;\n    if (this.menuView) {\n      this.isMenuVisible = true;\n    }\n  }\n\n  /**\n   * Handles list item blur event.\n   * Hides menu view when list item loses focus.\n   */\n  onListItemBlur(): void {\n    this.isListItemFocused = false;\n    // Only hide menu if not hovering\n    if (!this.isHovering) {\n      this.isMenuVisible = false;\n    }\n  }\n\n  /**\n   * Handles list item click event.\n   * Emits listItemClick event with the item ID.\n   * Only triggers if the click target is the list item itself, not nested elements.\n   */\n  handleListItemClick(event: MouseEvent): void {\n    // Check if the click originated from the list item container itself\n    // and not from nested interactive elements\n    const target = event.target as HTMLElement;\n    const listItemElement = event.currentTarget as HTMLElement;\n\n    // If the target is a button, link, or has tabindex, it's an interactive element\n    const isInteractiveElement =\n      target.tagName === 'BUTTON' ||\n      target.tagName === 'A' ||\n      target.hasAttribute('tabindex') ||\n      target.closest('button, a, [tabindex]');\n\n    // Only emit if clicking the list item itself, not nested interactive elements\n    if (!isInteractiveElement || target === listItemElement) {\n      this.listItemClick.emit({ id: this.id });\n    }\n  }\n\n  /**\n   * Handles trailing view click event.\n   * Stops propagation if stopEventPropagation is true.\n   */\n  onTrailingViewClick(event: MouseEvent): void {\n    if (this.stopEventPropagation) {\n      event.stopPropagation();\n    }\n  }\n\n  /**\n   * Handles menu view click event.\n   * Always stops propagation to prevent list item click.\n   */\n  onMenuViewClick(event: MouseEvent): void {\n    event.stopPropagation();\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * Activates list item on Enter or Space key press.\n   * Shows menu on configurable shortcut key (default: M for \"Menu\").\n   * Per WCAG 2.1.4, the shortcut can be disabled by setting menuShortcutKey to null/empty.\n   */\n  onKeyDown(event: KeyboardEvent): void {\n    const target = event.target as HTMLElement;\n    const listItemElement = event.currentTarget as HTMLElement;\n\n    // Only handle keys if focus is on the list item itself, not nested elements\n    if (target !== listItemElement) {\n      return;\n    }\n\n    switch (event.key) {\n      case 'Enter':\n      case ' ': // Space key\n        event.preventDefault();\n        this.listItemClick.emit({ id: this.id });\n        break;\n\n      default:\n        // Handle configurable menu shortcut key (WCAG 2.1.4 compliant)\n        if (this.menuShortcutKey && this.menuView) {\n          const pressedKey = event.key.toLowerCase();\n          const shortcutKey = this.menuShortcutKey.toLowerCase();\n          if (pressedKey === shortcutKey) {\n            event.preventDefault();\n            this.isMenuVisible = !this.isMenuVisible;\n          }\n        }\n        break;\n    }\n  }\n}\n","<div class=\"cometchat\">\n  <div\n    class=\"cometchat-list-item\"\n    role=\"listitem\"\n    [id]=\"id\"\n    [attr.tabindex]=\"disableTabIndex ? null : 0\"\n    [attr.aria-label]=\"computedAriaLabel\"\n    [attr.aria-describedby]=\"subtitle ? subtitleId : null\"\n    (mouseenter)=\"onMouseEnter()\"\n    (mouseleave)=\"onMouseLeave()\"\n    (focus)=\"onListItemFocus()\"\n    (blur)=\"onListItemBlur()\"\n    (click)=\"handleListItemClick($event)\"\n    (keydown)=\"onKeyDown($event)\">\n    \n    <!-- Leading View: Avatar or Custom Template -->\n    <ng-container *ngIf=\"leadingView; else defaultLeadingView\">\n      <ng-container *ngTemplateOutlet=\"leadingView\"></ng-container>\n    </ng-container>\n    \n    <ng-template #defaultLeadingView>\n      <div *ngIf=\"showAvatar\" class=\"cometchat-list-item__leading-view\">\n        <cometchat-avatar\n          [image]=\"avatarURL\"\n          [name]=\"avatarName\">\n        </cometchat-avatar>\n        <div class=\"cometchat-status-indicator cometchat-list-item__status\">\n          <div class=\"cometchat-list-item__status-icon\"></div>\n        </div>\n      </div>\n    </ng-template>\n\n    <!-- Body: Title, Subtitle, Trailing/Menu Views -->\n    <div class=\"cometchat-list-item__body\">\n      <div class=\"cometchat-list-item__title-container\">\n        <!-- Title View: Custom Template or Default Title -->\n        <ng-container *ngIf=\"titleView; else defaultTitleView\">\n          <ng-container *ngTemplateOutlet=\"titleView\"></ng-container>\n        </ng-container>\n        \n        <ng-template #defaultTitleView>\n          <div class=\"cometchat-list-item__body-title\">\n            {{ title }}\n          </div>\n        </ng-template>\n\n        <!-- Subtitle View -->\n        <div \n          class=\"cometchat-list-item__body-subtitle\"\n          [id]=\"subtitleId\"\n          *ngIf=\"subtitleView || subtitle\">\n          <ng-container *ngIf=\"subtitleView\">\n            <ng-container *ngTemplateOutlet=\"subtitleView\"></ng-container>\n          </ng-container>\n          <ng-container *ngIf=\"!subtitleView && subtitle\">\n            {{ subtitle }}\n          </ng-container>\n        </div>\n      </div>\n\n      <!-- Trailing View: Shown when not hovering/focused or no menu -->\n      <div\n        #trailingViewContainer\n        *ngIf=\"showTrailingView\"\n        class=\"cometchat-list-item__trailing-view\"\n        (click)=\"onTrailingViewClick($event)\">\n        <ng-container *ngIf=\"trailingView\">\n          <ng-container *ngTemplateOutlet=\"trailingView\"></ng-container>\n        </ng-container>\n      </div>\n\n      <!-- Menu View: Shown on hover/focus -->\n      <div\n        #menuViewContainer\n        *ngIf=\"showMenuView\"\n        class=\"cometchat-list-item__menu-view\"\n        role=\"group\"\n        [attr.aria-label]=\"'Actions for ' + title\"\n        (click)=\"onMenuViewClick($event)\">\n        <ng-container *ngIf=\"isMenuVisible && menuView\">\n          <ng-container *ngTemplateOutlet=\"menuView\"></ng-container>\n        </ng-container>\n      </div>\n    </div>\n  </div>\n</div>\n","/**\n * Utility functions for CometChatStickersKeyboard component.\n */\nimport { StickerSet } from './cometchat-stickers-keyboard.types';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * Parses the stickers response from the CometChat stickers extension API.\n *\n * The extension returns a response shaped like:\n * ```\n * { data: { defaultStickers: StickerObj[], customStickers: StickerObj[] } }\n * ```\n * where each StickerObj is a flat object:\n * ```\n * { stickerName, stickerSetName, stickerUrl, stickerOrder, stickerSetOrder }\n * ```\n * This function groups the flat sticker objects by `stickerSetName`.\n */\nexport function parseStickersResponse(response: unknown): StickerSet {\n  const stickerSets: StickerSet = {};\n\n  try {\n    const raw = response as Record<string, unknown>;\n\n    // Unwrap nested `data` envelope if present\n    const data = (raw['data'] as Record<string, unknown>) ?? raw;\n\n    const defaultStickers = data['defaultStickers'] as Record<string, unknown>[] | undefined;\n    const customStickers = data['customStickers'] as Record<string, unknown>[] | undefined;\n\n    // Helper: process a flat array of sticker objects and group by stickerSetName\n    const processStickers = (stickers: Record<string, unknown>[], fallbackSet: string) => {\n      for (const sticker of stickers) {\n        const setName = (sticker['stickerSetName'] as string) || fallbackSet;\n        const url = (sticker['stickerUrl'] as string) || '';\n        if (!url) continue;\n\n        if (!stickerSets[setName]) {\n          stickerSets[setName] = [];\n        }\n\n        stickerSets[setName].push({\n          stickerUrl: url,\n          stickerSetName: setName,\n          stickerOrder: Number(sticker['stickerOrder']) || 0,\n        });\n      }\n    };\n\n    if (Array.isArray(defaultStickers)) {\n      processStickers(defaultStickers, 'Default');\n    }\n\n    if (Array.isArray(customStickers)) {\n      processStickers(customStickers, 'Custom');\n    }\n\n    // Sort stickers within each set by order\n    for (const setName of Object.keys(stickerSets)) {\n      stickerSets[setName].sort((a, b) => (a.stickerOrder || 0) - (b.stickerOrder || 0));\n    }\n  } catch (error) {\n    CometChatLogger.error('CometChatStickersKeyboard', 'Error parsing stickers response:', error);\n  }\n\n  return stickerSets;\n}\n\n/**\n * Calculates the new sticker grid index after arrow-key navigation.\n * Handles wrapping at grid boundaries and accounts for incomplete last rows.\n *\n * @param key - Arrow key pressed ('ArrowUp' | 'ArrowDown' | 'ArrowLeft' | 'ArrowRight')\n * @param currentIndex - Current flat index in the sticker grid\n * @param totalStickers - Total number of stickers in the current category\n * @param gridColumns - Number of columns in the grid\n * @returns New flat index after navigation\n */\nexport function navigateStickerGridIndex(\n  key: string,\n  currentIndex: number,\n  totalStickers: number,\n  gridColumns: number\n): number {\n  if (totalStickers === 0) return currentIndex;\n\n  let newIndex = currentIndex;\n  const currentRow = Math.floor(currentIndex / gridColumns);\n  const currentCol = currentIndex % gridColumns;\n  const totalRows = Math.ceil(totalStickers / gridColumns);\n  const lastRowStartIndex = (totalRows - 1) * gridColumns;\n\n  switch (key) {\n    case 'ArrowLeft':\n      if (currentCol === 0) {\n        // At left edge - wrap to end of current row or last item in row\n        const rowEndIndex = Math.min(\n          currentRow * gridColumns + gridColumns - 1,\n          totalStickers - 1\n        );\n        newIndex = rowEndIndex;\n      } else {\n        newIndex = currentIndex - 1;\n      }\n      break;\n\n    case 'ArrowRight': {\n      const isLastItemInRow = currentCol === gridColumns - 1;\n      const isLastItem = currentIndex === totalStickers - 1;\n      if (isLastItemInRow || isLastItem) {\n        // At right edge or last item - wrap to start of current row\n        newIndex = currentRow * gridColumns;\n      } else {\n        newIndex = currentIndex + 1;\n      }\n      break;\n    }\n\n    case 'ArrowUp':\n      if (currentRow === 0) {\n        // At top row - wrap to bottom row, same column if possible\n        const targetIndex = lastRowStartIndex + currentCol;\n        newIndex = targetIndex < totalStickers ? targetIndex : totalStickers - 1;\n      } else {\n        newIndex = currentIndex - gridColumns;\n      }\n      break;\n\n    case 'ArrowDown':\n      if (currentRow === totalRows - 1) {\n        // At bottom row - wrap to top row, same column\n        newIndex = currentCol;\n      } else {\n        const targetIndex = currentIndex + gridColumns;\n        // Handle case where next row has fewer items\n        newIndex = targetIndex < totalStickers ? targetIndex : totalStickers - 1;\n      }\n      break;\n  }\n\n  // Ensure newIndex is within bounds\n  return Math.max(0, Math.min(newIndex, totalStickers - 1));\n}\n\n/**\n * Returns the focusable element selectors used for focus-trap in the stickers keyboard.\n */\nexport const STICKERS_FOCUSABLE_SELECTORS = [\n  '.cometchat-stickers-keyboard__tab',\n  '.cometchat-stickers-keyboard__sticker-item',\n  '.cometchat-stickers-keyboard__retry-button',\n];\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  HostListener,\n  signal,\n  computed,\n  ViewChild,\n  ElementRef,\n  inject, OnDestroy, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { getLocalizedString } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\nexport type { StickerClickEvent, StickerItem, StickerSet, ComponentState } from './cometchat-stickers-keyboard.types';\nimport type { StickerClickEvent, StickerItem, StickerSet, ComponentState } from './cometchat-stickers-keyboard.types';\nimport { parseStickersResponse, navigateStickerGridIndex, STICKERS_FOCUSABLE_SELECTORS } from './cometchat-stickers-keyboard.utils';\n\n/**\n * CometChatStickersKeyboard Component\n *\n * A component for browsing and selecting stickers from the CometChat stickers extension.\n * Displays stickers organized by category tabs with a grid layout.\n *\n * @example\n * ```html\n * <cometchat-stickers-keyboard\n *   (stickerClick)=\"onStickerSelect($event)\"\n *   (closeKeyboard)=\"onCloseStickers()\">\n * </cometchat-stickers-keyboard>\n * ```\n *\n * @see Requirements 8.4, 8.5, 8.6, 8.8, 8.9, 8.10\n */\n@Component({\n  selector: 'cometchat-stickers-keyboard',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-stickers-keyboard.component.html',\n  styleUrls: ['./cometchat-stickers-keyboard.component.css'],\n})\nexport class CometChatStickersKeyboardComponent implements OnInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  /** Custom text for error state */\n  @Input() errorStateText?: string;\n\n  /** Custom text for empty state */\n  @Input() emptyStateText?: string;\n\n  /** Whether to automatically focus the first tab on open */\n  @Input() autoFocus = true;\n\n  /** Whether to trap focus within the keyboard */\n  @Input() trapFocus = true;\n\n  /** Emitted when a sticker is clicked */\n  @Output() stickerClick = new EventEmitter<StickerClickEvent>();\n\n  /** Emitted when the keyboard should close (e.g., Escape key pressed) */\n  @Output() closeKeyboard = new EventEmitter<void>();\n\n  @ViewChild('tabsContainer') tabsContainer!: ElementRef<HTMLDivElement>;\n\n  // Inject LiveAnnouncerService for accessibility announcements\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  // Internal state using signals\n  protected componentState = signal<ComponentState>('loading');\n  protected stickerSets = signal<StickerSet>({});\n  protected activeCategory = signal<string>('');\n  protected focusedStickerIndex = signal<number>(-1);\n  protected focusedTabIndex = signal<number>(0);\n  protected loadedImages = signal<Set<string>>(new Set());\n\n  // Computed values\n  protected categoryNames = computed(() => Object.keys(this.stickerSets()));\n  protected currentStickers = computed(() => {\n    const sets = this.stickerSets();\n    const category = this.activeCategory();\n    return sets[category] || [];\n  });\n\n  // Grid configuration\n  protected readonly gridColumns = 4;\n  protected readonly shimmerTabs = Array.from({ length: 6 });\n  protected readonly shimmerStickers = Array.from({ length: 12 });\n\n  ngOnInit(): void {\n    this.fetchStickers();\n  }\n\n  /**\n   * Loads pre-provided sticker data directly (bypasses SDK fetch).\n   *\n   * Intended for Storybook/testing scenarios — called by the story wrapper\n   * component to seed sticker data without hitting the SDK.\n   */\n  public loadStickerData(data: StickerSet): void {\n    this.stickerSets.set(data);\n    const categories = Object.keys(data);\n    if (categories.length > 0) {\n      this.activeCategory.set(categories[0]);\n    }\n    this.componentState.set('loaded');\n  }\n\n  /**\n   * Overrides the component state directly.\n   *\n   * Intended for Storybook/testing scenarios — called by the story wrapper\n   * to render loading/error/empty states without triggering the SDK fetch.\n   */\n  public setComponentState(state: ComponentState): void {\n    this.componentState.set(state);\n  }\n\n  /**\n   * Fetches stickers from the CometChat stickers extension.\n   * Retries once if the first attempt fails (handles SDK not ready after page refresh).\n   * @see Requirements 8.4, 8.14, 8.15\n   */\n  async fetchStickers(): Promise<void> {\n    this.componentState.set('loading');\n    this.liveAnnouncer.announce(getLocalizedString('accessibility_loading_stickers'), 'polite');\n\n    // Check if user is logged in before attempting extension call\n    let loggedInUser: CometChat.User | null = null;\n    try {\n      loggedInUser = await CometChat.getLoggedinUser();\n    } catch {\n      // SDK not ready\n    }\n\n    if (!loggedInUser) {\n      // SDK not ready yet — retry after a short delay\n      await new Promise(resolve => {\n        const timer = setTimeout(resolve, 1500);\n        this.pendingTimers.push(timer);\n      });\n      try {\n        loggedInUser = await CometChat.getLoggedinUser();\n      } catch {\n        // Still not ready\n      }\n      if (!loggedInUser) {\n        this.componentState.set('error');\n        return;\n      }\n    }\n\n    try {\n      const response = await CometChat.callExtension('stickers', 'GET', 'v1/fetch', undefined);\n      if (response && typeof response === 'object') {\n        this.applyFetchedStickers(this.parseStickersResponse(response));\n      } else {\n        this.componentState.set('empty');\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatStickersKeyboard', 'Error fetching stickers:', error);\n      this.componentState.set('error');\n    }\n  }\n\n  /** Applies parsed sticker data to component state after a successful fetch. */\n  private applyFetchedStickers(stickerData: StickerSet): void {\n    if (Object.keys(stickerData).length === 0) {\n      this.componentState.set('empty');\n      return;\n    }\n    this.stickerSets.set(stickerData);\n    const categories = Object.keys(stickerData);\n    if (categories.length > 0) {\n      this.activeCategory.set(categories[0]);\n    }\n    this.componentState.set('loaded');\n    this.liveAnnouncer.announce(\n      getLocalizedString('accessibility_sticker_categories_loaded').replace(\n        '{count}',\n        categories.length.toString()\n      ),\n      'polite'\n    );\n    if (this.autoFocus) {\n      this.pendingTimers.push(setTimeout(() => {\n        const firstTab = document.querySelector('.cometchat-stickers-keyboard__tab') as HTMLElement;\n        firstTab?.focus();\n      }, 100));\n    }\n  }\n\n  /**\n   * Parses the stickers response from the extension API.\n   * Delegates to the pure utility function in cometchat-stickers-keyboard.utils.ts.\n   */\n  private parseStickersResponse(response: unknown): StickerSet {\n    return parseStickersResponse(response);\n  }\n\n  /**\n   * Handles category tab click\n   * @see Requirements 8.5\n   */\n  onCategoryClick(categoryName: string): void {\n    this.activeCategory.set(categoryName);\n    this.focusedStickerIndex.set(-1);\n    // Keep the roving tab anchor on the selected category.\n    this.focusedTabIndex.set(this.categoryNames().indexOf(categoryName));\n  }\n\n  /**\n   * Handles sticker click - emits the sticker selection event and closes the keyboard\n   * @see Requirements 8.7\n   */\n  handleStickerClick(sticker: StickerItem): void {\n    this.stickerClick.emit({\n      stickerUrl: sticker.stickerUrl,\n      stickerName: sticker.stickerSetName,\n    });\n    // Close the keyboard after sending a sticker\n    this.closeKeyboard.emit();\n  }\n\n  /**\n   * Handles retry button click in error state\n   */\n  handleRetry(): void {\n    this.fetchStickers();\n  }\n\n  /**\n   * Tracks loaded sticker images to swap shimmer placeholders for the real image.\n   */\n  onImageLoaded(url: string): void {\n    this.loadedImages.update(prev => {\n      const next = new Set(prev);\n      next.add(url);\n      return next;\n    });\n  }\n\n  /**\n   * Gets the error state text\n   * @see Requirements 8.10\n   */\n  getErrorText(): string {\n    return this.errorStateText || getLocalizedString('sticker_error');\n  }\n\n  /**\n   * Gets the empty state text\n   * @see Requirements 8.9\n   */\n  getEmptyText(): string {\n    return this.emptyStateText || getLocalizedString('sticker_empty');\n  }\n\n  /**\n   * Handles keyboard navigation for sticker grid\n   * @see Requirements 8.12\n   */\n  onStickerKeydown(event: KeyboardEvent, sticker: StickerItem, index: number): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.handleStickerClick(sticker);\n    } else if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n      event.preventDefault();\n      this.navigateStickerGrid(event.key, index);\n    }\n  }\n\n  /**\n   * Navigates within the sticker grid using arrow keys.\n   * Delegates index calculation to the pure utility function.\n   * @see Requirements 8.12\n   */\n  private navigateStickerGrid(key: string, currentIndex: number): void {\n    const stickers = this.currentStickers();\n    if (stickers.length === 0) return;\n\n    const newIndex = navigateStickerGridIndex(key, currentIndex, stickers.length, this.gridColumns);\n    this.focusedStickerIndex.set(newIndex);\n\n    // Use setTimeout to ensure DOM is updated before focusing\n    this.pendingTimers.push(setTimeout(() => {\n      const stickerElements = document.querySelectorAll(\n        '.cometchat-stickers-keyboard__sticker-item'\n      );\n      const targetElement = stickerElements[newIndex] as HTMLElement;\n      if (targetElement) {\n        targetElement.focus();\n        targetElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      }\n    }, 0));\n  }\n\n  /**\n   * Handles keyboard navigation for category tabs\n   */\n  onTabKeydown(event: KeyboardEvent, categoryName: string, index: number): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onCategoryClick(categoryName);\n    } else if (event.key === 'ArrowLeft') {\n      event.preventDefault();\n      this.focusTab(index > 0 ? index - 1 : this.categoryNames().length - 1);\n    } else if (event.key === 'ArrowRight') {\n      event.preventDefault();\n      this.focusTab(index < this.categoryNames().length - 1 ? index + 1 : 0);\n    }\n  }\n\n  /** Focuses a tab by index */\n  private focusTab(newIndex: number): void {\n    this.focusedTabIndex.set(newIndex);\n    const tabs = document.querySelectorAll('.cometchat-stickers-keyboard__tab');\n    (tabs[newIndex] as HTMLElement)?.focus();\n  }\n\n  /** Handles horizontal scroll for category tabs */\n  onWheel(event: WheelEvent): void {\n    const container = this.tabsContainer?.nativeElement;\n    if (container) {\n      const scrollAmount = (event.deltaMode === 1 || event.deltaY > 100)\n        ? event.deltaY * 0.2\n        : event.deltaY * 0.5;\n      container.scrollTo({ top: 0, left: container.scrollLeft + scrollAmount, behavior: 'auto' });\n    }\n  }\n\n  /** Handles global keyboard events for focus trap and Escape shortcut */\n  @HostListener('keydown', ['$event'])\n  onKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.closeKeyboard.emit();\n      return;\n    }\n    if (this.trapFocus && event.key === 'Tab') {\n      this.handleFocusTrap(event);\n    }\n  }\n\n  /** Implements focus trap - cycles focus within component */\n  private handleFocusTrap(event: KeyboardEvent): void {\n    const focusableElements = Array.from(\n      document.querySelectorAll(STICKERS_FOCUSABLE_SELECTORS.join(','))\n    ) as HTMLElement[];\n    if (focusableElements.length === 0) return;\n    const first = focusableElements[0];\n    const last = focusableElements[focusableElements.length - 1];\n    const active = document.activeElement as HTMLElement;\n    if (event.shiftKey && active === first) {\n      event.preventDefault();\n      last.focus();\n    } else if (!event.shiftKey && active === last) {\n      event.preventDefault();\n      first.focus();\n    }\n  }\n\n  /** TrackBy for category list */\n  trackByCategoryName(_index: number, categoryName: string): string {\n    return categoryName;\n  }\n\n  /** TrackBy for sticker list */\n  trackByStickerUrl(_index: number, sticker: StickerItem): string {\n    return sticker.stickerUrl;\n  }\n\n  /** Gets the first sticker URL from a category to use as tab icon */\n  getCategoryIcon(categoryName: string): string {\n    const stickers = this.stickerSets()[categoryName];\n    return stickers?.length > 0 ? stickers[0].stickerUrl : '';\n  }\n\n  /** Gets the 1-based row index for ARIA grid navigation */\n  getRowIndex(index: number): number {\n    return Math.floor(index / this.gridColumns) + 1;\n  }\n\n  /** Gets the 1-based column index for ARIA grid navigation */\n  getColIndex(index: number): number {\n    return (index % this.gridColumns) + 1;\n  }\n\n  /** Total number of grid rows for the current category (aria-rowcount). */\n  getRowCount(): number {\n    return Math.ceil(this.currentStickers().length / this.gridColumns);\n  }\n\n  /** Roving tabindex for category tabs: only the focused tab is in tab order. */\n  getTabTabIndex(index: number): number {\n    return index === this.focusedTabIndex() ? 0 : -1;\n  }\n\n  /** Roving tabindex for sticker cells: focused cell (or first when none) is tabbable. */\n  getStickerTabIndex(index: number): number {\n    const focused = this.focusedStickerIndex();\n    return focused === -1 ? (index === 0 ? 0 : -1) : (index === focused ? 0 : -1);\n  }\n\n  /** Keeps the roving anchor in sync when a sticker cell receives focus. */\n  onStickerFocus(index: number): void {\n    this.focusedStickerIndex.set(index);\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n  }\n}\n","<div\n  class=\"cometchat-stickers-keyboard\"\n  role=\"dialog\"\n  [attr.aria-label]=\"'sticker_keyboard' | translate\"\n  aria-modal=\"true\"\n>\n  <!-- Loading State (Shimmer) -->\n  @if (componentState() === 'loading') {\n    <div class=\"cometchat-stickers-keyboard__shimmer\" role=\"status\" aria-live=\"polite\">\n      <div class=\"cometchat-stickers-keyboard__shimmer-tabs\">\n        @for (i of shimmerTabs; track i) {\n          <div class=\"cometchat-stickers-keyboard__shimmer-tab\"></div>\n        }\n      </div>\n      <div class=\"cometchat-stickers-keyboard__shimmer-grid\">\n        @for (i of shimmerStickers; track i) {\n          <div class=\"cometchat-stickers-keyboard__shimmer-sticker\"></div>\n        }\n      </div>\n    </div>\n  }\n\n  <!-- Error State -->\n  @if (componentState() === 'error') {\n    <div class=\"cometchat-stickers-keyboard__error\" role=\"alert\" aria-live=\"assertive\">\n      <div class=\"cometchat-stickers-keyboard__error-icon\">\n        <span class=\"cometchat-stickers-keyboard__error-icon-mask\" aria-hidden=\"true\"></span>\n      </div>\n      <span class=\"cometchat-stickers-keyboard__error-text\">{{ getErrorText() }}</span>\n      <button\n        class=\"cometchat-stickers-keyboard__retry-button\"\n        (click)=\"handleRetry()\"\n        type=\"button\"\n        [attr.aria-label]=\"'sticker_retry' | translate\"\n      >\n        {{ 'sticker_retry' | translate }}\n      </button>\n    </div>\n  }\n\n  <!-- Empty State -->\n  @if (componentState() === 'empty') {\n    <div class=\"cometchat-stickers-keyboard__empty\" role=\"status\" aria-live=\"polite\">\n      <div class=\"cometchat-stickers-keyboard__empty-icon\">\n        <span class=\"cometchat-stickers-keyboard__empty-icon-mask\" aria-hidden=\"true\"></span>\n      </div>\n      <span class=\"cometchat-stickers-keyboard__empty-text\">{{ getEmptyText() }}</span>\n    </div>\n  }\n\n  <!-- Loaded State -->\n  @if (componentState() === 'loaded') {\n    <!-- Category tabs with horizontal scroll -->\n    <div\n      class=\"cometchat-stickers-keyboard__tabs\"\n      #tabsContainer\n      (wheel)=\"onWheel($event)\"\n      role=\"tablist\"\n      [attr.aria-label]=\"'sticker_categories_aria_label' | translate\"\n    >\n      @for (categoryName of categoryNames(); track trackByCategoryName($index, categoryName); let i = $index) {\n        <div\n          class=\"cometchat-stickers-keyboard__tab\"\n          [class.cometchat-stickers-keyboard__tab--active]=\"activeCategory() === categoryName\"\n          (click)=\"onCategoryClick(categoryName)\"\n          (keydown)=\"onTabKeydown($event, categoryName, i)\"\n          [title]=\"categoryName\"\n          role=\"tab\"\n          [attr.aria-selected]=\"activeCategory() === categoryName\"\n          [attr.aria-label]=\"categoryName\"\n          [attr.tabindex]=\"getTabTabIndex(i)\"\n        >\n          <img\n            class=\"cometchat-stickers-keyboard__tab-icon\"\n            [src]=\"getCategoryIcon(categoryName)\"\n            [alt]=\"categoryName\"\n            loading=\"lazy\"\n          />\n        </div>\n      }\n    </div>\n\n    <!-- Sticker grid -->\n    <div\n      class=\"cometchat-stickers-keyboard__grid\"\n      role=\"grid\"\n      [attr.aria-label]=\"activeCategory() + ' stickers'\"\n      [attr.aria-rowcount]=\"getRowCount()\"\n    >\n      @for (sticker of currentStickers(); track trackByStickerUrl($index, sticker); let i = $index) {\n        <div\n          class=\"cometchat-stickers-keyboard__sticker-item\"\n          (click)=\"handleStickerClick(sticker)\"\n          (keydown)=\"onStickerKeydown($event, sticker, i)\"\n          (focus)=\"onStickerFocus(i)\"\n          [title]=\"sticker.stickerSetName\"\n          role=\"gridcell\"\n          [attr.tabindex]=\"getStickerTabIndex(i)\"\n          [attr.aria-label]=\"'Sticker ' + (i + 1) + ' from ' + sticker.stickerSetName\"\n          [attr.aria-rowindex]=\"getRowIndex(i)\"\n          [attr.aria-colindex]=\"getColIndex(i)\"\n        >\n          @if (!loadedImages().has(sticker.stickerUrl)) {\n            <div class=\"cometchat-stickers-keyboard__sticker-shimmer\"></div>\n          }\n          <img\n            class=\"cometchat-stickers-keyboard__sticker-image\"\n            [class.cometchat-stickers-keyboard__sticker-image--loaded]=\"loadedImages().has(sticker.stickerUrl)\"\n            [src]=\"sticker.stickerUrl\"\n            [alt]=\"sticker.stickerSetName\"\n            loading=\"lazy\"\n            (load)=\"onImageLoaded(sticker.stickerUrl)\"\n          />\n        </div>\n      }\n    </div>\n  }\n</div>\n","/**\n * Event Emitter\n *\n * A simple event emitter that can be used to listen to and emit events.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nexport type GeneralEventTypes = {\n  // the name of the event and the data it dispatches with\n  // e.g. 'entryCreated': [count: 1]\n  [EventName: string]: unknown[];\n};\n\ntype EventListener<EventTypes extends GeneralEventTypes, EventName extends keyof EventTypes> = (\n  ...args: EventTypes[EventName]\n) => void;\n\ntype EventMap<EventTypes extends GeneralEventTypes> = {\n  [EventName in keyof EventTypes]: Set<EventListener<EventTypes, EventName>>;\n};\n\n/** A simple event emitter that can be used to listen to and emit events. */\nclass EventEmitter<EventTypes extends GeneralEventTypes> {\n  private listeners = {} as EventMap<EventTypes>;\n\n  /** Subscribe to an event. Returns an unsubscribe function. */\n  public on<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: EventListener<EventTypes, EventName>,\n    options?: { once?: boolean }\n  ): () => void {\n    if (!this.listeners[event]) {\n      this.listeners[event] = new Set();\n    }\n    this.listeners[event].add(listener);\n\n    if (options?.once) {\n      const unsubscribeOnce = () => {\n        this.un(event, unsubscribeOnce);\n        this.un(event, listener);\n      };\n      this.on(event, unsubscribeOnce);\n      return unsubscribeOnce;\n    }\n\n    return () => this.un(event, listener);\n  }\n\n  /** Unsubscribe from an event */\n  public un<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: EventListener<EventTypes, EventName>\n  ): void {\n    this.listeners[event]?.delete(listener);\n  }\n\n  /** Subscribe to an event only once */\n  public once<EventName extends keyof EventTypes>(\n    event: EventName,\n    listener: EventListener<EventTypes, EventName>\n  ): () => void {\n    return this.on(event, listener, { once: true });\n  }\n\n  /** Clear all events */\n  public unAll(): void {\n    this.listeners = {} as EventMap<EventTypes>;\n  }\n\n  /** Emit an event */\n  protected emit<EventName extends keyof EventTypes>(\n    eventName: EventName,\n    ...args: EventTypes[EventName]\n  ): void {\n    if (this.listeners[eventName]) {\n      this.listeners[eventName].forEach((listener) => listener(...args));\n    }\n  }\n}\n\nexport default EventEmitter;\n","/**\n * Base Plugin\n *\n * Base class for WaveSurfer plugins.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nimport EventEmitter from './event-emitter';\nimport type WaveSurfer from './wavesurfer';\n\nexport type BasePluginEvents = {\n  destroy: [];\n};\n\nexport type GenericPlugin = BasePlugin<BasePluginEvents, unknown>;\n\n/** Base class for wavesurfer plugins */\nexport class BasePlugin<\n  EventTypes extends BasePluginEvents,\n  Options\n> extends EventEmitter<EventTypes> {\n  protected wavesurfer?: WaveSurfer;\n  protected subscriptions: (() => void)[] = [];\n  protected options: Options;\n\n  /** Create a plugin instance */\n  constructor(options: Options) {\n    super();\n    this.options = options;\n  }\n\n  /** Called after this.wavesurfer is available */\n  protected onInit() {\n    return;\n  }\n\n  /** Do not call directly, only called by WavesSurfer internally */\n  public _init(wavesurfer: WaveSurfer) {\n    this.wavesurfer = wavesurfer;\n    this.onInit();\n  }\n\n  /** Destroy the plugin and unsubscribe from all events */\n  public destroy() {\n    this.emit('destroy');\n    this.subscriptions.forEach((unsubscribe) => unsubscribe());\n  }\n}\n\nexport default BasePlugin;\n","/**\n * Decoder\n *\n * Audio decoding utilities using Web Audio API.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\n/** Decode an array buffer into an audio buffer */\nasync function decode(audioData: ArrayBuffer, sampleRate: number): Promise<AudioBuffer> {\n  const audioCtx = new AudioContext({ sampleRate });\n  const decode = audioCtx.decodeAudioData(audioData);\n  return decode.finally(() => audioCtx.close());\n}\n\n/** Normalize peaks to -1..1 */\nfunction normalize<T extends Array<Float32Array | number[]>>(channelData: T): T {\n  const firstChannel = channelData[0];\n  if (firstChannel.some((n) => n > 1 || n < -1)) {\n    const length = firstChannel.length;\n    let max = 0;\n    for (let i = 0; i < length; i++) {\n      const absN = Math.abs(firstChannel[i]);\n      if (absN > max) max = absN;\n    }\n    for (const channel of channelData) {\n      for (let i = 0; i < length; i++) {\n        channel[i] /= max;\n      }\n    }\n  }\n  return channelData;\n}\n\n/** Create an audio buffer from pre-decoded audio data */\nfunction createBuffer(\n  channelData: Array<Float32Array | number[]>,\n  duration: number\n): AudioBuffer {\n  // If a single array of numbers is passed, make it an array of arrays\n  if (typeof channelData[0] === 'number')\n    channelData = [channelData as unknown as number[]];\n\n  // Normalize to -1..1\n  normalize(channelData);\n\n  return {\n    duration,\n    length: channelData[0].length,\n    sampleRate: channelData[0].length / duration,\n    numberOfChannels: channelData.length,\n    getChannelData: (i: number) => channelData?.[i] as unknown as Float32Array<ArrayBuffer>,\n    copyFromChannel: AudioBuffer.prototype.copyFromChannel,\n    copyToChannel: AudioBuffer.prototype.copyToChannel,\n  };\n}\n\nconst Decoder = {\n  decode,\n  createBuffer,\n};\n\nexport default Decoder;\n","/**\n * DOM Utilities\n *\n * Helper functions for creating DOM elements.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\ntype TreeNode = {\n  [key: string]: string | number | boolean | CSSStyleDeclaration | TreeNode | Node;\n} & {\n  xmlns?: string;\n  style?: Partial<CSSStyleDeclaration>;\n  textContent?: string | Node;\n  children?: TreeNode;\n};\n\nfunction renderNode(tagName: string, content: TreeNode): HTMLElement | SVGElement {\n  const element = content.xmlns\n    ? (document.createElementNS(content.xmlns, tagName) as SVGElement)\n    : (document.createElement(tagName) as HTMLElement);\n\n  for (const [key, value] of Object.entries(content)) {\n    if (key === 'children') {\n      for (const [childKey, childValue] of Object.entries(content)) {\n        if (typeof childValue === 'string') {\n          element.appendChild(document.createTextNode(childValue));\n        } else {\n          element.appendChild(renderNode(childKey, childValue as TreeNode));\n        }\n      }\n    } else if (key === 'style') {\n      Object.assign((element as HTMLElement).style, value);\n    } else if (key === 'textContent') {\n      element.textContent = value as string;\n    } else {\n      element.setAttribute(key, value.toString());\n    }\n  }\n\n  return element;\n}\n\nexport function createElement(\n  tagName: string,\n  content: TreeNode & { xmlns: string },\n  container?: Node\n): SVGElement;\nexport function createElement(\n  tagName: string,\n  content?: TreeNode,\n  container?: Node\n): HTMLElement;\nexport function createElement(\n  tagName: string,\n  content?: TreeNode,\n  container?: Node\n): HTMLElement | SVGElement {\n  const el = renderNode(tagName, content || {});\n  container?.appendChild(el);\n  return el;\n}\n\nexport default createElement;\n","/**\n * Fetcher\n *\n * Audio file fetching utilities with progress tracking.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nasync function watchProgress(\n  response: Response,\n  progressCallback: (percentage: number) => void\n) {\n  if (!response.body || !response.headers) return;\n  const reader = response.body.getReader();\n\n  const contentLength = Number(response.headers.get('Content-Length')) || 0;\n  let receivedLength = 0;\n\n  // Process the data\n  const processChunk = async (value: Uint8Array | undefined) => {\n    // Add to the received length\n    receivedLength += value?.length || 0;\n    const percentage = Math.round((receivedLength / contentLength) * 100);\n    progressCallback(percentage);\n  };\n\n  const read = async () => {\n    let data;\n    try {\n      data = await reader.read();\n    } catch {\n      // Ignore errors because we can only handle the main response\n      return;\n    }\n\n    // Continue reading data until done\n    if (!data.done) {\n      processChunk(data.value);\n      await read();\n    }\n  };\n\n  read();\n}\n\nasync function fetchBlob(\n  url: string,\n  progressCallback: (percentage: number) => void,\n  requestInit?: RequestInit\n): Promise<Blob> {\n  // Fetch the resource\n  const response = await fetch(url, requestInit);\n\n  if (response.status >= 400) {\n    throw new Error(\n      `Failed to fetch ${url}: ${response.status} (${response.statusText})`\n    );\n  }\n\n  // Read the data to track progress\n  watchProgress(response.clone(), progressCallback);\n\n  return response.blob();\n}\n\nconst Fetcher = {\n  fetchBlob,\n};\n\nexport default Fetcher;\n","/**\n * Player\n *\n * HTMLMediaElement wrapper for audio playback.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nimport EventEmitter, { type GeneralEventTypes } from './event-emitter';\n\ntype PlayerOptions = {\n  media?: HTMLMediaElement;\n  mediaControls?: boolean;\n  autoplay?: boolean;\n  playbackRate?: number;\n};\n\nclass Player<T extends GeneralEventTypes> extends EventEmitter<T> {\n  protected media: HTMLMediaElement;\n  private isExternalMedia = false;\n\n  constructor(options: PlayerOptions) {\n    super();\n\n    if (options.media) {\n      this.media = options.media;\n      this.isExternalMedia = true;\n    } else {\n      this.media = document.createElement('audio');\n    }\n    // Controls\n    if (options.mediaControls) {\n      this.media.controls = true;\n    }\n    // Autoplay\n    if (options.autoplay) {\n      this.media.autoplay = true;\n    }\n    // Speed\n    if (options.playbackRate != null) {\n      this.onMediaEvent(\n        'canplay',\n        () => {\n          if (options.playbackRate != null) {\n            this.media.playbackRate = options.playbackRate;\n          }\n        },\n        { once: true }\n      );\n    }\n  }\n\n  protected onMediaEvent<K extends keyof HTMLElementEventMap>(\n    event: K,\n    callback: (ev: HTMLElementEventMap[K]) => void,\n    options?: boolean | AddEventListenerOptions\n  ): () => void {\n    this.media.addEventListener(event, callback, options);\n    return () => this.media.removeEventListener(event, callback, options);\n  }\n\n  protected getSrc() {\n    return this.media.currentSrc || this.media.src || '';\n  }\n\n  private revokeSrc() {\n    const src = this.getSrc();\n    if (src.startsWith('blob:')) {\n      URL.revokeObjectURL(src);\n    }\n  }\n\n  private canPlayType(type: string): boolean {\n    return this.media.canPlayType(type) !== '';\n  }\n\n  protected setSrc(url: string, blob?: Blob) {\n    const src = this.getSrc();\n    if (url && src === url) return;\n    this.revokeSrc();\n    const newSrc =\n      blob instanceof Blob && (this.canPlayType(blob.type) || !url)\n        ? URL.createObjectURL(blob)\n        : url;\n    try {\n      this.media.src = newSrc;\n    } catch (e) {\n      this.media.src = url;\n    }\n  }\n\n  protected destroy() {\n    this.media.pause();\n\n    if (this.isExternalMedia) return;\n    this.media.remove();\n    this.revokeSrc();\n    this.media.src = '';\n    // Load resets the media element to its initial state\n    this.media.load();\n  }\n\n  protected setMediaElement(element: HTMLMediaElement) {\n    this.media = element;\n  }\n\n  /** Start playing the audio */\n  public async play(): Promise<void> {\n    return this.media.play();\n  }\n\n  /** Pause the audio */\n  public pause(): void {\n    this.media.pause();\n  }\n\n  /** Check if the audio is playing */\n  public isPlaying(): boolean {\n    return !this.media.paused && !this.media.ended;\n  }\n\n  /** Jump to a specific time in the audio (in seconds) */\n  public setTime(time: number) {\n    this.media.currentTime = time;\n  }\n\n  /** Get the duration of the audio in seconds */\n  public getDuration(): number {\n    return this.media.duration;\n  }\n\n  /** Get the current audio position in seconds */\n  public getCurrentTime(): number {\n    return this.media.currentTime;\n  }\n\n  /** Get the audio volume */\n  public getVolume(): number {\n    return this.media.volume;\n  }\n\n  /** Set the audio volume */\n  public setVolume(volume: number) {\n    this.media.volume = volume;\n  }\n\n  /** Get the audio muted state */\n  public getMuted(): boolean {\n    return this.media.muted;\n  }\n\n  /** Mute or unmute the audio */\n  public setMuted(muted: boolean) {\n    this.media.muted = muted;\n  }\n\n  /** Get the playback speed */\n  public getPlaybackRate(): number {\n    return this.media.playbackRate;\n  }\n\n  /** Check if the audio is seeking */\n  public isSeeking(): boolean {\n    return this.media.seeking;\n  }\n\n  /** Set the playback speed, pass an optional false to NOT preserve the pitch */\n  public setPlaybackRate(rate: number, preservePitch?: boolean) {\n    // preservePitch is true by default in most browsers\n    if (preservePitch != null) {\n      this.media.preservesPitch = preservePitch;\n    }\n    this.media.playbackRate = rate;\n  }\n\n  /** Get the HTML media element */\n  public getMediaElement(): HTMLMediaElement {\n    return this.media;\n  }\n\n  /** Set a sink id to change the audio output device */\n  public setSinkId(sinkId: string): Promise<void> {\n    // See https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId\n    const media = this.media as HTMLAudioElement & {\n      setSinkId: (sinkId: string) => Promise<void>;\n    };\n    return media.setSinkId(sinkId);\n  }\n}\n\nexport default Player;\n","/**\n * Draggable\n *\n * Makes an element draggable with pointer events.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nexport function makeDraggable(\n  element: HTMLElement | null,\n  onDrag: (dx: number, dy: number, x: number, y: number) => void,\n  onStart?: (x: number, y: number) => void,\n  onEnd?: (x: number, y: number) => void,\n  threshold = 3,\n  mouseButton = 0,\n  touchDelay = 100\n): () => void {\n  if (!element) return () => void 0;\n\n  const isTouchDevice = matchMedia('(pointer: coarse)').matches;\n\n  let unsubscribeDocument: () => void = () => void 0;\n\n  const onPointerDown = (event: PointerEvent) => {\n    if (event.button !== mouseButton) return;\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    let startX = event.clientX;\n    let startY = event.clientY;\n    let isDragging = false;\n    const touchStartTime = Date.now();\n\n    const onPointerMove = (event: PointerEvent) => {\n      event.preventDefault();\n      event.stopPropagation();\n\n      if (isTouchDevice && Date.now() - touchStartTime < touchDelay) return;\n\n      const x = event.clientX;\n      const y = event.clientY;\n      const dx = x - startX;\n      const dy = y - startY;\n\n      if (isDragging || Math.abs(dx) > threshold || Math.abs(dy) > threshold) {\n        const rect = element.getBoundingClientRect();\n        const { left, top } = rect;\n\n        if (!isDragging) {\n          onStart?.(startX - left, startY - top);\n          isDragging = true;\n        }\n\n        onDrag(dx, dy, x - left, y - top);\n\n        startX = x;\n        startY = y;\n      }\n    };\n\n    const onPointerUp = (event: PointerEvent) => {\n      if (isDragging) {\n        const x = event.clientX;\n        const y = event.clientY;\n        const rect = element.getBoundingClientRect();\n        const { left, top } = rect;\n\n        onEnd?.(x - left, y - top);\n      }\n      unsubscribeDocument();\n    };\n\n    const onPointerLeave = (e: PointerEvent) => {\n      // Listen to events only on the document and not on inner elements\n      if (!e.relatedTarget || e.relatedTarget === document.documentElement) {\n        onPointerUp(e);\n      }\n    };\n\n    const onClick = (event: MouseEvent) => {\n      if (isDragging) {\n        event.stopPropagation();\n        event.preventDefault();\n      }\n    };\n\n    const onTouchMove = (event: TouchEvent) => {\n      if (isDragging) {\n        event.preventDefault();\n      }\n    };\n\n    document.addEventListener('pointermove', onPointerMove);\n    document.addEventListener('pointerup', onPointerUp);\n    document.addEventListener('pointerout', onPointerLeave);\n    document.addEventListener('pointercancel', onPointerLeave);\n    document.addEventListener('touchmove', onTouchMove, { passive: false });\n    document.addEventListener('click', onClick, { capture: true });\n\n    unsubscribeDocument = () => {\n      document.removeEventListener('pointermove', onPointerMove);\n      document.removeEventListener('pointerup', onPointerUp);\n      document.removeEventListener('pointerout', onPointerLeave);\n      document.removeEventListener('pointercancel', onPointerLeave);\n      document.removeEventListener('touchmove', onTouchMove);\n      setTimeout(() => {\n        document.removeEventListener('click', onClick, { capture: true });\n      }, 10);\n    };\n  };\n\n  element.addEventListener('pointerdown', onPointerDown);\n\n  return () => {\n    unsubscribeDocument();\n    element.removeEventListener('pointerdown', onPointerDown);\n  };\n}\n","/**\n * Pure utility functions for the Renderer class.\n * Extracted to keep renderer.ts under 400 lines.\n */\n\nimport type { WaveSurferOptions } from './wavesurfer';\n\n// ─── Color / Gradient ─────────────────────────────────────────────────────────\n\n/**\n * Convert an array of color strings to a linear CanvasGradient,\n * or return the value as-is if it is already a string/gradient.\n */\nexport function convertColorValues(\n  color: WaveSurferOptions['waveColor'],\n  iframeDocument: Document,\n  iframeWindow: Window\n): string | CanvasGradient {\n  if (!Array.isArray(color)) return color || '';\n  if (color.length < 2) return color[0] || '';\n\n  const canvas = iframeDocument.createElement('canvas');\n  const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n  const gradientHeight = canvas.height * (iframeWindow.devicePixelRatio || 1);\n  const gradient = ctx.createLinearGradient(0, 0, 0, gradientHeight);\n  const step = 1 / (color.length - 1);\n  color.forEach((c, i) => gradient.addColorStop(i * step, c));\n  return gradient;\n}\n\n// ─── Waveform Rendering ───────────────────────────────────────────────────────\n\nexport function renderBarWaveform(\n  channelData: Array<Float32Array | number[]>,\n  options: WaveSurferOptions,\n  ctx: CanvasRenderingContext2D,\n  vScale: number,\n  pixelRatio: number\n): void {\n  const topChannel = channelData[0];\n  const bottomChannel = channelData[1] || channelData[0];\n  const length = topChannel.length;\n  const { width, height } = ctx.canvas;\n  const halfHeight = height / 2;\n\n  const barWidth = options.barWidth ? options.barWidth * pixelRatio : 1;\n  const barGap = options.barGap ? options.barGap * pixelRatio : options.barWidth ? barWidth / 2 : 0;\n  const barRadius = options.barRadius || 0;\n  const barIndexScale = width / (barWidth + barGap) / length;\n  const rectFn = barRadius && 'roundRect' in ctx ? 'roundRect' : 'rect';\n\n  ctx.beginPath();\n  let prevX = 0, maxTop = 0, maxBottom = 0;\n\n  for (let i = 0; i <= length; i++) {\n    const x = Math.round(i * barIndexScale);\n    if (x > prevX) {\n      const topH = Math.round(maxTop * halfHeight * vScale);\n      const botH = Math.round(maxBottom * halfHeight * vScale);\n      const barH = topH + botH || 1;\n      let y = halfHeight - topH;\n      if (options.barAlign === 'top') y = 0;\n      else if (options.barAlign === 'bottom') y = height - barH;\n      (ctx as any)[rectFn](prevX * (barWidth + barGap), y, barWidth, barH, barRadius);\n      prevX = x; maxTop = 0; maxBottom = 0;\n    }\n    const mt = Math.abs(topChannel[i] || 0);\n    const mb = Math.abs(bottomChannel[i] || 0);\n    if (mt > maxTop) maxTop = mt;\n    if (mb > maxBottom) maxBottom = mb;\n  }\n  ctx.fill();\n  ctx.closePath();\n}\n\nexport function renderLineWaveform(\n  channelData: Array<Float32Array | number[]>,\n  ctx: CanvasRenderingContext2D,\n  vScale: number\n): void {\n  const drawChannel = (index: number) => {\n    const channel = channelData[index] || channelData[0];\n    const { height } = ctx.canvas;\n    const halfHeight = height / 2;\n    const hScale = ctx.canvas.width / channel.length;\n    ctx.moveTo(0, halfHeight);\n    let prevX = 0, max = 0;\n    for (let i = 0; i <= channel.length; i++) {\n      const x = Math.round(i * hScale);\n      if (x > prevX) {\n        const h = Math.round(max * halfHeight * vScale) || 1;\n        ctx.lineTo(prevX, halfHeight + h * (index === 0 ? -1 : 1));\n        prevX = x; max = 0;\n      }\n      const v = Math.abs(channel[i] || 0);\n      if (v > max) max = v;\n    }\n    ctx.lineTo(prevX, halfHeight);\n  };\n  ctx.beginPath();\n  drawChannel(0);\n  drawChannel(1);\n  ctx.fill();\n  ctx.closePath();\n}\n\nexport function renderWaveform(\n  channelData: Array<Float32Array | number[]>,\n  options: WaveSurferOptions,\n  ctx: CanvasRenderingContext2D,\n  colorValue: string | CanvasGradient,\n  pixelRatio: number\n): void {\n  ctx.fillStyle = colorValue;\n\n  if (options.renderFunction) { options.renderFunction(channelData, ctx); return; }\n\n  let vScale = options.barHeight || 1;\n  if (options.normalize) {\n    const max = Array.from(channelData[0]).reduce((m, v) => Math.max(m, Math.abs(v)), 0);\n    vScale = max ? 1 / max : 1;\n  }\n\n  if (options.barWidth || options.barGap || options.barAlign) {\n    renderBarWaveform(channelData, options, ctx, vScale, pixelRatio);\n  } else {\n    renderLineWaveform(channelData, ctx, vScale);\n  }\n}\n\n// ─── HTML Template ────────────────────────────────────────────────────────────\n\nexport function buildRendererHtml(\n  minHeight: number,\n  cspNonce: string | undefined,\n  iframeDocument: Document\n): [HTMLElement, ShadowRoot] {\n  const div = iframeDocument.createElement('div');\n  const shadow = div.attachShadow({ mode: 'open' });\n  const nonce = cspNonce && typeof cspNonce === 'string' ? cspNonce.replace(/\"/g, '') : '';\n\n  shadow.innerHTML = `\n    <style${nonce ? ` nonce=\"${nonce}\"` : ''}>\n      :host { user-select: none; min-width: 1px; }\n      :host audio { display: block; width: 100%; }\n      :host .scroll { overflow-x: auto; overflow-y: hidden; width: 100%; position: relative; }\n      :host .noScrollbar { scrollbar-color: transparent; scrollbar-width: none; }\n      :host .noScrollbar::-webkit-scrollbar { display: none; -webkit-appearance: none; }\n      :host .wrapper { position: relative; overflow: visible; z-index: 2; }\n      :host .canvases { min-height: ${minHeight}px; }\n      :host .canvases > div { position: relative; }\n      :host canvas { display: block; position: absolute; top: 0; image-rendering: pixelated; }\n      :host .progress { pointer-events: none; position: absolute; z-index: 2; top: 0; left: 0; width: 0; height: 100%; overflow: hidden; }\n      :host .progress > div { position: relative; }\n      :host .cursor { pointer-events: none; position: absolute; z-index: 5; top: 0; left: 0; height: 100%; border-radius: 2px; }\n    </style>\n    <div class=\"scroll\" part=\"scroll\">\n      <div class=\"wrapper\" part=\"wrapper\">\n        <div class=\"canvases\" part=\"canvases\"></div>\n        <div class=\"progress\" part=\"progress\"></div>\n        <div class=\"cursor\" part=\"cursor\"></div>\n      </div>\n    </div>\n  `;\n  return [div, shadow];\n}\n\n// ─── Scroll Into View ─────────────────────────────────────────────────────────\n\nexport function scrollIntoView(\n  scrollContainer: HTMLElement,\n  progress: number,\n  isPlaying: boolean,\n  isDragging: boolean,\n  autoCenter: boolean,\n  emitScroll: (startX: number, endX: number, scrollLeft: number, scrollRight: number) => void\n): void {\n  const { scrollLeft, scrollWidth, clientWidth } = scrollContainer;\n  const progressWidth = progress * scrollWidth;\n  const middle = clientWidth / 2;\n\n  if (isDragging) {\n    const minGap = 30;\n    if (progressWidth + minGap > scrollLeft + clientWidth) scrollContainer.scrollLeft += minGap;\n    else if (progressWidth - minGap < scrollLeft) scrollContainer.scrollLeft -= minGap;\n  } else {\n    if (progressWidth < scrollLeft || progressWidth > scrollLeft + clientWidth) {\n      scrollContainer.scrollLeft = progressWidth - (autoCenter ? middle : 0);\n    }\n    const center = progressWidth - scrollContainer.scrollLeft - middle;\n    if (isPlaying && autoCenter && center > 0) scrollContainer.scrollLeft += Math.min(center, 10);\n  }\n\n  const newScroll = scrollContainer.scrollLeft;\n  emitScroll(newScroll / scrollWidth, (newScroll + clientWidth) / scrollWidth, newScroll, newScroll + clientWidth);\n}\n","/**\n * Renderer\n *\n * Canvas-based waveform rendering.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nimport { makeDraggable } from './draggable';\nimport EventEmitter from './event-emitter';\nimport type { WaveSurferOptions } from './wavesurfer';\nimport type { RendererEvents } from './renderer.types';\nimport {\n  convertColorValues,\n  renderWaveform,\n  buildRendererHtml,\n  scrollIntoView,\n} from './renderer.utils';\n\n// Re-export types for backward compatibility\nexport type { RendererEvents } from './renderer.types';\n\nclass Renderer extends EventEmitter<RendererEvents> {\n  private static MAX_CANVAS_WIDTH = 8000;\n  private static MAX_NODES = 10;\n  private options: WaveSurferOptions;\n  private parent: HTMLElement;\n  private container: HTMLElement;\n  private scrollContainer: HTMLElement;\n  private wrapper: HTMLElement;\n  private canvasWrapper: HTMLElement;\n  private progressWrapper: HTMLElement;\n  private cursor: HTMLElement;\n  private timeouts: Array<() => void> = [];\n  private isScrollable = false;\n  private audioData: AudioBuffer | null = null;\n  private resizeObserver: ResizeObserver | null = null;\n  private lastContainerWidth = 0;\n  private isDragging = false;\n  private subscriptions: (() => void)[] = [];\n  private unsubscribeOnScroll?: () => void;\n  private iframeDocument: Document = document;\n  private iframeWindow: Window = window;\n\n  constructor(\n    options: WaveSurferOptions,\n    audioElement?: HTMLElement,\n    iframeDocument?: Document,\n    iframeWindow?: Window\n  ) {\n    super();\n    this.subscriptions = [];\n    this.options = options;\n    this.iframeDocument = iframeDocument || document;\n    this.iframeWindow = iframeWindow || window;\n\n    const parent = this.parentFromOptionsContainer(options.container);\n    this.parent = parent;\n\n    const [div, shadow] = buildRendererHtml(\n      this.getHeight(options.height, options.splitChannels),\n      options.cspNonce,\n      this.iframeDocument\n    );\n    parent.appendChild(div);\n    this.container = div;\n    this.scrollContainer = shadow.querySelector('.scroll') as HTMLElement;\n    this.wrapper = shadow.querySelector('.wrapper') as HTMLElement;\n    this.canvasWrapper = shadow.querySelector('.canvases') as HTMLElement;\n    this.progressWrapper = shadow.querySelector('.progress') as HTMLElement;\n    this.cursor = shadow.querySelector('.cursor') as HTMLElement;\n\n    if (audioElement) shadow.appendChild(audioElement);\n    this.initEvents();\n  }\n\n  private parentFromOptionsContainer(container: WaveSurferOptions['container']): HTMLElement {\n    let parent: HTMLElement | null = null;\n    if (typeof container === 'string') {\n      parent = this.iframeDocument.querySelector(container) as HTMLElement | null;\n    } else if (container instanceof HTMLElement) {\n      parent = container;\n    } else if (this.iframeWindow && (container as any) instanceof (this.iframeWindow as any)?.HTMLElement) {\n      parent = container as HTMLElement;\n    }\n    if (!parent) throw new Error('Container not found');\n    return parent;\n  }\n\n  private initEvents(): void {\n    const getPos = (e: MouseEvent): [number, number] => {\n      const rect = this.wrapper.getBoundingClientRect();\n      return [(e.clientX - rect.left) / rect.width, (e.clientY - rect.top) / rect.height];\n    };\n    this.wrapper.addEventListener('click', (e) => { const [x, y] = getPos(e); this.emit('click', x, y); });\n    this.wrapper.addEventListener('dblclick', (e) => { const [x, y] = getPos(e); this.emit('dblclick', x, y); });\n\n    if (this.options.dragToSeek === true || typeof this.options.dragToSeek === 'object') this.initDrag();\n\n    this.scrollContainer.addEventListener('scroll', () => {\n      const { scrollLeft, scrollWidth, clientWidth } = this.scrollContainer;\n      this.emit('scroll', scrollLeft / scrollWidth, (scrollLeft + clientWidth) / scrollWidth, scrollLeft, scrollLeft + clientWidth);\n    });\n\n    if (typeof ResizeObserver === 'function') {\n      const delay = this.createDelay(100);\n      this.resizeObserver = new ResizeObserver(() => { delay().then(() => this.onContainerResize()).catch(() => undefined); });\n      this.resizeObserver.observe(this.scrollContainer);\n    }\n  }\n\n  private onContainerResize(): void {\n    const width = this.parent.clientWidth;\n    if (width === this.lastContainerWidth && this.options.height !== 'auto') return;\n    this.lastContainerWidth = width;\n    this.reRender();\n  }\n\n  private initDrag(): void {\n    const w = () => this.wrapper.getBoundingClientRect().width;\n    this.subscriptions.push(\n      makeDraggable(\n        this.wrapper,\n        (_, __, x) => this.emit('drag', Math.max(0, Math.min(1, x / w()))),\n        (x) => { this.isDragging = true; this.emit('dragstart', Math.max(0, Math.min(1, x / w()))); },\n        (x) => { this.isDragging = false; this.emit('dragend', Math.max(0, Math.min(1, x / w()))); }\n      )\n    );\n  }\n\n  private getHeight(optionsHeight?: WaveSurferOptions['height'], optionsSplitChannel?: WaveSurferOptions['splitChannels']): number {\n    const defaultHeight = 128;\n    const numChannels = this.audioData?.numberOfChannels || 1;\n    if (optionsHeight == null) return defaultHeight;\n    if (!isNaN(Number(optionsHeight))) return Number(optionsHeight);\n    if (optionsHeight === 'auto') {\n      const h = this.parent.clientHeight || defaultHeight;\n      return optionsSplitChannel?.every(c => !c.overlay) ? h / numChannels : h;\n    }\n    return defaultHeight;\n  }\n\n  private getPixelRatio(): number { return Math.max(1, this.iframeWindow.devicePixelRatio || 1); }\n\n  /** Wavesurfer itself calls this method. Do not call it manually. */\n  setOptions(options: WaveSurferOptions): void {\n    this.iframeWindow = options.iframeWindow || window;\n    this.iframeDocument = options.iframeDocument || document;\n    if (this.options.container !== options.container) {\n      const newParent = this.parentFromOptionsContainer(options.container);\n      newParent.appendChild(this.container);\n      this.parent = newParent;\n    }\n    if (options.dragToSeek === true || typeof this.options.dragToSeek === 'object') this.initDrag();\n    this.options = options;\n    this.reRender();\n  }\n\n  getWrapper(): HTMLElement { return this.wrapper; }\n  getWidth(): number { return this.scrollContainer.clientWidth; }\n  getScroll(): number { return this.scrollContainer.scrollLeft; }\n  setScroll(pixels: number): void { this.scrollContainer.scrollLeft = pixels; }\n  setScrollPercentage(percent: number): void { this.setScroll(this.scrollContainer.scrollWidth * percent); }\n\n  destroy(): void {\n    this.subscriptions.forEach(u => u());\n    this.container.remove();\n    this.resizeObserver?.disconnect();\n    this.unsubscribeOnScroll?.();\n  }\n\n  private createDelay(delayMs = 10): () => Promise<void> {\n    let timeout: ReturnType<typeof setTimeout> | undefined;\n    let reject: (() => void) | undefined;\n    const onClear = () => { if (timeout) clearTimeout(timeout); if (reject) reject(); };\n    this.timeouts.push(onClear);\n    return () => new Promise((res, rej) => {\n      onClear(); reject = rej;\n      timeout = setTimeout(() => { timeout = undefined; reject = undefined; res(); }, delayMs);\n    });\n  }\n\n  private renderSingleCanvas(\n    data: Array<Float32Array | number[]>, options: WaveSurferOptions,\n    width: number, height: number, offset: number,\n    canvasContainer: HTMLElement, progressContainer: HTMLElement\n  ): void {\n    const pr = this.getPixelRatio();\n    const canvas = this.iframeDocument.createElement('canvas');\n    canvas.width = Math.round(width * pr); canvas.height = Math.round(height * pr);\n    canvas.style.width = `${width}px`; canvas.style.height = `${height}px`;\n    canvas.style.left = `${Math.round(offset)}px`;\n    canvasContainer.appendChild(canvas);\n\n    const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;\n    renderWaveform(data, options, ctx, convertColorValues(options.waveColor, this.iframeDocument, this.iframeWindow), pr);\n\n    if (canvas.width > 0 && canvas.height > 0) {\n      const progressCanvas = canvas.cloneNode() as HTMLCanvasElement;\n      const pCtx = progressCanvas.getContext('2d') as CanvasRenderingContext2D;\n      pCtx.drawImage(canvas, 0, 0);\n      pCtx.globalCompositeOperation = 'source-in';\n      pCtx.fillStyle = convertColorValues(options.progressColor, this.iframeDocument, this.iframeWindow);\n      pCtx.fillRect(0, 0, canvas.width, canvas.height);\n      progressContainer.appendChild(progressCanvas);\n    }\n  }\n\n  private renderMultiCanvas(\n    channelData: Array<Float32Array | number[]>, options: WaveSurferOptions,\n    width: number, height: number, canvasContainer: HTMLElement, progressContainer: HTMLElement\n  ): void {\n    const pr = this.getPixelRatio();\n    const { clientWidth } = this.scrollContainer;\n    const totalWidth = width / pr;\n    let singleW = Math.min(Renderer.MAX_CANVAS_WIDTH, clientWidth, totalWidth);\n    let drawn: Record<number, boolean> = {};\n\n    if (options.barWidth || options.barGap) {\n      const bw = options.barWidth || 0.5, bg = options.barGap || bw / 2, total = bw + bg;\n      if (singleW % total !== 0) singleW = Math.floor(singleW / total) * total;\n    }\n\n    const numCanvases = Math.ceil(totalWidth / singleW);\n    const draw = (index: number) => {\n      if (index < 0 || index >= numCanvases || drawn[index]) return;\n      drawn[index] = true;\n      const offset = index * singleW;\n      const cw = Math.min(totalWidth - offset, singleW);\n      if (cw <= 0) return;\n      const data = channelData.map(ch => ch.slice(Math.floor(offset / totalWidth * ch.length), Math.floor((offset + cw) / totalWidth * ch.length)));\n      this.renderSingleCanvas(data, options, cw, height, offset, canvasContainer, progressContainer);\n    };\n    const clearCanvases = () => {\n      if (Object.keys(drawn).length > Renderer.MAX_NODES) { canvasContainer.innerHTML = ''; progressContainer.innerHTML = ''; drawn = {}; }\n    };\n\n    if (!this.isScrollable) { for (let i = 0; i < numCanvases; i++) draw(i); return; }\n\n    const startCanvas = Math.floor(this.scrollContainer.scrollLeft / totalWidth * numCanvases);\n    draw(startCanvas - 1); draw(startCanvas); draw(startCanvas + 1);\n\n    if (numCanvases > 1) {\n      this.unsubscribeOnScroll = this.on('scroll', () => {\n        const ci = Math.floor(this.scrollContainer.scrollLeft / totalWidth * numCanvases);\n        clearCanvases(); draw(ci - 1); draw(ci); draw(ci + 1);\n      });\n    }\n  }\n\n  private renderChannel(channelData: Array<Float32Array | number[]>, { overlay, ...options }: WaveSurferOptions & { overlay?: boolean }, width: number, channelIndex: number): void {\n    const canvasContainer = this.iframeDocument.createElement('div');\n    const height = this.getHeight(options.height, options.splitChannels);\n    canvasContainer.style.height = `${height}px`;\n    if (overlay && channelIndex > 0) canvasContainer.style.marginTop = `-${height}px`;\n    this.canvasWrapper.style.minHeight = `${height}px`;\n    this.canvasWrapper.appendChild(canvasContainer);\n    const progressContainer = canvasContainer.cloneNode() as HTMLElement;\n    this.progressWrapper.appendChild(progressContainer);\n    this.renderMultiCanvas(channelData, options, width, height, canvasContainer, progressContainer);\n  }\n\n  async render(audioData: AudioBuffer): Promise<void> {\n    this.timeouts.forEach(c => c()); this.timeouts = [];\n    this.canvasWrapper.innerHTML = ''; this.progressWrapper.innerHTML = '';\n\n    if (this.options.width != null) {\n      this.scrollContainer.style.width = typeof this.options.width === 'number' ? `${this.options.width}px` : this.options.width;\n    }\n\n    const pr = this.getPixelRatio();\n    const parentWidth = this.scrollContainer.clientWidth;\n    const scrollWidth = Math.ceil(audioData.duration * (this.options.minPxPerSec || 0));\n    this.isScrollable = scrollWidth > parentWidth;\n    const useParentWidth = this.options.fillParent && !this.isScrollable;\n    const width = (useParentWidth ? parentWidth : scrollWidth) * pr;\n\n    this.wrapper.style.width = useParentWidth ? '100%' : `${scrollWidth}px`;\n    this.scrollContainer.style.overflowX = this.isScrollable ? 'auto' : 'hidden';\n    this.scrollContainer.classList.toggle('noScrollbar', !!this.options.hideScrollbar);\n    this.cursor.style.backgroundColor = `${this.options.cursorColor || this.options.progressColor}`;\n    this.cursor.style.width = `${this.options.cursorWidth}px`;\n    this.audioData = audioData;\n    this.emit('render');\n\n    if (this.options.splitChannels) {\n      for (let i = 0; i < audioData.numberOfChannels; i++) {\n        const opts = { ...this.options, ...this.options.splitChannels?.[i] };\n        this.renderChannel([audioData.getChannelData(i)], opts, width, i);\n      }\n    } else {\n      const channels: Float32Array[] = [audioData.getChannelData(0)];\n      if (audioData.numberOfChannels > 1) channels.push(audioData.getChannelData(1));\n      this.renderChannel(channels, this.options, width, 0);\n    }\n\n    Promise.resolve().then(() => this.emit('rendered'));\n  }\n\n  reRender(): void {\n    this.unsubscribeOnScroll?.(); delete this.unsubscribeOnScroll;\n    if (!this.audioData) return;\n    const { scrollWidth } = this.scrollContainer;\n    const { right: before } = this.progressWrapper.getBoundingClientRect();\n    this.render(this.audioData);\n    if (this.isScrollable && scrollWidth !== this.scrollContainer.scrollWidth) {\n      const { right: after } = this.progressWrapper.getBoundingClientRect();\n      let delta = after - before; delta *= 2;\n      delta = delta < 0 ? Math.floor(delta) : Math.ceil(delta); delta /= 2;\n      this.scrollContainer.scrollLeft += delta;\n    }\n  }\n\n  zoom(minPxPerSec: number): void { this.options.minPxPerSec = minPxPerSec; this.reRender(); }\n\n  renderProgress(progress: number, isPlaying?: boolean): void {\n    if (isNaN(progress)) return;\n    const pct = progress * 100;\n    this.canvasWrapper.style.clipPath = `polygon(${pct}% 0, 100% 0, 100% 100%, ${pct}% 100%)`;\n    this.progressWrapper.style.width = `${pct}%`;\n    this.cursor.style.left = `${pct}%`;\n    this.cursor.style.transform = `translateX(-${Math.round(pct) === 100 ? this.options.cursorWidth : 0}px)`;\n    if (this.isScrollable && this.options.autoScroll) {\n      scrollIntoView(this.scrollContainer, progress, !!isPlaying, this.isDragging, !!this.options.autoCenter,\n        (s, e, l, r) => this.emit('scroll', s, e, l, r));\n    }\n  }\n\n  async exportImage(format: string, quality: number, type: 'dataURL' | 'blob'): Promise<string[] | Blob[]> {\n    const canvases = this.canvasWrapper.querySelectorAll('canvas');\n    if (!canvases.length) throw new Error('No waveform data');\n    if (type === 'dataURL') return Array.from(canvases).map(c => c.toDataURL(format, quality));\n    return Promise.all(Array.from(canvases).map(c => new Promise<Blob>((res, rej) => {\n      c.toBlob(b => b ? res(b) : rej(new Error('Could not export image')), format, quality);\n    })));\n  }\n}\n\nexport default Renderer;\n","/**\n * Timer\n *\n * A timer that emits tick events using requestAnimationFrame.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nimport EventEmitter from './event-emitter';\n\ntype TimerEvents = {\n  tick: [];\n};\n\nclass Timer extends EventEmitter<TimerEvents> {\n  private unsubscribe: () => void = () => undefined;\n\n  start() {\n    this.unsubscribe = this.on('tick', () => {\n      requestAnimationFrame(() => {\n        this.emit('tick');\n      });\n    });\n    this.emit('tick');\n  }\n\n  stop() {\n    this.unsubscribe();\n  }\n\n  destroy() {\n    this.unsubscribe();\n  }\n}\n\nexport default Timer;\n","/**\n * WebAudio Player\n *\n * A Web Audio buffer player emulating the behavior of an HTML5 Audio element.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2\n */\n\nimport EventEmitter from './event-emitter';\n\ntype WebAudioPlayerEvents = {\n  loadedmetadata: [];\n  canplay: [];\n  play: [];\n  pause: [];\n  seeking: [];\n  timeupdate: [];\n  volumechange: [];\n  emptied: [];\n  ended: [];\n};\n\n/**\n * A Web Audio buffer player emulating the behavior of an HTML5 Audio element.\n */\nclass WebAudioPlayer extends EventEmitter<WebAudioPlayerEvents> {\n  private audioContext: AudioContext;\n  private gainNode: GainNode;\n  private bufferNode: AudioBufferSourceNode | null = null;\n  private playStartTime = 0;\n  private playedDuration = 0;\n  private _muted = false;\n  private _playbackRate = 1;\n  private _duration: number | undefined = undefined;\n  private buffer: AudioBuffer | null = null;\n  public currentSrc = '';\n  public paused = true;\n  public crossOrigin: string | null = null;\n  public seeking = false;\n  public autoplay = false;\n\n  constructor(audioContext = new AudioContext()) {\n    super();\n    this.audioContext = audioContext;\n    this.gainNode = this.audioContext.createGain();\n    this.gainNode.connect(this.audioContext.destination);\n  }\n\n  /** Subscribe to an event. Returns an unsubscribe function. */\n  addEventListener = this.on;\n\n  /** Unsubscribe from an event */\n  removeEventListener = this.un;\n\n  async load() {\n    return;\n  }\n\n  get src() {\n    return this.currentSrc;\n  }\n\n  set src(value: string) {\n    this.currentSrc = value;\n    this._duration = undefined;\n\n    if (!value) {\n      this.buffer = null;\n      this.emit('emptied');\n      return;\n    }\n\n    fetch(value)\n      .then((response) => {\n        if (response.status >= 400) {\n          throw new Error(\n            `Failed to fetch ${value}: ${response.status} (${response.statusText})`\n          );\n        }\n        return response.arrayBuffer();\n      })\n      .then((arrayBuffer) => {\n        if (this.currentSrc !== value) return null;\n        return this.audioContext.decodeAudioData(arrayBuffer);\n      })\n      .then((audioBuffer) => {\n        if (this.currentSrc !== value) return;\n\n        this.buffer = audioBuffer;\n\n        this.emit('loadedmetadata');\n        this.emit('canplay');\n\n        if (this.autoplay) this.play();\n      });\n  }\n\n  private _play() {\n    if (!this.paused) return;\n    this.paused = false;\n\n    this.bufferNode?.disconnect();\n    this.bufferNode = this.audioContext.createBufferSource();\n    if (this.buffer) {\n      this.bufferNode.buffer = this.buffer;\n    }\n    this.bufferNode.playbackRate.value = this._playbackRate;\n    this.bufferNode.connect(this.gainNode);\n\n    let currentPos = this.playedDuration * this._playbackRate;\n    if (currentPos >= this.duration) {\n      currentPos = 0;\n      this.playedDuration = 0;\n    }\n\n    this.bufferNode.start(this.audioContext.currentTime, currentPos);\n    this.playStartTime = this.audioContext.currentTime;\n\n    this.bufferNode.onended = () => {\n      if (this.currentTime >= this.duration) {\n        this.pause();\n        this.emit('ended');\n      }\n    };\n  }\n\n  private _pause() {\n    this.paused = true;\n    this.bufferNode?.stop();\n    this.playedDuration += this.audioContext.currentTime - this.playStartTime;\n  }\n\n  async play() {\n    if (!this.paused) return;\n    this._play();\n    this.emit('play');\n  }\n\n  pause() {\n    if (this.paused) return;\n    this._pause();\n    this.emit('pause');\n  }\n\n  stopAt(timeSeconds: number) {\n    const delay = timeSeconds - this.currentTime;\n    this.bufferNode?.stop(this.audioContext.currentTime + delay);\n\n    this.bufferNode?.addEventListener(\n      'ended',\n      () => {\n        this.bufferNode = null;\n        this.pause();\n      },\n      { once: true }\n    );\n  }\n\n  async setSinkId(deviceId: string) {\n    const ac = this.audioContext as AudioContext & {\n      setSinkId: (id: string) => Promise<void>;\n    };\n    return ac.setSinkId(deviceId);\n  }\n\n  get playbackRate() {\n    return this._playbackRate;\n  }\n  set playbackRate(value) {\n    this._playbackRate = value;\n    if (this.bufferNode) {\n      this.bufferNode.playbackRate.value = value;\n    }\n  }\n\n  get currentTime() {\n    const time = this.paused\n      ? this.playedDuration\n      : this.playedDuration +\n        (this.audioContext.currentTime - this.playStartTime);\n    return time * this._playbackRate;\n  }\n  set currentTime(value) {\n    const wasPlaying = !this.paused;\n\n    wasPlaying && this._pause();\n    this.playedDuration = value / this._playbackRate;\n    wasPlaying && this._play();\n\n    this.emit('seeking');\n    this.emit('timeupdate');\n  }\n\n  get duration() {\n    return this._duration ?? (this.buffer?.duration || 0);\n  }\n  set duration(value: number) {\n    this._duration = value;\n  }\n\n  get volume() {\n    return this.gainNode.gain.value;\n  }\n  set volume(value) {\n    this.gainNode.gain.value = value;\n    this.emit('volumechange');\n  }\n\n  get muted() {\n    return this._muted;\n  }\n  set muted(value: boolean) {\n    if (this._muted === value) return;\n    this._muted = value;\n\n    if (this._muted) {\n      this.gainNode.disconnect();\n    } else {\n      this.gainNode.connect(this.audioContext.destination);\n    }\n  }\n\n  public canPlayType(mimeType: string) {\n    return /^(audio|video)\\//.test(mimeType);\n  }\n\n  /** Get the GainNode used to play the audio. Can be used to attach filters. */\n  public getGainNode(): GainNode {\n    return this.gainNode;\n  }\n\n  /** Get decoded audio */\n  public getChannelData(): Float32Array[] {\n    const channels: Float32Array[] = [];\n    if (!this.buffer) return channels;\n    const numChannels = this.buffer.numberOfChannels;\n    for (let i = 0; i < numChannels; i++) {\n      channels.push(this.buffer.getChannelData(i));\n    }\n    return channels;\n  }\n}\n\nexport default WebAudioPlayer;\n","/**\n * WaveSurfer\n *\n * Main WaveSurfer class for audio waveform visualization.\n * Adapted from WaveSurfer library for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2, 14.3\n */\n\nimport BasePlugin, { type GenericPlugin } from './base-plugin';\nimport Decoder from './decoder';\nimport * as dom from './dom';\nimport Fetcher from './fetcher';\nimport Player from './player';\nimport Renderer from './renderer';\nimport Timer from './timer';\nimport WebAudioPlayer from './webaudio';\nimport type { WaveSurferOptions, WaveSurferEvents } from './wavesurfer.types';\n\n// Re-export types for backward compatibility\nexport type { WaveSurferOptions, WaveSurferEvents } from './wavesurfer.types';\n\nconst defaultOptions = {\n  waveColor: '#999',\n  progressColor: '#555',\n  cursorWidth: 1,\n  minPxPerSec: 0,\n  fillParent: true,\n  interact: true,\n  dragToSeek: false,\n  autoScroll: true,\n  autoCenter: true,\n  sampleRate: 8000,\n};\n\nclass WaveSurfer extends Player<WaveSurferEvents> {\n  public options: WaveSurferOptions & typeof defaultOptions;\n  private renderer: Renderer;\n  private timer: Timer;\n  private plugins: GenericPlugin[] = [];\n  private decodedData: AudioBuffer | null = null;\n  protected subscriptions: Array<() => void> = [];\n  protected mediaSubscriptions: Array<() => void> = [];\n  protected abortController: AbortController | null = null;\n\n  public static readonly BasePlugin = BasePlugin;\n  public static readonly dom = dom;\n\n  /** Create a new WaveSurfer instance */\n  public static create(options: WaveSurferOptions): WaveSurfer {\n    return new WaveSurfer(options);\n  }\n\n  constructor(options: WaveSurferOptions) {\n    const media =\n      options.media ||\n      (options.backend === 'WebAudio' ? (new WebAudioPlayer() as unknown as HTMLAudioElement) : undefined);\n\n    super({ media, mediaControls: options.mediaControls, autoplay: options.autoplay, playbackRate: options.audioRate });\n\n    this.options = Object.assign({}, defaultOptions, options);\n    this.timer = new Timer();\n\n    const audioElement = media ? undefined : this.getMediaElement();\n    this.renderer = new Renderer(this.options, audioElement, this.options.iframeDocument, this.options.iframeWindow);\n\n    this.initPlayerEvents();\n    this.initRendererEvents();\n    this.initTimerEvents();\n    this.initPlugins();\n\n    const initialUrl = this.options.url || this.getSrc() || '';\n    Promise.resolve().then(() => {\n      this.emit('init');\n      const { peaks, duration } = this.options;\n      if (initialUrl || (peaks && duration)) {\n        this.load(initialUrl, peaks, duration).catch(() => null);\n      }\n    });\n  }\n\n  private updateProgress(currentTime = this.getCurrentTime()): number {\n    this.renderer.renderProgress(currentTime / this.getDuration(), this.isPlaying());\n    return currentTime;\n  }\n\n  private initTimerEvents(): void {\n    this.subscriptions.push(\n      this.timer.on('tick', () => {\n        if (!this.isSeeking()) {\n          const t = this.updateProgress();\n          this.emit('timeupdate', t);\n          this.emit('audioprocess', t);\n        }\n      })\n    );\n  }\n\n  private initPlayerEvents(): void {\n    if (this.isPlaying()) { this.emit('play'); this.timer.start(); }\n    this.mediaSubscriptions.push(\n      this.onMediaEvent('timeupdate', () => { const t = this.updateProgress(); this.emit('timeupdate', t); }),\n      this.onMediaEvent('play', () => { this.emit('play'); this.timer.start(); }),\n      this.onMediaEvent('pause', () => { this.emit('pause'); this.timer.stop(); }),\n      this.onMediaEvent('emptied', () => { this.timer.stop(); }),\n      this.onMediaEvent('ended', () => { this.emit('finish'); }),\n      this.onMediaEvent('seeking', () => { this.emit('seeking', this.getCurrentTime()); }),\n      this.onMediaEvent('error', (err) => { this.emit('error', (err as any).error); })\n    );\n  }\n\n  private initRendererEvents(): void {\n    this.subscriptions.push(\n      this.renderer.on('click', (x, y) => {\n        if (this.options.interact) { this.seekTo(x); this.emit('interaction', x * this.getDuration()); this.emit('click', x, y); }\n      }),\n      this.renderer.on('dblclick', (x, y) => { this.emit('dblclick', x, y); }),\n      this.renderer.on('scroll', (sx, ex, sl, sr) => { const d = this.getDuration(); this.emit('scroll', sx * d, ex * d, sl, sr); }),\n      this.renderer.on('render', () => { this.emit('redraw'); }),\n      this.renderer.on('rendered', () => { this.emit('redrawcomplete'); }),\n      this.renderer.on('dragstart', (x) => { this.emit('dragstart', x); }),\n      this.renderer.on('dragend', (x) => { this.emit('dragend', x); })\n    );\n\n    // Drag with debounce\n    let debounce: ReturnType<typeof setTimeout>;\n    this.subscriptions.push(\n      this.renderer.on('drag', (x) => {\n        if (!this.options.interact) return;\n        this.renderer.renderProgress(x);\n        clearTimeout(debounce);\n        let debounceTime = 0;\n        if (!this.isPlaying()) {\n          if (this.options.dragToSeek === true) debounceTime = 200;\n          else if (typeof this.options.dragToSeek === 'object') debounceTime = this.options.dragToSeek['debounceTime'];\n        }\n        debounce = setTimeout(() => { this.seekTo(x); }, debounceTime);\n        this.emit('interaction', x * this.getDuration());\n        this.emit('drag', x);\n      })\n    );\n  }\n\n  private initPlugins(): void {\n    if (!this.options.plugins?.length) return;\n    this.options.plugins.forEach(p => this.registerPlugin(p));\n  }\n\n  private unsubscribePlayerEvents(): void {\n    this.mediaSubscriptions.forEach(u => u());\n    this.mediaSubscriptions = [];\n  }\n\n  /** Set new wavesurfer options and re-render it */\n  public setOptions(options: Partial<WaveSurferOptions>): void {\n    this.options = Object.assign({}, this.options, options);\n    this.renderer.setOptions(this.options);\n    if (options.audioRate) this.setPlaybackRate(options.audioRate);\n    if (options.mediaControls != null) this.getMediaElement().controls = options.mediaControls;\n  }\n\n  /** Register a wavesurfer plugin */\n  public registerPlugin<T extends GenericPlugin>(plugin: T): T {\n    plugin._init(this);\n    this.plugins.push(plugin);\n    this.subscriptions.push(plugin.once('destroy', () => { this.plugins = this.plugins.filter(p => p !== plugin); }));\n    return plugin;\n  }\n\n  public getWrapper(): HTMLElement { return this.renderer.getWrapper(); }\n  public getWidth(): number { return this.renderer.getWidth(); }\n  public getScroll(): number { return this.renderer.getScroll(); }\n  public setScroll(pixels: number): void { this.renderer.setScroll(pixels); }\n  public setScrollTime(time: number): void { this.renderer.setScrollPercentage(time / this.getDuration()); }\n  public getActivePlugins(): GenericPlugin[] { return this.plugins; }\n\n  private async loadAudio(url: string, blob?: Blob, channelData?: WaveSurferOptions['peaks'], duration?: number): Promise<void> {\n    this.emit('load', url);\n    if (!this.options.media && this.isPlaying()) this.pause();\n    this.decodedData = null;\n\n    if (!blob && !channelData) {\n      const fetchParams = this.options.fetchParams || {};\n      if (window.AbortController && !fetchParams.signal) {\n        this.abortController = new AbortController();\n        fetchParams.signal = this.abortController?.signal;\n      }\n      blob = await Fetcher.fetchBlob(url, (pct) => this.emit('loading', pct), fetchParams);\n    }\n\n    this.setSrc(url, blob);\n\n    const audioDuration = await new Promise<number>(resolve => {\n      const staticDuration = duration || this.getDuration();\n      if (staticDuration) { resolve(staticDuration); return; }\n      this.mediaSubscriptions.push(this.onMediaEvent('loadedmetadata', () => resolve(this.getDuration()), { once: true }));\n    });\n\n    if (!url && !blob) {\n      const media = this.getMediaElement();\n      if (media instanceof WebAudioPlayer) media.duration = audioDuration;\n    }\n\n    if (channelData) {\n      this.decodedData = Decoder.createBuffer(channelData, audioDuration || 0);\n    } else if (blob) {\n      this.decodedData = await Decoder.decode(await blob.arrayBuffer(), this.options.sampleRate);\n    }\n\n    if (this.decodedData) { this.emit('decode', this.getDuration()); this.renderer.render(this.decodedData); }\n    this.emit('ready', this.getDuration());\n  }\n\n  public async load(url: string, channelData?: WaveSurferOptions['peaks'], duration?: number): Promise<void> {\n    try { return await this.loadAudio(url, undefined, channelData, duration); }\n    catch (err) { this.emit('error', err as Error); throw err; }\n  }\n\n  public async loadBlob(blob: Blob, channelData?: WaveSurferOptions['peaks'], duration?: number): Promise<void> {\n    try { return await this.loadAudio('', blob, channelData, duration); }\n    catch (err) { this.emit('error', err as Error); throw err; }\n  }\n\n  public zoom(minPxPerSec: number): void {\n    if (!this.decodedData) throw new Error('No audio loaded');\n    this.renderer.zoom(minPxPerSec);\n    this.emit('zoom', minPxPerSec);\n  }\n\n  public getDecodedData(): AudioBuffer | null { return this.decodedData; }\n\n  public exportPeaks({ channels = 2, maxLength = 8000, precision = 10_000 } = {}): Array<number[]> {\n    if (!this.decodedData) throw new Error('The audio has not been decoded yet');\n    const maxChannels = Math.min(channels, this.decodedData.numberOfChannels);\n    const peaks = [];\n    for (let i = 0; i < maxChannels; i++) {\n      const channel = this.decodedData.getChannelData(i);\n      const sampleSize = channel.length / maxLength;\n      const data = Array.from({ length: maxLength }, (_, j) => {\n        const sample = channel.slice(Math.floor(j * sampleSize), Math.ceil((j + 1) * sampleSize));\n        let max = 0;\n        for (let x = 0; x < sample.length; x++) { if (Math.abs(sample[x]) > Math.abs(max)) max = sample[x]; }\n        return Math.round(max * precision) / precision;\n      });\n      peaks.push(data);\n    }\n    return peaks;\n  }\n\n  public override getDuration(): number {\n    let d = super.getDuration() || 0;\n    if ((d === 0 || d === Infinity) && this.decodedData) d = this.decodedData.duration;\n    return d;\n  }\n\n  public toggleInteraction(isInteractive: boolean): void { this.options.interact = isInteractive; }\n\n  public override setTime(time: number): void {\n    super.setTime(time);\n    this.updateProgress(time);\n    this.emit('timeupdate', time);\n  }\n\n  public seekTo(progress: number): void { this.setTime(this.getDuration() * progress); }\n  public async playPause(): Promise<void> { return this.isPlaying() ? this.pause() : this.play(); }\n  public stop(): void { this.pause(); this.setTime(0); }\n  public skip(seconds: number): void { this.setTime(this.getCurrentTime() + seconds); }\n  public empty(): void { this.load('', [[0]], 0.001); }\n\n  public override setMediaElement(element: HTMLMediaElement): void {\n    this.unsubscribePlayerEvents();\n    super.setMediaElement(element);\n    this.initPlayerEvents();\n  }\n\n  public async exportImage(format: string, quality: number, type: 'dataURL'): Promise<string[]>;\n  public async exportImage(format: string, quality: number, type: 'blob'): Promise<Blob[]>;\n  public async exportImage(format = 'image/png', quality = 1, type: 'dataURL' | 'blob' = 'dataURL'): Promise<string[] | Blob[]> {\n    return this.renderer.exportImage(format, quality, type);\n  }\n\n  public override destroy(): void {\n    this.emit('destroy');\n    this.abortController?.abort();\n    this.plugins.forEach(p => p.destroy());\n    this.subscriptions.forEach(u => u());\n    this.unsubscribePlayerEvents();\n    this.timer.destroy();\n    this.renderer.destroy();\n    super.destroy();\n  }\n}\n\nexport default WaveSurfer;\n","/**\n * WaveSurfer Library\n *\n * Embedded audio waveform visualization library.\n * Adapted from WaveSurfer for Angular compatibility.\n *\n * @see Requirements 14.1, 14.2, 14.3\n */\n\nexport { default as WaveSurfer } from './wavesurfer';\nexport type { WaveSurferOptions, WaveSurferEvents } from './wavesurfer';\nexport { default as BasePlugin } from './base-plugin';\nexport type { BasePluginEvents, GenericPlugin } from './base-plugin';\nexport { default as Decoder } from './decoder';\nexport { default as Fetcher } from './fetcher';\nexport { default as Player } from './player';\nexport { default as Renderer } from './renderer';\nexport { default as Timer } from './timer';\nexport { default as WebAudioPlayer } from './webaudio';\nexport { default as EventEmitter } from './event-emitter';\nexport type { GeneralEventTypes } from './event-emitter';\nexport { makeDraggable } from './draggable';\nexport { default as createElement } from './dom';\n","/**\n * Utility functions for CometChatMediaRecorder component.\n */\n\n/**\n * Formats a duration in seconds to MM:SS display string.\n */\nexport function formatRecordingTime(seconds: number): string {\n  const mins = Math.floor(seconds / 60);\n  const secs = seconds % 60;\n  return `${mins}:${secs < 10 ? '0' : ''}${secs}`;\n}\n\n/**\n * Checks the current microphone permission state.\n * Falls back to attempting getUserMedia if the Permissions API is unavailable.\n */\nexport async function checkMicrophonePermission(): Promise<PermissionState> {\n  try {\n    const permission = await navigator.permissions.query({\n      name: 'microphone' as PermissionName,\n    });\n    return permission.state;\n  } catch {\n    try {\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      stream.getTracks().forEach(track => track.stop());\n      return 'granted';\n    } catch (err: unknown) {\n      const error = err as { name?: string };\n      if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n        return 'denied';\n      }\n      return 'prompt';\n    }\n  }\n}\n\n/**\n * Starts a real-time waveform analysis loop using Web Audio API AnalyserNode.\n * Returns the animation frame ID so the caller can cancel it.\n *\n * @param analyser - The AnalyserNode to read frequency data from\n * @param barCount - Number of waveform bars to compute\n * @param isRecordingFn - Predicate returning whether recording is active\n * @param isPausedFn - Predicate returning whether recording is paused\n * @param onUpdate - Callback invoked with the new bar heights array on each frame\n * @returns The requestAnimationFrame ID (use cancelAnimationFrame to stop)\n */\nexport function startWaveformLoop(\n  analyser: AnalyserNode,\n  barCount: number,\n  isRecordingFn: () => boolean,\n  isPausedFn: () => boolean,\n  onUpdate: (heights: number[]) => void\n): number {\n  const bufferLength = analyser.frequencyBinCount;\n  const dataArray = new Uint8Array(bufferLength);\n  const heights = new Array(barCount).fill(4);\n\n  let frameId: number;\n\n  const tick = () => {\n    if (!isRecordingFn() || isPausedFn()) return;\n    analyser.getByteFrequencyData(dataArray);\n    const step = Math.max(1, Math.floor(bufferLength / barCount));\n    for (let i = 0; i < barCount; i++) {\n      const index = Math.min(i * step, bufferLength - 1);\n      heights[i] = Math.max(4, Math.round((dataArray[index] / 255) * 24));\n    }\n    onUpdate([...heights]);\n    frameId = requestAnimationFrame(tick);\n  };\n\n  frameId = requestAnimationFrame(tick);\n  return frameId;\n}\n\n/**\n * WaveSurfer creation options derived from CSS variables.\n */\nexport function buildWaveSurferOptions(container: HTMLElement): Record<string, unknown> {\n  const root = document.documentElement;\n  const progressColor = getComputedStyle(root).getPropertyValue('--cometchat-primary-color').trim();\n  const waveColor = getComputedStyle(root).getPropertyValue('--cometchat-icon-color-secondary').trim();\n  const barRadiusStr = getComputedStyle(root).getPropertyValue('--cometchat-radius-max').trim();\n  const barRadius = parseInt(barRadiusStr.replace('px', ''), 10) || 1000;\n\n  return {\n    container,\n    height: 24,\n    normalize: false,\n    waveColor,\n    progressColor,\n    cursorWidth: 0,\n    barWidth: 3,\n    barGap: 2,\n    barRadius,\n    barHeight: 1.2,\n    fillParent: true,\n    mediaControls: false,\n    interact: true,\n    dragToSeek: true,\n    hideScrollbar: true,\n    audioRate: 1,\n    sampleRate: 17000,\n  };\n}\n\n/**\n * Wires up MediaRecorder event handlers.\n * Extracted to keep the component class lean.\n */\nexport function setupMediaRecorderHandlers(\n  audioRecorder: MediaRecorder,\n  stream: MediaStream,\n  callbacks: {\n    onDataAvailable: (chunk: Blob) => void;\n    onStop: () => void;\n    onError: (event: Event) => void;\n    onTrackEnded: () => void;\n  }\n): void {\n  audioRecorder.ondataavailable = (e: BlobEvent) => {\n    if (e.data.size > 0) callbacks.onDataAvailable(e.data);\n  };\n  audioRecorder.onstop = callbacks.onStop;\n  audioRecorder.onerror = callbacks.onError;\n  stream.getTracks().forEach(track => {\n    track.onended = callbacks.onTrackEnded;\n  });\n}\n\n/**\n * Wires WaveSurfer event listeners, running callbacks inside NgZone.\n */\nexport function wireWaveSurferEvents(\n  waveSurfer: any,\n  ngZoneRun: (fn: () => void) => void,\n  callbacks: {\n    onReady: (duration: number) => void;\n    onTimeUpdate: (currentTime: number) => void;\n    onFinish: () => void;\n    onPlay: () => void;\n    onPause: () => void;\n  }\n): void {\n  waveSurfer.on('ready', (d: number) => ngZoneRun(() => callbacks.onReady(d)));\n  waveSurfer.on('timeupdate', (t: number) => ngZoneRun(() => callbacks.onTimeUpdate(t)));\n  waveSurfer.on('finish', () => ngZoneRun(() => callbacks.onFinish()));\n  waveSurfer.on('play', () => ngZoneRun(() => callbacks.onPlay()));\n  waveSurfer.on('pause', () => ngZoneRun(() => callbacks.onPause()));\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  HostListener,\n  ChangeDetectorRef,\n  ElementRef,\n  ViewChild,\n  NgZone,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\nimport { WaveSurfer } from '../../cometchat-audio-bubble/wavesurfer';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\nimport {\n  formatRecordingTime,\n  checkMicrophonePermission,\n  startWaveformLoop,\n  buildWaveSurferOptions,\n  setupMediaRecorderHandlers,\n  wireWaveSurferEvents,\n} from './cometchat-media-recorder.utils';\n\n/**\n * CometChatMediaRecorder records audio with permission handling.\n * Uses Web Audio API AnalyserNode for real-time waveform visualization.\n * Uses WaveSurfer for preview playback when paused.\n *\n * Keyboard Accessibility:\n * - Space/Enter: Activate buttons\n * - Escape: Cancel recording and close recorder\n * - Tab: Navigate between control buttons\n */\n@Component({\n  selector: 'cometchat-media-recorder',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-media-recorder.component.html',\n  styleUrls: ['./cometchat-media-recorder.component.css'],\n})\nexport class CometChatMediaRecorderComponent implements OnInit, OnDestroy {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  @Input() autoRecording = false;\n  @Output() closeRecording = new EventEmitter<void>();\n  @Output() submitRecording = new EventEmitter<Blob>();\n  @Output() recordingError = new EventEmitter<Error>();\n\n  @ViewChild('waveformContainer') waveformContainer?: ElementRef<HTMLDivElement>;\n\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private cdr = inject(ChangeDetectorRef);\n  private ngZone = inject(NgZone);\n\n  mediaRecorder?: MediaRecorder;\n  isRecording = false;\n  isPaused = false;\n  mediaPreviewUrl?: string;\n  counter = 0;\n  hasError = false;\n  permissionState: PermissionState = 'prompt';\n\n  private readonly WAVEFORM_BAR_COUNT = 30;\n  waveformHeights: number[] = new Array(this.WAVEFORM_BAR_COUNT).fill(4);\n  isPreviewPlaying = false;\n  previewCurrentTime = 0;\n  previewDuration = 0;\n\n  // ── Private state ──\n  private stream?: MediaStream;\n  private audioChunks: Blob[] = [];\n  private timerInterval?: number;\n  private recordedBlob?: Blob;\n  private hasInitialized = false;\n  private pendingInlineSend = false;\n  private durationAnnouncementInterval?: number;\n  private readonly DURATION_ANNOUNCEMENT_INTERVAL = 10;\n  private audioContext?: AudioContext;\n  private analyser?: AnalyserNode;\n  private sourceNode?: MediaStreamAudioSourceNode;\n  private animationFrameId?: number;\n  private waveSurfer?: WaveSurfer;\n\n  ngOnInit(): void {\n    if (this.autoRecording) {\n      this.pendingTimers.push(setTimeout(() => this.handleStartRecording(), 100));\n    }\n    this.setupPermissionMonitoring();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.handleStopRecording(); this.clearTimer(); this.clearStream();\n    this.clearDurationAnnouncementInterval(); this.stopWaveformAnalysis(); this.destroyWaveSurfer();\n  }\n\n  @HostListener('keydown.escape', ['$event'])\n  handleEscapeKey(event: Event): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.handleCloseRecording();\n  }\n\n  handleKeydown(event: KeyboardEvent, action: string): void {\n    if (event.key !== 'Enter' && event.key !== ' ') return;\n    event.preventDefault();\n    event.stopPropagation();\n    switch (action) {\n      case 'start': this.handleStartRecording(); break;\n      case 'pause': this.handlePauseRecording(); break;\n      case 'stop': this.handleStopRecording(); break;\n      case 'close': this.handleCloseRecording(); break;\n      case 'submit': this.handleSubmitRecording(); break;\n      case 'preview': this.togglePreviewPlayback(); break;\n    }\n  }\n\n  async checkMicrophonePermission(): Promise<PermissionState> {\n    return checkMicrophonePermission();\n  }\n\n  async setupPermissionMonitoring(): Promise<void> {\n    try {\n      const perm = await navigator.permissions.query({ name: 'microphone' as PermissionName });\n      perm.onchange = () => {\n        this.permissionState = perm.state;\n        if (perm.state === 'denied') {\n          Object.assign(this, { hasError: true, isRecording: false, isPaused: false });\n          this.clearStream(); this.stopTimer(); this.stopWaveformAnalysis();\n        } else if (perm.state === 'granted') { this.hasError = false; }\n        this.cdr.detectChanges();\n      };\n    } catch (e) { CometChatLogger.error('CometChatMediaRecorder', 'Permission monitoring setup failed:', e); }\n  }\n\n  async initMediaRecorder(): Promise<MediaRecorder | null> {\n    try {\n      if (this.hasInitialized) return null;\n      this.clearStream();\n      const stream = await navigator.mediaDevices.getUserMedia({ audio: true });\n      this.hasInitialized = true;\n      this.stream = stream;\n      this.startWaveformAnalysis(stream);\n\n      const audioRecorder = new MediaRecorder(stream);\n      this.setupMediaRecorderHandlers(audioRecorder, stream);\n      audioRecorder.start(250);\n      this.hasError = false;\n      return audioRecorder;\n    } catch (error: unknown) {\n      const err = error as { name?: string };\n      if (err.name === 'NotAllowedError' || err.name === 'PermissionDeniedError') {\n        this.hasError = true;\n        this.permissionState = 'denied';\n      }\n      this.hasInitialized = false;\n      this.recordingError.emit(error as Error);\n      return null;\n    }\n  }\n\n  private setupMediaRecorderHandlers(audioRecorder: MediaRecorder, stream: MediaStream): void {\n    setupMediaRecorderHandlers(audioRecorder, stream, {\n      onDataAvailable: (chunk) => this.audioChunks.push(chunk),\n      onStop: () => {\n        if (this.audioChunks.length === 0) return;\n        const blob = new Blob(this.audioChunks, { type: this.audioChunks[0]?.type || 'audio/webm' });\n        this.recordedBlob = blob;\n        this.audioChunks = [];\n        if (this.pendingInlineSend) { this.pendingInlineSend = false; this.submitRecording.emit(blob); this.reset(); return; }\n        this.mediaPreviewUrl = URL.createObjectURL(blob);\n        this.cdr.detectChanges();\n      },\n      onError: (event: Event) => {\n        const err = event as { error?: Error };\n        this.hasError = true; this.isRecording = false; this.isPaused = false;\n        this.clearStream(); this.hasInitialized = false; this.stopWaveformAnalysis();\n        if (err.error) this.recordingError.emit(err.error);\n        this.cdr.detectChanges();\n      },\n      onTrackEnded: () => { this.hasError = true; this.isRecording = false; this.stopWaveformAnalysis(); this.cdr.detectChanges(); },\n    });\n  }\n\n  // ── Waveform analysis ──\n  private startWaveformAnalysis(stream: MediaStream): void {\n    try {\n      this.audioContext = new AudioContext();\n      this.analyser = this.audioContext.createAnalyser();\n      this.analyser.fftSize = 64;\n      this.sourceNode = this.audioContext.createMediaStreamSource(stream);\n      this.sourceNode.connect(this.analyser);\n      this.animationFrameId = this.runWaveformLoop();\n    } catch (error) {\n      CometChatLogger.error('CometChatMediaRecorder', 'Failed to initialize audio analysis:', error);\n    }\n  }\n\n  private stopWaveformAnalysis(): void {\n    if (this.animationFrameId) { cancelAnimationFrame(this.animationFrameId); this.animationFrameId = undefined; }\n    this.sourceNode?.disconnect();\n    this.sourceNode = undefined;\n    if (this.audioContext && this.audioContext.state !== 'closed') {\n      this.audioContext.close().catch(() => {});\n      this.audioContext = undefined;\n    }\n    this.analyser = undefined;\n    this.waveformHeights = new Array(this.WAVEFORM_BAR_COUNT).fill(4);\n  }\n\n  private resumeWaveformAnalysis(): void {\n    if (!this.analyser) return;\n    this.animationFrameId = this.runWaveformLoop();\n  }\n\n  private runWaveformLoop(): number {\n    return startWaveformLoop(\n      this.analyser!,\n      this.WAVEFORM_BAR_COUNT,\n      () => this.isRecording,\n      () => this.isPaused,\n      heights => { this.waveformHeights = heights; this.cdr.detectChanges(); }\n    );\n  }\n\n  // ── Recording control methods ──\n  async handleStartRecording(): Promise<void> {\n    if (this.isRecording && !this.isPaused) return;\n    const announce = (key: string) => this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString(key));\n\n    if (this.isPaused && this.mediaRecorder?.state === 'paused') {\n      this.stopPreviewPlayback(); this.destroyWaveSurfer();\n      this.mediaRecorder.resume();\n      this.isPaused = false; this.isRecording = true;\n      this.startTimer();\n      if (this.audioContext && this.analyser) this.resumeWaveformAnalysis();\n      announce('media_recorder_recording'); this.cdr.detectChanges();\n      return;\n    }\n\n    const recorder = await this.initMediaRecorder();\n    if (!recorder) return;\n    this.mediaRecorder = recorder;\n    this.isRecording = true; this.isPaused = false;\n    this.counter = 0; this.mediaPreviewUrl = undefined; this.recordedBlob = undefined;\n    this.startTimer(); this.announceDuration();\n    announce('media_recorder_recording'); this.cdr.detectChanges();\n  }\n\n  handlePauseRecording(): void {\n    if (!this.isRecording || this.isPaused || this.mediaRecorder?.state !== 'recording') return;\n    this.mediaRecorder.pause(); this.isPaused = true; this.pauseTimer();\n    if (this.animationFrameId) { cancelAnimationFrame(this.animationFrameId); this.animationFrameId = undefined; }\n    this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('media_recorder_paused'));\n    this.cdr.detectChanges();\n    this.pendingTimers.push(setTimeout(() => this.initWaveSurferPreview(), 50));\n  }\n\n  handleStopRecording(): void {\n    if (this.mediaRecorder?.state === 'recording' || this.mediaRecorder?.state === 'paused') this.mediaRecorder.stop();\n    this.isRecording = false; this.isPaused = false;\n    this.stopTimer(); this.stopWaveformAnalysis(); this.stopPreviewPlayback(); this.destroyWaveSurfer();\n    this.cdr.detectChanges();\n  }\n\n  handleCloseRecording(): void { this.handleStopRecording(); this.reset(); this.closeRecording.emit(); }\n  handleSubmitRecording(): void { if (this.recordedBlob) { this.submitRecording.emit(this.recordedBlob); this.reset(); } }\n\n  handleInlineSend(): void {\n    if (this.mediaRecorder?.state === 'recording' || this.mediaRecorder?.state === 'paused') {\n      this.stopPreviewPlayback(); this.destroyWaveSurfer();\n      this.pendingInlineSend = true; this.mediaRecorder.stop();\n      this.isRecording = false; this.isPaused = false;\n      this.stopTimer(); this.stopWaveformAnalysis(); this.cdr.detectChanges();\n    } else if (this.recordedBlob) { this.submitRecording.emit(this.recordedBlob); this.reset(); }\n  }\n\n  // ── WaveSurfer preview playback ──\n  private initWaveSurferPreview(): void {\n    if (!this.waveformContainer?.nativeElement || this.waveSurfer) return;\n    const previewBlob = new Blob(this.audioChunks, { type: this.audioChunks[0]?.type || 'audio/webm' });\n    if (previewBlob.size === 0) return;\n    const previewUrl = URL.createObjectURL(previewBlob);\n    const options = buildWaveSurferOptions(this.waveformContainer.nativeElement);\n    this.waveSurfer = WaveSurfer.create(options as any);\n    this.wireWaveSurferEvents();\n    this.waveSurfer.load(previewUrl).catch((e: Error) => CometChatLogger.error('CometChatMediaRecorder', 'Failed to load preview audio:', e));\n  }\n\n  private wireWaveSurferEvents(): void {\n    if (!this.waveSurfer) return;\n    wireWaveSurferEvents(this.waveSurfer, fn => this.ngZone.run(fn), {\n      onReady: (d) => { this.previewDuration = d; this.cdr.detectChanges(); },\n      onTimeUpdate: (t) => { this.previewCurrentTime = t; this.cdr.detectChanges(); },\n      onFinish: () => { this.isPreviewPlaying = false; this.previewCurrentTime = 0; this.waveSurfer?.seekTo(0); this.cdr.detectChanges(); },\n      onPlay: () => { this.isPreviewPlaying = true; this.cdr.detectChanges(); },\n      onPause: () => { this.isPreviewPlaying = false; this.cdr.detectChanges(); },\n    });\n  }\n\n  togglePreviewPlayback(): void {\n    if (!this.waveSurfer) return;\n    this.waveSurfer.playPause();\n  }\n\n  private stopPreviewPlayback(): void {\n    if (this.waveSurfer && this.isPreviewPlaying) this.waveSurfer.pause();\n    this.isPreviewPlaying = false;\n    this.previewCurrentTime = 0;\n  }\n\n  private destroyWaveSurfer(): void {\n    if (this.waveSurfer) { this.waveSurfer.destroy(); this.waveSurfer = undefined; }\n    this.isPreviewPlaying = false;\n    this.previewCurrentTime = 0;\n    this.previewDuration = 0;\n  }\n\n  get previewTimeDisplay(): string {\n    if (this.isPreviewPlaying || this.previewCurrentTime > 0) {\n      return formatRecordingTime(Math.floor(this.previewCurrentTime)) + ' / ' + formatRecordingTime(this.counter);\n    }\n    return formatRecordingTime(this.counter);\n  }\n\n  // ── Utility methods ──\n  private reset(): void {\n    this.isRecording = false; this.isPaused = false; this.counter = 0; this.hasError = false;\n    this.audioChunks = []; this.recordedBlob = undefined; this.pendingInlineSend = false;\n    if (this.mediaPreviewUrl) { URL.revokeObjectURL(this.mediaPreviewUrl); this.mediaPreviewUrl = undefined; }\n    this.clearStream(); this.clearTimer(); this.clearDurationAnnouncementInterval();\n    this.stopWaveformAnalysis(); this.stopPreviewPlayback(); this.destroyWaveSurfer();\n    this.hasInitialized = false; this.mediaRecorder = undefined; this.cdr.detectChanges();\n  }\n\n  private clearStream(): void {\n    if (this.stream) { this.stream.getTracks().forEach(t => t.stop()); this.stream = undefined; }\n  }\n\n  private startTimer(): void {\n    this.clearTimer();\n    this.timerInterval = window.setInterval(() => { this.counter++; this.cdr.detectChanges(); }, 1000);\n  }\n\n  private pauseTimer(): void { this.clearTimer(); }\n  private stopTimer(): void { this.clearTimer(); }\n\n  private clearTimer(): void {\n    if (this.timerInterval) { clearInterval(this.timerInterval); this.timerInterval = undefined; }\n  }\n\n  private announceDuration(): void {\n    this.clearDurationAnnouncementInterval();\n    this.durationAnnouncementInterval = window.setInterval(\n      () => this.liveAnnouncer.announce(this.durationAriaLabel),\n      this.DURATION_ANNOUNCEMENT_INTERVAL * 1000\n    );\n  }\n\n  private clearDurationAnnouncementInterval(): void {\n    if (this.durationAnnouncementInterval) { clearInterval(this.durationAnnouncementInterval); this.durationAnnouncementInterval = undefined; }\n  }\n\n  formatTime(seconds: number): string {\n    return formatRecordingTime(seconds);\n  }\n\n  get formattedCounter(): string { return formatRecordingTime(this.counter); }\n\n  get recordingStateText(): string {\n    if (this.hasError) return CometChatLocalize.getLocalizedString('media_recorder_error_title');\n    if (this.isPaused) return CometChatLocalize.getLocalizedString('media_recorder_paused');\n    if (this.isRecording) return CometChatLocalize.getLocalizedString('media_recorder_recording');\n    return '';\n  }\n\n  get recordButtonAriaLabel(): string {\n    return this.isPaused\n      ? CometChatLocalize.getLocalizedString('media_recorder_resume')\n      : CometChatLocalize.getLocalizedString('media_recorder_start');\n  }\n\n  get recordButtonAriaPressed(): string { return this.isRecording ? 'true' : 'false'; }\n\n  get durationAriaLabel(): string {\n    const mins = Math.floor(this.counter / 60);\n    const secs = this.counter % 60;\n    return `${mins} minutes ${secs} seconds`;\n  }\n}\n","<div class=\"cometchat-media-recorder--inline\" role=\"group\" [attr.aria-label]=\"'media_recorder_aria_label' | translate\">\n  <!-- Screen reader announcements -->\n  <div class=\"cometchat-media-recorder__sr-only\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">\n    {{ recordingStateText }}\n  </div>\n\n  @if (hasError) {\n    <!-- Error State -->\n    <div class=\"cometchat-media-recorder__inline-error\" role=\"alert\">\n      <div class=\"cometchat-media-recorder__inline-error-icon\"></div>\n      <span class=\"cometchat-media-recorder__inline-error-text\">{{ 'media_recorder_error_title' | translate }}</span>\n      <div\n        class=\"cometchat-media-recorder__inline-close\"\n        (click)=\"handleCloseRecording()\"\n        (keydown)=\"handleKeydown($event, 'close')\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"'media_recorder_delete' | translate\">\n        <div class=\"cometchat-media-recorder__inline-close-icon\"></div>\n      </div>\n    </div>\n  } @else {\n    <!-- Delete Button (always visible) -->\n    <div\n      class=\"cometchat-media-recorder__inline-delete\"\n      (click)=\"handleCloseRecording()\"\n      (keydown)=\"handleKeydown($event, 'close')\"\n      role=\"button\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"'media_recorder_delete' | translate\">\n      <div class=\"cometchat-media-recorder__inline-delete-icon\"></div>\n    </div>\n\n    @if (!isPaused) {\n      <!-- RECORDING STATE: dot + real-time waveform + timer + pause -->\n      <div class=\"cometchat-media-recorder__recording-dot\" aria-hidden=\"true\"></div>\n\n      <!-- Real-time Waveform Visualization -->\n      <div class=\"cometchat-media-recorder__waveform\" aria-hidden=\"true\">\n        @for (height of waveformHeights; track $index) {\n          <div\n            class=\"cometchat-media-recorder__waveform-bar cometchat-media-recorder__waveform-bar--active\"\n            [style.height.px]=\"height\">\n          </div>\n        }\n      </div>\n\n      <!-- Timer Display -->\n      <div\n        class=\"cometchat-media-recorder__timer\"\n        role=\"timer\"\n        aria-live=\"off\"\n        [attr.aria-label]=\"durationAriaLabel\">\n        {{ formattedCounter }}\n      </div>\n\n      <!-- Pause Button -->\n      <div\n        class=\"cometchat-media-recorder__inline-pause\"\n        (click)=\"handlePauseRecording()\"\n        (keydown)=\"handleKeydown($event, 'pause')\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"'media_recorder_pause' | translate\">\n        <div class=\"cometchat-media-recorder__inline-pause-icon\"></div>\n      </div>\n    } @else if (isPaused) {\n      <!-- PAUSED STATE: play-preview + wavesurfer waveform + timer + resume -->\n\n      <!-- Play Preview Button -->\n      <div\n        class=\"cometchat-media-recorder__inline-play\"\n        (click)=\"togglePreviewPlayback()\"\n        (keydown)=\"handleKeydown($event, 'preview')\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"isPreviewPlaying ? ('media_recorder_pause' | translate) : ('media_recorder_play_preview' | translate)\">\n        <div\n          class=\"cometchat-media-recorder__inline-play-icon\"\n          [class.cometchat-media-recorder__inline-play-icon--playing]=\"isPreviewPlaying\">\n        </div>\n      </div>\n\n      <!-- WaveSurfer Waveform Container for preview playback -->\n      <div class=\"cometchat-media-recorder__waveform-preview\" #waveformContainer></div>\n\n      <!-- Timer Display -->\n      <div\n        class=\"cometchat-media-recorder__timer\"\n        role=\"timer\"\n        aria-live=\"off\"\n        [attr.aria-label]=\"durationAriaLabel\">\n        {{ previewTimeDisplay }}\n      </div>\n\n      <!-- Resume Recording Button -->\n      <div\n        class=\"cometchat-media-recorder__inline-resume\"\n        (click)=\"handleStartRecording()\"\n        (keydown)=\"handleKeydown($event, 'start')\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"'media_recorder_resume' | translate\">\n        <div class=\"cometchat-media-recorder__inline-resume-icon\"></div>\n      </div>\n    } @else {\n      <!-- IDLE STATE (not recording, not paused - initial or after stop with no preview) -->\n      <div\n        class=\"cometchat-media-recorder__inline-record\"\n        (click)=\"handleStartRecording()\"\n        (keydown)=\"handleKeydown($event, 'start')\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"recordButtonAriaLabel\"\n        [attr.aria-pressed]=\"recordButtonAriaPressed\">\n        <div class=\"cometchat-media-recorder__inline-record-icon\"></div>\n      </div>\n\n      <!-- Idle Waveform -->\n      <div class=\"cometchat-media-recorder__waveform\" aria-hidden=\"true\">\n        @for (height of waveformHeights; track $index) {\n          <div\n            class=\"cometchat-media-recorder__waveform-bar\"\n            [style.height.px]=\"height\">\n          </div>\n        }\n      </div>\n\n      <!-- Timer Display -->\n      <div\n        class=\"cometchat-media-recorder__timer\"\n        role=\"timer\"\n        aria-live=\"off\"\n        [attr.aria-label]=\"durationAriaLabel\">\n        {{ formattedCounter }}\n      </div>\n    }\n  }\n</div>\n","/**\n * Utility functions for CometChatPopover component.\n */\nimport { Placement } from '../../../Enums/Enums';\n\n/**\n * Returns true when running inside a Storybook docs-mode iframe.\n * In docs mode the URL contains 'viewMode=docs'.\n */\nexport function isDocsMode(): boolean {\n  try {\n    return window.location.search.includes('viewMode=docs');\n  } catch {\n    return false;\n  }\n}\n\n/**\n * Finds the nearest [data-cometchat-container] ancestor, or falls back to\n * the topmost element with the 'cometchat' class.\n */\nexport function getTopMostCometChatElement(startEl: HTMLElement): HTMLElement | undefined {\n  let current = startEl as HTMLElement;\n\n  // Prefer the nearest [data-cometchat-container] ancestor\n  while (current) {\n    if (current.hasAttribute?.('data-cometchat-container')) return current;\n    current = current.parentElement as HTMLElement;\n  }\n\n  // Fall back to topmost .cometchat element\n  current = startEl;\n  let topMostElement: HTMLElement | null = null;\n  while (current) {\n    if (current.classList?.contains('cometchat')) topMostElement = current;\n    current = current.parentElement as HTMLElement;\n  }\n\n  return topMostElement || undefined;\n}\n\n/**\n * Determines the best placement for the popover based on available space.\n */\nexport function getAvailablePlacement(\n  rect: DOMRect,\n  height: number,\n  placement: Placement,\n  useParentContainer: boolean,\n  parentViewRef: HTMLElement | undefined\n): Placement {\n  const spaceAbove = rect.top;\n  const spaceBelow = window.innerHeight - rect.bottom;\n  const spaceLeft = rect.left;\n  const spaceRight = window.innerWidth - rect.right;\n\n  const effectiveUseParent = useParentContainer || isDocsMode();\n\n  if (effectiveUseParent && parentViewRef) {\n    const parentRect = parentViewRef.getBoundingClientRect();\n    const spaceAboveParent = rect.top - parentRect.top;\n    const spaceBelowParent = parentRect.bottom - rect.bottom;\n    const spaceLeftParent = rect.left - parentRect.left;\n    const spaceRightParent = parentRect.right - rect.right;\n    const offset = 10;\n\n    if (placement === Placement.top && spaceAboveParent >= height + offset) return Placement.top;\n    if (placement === Placement.bottom && spaceBelowParent >= height + offset) return Placement.bottom;\n    if (placement === Placement.left && spaceLeftParent >= height + 10) return Placement.left;\n    if (placement === Placement.right && spaceRightParent >= height + 10) return Placement.right;\n\n    if (spaceAboveParent >= height + 10) return Placement.top;\n    if (spaceBelowParent >= height + 10) return Placement.bottom;\n    if (spaceLeftParent >= height + 10) return Placement.left;\n    if (spaceRightParent >= height + 10) return Placement.right;\n  }\n\n  if (placement === Placement.top && spaceAbove >= height + 10) return Placement.top;\n  if (placement === Placement.bottom && spaceBelow >= height + 10) return Placement.bottom;\n  if (placement === Placement.left && spaceLeft >= height + 10) return Placement.left;\n  if (placement === Placement.right && spaceRight >= height + 10) return Placement.right;\n\n  if (spaceAbove >= height + 10) return Placement.top;\n  if (spaceBelow >= height + 10) return Placement.bottom;\n  if (spaceLeft >= height + 10) return Placement.left;\n  if (spaceRight >= height + 10) return Placement.right;\n\n  return placement;\n}\n\n/**\n * Calculates viewport-based popover position style.\n */\nexport function calculateViewportPosition(\n  rect: DOMRect,\n  height: number,\n  width: number,\n  availablePlacement: Placement,\n  offset = 10\n): Record<string, string> {\n  const viewportHeight = window.innerHeight;\n  const viewportWidth = window.innerWidth;\n  const positionStyle: Record<string, string> = {};\n\n  if (availablePlacement === Placement.top) {\n    // Clamp top to minimum 10px — Safari won't render fixed elements with negative top\n    let top = rect.top - height - offset;\n    top = Math.max(10, top);\n    positionStyle['top'] = `${top}px`;\n    let left = rect.left + rect.width / 2 - width / 2;\n    left = Math.max(10, Math.min(left, viewportWidth - width - 10));\n    positionStyle['left'] = `${left}px`;\n  } else if (availablePlacement === Placement.bottom) {\n    positionStyle['top'] = `${rect.bottom + offset}px`;\n    let left = rect.left + rect.width / 2 - width / 2;\n    left = Math.max(10, Math.min(left, viewportWidth - width - 10));\n    positionStyle['left'] = `${left}px`;\n  } else if (availablePlacement === Placement.left) {\n    positionStyle['left'] = `${rect.left - width - offset}px`;\n    let top = rect.top + rect.height / 2 - height / 2;\n    top = Math.max(10, Math.min(top, viewportHeight - height - 10));\n    positionStyle['top'] = `${top}px`;\n  } else if (availablePlacement === Placement.right) {\n    positionStyle['left'] = `${rect.right + offset}px`;\n    let top = rect.top + rect.height / 2 - height / 2;\n    top = Math.max(10, Math.min(top, viewportHeight - height - 10));\n    positionStyle['top'] = `${top}px`;\n  }\n\n  return positionStyle;\n}\n\n/**\n * Calculates parent-container-based popover position style.\n * \n * @param constrainHorizontal - When true, clamp left so the popover stays within parentRect horizontally\n * @param constrainVertical - When true, clamp top so the popover stays within parentRect vertically\n */\nexport function calculateParentPosition(\n  rect: DOMRect,\n  height: number,\n  width: number,\n  parentRect: DOMRect,\n  availablePlacement: Placement,\n  inDocsMode: boolean,\n  hostRect: DOMRect | null,\n  showTooltip: boolean,\n  constrainHorizontal = false,\n  constrainVertical = false\n): Record<string, string> {\n  const positionStyle: Record<string, string> = {};\n  const offset = !showTooltip ? 10 : 5;\n\n  if (inDocsMode && hostRect) {\n    positionStyle['position'] = 'absolute';\n    if (availablePlacement === Placement.top) {\n      positionStyle['top'] = `${rect.top - height - offset - hostRect.top}px`;\n      let left = rect.left + rect.width / 2 - width / 2;\n      left = Math.max(parentRect.left + 10, Math.min(left, parentRect.right - width - 10));\n      positionStyle['left'] = `${left - hostRect.left}px`;\n    } else if (availablePlacement === Placement.bottom) {\n      positionStyle['top'] = `${rect.bottom + offset - hostRect.top}px`;\n      let left = rect.left + rect.width / 2 - width / 2;\n      left = Math.max(parentRect.left + 10, Math.min(left, parentRect.right - width - 10));\n      positionStyle['left'] = `${left - hostRect.left}px`;\n    } else if (availablePlacement === Placement.left) {\n      positionStyle['left'] = `${rect.left - width - offset - hostRect.left}px`;\n      let top = rect.top + rect.height / 2 - height / 2;\n      top = Math.max(parentRect.top + 10, Math.min(top, parentRect.bottom - height - 10));\n      positionStyle['top'] = `${top - hostRect.top}px`;\n    } else if (availablePlacement === Placement.right) {\n      positionStyle['left'] = `${rect.right + offset - hostRect.left}px`;\n      let top = rect.top + rect.height / 2 - height / 2;\n      top = Math.max(parentRect.top + 10, Math.min(top, parentRect.bottom - height - 10));\n      positionStyle['top'] = `${top - hostRect.top}px`;\n    }\n  } else {\n    if (availablePlacement === Placement.top) {\n      // Vertical: clamp to parentRect if constrainVertical, else use viewport\n      const rawTop = rect.top - height - offset;\n      positionStyle['top'] = constrainVertical\n        ? `${Math.max(parentRect.top, rawTop)}px`\n        : `${rawTop}px`;\n      // Horizontal: clamp to parentRect if constrainHorizontal, else clamp to viewport\n      let left = rect.left + rect.width / 2 - width / 2;\n      if (constrainHorizontal) {\n        left = Math.max(parentRect.left + 10, Math.min(left, parentRect.right - width - 10));\n      } else {\n        left = Math.max(10, Math.min(left, window.innerWidth - width - 10));\n      }\n      positionStyle['left'] = `${left}px`;\n    } else if (availablePlacement === Placement.bottom) {\n      const rawTop = rect.bottom + offset;\n      positionStyle['top'] = constrainVertical\n        ? `${Math.min(parentRect.bottom - height, rawTop)}px`\n        : `${rawTop}px`;\n      let left = rect.left + rect.width / 2 - width / 2;\n      if (constrainHorizontal) {\n        left = Math.max(parentRect.left + 10, Math.min(left, parentRect.right - width - 10));\n      } else {\n        left = Math.max(10, Math.min(left, window.innerWidth - width - 10));\n      }\n      positionStyle['left'] = `${left}px`;\n    } else if (availablePlacement === Placement.left) {\n      const rawLeft = rect.left - width - offset;\n      positionStyle['left'] = constrainHorizontal\n        ? `${Math.max(parentRect.left, rawLeft)}px`\n        : `${rawLeft}px`;\n      let top = rect.top + rect.height / 2 - height / 2;\n      if (constrainVertical) {\n        top = Math.max(parentRect.top + 10, Math.min(top, parentRect.bottom - height - 10));\n      } else {\n        top = Math.max(10, Math.min(top, window.innerHeight - height - 10));\n      }\n      positionStyle['top'] = `${top}px`;\n    } else if (availablePlacement === Placement.right) {\n      const rawLeft = rect.right + offset;\n      positionStyle['left'] = constrainHorizontal\n        ? `${Math.min(parentRect.right - width, rawLeft)}px`\n        : `${rawLeft}px`;\n      let top = rect.top + rect.height / 2 - height / 2;\n      if (constrainVertical) {\n        top = Math.max(parentRect.top + 10, Math.min(top, parentRect.bottom - height - 10));\n      } else {\n        top = Math.max(10, Math.min(top, window.innerHeight - height - 10));\n      }\n      positionStyle['top'] = `${top}px`;\n    }\n  }\n\n  return positionStyle;\n}\n\n/**\n * Calculates popover position when not using parent height.\n */\nexport function calculateNoParentHeightPosition(\n  rect: DOMRect,\n  popoverWidth: number,\n  popoverHeight: number,\n  parentRect: { left: number; right: number },\n  placement: Placement\n): Record<string, string> {\n  const positionStyle: Record<string, string> = {};\n\n  if (placement === Placement.top) {\n    positionStyle['top'] = `${rect.top - popoverHeight - 10}px`;\n  } else if (placement === Placement.bottom) {\n    positionStyle['top'] = `${rect.bottom + 10}px`;\n  }\n\n  const popoverLeft = rect.left + rect.width / 2 - popoverWidth / 2;\n  if (popoverLeft < parentRect.left) {\n    positionStyle['left'] = `${parentRect.left + 10}px`;\n  } else if (popoverLeft + popoverWidth > parentRect.right) {\n    positionStyle['left'] = `${parentRect.right - popoverWidth - 10}px`;\n  } else {\n    positionStyle['left'] = `${popoverLeft}px`;\n  }\n\n  return positionStyle;\n}\n\n/**\n * Returns all focusable elements within a container.\n */\nexport function getFocusableElements(container: HTMLElement): HTMLElement[] {\n  const selectors = [\n    'button:not([disabled])',\n    '[href]',\n    'input:not([disabled])',\n    'select:not([disabled])',\n    'textarea:not([disabled])',\n    '[tabindex]:not([tabindex=\"-1\"])',\n  ];\n  return Array.from(container.querySelectorAll(selectors.join(', '))) as HTMLElement[];\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ElementRef,\n  ViewChild,\n  TemplateRef,\n  HostListener,\n  OnDestroy,\n  AfterViewInit,\n  OnInit,\n  ChangeDetectorRef,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Placement } from '../../../Enums/Enums';\nimport {\n  isDocsMode,\n  getTopMostCometChatElement,\n  getAvailablePlacement,\n  calculateViewportPosition,\n  calculateParentPosition,\n  calculateNoParentHeightPosition,\n  getFocusableElements,\n} from './cometchat-popover.utils';\n\n/**\n * CometChatPopover provides a floating popover positioned relative to a trigger element\n * with viewport-aware positioning and full accessibility support.\n */\n@Component({\n  selector: 'cometchat-popover',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-popover.component.html',\n  styleUrls: ['./cometchat-popover.component.css'],\n})\nexport class CometChatPopoverComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** Static registry of all currently open popover instances for mutual exclusivity */\n  private static openInstances = new Set<CometChatPopoverComponent>();\n\n  private cdr = inject(ChangeDetectorRef);\n\n  @Input() placement: Placement = Placement.bottom;\n  @Input() closeOnOutsideClick = true;\n  @Input() showOnHover = false;\n  @Input() debounceOnHover = 500;\n  /**\n   * When true, the trigger is inert: click, keyboard, and hover no longer open the\n   * popover. Used to disable trigger controls (e.g. the composer's attachment/sticker\n   * buttons while editing a message) without unmounting them.\n   */\n  @Input() disabled = false;\n  @Input() content!: TemplateRef<any>;\n  @Input() disableBackgroundInteraction = false;\n  @Input() useParentContainer = false;\n  @Input() useParentHeight = true;\n  @Input() showTooltip = false;\n  @Input() trapFocus = false;\n  @Input() ariaLabel?: string;\n  @Input() ariaLabelledBy?: string;\n  @Input() ariaDescribedBy?: string;\n  @Input() contentStyle: Record<string, string> = {};\n  /**\n   * When true (and useParentContainer is true), the popover will not overflow\n   * the parent container horizontally. Use for popovers that must stay within\n   * a bounded horizontal region (e.g. attachment menu in the message composer).\n   */\n  @Input() constrainHorizontal = false;\n  /**\n   * When true (and useParentContainer is true), the popover will not overflow\n   * the parent container vertically. Use for popovers that must stay within\n   * a bounded vertical region (e.g. message bubble context menus in the message list).\n   */\n  @Input() constrainVertical = false;\n\n  @Output() popoverOpened = new EventEmitter<void>();\n  @Output() popoverClosed = new EventEmitter<void>();\n  @Output() outsideClick = new EventEmitter<void>();\n\n  isOpen = false;\n  isPositioned = false;\n  positionStyle: Record<string, string> = {};\n  availablePlacement: Placement = Placement.top;\n\n  @ViewChild('popoverRef') popoverRef!: ElementRef<HTMLDivElement>;\n  @ViewChild('childRef') childRef!: ElementRef<HTMLDivElement>;\n\n  private hoverTimeout?: number;\n  private parentViewRef?: HTMLElement;\n  private resizeTimeout?: number;\n  private previouslyFocusedElement: HTMLElement | null = null;\n  public focusableElements: HTMLElement[] = [];\n  private keydownListener: ((event: KeyboardEvent) => void) | null = null;\n  private justOpened = false;\n\n  Placement = Placement;\n  popoverId = `cometchat-popover-${Math.random().toString(36).substr(2, 9)}`;\n\n  ngOnInit(): void {}\n  ngAfterViewInit(): void {}\n\n  ngOnDestroy(): void {\n    CometChatPopoverComponent.openInstances.delete(this);\n    if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n    if (this.resizeTimeout) clearTimeout(this.resizeTimeout);\n    if (this.keydownListener) document.removeEventListener('keydown', this.keydownListener);\n    if (this.isOpen) this.restoreFocus();\n  }\n\n  togglePopover(): void {\n    this.isOpen = !this.isOpen;\n    if (this.isOpen) {\n      this.openPopoverInternal();\n    } else {\n      this.closePopoverInternal(true);\n    }\n  }\n\n  openPopover(): void {\n    if (!this.isOpen) {\n      this.isOpen = true;\n      this.openPopoverInternal();\n    }\n  }\n\n  closePopover(): void {\n    if (this.isOpen) {\n      this.isOpen = false;\n      this.closePopoverInternal(true);\n    }\n  }\n\n  closePopoverSilently(): void {\n    if (this.isOpen) {\n      this.isOpen = false;\n      this.isPositioned = false;\n      CometChatPopoverComponent.openInstances.delete(this);\n      this.cleanupFocusTrap();\n      this.restoreFocus();\n    }\n  }\n\n  private openPopoverInternal(): void {\n    CometChatPopoverComponent.openInstances.forEach(i => { if (i !== this) i.closePopover(); });\n    CometChatPopoverComponent.openInstances.add(this);\n    this.isPositioned = false;\n    this.justOpened = true;\n    setTimeout(() => { this.justOpened = false; }, 0);\n    this.saveFocus();\n    setTimeout(() => {\n      setTimeout(() => {\n        this.getPopoverPositionStyle();\n        this.setupFocusTrap();\n        this.focusFirstElement();\n      }, 0);\n    }, 0);\n    this.popoverOpened.emit();\n  }\n\n  private closePopoverInternal(emit: boolean): void {\n    CometChatPopoverComponent.openInstances.delete(this);\n    this.isPositioned = false;\n    this.cleanupFocusTrap();\n    this.restoreFocus();\n    this.cdr.markForCheck();\n    this.cdr.detectChanges();\n    if (emit) this.popoverClosed.emit();\n  }\n\n  onPopoverMouseEnter(): void {\n    if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n    if (this.showOnHover && !this.isOpen && !this.disabled) {\n      this.hoverTimeout = window.setTimeout(() => this.openPopover(), this.debounceOnHover);\n    }\n  }\n\n  onPopoverMouseLeave(): void {\n    if (this.hoverTimeout) clearTimeout(this.hoverTimeout);\n    if (this.showOnHover && this.isOpen) {\n      this.hoverTimeout = window.setTimeout(() => this.closePopover(), this.debounceOnHover);\n    }\n  }\n\n  onChildClick(event: MouseEvent): void {\n    event.stopPropagation();\n    if (this.disabled) return;\n    if (!this.showOnHover) this.togglePopover();\n  }\n\n  onChildKeydown(event: Event): void {\n    event.stopPropagation();\n    event.preventDefault();\n    if (this.disabled) return;\n    if (!this.showOnHover) this.togglePopover();\n  }\n\n  @HostListener('document:click', ['$event'])\n  handleClickOutside(event: MouseEvent): void {\n    if (!this.closeOnOutsideClick || !this.isOpen || this.justOpened || !this.popoverRef) return;\n    if (this.popoverRef && this.childRef) {\n      const target = event.target as Node;\n      if (!this.popoverRef.nativeElement.contains(target) &&\n          !this.childRef.nativeElement.contains(target)) {\n        this.closePopover();\n        this.outsideClick.emit();\n      }\n    }\n  }\n\n  @HostListener('window:resize')\n  handleWindowResize(): void {\n    if (this.isOpen) {\n      if (this.resizeTimeout) clearTimeout(this.resizeTimeout);\n      this.resizeTimeout = window.setTimeout(() => {\n        requestAnimationFrame(() => this.getPopoverPositionStyle());\n      }, 0);\n    }\n  }\n\n  @HostListener('window:scroll')\n  handleWindowScroll(): void {\n    if (this.isOpen) requestAnimationFrame(() => this.getPopoverPositionStyle());\n  }\n\n  @HostListener('keydown.escape')\n  handleEscapeKey(): void {\n    if (this.isOpen) this.closePopover();\n  }\n\n  getAvailablePlacement(rect: DOMRect, height: number): Placement {\n    return getAvailablePlacement(rect, height, this.placement, this.useParentContainer, this.parentViewRef);\n  }\n\n  getPopoverPositionStyle(): void {\n    if (!this.popoverRef || !this.childRef) return;\n\n    const effectiveUseParent = this.useParentContainer || isDocsMode();\n    const popoverEl = this.popoverRef.nativeElement;\n    popoverEl.style.visibility = 'hidden';\n    popoverEl.style.display = 'block';\n    const height = popoverEl.scrollHeight || popoverEl.offsetHeight;\n    const width = popoverEl.scrollWidth || popoverEl.offsetWidth;\n    const rect = this.childRef.nativeElement.getBoundingClientRect();\n    popoverEl.style.visibility = '';\n    popoverEl.style.display = '';\n\n    if (effectiveUseParent) {\n      this.parentViewRef = this.parentViewRef || getTopMostCometChatElement(popoverEl);\n      this.calculatePopoverPosition();\n      return;\n    }\n\n    // When constrainHorizontal or constrainVertical is set without useParentContainer,\n    // find the parent container for constraint purposes but use viewport for placement.\n    if (this.constrainHorizontal || this.constrainVertical) {\n      this.parentViewRef = this.parentViewRef || getTopMostCometChatElement(popoverEl);\n      if (this.parentViewRef) {\n        const parentRect = this.parentViewRef.getBoundingClientRect();\n        // Use viewport-based placement (not parent-based) so the menu opens above\n        // even when the trigger is at the bottom of the parent container.\n        const availablePlacement = getAvailablePlacement(rect, height, this.placement, false, undefined);\n        this.availablePlacement = availablePlacement;\n        this.positionStyle = calculateParentPosition(\n          rect, height, width, parentRect, availablePlacement, false, null, this.showTooltip,\n          this.constrainHorizontal, this.constrainVertical\n        );\n        this.isPositioned = true;\n        this.cdr.detectChanges();\n        return;\n      }\n    }\n\n    const availablePlacement = this.getAvailablePlacement(rect, height);\n    this.availablePlacement = availablePlacement;\n    this.positionStyle = calculateViewportPosition(rect, height, width, availablePlacement);\n    this.isPositioned = true;\n    this.cdr.detectChanges();\n  }\n\n  calculatePopoverPosition(): void {\n    if (!this.popoverRef || !this.childRef || !this.parentViewRef) return;\n\n    const popoverEl = this.popoverRef.nativeElement;\n    popoverEl.style.visibility = 'hidden';\n    popoverEl.style.display = 'block';\n    const height = popoverEl.scrollHeight || popoverEl.offsetHeight;\n    const width = popoverEl.scrollWidth || popoverEl.offsetWidth;\n    const rect = this.childRef.nativeElement.getBoundingClientRect();\n    const parentRect = this.parentViewRef.getBoundingClientRect();\n    popoverEl.style.visibility = '';\n    popoverEl.style.display = '';\n\n    if (!this.useParentHeight) {\n      this.setPopoverHeight();\n      return;\n    }\n\n    const availablePlacement = this.getAvailablePlacement(rect, height);\n    this.availablePlacement = availablePlacement;\n\n    const inDocsMode = isDocsMode();\n    const hostEl = inDocsMode\n      ? (popoverEl.closest('.cometchat-popover') as HTMLElement)\n      : null;\n    const hostRect = hostEl ? hostEl.getBoundingClientRect() : null;\n\n    this.positionStyle = calculateParentPosition(\n      rect, height, width, parentRect, availablePlacement, inDocsMode, hostRect, this.showTooltip,\n      this.constrainHorizontal, this.constrainVertical\n    );\n    this.isPositioned = true;\n    this.cdr.detectChanges();\n  }\n\n  setPopoverHeight(): void {\n    if (!this.popoverRef || !this.childRef) return;\n    const popoverWidth = this.popoverRef.nativeElement.scrollWidth;\n    const rect = this.childRef.nativeElement.getBoundingClientRect();\n    const parentRect = this.parentViewRef?.getBoundingClientRect() || {\n      left: 0, right: window.innerWidth, width: window.innerWidth,\n    };\n    const height = this.popoverRef.nativeElement.scrollHeight;\n    this.positionStyle = calculateNoParentHeightPosition(rect, popoverWidth, height, parentRect, this.placement);\n    this.isPositioned = true;\n    this.cdr.detectChanges();\n  }\n\n  getTopMostCometChatElement(): HTMLElement | undefined {\n    if (!this.popoverRef) return undefined;\n    return getTopMostCometChatElement(this.popoverRef.nativeElement);\n  }\n\n  getPopoverContentStyle(): Record<string, string> {\n    const baseStyle = { ...this.positionStyle, ...this.contentStyle };\n    if (this.disableBackgroundInteraction && this.isOpen) {\n      baseStyle['zIndex'] = '1000';\n      baseStyle['pointerEvents'] = 'auto';\n    }\n    return baseStyle;\n  }\n\n  private saveFocus(): void {\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n  }\n\n  private restoreFocus(): void {\n    if (this.previouslyFocusedElement && typeof this.previouslyFocusedElement.focus === 'function') {\n      setTimeout(() => this.previouslyFocusedElement?.focus(), 0);\n    }\n  }\n\n  private setupFocusTrap(): void {\n    if (!this.trapFocus || !this.popoverRef) return;\n    this.focusableElements = getFocusableElements(this.popoverRef.nativeElement);\n    this.keydownListener = this.handleKeydownForFocusTrap.bind(this);\n    document.addEventListener('keydown', this.keydownListener);\n  }\n\n  private cleanupFocusTrap(): void {\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n      this.keydownListener = null;\n    }\n    this.focusableElements = [];\n  }\n\n  private handleKeydownForFocusTrap(event: KeyboardEvent): void {\n    if (!this.trapFocus || !this.isOpen || this.focusableElements.length === 0) return;\n\n    if (['ArrowUp', 'ArrowDown', 'ArrowLeft', 'ArrowRight'].includes(event.key)) {\n      event.stopPropagation();\n    }\n\n    if (event.key === 'Tab') {\n      const first = this.focusableElements[0];\n      const last = this.focusableElements[this.focusableElements.length - 1];\n      const active = document.activeElement as HTMLElement;\n      if (event.shiftKey && active === first) { event.preventDefault(); last.focus(); }\n      else if (!event.shiftKey && active === last) { event.preventDefault(); first.focus(); }\n    }\n  }\n\n  private focusFirstElement(): void {\n    if (!this.trapFocus || !this.popoverRef) return;\n    setTimeout(() => {\n      if (this.focusableElements.length > 0) this.focusableElements[0].focus();\n      else this.popoverRef.nativeElement.focus();\n    }, 0);\n  }\n}\n","<div class=\"cometchat\">\n  <div class=\"cometchat-popover\">\n    <!-- Background overlay when disableBackgroundInteraction is true -->\n    <div\n      *ngIf=\"disableBackgroundInteraction && isOpen\"\n      class=\"cometchat-popover__overlay\"\n      (click)=\"closePopover()\"\n      (wheel)=\"$event.stopPropagation()\"\n      (mousemove)=\"$event.stopPropagation()\"\n      (keydown)=\"$event.stopPropagation()\"\n      role=\"presentation\"\n      aria-hidden=\"true\">\n    </div>\n\n    <!-- Trigger element (projected content) -->\n    <div\n      #childRef\n      class=\"cometchat-popover__button\"\n      [ngStyle]=\"disableBackgroundInteraction && isOpen ? {\n        position: 'relative',\n        zIndex: '1000',\n        pointerEvents: 'auto'\n      } : {}\"\n      (click)=\"onChildClick($event)\"\n      (keydown.enter)=\"onChildKeydown($event)\"\n      (keydown.space)=\"onChildKeydown($event)\"\n      (mouseenter)=\"onPopoverMouseEnter()\"\n      (mouseleave)=\"onPopoverMouseLeave()\"\n      [attr.aria-expanded]=\"isOpen\"\n      [attr.aria-haspopup]=\"showTooltip ? 'false' : 'dialog'\"\n      [attr.aria-controls]=\"isOpen ? popoverId : null\">\n      <ng-content></ng-content>\n    </div>\n\n    <!-- Popover content -->\n    <div\n      *ngIf=\"isOpen\"\n      #popoverRef\n      class=\"cometchat-popover__content\"\n      [ngClass]=\"{\n        'cometchat-popover__content--top': availablePlacement === Placement.top,\n        'cometchat-popover__content--bottom': availablePlacement === Placement.bottom,\n        'cometchat-popover__content--left': availablePlacement === Placement.left,\n        'cometchat-popover__content--right': availablePlacement === Placement.right,\n        'cometchat-popover__content--positioned': isPositioned\n      }\"\n      [ngStyle]=\"getPopoverContentStyle()\"\n      [attr.id]=\"popoverId\"\n      [attr.role]=\"showTooltip ? 'tooltip' : 'dialog'\"\n      [attr.aria-modal]=\"!showTooltip && trapFocus ? 'true' : null\"\n      [attr.aria-label]=\"ariaLabel\"\n      [attr.aria-labelledby]=\"ariaLabelledBy\"\n      [attr.aria-describedby]=\"ariaDescribedBy\"\n      [attr.tabindex]=\"trapFocus && focusableElements.length === 0 ? '0' : null\">\n      \n      <!-- Tooltip arrow for top placement -->\n      <div\n        *ngIf=\"showTooltip && availablePlacement === Placement.top\"\n        class=\"cometchat-popover__content-tooltip-top\"\n        aria-hidden=\"true\">\n      </div>\n\n      <!-- Popover content template -->\n      <ng-container *ngTemplateOutlet=\"content\"></ng-container>\n\n      <!-- Tooltip arrow for bottom placement -->\n      <div\n        *ngIf=\"showTooltip && availablePlacement === Placement.bottom\"\n        class=\"cometchat-popover__content-tooltip-bottom\"\n        aria-hidden=\"true\">\n      </div>\n    </div>\n  </div>\n</div>\n","/**\n * Types for CometChatMessagePreview component.\n */\n\n/** Preview mode type for message preview context */\nexport type MessagePreviewMode = 'reply' | 'edit';\n\n/**\n * Core message type constants for type checking.\n * Extension types (sticker/poll/whiteboard/document) live in\n * `CometChatUIKitConstants.ExtensionTypes` — use those instead of duplicating here.\n */\nexport const MESSAGE_TYPES = {\n  TEXT: 'text',\n  IMAGE: 'image',\n  VIDEO: 'video',\n  AUDIO: 'audio',\n  FILE: 'file',\n} as const;\n","/**\n * Inline-only markdown → HTML, for single-line surfaces (reply/edit previews, quoted messages).\n *\n * Deliberately NOT the block-level converter in `services/rich-text-editor.markdown-utils`: that one\n * emits <p>/<ul>/<blockquote>, which a one-line preview can't lay out.\n *\n * The input MUST already be HTML-escaped — this function emits tags, so anything it is handed is\n * trusted to contain no user-authored markup. Sanitize the result before binding it to innerHTML.\n */\nexport function convertInlineMarkdownToHtml(text: string): string {\n  if (!text) return '';\n  let result = text;\n  result = result.replace(/`([^`]+)`/g, '<code>$1</code>');\n  result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n  result = result.replace(/(?<!\\*)\\*(?!\\*)([^*]+)\\*(?!\\*)/g, '<strong>$1</strong>');\n  result = result.replace(/__([^_]+)__/g, '<u>$1</u>');\n  result = result.replace(/(?<!_)_(?!_)([^_]+)_(?!_)/g, '<em>$1</em>');\n  result = result.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n  result = result.replace(\n    /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g,\n    '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n  );\n  return result;\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ElementRef,\n  ViewChild,\n  AfterViewInit,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  HostListener,\n  inject,\n  computed,\n  signal, ChangeDetectionStrategy, ChangeDetectorRef} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatTextFormatter } from '../../../formatters/cometchat-text-formatter';\nimport { CometChatMentionsFormatter } from '../../../formatters/cometchat-mentions-formatter';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../../services/global-config.service';\nimport { HtmlSanitizerService } from '../../../services/html-sanitizer.service';\nimport { FormatterConfigService } from '../../../services/formatter-config.service';\nimport { MessagePreviewMode, MESSAGE_TYPES } from './cometchat-message-preview.types';\nimport { CometChatUIKitConstants } from '../../../constants';\nimport { CometChatUIKit } from '../../../cometchat-uikit';\nimport { getMediaPreview, isMediaPreviewType } from '../../../utils/message-preview-utils';\nimport { convertInlineMarkdownToHtml } from '../../../utils/inline-markdown';\nimport { stripRichTextFormatting } from '../../../utils/util';\n\nexport type { MessagePreviewMode };\n\n/**\n * CometChatMessagePreview is a component that displays a preview of a message\n * that is being replied to or edited. It shows a title, subtitle, and optional\n * close button. When the message is deleted, it displays a deleted message UI.\n *\n * ## Features\n * - Displays sender name (Requirement 7.2)\n * - Truncates long message content with ellipsis (Requirements 7.1, 7.3)\n * - Shows appropriate icons for media messages (Requirement 7.4)\n * - Shows \"Message deleted\" for deleted quoted messages (Requirement 7.8)\n *\n * ## Accessibility Features (Requirement 15.1-15.6)\n * - role=\"status\" with aria-live=\"polite\" for screen reader announcements\n * - aria-label describing context (replying to/editing)\n * - Keyboard accessible close button (Enter/Space/Escape keys)\n * - Proper ARIA attributes for screen readers\n * - Visible focus indicators meeting WCAG contrast requirements\n * - Support for nested interactive elements in templates\n *\n * @example\n * ```html\n * <cometchat-message-preview\n *   [previewTitle]=\"titleTemplate\"\n *   [previewSubtitle]=\"subtitleTemplate\"\n *   [message]=\"replyMessage\"\n *   [mode]=\"'reply'\"\n *   (closeClick)=\"onClosePreview()\">\n * </cometchat-message-preview>\n * ```\n */\n@Component({\n  selector: 'cometchat-message-preview',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-message-preview.component.html',\n  styleUrls: ['./cometchat-message-preview.component.css'],\n})\nexport class CometChatMessagePreviewComponent implements OnInit, OnChanges, AfterViewInit, OnDestroy {\n  // ============================================\n  // Injected Services (GlobalConfig)\n  // ============================================\n\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, {\n    optional: true,\n  });\n  private readonly htmlSanitizer = inject(HtmlSanitizerService);\n  private readonly formatterConfig = inject(FormatterConfigService);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  // ============================================\n  // Cached formatted preview (recomputed in ngOnChanges)\n  // ============================================\n  _cachedPreviewHasHtml = false;\n  _cachedFormattedPreview = '';\n\n  private htmlSanitizerService = inject(HtmlSanitizerService);\n\n  // ============================================\n  // ExplicitlySet Flags & Backing Fields (GlobalConfig Priority System)\n  // ============================================\n\n  private textFormattersExplicitlySet = signal(false);\n  private _textFormatters = signal<CometChatTextFormatter[]>([]);\n\n  // ============================================\n  // Inputs\n  // ============================================\n\n  /** Title to display in preview - accepts template */\n  @Input() previewTitle: TemplateRef<any> | null = null;\n\n  /** Subtitle to display in preview - accepts template */\n  @Input() previewSubtitle: TemplateRef<any> | null = null;\n\n  /** Hide the close button */\n  @Input() hideCloseButton = false;\n\n  /** Message object being replied to or edited */\n  @Input() message?: CometChat.BaseMessage | null; // CometChat.BaseMessage type\n\n  /** Moderation status of the message */\n  @Input() isMessageModerated = false;\n\n  /**\n   * Text formatters for message bubble.\n   * Follows 3-tier priority: @Input > GlobalConfig > default ([])\n   */\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) {\n    this._textFormatters.set(value);\n    this.textFormattersExplicitlySet.set(true);\n  }\n  get textFormatters(): CometChatTextFormatter[] {\n    return this._textFormatters();\n  }\n\n  /** Custom ARIA label for the preview container (for screen readers) */\n  @Input() ariaLabel?: string;\n\n  /**\n   * Preview mode: 'reply' or 'edit'\n   * Used to determine appropriate ARIA labels for accessibility\n   * @see Requirement 15.5, 15.6\n   */\n  @Input() mode: MessagePreviewMode = 'reply';\n\n  // ============================================\n  // Effective Values (GlobalConfig Priority System)\n  // ============================================\n\n  /**\n   * Resolved textFormatters value using 3-tier priority:\n   * 1. Explicitly set @Input value\n   * 2. GlobalConfig value (if defined)\n   * 3. Component default ([])\n   */\n  effectiveTextFormatters = computed(() => {\n    if (this.textFormattersExplicitlySet()) return this._textFormatters();\n    if (this.globalConfig?.textFormatters !== undefined) return this.globalConfig.textFormatters;\n    return [];\n  });\n\n  /** Emitted when close button is clicked */\n  @Output() closeClick = new EventEmitter<void>();\n\n  @ViewChild('elementRef') elementRef!: ElementRef<HTMLDivElement>;\n\n  /** Internal width state for bubble view mode */\n  width = 0;\n  /** Cached logged-in user for \"You\" detection in senderName */\n  private loggedInUser: CometChat.User | null = null;\n\n  private resizeObserver: ResizeObserver | null = null;\n\n  /**\n   * Returns true if the message has been deleted\n   * @see Requirement 7.8\n   */\n  get isDeleted(): boolean {\n    return !!this.message?.getDeletedAt?.();\n  }\n\n  /**\n   * Returns the localized \"message deleted\" text\n   * @see Requirement 7.8\n   */\n  get deletedMessageText(): string {\n    return CometChatLocalize.getLocalizedString('message_deleted');\n  }\n\n  /**\n   * Returns the localized close button aria-label based on mode\n   * @see Requirement 15.6: aria-label=\"Cancel reply\" or \"Cancel edit\"\n   */\n  get closeButtonLabel(): string {\n    if (this.mode === 'edit') {\n      return CometChatLocalize.getLocalizedString('accessibility_cancel_edit');\n    }\n    return CometChatLocalize.getLocalizedString('accessibility_cancel_reply');\n  }\n\n  /**\n   * Returns the default aria-label for the preview container based on mode\n   * @see Requirement 15.5: aria-label describing context (replying to/editing)\n   */\n  get defaultAriaLabel(): string {\n    const preview = this.messageContentPreview || '';\n\n    if (this.mode === 'edit') {\n      const template = CometChatLocalize.getLocalizedString('accessibility_editing_message');\n      return template.replace('{preview}', preview);\n    }\n\n    // Reply mode\n    const template = CometChatLocalize.getLocalizedString('accessibility_replying_to');\n    return template.replace('{sender}', this.senderName).replace('{preview}', preview);\n  }\n\n  /**\n   * Returns the sender name from the message object.\n   * Used when previewTitle template is not provided.\n   * @see Requirement 7.2\n   */\n  get senderName(): string {\n    if (!this.message) {\n      return '';\n    }\n    const sender = this.message.getSender?.();\n    if (!sender) return CometChatLocalize.getLocalizedString('unknown');\n    // ENG-35080: Show \"You\" when the sender is the logged-in user\n    const loggedInUser = this.loggedInUser || CometChatUIKit.getLoggedInUser();\n    if (loggedInUser && sender.getUid() === loggedInUser.getUid()) {\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_you_message');\n    }\n    return sender.getName?.() || CometChatLocalize.getLocalizedString('unknown');\n  }\n\n  /**\n   * Returns whether to show the default title (sender name).\n   * Shows when no previewTitle template is provided and message exists.\n   * @see Requirement 7.2\n   */\n  get shouldShowDefaultTitle(): boolean {\n    return !this.previewTitle && !!this.message;\n  }\n\n  /**\n   * Returns whether to show the default subtitle (message content).\n   * Shows when no previewSubtitle template is provided and message exists.\n   * @see Requirements 7.1, 7.3\n   */\n  get shouldShowDefaultSubtitle(): boolean {\n    return !this.previewSubtitle && !!this.message;\n  }\n\n  /**\n   * Returns the message content preview text.\n   * For text messages, returns the text content (truncated via CSS).\n   * For media messages, returns localized type description.\n   * @see Requirements 7.1, 7.3\n   */\n  get messageContentPreview(): string {\n    if (!this.message) {\n      return '';\n    }\n\n    const messageType = this.message.getType?.();\n\n    // Media: \"Image\", \"3 Images\", or \"3 Images · caption\". A bare \"Image\" throws away the caption,\n    // which is the only text distinguishing one quoted photo from another.\n    if (isMediaPreviewType(messageType)) {\n      return getMediaPreview(this.message, 'conversation');\n    }\n\n    switch (messageType) {\n      case MESSAGE_TYPES.TEXT:\n        // Return text content - CSS handles truncation with ellipsis\n        return (this.message as CometChat.TextMessage).getText?.() || '';\n      case MESSAGE_TYPES.IMAGE:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_image');\n      case MESSAGE_TYPES.VIDEO:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_video');\n      case MESSAGE_TYPES.AUDIO:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_audio');\n      case MESSAGE_TYPES.FILE:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_file');\n      // ENG-35080: Handle sticker, poll and collaborative custom message types\n      case CometChatUIKitConstants.ExtensionTypes.sticker:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_sticker');\n      case CometChatUIKitConstants.ExtensionTypes.poll:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_poll');\n      case CometChatUIKitConstants.ExtensionTypes.document:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_document');\n      case CometChatUIKitConstants.ExtensionTypes.whiteboard:\n        return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_whiteboard');\n      default: {\n        // For unknown custom message types, show customData.text or the type name\n        const category = this.message.getCategory?.();\n        if (category === 'custom') {\n          try {\n            const customData = (this.message as CometChat.CustomMessage).getCustomData?.();\n            if (customData && typeof customData === 'object' && 'text' in customData) {\n              return String((customData as Record<string, unknown>)['text']) || messageType;\n            }\n          } catch { /* ignore */ }\n          return messageType;\n        }\n        return CometChatLocalize.getLocalizedString('message');\n      }\n    }\n  }\n\n  /**\n   * {@link messageContentPreview} with its markdown rendered, for binding to innerHTML.\n   *\n   * A caption (and a text body) is stored as markdown, so interpolating the raw string showed\n   * literal `**bold**` in the quoted-reply block while the bubble above it rendered the formatting.\n   * Escape first, convert inline markdown second, sanitize last — in that order the user's own\n   * angle brackets stay inert and only the tags this component emits survive.\n   */\n  get messageContentPreviewHtml(): string {\n    const text = this.messageContentPreview;\n    if (!text) { return ''; }\n    const escaped = this.htmlSanitizerService.escapeUserHtml(text);\n    return this.htmlSanitizerService.sanitize(convertInlineMarkdownToHtml(escaped));\n  }\n\n  /**\n   * Returns true when the message preview text should be rendered as HTML\n   * (contains markdown, rich text metadata, or SDK mention tags).\n   */\n  get messagePreviewHasHtml(): boolean {\n    if (!this.message || this.message.getType?.() !== MESSAGE_TYPES.TEXT) return false;\n    const textMessage = this.message as CometChat.TextMessage;\n    const rawText = textMessage.getText?.() || '';\n\n    if (!rawText) {\n      // Fallback: no text — check metadata\n      try {\n        const metadata = textMessage.getMetadata?.() as Record<string, unknown> | undefined;\n        const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n        if (richText?.html && richText?.hasFormatting) return true;\n      } catch { /* ignore */ }\n      return false;\n    }\n\n    // Plain URL or markdown link — render as plain text\n    if (/^https?:\\/\\//.test(rawText.trim()) || /\\[([^\\]]+)\\]\\([^)]+\\)/.test(rawText)) return false;\n\n    // Markdown syntax\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s|^&gt;\\s?|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText)) return true;\n\n    // SDK mention tags\n    const hasSdkMentions = /<@uid:[^>]+>/.test(rawText) || /<@all:[^>]+>/.test(rawText);\n    const formatters = this.getActiveFormatters();\n    const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter);\n    const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    return (hasSdkMentions && hasMentionsFormatter) || hasCustomFormatters;\n  }\n\n  /**\n   * Returns sanitized HTML for the preview when messagePreviewHasHtml is true.\n   * Applies the same formatter pipeline as CometChatConversationItem.\n   * Result is single-line (block elements collapsed to spaces).\n   */\n  get formattedMessagePreview(): string {\n    if (!this.message || this.message.getType?.() !== MESSAGE_TYPES.TEXT) return '';\n    const textMessage = this.message as CometChat.TextMessage;\n    const rawText = textMessage.getText?.() || '';\n    const mentionedUsers = textMessage.getMentionedUsers?.() ?? [];\n\n    if (!rawText) {\n      // Fallback: no text — try metadata as last resort\n      try {\n        const metadata = textMessage.getMetadata?.() as Record<string, unknown> | undefined;\n        const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n        if (richText?.html && richText?.hasFormatting) {\n          return this.sanitizePreviewHtml(richText.html);\n        }\n      } catch { /* ignore */ }\n      return '';\n    }\n\n    const formatters = this.getActiveFormatters();\n    const hasSdkMentions = /<@uid:[^>]+>/.test(rawText) || /<@all:[^>]+>/.test(rawText);\n\n    // 2. Markdown path\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s|^&gt;\\s?|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText)) {\n      const escaped = this.htmlSanitizer.escapeUserHtml(rawText);\n      let formattedText = escaped;\n      for (const formatter of formatters) {\n        try {\n          if (formatter instanceof CometChatMentionsFormatter) {\n            if (hasSdkMentions && formatter.shouldFormat(formattedText, this.message)) {\n              formattedText = (formatter as CometChatMentionsFormatter).formatSdkMentions(formattedText, mentionedUsers);\n            }\n          } else if (formatter.id !== 'tiptap-formatter') {\n            if (formatter.shouldFormat(formattedText, this.message)) {\n              formattedText = formatter.format(formattedText);\n            }\n          }\n        } catch { /* ignore */ }\n      }\n      return this.sanitizePreviewHtml(formattedText);\n    }\n\n    // 3. Plain text with mention formatting\n    const plainText = stripRichTextFormatting(rawText);\n    if (!formatters || formatters.length === 0) return plainText;\n    const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter);\n    const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    if (!hasSdkMentions && !hasCustomFormatters) return plainText;\n    if (!hasMentionsFormatter && !hasCustomFormatters) return plainText;\n    const escapedText = this.htmlSanitizer.escapeUserHtml(plainText);\n    let formattedText = escapedText;\n    for (const formatter of formatters) {\n      try {\n        if (formatter instanceof CometChatMentionsFormatter) {\n          if (hasSdkMentions && formatter.shouldFormat(formattedText, this.message)) {\n            formattedText = (formatter as CometChatMentionsFormatter).formatSdkMentions(formattedText, mentionedUsers);\n          }\n        } else if (formatter.id !== 'tiptap-formatter') {\n          if (formatter.shouldFormat(formattedText, this.message)) {\n            formattedText = formatter.format(formattedText);\n          }\n        }\n      } catch { /* ignore */ }\n    }\n    return this.sanitizePreviewHtml(formattedText);\n  }\n\n  /** Get active formatters — explicit input takes priority over global config defaults. */\n  private getActiveFormatters(): CometChatTextFormatter[] {\n    const explicit = this.effectiveTextFormatters();\n    if (explicit?.length > 0) return explicit;\n    return this.formatterConfig.getDefaultFormatters();\n  }\n\n  /**\n   * Sanitize HTML to safe inline tags, collapsing block elements to spaces\n   * so the preview stays on a single line with ellipsis truncation.\n   */\n  private sanitizePreviewHtml(html: string): string {\n    // Inject list markers before stripping list tags\n    let processed = html;\n    processed = processed.replace(/<ol[^>]*>([\\s\\S]*?)<\\/ol>/gi, (_m, inner) => {\n      let counter = 0;\n      return inner.replace(/<li[^>]*>/gi, () => { counter++; return `${counter}. `; });\n    });\n    processed = processed.replace(/<ul[^>]*>([\\s\\S]*?)<\\/ul>/gi, (_m, inner) => {\n      return inner.replace(/<li[^>]*>/gi, () => '• ');\n    });\n    processed = processed\n      .replace(/<\\/li>/gi, ' ')\n      .replace(/<\\/p>/gi, ' ')\n      .replace(/<\\/blockquote>/gi, ' ')\n      .replace(/<\\/h[1-6]>/gi, ' ');\n    const s = this.htmlSanitizer.sanitizeWithConfig(processed, {\n      ALLOWED_TAGS: ['span', 'strong', 'em', 'b', 'i', 'u', 's', 'code', 'a'],\n      ALLOWED_ATTR: ['class', 'data-uid', 'data-mention-type', 'data-hashtag', 'href', 'target', 'rel', 'style'],\n    });\n    return String(s).replace(/\\n/g, ' ').replace(/\\s{2,}/g, ' ').trim();\n  }\n\n  /**\n   * Returns the CSS class for the media type icon.\n   * Used to display appropriate icons for media messages.\n   * @see Requirement 7.4\n   */\n  get mediaIconClass(): string {\n    if (!this.message) {\n      return 'cometchat-message-preview__subtitle-icon-none';\n    }\n\n    const messageType = this.message.getType?.();\n\n    switch (messageType) {\n      case MESSAGE_TYPES.IMAGE:\n        return 'cometchat-message-preview__subtitle-icon-image';\n      case MESSAGE_TYPES.VIDEO:\n        return 'cometchat-message-preview__subtitle-icon-video';\n      case MESSAGE_TYPES.AUDIO:\n        return 'cometchat-message-preview__subtitle-icon-audio';\n      case MESSAGE_TYPES.FILE:\n        return 'cometchat-message-preview__subtitle-icon-file';\n      default:\n        return 'cometchat-message-preview__subtitle-icon-none';\n    }\n  }\n\n  /**\n   * Returns whether to show the media icon.\n   * Shows for image, video, audio, and file messages.\n   * @see Requirement 7.4\n   */\n  get shouldShowMediaIcon(): boolean {\n    if (!this.message) {\n      return false;\n    }\n\n    const messageType = this.message.getType?.();\n    return ([\n      MESSAGE_TYPES.IMAGE,\n      MESSAGE_TYPES.VIDEO,\n      MESSAGE_TYPES.AUDIO,\n      MESSAGE_TYPES.FILE,\n    ] as string[]).includes(messageType);\n  }\n\n  /**\n   * Returns the container style based on view mode and moderation status\n   */\n  get containerStyle(): Record<string, string> {\n    if (this.hideCloseButton) {\n      // In bubble mode, always stretch to full width of the reply view container.\n      // The previous approach measured the content view width and used it as maxWidth,\n      // but that caused the reply preview to be narrower than the bubble when the\n      // message text was short.\n      if (this.isMessageModerated && this.width < 240) {\n        return { width: 'calc(240px - var(--cometchat-padding-1) * 2)' };\n      }\n      return { width: '100%' };\n    }\n    return { maxWidth: '100%', width: '100%' };\n  }\n\n  /**\n   * Returns the CSS class for the container based on view mode\n   */\n  get containerClass(): string {\n    return this.hideCloseButton ? 'cometchat-message-preview--bubble' : 'cometchat-message-preview--composer';\n  }\n\n  ngOnInit(): void {\n    // Cache the logged-in user for \"You\" detection in senderName.\n    // Try the synchronous UIKit cache first; fall back to the async SDK call.\n    this.loggedInUser = CometChatUIKit.getLoggedInUser();\n    if (!this.loggedInUser) {\n      CometChat.getLoggedinUser().then(user => {\n        this.loggedInUser = user;\n      }).catch(() => {});\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    // Recompute formatted preview whenever message or textFormatters change.\n    // Caching is necessary with OnPush — getters alone may not trigger re-render.\n    if (changes['message'] || changes['textFormatters']) {\n      if (this.messagePreviewHasHtml) {\n        // Rich TEXT preview: mentions, markdown, lists, rich-text metadata.\n        this._cachedPreviewHasHtml = true;\n        this._cachedFormattedPreview = this.formattedMessagePreview;\n      } else if (isMediaPreviewType(this.message?.getType?.() ?? '')) {\n        // Media captions are stored as markdown; render their inline formatting\n        // so a quoted photo's \"**bold**\" caption isn't shown with literal asterisks.\n        const captionHtml = this.messageContentPreviewHtml;\n        this._cachedPreviewHasHtml = !!captionHtml;\n        this._cachedFormattedPreview = captionHtml;\n      } else {\n        this._cachedPreviewHasHtml = false;\n        this._cachedFormattedPreview = '';\n      }\n      this.cdr.markForCheck();\n    }\n  }\n\n  ngAfterViewInit(): void {\n    this.setupResizeObserver();\n  }\n\n  ngOnDestroy(): void {\n    this.cleanupResizeObserver();\n  }\n  private setupResizeObserver(): void {\n    if (!this.hideCloseButton || !this.elementRef?.nativeElement) {\n      return;\n    }\n\n    const parentNode = this.elementRef.nativeElement.closest(\n      '.cometchat-message-bubble__body-reply-view'\n    )?.parentNode;\n    if (!parentNode) return;\n\n    const contentNode = (parentNode as Element).querySelector(\n      '.cometchat-message-bubble__body-content-view'\n    ) as HTMLElement | null;\n    if (!contentNode) return;\n\n    this.cleanupResizeObserver();\n\n    this.resizeObserver = new ResizeObserver(entries => {\n      for (const entry of entries) {\n        const newWidth = entry.contentRect.width;\n        if (this.width !== newWidth) {\n          this.width = newWidth;\n        }\n      }\n    });\n\n    this.resizeObserver.observe(contentNode);\n    this.width = contentNode.offsetWidth;\n  }\n\n  /**\n   * Cleans up the ResizeObserver\n   */\n  private cleanupResizeObserver(): void {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n  }\n\n  /**\n   * Handles close button click\n   */\n  handleClose(): void {\n    this.closeClick.emit();\n  }\n\n  /**\n   * Handles keyboard events for close button accessibility.\n   * Activates close button on Enter, Space, or Escape key press.\n   * @see Requirement 15.2: Enter/Space on close button closes preview\n   * @see Requirement 15.3: Escape while preview is visible closes preview\n   */\n  onCloseKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ' || event.key === 'Escape') {\n      event.preventDefault(); // Prevent default space scrolling\n      this.handleClose();\n    }\n  }\n\n  /**\n   * Handles Escape key at component level to close preview\n   * @see Requirement 15.3: Escape while preview is visible closes preview\n   */\n  @HostListener('keydown.escape')\n  onEscapeKey(): void {\n    if (!this.hideCloseButton) {\n      this.handleClose();\n    }\n  }\n}\n","<div\n  #elementRef\n  class=\"cometchat-message-preview__wrapper\"\n  [ngClass]=\"containerClass\"\n  [ngStyle]=\"containerStyle\"\n  role=\"status\"\n  aria-live=\"polite\"\n  [attr.aria-label]=\"ariaLabel || defaultAriaLabel\">\n  <div class=\"cometchat-message-preview\">\n    <!-- Title: Custom template or default sender name -->\n    <!-- @see Requirement 7.2: Display sender name of quoted message -->\n    <div class=\"cometchat-message-preview__title\">\n      <ng-container *ngIf=\"previewTitle; else defaultTitle\">\n        <ng-container *ngTemplateOutlet=\"previewTitle\"></ng-container>\n      </ng-container>\n      <ng-template #defaultTitle>\n        <span *ngIf=\"shouldShowDefaultTitle\" class=\"cometchat-message-preview__title-text\">\n          {{ senderName }}\n        </span>\n      </ng-template>\n    </div>\n\n    <!-- Content: Either subtitle + close button OR deleted message UI -->\n    <!-- @see Requirement 7.8: Display \"Message deleted\" for deleted quoted messages -->\n    <ng-container *ngIf=\"!isDeleted; else deletedMessage\">\n      <!-- Subtitle: Custom template or default message content -->\n      <!-- @see Requirements 7.1, 7.3, 7.4: Display message content with truncation and media icons -->\n      <div class=\"cometchat-message-preview__subtitle\">\n        <ng-container *ngIf=\"previewSubtitle; else defaultSubtitle\">\n          <ng-container *ngTemplateOutlet=\"previewSubtitle\"></ng-container>\n        </ng-container>\n        <ng-template #defaultSubtitle>\n          <ng-container *ngIf=\"shouldShowDefaultSubtitle\">\n            <!-- Media icon for image, video, audio, file messages -->\n            <!-- @see Requirement 7.4: Display appropriate icons for media messages -->\n            <div \n              *ngIf=\"shouldShowMediaIcon\"\n              class=\"cometchat-message-preview__subtitle-icon\"\n              [ngClass]=\"mediaIconClass\"\n              aria-hidden=\"true\">\n            </div>\n            <!-- Message content text with ellipsis truncation -->\n            <!-- @see Requirements 7.1, 7.3: Display and truncate message content -->\n            @if (_cachedPreviewHasHtml) {\n              <span class=\"cometchat-message-preview__subtitle-text\" [innerHTML]=\"_cachedFormattedPreview\"></span>\n            } @else {\n              <span class=\"cometchat-message-preview__subtitle-text\">\n                {{ messageContentPreview }}\n              </span>\n            }\n          </ng-container>\n        </ng-template>\n      </div>\n      <!-- Close button -->\n      <div\n        *ngIf=\"!hideCloseButton\"\n        class=\"cometchat-message-preview__close\"\n        role=\"button\"\n        tabindex=\"0\"\n        [attr.aria-label]=\"closeButtonLabel\"\n        (click)=\"handleClose()\"\n        (keydown)=\"onCloseKeyDown($event)\">\n      </div>\n    </ng-container>\n\n    <!-- Deleted message template -->\n    <!-- @see Requirement 7.8: Display \"Message deleted\" for deleted quoted messages -->\n    <ng-template #deletedMessage>\n      <div class=\"cometchat-message-preview-deleted__message\">\n        <div class=\"cometchat-message-preview-deleted__message__icon\" aria-hidden=\"true\"></div>\n        <div class=\"cometchat-message-preview-deleted__message__text\">\n          {{ deletedMessageText }}\n        </div>\n      </div>\n    </ng-template>\n  </div>\n</div>\n","import { Injectable } from '@angular/core';\n\n/**\n * VoiceRecordingCoordinatorService\n *\n * Ensures at most ONE composer records a voice note at a time. Several composers can be on screen\n * together — the main message list and an open thread each render their own composer, their own\n * recorder and their own microphone stream — so without coordination both can record at once.\n *\n * The composer that starts recording claims the slot; whoever held it is asked to stop, which\n * unmounts their recorder and releases their mic.\n *\n * Why not reuse the existing `ccActivePopover` event: it carries only the popover *type*. A composer\n * receiving `'voiceRecording'` cannot tell whether it came from itself or from another composer, and\n * the guard that stops it closing itself (`contentToDisplay() !== id`) also stops it closing when a\n * second composer starts recording. Coordination needs instance identity, which this service adds\n * without changing that public event's payload.\n *\n * Mirrors TrayAudioCoordinatorService (at most one tray audio tile plays at a time).\n * Internal: not exported from `public-api.ts`.\n */\n@Injectable({ providedIn: 'root' })\nexport class VoiceRecordingCoordinatorService {\n  /** The composer currently holding the recording slot, or null when nobody is recording. */\n  private active: object | null = null;\n  /** How to stop {@link active}. Always cleared together with it. */\n  private stopActive: (() => void) | null = null;\n\n  /**\n   * Claim the recording slot for `owner`, stopping the previous holder first.\n   * Re-claiming while already the holder only refreshes the stop callback.\n   */\n  claim(owner: object, stop: () => void): void {\n    if (this.active && this.active !== owner) {\n      const stopPrevious = this.stopActive;\n      // Clear BEFORE stopping: stopping the previous owner flips its recording state, which calls\n      // release() straight back into this service. It must not observe a half-updated slot.\n      this.active = null;\n      this.stopActive = null;\n      stopPrevious?.();\n    }\n    this.active = owner;\n    this.stopActive = stop;\n  }\n\n  /** Release the slot, but only if `owner` still holds it — a stale release is a no-op. */\n  release(owner: object): void {\n    if (this.active === owner) {\n      this.active = null;\n      this.stopActive = null;\n    }\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  HostListener, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize';\n\nexport enum ToastType {\n  success = 'success',\n  error = 'error',\n  warning = 'warning',\n  info = 'info',\n}\n\n/**\n * CometChatToast Component\n *\n * A toast notification component for displaying temporary feedback messages.\n * Supports different types (success, error, warning, info) with auto-dismiss\n * and manual close functionality.\n *\n * Accessibility Features:\n * - ARIA live regions for screen reader announcements\n * - Keyboard accessible close button (Enter, Space, Escape)\n * - Proper ARIA roles based on toast type\n * - Focus indicators for keyboard navigation\n * - Does not trap focus (allows navigation to other elements)\n */\n@Component({\n  selector: 'cometchat-toast',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-toast.component.html',\n  styleUrls: ['./cometchat-toast.component.css'],\n})\nexport class CometChatToastComponent implements OnInit, OnDestroy {\n  /** Toast message text */\n  @Input() text = '';\n  /** Toast type for styling and icon */\n  @Input() type: ToastType = ToastType.info;\n  /** Duration in milliseconds before auto-dismiss (default: 3000ms, 0 = no auto-dismiss) */\n  @Input() duration = 3000;\n  /** Show close button */\n  @Input() showCloseButton = true;\n  /** Enable Escape key to dismiss toast (default: true) */\n  @Input() dismissOnEscape = true;\n  /** When true, toast uses static positioning (for service-managed container layout) */\n  @Input() inline = false;\n\n  /** Emitted when toast is closed (auto or manual) */\n  @Output() toastClosed = new EventEmitter<void>();\n\n  // Internal state\n  isVisible = true;\n  private autoCloseTimeout?: number;\n\n  ngOnInit(): void {\n    if (this.duration > 0) {\n      this.autoCloseTimeout = window.setTimeout(() => {\n        this.close();\n      }, this.duration);\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.autoCloseTimeout) {\n      clearTimeout(this.autoCloseTimeout);\n    }\n  }\n\n  close(): void {\n    this.isVisible = false;\n    this.toastClosed.emit();\n  }\n\n  onCloseClick(): void {\n    if (this.autoCloseTimeout) {\n      clearTimeout(this.autoCloseTimeout);\n    }\n    this.close();\n  }\n\n  get iconClass(): string {\n    return `cometchat-toast__icon--${this.type}`;\n  }\n\n  get toastClass(): string {\n    const classes = `cometchat-toast--${this.type}`;\n    return this.inline ? `${classes} cometchat-toast--inline` : classes;\n  }\n\n  get iconSvg(): string {\n    switch (this.type) {\n      case ToastType.success:\n        return 'check_circle';\n      case ToastType.error:\n        return 'error';\n      case ToastType.warning:\n        return 'warning';\n      case ToastType.info:\n      default:\n        return 'info_icon';\n    }\n  }\n\n  /**\n   * Get ARIA role based on toast type\n   * - 'alert' for error and warning (interrupting)\n   * - 'status' for success and info (non-interrupting)\n   */\n  get ariaRole(): string {\n    return this.type === ToastType.error || this.type === ToastType.warning ? 'alert' : 'status';\n  }\n\n  /**\n   * Get aria-live value based on toast type\n   * - 'assertive' for error and warning (immediate announcement)\n   * - 'polite' for success and info (wait for pause)\n   */\n  get ariaLive(): 'assertive' | 'polite' {\n    return this.type === ToastType.error || this.type === ToastType.warning\n      ? 'assertive'\n      : 'polite';\n  }\n\n  /**\n   * Handle keyboard events on close button\n   * Supports Enter and Space keys for accessibility\n   */\n  onCloseKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onCloseClick();\n    }\n  }\n\n  /**\n   * Handle global keyboard events\n   * Supports Escape key to dismiss toast\n   */\n  @HostListener('document:keydown.escape', ['$event'])\n  onEscapeKey(event: Event): void {\n    if (this.dismissOnEscape && this.isVisible) {\n      event.preventDefault();\n      this.onCloseClick();\n    }\n  }\n}\n","@if (isVisible && text) {\n  <div class=\"cometchat\">\n    <div \n      class=\"cometchat-toast\" \n      [ngClass]=\"toastClass\" \n      [attr.role]=\"ariaRole\" \n      [attr.aria-live]=\"ariaLive\" \n      [attr.aria-label]=\"text\"\n    >\n      <div class=\"cometchat-toast__content\">\n        <span class=\"cometchat-toast__icon\" [ngClass]=\"iconClass\" aria-hidden=\"true\">\n          <span class=\"cometchat-toast__icon-mask\" [ngClass]=\"'cometchat-toast__icon-mask--' + type\"></span>\n        </span>\n        <span class=\"cometchat-toast__text\">{{ text }}</span>\n      </div>\n      @if (showCloseButton) {\n        <button \n          class=\"cometchat-toast__close\"\n          (click)=\"onCloseClick()\"\n          (keydown)=\"onCloseKeyDown($event)\"\n          type=\"button\"\n          [attr.aria-label]=\"'toast_close_aria_label' | translate\"\n          tabindex=\"0\"\n        >\n          <span class=\"cometchat-toast__close-icon\" aria-hidden=\"true\"></span>\n        </button>\n      }\n    </div>\n  </div>\n}\n","import {\n  Injectable,\n  ApplicationRef,\n  ComponentRef,\n  createComponent,\n  EnvironmentInjector,\n  OnDestroy,\n  EmbeddedViewRef,\n} from '@angular/core';\nimport { CometChatToastComponent, ToastType } from './cometchat-toast.component';\n\n/**\n * Configuration options for creating a toast\n */\nexport interface ToastConfig {\n  /** Toast message text */\n  text: string;\n  /** Toast type for styling and icon */\n  type?: ToastType;\n  /** Duration in milliseconds before auto-dismiss (default: 3000ms, 0 = no auto-dismiss) */\n  duration?: number;\n  /** Show close button */\n  showCloseButton?: boolean;\n}\n\n/**\n * Internal toast reference for tracking active toasts\n */\ninterface ToastRef {\n  componentRef: ComponentRef<CometChatToastComponent>;\n  id: number;\n}\n\n/**\n * CometChatToast Service\n *\n * A service for programmatically creating and managing toast notifications.\n * Supports toast stacking and provides convenience methods for different toast types.\n *\n * @example\n * ```typescript\n * constructor(private toastService: CometChatToastService) {}\n *\n * showSuccess() {\n *   this.toastService.success('Operation completed successfully!');\n * }\n *\n * showError() {\n *   this.toastService.error('An error occurred', { duration: 5000 });\n * }\n * ```\n */\n@Injectable({\n  providedIn: 'root',\n})\nexport class CometChatToastService implements OnDestroy {\n  private toasts: ToastRef[] = [];\n  private nextId = 0;\n  private containerElement?: HTMLElement;\n  private readonly TOAST_SPACING = 10; // Spacing between stacked toasts in pixels\n\n  constructor(\n    private appRef: ApplicationRef,\n    private injector: EnvironmentInjector\n  ) {\n    this.initializeContainer();\n  }\n\n  /**\n   * Initialize the toast container element\n   */\n  private initializeContainer(): void {\n    if (typeof document === 'undefined') return;\n\n    this.containerElement = document.createElement('div');\n    this.containerElement.className = 'cometchat-toast-container';\n    this.containerElement.style.position = 'fixed';\n    this.containerElement.style.bottom = '80px';\n    this.containerElement.style.left = '50%';\n    this.containerElement.style.transform = 'translateX(-50%)';\n    this.containerElement.style.zIndex = '9999';\n    this.containerElement.style.display = 'flex';\n    this.containerElement.style.flexDirection = 'column';\n    this.containerElement.style.alignItems = 'center';\n    this.containerElement.style.gap = `${this.TOAST_SPACING}px`;\n    this.containerElement.style.pointerEvents = 'none';\n\n    document.body.appendChild(this.containerElement);\n  }\n\n  /**\n   * Show a toast notification with custom configuration\n   *\n   * @param config - Toast configuration options\n   * @returns The ID of the created toast\n   */\n  show(config: ToastConfig): number {\n    if (!this.containerElement) {\n      this.initializeContainer();\n    }\n\n    const toastId = this.nextId++;\n\n    // Create the component\n    const componentRef = createComponent(CometChatToastComponent, {\n      environmentInjector: this.injector,\n    });\n\n    // Set inputs\n    componentRef.instance.text = config.text;\n    componentRef.instance.type = config.type || ToastType.info;\n    componentRef.instance.duration = config.duration !== undefined ? config.duration : 3000;\n    componentRef.instance.showCloseButton =\n      config.showCloseButton !== undefined ? config.showCloseButton : true;\n    componentRef.instance.inline = true;\n\n    // Subscribe to close event — store subscription for cleanup\n    const closeSub = componentRef.instance.toastClosed.subscribe(() => {\n      this.remove(toastId);\n      closeSub.unsubscribe();\n    });\n\n    // Attach to application\n    this.appRef.attachView(componentRef.hostView);\n\n    // Get the DOM element\n    const domElement = (componentRef.hostView as EmbeddedViewRef<unknown>).rootNodes[0] as HTMLElement;\n    domElement.style.pointerEvents = 'auto';\n\n    // Add to container\n    this.containerElement?.appendChild(domElement);\n\n    // Track the toast\n    this.toasts.push({ componentRef, id: toastId });\n\n    // Trigger change detection\n    componentRef.changeDetectorRef.detectChanges();\n\n    return toastId;\n  }\n\n  /**\n   * Remove a toast by ID\n   *\n   * @param id - The ID of the toast to remove\n   */\n  remove(id: number): void {\n    const index = this.toasts.findIndex(t => t.id === id);\n    if (index === -1) return;\n\n    const toastRef = this.toasts[index];\n\n    // Detach from application\n    this.appRef.detachView(toastRef.componentRef.hostView);\n\n    // Destroy the component\n    toastRef.componentRef.destroy();\n\n    // Remove from tracking\n    this.toasts.splice(index, 1);\n  }\n\n  /**\n   * Remove all active toasts\n   */\n  clear(): void {\n    this.toasts.forEach(toastRef => {\n      this.appRef.detachView(toastRef.componentRef.hostView);\n      toastRef.componentRef.destroy();\n    });\n    this.toasts = [];\n  }\n\n  /**\n   * Show a success toast\n   *\n   * @param text - The message text\n   * @param options - Optional configuration (duration, showCloseButton)\n   * @returns The ID of the created toast\n   */\n  success(text: string, options?: Partial<Omit<ToastConfig, 'text' | 'type'>>): number {\n    return this.show({\n      text,\n      type: ToastType.success,\n      ...options,\n    });\n  }\n\n  /**\n   * Show an error toast\n   *\n   * @param text - The message text\n   * @param options - Optional configuration (duration, showCloseButton)\n   * @returns The ID of the created toast\n   */\n  error(text: string, options?: Partial<Omit<ToastConfig, 'text' | 'type'>>): number {\n    return this.show({\n      text,\n      type: ToastType.error,\n      ...options,\n    });\n  }\n\n  /**\n   * Show a warning toast\n   *\n   * @param text - The message text\n   * @param options - Optional configuration (duration, showCloseButton)\n   * @returns The ID of the created toast\n   */\n  warning(text: string, options?: Partial<Omit<ToastConfig, 'text' | 'type'>>): number {\n    return this.show({\n      text,\n      type: ToastType.warning,\n      ...options,\n    });\n  }\n\n  /**\n   * Show an info toast\n   *\n   * @param text - The message text\n   * @param options - Optional configuration (duration, showCloseButton)\n   * @returns The ID of the created toast\n   */\n  info(text: string, options?: Partial<Omit<ToastConfig, 'text' | 'type'>>): number {\n    return this.show({\n      text,\n      type: ToastType.info,\n      ...options,\n    });\n  }\n\n  /**\n   * Get the count of active toasts\n   *\n   * @returns The number of active toasts\n   */\n  getActiveCount(): number {\n    return this.toasts.length;\n  }\n\n  /**\n   * Clean up on service destruction\n   */\n  ngOnDestroy(): void {\n    this.clear();\n    if (this.containerElement && this.containerElement.parentNode) {\n      this.containerElement.parentNode.removeChild(this.containerElement);\n    }\n  }\n}\n","/**\n * File handling utilities for CometChatMessageComposer component.\n *\n * Extracted from cometchat-message-composer.component.ts to isolate\n * file type detection, size validation, and attachment management logic.\n */\n\nimport { AttachmentFile } from './cometchat-message-composer.types';\n\n// ==================== File Type Detection ====================\n\n/**\n * Determines the attachment type from a File object's MIME type.\n */\nexport function getFileType(file: File): 'image' | 'video' | 'audio' | 'file' {\n  const mime = file.type.toLowerCase();\n  if (mime.startsWith('image/')) return 'image';\n  if (mime.startsWith('video/')) return 'video';\n  if (mime.startsWith('audio/')) return 'audio';\n  return 'file';\n}\n\n/**\n * Returns a human-readable label for a MIME type.\n * Used in error messages (e.g., \"photo\", \"video\", \"audio\", \"file\").\n */\nexport function getFileTypeLabel(mimeType: string): string {\n  const lower = mimeType.toLowerCase();\n  if (lower.startsWith('image/')) return 'photo';\n  if (lower.startsWith('video/')) return 'video';\n  if (lower.startsWith('audio/')) return 'audio';\n  return 'file';\n}\n\n/**\n * Returns the plural form of a file type label.\n * Used in error messages (e.g., \"photos\", \"videos\").\n */\nexport function getPluralFileType(fileType: string): string {\n  switch (fileType) {\n    case 'photo': return 'photos';\n    case 'video': return 'videos';\n    case 'audio': return 'audio files';\n    default: return 'files';\n  }\n}\n\n// ==================== File Size Validation ====================\n\n/**\n * Maximum file sizes in bytes per type.\n * These match the CometChat SDK limits.\n */\nexport const FILE_SIZE_LIMITS: Record<'image' | 'video' | 'audio' | 'file', number> = {\n  image: 10 * 1024 * 1024,  // 10 MB\n  video: 50 * 1024 * 1024,  // 50 MB\n  audio: 10 * 1024 * 1024,  // 10 MB\n  file: 100 * 1024 * 1024,  // 100 MB\n};\n\n/**\n * Checks whether a file exceeds the size limit for its type.\n *\n * @returns true if the file is within the allowed size, false if it exceeds the limit\n */\nexport function isFileSizeValid(file: File, type: 'image' | 'video' | 'audio' | 'file'): boolean {\n  return file.size <= FILE_SIZE_LIMITS[type];\n}\n\n/**\n * Returns the size limit in MB for a given file type.\n */\nexport function getSizeLimitMB(type: 'image' | 'video' | 'audio' | 'file'): number {\n  return FILE_SIZE_LIMITS[type] / (1024 * 1024);\n}\n\n// ==================== Attachment Object Helpers ====================\n\n/**\n * Creates an AttachmentFile object from a raw File.\n */\nexport function createAttachmentFile(file: File): AttachmentFile {\n  const type = getFileType(file);\n  return {\n    id: `${Date.now()}_${Math.random().toString(36).slice(2)}`,\n    file,\n    type,\n    name: file.name,\n    size: file.size,\n    uploadProgress: 0,\n    status: 'pending',\n  };\n}\n\n/**\n * Formats a file size in bytes to a human-readable string.\n * e.g. 1048576 → \"1.0 MB\"\n */\nexport function formatFileSize(bytes: number): string {\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n  return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\n// ==================== Media Message Type Mapping ====================\n\n/**\n * Maps a file attachment type to the CometChat SDK media message type string.\n */\nexport function getMediaMessageType(fileType: 'image' | 'video' | 'audio' | 'file'): string {\n  const typeMap: Record<string, string> = {\n    image: 'image',\n    video: 'video',\n    audio: 'audio',\n    file: 'file',\n  };\n  return typeMap[fileType] ?? 'file';\n}\n","/**\n * Extracted voice recording logic for CometChatMessageComposerComponent.\n */\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKitUtility} from '../../CometChatUIKitUtility';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {MessageComposerService} from '../../services/message-composer.service';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {stampBatchMetadata} from '../../utils/message-metadata-utils';\n\nexport interface VoiceUtilsContext {\n  isRecording: { (): boolean; set(v: boolean): void };\n  recordingDuration: { set(v: number): void };\n  contentToDisplay: { set(v: string): void };\n  parentMessageId?: number;\n  enableRichText: boolean;\n  customRichTextEditor: any;\n  messageComposerService: MessageComposerService;\n  messageToReplySignal: () => CometChat.BaseMessage | null;\n  getReceiver(): CometChat.User | CometChat.Group | undefined;\n  exitReplyMode(): void;\n  playOutgoingMessageSound(): void;\n  emitError(error: unknown): void;\n  focusRichTextEditor(): void;\n  focusTextInput(): void;\n  closeAllPopups(): void;\n  syncLegacyPopoverSignals(): void;\n  isMentionSuggestionsOpen: { set(v: boolean): void };\n  sendButtonClick: { emit(v: CometChat.BaseMessage): void };\n  announceRecordingStarted(): void;\n  announceRecordingStopped(): void;\n  announceMessageSent(): void;\n}\n\nexport async function handleRecordingCompleteImpl(ctx: VoiceUtilsContext, audioBlob: Blob): Promise<void> {\n  ctx.isRecording.set(false);\n  ctx.recordingDuration.set(0);\n  ctx.contentToDisplay.set('none');\n  ctx.syncLegacyPopoverSignals();\n  const receiver = ctx.getReceiver();\n  if (!receiver) {\n    CometChatLogger.warn('CometChatMessageComposer', 'No receiver (user or group) specified for audio message');\n    return;\n  }\n  const timestamp = Date.now();\n  const audioFile = new File([audioBlob], `voice_message_${timestamp}.webm`, { type: audioBlob.type || 'audio/webm' });\n  const quotedMessage = ctx.messageToReplySignal() || undefined;\n  const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n  const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n  const pendingAudioMessage = new CometChat.MediaMessage(receiverId, audioFile, CometChat.MESSAGE_TYPE.AUDIO, receiverType);\n  // Tag as a voice note so the receive side routes it to CometChatVoiceNoteBubble (vs an audio\n  // file). The value is the cross-platform `voice_note` — the React/iOS/Android kits read that\n  // exact string, so a camelCase tag would render as a plain audio bubble on those clients.\n  stampBatchMetadata(pendingAudioMessage, {\n    audioType: CometChatUIKitConstants.AudioType.voiceNote,\n  });\n  if (ctx.parentMessageId) { pendingAudioMessage.setParentMessageId(ctx.parentMessageId); }\n  if (quotedMessage) { pendingAudioMessage.setQuotedMessage(quotedMessage); pendingAudioMessage.setQuotedMessageId(quotedMessage.getId()); }\n  pendingAudioMessage.setMuid(CometChatUIKitUtility.ID());\n  pendingAudioMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n  const blobUrl = URL.createObjectURL(audioFile);\n  const fileExtension = audioFile.name.split('.').pop() || '';\n  const localAttachment = {\n    url: blobUrl, name: audioFile.name, mimeType: audioFile.type, size: audioFile.size, extension: fileExtension,\n    getUrl: () => blobUrl, getName: () => audioFile.name, getMimeType: () => audioFile.type, getSize: () => audioFile.size, getExtension: () => fileExtension,\n  };\n  (pendingAudioMessage as any).getAttachments = () => [localAttachment];\n  CometChatMessageEvents.ccMessageSent.next({ message: pendingAudioMessage, status: MessageStatus.inprogress });\n  try {\n    const mediaMessage = await ctx.messageComposerService.sendMediaMessage(\n      receiver, audioFile, CometChat.MESSAGE_TYPE.AUDIO, undefined, ctx.parentMessageId, quotedMessage, pendingAudioMessage\n    );\n    if (mediaMessage) {\n      CometChatMessageEvents.ccMessageSent.next({ message: mediaMessage, status: MessageStatus.success });\n      if (quotedMessage) {\n        ctx.exitReplyMode();\n        CometChatMessageEvents.ccReplyToMessage.next({ message: mediaMessage, status: MessageStatus.success });\n      }\n      ctx.sendButtonClick.emit(mediaMessage);\n      ctx.playOutgoingMessageSound();\n    } else {\n      CometChatMessageEvents.ccMessageSent.next({ message: pendingAudioMessage, status: MessageStatus.error });\n    }\n  } catch (error) {\n    CometChatMessageEvents.ccMessageSent.next({ message: pendingAudioMessage, status: MessageStatus.error });\n    CometChatLogger.error('CometChatMessageComposer', 'Error sending audio message:', error);\n    ctx.emitError(error);\n  }\n  // ENG-35026: Revoke the blob URL only after a delay to allow the audio bubble's\n  // WaveSurfer instance to finish loading the audio from the URL. Revoking immediately\n  // after send causes \"failed to load\" because the audio element hasn't loaded yet.\n  setTimeout(() => URL.revokeObjectURL(blobUrl), 10000);\n}\n\nexport function handleRecordingCancelImpl(ctx: VoiceUtilsContext): void {\n  ctx.isRecording.set(false);\n  ctx.recordingDuration.set(0);\n  ctx.contentToDisplay.set('none');\n  ctx.syncLegacyPopoverSignals();\n  ctx.announceRecordingStopped();\n  if (ctx.enableRichText && ctx.customRichTextEditor) { ctx.focusRichTextEditor(); } else { ctx.focusTextInput(); }\n}\n\nexport function handleRecordingErrorImpl(ctx: VoiceUtilsContext, error: Error): void {\n  CometChatLogger.error('CometChatMessageComposer', 'Recording error:', error);\n  ctx.isRecording.set(false);\n  ctx.recordingDuration.set(0);\n  ctx.contentToDisplay.set('none');\n  ctx.syncLegacyPopoverSignals();\n  ctx.emitError(error);\n  ctx.announceRecordingStopped();\n  if (ctx.enableRichText && ctx.customRichTextEditor) { ctx.focusRichTextEditor(); } else { ctx.focusTextInput(); }\n}\n\nexport function startInlineRecordingImpl(ctx: VoiceUtilsContext): void {\n  ctx.closeAllPopups();\n  ctx.isRecording.set(true);\n  ctx.contentToDisplay.set('voiceRecording');\n  ctx.syncLegacyPopoverSignals();\n  ctx.announceRecordingStarted();\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n","/**\n * Extracted message sending logic for CometChatMessageComposerComponent.\n */\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKitUtility} from '../../CometChatUIKitUtility';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatTextFormatter} from '../../formatters/cometchat-text-formatter';\nimport {MessageComposerService} from '../../services/message-composer.service';\nimport {AttachmentFile} from './cometchat-message-composer.component';\n\nexport interface SendUtilsContext {\n  parentMessageId?: number;\n  disableMentions: boolean;\n  mentionedUsersMap: Map<string, CometChat.User>;\n  mentionSuggestions: () => Array<{ uid: string; entity?: CometChat.User | CometChat.Group }>;\n  customRichTextEditor: any;\n  richTextEditorService: { getUniqueMentionUids(editor: any): Set<string> };\n  plainTextMentionUids: Set<string>;\n  composerText: () => string;\n  messageToReplySignal: () => CometChat.BaseMessage | null;\n  messageToEdit: CometChat.BaseMessage | null;\n  textMessageToEdit: () => CometChat.BaseMessage | null;\n  isInEditMode: () => boolean;\n  isEditMode: { set(v: boolean): void };\n  textFormatterArray: () => CometChatTextFormatter[];\n  messageComposerService: MessageComposerService;\n  clearComposer(): void;\n  resetMentionsFormatter(): void;\n  exitReplyMode(): void;\n  playOutgoingMessageSound(): void;\n  emitError(error: unknown): void;\n  getMediaMessageType(fileType: 'image' | 'video' | 'audio' | 'file'): string;\n  sendButtonClick: { emit(v: CometChat.BaseMessage): void };\n  announceMessageSent(): void;\n  closePreview: { emit(): void };\n  textChange: { emit(v: string): void };\n}\n\nexport function buildMessageMetadataImpl(_ctx: SendUtilsContext): Record<string, unknown> | undefined {\n  return undefined;\n}\n\nexport function extractMentionedUsersImpl(ctx: SendUtilsContext): CometChat.User[] {\n  if (ctx.disableMentions) { return []; }\n  const mentionedUsers: CometChat.User[] = [];\n  const addedUids = new Set<string>();\n  const userMap = new Map<string, CometChat.User>();\n  ctx.mentionedUsersMap.forEach((user, uid) => { userMap.set(uid, user); });\n  const suggestions = ctx.mentionSuggestions();\n  suggestions.forEach(suggestion => {\n    if (suggestion.entity && suggestion.entity instanceof CometChat.User) { userMap.set(suggestion.uid, suggestion.entity); }\n  });\n  const uids = new Set<string>();\n  if (ctx.customRichTextEditor) { const editorUids = ctx.richTextEditorService.getUniqueMentionUids(ctx.customRichTextEditor); editorUids.forEach((uid: string) => uids.add(uid)); } else {\n    ctx.plainTextMentionUids.forEach(uid => uids.add(uid));\n  }\n  const text = ctx.composerText();\n  const sdkMentionRegex = /<@uid:([^>]+)>/g;\n  let match;\n  while ((match = sdkMentionRegex.exec(text)) !== null) { uids.add(match[1]); }\n  uids.forEach(uid => {\n    if (!addedUids.has(uid)) {\n      const user = userMap.get(uid);\n      if (user) {\n        const minimalUser = new CometChat.User({ uid: user.getUid(), name: user.getName() });\n        mentionedUsers.push(minimalUser);\n        addedUids.add(uid);\n      }\n    }\n  });\n  return mentionedUsers;\n}\n\nexport function applyTextFormattersImpl<T extends CometChat.TextMessage>(ctx: SendUtilsContext, message: T): T {\n  let formattedMessage = message;\n  for (const formatter of ctx.textFormatterArray()) {\n    const formatterWithMethod = formatter as unknown as { formatMessageForSending?: <M extends CometChat.TextMessage>(msg: M) => M };\n    if (typeof formatterWithMethod.formatMessageForSending === 'function') {\n      formattedMessage = formatterWithMethod.formatMessageForSending(formattedMessage);\n    }\n  }\n  return formattedMessage;\n}\n\nexport async function handleEditMessageImpl(\n  ctx: SendUtilsContext,\n  newText: string,\n  messageToEdit: CometChat.BaseMessage\n): Promise<void> {\n  if (!messageToEdit) { return; }\n  (ctx as any).textMessageToEdit.set ? (ctx as any).textMessageToEdit.set(null) : null;\n  ctx.isEditMode.set(false);\n  (ctx as any).composerText.set ? (ctx as any).composerText.set('') : null;\n  ctx.textChange.emit('');\n  if (ctx.customRichTextEditor) { (ctx as any).richTextEditorService.clearContent(ctx.customRichTextEditor); }\n  (ctx as any).originalTextBeforeEdit = '';\n  ctx.closePreview.emit();\n  try {\n    const editedMessage = await ctx.messageComposerService.editMessage(messageToEdit, newText);\n    if (editedMessage) {\n      CometChatMessageEvents.ccMessageEdited.next({ message: editedMessage, status: MessageStatus.success, parentMessageId: ctx.parentMessageId ?? null });\n      ctx.sendButtonClick.emit(editedMessage);\n      ctx.announceMessageSent();\n      ctx.playOutgoingMessageSound();\n    }\n  } catch (error) {\n    CometChatMessageEvents.ccMessageEdited.next({ message: messageToEdit, status: MessageStatus.error, parentMessageId: ctx.parentMessageId ?? null });\n    ctx.emitError(error);\n    CometChatLogger.error('CometChatMessageComposer', 'Error editing message:', error);\n  }\n}\n\nexport async function handleSendNewMessageImpl(\n  ctx: SendUtilsContext,\n  receiver: CometChat.User | CometChat.Group,\n  text: string,\n  attachments: AttachmentFile[]\n): Promise<void> {\n  let lastSentMessage: CometChat.BaseMessage | null = null;\n  const metadata = buildMessageMetadataImpl(ctx);\n  const mentionedUsers = extractMentionedUsersImpl(ctx);\n  const quotedMessage = ctx.messageToReplySignal() || undefined;\n  if (text.length > 0) {\n    const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n    const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n    const pendingTextMessage = new CometChat.TextMessage(receiverId, text, receiverType);\n    if (metadata) { pendingTextMessage.setMetadata(metadata); }\n    if (ctx.parentMessageId) { pendingTextMessage.setParentMessageId(ctx.parentMessageId); }\n    if (quotedMessage) { pendingTextMessage.setQuotedMessage(quotedMessage); pendingTextMessage.setQuotedMessageId(quotedMessage.getId()); }\n    if (mentionedUsers.length > 0) { pendingTextMessage.setMentionedUsers(mentionedUsers); }\n    pendingTextMessage.setMuid(CometChatUIKitUtility.ID());\n    pendingTextMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    CometChatMessageEvents.ccMessageSent.next({ message: pendingTextMessage, status: MessageStatus.inprogress });\n    ctx.clearComposer();\n    ctx.resetMentionsFormatter();\n    try {\n      const textMessage = await ctx.messageComposerService.sendTextMessage(receiver, text, metadata, ctx.parentMessageId, quotedMessage, pendingTextMessage);\n      if (textMessage) {\n        applyTextFormattersImpl(ctx, textMessage);\n        lastSentMessage = textMessage;\n        CometChatMessageEvents.ccMessageSent.next({ message: textMessage, status: MessageStatus.success });\n      } else {\n        CometChatMessageEvents.ccMessageSent.next({ message: pendingTextMessage, status: MessageStatus.error });\n      }\n    } catch (error) {\n      CometChatMessageEvents.ccMessageSent.next({ message: pendingTextMessage, status: MessageStatus.error });\n      ctx.emitError(error);\n      throw error;\n    }\n  }\n  let composerClearedForMedia = false;\n  for (const attachment of attachments) {\n    const mediaType = ctx.getMediaMessageType(attachment.type);\n    const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n    const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n    const pendingMediaMessage = new CometChat.MediaMessage(receiverId, attachment.file, mediaType, receiverType);\n    if (ctx.parentMessageId) { pendingMediaMessage.setParentMessageId(ctx.parentMessageId); }\n    if (quotedMessage) { pendingMediaMessage.setQuotedMessage(quotedMessage); pendingMediaMessage.setQuotedMessageId(quotedMessage.getId()); }\n    pendingMediaMessage.setMuid(CometChatUIKitUtility.ID());\n    pendingMediaMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n\n    // Patch getAttachments on the pending message so the image bubble can show\n    // a local blob URL as a placeholder while the upload is in progress.\n    // Use thumbnailUrl if available (already a blob URL for images), otherwise\n    // create a new blob URL from the file.\n    const localBlobUrl = attachment.thumbnailUrl || URL.createObjectURL(attachment.file);\n    const createdBlobUrl = attachment.thumbnailUrl ? null : localBlobUrl; // track if we created it\n    const fileExtension = attachment.file.name.split('.').pop() || '';\n    const localAttachment = {\n      url: localBlobUrl, name: attachment.file.name, mimeType: attachment.file.type,\n      size: attachment.file.size, extension: fileExtension,\n      getUrl: () => localBlobUrl, getName: () => attachment.file.name,\n      getMimeType: () => attachment.file.type, getSize: () => attachment.file.size,\n      getExtension: () => fileExtension,\n    };\n    (pendingMediaMessage as any).getAttachments = () => [localAttachment];\n\n    CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.inprogress });\n    if (text.length === 0 && !composerClearedForMedia) { ctx.clearComposer(); ctx.resetMentionsFormatter(); composerClearedForMedia = true; }\n    try {\n      const mediaMessage = await ctx.messageComposerService.sendMediaMessage(receiver, attachment.file, mediaType, undefined, ctx.parentMessageId, quotedMessage, pendingMediaMessage);\n      if (mediaMessage) {\n        lastSentMessage = mediaMessage;\n        CometChatMessageEvents.ccMessageSent.next({ message: mediaMessage, status: MessageStatus.success });\n      } else {\n        CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.error });\n      }\n    } catch (error) {\n      CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.error });\n      ctx.emitError(error);\n      CometChatLogger.error('CometChatMessageComposer', 'Error sending media message:', error);\n    }\n    // Revoke blob URLs after upload completes (thumbnailUrl is revoked by the composer,\n    // but if we created a new one we must revoke it here)\n    if (createdBlobUrl) { URL.revokeObjectURL(createdBlobUrl); }\n    if (attachment.thumbnailUrl) { URL.revokeObjectURL(attachment.thumbnailUrl); }\n  }\n  if (quotedMessage && lastSentMessage) {\n    CometChatMessageEvents.ccReplyToMessage.next({ message: lastSentMessage, status: MessageStatus.success });\n  }\n  if (lastSentMessage) { ctx.sendButtonClick.emit(lastSentMessage); ctx.announceMessageSent(); }\n  ctx.playOutgoingMessageSound();\n}\n","/**\n * Extracted drag/drop/paste/file handling logic for CometChatMessageComposerComponent.\n */\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKitUtility} from '../../CometChatUIKitUtility';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {MessageComposerService} from '../../services/message-composer.service';\n\nexport interface DragUtilsContext {\n  isDraggingOver: { set(v: boolean): void };\n  dragCounter: number;\n  parentMessageId?: number;\n  allowedFileTypes?: string[];\n  maxFileSize?: number;\n  enableDragDrop?: boolean;\n  /** Routes selected/pasted/dropped files into the composer (staging tray). */\n  processFiles(files: File[]): void;\n  /**\n   * The attachment-menu option that opened the file dialog, consumed once by `processFiles`.\n   * Dropped/pasted files have no picker, so these paths clear it before staging — otherwise a\n   * dialog the user cancelled would leave a stale kind behind and mis-type the next drop.\n   */\n  pendingPickerKind?: 'image' | 'video' | 'audio' | 'file';\n  fileSizeError: { set(v: any): void };\n  messageComposerService: MessageComposerService;\n  messageToReplySignal: () => CometChat.BaseMessage | null;\n  getReceiver(): CometChat.User | CometChat.Group | undefined;\n  getMediaMessageType(fileType: 'image' | 'video' | 'audio' | 'file'): string;\n  getFileType(file: File): 'image' | 'video' | 'audio' | 'file';\n  getFileTypeLabel(mimeType: string): string;\n  exitReplyMode(): void;\n  playOutgoingMessageSound(): void;\n  emitError(error: unknown): void;\n  sendButtonClick: { emit(v: CometChat.BaseMessage): void };\n  announceMessageSent(): void;\n}\n\nexport function handleDragEnterImpl(ctx: DragUtilsContext, event: DragEvent): void {\n  event.preventDefault();\n  event.stopPropagation();\n  ctx.dragCounter++;\n  ctx.isDraggingOver.set(true);\n}\n\nexport function handleDragLeaveImpl(ctx: DragUtilsContext, event: DragEvent): void {\n  event.preventDefault();\n  event.stopPropagation();\n  ctx.dragCounter--;\n  if (ctx.dragCounter === 0) { ctx.isDraggingOver.set(false); }\n}\n\nexport function handleDragOverImpl(_ctx: DragUtilsContext, event: DragEvent): void {\n  event.preventDefault();\n  event.stopPropagation();\n}\n\nexport function handleDropImpl(ctx: DragUtilsContext, event: DragEvent): void {\n  event.preventDefault();\n  event.stopPropagation();\n  ctx.dragCounter = 0;\n  ctx.isDraggingOver.set(false);\n  if (ctx.enableDragDrop === false) { return; }\n  const files = event.dataTransfer?.files;\n  if (files && files.length > 0) {\n    ctx.pendingPickerKind = undefined; // no picker involved — categorise by MIME\n    ctx.processFiles(Array.from(files));\n  }\n}\n\nexport function handlePasteImpl(ctx: DragUtilsContext, event: ClipboardEvent): void {\n  const clipboardData = event.clipboardData;\n  if (!clipboardData) { return; }\n  const items = clipboardData.items;\n  const files: File[] = [];\n  for (let i = 0; i < items.length; i++) {\n    if (items[i].kind === 'file') {\n      const file = items[i].getAsFile();\n      if (file) { files.push(file); }\n    }\n  }\n  if (files.length > 0) {\n    event.preventDefault();\n    ctx.pendingPickerKind = undefined; // no picker involved — categorise by MIME\n    ctx.processFiles(files);\n  }\n}\n\nexport function handleFileInputChangeImpl(ctx: DragUtilsContext, event: Event): void {\n  const target = event.target as HTMLInputElement;\n  const selected = target.files ? Array.from(target.files) : [];\n  // Reset up front so re-picking the same file still fires (change) again.\n  target.value = '';\n  if (selected.length === 0) { return; }\n\n  // Hand the FULL selection to the tray, exactly like drag-drop and paste, so an over-limit pick\n  // hits the tray's all-or-nothing count check and raises the same limit toast. Truncating here to\n  // the free slots staged a silent subset — or, when the tray was already full, nothing at all with\n  // no feedback.\n  ctx.processFiles(selected);\n}\n\nexport function processFilesImpl(ctx: DragUtilsContext, files: File[]): void {\n  const oversizedFiles: File[] = [];\n  const invalidTypeFiles: File[] = [];\n  const validFiles: File[] = [];\n  for (const file of files) {\n    if (ctx.allowedFileTypes && ctx.allowedFileTypes.length > 0) {\n      if (!ctx.allowedFileTypes.includes(file.type)) { CometChatLogger.warn('CometChatMessageComposer', 'File type not allowed:', file.type); invalidTypeFiles.push(file); continue; }\n    }\n    const maxSize = ctx.maxFileSize || 100 * 1024 * 1024;\n    if (file.size > maxSize) { CometChatLogger.warn('CometChatMessageComposer', 'File size exceeds limit:', file.size); oversizedFiles.push(file); continue; }\n    validFiles.push(file);\n  }\n  if (invalidTypeFiles.length > 0) {\n    const errorMessage = CometChatLocalize.getLocalizedString('message_composer_file_type_error') || `${invalidTypeFiles.length} file(s) have unsupported file type`;\n    ctx.emitError(new Error(errorMessage));\n  }\n  if (oversizedFiles.length > 0) {\n    const fileType = ctx.getFileTypeLabel(oversizedFiles[0].type);\n    const maxSize = ctx.maxFileSize || 100 * 1024 * 1024;\n    ctx.fileSizeError.set({ count: oversizedFiles.length, fileType, limitMB: Math.round(maxSize / (1024 * 1024)), timestamp: Date.now() });\n    const errorMessage = CometChatLocalize.getLocalizedString('message_composer_file_size_error') || `${oversizedFiles.length} ${fileType}(s) exceeded the ${Math.round(maxSize / (1024 * 1024))}MB limit`;\n    ctx.emitError(new Error(errorMessage));\n  }\n  if (validFiles.length > 0) { sendFilesDirectlyImpl(ctx, validFiles); }\n}\n\nexport async function sendFilesDirectlyImpl(ctx: DragUtilsContext, files: File[]): Promise<void> {\n  const receiver = ctx.getReceiver();\n  if (!receiver) { CometChatLogger.warn('CometChatMessageComposer', 'No receiver (user or group) specified'); return; }\n  const quotedMessage = ctx.messageToReplySignal() || undefined;\n  let lastSentMessage: CometChat.BaseMessage | null = null;\n  for (const file of files) {\n    const fileType = ctx.getFileType(file);\n    const mediaType = ctx.getMediaMessageType(fileType);\n    const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n    const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n    const pendingMediaMessage = new CometChat.MediaMessage(receiverId, file, mediaType, receiverType);\n    if (ctx.parentMessageId) { pendingMediaMessage.setParentMessageId(ctx.parentMessageId); }\n    if (quotedMessage) { pendingMediaMessage.setQuotedMessage(quotedMessage); pendingMediaMessage.setQuotedMessageId(quotedMessage.getId()); }\n    pendingMediaMessage.setMuid(CometChatUIKitUtility.ID());\n    pendingMediaMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n    const blobUrl = URL.createObjectURL(file);\n    const fileExtension = file.name.split('.').pop() || '';\n    const localAttachment = {\n      url: blobUrl, name: file.name, mimeType: file.type, size: file.size, extension: fileExtension,\n      getUrl: () => blobUrl, getName: () => file.name, getMimeType: () => file.type, getSize: () => file.size, getExtension: () => fileExtension,\n    };\n    (pendingMediaMessage as any).getAttachments = () => [localAttachment];\n    CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.inprogress });\n    try {\n      const mediaMessage = await ctx.messageComposerService.sendMediaMessage(receiver, file, mediaType, undefined, ctx.parentMessageId, quotedMessage, pendingMediaMessage);\n      if (mediaMessage) {\n        lastSentMessage = mediaMessage;\n        CometChatMessageEvents.ccMessageSent.next({ message: mediaMessage, status: MessageStatus.success });\n      } else {\n        CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.error });\n      }\n    } catch (error) {\n      CometChatMessageEvents.ccMessageSent.next({ message: pendingMediaMessage, status: MessageStatus.error });\n      ctx.emitError(error);\n      CometChatLogger.error('CometChatMessageComposer', 'Error sending media message:', error);\n    }\n    URL.revokeObjectURL(blobUrl);\n  }\n  if (quotedMessage && lastSentMessage) {\n    ctx.exitReplyMode();\n    CometChatMessageEvents.ccReplyToMessage.next({ message: lastSentMessage, status: MessageStatus.success });\n  }\n  if (lastSentMessage) { ctx.sendButtonClick.emit(lastSentMessage); ctx.announceMessageSent(); }\n  ctx.playOutgoingMessageSound();\n}\n","/**\n * Extracted editor initialization and composer clear logic for CometChatMessageComposerComponent.\n */\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {isMobileDevice} from '../../utils/util';\nimport {RichTextFormatState} from '../../services/rich-text-editor.interfaces';\nimport {EnterKeyBehavior} from '../../Enums/Enums';\n\nexport interface EditorInitContext {\n  customRichTextEditor: any;\n  richTextEditorContainerRef?: { nativeElement: HTMLDivElement };\n  placeholderText: string;\n  disableAutoFocusOnMobile: boolean;\n  composerText: () => string;\n  enableRichText: boolean;\n  isMultilineLayout: () => boolean;\n  enterKeyBehavior: EnterKeyBehavior;\n  isMouseDown: boolean;\n  richTextEditorService: {\n    createEditor(config: any, container: HTMLDivElement): any;\n    getFormatState(editor: any): RichTextFormatState;\n  };\n  handleRichTextUpdate(html: string, text: string): void;\n  handleSelectionUpdate(formatState: RichTextFormatState): void;\n  handleInputFocus(): void;\n  handleInputBlur(): void;\n  handleLinkClick(url: string, text: string, x: number, y: number): void;\n  handleRichTextKeydown(event: KeyboardEvent): void;\n  configureTextFormatters(): void;\n  emitError(error: unknown): void;\n}\n\nexport function initializeRichTextEditorImpl(ctx: EditorInitContext): void {\n  if (ctx.customRichTextEditor) { return; }\n  setTimeout(() => {\n    const containerElement = ctx.richTextEditorContainerRef?.nativeElement;\n    if (!containerElement) { CometChatLogger.warn('CometChatMessageComposer', 'Rich text editor container not found'); return; }\n    try {\n      const placeholder = CometChatLocalize.getLocalizedString(ctx.placeholderText);\n      const shouldAutofocus = ctx.disableAutoFocusOnMobile && isMobileDevice() ? false : true;\n      ctx.customRichTextEditor = ctx.richTextEditorService.createEditor(\n        {\n          placeholder,\n          editable: true,\n          autofocus: shouldAutofocus,\n          content: ctx.composerText() || '',\n          enableFormatting: ctx.enableRichText,\n          ariaLabel: placeholder || CometChatLocalize.getLocalizedString('message_composer_aria_label'),\n          onUpdate: (html: string, text: string) => { ctx.handleRichTextUpdate(html, text); },\n          onSelectionUpdate: (formatState: RichTextFormatState) => { ctx.handleSelectionUpdate(formatState); },\n          onFocus: () => { ctx.handleInputFocus(); },\n          onBlur: () => { ctx.handleInputBlur(); },\n          onLinkClick: (url: string, text: string, x: number, y: number) => { ctx.handleLinkClick(url, text, x, y); },\n        },\n        containerElement\n      );\n      // Track whether Shift is held so beforeinput can distinguish\n      // Shift+Enter (new line) from bare Enter (send) in Safari, which\n      // fires inputType 'insertParagraph' for both.\n      let shiftHeld = false;\n      containerElement.addEventListener('keydown', (event: KeyboardEvent) => {\n        shiftHeld = event.shiftKey;\n        ctx.handleRichTextKeydown(event);\n      }, true);\n      containerElement.addEventListener('keyup', (event: KeyboardEvent) => {\n        if (event.key === 'Shift') { shiftHeld = false; }\n      }, true);\n      containerElement.addEventListener('beforeinput', (event: InputEvent) => {\n        if (!ctx.isMultilineLayout() && event.inputType === 'insertParagraph' && ctx.enterKeyBehavior === EnterKeyBehavior.SendMessage) {\n          // Safari fires insertParagraph even for Shift+Enter. Don't block\n          // the event when Shift is held — the user wants a line break.\n          if (!shiftHeld) {\n            event.preventDefault();\n          }\n        }\n      }, true);\n      containerElement.addEventListener('mousedown', () => { ctx.isMouseDown = true; });\n      containerElement.addEventListener('mouseup', () => {\n        ctx.isMouseDown = false;\n        if (ctx.customRichTextEditor) {\n          const formatState = ctx.richTextEditorService.getFormatState(ctx.customRichTextEditor);\n          ctx.handleSelectionUpdate(formatState);\n        }\n      });\n      document.addEventListener('mouseup', () => {\n        if (ctx.isMouseDown) {\n          ctx.isMouseDown = false;\n          if (ctx.customRichTextEditor) {\n            const formatState = ctx.richTextEditorService.getFormatState(ctx.customRichTextEditor);\n            ctx.handleSelectionUpdate(formatState);\n          }\n        }\n      });\n      ctx.configureTextFormatters();\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageComposer', 'Error initializing rich text editor:', error);\n      ctx.emitError(error);\n    }\n  }, 0);\n}\n\nexport interface ClearComposerContext {\n  composerText: { set(v: string): void };\n  customRichTextEditor: any;\n  richTextEditorService: { clearContent(editor: any): void };\n  messageToReplySignal: { (): any; set(v: any): void };\n  isEditMode: { (): boolean; set(v: boolean): void };\n  textMessageToEdit: { (): any; set(v: any): void };\n  originalTextBeforeEdit: string;\n  attachments: { set(v: any[]): void };\n  richTextFormatState: { set(v: RichTextFormatState): void };\n  uniqueMentionCount: { set(v: number): void };\n  showMentionsCountWarning: { set(v: boolean): void };\n  plainTextMentionUids: { clear(): void };\n  mentionedUsersMap: { clear(): void };\n  textChange: { emit(v: string): void };\n}\n\nexport function clearComposerImpl(ctx: ClearComposerContext): void {\n  ctx.composerText.set('');\n  if (ctx.customRichTextEditor) { ctx.richTextEditorService.clearContent(ctx.customRichTextEditor); }\n  if (ctx.messageToReplySignal()) { ctx.messageToReplySignal.set(null); }\n  if (ctx.isEditMode() || ctx.textMessageToEdit()) { ctx.textMessageToEdit.set(null); ctx.isEditMode.set(false); ctx.originalTextBeforeEdit = ''; }\n  ctx.attachments.set([]);\n  ctx.richTextFormatState.set({\n    bold: false, italic: false, underline: false, strikethrough: false,\n    code: false, blockquote: false, codeBlock: false, orderedList: false, bulletList: false, link: false,\n  });\n  ctx.uniqueMentionCount.set(0);\n  ctx.showMentionsCountWarning.set(false);\n  ctx.plainTextMentionUids.clear();\n  ctx.mentionedUsersMap.clear();\n  ctx.textChange.emit('');\n}\n","/**\n * Mention-related handler functions for CometChatMessageComposer.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { MentionSuggestion } from '../../services/message-composer.service';\nimport { MENTIONS_LIMIT } from './cometchat-message-composer.component';\n\n/** Minimal interface for the parts of the component this handler needs */\nexport interface MentionsHandlerContext {\n  disableMentions: boolean;\n  disableMentionAll: boolean;\n  mentionAllLabel: string;\n  mentionsUsersRequestBuilder?: CometChat.UsersRequestBuilder;\n  mentionsGroupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder;\n  enableRichText: boolean;\n  customRichTextEditor: any;\n  richTextEditorService: any;\n  messageComposerService: any;\n  mentionSearchText: any;\n  isMentionSuggestionsOpen: any;\n  focusedMentionIndex: any;\n  uniqueMentionCount: any;\n  showMentionsCountWarning: any;\n  composerText: any;\n  cursorPosition: any;\n  mentionedUsersMap: Map<string, CometChat.User>;\n  plainTextMentionUids: Set<string>;\n  skipNextMentionCheck: boolean;\n  currentGroup: () => CometChat.Group | null;\n  textChange: any;\n  mentionSelected: any;\n  liveAnnouncerService: any;\n  cdr: any;\n  focusRichTextEditor: () => void;\n  focusTextInput: () => void;\n  updateMentionsCount: () => void;\n  announceMentionInserted: (name: string) => void;\n  announceFocusedMention: (name: string, pos: number, total: number) => void;\n}\n\nexport function checkForMentionTriggerImpl(ctx: MentionsHandlerContext, text: string, cursorPos: number): void {\n  if (ctx.skipNextMentionCheck) { return; }\n  if (ctx.uniqueMentionCount() >= MENTIONS_LIMIT) { closeMentionSuggestionsImpl(ctx); return; }\n  if (ctx.enableRichText && ctx.customRichTextEditor) {\n    const sel = window.getSelection();\n    if (sel && sel.rangeCount > 0) {\n      let node: Node | null = sel.anchorNode;\n      while (node) {\n        if (node.nodeType === Node.ELEMENT_NODE) {\n          const tagName = (node as HTMLElement).tagName?.toLowerCase();\n          if (tagName === 'pre' || tagName === 'code') { closeMentionSuggestionsImpl(ctx); return; }\n        }\n        node = node.parentNode;\n      }\n    }\n  }\n  if (ctx.customRichTextEditor) {\n    const plainText = ctx.richTextEditorService.getText(ctx.customRichTextEditor);\n    const html = ctx.richTextEditorService.getHTML(ctx.customRichTextEditor);\n    const mentionMatches = html.match(/data-uid=\"[^\"]*\"/g);\n    const mentionCount = mentionMatches ? mentionMatches.length : 0;\n    const atMatches = plainText.match(/@/g);\n    const atCount = atMatches ? atMatches.length : 0;\n    if (atCount === 0) { closeMentionSuggestionsImpl(ctx); return; }\n    if (atCount <= mentionCount) { closeMentionSuggestionsImpl(ctx); return; }\n    const lastAtIndex = plainText.lastIndexOf('@');\n    const textAfterAt = plainText.substring(lastAtIndex + 1);\n    const hasSpace = textAfterAt.includes(' ');\n    const hasNbsp = textAfterAt.includes('\\u00A0');\n    const hasNewline = textAfterAt.includes('\\n');\n    if (hasSpace || hasNbsp || hasNewline) { closeMentionSuggestionsImpl(ctx); return; }\n    const newSearchText = textAfterAt;\n    const previousSearchText = ctx.mentionSearchText();\n    ctx.mentionSearchText.set(newSearchText);\n    if (newSearchText !== previousSearchText) { ctx.focusedMentionIndex.set(0); }\n    ctx.isMentionSuggestionsOpen.set(true);\n    if (newSearchText === previousSearchText && !ctx.disableMentions) {\n      ctx.messageComposerService.searchMentions(\n        newSearchText,\n        ctx.currentGroup() ?? undefined,\n        ctx.mentionsUsersRequestBuilder,\n        ctx.mentionsGroupMembersRequestBuilder,\n        ctx.disableMentionAll,\n        ctx.mentionAllLabel\n      );\n    }\n    return;\n  }\n  const textBeforeCursor = text.substring(0, cursorPos);\n  const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n  if (lastAtIndex === -1) { closeMentionSuggestionsImpl(ctx); return; }\n  const textAfterAt = textBeforeCursor.substring(lastAtIndex + 1);\n  if (textAfterAt.includes(' ')) { closeMentionSuggestionsImpl(ctx); return; }\n  const newSearchText = textAfterAt;\n  const previousSearchText = ctx.mentionSearchText();\n  if (newSearchText !== previousSearchText) { ctx.mentionSearchText.set(newSearchText); ctx.focusedMentionIndex.set(0); }\n  ctx.isMentionSuggestionsOpen.set(true);\n}\n\nexport async function fetchMoreMentionsImpl(ctx: MentionsHandlerContext): Promise<void> {\n  const isGroupContext = !!ctx.currentGroup();\n  await ctx.messageComposerService.fetchMoreMentions(isGroupContext);\n  ctx.cdr.markForCheck();\n}\n\nexport function handleMentionsScrollImpl(ctx: MentionsHandlerContext, event: Event): void {\n  const element = event.target as HTMLElement;\n  const scrollTop = element.scrollTop;\n  const scrollHeight = element.scrollHeight;\n  const clientHeight = element.clientHeight;\n  if (scrollTop + clientHeight >= scrollHeight - 50) { fetchMoreMentionsImpl(ctx); }\n}\n\nexport async function selectMentionSuggestionImpl(ctx: MentionsHandlerContext, suggestion: MentionSuggestion): Promise<void> {\n  if (!suggestion.uid || suggestion.uid.trim() === '') { CometChatLogger.warn('CometChatMessageComposer', 'Cannot select mention with empty UID'); closeMentionSuggestionsImpl(ctx); return; }\n  if (!suggestion.name || suggestion.name.trim() === '') { CometChatLogger.warn('CometChatMessageComposer', 'Cannot select mention with empty name'); closeMentionSuggestionsImpl(ctx); return; }\n  if (!ctx.disableMentions) {\n    const currentCount = ctx.uniqueMentionCount();\n    if (currentCount >= MENTIONS_LIMIT) {\n      let alreadyMentioned = false;\n      if (ctx.customRichTextEditor) {\n        const existingUids = ctx.richTextEditorService.getUniqueMentionUids(ctx.customRichTextEditor);\n        alreadyMentioned = existingUids.has(suggestion.uid);\n      } else {\n        alreadyMentioned = ctx.plainTextMentionUids.has(suggestion.uid);\n      }\n      if (!alreadyMentioned) { closeMentionSuggestionsImpl(ctx); return; }\n    }\n  }\n  const searchText = ctx.mentionSearchText();\n  const charsToDelete = searchText.length + 1;\n  const mentionName = suggestion.name;\n  const mentionId = suggestion.uid;\n  const isSelf = await ctx.messageComposerService.checkIfSelfMention(mentionId);\n  if (suggestion.entity) {\n    if (suggestion.entity instanceof CometChat.User) { ctx.mentionedUsersMap.set(mentionId, suggestion.entity); } else if ((suggestion.entity as unknown) instanceof CometChat.GroupMember) {\n      const user = new CometChat.User({ uid: (suggestion.entity as CometChat.GroupMember).getUid(), name: (suggestion.entity as CometChat.GroupMember).getName() });\n      ctx.mentionedUsersMap.set(mentionId, user);\n    }\n  }\n  closeMentionSuggestionsImpl(ctx);\n  ctx.skipNextMentionCheck = true;\n  if (ctx.customRichTextEditor) {\n    ctx.richTextEditorService.insertMention(ctx.customRichTextEditor, mentionId, mentionName, charsToDelete, isSelf);\n    ctx.composerText.set(ctx.customRichTextEditor.getText());\n    ctx.textChange.emit(ctx.customRichTextEditor.getText());\n    setTimeout(() => {\n      ctx.focusRichTextEditor();\n      setTimeout(() => { ctx.skipNextMentionCheck = false; }, 100);\n    }, 0);\n  } else {\n    const mentionText = `@${mentionName} `;\n    const currentText = ctx.composerText();\n    const cursorPos = ctx.cursorPosition();\n    const textBeforeCursor = currentText.substring(0, cursorPos);\n    const lastAtIndex = textBeforeCursor.lastIndexOf('@');\n    if (lastAtIndex === -1) { ctx.skipNextMentionCheck = false; return; }\n    ctx.plainTextMentionUids.add(mentionId);\n    const textBefore = currentText.substring(0, lastAtIndex);\n    const textAfter = currentText.substring(cursorPos);\n    const newText = `${textBefore}${mentionText}${textAfter}`;\n    ctx.composerText.set(newText);\n    const newCursorPos = lastAtIndex + mentionText.length;\n    ctx.cursorPosition.set(newCursorPos);\n    ctx.textChange.emit(newText);\n    ctx.focusTextInput();\n    setTimeout(() => { ctx.skipNextMentionCheck = false; }, 300);\n  }\n  ctx.announceMentionInserted(mentionName);\n  ctx.updateMentionsCount();\n  if (suggestion.entity) { ctx.mentionSelected.emit(suggestion.entity); }\n}\n\nexport function scrollMentionIntoViewImpl(_ctx: MentionsHandlerContext, index: number): void {\n  const element = document.getElementById(`mention-option-${index}`);\n  if (element) { element.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }\n}\n\nexport function closeMentionSuggestionsImpl(ctx: MentionsHandlerContext): void {\n  ctx.isMentionSuggestionsOpen.set(false);\n  ctx.mentionSearchText.set('');\n  ctx.focusedMentionIndex.set(0);\n  ctx.messageComposerService.clearMentionSuggestions();\n  ctx.messageComposerService.stopMentionSearch();\n}\n\nexport function updateMentionsCountImpl(ctx: MentionsHandlerContext): void {\n  if (ctx.disableMentions) { ctx.uniqueMentionCount.set(0); ctx.showMentionsCountWarning.set(false); return; }\n  let count = 0;\n  if (ctx.customRichTextEditor) { const uids = ctx.richTextEditorService.getUniqueMentionUids(ctx.customRichTextEditor); count = uids.size; } else { count = ctx.plainTextMentionUids.size; }\n  ctx.uniqueMentionCount.set(count);\n  ctx.showMentionsCountWarning.set(count >= MENTIONS_LIMIT);\n}\n\nexport function initializeMentionsRequestBuilderImpl(ctx: MentionsHandlerContext, searchText: string): void {\n  const group = ctx.currentGroup();\n  ctx.messageComposerService.initializeMentionsPagination(\n    searchText,\n    group ?? undefined,\n    ctx.mentionsUsersRequestBuilder ?? undefined,\n    ctx.mentionsGroupMembersRequestBuilder ?? undefined\n  );\n}\n\nexport async function checkIfSelfMentionImpl(ctx: MentionsHandlerContext, userId: string): Promise<boolean> {\n  return ctx.messageComposerService.checkIfSelfMention(userId);\n}\n","/**\n * Link dialog/popover handler functions for CometChatMessageComposer.\n * Extracted to reduce component file size.\n */\n\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { type LinkData } from '../base-elements/cometchat-link-dialog/cometchat-link-dialog.component';\n\nexport interface LinkHandlerContext {\n  customRichTextEditor: any;\n  richTextEditorService: any;\n  savedLinkSelection: any;\n  isLinkDialogOpen: any;\n  isLinkPopoverOpen: any;\n  linkPopoverUrl: any;\n  linkPopoverText: any;\n  linkPopoverX: any;\n  linkPopoverY: any;\n  linkDialogMode: any;\n  linkDialogInitialText: any;\n  linkDialogInitialUrl: any;\n  linkDialogX: any;\n  enableRichText: boolean;\n  hostElementRef: any;\n  updateFormatStateFromEditor: () => void;\n  announceFormatStateChange: (name: string, enabled: boolean) => void;\n  richTextFormatState: () => any;\n}\n\nexport function handleLinkDialogSaveImpl(ctx: LinkHandlerContext, linkData: LinkData): void {\n  if (ctx.customRichTextEditor) {\n    if (ctx.savedLinkSelection) {\n      ctx.customRichTextEditor.restoreSelection(ctx.savedLinkSelection);\n      ctx.savedLinkSelection = null;\n    }\n    ctx.richTextEditorService.setLink(ctx.customRichTextEditor, linkData.url, linkData.text);\n    ctx.updateFormatStateFromEditor();\n    const formatName = CometChatLocalize.getLocalizedString('message_composer_link');\n    const isActive = ctx.richTextFormatState().link;\n    ctx.announceFormatStateChange(formatName, isActive);\n    ctx.customRichTextEditor.focus();\n  }\n  ctx.isLinkDialogOpen.set(false);\n}\n\nexport function handleLinkDialogRemoveImpl(ctx: LinkHandlerContext): void {\n  if (ctx.customRichTextEditor) {\n    if (ctx.savedLinkSelection) {\n      ctx.customRichTextEditor.restoreSelection(ctx.savedLinkSelection);\n      ctx.savedLinkSelection = null;\n    }\n    ctx.richTextEditorService.setLink(ctx.customRichTextEditor, null);\n    ctx.updateFormatStateFromEditor();\n    const formatName = CometChatLocalize.getLocalizedString('message_composer_link');\n    ctx.announceFormatStateChange(formatName, false);\n    ctx.customRichTextEditor.focus();\n  }\n  ctx.isLinkDialogOpen.set(false);\n}\n\nexport function handleLinkDialogCancelImpl(ctx: LinkHandlerContext): void {\n  ctx.isLinkDialogOpen.set(false);\n  ctx.savedLinkSelection = null;\n  if (ctx.customRichTextEditor) { ctx.customRichTextEditor.focus(); }\n}\n\nexport function handleLinkClickImpl(ctx: LinkHandlerContext, url: string, text: string, x: number, y: number): void {\n  if (ctx.enableRichText) {\n    if (ctx.customRichTextEditor) { ctx.savedLinkSelection = ctx.customRichTextEditor.saveSelection(); }\n    ctx.linkPopoverUrl.set(url);\n    ctx.linkPopoverText.set(text);\n    ctx.linkPopoverX.set(x);\n    ctx.linkPopoverY.set(y);\n    ctx.isLinkPopoverOpen.set(true);\n  }\n}\n\nexport function handleLinkPopoverEditImpl(ctx: LinkHandlerContext, data: { url: string; text: string }): void {\n  const x = ctx.linkPopoverX();\n  ctx.isLinkPopoverOpen.set(false);\n  const left = computeLinkDialogLeftImpl(ctx, x);\n  ctx.linkDialogMode.set('edit');\n  ctx.linkDialogInitialText.set(data.text);\n  ctx.linkDialogInitialUrl.set(data.url);\n  ctx.linkDialogX.set(left);\n  ctx.isLinkDialogOpen.set(true);\n}\n\nexport function handleLinkPopoverRemoveImpl(ctx: LinkHandlerContext): void {\n  ctx.isLinkPopoverOpen.set(false);\n  if (ctx.customRichTextEditor) {\n    if (ctx.savedLinkSelection) {\n      ctx.customRichTextEditor.focus();\n      ctx.customRichTextEditor.restoreSelection(ctx.savedLinkSelection);\n      ctx.savedLinkSelection = null;\n    }\n    ctx.richTextEditorService.setLink(ctx.customRichTextEditor, null);\n    ctx.updateFormatStateFromEditor();\n    const formatName = CometChatLocalize.getLocalizedString('message_composer_link');\n    ctx.announceFormatStateChange(formatName, false);\n    ctx.customRichTextEditor.focus();\n  }\n}\n\nexport function handleLinkPopoverCloseImpl(ctx: LinkHandlerContext): void {\n  ctx.isLinkPopoverOpen.set(false);\n  ctx.savedLinkSelection = null;\n  if (ctx.customRichTextEditor) { ctx.customRichTextEditor.focus(); }\n}\n\nexport function computeLinkDialogLeftImpl(ctx: LinkHandlerContext, viewportX: number): number {\n  const hostEl = ctx.hostElementRef.nativeElement as HTMLElement;\n  const composerDiv = hostEl.querySelector('.cometchat-message-composer') as HTMLElement;\n  const parent = composerDiv || hostEl;\n  const parentRect = parent.getBoundingClientRect();\n  let left = viewportX - parentRect.left;\n  const dialogWidth = 400;\n  if (left + dialogWidth > parentRect.width) { left = parentRect.width - dialogWidth; }\n  if (left < 0) { left = 0; }\n  return left;\n}\n","/**\n * Keyboard handler functions for CometChatMessageComposer.\n * Extracted to reduce component file size.\n */\n\nimport { EnterKeyBehavior } from '../../Enums/Enums';\nimport { MentionSuggestion } from '../../services/message-composer.service';\n\nexport interface KeyboardHandlerContext {\n  enableRichText: boolean;\n  enterKeyBehavior: EnterKeyBehavior;\n  isMentionSuggestionsOpen: () => boolean;\n  mentionSuggestions: () => MentionSuggestion[];\n  focusedMentionIndex: any;\n  isAnyPopupOpen: () => boolean;\n  isInQuotedReplyMode: () => boolean;\n  isInEditMode: () => boolean;\n  isBubbleMenuVisible: () => boolean;\n  isFixedToolbarManuallyToggled: () => boolean;\n  isFixedToolbarShown: () => boolean;\n  customRichTextEditor: any;\n  richTextEditorService: any;\n  handleSend: () => void;\n  handleClosePreview: () => void;\n  closeAllPopups: () => void;\n  closeBubbleMenu: () => void;\n  handleFormattingShortcuts: (event: KeyboardEvent) => boolean;\n  handleToolbarBold: () => void;\n  handleToolbarItalic: () => void;\n  handleToolbarUnderline: () => void;\n  selectMentionSuggestion: (s: MentionSuggestion) => void;\n  announceFocusedMention: (name: string, pos: number, total: number) => void;\n  forwardKeyEventToFormatters: (event: KeyboardEvent, type: 'keydown' | 'keyup') => void;\n  updateFormatterCaretPosition: () => void;\n  cdr: any;\n}\n\nexport function handleKeydownImpl(ctx: KeyboardHandlerContext, event: KeyboardEvent): void {\n  if (event.key === 'Escape') {\n    if (ctx.isAnyPopupOpen()) { ctx.closeAllPopups(); return; }\n    if (ctx.isInQuotedReplyMode() || ctx.isInEditMode()) { event.preventDefault(); ctx.handleClosePreview(); return; }\n    return;\n  }\n  if (ctx.enableRichText && ctx.handleFormattingShortcuts(event)) { return; }\n  if (event.key === 'Tab') {\n    if (ctx.isMentionSuggestionsOpen()) {\n      const suggestions = ctx.mentionSuggestions();\n      const currentIndex = ctx.focusedMentionIndex();\n      if (suggestions.length > 0 && currentIndex >= 0 && currentIndex < suggestions.length) {\n        event.preventDefault();\n        ctx.selectMentionSuggestion(suggestions[currentIndex]);\n      }\n      return;\n    }\n    return;\n  }\n  if (ctx.isMentionSuggestionsOpen()) {\n    const suggestions = ctx.mentionSuggestions();\n    const currentIndex = ctx.focusedMentionIndex();\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault();\n        if (suggestions.length > 0) {\n          const newIndex = (currentIndex + 1) % suggestions.length;\n          ctx.focusedMentionIndex.set(newIndex);\n          ctx.announceFocusedMention(suggestions[newIndex].name, newIndex + 1, suggestions.length);\n        }\n        return;\n      case 'ArrowUp':\n        event.preventDefault();\n        if (suggestions.length > 0) {\n          const newIndex = (currentIndex - 1 + suggestions.length) % suggestions.length;\n          ctx.focusedMentionIndex.set(newIndex);\n          ctx.announceFocusedMention(suggestions[newIndex].name, newIndex + 1, suggestions.length);\n        }\n        return;\n      case 'Enter':\n        if (suggestions.length > 0 && currentIndex >= 0 && currentIndex < suggestions.length) {\n          event.preventDefault();\n          ctx.selectMentionSuggestion(suggestions[currentIndex]);\n        }\n        return;\n    }\n  }\n  if (event.key === 'Enter') {\n    if (event.shiftKey) { return; }\n    if (ctx.enterKeyBehavior === EnterKeyBehavior.SendMessage) { event.preventDefault(); ctx.handleSend(); }\n  }\n  ctx.forwardKeyEventToFormatters(event, 'keydown');\n  ctx.updateFormatterCaretPosition();\n}\n\nexport function handleKeyupImpl(ctx: KeyboardHandlerContext, event: KeyboardEvent): void {\n  ctx.forwardKeyEventToFormatters(event, 'keyup');\n  ctx.updateFormatterCaretPosition();\n}\n\nexport function handleFormattingShortcutsImpl(ctx: KeyboardHandlerContext, event: KeyboardEvent): boolean {\n  const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;\n  const modifierKey = isMac ? event.metaKey : event.ctrlKey;\n  if (!modifierKey) { return false; }\n  switch (event.key.toLowerCase()) {\n    case 'b':\n      event.preventDefault(); event.stopPropagation();\n      ctx.handleToolbarBold();\n      return true;\n    case 'i':\n      event.preventDefault(); event.stopPropagation();\n      ctx.handleToolbarItalic();\n      return true;\n    case 'u':\n      event.preventDefault(); event.stopPropagation();\n      ctx.handleToolbarUnderline();\n      return true;\n    default:\n      return false;\n  }\n}\n\nexport function handleGlobalEscapeKeyImpl(ctx: KeyboardHandlerContext, event: Event): void {\n  if (ctx.isBubbleMenuVisible()) {\n    event.preventDefault(); event.stopPropagation();\n    ctx.closeBubbleMenu();\n    return;\n  }\n  if (ctx.isFixedToolbarManuallyToggled() && ctx.isFixedToolbarShown()) {\n    event.preventDefault(); event.stopPropagation();\n    // isFixedToolbarShown and isFixedToolbarManuallyToggled are writable signals on the component\n    (ctx as any).isFixedToolbarShown.set(false);\n    (ctx as any).isFixedToolbarManuallyToggled.set(false);\n    ctx.cdr.markForCheck();\n    return;\n  }\n  if (ctx.isAnyPopupOpen()) {\n    event.preventDefault(); event.stopPropagation();\n    ctx.closeAllPopups();\n  }\n}\n\nexport function handleRichTextKeydownImpl(ctx: KeyboardHandlerContext, event: KeyboardEvent): void {\n  if (event.key === 'Escape') {\n    if (ctx.isAnyPopupOpen()) { ctx.closeAllPopups(); return; }\n    if (ctx.isInQuotedReplyMode() || ctx.isInEditMode()) { event.preventDefault(); ctx.handleClosePreview(); return; }\n    return;\n  }\n  if (ctx.enableRichText && ctx.handleFormattingShortcuts(event)) { return; }\n  if (event.key === 'Tab') {\n    if (ctx.isMentionSuggestionsOpen()) {\n      const suggestions = ctx.mentionSuggestions();\n      const currentIndex = ctx.focusedMentionIndex();\n      if (suggestions.length > 0 && currentIndex >= 0 && currentIndex < suggestions.length) {\n        event.preventDefault(); event.stopPropagation();\n        ctx.selectMentionSuggestion(suggestions[currentIndex]);\n      }\n      return;\n    }\n    if (ctx.customRichTextEditor && ctx.richTextEditorService.isInList(ctx.customRichTextEditor)) { return; }\n    event.stopPropagation();\n    return;\n  }\n  if (ctx.isMentionSuggestionsOpen()) {\n    const suggestions = ctx.mentionSuggestions();\n    const currentIndex = ctx.focusedMentionIndex();\n    switch (event.key) {\n      case 'ArrowDown':\n        event.preventDefault(); event.stopPropagation();\n        if (suggestions.length > 0) {\n          const newIndex = (currentIndex + 1) % suggestions.length;\n          ctx.focusedMentionIndex.set(newIndex);\n          ctx.announceFocusedMention(suggestions[newIndex].name, newIndex + 1, suggestions.length);\n        }\n        return;\n      case 'ArrowUp':\n        event.preventDefault(); event.stopPropagation();\n        if (suggestions.length > 0) {\n          const newIndex = (currentIndex - 1 + suggestions.length) % suggestions.length;\n          ctx.focusedMentionIndex.set(newIndex);\n          ctx.announceFocusedMention(suggestions[newIndex].name, newIndex + 1, suggestions.length);\n        }\n        return;\n      case 'Enter':\n        if (suggestions.length > 0 && currentIndex >= 0 && currentIndex < suggestions.length) {\n          event.preventDefault(); event.stopPropagation();\n          ctx.selectMentionSuggestion(suggestions[currentIndex]);\n        }\n        return;\n    }\n  }\n  if (event.key === 'Enter' && !event.shiftKey) {\n    if (ctx.enterKeyBehavior === EnterKeyBehavior.SendMessage) {\n      event.preventDefault(); event.stopPropagation();\n      ctx.handleSend();\n    }\n  }\n  // Shift+Enter in a list → let the RTE's handleKeyDown create the next\n  // list item (it handles both Enter and Shift+Enter for lists). We must\n  // NOT consume the event here so it reaches the RTE handler.\n  if (event.key === 'Enter' && event.shiftKey) {\n    if (ctx.customRichTextEditor && ctx.richTextEditorService.isInList(ctx.customRichTextEditor)) {\n      // Don't stop propagation — let the RTE handle list item creation.\n      return;\n    }\n  }\n}\n","/**\n * Typing indicator handler functions for CometChatMessageComposer.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nexport interface TypingHandlerContext {\n  disableTypingEvents: boolean;\n  typingTimeout: ReturnType<typeof setTimeout> | undefined;\n  currentUser: () => CometChat.User | null;\n  currentGroup: () => CometChat.Group | null;\n  messageComposerService: any;\n  TYPING_TIMEOUT_MS: number;\n  endTypingIndicator: () => void;\n}\n\nexport function handleTypingStartImpl(ctx: TypingHandlerContext): void {\n  if (ctx.disableTypingEvents) { return; }\n  const receiver = getReceiverImpl(ctx);\n  if (!receiver) { return; }\n  if (ctx.currentUser()?.getBlockedByMe() || ctx.currentUser()?.getHasBlockedMe()) { return; }\n  if (ctx.typingTimeout) {\n    clearTimeout(ctx.typingTimeout);\n    (ctx as any).typingTimeout = undefined;\n  } else {\n    startTypingImpl(ctx);\n  }\n  (ctx as any).typingTimeout = setTimeout(() => {\n    ctx.endTypingIndicator();\n    (ctx as any).typingTimeout = undefined;\n  }, ctx.TYPING_TIMEOUT_MS);\n}\n\nexport function startTypingImpl(ctx: TypingHandlerContext): void {\n  const receiver = getReceiverImpl(ctx);\n  if (receiver) { ctx.messageComposerService.startTyping(receiver); }\n}\n\nexport function endTypingIndicatorImpl(ctx: TypingHandlerContext): void {\n  const receiver = getReceiverImpl(ctx);\n  if (receiver) { ctx.messageComposerService.endTyping(receiver); }\n}\n\nfunction getReceiverImpl(ctx: TypingHandlerContext): CometChat.User | CometChat.Group | undefined {\n  return ctx.currentUser() ?? ctx.currentGroup() ?? undefined;\n}\n","/**\n * Toolbar action handler functions for CometChatMessageComposer.\n * Extracted to reduce component file size.\n */\n\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { RichTextFormatState } from '../../services/rich-text-editor.interfaces';\n\nexport interface ToolbarHandlerContext {\n  enableRichText: boolean;\n  customRichTextEditor: any;\n  richTextEditorService: any;\n  richTextFormatState: () => RichTextFormatState;\n  richTextFormatStateSignal: any; // = richTextFormatState signal (writable)\n  showBubbleMenuOnSelection: boolean;\n  isMobileView: () => boolean;\n  shouldShowToolbar: () => boolean;\n  isFixedToolbarShown: () => boolean;\n  isFixedToolbarManuallyToggled: () => boolean;\n  isMouseDown: boolean;\n  bubbleMenuDebounceTimer: ReturnType<typeof setTimeout> | null;\n  bubbleMenuElementRef: any;\n  textSelection: any;\n  isBubbleMenuVisible: any;\n  bubbleMenuPosition: any;\n  isFixedToolbarShownSignal: any; // = isFixedToolbarShown signal (writable)\n  isFixedToolbarManuallyToggledSignal: any; // = isFixedToolbarManuallyToggled signal (writable)\n  savedLinkSelection: any;\n  isLinkDialogOpen: any;\n  linkDialogMode: any;\n  linkDialogInitialText: any;\n  linkDialogInitialUrl: any;\n  linkDialogX: any;\n  hostElementRef: any;\n  cdr: any;\n  updateFormatStateFromEditor: () => void;\n  announceFormatStateChange: (name: string, enabled: boolean) => void;\n  computeLinkDialogLeft: (x: number) => number;\n}\n\nexport function handleToolbarBoldImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().bold;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleBold(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_bold'), !wasActive);\n}\n\nexport function handleToolbarItalicImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().italic;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleItalic(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_italic'), !wasActive);\n}\n\nexport function handleToolbarUnderlineImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().underline;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleUnderline(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_underline'), !wasActive);\n}\n\nexport function handleToolbarStrikethroughImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().strikethrough;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleStrikethrough(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_strikethrough'), !wasActive);\n}\n\nexport function handleToolbarInlineCodeImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().code;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleCode(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_inline_code'), !wasActive);\n}\n\nexport function handleToolbarLinkImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText || !ctx.customRichTextEditor) return;\n  ctx.savedLinkSelection = ctx.customRichTextEditor.saveSelection();\n  let viewportX = 0;\n  const sel = window.getSelection();\n  if (sel && sel.rangeCount > 0) { const rect = sel.getRangeAt(0).getBoundingClientRect(); viewportX = rect.left; }\n  const left = ctx.computeLinkDialogLeft(viewportX);\n  const wasActive = ctx.richTextFormatState().link;\n  if (wasActive) {\n    const url = ctx.customRichTextEditor.getCurrentLink();\n    const text = ctx.customRichTextEditor.getCurrentLinkText();\n    ctx.linkDialogMode.set('edit');\n    ctx.linkDialogInitialText.set(text || '');\n    ctx.linkDialogInitialUrl.set(url || '');\n    ctx.linkDialogX.set(left);\n    ctx.isLinkDialogOpen.set(true);\n  } else {\n    const selectedText = ctx.customRichTextEditor.getSelectedText();\n    ctx.linkDialogMode.set('add');\n    ctx.linkDialogInitialText.set(selectedText);\n    ctx.linkDialogInitialUrl.set('');\n    ctx.linkDialogX.set(left);\n    ctx.isLinkDialogOpen.set(true);\n  }\n}\n\nexport function handleToolbarOrderedListImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().orderedList;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleOrderedList(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_ordered_list'), !wasActive);\n}\n\nexport function handleToolbarBulletListImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().bulletList;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleBulletList(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_bullet_list'), !wasActive);\n}\n\nexport function handleToolbarCodeBlockImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().codeBlock;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleCodeBlock(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_code_block'), !wasActive);\n}\n\nexport function handleToolbarBlockquoteImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  const wasActive = ctx.richTextFormatState().blockquote;\n  if (ctx.customRichTextEditor) ctx.richTextEditorService.toggleBlockquote(ctx.customRichTextEditor);\n  ctx.updateFormatStateFromEditor();\n  ctx.announceFormatStateChange(CometChatLocalize.getLocalizedString('message_composer_blockquote'), !wasActive);\n}\n\nexport function handleSelectionUpdateImpl(ctx: ToolbarHandlerContext, formatState: RichTextFormatState): void {\n  // richTextFormatState IS the writable signal on the component\n  (ctx as any).richTextFormatState.set(formatState);\n  if (!ctx.showBubbleMenuOnSelection || !ctx.enableRichText || !ctx.customRichTextEditor) return;\n  const selection = ctx.customRichTextEditor.getSelection();\n  if (ctx.bubbleMenuDebounceTimer) { clearTimeout(ctx.bubbleMenuDebounceTimer); (ctx as any).bubbleMenuDebounceTimer = null; }\n  const isFixedToolbarActive = ctx.shouldShowToolbar();\n  if (selection && !selection.isCollapsed && selection.toString().trim().length > 0 && !isFixedToolbarActive) {\n    const range = selection.getRangeAt(0);\n    const startOffset = getTextOffsetFromNodeImpl(ctx.customRichTextEditor.getElement(), range.startContainer, range.startOffset);\n    const endOffset = getTextOffsetFromNodeImpl(ctx.customRichTextEditor.getElement(), range.endContainer, range.endOffset);\n    ctx.textSelection.set({ from: startOffset, to: endOffset });\n    if (!ctx.isMouseDown) {\n      (ctx as any).bubbleMenuDebounceTimer = setTimeout(() => {\n        const currentSelection = ctx.customRichTextEditor?.getSelection();\n        const isStillFixedToolbarActive = ctx.shouldShowToolbar();\n        if (currentSelection && !currentSelection.isCollapsed && currentSelection.toString().trim().length > 0 && !isStillFixedToolbarActive) {\n          if (ctx.isMobileView()) {\n            // isFixedToolbarShown IS the writable signal\n            (ctx as any).isFixedToolbarShown.set(true);\n          } else {\n            ctx.isBubbleMenuVisible.set(true);\n            const currentRange = currentSelection.getRangeAt(0);\n            updateBubbleMenuPositionImpl(ctx, currentRange);\n          }\n          ctx.cdr.markForCheck();\n        }\n      }, 100);\n    }\n  } else {\n    ctx.isBubbleMenuVisible.set(false);\n    ctx.textSelection.set(null);\n    ctx.bubbleMenuPosition.set(null);\n    if (ctx.isMobileView() && !ctx.isFixedToolbarManuallyToggled()) {\n      const hasSelection = selection && !selection.isCollapsed && selection.toString().trim().length > 0;\n      if (!hasSelection) { (ctx as any).isFixedToolbarShown.set(false); }\n    }\n    ctx.cdr.markForCheck();\n  }\n}\n\nexport function updateBubbleMenuPositionImpl(ctx: ToolbarHandlerContext, range: Range): void {\n  try {\n    const rects = range.getClientRects();\n    if (rects.length === 0) return;\n    let rect = rects[0];\n    const editorElement = ctx.customRichTextEditor?.getElement();\n    if (!editorElement) return;\n    const editorRect = editorElement.getBoundingClientRect();\n    const composerElement = editorElement.closest('.cometchat-message-composer') as HTMLElement;\n    const composerRect = composerElement ? composerElement.getBoundingClientRect() : editorRect;\n    for (let i = 0; i < rects.length; i++) {\n      const r = rects[i];\n      if (r.top >= editorRect.top - 10 && r.bottom <= editorRect.bottom + 10) { rect = r; break; }\n      if (r.top < editorRect.top && r.bottom > editorRect.top) { rect = r; break; }\n    }\n    if (rect.top < editorRect.top) { rect = new DOMRect(rect.left, editorRect.top, rect.width, rect.height); }\n    let bubbleMenuWidth = 500;\n    const bubbleMenuElement = ctx.bubbleMenuElementRef?.nativeElement;\n    if (bubbleMenuElement) {\n      requestAnimationFrame(() => {\n        const actualWidth = bubbleMenuElement.offsetWidth;\n        if (actualWidth > 0) { bubbleMenuWidth = actualWidth; calculateAndSetPositionImpl(ctx, rect, editorRect, composerRect, bubbleMenuWidth); }\n      });\n    }\n    calculateAndSetPositionImpl(ctx, rect, editorRect, composerRect, bubbleMenuWidth);\n  } catch (error) {\n    CometChatLogger.warn('CometChatMessageComposer', 'Error calculating bubble menu position:', error);\n  }\n}\n\nexport function calculateAndSetPositionImpl(ctx: ToolbarHandlerContext, rect: DOMRect, editorRect: DOMRect, composerRect: DOMRect, bubbleMenuWidth: number): void {\n  const bubbleMenuHeight = 44;\n  const verticalGap = 8;\n  let top = rect.top - bubbleMenuHeight - verticalGap;\n  let left = rect.left;\n  const selectionWidth = rect.width;\n  const centerOffset = (selectionWidth - bubbleMenuWidth) / 2;\n  left = left + centerOffset;\n  const minLeft = composerRect.left + 8;\n  const maxLeft = composerRect.right - bubbleMenuWidth - 8;\n  if (left < minLeft) { left = minLeft; }\n  if (left > maxLeft && maxLeft > minLeft) { left = maxLeft; }\n  const minTop = 8;\n  if (top < minTop) { top = minTop; }\n  ctx.bubbleMenuPosition.set({ top, left });\n  ctx.cdr.markForCheck();\n}\n\nexport function getTextOffsetFromNodeImpl(root: HTMLElement, node: Node, offset: number): number {\n  let textOffset = 0;\n  const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n  let currentNode: Node | null;\n  while ((currentNode = walker.nextNode())) {\n    if (currentNode === node) return textOffset + offset;\n    textOffset += currentNode.textContent?.length || 0;\n  }\n  return textOffset;\n}\n\nexport function updateFormatStateFromEditorImpl(ctx: ToolbarHandlerContext): void {\n  if (!ctx.enableRichText) return;\n  let formatState: RichTextFormatState | undefined;\n  if (ctx.customRichTextEditor) { formatState = ctx.richTextEditorService.getFormatState(ctx.customRichTextEditor); }\n  // richTextFormatState IS the writable signal on the component\n  if (formatState) { (ctx as any).richTextFormatState.set(formatState); }\n}\n","import {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChatUIEvents, IMentionsCountWarning} from '../../events/CometChatUIEvents';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\n\nexport function subscribeToActivePopoverEventImpl(ctx: any): void {\n  CometChatUIEvents.ccActivePopover.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((id: string) => {\n    if (ctx.contentToDisplay() !== 'none' && ctx.contentToDisplay() !== id) {\n      ctx.contentToDisplay.set('none');\n      ctx.syncLegacyPopoverSignals();\n    }\n  });\n}\n\nexport function subscribeToReplyToMessageEventImpl(ctx: any): void {\n  CometChatMessageEvents.ccReplyToMessage.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: any) => {\n    // ENG-35025: Scope reply events to the correct composer instance.\n    // A thread composer has a parentMessageId; the main composer does not.\n    // Only handle the event if the parentMessageId context matches.\n    const eventParentId = data.parentMessageId ?? null;\n    const composerParentId = ctx.parentMessageId ?? null;\n    if (eventParentId !== composerParentId) {\n      return;\n    }\n    if (data.status === MessageStatus.inprogress) {\n      ctx.enterReplyMode(data.message);\n    } else if (data.status === MessageStatus.success || data.status === MessageStatus.cancelled) {\n      ctx.exitReplyMode();\n    }\n  });\n}\n\nexport function subscribeToMessageEditedEventImpl(ctx: any): void {\n  CometChatMessageEvents.ccMessageEdited.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: any) => {\n    const eventParentId = data.parentMessageId;\n    const composerParentId = ctx.parentMessageId;\n    if (composerParentId) {\n      if (!eventParentId || eventParentId !== composerParentId) {\n        return;\n      }\n    } else {\n      if (eventParentId) {\n        return;\n      }\n    }\n    if (data.status === MessageStatus.inprogress) {\n      ctx.enterEditMode(data.message);\n    } else if (data.status === MessageStatus.success || data.status === MessageStatus.cancelled) {\n      ctx.exitEditModeWithoutEvent();\n    }\n  });\n}\n\nexport function subscribeToMessageDeletedEventImpl(ctx: any): void {\n  CometChatMessageEvents.ccMessageDeleted.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(\n    (message: any) => {\n      if (ctx.messageToEdit && ctx.messageToEdit.getId() === message.getId()) {\n        ctx.exitEditModeWithoutEvent();\n      }\n    }\n  );\n}\n\nexport function subscribeToComposeMessageEventImpl(ctx: any): void {\n  CometChatUIEvents.ccComposeMessage.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(\n    (text: string) => {\n      ctx.insertTextFromExternalSource(text);\n      ctx.textChange.emit(ctx.composerText());\n      ctx.focusRichTextEditor();\n    }\n  );\n}\n\nexport function subscribeToSdkMessageDeletedEventImpl(ctx: any): void {\n  CometChatMessageEvents.onMessageDeleted.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(\n    (message: any) => {\n      if (ctx.messageToEdit && ctx.messageToEdit.getId() === message.getId()) {\n        ctx.exitEditModeWithoutEvent();\n      }\n      const editingMessage = ctx.textMessageToEdit();\n      if (editingMessage && editingMessage.getId() === message.getId()) {\n        ctx.exitEditModeWithoutEvent();\n      }\n    }\n  );\n}\n\nexport function subscribeToShowModalEventImpl(ctx: any): void {\n  CometChatUIEvents.ccShowModal.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: any) => {\n    const { composerId } = data;\n    const parentMessageId = ctx.parentMessageId;\n    const userId = ctx.currentUser()?.getUid();\n    const groupId = ctx.currentGroup()?.getGuid();\n    if (composerId) {\n      if (\n        (composerId.parentMessageId &&\n          parentMessageId &&\n          composerId.parentMessageId === parentMessageId) ||\n        (!parentMessageId && (composerId.user === userId || composerId.group === groupId)) ||\n        (!composerId.parentMessageId && !composerId.user && !composerId.group)\n      ) {\n        ctx.openPollModal();\n      }\n    } else {\n      ctx.openPollModal();\n    }\n  });\n}\n\nexport function subscribeToHideModalEventImpl(ctx: any): void {\n  CometChatUIEvents.ccHideModal.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(() => {\n    ctx.closePollModal();\n  });\n}\n\nexport function subscribeToShowMentionsCountWarningEventImpl(ctx: any): void {\n  CometChatUIEvents.ccShowMentionsCountWarning.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IMentionsCountWarning) => {\n    const formatter = ctx.mentionsFormatter();\n    if (data.id && formatter && data.id !== formatter.id) {\n      return;\n    }\n    ctx.showMentionsCountWarning.set(data.showWarning);\n  });\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatMentionsFormatter} from '../../formatters/cometchat-mentions-formatter';\nimport {CometChatUIKit} from '../../cometchat-uikit';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {getMediaCaption, isMediaMessage} from '../../utils/message-metadata-utils';\nimport {convertInlineMarkdownToHtml} from '../../utils/inline-markdown';\n\nexport function enterEditModeImpl(ctx: any, message: CometChat.TextMessage | CometChat.MediaMessage): void {\n  if (ctx._enteringEditMode) { return; }\n  ctx._enteringEditMode = true;\n  try {\n    if (ctx.messageToReplySignal()) {\n      ctx.exitReplyMode();\n    }\n    ctx.originalTextBeforeEdit = ctx.composerText();\n    ctx.textMessageToEdit.set(message);\n    ctx.isEditMode.set(true);\n    // A media message is edited through its CAPTION; a text message through its text.\n    const isMedia = isMediaMessage(message);\n    const messageText = isMedia\n      ? getMediaCaption(message)\n      : (message as CometChat.TextMessage).getText?.() || '';\n    ctx.composerText.set(messageText);\n    if (ctx.customRichTextEditor) {\n      // A caption carries the same markdown a text body does, so it needs the same markdown → rich\n      // nodes conversion. `setContent` writes the string in verbatim, which surfaced the raw `**`.\n      // getText() is absent on a MediaMessage, hence passing the caption as rawText.\n      if (ctx.enableRichText) {\n        populateEditorWithFormattedTextImpl(\n          ctx,\n          message as CometChat.TextMessage,\n          isMedia ? messageText : undefined,\n        );\n      } else {\n        ctx.richTextEditorService.setContent(ctx.customRichTextEditor, messageText);\n      }\n    }\n    ctx.textChange.emit(messageText);\n    CometChatMessageEvents.ccMessageEdited.next({\n      message: message,\n      status: MessageStatus.inprogress,\n      parentMessageId: ctx.parentMessageId ?? null,\n    });\n    ctx.announceEditModeActivated();\n    if (ctx.customRichTextEditor) {\n      ctx.focusRichTextEditor();\n    } else {\n      ctx.focusTextInput();\n    }\n  } finally {\n    ctx._enteringEditMode = false;\n  }\n}\n\n/** @param rawText overrides `message.getText()` — pass a media message's CAPTION here. */\nexport function populateEditorWithFormattedTextImpl(ctx: any, message: CometChat.TextMessage, rawText?: string): void {\n  if (!ctx.customRichTextEditor) { return; }\n  const messageText = (rawText === undefined ? message.getText?.() : rawText) || '';\n  const mentionedUsers = message.getMentionedUsers?.() || [];\n  ctx.richTextEditorService.setContentWithMentions(\n    ctx.customRichTextEditor,\n    messageText,\n    mentionedUsers\n  );\n  if (mentionedUsers.length > 0 && !ctx.disableMentions) {\n    // mentions are preserved in the rich text editor as mention nodes\n  }\n}\n\nexport function cancelEditImpl(ctx: any): void {\n  const editMessage = ctx.messageToEdit || ctx.textMessageToEdit();\n  if (editMessage) {\n    CometChatMessageEvents.ccMessageEdited.next({\n      message: editMessage,\n      status: MessageStatus.cancelled,\n      parentMessageId: ctx.parentMessageId ?? null,\n    });\n  }\n  ctx.textMessageToEdit.set(null);\n  ctx.isEditMode.set(false);\n  if (ctx.originalTextBeforeEdit !== undefined) {\n    ctx.composerText.set(ctx.originalTextBeforeEdit);\n    if (ctx.customRichTextEditor && ctx.enableRichText) {\n      ctx.richTextEditorService.setContent(ctx.customRichTextEditor, ctx.originalTextBeforeEdit);\n    }\n    ctx.textChange.emit(ctx.originalTextBeforeEdit);\n    ctx.originalTextBeforeEdit = '';\n  }\n  ctx.closePreview.emit();\n}\n\nexport function exitEditModeWithoutEventImpl(ctx: any): void {\n  ctx.textMessageToEdit.set(null);\n  ctx.isEditMode.set(false);\n  if (ctx.originalTextBeforeEdit !== undefined) {\n    ctx.composerText.set(ctx.originalTextBeforeEdit);\n    if (ctx.customRichTextEditor && ctx.enableRichText) {\n      ctx.richTextEditorService.setContent(ctx.customRichTextEditor, ctx.originalTextBeforeEdit);\n    }\n    ctx.textChange.emit(ctx.originalTextBeforeEdit);\n    ctx.originalTextBeforeEdit = '';\n  }\n}\n\n/**\n * @param rawText overrides `message.getText()` — pass a media message's CAPTION here. When given,\n *   the `metadata.richText` shortcut is skipped: that pre-rendered HTML describes the message BODY,\n *   and substituting it for a caption would show the wrong text.\n */\nexport function formatReplyPreviewTextImpl(ctx: any, message: CometChat.TextMessage, rawText?: string): string {\n  const isMessageBody = rawText === undefined;\n  const text = (isMessageBody ? message.getText?.() : rawText) || '';\n  if (!text) { return ''; }\n  if (isMessageBody) {\n    try {\n      const metadata = message.getMetadata?.() as Record<string, any> | undefined;\n      const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n      if (richText?.html && richText?.hasFormatting) {\n        const sanitized = ctx.htmlSanitizerService.sanitize(richText.html);\n        if (sanitized) return flattenListsForPreview(sanitized);\n      }\n    } catch { /* ignore */ }\n  }\n  const loggedInUser = CometChatUIKit.getLoggedInUser();\n  const formatters = ctx.formatterConfigService.getFormattersWithContext(\n    loggedInUser || undefined,\n    undefined\n  );\n  const mentionedUsers = message.getMentionedUsers?.() || [];\n  const escapedText = ctx.htmlSanitizerService.escapeUserHtml(text);\n  let formattedText = convertMarkdownToHtmlImpl(escapedText);\n  for (const formatter of formatters) {\n    formatter.reset();\n    if (!formatter.shouldFormat(formattedText, message)) { continue; }\n    if (formatter instanceof CometChatMentionsFormatter) {\n      if (formatter.hasSdkMentions(formattedText)) {\n        formattedText = formatter.formatSdkMentions(formattedText, mentionedUsers);\n      } else {\n        formattedText = formatter.format(formattedText);\n      }\n    } else {\n      formattedText = formatter.format(formattedText);\n    }\n  }\n  const sanitized = ctx.htmlSanitizerService.sanitize(formattedText);\n  return flattenListsForPreview(sanitized);\n}\n\n/**\n * Replaces <ol>/<ul>/<li> with inline text representations for single-line previews.\n * Ordered list items get \"1. \", \"2. \" prefixes; unordered get \"• \" prefix.\n */\nfunction flattenListsForPreview(html: string): string {\n  if (!html || (!html.includes('<ol') && !html.includes('<ul'))) return html;\n  const tempDiv = document.createElement('div');\n  tempDiv.innerHTML = html;\n  const ols = tempDiv.querySelectorAll('ol');\n  ols.forEach(ol => {\n    const items = ol.querySelectorAll(':scope > li');\n    items.forEach((li, idx) => {\n      const span = document.createElement('span');\n      span.innerHTML = `${idx + 1}. ${li.innerHTML} `;\n      li.replaceWith(span);\n    });\n    const span = document.createElement('span');\n    span.innerHTML = ol.innerHTML;\n    ol.replaceWith(span);\n  });\n  const uls = tempDiv.querySelectorAll('ul');\n  uls.forEach(ul => {\n    const items = ul.querySelectorAll(':scope > li');\n    items.forEach(li => {\n      const span = document.createElement('span');\n      span.innerHTML = `\\u2022 ${li.innerHTML} `;\n      li.replaceWith(span);\n    });\n    const span = document.createElement('span');\n    span.innerHTML = ul.innerHTML;\n    ul.replaceWith(span);\n  });\n  return tempDiv.innerHTML;\n}\n\n/** @param rawText overrides `message.getText()` — see {@link formatReplyPreviewTextImpl}. */\nexport function formatEditPreviewTextImpl(ctx: any, message: CometChat.TextMessage, rawText?: string): string {\n  const isMessageBody = rawText === undefined;\n  const text = (isMessageBody ? message.getText?.() : rawText) || '';\n  if (!text) { return ''; }\n  if (isMessageBody) {\n    try {\n      const metadata = message.getMetadata?.() as Record<string, any> | undefined;\n      const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n      if (richText?.html && richText?.hasFormatting) {\n        const sanitized = ctx.htmlSanitizerService.sanitize(richText.html);\n        if (sanitized) return sanitized;\n      }\n    } catch { /* ignore */ }\n  }\n  const loggedInUser = CometChatUIKit.getLoggedInUser();\n  const formatters = ctx.formatterConfigService.getFormattersWithContext(\n    loggedInUser || undefined,\n    undefined\n  );\n  const mentionedUsers = message.getMentionedUsers?.() || [];\n  const escapedText = ctx.htmlSanitizerService.escapeUserHtml(text);\n  let formattedText = convertMarkdownToHtmlImpl(escapedText);\n  for (const formatter of formatters) {\n    formatter.reset();\n    if (!formatter.shouldFormat(formattedText, message)) { continue; }\n    if (formatter instanceof CometChatMentionsFormatter) {\n      if (formatter.hasSdkMentions(formattedText)) {\n        formattedText = formatter.formatSdkMentions(formattedText, mentionedUsers);\n      } else {\n        formattedText = formatter.format(formattedText);\n      }\n    } else {\n      formattedText = formatter.format(formattedText);\n    }\n  }\n  return ctx.htmlSanitizerService.sanitize(formattedText);\n}\n\nexport function convertMarkdownToHtmlImpl(text: string): string {\n  if (!text) return '';\n  let result = text;\n\n  // Code blocks (``` ... ```) — must come before inline code to avoid double-processing\n  result = result.replace(/```([\\s\\S]*?)```/g, (_match, code: string) => {\n    // The text has already been HTML-escaped by the caller (escapeUserHtml), so\n    // the content inside the fences is safe to wrap directly.\n    // Trim leading/trailing newlines to avoid extra whitespace in the pre block.\n    const trimmedCode = code.replace(/^\\n/, '').replace(/\\n$/, '');\n    return `<pre class=\"cometchat-rich-text__code-block\"><code class=\"cometchat-rich-text__code\">${trimmedCode}</code></pre>`;\n  });\n\n  // Blockquotes — support both raw \">\" and HTML-escaped \"&gt;\" (caller may escape first)\n  result = result.replace(/^(?:&gt;|>) (.+)$/gm, '<blockquote class=\"cometchat-rich-text__blockquote\">$1</blockquote>');\n\n  // Inline code — must come before bold/italic to avoid mangling backtick content\n  result = result.replace(/`([^`]+)`/g, '<code class=\"cometchat-rich-text__code\">$1</code>');\n\n  result = result.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n  result = result.replace(/(?<!\\*)\\*(?!\\*)([^*]+)\\*(?!\\*)/g, '<em>$1</em>');\n  result = result.replace(/__([^_]+)__/g, '<u>$1</u>');\n  result = result.replace(/(?<!_)_(?!_)([^_]+)_(?!_)/g, '<em>$1</em>');\n  result = result.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n  result = result.replace(\n    /\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g,\n    '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\n  );\n  return result;\n}\n","import {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\n\nexport function announcePoliteImpl(ctx: any, message: string): void {\n  ctx.liveRegionPoliteText.set('');\n  setTimeout(() => {\n    ctx.liveRegionPoliteText.set(message);\n  }, 50);\n}\n\nexport function announceAssertiveImpl(ctx: any, message: string): void {\n  ctx.liveRegionAssertiveText.set('');\n  setTimeout(() => {\n    ctx.liveRegionAssertiveText.set(message);\n  }, 50);\n}\n\nexport function announceReplyModeActivatedImpl(ctx: any): void {\n  announcePoliteImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_reply_mode_activated'));\n}\n\nexport function announceEditModeActivatedImpl(ctx: any): void {\n  announcePoliteImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_edit_mode_activated'));\n}\n\nexport function announceRecordingStartedImpl(ctx: any): void {\n  announceAssertiveImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_recording_started'));\n}\n\nexport function announceRecordingStoppedImpl(ctx: any): void {\n  announceAssertiveImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_recording_stopped'));\n}\n\nexport function announceMessageSentImpl(ctx: any): void {\n  announcePoliteImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_message_sent'));\n}\n\nexport function announceAttachmentAddedImpl(ctx: any, fileName: string): void {\n  announcePoliteImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_attachment_added') + ': ' + fileName);\n}\n\nexport function announceAttachmentRemovedImpl(ctx: any, fileName: string): void {\n  announcePoliteImpl(ctx, CometChatLocalize.getLocalizedString('message_composer_attachment_removed') + ': ' + fileName);\n}\n\nexport function announceFocusedMentionImpl(ctx: any, name: string, position: number, total: number): void {\n  const template = CometChatLocalize.getLocalizedString('message_composer_mention_focused');\n  const message = template\n    .replace('{name}', name)\n    .replace('{position}', position.toString())\n    .replace('{total}', total.toString());\n  announcePoliteImpl(ctx, message);\n}\n\nexport function announceMentionSuggestionsCountImpl(ctx: any, count: number): void {\n  const template = CometChatLocalize.getLocalizedString('accessibility_mentions_suggestions');\n  const message = template.replace('{count}', count.toString());\n  ctx.liveAnnouncerService.announce(message, 'polite');\n}\n\nexport function announceMentionInsertedImpl(ctx: any, name: string): void {\n  const template = CometChatLocalize.getLocalizedString('accessibility_mentioned_user');\n  const message = template.replace('{name}', name);\n  ctx.liveAnnouncerService.announce(message, 'polite');\n}\n\nexport function announceFormatStateChangeImpl(ctx: any, formatName: string, enabled: boolean): void {\n  const templateKey = enabled ? 'message_composer_format_enabled' : 'message_composer_format_disabled';\n  const template = CometChatLocalize.getLocalizedString(templateKey);\n  const message = template.replace('{format}', formatName);\n  announcePoliteImpl(ctx, message);\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIEvents} from '../../events/CometChatUIEvents';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKitUtility} from '../../CometChatUIKitUtility';\nimport {CometChatUIKitConstants} from '../../constants';\n\nexport function syncLegacyPopoverSignalsImpl(ctx: any): void {\n  const content = ctx.contentToDisplay();\n  ctx.isEmojiKeyboardOpen.set(content === 'emojiKeyboard');\n  ctx.isAttachmentMenuOpen.set(content === 'attachments');\n  ctx.isRecording.set(content === 'voiceRecording');\n  ctx.isStickersKeyboardOpen.set(content === 'stickers');\n}\n\nexport function toggleEmojiKeyboardImpl(ctx: any): void {\n  if (ctx.contentToDisplay() === 'emojiKeyboard') {\n    ctx.contentToDisplay.set('none');\n  } else {\n    ctx.contentToDisplay.set('emojiKeyboard');\n    CometChatUIEvents.ccActivePopover.next('emojiKeyboard');\n  }\n  syncLegacyPopoverSignalsImpl(ctx);\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n\nexport function toggleAttachmentMenuImpl(ctx: any): void {\n  if (ctx.contentToDisplay() === 'attachments') {\n    ctx.contentToDisplay.set('none');\n  } else {\n    ctx.contentToDisplay.set('attachments');\n    CometChatUIEvents.ccActivePopover.next('attachments');\n  }\n  syncLegacyPopoverSignalsImpl(ctx);\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n\nexport function toggleVoiceRecordingImpl(ctx: any): void {\n  if (ctx.contentToDisplay() === 'voiceRecording') {\n    if (ctx.isRecording()) {\n      ctx.isRecording.set(false);\n      ctx.recordingDuration.set(0);\n      ctx.announceRecordingStopped();\n    }\n    ctx.contentToDisplay.set('none');\n  } else {\n    ctx.contentToDisplay.set('voiceRecording');\n    ctx.isRecording.set(true);\n    ctx.announceRecordingStarted();\n    CometChatUIEvents.ccActivePopover.next('voiceRecording');\n  }\n  syncLegacyPopoverSignalsImpl(ctx);\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n\nexport function toggleStickersKeyboardImpl(ctx: any): void {\n  if (ctx.contentToDisplay() === 'stickers') {\n    ctx.contentToDisplay.set('none');\n  } else {\n    ctx.contentToDisplay.set('stickers');\n    CometChatUIEvents.ccActivePopover.next('stickers');\n  }\n  syncLegacyPopoverSignalsImpl(ctx);\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n\nexport function toggleAIImpl(ctx: any): void {\n  if (ctx.contentToDisplay() === 'ai') {\n    ctx.contentToDisplay.set('none');\n  } else {\n    ctx.contentToDisplay.set('ai');\n    CometChatUIEvents.ccActivePopover.next('ai');\n  }\n  syncLegacyPopoverSignalsImpl(ctx);\n  ctx.isMentionSuggestionsOpen.set(false);\n}\n\nexport async function sendStickerMessageImpl(\n  ctx: any,\n  receiver: CometChat.User | CometChat.Group,\n  stickerUrl: string,\n  stickerName: string\n): Promise<void> {\n  const quotedMessage = ctx.messageToReplySignal() || undefined;\n  const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n  const receiverType =\n    receiver instanceof CometChat.User\n      ? CometChat.RECEIVER_TYPE.USER\n      : CometChat.RECEIVER_TYPE.GROUP;\n  const customData = { sticker_url: stickerUrl, sticker_name: stickerName };\n  const pendingStickerMessage = new CometChat.CustomMessage(\n    receiverId,\n    receiverType,\n    CometChatUIKitConstants.ExtensionTypes.sticker,\n    customData\n  );\n  pendingStickerMessage.setMuid(CometChatUIKitUtility.ID());\n  pendingStickerMessage.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n  if (ctx.parentMessageId) { pendingStickerMessage.setParentMessageId(ctx.parentMessageId); }\n  if (quotedMessage) {\n    pendingStickerMessage.setQuotedMessage(quotedMessage);\n    pendingStickerMessage.setQuotedMessageId(quotedMessage.getId());\n  }\n  CometChatMessageEvents.ccMessageSent.next({\n    message: pendingStickerMessage,\n    status: MessageStatus.inprogress,\n  });\n  try {\n    const sentMessage = await ctx.messageComposerService.sendStickerMessage(\n      receiver,\n      stickerUrl,\n      stickerName,\n      ctx.parentMessageId,\n      quotedMessage,\n      pendingStickerMessage\n    );\n    if (sentMessage) {\n      CometChatMessageEvents.ccMessageSent.next({\n        message: sentMessage,\n        status: MessageStatus.success,\n      });\n      if (quotedMessage) {\n        ctx.exitReplyMode();\n        CometChatMessageEvents.ccReplyToMessage.next({\n          message: sentMessage,\n          status: MessageStatus.success,\n        });\n      }\n      ctx.sendButtonClick.emit(sentMessage);\n      ctx.announceMessageSent();\n      ctx.playOutgoingMessageSound();\n    } else {\n      CometChatMessageEvents.ccMessageSent.next({\n        message: pendingStickerMessage,\n        status: MessageStatus.error,\n      });\n    }\n  } catch (error) {\n    CometChatMessageEvents.ccMessageSent.next({\n      message: pendingStickerMessage,\n      status: MessageStatus.error,\n    });\n    ctx.emitError(error);\n    throw error;\n  }\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {AttachmentFile} from './cometchat-message-composer.component';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport {CometChatUIKitConstants} from '../../constants';\n\nexport function handleAttachmentOptionClickImpl(self: any, optionId: string): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  const fileInput = self.fileInputRef?.nativeElement;\n  if (!fileInput) { CometChatLogger.warn('CometChatMessageComposer', 'File input element not found'); return; }\n  // Remember which picker opened the dialog. The chosen option — not the file's MIME type —\n  // decides the staged kind, so a video picked via \"File\" sends as a file message. The change\n  // handler consumes and clears it; drag-drop / paste never set it and stay MIME-derived.\n  switch (optionId) {\n    case CometChatUIKitConstants.ComposerAttachmentOption.image:\n      self.pendingPickerKind = 'image';\n      fileInput.accept = 'image/*';\n      fileInput.click();\n      break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.video:\n      self.pendingPickerKind = 'video';\n      fileInput.accept = 'video/*';\n      fileInput.click();\n      break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.audio:\n      self.pendingPickerKind = 'audio';\n      fileInput.accept = 'audio/*';\n      fileInput.click();\n      break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.file:\n      self.pendingPickerKind = 'file';\n      fileInput.accept = '*/*';\n      fileInput.click();\n      break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.poll: self.openPollModal(); break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.collaborativeDocument: self.createCollaborativeDocument(); break;\n    case CometChatUIKitConstants.ComposerAttachmentOption.collaborativeWhiteboard: self.createCollaborativeWhiteboard(); break;\n    default:\n      break;\n  }\n}\n\nexport function handleAttachmentClickImpl(self: any, attachment: AttachmentFile, index: number): void {\n  if (attachment.type === 'image' || attachment.type === 'video') {\n    self.fullscreenViewerIndex.set(index);\n    self.isFullscreenViewerOpen.set(true);\n  }\n}\n\nexport function handleFullscreenViewerCloseImpl(self: any): void {\n  self.isFullscreenViewerOpen.set(false);\n}\n\nexport function handleFullscreenViewerPreviousImpl(self: any): void {\n  const currentIndex = self.fullscreenViewerIndex();\n  const attachmentsList = self.attachments();\n  if (currentIndex > 0) { self.fullscreenViewerIndex.set(currentIndex - 1); } else {\n    self.fullscreenViewerIndex.set(attachmentsList.length - 1);\n  }\n}\n\nexport function handleFullscreenViewerNextImpl(self: any): void {\n  const currentIndex = self.fullscreenViewerIndex();\n  const attachmentsList = self.attachments();\n  if (currentIndex < attachmentsList.length - 1) { self.fullscreenViewerIndex.set(currentIndex + 1); } else {\n    self.fullscreenViewerIndex.set(0);\n  }\n}\n\nexport function getCurrentFullscreenAttachmentImpl(self: any): AttachmentFile | undefined {\n  const attachmentsList = self.attachments();\n  const index = self.fullscreenViewerIndex();\n  return attachmentsList[index];\n}\n\nexport function handleRemoveAttachmentImpl(self: any, attachment: AttachmentFile): void {\n  if (attachment.thumbnailUrl) { URL.revokeObjectURL(attachment.thumbnailUrl); }\n  self.attachments.update((attachments: AttachmentFile[]) => attachments.filter((a: AttachmentFile) => a.id !== attachment.id));\n  self.attachmentRemoved.emit(attachment.file);\n  self.announceAttachmentRemoved(attachment.name);\n}\n\nexport function handleAttachmentButtonClickImpl(self: any): void {\n  self.toggleAttachmentMenu();\n}\n","export function focusTextInputImpl(self: any): void {\n  const textInput = self.textInputRef?.nativeElement;\n  if (textInput) {\n    setTimeout(() => {\n      textInput.focus();\n      const textLength = textInput.value.length;\n      textInput.setSelectionRange(textLength, textLength);\n    }, 50);\n  }\n}\n\nexport function focusAttachmentButtonImpl(self: any): void {\n  const el = self.attachmentButtonRef?.nativeElement;\n  if (el) {\n    setTimeout(() => {\n      const btn = el.querySelector('button') as HTMLButtonElement;\n      (btn || el).focus();\n    }, 0);\n  }\n}\n\nexport function focusEmojiButtonImpl(self: any): void {\n  const el = self.emojiButtonRef?.nativeElement;\n  if (el) {\n    setTimeout(() => {\n      const btn = el.querySelector('button') as HTMLButtonElement;\n      (btn || el).focus();\n    }, 0);\n  }\n}\n\nexport function focusStickersButtonImpl(self: any): void {\n  const el = self.stickersButtonRef?.nativeElement;\n  if (el) {\n    setTimeout(() => {\n      const btn = el.querySelector('button') as HTMLButtonElement;\n      (btn || el).focus();\n    }, 0);\n  }\n}\n\nexport function focusVoiceButtonImpl(self: any): void {\n  const el = self.voiceButtonRef?.nativeElement;\n  if (el) {\n    setTimeout(() => {\n      const btn = el.querySelector('button') as HTMLButtonElement;\n      (btn || el).focus();\n    }, 0);\n  }\n}\n\nexport function insertTextAtCursorImpl(self: any, textToInsert: string): number {\n  const currentText = self.composerText();\n  const currentCursorPos = self.cursorPosition();\n  const safePosition = Math.min(Math.max(0, currentCursorPos), currentText.length);\n  const textBefore = currentText.substring(0, safePosition);\n  const textAfter = currentText.substring(safePosition);\n  const newText = textBefore + textToInsert + textAfter;\n  self.composerText.set(newText);\n  const newCursorPosition = safePosition + textToInsert.length;\n  return newCursorPosition;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKit} from '../../cometchat-uikit';\nimport {getMediaCaption} from '../../utils/message-metadata-utils';\nimport {\n  getAttachmentCount,\n  getMediaTypeLabel,\n  isMediaPreviewType,\n  MediaPreviewType,\n} from '../../utils/message-preview-utils';\nimport {formatEditPreviewTextImpl, formatReplyPreviewTextImpl} from './cometchat-message-composer.edit-mode';\n\n/** Type glyph shown before the media label in the edit / reply preview banners. */\nconst MEDIA_PREVIEW_ICONS: Record<MediaPreviewType, string> = {\n  image: 'assets/conversations_image-message.svg',\n  video: 'assets/conversations_video-message.svg',\n  audio: 'assets/conversations_audio-message.svg',\n  file: 'assets/conversations_file-message.svg',\n};\n\n/** The pieces of a media preview banner: `[icon] label · caption`. */\nexport interface MediaPreviewParts {\n  iconUrl: string;\n  /** \"Image\" for one attachment, \"3 Images\" for several. */\n  label: string;\n  /** Sanitized HTML for the caption, or '' when there is none. */\n  captionHtml: string;\n}\n\n/**\n * Summary for a media message being edited or replied to: the type glyph, a counted label, and the\n * formatted caption. `null` for text and every other type, which keep their existing subtitle.\n *\n * NOTE: unlike the conversation list, a voice note is NOT special-cased here — it previews as\n * \"Audio\", matching the React kit's edit and reply banners.\n */\nexport function getMediaPreviewPartsImpl(\n  self: any,\n  message: CometChat.BaseMessage | null | undefined,\n  mode: 'edit' | 'reply',\n): MediaPreviewParts | null {\n  if (!message) { return null; }\n  const type = message.getType();\n  if (!isMediaPreviewType(type)) { return null; }\n\n  const caption = getMediaCaption(message).trim();\n  const captionHtml = caption\n    ? (mode === 'edit'\n        ? formatEditPreviewTextImpl(self, message as CometChat.TextMessage, caption)\n        : formatReplyPreviewTextImpl(self, message as CometChat.TextMessage, caption))\n    : '';\n\n  return {\n    iconUrl: MEDIA_PREVIEW_ICONS[type],\n    label: getMediaTypeLabel(type, getAttachmentCount(message)),\n    captionHtml,\n  };\n}\nimport {CometChatUIKitConstants} from '../../constants';\n\nexport function getReplyPreviewTitleImpl(self: any): string {\n  const message = self.messageToReplySignal();\n  if (!message) { return ''; }\n  const sender = message.getSender();\n  if (!sender) { return CometChatLocalize.getLocalizedString('unknown'); }\n  // ENG-35080: Show \"You\" when the sender is the logged-in user\n  const loggedInUser = CometChatUIKit.getLoggedInUser();\n  if (loggedInUser && sender.getUid() === loggedInUser.getUid()) {\n    return CometChatLocalize.getLocalizedString('conversation_subtitle_you_message');\n  }\n  return sender.getName() || CometChatLocalize.getLocalizedString('unknown');\n}\n\nexport function getReplyPreviewSubtitleImpl(self: any): string {\n  const message = self.messageToReplySignal();\n  if (!message) { return ''; }\n  if (message.getDeletedAt()) {\n    return CometChatLocalize.getLocalizedString('conversation_subtitle_deleted_message');\n  }\n  const messageType = message.getType();\n  const messageCategory = message.getCategory();\n  // Handle by category first\n  if (messageCategory === 'action') {\n    return CometChatLocalize.getLocalizedString('message');\n  }\n  if (messageCategory === 'call') {\n    return CometChatLocalize.getLocalizedString('conversation_subtitle_voice_call');\n  }\n  if (messageCategory === 'custom' && messageType === 'meeting') {\n    return CometChatLocalize.getLocalizedString('conversation_subtitle_voice_call');\n  }\n  // Handle by message type — mirrors conversation item subtitleText\n  switch (messageType) {\n    case CometChat.MESSAGE_TYPE.TEXT: {\n      const textMessage = message as CometChat.TextMessage;\n      return self.formatReplyPreviewText(textMessage);\n    }\n    case CometChat.MESSAGE_TYPE.IMAGE:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_image');\n    case CometChat.MESSAGE_TYPE.VIDEO:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_video');\n    case CometChat.MESSAGE_TYPE.AUDIO:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_audio');\n    case CometChat.MESSAGE_TYPE.FILE:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_file');\n    case CometChatUIKitConstants.ExtensionTypes.poll:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_poll');\n    case CometChatUIKitConstants.ExtensionTypes.sticker:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_sticker');\n    case CometChatUIKitConstants.ExtensionTypes.document:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_document');\n    case CometChatUIKitConstants.ExtensionTypes.whiteboard:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_collaborative_whiteboard');\n    default:\n      // For unknown custom message types, show the type name as fallback\n      // (matches conversation item behavior: getCustomMessageText() || messageType)\n      if (messageCategory === 'custom') {\n        try {\n          const customData = (message as CometChat.CustomMessage).getCustomData?.();\n          if (customData && typeof customData === 'object' && 'text' in customData) {\n            return String((customData as Record<string, unknown>)['text']) || messageType;\n          }\n        } catch { /* ignore */ }\n        return messageType;\n      }\n      return CometChatLocalize.getLocalizedString('message');\n  }\n}\n\nexport function getEditPreviewTitleImpl(): string {\n  return CometChatLocalize.getLocalizedString('message_composer_edit_message');\n}\n\n/**\n * Subtitle for the edit banner. Media messages are rendered from {@link getMediaPreviewPartsImpl}\n * by the template instead, so this only ever handles text.\n *\n * It used to fall through to `escapeUserHtml(getText())` for everything non-text — and a\n * MediaMessage has no `getText()`, so editing a captioned image showed an EMPTY subtitle.\n */\nexport function getEditPreviewSubtitleImpl(self: any): string {\n  const editMessage = self.getCurrentEditMessage();\n  if (!editMessage) { return ''; }\n  if (editMessage.getType() === CometChat.MESSAGE_TYPE.TEXT) {\n    return self.formatEditPreviewText(editMessage as CometChat.TextMessage);\n  }\n  return '';\n}\n\nexport function enterReplyModeImpl(self: any, message: CometChat.BaseMessage): void {\n  if (self.messageToEdit) { self.exitEditMode(); }\n  self.messageToReplySignal.set(message);\n  const sender = message.getSender();\n  const loggedInUser = CometChatUIKit.getLoggedInUser();\n  const senderName = (loggedInUser && sender?.getUid() === loggedInUser.getUid())\n    ? CometChatLocalize.getLocalizedString('conversation_subtitle_you_message')\n    : (sender?.getName() || CometChatLocalize.getLocalizedString('unknown'));\n  const replyTemplate = CometChatLocalize.getLocalizedString('message_composer_replying_to');\n  self.announcePolite(replyTemplate.replace('{sender}', senderName));\n  if (self.customRichTextEditor) { self.focusRichTextEditor(); } else {\n    self.focusTextInput();\n  }\n}\n\nexport function exitReplyModeImpl(self: any): void {\n  self.messageToReplySignal.set(null);\n}\n\nexport function onReplyPreviewCloseImpl(self: any): void {\n  if (self.messageToReplySignal()) {\n    CometChatMessageEvents.ccReplyToMessage.next({\n      message: self.messageToReplySignal()!,\n      status: MessageStatus.cancelled,\n    });\n  }\n  self.exitReplyMode();\n  self.closePreview.emit();\n}\n\nexport function onEditPreviewCloseImpl(self: any): void {\n  self.cancelEdit();\n}\n\nexport function openPollModalImpl(self: any): void {\n  self.isPollModalOpen.set(true);\n}\n\nexport function closePollModalImpl(self: any): void {\n  self.isPollModalOpen.set(false);\n}\n\nexport function onPollCreatedImpl(self: any): void {\n  self.closePollModal();\n  if (self.messageToReplySignal()) {\n    CometChatMessageEvents.ccReplyToMessage.next({\n      message: self.messageToReplySignal()!,\n      status: MessageStatus.success,\n    });\n    self.exitReplyMode();\n  }\n}\n\nexport function resetComposerStateImpl(self: any): void {\n  self.composerText.set('');\n  self.attachments.set([]);\n  self.messageToReplySignal.set(null);\n  if (self.isEditMode() || self.textMessageToEdit() || self.messageToEdit) {\n    self.textMessageToEdit.set(null);\n    self.isEditMode.set(false);\n    self.originalTextBeforeEdit = '';\n    self.closePreview.emit();\n  }\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  self.isMentionSuggestionsOpen.set(false);\n  self.uniqueMentionCount.set(0);\n  self.showMentionsCountWarning.set(false);\n  self.plainTextMentionUids.clear();\n  self.mentionedUsersMap.clear();\n  if (self.customRichTextEditor && self.enableRichText) { self.richTextEditorService.clearContent(self.customRichTextEditor); }\n  if (!self.disableTypingEvents) {\n    if (self.typingTimeout) {\n      clearTimeout(self.typingTimeout);\n      self.typingTimeout = undefined;\n    }\n    self.endTypingIndicator();\n  }\n  self.textChange.emit('');\n}\n","import {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\n\nexport async function createCollaborativeDocumentImpl(self: any): Promise<void> {\n  const receiver = self.currentUser() || self.currentGroup();\n  if (!receiver) { CometChatLogger.warn('CometChatMessageComposer', 'No receiver set for collaborative document'); return; }\n  self.isExtensionLoading.set(true);\n  try {\n    const receiverId = self.currentUser()\n      ? self.currentUser()!.getUid()\n      : self.currentGroup()!.getGuid();\n    const receiverType = self.currentUser() ? 'user' : 'group';\n    const quotedMessageId = self.messageToReplySignal()?.getId();\n    await self.messageComposerService.createCollaborativeDocument(\n      receiverId,\n      receiverType,\n      quotedMessageId\n    );\n    self.contentToDisplay.set('none');\n    self.syncLegacyPopoverSignals();\n    if (self.messageToReplySignal()) {\n      CometChatMessageEvents.ccReplyToMessage.next({\n        message: self.messageToReplySignal()!,\n        status: MessageStatus.success,\n      });\n      self.exitReplyMode();\n    }\n  } catch (error) {\n    self.emitError(error);\n  } finally {\n    self.isExtensionLoading.set(false);\n  }\n}\n\nexport async function createCollaborativeWhiteboardImpl(self: any): Promise<void> {\n  const receiver = self.currentUser() || self.currentGroup();\n  if (!receiver) { CometChatLogger.warn('CometChatMessageComposer', 'No receiver set for collaborative whiteboard'); return; }\n  self.isExtensionLoading.set(true);\n  try {\n    const receiverId = self.currentUser()\n      ? self.currentUser()!.getUid()\n      : self.currentGroup()!.getGuid();\n    const receiverType = self.currentUser() ? 'user' : 'group';\n    const quotedMessageId = self.messageToReplySignal()?.getId();\n    await self.messageComposerService.createCollaborativeWhiteboard(\n      receiverId,\n      receiverType,\n      quotedMessageId\n    );\n    self.contentToDisplay.set('none');\n    self.syncLegacyPopoverSignals();\n    if (self.messageToReplySignal()) {\n      CometChatMessageEvents.ccReplyToMessage.next({\n        message: self.messageToReplySignal()!,\n        status: MessageStatus.success,\n      });\n      self.exitReplyMode();\n    }\n  } catch (error) {\n    self.emitError(error);\n  } finally {\n    self.isExtensionLoading.set(false);\n  }\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {StickerClickEvent} from '../cometchat-stickers-keyboard/cometchat-stickers-keyboard.component';\nimport {CometChatMessageComposerAction, CometChatActionsView} from '../../modals';\n\nexport function handleEmojiSelectImpl(self: any, emoji: string): void {\n  if (self.customRichTextEditor) {\n    self.insertTextIntoRichTextEditor(emoji);\n    // ENG-35093: Close the emoji popover properly via closeAllPopups so the\n    // CometChatPopoverComponent's internal isOpen state is explicitly closed.\n    self.closeAllPopups();\n    return;\n  }\n  const newCursorPosition = self.insertTextAtCursor(emoji);\n  self.cursorPosition.set(newCursorPosition);\n  self.textChange.emit(self.composerText());\n  // ENG-35093: Same fix for plain text mode.\n  self.closeAllPopups();\n}\n\nexport function handleEmojiKeyboardCloseImpl(self: any): void {\n  self.isEmojiKeyboardOpen.set(false);\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  if (self.customRichTextEditor) { self.focusRichTextEditor(); } else {\n    self.focusTextInput();\n  }\n}\n\nexport function handleActionSheetItemClickImpl(self: any, action: CometChatMessageComposerAction | CometChatActionsView): void {\n  const attachmentButton = self.attachmentButtonRef?.nativeElement;\n  if (attachmentButton) { attachmentButton.click(); }\n  if ('onClick' in action && action.onClick) { action.onClick(); }\n}\n\nexport function handleActionSheetCloseImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n}\n\nexport async function handleStickerSelectImpl(self: any, event: StickerClickEvent): Promise<void> {\n  // ENG-35031: Use closeAllPopups to properly close the sticker keyboard popover.\n  // Setting contentToDisplay alone only updates the signal — the CometChatPopoverComponent's\n  // internal isOpen state must be explicitly closed via closeAllPopoverInstances().\n  self.closeAllPopups();\n  const receiver = self.getReceiver();\n  if (!receiver) {\n    CometChatLogger.warn('CometChatMessageComposer', 'No receiver (user or group) specified for sticker message');\n    return;\n  }\n  try {\n    await self.sendStickerMessage(receiver, event.stickerUrl, event.stickerName);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageComposer', 'Error sending sticker message:', error);\n    self.emitError(error);\n  }\n}\n\nexport function handleStickersKeyboardCloseImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  if (self.customRichTextEditor) { self.focusRichTextEditor(); } else {\n    self.focusTextInput();\n  }\n}\n\nexport function handleVoiceRecordingClickImpl(self: any): void {\n  const newRecordingState = !self.isRecording();\n  self.isRecording.set(newRecordingState);\n  if (newRecordingState) { self.announceRecordingStarted(); } else {\n    self.announceRecordingStopped();\n  }\n  if (newRecordingState) { self.closeAllPopups(); }\n  if (!newRecordingState) { self.recordingDuration.set(0); }\n}\n\nexport function toggleFixedToolbarImpl(self: any): void {\n  const newState = !self.isFixedToolbarShown();\n  self.isFixedToolbarShown.set(newState);\n  self.isFixedToolbarManuallyToggled.set(newState);\n  if (newState) {\n    self.isBubbleMenuVisible.set(false);\n    self.textSelection.set(null);\n    self.bubbleMenuPosition.set(null);\n  }\n  self.focusRichTextEditor();\n  self.cdr.markForCheck();\n}\n\nexport function closeAllPopupsImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.closeAllPopoverInstances();\n  self.isEmojiKeyboardOpen.set(false);\n  self.isStickersKeyboardOpen.set(false);\n  self.isAttachmentMenuOpen.set(false);\n  self.isMentionSuggestionsOpen.set(false);\n  self.messageComposerService.clearMentionSuggestions();\n  if (self.isRecording()) { self.isRecording.set(false); self.recordingDuration.set(0); }\n  if (self.isFullscreenViewerOpen()) { self.isFullscreenViewerOpen.set(false); }\n  if (self.enableRichText && self.customRichTextEditor) { self.customRichTextEditor.getContentEditable().focus(); } else if (self.textInputRef?.nativeElement) {\n    self.textInputRef.nativeElement.focus();\n  }\n}\n\nexport function emitErrorImpl(self: any, error: unknown): void {\n  CometChatLogger.error('CometChatMessageComposer', 'Error:', error);\n  let exception: CometChat.CometChatException;\n  if (error instanceof CometChat.CometChatException) { exception = error; } else if (error instanceof Error) {\n    exception = new CometChat.CometChatException({\n      code: 'COMPONENT_ERROR',\n      message: error.message,\n      details: error.stack || '',\n    });\n  } else {\n    exception = new CometChat.CometChatException({\n      code: 'UNKNOWN_ERROR',\n      message: String(error),\n      details: '',\n    });\n  }\n  const label = CometChatLocalize.getLocalizedString('message_composer_error_occurred');\n  self.announceAssertive(label + ': ' + exception.message);\n  // Show it. `error` is an @Output, so unless the integrator binds it the failure is invisible —\n  // a rejected send just left its bubble pending with no explanation. Screen readers were already\n  // being told (above); this gives sighted users the same information. Prefer the SDK/API message,\n  // which is written for humans (e.g. a moderation or permission refusal explains the reason).\n  self.toast?.error((exception.message || '').trim() || label, { duration: 4000 });\n  self.error.emit(exception);\n}\n\nexport async function handleSendImpl(self: any): Promise<void> {\n  self.closeBubbleMenu();\n  if (self.isRecording() && self.mediaRecorderRef) { self.mediaRecorderRef.handleInlineSend(); return; }\n  if (self.customRichTextEditor) { const freshText = self.richTextEditorService.getText(self.customRichTextEditor); self.composerText.set(freshText); }\n  if (!self.canSend()) { return; }\n  const receiver = self.getReceiver();\n  if (!receiver) { CometChatLogger.warn('CometChatMessageComposer', 'No receiver (user or group) specified'); return; }\n  try {\n    if (!self.disableTypingEvents) { if (self.typingTimeout) { clearTimeout(self.typingTimeout); self.typingTimeout = undefined; } self.endTypingIndicator(); }\n    const text = self.customRichTextEditor ? self.richTextEditorService.getTextWithMentionFormat(self.customRichTextEditor).trim() : self.composerText().trim();\n    const currentAttachments = self.attachments();\n    const editMessage = self.messageToEdit || self.textMessageToEdit();\n    if (self.isInEditMode() && editMessage) { await self.handleEditMessage(text, editMessage); } else {\n      await self.handleSendNewMessage(receiver, text, currentAttachments);\n    }\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageComposer', 'Error during send:', error);\n    self.emitError(error);\n  }\n}\n\nexport function focusRichTextEditorImpl(self: any): void {\n  if (self.customRichTextEditor) {\n    setTimeout(() => {\n      const editor = self.customRichTextEditor;\n      if (editor) {\n        const contentEditable = editor.getContentEditable();\n        contentEditable.focus();\n        const selection = window.getSelection();\n        const range = document.createRange();\n        range.selectNodeContents(contentEditable);\n        range.collapse(false);\n        if (selection) {\n          selection.removeAllRanges();\n          selection.addRange(range);\n        }\n      }\n    }, 50);\n  }\n}\n\nexport function getFileSizeErrorMessageImpl(self: any): string {\n  const error = self.fileSizeError();\n  if (!error) { return ''; }\n  const count = error.count;\n  const fileType = count === 1 ? error.fileType : self.getPluralFileType(error.fileType);\n  const verb = count === 1 ? 'is' : 'are';\n  const limit = `${error.limitMB} MB`;\n  return `${count} ${fileType} you tried adding ${verb} larger than the ${limit} limit`;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMentionsFormatter} from '../../formatters/cometchat-mentions-formatter';\nimport {CometChatSoundManager} from '../../resources/CometChatSoundManager/CometChatSoundManager';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\n\nexport function initializeTextFormattersImpl(self: any): void {\n  const formatters: any[] = [];\n  const effectiveFormatters = self.effectiveTextFormatters();\n  if (effectiveFormatters && effectiveFormatters.length > 0) { formatters.push(...effectiveFormatters); }\n  const hasMentionsFormatter = formatters.some((f: any) => f instanceof CometChatMentionsFormatter);\n  if (!hasMentionsFormatter && !self.disableMentions) {\n    const mentionsFormatter = new CometChatMentionsFormatter();\n    mentionsFormatter.setAllMentionConfig(!self.disableMentionAll, self.mentionAllLabel);\n    formatters.push(mentionsFormatter);\n    self.mentionsFormatter.set(mentionsFormatter);\n  } else if (hasMentionsFormatter) {\n    const existingFormatter = formatters.find((f: any) => f instanceof CometChatMentionsFormatter);\n    if (existingFormatter) {\n      self.mentionsFormatter.set(existingFormatter as CometChatMentionsFormatter);\n    }\n  }\n  self.textFormatterArray.set(formatters);\n}\n\nexport function configureTextFormattersImpl(self: any): void {\n  const composerId = self.getComposerId();\n  for (const formatter of self.textFormatterArray()) {\n    const formatterWithConfig = formatter as unknown as {\n      setComposerConfig?: (\n        user: CometChat.User | undefined,\n        group: CometChat.Group | undefined,\n        composerId: { user: string | null; group: string | null; parentMessageId: number | null }\n      ) => void;\n    };\n    if (typeof formatterWithConfig.setComposerConfig === 'function') {\n      formatterWithConfig.setComposerConfig(\n        self.currentUser() ?? undefined,\n        self.currentGroup() ?? undefined,\n        composerId\n      );\n    }\n    if (self.customRichTextEditor) {\n      const editorElement = self.richTextEditorContainerRef?.nativeElement;\n      if (editorElement) {\n        const formatterWithRef = formatter as unknown as {\n          setInputElementReference?: (element: HTMLElement) => void;\n        };\n        if (typeof formatterWithRef.setInputElementReference === 'function') { formatterWithRef.setInputElementReference(editorElement); }\n      }\n    }\n  }\n  if (self.customRichTextEditor) { self.customRichTextEditor.setCustomFormatters(self.textFormatterArray()); }\n}\n\nexport function forwardKeyEventToFormattersImpl(self: any, event: KeyboardEvent, eventType: 'keydown' | 'keyup'): void {\n  for (const formatter of self.textFormatterArray()) {\n    const formatterWithMethod = formatter as unknown as {\n      onKeyDown?: (event: KeyboardEvent) => void;\n      onKeyUp?: (event: KeyboardEvent) => void;\n    };\n    if (eventType === 'keydown' && typeof formatterWithMethod.onKeyDown === 'function') {\n      formatterWithMethod.onKeyDown(event);\n    } else if (eventType === 'keyup' && typeof formatterWithMethod.onKeyUp === 'function') {\n      formatterWithMethod.onKeyUp(event);\n    }\n  }\n}\n\nexport function updateFormatterCaretPositionImpl(self: any): void {\n  const selection = window.getSelection();\n  if (!selection || selection.rangeCount === 0) { return; }\n  const range = selection.getRangeAt(0);\n  for (const formatter of self.textFormatterArray()) {\n    const formatterWithMethod = formatter as unknown as {\n      setCaretPositionAndRange?: (selection: Selection, range: Range) => void;\n    };\n    if (typeof formatterWithMethod.setCaretPositionAndRange === 'function') {\n      formatterWithMethod.setCaretPositionAndRange(selection, range);\n    }\n  }\n}\n\nexport function playOutgoingMessageSoundImpl(self: any): void {\n  if (self.effectiveDisableSoundForMessage()) { return; }\n  try {\n    CometChatSoundManager.play(\n      CometChatSoundManager.Sound.outgoingMessage!,\n      self.effectiveCustomSoundForMessage() || null\n    );\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageComposer', 'Error playing outgoing message sound:', error);\n  }\n}\n\nexport function getMediaMessageTypeImpl(fileType: 'image' | 'video' | 'audio' | 'file'): string {\n  switch (fileType) {\n    case 'image': return CometChat.MESSAGE_TYPE.IMAGE;\n    case 'video': return CometChat.MESSAGE_TYPE.VIDEO;\n    case 'audio': return CometChat.MESSAGE_TYPE.AUDIO;\n    case 'file':\n    default: return CometChat.MESSAGE_TYPE.FILE;\n  }\n}\n\nexport function handleRichTextUpdateImpl(self: any, html: string, text: string): void {\n  // Defer composerText signal update to the next microtask to prevent\n  // Angular change detection from running synchronously during a\n  // contenteditable input event. Synchronous signal updates cause\n  // layout shifts (send/voice button show/hide) which reset the cursor\n  // position in inline <code> elements on the 2nd character typed.\n  Promise.resolve().then(() => {\n    self.composerText.set(text);\n    self.textChange.emit(text);\n  });\n  self.updateMentionsCount();\n  if (!self.disableTypingEvents) { self.handleTypingStart(); }\n  if (!self.disableMentions && self.customRichTextEditor) { self.checkForMentionTrigger(text, 0); }\n}\n\nexport function onEmojiPopoverOpenedImpl(self: any): void {\n  self.contentToDisplay.set('emojiKeyboard');\n  self.syncLegacyPopoverSignals();\n}\n\nexport function onEmojiPopoverClosedImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  self.focusEmojiButton();\n}\n\nexport function onAttachmentPopoverOpenedImpl(self: any): void {\n  self.contentToDisplay.set('attachments');\n  self.syncLegacyPopoverSignals();\n}\n\nexport function onAttachmentPopoverClosedImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  self.focusAttachmentButton();\n}\n\nexport function onVoiceRecorderPopoverOpenedImpl(self: any): void {\n  self.contentToDisplay.set('voiceRecording');\n  self.isRecording.set(true);\n  self.syncLegacyPopoverSignals();\n}\n\nexport function onVoiceRecorderPopoverClosedImpl(self: any): void {\n  if (self.isRecording()) {\n    self.isRecording.set(false);\n    self.recordingDuration.set(0);\n    self.announceRecordingStopped();\n  }\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n}\n\nexport function onStickersPopoverOpenedImpl(self: any): void {\n  self.contentToDisplay.set('stickers');\n  self.syncLegacyPopoverSignals();\n}\n\nexport function onStickersPopoverClosedImpl(self: any): void {\n  self.contentToDisplay.set('none');\n  self.syncLegacyPopoverSignals();\n  self.focusStickersButton();\n}\n","import {SimpleChanges} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatMessageComposerAction} from '../../modals';\nimport {CometChatUIKitConstants} from '../../constants';\n\nexport function setupConstructorEffectsImpl(self: any): void {\n  /**\n   * Only one composer may record at a time — the main list and an open thread each have their own\n   * recorder and mic stream. Hooked on the `isRecording` signal rather than the individual start\n   * calls because recording is toggled from several places (toggleVoiceRecording, startInlineRecording,\n   * handleVoiceRecordingClick, the recorder popover handlers, syncLegacyPopoverSignals), and not all\n   * of them announce themselves — watching the signal covers every path.\n   */\n  safeEffect(() => {\n    if (self.isRecording()) {\n      self.voiceCoordinator.claim(self, () => self.stopRecordingForCoordinator());\n    } else {\n      self.voiceCoordinator.release(self);\n    }\n  });\n  safeEffect(() => {\n    const st = self.mentionSearchText();\n    const io = self.isMentionSuggestionsOpen();\n    if (self.skipNextMentionCheck) return;\n    if (io && !self.disableMentions) {\n      self.initializeMentionsRequestBuilder(st);\n      self.messageComposerService.searchMentions(st, self.currentGroup() ?? undefined, self.mentionsUsersRequestBuilder, self.mentionsGroupMembersRequestBuilder, self.disableMentionAll, self.mentionAllLabel);\n    }\n  });\n  safeEffect(() => {\n    const index = self.focusedMentionIndex();\n    if (self.isMentionSuggestionsOpen()) self.scrollMentionIntoView(index);\n  });\n  safeEffect(() => {\n    const su = self.chatStateService.activeUser();\n    const sg = self.chatStateService.activeGroup();\n    const up = self.propsProvided();\n    if (!up) {\n      const pu = self.currentUser();\n      const pg = self.currentGroup();\n      const uc = su?.getUid() !== pu?.getUid();\n      const gc = sg?.getGuid() !== pg?.getGuid();\n      self.currentUser.set(su);\n      self.currentGroup.set(sg);\n      if (uc || gc) self.resetComposerState();\n      self.cdr.markForCheck();\n    }\n  });\n  safeEffect(() => {\n    const lm = self.currentLayoutMode();\n    if (lm) {\n      const key = lm === 'multiline' ? 'message_composer_layout_multiline' : 'message_composer_layout_single_line';\n      const ann = CometChatLocalize.getLocalizedString(key);\n      setTimeout(() => { self.liveRegionPoliteText.set(ann); setTimeout(() => self.liveRegionPoliteText.set(''), 100); }, 0);\n    }\n  });\n  safeEffect(() => {\n    const s = self.mentionSuggestions();\n    const o = self.isMentionSuggestionsOpen();\n    const l = self.isFetchingMentions();\n    if (o && !l && s.length > 0) self.announceMentionSuggestionsCount(s.length);\n  });\n}\n\nexport function ngOnInitImpl(self: any): void {\n  if (!self.mentionAllLabel) self.mentionAllLabel = CometChatLocalize.getLocalizedString('message_composer_mention_all');\n  self.setupErrorCallback();\n  self.initializeMobileViewDetection();\n  self.initializeComposerText();\n  self.initializeTextFormatters();\n  if (self.user) { self.propsProvided.set(true); self.currentUser.set(self.user); self.currentGroup.set(null); }\n  else if (self.group) { self.propsProvided.set(true); self.currentUser.set(null); self.currentGroup.set(self.group); }\n  else { self.propsProvided.set(false); }\n  self.subscribeToActivePopoverEvent();\n  self.subscribeToReplyToMessageEvent();\n  self.subscribeToMessageEditedEvent();\n  self.subscribeToMessageDeletedEvent();\n  self.subscribeToComposeMessageEvent();\n  self.subscribeToSdkMessageDeletedEvent();\n  self.subscribeToShowModalEvent();\n  self.subscribeToHideModalEvent();\n  self.subscribeToShowMentionsCountWarningEvent();\n}\n\nexport function ngOnChangesImpl(self: any, changes: SimpleChanges): void {\n  if (changes['text'] && !changes['text'].firstChange) {\n    const nt = changes['text'].currentValue || '';\n    self.composerText.set(nt);\n    if (self.customRichTextEditor && self.enableRichText) self.richTextEditorService.setContent(self.customRichTextEditor, nt);\n    self.textChange.emit(nt);\n  }\n  if (changes['messageToEdit']) { self.handleEditModeChange(changes['messageToEdit'].currentValue); }\n  if (changes['messageToReply']) { self.handleReplyModeChange(changes['messageToReply'].currentValue); }\n  if (changes['parentMessageId'] && !changes['parentMessageId'].firstChange && changes['parentMessageId'].currentValue && !changes['parentMessageId'].previousValue) {\n    self.announceReplyModeActivated();\n  }\n  if (changes['initialComposerText'] && !changes['initialComposerText'].firstChange && changes['initialComposerText'].currentValue) {\n    const nt = changes['initialComposerText'].currentValue;\n    self.composerText.set(nt);\n    if (self.customRichTextEditor && self.enableRichText) self.richTextEditorService.setContent(self.customRichTextEditor, nt);\n    self.textChange.emit(nt);\n  }\n  if (changes['enableRichText'] && !changes['enableRichText'].firstChange) { self.cdr.markForCheck(); }\n  if (changes['user'] || changes['group']) {\n    const uc = changes['user'] && !changes['user'].firstChange && changes['user'].currentValue?.getUid() !== changes['user'].previousValue?.getUid();\n    const gc = changes['group'] && !changes['group'].firstChange && changes['group'].currentValue?.getGuid() !== changes['group'].previousValue?.getGuid();\n    if (changes['user']) { self.currentUser.set(changes['user'].currentValue || null); if (changes['user'].currentValue) self.currentGroup.set(null); }\n    if (changes['group']) { self.currentGroup.set(changes['group'].currentValue || null); if (changes['group'].currentValue) self.currentUser.set(null); }\n    if (uc || gc) self.resetComposerState();\n  }\n  if (changes['user'] || changes['group'] || changes['parentMessageId']) self.configureTextFormatters();\n}\n\nexport function buildAttachmentMenuOptionsImpl(self: any): CometChatMessageComposerAction[] {\n  const o: CometChatMessageComposerAction[] = [];\n  if (!self.hideImageAttachmentOption) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.image, title: CometChatLocalize.getLocalizedString('message_composer_attach_image'), iconURL: 'assets/photo.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.image) }));\n  if (!self.hideVideoAttachmentOption) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.video, title: CometChatLocalize.getLocalizedString('message_composer_attach_video'), iconURL: 'assets/videocam.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.video) }));\n  if (!self.hideAudioAttachmentOption) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.audio, title: CometChatLocalize.getLocalizedString('message_composer_attach_audio'), iconURL: 'assets/play_circle.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.audio) }));\n  if (!self.hideFileAttachmentOption) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.file, title: CometChatLocalize.getLocalizedString('message_composer_attach_file'), iconURL: 'assets/document_icon.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.file) }));\n  if (!self.hidePollsOption && !self.parentMessageId) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.poll, title: CometChatLocalize.getLocalizedString('message_composer_polls'), iconURL: 'assets/poll.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.poll) }));\n  if (!self.hideCollaborativeDocumentOption && !self.parentMessageId) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.collaborativeDocument, title: CometChatLocalize.getLocalizedString('messsage_composer_collaborative_document'), iconURL: 'assets/collabrative_document.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.collaborativeDocument) }));\n  if (!self.hideCollaborativeWhiteboardOption && !self.parentMessageId) o.push(new CometChatMessageComposerAction({ id: CometChatUIKitConstants.ComposerAttachmentOption.collaborativeWhiteboard, title: CometChatLocalize.getLocalizedString('messsage_composer_collaborative_whiteboard'), iconURL: 'assets/collaborative_whiteboard.svg', onClick: () => self.handleAttachmentOptionClick(CometChatUIKitConstants.ComposerAttachmentOption.collaborativeWhiteboard) }));\n  if ((self.attachmentOptions?.length ?? 0) > 0) o.push(...(self.attachmentOptions ?? []));\n  return o;\n}\n","/**\n * Types and utilities for CometChatFileBubble component.\n */\n\nimport { FileAttachment } from '../../modals/FileAttachment';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * File Type Icon Mapping\n * Maps file extensions to their corresponding icon assets.\n * @see Requirements 9.1-9.8\n */\nexport const FILE_TYPE_ICONS: Record<string, string> = {\n  // Documents\n  pdf: 'assets/file_type_pdf.svg',\n  doc: 'assets/file_type_word.svg',\n  docx: 'assets/file_type_word.svg',\n  txt: 'assets/file_type_txt.svg',\n  rtf: 'assets/file_type_txt.svg',\n\n  // Spreadsheets\n  xls: 'assets/file_type_xlsx.svg',\n  xlsx: 'assets/file_type_xlsx.svg',\n  csv: 'assets/file_type_xlsx.svg',\n\n  // Presentations\n  ppt: 'assets/file_type_ppt.svg',\n  pptx: 'assets/file_type_ppt.svg',\n\n  // Code files\n  js: 'assets/file_type_txt.svg',\n  ts: 'assets/file_type_txt.svg',\n  html: 'assets/file_type_txt.svg',\n  css: 'assets/file_type_txt.svg',\n  json: 'assets/file_type_txt.svg',\n\n  // Archives\n  zip: 'assets/file_type_zip.svg',\n  rar: 'assets/file_type_zip.svg',\n  tar: 'assets/file_type_zip.svg',\n  gz: 'assets/file_type_zip.svg',\n  '7z': 'assets/file_type_zip.svg',\n\n  // Media files\n  jpg: 'assets/file_type_jpg.svg',\n  jpeg: 'assets/file_type_jpg.svg',\n  png: 'assets/file_type_jpg.svg',\n  gif: 'assets/file_type_jpg.svg',\n  webp: 'assets/file_type_jpg.svg',\n  bmp: 'assets/file_type_jpg.svg',\n  svg: 'assets/file_type_jpg.svg',\n  heic: 'assets/file_type_jpg.svg',\n  heif: 'assets/file_type_jpg.svg',\n  mp3: 'assets/file_type_mp3.svg',\n  wav: 'assets/file_type_mp3.svg',\n  m4a: 'assets/file_type_mp3.svg',\n  aac: 'assets/file_type_mp3.svg',\n  ogg: 'assets/file_type_mp3.svg',\n  mp4: 'assets/file_type_mov.svg',\n  mov: 'assets/file_type_mov.svg',\n  avi: 'assets/file_type_mov.svg',\n  mkv: 'assets/file_type_mov.svg',\n\n  // Default\n  default: 'assets/file_type_unsupported.svg',\n};\n\n/**\n * Get the file type from attachment for icon mapping.\n * Determines file type from extension first, then falls back to MIME type parsing.\n */\nexport function getFileType(attachment: FileAttachment): string {\n  const extension = (attachment.extension ?? '').toLowerCase();\n  if (FILE_TYPE_ICONS[extension]) return extension;\n\n  const mimeType = (attachment.mimeType ?? '').toLowerCase();\n  if (mimeType.includes('pdf')) return 'pdf';\n\n  // OOXML first. EVERY Office 2007+ MIME type contains the literal \"officedocument\" — including\n  // spreadsheets and presentations — so a generic `includes('document')` check would claim them\n  // all as Word. Match the format-specific token instead.\n  //   .docx -> application/vnd.openxmlformats-officedocument.wordprocessingml.document\n  //   .xlsx -> application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\n  //   .pptx -> application/vnd.openxmlformats-officedocument.presentationml.presentation\n  if (mimeType.includes('spreadsheetml')) return 'xls';\n  if (mimeType.includes('presentationml')) return 'ppt';\n  if (mimeType.includes('wordprocessingml')) return 'doc';\n\n  if (mimeType.includes('sheet') || mimeType.includes('excel')) return 'xls';\n  if (mimeType.includes('presentation') || mimeType.includes('powerpoint')) return 'ppt';\n  if (mimeType.includes('word') || mimeType.includes('document')) return 'doc';\n  if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'zip';\n  if (mimeType.includes('image')) return 'jpg';\n  if (mimeType.includes('audio')) return 'mp3';\n  if (mimeType.includes('video')) return 'mov';\n  return 'default';\n}\n\n/**\n * The extension for icon lookup: whatever the SDK reported, else the tail of the filename.\n * `Attachment.getExtension()` is frequently empty on received messages, and without this the\n * MIME fallback has to guess a format it can only approximate.\n */\nexport function resolveFileExtension(name: string | undefined, sdkExtension?: string): string {\n  const fromSdk = (sdkExtension ?? '').trim().replace(/^\\./, '');\n  if (fromSdk) return fromSdk.toLowerCase();\n  const fileName = name ?? '';\n  const dot = fileName.lastIndexOf('.');\n  return dot >= 0 ? fileName.slice(dot + 1).toLowerCase() : '';\n}\n\n/**\n * Get the file icon URL for a file type.\n */\nexport function getFileIcon(fileType: string): string {\n  return FILE_TYPE_ICONS[fileType] || FILE_TYPE_ICONS['default'];\n}\n\n/**\n * Format file size in human-readable format.\n * Converts bytes to appropriate unit (B, KB, MB, GB) with 2 decimal places.\n * @see Requirements 10.1-10.6\n */\nexport function formatFileSize(bytes: number | null | undefined): string {\n  if (bytes == null || bytes === 0 || typeof bytes !== 'number') {\n    return CometChatLocalize.getLocalizedString('file_bubble_size_unknown');\n  }\n  // Rounded to match the React kit: \"98 KB\", \"35.9 MB\" — not \"98.00 KB\" / \"35.90 MB\".\n  // The GB tier has no React counterpart (it would render \"2048.0 MB\"); kept deliberately.\n  if (bytes < 1024) return `${bytes} B`;\n  if (bytes < 1048576) return `${Math.round(bytes / 1024)} KB`;\n  if (bytes < 1073741824) return `${(bytes / 1048576).toFixed(1)} MB`;\n  return `${(bytes / 1073741824).toFixed(1)} GB`;\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  OnDestroy,\n  Injectable,\n  ViewChild,\n  ElementRef,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { getFileType, getFileIcon, formatFileSize, resolveFileExtension } from '../cometchat-file-bubble/cometchat-file-bubble.types';\nimport type { FileAttachment } from '../../modals/FileAttachment';\nimport type {\n  AttachmentFile,\n  AttachmentTileStatus,\n} from '../cometchat-message-composer/cometchat-message-composer.types';\n\n/**\n * Ensures at most one tray audio tile plays at a time. Pausing the previously-active element fires\n * its native `pause` event, which keeps that tile's play/pause icon in sync (OnPush-safe).\n */\n@Injectable({ providedIn: 'root' })\nexport class TrayAudioCoordinatorService {\n  private active: HTMLAudioElement | null = null;\n\n  play(el: HTMLAudioElement): void {\n    if (this.active && this.active !== el) {\n      this.active.pause();\n    }\n    this.active = el;\n  }\n\n  release(el: HTMLAudioElement): void {\n    if (this.active === el) {\n      this.active = null;\n    }\n  }\n}\n\n/** What the centre of a tile shows for a given upload status. */\nexport type TileAffordance = 'progress' | 'retry' | 'error' | 'none';\n\n/**\n * Pure mapping status -> centre affordance. Exported for property tests (NFR-2).\n * - progress : in flight (uploading/pending)\n * - retry    : failed (retryable)\n * - error    : rejected (not retryable)\n * - none     : uploaded / cancelled (nothing in the centre)\n */\nexport function affordanceFor(status: AttachmentTileStatus): TileAffordance {\n  switch (status) {\n    case 'uploading':\n    case 'pending':\n      return 'progress';\n    case 'failed':\n      return 'retry';\n    case 'rejected':\n    case 'error':\n      return 'error';\n    case 'uploaded':\n    case 'cancelled':\n    default:\n      return 'none';\n  }\n}\n\n/** Precomputed, template-friendly view of a tile (no function calls in the template). */\ninterface TileView {\n  isImage: boolean;\n  isVideo: boolean;\n  isFile: boolean;\n  isAudio: boolean;\n  isMediaSquare: boolean;\n  affordance: TileAffordance;\n  isUploading: boolean;\n  /** Failed and retryable — the top-right badge becomes a retry control. */\n  canRetry: boolean;\n  /** Rejected — terminal, not retryable; the top-right badge becomes an error indicator. */\n  isRejected: boolean;\n  /** Either error state: draws the red border and swaps the card's meta line for status text. */\n  hasError: boolean;\n  /**\n   * Whether the centre progress ring is present. Only while the upload is in flight — error states\n   * are shown by the border, the centred retry/error badge and the inline text instead.\n   */\n  hasOverlay: boolean;\n  /**\n   * Whether the ring spins as a continuous (indeterminate) arc instead of filling by percentage.\n   * An upload that hasn't reported any progress yet has nothing to fill, so a determinate ring would\n   * sit at 0% and read as frozen; it flips to the real progressive arc on the first progress event.\n   */\n  isIndeterminate: boolean;\n  /**\n   * Whether the centre scrim (dark tint over the icon) is present — behind the progress ring while\n   * uploading, and behind the retry/error badge in an error state, so the centred affordance always\n   * reads on a dimmed backdrop rather than floating over the raw icon/text.\n   */\n  hasScrim: boolean;\n  /** Localization key for the inline status line, or '' when the normal meta line shows. */\n  statusTextKey: string;\n  /**\n   * The upload error surfaced on hover, only for a REJECTED (terminal) tile — the SDK/API message\n   * when present, else a generic localized fallback. '' for every other tile (including retryable\n   * ones, which show \"Tap to retry\" inline instead), which also gates the hover handlers so those\n   * tiles never open a tooltip.\n   */\n  errorTooltip: string;\n  clickable: boolean;\n  /** Audio playback (play/pause + seek) is enabled only once the upload has succeeded. */\n  clickableAudio: boolean;\n  /** Card meta line, e.g. \"PDF · 2.4 MB\". */\n  metaText: string;\n  /** Dedicated colored file-type icon (PDF/Word/Excel/…) for file tiles; '' for non-files. */\n  fileTypeIconUrl: string;\n  /** `mm:ss` badge for video tiles once the duration is known; '' otherwise. */\n  durationLabel: string;\n}\n\n/**\n * CometChatAttachmentTile\n *\n * Presentational tile for one staged attachment in the composer tray. Renders by\n * type (image/video square, file/audio card) with a status affordance\n * (progress ring / retry / error) and a top-right cancel/remove control.\n *\n * Internal component — not exported from `public-api.ts`.\n */\n@Component({\n  selector: 'cometchat-attachment-tile',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-attachment-tile.component.html',\n  styleUrls: ['./cometchat-attachment-tile.component.css'],\n})\nexport class CometChatAttachmentTileComponent implements OnDestroy {\n  private _tile!: AttachmentFile;\n  /** Precomputed view — rebuilt whenever the tile input changes. */\n  view!: TileView;\n\n  private readonly audioCoordinator = inject(TrayAudioCoordinatorService);\n  private readonly cdr = inject(ChangeDetectorRef);\n  @ViewChild('audioEl') private audioElRef?: ElementRef<HTMLAudioElement>;\n\n  @Input({ required: true })\n  set tile(value: AttachmentFile) {\n    this._tile = value;\n    this.view = this.buildView(value);\n    // Audio tiles are playable in the tray — create a local (playable) object URL once per file.\n    if (\n      value.type === 'audio' &&\n      !this.audioSrc &&\n      value.file &&\n      typeof URL !== 'undefined' &&\n      typeof URL.createObjectURL === 'function'\n    ) {\n      try {\n        this.audioSrc = URL.createObjectURL(value.file);\n      } catch {\n        /* ignore — no local playback */\n      }\n    }\n  }\n  get tile(): AttachmentFile {\n    return this._tile;\n  }\n\n  ngOnDestroy(): void {\n    this.cancelTooltipFrame();\n    if (this.audioElRef?.nativeElement) {\n      this.audioCoordinator.release(this.audioElRef.nativeElement);\n    }\n    if (this.audioSrc && typeof URL !== 'undefined' && typeof URL.revokeObjectURL === 'function') {\n      try {\n        URL.revokeObjectURL(this.audioSrc);\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n\n  @Output() cancelClick = new EventEmitter<AttachmentFile>();\n  @Output() removeClick = new EventEmitter<AttachmentFile>();\n  @Output() retryClick = new EventEmitter<AttachmentFile>();\n  @Output() tileClick = new EventEmitter<AttachmentFile>();\n\n  // Monochrome icons rendered via mask-image (see svg-icons standard).\n  readonly closeIconUrl = 'assets/close.svg';\n  readonly playIconUrl = 'assets/play_arrow.svg';\n  readonly pauseIconUrl = 'assets/pause.svg';\n\n  // Status badges rendered as real <img> — NOT mask-image. Both SVGs bake in their own red circle\n  // and white glyph; a mask would keep only the alpha channel and flatten them to a silhouette.\n  readonly retryIconUrl = 'assets/retry-icon.svg';\n  readonly errorIconUrl = 'assets/error-icon.svg';\n\n  // Determinate upload-progress ring: one 32x32 geometry used over the media square, the file\n  // icon box and the audio play button alike.\n  readonly ringStroke = 3;\n  readonly ringSize = 32;\n  readonly ringRadius = 14;\n  readonly ringCircumference = 2 * Math.PI * this.ringRadius;\n\n  // ── Error tooltip state ──────────────────────────────────────────────────\n  // Shown on hover/focus of a failed tile. Rendered `position: fixed` and anchored to the tile's\n  // viewport rect, so it escapes the tray row's `overflow: hidden` clip and always sits ON TOP of\n  // the tile instead of being cut off inside the scroll strip. The bubble is then clamped INSIDE\n  // the composer's width (see positionTooltip) so a tile near either edge never pushes it past the\n  // composer; the arrow slides along the bottom to stay under the tile — this is what produces the\n  // bottom-left / bottom-center / bottom-right states.\n  protected tooltipVisible = false;\n  /** Flipped true one frame after mount, once the bubble is measured and clamped — drives the\n   *  opacity fade so the jump from the raw anchor to the clamped spot is never seen. */\n  protected tooltipPlaced = false;\n  protected tooltipLeft = 0; // fixed-coord LEFT edge of the bubble\n  protected tooltipTop = 0; // fixed-coord anchor (tile top); the bubble sits above via translateY(-100%)\n  protected tooltipArrowLeft = 0; // arrow centre, px from the bubble's left edge\n\n  @ViewChild('tooltipEl') private tooltipRef?: ElementRef<HTMLElement>;\n  /** The hovered tile, remembered so the deferred placement frame can re-measure it. */\n  private tooltipAnchor: HTMLElement | null = null;\n  /** Pending measure-and-place frame; cancelled if the pointer leaves first. */\n  private tooltipRaf = 0;\n  /** Keep the bubble (and the arrow) off the composer's inner edges. */\n  private static readonly TOOLTIP_EDGE_GAP = 8;\n  /** Keep the arrow tucked under the rounded body rather than at the very corner. */\n  private static readonly TOOLTIP_ARROW_INSET = 12;\n\n  /** Open the tooltip above `hostEl`, but only for a failed tile that has a message to show. */\n  showErrorTooltip(hostEl: HTMLElement): void {\n    if (!this.view.errorTooltip) {\n      return;\n    }\n    this.tooltipAnchor = hostEl;\n    this.tooltipPlaced = false;\n    this.tooltipVisible = true;\n    // Render the bubble now (also resolves the #tooltipEl ViewChild) so it can be measured, then\n    // clamp it on the next frame once the browser has laid it out.\n    this.cdr.detectChanges();\n    if (typeof requestAnimationFrame === 'function') {\n      this.cancelTooltipFrame();\n      this.tooltipRaf = requestAnimationFrame(() => {\n        this.tooltipRaf = 0;\n        this.positionTooltip();\n      });\n    } else {\n      this.positionTooltip(); // no rAF (SSR/tests) — place synchronously\n    }\n  }\n\n  hideErrorTooltip(): void {\n    this.cancelTooltipFrame();\n    this.tooltipVisible = false;\n    this.tooltipPlaced = false;\n    this.tooltipAnchor = null;\n  }\n\n  /**\n   * Measure the mounted bubble and clamp it inside the composer's width. The bubble is centred over\n   * the tile, then pulled fully inside `[min, max]` so it never overflows the composer; the arrow\n   * then tracks the tile centre (kept under the rounded body) — giving the left / centre / right\n   * arrow states purely from geometry.\n   */\n  private positionTooltip(): void {\n    const host = this.tooltipAnchor;\n    const bubble = this.tooltipRef?.nativeElement;\n    if (!this.tooltipVisible || !host || !bubble) {\n      return;\n    }\n    const tile = host.getBoundingClientRect();\n    const width = bubble.offsetWidth;\n    const centerX = tile.left + tile.width / 2;\n\n    // Horizontal clamp bounds: the composer's inner width, else the viewport as a fallback.\n    const gap = CometChatAttachmentTileComponent.TOOLTIP_EDGE_GAP;\n    const composer = host.closest('.cometchat-message-composer') as HTMLElement | null;\n    const bounds = composer?.getBoundingClientRect();\n    const min = (bounds ? bounds.left : 0) + gap;\n    const viewportRight =\n      typeof window !== 'undefined' ? window.innerWidth : centerX + width;\n    const max = (bounds ? bounds.right : viewportRight) - gap;\n\n    // Centre over the tile, then pull fully inside [min, max]. If the bubble is wider than the\n    // available width (very narrow composer), pin to the left edge — best effort.\n    let left = centerX - width / 2;\n    const maxLeft = max - width;\n    left = maxLeft >= min ? Math.min(Math.max(left, min), maxLeft) : min;\n\n    // Arrow follows the tile centre but stays under the rounded body.\n    const inset = CometChatAttachmentTileComponent.TOOLTIP_ARROW_INSET;\n    const arrow = Math.min(Math.max(centerX - left, inset), Math.max(inset, width - inset));\n\n    this.tooltipTop = tile.top;\n    this.tooltipLeft = left;\n    this.tooltipArrowLeft = arrow;\n    this.tooltipPlaced = true;\n    this.cdr.detectChanges();\n  }\n\n  private cancelTooltipFrame(): void {\n    if (this.tooltipRaf && typeof cancelAnimationFrame === 'function') {\n      cancelAnimationFrame(this.tooltipRaf);\n    }\n    this.tooltipRaf = 0;\n  }\n\n  // ── Audio playback state (audio tiles are playable in the tray after upload) ──\n  protected audioSrc = '';\n  protected audioPlaying = false;\n  protected audioCurrentTime = 0;\n  protected audioDuration = 0;\n\n  /** Dash offset for the given upload percent (0 → empty ring, 100 → full circle). */\n  ringDashoffset(progress: number | undefined): number {\n    const p = Math.max(0, Math.min(100, progress ?? 0));\n    return this.ringCircumference * (1 - p / 100);\n  }\n\n  /** Fraction of the circle drawn by the indeterminate arc as it spins. */\n  private static readonly INDETERMINATE_ARC = 0.25;\n\n  /**\n   * Dash pattern for the ring's fill: the whole circumference when determinate (so `ringDashoffset`\n   * controls how much shows), or a short arc + a full-circumference gap when indeterminate, leaving\n   * a single arc for the CSS spin animation to sweep around.\n   */\n  get ringDasharray(): string {\n    if (!this.view.isIndeterminate) {\n      return `${this.ringCircumference}`;\n    }\n    const arc = this.ringCircumference * CometChatAttachmentTileComponent.INDETERMINATE_ARC;\n    return `${arc} ${this.ringCircumference}`;\n  }\n\n  /**\n   * Play/pause. `audioPlaying` is driven by the element's native (play)/(pause) events (see template),\n   * NOT set optimistically — so the icon stays correct if play() is blocked/rejected or the element\n   * is auto-paused (e.g. another tile starts, or a system interruption).\n   */\n  toggleAudio(el: HTMLAudioElement): void {\n    if (el.paused) {\n      this.audioCoordinator.play(el); // pauses any other playing tray audio\n      void el.play().catch(() => {\n        /* playback blocked/failed — the (pause) listener keeps audioPlaying in sync */\n      });\n    } else {\n      el.pause();\n      this.audioCoordinator.release(el);\n    }\n  }\n\n  onAudioLoaded(el: HTMLAudioElement): void {\n    if (Number.isFinite(el.duration)) {\n      this.audioDuration = el.duration;\n    }\n  }\n\n  onAudioTime(el: HTMLAudioElement): void {\n    this.audioCurrentTime = el.currentTime;\n  }\n\n  onAudioEnded(): void {\n    this.audioPlaying = false;\n    this.audioCurrentTime = 0;\n    if (this.audioElRef?.nativeElement) {\n      this.audioCoordinator.release(this.audioElRef.nativeElement);\n    }\n  }\n\n  onAudioSeek(el: HTMLAudioElement, event: Event): void {\n    const value = Number((event.target as HTMLInputElement).value);\n    el.currentTime = value;\n    this.audioCurrentTime = value;\n  }\n\n  /** `mm:ss` with zero-padded minutes (e.g. \"00:07\"). */\n  formatTime(seconds: number): string {\n    const total = !seconds || seconds < 0 || !Number.isFinite(seconds) ? 0 : Math.floor(seconds);\n    const mins = Math.floor(total / 60);\n    const secs = total % 60;\n    return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n  }\n\n  /** ✕ (top-right): cancel while uploading, otherwise remove. */\n  onTopRightAction(): void {\n    if (this.view.isUploading) {\n      this.cancelClick.emit(this._tile);\n    } else {\n      this.removeClick.emit(this._tile);\n    }\n  }\n\n  onRetry(event: Event): void {\n    event.stopPropagation();\n    this.retryClick.emit(this._tile);\n  }\n\n  onOpen(): void {\n    if (this.view.clickable) {\n      this.tileClick.emit(this._tile);\n    }\n  }\n\n  onOpenKeydown(event: Event): void {\n    event.preventDefault();\n    this.onOpen();\n  }\n\n  private buildView(t: AttachmentFile): TileView {\n    const isImage = t.type === 'image';\n    const isVideo = t.type === 'video';\n    const isFile = t.type === 'file';\n    const isAudio = t.type === 'audio';\n    const affordance = affordanceFor(t.status);\n    const isUploaded = t.status === 'uploaded';\n    return {\n      isImage,\n      isVideo,\n      isFile,\n      isAudio,\n      isMediaSquare: isImage || isVideo,\n      affordance,\n      isUploading: affordance === 'progress',\n      canRetry: affordance === 'retry',\n      isRejected: affordance === 'error',\n      hasError: affordance === 'retry' || affordance === 'error',\n      hasOverlay: affordance === 'progress',\n      isIndeterminate: affordance === 'progress' && !((t.uploadProgress ?? 0) > 0),\n      hasScrim: affordance === 'progress' || affordance === 'retry' || affordance === 'error',\n      statusTextKey:\n        affordance === 'retry'\n          ? 'attachment_tile_tap_to_retry'\n          : affordance === 'error'\n            ? 'attachment_tile_upload_failed'\n            : '',\n      // Only a rejected (terminal) tile gets a hover tooltip. A retryable tile already says\n      // \"Tap to retry\" inline and offers the retry badge, so it shows no tooltip.\n      errorTooltip:\n        affordance === 'error'\n          ? t.errorMessage?.trim() ||\n            CometChatLocalize.getLocalizedString('attachment_tile_upload_failed')\n          : '',\n      // Only image/video open a local fullscreen preview. Audio has no preview in the tray\n      // (it would only have the private/unsigned S3 URL to play, which 403s).\n      clickable: isUploaded && (isImage || isVideo),\n      clickableAudio: isUploaded && isAudio,\n      metaText: this.deriveMeta(t),\n      fileTypeIconUrl: isFile ? this.resolveFileIcon(t) : '',\n      durationLabel: isVideo && t.durationSec ? this.formatTime(t.durationSec) : '',\n    };\n  }\n\n  /** Dedicated file-type icon (PDF/Word/Excel/…), reusing the file-bubble's mapping. */\n  private resolveFileIcon(t: AttachmentFile): string {\n    const extension = resolveFileExtension(t.name, undefined);\n    return getFileIcon(\n      getFileType({ extension, mimeType: t.mimeType ?? '' } as unknown as FileAttachment),\n    );\n  }\n\n  private deriveType(t: AttachmentFile): string {\n    const fromName = t.name?.includes('.')\n      ? t.name.split('.').pop()\n      : undefined;\n    if (fromName) {\n      return fromName.toUpperCase();\n    }\n    const sub = (t.mimeType ?? '').split('/').pop();\n    return (sub ?? 'FILE').toUpperCase();\n  }\n\n  /**\n   * The card's meta line: `PDF · 2.4 MB`. The size is dropped when unknown (a staged file always\n   * has one, but a rehydrated tile may not) rather than showing a bare \"Size unknown\".\n   */\n  private deriveMeta(t: AttachmentFile): string {\n    const type = this.deriveType(t);\n    return t.size && t.size > 0 ? `${type} · ${formatFileSize(t.size)}` : type;\n  }\n}\n","<div\n  #tileRoot\n  class=\"cometchat-attachment-tile\"\n  [class.cometchat-attachment-tile--image]=\"view.isImage\"\n  [class.cometchat-attachment-tile--video]=\"view.isVideo\"\n  [class.cometchat-attachment-tile--file]=\"view.isFile\"\n  [class.cometchat-attachment-tile--audio]=\"view.isAudio\"\n  [class.cometchat-attachment-tile--uploading]=\"view.isUploading\"\n  [class.cometchat-attachment-tile--clickable]=\"view.clickable\"\n  (mouseenter)=\"showErrorTooltip(tileRoot)\"\n  (mouseleave)=\"hideErrorTooltip()\"\n  (focusin)=\"showErrorTooltip(tileRoot)\"\n  (focusout)=\"hideErrorTooltip()\"\n>\n  <!-- Image / Video square -->\n  @if (view.isMediaSquare) {\n    <div\n      class=\"cometchat-attachment-tile__media\"\n      [class.cometchat-attachment-tile__media--error]=\"view.hasError\"\n      [attr.role]=\"view.clickable ? 'button' : null\"\n      [attr.tabindex]=\"view.clickable ? 0 : null\"\n      [attr.aria-label]=\"tile.name\"\n      [style.background-image]=\"tile.thumbnailUrl ? 'url(' + tile.thumbnailUrl + ')' : null\"\n      (click)=\"onOpen()\"\n      (keydown.enter)=\"onOpenKeydown($event)\"\n      (keydown.space)=\"onOpenKeydown($event)\"\n      data-testid=\"attachment-tile-open\"\n    >\n      @if (view.isVideo) {\n        <span class=\"cometchat-attachment-tile__play\" aria-hidden=\"true\">\n          <span\n            class=\"cometchat-attachment-tile__play-icon\"\n            [style.-webkit-mask-image]=\"'url(' + playIconUrl + ')'\"\n            [style.mask-image]=\"'url(' + playIconUrl + ')'\"\n          ></span>\n        </span>\n      }\n      @if (view.durationLabel) {\n        <span class=\"cometchat-attachment-tile__duration\" aria-hidden=\"true\">{{\n          view.durationLabel\n        }}</span>\n      }\n      <!-- Scrim: dims the thumbnail behind the ring (uploading) OR the retry/error badge, so the\n           centred affordance always reads on a dark backdrop. Ring only while in flight. -->\n      @if (view.hasScrim) {\n        <span class=\"cometchat-attachment-tile__overlay\">\n          @if (view.hasOverlay) {\n            <ng-container *ngTemplateOutlet=\"progressRing\"></ng-container>\n          }\n        </span>\n      }\n      <!-- Error/retry indicator, centred on the thumbnail (not the corner). -->\n      @if (view.hasError) {\n        <ng-container *ngTemplateOutlet=\"statusBadge\"></ng-container>\n      }\n    </div>\n  } @else if (view.isAudio) {\n    <!-- Audio player card: round play/pause button + seekable slider + current/total time.\n         Playback is enabled only once the upload has succeeded. On an error the bar and time give\n         way to the inline status line, and the top-right badge carries the retry/error affordance. -->\n    <div\n      class=\"cometchat-attachment-tile__card cometchat-attachment-tile__card--audio\"\n      [class.cometchat-attachment-tile__card--error]=\"view.hasError\"\n    >\n      <div class=\"cometchat-attachment-tile__audio-control\">\n        <button\n          type=\"button\"\n          class=\"cometchat-attachment-tile__audio-button\"\n          [disabled]=\"!view.clickableAudio\"\n          [attr.aria-label]=\"(audioPlaying ? 'audio_bubble_pause' : 'audio_bubble_play') | translate\"\n          (click)=\"toggleAudio(audioEl)\"\n        >\n          <span\n            class=\"cometchat-attachment-tile__audio-icon\"\n            aria-hidden=\"true\"\n            [style.-webkit-mask-image]=\"'url(' + (audioPlaying ? pauseIconUrl : playIconUrl) + ')'\"\n            [style.mask-image]=\"'url(' + (audioPlaying ? pauseIconUrl : playIconUrl) + ')'\"\n          ></span>\n        </button>\n        <!-- Scrim is a SIBLING of the button, never a child — it must not swallow its clicks. Dims\n             the play disc behind the ring (uploading) OR the retry/error badge. Ring only in flight. -->\n        @if (view.hasScrim) {\n          <span class=\"cometchat-attachment-tile__overlay\">\n            @if (view.hasOverlay) {\n              <ng-container *ngTemplateOutlet=\"progressRing\"></ng-container>\n            }\n          </span>\n        }\n        <!-- Error/retry indicator, centred on the play disc (not the corner). -->\n        @if (view.hasError) {\n          <ng-container *ngTemplateOutlet=\"statusBadge\"></ng-container>\n        }\n      </div>\n\n      <div class=\"cometchat-attachment-tile__audio-body\">\n        <span class=\"cometchat-attachment-tile__name\" [title]=\"tile.name\">{{ tile.name }}</span>\n        @if (view.statusTextKey) {\n          <span class=\"cometchat-attachment-tile__error-text\" data-testid=\"attachment-tile-status\">\n            {{ view.statusTextKey | translate }}\n          </span>\n        } @else {\n          <input\n            type=\"range\"\n            class=\"cometchat-attachment-tile__audio-bar\"\n            min=\"0\"\n            [max]=\"audioDuration || 0\"\n            step=\"0.1\"\n            [value]=\"audioCurrentTime\"\n            [disabled]=\"!view.clickableAudio\"\n            [attr.aria-label]=\"tile.name\"\n            (input)=\"onAudioSeek(audioEl, $event)\"\n          />\n          <span class=\"cometchat-attachment-tile__audio-status\">\n            {{ formatTime(audioCurrentTime) }}/{{ formatTime(audioDuration) }}\n          </span>\n        }\n      </div>\n\n      <audio\n        #audioEl\n        [src]=\"audioSrc\"\n        preload=\"metadata\"\n        (loadedmetadata)=\"onAudioLoaded(audioEl)\"\n        (timeupdate)=\"onAudioTime(audioEl)\"\n        (play)=\"audioPlaying = true\"\n        (pause)=\"audioPlaying = false\"\n        (ended)=\"onAudioEnded()\"\n      ></audio>\n    </div>\n  } @else {\n    <!-- File card -->\n    <div\n      class=\"cometchat-attachment-tile__card\"\n      [class.cometchat-attachment-tile__card--error]=\"view.hasError\"\n      [attr.role]=\"view.clickable ? 'button' : null\"\n      [attr.tabindex]=\"view.clickable ? 0 : null\"\n      [attr.aria-label]=\"tile.name\"\n      (click)=\"onOpen()\"\n      (keydown.enter)=\"onOpenKeydown($event)\"\n      (keydown.space)=\"onOpenKeydown($event)\"\n      data-testid=\"attachment-tile-open\"\n    >\n      <span class=\"cometchat-attachment-tile__leading\">\n        <!-- Dedicated colored file-type icon (PDF/Word/Excel/…) — a real image, never a mask. -->\n        <img\n          class=\"cometchat-attachment-tile__type-image\"\n          [src]=\"view.fileTypeIconUrl\"\n          alt=\"\"\n          aria-hidden=\"true\"\n        />\n        <!-- Scrim: dims the file glyph behind the ring (uploading) OR the retry/error badge, so the\n             centred affordance always reads on a dark backdrop. Ring only while in flight. -->\n        @if (view.hasScrim) {\n          <span class=\"cometchat-attachment-tile__overlay\">\n            @if (view.hasOverlay) {\n              <ng-container *ngTemplateOutlet=\"progressRing\"></ng-container>\n            }\n          </span>\n        }\n        <!-- Error/retry indicator, centred on the file-type icon (not the corner). -->\n        @if (view.hasError) {\n          <ng-container *ngTemplateOutlet=\"statusBadge\"></ng-container>\n        }\n      </span>\n      <span class=\"cometchat-attachment-tile__meta\">\n        <span class=\"cometchat-attachment-tile__name\" [title]=\"tile.name\">{{ tile.name }}</span>\n        @if (view.statusTextKey) {\n          <span class=\"cometchat-attachment-tile__error-text\" data-testid=\"attachment-tile-status\">\n            {{ view.statusTextKey | translate }}\n          </span>\n        } @else {\n          <span class=\"cometchat-attachment-tile__sub\">{{ view.metaText }}</span>\n        }\n      </span>\n    </div>\n  }\n\n  <!--\n    Top-right ✕: cancel while uploading, otherwise remove — revealed on hover/focus. A FAILED tile\n    still shows the ✕ (to dismiss the attachment) ALONGSIDE its centred retry badge, so retry and\n    remove are both reachable; the two never collide (retry is centred, ✕ overhangs the corner). The\n    retry/error indicators themselves render CENTRED on the icon (see the #statusBadge outlets in\n    each type block above), not here.\n  -->\n  <button\n    type=\"button\"\n    class=\"cometchat-attachment-tile__close\"\n    [attr.aria-label]=\"\n      (view.isUploading\n        ? 'message_composer_attachment_cancel'\n        : 'message_composer_remove_attachment') | translate\n    \"\n    [attr.data-testid]=\"view.isUploading ? 'attachment-tile-cancel' : 'attachment-tile-remove'\"\n    (click)=\"onTopRightAction()\"\n  >\n    <span\n      class=\"cometchat-attachment-tile__close-icon\"\n      aria-hidden=\"true\"\n      [style.-webkit-mask-image]=\"'url(' + closeIconUrl + ')'\"\n      [style.mask-image]=\"'url(' + closeIconUrl + ')'\"\n    ></span>\n  </button>\n\n  <!--\n    Failure tooltip. Only a failed/rejected tile builds `errorTooltip`, so healthy tiles render\n    nothing here. `position: fixed`, anchored to the tile's viewport rect (see showErrorTooltip),\n    so it clears the tray row's overflow clip and sits on top of the tile.\n  -->\n  @if (view.errorTooltip && tooltipVisible) {\n    <span\n      #tooltipEl\n      class=\"cometchat-attachment-tile__tooltip\"\n      [class.cometchat-attachment-tile__tooltip--placed]=\"tooltipPlaced\"\n      role=\"tooltip\"\n      data-testid=\"attachment-tile-tooltip\"\n      [style.left.px]=\"tooltipLeft\"\n      [style.top.px]=\"tooltipTop\"\n      [style.--cometchat-attachment-tile-tooltip-arrow-left]=\"tooltipArrowLeft + 'px'\"\n    >\n      {{ view.errorTooltip }}\n    </span>\n  }\n</div>\n\n<!--\n  Determinate upload ring, centred by an ancestor `__overlay` scrim: over the image/video square,\n  the file-type icon box, or the audio play disc. Shown only while the upload is in flight — error\n  states are carried by the red border, the corner badge and the inline status line.\n-->\n<ng-template #progressRing>\n  <span class=\"cometchat-attachment-tile__progress\" aria-hidden=\"true\">\n    <svg\n      class=\"cometchat-attachment-tile__loader-ring\"\n      [class.cometchat-attachment-tile__loader-ring--indeterminate]=\"view.isIndeterminate\"\n      [attr.width]=\"ringSize\"\n      [attr.height]=\"ringSize\"\n      [attr.viewBox]=\"'0 0 ' + ringSize + ' ' + ringSize\"\n    >\n      <circle\n        class=\"cometchat-attachment-tile__loader-track\"\n        [attr.cx]=\"ringSize / 2\"\n        [attr.cy]=\"ringSize / 2\"\n        [attr.r]=\"ringRadius\"\n        [attr.stroke-width]=\"ringStroke\"\n        fill=\"none\"\n      ></circle>\n      <circle\n        class=\"cometchat-attachment-tile__loader-fill\"\n        [attr.cx]=\"ringSize / 2\"\n        [attr.cy]=\"ringSize / 2\"\n        [attr.r]=\"ringRadius\"\n        [attr.stroke-width]=\"ringStroke\"\n        fill=\"none\"\n        stroke-linecap=\"round\"\n        [attr.stroke-dasharray]=\"ringDasharray\"\n        [attr.stroke-dashoffset]=\"view.isIndeterminate ? 0 : ringDashoffset(tile.uploadProgress)\"\n      ></circle>\n    </svg>\n  </span>\n</ng-template>\n\n<!--\n  Error/retry indicator, centred over the tile's icon (thumbnail / file glyph / audio disc). Outlet\n  into each type block's icon container so it centres on the icon regardless of type. failed -> a\n  tappable retry circle; rejected -> a static error circle. Both SVGs bake in their own red disc +\n  white glyph, so they are plain <img> (no mask). testids/roles are unchanged from the old corner\n  badge — only the position moved.\n-->\n<ng-template #statusBadge>\n  @if (view.canRetry) {\n    <button\n      type=\"button\"\n      class=\"cometchat-attachment-tile__status-badge cometchat-attachment-tile__status-badge--retry\"\n      [attr.aria-label]=\"'message_composer_retry_upload' | translate\"\n      data-testid=\"attachment-tile-retry\"\n      (click)=\"onRetry($event)\"\n    >\n      <img\n        class=\"cometchat-attachment-tile__badge-icon\"\n        [src]=\"retryIconUrl\"\n        alt=\"\"\n        aria-hidden=\"true\"\n        width=\"24\"\n        height=\"24\"\n        draggable=\"false\"\n      />\n    </button>\n  } @else if (view.isRejected) {\n    <span\n      class=\"cometchat-attachment-tile__status-badge cometchat-attachment-tile__status-badge--error\"\n      role=\"img\"\n      [attr.aria-label]=\"'attachment_tile_upload_failed' | translate\"\n      data-testid=\"attachment-tile-error\"\n    >\n      <img\n        class=\"cometchat-attachment-tile__badge-icon\"\n        [src]=\"errorIconUrl\"\n        alt=\"\"\n        aria-hidden=\"true\"\n        width=\"24\"\n        height=\"24\"\n        draggable=\"false\"\n      />\n    </span>\n  }\n</ng-template>\n","import { Injectable, signal, computed, inject } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { CometChatToastService } from '../components/base-elements/cometchat-toast/cometchat-toast.service';\nimport type {\n  AttachmentFile,\n} from '../components/cometchat-message-composer/cometchat-message-composer.types';\n\n/** Fallback when the SDK max-attachment-count setting is unavailable. */\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/**\n * SDK/server upload error code → UIKit localization key. When an upload fails, `errorText` looks the\n * exception's `code` up here and shows the short, localized copy instead of the SDK's raw message\n * (which is English-only and byte-precise, e.g. \"...exceeds the maximum allowed size of 104857600\n * bytes.\"). Codes not listed fall through to a message-text heuristic, then to the raw message.\n *\n * Extend this as server error codes are confirmed — the file-TYPE rejection is a server response, so\n * its exact code goes here once known (until then the message heuristic in resolveUploadErrorKey\n * catches it).\n */\nconst UPLOAD_ERROR_LOCALE_KEY: Readonly<Record<string, string>> = {\n  ERR_FILE_SIZE_EXCEEDED: 'message_composer_upload_error_file_size',\n};\n\n/**\n * Codes that identify a failure only LOOSELY, consulted after the message heuristics rather than\n * before them. `ERR_BAD_REQUEST` is what the server returns when it rejects a file's type, but it\n * is a generic 400 — treating it as authoritative would relabel any other 400 (a size rejection,\n * say) as a type error. Checking it last means a message that clearly states its own reason still\n * wins, and everything else lands on the type copy.\n */\nconst UPLOAD_ERROR_FALLBACK_LOCALE_KEY: Readonly<Record<string, string>> = {\n  ERR_BAD_REQUEST: 'message_composer_upload_error_invalid_file',\n};\n\n/** Byte-weighted aggregate progress across staged tiles. */\nexport interface TrayAggregate {\n  loaded: number;\n  total: number;\n  percent: number;\n}\n\n// ──────────────────────────────────────────────────────────────────────────\n// Pure helpers (exported for property-based tests — NFR-2). No SDK / no state.\n// ──────────────────────────────────────────────────────────────────────────\n\n/**\n * Byte-weighted aggregate. `percent = round(Σloaded / Σtotal * 100)`.\n * Returns 0% when there is nothing to upload. NEVER averages per-tile percentages —\n * large files must weigh proportionally (design doc §5.4).\n */\nexport function computeAggregate(tiles: AttachmentFile[]): TrayAggregate {\n  let loaded = 0;\n  let total = 0;\n  for (const t of tiles) {\n    loaded += t.loaded ?? 0;\n    total += t.total ?? t.size ?? 0;\n  }\n  const percent = total > 0 ? Math.round((loaded / total) * 100) : 0;\n  return { loaded, total, percent };\n}\n\n/**\n * Send is allowed iff the tray is non-empty, no tile is still in flight\n * (`pending`/`uploading`), and at least one tile is `uploaded`.\n */\nexport function deriveCanSend(tiles: AttachmentFile[]): boolean {\n  if (tiles.length === 0) {\n    return false;\n  }\n  const anyInFlight = tiles.some(\n    (t) => t.status === 'uploading' || t.status === 'pending',\n  );\n  const anyUploaded = tiles.some((t) => t.status === 'uploaded');\n  return !anyInFlight && anyUploaded;\n}\n\n/** Classify a file into the tray tile type from its MIME type. */\nexport function detectAttachmentType(\n  mimeType: string | undefined,\n): 'image' | 'video' | 'audio' | 'file' {\n  const m = (mimeType ?? '').toLowerCase();\n  if (m.startsWith('image/')) return 'image';\n  if (m.startsWith('video/')) return 'video';\n  if (m.startsWith('audio/')) return 'audio';\n  return 'file';\n}\n\n/**\n * Whether a file's MIME type matches an accept pattern. Supports exact\n * (`image/png`), wildcard subtype (`image/*`), and `*`/`*​/*`. Exported for tests.\n */\nexport function mimeMatches(fileType: string, pattern: string): boolean {\n  const t = (fileType || '').toLowerCase();\n  const p = (pattern || '').toLowerCase();\n  if (!p || p === '*' || p === '*/*') return true;\n  if (p.endsWith('/*')) return t.startsWith(p.slice(0, -1));\n  return t === p;\n}\n\n/** First-frame poster + duration read from a local video File. Both fields are best-effort. */\nexport interface VideoMeta {\n  /** JPEG data-URL of the first decodable frame, or `undefined` on any failure. */\n  poster?: string;\n  /** Clip length in seconds, or `undefined` when the browser reports a non-finite duration. */\n  durationSec?: number;\n}\n\n/**\n * Extract the first frame of a local video File as a JPEG data-URL poster, plus its duration\n * (best-effort, fully local). Resolves an empty object on any failure (no DOM, unsupported codec,\n * decode/seek error, timeout). The poster is downscaled to `maxDim` so the data URL stays small.\n * Never rejects; always cleans up the temporary <video>/object-URL.\n */\nexport function extractVideoMeta(file: File, maxDim = 320): Promise<VideoMeta> {\n  if (\n    typeof document === 'undefined' ||\n    typeof URL === 'undefined' ||\n    typeof URL.createObjectURL !== 'function'\n  ) {\n    return Promise.resolve({});\n  }\n\n  const url = URL.createObjectURL(file);\n  const video = document.createElement('video');\n  video.muted = true;\n  video.preload = 'auto';\n  (video as HTMLVideoElement & { playsInline: boolean }).playsInline = true;\n\n  const cleanup = (): undefined => {\n    video.onloadeddata = null;\n    video.onerror = null;\n    video.onseeked = null;\n    try {\n      video.removeAttribute('src');\n      video.load();\n    } catch {\n      /* ignore */\n    }\n    if (typeof URL.revokeObjectURL === 'function') {\n      try {\n        URL.revokeObjectURL(url);\n      } catch {\n        /* ignore */\n      }\n    }\n    return undefined;\n  };\n\n  const once = (event: 'loadeddata' | 'seeked', timeoutMs: number): Promise<void> =>\n    new Promise<void>((resolve, reject) => {\n      const timer = setTimeout(() => reject(new Error(`${event} timeout`)), timeoutMs);\n      const handler = () => {\n        clearTimeout(timer);\n        resolve();\n      };\n      if (event === 'loadeddata') {\n        video.onloadeddata = handler;\n        video.onerror = () => {\n          clearTimeout(timer);\n          reject(new Error('decode error'));\n        };\n      } else {\n        video.onseeked = handler;\n      }\n    });\n\n  return (async (): Promise<VideoMeta> => {\n    // Captured right after metadata lands so it survives a later poster failure — the duration\n    // badge should still render even when the frame can't be decoded.\n    let durationSec: number | undefined;\n    try {\n      video.src = url;\n      video.load();\n      await once('loadeddata', 4000);\n      if (Number.isFinite(video.duration) && video.duration > 0) {\n        durationSec = video.duration;\n      }\n      // Seek slightly past the start so we skip an all-black leading frame when present. Skip the\n      // seek entirely for a ~0 target (e.g. zero-duration clips) — assigning currentTime to the\n      // value it already holds never fires 'seeked' and would stall until the timeout; the frame\n      // from loadeddata is already usable.\n      const target = Math.min(0.1, (Number.isFinite(video.duration) ? video.duration : 1) / 2);\n      if (target > 0.01) {\n        try {\n          video.currentTime = target;\n          await once('seeked', 2000);\n        } catch {\n          /* seek unsupported/failed — capture whatever frame is decoded */\n        }\n      }\n      const w = video.videoWidth;\n      const h = video.videoHeight;\n      if (!w || !h) {\n        cleanup();\n        return { durationSec };\n      }\n      const scale = Math.min(1, maxDim / Math.max(w, h));\n      const canvas = document.createElement('canvas');\n      canvas.width = Math.max(1, Math.round(w * scale));\n      canvas.height = Math.max(1, Math.round(h * scale));\n      const ctx = canvas.getContext('2d');\n      if (!ctx) {\n        cleanup();\n        return { durationSec };\n      }\n      ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\n      const dataUrl = canvas.toDataURL('image/jpeg', 0.8);\n      cleanup();\n      const poster = dataUrl && dataUrl.startsWith('data:image/') ? dataUrl : undefined;\n      return { poster, durationSec };\n    } catch {\n      cleanup();\n      return { durationSec };\n    }\n  })();\n}\n\n/**\n * MediaUploadTrayService\n *\n * Owns the composer's attachment-staging state machine and wraps the CometChat\n * SDK multi-attachment upload lifecycle (`UploadFileRequest` + `UploadFileListener`).\n *\n * Provided at the **composer** level (not root) so each composer instance — main\n * and thread — owns an independent tray and its own `UploadFileRequest`, i.e. an\n * independent batch. `fileId`s are UIKit-generated and only have to be unique\n * within a batch, so two composers never collide. Internal: not exported from\n * `public-api.ts`.\n *\n * @remarks State is exposed as signals for OnPush components. `canSend` is\n * single-sourced: enabled only from the SDK `onComplete`, disabled on every new\n * `stage()` and whenever a cancel/remove empties the tray.\n */\n@Injectable()\nexport class MediaUploadTrayService {\n  /** key = fileId (UIKit-generated; the SDK echoes it back on every event) */\n  private readonly _tilesMap = signal<Map<string, AttachmentFile>>(new Map());\n  private readonly _canSend = signal(false);\n  private readonly _notice = signal<string | null>(null);\n\n  /** Insertion-ordered staged tiles. */\n  readonly tiles = computed<AttachmentFile[]>(() => [\n    ...this._tilesMap().values(),\n  ]);\n  readonly hasTiles = computed(() => this._tilesMap().size > 0);\n  readonly aggregate = computed<TrayAggregate>(() =>\n    computeAggregate(this.tiles()),\n  );\n  /** Any tile in a terminal error state (failed/rejected). Blocks Send until it's removed. */\n  readonly hasErrorTile = computed(() =>\n    this.tiles().some(\n      (t) => t.status === 'rejected' || t.status === 'failed' || t.status === 'error',\n    ),\n  );\n  /**\n   * Send-gate: all staged tiles uploaded (`_canSend`, set on SDK completion) AND none failed. The\n   * error clause is enforced here rather than in `_canSend` because the SDK's `onComplete` reports\n   * `successful > 0` even for a partial batch — so a mix of uploaded + rejected tiles would\n   * otherwise still enable Send. A failed upload must block sending until the user removes it.\n   */\n  readonly canSend = computed(() => this._canSend() && !this.hasErrorTile());\n  /** Transient localized notice (e.g. attachment-count limit reached). */\n  readonly notice = this._notice.asReadonly();\n\n  /** The SDK upload request owning this composer's batch; null until the first stage. */\n  private request: CometChat.UploadFileRequest | null = null;\n  /** Cached app setting (async getter); null until first fetched. */\n  private maxCount: number | null = null;\n  /** Optional composer-provided validation (mirrors composer @Inputs). */\n  private allowedFileTypes?: string[];\n  private maxFileSize?: number;\n  /** Upload recipient (uid/guid + 'user'/'group'), set by the composer before staging. The SDK sends\n   *  both in the presign call for role-based access control. */\n  private receiverId?: string;\n  private receiverType?: string;\n  /** Thread parent, when this composer is a thread composer. Sent alongside the receiver in the\n   *  presign call so the server scopes the upload to the thread. */\n  private parentMessageId?: string | number;\n\n  /** Root toast service — surfaces upload/validation errors as a transient toast.\n   *  Injected defensively so the service also works when created outside Angular DI (unit tests). */\n  private readonly toast = this.safeInjectToast();\n  /** Dedupe identical error toasts fired in quick succession (e.g. N oversized files). */\n  private lastToastMessage = '';\n  private lastToastAt = 0;\n\n  /** Set client-side validation from the composer (allowedFileTypes / maxFileSize @Inputs). */\n  setValidationConfig(cfg: { allowedFileTypes?: string[]; maxFileSize?: number }): void {\n    this.allowedFileTypes = cfg.allowedFileTypes;\n    this.maxFileSize = cfg.maxFileSize;\n  }\n\n  /** Set the upload recipient — `id` is the uid/guid, `type` is `user`/`group` (CometChat.RECEIVER_TYPE),\n   *  and `parentMessageId` marks a thread composer. The SDK sends all three in the presign call for\n   *  role-based access control. Changing the destination discards the current batch: a request is\n   *  bound to one destination, so its presigns are not valid for another conversation. */\n  setReceiver(id: string, type: string, parentMessageId?: string | number): void {\n    const changed =\n      this.receiverId !== id ||\n      this.receiverType !== type ||\n      this.parentMessageId !== parentMessageId;\n    this.receiverId = id;\n    this.receiverType = type;\n    this.parentMessageId = parentMessageId;\n    if (changed && this.request) {\n      this.clearAll();\n    }\n  }\n\n  /**\n   * SDK listener — built once; maps per-file + completion events onto tiles. Passed with EVERY\n   * `uploadAttachments` call rather than registered once via `addUploadListener`: the SDK creates a\n   * batch's group lazily on the first upload, and `addUploadListener` silently drops the listener\n   * when the group doesn't exist yet, so registering at request-creation time delivered no events at\n   * all. Re-passing the same object is safe — the SDK dispatches per-file events to the file's own\n   * listener and dedupes by object identity, so nothing fires twice.\n   */\n  private readonly listener = new CometChat.UploadFileListener({\n    onFileProgress: (fileId: string, loaded: number, total: number, percent: number) => {\n      this.patchTile(fileId, { loaded, total, uploadProgress: percent });\n    },\n    onFileUploaded: (fileId: string, attachment: CometChat.Attachment) => {\n      // Keep the LOCAL preview (object-URL image / extracted video poster) — do NOT switch the tile\n      // to the uploaded S3 URL, which is private/unsigned and would 403. The blob is revoked later\n      // (dropTile/clearAll). We still store `attachment` (needed to build the outgoing message).\n      this.patchTile(fileId, {\n        status: 'uploaded',\n        uploadProgress: 100,\n        attachment,\n      });\n    },\n    onFileError: (fileId: string, error: CometChat.CometChatException) => {\n      const message = this.errorText(error);\n      this.patchTile(fileId, { status: 'rejected', errorMessage: message });\n      this.notifyError(message);\n    },\n    onFileFailure: (fileId: string, error: CometChat.CometChatException) => {\n      const message = this.errorText(error);\n      this.patchTile(fileId, { status: 'failed', errorMessage: message });\n      this.notifyError(message);\n    },\n    onComplete: (result: CometChat.UploadResult) => {\n      // Idempotent: SET from current result. onComplete is NOT once-per-batch — it re-fires every\n      // time the batch drains (e.g. after files are added to an already-settled tray), and `result`\n      // always describes the whole batch, so this must never toggle or accumulate.\n      this._canSend.set((result?.successful?.length ?? 0) > 0);\n    },\n  });\n\n  // ── Public actions ───────────────────────────────────────────────────────\n\n  /**\n   * Stage and begin uploading files. Accumulates into the existing upload group\n   * (reuses `muid`). Enforces the max-attachment count (UIKit-side, before the SDK).\n   *\n   * `forcedKind` overrides the MIME-derived category — the \"File\" picker option stages\n   * everything as `file` regardless of its actual MIME type, so an MP4 chosen through it\n   * sends as a file message rather than a video message. Drag-drop and paste pass nothing\n   * and stay MIME-derived.\n   */\n  async stage(files: File[], forcedKind?: AttachmentFile['type']): Promise<void> {\n    if (!files || files.length === 0) {\n      return;\n    }\n    if (this.maxCount == null) {\n      this.maxCount = await this.fetchMaxCount();\n    }\n\n    let noticeKey: string | null = null;\n\n    // Client-side type/size pre-check (composer @Inputs), before hitting the SDK.\n    const typeSizeValid = files.filter((f) => {\n      if (this.maxFileSize != null && f.size > this.maxFileSize) {\n        noticeKey = 'message_composer_file_size_error';\n        return false;\n      }\n      if (\n        this.allowedFileTypes?.length &&\n        !this.allowedFileTypes.some((p) => mimeMatches(f.type, p))\n      ) {\n        if (!noticeKey) noticeKey = 'message_composer_file_type_error';\n        return false;\n      }\n      return true;\n    });\n\n    // Count limit (from the SDK setting). All-or-nothing: a batch that would overflow the limit\n    // stages NOTHING. Silently truncating to the first N left the user with an arbitrary subset of\n    // their selection and no clear signal which files were dropped; a hard reject makes them\n    // re-pick deliberately. The toast below is the only feedback, so it must always fire here.\n    const remaining = Math.max(0, this.maxCount - this._tilesMap().size);\n    const overflows = typeSizeValid.length > remaining;\n    const accepted = overflows ? [] : typeSizeValid;\n    if (overflows) {\n      noticeKey = 'message_composer_attachment_limit_reached';\n    }\n\n    if (noticeKey) {\n      const noticeText = CometChatLocalize.getLocalizedString(noticeKey);\n      this._notice.set(noticeText);\n      this.notifyError(noticeText);\n    } else {\n      this._notice.set(null);\n    }\n\n    if (accepted.length === 0) {\n      return;\n    }\n\n    // New files in flight -> disable Send until the next onComplete (design ⚠️ U1).\n    this._canSend.set(false);\n\n    // fileIds are OURS to mint — the SDK never assigns one, it just echoes back what we pass. That\n    // lets the tiles below be painted at 0% before a single byte moves, with no \"adopt the SDK's id\n    // on the first event\" step.\n    const items = accepted.map((file) => ({ fileId: CometChatUIKitUtility.ID(), file }));\n\n    const next = new Map(this._tilesMap());\n    items.forEach(({ fileId, file }) => {\n      const type = forcedKind ?? detectAttachmentType(file.type);\n      next.set(fileId, {\n        id: fileId,\n        fileId,\n        file,\n        type,\n        name: file.name,\n        size: file.size,\n        mimeType: file.type,\n        // A force-filed image still has no image preview in the tray — it is a file card.\n        thumbnailUrl: type === 'image' ? this.localPreview(file) : undefined,\n        uploadProgress: 0,\n        loaded: 0,\n        total: file.size,\n        status: 'uploading',\n      });\n    });\n    this._tilesMap.set(next);\n\n    // Videos can't preview from an object URL — extract their first frame asynchronously.\n    // Skipped when the picker forced a non-video kind (no video tile to poster).\n    if (forcedKind === undefined || forcedKind === 'video') {\n      this.hydrateVideoPosters(items);\n    }\n\n    // Upload LAST, so a synchronous SDK throw still leaves the tiles painted and marks only these\n    // files failed — the user keeps the batch and can retry, rather than watching the tray vanish.\n    try {\n      const request = this.ensureRequest();\n      request.uploadAttachments(items, this.listener);\n    } catch (error) {\n      const message =\n        this.errorText(error as CometChat.CometChatException) ||\n        CometChatLocalize.getLocalizedString('message_composer_upload_failed');\n      for (const { fileId } of items) {\n        this.patchTile(fileId, { status: 'failed', errorMessage: message });\n      }\n      this._notice.set(message);\n      this.notifyError(message);\n    }\n  }\n\n  /**\n   * The request owning this composer's batch, created on first use. It is bound to the destination\n   * (and thread parent) captured here, which the SDK sends in every presign call; `setReceiver`\n   * tears the request down when that destination changes.\n   *\n   * No listener is attached here — the batch's group does not exist until the first upload, and\n   * `addUploadListener` is a silent no-op before then. Each `uploadAttachments` call carries the\n   * listener instead.\n   */\n  private ensureRequest(): CometChat.UploadFileRequest {\n    if (!this.request) {\n      const request = CometChat.createUploadFileRequest(\n        this.receiverId ?? '',\n        this.receiverType ?? '',\n      );\n      if (this.parentMessageId != null) {\n        request.setParentMessageId(this.parentMessageId);\n      }\n      this.request = request;\n    }\n    return this.request;\n  }\n\n  /** Cancel an in-flight upload (and remove the tile). */\n  cancel(tile: AttachmentFile): void {\n    this.dropTile(tile);\n  }\n\n  /** Remove a tile (uploaded or rejected). SDK cancel is a safe no-op once uploaded. */\n  remove(tile: AttachmentFile): void {\n    this.dropTile(tile);\n  }\n\n  /**\n   * Retry a failed upload. Only a `failed` tile (transfer error — `onFileFailure`) is retryable;\n   * a `rejected` tile (`onFileError`: size/type/permission) can only be removed and replaced, and\n   * `retryAttachment` is a documented no-op for it — so don't flip such a tile back to `uploading`\n   * and strand it in a state nothing will ever resolve.\n   */\n  retry(tile: AttachmentFile): void {\n    if (tile.status === 'rejected') {\n      return;\n    }\n    const fileId = tile.fileId ?? tile.id;\n    if (!this.request) {\n      return;\n    }\n    try {\n      // Re-uploads the bytes the SDK retained for this file (re-presigning if the old presign\n      // expired) — the file object never has to be handed back.\n      this.request.retryAttachment(fileId);\n    } catch {\n      /* surfaced via the listener */\n    }\n    this.patchTile(fileId, {\n      status: 'uploading',\n      uploadProgress: 0,\n      loaded: 0,\n      errorMessage: undefined,\n    });\n    this._canSend.set(false);\n  }\n\n  /** Release the batch and reset the tray (after send, or on composer close). */\n  clearAll(): void {\n    if (this.request) {\n      try {\n        // Drops the whole group, which is what holds the per-file listener references — so no\n        // detach step is needed (and nothing can call back into a tray we're tearing down).\n        this.request.clearAll();\n      } catch {\n        /* best effort */\n      }\n    }\n    for (const tile of this.tiles()) {\n      this.revoke(tile);\n    }\n    this._tilesMap.set(new Map());\n    this.request = null;\n    this._canSend.set(false);\n    this._notice.set(null);\n  }\n\n  /** Lifecycle cleanup alias (conversation switch / destroy). */\n  reset(): void {\n    this.clearAll();\n  }\n\n  /** Successfully-uploaded attachments to put on the outgoing MediaMessage. */\n  getSuccessfulAttachments(): CometChat.Attachment[] {\n    return this.getSuccessfulTiles().map((t) => t.attachment as CometChat.Attachment);\n  }\n\n  /**\n   * Successfully-uploaded tiles, in display order. Carries the STAGED kind (`tile.type`),\n   * which the picker may have forced away from the file's MIME type — the send path must\n   * group on this, not on `attachment.getMimeType()`.\n   */\n  getSuccessfulTiles(): AttachmentFile[] {\n    return this.tiles().filter((t) => t.status === 'uploaded' && t.attachment);\n  }\n\n  /**\n   * The SDK-owned batch id, stamped onto every message of the fanned-out send as\n   * `metadata.batchId` so the list can group them. Null before the first stage.\n   */\n  getBatchId(): string | null {\n    return this.request?.getBatchId() ?? null;\n  }\n\n  // ── Internals ────────────────────────────────────────────────────────────\n\n  private dropTile(tile: AttachmentFile): void {\n    const fileId = tile.fileId ?? tile.id;\n    if (this.request) {\n      try {\n        // Handles both states: aborts the upload if in flight, else just drops the uploaded file\n        // from the batch so it isn't included in the send.\n        this.request.removeAttachment(fileId);\n      } catch {\n        /* best effort */\n      }\n    }\n    this.revoke(tile);\n    const next = new Map(this._tilesMap());\n    next.delete(fileId);\n    this._tilesMap.set(next);\n    this._canSend.set(deriveCanSend(this.tiles()));\n  }\n\n  private patchTile(fileId: string, patch: Partial<AttachmentFile>): void {\n    const map = this._tilesMap();\n    const existing = map.get(fileId);\n    if (!existing) {\n      return; // tile already removed/cancelled\n    }\n    const next = new Map(map);\n    next.set(fileId, { ...existing, ...patch });\n    this._tilesMap.set(next);\n  }\n\n  private async fetchMaxCount(): Promise<number> {\n    try {\n      const n = await CometChat.getMaxAttachmentCount();\n      return Number.isFinite(n) && n > 0 ? n : DEFAULT_MAX_ATTACHMENTS;\n    } catch {\n      return DEFAULT_MAX_ATTACHMENTS;\n    }\n  }\n\n  /** Max attachments allowed per message (server `getMaxAttachmentCount`), fetched once and cached. */\n  async getMaxCount(): Promise<number> {\n    if (this.maxCount == null) { this.maxCount = await this.fetchMaxCount(); }\n    return this.maxCount;\n  }\n\n  /** Free slots left before the limit, given what's already staged. Used by the file picker to cap\n   *  a selection so the user can't pick more than will fit. */\n  async remainingSlots(): Promise<number> {\n    return Math.max(0, (await this.getMaxCount()) - this._tilesMap().size);\n  }\n\n  private localPreview(file: File): string | undefined {\n    // Images render directly from an object URL. Videos can't (a video blob is not a valid CSS\n    // background-image), so their first-frame poster is extracted asynchronously in stage().\n    if (\n      detectAttachmentType(file.type) === 'image' &&\n      typeof URL !== 'undefined' &&\n      typeof URL.createObjectURL === 'function'\n    ) {\n      try {\n        return URL.createObjectURL(file);\n      } catch {\n        return undefined;\n      }\n    }\n    return undefined;\n  }\n\n  /**\n   * Kick off first-frame poster + duration extraction for each staged video and patch them onto\n   * the tile. Bounded concurrency (decoding many videos at once can spike memory/CPU, esp. on mobile).\n   */\n  private hydrateVideoPosters(items: { fileId: string; file: File }[]): void {\n    const videos = items.filter(({ file }) => detectAttachmentType(file.type) === 'video');\n    if (videos.length === 0) {\n      return;\n    }\n\n    let cursor = 0;\n    const runNext = (): void => {\n      if (cursor >= videos.length) {\n        return;\n      }\n      const { file, fileId } = videos[cursor++];\n      extractVideoMeta(file)\n        .then(({ poster, durationSec }) => {\n          // patchTile is a no-op if the tile was cancelled/removed meanwhile.\n          const patch: Partial<AttachmentFile> = {};\n          if (poster) {\n            patch.thumbnailUrl = poster;\n          }\n          if (durationSec !== undefined) {\n            patch.durationSec = durationSec;\n          }\n          if (Object.keys(patch).length > 0) {\n            this.patchTile(fileId, patch);\n          }\n        })\n        .catch(() => {\n          /* best-effort: no poster, tile keeps the play-button placeholder */\n        })\n        .finally(() => runNext());\n    };\n\n    const POSTER_CONCURRENCY = 2;\n    for (let k = 0; k < Math.min(POSTER_CONCURRENCY, videos.length); k++) {\n      runNext();\n    }\n  }\n\n  private revoke(tile: AttachmentFile): void {\n    const url = tile.thumbnailUrl;\n    if (\n      url &&\n      url.startsWith('blob:') &&\n      typeof URL !== 'undefined' &&\n      typeof URL.revokeObjectURL === 'function'\n    ) {\n      try {\n        URL.revokeObjectURL(url);\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n\n  private errorText(error: CometChat.CometChatException | undefined): string {\n    if (!error) return '';\n    const anyErr = error as unknown as { code?: string; message?: string; getMessage?: () => string };\n    const raw = anyErr.message ?? anyErr.getMessage?.() ?? '';\n    const key = this.resolveUploadErrorKey(anyErr.code, raw);\n    if (!key) return raw;\n    // Only the size string has a `{n}` MB placeholder; localizedWithMb no-ops for the rest. The\n    // limit comes from the SDK message (authoritative for what it actually enforced), else the\n    // composer's maxFileSize @Input.\n    const bytes = this.parseLimitBytes(raw) ?? this.maxFileSize;\n    return this.localizedWithMb(key, bytes);\n  }\n\n  /**\n   * Which localization key (if any) to show for an upload error. Prefers the SDK/server `code` via\n   * {@link UPLOAD_ERROR_LOCALE_KEY}; falls back to a message-text heuristic for server errors whose\n   * code isn't statically known (the file-type rejection). Returns '' to keep the raw SDK message.\n   */\n  private resolveUploadErrorKey(code: string | undefined, message: string): string {\n    if (code && UPLOAD_ERROR_LOCALE_KEY[code]) {\n      return UPLOAD_ERROR_LOCALE_KEY[code];\n    }\n    const m = (message || '').toLowerCase();\n    if (/maximum allowed size|exceeds the .*size|size limit/.test(m)) {\n      return 'message_composer_upload_error_file_size';\n    }\n    if (/\\btype\\b/.test(m) && /(not supported|not allowed|unsupported|invalid)/.test(m)) {\n      return 'message_composer_upload_error_file_type';\n    }\n    // Loose codes last, so a message that named its own reason above still wins.\n    if (code && UPLOAD_ERROR_FALLBACK_LOCALE_KEY[code]) {\n      return UPLOAD_ERROR_FALLBACK_LOCALE_KEY[code];\n    }\n    return '';\n  }\n\n  /** Pull the \"...of <N> bytes.\" limit out of the SDK size-exceeded message; null if absent. */\n  private parseLimitBytes(message: string | undefined): number | null {\n    const match = message?.match(/of\\s+(\\d+)\\s*bytes/i);\n    return match ? Number(match[1]) : null;\n  }\n\n  /** Resolve a key, substituting a `{n}` MB placeholder from `bytes` when the string has one. */\n  private localizedWithMb(key: string, bytes?: number): string {\n    const text = CometChatLocalize.getLocalizedString(key);\n    if (!text.includes('{n}')) return text;\n    if (bytes == null) return text.replace(/\\{n\\}/g, '');\n    const mb = Math.max(1, Math.round(bytes / (1024 * 1024)));\n    return text.replace(/\\{n\\}/g, String(mb));\n  }\n\n  /**\n   * Surface an upload/validation error as a transient error toast (existing toast component,\n   * with its built-in error icon + auto-dismiss). Falls back to a generic localized message\n   * when no text is available, and dedupes identical messages fired within a short window\n   * (e.g. several oversized files failing at once).\n   */\n  private notifyError(message: string | null | undefined): void {\n    const text =\n      (message ?? '').trim() ||\n      CometChatLocalize.getLocalizedString('message_composer_upload_failed');\n    const now = Date.now();\n    if (text === this.lastToastMessage && now - this.lastToastAt < 4000) {\n      return;\n    }\n    this.lastToastMessage = text;\n    this.lastToastAt = now;\n    this.toast?.error(text, { duration: 4000 });\n  }\n\n  /** inject() the toast service, tolerating a non-DI (manual `new`) instantiation. */\n  private safeInjectToast(): CometChatToastService | null {\n    try {\n      return inject(CometChatToastService);\n    } catch {\n      return null;\n    }\n  }\n}\n","import {\n  Component,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  OnDestroy,\n  inject,\n  signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatAttachmentTileComponent } from '../cometchat-attachment-tile';\nimport {\n  CometChatFullScreenViewerComponent,\n  FullscreenViewerMediaType,\n} from '../base-elements/cometchat-fullscreen-viewer';\nimport { MediaUploadTrayService } from '../../services/media-upload-tray.service';\nimport type { AttachmentFile } from '../cometchat-message-composer/cometchat-message-composer.types';\n\ninterface ViewerState {\n  open: boolean;\n  url: string;\n  mediaType: FullscreenViewerMediaType;\n  fileName: string;\n}\n\n/**\n * CometChatAttachmentTray\n *\n * Composer staging strip. Renders the staged tiles from `MediaUploadTrayService`,\n * shows the byte-weighted aggregate bar, maps tile actions to the service, and\n * opens a successful media tile in the fullscreen viewer. Visible only when the\n * tray has ≥1 tile. Internal — not exported from `public-api.ts`.\n */\n@Component({\n  selector: 'cometchat-attachment-tray',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    CommonModule,\n    TranslatePipe,\n    CometChatAttachmentTileComponent,\n    CometChatFullScreenViewerComponent,\n  ],\n  templateUrl: './cometchat-attachment-tray.component.html',\n  styleUrls: ['./cometchat-attachment-tray.component.css'],\n})\nexport class CometChatAttachmentTrayComponent implements OnDestroy {\n  /** Same composer-scoped instance the composer provides (U5). */\n  readonly tray = inject(MediaUploadTrayService);\n\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  private readonly _viewer = signal<ViewerState>({\n    open: false,\n    url: '',\n    mediaType: 'image',\n    fileName: '',\n  });\n  readonly viewer = this._viewer.asReadonly();\n\n  /** A fresh object URL created for the viewer (video playback) — revoked on close. */\n  private viewerObjectUrl: string | null = null;\n\n  /** Open a successful media tile in the fullscreen viewer (single item). */\n  openViewer(tile: AttachmentFile): void {\n    this.revokeViewerObjectUrl();\n\n    let url: string;\n    if (tile.type === 'video' && tile.file && typeof URL !== 'undefined' && typeof URL.createObjectURL === 'function') {\n      // The tile thumbnail for a video is a still-frame POSTER image — not playable. The viewer\n      // needs the actual video, so create a fresh (playable) object URL from the local file.\n      url = URL.createObjectURL(tile.file);\n      this.viewerObjectUrl = url;\n    } else {\n      // Images use their shared local thumbnail (do NOT revoke it — the tile still displays it).\n      url = tile.thumbnailUrl || (tile.attachment ? tile.attachment.getUrl() : '');\n    }\n    if (!url) {\n      return;\n    }\n    this._viewer.set({\n      open: true,\n      url,\n      mediaType: tile.type,\n      fileName: tile.name,\n    });\n  }\n\n  closeViewer(): void {\n    this._viewer.set({ ...this._viewer(), open: false });\n    this.revokeViewerObjectUrl();\n  }\n\n  /** The viewer may still be open when the composer tears down (e.g. conversation switch). */\n  ngOnDestroy(): void {\n    this.revokeViewerObjectUrl();\n  }\n\n  private revokeViewerObjectUrl(): void {\n    if (this.viewerObjectUrl && typeof URL !== 'undefined' && typeof URL.revokeObjectURL === 'function') {\n      try {\n        URL.revokeObjectURL(this.viewerObjectUrl);\n      } catch {\n        /* ignore */\n      }\n    }\n    this.viewerObjectUrl = null;\n  }\n}\n","@if (tray.hasTiles()) {\n  <div class=\"cometchat-attachment-tray\">\n    <div\n      class=\"cometchat-attachment-tray__row\"\n      role=\"list\"\n      [attr.aria-label]=\"'message_composer_attachments' | translate\"\n    >\n      @for (t of tray.tiles(); track t.fileId) {\n        <div class=\"cometchat-attachment-tray__item\" role=\"listitem\">\n          <cometchat-attachment-tile\n            [tile]=\"t\"\n            (cancelClick)=\"tray.cancel($event)\"\n            (removeClick)=\"tray.remove($event)\"\n            (retryClick)=\"tray.retry($event)\"\n            (tileClick)=\"openViewer($event)\"\n          ></cometchat-attachment-tile>\n        </div>\n      }\n    </div>\n  </div>\n\n  @if (viewer().open) {\n    <cometchat-fullscreen-viewer\n      [isOpen]=\"true\"\n      [url]=\"viewer().url\"\n      [mediaType]=\"viewer().mediaType\"\n      [fileName]=\"viewer().fileName\"\n      (closeClick)=\"closeViewer()\"\n    ></cometchat-fullscreen-viewer>\n  }\n}\n","\nimport {Component, Input, Output, EventEmitter, TemplateRef, ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy, OnChanges, SimpleChanges, signal, computed, inject, ViewChild, ElementRef, AfterViewInit, HostListener, ViewChildren, QueryList, booleanAttribute, DestroyRef,} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {FormsModule} from '@angular/forms';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIEvents, IModal, IMentionsCountWarning} from '../../events/CometChatUIEvents';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {CometChatActionSheetComponent} from '../base-elements/cometchat-action-sheet/cometchat-action-sheet.component';\nimport {CometChatEmojiKeyboardComponent} from '../base-elements/cometchat-emoji-keyboard/cometchat-emoji-keyboard.component';\nimport {CometChatMediaRecorderComponent} from '../base-elements/cometchat-media-recorder/cometchat-media-recorder.component';\nimport {CometChatAvatarComponent} from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport {CometChatStickersKeyboardComponent, StickerClickEvent,} from '../cometchat-stickers-keyboard/cometchat-stickers-keyboard.component';\nimport {CometChatFullScreenViewerComponent} from '../base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.component';\nimport {CometChatPopoverComponent} from '../base-elements/cometchat-popover/cometchat-popover.component';\nimport {CometChatMessagePreviewComponent} from '../base-elements/cometchat-message-preview/cometchat-message-preview.component';\nimport {CometChatCreatePollComponent} from '../cometchat-create-poll/cometchat-create-poll.component';\nimport {CometChatButtonComponent} from '../base-elements/cometchat-button/cometchat-button.component';\nimport {CometChatLinkDialogComponent, type LinkData,} from '../base-elements/cometchat-link-dialog/cometchat-link-dialog.component';\nimport {CometChatLinkPopoverComponent} from '../base-elements/cometchat-link-popover/cometchat-link-popover.component';\nimport {CometChatErrorBoundaryComponent} from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport {MessageComposerService, MentionSuggestion} from '../../services/message-composer.service';\nimport {VoiceRecordingCoordinatorService} from '../../services/voice-recording-coordinator.service';\nimport {CometChatToastService} from '../base-elements/cometchat-toast/cometchat-toast.service';\nimport {RichTextFormatState, RichTextMetadata, SelectionState,} from '../../services/rich-text-editor.interfaces';\nimport {RichTextEditorService} from '../../services/rich-text-editor.service';\nimport {RichTextEditor} from '../../services/rich-text-editor.class';\nimport {ChatStateService} from '../../services/chat-state.service';\nimport {FormatterConfigService} from '../../services/formatter-config.service';\nimport {HtmlSanitizerService} from '../../services/html-sanitizer.service';\nimport {LiveAnnouncerService} from '../../services/live-announcer.service';\nimport {COMETCHAT_GLOBAL_CONFIG, GlobalConfig} from '../../services/global-config.service';\nimport {TranslatePipe} from '../../resources/CometChatLocalize/translate.pipe';\nimport {CometChatSoundManager} from '../../resources/CometChatSoundManager/CometChatSoundManager';\nimport {CometChatUIKit} from '../../cometchat-uikit';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {EnterKeyBehavior, Placement, MessageStatus} from '../../Enums/Enums';\nimport {CometChatMentionsFormatter} from '../../formatters/cometchat-mentions-formatter';\nimport {CometChatTextFormatter} from '../../formatters/cometchat-text-formatter';\nimport {CometChatMessageComposerAction, CometChatActionsView} from '../../modals';\nimport {CometChatUIKitUtility} from '../../CometChatUIKitUtility';\nimport {getFileType as getFileTypeUtil, getFileTypeLabel as getFileTypeLabelUtil, getPluralFileType as getPluralFileTypeUtil} from './cometchat-message-composer.file-utils';\nimport {detectMentionTrigger} from './cometchat-message-composer.mention-utils';\nimport {handleRecordingCompleteImpl, handleRecordingCancelImpl, handleRecordingErrorImpl, startInlineRecordingImpl} from './cometchat-message-composer.voice-utils';\nimport {handleSendNewMessageImpl, handleEditMessageImpl, buildMessageMetadataImpl, extractMentionedUsersImpl, applyTextFormattersImpl} from './cometchat-message-composer.send-utils';\nimport {handleDragEnterImpl, handleDragLeaveImpl, handleDragOverImpl, handleDropImpl, handlePasteImpl, handleFileInputChangeImpl, processFilesImpl, sendFilesDirectlyImpl} from './cometchat-message-composer.drag-utils';\nimport {initializeRichTextEditorImpl, clearComposerImpl} from './cometchat-message-composer.editor-utils';\nimport {checkForMentionTriggerImpl, fetchMoreMentionsImpl, handleMentionsScrollImpl, selectMentionSuggestionImpl, scrollMentionIntoViewImpl, closeMentionSuggestionsImpl, updateMentionsCountImpl, initializeMentionsRequestBuilderImpl, checkIfSelfMentionImpl} from './cometchat-message-composer.mentions-handler';\nimport {handleLinkDialogSaveImpl, handleLinkDialogRemoveImpl, handleLinkDialogCancelImpl, handleLinkClickImpl, handleLinkPopoverEditImpl, handleLinkPopoverRemoveImpl, handleLinkPopoverCloseImpl, computeLinkDialogLeftImpl} from './cometchat-message-composer.link-handler';\nimport {handleKeydownImpl, handleKeyupImpl, handleFormattingShortcutsImpl, handleGlobalEscapeKeyImpl, handleRichTextKeydownImpl} from './cometchat-message-composer.keyboard-handler';\nimport {handleTypingStartImpl, startTypingImpl, endTypingIndicatorImpl} from './cometchat-message-composer.typing-handler';\nimport {handleToolbarBoldImpl, handleToolbarItalicImpl, handleToolbarUnderlineImpl, handleToolbarStrikethroughImpl, handleToolbarInlineCodeImpl, handleToolbarLinkImpl, handleToolbarOrderedListImpl, handleToolbarBulletListImpl, handleToolbarCodeBlockImpl, handleToolbarBlockquoteImpl, handleSelectionUpdateImpl, updateBubbleMenuPositionImpl, calculateAndSetPositionImpl, getTextOffsetFromNodeImpl, updateFormatStateFromEditorImpl} from './cometchat-message-composer.toolbar-handler';\nimport {subscribeToActivePopoverEventImpl, subscribeToReplyToMessageEventImpl, subscribeToMessageEditedEventImpl, subscribeToMessageDeletedEventImpl, subscribeToComposeMessageEventImpl, subscribeToSdkMessageDeletedEventImpl, subscribeToShowModalEventImpl, subscribeToHideModalEventImpl, subscribeToShowMentionsCountWarningEventImpl} from './cometchat-message-composer.subscriptions';\nimport {enterEditModeImpl, populateEditorWithFormattedTextImpl, cancelEditImpl, exitEditModeWithoutEventImpl, formatReplyPreviewTextImpl, formatEditPreviewTextImpl, convertMarkdownToHtmlImpl} from './cometchat-message-composer.edit-mode';\nimport {announcePoliteImpl, announceAssertiveImpl, announceReplyModeActivatedImpl, announceEditModeActivatedImpl, announceRecordingStartedImpl, announceRecordingStoppedImpl, announceMessageSentImpl, announceAttachmentAddedImpl, announceAttachmentRemovedImpl, announceFocusedMentionImpl, announceMentionSuggestionsCountImpl, announceMentionInsertedImpl, announceFormatStateChangeImpl} from './cometchat-message-composer.announcements';\nimport {syncLegacyPopoverSignalsImpl, toggleEmojiKeyboardImpl, toggleAttachmentMenuImpl, toggleVoiceRecordingImpl, toggleStickersKeyboardImpl, toggleAIImpl, sendStickerMessageImpl} from './cometchat-message-composer.popover-utils';\nimport {handleAttachmentOptionClickImpl, handleAttachmentClickImpl, handleFullscreenViewerCloseImpl, handleFullscreenViewerPreviousImpl, handleFullscreenViewerNextImpl, getCurrentFullscreenAttachmentImpl, handleRemoveAttachmentImpl, handleAttachmentButtonClickImpl} from './cometchat-message-composer.attachment-handlers';\nimport {focusTextInputImpl, focusAttachmentButtonImpl, focusEmojiButtonImpl, focusStickersButtonImpl, focusVoiceButtonImpl, insertTextAtCursorImpl} from './cometchat-message-composer.focus-utils';\nimport {getReplyPreviewTitleImpl, getReplyPreviewSubtitleImpl, getEditPreviewTitleImpl, getEditPreviewSubtitleImpl, getMediaPreviewPartsImpl, MediaPreviewParts, enterReplyModeImpl, exitReplyModeImpl, onReplyPreviewCloseImpl, onEditPreviewCloseImpl, openPollModalImpl, closePollModalImpl, onPollCreatedImpl, resetComposerStateImpl} from './cometchat-message-composer.reply-edit-utils';\nimport {createCollaborativeDocumentImpl, createCollaborativeWhiteboardImpl} from './cometchat-message-composer.collab-utils';\nimport {handleEmojiSelectImpl, handleEmojiKeyboardCloseImpl, handleActionSheetItemClickImpl, handleActionSheetCloseImpl, handleStickerSelectImpl, handleStickersKeyboardCloseImpl, handleVoiceRecordingClickImpl, toggleFixedToolbarImpl, closeAllPopupsImpl, emitErrorImpl, handleSendImpl, focusRichTextEditorImpl, getFileSizeErrorMessageImpl} from './cometchat-message-composer.event-handlers';\nimport {initializeTextFormattersImpl, configureTextFormattersImpl, forwardKeyEventToFormattersImpl, updateFormatterCaretPositionImpl, playOutgoingMessageSoundImpl, getMediaMessageTypeImpl, handleRichTextUpdateImpl, onEmojiPopoverOpenedImpl, onEmojiPopoverClosedImpl, onAttachmentPopoverOpenedImpl, onAttachmentPopoverClosedImpl, onVoiceRecorderPopoverOpenedImpl, onVoiceRecorderPopoverClosedImpl, onStickersPopoverOpenedImpl, onStickersPopoverClosedImpl} from './cometchat-message-composer.formatter-utils';\nimport {setupConstructorEffectsImpl, ngOnInitImpl as composerNgOnInitImpl, ngOnChangesImpl as composerNgOnChangesImpl, buildAttachmentMenuOptionsImpl} from './cometchat-message-composer.lifecycle-utils';\nimport {CometChatAttachmentTrayComponent} from '../cometchat-attachment-tray';\nimport {MediaUploadTrayService, detectAttachmentType} from '../../services/media-upload-tray.service';\nimport {stampBatchMetadata, markMessageFailed} from '../../utils/message-metadata-utils';\n\nexport const MENTIONS_LIMIT = 10;\n\nexport interface AttachmentFile {\n  id: string;\n  file: File;\n\n  type: 'image' | 'video' | 'audio' | 'file';\n\n  name: string;\n\n  size: number;\n\n  thumbnailUrl?: string;\n\n  uploadProgress: number;\n\n  status: 'pending' | 'uploading' | 'uploaded' | 'error';\n  errorMessage?: string;\n}\n\nexport interface FileSizeError {\n  count: number;\n  fileType: string;\n\n  limitMB: number;\n\n  timestamp: number;\n}\n@Component({\n  selector: 'cometchat-message-composer',\n  standalone: true,\n  imports: [\n    CommonModule,\n    FormsModule,\n    CometChatActionSheetComponent,\n    CometChatEmojiKeyboardComponent,\n    CometChatMediaRecorderComponent,\n    CometChatAvatarComponent,\n    CometChatStickersKeyboardComponent,\n    CometChatFullScreenViewerComponent,\n    CometChatPopoverComponent,\n    CometChatMessagePreviewComponent,\n    CometChatCreatePollComponent,\n    CometChatButtonComponent,\n    CometChatLinkDialogComponent,\n    CometChatLinkPopoverComponent,\n    CometChatErrorBoundaryComponent,\n    CometChatAttachmentTrayComponent,\n    TranslatePipe,\n  ],\n  providers: [MediaUploadTrayService, MessageComposerService],\n  templateUrl: './cometchat-message-composer.component.html',\n  styleUrls: ['./cometchat-message-composer.component.css', '../../services/rich-text-editor.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatMessageComposerComponent\n  implements OnInit, OnDestroy, OnChanges, AfterViewInit\n{\n  private messageComposerService = inject(MessageComposerService);\n  private richTextEditorService = inject(RichTextEditorService);\n  private chatStateService = inject(ChatStateService);\n  private formatterConfigService = inject(FormatterConfigService);\n  private htmlSanitizerService = inject(HtmlSanitizerService);\n  private liveAnnouncerService = inject(LiveAnnouncerService);\n  private cdr = inject(ChangeDetectorRef);\n  private hostElementRef = inject(ElementRef);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n  /** Composer-scoped staging tray for multi-attachment upload (provided above). */\n  readonly mediaUploadTray = inject(MediaUploadTrayService);\n  /** Root-scoped: keeps this composer's recorder from running alongside another composer's. */\n  readonly voiceCoordinator = inject(VoiceRecordingCoordinatorService);\n  /** Surfaces errors visually. Injected defensively so the composer still works when constructed\n   *  outside Angular DI (unit tests), matching MediaUploadTrayService. */\n  readonly toast: CometChatToastService | null = (() => {\n    try { return inject(CometChatToastService); } catch { return null; }\n  })();\n  private textFormattersExplicitlySet = signal(false); private disableSoundForMessageExplicitlySet = signal(false); private customSoundForMessageExplicitlySet = signal(false);\n  private _textFormatters = signal<CometChatTextFormatter[]>([]); private _disableSoundForMessage = signal(false); private _customSoundForMessage = signal('');\n  effectiveTextFormatters = computed(() => { if (this.textFormattersExplicitlySet()) return this._textFormatters(); return this.globalConfig?.textFormatters ?? []; });\n  effectiveDisableSoundForMessage = computed(() => { if (this.disableSoundForMessageExplicitlySet()) return this._disableSoundForMessage(); return this.globalConfig?.disableSoundForMessages ?? false; });\n  effectiveCustomSoundForMessage = computed(() => { if (this.customSoundForMessageExplicitlySet()) return this._customSoundForMessage(); return this.globalConfig?.customSoundForMessages ?? ''; });\n  customRichTextEditor: RichTextEditor | null = null;\n  @ViewChild('richTextEditorContainer') richTextEditorContainerRef?: ElementRef<HTMLDivElement>;\n  richTextFormatState = signal<RichTextFormatState>({ bold: false, italic: false, underline: false, strikethrough: false, code: false, blockquote: false, codeBlock: false, orderedList: false, bulletList: false, link: false });\n  isInlineFormattingDisabled = computed(() => this.richTextFormatState().codeBlock);\n  @Input() user?: CometChat.User; @Input() group?: CometChat.Group; @Input() parentMessageId?: number; @Input() placeholderText = 'message_composer_placeholder'; @Input() initialComposerText = ''; @Input() text = '';\n  @Input() maxHeight = 200; @Input() enterKeyBehavior: EnterKeyBehavior = EnterKeyBehavior.SendMessage; @Input() attachmentOptions?: CometChatMessageComposerAction[];\n  /** @note kept for future attachment preview/queue support; active flow sends selected files directly. */\n  @Input() maxAttachments = 10;\n  /** @note kept for future attachment preview/queue support; active flow sends selected files directly. */\n  @Input() allowedFileTypes?: string[];\n  /** @note kept for future attachment preview/queue support; active flow sends selected files directly. */\n  @Input() maxFileSize?: number;\n  /** @note kept for future attachment preview/queue support; active flow sends selected files directly. */\n  @Input() showAttachmentPreview = true;\n  /** @note kept for future attachment preview/queue support; active flow sends selected files directly. */\n  @Input() enableDragDrop = true;\n  @Input() hideAttachmentButton = false;\n  @Input({ transform: booleanAttribute }) enableMultipleAttachments = true;    //multi attachment test prop\n\n  @Input() hideImageAttachmentOption = false; @Input() hideVideoAttachmentOption = false; @Input() hideAudioAttachmentOption = false; @Input() hideFileAttachmentOption = false; @Input() hidePollsOption = false;\n  @Input() hideCollaborativeDocumentOption = false; @Input() hideCollaborativeWhiteboardOption = false; @Input() hideEmojiKeyboardButton = false; @Input() hideVoiceRecordingButton = false; @Input() hideStickersButton = false;\n  @Input() hideLiveReaction = false; @Input() hideSendButton = false; @Input() disableMentions = false; @Input() disableMentionAll = false; @Input() mentionAllLabel = '';\n  @Input() mentionsUsersRequestBuilder?: CometChat.UsersRequestBuilder; @Input() mentionsGroupMembersRequestBuilder?: CometChat.GroupMembersRequestBuilder;\n  @Input() enableRichText = true; @Input() hideRichTextToolbar = false; @Input() showBubbleMenuOnSelection = false; @Input() layout: 'single-line' | 'multiline' = 'single-line'; @Input() disableAutoFocusOnMobile = true; @Input() disableTypingEvents = false;\n  @Input()\n  set disableSoundForMessage(value: boolean) { this._disableSoundForMessage.set(value); this.disableSoundForMessageExplicitlySet.set(true); }\n  get disableSoundForMessage(): boolean { return this._disableSoundForMessage(); }\n  @Input()\n  set customSoundForMessage(value: string) { this._customSoundForMessage.set(value); this.customSoundForMessageExplicitlySet.set(true); }\n  get customSoundForMessage(): string { return this._customSoundForMessage(); }\n  @Input() messageToEdit?: CometChat.BaseMessage; @Input() messageToReply?: CometChat.BaseMessage;\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) { this._textFormatters.set(value); this.textFormattersExplicitlySet.set(true); }\n  get textFormatters(): CometChatTextFormatter[] { return this._textFormatters(); }\n  @Input() headerView?: TemplateRef<unknown>; @Input() footerView?: TemplateRef<unknown>; @Input() sendButtonView?: TemplateRef<unknown>;\n  @Input() auxiliaryButtonView?: TemplateRef<unknown>; @Input() secondaryButtonView?: TemplateRef<unknown>; @Input() attachmentIconView?: TemplateRef<unknown>;\n  @Input() voiceRecordingIconView?: TemplateRef<unknown>; @Input() emojiIconView?: TemplateRef<unknown>; @Input() errorView?: TemplateRef<any>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null; @Input() emptyStateTemplate: TemplateRef<any> | null = null; @Input() errorStateTemplate: TemplateRef<any> | null = null; @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n  @Input({ transform: booleanAttribute }) hideError = false;\n  @Output() textChange = new EventEmitter<string>(); @Output() sendButtonClick = new EventEmitter<CometChat.BaseMessage>(); @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() closePreview = new EventEmitter<void>();\n  /** @note currently retained for future use; the active file flow sends selected files directly. */\n  @Output() attachmentAdded = new EventEmitter<File>();\n  /** @note currently retained for future use; the active file flow sends selected files directly. */\n  @Output() attachmentRemoved = new EventEmitter<File>();\n  @Output() mentionSelected = new EventEmitter<CometChat.User | CometChat.GroupMember>();\n  @ViewChild('textInput') textInputRef?: ElementRef<HTMLTextAreaElement>; @ViewChild('fileInput') fileInputRef?: ElementRef<HTMLInputElement>;\n  @ViewChild('attachmentButton', { read: ElementRef }) attachmentButtonRef?: ElementRef; @ViewChild('emojiButton', { read: ElementRef }) emojiButtonRef?: ElementRef;\n  @ViewChild('stickersButton', { read: ElementRef }) stickersButtonRef?: ElementRef; @ViewChild('voiceButton', { read: ElementRef }) voiceButtonRef?: ElementRef; @ViewChild('sendButton', { read: ElementRef }) sendButtonRef?: ElementRef;\n  @ViewChild(CometChatMediaRecorderComponent) mediaRecorderRef?: CometChatMediaRecorderComponent; @ViewChild('bubbleMenuElement', { read: ElementRef }) bubbleMenuElementRef?: ElementRef; @ViewChildren(CometChatPopoverComponent) popoverInstances!: QueryList<CometChatPopoverComponent>;\n  readonly attachmentIconUrl = 'assets/add_circle.svg'; readonly attachmentIconUrlActive = 'assets/add_circle_fill.svg'; readonly emojiIconUrl = 'assets/mood.svg'; readonly emojiIconUrlActive = 'assets/mood_fill.svg';\n  readonly stickerIconUrl = 'assets/sticker.svg'; readonly stickerIconUrlActive = 'assets/sticker_fill.svg'; readonly voiceIconUrl = 'assets/mic.svg'; readonly sendIconUrl = 'assets/send_fill.svg'; readonly toolbarToggleIconUrl = 'assets/toolbar-toggle.svg';\n  protected currentUser = signal<CometChat.User | null>(null); protected currentGroup = signal<CometChat.Group | null>(null); composerError = signal<Error | null>(null); private propsProvided = signal<boolean>(false);\n  Placement = Placement; contentToDisplay = signal<'attachments' | 'emojiKeyboard' | 'voiceRecording' | 'stickers' | 'ai' | 'none'>('none');\n  composerText = signal<string>(''); attachments = signal<AttachmentFile[]>([]); isEmojiKeyboardOpen = signal<boolean>(false); isStickersKeyboardOpen = signal<boolean>(false);\n  isFixedToolbarShown = signal<boolean>(false); isFixedToolbarManuallyToggled = signal<boolean>(false); isFullscreenViewerOpen = signal<boolean>(false); fullscreenViewerIndex = signal<number>(0);\n  isAttachmentMenuOpen = signal<boolean>(false); isMentionSuggestionsOpen = signal<boolean>(false); isRecording = signal<boolean>(false); isPollModalOpen = signal<boolean>(false);\n  isLinkDialogOpen = signal<boolean>(false); isLinkPopoverOpen = signal<boolean>(false); linkPopoverUrl = signal<string>(''); linkPopoverText = signal<string>(''); linkPopoverX = signal<number>(0); linkPopoverY = signal<number>(0);\n  linkDialogMode = signal<'add' | 'edit'>('add'); linkDialogInitialText = signal<string>(''); linkDialogInitialUrl = signal<string>(''); linkDialogX = signal<number>(0); linkDialogY = signal<number>(0);\n  private savedLinkSelection: SelectionState | null = null; isExtensionLoading = signal<boolean>(false); recordingDuration = signal<number>(0); isDraggingOver = signal<boolean>(false);\n  protected bubbleMenuPosition = signal<{ top: number; left: number } | null>(null); private bubbleMenuDebounceTimer: ReturnType<typeof setTimeout> | null = null; private isMouseDown = false;\n  protected isBubbleMenuVisible = signal<boolean>(false); protected isMobileView = signal<boolean>(false); protected textSelection = signal<{ from: number; to: number } | null>(null);\n  private dragCounter = 0; private boundResizeHandler: (() => void) | null = null; mentionSearchText = signal<string>('');\n  cursorPosition = signal<number>(0); focusedMentionIndex = signal<number>(0); mentionSuggestions = computed(() => this.messageComposerService.mentionSuggestions()); isFetchingMentions = computed(() => this.messageComposerService.isFetchingMentions());\n  mentionsRequestBuilder: CometChat.UsersRequestBuilder | CometChat.GroupMembersRequestBuilder | null = null; isFetchingMoreMentions = computed(() => this.messageComposerService.isFetchingMoreMentions()); hasMoreMentions = computed(() => this.messageComposerService.hasMoreMentions());\n  textFormatterArray = signal<CometChatTextFormatter[]>([]); mentionsFormatter = signal<CometChatMentionsFormatter | null>(null); liveRegionPoliteText = signal<string>(''); liveRegionAssertiveText = signal<string>('');\n  fileSizeError = signal<FileSizeError | null>(null); uniqueMentionCount = signal<number>(0); showMentionsCountWarning = signal<boolean>(false);\n  private plainTextMentionUids = new Set<string>(); private mentionedUsersMap = new Map<string, CometChat.User>(); private skipNextMentionCheck = false;\n  messageToReplySignal = signal<CometChat.BaseMessage | null>(null); textMessageToEdit = signal<CometChat.TextMessage | null>(null); isEditMode = signal<boolean>(false);\n  // True only while a staged batch is mid-send. A multi-attachment batch is delivered one\n  // MediaMessage at a time and the tray is cleared only once the LAST lands, so without this the\n  // button stays enabled for the whole (long) send and a second click re-sends the entire batch.\n  isSendingStaged = signal<boolean>(false);\n  canSend = computed(() => this.isSendingStaged() ? false : (this.mediaUploadTray.hasTiles() ? this.mediaUploadTray.canSend() : (this.composerText().trim().length > 0 || this.attachments().length > 0 || this.isRecording()))); showVoiceButton = computed(() => !this.composerText().trim().length && !this.isRecording() && !this.mediaUploadTray.hasTiles());\n  isInReplyMode = computed(() => !!this.parentMessageId); isInQuotedReplyMode = computed(() => !!this.messageToReplySignal()); isInEditMode = computed(() => !!this.messageToEdit || !!this.textMessageToEdit());\n  hasAttachments = computed(() => this.attachments().length > 0); attachmentCount = computed(() => this.attachments().length); canAddMoreAttachments = computed(() => this.attachments().length < this.maxAttachments);\n  protected shouldShowToolbar = computed(() => { if (!this.enableRichText) return false; if (this.isMobileView() && this.showBubbleMenuOnSelection && this.isFixedToolbarShown()) return true; return !this.hideRichTextToolbar; });\n  protected currentLayoutMode = computed(() => this.layout); protected isMultilineLayout = computed(() => this.layout === 'multiline');\n  attachmentMenuOptions = computed(() => buildAttachmentMenuOptionsImpl(this as any));\n  private readonly destroyRef = inject(DestroyRef); private typingTimeout?: ReturnType<typeof setTimeout>; private originalTextBeforeEdit = ''; private _enteringEditMode = false;\n\n  constructor() {\n    setupConstructorEffectsImpl(this as any);\n  }\n  ngOnInit(): void { try { composerNgOnInitImpl(this as any); } catch (error) { this.handleLifecycleError(error, 'ngOnInit'); } }\n  ngAfterViewInit(): void { try { this.initializeRichTextEditor(); this.initializeTextFormatters(); } catch (error) { this.handleLifecycleError(error, 'ngAfterViewInit'); } }\n  ngOnChanges(changes: SimpleChanges): void { try { composerNgOnChangesImpl(this as any, changes); if (changes['user'] || changes['group']) { this.mediaUploadTray.reset(); } } catch (error) { CometChatLogger.error('CometChatMessageComposer', 'Error in ngOnChanges:', error); } }\n  ngOnDestroy(): void { try { if (this.boundResizeHandler) { window.removeEventListener('resize', this.boundResizeHandler); this.boundResizeHandler = null; } if (this.typingTimeout) { clearTimeout(this.typingTimeout); this.typingTimeout = undefined; } this.endTypingIndicator(); this.destroyRichTextEditor(); this.messageComposerService.cleanup(); this.mediaUploadTray.reset(); this.voiceCoordinator.release(this); } catch (error) { CometChatLogger.error('CometChatMessageComposer', 'Error during cleanup:', error); } }\n  private handleLifecycleError(error: unknown, hook: string): void { const err = error instanceof Error ? error : new Error(String(error)); CometChatLogger.error('CometChatMessageComposer', `Error in ${hook}:`, err); this.composerError.set(err); this.error.emit(err as CometChat.CometChatException); }\n  handleRetryClick(): void {\n    this.composerError.set(null);\n    try {\n      this.setupErrorCallback();\n      this.initializeMobileViewDetection();\n      this.initializeComposerText();\n      this.initializeTextFormatters();\n    } catch (error) {\n      this.handleLifecycleError(error, 'handleRetryClick');\n    }\n  }\n  private setupErrorCallback(): void {\n    this.messageComposerService.setErrorCallback((error: CometChat.CometChatException) => {\n      this.error.emit(error);\n    });\n  }\n  private initializeComposerText(): void {\n    if (this.text) { this.composerText.set(this.text); this.textChange.emit(this.text); } else if (this.initialComposerText) {\n      this.composerText.set(this.initialComposerText);\n      this.textChange.emit(this.initialComposerText);\n    }\n  }\n  private initializeMobileViewDetection(): void {\n    this.updateMobileViewState();\n    this.boundResizeHandler = () => this.updateMobileViewState();\n    window.addEventListener('resize', this.boundResizeHandler);\n    // Guaranteed cleanup via DestroyRef — runs even if ngOnDestroy throws\n    this.destroyRef.onDestroy(() => {\n      if (this.boundResizeHandler) {\n        window.removeEventListener('resize', this.boundResizeHandler);\n        this.boundResizeHandler = null;\n      }\n    });\n  }\n  private updateMobileViewState(): void {\n    const isMobile = window.innerWidth < 480;\n    this.isMobileView.set(isMobile);\n  }\n  private initializeTextFormatters(): void { initializeTextFormattersImpl(this as any); }\n  private getComposerId(): { user: string | null; group: string | null; parentMessageId: number | null; } {\n    return { user: this.currentUser()?.getUid() || null, group: this.currentGroup()?.getGuid() || null, parentMessageId: this.parentMessageId || null };\n  }\n  private configureTextFormatters(): void { configureTextFormattersImpl(this as any); }\n  private forwardKeyEventToFormatters(event: KeyboardEvent, eventType: 'keydown' | 'keyup'): void { forwardKeyEventToFormattersImpl(this as any, event, eventType); }\n  private updateFormatterCaretPosition(): void { updateFormatterCaretPositionImpl(this as any); }\n  private subscribeToActivePopoverEvent(): void { subscribeToActivePopoverEventImpl(this as any); }\n  private subscribeToReplyToMessageEvent(): void { subscribeToReplyToMessageEventImpl(this as any); }\n  private subscribeToMessageEditedEvent(): void { subscribeToMessageEditedEventImpl(this as any); }\n  private subscribeToMessageDeletedEvent(): void { subscribeToMessageDeletedEventImpl(this as any); }\n  private subscribeToComposeMessageEvent(): void { subscribeToComposeMessageEventImpl(this as any); }\n  private subscribeToSdkMessageDeletedEvent(): void { subscribeToSdkMessageDeletedEventImpl(this as any); }\n  private subscribeToShowModalEvent(): void { subscribeToShowModalEventImpl(this as any); }\n  private subscribeToHideModalEvent(): void { subscribeToHideModalEventImpl(this as any); }\n  private subscribeToShowMentionsCountWarningEvent(): void { subscribeToShowMentionsCountWarningEventImpl(this as any); }\n  private insertTextFromExternalSource(text: string): void {\n    const currentText = this.composerText();\n    const newText = currentText ? `${currentText} ${text}` : text;\n    this.composerText.set(newText);\n    if (this.customRichTextEditor && this.enableRichText) { this.richTextEditorService.setContent(this.customRichTextEditor, newText); }\n  }\n  private syncLegacyPopoverSignals(): void { syncLegacyPopoverSignalsImpl(this as any); }\n\n  /**\n   * Stop this composer's recording because another composer claimed the microphone. Clearing\n   * `contentToDisplay` and re-syncing drops `isRecording`, which swaps the template back off the\n   * recorder branch — unmounting <cometchat-media-recorder>, whose ngOnDestroy stops the recorder\n   * and releases the mic stream. Called by VoiceRecordingCoordinatorService, never directly.\n   */\n  stopRecordingForCoordinator(): void {\n    if (!this.isRecording()) { return; }\n    this.contentToDisplay.set('none');\n    this.syncLegacyPopoverSignals();\n    this.recordingDuration.set(0);\n    this.announceRecordingStopped();\n    this.cdr.markForCheck();\n  }\n  toggleEmojiKeyboard(): void { toggleEmojiKeyboardImpl(this as any); }\n  toggleAttachmentMenu(): void { toggleAttachmentMenuImpl(this as any); }\n  toggleVoiceRecording(): void { toggleVoiceRecordingImpl(this as any); }\n  toggleStickersKeyboard(): void { toggleStickersKeyboardImpl(this as any); }\n  toggleAI(): void { toggleAIImpl(this as any); }\n  private handleEditModeChange(messageToEdit?: CometChat.BaseMessage): void {\n    if (messageToEdit) { this.enterEditMode(messageToEdit as CometChat.TextMessage); } else if (this.originalTextBeforeEdit !== undefined) {\n      // (the event was already emitted by the source that cleared the input)\n      this.exitEditModeWithoutEvent();\n    }\n  }\n  private handleReplyModeChange(messageToReply?: CometChat.BaseMessage): void {\n    if (messageToReply) { this.enterReplyMode(messageToReply); } else {\n      this.exitReplyMode();\n    }\n  }\n  private resetComposerState(): void { resetComposerStateImpl(this as any); }\n  private clearComposer(): void { clearComposerImpl(this as any); }\n  enterReplyMode(message: CometChat.BaseMessage): void { enterReplyModeImpl(this as any, message); }\n  exitReplyMode(): void { exitReplyModeImpl(this as any); }\n  openPollModal(): void { openPollModalImpl(this as any); }\n  closePollModal(): void { closePollModalImpl(this as any); }\n  onPollCreated(): void { onPollCreatedImpl(this as any); }\n  handleLinkDialogSave(linkData: LinkData): void { handleLinkDialogSaveImpl(this as any, linkData); }\n  handleLinkDialogRemove(): void { handleLinkDialogRemoveImpl(this as any); }\n  handleLinkDialogCancel(): void { handleLinkDialogCancelImpl(this as any); }\n  private computeLinkDialogLeft(viewportX: number): number { return computeLinkDialogLeftImpl(this as any, viewportX); }\n  private handleLinkClick(url: string, text: string, x: number, y: number): void { handleLinkClickImpl(this as any, url, text, x, y); }\n  handleLinkPopoverEdit(data: { url: string; text: string }): void { handleLinkPopoverEditImpl(this as any, data); }\n  handleLinkPopoverRemove(): void { handleLinkPopoverRemoveImpl(this as any); }\n  handleLinkPopoverClose(): void { handleLinkPopoverCloseImpl(this as any); }\n  async createCollaborativeDocument(): Promise<void> { return createCollaborativeDocumentImpl(this as any); }\n  async createCollaborativeWhiteboard(): Promise<void> { return createCollaborativeWhiteboardImpl(this as any); }\n  getReplyPreviewTitle(): string { return getReplyPreviewTitleImpl(this as any); }\n  getReplyPreviewSubtitle(): string { return getReplyPreviewSubtitleImpl(this as any); }\n  private formatReplyPreviewText(message: CometChat.TextMessage): string { return formatReplyPreviewTextImpl(this as any, message); }\n  onReplyPreviewClose(): void { onReplyPreviewCloseImpl(this as any); }\n  enterEditMode(message: CometChat.TextMessage): void { enterEditModeImpl(this as any, message); }\n  private populateEditorWithFormattedText(message: CometChat.TextMessage): void { populateEditorWithFormattedTextImpl(this as any, message); }\n  cancelEdit(): void { cancelEditImpl(this as any); }\n  getCurrentEditMessage(): CometChat.BaseMessage | null {\n    return this.messageToEdit || this.textMessageToEdit();\n  }\n  getEditPreviewTitle(): string { return getEditPreviewTitleImpl(); }\n  getEditPreviewSubtitle(): string { return getEditPreviewSubtitleImpl(this as any); }\n  /** `[icon] N Images · caption` parts for the edit banner; null for text messages. */\n  getEditPreviewMedia(): MediaPreviewParts | null {\n    return getMediaPreviewPartsImpl(this as any, this.getCurrentEditMessage(), 'edit');\n  }\n  /** Same, for the reply banner. */\n  getReplyPreviewMedia(): MediaPreviewParts | null {\n    return getMediaPreviewPartsImpl(this as any, this.messageToReplySignal(), 'reply');\n  }\n  private formatEditPreviewText(message: CometChat.TextMessage): string { return formatEditPreviewTextImpl(this as any, message); }\n  private convertMarkdownToHtml(text: string): string { return convertMarkdownToHtmlImpl(text); }\n  onEditPreviewClose(): void { onEditPreviewCloseImpl(this as any); }\n  private exitEditModeWithoutEvent(): void { exitEditModeWithoutEventImpl(this as any); }\n  private exitEditMode(): void { this.exitEditModeWithoutEvent(); }\n  private initializeRichTextEditor(): void { initializeRichTextEditorImpl(this as any); }\n  private handleRichTextKeydown(event: KeyboardEvent): void { handleRichTextKeydownImpl(this as any, event); }\n  private destroyRichTextEditor(): void {\n    if (this.customRichTextEditor) {\n      this.richTextEditorService.destroyEditor(this.customRichTextEditor);\n      this.customRichTextEditor = null;\n      this.richTextEditorService.resetFormatState();\n    }\n  }\n  private handleRichTextUpdate(html: string, text: string): void { handleRichTextUpdateImpl(this as any, html, text); }\n  getRichTextMetadata(): RichTextMetadata | undefined {\n    if (!this.enableRichText) { return undefined; }\n    if (this.customRichTextEditor) { return this.richTextEditorService.getRichTextMetadata(this.customRichTextEditor); }\n    return undefined;\n  }\n  insertTextIntoRichTextEditor(text: string): void {\n    if (this.customRichTextEditor) { this.richTextEditorService.insertText(this.customRichTextEditor, text); }\n  }\n  clearRichTextEditorContent(): void {\n    if (this.customRichTextEditor) { this.richTextEditorService.clearContent(this.customRichTextEditor); }\n  }\n  focusRichTextEditor(): void { focusRichTextEditorImpl(this as any); }\n  handleTextInput(event: Event): void {\n    const target = event.target as HTMLTextAreaElement;\n    const newText = target.value;\n    this.composerText.set(newText);\n    this.textChange.emit(newText);\n    this.cursorPosition.set(target.selectionStart || 0);\n    if (!this.disableTypingEvents) { this.handleTypingStart(); }\n    if (!this.disableMentions) { this.checkForMentionTrigger(newText, target.selectionStart || 0); }\n    this.updateFormatterCaretPosition();\n  }\n  handleKeydown(event: KeyboardEvent): void { handleKeydownImpl(this as any, event); }\n  handleKeyup(event: KeyboardEvent): void { handleKeyupImpl(this as any, event); }\n  async handleSend(): Promise<void> {\n    if (this.mediaUploadTray.hasTiles()) {\n      await this.sendStagedMessage();\n      return;\n    }\n    return handleSendImpl(this as any);\n  }\n\n  /**\n   * Send the staged attachments as a BATCH: one MediaMessage per attachment type\n   * (order: images -> videos -> audios -> files), each tagged with a shared\n   * `metadata.batchId`. The caption (composer text) goes on the LAST message only.\n   * Voice notes are sent separately (via the recorder), not here.\n   */\n  private async sendStagedMessage(): Promise<void> {\n    // Re-entrancy guard: a batch is sent one message at a time and the tray clears only after the\n    // last lands, so a second Send (button double-tap, or Enter while the button hasn't re-rendered\n    // yet) would otherwise re-send the whole batch. Ignore any send that arrives while one is running.\n    if (this.isSendingStaged()) { return; }\n    const receiver = this.getReceiver();\n    if (!receiver) { return; }\n    const tiles = this.mediaUploadTray.getSuccessfulTiles();\n    if (tiles.length === 0) { return; }\n    this.isSendingStaged.set(true);\n\n    const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n    const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n    const caption = this.composerText().trim();\n    const quoted = this.messageToReplySignal();\n    // Prefer the SDK's batch id (the one the upload request owns and the presigns were scoped to)\n    // so the grouping key matches the batch the files were actually uploaded in.\n    const batchId = this.mediaUploadTray.getBatchId() ?? CometChatUIKitUtility.ID();\n\n    // Partition by the STAGED kind, preserving the display order. Grouping on the tile (not on\n    // attachment.getMimeType()) is what lets the \"File\" picker keep an MP4 as a file message.\n    const order: Array<'image' | 'video' | 'audio' | 'file'> = ['image', 'video', 'audio', 'file'];\n    const groups = order\n      .map((type) => ({\n        type,\n        items: tiles.filter((t) => t.type === type).map((t) => t.attachment as CometChat.Attachment),\n      }))\n      .filter((g) => g.items.length > 0);\n    if (groups.length === 0) { return; }\n\n    const messages = groups.map((g, i) => {\n      // Attachments are ALREADY uploaded (via the tray's upload request). Construct the message\n      // with NO file in the file slot — passing an array/File there sets message.files, which makes\n      // the SDK's hasPreUploadedAttachments() return false and attempt a (never-completing) upload.\n      // With no file + setAttachments(), the SDK takes the pre-uploaded path and actually sends.\n      const message = new CometChat.MediaMessage(receiverId, null as unknown as object, this.getMediaMessageType(g.type), receiverType);\n      message.setAttachments(g.items);\n      message.setMuid(CometChatUIKitUtility.ID());\n      message.setSentAt(CometChatUIKitUtility.getUnixTimestamp());\n      if (this.parentMessageId) { message.setParentMessageId(this.parentMessageId); }\n      if (quoted) { message.setQuotedMessage(quoted); message.setQuotedMessageId(quoted.getId()); }\n      // Merges rather than overwrites, so any metadata the SDK/app already set survives.\n      // Caption goes on the LAST message of the batch only.\n      const isLast = i === groups.length - 1;\n      stampBatchMetadata(message, {\n        batchId,\n        ...(isLast && caption ? { caption } : {}),\n      });\n      return message;\n    });\n\n    try {\n      // Optimistic hand-off: emit every pending bubble and clear the composer/tray up front, so the\n      // whole batch lands in the message list and LEAVES the preview the instant Send is clicked.\n      // The old code cleared in `finally` — after every (sequential) send round-trip resolved — which\n      // left the tiles lingering in the composer through the whole upload and made the batch trickle\n      // into the list one bubble at a time. Each pending bubble now flips to success/error below as\n      // its own send settles. This mirrors the optimistic clear the text/single-media path already does.\n      for (const message of messages) {\n        CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.inprogress });\n      }\n      this.clearComposer();\n      this.mediaUploadTray.clearAll();\n      if (quoted) { this.exitReplyMode(); }\n\n      let last: CometChat.BaseMessage | undefined;\n      for (const message of messages) {\n        let sent: CometChat.BaseMessage | undefined;\n        try {\n          sent = (await CometChat.sendMediaMessage(message)) as CometChat.BaseMessage | undefined;\n        } catch (sendErr) {\n          // Mark this message as failed (instead of leaving it stuck \"in progress\") then bubble up.\n          markMessageFailed(message, sendErr);\n          CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.error });\n          throw sendErr;\n        }\n        // CometChat.sendMediaMessage() swallows internal errors and returns undefined (no throw).\n        // Guard against that so the bubble doesn't get stuck \"in progress\" silently.\n        if (!sent) {\n          const noResult = new Error('CometChat.sendMediaMessage returned no message (SDK swallowed an internal error). Check that attachments are pre-uploaded and the message has no file set.');\n          markMessageFailed(message, noResult);\n          CometChatMessageEvents.ccMessageSent.next({ message, status: MessageStatus.error });\n          throw noResult;\n        }\n        CometChatMessageEvents.ccMessageSent.next({ message: sent, status: MessageStatus.success });\n        last = sent;\n      }\n      if (last) { this.sendButtonClick.emit(last); }\n      this.playOutgoingMessageSound();\n      this.announceMessageSent();\n    } catch (error) {\n      // Route through emitError (not error.emit) so a failure is logged, announced and toasted like\n      // every other composer error — the bare @Output is silent unless an integrator binds it. A\n      // rejected batch is already represented by its own error bubble in the list (markMessageFailed\n      // drives the error tick + reason); the composer/tray were cleared optimistically above, so\n      // there is nothing to restore here.\n      this.emitError(error);\n    } finally {\n      // Re-enable Send. The clear now happens up front, not here.\n      this.isSendingStaged.set(false);\n    }\n  }\n  private async handleEditMessage(newText: string, messageToEdit: CometChat.BaseMessage): Promise<void> { return handleEditMessageImpl(this as any, newText, messageToEdit); }\n  private async handleSendNewMessage(receiver: CometChat.User | CometChat.Group, text: string, attachments: AttachmentFile[]): Promise<void> { return handleSendNewMessageImpl(this as any, receiver, text, attachments); }\n  private buildMessageMetadata(): Record<string, unknown> | undefined { return buildMessageMetadataImpl(this as any); }\n  private extractMentionedUsers(): CometChat.User[] { return extractMentionedUsersImpl(this as any); }\n  private applyTextFormatters<T extends CometChat.TextMessage>(message: T): T { return applyTextFormattersImpl(this as any, message); }\n  private getMediaMessageType(fileType: 'image' | 'video' | 'audio' | 'file'): string { return getMediaMessageTypeImpl(fileType); }\n  private playOutgoingMessageSound(): void { playOutgoingMessageSoundImpl(this as any); }\n  private resetMentionsFormatter(): void {\n    const formatter = this.mentionsFormatter();\n    if (formatter) { formatter.reset(); }\n  }\n  handleAttachmentButtonClick(): void { handleAttachmentButtonClickImpl(this as any); }\n  handleAttachmentOptionClick(optionId: string): void { handleAttachmentOptionClickImpl(this as any, optionId); }\n  handleActionSheetItemClick(action: CometChatMessageComposerAction | CometChatActionsView): void { handleActionSheetItemClickImpl(this as any, action); }\n  handleActionSheetClose(): void { handleActionSheetCloseImpl(this as any); }\n  handleEmojiButtonClick(): void { this.toggleEmojiKeyboard(); }\n  handleEmojiSelect(emoji: string): void { handleEmojiSelectImpl(this as any, emoji); }\n  handleEmojiKeyboardClose(): void { handleEmojiKeyboardCloseImpl(this as any); }\n  private closeAllPopoverInstances(): void {\n    this.popoverInstances?.forEach(popover => {\n      if (popover.isOpen) { popover.closePopover(); }\n    });\n  }\n  onEmojiPopoverOpened(): void { onEmojiPopoverOpenedImpl(this as any); }\n  onEmojiPopoverClosed(): void { onEmojiPopoverClosedImpl(this as any); }\n  onAttachmentPopoverOpened(): void { onAttachmentPopoverOpenedImpl(this as any); }\n  onAttachmentPopoverClosed(): void { onAttachmentPopoverClosedImpl(this as any); }\n  onVoiceRecorderPopoverOpened(): void { onVoiceRecorderPopoverOpenedImpl(this as any); }\n  onVoiceRecorderPopoverClosed(): void { onVoiceRecorderPopoverClosedImpl(this as any); }\n  onStickersPopoverOpened(): void { onStickersPopoverOpenedImpl(this as any); }\n  onStickersPopoverClosed(): void { onStickersPopoverClosedImpl(this as any); }\n  async handleStickerSelect(event: StickerClickEvent): Promise<void> { return handleStickerSelectImpl(this as any, event); }\n  handleStickersKeyboardClose(): void { handleStickersKeyboardCloseImpl(this as any); }\n  private async sendStickerMessage(\n    receiver: CometChat.User | CometChat.Group,\n    stickerUrl: string,\n    stickerName: string\n  ): Promise<void> { return sendStickerMessageImpl(this as any, receiver, stickerUrl, stickerName); }\n  handleAttachmentClick(attachment: AttachmentFile, index: number): void { handleAttachmentClickImpl(this as any, attachment, index); }\n  handleFullscreenViewerClose(): void { handleFullscreenViewerCloseImpl(this as any); }\n  handleFullscreenViewerPrevious(): void { handleFullscreenViewerPreviousImpl(this as any); }\n  handleFullscreenViewerNext(): void { handleFullscreenViewerNextImpl(this as any); }\n  getCurrentFullscreenAttachment(): AttachmentFile | undefined { return getCurrentFullscreenAttachmentImpl(this as any); }\n  insertTextAtCursor(textToInsert: string): number { return insertTextAtCursorImpl(this as any, textToInsert); }\n  private focusTextInput(): void { focusTextInputImpl(this as any); }\n  private focusAttachmentButton(): void { focusAttachmentButtonImpl(this as any); }\n  private focusEmojiButton(): void { focusEmojiButtonImpl(this as any); }\n  private focusStickersButton(): void { focusStickersButtonImpl(this as any); }\n  private focusVoiceButton(): void { focusVoiceButtonImpl(this as any); }\n  handleVoiceRecordingClick(): void { handleVoiceRecordingClickImpl(this as any); }\n  startInlineRecording(): void { startInlineRecordingImpl(this as any); }\n  toggleFixedToolbar(): void { toggleFixedToolbarImpl(this as any); }\n  async handleRecordingComplete(audioBlob: Blob): Promise<void> { return handleRecordingCompleteImpl(this as any, audioBlob); }\n  handleRecordingCancel(): void { handleRecordingCancelImpl(this as any); }\n  handleRecordingError(error: Error): void { handleRecordingErrorImpl(this as any, error); }\n  handleClosePreview(): void {\n    if (this.isInEditMode() && this.messageToEdit) { this.cancelEdit(); } else if (this.isInQuotedReplyMode()) {\n      this.onReplyPreviewClose();\n    } else {\n      this.closePreview.emit();\n    }\n  }\n  closeAllPopups(): void { closeAllPopupsImpl(this as any); }\n  private isAnyPopupOpen(): boolean {\n    return (\n      this.isEmojiKeyboardOpen() ||\n      this.isStickersKeyboardOpen() ||\n      this.isAttachmentMenuOpen() ||\n      this.isMentionSuggestionsOpen() ||\n      this.isRecording() ||\n      this.isFullscreenViewerOpen()\n    );\n  }\n  private handleFormattingShortcuts(event: KeyboardEvent): boolean { return handleFormattingShortcutsImpl(this as any, event); }\n  private closeBubbleMenu(): void {\n    if (this.customRichTextEditor) { this.customRichTextEditor.getContentEditable().focus(); }\n    this.isBubbleMenuVisible.set(false);\n    this.textSelection.set(null);\n    this.cdr.markForCheck();\n  }\n  @HostListener('keydown.escape', ['$event'])\n  handleGlobalEscapeKey(event: Event): void { handleGlobalEscapeKeyImpl(this as any, event); }\n  private readonly TYPING_TIMEOUT_MS = 500;\n  private handleTypingStart(): void { handleTypingStartImpl(this as any); }\n  private startTyping(): void { startTypingImpl(this as any); }\n  private endTypingIndicator(): void { endTypingIndicatorImpl(this as any); }\n  private getReceiver(): CometChat.User | CometChat.Group | undefined {\n    return this.currentUser() ?? this.currentGroup() ?? undefined;\n  }\n  private checkForMentionTrigger(text: string, cursorPos: number): void { checkForMentionTriggerImpl(this as any, text, cursorPos); }\n  private scrollMentionIntoView(index: number): void { scrollMentionIntoViewImpl(this as any, index); }\n  private closeMentionSuggestions(): void { closeMentionSuggestionsImpl(this as any); }\n  private updateMentionsCount(): void { updateMentionsCountImpl(this as any); }\n  private initializeMentionsRequestBuilder(searchText: string): void { initializeMentionsRequestBuilderImpl(this as any, searchText); }\n  async fetchMoreMentions(): Promise<void> { return fetchMoreMentionsImpl(this as any); }\n  handleMentionsScroll(event: Event): void { handleMentionsScrollImpl(this as any, event); }\n  private async checkIfSelfMention(userId: string): Promise<boolean> { return checkIfSelfMentionImpl(this as any, userId); }\n  async selectMentionSuggestion(suggestion: MentionSuggestion): Promise<void> { return selectMentionSuggestionImpl(this as any, suggestion); }\n  @HostListener('document:click', ['$event'])\n  onDocumentClick(event: MouseEvent): void {\n    if (!this.isMentionSuggestionsOpen()) { return; }\n    const target = event.target as HTMLElement;\n    const mentionPanel = target.closest('.cometchat-message-composer__mention-suggestions');\n    const richTextEditor = target.closest('.cometchat-message-composer__rich-text-editor');\n    if (!mentionPanel && !richTextEditor) { this.closeMentionSuggestions(); }\n  }\n  private emitError(error: unknown): void { emitErrorImpl(this as any, error); }\n  private announcePolite(message: string): void { announcePoliteImpl(this as any, message); }\n  private announceAssertive(message: string): void { announceAssertiveImpl(this as any, message); }\n  private announceReplyModeActivated(): void { announceReplyModeActivatedImpl(this as any); }\n  private announceEditModeActivated(): void { announceEditModeActivatedImpl(this as any); }\n  private announceRecordingStarted(): void { announceRecordingStartedImpl(this as any); }\n  private announceRecordingStopped(): void { announceRecordingStoppedImpl(this as any); }\n  private announceMessageSent(): void { announceMessageSentImpl(this as any); }\n  private announceAttachmentAdded(fileName: string): void { announceAttachmentAddedImpl(this as any, fileName); }\n  private announceAttachmentRemoved(fileName: string): void { announceAttachmentRemovedImpl(this as any, fileName); }\n  private announceFocusedMention(name: string, position: number, total: number): void { announceFocusedMentionImpl(this as any, name, position, total); }\n  private announceMentionSuggestionsCount(count: number): void { announceMentionSuggestionsCountImpl(this as any, count); }\n  private announceMentionInserted(name: string): void { announceMentionInsertedImpl(this as any, name); }\n  private announceFormatStateChange(formatName: string, enabled: boolean): void { announceFormatStateChangeImpl(this as any, formatName, enabled); }\n  handleDragEnter(event: DragEvent): void { handleDragEnterImpl(this as any, event); }\n  handleDragLeave(event: DragEvent): void { handleDragLeaveImpl(this as any, event); }\n  handleDragOver(event: DragEvent): void { handleDragOverImpl(this as any, event); }\n  handleDrop(event: DragEvent): void { handleDropImpl(this as any, event); }\n  handlePaste(event: ClipboardEvent): void { handlePasteImpl(this as any, event); }\n  handleFileInputChange(event: Event): void { handleFileInputChangeImpl(this as any, event); }\n  /** Drop-zone glyph, masked so it takes the overlay's text colour. */\n  readonly uploadIconUrl = 'assets/upload.svg';\n\n  /**\n   * The attachment-menu option that opened the file dialog. Consumed (and cleared) by the very\n   * next `processFiles`, so it can never leak into a later drag-drop or paste.\n   */\n  pendingPickerKind?: 'image' | 'video' | 'audio' | 'file';\n\n  private processFiles(files: File[]): void {\n    const pickerKind = this.pendingPickerKind;\n    this.pendingPickerKind = undefined;\n    if (this.enableMultipleAttachments) {\n      this.mediaUploadTray.setValidationConfig({ allowedFileTypes: this.allowedFileTypes, maxFileSize: this.maxFileSize });\n      // The SDK presign endpoint needs the recipient (uid/guid + user/group) for role-based access,\n      // plus the thread parent so a thread upload is scoped to that thread.\n      const receiver = this.getReceiver();\n      if (receiver) {\n        const receiverId = receiver instanceof CometChat.User ? receiver.getUid() : receiver.getGuid();\n        const receiverType = receiver instanceof CometChat.User ? CometChat.RECEIVER_TYPE.USER : CometChat.RECEIVER_TYPE.GROUP;\n        this.mediaUploadTray.setReceiver(receiverId, receiverType, this.parentMessageId);\n      }\n      void this.mediaUploadTray.stage(files, pickerKind);\n    } else {\n      processFilesImpl(this as any, files); // deprecated single-attachment path\n    }\n  }\n  private async sendFilesDirectly(files: File[]): Promise<void> { return sendFilesDirectlyImpl(this as any, files); }\n  handleRemoveAttachment(attachment: AttachmentFile): void { handleRemoveAttachmentImpl(this as any, attachment); }\n  private getFileType(file: File): 'image' | 'video' | 'audio' | 'file' { return getFileTypeUtil(file); }\n  private getFileTypeLabel(mimeType: string): string { return getFileTypeLabelUtil(mimeType); }\n  dismissFileSizeError(): void { this.fileSizeError.set(null); }\n  getFileSizeErrorMessage(): string { return getFileSizeErrorMessageImpl(this as any); }\n  private getPluralFileType(fileType: string): string { return getPluralFileTypeUtil(fileType); }\n  handleInputFocus(): void {\n  }\n  handleInputBlur(): void {\n    // The composerText signal maintains the current content\n  }\n  get templateContext(): { user?: CometChat.User; group?: CometChat.Group } { return { user: this.currentUser() || undefined, group: this.currentGroup() || undefined }; }\n  handleToolbarBold(): void { handleToolbarBoldImpl(this as any); }\n  handleToolbarItalic(): void { handleToolbarItalicImpl(this as any); }\n  handleToolbarUnderline(): void { handleToolbarUnderlineImpl(this as any); }\n  handleToolbarStrikethrough(): void { handleToolbarStrikethroughImpl(this as any); }\n  handleToolbarInlineCode(): void { handleToolbarInlineCodeImpl(this as any); }\n  handleToolbarLink(): void { handleToolbarLinkImpl(this as any); }\n  handleToolbarOrderedList(): void { handleToolbarOrderedListImpl(this as any); }\n  handleToolbarBulletList(): void { handleToolbarBulletListImpl(this as any); }\n  handleToolbarCodeBlock(): void { handleToolbarCodeBlockImpl(this as any); }\n  handleToolbarBlockquote(): void { handleToolbarBlockquoteImpl(this as any); }\n  private handleSelectionUpdate(formatState: RichTextFormatState): void { handleSelectionUpdateImpl(this as any, formatState); }\n  private updateBubbleMenuPosition(range: Range): void { updateBubbleMenuPositionImpl(this as any, range); }\n  private calculateAndSetPosition(rect: DOMRect, editorRect: DOMRect, composerRect: DOMRect, bubbleMenuWidth: number): void { calculateAndSetPositionImpl(this as any, rect, editorRect, composerRect, bubbleMenuWidth); }\n  private getTextOffsetFromNode(root: HTMLElement, node: Node, offset: number): number { return getTextOffsetFromNodeImpl(root, node, offset); }\n  private updateFormatStateFromEditor(): void { updateFormatStateFromEditorImpl(this as any); }\n}\n","<!-- \n  CometChatMessageComposer Template\n  \n  A comprehensive message composer with support for:\n  - Text input with auto-expand\n  - Attachments with preview\n  - Emoji picker\n  - Voice recording\n  - Mentions\n  - Reply/Edit mode\n  - Rich text editing (optional)\n  \n  @see Requirements 1.1, 1.5, 28.1\n-->\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'MessageComposer'\">\n\n<!-- Error State -->\n<!-- @see Requirements 3.1, 3.2, 3.3, 3.5 -->\n@if (composerError() && !hideError) {\n  <div class=\"cometchat-message-composer\" role=\"region\" [attr.aria-label]=\"'message_composer_aria_label' | translate\">\n    @if (errorStateTemplate || errorView) {\n      <ng-container *ngTemplateOutlet=\"(errorStateTemplate || errorView)!\"></ng-container>\n    } @else {\n      <div class=\"cometchat-message-composer__error\">\n        <p class=\"cometchat-message-composer__error-text\">\n          {{ 'component_error_retry' | translate }}\n        </p>\n        <cometchat-button\n          [text]=\"'error_boundary_retry' | translate\"\n          (click)=\"handleRetryClick()\">\n        </cometchat-button>\n      </div>\n    }\n  </div>\n} @else {\n<div \n  class=\"cometchat-message-composer\"\n  data-cometchat-container\n  [class.cometchat-message-composer--single-line]=\"!isMultilineLayout()\"\n  [class.cometchat-message-composer--multiline]=\"isMultilineLayout()\"\n  role=\"region\"\n  [attr.aria-label]=\"'message_composer_aria_label' | translate\"\n  [class.cometchat-message-composer--dragging]=\"isDraggingOver()\"\n  [class.cometchat-message-composer--recording]=\"isRecording()\"\n  (dragenter)=\"enableDragDrop ? handleDragEnter($event) : null\"\n  (dragleave)=\"enableDragDrop ? handleDragLeave($event) : null\"\n  (dragover)=\"enableDragDrop ? handleDragOver($event) : null\"\n  (drop)=\"enableDragDrop ? handleDrop($event) : null\">\n\n  <!-- Bubble Menu (Web/Desktop only) -->\n  <!-- @see Requirements 1.1, 1.2, 1.3, 1.4, 1.7, 4.2 -->\n  @if (showBubbleMenuOnSelection && enableRichText && isBubbleMenuVisible() && !isLinkPopoverOpen()) {\n    <div \n      #bubbleMenuElement\n      class=\"cometchat-message-composer__bubble-menu\"\n      [attr.data-show]=\"true\"\n      [style.position]=\"'fixed'\"\n      [style.top.px]=\"bubbleMenuPosition()?.top ?? 0\"\n      [style.left.px]=\"bubbleMenuPosition()?.left ?? 0\"\n      role=\"toolbar\"\n      [attr.aria-label]=\"'message_composer_formatting_options' | translate\">\n      <!-- Bold Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().bold\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_bold' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().bold\"\n        (click)=\"handleToolbarBold()\"\n        (keydown.enter)=\"handleToolbarBold()\"\n        (keydown.space)=\"handleToolbarBold(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--bold\"></span>\n      </button>\n\n      <!-- Italic Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().italic\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_italic' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().italic\"\n        (click)=\"handleToolbarItalic()\"\n        (keydown.enter)=\"handleToolbarItalic()\"\n        (keydown.space)=\"handleToolbarItalic(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--italic\"></span>\n      </button>\n\n      <!-- Underline Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().underline\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_underline' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().underline\"\n        (click)=\"handleToolbarUnderline()\"\n        (keydown.enter)=\"handleToolbarUnderline()\"\n        (keydown.space)=\"handleToolbarUnderline(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--underline\"></span>\n      </button>\n\n      <!-- Strikethrough Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().strikethrough\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_strikethrough' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().strikethrough\"\n        (click)=\"handleToolbarStrikethrough()\"\n        (keydown.enter)=\"handleToolbarStrikethrough()\"\n        (keydown.space)=\"handleToolbarStrikethrough(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--strikethrough\"></span>\n      </button>\n\n      <!-- Separator -->\n      <span class=\"cometchat-message-composer__toolbar-separator\" aria-hidden=\"true\"></span>\n\n      <!-- Link Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().link\"\n        [attr.aria-label]=\"'message_composer_link' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().link\"\n        (click)=\"handleToolbarLink()\"\n        (keydown.enter)=\"handleToolbarLink()\"\n        (keydown.space)=\"handleToolbarLink(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--link\"></span>\n      </button>\n\n      <!-- Ordered List Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().orderedList\"\n        [attr.aria-label]=\"'message_composer_ordered_list' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().orderedList\"\n        (click)=\"handleToolbarOrderedList()\"\n        (keydown.enter)=\"handleToolbarOrderedList()\"\n        (keydown.space)=\"handleToolbarOrderedList(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--ordered-list\"></span>\n      </button>\n\n      <!-- Unordered List Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().bulletList\"\n        [attr.aria-label]=\"'message_composer_unordered_list' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().bulletList\"\n        (click)=\"handleToolbarBulletList()\"\n        (keydown.enter)=\"handleToolbarBulletList()\"\n        (keydown.space)=\"handleToolbarBulletList(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--bullet-list\"></span>\n      </button>\n\n      <!-- Separator -->\n      <span class=\"cometchat-message-composer__toolbar-separator\" aria-hidden=\"true\"></span>\n\n      <!-- Inline Code Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().code\"\n        [attr.aria-label]=\"'message_composer_inline_code' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().code\"\n        (click)=\"handleToolbarInlineCode()\"\n        (keydown.enter)=\"handleToolbarInlineCode()\"\n        (keydown.space)=\"handleToolbarInlineCode(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--inline-code\"></span>\n      </button>\n\n      <!-- Code Block Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().codeBlock\"\n        [attr.aria-label]=\"'message_composer_code_block' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().codeBlock\"\n        (click)=\"handleToolbarCodeBlock()\"\n        (keydown.enter)=\"handleToolbarCodeBlock()\"\n        (keydown.space)=\"handleToolbarCodeBlock(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--code-block\"></span>\n      </button>\n\n      <!-- Blockquote Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__bubble-menu-button\"\n        [class.cometchat-message-composer__bubble-menu-button--active]=\"richTextFormatState().blockquote\"\n        [attr.aria-label]=\"'message_composer_blockquote' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().blockquote\"\n        (click)=\"handleToolbarBlockquote()\"\n        (keydown.enter)=\"handleToolbarBlockquote()\"\n        (keydown.space)=\"handleToolbarBlockquote(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--blockquote\"></span>\n      </button>\n    </div>\n  }\n\n  <!-- Header Section (Reply/Edit Preview) -->\n  @if (headerView) {\n    <div class=\"cometchat-message-composer__header\">\n      <ng-container *ngTemplateOutlet=\"headerView; context: templateContext\"></ng-container>\n    </div>\n  } @else if (isInQuotedReplyMode() || isInEditMode()) {\n    <div class=\"cometchat-message-composer__header\">\n      <!-- Reply Preview using CometChatMessagePreview component -->\n      <!-- @see Requirements 2.2, 2.3, 2.4, 2.10 -->\n      <!-- @see Requirements 4.10 - aria-describedby references this element -->\n      @if (isInQuotedReplyMode() && !isInEditMode()) {\n        <div \n          id=\"composer-reply-preview\"\n          class=\"cometchat-message-composer__reply-preview\">\n          <cometchat-message-preview\n            [message]=\"messageToReplySignal()\"\n            [hideCloseButton]=\"false\"\n            [mode]=\"'reply'\"\n            [previewTitle]=\"replyPreviewTitleTemplate\"\n            [previewSubtitle]=\"replyPreviewSubtitleTemplate\"\n            [ariaLabel]=\"'message_composer_reply_preview' | translate\"\n            (closeClick)=\"onReplyPreviewClose()\">\n          </cometchat-message-preview>\n        </div>\n      }\n\n      <!-- Edit Preview using CometChatMessagePreview component -->\n      <!-- @see Requirements 3.3, 3.9, 5.3, 5.4 -->\n      <!-- @see Requirements 4.10 - aria-describedby references this element -->\n      @if (isInEditMode()) {\n        <div \n          id=\"composer-edit-preview\"\n          class=\"cometchat-message-composer__edit-preview\">\n          <cometchat-message-preview\n            [message]=\"getCurrentEditMessage()\"\n            [hideCloseButton]=\"false\"\n            [mode]=\"'edit'\"\n            [previewTitle]=\"editPreviewTitleTemplate\"\n            [previewSubtitle]=\"editPreviewSubtitleTemplate\"\n            [ariaLabel]=\"'message_composer_editing_message' | translate\"\n            (closeClick)=\"onEditPreviewClose()\">\n          </cometchat-message-preview>\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Reply Preview Title Template -->\n  <ng-template #replyPreviewTitleTemplate>\n    <div class=\"cometchat-message-composer__reply-preview-title\">\n      <!-- <span class=\"cometchat-message-composer__reply-preview-label\">\n        {{ 'message_composer_replying_to' | translate }}\n      </span> -->\n      <span class=\"cometchat-message-composer__reply-preview-sender\">\n        {{ getReplyPreviewTitle() }}\n      </span>\n    </div>\n  </ng-template>\n\n  <!-- Reply Preview Subtitle Template -->\n  <ng-template #replyPreviewSubtitleTemplate>\n    @if (getReplyPreviewMedia(); as media) {\n      <!-- Media: [icon] \"3 Images\" · caption -->\n      <span\n        class=\"cometchat-message-composer__reply-preview-subtitle cometchat-message-composer__reply-preview-subtitle--media\">\n        <img\n          class=\"cometchat-message-composer__reply-preview-media-icon\"\n          [src]=\"media.iconUrl\"\n          alt=\"\"\n          aria-hidden=\"true\" />\n        <span class=\"cometchat-message-composer__reply-preview-media-label\">{{ media.label }}</span>\n        @if (media.captionHtml) {\n          <span class=\"cometchat-message-composer__reply-preview-separator\" aria-hidden=\"true\">·</span>\n          <span\n            class=\"cometchat-message-composer__reply-preview-caption\"\n            [innerHTML]=\"media.captionHtml\"></span>\n        }\n      </span>\n    } @else {\n      <span\n        class=\"cometchat-message-composer__reply-preview-subtitle\"\n        [innerHTML]=\"getReplyPreviewSubtitle()\">\n      </span>\n    }\n  </ng-template>\n\n  <!-- Edit Preview Title Template -->\n  <!-- @see Requirements 3.3 -->\n  <ng-template #editPreviewTitleTemplate>\n    <div class=\"cometchat-message-composer__edit-preview-title\">\n      <span class=\"cometchat-message-composer__edit-preview-label\">\n        {{ 'message_composer_editing_message' | translate }}\n      </span>\n    </div>\n  </ng-template>\n\n  <!-- Edit Preview Subtitle Template -->\n  <!-- @see Requirements 3.9 - Shows formatted text with mentions properly displayed -->\n  <ng-template #editPreviewSubtitleTemplate>\n    @if (getEditPreviewMedia(); as media) {\n      <!-- Media: [icon] \"3 Images\" · caption -->\n      <span\n        class=\"cometchat-message-composer__edit-preview-subtitle cometchat-message-composer__edit-preview-subtitle--media\">\n        <img\n          class=\"cometchat-message-composer__edit-preview-media-icon\"\n          [src]=\"media.iconUrl\"\n          alt=\"\"\n          aria-hidden=\"true\" />\n        <span class=\"cometchat-message-composer__edit-preview-media-label\">{{ media.label }}</span>\n        @if (media.captionHtml) {\n          <span class=\"cometchat-message-composer__edit-preview-separator\" aria-hidden=\"true\">·</span>\n          <span\n            class=\"cometchat-message-composer__edit-preview-caption\"\n            [innerHTML]=\"media.captionHtml\"></span>\n        }\n      </span>\n    } @else {\n      <span\n        class=\"cometchat-message-composer__edit-preview-subtitle\"\n        [innerHTML]=\"getEditPreviewSubtitle()\">\n      </span>\n    }\n  </ng-template>\n\n  <!-- File Size Error Display -->\n  <!-- @see Requirements 12.2, 12.5, 12.6, 12.7, 12.8 -->\n  @if (fileSizeError()) {\n    <div \n      class=\"cometchat-message-composer__file-size-error\"\n      role=\"alert\"\n      aria-live=\"assertive\"\n      aria-atomic=\"true\">\n      <span class=\"cometchat-message-composer__file-size-error-icon\" aria-hidden=\"true\">\n        <div \n          class=\"cometchat-message-composer__warning-icon-img\" \n          aria-hidden=\"true\"></div>\n      </span>\n      <span class=\"cometchat-message-composer__file-size-error-message\">\n        {{ getFileSizeErrorMessage() }}\n      </span>\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__file-size-error-dismiss\"\n        [attr.aria-label]=\"'message_composer_dismiss_error' | translate\"\n        (click)=\"dismissFileSizeError()\"\n        (keydown.enter)=\"dismissFileSizeError()\"\n        (keydown.space)=\"dismissFileSizeError(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__close-icon\">×</span>\n      </button>\n    </div>\n  }\n\n  <!-- Mentions Count Warning Banner -->\n  <!-- @see Requirements 6.1, 6.2 -->\n  @if (showMentionsCountWarning()) {\n    <div \n      class=\"cometchat-message-composer__mention-warning\"\n      role=\"alert\"\n      aria-live=\"polite\"\n      aria-atomic=\"true\">\n      <span class=\"cometchat-message-composer__mention-warning-icon\" aria-hidden=\"true\">\n        <div \n          class=\"cometchat-message-composer__mention-warning-icon-img\" \n          aria-hidden=\"true\"></div>\n      </span>\n      <span class=\"cometchat-message-composer__mention-warning-message\">\n        {{ 'message_composer_mention_limit_warning' | translate }}\n      </span>\n    </div>\n  }\n\n  <!-- [DISABLED] Attachment Preview Section — files are sent directly now -->\n\n  <!-- Rich Text Toolbar (always positioned at top when visible) -->\n  @if (shouldShowToolbar()) {\n    <div \n      class=\"cometchat-message-composer__toolbar\"\n      role=\"toolbar\"\n      [attr.aria-label]=\"'message_composer_formatting_toolbar' | translate\">\n      <!-- Bold Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().bold\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_bold' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().bold\"\n        (click)=\"handleToolbarBold()\"\n        (keydown.enter)=\"handleToolbarBold()\"\n        (keydown.space)=\"handleToolbarBold(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--bold\"></span>\n      </button>\n\n      <!-- Italic Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().italic\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_italic' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().italic\"\n        (click)=\"handleToolbarItalic()\"\n        (keydown.enter)=\"handleToolbarItalic()\"\n        (keydown.space)=\"handleToolbarItalic(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--italic\"></span>\n      </button>\n\n      <!-- Underline Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().underline\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_underline' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().underline\"\n        (click)=\"handleToolbarUnderline()\"\n        (keydown.enter)=\"handleToolbarUnderline()\"\n        (keydown.space)=\"handleToolbarUnderline(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--underline\"></span>\n      </button>\n\n      <!-- Strikethrough Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().strikethrough\"\n        [disabled]=\"isInlineFormattingDisabled()\"\n        [attr.aria-label]=\"'message_composer_strikethrough' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().strikethrough\"\n        (click)=\"handleToolbarStrikethrough()\"\n        (keydown.enter)=\"handleToolbarStrikethrough()\"\n        (keydown.space)=\"handleToolbarStrikethrough(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--strikethrough\"></span>\n      </button>\n\n\n      <!-- Separator -->\n      <span class=\"cometchat-message-composer__toolbar-separator\" aria-hidden=\"true\"></span>\n\n      <!-- Link Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().link\"\n        [attr.aria-label]=\"'message_composer_link' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().link\"\n        (click)=\"handleToolbarLink()\"\n        (keydown.enter)=\"handleToolbarLink()\"\n        (keydown.space)=\"handleToolbarLink(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--link\"></span>\n      </button>\n\n\n      <!-- Ordered List Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().orderedList\"\n        [attr.aria-label]=\"'message_composer_ordered_list' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().orderedList\"\n        (click)=\"handleToolbarOrderedList()\"\n        (keydown.enter)=\"handleToolbarOrderedList()\"\n        (keydown.space)=\"handleToolbarOrderedList(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--ordered-list\"></span>\n      </button>\n\n      <!-- Unordered List Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().bulletList\"\n        [attr.aria-label]=\"'message_composer_unordered_list' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().bulletList\"\n        (click)=\"handleToolbarBulletList()\"\n        (keydown.enter)=\"handleToolbarBulletList()\"\n        (keydown.space)=\"handleToolbarBulletList(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--bullet-list\"></span>\n      </button>\n\n      <!-- Separator -->\n      <span class=\"cometchat-message-composer__toolbar-separator\" aria-hidden=\"true\"></span>\n\n\n      <!-- Inline Code Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().code\"\n        [attr.aria-label]=\"'message_composer_inline_code' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().code\"\n        (click)=\"handleToolbarInlineCode()\"\n        (keydown.enter)=\"handleToolbarInlineCode()\"\n        (keydown.space)=\"handleToolbarInlineCode(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--inline-code\"></span>\n      </button>\n\n      <!-- Code Block Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().codeBlock\"\n        [attr.aria-label]=\"'message_composer_code_block' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().codeBlock\"\n        (click)=\"handleToolbarCodeBlock()\"\n        (keydown.enter)=\"handleToolbarCodeBlock()\"\n        (keydown.space)=\"handleToolbarCodeBlock(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--code-block\"></span>\n      </button>\n\n      <!-- Blockquote Button -->\n      <button\n        type=\"button\"\n        class=\"cometchat-message-composer__toolbar-button\"\n        [class.cometchat-message-composer__toolbar-button--active]=\"richTextFormatState().blockquote\"\n        [attr.aria-label]=\"'message_composer_blockquote' | translate\"\n        [attr.aria-pressed]=\"richTextFormatState().blockquote\"\n        (click)=\"handleToolbarBlockquote()\"\n        (keydown.enter)=\"handleToolbarBlockquote()\"\n        (keydown.space)=\"handleToolbarBlockquote(); $event.preventDefault()\">\n        <span class=\"cometchat-message-composer__toolbar-icon cometchat-message-composer__toolbar-icon--blockquote\"></span>\n      </button>\n    </div>\n  }\n\n  <!-- Multiple-attachment staging tray (visible only when files are staged). Both layouts render it\n       here, above the input row — in multiline that puts it between the rich-text toolbar and the\n       input. Its border-bottom (painted only when tiles are staged) separates it from the input. -->\n  <cometchat-attachment-tray></cometchat-attachment-tray>\n\n  <!-- Main Input Section -->\n  <div\n    class=\"cometchat-message-composer__input-section\"\n    [class.cometchat-message-composer__input-section--multiline]=\"isMultilineLayout()\"\n    [attr.data-layout]=\"currentLayoutMode()\"\n    [attr.aria-label]=\"(isMultilineLayout() ? 'message_composer_layout_multiline' : 'message_composer_layout_single_line') | translate\"\n    role=\"group\">\n    <!-- Attachment Menu Content Template -->\n    <ng-template #attachmentMenuContent>\n      <cometchat-action-sheet\n        [actions]=\"attachmentMenuOptions()\"\n        (actionItemClick)=\"handleActionSheetItemClick($event)\"\n        (closeSheet)=\"handleActionSheetClose()\">\n      </cometchat-action-sheet>\n    </ng-template>\n\n    <!-- Single-line layout: Attachment button before input -->\n    @if (!isMultilineLayout() && !hideAttachmentButton && !isRecording()) {\n      <div class=\"cometchat-message-composer__attachment-button-wrapper\">\n        @if (attachmentIconView) {\n          <ng-container *ngTemplateOutlet=\"attachmentIconView\"></ng-container>\n        } @else {\n          <cometchat-popover\n            [placement]=\"Placement.top\"\n            [content]=\"attachmentMenuContent\"\n            [closeOnOutsideClick]=\"true\"\n            [constrainHorizontal]=\"true\"\n            [disabled]=\"isInEditMode()\"\n            (popoverOpened)=\"onAttachmentPopoverOpened()\"\n            (popoverClosed)=\"onAttachmentPopoverClosed()\">\n            <div class=\"cometchat-message-composer__attachment-button-inner\"\n              [class.cometchat-message-composer__attachment-button-inner--active]=\"contentToDisplay() === 'attachments'\">\n              <cometchat-button\n                #attachmentButton\n                [disabled]=\"isInEditMode()\"\n                [iconURL]=\"contentToDisplay() === 'attachments' ? attachmentIconUrlActive : attachmentIconUrl\"\n                [hoverText]=\"'message_composer_add_attachment' | translate\"\n                [ariaLabel]=\"'message_composer_add_attachment' | translate\">\n              </cometchat-button>\n            </div>\n          </cometchat-popover>\n        }\n      </div>\n    }\n\n\n    <!-- Text Input Area -->\n    <div class=\"cometchat-message-composer__text-input-wrapper\"\n      [class.cometchat-message-composer__text-input-wrapper--disabled]=\"isMultilineLayout() && isRecording()\"\n      [class.cometchat-message-composer__text-input-wrapper--hidden]=\"!isMultilineLayout() && isRecording()\">\n      <!-- Contenteditable Input (always rendered, disabled during recording) -->\n      <!-- @see Requirements 4.8 - role=\"textbox\" and aria-multiline=\"true\" -->\n      <!-- @see Requirements 4.9 - aria-label for accessibility -->\n      <!-- @see Requirements 4.10 - aria-describedby for reply preview -->\n      <div\n        #richTextEditorContainer\n        class=\"cometchat-message-composer__rich-text-editor\"\n        [class.cometchat-message-composer__rich-text-editor--plain]=\"!enableRichText\"\n        [class.cometchat-message-composer__rich-text-editor--recording]=\"isRecording()\"\n        role=\"textbox\"\n        aria-multiline=\"true\"\n        [attr.aria-label]=\"'message_composer_input_aria_label' | translate\"\n        [attr.aria-describedby]=\"isInQuotedReplyMode() ? 'composer-reply-preview' : (isInEditMode() ? 'composer-edit-preview' : null)\"\n        [attr.aria-expanded]=\"isMentionSuggestionsOpen()\"\n        [attr.aria-controls]=\"isMentionSuggestionsOpen() ? 'mention-suggestions-listbox' : null\"\n        [attr.aria-activedescendant]=\"isMentionSuggestionsOpen() && mentionSuggestions().length > 0 ? 'mention-option-' + focusedMentionIndex() : null\"\n        [attr.aria-haspopup]=\"'listbox'\"\n        [attr.aria-disabled]=\"isRecording()\"\n        [style.max-height.px]=\"maxHeight\"\n        (paste)=\"handlePaste($event)\">\n      </div>\n\n      <!-- Mention Suggestions Panel -->\n      <!-- @see Requirements 28.8 - role=\"listbox\" with role=\"option\" for each suggestion -->\n      <!-- @see Requirements 11.4 - Scroll listener and loading indicator for pagination -->\n      <!-- Only show when there are suggestions or when loading -->\n      @if (!disableMentions && isMentionSuggestionsOpen() && mentionSuggestions().length > 0) {\n        <div \n          id=\"mention-suggestions-listbox\"\n          class=\"cometchat-message-composer__mention-suggestions\"\n          role=\"listbox\"\n          [attr.aria-label]=\"'message_composer_mention_suggestions' | translate\"\n          (scroll)=\"handleMentionsScroll($event)\">\n          @for (suggestion of mentionSuggestions(); track suggestion.uid; let i = $index) {\n            <div\n              [id]=\"'mention-option-' + i\"\n              class=\"cometchat-message-composer__mention-option\"\n              [class.cometchat-message-composer__mention-option--focused]=\"focusedMentionIndex() === i\"\n              [class.cometchat-message-composer__mention-option--all]=\"suggestion.isAllMention\"\n              role=\"option\"\n              [attr.aria-selected]=\"focusedMentionIndex() === i\"\n              tabindex=\"-1\"\n              (mousedown)=\"selectMentionSuggestion(suggestion); $event.preventDefault()\"\n              (mouseenter)=\"focusedMentionIndex.set(i)\">\n              <!-- Avatar -->\n              @if (suggestion.isAllMention) {\n                <div class=\"cometchat-message-composer__mention-option-avatar cometchat-message-composer__mention-option-avatar--all\">\n                  <span class=\"cometchat-message-composer__mention-all-icon\">&#64;</span>\n                </div>\n              } @else {\n                <cometchat-avatar\n                  class=\"cometchat-message-composer__mention-option-avatar\"\n                  [image]=\"suggestion.avatar || ''\"\n                  [name]=\"suggestion.name\">\n                </cometchat-avatar>\n              }\n              <!-- Name & Subtitle -->\n              <span class=\"cometchat-message-composer__mention-option-name\">\n                @if (suggestion.isAllMention) {\n                  &#64;{{ suggestion.name }}\n                } @else {\n                  {{ suggestion.name }}\n                }\n              </span>\n              @if (suggestion.isAllMention) {\n                <span class=\"cometchat-message-composer__mention-option-subtitle\">\n                  {{ 'message_composer_mention_notify_everyone_label' | translate }}\n                </span>\n              }\n            </div>\n          }\n          <!-- Loading indicator for pagination (fetching more mentions) -->\n          @if (isFetchingMoreMentions()) {\n            <div class=\"cometchat-message-composer__mention-loading-more\">\n              <span class=\"cometchat-message-composer__mention-loading-spinner\" aria-hidden=\"true\"></span>\n            </div>\n          }\n        </div>\n      }\n    </div>\n\n    <!-- Multiline layout: Button row with all buttons -->\n    @if (isMultilineLayout()) {\n      <div class=\"cometchat-message-composer__button-row\">\n        @if (!isRecording()) {\n          <!-- Attachment Button -->\n          @if (!hideAttachmentButton) {\n            <div class=\"cometchat-message-composer__attachment-button-wrapper\">\n              @if (attachmentIconView) {\n                <ng-container *ngTemplateOutlet=\"attachmentIconView\"></ng-container>\n              } @else {\n                <cometchat-popover\n                  [placement]=\"Placement.top\"\n                  [content]=\"attachmentMenuContent\"\n                  [closeOnOutsideClick]=\"true\"\n                  [disabled]=\"isInEditMode()\"\n                  (popoverOpened)=\"onAttachmentPopoverOpened()\"\n                  (popoverClosed)=\"onAttachmentPopoverClosed()\">\n                  <div class=\"cometchat-message-composer__attachment-button-inner\"\n                    [class.cometchat-message-composer__attachment-button-inner--active]=\"contentToDisplay() === 'attachments'\">\n                    <cometchat-button\n                      #attachmentButton\n                      [disabled]=\"isInEditMode()\"\n                      [iconURL]=\"contentToDisplay() === 'attachments' ? attachmentIconUrlActive : attachmentIconUrl\"\n                      [hoverText]=\"'message_composer_add_attachment' | translate\"\n                      [ariaLabel]=\"'message_composer_add_attachment' | translate\">\n                    </cometchat-button>\n                  </div>\n                </cometchat-popover>\n              }\n            </div>\n          }\n\n          <!-- Voice Recording Button (multiline: next to attachment) -->\n          @if (!hideVoiceRecordingButton && showVoiceButton()) {\n            <div class=\"cometchat-message-composer__voice-button-wrapper\">\n              @if (voiceRecordingIconView) {\n                <ng-container *ngTemplateOutlet=\"voiceRecordingIconView\"></ng-container>\n              } @else {\n                <div class=\"cometchat-message-composer__voice-button-inner\">\n                  <cometchat-button #voiceButton [iconURL]=\"voiceIconUrl\"\n                    [hoverText]=\"'message_composer_voice_recording' | translate\"\n                    [ariaLabel]=\"'message_composer_voice_recording' | translate\"\n                    (buttonClick)=\"startInlineRecording()\">\n                  </cometchat-button>\n                </div>\n              }\n            </div>\n          }\n\n\n\n          <!-- Auxiliary Buttons (Emoji, Stickers, Voice) -->\n          <div class=\"cometchat-message-composer__auxiliary-buttons\">\n            @if (auxiliaryButtonView) {\n              <ng-container *ngTemplateOutlet=\"auxiliaryButtonView; context: templateContext\"></ng-container>\n            } @else {\n              @if (!hideEmojiKeyboardButton) {\n                <div class=\"cometchat-message-composer__emoji-button-wrapper\">\n                  @if (emojiIconView) {\n                    <ng-container *ngTemplateOutlet=\"emojiIconView\"></ng-container>\n                  } @else {\n                    <cometchat-popover [placement]=\"Placement.top\" [content]=\"emojiKeyboardContent\"\n                      [closeOnOutsideClick]=\"true\" (popoverOpened)=\"onEmojiPopoverOpened()\" (popoverClosed)=\"onEmojiPopoverClosed()\">\n                      <div class=\"cometchat-message-composer__emoji-button-inner\"\n                        [class.cometchat-message-composer__emoji-button-inner--active]=\"contentToDisplay() === 'emojiKeyboard'\">\n                        <cometchat-button #emojiButton\n                          [iconURL]=\"contentToDisplay() === 'emojiKeyboard' ? emojiIconUrlActive : emojiIconUrl\"\n                          [hoverText]=\"'message_composer_emoji' | translate\"\n                          [ariaLabel]=\"'message_composer_emoji' | translate\">\n                        </cometchat-button>\n                      </div>\n                    </cometchat-popover>\n                  }\n                </div>\n              }\n              <ng-template #emojiKeyboardContent>\n                @defer (when contentToDisplay() === 'emojiKeyboard') {\n                  <cometchat-emoji-keyboard (emojiClick)=\"handleEmojiSelect($event)\" (closeKeyboard)=\"handleEmojiKeyboardClose()\">\n                  </cometchat-emoji-keyboard>\n                } @placeholder {\n                  <div class=\"cometchat-message-composer__emoji-placeholder\" style=\"min-height:300px;min-width:300px;\"></div>\n                }\n              </ng-template>\n              @if (!hideStickersButton) {\n                <div class=\"cometchat-message-composer__sticker-button-wrapper\">\n                  <cometchat-popover [placement]=\"Placement.top\" [content]=\"stickersKeyboardContent\"\n                    [closeOnOutsideClick]=\"true\" [disabled]=\"isInEditMode()\" (popoverOpened)=\"onStickersPopoverOpened()\" (popoverClosed)=\"onStickersPopoverClosed()\">\n                    <div class=\"cometchat-message-composer__sticker-button-inner\"\n                      [class.cometchat-message-composer__sticker-button-inner--active]=\"contentToDisplay() === 'stickers'\">\n                      <cometchat-button #stickersButton\n                        [disabled]=\"isInEditMode()\"\n                        [iconURL]=\"contentToDisplay() === 'stickers' ? stickerIconUrlActive : stickerIconUrl\"\n                        [hoverText]=\"'message_composer_sticker_hover' | translate\"\n                        [ariaLabel]=\"'message_composer_sticker_hover' | translate\">\n                      </cometchat-button>\n                    </div>\n                  </cometchat-popover>\n                </div>\n              }\n              <ng-template #stickersKeyboardContent>\n                <cometchat-stickers-keyboard (stickerClick)=\"handleStickerSelect($event)\" (closeKeyboard)=\"handleStickersKeyboardClose()\">\n                </cometchat-stickers-keyboard>\n              </ng-template>\n            }\n          </div>\n        } @else {\n          <!-- Recording state: recorder in button row next to send -->\n          <div class=\"cometchat-message-composer__inline-recorder-wrapper\">\n            @defer (when isRecording()) {\n              <cometchat-media-recorder\n                [autoRecording]=\"true\"\n                (submitRecording)=\"handleRecordingComplete($event)\"\n                (closeRecording)=\"handleRecordingCancel()\"\n                (recordingError)=\"handleRecordingError($event)\">\n              </cometchat-media-recorder>\n            } @placeholder {\n              <div class=\"cometchat-message-composer__recorder-placeholder\"></div>\n            }\n          </div>\n        }\n\n        <!-- Send Button - always visible -->\n        @if (!hideSendButton) {\n          <div class=\"cometchat-message-composer__send-button-wrapper\">\n            @if (sendButtonView) {\n              <ng-container *ngTemplateOutlet=\"sendButtonView; context: templateContext\"></ng-container>\n            } @else {\n              <div class=\"cometchat-message-composer__send-button-inner\" [class.cometchat-message-composer__send-button-inner--disabled]=\"!canSend()\">\n                <cometchat-button #sendButton [iconURL]=\"sendIconUrl\" [disabled]=\"!canSend()\"\n                  [hoverText]=\"'message_composer_send' | translate\"\n                  [ariaLabel]=\"'message_composer_send' | translate\"\n                  (buttonClick)=\"handleSend()\">\n                </cometchat-button>\n              </div>\n            }\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Single-line layout: Auxiliary buttons and send button -->\n    @if (!isMultilineLayout()) {\n      @if (!isRecording()) {\n        <!-- Normal: auxiliary buttons -->\n        <div class=\"cometchat-message-composer__auxiliary-buttons\">\n          @if (auxiliaryButtonView) {\n            <ng-container *ngTemplateOutlet=\"auxiliaryButtonView; context: templateContext\"></ng-container>\n          } @else {\n            @if (!hideEmojiKeyboardButton) {\n              <div class=\"cometchat-message-composer__emoji-button-wrapper\">\n                @if (emojiIconView) {\n                  <ng-container *ngTemplateOutlet=\"emojiIconView\"></ng-container>\n                } @else {\n                  <cometchat-popover [placement]=\"Placement.top\" [content]=\"emojiKeyboardContent\"\n                    [closeOnOutsideClick]=\"true\" (popoverOpened)=\"onEmojiPopoverOpened()\" (popoverClosed)=\"onEmojiPopoverClosed()\">\n                    <div class=\"cometchat-message-composer__emoji-button-inner\"\n                      [class.cometchat-message-composer__emoji-button-inner--active]=\"contentToDisplay() === 'emojiKeyboard'\">\n                      <cometchat-button #emojiButton\n                        [iconURL]=\"contentToDisplay() === 'emojiKeyboard' ? emojiIconUrlActive : emojiIconUrl\"\n                        [hoverText]=\"'message_composer_emoji' | translate\"\n                        [ariaLabel]=\"'message_composer_emoji' | translate\">\n                      </cometchat-button>\n                    </div>\n                  </cometchat-popover>\n                }\n              </div>\n            }\n            <ng-template #emojiKeyboardContent>\n              @defer (when contentToDisplay() === 'emojiKeyboard') {\n                <cometchat-emoji-keyboard (emojiClick)=\"handleEmojiSelect($event)\" (closeKeyboard)=\"handleEmojiKeyboardClose()\">\n                </cometchat-emoji-keyboard>\n              } @placeholder {\n                <div class=\"cometchat-message-composer__emoji-placeholder\" style=\"min-height:300px;min-width:300px;\"></div>\n              }\n            </ng-template>\n            @if (!hideStickersButton) {\n              <div class=\"cometchat-message-composer__sticker-button-wrapper\">\n                <cometchat-popover [placement]=\"Placement.top\" [content]=\"stickersKeyboardContent\"\n                  [closeOnOutsideClick]=\"true\" [disabled]=\"isInEditMode()\" (popoverOpened)=\"onStickersPopoverOpened()\" (popoverClosed)=\"onStickersPopoverClosed()\">\n                  <div class=\"cometchat-message-composer__sticker-button-inner\"\n                    [class.cometchat-message-composer__sticker-button-inner--active]=\"contentToDisplay() === 'stickers'\">\n                    <cometchat-button #stickersButton\n                      [disabled]=\"isInEditMode()\"\n                      [iconURL]=\"contentToDisplay() === 'stickers' ? stickerIconUrlActive : stickerIconUrl\"\n                      [hoverText]=\"'message_composer_sticker_hover' | translate\"\n                      [ariaLabel]=\"'message_composer_sticker_hover' | translate\">\n                    </cometchat-button>\n                  </div>\n                </cometchat-popover>\n              </div>\n            }\n            <ng-template #stickersKeyboardContent>\n              <cometchat-stickers-keyboard (stickerClick)=\"handleStickerSelect($event)\" (closeKeyboard)=\"handleStickersKeyboardClose()\">\n              </cometchat-stickers-keyboard>\n            </ng-template>\n            @if (!hideVoiceRecordingButton && showVoiceButton()) {\n              <div class=\"cometchat-message-composer__voice-button-wrapper\">\n                @if (voiceRecordingIconView) {\n                  <ng-container *ngTemplateOutlet=\"voiceRecordingIconView\"></ng-container>\n                } @else {\n                  <div class=\"cometchat-message-composer__voice-button-inner\">\n                    <cometchat-button #voiceButton [iconURL]=\"voiceIconUrl\"\n                      [hoverText]=\"'message_composer_voice_recording' | translate\"\n                      [ariaLabel]=\"'message_composer_voice_recording' | translate\"\n                      (buttonClick)=\"startInlineRecording()\">\n                    </cometchat-button>\n                  </div>\n                }\n              </div>\n            }\n          }\n        </div>\n      } @else {\n        <!-- Recording state: recorder next to send button -->\n        <div class=\"cometchat-message-composer__inline-recorder-wrapper\">\n          @defer (when isRecording()) {\n            <cometchat-media-recorder\n              [autoRecording]=\"true\"\n              (submitRecording)=\"handleRecordingComplete($event)\"\n              (closeRecording)=\"handleRecordingCancel()\"\n              (recordingError)=\"handleRecordingError($event)\">\n            </cometchat-media-recorder>\n          } @placeholder {\n            <div class=\"cometchat-message-composer__recorder-placeholder\"></div>\n          }\n        </div>\n      }\n\n      <!-- Send Button - always visible -->\n      @if (!hideSendButton) {\n        <div class=\"cometchat-message-composer__send-button-wrapper\">\n          @if (sendButtonView) {\n            <ng-container *ngTemplateOutlet=\"sendButtonView; context: templateContext\"></ng-container>\n          } @else {\n            <div class=\"cometchat-message-composer__send-button-inner\" [class.cometchat-message-composer__send-button-inner--disabled]=\"!canSend()\">\n              <cometchat-button #sendButton [iconURL]=\"sendIconUrl\" [disabled]=\"!canSend()\"\n                [hoverText]=\"'message_composer_send' | translate\"\n                [ariaLabel]=\"'message_composer_send' | translate\"\n                (buttonClick)=\"handleSend()\">\n              </cometchat-button>\n            </div>\n          }\n        </div>\n      }\n    } <!-- end @if (!isMultilineLayout()) -->\n\n  <!-- Footer Section -->\n  @if (footerView) {\n    <div class=\"cometchat-message-composer__footer\">\n      <ng-container *ngTemplateOutlet=\"footerView; context: templateContext\"></ng-container>\n    </div>\n  }\n\n  <!-- Drop Zone Overlay (shown when dragging files) -->\n  @if (enableDragDrop && isDraggingOver()) {\n    <div \n      class=\"cometchat-message-composer__drop-zone\"\n      role=\"region\"\n      [attr.aria-label]=\"'message_composer_drop_files' | translate\">\n      <div class=\"cometchat-message-composer__drop-zone-content\">\n        <span\n          class=\"cometchat-message-composer__drop-zone-icon\"\n          aria-hidden=\"true\"\n          [style.-webkit-mask-image]=\"'url(' + uploadIconUrl + ')'\"\n          [style.mask-image]=\"'url(' + uploadIconUrl + ')'\"></span>\n        <span class=\"cometchat-message-composer__drop-zone-text\">\n          {{ 'message_composer_drop_files_here' | translate }}\n        </span>\n      </div>\n    </div>\n  }\n\n  <!-- Hidden File Input -->\n  <input\n    #fileInput\n    type=\"file\"\n    class=\"cometchat-message-composer__file-input\"\n    [attr.aria-hidden]=\"true\"\n    tabindex=\"-1\"\n    multiple\n    (change)=\"handleFileInputChange($event)\">\n\n  <!-- Live Region for Announcements -->\n  <!-- Polite live region for non-urgent announcements (reply/edit preview, message sent, attachments) -->\n  <!-- @see Requirements 28.9, 28.11, 28.12 -->\n  <div \n    class=\"cometchat-message-composer__live-region\"\n    role=\"status\"\n    aria-live=\"polite\"\n    aria-atomic=\"true\">\n    {{ liveRegionPoliteText() }}\n  </div>\n\n  <!-- Assertive live region for urgent announcements (recording state, errors) -->\n  <!-- @see Requirements 28.10, 28.13 -->\n  <div \n    class=\"cometchat-message-composer__live-region\"\n    role=\"alert\"\n    aria-live=\"assertive\"\n    aria-atomic=\"true\">\n    {{ liveRegionAssertiveText() }}\n  </div>\n\n  <!-- Fullscreen Viewer for Attachment Preview -->\n  <!-- @see Requirements 11.1, 11.2, 11.6, 11.7, 11.8, 11.9, 11.10 -->\n  @if (isFullscreenViewerOpen() && getCurrentFullscreenAttachment()) {\n    <div class=\"cometchat-message-composer__fullscreen-overlay\">\n      <cometchat-fullscreen-viewer\n        [url]=\"getCurrentFullscreenAttachment()?.thumbnailUrl || ''\"\n        (closeClick)=\"handleFullscreenViewerClose()\">\n      </cometchat-fullscreen-viewer>\n    </div>\n  }\n\n  <!-- CreatePoll Modal -->\n  <!-- @see Requirements 2.2, 2.3, 2.4, 2.5, 2.6 -->\n  @if (isPollModalOpen()) {\n    <div class=\"cometchat-message-composer__poll-modal-overlay\">\n      <cometchat-create-poll\n        [user]=\"currentUser() ?? undefined\"\n        [group]=\"currentGroup() ?? undefined\"\n        [replyToMessage]=\"messageToReplySignal() ?? undefined\"\n        (closeClick)=\"closePollModal()\"\n        (pollCreated)=\"onPollCreated()\"\n        (error)=\"error.emit($event)\">\n      </cometchat-create-poll>\n    </div>\n  }\n\n  <!-- Link Popover (Quick Actions) -->\n  @if (isLinkPopoverOpen()) {\n    <cometchat-link-popover\n      [url]=\"linkPopoverUrl()\"\n      [text]=\"linkPopoverText()\"\n      [x]=\"linkPopoverX()\"\n      [y]=\"linkPopoverY()\"\n      (editClick)=\"handleLinkPopoverEdit($event)\"\n      (removeClick)=\"handleLinkPopoverRemove()\"\n      (closeClick)=\"handleLinkPopoverClose()\">\n    </cometchat-link-popover>\n  }\n\n  <!-- Link Dialog -->\n  @if (isLinkDialogOpen()) {\n    <div class=\"cometchat-message-composer__link-dialog-overlay\"\n      (click)=\"handleLinkDialogCancel()\">\n      <div (click)=\"$event.stopPropagation()\">\n        <cometchat-link-dialog\n          [mode]=\"linkDialogMode()\"\n          [initialText]=\"linkDialogInitialText()\"\n          [initialUrl]=\"linkDialogInitialUrl()\"\n          [selectedText]=\"linkDialogInitialText()\"\n          (save)=\"handleLinkDialogSave($event)\"\n          (remove)=\"handleLinkDialogRemove()\"\n          (cancel)=\"handleLinkDialogCancel()\">\n        </cometchat-link-dialog>\n      </div>\n    </div>\n  }\n  </div>\n</div>\n}\n</cometchat-error-boundary>\n","/**\n * Emoji shortcode to Unicode emoji mapping.\n * Contains common emoji shortcodes used in chat applications.\n */\nexport const EMOJI_MAP: Record<string, string> = {\n  // Smileys & Emotion\n  smile: '😊', grin: '😀', grinning: '😀', joy: '😂', laughing: '😆', sweat_smile: '😅',\n  rofl: '🤣', wink: '😉', blush: '😊', innocent: '😇', heart_eyes: '😍', kissing_heart: '😘',\n  kissing: '😗', relaxed: '☺️', stuck_out_tongue: '😛', stuck_out_tongue_winking_eye: '😜',\n  stuck_out_tongue_closed_eyes: '😝', yum: '😋', sunglasses: '😎', smirk: '😏', unamused: '😒',\n  disappointed: '😞', pensive: '😔', worried: '😟', confused: '😕', slight_frown: '🙁',\n  frowning: '☹️', persevere: '😣', confounded: '😖', tired_face: '😫', weary: '😩',\n  cry: '😢', sob: '😭', triumph: '😤', angry: '😠', rage: '😡', no_mouth: '😶',\n  neutral_face: '😐', expressionless: '😑', hushed: '😯', flushed: '😳', astonished: '😲',\n  sleeping: '😴', dizzy_face: '😵', zipper_mouth: '🤐', mask: '😷', thinking: '🤔',\n  rolling_eyes: '🙄', grimacing: '😬', lying_face: '🤥', shushing_face: '🤫',\n  face_with_hand_over_mouth: '🤭', nerd: '🤓', monocle_face: '🧐', partying_face: '🥳',\n  pleading_face: '🥺', yawning_face: '🥱', hot_face: '🥵', cold_face: '🥶', woozy_face: '🥴',\n  zany_face: '🤪', star_struck: '🤩', exploding_head: '🤯', cowboy: '🤠', clown: '🤡',\n  nauseated_face: '🤢', sneezing_face: '🤧', vomiting_face: '🤮', skull: '💀', ghost: '👻',\n  alien: '👽', robot: '🤖', poop: '💩', smiley_cat: '😺', heart_eyes_cat: '😻',\n  crying_cat_face: '😿', scream_cat: '🙀', pouting_cat: '😾', see_no_evil: '🙈',\n  hear_no_evil: '🙉', speak_no_evil: '🙊',\n\n  // Gestures & Body Parts\n  wave: '👋', raised_hand: '✋', hand: '✋', ok_hand: '👌', pinching_hand: '🤏', v: '✌️',\n  crossed_fingers: '🤞', love_you_gesture: '🤟', metal: '🤘', call_me_hand: '🤙',\n  point_left: '👈', point_right: '👉', point_up: '👆', point_down: '👇', middle_finger: '🖕',\n  thumbsup: '👍', '+1': '👍', thumbsdown: '👎', '-1': '👎', fist: '✊', punch: '👊',\n  left_facing_fist: '🤛', right_facing_fist: '🤜', clap: '👏', raised_hands: '🙌',\n  open_hands: '👐', palms_up_together: '🤲', handshake: '🤝', pray: '🙏',\n  writing_hand: '✍️', nail_care: '💅', selfie: '🤳', muscle: '💪', leg: '🦵', foot: '🦶',\n  ear: '👂', nose: '👃', brain: '🧠', tooth: '🦷', bone: '🦴', eyes: '👀', eye: '👁️',\n  tongue: '👅', lips: '👄',\n\n  // Hearts & Love\n  heart: '❤️', red_heart: '❤️', orange_heart: '🧡', yellow_heart: '💛', green_heart: '💚',\n  blue_heart: '💙', purple_heart: '💜', black_heart: '🖤', white_heart: '🤍', brown_heart: '🤎',\n  broken_heart: '💔', two_hearts: '💕', revolving_hearts: '💞', heartbeat: '💓',\n  heartpulse: '💗', sparkling_heart: '💖', cupid: '💘', gift_heart: '💝',\n  heart_decoration: '💟', heavy_heart_exclamation: '❣️', love_letter: '💌', kiss: '💋',\n  kissing_couple: '💏', couple_with_heart: '💑',\n\n  // Celebration & Objects\n  fire: '🔥', star: '⭐', star2: '🌟', sparkles: '✨', boom: '💥', collision: '💥',\n  sweat_drops: '💦', dash: '💨', hole: '🕳️', bomb: '💣', speech_balloon: '💬',\n  thought_balloon: '💭', zzz: '💤', tada: '🎉', confetti_ball: '🎊', balloon: '🎈',\n  birthday: '🎂', gift: '🎁', trophy: '🏆', medal: '🏅', first_place_medal: '🥇',\n  second_place_medal: '🥈', third_place_medal: '🥉', crown: '👑', gem: '💎', ring: '💍',\n  moneybag: '💰', dollar: '💵', money_with_wings: '💸', credit_card: '💳', chart: '💹',\n  email: '📧', envelope: '✉️', package: '📦', label: '🏷️', bookmark: '🔖', clipboard: '📋',\n  calendar: '📅', pushpin: '📌', paperclip: '📎', scissors: '✂️', lock: '🔒', unlock: '🔓',\n  key: '🔑', hammer: '🔨', wrench: '🔧', gear: '⚙️', link: '🔗', bulb: '💡',\n  flashlight: '🔦', mag: '🔍', mag_right: '🔎', microscope: '🔬', telescope: '🔭',\n  satellite: '📡', syringe: '💉', pill: '💊', dna: '🧬', microbe: '🦠', petri_dish: '🧫',\n  test_tube: '🧪', thermometer: '🌡️', broom: '🧹', basket: '🧺', toilet: '🚽',\n  shower: '🚿', bathtub: '🛁', soap: '🧼', sponge: '🧽', bed: '🛏️', couch: '🛋️',\n  chair: '🪑', door: '🚪', window: '🪟',\n\n  // Food & Drink\n  apple: '🍎', green_apple: '🍏', pear: '🍐', tangerine: '🍊', lemon: '🍋', banana: '🍌',\n  watermelon: '🍉', grapes: '🍇', strawberry: '🍓', melon: '🍈', cherries: '🍒', peach: '🍑',\n  mango: '🥭', pineapple: '🍍', coconut: '🥥', kiwi: '🥝', tomato: '🍅', eggplant: '🍆',\n  avocado: '🥑', broccoli: '🥦', carrot: '🥕', corn: '🌽', hot_pepper: '🌶️', cucumber: '🥒',\n  leafy_green: '🥬', mushroom: '🍄', peanuts: '🥜', chestnut: '🌰', bread: '🍞',\n  croissant: '🥐', baguette: '🥖', pretzel: '🥨', bagel: '🥯', pancakes: '🥞', waffle: '🧇',\n  cheese: '🧀', egg: '🥚', cooking: '🍳', bacon: '🥓', steak: '🥩', poultry_leg: '🍗',\n  meat_on_bone: '🍖', hotdog: '🌭', hamburger: '🍔', fries: '🍟', pizza: '🍕',\n  sandwich: '🥪', taco: '🌮', burrito: '🌯', falafel: '🧆', stuffed_flatbread: '🥙',\n  spaghetti: '🍝', ramen: '🍜', soup: '🍲', curry: '🍛', sushi: '🍣', bento: '🍱',\n  dumpling: '🥟', fortune_cookie: '🥠', takeout_box: '🥡', rice: '🍚', rice_ball: '🍙',\n  rice_cracker: '🍘', fish_cake: '🍥', oden: '🍢', dango: '🍡', shaved_ice: '🍧',\n  ice_cream: '🍨', icecream: '🍦', pie: '🥧', cake: '🍰', cupcake: '🧁', moon_cake: '🥮',\n  doughnut: '🍩', cookie: '🍪', chocolate_bar: '🍫', candy: '🍬', lollipop: '🍭',\n  custard: '🍮', honey_pot: '🍯', baby_bottle: '🍼', milk: '🥛', coffee: '☕', tea: '🍵',\n  sake: '🍶', champagne: '🍾', wine_glass: '🍷', cocktail: '🍸', tropical_drink: '🍹',\n  beer: '🍺', beers: '🍻', clinking_glasses: '🥂', tumbler_glass: '🥃', cup_with_straw: '🥤',\n  bubble_tea: '🧋', beverage_box: '🧃', mate: '🧉', ice_cube: '🧊', chopsticks: '🥢',\n  fork_and_knife: '🍴', spoon: '🥄', knife: '🔪', plate_with_cutlery: '🍽️',\n\n  // Animals & Nature\n  dog: '🐶', cat: '🐱', mouse: '🐭', hamster: '🐹', rabbit: '🐰', fox: '🦊', bear: '🐻',\n  panda_face: '🐼', koala: '🐨', tiger: '🐯', lion: '🦁', cow: '🐮', pig: '🐷', frog: '🐸',\n  monkey_face: '🐵', chicken: '🐔', penguin: '🐧', bird: '🐦', baby_chick: '🐤',\n  hatching_chick: '🐣', hatched_chick: '🐥', duck: '🦆', eagle: '🦅', owl: '🦉', bat: '🦇',\n  wolf: '🐺', boar: '🐗', horse: '🐴', unicorn: '🦄', bee: '🐝', bug: '🐛', butterfly: '🦋',\n  snail: '🐌', shell: '🐚', beetle: '🐞', ant: '🐜', cricket: '🦗', spider: '🕷️',\n  spider_web: '🕸️', scorpion: '🦂', mosquito: '🦟', fly: '🪰', worm: '🪱', turtle: '🐢',\n  snake: '🐍', lizard: '🦎', t_rex: '🦖', sauropod: '🦕', octopus: '🐙', squid: '🦑',\n  shrimp: '🦐', lobster: '🦞', crab: '🦀', blowfish: '🐡', tropical_fish: '🐠', fish: '🐟',\n  dolphin: '🐬', whale: '🐳', whale2: '🐋', shark: '🦈', seal: '🦭', crocodile: '🐊',\n  leopard: '🐆', zebra: '🦓', gorilla: '🦍', orangutan: '🦧', elephant: '🐘', mammoth: '🦣',\n  rhinoceros: '🦏', hippopotamus: '🦛', camel: '🐫', dromedary_camel: '🐪', giraffe: '🦒',\n  kangaroo: '🦘', llama: '🦙', sheep: '🐑', goat: '🐐', deer: '🦌', dog2: '🐕', poodle: '🐩',\n  cat2: '🐈', rooster: '🐓', turkey: '🦃', peacock: '🦚', parrot: '🦜', swan: '🦢',\n  flamingo: '🦩', dove: '🕊️', rabbit2: '🐇', raccoon: '🦝', skunk: '🦨', badger: '🦡',\n  beaver: '🦫', otter: '🦦', sloth: '🦥', mouse2: '🐁', rat: '🐀', chipmunk: '🐿️',\n  hedgehog: '🦔', paw_prints: '🐾', dragon: '🐉', dragon_face: '🐲',\n\n  // Nature & Weather\n  sun: '☀️', sunny: '☀️', moon: '🌙', full_moon: '🌕', new_moon: '🌑', crescent_moon: '🌙',\n  cloud: '☁️', partly_sunny: '⛅', rain: '🌧️', umbrella: '☂️', snowflake: '❄️', snowman: '⛄',\n  zap: '⚡', lightning: '⚡', rainbow: '🌈', ocean: '🌊', earth_africa: '🌍',\n  earth_americas: '🌎', earth_asia: '🌏', globe_with_meridians: '🌐', world_map: '🗺️',\n  volcano: '🌋', mount_fuji: '🗻', camping: '🏕️', beach: '🏖️', desert: '🏜️', island: '🏝️',\n  national_park: '🏞️', sunrise: '🌅', sunset: '🌇', city_sunrise: '🌇', city_sunset: '🌆',\n  night_with_stars: '🌃', milky_way: '🌌', bouquet: '💐', cherry_blossom: '🌸',\n  white_flower: '💮', rosette: '🏵️', rose: '🌹', wilted_flower: '🥀', hibiscus: '🌺',\n  sunflower: '🌻', blossom: '🌼', tulip: '🌷', seedling: '🌱', evergreen_tree: '🌲',\n  deciduous_tree: '🌳', palm_tree: '🌴', cactus: '🌵', ear_of_rice: '🌾', herb: '🌿',\n  shamrock: '☘️', four_leaf_clover: '🍀', maple_leaf: '🍁', fallen_leaf: '🍂', leaves: '🍃',\n\n  // Symbols & Misc\n  check: '✅', white_check_mark: '✅', x: '❌', cross_mark: '❌', question: '❓',\n  exclamation: '❗', warning: '⚠️', no_entry: '⛔', prohibited: '🚫', ok: '🆗', cool: '🆒',\n  new: '🆕', free: '🆓', up: '🆙', sos: '🆘', information_source: 'ℹ️', abc: '🔤',\n  abcd: '🔡', capital_abcd: '🔠', symbols: '🔣', 1234: '🔢', hash: '#️⃣', keycap_star: '*️⃣',\n  zero: '0️⃣', one: '1️⃣', two: '2️⃣', three: '3️⃣', four: '4️⃣', five: '5️⃣', six: '6️⃣',\n  seven: '7️⃣', eight: '8️⃣', nine: '9️⃣', keycap_ten: '🔟', arrow_up: '⬆️', arrow_down: '⬇️',\n  arrow_left: '⬅️', arrow_right: '➡️', arrow_upper_left: '↖️', arrow_upper_right: '↗️',\n  arrow_lower_left: '↙️', arrow_lower_right: '↘️', left_right_arrow: '↔️', arrow_up_down: '↕️',\n  arrows_counterclockwise: '🔄', arrow_forward: '▶️', arrow_backward: '◀️', fast_forward: '⏩',\n  rewind: '⏪', play_pause: '⏯️', stop_button: '⏹️', record_button: '⏺️', eject: '⏏️',\n  repeat: '🔁', repeat_one: '🔂', shuffle: '🔀', cinema: '🎦', low_brightness: '🔅',\n  high_brightness: '🔆', signal_strength: '📶', vibration_mode: '📳', mobile_phone_off: '📴',\n  recycle: '♻️', trident: '🔱', name_badge: '📛', beginner: '🔰', o: '⭕', white_circle: '⚪',\n  black_circle: '⚫', red_circle: '🔴', blue_circle: '🔵', orange_circle: '🟠',\n  yellow_circle: '🟡', green_circle: '🟢', purple_circle: '🟣', brown_circle: '🟤',\n  black_square: '⬛', white_square: '⬜', red_square: '🟥', blue_square: '🟦',\n  orange_square: '🟧', yellow_square: '🟨', green_square: '🟩', purple_square: '🟪',\n  brown_square: '🟫', black_small_square: '▪️', white_small_square: '▫️',\n  black_medium_square: '◼️', white_medium_square: '◻️', black_medium_small_square: '◾',\n  white_medium_small_square: '◽', black_large_square: '⬛', white_large_square: '⬜',\n  diamond_shape_with_a_dot_inside: '💠', radio_button: '🔘', small_orange_diamond: '🔸',\n  small_blue_diamond: '🔹', large_orange_diamond: '🔶', large_blue_diamond: '🔷',\n  copyright: '©️', registered: '®️', tm: '™️',\n};\n\n/** Regex pattern for detecting emoji shortcodes (e.g. :smile:) */\nexport const EMOJI_SHORTCODE_REGEX = /:([a-zA-Z0-9_+-]+):/g;\n","import { CometChatTextFormatter } from './cometchat-text-formatter';\nimport { EMOJI_MAP, EMOJI_SHORTCODE_REGEX } from './cometchat-emoji-formatter.constants';\n\n// Re-export constants for backward compatibility\nexport { EMOJI_MAP, EMOJI_SHORTCODE_REGEX } from './cometchat-emoji-formatter.constants';\n\n/**\n * Formatter for emoji shortcodes in text.\n *\n * Detects emoji shortcode patterns (e.g., :smile:, :heart:) in text and converts\n * them to their corresponding Unicode emoji characters.\n *\n * @example\n * ```typescript\n * const formatter = new CometChatEmojiFormatter();\n * const formatted = formatter.format('Hello :smile: how are you :heart:');\n * // Result: 'Hello 😊 how are you ❤️'\n * ```\n */\nexport class CometChatEmojiFormatter extends CometChatTextFormatter {\n  readonly id = 'emoji-formatter';\n  override priority = 30;\n\n  private shortcodes: string[] = [];\n  private customEmojiMap: Record<string, string> = {};\n\n  /** Returns the regex pattern for detecting emoji shortcodes. */\n  getRegex(): RegExp {\n    return new RegExp(EMOJI_SHORTCODE_REGEX.source, 'g');\n  }\n\n  /**\n   * Formats text by replacing emoji shortcodes with Unicode emoji characters.\n   * Unrecognized shortcodes are left unchanged.\n   */\n  format(text: string): string {\n    if (text == null) {\n      this.originalText = '';\n      this.formattedText = '';\n      this.metadata = { shortcodes: [] };\n      return '';\n    }\n    this.originalText = text;\n    this.shortcodes = [];\n    this.formattedText = text.replace(this.getRegex(), (match, shortcode) => {\n      const lower = shortcode.toLowerCase();\n      const emoji = this.customEmojiMap[lower] || EMOJI_MAP[lower];\n      if (emoji) { this.shortcodes.push(shortcode); return emoji; }\n      return match;\n    });\n    this.metadata = { shortcodes: this.shortcodes };\n    return this.formattedText;\n  }\n\n  /** Returns detected shortcodes from the last format() call. */\n  getShortcodes(): string[] { return [...this.shortcodes]; }\n\n  /** Returns true if shortcodes were detected and converted. */\n  hasShortcodes(): boolean { return this.shortcodes.length > 0; }\n\n  /**\n   * Adds custom emoji shortcodes. Custom shortcodes take precedence over built-in ones.\n   * @param emojiMap - Record mapping shortcode names to emoji characters\n   */\n  addCustomEmoji(emojiMap: Record<string, string>): void {\n    this.customEmojiMap = { ...this.customEmojiMap, ...emojiMap };\n  }\n\n  /** Clears all custom emoji shortcodes. */\n  clearCustomEmoji(): void { this.customEmojiMap = {}; }\n\n  /**\n   * Returns the emoji for a specific shortcode (without colons).\n   * @returns The emoji character or undefined if not found\n   */\n  getEmoji(shortcode: string): string | undefined {\n    const lower = shortcode.toLowerCase();\n    return this.customEmojiMap[lower] || EMOJI_MAP[lower];\n  }\n\n  /**\n   * Returns true if the shortcode is recognized (built-in or custom).\n   */\n  isValidShortcode(shortcode: string): boolean {\n    const lower = shortcode.toLowerCase();\n    return lower in this.customEmojiMap || lower in EMOJI_MAP;\n  }\n\n  override reset(): void {\n    super.reset();\n    this.shortcodes = [];\n  }\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatTextFormatter, TextFormatterContext } from './cometchat-text-formatter';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/**\n * Result of applying the formatter pipeline.\n * Contains the formatted text and combined metadata from all formatters.\n */\nexport interface FormatterPipelineResult {\n  /** The final formatted text after all formatters have been applied */\n  text: string;\n  /** Combined metadata from all formatters */\n  metadata: Record<string, unknown>;\n  /** Array of formatter IDs that were successfully applied */\n  appliedFormatters: string[];\n  /** Array of formatter IDs that encountered errors */\n  failedFormatters: string[];\n}\n\n/**\n * Apply a pipeline of text formatters to the given text.\n *\n * This function:\n * 1. Sorts formatters by priority (lower priority number = earlier in pipeline)\n * 2. Applies each formatter's format() method in sequence\n * 3. Catches any errors from individual formatters and continues with the next one\n * 4. Returns the final formatted text along with combined metadata\n *\n * Formatters are applied in order of their `priority` property. Each formatter\n * receives the output of the previous formatter as its input. If a formatter\n * throws an error, the error is logged and the original text (from the previous\n * formatter) is passed to the next formatter.\n *\n * @param formatters - Array of CometChatTextFormatter instances to apply\n * @param text - The text to format\n * @param message - The message containing the text (optional, for context)\n * @param context - Additional context for formatters (optional)\n * @returns FormatterPipelineResult containing formatted text and metadata\n *\n * @example\n * ```typescript\n * const formatters = [\n *   new CometChatUrlFormatter(),      // priority: 10\n *   new CometChatMentionsFormatter(), // priority: 20\n *   new CometChatEmojiFormatter(),    // priority: 30\n * ];\n *\n * const result = applyFormatters(formatters, 'Hello @john :smile: https://example.com');\n * // result.text contains formatted HTML with links, mentions, and emoji\n * // result.metadata contains { urls: [...], mentions: [...], shortcodes: [...] }\n * ```\n *\n * @see Requirements 5.2, 5.4, 5.6\n */\nexport function applyFormatters(\n  formatters: CometChatTextFormatter[],\n  text: string,\n  message?: CometChat.BaseMessage,\n  context?: TextFormatterContext\n): FormatterPipelineResult {\n  // Handle empty or null inputs\n  if (!formatters || formatters.length === 0) {\n    return {\n      text,\n      metadata: {},\n      appliedFormatters: [],\n      failedFormatters: [],\n    };\n  }\n\n  if (!text) {\n    return {\n      text: text ?? '',\n      metadata: {},\n      appliedFormatters: [],\n      failedFormatters: [],\n    };\n  }\n\n  // Sort formatters by priority (lower = earlier in pipeline)\n  // Create a copy to avoid mutating the original array\n  const sortedFormatters = [...formatters].sort((a, b) => a.priority - b.priority);\n\n  let currentText = text;\n  const combinedMetadata: Record<string, unknown> = {};\n  const appliedFormatters: string[] = [];\n  const failedFormatters: string[] = [];\n\n  // Apply each formatter in sequence\n  for (const formatter of sortedFormatters) {\n    try {\n      // Reset formatter state before applying\n      formatter.reset();\n\n      // Check if formatter should process this text\n      if (!formatter.shouldFormat(currentText, message)) {\n        continue;\n      }\n\n      // Apply the formatter\n      currentText = formatter.format(currentText);\n\n      // Collect metadata from this formatter\n      const formatterMetadata = formatter.getMetadata();\n      Object.assign(combinedMetadata, formatterMetadata);\n\n      // Track successful application\n      appliedFormatters.push(formatter.id);\n    } catch (error) {\n      // Log the error but continue with the next formatter\n      // The original text (from previous formatter) is preserved\n      CometChatLogger.warn('FormatterPipeline', `Formatter \"${formatter.id}\" encountered an error:`, error instanceof Error ? error.message : error);\n\n      // Track failed formatter\n      failedFormatters.push(formatter.id);\n\n      // Continue with the current text (unchanged by this formatter)\n    }\n  }\n\n  return {\n    text: currentText,\n    metadata: combinedMetadata,\n    appliedFormatters,\n    failedFormatters,\n  };\n}\n\n/**\n * Apply a pipeline of text formatters and return only the formatted text.\n *\n * This is a convenience function that wraps `applyFormatters` and returns\n * only the formatted text string, discarding metadata and tracking info.\n *\n * @param formatters - Array of CometChatTextFormatter instances to apply\n * @param text - The text to format\n * @param message - The message containing the text (optional)\n * @param context - Additional context for formatters (optional)\n * @returns The formatted text string\n *\n * @see Requirements 5.2, 5.4, 5.6\n */\nexport function formatText(\n  formatters: CometChatTextFormatter[],\n  text: string,\n  message?: CometChat.BaseMessage,\n  context?: TextFormatterContext\n): string {\n  return applyFormatters(formatters, text, message, context).text;\n}\n","/**\n * Text Formatters Module\n *\n * This module provides text formatting utilities for the CometChat UIKit.\n * Formatters detect patterns in text and apply transformations such as\n * highlighting mentions, converting URLs to links, emoji shortcodes, and more.\n *\n * @module formatters\n */\n\nexport { CometChatTextFormatter } from './cometchat-text-formatter';\nexport type { TextFormatterContext } from './cometchat-text-formatter';\nexport { CometChatMentionsFormatter } from './cometchat-mentions-formatter';\nexport { CometChatUrlFormatter } from './cometchat-url-formatter';\nexport { CometChatEmojiFormatter } from './cometchat-emoji-formatter';\nexport { CometChatMarkdownFormatter } from './cometchat-markdown-formatter';\nexport type { MentionData } from './cometchat-mentions-formatter';\nexport { applyFormatters, formatText } from './formatter-pipeline';\nexport type { FormatterPipelineResult } from './formatter-pipeline';\n","/**\n * Public API for CometChatMessageComposer component\n *\n * This module exports the CometChatMessageComposer component and all related\n * types, interfaces, services, and enums needed to use the message composer.\n *\n * @module components/cometchat-message-composer\n * @see Requirements 33.2\n */\n\n// Component\nexport { CometChatMessageComposerComponent } from './cometchat-message-composer.component';\n\n// Constants\nexport { MENTIONS_LIMIT } from './cometchat-message-composer.component';\n\n// Interfaces\nexport type { AttachmentFile } from './cometchat-message-composer.component';\n\n// Service (re-export from services for convenience)\nexport { MessageComposerService } from '../../services/message-composer.service';\nexport type { ErrorCallback } from '../../services/message-composer.service';\n\n// Rich Text Editor Service (re-export for rich text editing)\nexport { RichTextEditorService } from '../../services/rich-text-editor.service';\nexport type {\n  RichTextFormatState,\n  RichTextEditorConfig,\n  RichTextMetadata,\n} from '../../services/rich-text-editor.interfaces';\n\n// Enums (re-export from Enums for convenience)\nexport { EnterKeyBehavior } from '../../Enums/Enums';\n\n// Text Formatters (re-export from formatters for convenience)\nexport {\n  CometChatTextFormatter,\n  CometChatMentionsFormatter,\n  CometChatUrlFormatter,\n} from '../../formatters';\nexport type { MentionData } from '../../formatters';\n","/**\n * Shared Call Error Handler\n *\n * Extracted from cometchat-call-buttons, cometchat-incoming-call,\n * cometchat-outgoing-call, and cometchat-ongoing-call to consolidate\n * duplicate error handling logic (~21-23 shared lines per component).\n *\n * All four components follow the same pattern:\n * 1. Normalize the error to CometChatException\n * 2. Emit via EventEmitter\n * 3. Call onError callback if provided\n * 4. Log the error\n */\n\nimport { EventEmitter } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from './CometChatLogger';\n\n/**\n * Normalizes an unknown error into a CometChat.CometChatException,\n * emits it via the provided EventEmitter, calls the optional onError callback,\n * and logs the error.\n *\n * @param err - The unknown error to handle\n * @param errorCode - Component-specific error code (e.g. 'CALL_BUTTONS_ERROR')\n * @param logPrefix - Prefix for console error messages (e.g. 'CometChatCallButtons')\n * @param errorEmitter - The component's error EventEmitter\n * @param onError - Optional error callback from component input\n */\nexport function handleCallError(\n  err: unknown,\n  errorCode: string,\n  logPrefix: string,\n  errorEmitter: EventEmitter<CometChat.CometChatException>,\n  onError?: ((error: CometChat.CometChatException) => void) | null\n): void {\n  let exception: CometChat.CometChatException;\n\n  if (err instanceof CometChat.CometChatException) {\n    exception = err;\n  } else if (err instanceof Error) {\n    exception = new CometChat.CometChatException({\n      code: errorCode,\n      message: err.message,\n      details: err.stack || '',\n    });\n  } else {\n    exception = new CometChat.CometChatException({\n      code: errorCode,\n      message: String(err),\n      details: '',\n    });\n  }\n\n  errorEmitter.emit(exception);\n\n  if (onError) {\n    onError(exception);\n  }\n\n  CometChatLogger.error(logPrefix, 'Error:', err);\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  OnInit,\n  OnDestroy,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  inject,\n  computed,\n  signal,\n  ViewChild,\n  ElementRef,\n  booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatButtonComponent } from '../base-elements/cometchat-button/cometchat-button.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { OutgoingCallService } from '../../services/outgoing-call.service';\nimport { CallAnnouncerService } from '../../services/call-announcer.service';\nimport { DialogFocusManager } from '../../services/dialog-focus-manager.service';\nimport { GlobalConfig, COMETCHAT_GLOBAL_CONFIG } from '../../services/global-config.service';\nimport { handleCallError } from '../../utils/call-error-handler';\n\n/**\n * Template context passed to all template overrides.\n */\nexport interface OutgoingCallTemplateContext {\n  call: CometChat.Call;\n  receiverName: string;\n  receiverAvatar: string;\n}\n\n/**\n * CometChatOutgoingCallComponent displays an outgoing call overlay\n * when a user initiates a voice or video call.\n *\n * It renders a card with the receiver's name, a \"Calling...\" subtitle,\n * the receiver's avatar, and a cancel button. The component is a thin UI\n * layer that reads state from `OutgoingCallService`, with component inputs\n * taking priority over service state.\n *\n * @example\n * ```html\n * <cometchat-outgoing-call\n *   [call]=\"outgoingCall\"\n *   (callCanceled)=\"onCallCanceled()\">\n * </cometchat-outgoing-call>\n * ```\n *\n\n */\n@Component({\n  selector: 'cometchat-outgoing-call',\n  standalone: true,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatButtonComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './cometchat-outgoing-call.component.html',\n  styleUrls: ['./cometchat-outgoing-call.component.css'],\n})\nexport class CometChatOutgoingCallComponent implements OnInit, OnDestroy, AfterViewInit {\n  // ==================== Service Injection ====================\n\n  private outgoingCallService = inject(OutgoingCallService);\n  private callAnnouncer = inject(CallAnnouncerService);\n  private dialogFocusManager = inject(DialogFocusManager);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, {\n    optional: true,\n  });\n\n  // ==================== ExplicitlySet Flags & Backing Fields (GlobalConfig Priority System) ====================\n  private disableSoundForCallsExplicitlySet = signal(false);\n  private customSoundForCallsExplicitlySet = signal(false);\n\n  private _disableSoundForCalls = signal(false);\n  private _customSoundForCalls = signal('');\n\n  // ==================== View Children ====================\n\n  /** Reference to the dialog container for focus management */\n  @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n\n  /** Reference to the cancel button for initial focus */\n  @ViewChild('cancelButton') cancelButton!: ElementRef<HTMLElement>;\n\n  // ==================== Inputs ====================\n\n  /** The outgoing call object. Overrides service state when provided. */\n  @Input() call: CometChat.Call | null = null;\n\n  /** Disables the outgoing call ringtone when true. */\n  @Input({ transform: booleanAttribute })\n  set disableSoundForCalls(value: boolean) {\n    this._disableSoundForCalls.set(value);\n    this.disableSoundForCallsExplicitlySet.set(true);\n  }\n  get disableSoundForCalls(): boolean {\n    return this._disableSoundForCalls();\n  }\n\n  /** Custom sound URL for the outgoing call ringtone. */\n  @Input()\n  set customSoundForCalls(value: string) {\n    this._customSoundForCalls.set(value);\n    this.customSoundForCallsExplicitlySet.set(true);\n  }\n  get customSoundForCalls(): string {\n    return this._customSoundForCalls();\n  }\n\n  /** Error callback invoked for any error during sound or cancel. */\n  @Input() onError: ((error: CometChat.CometChatException) => void) | null = null;\n\n  // ==================== Template Override Inputs ====================\n\n  /** Replaces the default receiver name title. */\n  @Input() titleView: TemplateRef<any> | null = null;\n\n  /** Replaces the default \"Calling...\" subtitle. */\n  @Input() subtitleView: TemplateRef<any> | null = null;\n\n  /** Replaces the default CometChatAvatar. */\n  @Input() avatarView: TemplateRef<any> | null = null;\n\n  /** Replaces the default cancel button. */\n  @Input() cancelButtonView: TemplateRef<any> | null = null;\n\n  // ==================== Outputs ====================\n\n  /** Emitted when the user cancels the outgoing call. */\n  @Output() callCanceled = new EventEmitter<void>();\n\n  /** Emitted on any error during sound playback or cancellation. */\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  // ==================== Public Properties ====================\n\n  /** Icon URL for the end-call button. */\n  readonly endCallIconUrl = 'assets/call_end.svg';\n\n  // ==================== Effective Values (GlobalConfig Priority System) ====================\n\n  /**\n   * Resolved disableSoundForCalls value using 3-tier priority:\n   * 1. Explicitly set @Input value\n   * 2. GlobalConfig value (if defined)\n   * 3. Component default (false)\n   */\n  effectiveDisableSoundForCalls = computed(() => {\n    if (this.disableSoundForCallsExplicitlySet()) return this._disableSoundForCalls();\n    if (this.globalConfig?.disableSoundForCalls !== undefined)\n      return this.globalConfig.disableSoundForCalls;\n    return false;\n  });\n\n  /**\n   * Resolved customSoundForCalls value using 3-tier priority:\n   * 1. Explicitly set @Input value\n   * 2. GlobalConfig value (if defined)\n   * 3. Component default ('')\n   */\n  effectiveCustomSoundForCalls = computed(() => {\n    if (this.customSoundForCallsExplicitlySet()) return this._customSoundForCalls();\n    if (this.globalConfig?.customSoundForCalls !== undefined)\n      return this.globalConfig.customSoundForCalls;\n    return '';\n  });\n\n  // ==================== Computed Getters ====================\n\n  /**\n   * Returns the effective call object.\n   * Component input takes priority over service state.\n   *\n   * @see Requirement 5.4 - Input priority over service state\n   */\n  get effectiveCall(): CometChat.Call | null {\n    return this.call ?? this.outgoingCallService.activeCall();\n  }\n\n  /**\n   * Returns the receiver's display name from the call object.\n   * Handles both user and group receiver types.\n   *\n   * @see Requirement 1.2 - User receiver name\n   * @see Requirement 1.3 - Group receiver name\n   */\n  get receiverName(): string {\n    const call = this.effectiveCall;\n    if (!call) return '';\n    const receiver = call.getReceiver();\n    return (receiver as any)?.getName?.() || '';\n  }\n\n  /**\n   * Returns the receiver's avatar/icon URL from the call object.\n   * Uses `getAvatar()` for user receivers and `getIcon()` for group receivers.\n   *\n   * @see Requirement 1.2 - User avatar\n   * @see Requirement 1.3 - Group icon\n   */\n  get receiverAvatar(): string {\n    const call = this.effectiveCall;\n    if (!call) return '';\n    const receiver = call.getReceiver();\n    const receiverType = call.getReceiverType();\n\n    if (receiverType === 'group') {\n      return (receiver as CometChat.Group)?.getIcon?.() || '';\n    }\n    return (receiver as CometChat.User)?.getAvatar?.() || '';\n  }\n\n  /**\n   * Returns the template context for custom template overrides.\n   */\n  get templateContext(): { $implicit: OutgoingCallTemplateContext } {\n    const call = this.effectiveCall;\n    return {\n      $implicit: {\n        call: call!,\n        receiverName: this.receiverName,\n        receiverAvatar: this.receiverAvatar,\n      },\n    };\n  }\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Plays the outgoing call ringtone when a call is set (if sound is not disabled).\n   * Announces the outgoing call for screen readers.\n   *\n   * @see Requirement 2.1 - Play ringtone when call is set\n   * @see Requirement 2.3 - Skip when sound is disabled\n   */\n  ngOnInit(): void {\n    const call = this.effectiveCall;\n    if (call && !this.effectiveDisableSoundForCalls()) {\n      try {\n        this.outgoingCallService.setDisableSoundForCalls(this.effectiveDisableSoundForCalls());\n        this.outgoingCallService.setCustomSoundForCalls(this.effectiveCustomSoundForCalls());\n        this.outgoingCallService.playOutgoingSound();\n      } catch (err: unknown) {\n        this.handleError(err);\n      }\n    }\n\n    // Announce outgoing call for screen readers\n    if (call) {\n      this.callAnnouncer.announceOutgoingCall(this.receiverName);\n    }\n  }\n\n  /**\n   * Sets up focus trap and initial focus after view is initialized.\n   */\n  ngAfterViewInit(): void {\n    if (this.effectiveCall && this.dialogContainer?.nativeElement) {\n      // Set up dialog focus management with Escape to cancel\n      this.dialogFocusManager.openDialog({\n        container: this.dialogContainer.nativeElement,\n        initialFocus: this.cancelButton?.nativeElement,\n        // Name comes from the template aria-label (robust for custom title views);\n        // omit labelledById so it isn't re-applied and override the aria-label.\n        closeOnEscape: true,\n        onEscape: () => this.onCancelClick(),\n      });\n    }\n  }\n\n  /**\n   * Pauses the ringtone and cleans up focus trap on component destruction.\n   *\n   * @see Requirement 2.4 - Pause ringtone on destroy\n   */\n  ngOnDestroy(): void {\n    try {\n      this.outgoingCallService.stopOutgoingSound();\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n\n    // Close dialog focus management\n    if (this.dialogContainer?.nativeElement) {\n      this.dialogFocusManager.closeDialog(this.dialogContainer.nativeElement);\n    }\n  }\n\n  // ==================== Actions ====================\n\n  /**\n   * Handles the cancel button click.\n   * Pauses the ringtone and emits `callCanceled`.\n   *\n   * @see Requirement 3.1 - Pause sound and emit callCanceled\n   * @see Requirement 3.3 - Error handling during cancel\n   */\n  onCancelClick(): void {\n    try {\n      this.outgoingCallService.stopOutgoingSound();\n      this.callCanceled.emit();\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Handles errors by emitting the `error` output and invoking the `onError` callback.\n   *\n   * @param err - The error to handle\n   * @see Requirement 8.1, 8.2, 8.3 - Error handling\n   */\n  private handleError(err: unknown): void {\n    handleCallError(err, 'OUTGOING_CALL_ERROR', 'CometChatOutgoingCall', this.error, this.onError);\n  }\n\n  /** No-op retry handler — outgoing calls are transient and cannot be retried. */\n  handleRetryClick(): void {}\n}\n","<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'OutgoingCall'\">\n@if (effectiveCall) {\n  <div\n    #dialogContainer\n    class=\"cometchat-outgoing-call\"\n    role=\"dialog\"\n    aria-modal=\"true\"\n    aria-live=\"assertive\"\n    [attr.aria-label]=\"receiverName + ' ' + ('calls_outgoing' | translate)\">\n\n    <!-- Title + Subtitle -->\n    <div class=\"cometchat-outgoing-call__title-container\">\n      @if (titleView) {\n        <ng-container *ngTemplateOutlet=\"titleView; context: templateContext\"></ng-container>\n      } @else {\n        <div id=\"outgoing-call-title\" class=\"cometchat-outgoing-call__title\">{{ receiverName }}</div>\n      }\n\n      @if (subtitleView) {\n        <ng-container *ngTemplateOutlet=\"subtitleView; context: templateContext\"></ng-container>\n      } @else {\n        <div class=\"cometchat-outgoing-call__subtitle\">{{ 'calls_outgoing' | translate }}</div>\n      }\n    </div>\n\n    <!-- Avatar -->\n    @if (avatarView) {\n      <ng-container *ngTemplateOutlet=\"avatarView; context: templateContext\"></ng-container>\n    } @else {\n      <div class=\"cometchat-outgoing-call__avatar\">\n        <cometchat-avatar [name]=\"receiverName\" [image]=\"receiverAvatar\"></cometchat-avatar>\n      </div>\n    }\n\n    <!-- Cancel Button -->\n    @if (cancelButtonView) {\n      <ng-container *ngTemplateOutlet=\"cancelButtonView; context: templateContext\"></ng-container>\n    } @else {\n      <div #cancelButton class=\"cometchat-outgoing-call__button\">\n        <cometchat-button\n          [iconURL]=\"endCallIconUrl\"\n          [ariaLabel]=\"'accessibility_cancel_call' | translate\"\n          (buttonClick)=\"onCancelClick()\">\n        </cometchat-button>\n      </div>\n    }\n  </div>\n}\n</cometchat-error-boundary>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ViewChild,\n  ElementRef,\n  OnInit,\n  AfterViewInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  inject,\n  booleanAttribute,\n  DestroyRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { OngoingCallService } from '../../services/ongoing-call.service';\nimport { CometChatCallEvents } from '../../events/CometChatCallEvents';\nimport { CallWorkflow } from '../../Enums/Enums';\nimport { CallAnnouncerService } from '../../services/call-announcer.service';\nimport { handleCallError } from '../../utils/call-error-handler';\nimport { CometChatUIKitCalls } from '../../CometChatCalls';\n\n/**\n * CometChatOngoingCallComponent renders a full-screen container into which\n * the CometChat Calls SDK renders its call UI.\n *\n * This is a thin UI layer that delegates all business logic to `OngoingCallService`.\n * When a non-empty `sessionID` is provided, the component renders a full-screen\n * overlay div and invokes the service to start the call session.\n *\n * @example\n * ```html\n * <cometchat-ongoing-call\n *   [sessionID]=\"activeSessionId\"\n *   [callWorkflow]=\"workflow\"\n *   (callEnded)=\"onCallEnded()\"\n *   (error)=\"onError($event)\">\n * </cometchat-ongoing-call>\n * ```\n *\n\n */\n@Component({\n  selector: 'cometchat-ongoing-call',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './cometchat-ongoing-call.component.html',\n  styleUrls: ['./cometchat-ongoing-call.component.css'],\n})\nexport class CometChatOngoingCallComponent implements OnInit, AfterViewInit, OnChanges, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  // ==================== Service Injection ====================\n\n  private ongoingCallService = inject(OngoingCallService);\n  private callAnnouncer = inject(CallAnnouncerService);\n\n  // ==================== Inputs ====================\n\n  /** Session ID for the call. Required for the call to render. */\n  @Input() sessionID = '';\n\n  /** Custom call settings builder. Overrides the default builder when provided. */\n  @Input() callSettingsBuilder: typeof CometChatUIKitCalls.CallSettingsBuilder = null;\n\n  /** Call workflow type: defaultCalling or directCalling. */\n  @Input() callWorkflow: CallWorkflow = CallWorkflow.defaultCalling;\n\n  /** Whether this is an audio-only call. Passed to OngoingCallService for CallSettings. */\n  @Input({ transform: booleanAttribute }) isAudioOnly = false;\n\n  /** Error callback invoked for any error during call operations. */\n  @Input() onError: ((error: CometChat.CometChatException) => void) | null = null;\n\n  /** Custom template to replace the entire call screen container. */\n  @Input() callScreenView: TemplateRef<any> | null = null;\n\n  // ==================== Outputs ====================\n\n  /** Emitted when the call ends (via listener onCallEnded or onCallEndButtonPressed). */\n  @Output() callEnded = new EventEmitter<void>();\n\n  /** Emitted on any error during call operations. */\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  // ==================== ViewChild ====================\n\n  /** Reference to the call screen container div for SDK rendering. */\n  @ViewChild('callScreenFrame', { static: false }) callScreenFrame!: ElementRef<HTMLDivElement>;\n\n  // ==================== Computed Getters ====================\n\n  /**\n   * Returns the template context for the `callScreenView` template override.\n   * Provides the session ID and call workflow to custom templates.\n   */\n  get templateContext(): { $implicit: { sessionID: string; callWorkflow: CallWorkflow } } {\n    return {\n      $implicit: {\n        sessionID: this.sessionID,\n        callWorkflow: this.callWorkflow,\n      },\n    };\n  }\n\n  // ==================== Private State ====================\n\n  /** Guard to prevent double-starting the call session. */\n  private readonly destroyRef = inject(DestroyRef);\n  private callSessionStarted = false;\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Syncs component inputs to the service and subscribes to call-ended events.\n   * Input values take priority over service state.\n   *\n   * @see Requirement 5.2 - Input values take priority over service state\n   */\n  ngOnInit(): void {\n    this.syncInputsToService();\n\n    CometChatCallEvents.ccCallEnded.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      // Announce call ended for screen readers\n      this.callAnnouncer.announceCallEnded();\n      this.callEnded.emit();\n    });\n  }\n\n  /**\n   * Once the view is initialized and the #callScreenFrame is available,\n   * start the call if we already have a sessionID.\n   *\n   * This handles the case where the component is created by an @if block\n   * with sessionID already set — ngOnChanges fires before the view renders,\n   * so the ViewChild isn't available there on first creation.\n   *\n   * @see Requirement 5.3 - Start call when sessionID is set\n   */\n  ngAfterViewInit(): void {\n    if (this.sessionID && this.callScreenFrame?.nativeElement && !this.callSessionStarted) {\n      this.callSessionStarted = true;\n      this.startCallSession();\n    }\n  }\n\n  /**\n   * Detects sessionID changes and starts the call when sessionID becomes non-empty.\n   * Uses a guard to prevent double-starting when both ngOnChanges and ngAfterViewInit fire.\n   *\n   * @see Requirement 5.3 - Start call when sessionID changes to non-empty\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['sessionID']) {\n      this.syncInputsToService();\n\n      // Reset the guard when sessionID changes to allow a new session to start\n      if (!changes['sessionID'].firstChange) {\n        this.callSessionStarted = false;\n      }\n\n      this.pendingTimers.push(setTimeout(() => {\n        if (this.callScreenFrame?.nativeElement && this.sessionID && !this.callSessionStarted) {\n          this.callSessionStarted = true;\n          this.startCallSession();\n        }\n      }));\n    }\n  }\n\n  /**\n   * Cleans up the call session and unsubscribes from events on destroy.\n   *\n   * @see Requirement 6.1 - Call endSession() on destroy\n   * @see Requirement 6.2 - Reset service state on destroy\n   */\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.callSessionStarted = false;\n    this.ongoingCallService.endSession();\n  }\n\n  // ==================== Private: Input Sync ====================\n\n  /**\n   * Syncs all component inputs to the OngoingCallService.\n   * Called on init and when sessionID changes.\n   */\n  private syncInputsToService(): void {\n    this.ongoingCallService.setSessionID(this.sessionID);\n    this.ongoingCallService.setCallWorkflow(this.callWorkflow);\n    this.ongoingCallService.setCallSettingsBuilder(this.callSettingsBuilder);\n    this.ongoingCallService.setIsAudioOnly(this.isAudioOnly);\n  }\n\n  // ==================== Private: Call Session ====================\n\n  /**\n   * Starts the call session by delegating to the OngoingCallService.\n   * Requires the callScreenFrame ViewChild to be available.\n   */\n  private startCallSession(): void {\n    this.ongoingCallService\n      .startCall(this.callScreenFrame.nativeElement, (err: CometChat.CometChatException) =>\n        this.handleError(err)\n      )\n      .catch((err: unknown) => this.handleError(err));\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Handles keyboard events on the call container.\n   * Prevents Escape from accidentally ending the call.\n   *\n   * @param event - The keyboard event\n   */\n  onKeyDown(event: KeyboardEvent): void {\n    // Prevent Escape from ending call accidentally - let the SDK handle it\n    if (event.key === 'Escape') {\n      event.stopPropagation();\n    }\n  }\n\n  /**\n   * Handles errors by emitting the `error` output and invoking the `onError` callback.\n   *\n   * @param err - The error to handle\n   * @see Requirement 7.2, 7.3 - Error handling\n   */\n  private handleError(err: unknown): void {\n    handleCallError(err, 'ONGOING_CALL_ERROR', 'CometChatOngoingCall', this.error, this.onError);\n  }\n}\n","@if (sessionID) {\n  @if (callScreenView) {\n    <ng-container *ngTemplateOutlet=\"callScreenView; context: templateContext\"></ng-container>\n  } @else {\n    <div\n      class=\"cometchat-ongoing-call\"\n      #callScreenFrame\n      role=\"application\"\n      tabindex=\"0\"\n      aria-live=\"polite\"\n      [attr.aria-label]=\"'accessibility_ongoing_call' | translate\"\n      (keydown)=\"onKeyDown($event)\">\n    </div>\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  inject,\n  computed,\n  signal,\n  booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatButtonComponent } from '../base-elements/cometchat-button/cometchat-button.component';\nimport { CometChatOutgoingCallComponent } from '../cometchat-outgoing-call/cometchat-outgoing-call.component';\nimport { CometChatOngoingCallComponent } from '../cometchat-ongoing-call/cometchat-ongoing-call.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CallButtonsService } from '../../services/call-buttons.service';\nimport { CallAnnouncerService } from '../../services/call-announcer.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { handleCallError } from '../../utils/call-error-handler';\nimport { CallWorkflow } from '../../Enums/Enums';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatUIKitCalls } from '../../CometChatCalls';\nimport { CometChatUIKit } from '../../cometchat-uikit';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\n\n/**\n * CometChatCallButtonsComponent provides voice and video call initiation\n * buttons for both user-to-user and group calls.\n *\n * It is a thin UI layer that delegates call state management, call initiation,\n * call listener registration, and event subscriptions to `CallButtonsService`.\n * For user calls, it displays the existing `cometchat-outgoing-call` overlay.\n * For group calls, it emits `ccShowOngoingCall` via `CometChatUIEvents`.\n *\n * @example\n * ```html\n * <cometchat-call-buttons\n *   [user]=\"activeUser\"\n *   (error)=\"onError($event)\">\n * </cometchat-call-buttons>\n * ```\n */\n@Component({\n  selector: 'cometchat-call-buttons',\n  standalone: true,\n  imports: [CommonModule, CometChatButtonComponent, CometChatOutgoingCallComponent, CometChatOngoingCallComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './cometchat-call-buttons.component.html',\n  styleUrls: ['./cometchat-call-buttons.component.css'],\n})\nexport class CometChatCallButtonsComponent implements OnInit, OnChanges, OnDestroy {\n  private callButtonsService = inject(CallButtonsService);\n  private callAnnouncer = inject(CallAnnouncerService);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private hideVoiceCallButtonExplicitlySet = signal(false);\n  private hideVideoCallButtonExplicitlySet = signal(false);\n  private outgoingCallDisableSoundForCallsExplicitlySet = signal(false);\n  private outgoingCallCustomSoundForCallsExplicitlySet = signal(false);\n\n  private _hideVoiceCallButton = signal(false);\n  private _hideVideoCallButton = signal(false);\n  private _outgoingCallDisableSoundForCalls = signal(false);\n  private _outgoingCallCustomSoundForCalls = signal('');\n\n  @Input() user: CometChat.User | null = null;\n  @Input() group: CometChat.Group | null = null;\n\n  @Input({ transform: booleanAttribute })\n  set hideVoiceCallButton(value: boolean) {\n    this._hideVoiceCallButton.set(value);\n    this.hideVoiceCallButtonExplicitlySet.set(true);\n  }\n  get hideVoiceCallButton(): boolean {\n    return this._hideVoiceCallButton();\n  }\n\n  /** Hides the video call button when true. */\n  @Input({ transform: booleanAttribute })\n  set hideVideoCallButton(value: boolean) {\n    this._hideVideoCallButton.set(value);\n    this.hideVideoCallButtonExplicitlySet.set(true);\n  }\n  get hideVideoCallButton(): boolean {\n    return this._hideVideoCallButton();\n  }\n\n  @Input() onVoiceCallClick: (() => void) | null = null;\n  @Input() onVideoCallClick: (() => void) | null = null;\n  @Input() onError: ((error: CometChat.CometChatException) => void) | null = null;\n\n  @Input({ transform: booleanAttribute })\n  set outgoingCallDisableSoundForCalls(value: boolean) { this._outgoingCallDisableSoundForCalls.set(value); this.outgoingCallDisableSoundForCallsExplicitlySet.set(true); }\n  get outgoingCallDisableSoundForCalls(): boolean { return this._outgoingCallDisableSoundForCalls(); }\n\n  @Input()\n  set outgoingCallCustomSoundForCalls(value: string) { this._outgoingCallCustomSoundForCalls.set(value); this.outgoingCallCustomSoundForCallsExplicitlySet.set(true); }\n  get outgoingCallCustomSoundForCalls(): string { return this._outgoingCallCustomSoundForCalls(); }\n\n  @Input() voiceCallButtonView: TemplateRef<any> | null = null;\n  @Input() videoCallButtonView: TemplateRef<any> | null = null;\n  @Input() callSettingsBuilder!: typeof CometChatUIKitCalls.CallSettingsBuilder;\n  @Input({ transform: booleanAttribute }) hideOverlays = false;\n\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  readonly voiceCallIconUrl = 'assets/call.svg';\n  readonly videoCallIconUrl = 'assets/video_call_button.svg';\n\n  effectiveHideVoiceCallButton = computed(() => {\n    if (this.hideVoiceCallButtonExplicitlySet()) return this._hideVoiceCallButton();\n    return !CometChatUIKit.isCallingEnabled();\n  });\n\n  effectiveHideVideoCallButton = computed(() => {\n    if (this.hideVideoCallButtonExplicitlySet()) return this._hideVideoCallButton();\n    return !CometChatUIKit.isCallingEnabled();\n  });\n\n  effectiveOutgoingCallDisableSoundForCalls = computed(() => {\n    if (this.outgoingCallDisableSoundForCallsExplicitlySet()) return this._outgoingCallDisableSoundForCalls();\n    if (this.globalConfig?.disableSoundForCalls !== undefined) return this.globalConfig.disableSoundForCalls;\n    return false;\n  });\n\n  effectiveOutgoingCallCustomSoundForCalls = computed(() => {\n    if (this.outgoingCallCustomSoundForCallsExplicitlySet()) return this._outgoingCallCustomSoundForCalls();\n    if (this.globalConfig?.customSoundForCalls !== undefined) return this.globalConfig.customSoundForCalls;\n    return '';\n  });\n\n  get hasTarget(): boolean { return !!this.user || !!this.group; }\n  readonly isDisabled = computed(() => this.callButtonsService.buttonsDisabled());\n  readonly showOutgoingCall = computed(() => this.callButtonsService.showOutgoingCallScreen() && !!this.callButtonsService.activeCall());\n  readonly activeCallObject = computed(() => this.callButtonsService.activeCall());\n  readonly showOngoingCall = computed(() => this.callButtonsService.showOngoingCall() && !!this.callButtonsService.sessionId());\n  readonly ongoingCallSessionId = computed(() => this.callButtonsService.sessionId());\n  readonly ongoingCallWorkflow = computed(() => this.callButtonsService.isDirectCalling() ? CallWorkflow.directCalling : CallWorkflow.defaultCalling);\n\n  /**\n   * Resolved callSettingsBuilder using 3-tier priority:\n   * 1. Explicitly set @Input value (not undefined)\n   * 2. GlobalConfig.callSettingsBuilder (if defined)\n   * 3. null (OngoingCallService creates default internally)\n   */\n  get effectiveCallSettingsBuilder(): any {\n    if (this.callSettingsBuilder !== undefined) return this.callSettingsBuilder;\n    if (this.globalConfig?.callSettingsBuilder !== undefined) return this.globalConfig.callSettingsBuilder;\n    return null;\n  }\n\n  /**\n   * Whether the ongoing call is audio-only.\n   * For user calls: determined from the active call object's type.\n   * For group calls: determined from the isGroupAudioCall signal.\n   * Matches the React `getCallBuilder()` pattern for determining audioOnlyCall.\n   */\n  readonly ongoingCallIsAudioOnly = computed(() => {\n    if (this.callButtonsService.activeUser()) {\n      return this.callButtonsService.activeCall()?.getType() === CometChatUIKitConstants.MessageTypes.audio;\n    }\n    return this.callButtonsService.isGroupAudioCall();\n  });\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Initializes the service and syncs user/group inputs.\n   *\n   * @see Requirement 9.4\n   */\n  ngOnInit(): void {\n    this.callButtonsService.initialize();\n\n    if (this.user) {\n      this.callButtonsService.setActiveUser(this.user);\n    }\n    if (this.group) {\n      this.callButtonsService.setActiveGroup(this.group);\n    }\n  }\n\n  /**\n   * Syncs user/group input changes to the service.\n   *\n   * @see Requirement 6.3\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['user']) {\n      this.callButtonsService.setActiveUser(this.user);\n    }\n    if (changes['group']) {\n      this.callButtonsService.setActiveGroup(this.group);\n    }\n  }\n\n  /**\n   * Cleans up component-specific resources.\n   * Note: Service cleanup is handled by Angular's DI when the service is destroyed.\n   */\n  ngOnDestroy(): void {\n    // Service is a singleton - don't call its ngOnDestroy here\n    // as other components may still be using it\n  }\n\n  handleRetryClick(): void {\n    this.ngOnInit();\n  }\n\n  // ==================== Actions ====================\n\n  /**\n   * Handles voice call button click.\n   * If a custom handler is provided, invokes it.\n   * Otherwise, delegates to the service's initiateAudioCall().\n   *\n   * @see Requirement 7.1, 7.3\n   */\n  async onVoiceCallButtonClick(): Promise<void> {\n    if (this.isDisabled() || !CometChatUIKit.isCallingEnabled()) return;\n\n    try {\n      if (this.onVoiceCallClick) {\n        this.onVoiceCallClick();\n      } else {\n        // Announce call initiation for screen readers\n        this.callAnnouncer.announceCallInitiation('audio');\n        await this.callButtonsService.initiateAudioCall();\n      }\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  /**\n   * Handles video call button click.\n   * If a custom handler is provided, invokes it.\n   * Otherwise, delegates to the service's initiateVideoCall().\n   *\n   * @see Requirement 7.2, 7.3\n   */\n  async onVideoCallButtonClick(): Promise<void> {\n    if (this.isDisabled() || !CometChatUIKit.isCallingEnabled()) return;\n\n    try {\n      if (this.onVideoCallClick) {\n        this.onVideoCallClick();\n      } else {\n        // Announce call initiation for screen readers\n        this.callAnnouncer.announceCallInitiation('video');\n        await this.callButtonsService.initiateVideoCall();\n      }\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  /**\n   * Handles outgoing call cancellation from the outgoing call overlay.\n   *\n   * @see Requirement 5.2, 11.3\n   */\n  async onOutgoingCallCanceled(): Promise<void> {\n    try {\n      await this.callButtonsService.cancelOutgoingCall();\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Handles errors by emitting the `error` output and invoking the `onError` callback.\n   *\n   * @param err - The error to handle\n   * @see Requirement 11.1, 11.2, 11.3, 11.4\n   */\n  private handleError(err: unknown): void {\n    handleCallError(err, 'CALL_BUTTONS_ERROR', 'CometChatCallButtons', this.error, this.onError);\n  }\n}\n","<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'CallButtons'\">\n@if (hasTarget) {\n  <div class=\"cometchat-call-buttons\">\n    <!-- Voice Call Button -->\n    @if (!effectiveHideVoiceCallButton()) {\n      @if (voiceCallButtonView) {\n        <ng-container *ngTemplateOutlet=\"voiceCallButtonView\"></ng-container>\n      } @else {\n        <div class=\"cometchat-call-buttons__voice\">\n          <cometchat-button\n            [iconURL]=\"voiceCallIconUrl\"\n            [hoverText]=\"'call_button_voice_hover' | translate\"\n            [ariaLabel]=\"'call_button_voice_hover' | translate\"\n            [disabled]=\"isDisabled()\"\n            (buttonClick)=\"onVoiceCallButtonClick()\">\n          </cometchat-button>\n        </div>\n      }\n    }\n\n    <!-- Video Call Button -->\n    @if (!effectiveHideVideoCallButton()) {\n      @if (videoCallButtonView) {\n        <ng-container *ngTemplateOutlet=\"videoCallButtonView\"></ng-container>\n      } @else {\n        <div class=\"cometchat-call-buttons__video\">\n          <cometchat-button\n            [iconURL]=\"videoCallIconUrl\"\n            [hoverText]=\"'call_button_video_hover' | translate\"\n            [ariaLabel]=\"'call_button_video_hover' | translate\"\n            [disabled]=\"isDisabled()\"\n            (buttonClick)=\"onVideoCallButtonClick()\">\n          </cometchat-button>\n        </div>\n      }\n    }\n  </div>\n\n  <!-- Outgoing Call Screen (user calls only) -->\n  @if (!hideOverlays && showOutgoingCall()) {\n    <div class=\"cometchat-backdrop cometchat-call-buttons__outgoing-backdrop\">\n      <cometchat-outgoing-call\n        [call]=\"activeCallObject()\"\n        [disableSoundForCalls]=\"effectiveOutgoingCallDisableSoundForCalls()\"\n        [customSoundForCalls]=\"effectiveOutgoingCallCustomSoundForCalls()\"\n        (callCanceled)=\"onOutgoingCallCanceled()\">\n      </cometchat-outgoing-call>\n    </div>\n  }\n\n  <!-- Ongoing Call Screen (after call accepted or group call initiated) -->\n  @if (!hideOverlays && showOngoingCall()) {\n    <cometchat-ongoing-call\n      [sessionID]=\"ongoingCallSessionId()\"\n      [callWorkflow]=\"ongoingCallWorkflow()\"\n      [callSettingsBuilder]=\"effectiveCallSettingsBuilder\"\n      [isAudioOnly]=\"ongoingCallIsAudioOnly()\">\n    </cometchat-ongoing-call>\n  }\n}\n</cometchat-error-boundary>\n","/**\n * Template helper utilities for CometChatMessageHeader component.\n *\n * Pure functions that compute display values from user/group objects,\n * keeping the component class lean.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Gets the avatar image URL for the current user or group.\n */\nexport function getHeaderAvatarImage(\n  user: CometChat.User | null,\n  group: CometChat.Group | null\n): string {\n  if (user) return user.getAvatar() || '';\n  if (group) return group.getIcon() || '';\n  return '';\n}\n\n/**\n * Gets the avatar name (initials fallback) for the current user or group.\n */\nexport function getHeaderAvatarName(\n  user: CometChat.User | null,\n  group: CometChat.Group | null\n): string {\n  if (user) return user.getName() || '';\n  if (group) return group.getName() || '';\n  return '';\n}\n\n/**\n * Gets the display name for the header.\n */\nexport function getHeaderDisplayName(\n  user: CometChat.User | null,\n  group: CometChat.Group | null\n): string {\n  if (user) return user.getName() || '';\n  if (group) return group.getName() || '';\n  return '';\n}\n\n/**\n * Gets the member count text for a group.\n */\nexport function getGroupMemberCountText(memberCount: number): string {\n  if (memberCount <= 0) return '';\n  const key = memberCount === 1 ? 'group_member' : 'group_members';\n  return `${memberCount} ${CometChatLocalize.getLocalizedString(key)}`;\n}\n\n/**\n * Checks if the user is currently online.\n */\nexport function isUserOnline(\n  user: CometChat.User | null,\n  userStatus: string | null\n): boolean {\n  if (!user) return false;\n  const status = userStatus || user.getStatus();\n  return status === CometChat.USER_STATUS.ONLINE;\n}\n\n/**\n * Gets the last active timestamp for a user.\n */\nexport function getLastActiveTimestamp(\n  user: CometChat.User | null,\n  userStatus: string | null\n): number | null {\n  if (!user) return null;\n  const status = userStatus || user.getStatus();\n  if (status === CometChat.USER_STATUS.ONLINE) return null;\n  return user.getLastActiveAt() || null;\n}\n\n/**\n * Gets the calendar date format object for last active display.\n */\nexport function getLastActiveDateFormat(): CalendarObject {\n  return {\n    yesterday: CometChatLocalize.getLocalizedString('yesterday'),\n    today: CometChatLocalize.getLocalizedString('today'),\n    lastWeek: 'dddd',\n    otherDays: 'DD/MM/YYYY'\n  };\n}\n","/**\n * Accessibility helpers for CometChatMessageHeader component.\n *\n * Pure functions for computing ARIA labels and managing screen reader announcements.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Gets the ARIA label for the header container.\n */\nexport function getHeaderAriaLabel(\n  name: string,\n  user: CometChat.User | null,\n  group: CometChat.Group | null,\n  userStatus: string | null,\n  memberCount: number\n): string {\n  if (user) {\n    const status = userStatus || user.getStatus();\n    const statusText = status === 'online'\n      ? CometChatLocalize.getLocalizedString('message_header_status_online')\n      : CometChatLocalize.getLocalizedString('message_header_status_offline');\n    return `${name}, ${statusText}`;\n  }\n\n  if (group) {\n    const membersText = memberCount === 1\n      ? CometChatLocalize.getLocalizedString('message_header_member')\n      : CometChatLocalize.getLocalizedString('message_header_members');\n    return `${name}, ${memberCount} ${membersText}`;\n  }\n\n  return CometChatLocalize.getLocalizedString('message_header_back');\n}\n\n/**\n * Gets the ARIA label for the clickable item section.\n */\nexport function getItemAriaLabel(\n  name: string,\n  user: CometChat.User | null,\n  group: CometChat.Group | null,\n  userStatus: string | null,\n  memberCount: number\n): string {\n  if (user) {\n    const status = userStatus || user.getStatus();\n    const statusText = status === 'online'\n      ? CometChatLocalize.getLocalizedString('message_header_status_online')\n      : CometChatLocalize.getLocalizedString('message_header_status_offline');\n    return `${name}, ${statusText}. ${CometChatLocalize.getLocalizedString('message_header_click_for_details')}`;\n  }\n\n  if (group) {\n    const membersText = memberCount === 1\n      ? CometChatLocalize.getLocalizedString('message_header_member')\n      : CometChatLocalize.getLocalizedString('message_header_members');\n    return `${name}, ${memberCount} ${membersText}. ${CometChatLocalize.getLocalizedString('message_header_click_for_details')}`;\n  }\n\n  return '';\n}\n\n/**\n * Announces a user status change to screen readers via a temporary aria-live element.\n *\n * @param userName - The user's display name\n * @param status - The new status ('online' or 'offline')\n * @param pendingTimers - Array to push the cleanup timer into\n */\nexport function announceStatusChange(\n  userName: string,\n  status: string,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  const statusText = status === 'online'\n    ? CometChatLocalize.getLocalizedString('message_header_user_now_online')\n    : CometChatLocalize.getLocalizedString('message_header_user_now_offline');\n\n  const announcement = `${userName} ${statusText}`;\n\n  const el = document.createElement('div');\n  el.setAttribute('role', 'status');\n  el.setAttribute('aria-live', 'polite');\n  el.setAttribute('aria-atomic', 'true');\n  el.className = 'cometchat-sr-only';\n  el.textContent = announcement;\n\n  document.body.appendChild(el);\n\n  pendingTimers.push(setTimeout(() => {\n    if (document.body.contains(el)) document.body.removeChild(el);\n  }, 1000));\n}\n","\nimport {Component, Input, Output, EventEmitter, TemplateRef, ContentChild, ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy, OnChanges, SimpleChanges, Signal, computed, signal, inject, Injector, HostListener, ViewChild, booleanAttribute, DestroyRef,} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport {CommonModule} from '@angular/common';\n\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\n\nimport {CometChatUIEvents} from '../../events/CometChatUIEvents';\nimport {CometChatGroupEvents, IGroupMemberAdded, IGroupMemberKickedBanned, IGroupMemberJoined, IOwnershipChanged, IGroupLeft,} from '../../events/CometChatGroupEvents';\nimport {CometChatUIKit} from '../../cometchat-uikit';\nimport {PanelAlignment} from '../../Enums/Enums';\n\nimport {CometChatAvatarComponent} from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport {CometChatDateComponent} from '../base-elements/cometchat-date/cometchat-date.component';\nimport {CometChatContextMenuComponent, ContextMenuItem,} from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\n\nimport {MessageHeaderService} from '../../services/message-header.service';\nimport {ChatStateService} from '../../services/chat-state.service';\nimport {COMETCHAT_GLOBAL_CONFIG, GlobalConfig} from '../../services/global-config.service';\n\nimport {TranslatePipe} from '../../resources/CometChatLocalize/translate.pipe';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\n\nimport {CalendarObject} from '../../resources/CometChatLocalize/localization.interfaces';\n\nimport {CometChatOption} from '../../modals';\nimport {CometChatCallButtonsComponent} from '../cometchat-call-buttons/cometchat-call-buttons.component';\nimport {CometChatUIKitCalls} from '../../CometChatCalls';\nimport {CometChatErrorBoundaryComponent} from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\n\nimport {getHeaderAvatarImage, getHeaderAvatarName, getHeaderDisplayName, getGroupMemberCountText, isUserOnline, getLastActiveTimestamp, getLastActiveDateFormat,} from './cometchat-message-header.utils';\nimport {getHeaderAriaLabel, getItemAriaLabel, announceStatusChange,} from './cometchat-message-header.accessibility';\n\n@Component({\n  selector: 'cometchat-message-header',\n  standalone: true,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatDateComponent, CometChatContextMenuComponent, TranslatePipe, CometChatCallButtonsComponent, CometChatErrorBoundaryComponent],\n  providers: [MessageHeaderService],\n  templateUrl: './cometchat-message-header.component.html',\n  styleUrls: ['./cometchat-message-header.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatMessageHeaderComponent implements OnInit, OnDestroy, OnChanges {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n  private messageHeaderService = inject(MessageHeaderService); private chatStateService = inject(ChatStateService);\n  private cdr = inject(ChangeDetectorRef); private injector = inject(Injector);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private hideUserStatusExplicitlySet = signal(false);\n  private hideVoiceCallButtonExplicitlySet = signal(false);\n  private hideVideoCallButtonExplicitlySet = signal(false);\n\n  private _hideUserStatus = signal(false);\n  private _hideVoiceCallButton = signal(false);\n  private _hideVideoCallButton = signal(false);\n  @Input() user?: CometChat.User;\n  @Input() group?: CometChat.Group;\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n  @Input() showBackButton = false;\n  @Input({ transform: booleanAttribute })\n  set hideVoiceCallButton(value: boolean) { this._hideVoiceCallButton.set(value); this.hideVoiceCallButtonExplicitlySet.set(true); }\n  get hideVoiceCallButton(): boolean { return this._hideVoiceCallButton(); }\n  @Input({ transform: booleanAttribute })\n  set hideVideoCallButton(value: boolean) { this._hideVideoCallButton.set(value); this.hideVideoCallButtonExplicitlySet.set(true); }\n  get hideVideoCallButton(): boolean { return this._hideVideoCallButton(); }\n  @Input() showSearchOption = false; @Input() showConversationSummaryButton = false; @Input() callSettingsBuilder: typeof CometChatUIKitCalls.CallSettingsBuilder = undefined;\n  @Input() summaryGenerationMessageCount = 1000; @Input() enableAutoSummaryGeneration = false; @Input() lastActiveAtDateTimeFormat?: CalendarObject;\n  @Input() headerView?: TemplateRef<any>; @Input() itemView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @Input() leadingView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>; @Input() titleView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @Input() subtitleView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>; @Input() trailingView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @Input() backButtonView?: TemplateRef<any>; @Input() auxiliaryButtonView?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null; @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null; @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n  @ContentChild('headerView') headerViewContent?: TemplateRef<any>; @ContentChild('itemView') itemViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @ContentChild('leadingView') leadingViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>; @ContentChild('titleView') titleViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @ContentChild('subtitleView') subtitleViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>; @ContentChild('trailingView') trailingViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @ContentChild('backButtonView') backButtonViewContent?: TemplateRef<any>; @ContentChild('auxiliaryButtonView') auxiliaryButtonViewContent?: TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }>;\n  @Output() backClick = new EventEmitter<void>(); @Output() itemClick = new EventEmitter<CometChat.User | CometChat.Group>(); @Output() searchClick = new EventEmitter<void>();\n  @Output() conversationSummaryClick = new EventEmitter<{ messageCount: number }>(); @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() voiceCallClick = new EventEmitter<CometChat.User | CometChat.Group>(); @Output() videoCallClick = new EventEmitter<CometChat.User | CometChat.Group>();\n\n  protected currentUser = signal<CometChat.User | null>(null); protected currentGroup = signal<CometChat.Group | null>(null); private propsProvided = signal<boolean>(false);\n\n  userSignal!: Signal<CometChat.User | null>; groupSignal!: Signal<CometChat.Group | null>; userStatusSignal!: Signal<string>;\n  typingIndicatorSignal!: Signal<CometChat.TypingIndicator | null>; typingUsersSignal!: Signal<CometChat.User[]>;\n  groupMemberCountSignal!: Signal<number>; lastActiveAtSignal!: Signal<number | null>;\n\n  isUserConversation = computed(() => this.userSignal() !== null); isGroupConversation = computed(() => this.groupSignal() !== null);\n  isTyping = computed(() => this.typingIndicatorSignal() !== null); shouldShowBackButton = computed(() => this.showBackButton);\n  shouldShowOverflowMenu = computed(() => this.showSearchOption && this.showConversationSummaryButton);\n\n  effectiveHideUserStatus = computed(() => { if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus(); if (this.globalConfig?.hideUserStatus !== undefined) return this.globalConfig.hideUserStatus; return false; });\n\n  effectiveHideVoiceCallButton = computed(() => { if (this.hideVoiceCallButtonExplicitlySet()) return this._hideVoiceCallButton(); return !CometChatUIKit.isCallingEnabled(); });\n\n  effectiveHideVideoCallButton = computed(() => { if (this.hideVideoCallButtonExplicitlySet()) return this._hideVideoCallButton(); return !CometChatUIKit.isCallingEnabled(); });\n\n  private readonly destroyRef = inject(DestroyRef);\n  isOverflowMenuOpen = false; @ViewChild(CometChatContextMenuComponent) contextMenu?: CometChatContextMenuComponent;\n  private previousUserStatus: string | null = null; private unreadMessageCount = 0; private autoSummaryTriggered = false;\n\n  get effectiveHeaderView(): TemplateRef<any> | undefined { return this.headerView || this.headerViewContent; }\n  get effectiveItemView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.listItemTemplate || this.itemView || this.itemViewContent; }\n  get effectiveLeadingView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.leadingView || this.leadingViewContent; }\n  get effectiveTitleView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.titleView || this.titleViewContent; }\n  get effectiveSubtitleView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.subtitleView || this.subtitleViewContent; }\n  get effectiveTrailingView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.trailingView || this.trailingViewContent; }\n  get effectiveBackButtonView(): TemplateRef<any> | undefined { return this.backButtonView || this.backButtonViewContent; }\n  get effectiveAuxiliaryButtonView(): TemplateRef<{ user?: CometChat.User; group?: CometChat.Group }> | undefined { return this.auxiliaryButtonView || this.auxiliaryButtonViewContent; }\n  get templateContext(): { user?: CometChat.User; group?: CometChat.Group } { return { user: this.currentUser() ?? undefined, group: this.currentGroup() ?? undefined }; }\n  constructor() {\n    this.initializeSignals();\n    safeEffect(() => { const s = this.userStatusSignal(); if (this.previousUserStatus !== null && this.previousUserStatus !== s && this.user) this.announceStatusChange(s); this.previousUserStatus = s; });\n    safeEffect(() => {\n      const su = this.chatStateService.activeUser(); const sg = this.chatStateService.activeGroup(); const up = this.propsProvided();\n      if (!up) {\n        this.currentUser.set(su); this.currentGroup.set(sg);\n        if (su) { this.messageHeaderService.setUser(su); const uid = su.getUid?.(); if (uid) this.messageHeaderService.setupListeners(uid, 'user'); }\n        else if (sg) { this.messageHeaderService.setGroup(sg); const gid = sg.getGuid?.(); if (gid) this.messageHeaderService.setupListeners(gid, 'group'); }\n        else { this.messageHeaderService.cleanup(); this.setupErrorCallback(); }\n        this.cdr.markForCheck();\n      }\n    });\n  }\n  @HostListener('document:keydown.escape', ['$event'])\n  handleEscapeKey(event: Event): void {\n    if (this.isOverflowMenuOpen) {\n      event.preventDefault();\n      this.closeOverflowMenu();\n    }\n  }\n  ngOnInit(): void {\n    try {\n      this.setupErrorCallback();\n      if (this.user) { this.propsProvided.set(true); this.currentUser.set(this.user); this.currentGroup.set(null); this.initializeService(); }\n      else if (this.group) { this.propsProvided.set(true); this.currentUser.set(null); this.currentGroup.set(this.group); this.initializeService(); }\n      else { this.propsProvided.set(false); }\n      this.handleAutoSummaryGeneration(); this.subscribeToGroupEvents();\n    } catch (error) { this.handleLifecycleError(error, 'ngOnInit'); }\n  }\n  ngOnChanges(changes: SimpleChanges): void {\n    try {\n      if (changes['user'] && !changes['user'].firstChange) { this.handleUserChange(changes['user'].previousValue); }\n      if (changes['group'] && !changes['group'].firstChange) { this.handleGroupChange(changes['group'].previousValue); }\n    } catch (error) {\n      const err = error instanceof Error ? error : new Error(String(error));\n      CometChatLogger.error('CometChatMessageHeader', 'Error in ngOnChanges:', err);\n    }\n  }\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    try {\n      this.messageHeaderService.cleanup();\n    } catch (error) {\n      // @see Requirement 2.4 (Error Boundaries spec)\n      const err = error instanceof Error ? error : new Error(String(error));\n      CometChatLogger.error('CometChatMessageHeader', 'Error in ngOnDestroy:', err);\n    }\n  }\n  private setupErrorCallback(): void {\n    this.messageHeaderService.setErrorCallback((error: CometChat.CometChatException) => {\n      this.error.emit(error);\n    });\n  }\n  private initializeService(): void {\n    if (this.user && this.group) { CometChatLogger.warn('CometChatMessageHeader', 'Both user and group provided; user takes precedence.'); }\n    if (this.user) { const uid = this.user.getUid?.(); if (!uid) throw new Error('Invalid user: missing UID'); this.messageHeaderService.setUser(this.user); this.messageHeaderService.setupListeners(uid, 'user'); }\n    else if (this.group) { const gid = this.group.getGuid?.(); if (!gid) throw new Error('Invalid group: missing GUID'); this.messageHeaderService.setGroup(this.group); this.messageHeaderService.setupListeners(gid, 'group'); }\n  }\n  private initializeSignals(): void {\n    this.userSignal = this.messageHeaderService.user;\n    this.groupSignal = this.messageHeaderService.group;\n    this.userStatusSignal = this.messageHeaderService.userStatus;\n    this.typingIndicatorSignal = this.messageHeaderService.typingIndicator;\n    this.typingUsersSignal = this.messageHeaderService.typingUsers;\n    this.groupMemberCountSignal = this.messageHeaderService.groupMemberCount;\n    this.lastActiveAtSignal = this.messageHeaderService.lastActiveAt;\n  }\n  private handleUserChange(previousUser?: CometChat.User): void {\n    if (!this.user) {\n      if (previousUser) {\n        this.messageHeaderService.cleanup();\n        this.setupErrorCallback();\n        this.currentUser.set(null);\n      }\n      return;\n    }\n    const userId = this.user.getUid?.();\n    if (!userId) { CometChatLogger.error('CometChatMessageHeader', 'Invalid user: missing UID'); this.emitError(new Error('Invalid user: missing UID')); return; }\n    const previousUserId = previousUser?.getUid?.();\n    if (previousUserId === userId) { this.messageHeaderService.setUser(this.user); this.currentUser.set(this.user); this.cdr.markForCheck(); return; }\n    this.messageHeaderService.setUser(this.user);\n    this.messageHeaderService.setupListeners(userId, 'user');\n    this.currentUser.set(this.user);\n    this.currentGroup.set(null);\n    this.cdr.markForCheck();\n  }\n  private handleGroupChange(previousGroup?: CometChat.Group): void {\n    if (!this.group) { if (previousGroup) { this.messageHeaderService.cleanup(); this.setupErrorCallback(); this.currentGroup.set(null); } return; }\n    const groupId = this.group.getGuid?.();\n    if (!groupId) { CometChatLogger.error('CometChatMessageHeader', 'Invalid group: missing GUID'); this.emitError(new Error('Invalid group: missing GUID')); return; }\n    const previousGroupId = previousGroup?.getGuid?.();\n    if (previousGroupId === groupId) { this.messageHeaderService.setGroup(this.group); this.currentGroup.set(this.group); this.cdr.markForCheck(); return; }\n    this.messageHeaderService.setGroup(this.group);\n    this.messageHeaderService.setupListeners(groupId, 'group');\n    this.currentUser.set(null);\n    this.currentGroup.set(this.group);\n    this.cdr.markForCheck();\n  }\n  private emitError(error: unknown): void {\n    CometChatLogger.error('CometChatMessageHeader', 'Error:', error);\n    if (error instanceof CometChat.CometChatException) { this.error.emit(error); } else if (error instanceof Error) {\n      const exception = new CometChat.CometChatException({\n        code: 'COMPONENT_ERROR',\n        message: error.message,\n        details: error.stack || '',\n      });\n      this.error.emit(exception);\n    } else {\n      const exception = new CometChat.CometChatException({\n        code: 'UNKNOWN_ERROR',\n        message: String(error),\n        details: '',\n      });\n      this.error.emit(exception);\n    }\n  }\n  private handleLifecycleError(error: unknown, hook: string): void {\n    const err = error instanceof Error ? error : new Error(String(error));\n    CometChatLogger.error('CometChatMessageHeader', `Error in ${hook}:`, err);\n    this.error.emit(err as CometChat.CometChatException);\n  }\n  handleBackClick(): void { this.backClick.emit(); }\n  handleBackKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleBackClick(); }\n  }\n  handleItemClick(): void {\n    const user = this.currentUser();\n    const group = this.currentGroup();\n    if (user) { this.itemClick.emit(user); } else if (group) { this.itemClick.emit(group); }\n  }\n  handleItemKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleItemClick(); }\n  }\n  handleSearchClick(): void { this.searchClick.emit(); }\n  handleSummaryClick(): void {\n    try {\n      this.triggerSummaryGeneration();\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageHeader', 'Error triggering summary generation:', error);\n      this.emitError(error);\n    }\n  }\n  private triggerSummaryGeneration(): void {\n    const user = this.currentUser(); const group = this.currentGroup();\n    if (!user && !group) { const e = new Error('Cannot generate summary: No user or group configured'); CometChatLogger.warn('CometChatMessageHeader', e.message); this.emitError(e); return; }\n    const receiverId = user ? user.getUid() : group!.getGuid(); const receiverType = user ? 'user' : 'group';\n    CometChatUIEvents.ccShowPanel.next({ configuration: { getConversationSummary: () => CometChat.getConversationSummary(receiverId, receiverType, { lastNMessages: this.summaryGenerationMessageCount }), closeCallback: () => CometChatUIEvents.ccHidePanel.next(PanelAlignment.messageListFooter) }, position: PanelAlignment.messageListFooter });\n    this.conversationSummaryClick.emit({ messageCount: this.summaryGenerationMessageCount });\n  }\n  private handleAutoSummaryGeneration(): void {\n    if (!this.enableAutoSummaryGeneration) return;\n    CometChatUIEvents.ccActiveChatChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {\n      this.unreadMessageCount = event.unreadMessageCount ?? 0;\n      if (this.unreadMessageCount >= 15) { const u = this.currentUser(); const g = this.currentGroup(); if (!u && !g) return; this.pendingTimers.push(setTimeout(() => { try { this.triggerSummaryGeneration(); } catch (e) { CometChatLogger.error('CometChatMessageHeader', 'Error during auto-summary generation:', e); this.emitError(e); } }, 0)); }\n    });\n    const user = this.currentUser(); const group = this.currentGroup();\n    if (user || group) { this.pendingTimers.push(setTimeout(() => { try { this.triggerSummaryGeneration(); } catch (e) { CometChatLogger.error('CometChatMessageHeader', 'Error during auto-summary generation:', e); this.emitError(e); } }, 0)); }\n    else { this.autoSummaryTriggered = false; safeEffect(() => { const u = this.currentUser(); const g = this.currentGroup(); if ((u || g) && !this.autoSummaryTriggered) { this.autoSummaryTriggered = true; this.pendingTimers.push(setTimeout(() => { try { this.triggerSummaryGeneration(); } catch (e) { CometChatLogger.error('CometChatMessageHeader', 'Error during auto-summary generation:', e); this.emitError(e); } }, 0)); } }, { injector: this.injector }); }\n  }\n  private subscribeToGroupEvents(): void {\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    CometChatGroupEvents.ccGroupMemberAdded.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IGroupMemberAdded) => { const group = this.currentGroup(); if (group && group.getGuid() === item.userAddedIn?.getGuid()) { if (item.usersAdded?.length > 0) item.usersAdded.forEach((u: CometChat.User) => { if (u.getUid() === loggedInUser?.getUid()) group.setHasJoined(true); }); group.setMembersCount(item.userAddedIn.getMembersCount()); this.messageHeaderService.updateGroupMemberCount(item.userAddedIn.getMembersCount()); this.cdr.markForCheck(); } });\n    CometChatGroupEvents.ccGroupMemberBanned.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IGroupMemberKickedBanned) => { const group = this.currentGroup(); if (group && group.getGuid() === item.kickedFrom?.getGuid()) { if (loggedInUser?.getUid() === item.kickedUser?.getUid()) group.setHasJoined(false); group.setMembersCount(item.kickedFrom.getMembersCount()); this.messageHeaderService.updateGroupMemberCount(item.kickedFrom.getMembersCount()); this.cdr.markForCheck(); } });\n    CometChatGroupEvents.ccGroupMemberJoined.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IGroupMemberJoined) => { const group = this.currentGroup(); if (group && group.getGuid() === item.joinedGroup?.getGuid()) { if (loggedInUser?.getUid() === item.joinedUser?.getUid()) group.setHasJoined(true); group.setMembersCount(item.joinedGroup.getMembersCount()); this.messageHeaderService.updateGroupMemberCount(item.joinedGroup.getMembersCount()); this.cdr.markForCheck(); } });\n    CometChatGroupEvents.ccGroupMemberKicked.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IGroupMemberKickedBanned) => { const group = this.currentGroup(); if (group && group.getGuid() === item.kickedFrom?.getGuid()) { if (loggedInUser?.getUid() === item.kickedUser?.getUid()) group.setHasJoined(false); group.setMembersCount(item.kickedFrom.getMembersCount()); this.messageHeaderService.updateGroupMemberCount(item.kickedFrom.getMembersCount()); this.cdr.markForCheck(); } });\n    CometChatGroupEvents.ccOwnershipChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IOwnershipChanged) => { const group = this.currentGroup(); if (group && group.getGuid() === item.group?.getGuid()) { group.setOwner(item.group.getOwner()); this.cdr.markForCheck(); } });\n    CometChatGroupEvents.ccGroupLeft.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((item: IGroupLeft) => { const group = this.currentGroup(); if (group && group.getGuid() === item.leftGroup?.getGuid()) { if (loggedInUser?.getUid() === item.userLeft?.getUid()) group.setHasJoined(false); group.setMembersCount(item.leftGroup.getMembersCount()); this.messageHeaderService.updateGroupMemberCount(item.leftGroup.getMembersCount()); this.cdr.markForCheck(); } });\n  }\n  getOverflowMenuOptions(): CometChatOption[] {\n    const opts: CometChatOption[] = [];\n    if (this.showSearchOption) opts.push(new CometChatOption({ id: 'search', title: CometChatLocalize.getLocalizedString('search_title'), iconURL: 'assets/search.svg', onClick: () => this.handleSearchClick() }));\n    if (this.showConversationSummaryButton) opts.push(new CometChatOption({ id: 'summary', title: CometChatLocalize.getLocalizedString('ai_conversation_summary_title'), iconURL: 'assets/ai_conversation_summary.svg', onClick: () => this.handleSummaryClick() }));\n    return opts;\n  }\n  handleOverflowMenuOptionClick(option: ContextMenuItem): void {\n    if (option instanceof CometChatOption && option.onClick) { option.onClick(); }\n  }\n  handleVoiceCallClick(): void {\n    const user = this.currentUser();\n    const group = this.currentGroup();\n    if (user) { this.voiceCallClick.emit(user); } else if (group) { this.voiceCallClick.emit(group); }\n  }\n  handleVideoCallClick(): void {\n    const user = this.currentUser();\n    const group = this.currentGroup();\n    if (user) { this.videoCallClick.emit(user); } else if (group) { this.videoCallClick.emit(group); }\n  }\n  handleRetryClick(): void {\n    try {\n      this.messageHeaderService.cleanup();\n      this.setupErrorCallback();\n      if (this.user) { this.initializeService(); }\n      else if (this.group) { this.initializeService(); }\n      this.cdr.markForCheck();\n    } catch (error) { this.handleLifecycleError(error, 'handleRetryClick'); }\n  }\n  handleError(error: CometChat.CometChatException): void { this.error.emit(error); }\n  getAvatarImage(): string { return getHeaderAvatarImage(this.currentUser(), this.currentGroup()); }\n  getAvatarName(): string { return getHeaderAvatarName(this.currentUser(), this.currentGroup()); }\n  getDisplayName(): string { return getHeaderDisplayName(this.currentUser(), this.currentGroup()); }\n  getTypingText(): string {\n    const typingIndicator = this.typingIndicatorSignal();\n    if (!typingIndicator) { return ''; }\n    const user = this.currentUser();\n    const group = this.currentGroup();\n    if (user) { return CometChatLocalize.getLocalizedString('message_header_typing'); }\n    if (group) {\n      const typingUsers = this.typingUsersSignal();\n      if (typingUsers.length === 0) { const s = typingIndicator.getSender(); if (s) return `${s.getName() || ''} ${CometChatLocalize.getLocalizedString('message_header_is_typing')}`; return CometChatLocalize.getLocalizedString('message_header_typing'); }\n      if (typingUsers.length === 1) return `${typingUsers[0].getName() || ''} ${CometChatLocalize.getLocalizedString('message_header_is_typing')}`;\n      if (typingUsers.length === 2) return `${typingUsers[0].getName() || ''} ${CometChatLocalize.getLocalizedString('message_header_and')} ${typingUsers[1].getName() || ''} ${CometChatLocalize.getLocalizedString('message_header_are_typing')}`;\n            const firstName = typingUsers[0].getName() || '';\n      const othersCount = typingUsers.length - 1;\n      return `${firstName} ${CometChatLocalize.getLocalizedString('message_header_and')} ${othersCount} ${CometChatLocalize.getLocalizedString('message_header_others_typing')}`;\n      }\n    return CometChatLocalize.getLocalizedString('message_header_typing');\n  }\n  getTypingUsersCount(): number { return this.typingUsersSignal().length; }\n  getMemberCountText(): string {\n    const group = this.currentGroup();\n    if (!group) return '';\n    return this.groupMemberCountSignal().toString();\n  }\n  getMemberCount(): number {\n    const group = this.currentGroup();\n    if (!group) return 0;\n    return this.groupMemberCountSignal();\n  }\n  isUserOnline(): boolean { return this.userStatusSignal() === 'online'; }\n  getLastActiveTimestamp(): number | null {\n    return this.lastActiveAtSignal();\n  }\n  getLastActiveDateFormat(): CalendarObject {\n    if (this.lastActiveAtDateTimeFormat) return this.lastActiveAtDateTimeFormat;\n    return {\n      today: 'h:mm A',\n      yesterday: '[Yesterday]',\n      lastWeek: 'dddd',\n      otherDays: 'DD/MM/YYYY',\n      relativeTime: { minute: '1 min ago', minutes: '%d mins ago', hour: '1 hour ago', hours: '%d hours ago' },\n    };\n  }\n  getHeaderAriaLabel(): string {\n    return getHeaderAriaLabel(\n      this.getDisplayName(), this.currentUser(), this.currentGroup(),\n      this.userStatusSignal(), this.getMemberCount()\n    );\n  }\n  getItemAriaLabel(): string {\n    return getItemAriaLabel(\n      this.getDisplayName(), this.currentUser(), this.currentGroup(),\n      this.userStatusSignal(), this.getMemberCount()\n    );\n  }\n\n  closeOverflowMenu(): void { this.isOverflowMenuOpen = false; }\n  handleOverflowMenuStateChange(isOpen: boolean): void { this.isOverflowMenuOpen = isOpen; }\n  private announceStatusChange(status: string): void {\n    const user = this.currentUser();\n    announceStatusChange(user?.getName?.() || '', status, this.pendingTimers);\n  }\n}\n","<!-- \n  CometChatMessageHeader Component Template\n  \n  Displays the header section of a chat conversation with user/group information,\n  real-time status updates, typing indicators, and action buttons.\n  \n  Structure:\n  - Back Button Section (optional)\n  - Main Content (clickable item)\n    - Leading Section (avatar/status) - Task 8\n    - Body Section (title/subtitle) - Task 9\n    - Trailing Section (action buttons) - Task 10\n  \n  Requirements: 5.1, 5.2, 5.3, 5.4, 5.5, 12.3\n-->\n\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'MessageHeader'\">\n<div \n  class=\"cometchat cometchat-message-header\"\n  role=\"banner\"\n  [attr.aria-label]=\"getHeaderAriaLabel()\">\n\n  <!-- ==================== Back Button Section ==================== -->\n  @if (shouldShowBackButton()) {\n    <div class=\"cometchat-message-header__back-button-wrapper\">\n      @if (effectiveBackButtonView) {\n        <!-- Custom back button view provided via template -->\n        <ng-container *ngTemplateOutlet=\"effectiveBackButtonView\"></ng-container>\n      } @else {\n        <!-- Default back button with arrow icon -->\n        <button\n          type=\"button\"\n          class=\"cometchat-message-header__back-button\"\n          [attr.aria-label]=\"'accessibility_go_back' | translate\"\n          tabindex=\"0\"\n          (click)=\"handleBackClick()\"\n          (keydown)=\"handleBackKeydown($event)\">\n          <span \n            class=\"cometchat-message-header__back-button-icon\"\n            aria-hidden=\"true\">\n          </span>\n        </button>\n      }\n    </div>\n  }\n\n  <!-- ==================== Main Content Section ==================== -->\n  <!-- This section will be implemented in subsequent tasks (8, 9, 10) -->\n  @if (effectiveHeaderView) {\n    <!-- Custom header view replaces entire content -->\n    <ng-container *ngTemplateOutlet=\"effectiveHeaderView\"></ng-container>\n  } @else {\n    <!-- Default header content -->\n    <div class=\"cometchat-message-header__content\">\n\n      @if (effectiveItemView) {\n        <!-- Custom item view replaces item content -->\n        <div\n          class=\"cometchat-message-header__info\"\n          role=\"button\"\n          tabindex=\"0\"\n          [attr.aria-label]=\"getItemAriaLabel()\"\n          (click)=\"handleItemClick()\"\n          (keydown)=\"handleItemKeydown($event)\">\n          <ng-container *ngTemplateOutlet=\"effectiveItemView; context: templateContext\"></ng-container>\n        </div>\n      } @else {\n        <!-- Default item layout - to be implemented in Tasks 8, 9, 10 -->\n\n        <!-- Clickable info region (leading + body). Action buttons live in the\n             sibling trailing section so this button has no focusable descendants. -->\n        <div\n          class=\"cometchat-message-header__info\"\n          role=\"button\"\n          tabindex=\"0\"\n          [attr.aria-label]=\"getItemAriaLabel()\"\n          (click)=\"handleItemClick()\"\n          (keydown)=\"handleItemKeydown($event)\">\n\n        <!-- Leading Section (avatar/status) - Task 8 -->\n        <div class=\"cometchat-message-header__leading\">\n          @if (effectiveLeadingView) {\n            <ng-container *ngTemplateOutlet=\"effectiveLeadingView; context: templateContext\"></ng-container>\n          } @else {\n            <!-- Default leading view with avatar and status indicator -->\n            <div class=\"cometchat-message-header__avatar-container\">\n              <!-- CometChatAvatar component -->\n              <cometchat-avatar\n                [image]=\"getAvatarImage()\"\n                [name]=\"getAvatarName()\">\n              </cometchat-avatar>\n              \n              <!-- Status indicator for user conversations (hidden when typing) -->\n              @if (currentUser() && !effectiveHideUserStatus() && !isTyping()) {\n                <span \n                  class=\"cometchat-message-header__status-indicator\"\n                  [class.cometchat-message-header__status-indicator--online]=\"userStatusSignal() === 'online'\"\n                  [class.cometchat-message-header__status-indicator--offline]=\"userStatusSignal() !== 'online'\"\n                  [attr.aria-label]=\"userStatusSignal() === 'online' ? ('message_header_status_online' | translate) : ('message_header_status_offline' | translate)\"\n                  role=\"status\">\n                </span>\n              }\n            </div>\n          }\n        </div>\n\n        <!-- Body Section (title/subtitle) - Task 9 -->\n        <div class=\"cometchat-message-header__body\">\n          <!-- Title Section -->\n          <div class=\"cometchat-message-header__title-wrapper\">\n            @if (effectiveTitleView) {\n              <ng-container *ngTemplateOutlet=\"effectiveTitleView; context: templateContext\"></ng-container>\n            } @else {\n              <!-- Default title view with user/group name -->\n              <span \n                class=\"cometchat-message-header__title\"\n                [attr.title]=\"getDisplayName()\">\n                {{ getDisplayName() }}\n              </span>\n            }\n          </div>\n\n          <!-- Subtitle Section -->\n          <div \n            class=\"cometchat-message-header__subtitle-wrapper\"\n            [attr.aria-live]=\"isTyping() ? 'polite' : null\"\n            [attr.aria-atomic]=\"isTyping() ? 'true' : null\">\n            @if (effectiveSubtitleView) {\n              <ng-container *ngTemplateOutlet=\"effectiveSubtitleView; context: templateContext\"></ng-container>\n            } @else {\n              <!-- Default subtitle view - Requirements 2.1, 2.2, 2.5, 3.4, 4.1, 10.5 -->\n              \n              <!-- User Conversation Subtitle -->\n              @if (currentUser()) {\n                @if (isTyping()) {\n                  <!-- Typing indicator for user -->\n                  <span \n                    class=\"cometchat-message-header__subtitle cometchat-message-header__subtitle--typing\"\n                    role=\"status\"\n                    aria-live=\"polite\">\n                    <span class=\"cometchat-message-header__typing-dots\" aria-hidden=\"true\">\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                    </span>\n                    <span class=\"cometchat-message-header__typing-text\">{{ 'message_header_typing' | translate }}</span>\n                  </span>\n                } @else if (isUserOnline() && !effectiveHideUserStatus()) {\n                  <!-- Online status -->\n                  <span class=\"cometchat-message-header__subtitle cometchat-message-header__subtitle--online\">\n                    {{ 'message_header_status_online' | translate }}\n                  </span>\n                } @else if (!effectiveHideUserStatus() && getLastActiveTimestamp()) {\n                  <!-- Last active timestamp for offline users -->\n                  <span class=\"cometchat-message-header__subtitle cometchat-message-header__subtitle--last-active\">\n                    <span class=\"cometchat-message-header__last-seen-label\">\n                      {{ 'message_header_last_seen' | translate }}\n                    </span>\n                    <cometchat-date\n                      [timestamp]=\"getLastActiveTimestamp()!\"\n                      [calendarObject]=\"getLastActiveDateFormat()\">\n                    </cometchat-date>\n                  </span>\n                }\n              }\n\n              <!-- Group Conversation Subtitle -->\n              @if (currentGroup()) {\n                @if (isTyping()) {\n                  <!-- Typing indicator for group -->\n                  <span \n                    class=\"cometchat-message-header__subtitle cometchat-message-header__subtitle--typing\"\n                    role=\"status\"\n                    aria-live=\"polite\">\n                    <span class=\"cometchat-message-header__typing-dots\" aria-hidden=\"true\">\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                      <span class=\"cometchat-message-header__typing-dot\"></span>\n                    </span>\n                    <span class=\"cometchat-message-header__typing-text\">{{ getTypingText() }}</span>\n                  </span>\n                } @else {\n                  <!-- Member count for groups -->\n                  <span class=\"cometchat-message-header__subtitle cometchat-message-header__subtitle--members\">\n                    {{ getMemberCount() }} \n                    @if (getMemberCount() === 1) {\n                      {{ 'message_header_member' | translate }}\n                    } @else {\n                      {{ 'message_header_members' | translate }}\n                    }\n                  </span>\n                }\n              }\n            }\n          </div>\n        </div>\n        </div>\n        <!-- /__info -->\n\n        <!-- Trailing Section (action buttons) - Task 10. Sibling of __info so the\n             interactive call/search controls are not nested inside a role=\"button\". -->\n        <div class=\"cometchat-message-header__trailing\">\n          @if (effectiveTrailingView) {\n            <ng-container *ngTemplateOutlet=\"effectiveTrailingView; context: templateContext\"></ng-container>\n          } @else {\n            <!-- Default trailing view with call buttons - Requirements 6.1, 6.2, 6.3, 6.4 -->\n            <div class=\"cometchat-message-header__call-buttons\" (click)=\"$event.stopPropagation()\">\n                  <cometchat-call-buttons\n              [user]=\"currentUser() ?? null\"\n              [group]=\"currentGroup() ?? null\"\n              [hideVoiceCallButton]=\"effectiveHideVoiceCallButton()\"\n              [hideVideoCallButton]=\"effectiveHideVideoCallButton()\"\n              [callSettingsBuilder]=\"callSettingsBuilder\"\n             >\n            </cometchat-call-buttons>\n            </div>\n\n            <!-- Search/Summary Menu Section - Requirements 7.1, 8.1, 8.2, 8.3, 8.4 -->\n            <div class=\"cometchat-message-header__menu-buttons\">\n              <!-- Search Button Only (when showSearchOption is true and showConversationSummaryButton is false) -->\n              @if (showSearchOption && !showConversationSummaryButton) {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-message-header__menu-button cometchat-message-header__menu-button--search\"\n                  [attr.aria-label]=\"'search_title' | translate\"\n                  [attr.title]=\"'search_title' | translate\"\n                  tabindex=\"0\"\n                  (click)=\"handleSearchClick(); $event.stopPropagation()\"\n                  (keydown.enter)=\"handleSearchClick(); $event.stopPropagation(); $event.preventDefault()\"\n                  (keydown.space)=\"handleSearchClick(); $event.stopPropagation(); $event.preventDefault()\">\n                  <span \n                    class=\"cometchat-message-header__menu-button-icon cometchat-message-header__menu-button-icon--search\"\n                    aria-hidden=\"true\">\n                  </span>\n                </button>\n              }\n\n              <!-- Summary Button Only (when showConversationSummaryButton is true and showSearchOption is false) -->\n              @if (showConversationSummaryButton && !showSearchOption) {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-message-header__menu-button cometchat-message-header__menu-button--summary\"\n                  [attr.aria-label]=\"'ai_conversation_summary_title' | translate\"\n                  [attr.title]=\"'ai_conversation_summary_title' | translate\"\n                  tabindex=\"0\"\n                  (click)=\"handleSummaryClick(); $event.stopPropagation()\"\n                  (keydown.enter)=\"handleSummaryClick(); $event.stopPropagation(); $event.preventDefault()\"\n                  (keydown.space)=\"handleSummaryClick(); $event.stopPropagation(); $event.preventDefault()\">\n                  <span \n                    class=\"cometchat-message-header__menu-button-icon cometchat-message-header__menu-button-icon--summary\"\n                    aria-hidden=\"true\">\n                  </span>\n                </button>\n              }\n\n              <!-- Overflow Menu (when both showSearchOption and showConversationSummaryButton are true) -->\n              @if (shouldShowOverflowMenu()) {\n                <cometchat-context-menu\n                  class=\"cometchat-message-header__overflow-menu\"\n                  [data]=\"getOverflowMenuOptions()\"\n                  [topMenuSize]=\"1\"\n                  [moreIconHoverText]=\"'message_header_more_options' | translate\"\n                  [closeOnOutsideClick]=\"true\"\n                  (optionClick)=\"handleOverflowMenuOptionClick($event)\">\n                </cometchat-context-menu>\n              }\n            </div>\n\n            <!-- Auxiliary Buttons (custom) - Requirements: 6.5 -->\n            @if (effectiveAuxiliaryButtonView) {\n              <div class=\"cometchat-message-header__auxiliary-buttons\">\n                <ng-container *ngTemplateOutlet=\"effectiveAuxiliaryButtonView; context: templateContext\"></ng-container>\n              </div>\n            }\n          }\n        </div>\n      }\n    </div>\n  }\n</div>\n</cometchat-error-boundary>\n","/**\n * Public API for CometChatMessageHeader component\n */\n\n// Component\nexport { CometChatMessageHeaderComponent } from './cometchat-message-header.component';\n\n// Service (re-export from services for convenience)\nexport { MessageHeaderService } from '../../services/message-header.service';\n\n// Types and Interfaces (re-export from their original locations)\nexport type { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\n","/**\n * Public API for CometChatPaginatedList component\n */\nexport { CometChatPaginatedListComponent } from './cometchat-paginated-list.component';\n","/**\n * Utility helpers for CometChatTextBubble component.\n * Contains text processing, extraction, and detection helpers.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport type { LinkPreviewData } from './cometchat-text-bubble.types';\n\n// ── Message Extraction ────────────────────────────────────────────────────\n\n/**\n * Extracts the text content from a CometChat.TextMessage.\n */\nexport function extractMessageText(message: CometChat.TextMessage | null | undefined): string {\n  if (!message) return '';\n  const text = message.getText?.();\n  if (text) return text;\n  // A MediaMessage carries its CAPTION in data.text (set via setCaption()/getCaption()) and has no\n  // getText(). Fall back to it so media-bubble captions (rendered via a nested text-bubble) show up.\n  const data = (message as unknown as { getData?: () => { text?: string } | undefined }).getData?.();\n  return typeof data?.text === 'string' ? data.text : '';\n}\n\n/**\n * Extracts link preview data from message metadata.\n * Path: metadata[\"@injected\"][\"extensions\"][\"link-preview\"][\"links\"]\n */\nexport function extractLinkPreviews(\n  message: CometChat.TextMessage | null | undefined\n): LinkPreviewData[] {\n  if (!message) return [];\n  try {\n    const metadata = message.getMetadata?.();\n    if (!metadata || typeof metadata !== 'object') return [];\n    const injected = (metadata as Record<string, unknown>)['@injected'];\n    if (!injected || typeof injected !== 'object') return [];\n    const extensions = (injected as Record<string, unknown>)['extensions'];\n    if (!extensions || typeof extensions !== 'object') return [];\n    const linkPreview = (extensions as Record<string, unknown>)['link-preview'];\n    if (!linkPreview || typeof linkPreview !== 'object') return [];\n    const links = (linkPreview as Record<string, unknown>)['links'];\n    if (!Array.isArray(links)) return [];\n    return links\n      .filter(\n        (link): link is Record<string, unknown> =>\n          link !== null &&\n          typeof link === 'object' &&\n          typeof (link as Record<string, unknown>)['url'] === 'string'\n      )\n      .map(link => ({\n        url: link['url'] as string,\n        title: typeof link['title'] === 'string' ? link['title'] : undefined,\n        description: typeof link['description'] === 'string' ? link['description'] : undefined,\n        image: typeof link['image'] === 'string' ? link['image'] : undefined,\n        favicon: typeof link['favicon'] === 'string' ? link['favicon'] : undefined,\n      }));\n  } catch {\n    return [];\n  }\n}\n\n/**\n * Extracts translation text from message metadata.\n * Path: metadata[\"translated_message\"]\n * If translatedTextOverride is provided, it takes precedence.\n */\nexport function extractTranslation(\n  message: CometChat.TextMessage | null | undefined,\n  translatedTextOverride?: string\n): string {\n  if (translatedTextOverride && typeof translatedTextOverride === 'string') {\n    return translatedTextOverride;\n  }\n  if (!message) return '';\n  try {\n    const metadata = message.getMetadata?.();\n    if (!metadata || typeof metadata !== 'object') return '';\n    const translatedMessage = (metadata as Record<string, unknown>)['translated_message'];\n    return typeof translatedMessage === 'string' ? translatedMessage : '';\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Extracts mentioned users from a CometChat.TextMessage.\n */\nexport function extractMentionedUsers(\n  message: CometChat.TextMessage | null | undefined\n): CometChat.User[] {\n  if (!message) return [];\n  try {\n    const mentionedUsers = message.getMentionedUsers?.();\n    return Array.isArray(mentionedUsers) ? mentionedUsers : [];\n  } catch {\n    return [];\n  }\n}\n\n/**\n * Extracts rich text HTML from message metadata — ONLY as a fallback when\n * message.getText() is empty. Text is always the primary rendering source.\n * Path: metadata.richText.html (when metadata.richText.hasFormatting is true)\n */\nexport function extractRichTextHtml(\n  message: CometChat.TextMessage | null | undefined\n): string {\n  if (!message) return '';\n  // Primary source is always getText() — only use metadata when text is absent\n  const text = (message as CometChat.TextMessage).getText?.();\n  if (text && text.trim().length > 0) return '';\n  try {\n    const metadata = message.getMetadata?.();\n    if (!metadata || typeof metadata !== 'object') return '';\n    const richText = (metadata as Record<string, unknown>)['richText'];\n    if (!richText || typeof richText !== 'object') return '';\n    const richTextObj = richText as Record<string, unknown>;\n    if (richTextObj['hasFormatting'] !== true) return '';\n    const html = richTextObj['html'];\n    return typeof html === 'string' && html.trim() !== '' ? html : '';\n  } catch {\n    return '';\n  }\n}\n\n// ── Emoji Detection ───────────────────────────────────────────────────────\n\n/**\n * Detects if the message text is a single emoji (including complex sequences).\n */\nexport function detectSingleEmoji(text: string): boolean {\n  if (!text || typeof text !== 'string') return false;\n  const trimmedText = text.trim();\n  if (trimmedText.length === 0) return false;\n\n  const emojiRegex =\n    /^(?:\\p{Extended_Pictographic}(?:\\p{Emoji_Modifier}|\\uFE0F|\\u200D\\p{Extended_Pictographic})*|\\p{Regional_Indicator}{2}|[0-9#*]\\uFE0F?\\u20E3)$/u;\n  if (emojiRegex.test(trimmedText)) return true;\n\n  if (typeof Intl !== 'undefined' && Intl.Segmenter) {\n    try {\n      const segmenter = new Intl.Segmenter('en', { granularity: 'grapheme' });\n      const segments = Array.from(segmenter.segment(trimmedText));\n      if (segments.length !== 1) return false;\n      const segment = segments[0].segment;\n      return (\n        /^\\p{Extended_Pictographic}/u.test(segment) ||\n        /^\\p{Regional_Indicator}{2}$/u.test(segment) ||\n        /^[0-9#*]\\uFE0F?\\u20E3$/u.test(segment)\n      );\n    } catch { /* fall through */ }\n  }\n\n  const complexEmojiRegex =\n    /^(?:(?:\\p{Extended_Pictographic}|\\p{Regional_Indicator}{2})(?:\\p{Emoji_Modifier}|\\uFE0F)?(?:\\u200D(?:\\p{Extended_Pictographic}|\\p{Regional_Indicator}{2})(?:\\p{Emoji_Modifier}|\\uFE0F)?)*|[0-9#*]\\uFE0F?\\u20E3)$/u;\n  return complexEmojiRegex.test(trimmedText);\n}\n\n/**\n * Detects single emoji in rich text content (strips wrapping <p> tags first).\n */\nexport function detectSingleEmojiInRichText(html: string): boolean {\n  if (!html) return false;\n  const stripped = html.replace(/^<p>(.*)<\\/p>$/s, '$1').trim();\n  if (stripped === html || /<[^>]+>/.test(stripped)) return false;\n  return detectSingleEmoji(stripped);\n}\n\n// ── Text Processing ───────────────────────────────────────────────────────\n\n/**\n * Strips invalid mention formats from text.\n * Removes <@{name}:{display}> patterns that are not valid SDK format.\n */\nexport function stripInvalidMentionFormats(text: string): string {\n  if (!text || typeof text !== 'string') return '';\n  const invalidMentionRegex = /<@(?!uid:|all:)[^>]+>/g;\n  return text.replace(invalidMentionRegex, '');\n}\n\n/**\n * Extracts the domain from a URL.\n */\nexport function getDomainFromUrl(url: string): string {\n  try {\n    return new URL(url).hostname;\n  } catch {\n    return '';\n  }\n}\n\n/**\n * Converts a subset of markdown syntax to HTML.\n * Handles: inline code, bold, italic, underline, strikethrough, and markdown links.\n * Shared utility used by CometChatConversationItem subtitle rendering.\n */\nexport function convertMarkdownToHtml(text: string): string {\n  if (!text) return '';\n  let r = text;\n  r = r.replace(/`([^`]+)`/g, '<code>$1</code>');\n  r = r.replace(/\\*\\*([^*]+)\\*\\*/g, '<strong>$1</strong>');\n  r = r.replace(/(?<!\\*)\\*(?!\\*)([^*]+)\\*(?!\\*)/g, '<em>$1</em>');\n  r = r.replace(/__([^_]+)__/g, '<u>$1</u>');\n  r = r.replace(/(?<!_)_(?!_)([^_]+)_(?!_)/g, '<em>$1</em>');\n  r = r.replace(/~~([^~]+)~~/g, '<s>$1</s>');\n  r = r.replace(/\\[([^\\]]+)\\]\\((https?:\\/\\/[^)]+)\\)/g, '<a href=\"$2\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"cometchat-link\">$1</a>');\n  return r;\n}\n","/**\n * CometChatTextBubble Component\n *\n * Renders text messages with rich formatting: link previews, translations,\n * mentions, URL detection, rich text, content truncation, and single emoji display.\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  AfterViewInit,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  ViewChild,\n  ElementRef,\n  inject,\n  computed,\n  signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { MessageBubbleAlignment, MouseEventSource } from '../../Enums/Enums';\nimport { CometChatUIEvents } from '../../events/CometChatUIEvents';\nimport { CometChatTextFormatter } from '../../formatters/cometchat-text-formatter';\nimport { CometChatMentionsFormatter } from '../../formatters/cometchat-mentions-formatter';\nimport { FormatterConfigService } from '../../services/formatter-config.service';\nimport { HtmlSanitizerService } from '../../services/html-sanitizer.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport type { LinkPreviewData } from './cometchat-text-bubble.types';\nimport {\n  extractMessageText,\n  extractLinkPreviews,\n  extractTranslation,\n  extractMentionedUsers,\n  extractRichTextHtml,\n  detectSingleEmoji,\n  detectSingleEmojiInRichText,\n  stripInvalidMentionFormats,\n  getDomainFromUrl,\n} from './cometchat-text-bubble.utils';\n\n// Re-export for backward compatibility\nexport type { LinkPreviewData } from './cometchat-text-bubble.types';\n\n@Component({\n  selector: 'cometchat-text-bubble',\n  standalone: true,\n  templateUrl: './cometchat-text-bubble.component.html',\n  styleUrls: ['./cometchat-text-bubble.component.css'],\n  imports: [CommonModule, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatTextBubbleComponent implements OnInit, OnChanges, AfterViewInit {\n  // ── GlobalConfig Priority System ──────────────────────────────────────────\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n  private textFormattersExplicitlySet = signal(false);\n  private _textFormatters = signal<CometChatTextFormatter[]>([]);\n\n  // ── Inputs ────────────────────────────────────────────────────────────────\n  @Input({ required: true }) message!: CometChat.TextMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[] | undefined) {\n    if (value != null) { this._textFormatters.set(value); this.textFormattersExplicitlySet.set(true); }\n  }\n  get textFormatters(): CometChatTextFormatter[] { return this._textFormatters(); }\n\n  @Input() translatedTextOverride?: string;\n\n  // ── Outputs ───────────────────────────────────────────────────────────────\n  @Output() linkClick = new EventEmitter<string>();\n  @Output() mentionClick = new EventEmitter<CometChat.User>();\n\n  // ── Effective Values (GlobalConfig Priority) ──────────────────────────────\n  effectiveTextFormatters = computed(() => {\n    if (this.textFormattersExplicitlySet()) return this._textFormatters();\n    if (this.globalConfig?.textFormatters !== undefined) return this.globalConfig.textFormatters;\n    return [];\n  });\n\n  // ── View References ───────────────────────────────────────────────────────\n  @ViewChild('contentElement', { read: ElementRef }) contentElement?: ElementRef<HTMLElement>;\n\n  // ── Internal State ────────────────────────────────────────────────────────\n  protected messageText = '';\n  protected formattedText = '';\n  protected translatedText = '';\n  protected formattedTranslatedText = '';\n  protected linkPreviews: LinkPreviewData[] = [];\n  protected isSingleEmoji = false;\n  protected isContentTruncated = false;\n  protected isExpanded = false;\n  protected contentHeight = 0;\n  protected mentionedUsers: CometChat.User[] = [];\n  protected isOutgoing = false;\n  protected isRichText = false;\n\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  constructor(\n    private sanitizer: DomSanitizer,\n    private cdr: ChangeDetectorRef,\n    private formatterConfig: FormatterConfigService,\n    private htmlSanitizer: HtmlSanitizerService\n  ) {}\n\n  // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n  ngOnInit(): void {\n    this.initializeTextFormatters().then(() => this.processMessage());\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment'] || changes['translatedTextOverride']) {\n      this.processMessage();\n    }\n  }\n\n  ngAfterViewInit(): void {\n    this.checkContentTruncation();\n  }\n\n  // ── Initialization ────────────────────────────────────────────────────────\n\n  private async initializeTextFormatters(): Promise<void> {\n    let loggedInUser: CometChat.User | null = null;\n    try { loggedInUser = await CometChat.getLoggedinUser(); } catch {\n      CometChatLogger.warn('CometChatTextBubble', 'Could not get logged-in user for formatter context');\n    }\n    const formatters = this.effectiveTextFormatters();\n    if (!formatters || formatters.length === 0) {\n      if (loggedInUser) {\n        this._textFormatters.set(this.formatterConfig.getFormattersWithContext(loggedInUser, this.alignment));\n      }\n    } else {\n      formatters.forEach(formatter => {\n        if (formatter instanceof CometChatMentionsFormatter) {\n          if (loggedInUser) { formatter.setLoggedInUser(loggedInUser); }\n          formatter.setMessageBubbleAlignment(this.alignment);\n          if (this.message) {\n            const mentioned = this.message.getMentionedUsers?.() || [];\n            if (mentioned.length > 0) { formatter.setUsers(mentioned); }\n          }\n        }\n      });\n    }\n    // ENG-35075: Re-process the message after async formatter init so that\n    // markdown formatting (bold, italic, etc.) is applied on the first render.\n    // Without this, processMessage() runs before formatters are ready and\n    // returns raw markdown syntax instead of rendered HTML.\n    this.processMessage();\n  }\n\n  // ── Message Processing ────────────────────────────────────────────────────\n\n  private processMessage(): void {\n    if (!this.message) return;\n    this.messageText = extractMessageText(this.message);\n    this.linkPreviews = extractLinkPreviews(this.message);\n    this.translatedText = extractTranslation(this.message, this.translatedTextOverride);\n    this.mentionedUsers = extractMentionedUsers(this.message);\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n\n    const richTextHtml = extractRichTextHtml(this.message);\n    this.isRichText = richTextHtml.length > 0;\n\n    if (this.isRichText) {\n      this.isSingleEmoji = detectSingleEmojiInRichText(richTextHtml);\n      // Apply text formatters to rich text HTML as well (for custom formatters like hashtags)\n      const sanitized = this.sanitizeHtml(richTextHtml);\n      this.formattedText = this.applyFormattersToParsedHtml(sanitized);\n    } else {\n      this.isSingleEmoji = detectSingleEmoji(this.messageText);\n      this.formattedText = this.applyTextFormatters(this.messageText);\n    }\n\n    this.formattedTranslatedText = this.translatedText\n      ? this.applyTextFormatters(this.translatedText)\n      : '';\n\n    this.cdr.markForCheck();\n  }\n\n  // ── Text Formatting ───────────────────────────────────────────────────────\n\n  private sanitizeHtml(html: string): string {\n    if (!html || typeof html !== 'string' || html.trim() === '') return '';\n    return this.htmlSanitizer.sanitize(html);\n  }\n\n  private applyTextFormatters(text: string): string {\n    if (!text || typeof text !== 'string') return '';\n    const escapedText = this.htmlSanitizer.escapeUserHtml(text);\n    const formatters =\n      this._textFormatters().length > 0 ? this._textFormatters() : this.effectiveTextFormatters();\n    if (!formatters || formatters.length === 0) {\n      return this.sanitizeHtml(stripInvalidMentionFormats(escapedText));\n    }\n    let formattedText = escapedText;\n    for (const formatter of formatters) {\n      try {\n        if (!formatter.shouldFormat(formattedText, this.message)) continue;\n        if (formatter instanceof CometChatMentionsFormatter) {\n          const result = formatter.hasSdkMentions(formattedText)\n            ? formatter.formatSdkMentions(formattedText, this.mentionedUsers)\n            : formatter.format(formattedText);\n          if (typeof result === 'string') { formattedText = result; }\n        } else {\n          const result = formatter.format(formattedText);\n          if (typeof result === 'string') { formattedText = result; }\n        }\n      } catch (error) {\n        CometChatLogger.warn('CometChatTextBubble', 'Error applying text formatter', error);\n      }\n    }\n    return this.sanitizeHtml(stripInvalidMentionFormats(formattedText));\n  }\n\n  /**\n   * Applies non-mentions formatters to already-sanitized rich text HTML.\n   * Only processes text nodes (content outside of HTML tags) to avoid\n   * breaking existing markup. Mentions formatter is skipped since rich text\n   * already has mentions rendered.\n   */\n  private applyFormattersToParsedHtml(html: string): string {\n    const formatters =\n      this._textFormatters().length > 0 ? this._textFormatters() : this.effectiveTextFormatters();\n    if (!formatters || formatters.length === 0) return html;\n\n    // Only apply non-mentions formatters to text segments between HTML tags\n    const nonMentionsFormatters = formatters.filter(\n      f => !(f instanceof CometChatMentionsFormatter)\n    );\n    if (nonMentionsFormatters.length === 0) return html;\n\n    // Split HTML into tags and text segments, only format text segments\n    return html.replace(/([^<]+)(?=<|$)/g, (textSegment) => {\n      let result = textSegment;\n      for (const formatter of nonMentionsFormatters) {\n        try {\n          if (!formatter.shouldFormat(result)) continue;\n          const formatted = formatter.format(result);\n          if (typeof formatted === 'string') result = formatted;\n        } catch { /* skip formatter errors */ }\n      }\n      return result;\n    });\n  }\n\n  // ── Content Truncation ────────────────────────────────────────────────────\n\n  private checkContentTruncation(): void {\n    if (!this.contentElement?.nativeElement) { this.isContentTruncated = false; return; }\n    const element = this.contentElement.nativeElement;\n    this.contentHeight = element.scrollHeight;\n    this.isContentTruncated = this.contentHeight > 80;\n    this.cdr.markForCheck();\n  }\n\n  // ── Event Handlers ────────────────────────────────────────────────────────\n\n  protected toggleReadMore(): void {\n    this.isExpanded = !this.isExpanded;\n    this.cdr.markForCheck();\n  }\n\n  protected onLinkPreviewClick(url: string): void {\n    if (url) { window.open(url, '_blank', 'noopener,noreferrer'); this.linkClick.emit(url); }\n  }\n\n  protected onMentionClick(user: CometChat.User): void {\n    if (user) {\n      this.mentionClick.emit(user);\n      CometChatUIEvents.ccMouseEvent.next({\n        event: new MouseEvent('click'),\n        source: MouseEventSource.mentions,\n        body: { CometChatUserGroupMembersObject: user },\n      });\n    }\n  }\n\n  protected onTextContentClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement;\n    if (!target) return;\n\n    if (target.tagName === 'A' && target.classList.contains('cometchat-link')) {\n      event.preventDefault(); event.stopPropagation();\n      const url = target.getAttribute('href');\n      if (url) {\n        this.linkClick.emit(url);\n        window.open(url, '_blank', 'noopener,noreferrer');\n      }\n      return;\n    }\n\n    if (target.classList.contains('cometchat-mentions')) {\n      event.preventDefault(); event.stopPropagation();\n      const uid = target.getAttribute('data-uid');\n      const mentionType = target.getAttribute('data-mention-type');\n      if (mentionType === 'channel' || uid === 'all') return;\n      if (uid && this.mentionedUsers.length > 0) {\n        const user = this.mentionedUsers.find(u => u.getUid() === uid);\n        if (user) { this.onMentionClick(user); }\n      }\n    }\n  }\n\n  // ── Template Utilities ────────────────────────────────────────────────────\n\n  protected getDomainFromUrl(url: string): string {\n    return getDomainFromUrl(url);\n  }\n}\n","<!--\n  CometChatTextBubble Template\n\n  Renders text messages with rich formatting capabilities including:\n  - Link previews\n  - Message translations\n  - Mentions formatting\n  - URL detection\n  - Content truncation with read more/less\n  - Single emoji display\n\n  @see Requirements 14.1, 14.5\n-->\n\n<div\n  class=\"cometchat-text-bubble\"\n  [class.cometchat-text-bubble-incoming]=\"alignment === MessageBubbleAlignment.left\"\n  [class.cometchat-text-bubble-outgoing]=\"alignment === MessageBubbleAlignment.right\"\n  [class.cometchat-text-bubble--single-emoji]=\"isSingleEmoji\"\n  [class.cometchat-text-bubble--truncated]=\"isContentTruncated && !isExpanded\"\n  [class.cometchat-text-bubble--expanded]=\"isExpanded\"\n  [class.cometchat-text-bubble--has-link-preview]=\"linkPreviews.length > 0\"\n>\n  <!-- Link Previews Section -->\n  <!-- Matches React UIKit LinkPreview component structure -->\n  @if (linkPreviews.length > 0) {\n    <div class=\"cometchat-text-bubble__link-preview-container\">\n      @for (preview of linkPreviews; track preview.url) {\n        <div\n          class=\"cometchat-text-bubble__link-preview\"\n          role=\"article\"\n          [attr.aria-label]=\"'Link preview for ' + getDomainFromUrl(preview.url)\"\n          tabindex=\"0\"\n          (click)=\"onLinkPreviewClick(preview.url)\"\n          (keydown.enter)=\"onLinkPreviewClick(preview.url)\"\n          (keydown.space)=\"onLinkPreviewClick(preview.url)\"\n        >\n          <!-- Preview Image (shown at top when available) -->\n          @if (preview.image) {\n            <div class=\"cometchat-text-bubble__link-preview-image-container\">\n              <img\n                class=\"cometchat-text-bubble__link-preview-image\"\n                [src]=\"preview.image\"\n                [alt]=\"preview.title || 'Link preview image'\"\n                loading=\"lazy\"\n              />\n            </div>\n          }\n\n          <!-- Preview Content Body -->\n          <div class=\"cometchat-text-bubble__link-preview-content\">\n            <!-- Text content (title, description, domain) -->\n            <div class=\"cometchat-text-bubble__link-preview-text\">\n              @if (preview.title) {\n                <span class=\"cometchat-text-bubble__link-preview-title\">\n                  {{ preview.title }}\n                </span>\n              }\n\n              @if (preview.description) {\n                <span class=\"cometchat-text-bubble__link-preview-description\">\n                  {{ preview.description }}\n                </span>\n              }\n\n              <span class=\"cometchat-text-bubble__link-preview-domain\">\n                {{ getDomainFromUrl(preview.url) }}\n              </span>\n            </div>\n\n            <!-- Large favicon on right side when no image -->\n            @if (preview.favicon && !preview.image) {\n              <img\n                class=\"cometchat-text-bubble__link-preview-favicon-large\"\n                [src]=\"preview.favicon\"\n                alt=\"\"\n                loading=\"lazy\"\n              />\n            }\n          </div>\n        </div>\n      }\n    </div>\n  }\n\n  <!-- Translation Section -->\n  <!-- TODO: Task 9 - Implement translation display -->\n  @if (translatedText) {\n    <div class=\"cometchat-text-bubble__translation-container\">\n      <!-- Original Text -->\n      <div\n        class=\"cometchat-text-bubble__text\"\n        [innerHTML]=\"formattedText\"\n        (click)=\"onTextContentClick($event)\"\n      ></div>\n\n      <!-- Separator -->\n      <div class=\"cometchat-text-bubble__translation-separator\"></div>\n\n      <!-- Translation Label -->\n      <span class=\"cometchat-text-bubble__translation-label\">\n        {{ 'text_bubble_translated_message' | translate }}\n      </span>\n\n      <!-- Translated Text -->\n      <div\n        class=\"cometchat-text-bubble__translation-text\"\n        [innerHTML]=\"formattedTranslatedText\"\n        (click)=\"onTextContentClick($event)\"\n      ></div>\n    </div>\n  } @else {\n    <!-- Main Text Content -->\n    <div class=\"cometchat-text-bubble__content\" #contentElement>\n      <div\n        class=\"cometchat-text-bubble__text\"\n        [class.cometchat-text-bubble__text--truncated]=\"isContentTruncated && !isExpanded\"\n        [innerHTML]=\"formattedText\"\n        (click)=\"onTextContentClick($event)\"\n      ></div>\n    </div>\n  }\n\n  <!-- Read More/Less Controls -->\n  <!-- TODO: Task 10 - Implement read more/less functionality -->\n  @if (isContentTruncated) {\n    <div class=\"cometchat-text-bubble__read-more\">\n      <button\n        type=\"button\"\n        class=\"cometchat-text-bubble__read-more-button\"\n        [attr.aria-label]=\"isExpanded ? 'Show less' : 'Read more'\"\n        [attr.aria-expanded]=\"isExpanded\"\n        (click)=\"toggleReadMore()\"\n        (keydown.enter)=\"toggleReadMore()\"\n        (keydown.space)=\"toggleReadMore(); $event.preventDefault()\"\n      >\n        @if (isExpanded) {\n          {{ 'text_bubble_show_less' | translate }}\n        } @else {\n          {{ 'text_bubble_read_more' | translate }}\n        }\n      </button>\n    </div>\n  }\n</div>\n","/**\n * CometChatTextBubble Public API\n *\n * Exports the CometChatTextBubble component and related interfaces\n * for use in other modules.\n *\n * @module components/cometchat-text-bubble\n * @see Requirements 14.2\n */\n\nexport { CometChatTextBubbleComponent } from './cometchat-text-bubble.component';\nexport type { LinkPreviewData } from './cometchat-text-bubble.component';\nexport { MessageBubbleAlignment } from '../../Enums/Enums';\n","/**\n * Shared helpers for the render-only card path.\n *\n * A raw card payload from the SDK — a developer card's `getCard()`, an agent-card\n * element's `value.card`, or a streamed `card` event — is serialized verbatim and\n * handed to the `CometChatCardView` renderer. These utilities centralize the\n * \"is it empty\" and \"stringify\" rules so every card surface treats payloads\n * identically (developer bubble, AI-assistant bubble, streaming bubble).\n */\n\n/** True when the raw card payload has nothing drawable (null, blank string, or empty object). */\nexport function isEmptyCardPayload(card: unknown): boolean {\n  if (card == null) return true;\n  if (typeof card === 'string') return card.trim().length === 0;\n  if (typeof card === 'object') return Object.keys(card as object).length === 0;\n  return false;\n}\n\n/** Serializes a raw card payload to the renderer's `cardJson` string, or `''` when empty. */\nexport function cardPayloadToJson(card: unknown): string {\n  if (isEmptyCardPayload(card)) return '';\n  return typeof card === 'string' ? card : JSON.stringify(card);\n}\n\n/** Runs an SDK string getter, coercing a thrown error or null/undefined to `''`. */\nexport function safeString(fn: () => string | undefined | null): string {\n  try {\n    return fn() ?? '';\n  } catch {\n    return '';\n  }\n}\n","/**\n * CometChatCardBubble Component.\n *\n * First-party, built-in bubble for persisted **developer cards**\n * (`message.category === \"card\"`). Mirrors `CometChatTextBubble`'s role as a\n * standard message bubble — the message-bubble wrapper supplies the container,\n * receipts, reactions, long-press options, reply and thread; this component only\n * replaces the *content view* with the rendered card.\n *\n * Render-only contract: the raw card payload from `getCard()` is stringified and\n * handed to the prebuilt `CometChatCardView` renderer verbatim (zero transformation).\n * The renderer's action callback is wired declaratively via `(action)`, which\n * Angular subscribes at view-creation time — i.e. *before* `[cardJson]` is\n * assigned — satisfying the \"callback before schema\" requirement.\n *\n * Actions are pure-forwarded on BOTH channels: the `(onCardAction)`\n * `@Output()` (for apps that render this bubble directly) and the global\n * `CometChatMessageEvents.ccCardActionClicked` bus (for the standard, internally\n * rendered flow). The bubble itself implements no action behavior.\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  input,\n  computed,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatCardViewComponent } from '@cometchat/cards-angular';\nimport type {\n  CometChatCardActionEvent,\n  CometChatCardThemeMode,\n  CometChatCardThemeOverride,\n} from '@cometchat/cards-angular';\n\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { cardPayloadToJson, safeString } from '../../utils/card-utils';\n\n/** Payload emitted by the bubble's `onCardAction` output. */\nexport interface CardBubbleAction {\n  message: CometChat.CardMessage;\n  action: unknown;\n}\n\n@Component({\n  selector: 'cometchat-card-bubble',\n  standalone: true,\n  templateUrl: './cometchat-card-bubble.component.html',\n  styleUrls: ['./cometchat-card-bubble.component.css'],\n  imports: [CometChatCardViewComponent, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCardBubbleComponent {\n  /** The developer card message to render. */\n  readonly message = input.required<CometChat.CardMessage>();\n\n  /** Theme mode passed straight to the renderer. */\n  @Input() themeMode: CometChatCardThemeMode = 'auto';\n\n  /** Optional renderer theme overrides. */\n  @Input() themeOverride?: CometChatCardThemeOverride;\n\n  /** Pure-forward of the raw renderer action (developer-card prop channel). */\n  @Output() onCardAction = new EventEmitter<CardBubbleAction>();\n\n  /** Stringified raw card payload (`''` when there is nothing drawable). */\n  protected readonly cardJson = computed(() => {\n    let card: unknown;\n    try {\n      card = this.message().getCard?.();\n    } catch {\n      card = undefined;\n    }\n    return cardPayloadToJson(card);\n  });\n\n  /** Whether a non-empty card payload is present. */\n  protected readonly hasCard = computed(() => this.cardJson() !== '');\n\n  /**\n   * Single-line fallback for the empty/invalid-payload case:\n   * `getFallbackText()` → `getText()` → \"Card Message\". Lazy — the template only\n   * reads it when `hasCard()` is false.\n   */\n  protected readonly fallbackText = computed(\n    () =>\n      safeString(() => this.message().getFallbackText?.()) ||\n      safeString(() => this.message().getText?.())\n  );\n\n  /**\n   * Forwards the raw renderer action on BOTH channels. The bubble runs\n   * no behavior of its own. Apps should act on one channel only to avoid\n   * double-handling (a stable messageId is available for dedupe).\n   */\n  protected handleAction(event: CometChatCardActionEvent): void {\n    const action = event?.action;\n    this.onCardAction.emit({ message: this.message(), action });\n    CometChatMessageEvents.ccCardActionClicked.next({\n      message: this.message(),\n      action,\n      elementId: event?.elementId,\n      cardJson: event?.cardJson,\n    });\n  }\n}\n","<div class=\"cometchat-card-bubble\">\n  @if (hasCard()) {\n    <cometchat-card-view\n      class=\"cometchat-card-bubble__card\"\n      [cardJson]=\"cardJson()\"\n      [themeMode]=\"themeMode\"\n      [themeOverride]=\"themeOverride\"\n      (action)=\"handleAction($event)\"\n    ></cometchat-card-view>\n  } @else {\n    <div class=\"cometchat-card-bubble__fallback\">\n      {{ fallbackText() || ('card_message' | translate) }}\n    </div>\n  }\n</div>\n","/**\n * CometChatCardBubble Public API (Card Messages).\n *\n * @module components/cometchat-card-bubble\n */\n\nexport { CometChatCardBubbleComponent } from './cometchat-card-bubble.component';\nexport type { CardBubbleAction } from './cometchat-card-bubble.component';\nexport { MessageBubbleAlignment } from '../../Enums/Enums';\n","/**\n * Shared Media Bubble Utilities\n *\n * Extracted from cometchat-image-bubble and cometchat-video-bubble to consolidate\n * duplicate attachment extraction, caption extraction, sender info extraction,\n * and layout determination logic (~36 + 31 + 21 + 21 shared lines).\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from './CometChatLogger';\nimport { MediaAttachment, MediaLayoutType } from '../modals/MediaAttachment';\n\n/**\n * Extracts media attachments from a CometChat message.\n *\n * @param message - The CometChat media message\n * @param mediaType - The type of media ('image' or 'video')\n * @param logPrefix - Prefix for warning/error log messages\n * @returns Array of MediaAttachment objects\n */\nexport function extractMediaAttachments(\n  message: CometChat.MediaMessage | null | undefined,\n  mediaType: 'image' | 'video',\n  logPrefix: string\n): MediaAttachment[] {\n  if (!message) {\n    CometChatLogger.warn(logPrefix, 'Message is null or undefined');\n    return [];\n  }\n\n  try {\n    const rawAttachments = message.getAttachments();\n\n    if (!rawAttachments || !Array.isArray(rawAttachments)) {\n      CometChatLogger.warn(logPrefix, 'Message has no attachments or attachments is not an array');\n      return [];\n    }\n\n    // Both the message-level thumbnail and the thumbnail-generation extension describe ONE image, so\n    // they are only meaningful when the message carries a single attachment. Applying them to every\n    // attachment of a batch gave each tile the same displayUrl, so the grid rendered the same picture\n    // repeated instead of the distinct images that were sent. A batch attachment falls back to its\n    // OWN thumbnail, then its own full url.\n    const isSingleAttachment = rawAttachments.length === 1;\n\n    // Thumbnail may be stored at message metadata level (e.g. from mock data or some SDK versions)\n    const messageMeta = (message as any).getMetadata?.() || {};\n    const messageLevelThumbnail: string | undefined =\n      isSingleAttachment && typeof messageMeta?.thumbnail === 'string' ? messageMeta.thumbnail : undefined;\n\n    // CometChat Thumbnail Generation extension stores compressed URLs in:\n    //   metadata[\"@injected\"][\"extensions\"][\"thumbnail-generation\"][\"url_medium\"] (images)\n    //   metadata[\"@injected\"][\"extensions\"][\"thumbnail-generation\"][\"url_small\"]  (videos)\n    const thumbnailGenExt = messageMeta?.['@injected']?.['extensions']?.['thumbnail-generation'];\n    const extensionThumbnailUrl: string | undefined = !isSingleAttachment\n      ? undefined\n      : mediaType === 'image'\n        ? (typeof thumbnailGenExt?.['url_medium'] === 'string' ? thumbnailGenExt['url_medium'] : undefined)\n        : (typeof thumbnailGenExt?.['url_small'] === 'string' ? thumbnailGenExt['url_small'] : undefined);\n\n    const mediaAttachments: MediaAttachment[] = [];\n\n    for (let i = 0; i < rawAttachments.length; i++) {\n      const attachment = rawAttachments[i];\n\n      if (!attachment || typeof attachment !== 'object') {\n        CometChatLogger.warn(logPrefix, `Attachment at index ${i} is invalid (not an object)`);\n        continue;\n      }\n\n      const url = (attachment as any).url || (attachment as any).getUrl?.();\n      if (!url || typeof url !== 'string') {\n        CometChatLogger.warn(logPrefix, `Attachment at index ${i} is missing URL, skipping`);\n        continue;\n      }\n\n      const rawThumbnail = (attachment as any).thumbnail || (attachment as any).getThumbnail?.();\n      const thumbnail =\n        rawThumbnail && typeof rawThumbnail === 'string'\n          ? rawThumbnail\n          : messageLevelThumbnail;\n\n      const metadata = (attachment as any).metadata || {};\n\n      const mediaAttachment: MediaAttachment = {\n        url,\n        type: mediaType,\n        // displayUrl: use extension thumbnail (low-quality) for bubble display.\n        // Falls back to attachment-level thumbnail, then message-level thumbnail, then full url.\n        // The fullscreen viewer always uses `url` (full quality) — never displayUrl.\n        displayUrl: extensionThumbnailUrl ?? (thumbnail && typeof thumbnail === 'string' ? thumbnail : undefined) ?? url,\n        thumbnail: thumbnail && typeof thumbnail === 'string' ? thumbnail : undefined,\n        width: typeof metadata.width === 'number' ? metadata.width : undefined,\n        height: typeof metadata.height === 'number' ? metadata.height : undefined,\n        size: typeof metadata.size === 'number' ? metadata.size : undefined,\n        mimeType: typeof metadata.mimeType === 'string' ? metadata.mimeType : undefined,\n        raw: attachment as CometChat.Attachment,\n      };\n\n      // Add duration for video attachments\n      if (mediaType === 'video' && typeof metadata.duration === 'number') {\n        mediaAttachment.duration = metadata.duration;\n      }\n\n      mediaAttachments.push(mediaAttachment);\n    }\n\n    return mediaAttachments;\n  } catch (error) {\n    CometChatLogger.error(logPrefix, 'Error extracting attachments:', error);\n    return [];\n  }\n}\n\n/**\n * Extracts caption text from a CometChat message.\n *\n * Tries getText() first, then falls back to getData()?.text.\n *\n * @param message - The CometChat message\n * @param logPrefix - Prefix for warning log messages\n * @returns The caption string, or empty string if not found\n */\nexport function extractMediaCaption(\n  message: CometChat.MediaMessage | null | undefined,\n  logPrefix: string\n): string {\n  if (!message) {\n    return '';\n  }\n\n  try {\n    const textFromGetText = (message as any).getText?.();\n    if (textFromGetText && typeof textFromGetText === 'string' && textFromGetText.trim() !== '') {\n      return textFromGetText;\n    }\n\n    const data = (message as any).getData?.();\n    if (data && typeof data === 'object') {\n      const textFromData = data.text;\n      if (textFromData && typeof textFromData === 'string' && textFromData.trim() !== '') {\n        return textFromData;\n      }\n    }\n\n    return '';\n  } catch (error) {\n    CometChatLogger.warn(logPrefix, 'Error extracting caption, returning empty string:', error);\n    return '';\n  }\n}\n\n/**\n * Extracts sender name and avatar URL from a CometChat message.\n *\n * @param message - The CometChat message\n * @param logPrefix - Prefix for warning log messages\n * @returns Object with senderName and senderAvatarUrl\n */\nexport function extractSenderInfo(\n  message: CometChat.MediaMessage | null | undefined,\n  logPrefix: string\n): { senderName: string; senderAvatarUrl: string } {\n  if (!message) {\n    return { senderName: '', senderAvatarUrl: '' };\n  }\n\n  try {\n    const sender = (message as any).getSender?.();\n    if (sender) {\n      return {\n        senderName: sender.getName?.() || sender.name || '',\n        senderAvatarUrl: sender.getAvatar?.() || sender.avatar || '',\n      };\n    }\n    return { senderName: '', senderAvatarUrl: '' };\n  } catch (error) {\n    CometChatLogger.warn(logPrefix, 'Error extracting sender info:', error);\n    return { senderName: '', senderAvatarUrl: '' };\n  }\n}\n\n/**\n * Determines the layout type based on attachment count.\n *\n * @param attachmentCount - Number of attachments\n * @returns Object with layoutType and overflowCount\n */\nexport function determineMediaLayout(attachmentCount: number): {\n  layoutType: MediaLayoutType;\n  overflowCount: number;\n} {\n  if (attachmentCount === 1) {\n    return { layoutType: 'single', overflowCount: 0 };\n  } else if (attachmentCount >= 2 && attachmentCount <= 3) {\n    return { layoutType: 'grid', overflowCount: 0 };\n  } else if (attachmentCount === 4) {\n    return { layoutType: 'grid-2x2', overflowCount: 0 };\n  } else if (attachmentCount > 4) {\n    return { layoutType: 'overflow', overflowCount: attachmentCount - 4 };\n  }\n  // attachmentCount === 0\n  return { layoutType: 'single', overflowCount: 0 };\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  NgZone,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { MediaAttachment, MediaLayoutType } from '../../modals/MediaAttachment';\nimport {\n  extractMediaAttachments,\n  extractMediaCaption,\n  extractSenderInfo,\n  determineMediaLayout,\n} from '../../utils/media-bubble-utils';\nimport { CometChatTextBubbleComponent } from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport { CometChatFullScreenViewerComponent } from '../base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.component';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * CometChatImageBubbleComponent renders image messages with single/multi-image layouts,\n * overflow handling, fullscreen gallery, and keyboard accessibility.\n * @see Requirements 18.1, 18.6\n * @deprecated Prefer {@link CometChatImagesBubbleComponent}, which the message bubble now renders\n * for every image message. This bubble stays public for direct use and remains the internal\n * primitive that the new bubble delegates to.\n */\n@Component({\n  selector: 'cometchat-image-bubble',\n  standalone: true,\n  templateUrl: './cometchat-image-bubble.component.html',\n  styleUrls: ['./cometchat-image-bubble.component.css'],\n  imports: [CommonModule, TranslatePipe, CometChatTextBubbleComponent, CometChatFullScreenViewerComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatImageBubbleComponent implements OnInit, OnChanges, OnDestroy {\n  /** The media message object. @see Requirements 1.1, 1.3, 1.5 */\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n\n  /** LEFT for incoming, RIGHT for outgoing. @see Requirements 1.5, 13.1, 13.2 */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** When true, disables click-to-open fullscreen viewer. @default false */\n  @Input() disableInteraction = false;\n\n  @Output() imageClick = new EventEmitter<{ attachment: MediaAttachment; index: number }>();\n  @Output() viewerOpen = new EventEmitter<void>();\n  @Output() viewerClose = new EventEmitter<void>();\n\n  protected attachments: MediaAttachment[] = [];\n  protected captionText = '';\n  protected isOutgoing = false;\n  protected layoutType: MediaLayoutType = 'single';\n  protected overflowCount = 0;\n  protected showGalleryViewer = false;\n  protected galleryStartIndex = 0;\n  protected senderName = '';\n  protected senderAvatarUrl = '';\n  /** Tracks which attachment indices have finished loading their real image */\n  protected loadedIndices = new Set<number>();\n  /** Tracks which attachment indices failed to load (unsupported / broken / 403) */\n  protected errorIndices = new Set<number>();\n  /**\n   * Indices whose preloader is parked between a failed attempt and its retry. While an index is in\n   * here the preloader is NOT rendered, so re-adding it later builds a FRESH <img> that re-requests\n   * the URL (re-assigning the same src to the existing element would not).\n   */\n  protected reloadingIndices = new Set<number>();\n  /** Failed attempts so far, per index. */\n  private retryCounts = new Map<number, number>();\n  private retryTimers: ReturnType<typeof setTimeout>[] = [];\n\n  /**\n   * A just-sent attachment can 403/404 for a moment before the CDN starts serving it, so the FIRST\n   * load failure is not proof the media is unsupported. Retry once and keep showing the loading\n   * placeholder in between; only a second failure flips the tile to the unsupported glyph.\n   */\n  private static readonly MAX_LOAD_RETRIES = 1;\n  private static readonly RETRY_DELAY_MS = 700;\n\n  /** Path to the placeholder image shown while the real image loads */\n  readonly placeholderSrc = 'assets/image_placeholder.png';\n  /** Glyph shown when the media can't be previewed (unsupported type or unreachable source) */\n  readonly unsupportedSrc = 'assets/unsupported.svg';\n\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {}\n\n  ngOnInit(): void { this.processMessage(); }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) this.processMessage();\n  }\n\n  /** Process the message to extract attachments, caption, and determine layout. */\n  private processMessage(): void {\n    this.attachments = this.extractAttachments();\n    this.captionText = this.extractCaption();\n    this.extractSenderInfo();\n    this.determineAlignment();\n    this.determineLayout();\n    // Reset load state on message change — a pending message being replaced by its sent counterpart\n    // must get a clean slate, otherwise a failure against the pending URL sticks to the real one.\n    this.clearRetryTimers();\n    this.loadedIndices = new Set<number>();\n    this.errorIndices = new Set<number>();\n    this.reloadingIndices = new Set<number>();\n    this.retryCounts.clear();\n    this.cdr.markForCheck();\n  }\n\n  private extractAttachments(): MediaAttachment[] { return extractMediaAttachments(this.message, 'image', 'CometChatImageBubble'); }\n  private extractCaption(): string { return extractMediaCaption(this.message, 'CometChatImageBubble'); }\n\n  private extractSenderInfo(): void {\n    const info = extractSenderInfo(this.message, 'CometChatImageBubble');\n    this.senderName = info.senderName;\n    this.senderAvatarUrl = info.senderAvatarUrl;\n  }\n\n  private determineLayout(): void {\n    const result = determineMediaLayout(this.attachments.length);\n    this.layoutType = result.layoutType;\n    this.overflowCount = result.overflowCount;\n  }\n\n  private determineAlignment(): void { this.isOutgoing = this.alignment === MessageBubbleAlignment.right; }\n\n  protected onImageClick(index: number): void {\n    if (this.disableInteraction) return;\n    if (index < 0 || index >= this.attachments.length) { CometChatLogger.warn('CometChatImageBubble', `Invalid image index: ${index}`); return; }\n    this.imageClick.emit({ attachment: this.attachments[index], index });\n    this.openGalleryViewer(index);\n  }\n\n  protected openGalleryViewer(startIndex: number): void {\n    this.showGalleryViewer = true;\n    this.galleryStartIndex = startIndex;\n    this.viewerOpen.emit();\n    this.cdr.markForCheck();\n  }\n\n  protected closeGalleryViewer(): void {\n    this.showGalleryViewer = false;\n    this.viewerClose.emit();\n    this.cdr.markForCheck();\n  }\n\n  protected getOverflowText(): string {\n    return CometChatLocalize.getLocalizedString('image_bubble_overflow_more').replace('{count}', this.overflowCount.toString());\n  }\n\n  protected onImageKeyDown(event: KeyboardEvent, index: number): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.onImageClick(index); }\n  }\n\n  protected get imageAriaLabel(): string {\n    if (this.captionText) return CometChatLocalize.getLocalizedString('accessibility_image_with_caption').replace('{caption}', this.captionText);\n    return CometChatLocalize.getLocalizedString('accessibility_view_image');\n  }\n\n  protected get overflowAriaLabel(): string {\n    return CometChatLocalize.getLocalizedString('accessibility_show_more_images').replace('{count}', this.overflowCount.toString());\n  }\n\n  protected trackByAttachment(index: number, attachment: MediaAttachment): string { return attachment.url || index.toString(); }\n\n  /**\n   * Whether the hidden preloader should be in the DOM for this index. It runs only while the image\n   * is still unresolved: not loaded, not given up on, and not parked between a failed attempt and\n   * its retry (that gap is what lets the retry mount a fresh <img> and re-request the URL).\n   */\n  protected shouldPreload(index: number): boolean {\n    return (\n      !this.loadedIndices.has(index) &&\n      !this.errorIndices.has(index) &&\n      !this.reloadingIndices.has(index)\n    );\n  }\n\n  /**\n   * Returns the src to display for an image at the given index.\n   * Shows the placeholder until the real image has loaded.\n   */\n  protected getImageSrc(index: number): string {\n    if (this.errorIndices.has(index)) return this.unsupportedSrc;\n    return this.loadedIndices.has(index)\n      ? (this.attachments[index]?.displayUrl ?? this.attachments[index]?.url ?? this.placeholderSrc)\n      : this.placeholderSrc;\n  }\n\n  /**\n   * Called when the real image finishes loading.\n   * Runs inside NgZone so OnPush change detection picks it up immediately.\n   */\n  protected onImageLoad(index: number, event: Event): void {\n    const img = event.target as HTMLImageElement;\n    // Only swap if this is the real image loading (not the placeholder itself)\n    if (img.src && !img.src.endsWith('image_placeholder.png')) {\n      this.ngZone.run(() => {\n        this.loadedIndices = new Set(this.loadedIndices).add(index);\n        this.cdr.markForCheck();\n      });\n    }\n  }\n\n  /**\n   * Called when the real image fails to load (unsupported format, broken/expired link, 403).\n   *\n   * The first failure is NOT treated as \"unsupported\": a freshly-sent attachment routinely 403s for\n   * a moment before the CDN serves it, and flipping straight to the glyph made it flash on screen\n   * before the picture appeared. Park the preloader, rebuild it shortly after so a new <img>\n   * re-requests the URL, and only surface the glyph once that retry has failed too. The loading\n   * placeholder stays visible throughout, so an unresolved image just looks like it is still loading.\n   */\n  protected onImageError(index: number): void {\n    const attempts = this.retryCounts.get(index) ?? 0;\n\n    if (attempts < CometChatImageBubbleComponent.MAX_LOAD_RETRIES) {\n      this.retryCounts.set(index, attempts + 1);\n      this.ngZone.run(() => {\n        this.reloadingIndices = new Set(this.reloadingIndices).add(index);\n        this.cdr.markForCheck();\n      });\n      this.retryTimers.push(\n        setTimeout(() => {\n          this.ngZone.run(() => {\n            const next = new Set(this.reloadingIndices);\n            next.delete(index);\n            this.reloadingIndices = next;\n            this.cdr.markForCheck();\n          });\n        }, CometChatImageBubbleComponent.RETRY_DELAY_MS)\n      );\n      return;\n    }\n\n    this.ngZone.run(() => {\n      this.errorIndices = new Set(this.errorIndices).add(index);\n      this.cdr.markForCheck();\n    });\n  }\n\n  private clearRetryTimers(): void {\n    this.retryTimers.forEach(clearTimeout);\n    this.retryTimers = [];\n  }\n\n  ngOnDestroy(): void {\n    this.clearRetryTimers();\n  }\n}\n","<!-- Image Bubble Component Template -->\n<div \n  class=\"cometchat-image-bubble\"\n  [class.cometchat-image-bubble--incoming]=\"alignment === MessageBubbleAlignment.left\"\n  [class.cometchat-image-bubble--outgoing]=\"alignment === MessageBubbleAlignment.right\"\n  [class.cometchat-image-bubble--single]=\"layoutType === 'single'\"\n  [class.cometchat-image-bubble--grid]=\"layoutType === 'grid'\"\n  [class.cometchat-image-bubble--grid-2x2]=\"layoutType === 'grid-2x2'\"\n  [class.cometchat-image-bubble--overflow]=\"layoutType === 'overflow'\">\n  \n  <!-- Single Image Layout -->\n  <div \n    *ngIf=\"layoutType === 'single' && attachments.length > 0\"\n    class=\"cometchat-image-bubble__container\">\n    <div \n      class=\"cometchat-image-bubble__image-wrapper\"\n      (click)=\"onImageClick(0)\"\n      (keydown)=\"onImageKeyDown($event, 0)\"\n      tabindex=\"0\"\n      role=\"button\"\n      [attr.aria-label]=\"imageAriaLabel\">\n      <!-- Visible image: shows placeholder until real image loads -->\n      <img\n        class=\"cometchat-image-bubble__image\"\n        loading=\"lazy\"\n        [src]=\"getImageSrc(0)\"\n        width=\"300\"\n        height=\"300\"\n        [alt]=\"captionText || ('image_bubble_image_alt' | translate)\" />\n      <!-- Hidden preloader: loads the real image in background, triggers swap on load -->\n      <img\n        *ngIf=\"shouldPreload(0)\"\n        class=\"cometchat-image-bubble__preloader\"\n        [src]=\"attachments[0].displayUrl ?? attachments[0].url\"\n        alt=\"\"\n        aria-hidden=\"true\"\n        (load)=\"onImageLoad(0, $event)\"\n        (error)=\"onImageError(0)\" />\n    </div>\n  </div>\n\n  <!-- Grid Layout (2-3 images) -->\n  <div \n    *ngIf=\"layoutType === 'grid' && attachments.length >= 2 && attachments.length <= 3\"\n    class=\"cometchat-image-bubble__container\">\n    <div \n      class=\"cometchat-image-bubble__grid\"\n      [class.cometchat-image-bubble__grid--two-col]=\"attachments.length === 2\"\n      [class.cometchat-image-bubble__grid--three-col]=\"attachments.length === 3\">\n      <div \n        *ngFor=\"let attachment of attachments; let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-image-bubble__image-wrapper\"\n        (click)=\"onImageClick(i)\"\n        (keydown)=\"onImageKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"imageAriaLabel\">\n        <img\n          class=\"cometchat-image-bubble__image\"\n          [src]=\"getImageSrc(i)\"\n          [alt]=\"captionText || ('image_bubble_image_alt' | translate)\"\n          width=\"150\"\n          height=\"150\" />\n        <img\n          *ngIf=\"shouldPreload(i)\"\n          class=\"cometchat-image-bubble__preloader\"\n          [src]=\"attachment.displayUrl ?? attachment.url\"\n          alt=\"\"\n          aria-hidden=\"true\"\n          (load)=\"onImageLoad(i, $event)\"\n          (error)=\"onImageError(i)\" />\n      </div>\n    </div>\n  </div>\n\n  <!-- 2×2 Grid Layout (4 images) -->\n  <div \n    *ngIf=\"layoutType === 'grid-2x2' && attachments.length === 4\"\n    class=\"cometchat-image-bubble__container\">\n    <div class=\"cometchat-image-bubble__grid cometchat-image-bubble__grid--2x2\">\n      <div \n        *ngFor=\"let attachment of attachments; let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-image-bubble__image-wrapper\"\n        (click)=\"onImageClick(i)\"\n        (keydown)=\"onImageKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"imageAriaLabel\">\n        <img\n          class=\"cometchat-image-bubble__image\"\n          [src]=\"getImageSrc(i)\"\n          [alt]=\"captionText || ('image_bubble_image_alt' | translate)\"\n          width=\"150\"\n          height=\"150\" />\n        <img\n          *ngIf=\"shouldPreload(i)\"\n          class=\"cometchat-image-bubble__preloader\"\n          [src]=\"attachment.displayUrl ?? attachment.url\"\n          alt=\"\"\n          aria-hidden=\"true\"\n          (load)=\"onImageLoad(i, $event)\"\n          (error)=\"onImageError(i)\" />\n      </div>\n    </div>\n  </div>\n\n  <!-- Overflow Layout (>4 images) -->\n  <div \n    *ngIf=\"layoutType === 'overflow' && attachments.length > 4\"\n    class=\"cometchat-image-bubble__container\">\n    <div class=\"cometchat-image-bubble__grid cometchat-image-bubble__grid--overflow\">\n      <!-- First 3 images displayed normally -->\n      <div \n        *ngFor=\"let attachment of attachments.slice(0, 3); let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-image-bubble__image-wrapper\"\n        (click)=\"onImageClick(i)\"\n        (keydown)=\"onImageKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"imageAriaLabel\">\n        <img\n          class=\"cometchat-image-bubble__image\"\n          [src]=\"getImageSrc(i)\"\n          [alt]=\"captionText || ('image_bubble_image_alt' | translate)\"\n          width=\"150\"\n          height=\"150\" />\n        <img\n          *ngIf=\"shouldPreload(i)\"\n          class=\"cometchat-image-bubble__preloader\"\n          [src]=\"attachment.displayUrl ?? attachment.url\"\n          alt=\"\"\n          aria-hidden=\"true\"\n          (load)=\"onImageLoad(i, $event)\"\n          (error)=\"onImageError(i)\" />\n      </div>\n\n      <!-- 4th tile with overflow indicator -->\n      <div \n        class=\"cometchat-image-bubble__overflow-tile\"\n        (click)=\"onImageClick(3)\"\n        (keydown)=\"onImageKeyDown($event, 3)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"overflowAriaLabel\"\n        [style.background-image]=\"'url(' + (attachments[3].displayUrl ?? attachments[3].url) + ')'\">\n        <div class=\"cometchat-image-bubble__overflow-overlay\">\n          <span class=\"cometchat-image-bubble__overflow-text\" aria-hidden=\"true\">\n            {{ getOverflowText() }}\n          </span>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- TODO: Caption (Task 4.5) -->\n  \n  <!-- Caption Rendering -->\n  <div \n    *ngIf=\"captionText\"\n    class=\"cometchat-image-bubble__caption\">\n    <cometchat-text-bubble\n      [message]=\"$any(message)\"\n      [alignment]=\"alignment\">\n    </cometchat-text-bubble>\n  </div>\n</div>\n\n<!-- Fullscreen Viewer (Gallery Mode) -->\n<cometchat-fullscreen-viewer\n  *ngIf=\"showGalleryViewer\"\n  [attachments]=\"attachments\"\n  [startIndex]=\"galleryStartIndex\"\n  [isOpen]=\"showGalleryViewer\"\n  [explicitSenderName]=\"senderName\"\n  [explicitSenderAvatarUrl]=\"senderAvatarUrl\"\n  (closeClick)=\"closeGalleryViewer()\">\n</cometchat-fullscreen-viewer>\n","/**\n * Public API for CometChat Image Bubble Component\n *\n * Exports:\n * - CometChatImageBubbleComponent: Main component for displaying image message bubbles\n *\n * Related types (exported from modals):\n * - MediaAttachment: Interface for media attachment data\n * - MediaLayoutType: Type for layout configuration\n *\n * @see Requirements 18.5\n */\n\nexport { CometChatImageBubbleComponent } from './cometchat-image-bubble.component';\n","/**\n * Utility functions for CometChatVideoBubble component.\n */\n\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * Formats video duration in seconds to display format (M:SS or H:MM:SS).\n *\n * @param seconds - Duration in seconds\n * @returns Formatted duration string, e.g. \"2:05\" or \"1:01:05\"\n */\nexport function formatVideoDuration(seconds: number): string {\n  if (!seconds || seconds < 0 || !isFinite(seconds)) return '0:00';\n\n  const hours = Math.floor(seconds / 3600);\n  const minutes = Math.floor((seconds % 3600) / 60);\n  const secs = Math.floor(seconds % 60);\n\n  if (hours > 0) {\n    return `${hours}:${minutes.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n  }\n  return `${minutes}:${secs.toString().padStart(2, '0')}`;\n}\n\n/**\n * Cleans up Picture-in-Picture resources when the component is destroyed.\n *\n * @param isPipActive - Whether PIP mode is currently active\n * @param videoElement - The hidden PIP video element (or null)\n * @param pipEnterListener - The enterpictureinpicture event listener (or null)\n * @param pipLeaveListener - The leavepictureinpicture event listener (or null)\n */\nexport function cleanupPipResources(\n  isPipActive: boolean,\n  videoElement: HTMLVideoElement | null,\n  pipEnterListener: (() => void) | null,\n  pipLeaveListener: (() => void) | null\n): void {\n  if (isPipActive && (document as any).pictureInPictureElement) {\n    try {\n      (document as any).exitPictureInPicture();\n    } catch (error) {\n      CometChatLogger.warn('CometChatVideoBubble', 'Error exiting PIP on cleanup:', error);\n    }\n  }\n\n  if (videoElement) {\n    if (pipEnterListener) {\n      videoElement.removeEventListener('enterpictureinpicture', pipEnterListener);\n    }\n    if (pipLeaveListener) {\n      videoElement.removeEventListener('leavepictureinpicture', pipLeaveListener);\n    }\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  ViewChild,\n  ElementRef,\n  inject,\n} from '@angular/core';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { MediaAttachment, MediaLayoutType } from '../../modals/MediaAttachment';\nimport {\n  extractMediaAttachments,\n  extractMediaCaption,\n  extractSenderInfo,\n  determineMediaLayout,\n} from '../../utils/media-bubble-utils';\nimport { CometChatTextBubbleComponent } from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport { CometChatFullScreenViewerComponent } from '../base-elements/cometchat-fullscreen-viewer/cometchat-fullscreen-viewer.component';\nimport { MediaControlsService } from '../../services/media-controls.service';\nimport { formatVideoDuration, cleanupPipResources } from './cometchat-video-bubble.utils';\n\n// Re-export types for backward compatibility\nexport type { MediaAttachment, MediaLayoutType } from '../../modals/MediaAttachment';\n\n/**\n * CometChatVideoBubbleComponent displays video messages with single/grid/overflow layouts\n * and fullscreen player integration.\n *\n * @see Requirements 18.2, 18.6\n * @deprecated Prefer {@link CometChatVideosBubbleComponent}, which the message bubble now renders\n * for every video message. This bubble stays public for direct use and remains the internal\n * primitive that the new bubble delegates to.\n */\n@Component({\n  selector: 'cometchat-video-bubble',\n  standalone: true,\n  templateUrl: './cometchat-video-bubble.component.html',\n  styleUrls: ['./cometchat-video-bubble.component.css'],\n  imports: [CommonModule, CometChatTextBubbleComponent, CometChatFullScreenViewerComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatVideoBubbleComponent implements OnInit, OnChanges, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  // ============================================\n  // Inputs\n  // ============================================\n\n  /** The media message containing video attachments. Required. */\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n\n  /** LEFT for incoming, RIGHT for outgoing messages. */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** When true, disables click-to-open fullscreen viewer. */\n  @Input() disableInteraction = false;\n\n  // ============================================\n  // Outputs\n  // ============================================\n\n  /** Emitted when a video thumbnail is clicked. */\n  @Output() videoClick = new EventEmitter<{ attachment: MediaAttachment; index: number }>();\n\n  /** Emitted when the fullscreen video player is opened. */\n  @Output() playerOpen = new EventEmitter<void>();\n\n  /** Emitted when the fullscreen video player is closed. */\n  @Output() playerClose = new EventEmitter<void>();\n\n  // ============================================\n  // Internal State\n  // ============================================\n\n  protected attachments: MediaAttachment[] = [];\n  protected captionText = '';\n  protected isOutgoing = false;\n  protected layoutType: MediaLayoutType = 'single';\n  protected overflowCount = 0;\n  protected showPlayerViewer = false;\n  protected playerStartIndex = 0;\n  protected senderName = '';\n  protected senderAvatarUrl = '';\n  protected failedThumbnails = new Set<number>();\n  /**\n   * Indices parked between a failed thumbnail attempt and its retry. While parked the <video> is not\n   * rendered, so re-adding it mounts a fresh element that re-requests the source.\n   */\n  protected reloadingThumbnails = new Set<number>();\n  /** Failed thumbnail attempts so far, per index. */\n  private thumbnailRetryCounts = new Map<number, number>();\n\n  /**\n   * A just-sent video routinely 403s for a moment before the CDN serves it, so the FIRST failure is\n   * not proof the media is broken. Retry once before falling back to the blank placeholder.\n   */\n  private static readonly MAX_THUMBNAIL_RETRIES = 1;\n  private static readonly THUMBNAIL_RETRY_DELAY_MS = 700;\n\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  // ============================================\n  // Picture-in-Picture State\n  // ============================================\n\n  @ViewChild('pipVideoElement') pipVideoElement?: ElementRef<HTMLVideoElement>;\n  protected isPipActive = false;\n  protected pipVideoUrl = '';\n  private pipEnterListener: (() => void) | null = null;\n  private pipLeaveListener: (() => void) | null = null;\n\n  private mediaControlsService = inject(MediaControlsService);\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  // ============================================\n  // Lifecycle Hooks\n  // ============================================\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) {\n      this.processMessage();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    cleanupPipResources(this.isPipActive, this.pipVideoElement?.nativeElement ?? null,\n      this.pipEnterListener, this.pipLeaveListener);\n    this.pipEnterListener = null;\n    this.pipLeaveListener = null;\n    this.isPipActive = false;\n    this.pipVideoUrl = '';\n  }\n\n  // ============================================\n  // Private Methods\n  // ============================================\n\n  private processMessage(): void {\n    this.attachments = extractMediaAttachments(this.message, 'video', 'CometChatVideoBubble');\n    this.captionText = extractMediaCaption(this.message, 'CometChatVideoBubble');\n    const info = extractSenderInfo(this.message, 'CometChatVideoBubble');\n    this.senderName = info.senderName;\n    this.senderAvatarUrl = info.senderAvatarUrl;\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n    const result = determineMediaLayout(this.attachments.length);\n    this.layoutType = result.layoutType;\n    this.overflowCount = result.overflowCount;\n    // Reset per message. Without this a thumbnail that failed once — e.g. against a pending\n    // message's URL, before the CDN began serving it — stayed blank for the life of the component,\n    // even after the sent message arrived with a perfectly good URL.\n    this.failedThumbnails = new Set<number>();\n    this.reloadingThumbnails = new Set<number>();\n    this.thumbnailRetryCounts.clear();\n    this.cdr.markForCheck();\n  }\n\n  // ============================================\n  // Protected Methods (Template Access)\n  // ============================================\n\n  protected onVideoClick(index: number): void {\n    if (this.disableInteraction) return;\n    if (index < 0 || index >= this.attachments.length) {\n      CometChatLogger.warn('CometChatVideoBubble', `Invalid video index: ${index}`);\n      return;\n    }\n    this.videoClick.emit({ attachment: this.attachments[index], index });\n    this.openPlayerViewer(index);\n  }\n\n  protected openPlayerViewer(startIndex: number): void {\n    this.showPlayerViewer = true;\n    this.playerStartIndex = startIndex;\n    this.playerOpen.emit();\n    this.cdr.markForCheck();\n  }\n\n  protected closePlayerViewer(): void {\n    this.showPlayerViewer = false;\n    this.playerClose.emit();\n    this.cdr.markForCheck();\n  }\n\n  protected getOverflowText(): string {\n    const template = CometChatLocalize.getLocalizedString('video_bubble_overflow_more');\n    return template.replace('{count}', this.overflowCount.toString());\n  }\n\n  protected formatDuration(seconds: number): string {\n    return formatVideoDuration(seconds);\n  }\n\n  // ============================================\n  // Accessibility Methods\n  // ============================================\n\n  protected getThumbnailAriaLabel(index: number): string {\n    const attachment = this.attachments[index];\n    if (!attachment) return CometChatLocalize.getLocalizedString('video_bubble_play_video');\n    // If duration is 0 or unknown, use a generic \"play video\" label\n    if (!attachment.duration) {\n      return CometChatLocalize.getLocalizedString('video_bubble_play_video');\n    }\n    const durationText = this.mediaControlsService.formatTimeForAnnouncement(attachment.duration);\n    return CometChatLocalize.getLocalizedString('accessibility_play_video')\n      .replace('{duration}', durationText);\n  }\n\n  protected getOverflowAriaLabel(): string {\n    return CometChatLocalize.getLocalizedString('accessibility_show_more_videos')\n      .replace('{count}', this.overflowCount.toString());\n  }\n\n  protected onThumbnailKeyDown(event: KeyboardEvent, index: number): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onVideoClick(index);\n    }\n  }\n\n  // ============================================\n  // Picture-in-Picture Methods\n  // ============================================\n\n  protected onPipStateChange(isPipActive: boolean): void {\n    CometChatLogger.debug('CometChatVideoBubble', 'onPipStateChange:', isPipActive);\n    if (isPipActive) {\n      this.isPipActive = true;\n      if (this.attachments.length > 0 && this.playerStartIndex < this.attachments.length) {\n        this.pipVideoUrl = this.attachments[this.playerStartIndex].url;\n      }\n      this.pendingTimers.push(setTimeout(() => {\n        this.showPlayerViewer = false;\n        this.playerClose.emit();\n        this.cdr.markForCheck();\n      }, 150));\n    } else {\n      this.isPipActive = false;\n      this.pipVideoUrl = '';\n      this.cdr.markForCheck();\n    }\n  }\n\n  protected onViewerCloseWithPip(): void {\n    this.showPlayerViewer = false;\n    this.playerClose.emit();\n    this.cdr.markForCheck();\n  }\n\n  protected trackByAttachment(index: number, attachment: MediaAttachment): string {\n    return attachment.url || index.toString();\n  }\n\n  /**\n   * Duration-badge fallback. `attachment.duration` only exists when the backend put it in metadata,\n   * which most messages don't. The thumbnail `<video preload=\"metadata\">` already fetches the file\n   * header, so read the real duration off it rather than downloading anything extra — the React kit\n   * does the same via its `useVideoDuration` hook. Backend metadata always wins when present.\n   */\n  protected onThumbnailMetadata(index: number, event: Event): void {\n    const attachment = this.attachments[index];\n    if (!attachment || attachment.duration) {\n      return;\n    }\n    const duration = (event.target as HTMLVideoElement | null)?.duration;\n    if (typeof duration === 'number' && Number.isFinite(duration) && duration > 0) {\n      attachment.duration = duration;\n      this.cdr.markForCheck();\n    }\n  }\n\n  protected onThumbnailError(index: number, attachment: MediaAttachment): void {\n    // A <video> keeps showing its `poster=` image when the media itself fails to load/decode (403,\n    // unsupported codec, expired URL). So only fall back to the blank placeholder when there is NO\n    // backend poster to preserve — otherwise we'd throw away a perfectly good poster and show a gray\n    // box, which would be a regression vs the old <img [src]=\"displayUrl\">.\n    if (this.getThumbnailPoster(attachment)) {\n      return;\n    }\n    // Don't take the first failure as final — a freshly-sent video 403s briefly before the CDN\n    // serves it. Park the element, remount it shortly after so a new <video> re-requests the source,\n    // and only fall back to the blank placeholder once that retry has failed too.\n    const attempts = this.thumbnailRetryCounts.get(index) ?? 0;\n    if (attempts < CometChatVideoBubbleComponent.MAX_THUMBNAIL_RETRIES) {\n      this.thumbnailRetryCounts.set(index, attempts + 1);\n      this.reloadingThumbnails = new Set(this.reloadingThumbnails).add(index);\n      this.cdr.markForCheck();\n      this.pendingTimers.push(\n        setTimeout(() => {\n          const next = new Set(this.reloadingThumbnails);\n          next.delete(index);\n          this.reloadingThumbnails = next;\n          this.cdr.markForCheck();\n        }, CometChatVideoBubbleComponent.THUMBNAIL_RETRY_DELAY_MS)\n      );\n      return;\n    }\n    this.failedThumbnails.add(index);\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Whether the first-frame <video> should be mounted for this index — i.e. it has not been given up\n   * on and is not parked awaiting a retry (that gap is what lets the retry mount a fresh element).\n   */\n  protected shouldShowThumbnail(index: number): boolean {\n    return !this.failedThumbnails.has(index) && !this.reloadingThumbnails.has(index);\n  }\n\n  /**\n   * Builds the <video> src used to paint a video's FIRST FRAME as the tile thumbnail.\n   *\n   * An <img> cannot decode a video file — that is why the old `<img [src]=\"url\">` tiles were blank\n   * whenever the backend had no generated poster (the img fired an error and fell back to the empty\n   * placeholder). A <video> element paints the frame natively; the `#t=0.1` media fragment tells the\n   * browser to seek to 0.1s and render that frame (supported in Chrome/Firefox/Safari 15+), so we get\n   * a real preview even with no poster — as long as the video URL is reachable in the browser.\n   */\n  protected getThumbnailVideoSrc(attachment: MediaAttachment): string {\n    const src = attachment.url ?? '';\n    if (!src) {\n      return '';\n    }\n    // Media fragments live after any query string; don't double-append if already present.\n    return src.includes('#t=') ? src : `${src}#t=0.1`;\n  }\n\n  /**\n   * Returns a real backend-generated poster (from the Thumbnail Generation extension) when one exists,\n   * so the tile shows it immediately while the video's own first frame decodes. Returns null when the\n   * only `displayUrl` we have is the video file itself (which is NOT a usable poster image).\n   */\n  protected getThumbnailPoster(attachment: MediaAttachment): string | null {\n    const poster = attachment.displayUrl;\n    return poster && poster !== attachment.url ? poster : null;\n  }\n}\n","<!-- Video Bubble Component Template -->\n<div \n  class=\"cometchat-video-bubble\"\n  [class.cometchat-video-bubble--incoming]=\"alignment === MessageBubbleAlignment.left\"\n  [class.cometchat-video-bubble--outgoing]=\"alignment === MessageBubbleAlignment.right\"\n  [class.cometchat-video-bubble--single]=\"layoutType === 'single'\"\n  [class.cometchat-video-bubble--grid]=\"layoutType === 'grid'\"\n  [class.cometchat-video-bubble--grid-2x2]=\"layoutType === 'grid-2x2'\"\n  [class.cometchat-video-bubble--overflow]=\"layoutType === 'overflow'\">\n  \n  <!-- Single Video Layout -->\n  <div \n    *ngIf=\"layoutType === 'single' && attachments.length > 0\"\n    class=\"cometchat-video-bubble__container\">\n    <div \n      class=\"cometchat-video-bubble__video-wrapper\"\n      (click)=\"onVideoClick(0); $event.stopPropagation()\"\n      (keydown)=\"onThumbnailKeyDown($event, 0)\"\n      tabindex=\"0\"\n      role=\"button\"\n      [attr.aria-label]=\"getThumbnailAriaLabel(0)\">\n      <!-- Thumbnail: <video> paints the first frame natively (an <img> can't decode a video file) -->\n      <video\n        *ngIf=\"shouldShowThumbnail(0)\"\n        class=\"cometchat-video-bubble__thumbnail\"\n        [src]=\"getThumbnailVideoSrc(attachments[0])\"\n        [attr.poster]=\"getThumbnailPoster(attachments[0])\"\n        preload=\"metadata\"\n        muted\n        playsinline\n        tabindex=\"-1\"\n        aria-hidden=\"true\"\n        (error)=\"onThumbnailError(0, attachments[0])\"\n        (loadedmetadata)=\"onThumbnailMetadata(0, $event)\"></video>\n      <!-- Placeholder when thumbnail fails -->\n      <div\n        *ngIf=\"failedThumbnails.has(0)\"\n        class=\"cometchat-video-bubble__thumbnail-placeholder\"\n        aria-hidden=\"true\">\n        <div class=\"cometchat-video-bubble__placeholder-icon\"></div>\n      </div>\n      \n      <!-- Play Overlay -->\n      <div class=\"cometchat-video-bubble__play-overlay\" aria-hidden=\"true\">\n        <div class=\"cometchat-video-bubble__play-icon\"></div>\n      </div>\n      \n      <!-- Duration Badge -->\n      <div \n        *ngIf=\"attachments[0].duration\"\n        class=\"cometchat-video-bubble__duration-badge\"\n        aria-hidden=\"true\">\n        <span class=\"cometchat-video-bubble__duration-text\">\n          {{ formatDuration(attachments[0].duration) }}\n        </span>\n      </div>\n    </div>\n  </div>\n\n  <!-- Grid Layout (2-3 videos) -->\n  <div \n    *ngIf=\"layoutType === 'grid' && attachments.length >= 2 && attachments.length <= 3\"\n    class=\"cometchat-video-bubble__container\">\n    <div \n      class=\"cometchat-video-bubble__grid\"\n      [class.cometchat-video-bubble__grid--two-col]=\"attachments.length === 2\"\n      [class.cometchat-video-bubble__grid--three-col]=\"attachments.length === 3\">\n      <div \n        *ngFor=\"let attachment of attachments; let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-video-bubble__video-wrapper\"\n        (click)=\"onVideoClick(i); $event.stopPropagation()\"\n        (keydown)=\"onThumbnailKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"getThumbnailAriaLabel(i)\">\n        <!-- Thumbnail: <video> paints the first frame natively (an <img> can't decode a video file) -->\n        <video\n          *ngIf=\"shouldShowThumbnail(i)\"\n          class=\"cometchat-video-bubble__thumbnail\"\n          [src]=\"getThumbnailVideoSrc(attachment)\"\n          [attr.poster]=\"getThumbnailPoster(attachment)\"\n          preload=\"metadata\"\n          muted\n          playsinline\n          tabindex=\"-1\"\n          aria-hidden=\"true\"\n          (error)=\"onThumbnailError(i, attachment)\"\n          (loadedmetadata)=\"onThumbnailMetadata(i, $event)\"></video>\n        <!-- Placeholder when thumbnail fails -->\n        <div\n          *ngIf=\"failedThumbnails.has(i)\"\n          class=\"cometchat-video-bubble__thumbnail-placeholder\"\n          aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__placeholder-icon\"></div>\n        </div>\n        \n        <!-- Play Overlay -->\n        <div class=\"cometchat-video-bubble__play-overlay\" aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__play-icon\"></div>\n        </div>\n        \n        <!-- Duration Badge -->\n        <div \n          *ngIf=\"attachment.duration\"\n          class=\"cometchat-video-bubble__duration-badge\"\n          aria-hidden=\"true\">\n          <span class=\"cometchat-video-bubble__duration-text\">\n            {{ formatDuration(attachment.duration) }}\n          </span>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- 2×2 Grid Layout (4 videos) -->\n  <div \n    *ngIf=\"layoutType === 'grid-2x2' && attachments.length === 4\"\n    class=\"cometchat-video-bubble__container\">\n    <div class=\"cometchat-video-bubble__grid cometchat-video-bubble__grid--2x2\">\n      <div \n        *ngFor=\"let attachment of attachments; let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-video-bubble__video-wrapper\"\n        (click)=\"onVideoClick(i); $event.stopPropagation()\"\n        (keydown)=\"onThumbnailKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"getThumbnailAriaLabel(i)\">\n        <!-- Thumbnail: <video> paints the first frame natively (an <img> can't decode a video file) -->\n        <video\n          *ngIf=\"shouldShowThumbnail(i)\"\n          class=\"cometchat-video-bubble__thumbnail\"\n          [src]=\"getThumbnailVideoSrc(attachment)\"\n          [attr.poster]=\"getThumbnailPoster(attachment)\"\n          preload=\"metadata\"\n          muted\n          playsinline\n          tabindex=\"-1\"\n          aria-hidden=\"true\"\n          (error)=\"onThumbnailError(i, attachment)\"\n          (loadedmetadata)=\"onThumbnailMetadata(i, $event)\"></video>\n        <!-- Placeholder when thumbnail fails -->\n        <div\n          *ngIf=\"failedThumbnails.has(i)\"\n          class=\"cometchat-video-bubble__thumbnail-placeholder\"\n          aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__placeholder-icon\"></div>\n        </div>\n        \n        <!-- Play Overlay -->\n        <div class=\"cometchat-video-bubble__play-overlay\" aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__play-icon\"></div>\n        </div>\n        \n        <!-- Duration Badge -->\n        <div \n          *ngIf=\"attachment.duration\"\n          class=\"cometchat-video-bubble__duration-badge\"\n          aria-hidden=\"true\">\n          <span class=\"cometchat-video-bubble__duration-text\">\n            {{ formatDuration(attachment.duration) }}\n          </span>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- Overflow Layout (>4 videos) -->\n  <div \n    *ngIf=\"layoutType === 'overflow' && attachments.length > 4\"\n    class=\"cometchat-video-bubble__container\">\n    <div class=\"cometchat-video-bubble__grid cometchat-video-bubble__grid--overflow\">\n      <!-- First 3 videos displayed normally -->\n      <div \n        *ngFor=\"let attachment of attachments.slice(0, 3); let i = index; trackBy: trackByAttachment\"\n        class=\"cometchat-video-bubble__video-wrapper\"\n        (click)=\"onVideoClick(i); $event.stopPropagation()\"\n        (keydown)=\"onThumbnailKeyDown($event, i)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"getThumbnailAriaLabel(i)\">\n        <!-- Thumbnail: <video> paints the first frame natively (an <img> can't decode a video file) -->\n        <video\n          *ngIf=\"shouldShowThumbnail(i)\"\n          class=\"cometchat-video-bubble__thumbnail\"\n          [src]=\"getThumbnailVideoSrc(attachment)\"\n          [attr.poster]=\"getThumbnailPoster(attachment)\"\n          preload=\"metadata\"\n          muted\n          playsinline\n          tabindex=\"-1\"\n          aria-hidden=\"true\"\n          (error)=\"onThumbnailError(i, attachment)\"\n          (loadedmetadata)=\"onThumbnailMetadata(i, $event)\"></video>\n        <!-- Placeholder when thumbnail fails -->\n        <div\n          *ngIf=\"failedThumbnails.has(i)\"\n          class=\"cometchat-video-bubble__thumbnail-placeholder\"\n          aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__placeholder-icon\"></div>\n        </div>\n        \n        <!-- Play Overlay -->\n        <div class=\"cometchat-video-bubble__play-overlay\" aria-hidden=\"true\">\n          <div class=\"cometchat-video-bubble__play-icon\"></div>\n        </div>\n        \n        <!-- Duration Badge -->\n        <div \n          *ngIf=\"attachment.duration\"\n          class=\"cometchat-video-bubble__duration-badge\"\n          aria-hidden=\"true\">\n          <span class=\"cometchat-video-bubble__duration-text\">\n            {{ formatDuration(attachment.duration) }}\n          </span>\n        </div>\n      </div>\n\n      <!-- 4th tile with overflow indicator -->\n      <div\n        class=\"cometchat-video-bubble__overflow-tile\"\n        (click)=\"onVideoClick(3); $event.stopPropagation()\"\n        (keydown)=\"onThumbnailKeyDown($event, 3)\"\n        tabindex=\"0\"\n        role=\"button\"\n        [attr.aria-label]=\"getOverflowAriaLabel()\">\n        <!-- First frame of the 4th video sits behind the \"+N\" overlay (an <img>/bg-image can't decode video) -->\n        <video\n          class=\"cometchat-video-bubble__thumbnail\"\n          [src]=\"getThumbnailVideoSrc(attachments[3])\"\n          [attr.poster]=\"getThumbnailPoster(attachments[3])\"\n          preload=\"metadata\"\n          muted\n          playsinline\n          tabindex=\"-1\"\n          aria-hidden=\"true\"></video>\n        <div class=\"cometchat-video-bubble__overflow-overlay\" aria-hidden=\"true\">\n          <span class=\"cometchat-video-bubble__overflow-text\">\n            {{ getOverflowText() }}\n          </span>\n        </div>\n      </div>\n    </div>\n  </div>\n\n  <!-- Caption Rendering -->\n  <div \n    *ngIf=\"captionText\"\n    class=\"cometchat-video-bubble__caption\">\n    <cometchat-text-bubble\n      [message]=\"$any(message)\"\n      [alignment]=\"alignment\">\n    </cometchat-text-bubble>\n  </div>\n</div>\n\n<!-- Fullscreen Viewer (Gallery Mode) -->\n<cometchat-fullscreen-viewer\n  *ngIf=\"showPlayerViewer\"\n  [attachments]=\"attachments\"\n  [startIndex]=\"playerStartIndex\"\n  [isOpen]=\"showPlayerViewer\"\n  [explicitSenderName]=\"senderName\"\n  [explicitSenderAvatarUrl]=\"senderAvatarUrl\"\n  (closeClick)=\"closePlayerViewer()\"\n  (pipStateChange)=\"onPipStateChange($event)\">\n</cometchat-fullscreen-viewer>\n","/**\n * Public API for CometChat Video Bubble Component\n *\n * Exports:\n * - CometChatVideoBubbleComponent: Main component for displaying video message bubbles\n *\n * Related types (exported from modals):\n * - MediaAttachment: Interface for media attachment data\n * - MediaLayoutType: Type for layout configuration\n *\n * @see Requirements 18.5\n */\n\nexport { CometChatVideoBubbleComponent } from './cometchat-video-bubble.component';\n","/**\n * CometChatFileBubbleComponent renders file attachments within chat messages.\n * Supports single/multiple files, inline expand/collapse, file type icons,\n * human-readable sizes, caption support, and full keyboard accessibility.\n * @see Requirements 1.1, 1.2, 11.1\n */\n\nimport {\n  Component,\n  Input,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  ViewChild,\n  ElementRef,\n  inject, OnDestroy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport type { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatTextBubbleComponent } from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport { FileAttachment } from '../../modals/FileAttachment';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { triggerMediaDownload } from '../../utils/media-download';\nimport { getFileType, getFileIcon, formatFileSize, resolveFileExtension } from './cometchat-file-bubble.types';\n\n/**\n * CometChatFileBubbleComponent renders file/document message attachments.\n * @deprecated Prefer {@link CometChatFilesBubbleComponent}, which the message bubble now renders\n * for every file message. This bubble stays public for direct use and remains the internal\n * primitive that the new bubble delegates to.\n */\n@Component({\n  selector: 'cometchat-file-bubble',\n  standalone: true,\n  templateUrl: './cometchat-file-bubble.component.html',\n  styleUrls: ['./cometchat-file-bubble.component.css'],\n  imports: [CommonModule, TranslatePipe, CometChatTextBubbleComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatFileBubbleComponent implements OnInit, OnChanges, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  /** The media message object. @see Requirements 1.1, 1.2 */\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n\n  /** LEFT for incoming, RIGHT for outgoing. @see Requirements 1.2, 2.7, 2.8 */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** Reference to the collapse button for focus management. @see Requirements 4.8, 7.9 */\n  @ViewChild('collapseButton') collapseButton?: ElementRef<HTMLButtonElement>;\n\n  /** Extracted file attachments from the message */\n  protected attachments: FileAttachment[] = [];\n  /** Whether the file list is expanded (for multiple files) */\n  protected isExpanded = false;\n  /** Whether the message has caption text */\n  protected hasCaption = false;\n  /** Whether this is an outgoing message (sender is logged-in user) */\n  protected isOutgoing = false;\n\n  /** Expose MessageBubbleAlignment enum to template */\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  /** LiveAnnouncerService for screen reader announcements */\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) {\n      this.processMessage();\n    }\n  }\n  // ============================================\n  // Private Methods\n  // ============================================\n\n  /**\n   * Process the message to extract attachments and caption.\n   *\n   * @see Requirements 1.1, 1.3\n   */\n  private processMessage(): void {\n    // Extract attachments from the message\n    this.extractAttachments();\n\n    // A MediaMessage's caption lives in getCaption()/data.text (there is NO getText() on MediaMessage).\n    this.hasCaption = !!(this.message as unknown as { getCaption?: () => string })?.getCaption?.();\n\n    // Determine if message is outgoing based on alignment\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n\n    // Trigger change detection\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Extract attachments from the message and transform to internal model.\n   *\n   * @remarks\n   * Transforms CometChat.Attachment objects to FileAttachment interface.\n   * Handles missing or invalid attachment data gracefully.\n   *\n   * @see Requirements 1.3, 1.5\n   */\n  protected extractAttachments(): void {\n    // Handle null/undefined message gracefully\n    if (!this.message) {\n      CometChatLogger.warn('CometChatFileBubble', 'Message is null or undefined');\n      this.attachments = [];\n      return;\n    }\n\n    try {\n      // Get attachments from the message\n      const rawAttachments = this.message.getAttachments?.();\n\n      // Handle null/undefined attachments array\n      if (!rawAttachments || !Array.isArray(rawAttachments)) {\n        CometChatLogger.warn('CometChatFileBubble', 'Message has no attachments or attachments is not an array');\n        this.attachments = [];\n        return;\n      }\n\n      // Map CometChat.Attachment objects to FileAttachment interface\n      const fileAttachments: FileAttachment[] = [];\n\n      for (let i = 0; i < rawAttachments.length; i++) {\n        const attachment = rawAttachments[i];\n\n        // Skip invalid attachments\n        if (!attachment || typeof attachment !== 'object') {\n          CometChatLogger.warn('CometChatFileBubble', `Attachment at index ${i} is invalid (not an object)`);\n          continue;\n        }\n\n        // Extract properties with safe access\n        const name =\n          (attachment as any).name ||\n          (attachment as any).getName?.() ||\n          CometChatLocalize.getLocalizedString('file_bubble_unknown_file');\n        const url = (attachment as any).url || (attachment as any).getUrl?.() || '';\n        const mimeType =\n          (attachment as any).mimeType ||\n          (attachment as any).getMimeType?.() ||\n          'application/octet-stream';\n        const extension =\n          (attachment as any).extension || (attachment as any).getExtension?.() || '';\n        const size = (attachment as any).size || (attachment as any).getSize?.() || 0;\n\n        // Skip attachments without URL (required)\n        if (!url || typeof url !== 'string') {\n          CometChatLogger.warn('CometChatFileBubble', `Attachment at index ${i} is missing URL, skipping`);\n          continue;\n        }\n\n        // Build FileAttachment object\n        const resolvedName =\n          typeof name === 'string'\n            ? name\n            : CometChatLocalize.getLocalizedString('file_bubble_unknown_file');\n        const fileAttachment: FileAttachment = {\n          name: resolvedName,\n          url,\n          mimeType: typeof mimeType === 'string' ? mimeType : 'application/octet-stream',\n          // The SDK often reports no extension on a received attachment; the filename still has it,\n          // and it identifies the format far more precisely than the MIME type can.\n          extension: resolveFileExtension(\n            resolvedName,\n            typeof extension === 'string' ? extension : '',\n          ),\n          size: typeof size === 'number' ? size : 0,\n        };\n\n        fileAttachments.push(fileAttachment);\n      }\n\n      this.attachments = fileAttachments;\n    } catch (error) {\n      CometChatLogger.error('CometChatFileBubble', 'Error extracting attachments:', error);\n      this.attachments = [];\n    }\n  }\n\n  /**\n   * Get the file type from attachment for icon mapping.\n   * @see Requirements 9.1\n   */\n  protected getFileType(attachment: FileAttachment): string {\n    return getFileType(attachment);\n  }\n\n  /**\n   * Get the file icon URL for a file type.\n   * @see Requirements 9.1, 9.8\n   */\n  protected getFileIcon(fileType: string): string {\n    return getFileIcon(fileType);\n  }\n\n  /**\n   * Format file size in human-readable format.\n   * @see Requirements 10.1-10.6\n   */\n  protected formatFileSize(bytes: number | null | undefined): string {\n    return formatFileSize(bytes);\n  }\n\n  /** Chevrons on the expand / collapse bar. Masked, so they take the button's text colour. */\n  protected readonly expandIconUrl = 'assets/keyboard_arrow_down.svg';\n  protected readonly collapseIconUrl = 'assets/keyboard_arrow_up.svg';\n\n  /** Files shown before the list collapses behind a \"Show N more\" toggle. Matches the React kit. */\n  static readonly COLLAPSED_MAX = 3;\n\n  /** The files rendered right now: the first three, or all of them once expanded. */\n  protected get visibleAttachments(): FileAttachment[] {\n    return this.isExpanded\n      ? this.attachments\n      : this.attachments.slice(0, CometChatFileBubbleComponent.COLLAPSED_MAX);\n  }\n\n  /** Whether there are more files than the collapsed list shows. */\n  protected get hasOverflow(): boolean {\n    return this.getRemainingFilesCount() > 0;\n  }\n\n  /** Count of files hidden by the collapsed list (drives the \"+N more\" label). */\n  protected getRemainingFilesCount(): number {\n    return Math.max(0, this.attachments.length - CometChatFileBubbleComponent.COLLAPSED_MAX);\n  }\n\n  /** \"+N more\", localized. */\n  protected getShowMoreLabel(): string {\n    return CometChatLocalize.getLocalizedString('bubble_show_more').replace(\n      '{count}',\n      String(this.getRemainingFilesCount()),\n    );\n  }\n\n  /** Uppercased extension for the meta line (e.g. \"DOC\"), or \"FILE\" when there is none. */\n  protected getFileExtLabel(attachment: FileAttachment): string {\n    const parts = (attachment.name ?? '').split('.');\n    if (parts.length < 2) {\n      return 'FILE';\n    }\n    return (parts.pop() ?? '').toUpperCase();\n  }\n\n  /** Meta line: `DOC · 98 KB`, falling back to just the extension when the size is unknown. */\n  protected getFileMeta(attachment: FileAttachment): string {\n    const ext = this.getFileExtLabel(attachment);\n    const size = attachment.size;\n    return size && size > 0 ? `${ext} · ${formatFileSize(size)}` : ext;\n  }\n\n  /**\n   * Toggle the expanded/collapsed state for multiple files.\n   *\n   * @remarks\n   * When expanding, sets focus on the collapse control after a short delay\n   * to allow the DOM to update.\n   *\n   * @see Requirements 4.1, 4.6, 4.8, 7.9\n   */\n  protected toggleExpanded(): void {\n    const wasCollapsed = !this.isExpanded;\n    this.isExpanded = !this.isExpanded;\n    this.cdr.markForCheck();\n\n    // Set focus on collapse control after expansion\n    if (wasCollapsed && this.isExpanded) {\n      // Use setTimeout to ensure DOM has updated\n      this.pendingTimers.push(setTimeout(() => {\n        this.collapseButton?.nativeElement?.focus();\n      }, 0));\n    }\n  }\n\n  /**\n   * Get the ARIA label for the expand indicator.\n   *\n   * @remarks\n   * Returns a dynamic label like \"Show 3 more files\" based on the count\n   * of remaining files.\n   *\n   * @returns ARIA label string\n   * @see Requirements 7.5\n   */\n  protected getExpandAriaLabel(): string {\n    const count = this.getRemainingFilesCount();\n    const template = CometChatLocalize.getLocalizedString('file_bubble_show_more_files');\n    if (template && template !== 'file_bubble_show_more_files') {\n      return template.replace('{count}', count.toString());\n    }\n    // Fallback with proper singular/plural\n    return count === 1 ? `Show 1 more file` : `Show ${count} more files`;\n  }\n\n  /**\n   * Get the ARIA label for a download link.\n   *\n   * @remarks\n   * Returns a localized label like \"Download filename.pdf\" to provide\n   * context for screen reader users.\n   *\n   * @param filename - The name of the file\n   * @returns ARIA label string\n   * @see Requirements 7.5, 10.4\n   */\n  protected getDownloadAriaLabel(filename: string): string {\n    return CometChatLocalize.getLocalizedString('accessibility_file_bubble_download').replace(\n      '{filename}',\n      filename\n    );\n  }\n\n  /**\n   * Get the ARIA label for a file item.\n   *\n   * @remarks\n   * Returns a localized label combining filename, file type, and size\n   * for screen reader users.\n   *\n   * @param attachment - The file attachment\n   * @returns ARIA label string\n   * @see Requirements 10.3\n   */\n  protected getFileAriaLabel(attachment: FileAttachment): string {\n    const fileType = this.getFileType(attachment);\n    const formattedSize = this.formatFileSize(attachment.size);\n    return CometChatLocalize.getLocalizedString('accessibility_file_bubble')\n      .replace('{filename}', attachment.name)\n      .replace('{type}', fileType.toUpperCase())\n      .replace('{size}', formattedSize);\n  }\n\n  /**\n   * Handles keyboard events on the download button.\n   *\n   * @remarks\n   * Triggers file download when Enter or Space is pressed.\n   *\n   * @param event - The keyboard event\n   * @param attachment - The file attachment to download\n   * @see Requirements 10.2\n   */\n  protected onDownloadKeyDown(event: KeyboardEvent, attachment: FileAttachment): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.initiateDownload(attachment);\n    }\n  }\n\n  /**\n   * Initiates file download with screen reader announcements.\n   *\n   * @remarks\n   * Announces download start, then completion or failure once the download actually resolves.\n   * The outcome is real, not assumed: an anchor pointed at the cross-origin CDN can only open the\n   * file in a tab, so `triggerMediaDownload` fetches the bytes into a same-origin blob and reports\n   * back whether it managed to save or had to fall back to a tab.\n   *\n   * @param attachment - The file attachment to download\n   * @see Requirements 10.5, 10.6, 10.7\n   */\n  protected initiateDownload(attachment: FileAttachment): void {\n    // Announce download start\n    this.liveAnnouncer.announce(\n      CometChatLocalize.getLocalizedString('accessibility_downloading_file').replace(\n        '{filename}',\n        attachment.name\n      ),\n      'polite'\n    );\n\n    triggerMediaDownload(attachment.url, attachment.name).then(outcome => {\n      if (outcome === 'saved') {\n        this.liveAnnouncer.announce(\n          CometChatLocalize.getLocalizedString('accessibility_download_complete').replace(\n            '{filename}',\n            attachment.name\n          ),\n          'polite'\n        );\n        return;\n      }\n      // Opened in a tab instead of saving — announcing \"complete\" here would tell a screen-reader\n      // user the file is on disk when it isn't.\n      this.liveAnnouncer.announceError(\n        CometChatLocalize.getLocalizedString('accessibility_download_failed').replace(\n          '{filename}',\n          attachment.name\n        )\n      );\n    });\n  }\n\n  /**\n   * TrackBy function for *ngFor over file attachments.\n   *\n   * Uses the attachment URL as a stable unique identifier to prevent\n   * unnecessary DOM re-creation when the list is re-rendered.\n   *\n   * @param index - The index of the item in the list\n   * @param attachment - The file attachment\n   * @returns The attachment URL as a stable identifier\n   * @see Requirements 2.2\n   */\n  protected trackByAttachment(index: number, attachment: FileAttachment): string {\n    return attachment.url || index.toString();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n  }\n}\n","<!-- File Bubble Component Template -->\n<div \n  class=\"cometchat-file-bubble\"\n  [class.cometchat-file-bubble--sender]=\"alignment === MessageBubbleAlignment.right\"\n  [class.cometchat-file-bubble--receiver]=\"alignment === MessageBubbleAlignment.left\"\n  [class.cometchat-file-bubble--expanded]=\"isExpanded\">\n  \n  <!-- File Container. Multiple files get a grouping background, as in the React kit. -->\n  <div\n    class=\"cometchat-file-bubble__container\"\n    [class.cometchat-file-bubble__container--multi]=\"attachments.length > 1\">\n\n    <!-- Up to COLLAPSED_MAX (3) files; all of them once expanded. -->\n    <div\n      *ngFor=\"let attachment of visibleAttachments; trackBy: trackByAttachment\"\n      class=\"cometchat-file-bubble__file-item\"\n      [attr.aria-label]=\"getFileAriaLabel(attachment)\">\n      <img\n        [src]=\"getFileIcon(getFileType(attachment))\"\n        class=\"cometchat-file-bubble__icon\"\n        [alt]=\"'file_bubble_file_icon' | translate\"\n        aria-hidden=\"true\" />\n\n      <div class=\"cometchat-file-bubble__metadata\" aria-hidden=\"true\">\n        <span class=\"cometchat-file-bubble__filename\">\n          {{ attachment.name }}\n        </span>\n        <span class=\"cometchat-file-bubble__filesize\">\n          {{ getFileMeta(attachment) }}\n        </span>\n      </div>\n\n      <button\n        *ngIf=\"attachment.url\"\n        type=\"button\"\n        class=\"cometchat-file-bubble__download\"\n        [attr.aria-label]=\"getDownloadAriaLabel(attachment.name)\"\n        (click)=\"initiateDownload(attachment)\"\n        (keydown)=\"onDownloadKeyDown($event, attachment)\">\n        <div\n          class=\"cometchat-file-bubble__download-icon\"\n          aria-hidden=\"true\"></div>\n      </button>\n      <span\n        *ngIf=\"!attachment.url\"\n        class=\"cometchat-file-bubble__download cometchat-file-bubble__download--disabled\"\n        [attr.aria-label]=\"'file_bubble_download_unavailable' | translate\"\n        [attr.title]=\"'file_bubble_download_unavailable' | translate\">\n        <div\n          class=\"cometchat-file-bubble__download-icon cometchat-file-bubble__download-icon--disabled\"\n          aria-hidden=\"true\"></div>\n      </span>\n    </div>\n\n    <!-- \"Show N more\" (collapsed) -->\n    <button\n      *ngIf=\"hasOverflow && !isExpanded\"\n      class=\"cometchat-file-bubble__expand-indicator\"\n      (click)=\"toggleExpanded()\"\n      (keydown.enter)=\"toggleExpanded()\"\n      (keydown.space)=\"toggleExpanded(); $event.preventDefault()\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"getExpandAriaLabel()\"\n      [attr.aria-expanded]=\"false\">\n      <span\n        class=\"cometchat-file-bubble__toggle-icon\"\n        aria-hidden=\"true\"\n        [style.-webkit-mask-image]=\"'url(' + expandIconUrl + ')'\"\n        [style.mask-image]=\"'url(' + expandIconUrl + ')'\"></span>\n      {{ getShowMoreLabel() }}\n    </button>\n\n    <!-- \"Show less\" (expanded) -->\n    <button\n      #collapseButton\n      *ngIf=\"hasOverflow && isExpanded\"\n      class=\"cometchat-file-bubble__collapse-control\"\n      (click)=\"toggleExpanded()\"\n      (keydown.enter)=\"toggleExpanded()\"\n      (keydown.space)=\"toggleExpanded(); $event.preventDefault()\"\n      tabindex=\"0\"\n      [attr.aria-label]=\"'file_bubble_show_less' | translate\"\n      [attr.aria-expanded]=\"true\">\n      <span\n        class=\"cometchat-file-bubble__toggle-icon\"\n        aria-hidden=\"true\"\n        [style.-webkit-mask-image]=\"'url(' + collapseIconUrl + ')'\"\n        [style.mask-image]=\"'url(' + collapseIconUrl + ')'\"></span>\n      {{ 'file_bubble_show_less' | translate }}\n    </button>\n  </div>\n  \n  <!-- Caption Rendering -->\n  <div \n    *ngIf=\"hasCaption\"\n    class=\"cometchat-file-bubble__caption\">\n    <cometchat-text-bubble\n      [message]=\"$any(message)\"\n      [alignment]=\"alignment\">\n    </cometchat-text-bubble>\n  </div>\n</div>\n","/**\n * CometChatFileBubble Component\n *\n * Public API exports for the file message bubble component.\n *\n * Related types (exported from modals):\n * - FileAttachment: Interface for file attachment data\n *\n * @see Requirements 11.2\n */\n\nexport { CometChatFileBubbleComponent } from './cometchat-file-bubble.component';\nexport type { FileAttachment } from '../../modals/FileAttachment';\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatImageBubbleComponent } from '../cometchat-image-bubble/cometchat-image-bubble.component';\n\n/**\n * CometChatImagesBubble — receive-side bubble for a (multi-)image message (Phase 2).\n *\n * Renders the message's images (single / grid / overflow) plus the caption, reusing the\n * existing `cometchat-image-bubble` rendering. It is a distinct component so the batch-aware\n * width and grouping live here, leaving the deprecated single-attachment\n * `cometchat-image-bubble` as the primitive it delegates to. Caption-on-last is honored\n * automatically because the composer only sets the caption on the last message of a batch.\n */\n@Component({\n  selector: 'cometchat-images-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatImageBubbleComponent],\n  template: `<cometchat-image-bubble\n    [message]=\"message\"\n    [alignment]=\"alignment\"\n    [disableInteraction]=\"disableInteraction\"\n  ></cometchat-image-bubble>`,\n  // Batch bubbles share one width (--cometchat-multi-attachment-width, default 400px = the React\n  // kit's container cap) so every message in a batch renders at the same width. See css-variables.css.\n  styles: [`\n    :host { display: block; width: 100%; }\n    :host {\n      --cometchat-batch-width: var(--cometchat-multi-attachment-width, 400px);\n      --cometchat-image-bubble-single-max-width: var(--cometchat-batch-width);\n      --cometchat-image-bubble-grid-max-width: var(--cometchat-batch-width);\n      --cometchat-image-bubble-grid-2x2-max-width: var(--cometchat-batch-width);\n      --cometchat-image-bubble-overflow-max-width: var(--cometchat-batch-width);\n      --cometchat-image-bubble-container-max-width: var(--cometchat-batch-width);\n    }\n  `],\n})\nexport class CometChatImagesBubbleComponent {\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n  @Input() disableInteraction = false;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatVideoBubbleComponent } from '../cometchat-video-bubble/cometchat-video-bubble.component';\n\n/**\n * CometChatVideosBubble — receive-side bubble for a (multi-)video message (Phase 2).\n * Delegates to the existing `cometchat-video-bubble` (grid/overflow/player/caption). A distinct\n * component so the batch-aware width and grouping live here; the single-attachment\n * `cometchat-video-bubble` is the deprecated primitive it delegates to.\n */\n@Component({\n  selector: 'cometchat-videos-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatVideoBubbleComponent],\n  template: `<cometchat-video-bubble\n    [message]=\"message\"\n    [alignment]=\"alignment\"\n    [disableInteraction]=\"disableInteraction\"\n  ></cometchat-video-bubble>`,\n  // All four batch bubbles share one width via --cometchat-multi-attachment-width, so every message\n  // in a batch lines up. Defaults to 400px, matching the React kit's container cap; set the token to\n  // 100% to let batch media fill the bubble instead. The inner max-height caps stay relaxed so a\n  // 16:9 video fills that width instead of leaving empty space.\n  styles: [`\n    :host { display: block; width: 100%; }\n    :host {\n      --cometchat-batch-width: var(--cometchat-multi-attachment-width, 400px);\n      --cometchat-video-bubble-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-single-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-grid-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-grid-2x2-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-overflow-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-container-max-width: var(--cometchat-batch-width);\n      --cometchat-video-bubble-max-height: none;\n      --cometchat-video-bubble-single-max-height: none;\n    }\n  `],\n})\nexport class CometChatVideosBubbleComponent {\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n  @Input() disableInteraction = false;\n}\n","/**\n * Utility helpers for CometChatAudioBubble component.\n * Contains WaveSurfer configuration helpers and accessibility helpers.\n */\n\nimport { WaveSurfer } from './wavesurfer';\nimport type { AudioAttachment } from '../../modals/AudioAttachment';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MediaControlsService } from '../../services/media-controls.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n// ── WaveSurfer Config ─────────────────────────────────────────────────────\n\n/**\n * Resolved color configuration for WaveSurfer based on sender/receiver variant.\n */\nexport interface WaveSurferColors {\n  progressColor: string;\n  waveColor: string;\n  barRadius: number;\n}\n\n/**\n * Reads CSS variables from the document root to resolve WaveSurfer colors.\n * @param isOutgoing - Whether the message is outgoing (sender)\n */\nexport function resolveWaveSurferColors(isOutgoing: boolean): WaveSurferColors {\n  const root = document.documentElement;\n  const progressColor = isOutgoing\n    ? getComputedStyle(root).getPropertyValue('--cometchat-static-white').trim()\n    : getComputedStyle(root).getPropertyValue('--cometchat-primary-color').trim();\n  const waveColor = isOutgoing\n    ? getComputedStyle(root).getPropertyValue('--cometchat-neutral-color-500').trim()\n    : getComputedStyle(root).getPropertyValue('--cometchat-extended-primary-color-300').trim();\n  const barRadiusStr = getComputedStyle(root).getPropertyValue('--cometchat-radius-max').trim();\n  const barRadius = parseInt(barRadiusStr.replace('px', ''), 10) || 1000;\n  return { progressColor, waveColor, barRadius };\n}\n\n/**\n * Creates a WaveSurfer instance with standard audio bubble configuration.\n * @param container - The DOM element to render the waveform into\n * @param colors - Resolved color configuration\n */\nexport function createWaveSurferInstance(\n  container: HTMLDivElement,\n  colors: WaveSurferColors\n): WaveSurfer {\n  return WaveSurfer.create({\n    container,\n    height: 16,\n    normalize: false,\n    waveColor: colors.waveColor,\n    progressColor: colors.progressColor,\n    cursorWidth: 0,\n    barWidth: 2,\n    barGap: 3,\n    barRadius: colors.barRadius,\n    barHeight: 1.2,\n    minPxPerSec: 26,\n    fillParent: true,\n    mediaControls: false,\n    interact: true,\n    dragToSeek: true,\n    hideScrollbar: true,\n    audioRate: 1,\n    autoScroll: true,\n    autoCenter: true,\n    sampleRate: 17000,\n    width: 140,\n  });\n}\n\n// ── Download Helpers ──────────────────────────────────────────────────────\n\n/**\n * Downloads an audio file with progress tracking via ReadableStream.\n * @param url - The URL of the audio file\n * @param onProgress - Callback for progress updates (0-100)\n * @param signal - Optional AbortSignal for cancellation\n */\nexport async function downloadAudioWithProgress(\n  url: string,\n  onProgress: (percent: number) => void,\n  signal?: AbortSignal\n): Promise<Blob> {\n  const response = await fetch(url, { signal });\n  if (!response.ok) {\n    throw new Error(`HTTP error! status: ${response.status}`);\n  }\n  if (!response.body) {\n    const blob = await response.blob();\n    onProgress(100);\n    return blob;\n  }\n  const reader = response.body.getReader();\n  const contentLength = parseInt(response.headers.get('Content-Length') || '0', 10);\n  let receivedLength = 0;\n  const chunks: BlobPart[] = [];\n  while (true) {\n    const { done, value } = await reader.read();\n    if (done) break;\n    chunks.push(value);\n    receivedLength += value.length;\n    if (contentLength > 0) {\n      onProgress(Math.floor((receivedLength / contentLength) * 100));\n    } else {\n      onProgress(Math.min(90, Math.floor(Math.log10(receivedLength + 1) * 20)));\n    }\n  }\n  onProgress(100);\n  const contentType = response.headers.get('Content-Type') || 'audio/mpeg';\n  return new Blob(chunks, { type: contentType });\n}\n\n/**\n * Triggers a browser file download from a Blob.\n * @param blob - The file data\n * @param filename - The filename for the download\n */\nexport function triggerFileDownload(blob: Blob, filename: string): void {\n  const url = URL.createObjectURL(blob);\n  const anchor = document.createElement('a');\n  anchor.href = url;\n  anchor.download = filename || 'audio.mp3';\n  anchor.style.display = 'none';\n  document.body.appendChild(anchor);\n  anchor.click();\n  document.body.removeChild(anchor);\n  // Release the blob after the click has had a chance to start the download. Revoking synchronously\n  // races the browser for anything large enough that the save doesn't begin within the same tick.\n  setTimeout(() => URL.revokeObjectURL(url), 10_000);\n}\n\n// ── Accessibility Helpers ─────────────────────────────────────────────────\n\n/**\n * Gets the ARIA label for the audio region, including duration.\n */\nexport function getAudioRegionAriaLabel(\n  duration: number,\n  mediaControlsService: MediaControlsService\n): string {\n  const durationText = mediaControlsService.formatTimeForAnnouncement(duration);\n  return CometChatLocalize.getLocalizedString('audio_bubble_region').replace(\n    '{duration}',\n    durationText\n  );\n}\n\n/**\n * Gets the ARIA label for the play/pause button based on current state.\n */\nexport function getPlayPauseAriaLabel(isPlaying: boolean): string {\n  return isPlaying\n    ? CometChatLocalize.getLocalizedString('audio_bubble_pause')\n    : CometChatLocalize.getLocalizedString('audio_bubble_play');\n}\n\n/**\n * Announces the current seek position to screen readers.\n */\nexport function announceSeekPosition(\n  time: number,\n  mediaControlsService: MediaControlsService,\n  liveAnnouncer: LiveAnnouncerService\n): void {\n  const formattedTime = mediaControlsService.formatTimeForAnnouncement(time);\n  liveAnnouncer.announce(formattedTime, 'polite');\n}\n\n/**\n * Announces audio playback completion to screen readers.\n */\nexport function announcePlaybackComplete(liveAnnouncer: LiveAnnouncerService): void {\n  liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('accessibility_audio_playback_complete'),\n    'polite'\n  );\n}\n\n/**\n * Announces seek to start position.\n */\nexport function announceSeekStart(liveAnnouncer: LiveAnnouncerService): void {\n  liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('audio_bubble_seek_start'),\n    'polite'\n  );\n}\n\n/**\n * Announces seek to end position.\n */\nexport function announceSeekEnd(liveAnnouncer: LiveAnnouncerService): void {\n  liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('audio_bubble_seek_end'),\n    'polite'\n  );\n}\n\n/**\n * Gets the SVG strokeDasharray value for download progress indicator.\n */\nexport function getProgressDashArray(downloadProgress: number): string {\n  return `${downloadProgress * 0.628} 62.8`;\n}\n\n/**\n * Formats time in seconds to M:SS display format.\n */\nexport function formatAudioTime(timeInSeconds: number): string {\n  if (!timeInSeconds || timeInSeconds < 0 || !isFinite(timeInSeconds)) return '0:00';\n  const minutes = Math.floor(timeInSeconds / 60);\n  const seconds = Math.floor(timeInSeconds % 60);\n  return `${minutes}:${seconds < 10 ? '0' : ''}${seconds}`;\n}\n\n/**\n * Gets the ARIA label for the expand indicator button.\n */\nexport function getExpandAriaLabel(remainingCount: number): string {\n  const template = CometChatLocalize.getLocalizedString('audio_bubble_show_more');\n  return template.replace('{count}', remainingCount.toString());\n}\n\n// ── WaveSurfer Event Setup ────────────────────────────────────────────────\n\nimport type { AudioState } from '../../modals/AudioAttachment';\n\n/**\n * Callbacks used by WaveSurfer event handlers to update component state.\n */\nexport interface WaveSurferEventCallbacks {\n  onReady: (index: number, duration: number) => void;\n  onTimeUpdate: (index: number, currentTime: number) => void;\n  onFinish: (index: number) => void;\n  onPlay: (index: number) => void;\n  onPause: (index: number) => void;\n  onError: (index: number, error: Error) => void;\n}\n\n/**\n * Attaches all standard WaveSurfer event listeners for an audio bubble.\n */\nexport function attachWaveSurferEvents(\n  waveSurfer: WaveSurfer,\n  index: number,\n  callbacks: WaveSurferEventCallbacks\n): void {\n  waveSurfer.on('ready', (duration: number) => callbacks.onReady(index, duration));\n  waveSurfer.on('audioprocess', (currentTime: number) => callbacks.onTimeUpdate(index, currentTime));\n  waveSurfer.on('timeupdate', (currentTime: number) => callbacks.onTimeUpdate(index, currentTime));\n  waveSurfer.on('dragend', () => callbacks.onTimeUpdate(index, waveSurfer.getCurrentTime()));\n  waveSurfer.on('finish', () => callbacks.onFinish(index));\n  waveSurfer.on('play', () => callbacks.onPlay(index));\n  waveSurfer.on('pause', () => callbacks.onPause(index));\n  waveSurfer.on('error', (error: Error) => callbacks.onError(index, error));\n}\n\n// ── Message Extraction Helpers ────────────────────────────────────────────\n\n/**\n * Extracts audio attachments from a CometChat.MediaMessage.\n */\nexport function extractAudioAttachments(message: CometChat.MediaMessage): AudioAttachment[] {\n  if (!message) return [];\n  try {\n    const rawAttachments = message.getAttachments?.();\n    if (!rawAttachments || !Array.isArray(rawAttachments)) return [];\n    const result: AudioAttachment[] = [];\n    for (const attachment of rawAttachments) {\n      if (!attachment || typeof attachment !== 'object') continue;\n      const url = (attachment as any).url || (attachment as any).getUrl?.() || '';\n      if (!url || typeof url !== 'string' || url.length === 0) continue;\n      const name = (attachment as any).name || (attachment as any).getName?.() ||\n        CometChatLocalize.getLocalizedString('audio_bubble_audio');\n      const mimeType = (attachment as any).mimeType || (attachment as any).getMimeType?.() || 'audio/mpeg';\n      const extension = (attachment as any).extension || (attachment as any).getExtension?.() || 'mp3';\n      const size = (attachment as any).size || (attachment as any).getSize?.() || 0;\n      result.push({\n        name: typeof name === 'string' ? name : CometChatLocalize.getLocalizedString('audio_bubble_audio'),\n        url,\n        mimeType: typeof mimeType === 'string' ? mimeType : 'audio/mpeg',\n        extension: typeof extension === 'string' ? extension : 'mp3',\n        size: typeof size === 'number' ? size : 0,\n      });\n    }\n    return result;\n  } catch (error) {\n    CometChatLogger.error('CometChatAudioBubble', 'Error extracting attachments:', error);\n    return [];\n  }\n}\n\n/**\n * Checks whether a CometChat.MediaMessage has caption text.\n */\nexport function hasAudioCaption(message: CometChat.MediaMessage): boolean {\n  if (!message) return false;\n  try {\n    const textFromGetText = (message as any)?.getText?.();\n    if (textFromGetText && typeof textFromGetText === 'string' && textFromGetText.trim().length > 0) return true;\n    const data = (message as any)?.getData?.();\n    if (data && typeof data === 'object') {\n      const textFromData = data.text;\n      if (textFromData && typeof textFromData === 'string' && textFromData.trim().length > 0) return true;\n    }\n    return false;\n  } catch (error) {\n    CometChatLogger.warn('CometChatAudioBubble', 'Error extracting caption:', error);\n    return false;\n  }\n}\n","import {\n  Component,\n  Input,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  inject,\n  OnChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport type { AudioAttachment } from '../../modals';\nimport { extractAudioAttachments } from '../cometchat-audio-bubble/cometchat-audio-bubble.utils';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatTextBubbleComponent } from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport { getMediaCaption } from '../../utils/message-metadata-utils';\nimport { triggerMediaDownload } from '../../utils/media-download';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\ninterface AudioRowState {\n  currentTime: number;\n  duration: number;\n  playing: boolean;\n}\n\n/**\n * CometChatAudiosBubble — receive-side bubble for a (multi-)audio-file message (Phase 2).\n *\n * New design (WhatsApp-style, interim pending final @Pradeep): each audio row shows an\n * audio icon, a play/pause button, a flat slider (position/duration) and the file name.\n * Voice notes are handled by CometChatVoiceNoteBubble (routed via metadata.audioType).\n * Reuses `extractAudioAttachments` for the attachment list.\n */\n@Component({\n  selector: 'cometchat-audios-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, TranslatePipe, CometChatTextBubbleComponent],\n  templateUrl: './cometchat-audios-bubble.component.html',\n  styleUrls: ['./cometchat-audios-bubble.component.css'],\n})\nexport class CometChatAudiosBubbleComponent implements OnChanges {\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** True for outgoing (right-aligned) messages. Enum-safe comparison for the template. */\n  protected get isSender(): boolean {\n    return this.alignment === MessageBubbleAlignment.right;\n  }\n\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  protected attachments: AudioAttachment[] = [];\n  protected states: AudioRowState[] = [];\n  protected captionText = '';\n  protected isExpanded = false;\n  /** Row indices whose media can't be decoded as audio — rendered as a file row instead of a player. */\n  protected errorIndices = new Set<number>();\n\n  readonly unsupportedIconUrl = 'assets/unsupported.svg';\n\n  readonly playIconUrl = 'assets/play_arrow.svg';\n  readonly pauseIconUrl = 'assets/pause.svg';\n  readonly downloadIconUrl = 'assets/download.svg';\n  /** Chevrons on the expand / collapse bar. Masked, so they take the button's text colour. */\n  readonly expandIconUrl = 'assets/keyboard_arrow_down.svg';\n  readonly collapseIconUrl = 'assets/keyboard_arrow_up.svg';\n\n  /** Rows shown before the list collapses behind a \"+N more\" toggle. Matches the React kit. */\n  static readonly COLLAPSED_MAX = 3;\n\n  private activeEl: HTMLAudioElement | null = null;\n  private activeIndex = -1;\n\n  /**\n   * The rows rendered right now. The collapsed slice is a PREFIX of `attachments`, so a row's\n   * index into `states` is the same in both states — no index remapping needed.\n   */\n  protected get visibleAttachments(): AudioAttachment[] {\n    return this.isExpanded\n      ? this.attachments\n      : this.attachments.slice(0, CometChatAudiosBubbleComponent.COLLAPSED_MAX);\n  }\n\n  protected get hasOverflow(): boolean {\n    return this.remainingCount > 0;\n  }\n\n  protected get remainingCount(): number {\n    return Math.max(0, this.attachments.length - CometChatAudiosBubbleComponent.COLLAPSED_MAX);\n  }\n\n  protected get isMulti(): boolean {\n    return this.attachments.length > 1;\n  }\n\n  /** \"+N more\", localized. */\n  protected getShowMoreLabel(): string {\n    return CometChatLocalize.getLocalizedString('bubble_show_more').replace(\n      '{count}',\n      String(this.remainingCount),\n    );\n  }\n\n  protected toggleExpanded(): void {\n    this.isExpanded = !this.isExpanded;\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Trigger a browser download for one row. Goes through the shared downloader so the file is\n   * actually saved — an anchor aimed straight at the cross-origin CDN would only open it in a tab.\n   */\n  protected download(attachment: AudioAttachment): void {\n    if (!attachment.url) {\n      return;\n    }\n    triggerMediaDownload(attachment.url, attachment.name ?? 'audio');\n  }\n\n  ngOnChanges(): void {\n    this.attachments = extractAudioAttachments(this.message) ?? [];\n    this.states = this.attachments.map((a) => ({\n      currentTime: 0,\n      duration: a.duration ?? 0,\n      playing: false,\n    }));\n    this.errorIndices = new Set<number>();\n    this.captionText = getMediaCaption(this.message);\n  }\n\n  /** True when this row's media failed to load as audio (unsupported type / broken link). */\n  protected isUnsupported(index: number): boolean {\n    return this.errorIndices.has(index);\n  }\n\n  /**\n   * The <audio> couldn't decode the source (it isn't a playable audio file, or the link is broken).\n   * Swap the row to a file-style layout (icon + name + download) instead of a dead player.\n   */\n  protected onAudioError(index: number): void {\n    this.errorIndices = new Set(this.errorIndices).add(index);\n    this.cdr.markForCheck();\n  }\n\n  /** Play/pause one row; pauses any other currently-playing row. */\n  togglePlay(index: number, el: HTMLAudioElement): void {\n    if (this.activeEl && this.activeEl !== el) {\n      this.activeEl.pause();\n      if (this.activeIndex >= 0 && this.states[this.activeIndex]) {\n        this.states[this.activeIndex].playing = false;\n      }\n    }\n    if (el.paused) {\n      void el.play();\n      this.states[index].playing = true;\n      this.activeEl = el;\n      this.activeIndex = index;\n    } else {\n      el.pause();\n      this.states[index].playing = false;\n      this.activeEl = null;\n      this.activeIndex = -1;\n    }\n    this.cdr.markForCheck();\n  }\n\n  onTimeUpdate(index: number, el: HTMLAudioElement): void {\n    this.states[index].currentTime = el.currentTime;\n    this.cdr.markForCheck();\n  }\n\n  onLoadedMetadata(index: number, el: HTMLAudioElement): void {\n    if (Number.isFinite(el.duration)) {\n      this.states[index].duration = el.duration;\n      this.cdr.markForCheck();\n    }\n  }\n\n  onEnded(index: number): void {\n    this.states[index].playing = false;\n    this.states[index].currentTime = 0;\n    if (this.activeIndex === index) {\n      this.activeEl = null;\n      this.activeIndex = -1;\n    }\n    this.cdr.markForCheck();\n  }\n\n  onSeek(index: number, el: HTMLAudioElement, event: Event): void {\n    const value = Number((event.target as HTMLInputElement).value);\n    el.currentTime = value;\n    this.states[index].currentTime = value;\n    this.cdr.markForCheck();\n  }\n\n  /** `mm:ss` with zero-padded minutes (e.g. \"00:32\"), matching the design reference. */\n  formatTime(seconds: number): string {\n    const total = !seconds || seconds < 0 || !Number.isFinite(seconds) ? 0 : Math.floor(seconds);\n    const mins = Math.floor(total / 60);\n    const secs = total % 60;\n    return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;\n  }\n}\n","<div\n  class=\"cometchat-audios-bubble\"\n  [class.cometchat-audios-bubble--sender]=\"isSender\"\n>\n  <!-- Multiple audio files read as one grouped stack, as in the React kit. -->\n  <div\n    class=\"cometchat-audios-bubble__container\"\n    [class.cometchat-audios-bubble__container--multi]=\"isMulti\"\n  >\n    <!-- Up to COLLAPSED_MAX (3) rows; all of them once expanded. The collapsed slice is a prefix,\n         so $index still indexes `states` correctly. -->\n    @for (att of visibleAttachments; track att.url; let i = $index) {\n      <div class=\"cometchat-audios-bubble__item\" [class.cometchat-audios-bubble__item--unsupported]=\"isUnsupported(i)\">\n        @if (isUnsupported(i)) {\n          <!-- Not a playable audio file (unsupported type / broken link): render like a file row. -->\n          <img class=\"cometchat-audios-bubble__file-icon\" [src]=\"unsupportedIconUrl\" alt=\"\" aria-hidden=\"true\" />\n          <span class=\"cometchat-audios-bubble__name cometchat-audios-bubble__name--file\" [title]=\"att.name\">{{ att.name }}</span>\n        } @else {\n          <button\n            type=\"button\"\n            class=\"cometchat-audios-bubble__play\"\n            [attr.aria-label]=\"(states[i].playing ? 'audio_bubble_pause' : 'audio_bubble_play') | translate\"\n            (click)=\"togglePlay(i, audioEl)\"\n          >\n            <div\n              class=\"cometchat-audios-bubble__play-icon\"\n              aria-hidden=\"true\"\n              [style.-webkit-mask-image]=\"'url(' + (states[i].playing ? pauseIconUrl : playIconUrl) + ')'\"\n              [style.mask-image]=\"'url(' + (states[i].playing ? pauseIconUrl : playIconUrl) + ')'\"\n            ></div>\n          </button>\n\n          <!-- Filename, then the seek bar, then the elapsed/total time BELOW it (per design). -->\n          <div class=\"cometchat-audios-bubble__body\">\n            <span class=\"cometchat-audios-bubble__name\" [title]=\"att.name\">{{ att.name }}</span>\n            <input\n              type=\"range\"\n              class=\"cometchat-audios-bubble__slider\"\n              min=\"0\"\n              [max]=\"states[i].duration || 0\"\n              step=\"0.1\"\n              [value]=\"states[i].currentTime\"\n              [attr.aria-label]=\"att.name\"\n              (input)=\"onSeek(i, audioEl, $event)\"\n            />\n            <span class=\"cometchat-audios-bubble__duration\">\n              {{ formatTime(states[i].currentTime) }}/{{ formatTime(states[i].duration) }}\n            </span>\n          </div>\n\n          <audio\n            #audioEl\n            [src]=\"att.url\"\n            preload=\"metadata\"\n            (timeupdate)=\"onTimeUpdate(i, audioEl)\"\n            (loadedmetadata)=\"onLoadedMetadata(i, audioEl)\"\n            (ended)=\"onEnded(i)\"\n            (error)=\"onAudioError(i)\"\n          ></audio>\n        }\n\n        <button\n          *ngIf=\"att.url\"\n          type=\"button\"\n          class=\"cometchat-audios-bubble__download\"\n          [attr.aria-label]=\"'file_bubble_download' | translate\"\n          (click)=\"download(att)\"\n        >\n          <div\n            class=\"cometchat-audios-bubble__download-icon\"\n            aria-hidden=\"true\"\n            [style.-webkit-mask-image]=\"'url(' + downloadIconUrl + ')'\"\n            [style.mask-image]=\"'url(' + downloadIconUrl + ')'\"\n          ></div>\n        </button>\n      </div>\n    }\n\n    <!-- \"Show N more\" (collapsed) -->\n    @if (hasOverflow && !isExpanded) {\n      <button\n        type=\"button\"\n        class=\"cometchat-audios-bubble__toggle\"\n        [attr.aria-expanded]=\"false\"\n        (click)=\"toggleExpanded()\"\n      >\n        <span\n          class=\"cometchat-audios-bubble__toggle-icon\"\n          aria-hidden=\"true\"\n          [style.-webkit-mask-image]=\"'url(' + expandIconUrl + ')'\"\n          [style.mask-image]=\"'url(' + expandIconUrl + ')'\"\n        ></span>\n        {{ getShowMoreLabel() }}\n      </button>\n    }\n\n    <!-- \"Show less\" (expanded) -->\n    @if (hasOverflow && isExpanded) {\n      <button\n        type=\"button\"\n        class=\"cometchat-audios-bubble__toggle\"\n        [attr.aria-expanded]=\"true\"\n        (click)=\"toggleExpanded()\"\n      >\n        <span\n          class=\"cometchat-audios-bubble__toggle-icon\"\n          aria-hidden=\"true\"\n          [style.-webkit-mask-image]=\"'url(' + collapseIconUrl + ')'\"\n          [style.mask-image]=\"'url(' + collapseIconUrl + ')'\"\n        ></span>\n        {{ 'file_bubble_show_less' | translate }}\n      </button>\n    }\n  </div>\n\n  <!-- Caption via the text bubble, so mentions / URLs / link previews format the same way they\n       do on the image, video and file bubbles. -->\n  @if (captionText) {\n    <div class=\"cometchat-audios-bubble__caption\">\n      <cometchat-text-bubble\n        [message]=\"$any(message)\"\n        [alignment]=\"alignment\"\n      ></cometchat-text-bubble>\n    </div>\n  }\n</div>\n","/**\n * CometChatAudioBubbleComponent\n *\n * Renders audio attachments with waveform visualization, playback controls,\n * download functionality, and support for multiple audio attachments.\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  AfterViewInit,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  ViewChild,\n  ViewChildren,\n  ElementRef,\n  QueryList,\n  NgZone,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatTextBubbleComponent } from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport type { AudioAttachment, AudioState } from '../../modals';\nimport { WaveSurfer } from './wavesurfer';\nimport { MediaControlsService } from '../../services/media-controls.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport {\n  resolveWaveSurferColors,\n  createWaveSurferInstance,\n  attachWaveSurferEvents,\n  downloadAudioWithProgress,\n  triggerFileDownload,\n  extractAudioAttachments,\n  hasAudioCaption,\n  getAudioRegionAriaLabel,\n  getPlayPauseAriaLabel,\n  announceSeekPosition,\n  announcePlaybackComplete,\n  announceSeekStart,\n  announceSeekEnd,\n  getProgressDashArray,\n  formatAudioTime,\n  getExpandAriaLabel,\n} from './cometchat-audio-bubble.utils';\n\n/** Global singleton tracking the currently playing audio across all bubbles. */\nexport const currentAudioPlayer: {\n  instance: WaveSurfer | null;\n  setIsPlaying: ((isPlaying: boolean) => void) | null;\n} = { instance: null, setIsPlaying: null };\n\n/** Pauses the currently playing audio if any. */\nexport function closeCurrentMediaPlayer(emitEvent = true): void {\n  if (currentAudioPlayer.instance) {\n    currentAudioPlayer.instance.pause();\n    if (currentAudioPlayer.setIsPlaying && emitEvent) {\n      currentAudioPlayer.setIsPlaying(false);\n    }\n    currentAudioPlayer.instance = null;\n    currentAudioPlayer.setIsPlaying = null;\n  }\n}\n\n/**\n * CometChatAudioBubbleComponent renders an audio message with a waveform player.\n * @deprecated For audio *files*, prefer {@link CometChatAudiosBubbleComponent}, which the message\n * bubble now renders for every non-voice-note audio message. This bubble is intentionally retained\n * as the renderer for **voice notes** (via {@link CometChatVoiceNoteBubbleComponent}).\n */\n@Component({\n  selector: 'cometchat-audio-bubble',\n  standalone: true,\n  templateUrl: './cometchat-audio-bubble.component.html',\n  styleUrls: ['./cometchat-audio-bubble.component.css'],\n  imports: [CommonModule, TranslatePipe, CometChatTextBubbleComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatAudioBubbleComponent implements OnInit, OnChanges, OnDestroy, AfterViewInit {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  @Output() playStateChange = new EventEmitter<{ isPlaying: boolean; attachment: AudioAttachment }>();\n  @Output() downloadStart = new EventEmitter<AudioAttachment>();\n  @Output() downloadComplete = new EventEmitter<AudioAttachment>();\n  @Output() downloadError = new EventEmitter<{ attachment: AudioAttachment; error: Error }>();\n  @Output() expandChange = new EventEmitter<boolean>();\n\n  @ViewChild('collapseButton') collapseButton?: ElementRef<HTMLButtonElement>;\n  @ViewChild('expandIndicator') expandIndicator?: ElementRef<HTMLButtonElement>;\n  @ViewChildren('waveformContainer') waveformContainers!: QueryList<ElementRef<HTMLDivElement>>;\n\n  protected attachments: AudioAttachment[] = [];\n  protected isExpanded = false;\n  protected hasCaption = false;\n  protected isOutgoing = false;\n  protected audioStates = new Map<number, AudioState>();\n\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  private mediaControlsService = inject(MediaControlsService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  constructor(private cdr: ChangeDetectorRef, private ngZone: NgZone) {}\n\n  // ── Lifecycle ─────────────────────────────────────────────────────────────\n\n  ngOnInit(): void { this.processMessage(); }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    const messageChange = changes['message'];\n    const alignmentChange = changes['alignment'];\n    if (messageChange || alignmentChange) {\n      this.cleanupWaveSurferInstances();\n      if (messageChange && !messageChange.firstChange) { this.isExpanded = false; }\n      this.processMessage();\n      if (\n        (messageChange && !messageChange.firstChange) ||\n        (alignmentChange && !alignmentChange.firstChange)\n      ) {\n        this.pendingTimers.push(setTimeout(() => this.initializeAllWaveSurfers(), 0));\n      }\n    }\n  }\n\n  ngAfterViewInit(): void { this.initializeAllWaveSurfers(); }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.cleanupWaveSurferInstances();\n  }\n\n  // ── Message Processing ────────────────────────────────────────────────────\n\n  private processMessage(): void {\n    if (!this.message) {\n      CometChatLogger.warn('CometChatAudioBubble', 'Message is null or undefined');\n      this.attachments = []; this.hasCaption = false; return;\n    }\n    this.attachments = extractAudioAttachments(this.message);\n    this.hasCaption = hasAudioCaption(this.message);\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n    this.cdr.markForCheck();\n  }\n\n  // ── WaveSurfer Management ─────────────────────────────────────────────────\n\n  private cleanupWaveSurferInstances(): void {\n    // Clear global player ref if owned by this component\n    if (currentAudioPlayer.instance) {\n      for (const [, s] of this.audioStates) {\n        if (s.waveSurfer === currentAudioPlayer.instance) {\n          currentAudioPlayer.instance = null; currentAudioPlayer.setIsPlaying = null; break;\n        }\n      }\n    }\n    this.audioStates.forEach(s => {\n      if (s.waveSurfer) { s.waveSurfer.unAll(); try { s.waveSurfer.destroy(); } catch { /* ignore */ } }\n      s.abortController?.abort();\n    });\n    this.audioStates.clear();\n  }\n\n  protected getAudioState(index: number): AudioState {\n    if (!this.audioStates.has(index)) {\n      this.audioStates.set(index, {\n        waveSurfer: null, isPlaying: false, isLoading: true, hasError: false,\n        currentTime: 0, duration: 0, isDownloading: false, downloadProgress: 0, abortController: null,\n      });\n    }\n    return this.audioStates.get(index)!;\n  }\n\n  private initializeAllWaveSurfers(): void {\n    if (!this.attachments.length) return;\n    this.initializeWaveSurfer(0);\n    if (this.isExpanded) {\n      for (let i = 1; i < this.attachments.length; i++) { this.initializeWaveSurfer(i); }\n    }\n  }\n\n  private initializeWaveSurfer(index: number): void {\n    const attachment = this.attachments[index];\n    if (!attachment?.url) return;\n    const containers = this.waveformContainers?.toArray();\n    if (!containers?.[index]) return;\n    const container = containers[index].nativeElement;\n    const state = this.getAudioState(index);\n    if (state.waveSurfer) return;\n    state.isLoading = true;\n    this.cdr.markForCheck();\n    const colors = resolveWaveSurferColors(this.isOutgoing);\n    const waveSurfer = createWaveSurferInstance(container, colors);\n    state.waveSurfer = waveSurfer;\n    this.setupWaveSurferEvents(waveSurfer, index);\n    waveSurfer.load(attachment.url).catch((error: Error) => this.handleLoadError(error, index));\n  }\n\n  private setupWaveSurferEvents(waveSurfer: WaveSurfer, index: number): void {\n    attachWaveSurferEvents(waveSurfer, index, {\n      onReady: (i, duration) => this.ngZone.run(() => {\n        const s = this.getAudioState(i); s.isLoading = false; s.duration = duration; this.cdr.markForCheck();\n      }),\n      onTimeUpdate: (i, currentTime) => this.ngZone.run(() => {\n        this.getAudioState(i).currentTime = currentTime; this.cdr.markForCheck();\n      }),\n      onFinish: (i) => this.ngZone.run(() => {\n        const s = this.getAudioState(i);\n        waveSurfer.stop(); waveSurfer.seekTo(0);\n        s.isPlaying = false; s.currentTime = 0;\n        if (currentAudioPlayer.instance === waveSurfer) {\n          currentAudioPlayer.instance = null; currentAudioPlayer.setIsPlaying = null;\n        }\n        announcePlaybackComplete(this.liveAnnouncer);\n        const attachment = this.attachments[i];\n        if (attachment) { this.playStateChange.emit({ isPlaying: false, attachment }); }\n        this.cdr.markForCheck();\n      }),\n      onPlay: (i) => this.ngZone.run(() => { this.getAudioState(i).isPlaying = true; this.cdr.markForCheck(); }),\n      onPause: (i) => this.ngZone.run(() => { this.getAudioState(i).isPlaying = false; this.cdr.markForCheck(); }),\n      onError: (i, error) => this.handleLoadError(error, i),\n    });\n  }\n\n  private handleLoadError(error: Error, index: number): void {\n    CometChatLogger.error('CometChatAudioBubble', `Failed to load audio at index ${index}:`, error);\n    this.ngZone.run(() => {\n      const state = this.getAudioState(index);\n      state.isLoading = false; state.hasError = true; state.waveSurfer = null;\n      this.cdr.markForCheck();\n    });\n  }\n\n  // ── Playback Controls ─────────────────────────────────────────────────────\n\n  protected onPlayPause(index: number): void {\n    const state = this.getAudioState(index);\n    const waveSurfer = state.waveSurfer;\n    if (!waveSurfer || state.isLoading) return;\n    const attachment = this.attachments[index];\n    if (!attachment) return;\n    if (state.isPlaying) {\n      waveSurfer.pause(); state.isPlaying = false;\n      if (currentAudioPlayer.instance === waveSurfer) { currentAudioPlayer.instance = null; currentAudioPlayer.setIsPlaying = null; }\n      this.playStateChange.emit({ isPlaying: false, attachment });\n    } else {\n      if (currentAudioPlayer.instance && currentAudioPlayer.instance !== waveSurfer) { closeCurrentMediaPlayer(true); }\n      waveSurfer.play()\n        .then(() => {\n          state.isPlaying = true;\n          currentAudioPlayer.instance = waveSurfer;\n          currentAudioPlayer.setIsPlaying = (v: boolean) => { state.isPlaying = v; this.cdr.markForCheck(); };\n          this.playStateChange.emit({ isPlaying: true, attachment });\n          this.cdr.markForCheck();\n        })\n        .catch((e: Error) => { CometChatLogger.error('CometChatAudioBubble', 'Failed to play audio:', e); state.isPlaying = false; this.cdr.markForCheck(); });\n    }\n    this.cdr.markForCheck();\n  }\n\n  // ── Download ──────────────────────────────────────────────────────────────\n\n  protected onDownload(index: number): void {\n    const attachment = this.attachments[index];\n    if (!attachment?.url) return;\n    const state = this.getAudioState(index);\n    if (state.isDownloading) return;\n    state.isDownloading = true; state.downloadProgress = 0;\n    state.abortController = new AbortController();\n    this.downloadStart.emit(attachment);\n    this.cdr.markForCheck();\n    downloadAudioWithProgress(\n      attachment.url,\n      (progress: number) => { state.downloadProgress = progress; this.cdr.markForCheck(); },\n      state.abortController.signal\n    ).then((blob: Blob) => {\n      triggerFileDownload(blob, attachment.name);\n      state.isDownloading = false; state.downloadProgress = 0; state.abortController = null;\n      this.downloadComplete.emit(attachment);\n      this.cdr.markForCheck();\n    }).catch((error: Error) => { this.handleDownloadError(error, index); });\n  }\n\n  protected onCancelDownload(index: number): void {\n    const state = this.getAudioState(index);\n    if (state.abortController) { state.abortController.abort(); }\n    state.isDownloading = false; state.downloadProgress = 0; state.abortController = null;\n    this.cdr.markForCheck();\n  }\n\n  private handleDownloadError(error: Error, index: number): void {\n    const state = this.getAudioState(index);\n    const attachment = this.attachments[index];\n    if (error.name === 'AbortError') {\n      state.isDownloading = false; state.downloadProgress = 0; state.abortController = null;\n      this.cdr.markForCheck(); return;\n    }\n    CometChatLogger.error('CometChatAudioBubble', `Download failed for index ${index}:`, error);\n    state.isDownloading = false; state.downloadProgress = 0; state.abortController = null;\n    if (attachment) { this.downloadError.emit({ attachment, error }); }\n    this.cdr.markForCheck();\n  }\n\n  // ── Expand/Collapse ───────────────────────────────────────────────────────\n\n  protected toggleExpanded(): void {\n    const wasExpanded = this.isExpanded;\n    this.isExpanded = !this.isExpanded;\n    this.expandChange.emit(this.isExpanded);\n    this.cdr.markForCheck();\n    if (this.isExpanded) {\n      this.pendingTimers.push(setTimeout(() => {\n        for (let i = 1; i < this.attachments.length; i++) { this.initializeWaveSurfer(i); }\n        this.collapseButton?.nativeElement?.focus();\n      }, 0));\n    } else if (wasExpanded) {\n      this.pendingTimers.push(setTimeout(() => { this.expandIndicator?.nativeElement?.focus(); }, 0));\n    }\n  }\n\n  // ── Keyboard Navigation ───────────────────────────────────────────────────\n\n  protected onWaveformKeydown(event: KeyboardEvent, index: number): void {\n    const state = this.getAudioState(index);\n    const waveSurfer = state.waveSurfer;\n    if (!waveSurfer || state.isLoading || state.hasError || state.duration <= 0) return;\n    const result = this.mediaControlsService.handleKeyDown(event, {\n      currentTime: state.currentTime, duration: state.duration,\n      isPlaying: state.isPlaying, seekIncrement: 5,\n    });\n    switch (result.action) {\n      case 'play': case 'pause': this.onPlayPause(index); break;\n      case 'seek':\n        if (result.seekTime !== undefined) {\n          waveSurfer.seekTo(result.seekTime / state.duration);\n          state.currentTime = result.seekTime;\n          announceSeekPosition(result.seekTime, this.mediaControlsService, this.liveAnnouncer);\n          this.cdr.markForCheck();\n        }\n        break;\n      case 'seekStart':\n        waveSurfer.seekTo(0); state.currentTime = 0;\n        announceSeekStart(this.liveAnnouncer); this.cdr.markForCheck(); break;\n      case 'seekEnd':\n        waveSurfer.seekTo(1); state.currentTime = state.duration;\n        announceSeekEnd(this.liveAnnouncer); this.cdr.markForCheck(); break;\n    }\n  }\n\n  private activateOnKey(event: KeyboardEvent, fn: () => void): void {\n    if (event.key === ' ' || event.key === 'Enter') { event.preventDefault(); fn(); }\n  }\n\n  protected onPlayPauseKeydown(event: KeyboardEvent, index: number): void {\n    this.activateOnKey(event, () => this.onPlayPause(index));\n  }\n  protected onDownloadKeydown(event: KeyboardEvent, index: number): void {\n    this.activateOnKey(event, () => this.onDownload(index));\n  }\n  protected onCancelDownloadKeydown(event: KeyboardEvent, index: number): void {\n    this.activateOnKey(event, () => this.onCancelDownload(index));\n  }\n  protected onExpandCollapseKeydown(event: KeyboardEvent): void {\n    this.activateOnKey(event, () => this.toggleExpanded());\n  }\n\n  protected getAudioRegionAriaLabel(index: number): string {\n    return getAudioRegionAriaLabel(this.getAudioState(index).duration, this.mediaControlsService);\n  }\n\n  protected getPlayPauseAriaLabel(index: number): string {\n    return getPlayPauseAriaLabel(this.getAudioState(index).isPlaying);\n  }\n\n  protected getProgressValueText(index: number): string {\n    const state = this.getAudioState(index);\n    return this.mediaControlsService.getProgressValueText(state.currentTime, state.duration);\n  }\n\n  protected getProgressDashArray(index: number): string {\n    return getProgressDashArray(this.getAudioState(index).downloadProgress);\n  }\n\n  protected formatTime(timeInSeconds: number): string {\n    return formatAudioTime(timeInSeconds);\n  }\n\n  protected getRemainingAudiosCount(): number {\n    return this.attachments.length - 1;\n  }\n\n  protected getExpandAriaLabel(): string {\n    return getExpandAriaLabel(this.getRemainingAudiosCount());\n  }\n}\n","<!-- Audio Bubble Component Template -->\n<!-- @see Requirements 2.1, 2.2, 2.3, 2.4, 7.1-7.10, 10.1-10.11 -->\n<div\n  class=\"cometchat-audio-bubble\"\n  [class.cometchat-audio-bubble--sender]=\"isOutgoing\"\n  [class.cometchat-audio-bubble--receiver]=\"!isOutgoing\"\n  role=\"region\"\n  [attr.aria-label]=\"getAudioRegionAriaLabel(0)\">\n\n  <!-- Audio Container -->\n  <div class=\"cometchat-audio-bubble__container\">\n\n    <!-- First Audio (Always Visible) -->\n    @if (attachments.length > 0) {\n      <div\n        class=\"cometchat-audio-bubble__audio-item\"\n        [class.cometchat-audio-bubble__audio-item--loading]=\"getAudioState(0).isLoading\"\n        [class.cometchat-audio-bubble__audio-item--error]=\"getAudioState(0).hasError\"\n        role=\"group\"\n        [attr.aria-label]=\"attachments[0]?.name || ('audio_bubble_audio' | translate)\">\n\n        <!-- Leading View: Play/Pause Button -->\n        <!-- @see Requirements 7.1, 7.2, 7.7, 10.1, 10.2, 10.3 -->\n        <div class=\"cometchat-audio-bubble__leading-view\">\n          @if (getAudioState(0).hasError) {\n            <!-- Error state: show disabled play button -->\n            <button\n              type=\"button\"\n              class=\"cometchat-audio-bubble__play-button\"\n              disabled\n              [attr.aria-label]=\"'audio_bubble_load_error' | translate\"\n              [attr.aria-disabled]=\"true\">\n            </button>\n          } @else if (!getAudioState(0).isPlaying) {\n            <button\n              type=\"button\"\n              class=\"cometchat-audio-bubble__play-button\"\n              (click)=\"onPlayPause(0)\"\n              (keydown)=\"onPlayPauseKeydown($event, 0)\"\n              [disabled]=\"getAudioState(0).isLoading\"\n              [attr.aria-label]=\"getPlayPauseAriaLabel(0)\"\n              [attr.aria-disabled]=\"getAudioState(0).isLoading\">\n            </button>\n          } @else {\n            <button\n              type=\"button\"\n              class=\"cometchat-audio-bubble__pause-button\"\n              (click)=\"onPlayPause(0)\"\n              (keydown)=\"onPlayPauseKeydown($event, 0)\"\n              [attr.aria-label]=\"getPlayPauseAriaLabel(0)\">\n            </button>\n          }\n        </div>\n\n        <!-- Body: Waveform + Time + Download (ENG-35743: download below waveform) -->\n        <!-- @see Requirements 7.3, 7.4, 7.5, 7.6, 7.8, 7.9, 10.4, 10.5, 10.6, 10.7, 10.8 -->\n        <div class=\"cometchat-audio-bubble__body\">\n          @if (getAudioState(0).hasError) {\n            <!-- Error state: show error message -->\n            <div \n              class=\"cometchat-audio-bubble__error-message\"\n              role=\"alert\"\n              aria-live=\"polite\">\n              {{ 'audio_bubble_load_error' | translate }}\n            </div>\n          } @else {\n            <div class=\"cometchat-audio-bubble__waveform-row\">\n              <div\n                #waveformContainer\n                class=\"cometchat-audio-bubble__waveform\"\n                [class.cometchat-audio-bubble__waveform--loading]=\"getAudioState(0).isLoading\"\n                [attr.data-index]=\"0\"\n                tabindex=\"0\"\n                role=\"slider\"\n                [attr.aria-label]=\"'audio_bubble_waveform' | translate\"\n                [attr.aria-valuemin]=\"0\"\n                [attr.aria-valuemax]=\"getAudioState(0).duration\"\n                [attr.aria-valuenow]=\"getAudioState(0).currentTime\"\n                [attr.aria-valuetext]=\"getProgressValueText(0)\"\n                [attr.aria-disabled]=\"getAudioState(0).isLoading\"\n                (keydown)=\"onWaveformKeydown($event, 0)\">\n              </div>\n              <!-- Download control: aligned with waveform row -->\n              @if (!getAudioState(0).isDownloading) {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-audio-bubble__download-button\"\n                  (click)=\"onDownload(0)\"\n                  (keydown)=\"onDownloadKeydown($event, 0)\"\n                  [disabled]=\"getAudioState(0).isLoading || getAudioState(0).hasError\"\n                  [attr.aria-label]=\"'audio_bubble_download' | translate\"\n                  [attr.aria-disabled]=\"getAudioState(0).isLoading || getAudioState(0).hasError\">\n                </button>\n              } @else {\n                <div \n                  class=\"cometchat-audio-bubble__download-progress\"\n                  role=\"progressbar\"\n                  [attr.aria-valuenow]=\"getAudioState(0).downloadProgress\"\n                  [attr.aria-valuemin]=\"0\"\n                  [attr.aria-valuemax]=\"100\"\n                  [attr.aria-label]=\"'audio_bubble_downloading' | translate\">\n                  <svg\n                    width=\"24\"\n                    height=\"24\"\n                    viewBox=\"0 0 24 24\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                    aria-hidden=\"true\">\n                    <circle\n                      class=\"cometchat-audio-bubble__progress-bg\"\n                      cx=\"12\"\n                      cy=\"12\"\n                      r=\"10\" />\n                    <circle\n                      class=\"cometchat-audio-bubble__progress-fg\"\n                      cx=\"12\"\n                      cy=\"12\"\n                      r=\"10\"\n                      [style.strokeDasharray]=\"getProgressDashArray(0)\" />\n                  </svg>\n                  <button\n                    type=\"button\"\n                    class=\"cometchat-audio-bubble__cancel-button\"\n                    (click)=\"onCancelDownload(0)\"\n                    (keydown)=\"onCancelDownloadKeydown($event, 0)\"\n                    [attr.aria-label]=\"'audio_bubble_cancel_download' | translate\">\n                  </button>\n                </div>\n              }\n            </div>\n            <div class=\"cometchat-audio-bubble__time-download-row\">\n              <div \n                class=\"cometchat-audio-bubble__time\"\n                aria-hidden=\"true\">\n                @if (getAudioState(0).isLoading) {\n                  {{ 'audio_bubble_loading' | translate }}\n                } @else {\n                  {{ formatTime(getAudioState(0).currentTime) }} / {{ formatTime(getAudioState(0).duration) }}\n                }\n              </div>\n            </div>\n          }\n        </div>\n      </div>\n    }\n\n    <!-- Expand Indicator (Multiple Audios, Collapsed) -->\n    <!-- @see Requirements 10.9 -->\n    @if (attachments.length > 1 && !isExpanded) {\n      <button\n        #expandIndicator\n        type=\"button\"\n        class=\"cometchat-audio-bubble__expand-indicator\"\n        (click)=\"toggleExpanded()\"\n        (keydown)=\"onExpandCollapseKeydown($event)\"\n        [attr.aria-label]=\"getExpandAriaLabel()\"\n        [attr.aria-expanded]=\"false\"\n        aria-controls=\"audio-list\">\n        +{{ getRemainingAudiosCount() }}\n      </button>\n    }\n\n    <!-- Additional Audios (Expanded) -->\n    @if (isExpanded && attachments.length > 1) {\n      <div \n        id=\"audio-list\"\n        class=\"cometchat-audio-bubble__audio-list\"\n        role=\"list\"\n        [attr.aria-label]=\"'audio_bubble_additional_audios' | translate\">\n        @for (attachment of attachments.slice(1); track attachment.url; let i = $index) {\n          <div\n            class=\"cometchat-audio-bubble__audio-item\"\n            [class.cometchat-audio-bubble__audio-item--loading]=\"getAudioState(i + 1).isLoading\"\n            [class.cometchat-audio-bubble__audio-item--error]=\"getAudioState(i + 1).hasError\"\n            role=\"listitem\"\n            [attr.aria-label]=\"getAudioRegionAriaLabel(i + 1)\">\n\n            <!-- Leading View: Play/Pause Button -->\n            <!-- @see Requirements 7.1, 7.2, 7.7 -->\n            <div class=\"cometchat-audio-bubble__leading-view\">\n              @if (getAudioState(i + 1).hasError) {\n                <!-- Error state: show disabled play button -->\n                <button\n                  type=\"button\"\n                  class=\"cometchat-audio-bubble__play-button\"\n                  disabled\n                  [attr.aria-label]=\"'audio_bubble_load_error' | translate\"\n                  [attr.aria-disabled]=\"true\">\n                </button>\n              } @else if (!getAudioState(i + 1).isPlaying) {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-audio-bubble__play-button\"\n                  (click)=\"onPlayPause(i + 1)\"\n                  (keydown)=\"onPlayPauseKeydown($event, i + 1)\"\n                  [disabled]=\"getAudioState(i + 1).isLoading\"\n                  [attr.aria-label]=\"getPlayPauseAriaLabel(i + 1)\"\n                  [attr.aria-disabled]=\"getAudioState(i + 1).isLoading\">\n                </button>\n              } @else {\n                <button\n                  type=\"button\"\n                  class=\"cometchat-audio-bubble__pause-button\"\n                  (click)=\"onPlayPause(i + 1)\"\n                  (keydown)=\"onPlayPauseKeydown($event, i + 1)\"\n                  [attr.aria-label]=\"getPlayPauseAriaLabel(i + 1)\">\n                </button>\n              }\n            </div>\n\n            <!-- Body: Waveform + Time + Download (ENG-35743: download below waveform) -->\n            <!-- @see Requirements 7.3, 7.4, 7.5, 7.6, 7.8, 7.9 -->\n            <div class=\"cometchat-audio-bubble__body\">\n              @if (getAudioState(i + 1).hasError) {\n                <!-- Error state: show error message -->\n                <div \n                  class=\"cometchat-audio-bubble__error-message\"\n                  role=\"alert\"\n                  aria-live=\"polite\">\n                  {{ 'audio_bubble_load_error' | translate }}\n                </div>\n              } @else {\n                <div class=\"cometchat-audio-bubble__waveform-row\">\n                  <div\n                    #waveformContainer\n                    class=\"cometchat-audio-bubble__waveform\"\n                    [class.cometchat-audio-bubble__waveform--loading]=\"getAudioState(i + 1).isLoading\"\n                    [attr.data-index]=\"i + 1\"\n                    tabindex=\"0\"\n                    role=\"slider\"\n                    [attr.aria-label]=\"'audio_bubble_waveform' | translate\"\n                    [attr.aria-valuemin]=\"0\"\n                    [attr.aria-valuemax]=\"getAudioState(i + 1).duration\"\n                    [attr.aria-valuenow]=\"getAudioState(i + 1).currentTime\"\n                    [attr.aria-valuetext]=\"getProgressValueText(i + 1)\"\n                    [attr.aria-disabled]=\"getAudioState(i + 1).isLoading\"\n                    (keydown)=\"onWaveformKeydown($event, i + 1)\">\n                  </div>\n                  @if (!getAudioState(i + 1).isDownloading) {\n                    <button\n                      type=\"button\"\n                      class=\"cometchat-audio-bubble__download-button\"\n                      (click)=\"onDownload(i + 1)\"\n                      (keydown)=\"onDownloadKeydown($event, i + 1)\"\n                      [disabled]=\"getAudioState(i + 1).isLoading || getAudioState(i + 1).hasError\"\n                      [attr.aria-label]=\"'audio_bubble_download' | translate\"\n                      [attr.aria-disabled]=\"getAudioState(i + 1).isLoading || getAudioState(i + 1).hasError\">\n                    </button>\n                  } @else {\n                    <div \n                      class=\"cometchat-audio-bubble__download-progress\"\n                      role=\"progressbar\"\n                      [attr.aria-valuenow]=\"getAudioState(i + 1).downloadProgress\"\n                      [attr.aria-valuemin]=\"0\"\n                      [attr.aria-valuemax]=\"100\"\n                      [attr.aria-label]=\"'audio_bubble_downloading' | translate\">\n                      <svg\n                        width=\"24\"\n                        height=\"24\"\n                        viewBox=\"0 0 24 24\"\n                        xmlns=\"http://www.w3.org/2000/svg\"\n                        aria-hidden=\"true\">\n                        <circle\n                          class=\"cometchat-audio-bubble__progress-bg\"\n                          cx=\"12\"\n                          cy=\"12\"\n                          r=\"10\" />\n                        <circle\n                          class=\"cometchat-audio-bubble__progress-fg\"\n                          cx=\"12\"\n                          cy=\"12\"\n                          r=\"10\"\n                          [style.strokeDasharray]=\"getProgressDashArray(i + 1)\" />\n                      </svg>\n                      <button\n                        type=\"button\"\n                        class=\"cometchat-audio-bubble__cancel-button\"\n                        (click)=\"onCancelDownload(i + 1)\"\n                        (keydown)=\"onCancelDownloadKeydown($event, i + 1)\"\n                        [attr.aria-label]=\"'audio_bubble_cancel_download' | translate\">\n                      </button>\n                    </div>\n                  }\n                </div>\n                <div class=\"cometchat-audio-bubble__time-download-row\">\n                  <div \n                    class=\"cometchat-audio-bubble__time\"\n                    aria-hidden=\"true\">\n                    @if (getAudioState(i + 1).isLoading) {\n                      {{ 'audio_bubble_loading' | translate }}\n                    } @else {\n                      {{ formatTime(getAudioState(i + 1).currentTime) }} / {{ formatTime(getAudioState(i + 1).duration) }}\n                    }\n                  </div>\n                </div>\n              }\n            </div>\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Collapse Control (Expanded) -->\n    <!-- @see Requirements 10.9 -->\n    @if (isExpanded && attachments.length > 1) {\n      <button\n        #collapseButton\n        type=\"button\"\n        class=\"cometchat-audio-bubble__collapse-control\"\n        (click)=\"toggleExpanded()\"\n        (keydown)=\"onExpandCollapseKeydown($event)\"\n        [attr.aria-label]=\"'audio_bubble_show_less' | translate\"\n        [attr.aria-expanded]=\"true\"\n        aria-controls=\"audio-list\">\n        {{ 'audio_bubble_show_less' | translate }}\n      </button>\n    }\n  </div>\n\n  <!-- Caption -->\n  @if (hasCaption) {\n    <div class=\"cometchat-audio-bubble__caption\">\n      <cometchat-text-bubble\n        [message]=\"$any(message)\"\n        [alignment]=\"alignment\">\n      </cometchat-text-bubble>\n    </div>\n  }\n</div>\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatAudioBubbleComponent } from '../cometchat-audio-bubble/cometchat-audio-bubble.component';\n\n/**\n * CometChatVoiceNoteBubble — receive-side bubble for a voice note (Phase 2).\n *\n * A voice note is a `MESSAGE_TYPE.AUDIO` message tagged with `metadata.audioType === 'voiceNote'`\n * (set by the composer's recorder). It looks like today's voice note, so this delegates to the\n * existing `cometchat-audio-bubble` (waveform player). A distinct component so the routing can\n * pick it over `CometChatAudiosBubble` (audio files).\n */\n@Component({\n  selector: 'cometchat-voice-note-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatAudioBubbleComponent],\n  template: `<cometchat-audio-bubble\n    [message]=\"message\"\n    [alignment]=\"alignment\"\n  ></cometchat-audio-bubble>`,\n})\nexport class CometChatVoiceNoteBubbleComponent {\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n}\n","import { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatFileBubbleComponent } from '../cometchat-file-bubble/cometchat-file-bubble.component';\n\n/**\n * CometChatFilesBubble — receive-side bubble for a (multi-)file message (Phase 2).\n * Delegates to the existing `cometchat-file-bubble` (expandable file list + caption). A distinct\n * component so the batch-aware width and grouping live here; the single-attachment\n * `cometchat-file-bubble` is the deprecated primitive it delegates to.\n */\n@Component({\n  selector: 'cometchat-files-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatFileBubbleComponent],\n  template: `<cometchat-file-bubble\n    [message]=\"message\"\n    [alignment]=\"alignment\"\n  ></cometchat-file-bubble>`,\n  // Batch bubbles share one width (--cometchat-multi-attachment-width, default 400px = the React\n  // kit's container cap) so every message in a batch renders at the same width.\n  styles: [`\n    :host { display: block; width: 100%; }\n    :host {\n      --cometchat-batch-width: var(--cometchat-multi-attachment-width, 400px);\n      --cometchat-file-bubble-width: 100%;\n      --cometchat-file-bubble-container-max-width: var(--cometchat-batch-width);\n    }\n  `],\n})\nexport class CometChatFilesBubbleComponent {\n  @Input({ required: true }) message!: CometChat.MediaMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n  /** Accepted for parity with other bubbles (file bubble has no interaction toggle). */\n  @Input() disableInteraction = false;\n}\n","/**\n * CometChatUserItem renders a single user item with state management,\n * avatar, custom templates, context menu, and keyboard accessibility.\n * @see Requirements 1.1-1.6\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  inject,\n  computed,\n  signal,\n  booleanAttribute, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatContextMenuComponent } from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { Placement } from '../../Enums/Enums';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\n\n/**\n * CometChatUserItem is a standalone Angular component that renders\n * a single user item with support for:\n * - State management (active, selected, focused)\n * - User avatar with online/offline status indicator\n * - Custom templates for leading, title, subtitle, and trailing sections\n * - Context menu integration\n * - Full keyboard accessibility with ARIA support\n *\n * @example\n * ```html\n * <cometchat-user-item\n *   [user]=\"user\"\n *   [isActive]=\"isActive\"\n *   [isSelected]=\"isSelected\"\n *   (itemClick)=\"onItemClick($event)\">\n * </cometchat-user-item>\n * ```\n * @see Requirements 1.1-1.6\n */\n@Component({\n  selector: 'cometchat-user-item',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatContextMenuComponent],\n  templateUrl: './cometchat-user-item.component.html',\n  styleUrls: ['./cometchat-user-item.component.css'],\n})\nexport class CometChatUserItemComponent {\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  @Input({ required: true }) user!: CometChat.User;\n  @Input() isActive = false;\n  @Input() isSelected = false;\n  @Input() isFocused = false;\n  @Input() tabIndex = -1;\n\n  private hideUserStatusExplicitlySet = signal(false);\n  private disableDefaultContextMenuExplicitlySet = signal(false);\n  private _hideUserStatus = signal(false);\n  private _disableDefaultContextMenu = signal(true);\n\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n\n  @Input({ transform: booleanAttribute })\n  set disableDefaultContextMenu(value: boolean) { this._disableDefaultContextMenu.set(value); this.disableDefaultContextMenuExplicitlySet.set(true); }\n  get disableDefaultContextMenu(): boolean { return this._disableDefaultContextMenu(); }\n\n  effectiveHideUserStatus = computed(() => {\n    if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus();\n    if (this.globalConfig?.hideUserStatus !== undefined) return this.globalConfig.hideUserStatus;\n    return false;\n  });\n\n  effectiveDisableDefaultContextMenu = computed(() => {\n    if (this.disableDefaultContextMenuExplicitlySet()) return this._disableDefaultContextMenu();\n    if (this.globalConfig?.disableDefaultContextMenu !== undefined) return this.globalConfig.disableDefaultContextMenu;\n    return true;\n  });\n\n  @Input() contextMenuOptions?: CometChatOption[];\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.User }>;\n\n  @Output() itemClick = new EventEmitter<CometChat.User>();\n  @Output() itemSelect = new EventEmitter<{ user: CometChat.User; selected: boolean; }>();\n  @Output() contextMenuOpen = new EventEmitter<CometChat.User>();\n  @Output() contextMenuOptionClick = new EventEmitter<{ option: CometChatOption; user: CometChat.User; }>();\n\n  readonly Placement = Placement;\n\n  get avatarImage(): string { return this.user?.getAvatar() || ''; }\n  get avatarName(): string { return this.user?.getName() || ''; }\n  get userStatus(): string { return this.user?.getStatus() || 'offline'; }\n\n  get accessibleLabel(): string {\n    const parts: string[] = [this.avatarName];\n    if (!this.effectiveHideUserStatus()) {\n      parts.push(CometChatLocalize.getLocalizedString(this.userStatus === 'online' ? 'accessibility_status_online' : 'accessibility_status_offline'));\n    }\n    return parts.join(', ');\n  }\n\n  handleMouseDown(event: MouseEvent): void { event.preventDefault(); }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleClick(); }\n    if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') { event.preventDefault(); this.handleContextMenuOpen(); }\n  }\n\n  handleClick(): void { this.itemClick.emit(this.user); }\n  handleContextMenuOpen(): void { this.contextMenuOpen.emit(this.user); }\n  handleContextMenu(event: MouseEvent): void { if (this.effectiveDisableDefaultContextMenu()) event.preventDefault(); }\n  handleContextMenuOptionClick(option: CometChatOption): void { this.contextMenuOptionClick.emit({ option, user: this.user }); }\n}\n","<!--\n  CometChatUserItem Template\n  \n  A standalone component for rendering a single user item with support for:\n  - State management (active, selected, focused)\n  - User avatar with online/offline status indicator\n  - Custom templates for leading, title, subtitle, and trailing sections\n  - Context menu integration\n  - Full accessibility support (ARIA labels, keyboard navigation)\n  \n  @see Requirements 1.7, 1.8, 1.9, 1.10, 1.11, 1.12, 1.13, 6.1-6.5\n-->\n\n<div class=\"cometchat-user-item\"\n     [class.cometchat-user-item--active]=\"isActive\"\n     [class.cometchat-user-item--selected]=\"isSelected\"\n     [class.cometchat-user-item--focused]=\"isFocused\"\n     role=\"option\"\n     [attr.tabindex]=\"tabIndex\"\n     [attr.aria-selected]=\"isSelected\"\n     [attr.aria-label]=\"accessibleLabel\"\n     (click)=\"handleClick()\"\n     (keydown)=\"onKeyDown($event)\"\n     (mousedown)=\"handleMouseDown($event)\"\n     (contextmenu)=\"handleContextMenu($event)\">\n  \n  <!-- Leading Section: Avatar and Status Indicator -->\n  @if (leadingView) {\n    <ng-container *ngTemplateOutlet=\"leadingView; context: { $implicit: user }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-user-item__leading\" aria-hidden=\"true\">\n      <!-- Avatar -->\n      <cometchat-avatar \n        [image]=\"avatarImage\" \n        [name]=\"avatarName\"\n        class=\"cometchat-user-item__avatar\">\n      </cometchat-avatar>\n      \n      <!-- Status indicator (online/offline) - aria-hidden since status is in aria-label -->\n      @if (!effectiveHideUserStatus()) {\n        <div class=\"cometchat-user-item__status\"\n             [class.cometchat-user-item__status--online]=\"userStatus === 'online'\"\n             [class.cometchat-user-item__status--offline]=\"userStatus !== 'online'\"\n             aria-hidden=\"true\">\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Body Section: Title and Subtitle -->\n  <div class=\"cometchat-user-item__body\">\n    <!-- Title section -->\n    @if (titleView) {\n      <ng-container *ngTemplateOutlet=\"titleView; context: { $implicit: user }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-user-item__title\">\n        <span class=\"cometchat-user-item__title-text\">\n          {{ avatarName }}\n        </span>\n      </div>\n    }\n    \n    <!-- Subtitle section -->\n    @if (subtitleView) {\n      <ng-container *ngTemplateOutlet=\"subtitleView; context: { $implicit: user }\"></ng-container>\n    }\n  </div>\n  \n  <!-- Trailing Section: Context Menu -->\n  @if (trailingView) {\n    <ng-container *ngTemplateOutlet=\"trailingView; context: { $implicit: user }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-user-item__trailing\">\n      <!-- Context menu -->\n      @if (contextMenuOptions && contextMenuOptions.length > 0) {\n        <div class=\"cometchat-user-item__context-menu\">\n          <cometchat-context-menu\n            [data]=\"contextMenuOptions\"\n            [placement]=\"Placement.left\"\n            [topMenuSize]=\"2\"\n            [closeOnOutsideClick]=\"true\"\n            (optionClick)=\"handleContextMenuOptionClick($any($event))\"\n            class=\"cometchat-user-item__menu\">\n          </cometchat-context-menu>\n        </div>\n      }\n    </div>\n  }\n</div>\n","import { Injectable, signal, inject, DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { States } from '../Enums/Enums';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { ConnectionStateService } from './connection-state.service';\n\n/**\n * Error callback type for propagating errors to the component.\n */\nexport type UsersErrorCallback = (error: CometChat.CometChatException) => void;\n\n/**\n * UsersService\n *\n * Service responsible for managing user list state and SDK interactions.\n * NOT `providedIn: 'root'` — instantiated per component instance to avoid\n * shared state between multiple user lists.\n *\n * Uses Angular Signals for reactive state management.\n *\n * Reconnection on WebSocket drop is handled via the shared ConnectionStateService\n * rather than a per-instance CometChat.ConnectionListener.\n *\n * @see Requirements 2.2, 2.4, 2.6, 2.8\n */\n@Injectable()\nexport class UsersService {\n  // ==================== State Signals ====================\n\n  private usersSignal = signal<CometChat.User[]>([]);\n  private fetchStateSignal = signal<States>(States.loading);\n  private hasMoreSignal = signal<boolean>(true);\n\n  /** Read-only signal for the current user list. */\n  readonly users = this.usersSignal.asReadonly();\n\n  /** Read-only signal for the current fetch state. */\n  readonly fetchState = this.fetchStateSignal.asReadonly();\n\n  /** Read-only signal indicating if more users can be fetched. */\n  readonly hasMore = this.hasMoreSignal.asReadonly();\n\n  // ==================== Private State ====================\n\n  private usersRequest: CometChat.UsersRequest | null = null;\n  private errorCallback: UsersErrorCallback | null = null;\n  private isFetching = false;\n  /** Guard: only re-fetch on reconnect after the first fetch has completed. */\n  private initialFetchDone = false;\n\n  // Shared singleton connection listener — no per-service SDK listener needed.\n  private connectionState = inject(ConnectionStateService);\n  private destroyRef = inject(DestroyRef);\n\n  // ==================== Configuration ====================\n\n  private static readonly DEFAULT_LIMIT = 30;\n  private static readonly MIN_SHIMMER_TIME = 1000;\n\n  constructor() {\n    // Re-fetch on WebSocket reconnect using the shared ConnectionStateService.\n    this.connectionState.reconnected$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.handleReconnect());\n  }\n\n  // ==================== Public API ====================\n\n  /**\n   * Set the error callback for propagating errors to the component.\n   */\n  setErrorCallback(callback: UsersErrorCallback | null): void {\n    this.errorCallback = callback;\n  }\n\n  /**\n   * Initialize the service with request builder configuration.\n   * Ports the UsersManager constructor logic.\n   *\n   * @param config - Configuration matching the original UsersManager constructor args\n   */\n  initialize(config: {\n    usersRequestBuilder?: CometChat.UsersRequestBuilder | null;\n    searchRequestBuilder?: CometChat.UsersRequestBuilder | null;\n    searchText?: string;\n    usersSearchText?: string;\n  }): void {\n    const {\n      usersRequestBuilder = null,\n      searchRequestBuilder = null,\n      searchText = '',\n      usersSearchText = '',\n    } = config;\n\n    this.usersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.isFetching = false;\n\n    this.usersRequest = this.buildRequest(\n      searchText,\n      usersRequestBuilder,\n      searchRequestBuilder,\n      usersSearchText\n    );\n  }\n\n  /**\n   * Fetch the next page of users from the SDK.\n   * Includes minimum shimmer time on initial fetch, duplicate-free appending,\n   * hasMore tracking, and isFetching guard to prevent concurrent calls.\n   */\n  async fetchNext(): Promise<void> {\n    if (!this.usersRequest || this.isFetching) {\n      return;\n    }\n\n    this.isFetching = true;\n\n    const isInitialFetch =\n      this.usersSignal().length === 0 && this.fetchStateSignal() === States.loading;\n    const startTime = Date.now();\n\n    try {\n      const newUsers = await this.usersRequest.fetchNext();\n\n      // Ensure shimmer is visible for at least MIN_SHIMMER_TIME on initial fetch\n      if (isInitialFetch) {\n        const elapsed = Date.now() - startTime;\n        const remainingTime = Math.max(0, UsersService.MIN_SHIMMER_TIME - elapsed);\n        await new Promise<void>(resolve => setTimeout(resolve, remainingTime));\n      }\n\n      if (newUsers.length === 0) {\n        this.hasMoreSignal.set(false);\n        if (this.usersSignal().length === 0) {\n          this.fetchStateSignal.set(States.empty);\n        }\n        this.isFetching = false;\n        return;\n      }\n\n      this.appendUsersWithoutDuplicates(newUsers);\n\n      if (newUsers.length < UsersService.DEFAULT_LIMIT) {\n        this.hasMoreSignal.set(false);\n      }\n\n      this.fetchStateSignal.set(States.loaded);\n      this.initialFetchDone = true;\n    } catch (error) {\n      CometChatLogger.error('UsersService', 'Error fetching users:', error);\n      if (this.usersSignal().length === 0) {\n        this.fetchStateSignal.set(States.error);\n      }\n      this.handleError(error);\n    } finally {\n      this.isFetching = false;\n    }\n  }\n\n  /**\n   * Search users by keyword. Resets the list and creates a new request builder.\n   *\n   * @param keyword - The search keyword\n   * @param config - Optional configuration with custom request builders\n   */\n  search(\n    keyword: string,\n    config?: {\n      usersRequestBuilder?: CometChat.UsersRequestBuilder | null;\n      searchRequestBuilder?: CometChat.UsersRequestBuilder | null;\n      usersSearchText?: string;\n    }\n  ): void {\n    this.usersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.isFetching = false;\n\n    this.usersRequest = this.buildRequest(\n      keyword,\n      config?.usersRequestBuilder ?? null,\n      config?.searchRequestBuilder ?? null,\n      config?.usersSearchText ?? ''\n    );\n  }\n\n  // ==================== Listener Management ====================\n\n  /**\n   * Remove the user listener (connection listener is handled by ConnectionStateService).\n   */\n  detachListeners(): void {\n    // No per-service connection listener to remove — ConnectionStateService owns it.\n  }\n\n  // ==================== Private: Reconnect ====================\n\n  /**\n   * Called by ConnectionStateService when the WebSocket reconnects.\n   * Resets the list and re-fetches the first page of users.\n   */\n  private handleReconnect(): void {\n    if (!this.usersRequest || !this.initialFetchDone) return;\n    CometChatLogger.info('UsersService', 'WebSocket reconnected — refreshing user list');\n    // Silent refresh: don't show shimmer, don't clear the list until new data arrives.\n    // Build a fresh request to get the latest first page.\n    const freshRequest = this.buildRequest('', null, null, '');\n    freshRequest.fetchNext()\n      .then(newUsers => {\n        this.usersSignal.set(newUsers);\n        // Reset hasMore to true — we're back at page 1, more pages may exist\n        this.hasMoreSignal.set(true);\n        if (newUsers.length === 0) {\n          this.fetchStateSignal.set(States.empty);\n        } else {\n          this.fetchStateSignal.set(States.loaded);\n        }\n        this.usersRequest = freshRequest;\n      })\n      .catch(e => CometChatLogger.error('UsersService', 'Error refreshing users on reconnect:', e));\n  }\n\n  // ==================== List Mutation Methods ====================\n\n  /**\n   * Update a user in the list by replacing it at its current position.\n   *\n   * @param user - The updated user object\n   */\n  updateUser(user: CometChat.User): void {\n    const current = this.usersSignal();\n    const index = current.findIndex(u => u.getUid() === user.getUid());\n\n    if (index !== -1) {\n      this.usersSignal.set([\n        ...current.slice(0, index),\n        user,\n        ...current.slice(index + 1),\n      ]);\n    }\n  }\n\n  /**\n   * Remove a user from the list by UID.\n   *\n   * @param uid - The UID of the user to remove\n   */\n  removeUser(uid: string): void {\n    const current = this.usersSignal();\n    const filtered = current.filter(u => u.getUid() !== uid);\n    this.usersSignal.set(filtered);\n\n    if (filtered.length === 0) {\n      this.fetchStateSignal.set(States.empty);\n    }\n  }\n\n  /**\n   * Append multiple users to the list without duplicates.\n   *\n   * @param users - The users to append\n   */\n  appendUsersWithoutDuplicates(users: CometChat.User[]): void {\n    const current = this.usersSignal();\n    const existingUids = new Set(current.map(u => u.getUid()));\n    const newUsers = users.filter(u => !existingUids.has(u.getUid()));\n\n    if (newUsers.length > 0) {\n      this.usersSignal.set([...current, ...newUsers]);\n    }\n  }\n\n  // ==================== Cleanup ====================\n\n  /**\n   * Full cleanup: detach listeners and reset state.\n   */\n  cleanup(): void {\n    this.detachListeners();\n    this.usersSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.usersRequest = null;\n    this.errorCallback = null;\n    this.isFetching = false;\n    this.initialFetchDone = false;\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Build a UsersRequest from the provided configuration.\n   * Ports the UsersManager constructor logic.\n   */\n  private buildRequest(\n    searchText: string,\n    usersRequestBuilder: CometChat.UsersRequestBuilder | null,\n    searchRequestBuilder: CometChat.UsersRequestBuilder | null,\n    usersSearchText: string\n  ): CometChat.UsersRequest {\n    if (searchText) {\n      if (searchRequestBuilder) {\n        return searchRequestBuilder.setSearchKeyword(searchText).build();\n      } else if (usersRequestBuilder) {\n        return usersRequestBuilder.setSearchKeyword(searchText).build();\n      } else {\n        return new CometChat.UsersRequestBuilder()\n          .setLimit(UsersService.DEFAULT_LIMIT)\n          .setSearchKeyword(searchText)\n          .build();\n      }\n    } else {\n      if (usersRequestBuilder) {\n        return usersRequestBuilder.build();\n      } else {\n        return new CometChat.UsersRequestBuilder()\n          .setLimit(UsersService.DEFAULT_LIMIT)\n          .build();\n      }\n    }\n  }\n\n  /**\n   * Propagate an error to the component via the error callback.\n   */\n  private handleError(error: unknown): void {\n    if (this.errorCallback) {\n      const exception = this.toCometChatException(error);\n      this.errorCallback(exception);\n    }\n  }\n\n  /**\n   * Convert an unknown error to a CometChatException.\n   */\n  private toCometChatException(error: unknown): CometChat.CometChatException {\n    if (error instanceof CometChat.CometChatException) {\n      return error;\n    }\n\n    if (error instanceof Error) {\n      return new CometChat.CometChatException({\n        code: 'USERS_ERROR',\n        message: error.message,\n        details: error.stack || '',\n      });\n    }\n\n    return new CometChat.CometChatException({\n      code: 'USERS_ERROR',\n      message: String(error),\n      details: '',\n    });\n  }\n}\n","/**\n * Shared List Keyboard Handler Utilities\n *\n * Extracted from cometchat-groups and cometchat-users components to consolidate\n * duplicate keyboard selection and navigation logic (~98 + 56 shared lines).\n *\n * These utilities handle:\n * - Ctrl/Cmd+A select all, Ctrl/Cmd+Shift+A deselect all\n * - Type-ahead search delegation\n * - Arrow key navigation\n * - Enter/Space activation\n * - Escape to clear selection\n * - Shift+Space range selection\n * - Shift+Arrow extend selection\n */\n\nimport { ChangeDetectorRef } from '@angular/core';\nimport { SelectionMode, States } from '../Enums/Enums';\n\n/**\n * Interface that a list component must implement to use the shared keyboard handler.\n * Each component provides its own list data, focus management, and selection logic.\n */\nexport interface ListKeyboardHost<T> {\n  /** The current list of items */\n  readonly itemList: T[];\n  /** Current fetch state — only handle keys when States.loaded */\n  readonly fetchState: States;\n  /** Current selection mode */\n  readonly selectionMode: SelectionMode;\n  /** Current focused index (mutable) */\n  focusedIndex: number;\n  /** CSS class of the component root (e.g. 'cometchat-groups') */\n  readonly componentClass: string;\n  /** CSS class of the search bar (e.g. 'cometchat-groups__search-bar') */\n  readonly searchBarClass: string;\n  /** Size of the selected items set */\n  readonly selectedCount: number;\n\n  /** Change detector for marking dirty */\n  readonly cdr: ChangeDetectorRef;\n\n  // Selection actions\n  clearSelection(): void;\n  selectAll(): void;\n  handleSelectionChange(item: T): void;\n  selectRangeFromAnchor(index: number): void;\n  extendSelectionTo(index: number): void;\n\n  // Navigation actions\n  focusNextItem(): void;\n  focusPreviousItem(): void;\n  selectFocusedItem(): void;\n  scrollFocusedItemIntoView(): void;\n  focusItemAtIndex(index: number): void;\n  handleEscapeKey(): void;\n\n  // Announcements\n  announceSelectionCount(): void;\n  announceSelectionCleared(): void;\n\n  // Type-ahead\n  handleTypeAhead(key: string, focusedIndex: number): number;\n}\n\n/**\n * Handles the main keydown event for a list component.\n * Returns true if the event was handled and should not propagate further.\n */\nexport function handleListKeyDown<T>(event: KeyboardEvent, host: ListKeyboardHost<T>): boolean {\n  // Skip if list is empty or not loaded\n  if (host.itemList.length === 0 || host.fetchState !== States.loaded) {\n    return false;\n  }\n\n  // Only handle keyboard events if the event target is within the component\n  const target = event.target as HTMLElement;\n  const isWithinComponent = target.closest(`.${host.componentClass}`) !== null;\n  if (!isWithinComponent) {\n    return false;\n  }\n\n  // Don't handle keyboard events when focus is in the search bar\n  const isInSearchBar =\n    target.closest(`.${host.searchBarClass}`) !== null || target.tagName === 'INPUT';\n\n  // Handle Ctrl/Cmd+Shift+A for deselect all (check BEFORE Ctrl/Cmd+A)\n  if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key.toLowerCase() === 'a') {\n    if (host.selectionMode === SelectionMode.multiple) {\n      event.preventDefault();\n      host.clearSelection();\n      host.announceSelectionCleared();\n      return true;\n    }\n  }\n\n  // Handle Ctrl/Cmd+A for select all\n  if ((event.ctrlKey || event.metaKey) && !event.shiftKey && event.key.toLowerCase() === 'a') {\n    if (host.selectionMode === SelectionMode.multiple) {\n      event.preventDefault();\n      host.selectAll();\n      host.announceSelectionCount();\n      return true;\n    }\n  }\n\n  // Handle selection mode keyboard shortcuts\n  if (host.selectionMode !== SelectionMode.none) {\n    const handled = handleSelectionKeyboard(event, isInSearchBar, host);\n    if (handled) return true;\n  }\n\n  // Handle type-ahead search for printable characters\n  if (\n    !isInSearchBar &&\n    event.key.length === 1 &&\n    !event.ctrlKey &&\n    !event.metaKey &&\n    !event.altKey\n  ) {\n    const newIndex = host.handleTypeAhead(event.key, host.focusedIndex);\n\n    if (newIndex !== -1) {\n      host.focusedIndex = newIndex;\n      host.cdr.markForCheck();\n      host.scrollFocusedItemIntoView();\n      host.focusItemAtIndex(newIndex);\n    }\n    return true;\n  }\n\n  switch (event.key) {\n    case 'ArrowDown':\n      if (!isInSearchBar) {\n        event.preventDefault();\n        event.stopPropagation();\n        host.focusNextItem();\n      }\n      return !isInSearchBar;\n\n    case 'ArrowUp':\n      if (!isInSearchBar) {\n        event.preventDefault();\n        event.stopPropagation();\n        host.focusPreviousItem();\n      }\n      return !isInSearchBar;\n\n    case 'Enter':\n      if (!isInSearchBar) {\n        event.preventDefault();\n        host.selectFocusedItem();\n      }\n      return !isInSearchBar;\n\n    case ' ':\n      if (!isInSearchBar && host.selectionMode === SelectionMode.none) {\n        event.preventDefault();\n        host.selectFocusedItem();\n        return true;\n      }\n      return false;\n\n    case 'Escape':\n      event.preventDefault();\n      if (host.selectionMode !== SelectionMode.none && host.selectedCount > 0) {\n        host.clearSelection();\n        host.announceSelectionCleared();\n      } else {\n        host.handleEscapeKey();\n      }\n      return true;\n  }\n\n  return false;\n}\n\n/**\n * Handles selection-related keyboard shortcuts (Space toggle, Shift+Space range, Shift+Arrow extend).\n * Returns true if the event was handled.\n */\nexport function handleSelectionKeyboard<T>(\n  event: KeyboardEvent,\n  isInSearchBar: boolean,\n  host: ListKeyboardHost<T>\n): boolean {\n  if (isInSearchBar) return false;\n\n  const focusedIndex = host.focusedIndex;\n  const items = host.itemList;\n\n  // Space toggles selection in selection mode\n  if (event.key === ' ' && !event.shiftKey) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (focusedIndex >= 0 && focusedIndex < items.length) {\n      host.handleSelectionChange(items[focusedIndex]);\n      host.announceSelectionCount();\n    }\n    return true;\n  }\n\n  // Shift+Space for range selection\n  if (event.key === ' ' && event.shiftKey && host.selectionMode === SelectionMode.multiple) {\n    event.preventDefault();\n    event.stopPropagation();\n    if (focusedIndex >= 0 && focusedIndex < items.length) {\n      host.selectRangeFromAnchor(focusedIndex);\n      host.announceSelectionCount();\n    }\n    return true;\n  }\n\n  // Shift+ArrowDown extends selection to next item\n  if (\n    event.key === 'ArrowDown' &&\n    event.shiftKey &&\n    host.selectionMode === SelectionMode.multiple\n  ) {\n    event.preventDefault();\n    event.stopPropagation();\n    const nextIndex = focusedIndex + 1;\n    if (nextIndex < items.length) {\n      host.extendSelectionTo(nextIndex);\n      host.focusedIndex = nextIndex;\n      host.cdr.markForCheck();\n      host.scrollFocusedItemIntoView();\n      host.focusItemAtIndex(nextIndex);\n      host.announceSelectionCount();\n    }\n    return true;\n  }\n\n  // Shift+ArrowUp extends selection to previous item\n  if (event.key === 'ArrowUp' && event.shiftKey && host.selectionMode === SelectionMode.multiple) {\n    event.preventDefault();\n    event.stopPropagation();\n    const prevIndex = focusedIndex - 1;\n    if (prevIndex >= 0) {\n      host.extendSelectionTo(prevIndex);\n      host.focusedIndex = prevIndex;\n      host.cdr.markForCheck();\n      host.scrollFocusedItemIntoView();\n      host.focusItemAtIndex(prevIndex);\n      host.announceSelectionCount();\n    }\n    return true;\n  }\n\n  return false;\n}\n","/**\n * Keyboard navigation helpers for CometChatUsers component.\n */\n\nimport { ChangeDetectorRef } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Moves focus to the next user item, wrapping at the end.\n * Returns the new focusedIndex.\n */\nexport function focusNextUserItem(\n  userList: CometChat.User[],\n  focusedIndex: number,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): number {\n  if (userList.length === 0) return focusedIndex;\n  let newIndex: number;\n  if (focusedIndex === -1) { newIndex = 0; }\n  else if (focusedIndex < userList.length - 1) { newIndex = focusedIndex + 1; }\n  else { newIndex = 0; }\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n  return newIndex;\n}\n\n/**\n * Moves focus to the previous user item, wrapping at the start.\n * Returns the new focusedIndex.\n */\nexport function focusPreviousUserItem(\n  userList: CometChat.User[],\n  focusedIndex: number,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): number {\n  if (userList.length === 0) return focusedIndex;\n  let newIndex: number;\n  if (focusedIndex === -1) { newIndex = userList.length - 1; }\n  else if (focusedIndex > 0) { newIndex = focusedIndex - 1; }\n  else { newIndex = userList.length - 1; }\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n  return newIndex;\n}\n\n/**\n * Scrolls the focused user item into view.\n */\nexport function scrollUserItemIntoView(\n  listContainer: HTMLElement | undefined,\n  focusedIndex: number,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  pendingTimers.push(setTimeout(() => {\n    if (!listContainer) return;\n    const el = listContainer.querySelector(`[data-index=\"${focusedIndex}\"]`);\n    if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n  }, 0));\n}\n\n/**\n * Focuses the DOM element for the user item at the given index.\n */\nexport function focusUserItemAtIndex(\n  listContainer: HTMLElement | undefined,\n  index: number,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  pendingTimers.push(setTimeout(() => {\n    if (!listContainer) return;\n    const el = listContainer.querySelector(`[data-index=\"${index}\"] cometchat-user-item`);\n    if (el) {\n      const focusable = el.querySelector('[tabindex=\"0\"]') as HTMLElement;\n      if (focusable) focusable.focus();\n    }\n  }, 0));\n}\n","/**\n * Selection helpers for CometChatUsers component.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { EventEmitter } from '@angular/core';\nimport { SelectionMode } from '../../Enums/Enums';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { UserSelectPayload } from './cometchat-users.types';\n\n/**\n * Emits a SelectionState event reflecting the current user selection.\n */\nexport function emitUserSelectionChange(\n  selectionMode: SelectionMode,\n  selectedUsers: Set<string>,\n  lastSelectedId: string | null,\n  selectionChange: EventEmitter<SelectionState>\n): void {\n  selectionChange.emit({\n    mode: selectionMode,\n    selectedIds: new Set(selectedUsers),\n    lastSelectedId,\n  });\n}\n\n/**\n * Performs shift-click range selection/deselection for users.\n * Returns the new lastSelectedIndex value (endIndex).\n */\nexport function selectUserRange(\n  userList: CometChat.User[],\n  startIndex: number,\n  endIndex: number,\n  selectedUsers: Set<string>,\n  selectEmitter: EventEmitter<UserSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): number {\n  const minIndex = Math.min(startIndex, endIndex);\n  const maxIndex = Math.max(startIndex, endIndex);\n  const clickedUser = userList[endIndex];\n  const clickedId = clickedUser.getUid();\n  const shouldDeselect = selectedUsers.has(clickedId);\n\n  for (let i = minIndex; i <= maxIndex; i++) {\n    const user = userList[i];\n    const uid = user.getUid();\n    if (shouldDeselect) {\n      if (selectedUsers.has(uid)) { selectedUsers.delete(uid); selectEmitter.emit({ user, selected: false }); }\n    } else {\n      if (!selectedUsers.has(uid)) { selectedUsers.add(uid); selectEmitter.emit({ user, selected: true }); }\n    }\n  }\n\n  emitUserSelectionChange(selectionMode, selectedUsers, clickedId, selectionChange);\n  return endIndex;\n}\n\n/**\n * Selects all users in the list (multiple mode only).\n */\nexport function selectAllUsers(\n  userList: CometChat.User[],\n  selectedUsers: Set<string>,\n  selectEmitter: EventEmitter<UserSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): void {\n  if (selectionMode !== SelectionMode.multiple) return;\n  userList.forEach(user => {\n    const uid = user.getUid();\n    if (!selectedUsers.has(uid)) { selectedUsers.add(uid); selectEmitter.emit({ user, selected: true }); }\n  });\n  emitUserSelectionChange(selectionMode, selectedUsers, null, selectionChange);\n}\n\n/**\n * Clears all user selections.\n */\nexport function clearUserSelection(\n  userList: CometChat.User[],\n  selectedUsers: Set<string>,\n  selectEmitter: EventEmitter<UserSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): void {\n  userList.forEach(user => {\n    if (selectedUsers.has(user.getUid())) selectEmitter.emit({ user, selected: false });\n  });\n  selectedUsers.clear();\n  emitUserSelectionChange(selectionMode, selectedUsers, null, selectionChange);\n}\n","import {\n  Component, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef,\n  ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy,\n  inject, HostListener, signal, computed, DestroyRef, booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatUserEvents } from '../../events/CometChatUserEvents';\nimport { CometChatPaginatedListComponent } from '../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { CometChatUserItemComponent } from '../cometchat-user-item/cometchat-user-item.component';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatCheckboxComponent } from '../base-elements/cometchat-checkbox/cometchat-checkbox.component';\nimport { CometChatRadioButtonComponent } from '../base-elements/cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatSearchBarComponent } from '../base-elements/cometchat-search-bar/cometchat-search-bar.component';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { SelectionMode, States } from '../../Enums/Enums';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { UsersService } from '../../services/users.service';\nimport { ChatStateService } from '../../services/chat-state.service';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { TypeAheadService } from '../../services/type-ahead.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { handleListKeyDown, ListKeyboardHost } from '../../utils/list-keyboard-handler';\nimport { focusNextUserItem, focusPreviousUserItem, scrollUserItemIntoView, focusUserItemAtIndex } from './cometchat-users.keyboard';\nimport { emitUserSelectionChange, selectUserRange, selectAllUsers, clearUserSelection } from './cometchat-users.selection';\n\n@Component({\n  selector: 'cometchat-users',\n  standalone: true,\n  imports: [CommonModule, CometChatPaginatedListComponent, CometChatUserItemComponent, CometChatAvatarComponent, CometChatCheckboxComponent, CometChatRadioButtonComponent, CometChatSearchBarComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  templateUrl: './cometchat-users.component.html',\n  styleUrls: ['./cometchat-users.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [UsersService],\n})\nexport class CometChatUsersComponent implements OnInit, OnDestroy {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n  private cdr = inject(ChangeDetectorRef);\n  private usersService = inject(UsersService);\n  private chatStateService = inject(ChatStateService);\n  private templatesService = inject(CometChatTemplatesService);\n  private destroyRef = inject(DestroyRef);\n  private typeAheadService = inject(TypeAheadService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  @ViewChild('paginatedList') paginatedList?: CometChatPaginatedListComponent<CometChat.User>;\n  @ViewChild('listContainer') listContainer?: ElementRef<HTMLElement>;\n\n  private hideUserStatusExplicitlySet = signal(false);\n  private showScrollbarExplicitlySet = signal(false);\n  private hideErrorExplicitlySet = signal(false);\n  private _hideUserStatus = signal(false);\n  private _showScrollbar = signal(false);\n  private _hideError = signal(false);\n\n  @Input({ transform: booleanAttribute }) hideSearch = false;\n  @Input({ transform: booleanAttribute }) showSectionHeader = true;\n  @Input({ transform: booleanAttribute })\n  set hideError(value: boolean) { this._hideError.set(value); this.hideErrorExplicitlySet.set(true); }\n  get hideError(): boolean { return this._hideError(); }\n  @Input({ transform: booleanAttribute }) disableLoadingState = false;\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) { this._showScrollbar.set(value); this.showScrollbarExplicitlySet.set(true); }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n  @Input({ transform: booleanAttribute }) showSelectedUsersPreview = false;\n  @Input({ transform: booleanAttribute }) disableDefaultContextMenu = true;\n\n  effectiveHideUserStatus = computed(() => {\n    if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus();\n    return this.globalConfig?.hideUserStatus ?? false;\n  });\n  effectiveShowScrollbar = computed(() => {\n    if (this.showScrollbarExplicitlySet()) return this._showScrollbar();\n    return this.globalConfig?.showScrollbar ?? false;\n  });\n  effectiveHideError = computed(() => {\n    if (this.hideErrorExplicitlySet()) return this._hideError();\n    return this.globalConfig?.hideError ?? false;\n  });\n\n  @Input() usersRequestBuilder?: CometChat.UsersRequestBuilder;\n  @Input() searchRequestBuilder?: CometChat.UsersRequestBuilder;\n  @Input() searchKeyword = '';\n  @Input() sectionHeaderKey: keyof CometChat.User = 'getName';\n  @Input() activeUser?: CometChat.User;\n  @Input() selectionMode: SelectionMode = SelectionMode.none;\n  @Input() options?: (user: CometChat.User) => CometChatOption[];\n  @Input() headerView?: TemplateRef<any>;\n  @Input() menuView?: TemplateRef<any>;\n  @Input() loadingView?: TemplateRef<any>;\n  @Input() emptyView?: TemplateRef<any>;\n  @Input() errorView?: TemplateRef<any>;\n  @Input() itemView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.User }>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null;\n  @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null;\n  @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n\n  private get _ut() { return this.templatesService.getUserTemplates(); }\n  get effectiveItemView(): TemplateRef<any> | undefined { return this.listItemTemplate || this.itemView || this._ut.itemView; }\n  get effectiveLeadingView(): TemplateRef<any> | undefined { return this.leadingView || this._ut.leadingView; }\n  get effectiveTitleView(): TemplateRef<any> | undefined { return this.titleView || this._ut.titleView; }\n  get effectiveSubtitleView(): TemplateRef<any> | undefined { return this.subtitleView || this._ut.subtitleView; }\n  get effectiveTrailingView(): TemplateRef<any> | undefined { return this.trailingView || this._ut.trailingView; }\n  get effectiveLoadingView(): TemplateRef<any> | undefined { return this.loadingStateTemplate || this.loadingView || this.templatesService.resolveTemplate(this._ut, 'loadingView'); }\n  get effectiveEmptyView(): TemplateRef<any> | undefined { return this.emptyStateTemplate || this.emptyView || this.templatesService.resolveTemplate(this._ut, 'emptyView'); }\n  get effectiveErrorView(): TemplateRef<any> | undefined { return this.errorStateTemplate || this.errorView || this.templatesService.resolveTemplate(this._ut, 'errorView'); }\n\n  @Output() itemClick = new EventEmitter<CometChat.User>();\n  @Output() select = new EventEmitter<{ user: CometChat.User; selected: boolean }>();\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() empty = new EventEmitter<void>();\n  @Output() selectionChange = new EventEmitter<SelectionState>();\n\n  userList: CometChat.User[] = [];\n  fetchState: States = States.loading;\n  lastError: Error | null = null;\n  searchText = '';\n  selectedUsers = new Set<string>();\n  selectedUsersMap = new Map<string, CometChat.User>();\n  focusedIndex = -1;\n  lastClickedIndex: number | null = null;\n  lastClickedUserUid: string | null = null;\n  isFetchingMore = signal(false);\n  hasMore = signal(true);\n  readonly SelectionMode = SelectionMode;\n  readonly States = States;\n  private searchSubject$ = new Subject<string>();\n  private isFirstFetch = true;\n  private initialLoadComplete = false;\n  private userListenerId = `users_component_${Date.now()}`;\n\n  constructor() {\n    // Sync hasMore from service signal — picks up reconnect resets automatically.\n    // Must be in constructor to ensure injection context for toObservable.\n    toObservable(this.usersService.hasMore)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(v => this.hasMore.set(v));\n  }\n\n  ngOnInit(): void {\n    this.usersService.setErrorCallback((error) => { this.lastError = error as unknown as Error; this.error.emit(error); });\n    this.initializeUsersManager(); this.setupSearchDebouncing(); this.setupUserListener();\n    this.setupUserEventSubscriptions(); this.fetchNextAndAppendUsers();\n  }\n  ngOnDestroy(): void { this.pendingTimers.forEach(t => clearTimeout(t)); this.pendingTimers = []; this.removeUserListener(); this.usersService.cleanup(); }\n\n  private initializeUsersManager(): void {\n    const usersSearchText = this.searchKeyword || '';\n    this.usersService.initialize({ searchText: this.searchText || usersSearchText, usersRequestBuilder: this.usersRequestBuilder || null, searchRequestBuilder: this.searchRequestBuilder || null, usersSearchText });\n    this.userList = []; this.fetchState = States.loading; this.isFirstFetch = true; this.hasMore.set(true);\n  }\n\n  private setupSearchDebouncing(): void {\n    this.searchSubject$.pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n      .subscribe(searchText => this.handleSearchTextChange(searchText));\n  }\n\n  private setupUserListener(): void {\n    try { CometChat.addUserListener(this.userListenerId, new CometChat.UserListener({ onUserOnline: (u: CometChat.User) => this.updateUser(u), onUserOffline: (u: CometChat.User) => this.updateUser(u) })); }\n    catch (error) { CometChatLogger.error('CometChatUsers', 'Error setting up user listener:', error); }\n  }\n  private removeUserListener(): void {\n    try { CometChat.removeUserListener(this.userListenerId); } catch (error) { CometChatLogger.error('CometChatUsers', 'Error removing user listener:', error); }\n  }\n\n  private setupUserEventSubscriptions(): void {\n    CometChatUserEvents.ccUserBlocked.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((user: CometChat.User) => this.updateUser(user));\n    CometChatUserEvents.ccUserUnblocked.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((user: CometChat.User) => this.updateUser(user));\n  }\n\n  private updateUser(user: CometChat.User): void { this.usersService.updateUser(user); this.syncStateFromService(); }\n  private refreshUserList(): void { this.userList = []; this.initializeUsersManager(); this.fetchNextAndAppendUsers(); }\n\n  fetchNextAndAppendUsers(): void {\n    if (this.isFetchingMore() || !this.hasMore()) return;\n    this.isFetchingMore.set(true);\n    const isFirstFetch = this.isFirstFetch;\n    if (isFirstFetch && !this.disableLoadingState) { this.fetchState = States.loading; this.cdr.detectChanges(); }\n    this.usersService.fetchNext()\n      .then(() => {\n        this.isFetchingMore.set(false); this.syncStateFromService();\n        if (isFirstFetch && this.usersService.fetchState() === States.empty) this.empty.emit();\n        this.isFirstFetch = false;\n        if (!this.initialLoadComplete) this.pendingTimers.push(setTimeout(() => { this.initialLoadComplete = true; }, 100));\n        this.paginatedList?.loadComplete();\n      })\n      .catch(() => { this.isFetchingMore.set(false); this.syncStateFromService(); this.paginatedList?.loadComplete(); });\n  }\n\n  handleLoadMore(): void { if (this.isFetchingMore() || !this.hasMore()) return; this.fetchNextAndAppendUsers(); }\n\n  private syncStateFromService(): void {\n    this.userList = this.usersService.users(); this.fetchState = this.usersService.fetchState();\n    this.hasMore.set(this.usersService.hasMore());\n    if (this.fetchState !== States.error) this.lastError = null;\n    this.cdr.markForCheck();\n  }\n\n  onSearch(searchText: string): void { this.searchSubject$.next(searchText); }\n\n  private handleSearchTextChange(searchText: string): void {\n    this.searchText = searchText; this.userList = [];\n    this.usersService.search(searchText, { usersRequestBuilder: this.usersRequestBuilder || null, searchRequestBuilder: this.searchRequestBuilder || null, usersSearchText: this.searchKeyword || '' });\n    this.isFirstFetch = true; this.hasMore.set(true); this.fetchNextAndAppendUsers();\n  }\n\n  trackByUser(_index: number, user: CometChat.User): string { return user.getUid(); }\n\n  shouldShowSectionHeader(index: number): boolean {\n    if (!this.showSectionHeader || !this.userList.length) return false;\n    return index === 0 || this.getSectionHeaderValue(this.userList[index]) !== this.getSectionHeaderValue(this.userList[index - 1]);\n  }\n  getSectionHeaderValue(user: CometChat.User): string {\n    try {\n      let value: unknown;\n      const key = this.sectionHeaderKey;\n      if (key && key in user && typeof (user as any)[key] === 'function') {\n        value = (user as any)[key]();\n      } else {\n        value = user.getName();\n      }\n      return (value && typeof value === 'string') ? value.charAt(0).toUpperCase() : '#';\n    } catch { return '#'; }\n  }\n\n  handleUserClick(user: CometChat.User): void {\n    if (this.itemClick.observed) { this.itemClick.emit(user); } else { this.chatStateService.setActiveUser(user); }\n  }\n\n  handleSelectionChange(user: CometChat.User, event?: Event): void {\n    const uid = user.getUid();\n    const currentIndex = this.userList.findIndex(u => u.getUid() === uid);\n    const isCurrentlySelected = this.selectedUsers.has(uid);\n    if (this.selectionMode === SelectionMode.single) {\n      this.selectedUsers.clear(); this.selectedUsersMap.clear();\n      if (!isCurrentlySelected) { this.selectedUsers.add(uid); this.selectedUsersMap.set(uid, user); }\n      this.select.emit({ user, selected: !isCurrentlySelected }); this.emitSelectionChange(uid);\n    } else if (this.selectionMode === SelectionMode.multiple) {\n      if (event instanceof MouseEvent && event.shiftKey && this.lastClickedIndex !== null && this.lastClickedUserUid !== null) {\n        this.handleShiftClickSelection(currentIndex, isCurrentlySelected);\n      } else {\n        if (isCurrentlySelected) { this.selectedUsers.delete(uid); this.selectedUsersMap.delete(uid); }\n        else { this.selectedUsers.add(uid); this.selectedUsersMap.set(uid, user); }\n        this.select.emit({ user, selected: !isCurrentlySelected });\n        this.lastClickedIndex = currentIndex; this.lastClickedUserUid = uid; this.emitSelectionChange(uid);\n      }\n    }\n    this.cdr.markForCheck();\n  }\n\n  private handleShiftClickSelection(clickedIndex: number, shouldDeselect: boolean): void {\n    if (this.lastClickedIndex === null) return;\n    const [start, end] = [Math.min(this.lastClickedIndex, clickedIndex), Math.max(this.lastClickedIndex, clickedIndex)];\n    const clickedUser = this.userList[clickedIndex]; const clickedUid = clickedUser?.getUid() ?? null;\n    for (let i = start; i <= end; i++) {\n      const u = this.userList[i]; if (!u) continue; const uUid = u.getUid();\n      if (shouldDeselect && this.selectedUsers.has(uUid)) { this.selectedUsers.delete(uUid); this.selectedUsersMap.delete(uUid); this.select.emit({ user: u, selected: false }); }\n      else if (!shouldDeselect && !this.selectedUsers.has(uUid)) { this.selectedUsers.add(uUid); this.selectedUsersMap.set(uUid, u); this.select.emit({ user: u, selected: true }); }\n    }\n    this.emitSelectionChange(clickedUid); this.lastClickedIndex = clickedIndex; this.lastClickedUserUid = clickedUid;\n  }\n\n  handleSelectionControlChange(user: CometChat.User, changeEvent: Event): void { this.handleSelectionChange(user, changeEvent); }\n\n  removeSelectedUser(user: CometChat.User): void {\n    const uid = user.getUid();\n    this.selectedUsers.delete(uid); this.selectedUsersMap.delete(uid);\n    this.select.emit({ user, selected: false }); this.emitSelectionChange(uid); this.cdr.markForCheck();\n  }\n\n  private emitSelectionChange(lastSelectedId: string | null): void {\n    emitUserSelectionChange(this.selectionMode, this.selectedUsers, lastSelectedId, this.selectionChange);\n  }\n\n  selectAll(): void {\n    if (this.selectionMode !== SelectionMode.multiple) return;\n    this.focusedIndex = -1;\n    this.userList.forEach(user => { const uid = user.getUid(); if (!this.selectedUsers.has(uid)) { this.selectedUsers.add(uid); this.selectedUsersMap.set(uid, user); this.select.emit({ user, selected: true }); } });\n    this.emitSelectionChange(null); this.cdr.markForCheck();\n  }\n\n  clearSelection(): void {\n    this.selectedUsersMap.forEach((user) => this.select.emit({ user, selected: false }));\n    this.selectedUsers.clear(); this.selectedUsersMap.clear(); this.lastClickedIndex = null; this.lastClickedUserUid = null;\n    this.emitSelectionChange(null); this.cdr.markForCheck();\n  }\n\n  isUserSelected(user: CometChat.User): boolean { return this.selectedUsers.has(user.getUid()); }\n  isUserActive(user: CometChat.User): boolean {\n    if (this.activeUser) return user.getUid() === this.activeUser.getUid();\n    const s = this.chatStateService.getActiveUser(); return s ? user.getUid() === s.getUid() : false;\n  }\n  getSelectedUsersArray(): CometChat.User[] { return Array.from(this.selectedUsersMap.values()); }\n  getOptionsForUser(user: CometChat.User): CometChatOption[] { return this.options ? this.options(user) : []; }\n  handleOptionClick(option: CometChatOption, _user: CometChat.User): void { if (option.onClick) option.onClick(); }\n  getUserAriaLabel(user: CometChat.User): string { const n = user.getName() || ''; const s = user.getStatus(); return (this.hideUserStatus || !s) ? n : `${n}, ${s}`; }\n  trackBySelectedUser(_index: number, entry: { key: string; value: CometChat.User }): string { return entry.key; }\n\n  @HostListener('focus')\n  handleListFocus(): void {\n    if (this.focusedIndex === -1 && this.userList.length > 0) { this.focusedIndex = 0; this.cdr.markForCheck(); this.scrollFocusedItemIntoView(); }\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void { this.onUsersKeyDown(event); }\n\n  onUsersKeyDown(event: KeyboardEvent): void {\n    const host: ListKeyboardHost<CometChat.User> = {\n      itemList: this.userList, fetchState: this.fetchState, selectionMode: this.selectionMode,\n      focusedIndex: this.focusedIndex, componentClass: 'cometchat-users', searchBarClass: 'cometchat-users__search-bar',\n      selectedCount: this.selectedUsers.size, cdr: this.cdr,\n      clearSelection: () => this.clearSelection(), selectAll: () => this.selectAll(),\n      handleSelectionChange: item => this.handleSelectionChange(item),\n      selectRangeFromAnchor: index => this.selectRangeFromAnchor(index),\n      extendSelectionTo: index => this.extendSelectionTo(index),\n      focusNextItem: () => this.focusNextItem(), focusPreviousItem: () => this.focusPreviousItem(),\n      selectFocusedItem: () => this.selectFocusedItem(), scrollFocusedItemIntoView: () => this.scrollFocusedItemIntoView(),\n      focusItemAtIndex: index => this.focusItemAtIndex(index), handleEscapeKey: () => this.handleEscapeKey(),\n      announceSelectionCount: () => this.announceSelectionCount(), announceSelectionCleared: () => this.announceSelectionCleared(),\n      handleTypeAhead: (key, focusedIdx) => this.typeAheadService.handleCharacter(key, this.userList, focusedIdx, { getSearchText: (user: CometChat.User) => user.getName() || '' }),\n    };\n    handleListKeyDown(event, host);\n    if (host.focusedIndex !== this.focusedIndex) this.focusedIndex = host.focusedIndex;\n  }\n\n  private extendSelectionTo(index: number): void {\n    if (index < 0 || index >= this.userList.length) return;\n    const user = this.userList[index]; const uid = user.getUid();\n    if (!this.selectedUsers.has(uid)) { this.selectedUsers.add(uid); this.selectedUsersMap.set(uid, user); this.select.emit({ user, selected: true }); }\n    this.lastClickedIndex = index; this.lastClickedUserUid = uid; this.emitSelectionChange(uid); this.cdr.markForCheck();\n  }\n\n  private selectRangeFromAnchor(currentIndex: number): void {\n    const start = Math.min(this.lastClickedIndex ?? currentIndex, currentIndex);\n    const end = Math.max(this.lastClickedIndex ?? currentIndex, currentIndex);\n    for (let i = start; i <= end; i++) { if (i >= 0 && i < this.userList.length) { const user = this.userList[i]; const uid = user.getUid(); if (!this.selectedUsers.has(uid)) { this.selectedUsers.add(uid); this.selectedUsersMap.set(uid, user); this.select.emit({ user, selected: true }); } } }\n    if (currentIndex >= 0 && currentIndex < this.userList.length) this.emitSelectionChange(this.userList[currentIndex].getUid());\n    this.cdr.markForCheck();\n  }\n\n  private announceSelectionCount(): void { const c = this.selectedUsers.size; if (c > 0) this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_items_selected').replace('{count}', c.toString()), 'polite'); }\n  private announceSelectionCleared(): void { this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_selection_cleared'), 'polite'); }\n\n  private focusNextItem(): void {\n    if (!this.userList.length) return;\n    const n = this.userList.length;\n    this.focusedIndex = this.focusedIndex === -1 ? 0 : (this.focusedIndex + 1) % n;\n    this.cdr.markForCheck(); this.scrollFocusedItemIntoView();\n  }\n\n  private focusPreviousItem(): void {\n    if (!this.userList.length) return;\n    const n = this.userList.length;\n    this.focusedIndex = this.focusedIndex === -1 ? n - 1 : (this.focusedIndex - 1 + n) % n;\n    this.cdr.markForCheck(); this.scrollFocusedItemIntoView();\n  }\n\n  private scrollFocusedItemIntoView(): void {\n    if (!this.initialLoadComplete) return;\n    scrollUserItemIntoView(this.listContainer?.nativeElement, this.focusedIndex, this.pendingTimers);\n  }\n\n  handleItemFocus(index: number): void { this.focusedIndex = index; this.cdr.markForCheck(); }\n  private selectFocusedItem(): void {\n    if (this.focusedIndex >= 0 && this.focusedIndex < this.userList.length) {\n      const user = this.userList[this.focusedIndex];\n      if (this.selectionMode !== SelectionMode.none) { this.handleSelectionChange(user); } else { this.handleUserClick(user); }\n    }\n  }\n  private handleEscapeKey(): void {\n    if (this.searchText) { this.searchText = ''; this.searchSubject$.next(''); this.cdr.markForCheck(); return; }\n    if (this.selectionMode !== SelectionMode.none && this.selectedUsers.size > 0) this.clearSelection();\n    this.focusedIndex = -1; (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck();\n  }\n  private focusItemAtIndex(index: number): void { focusUserItemAtIndex(this.listContainer?.nativeElement, index, this.pendingTimers); }\n  getTabIndex(index: number): number { return this.focusedIndex === index ? 0 : (this.focusedIndex === -1 && index === 0 ? 0 : -1); }\n  handleMouseDown(event: MouseEvent): void { event.preventDefault(); }\n  handleContainerClick(event: MouseEvent): void {\n    const t = event.target as HTMLElement;\n    if (!t.closest('.cometchat-user-item') && !t.closest('cometchat-checkbox') && !t.closest('cometchat-radio-button') && !t.closest('cometchat-search-bar')) {\n      this.focusedIndex = -1; (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck();\n    }\n  }\n  handleRetryClick(): void { this.lastError = null; this.fetchState = States.loading; this.cdr.markForCheck(); this.initializeUsersManager(); this.fetchNextAndAppendUsers(); }\n  handleFocusIn(event: FocusEvent): void {\n    const target = event.target as HTMLElement; if (!target) return;\n    const itemDiv = target.classList.contains('cometchat-user-item') ? target : target.closest('.cometchat-user-item'); if (!itemDiv) return;\n    const paginatedListItem = itemDiv.closest('.cometchat-users__list-item-wrapper')?.closest('.cometchat-paginated-list__item'); if (!paginatedListItem) return;\n    // O(1) lookup via data-index attribute instead of Array.from().indexOf()\n    const indexAttr = (paginatedListItem as HTMLElement).dataset['index'];\n    const index = indexAttr !== undefined ? parseInt(indexAttr, 10) : -1;\n    if (index !== -1 && this.focusedIndex !== index) { this.focusedIndex = index; this.cdr.markForCheck(); }\n  }\n}\n","<!--\n  CometChatUsers Component Template\n\n  This template provides the structure for displaying a list of users with:\n  - Header section with title and optional search bar\n  - Selected users preview (chips) in multiple selection mode\n  - User list with section headers\n  - Loading, empty, and error states\n  - Context menu integration\n  - Full accessibility support\n\n  @see Requirements 1.1, 1.2, 2.1, 2.5, 5.1, 6.1, 14.1, 15.1, 16.1-16.6, 17.1-17.4, 18.1-18.8, 19.1-19.11\n-->\n\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'Users'\">\n<div\n  class=\"cometchat cometchat-users\"\n  [class.cometchat-users-hide-scrollbar]=\"!effectiveShowScrollbar()\"\n  role=\"region\"\n  [attr.aria-label]=\"'user_title' | translate\"\n  (focusin)=\"handleFocusIn($event)\"\n  (click)=\"handleContainerClick($event)\"\n>\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-users__header\">\n    <!-- Custom Header View -->\n    @if (headerView) {\n      <ng-container *ngTemplateOutlet=\"headerView\"></ng-container>\n    } @else {\n      <!-- Default Header -->\n      <div class=\"cometchat-users__header-default\">\n        <h2 class=\"cometchat-users__header-title\">\n          {{ 'user_title' | translate }}\n        </h2>\n        @if (menuView) {\n          <ng-container *ngTemplateOutlet=\"menuView\"></ng-container>\n        }\n      </div>\n    }\n          <!-- Search Bar (if not hidden) -->\n      @if (!hideSearch) {\n        <div class=\"cometchat-users__search-bar\">\n          <cometchat-search-bar\n            [searchText]=\"searchText\"\n            [placeholderText]=\"'user_search_placeholder' | translate\"\n            [ariaLabel]=\"'user_search_placeholder' | translate\"\n            (searchChanged)=\"onSearch($event.value)\"\n            (clearClick)=\"onSearch('')\">\n          </cometchat-search-bar>\n        </div>\n      }\n  </div>\n\n  <!-- ==================== List Body using CometChatPaginatedList ==================== -->\n  <cometchat-paginated-list\n    #paginatedList\n    #listContainer\n    [items]=\"userList\"\n    [trackByFn]=\"trackByUser.bind(this)\"\n    [isLoading]=\"fetchState === States.loading && !disableLoadingState\"\n    [hasMore]=\"hasMore()\"\n    [error]=\"lastError\"\n    [showScrollbar]=\"effectiveShowScrollbar()\"\n    [loadingTemplate]=\"loadingTemplateRef\"\n    [emptyTemplate]=\"emptyTemplateRef\"\n    [errorTemplate]=\"errorTemplateRef\"\n    [itemTemplate]=\"itemTemplateRef\"\n    (loadMore)=\"handleLoadMore()\"\n    role=\"listbox\"\n    [attr.aria-label]=\"'accessibility_users_list' | translate\"\n    [attr.aria-busy]=\"fetchState === States.loading\"\n    aria-live=\"polite\">\n  </cometchat-paginated-list>\n\n  <!-- ==================== Selected Users Preview (Multiple Selection Mode) ==================== -->\n  @if (showSelectedUsersPreview && selectionMode === SelectionMode.multiple && selectedUsersMap.size > 0) {\n    <div\n      class=\"cometchat-users__selected-preview\"\n      role=\"region\"\n      [attr.aria-label]=\"'Selected users'\"\n    >\n      @for (entry of selectedUsersMap | keyvalue; track trackBySelectedUser($index, entry)) {\n        <div class=\"cometchat-users__selected-preview-chip\">\n          <cometchat-avatar\n            class=\"cometchat-users__selected-preview-chip-avatar\"\n            [image]=\"entry.value.getAvatar()\"\n            [name]=\"entry.value.getName()\">\n          </cometchat-avatar>\n          <span class=\"cometchat-users__selected-preview-chip-name\">\n            {{ entry.value.getName() }}\n          </span>\n          <button\n            class=\"cometchat-users__selected-preview-chip-close\"\n            type=\"button\"\n            [attr.aria-label]=\"'Remove ' + entry.value.getName() + ' from selection'\"\n            (click)=\"removeSelectedUser(entry.value)\"\n          >\n            <span class=\"cometchat-users__selected-preview-chip-close-icon\" aria-hidden=\"true\"></span>\n          </button>\n        </div>\n      }\n    </div>\n  }\n\n  <!-- ==================== Loading Template ==================== -->\n  <ng-template #loadingTemplateRef>\n    @if (effectiveLoadingView) {\n      <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-users__shimmer\" aria-hidden=\"true\">\n        @for (item of shimmerList; track item) {\n          <!-- Show section header shimmer for first item and every 3rd item (only when section headers are enabled) -->\n          @if (showSectionHeader && (item === 1 || item === 4 || item === 7 || item === 10)) {\n            <div class=\"cometchat-users__shimmer-section-header\"></div>\n          }\n          <div class=\"cometchat-users__shimmer-item\">\n            <div class=\"cometchat-users__shimmer-item-avatar\"></div>\n            <div class=\"cometchat-users__shimmer-item-body\">\n              <div class=\"cometchat-users__shimmer-item-body-title\"></div>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Empty Template ==================== -->\n  <ng-template #emptyTemplateRef>\n    @if (effectiveEmptyView) {\n      <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n    } @else {\n      <div\n        class=\"cometchat-users__empty-state-view\"\n        role=\"status\"\n        [attr.aria-label]=\"'user_empty_title' | translate\"\n      >\n        <div class=\"cometchat-users__empty-state-view-icon\">\n          <span class=\"cometchat-users__empty-state-view-icon-mask\" aria-hidden=\"true\"></span>\n        </div>\n        <h3 class=\"cometchat-users__empty-state-view-title\">\n          {{ 'user_empty_title' | translate }}\n        </h3>\n        <p class=\"cometchat-users__empty-state-view-subtitle\">\n          {{ 'user_empty_subtitle' | translate }}\n        </p>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Error Template ==================== -->\n  <ng-template #errorTemplateRef let-error>\n    @if (!hideError) {\n      @if (effectiveErrorView) {\n        <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n      } @else {\n        <div\n          class=\"cometchat-users__error-state-view\"\n          role=\"alert\"\n        >\n          <div class=\"cometchat-users__error-state-view-icon\">\n            <span class=\"cometchat-users__error-state-view-icon-mask\" aria-hidden=\"true\"></span>\n          </div>\n          <h3 class=\"cometchat-users__error-state-view-title\">\n            {{ 'user_error_title' | translate }}\n          </h3>\n          <p class=\"cometchat-users__error-state-view-subtitle\">\n            {{ 'user_error_subtitle' | translate }}\n          </p>\n          <button\n            class=\"cometchat-users__error-state-view-retry-button\"\n            (click)=\"handleRetryClick()\"\n            type=\"button\">\n            {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      }\n    }\n  </ng-template>\n\n  <!-- ==================== Item Template ==================== -->\n  <ng-template #itemTemplateRef let-user let-index=\"index\">\n    <!-- Section Header (if enabled and should show) -->\n    @if (shouldShowSectionHeader(index)) {\n      <div\n        class=\"cometchat-users__section-header\"\n        role=\"heading\"\n        aria-level=\"3\"\n      >\n        {{ getSectionHeaderValue(user) }}\n      </div>\n    }\n\n    <!-- User Item -->\n    <div\n      class=\"cometchat-users__list-item-wrapper\"\n      [attr.data-index]=\"index\"\n      [class.cometchat-users__list-item--active]=\"isUserActive(user)\"\n      [class.cometchat-users__list-item--selected]=\"isUserSelected(user)\"\n      role=\"presentation\"\n      [attr.aria-label]=\"getUserAriaLabel(user)\"\n      [attr.aria-selected]=\"selectionMode !== SelectionMode.none ? isUserSelected(user) : null\"\n      (mousedown)=\"handleMouseDown($event)\"\n      (click)=\"selectionMode !== SelectionMode.none ? handleSelectionChange(user, $event) : undefined\"\n    >\n      <!-- Custom Item View -->\n      @if (effectiveItemView) {\n        <ng-container *ngTemplateOutlet=\"effectiveItemView; context: { $implicit: user }\"></ng-container>\n      } @else {\n        <!-- Default Item View using CometChatUserItem -->\n        <cometchat-user-item\n          [user]=\"user\"\n          [isActive]=\"isUserActive(user)\"\n          [isSelected]=\"isUserSelected(user)\"\n          [isFocused]=\"focusedIndex === index\"\n          [tabIndex]=\"focusedIndex === -1 ? (index === 0 ? 0 : -1) : (focusedIndex === index ? 0 : -1)\"\n          [hideUserStatus]=\"effectiveHideUserStatus()\"\n          [disableDefaultContextMenu]=\"disableDefaultContextMenu\"\n          [contextMenuOptions]=\"selectionMode !== SelectionMode.none ? [] : getOptionsForUser(user)\"\n          [leadingView]=\"effectiveLeadingView\"\n          [titleView]=\"effectiveTitleView\"\n          [subtitleView]=\"effectiveSubtitleView\"\n          [trailingView]=\"selectionMode !== SelectionMode.none ? selectionControlTemplate : effectiveTrailingView\"\n          (focus)=\"handleItemFocus(index)\"\n          (itemClick)=\"handleUserClick($event)\"\n          (contextMenuOptionClick)=\"handleOptionClick($event.option, $event.user)\">\n        </cometchat-user-item>\n      }\n    </div>\n  </ng-template>\n\n  <!-- ==================== Selection Control Template (for trailing view) ==================== -->\n  <ng-template #selectionControlTemplate let-user>\n    <div class=\"cometchat-users__selection-control\" \n         (click)=\"$event.stopPropagation()\">\n      @if (selectionMode === SelectionMode.multiple) {\n        <cometchat-checkbox\n          [checked]=\"isUserSelected(user)\"\n          [ariaLabel]=\"'Select ' + user.getName()\"\n          (checkboxChanged)=\"handleSelectionChange(user)\">\n        </cometchat-checkbox>\n      } @else if (selectionMode === SelectionMode.single) {\n        <cometchat-radio-button\n          [checked]=\"isUserSelected(user)\"\n          [ariaLabel]=\"'Select ' + user.getName()\"\n          (radioChanged)=\"handleSelectionChange(user)\">\n        </cometchat-radio-button>\n      }\n    </div>\n  </ng-template>\n</div>\n</cometchat-error-boundary>\n","/**\n * CometChatUsers Component Public API\n *\n * This module exports the CometChatUsersComponent for displaying\n * and managing user lists.\n *\n * @module components/cometchat-users\n */\n\n// Component export\nexport { CometChatUsersComponent } from './cometchat-users.component';\n\n// Re-export commonly used types for convenience\nexport { SelectionMode, States } from '../../Enums/Enums';\nexport { CometChatOption } from '../../modals/CometChatOption';\n","/**\n * CometChatGroupItem renders a single group item with state management,\n * avatar, custom templates, context menu, and keyboard accessibility.\n * @see Requirements 2.1-2.6\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ViewChild,\n  inject,\n  computed,\n  signal,\n  booleanAttribute, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatContextMenuComponent } from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { Placement } from '../../Enums/Enums';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\n\n@Component({\n  selector: 'cometchat-group-item',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatContextMenuComponent],\n  templateUrl: './cometchat-group-item.component.html',\n  styleUrls: ['./cometchat-group-item.component.css'],\n})\nexport class CometChatGroupItemComponent {\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  @Input({ required: true }) group!: CometChat.Group;\n  @Input() isActive = false;\n  @Input() isSelected = false;\n  @Input() isFocused = false;\n  @Input() tabIndex = -1;\n\n  private hideGroupTypeExplicitlySet = signal(false);\n  private disableDefaultContextMenuExplicitlySet = signal(false);\n  private _hideGroupType = signal(false);\n  private _disableDefaultContextMenu = signal(true);\n\n  @Input({ transform: booleanAttribute })\n  set hideGroupType(value: boolean) { this._hideGroupType.set(value); this.hideGroupTypeExplicitlySet.set(true); }\n  get hideGroupType(): boolean { return this._hideGroupType(); }\n\n  @Input({ transform: booleanAttribute })\n  set disableDefaultContextMenu(value: boolean) { this._disableDefaultContextMenu.set(value); this.disableDefaultContextMenuExplicitlySet.set(true); }\n  get disableDefaultContextMenu(): boolean { return this._disableDefaultContextMenu(); }\n\n  effectiveHideGroupType = computed(() => {\n    if (this.hideGroupTypeExplicitlySet()) return this._hideGroupType();\n    if (this.globalConfig?.hideGroupType !== undefined) return this.globalConfig.hideGroupType;\n    return false;\n  });\n\n  effectiveDisableDefaultContextMenu = computed(() => {\n    if (this.disableDefaultContextMenuExplicitlySet()) return this._disableDefaultContextMenu();\n    if (this.globalConfig?.disableDefaultContextMenu !== undefined) return this.globalConfig.disableDefaultContextMenu;\n    return true;\n  });\n\n  @Input() contextMenuOptions?: CometChatOption[];\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.Group }>;\n\n  // ============================================\n  // Output Events\n  // ============================================\n\n  @Output() itemClick = new EventEmitter<CometChat.Group>();\n  @Output() itemSelect = new EventEmitter<{ group: CometChat.Group; selected: boolean; }>();\n  @Output() contextMenuOpen = new EventEmitter<CometChat.Group>();\n  @Output() contextMenuOptionClick = new EventEmitter<{ option: CometChatOption; group: CometChat.Group; }>();\n  @Output() itemFocus = new EventEmitter<void>();\n\n  @ViewChild(CometChatContextMenuComponent) contextMenuRef?: CometChatContextMenuComponent;\n\n  readonly Placement = Placement;\n\n  get groupIcon(): string { return this.group?.getIcon() || ''; }\n  get groupName(): string { return this.group?.getName() || ''; }\n  get groupType(): string { return this.group?.getType() || ''; }\n  get memberCount(): number { return this.group?.getMembersCount() || 0; }\n\n  get memberCountText(): string {\n    const count = this.memberCount;\n    return count === 1\n      ? `${count} ${CometChatLocalize.getLocalizedString('group_member')}`\n      : `${count} ${CometChatLocalize.getLocalizedString('group_members')}`;\n  }\n\n  get accessibleLabel(): string {\n    const parts: string[] = [this.groupName];\n    if (!this.effectiveHideGroupType() && this.groupType) {\n      const typeKeyMap: Record<string, string> = { public: 'accessibility_group_type_public', private: 'accessibility_group_type_private', password: 'accessibility_group_type_password' };\n      const typeKey = typeKeyMap[this.groupType];\n      if (typeKey) parts.push(CometChatLocalize.getLocalizedString(typeKey));\n    }\n    parts.push(this.memberCountText);\n    return parts.join(', ');\n  }\n\n  handleMouseDown(event: MouseEvent): void { event.preventDefault(); }\n  handleClick(): void { this.itemClick.emit(this.group); }\n  onItemFocus(): void { this.itemFocus.emit(); }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleClick(); }\n    if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') { event.preventDefault(); this.handleContextMenuOpen(); }\n  }\n\n  handleContextMenuOpen(): void {\n    if (this.contextMenuRef && !this.contextMenuRef.showSubMenu) {\n      this.contextMenuRef.handleMenuClick();\n    }\n    this.contextMenuOpen.emit(this.group);\n  }\n\n  handleContextMenu(event: MouseEvent): void {\n    if (!this.effectiveDisableDefaultContextMenu()) return;\n    event.preventDefault();\n    if (this.contextMenuRef?.data?.length) {\n      this.handleContextMenuOpen();\n    }\n  }\n  handleContextMenuOptionClick(option: CometChatOption): void { this.contextMenuOptionClick.emit({ option, group: this.group }); }\n}\n","<!--\n  CometChatGroupItem Template\n  \n  A standalone component for rendering a single group item with support for:\n  - State management (active, selected, focused)\n  - Group icon/avatar with group type indicator\n  - Custom templates for leading, title, subtitle, and trailing sections\n  - Context menu integration\n  - Full accessibility support (ARIA labels, keyboard navigation)\n  \n  @see Requirements 2.7, 2.8, 2.9, 2.10, 2.11, 2.12, 2.13, 2.14\n-->\n\n<div class=\"cometchat-group-item\"\n     [class.cometchat-group-item--active]=\"isActive\"\n     [class.cometchat-group-item--selected]=\"isSelected\"\n     [class.cometchat-group-item--focused]=\"isFocused\"\n     role=\"option\"\n     [attr.tabindex]=\"tabIndex\"\n     [attr.aria-selected]=\"isSelected\"\n     [attr.aria-label]=\"accessibleLabel\"\n     (click)=\"handleClick()\"\n     (keydown)=\"onKeyDown($event)\"\n     (mousedown)=\"handleMouseDown($event)\"\n     (focus)=\"onItemFocus()\"\n     (contextmenu)=\"handleContextMenu($event)\">\n  \n  <!-- Leading Section: Icon/Avatar and Group Type Indicator -->\n  @if (leadingView) {\n    <ng-container *ngTemplateOutlet=\"leadingView; context: { $implicit: group }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-group-item__leading\" aria-hidden=\"true\">\n      <!-- Group Icon/Avatar -->\n      <cometchat-avatar \n        [image]=\"groupIcon\" \n        [name]=\"groupName\"\n        class=\"cometchat-group-item__avatar\">\n      </cometchat-avatar>\n      \n      <!-- Group type indicator (private, password) — matches conversation-item pattern -->\n      <!-- Public groups don't show a type badge (consistent with conversation-item) -->\n      @if (!effectiveHideGroupType() && (groupType === 'private' || groupType === 'password')) {\n        <div class=\"cometchat-group-item__type-indicator\"\n             [class.cometchat-group-item__type-indicator--private]=\"groupType === 'private'\"\n             [class.cometchat-group-item__type-indicator--password]=\"groupType === 'password'\"\n             [attr.data-type]=\"groupType\"\n             role=\"presentation\">\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Body Section: Title and Subtitle -->\n  <div class=\"cometchat-group-item__body\">\n    <!-- Title section -->\n    @if (titleView) {\n      <ng-container *ngTemplateOutlet=\"titleView; context: { $implicit: group }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-group-item__title\">\n        <span class=\"cometchat-group-item__title-text\">\n          {{ groupName }}\n        </span>\n      </div>\n    }\n    \n    <!-- Subtitle section (member count) -->\n    @if (subtitleView) {\n      <ng-container *ngTemplateOutlet=\"subtitleView; context: { $implicit: group }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-group-item__subtitle\">\n        <span class=\"cometchat-group-item__subtitle-text\">\n          {{ memberCountText }}\n        </span>\n      </div>\n    }\n  </div>\n  \n  <!-- Trailing Section: Context Menu -->\n  @if (trailingView) {\n    <ng-container *ngTemplateOutlet=\"trailingView; context: { $implicit: group }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-group-item__trailing\">\n      <!-- Context menu -->\n      @if (contextMenuOptions && contextMenuOptions.length > 0) {\n        <div class=\"cometchat-group-item__context-menu\">\n          <cometchat-context-menu\n            [data]=\"contextMenuOptions\"\n            [placement]=\"Placement.left\"\n            [topMenuSize]=\"2\"\n            [closeOnOutsideClick]=\"true\"\n            (optionClick)=\"handleContextMenuOptionClick($any($event))\"\n            class=\"cometchat-group-item__menu\">\n          </cometchat-context-menu>\n        </div>\n      }\n    </div>\n  }\n</div>\n","/**\n * Utility functions for GroupsService listener management.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../utils/CometChatLogger';\n\n/** Callback interface for group listener events */\nexport interface GroupListenerCallbacks {\n  isLoggedInUser: (user: CometChat.User) => boolean;\n  updateGroupForSDKEvents: (params: {\n    group: CometChat.Group;\n    newScope?: string;\n    newCount?: number;\n    hasJoined?: boolean;\n    addGroup?: boolean;\n  }) => void;\n  removeGroup: (guid: string) => void;\n  updateGroup: (group: CometChat.Group) => void;\n}\n\n/**\n * Attaches a CometChat GroupListener with the provided callbacks.\n */\nexport function attachGroupListener(\n  listenerId: string,\n  callbacks: GroupListenerCallbacks\n): void {\n  const { isLoggedInUser, updateGroupForSDKEvents, removeGroup, updateGroup } = callbacks;\n  try {\n    CometChat.addGroupListener(\n      listenerId,\n      new CometChat.GroupListener({\n        onGroupMemberJoined: (_msg: CometChat.Action, user: CometChat.User, group: CometChat.Group) => {\n          const isLoggedIn = isLoggedInUser(user);\n          updateGroupForSDKEvents({ group, newCount: group.getMembersCount(), hasJoined: isLoggedIn ? true : undefined, addGroup: isLoggedIn });\n        },\n        onGroupMemberLeft: (_msg: CometChat.Action, user: CometChat.User, group: CometChat.Group) => {\n          if (isLoggedInUser(user)) { removeGroup(group.getGuid()); }\n          else { updateGroupForSDKEvents({ group, newCount: group.getMembersCount() }); }\n        },\n        onGroupMemberKicked: (_msg: CometChat.Action, user: CometChat.User, _by: CometChat.User, group: CometChat.Group) => {\n          if (isLoggedInUser(user)) { removeGroup(group.getGuid()); }\n          else { updateGroupForSDKEvents({ group, newCount: group.getMembersCount() }); }\n        },\n        onGroupMemberBanned: (_msg: CometChat.Action, user: CometChat.User, _by: CometChat.User, group: CometChat.Group) => {\n          if (isLoggedInUser(user)) { removeGroup(group.getGuid()); }\n          else { updateGroupForSDKEvents({ group, newCount: group.getMembersCount() }); }\n        },\n        onGroupMemberScopeChanged: (_msg: CometChat.Action, user: CometChat.User, newScope: string, _old: string, group: CometChat.Group) => {\n          if (isLoggedInUser(user)) { updateGroupForSDKEvents({ group, newScope }); }\n          else { updateGroup(group); }\n        },\n        onMemberAddedToGroup: (_msg: CometChat.Action, user: CometChat.User, _by: CometChat.User, group: CometChat.Group) => {\n          const isLoggedIn = isLoggedInUser(user);\n          updateGroupForSDKEvents({ group, newCount: group.getMembersCount(), hasJoined: isLoggedIn ? true : undefined, addGroup: isLoggedIn });\n        },\n      })\n    );\n  } catch (error) {\n    CometChatLogger.error('GroupsService', 'Error attaching group listener:', error);\n  }\n}\n","import { Injectable, signal, inject, DestroyRef } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { States } from '../Enums/Enums';\nimport { CometChatUIKitUtility } from '../CometChatUIKitUtility';\nimport { CometChatLogger } from '../utils/CometChatLogger';\nimport { GroupsErrorCallback } from './groups.service.types';\nimport { attachGroupListener } from './groups.service.utils';\nimport { ConnectionStateService } from './connection-state.service';\n\nexport type { GroupsErrorCallback };\n\n/**\n * GroupsService manages group list state and SDK interactions.\n * NOT `providedIn: 'root'` — instantiated per component instance.\n * Uses Angular Signals for reactive state management.\n * @see Requirements 2.1, 2.3, 2.5, 2.7\n */\n@Injectable()\nexport class GroupsService {\n  private groupsSignal = signal<CometChat.Group[]>([]);\n  private fetchStateSignal = signal<States>(States.loading);\n  private hasMoreSignal = signal<boolean>(true);\n\n  readonly groups = this.groupsSignal.asReadonly();\n  readonly fetchState = this.fetchStateSignal.asReadonly();\n  readonly hasMore = this.hasMoreSignal.asReadonly();\n\n  private groupsRequest: CometChat.GroupsRequest | null = null;\n  private errorCallback: GroupsErrorCallback | null = null;\n  private isFetching = false;\n  private loggedInUser: CometChat.User | null = null;\n\n  private groupListenerId = `groups_service_group_${CometChatUIKitUtility.ID()}`;\n  /** Guard: only re-fetch on reconnect after the first fetch has completed. */\n  private initialFetchDone = false;\n\n  // Injected here so the component doesn't need to wire up reconnect logic —\n  // the service subscribes to the shared connection state directly.\n  private connectionState = inject(ConnectionStateService);\n  private destroyRef = inject(DestroyRef);\n\n  private static readonly DEFAULT_LIMIT = 30;\n  private static readonly MIN_SHIMMER_TIME = 1000;\n\n  constructor() {\n    // Re-fetch on WebSocket reconnect. Uses the shared singleton listener\n    // instead of registering a per-service CometChat.ConnectionListener.\n    this.connectionState.reconnected$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => this.handleReconnect());\n  }\n\n  /**\n   * Set the error callback for propagating errors to the component.\n   */\n  setErrorCallback(callback: GroupsErrorCallback | null): void {\n    this.errorCallback = callback;\n  }\n\n  /**\n   * Initialize the service with request builder configuration.\n   * Ports the GroupsManager constructor logic.\n   *\n   * @param config - Configuration matching the original GroupsManager constructor args\n   */\n  initialize(config: {\n    groupsRequestBuilder?: CometChat.GroupsRequestBuilder | null;\n    searchRequestBuilder?: CometChat.GroupsRequestBuilder | null;\n    searchText?: string;\n    groupsSearchText?: string;\n  }): void {\n    const {\n      groupsRequestBuilder = null,\n      searchRequestBuilder = null,\n      searchText = '',\n      groupsSearchText = '',\n    } = config;\n\n    this.groupsSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.isFetching = false;\n\n    this.groupsRequest = this.buildRequest(\n      searchText,\n      groupsRequestBuilder,\n      searchRequestBuilder,\n      groupsSearchText\n    );\n  }\n\n\n  /**\n   * Fetch the next page of groups from the SDK.\n   * Includes minimum shimmer time on initial fetch, duplicate-free appending,\n   * hasMore tracking, and isFetching guard to prevent concurrent calls.\n   */\n  async fetchNext(): Promise<void> {\n    if (!this.groupsRequest || this.isFetching) {\n      return;\n    }\n\n    this.isFetching = true;\n\n    const isInitialFetch =\n      this.groupsSignal().length === 0 && this.fetchStateSignal() === States.loading;\n    const startTime = Date.now();\n\n    try {\n      const newGroups = await this.groupsRequest.fetchNext();\n\n      // Ensure shimmer is visible for at least MIN_SHIMMER_TIME on initial fetch\n      if (isInitialFetch) {\n        const elapsed = Date.now() - startTime;\n        const remainingTime = Math.max(0, GroupsService.MIN_SHIMMER_TIME - elapsed);\n        await new Promise<void>(resolve => setTimeout(resolve, remainingTime));\n      }\n\n      if (newGroups.length === 0) {\n        this.hasMoreSignal.set(false);\n        if (this.groupsSignal().length === 0) {\n          this.fetchStateSignal.set(States.empty);\n        }\n        this.isFetching = false;\n        return;\n      }\n\n      this.appendGroupsWithoutDuplicates(newGroups);\n\n      if (newGroups.length < GroupsService.DEFAULT_LIMIT) {\n        this.hasMoreSignal.set(false);\n      }\n\n      this.fetchStateSignal.set(States.loaded);\n      this.initialFetchDone = true;\n    } catch (error) {\n      CometChatLogger.error('GroupsService', 'Error fetching groups:', error);\n      if (this.groupsSignal().length === 0) {\n        this.fetchStateSignal.set(States.error);\n      }\n      this.handleError(error);\n    } finally {\n      this.isFetching = false;\n    }\n  }\n\n  /**\n   * Search groups by keyword. Resets the list and creates a new request builder.\n   *\n   * @param keyword - The search keyword\n   * @param searchRequestBuilder - Optional custom search request builder\n   */\n  search(\n    keyword: string,\n    config?: {\n      groupsRequestBuilder?: CometChat.GroupsRequestBuilder | null;\n      searchRequestBuilder?: CometChat.GroupsRequestBuilder | null;\n    }\n  ): void {\n    this.groupsSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.isFetching = false;\n\n    this.groupsRequest = this.buildRequest(\n      keyword,\n      config?.groupsRequestBuilder ?? null,\n      config?.searchRequestBuilder ?? null,\n      ''\n    );\n  }\n\n  // ==================== Listener Management ====================\n\n  /** Attach SDK GroupListener for real-time group events. */\n  attachListeners(): void {\n    this.cacheLoggedInUser();\n    attachGroupListener(this.groupListenerId, {\n      isLoggedInUser: (user) => this.isLoggedInUser(user),\n      updateGroupForSDKEvents: (params) => this.updateGroupForSDKEvents(params),\n      removeGroup: (guid) => this.removeGroup(guid),\n      updateGroup: (group) => this.updateGroup(group),\n    });\n  }\n\n  /**\n   * Remove the SDK group listener.\n   * Connection listener is managed by the shared ConnectionStateService.\n   */\n  detachListeners(): void {\n    try {\n      CometChat.removeGroupListener(this.groupListenerId);\n    } catch (error) {\n      CometChatLogger.error('GroupsService', 'Error removing group listener:', error);\n    }\n  }\n\n  // ==================== Private: Reconnect ====================\n\n  /**\n   * Called by ConnectionStateService when the WebSocket reconnects.\n   * Resets the request and re-fetches the first page of groups.\n   */\n  private handleReconnect(): void {\n    if (!this.groupsRequest || !this.initialFetchDone) return;\n    CometChatLogger.info('GroupsService', 'WebSocket reconnected — refreshing group list');\n    // Silent refresh: don't show shimmer, don't clear the list until new data arrives.\n    const freshRequest = this.buildRequest('', null, null, '');\n    freshRequest.fetchNext()\n      .then(newGroups => {\n        this.groupsSignal.set(newGroups);\n        // Reset hasMore to true — we're back at page 1, more pages may exist\n        this.hasMoreSignal.set(true);\n        if (newGroups.length === 0) {\n          this.fetchStateSignal.set(States.empty);\n        } else {\n          this.fetchStateSignal.set(States.loaded);\n        }\n        this.groupsRequest = freshRequest;\n      })\n      .catch(e => CometChatLogger.error('GroupsService', 'Error refreshing groups on reconnect:', e));\n  }\n\n\n  // ==================== List Mutation Methods ====================\n\n  /** Update a group in the list by replacing it at its current position. */\n  updateGroup(group: CometChat.Group): void {\n    const current = this.groupsSignal();\n    const index = current.findIndex(g => g.getGuid() === group.getGuid());\n\n    if (index !== -1) {\n      this.groupsSignal.set([\n        ...current.slice(0, index),\n        group,\n        ...current.slice(index + 1),\n      ]);\n    }\n  }\n\n  /** Remove a group from the list by GUID. */\n  removeGroup(guid: string): void {\n    const current = this.groupsSignal();\n    const filtered = current.filter(g => g.getGuid() !== guid);\n    this.groupsSignal.set(filtered);\n\n    if (filtered.length === 0) {\n      this.fetchStateSignal.set(States.empty);\n    }\n  }\n\n  /** Prepend a group to the beginning of the list (if not already present). */\n  prependGroup(group: CometChat.Group): void {\n    const current = this.groupsSignal();\n    if (current.some(g => g.getGuid() === group.getGuid())) {\n      return;\n    }\n    this.groupsSignal.set([group, ...current]);\n\n    if (this.fetchStateSignal() === States.empty) {\n      this.fetchStateSignal.set(States.loaded);\n    }\n  }\n\n  /** Update a group for SDK events with additional metadata. */\n  updateGroupForSDKEvents(params: {\n    group: CometChat.Group;\n    newScope?: string;\n    newCount?: number;\n    hasJoined?: boolean;\n    addGroup?: boolean;\n  }): void {\n    const { group, addGroup } = params;\n\n    // If addGroup is true and group not in list, prepend it\n    if (addGroup) {\n      const current = this.groupsSignal();\n      const existingIndex = current.findIndex(g => g.getGuid() === group.getGuid());\n      if (existingIndex === -1) {\n        this.prependGroup(group);\n        return;\n      }\n    }\n\n    // Otherwise, update the existing group\n    this.updateGroup(group);\n  }\n\n  /** Append multiple groups to the list without duplicates. */\n  appendGroupsWithoutDuplicates(groups: CometChat.Group[]): void {\n    const current = this.groupsSignal();\n    const existingGuids = new Set(current.map(g => g.getGuid()));\n    const newGroups = groups.filter(g => !existingGuids.has(g.getGuid()));\n\n    if (newGroups.length > 0) {\n      this.groupsSignal.set([...current, ...newGroups]);\n    }\n  }\n\n  // ==================== Cleanup ====================\n\n  /**\n   * Full cleanup: detach listeners and reset state.\n   */\n  cleanup(): void {\n    this.detachListeners();\n    this.groupsSignal.set([]);\n    this.fetchStateSignal.set(States.loading);\n    this.hasMoreSignal.set(true);\n    this.groupsRequest = null;\n    this.errorCallback = null;\n    this.isFetching = false;\n    this.loggedInUser = null;\n    this.initialFetchDone = false;\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Build a GroupsRequest from the provided configuration.\n   * Ports the GroupsManager constructor logic.\n   */\n  private buildRequest(\n    searchText: string,\n    groupsRequestBuilder: CometChat.GroupsRequestBuilder | null,\n    searchRequestBuilder: CometChat.GroupsRequestBuilder | null,\n    groupsSearchText: string\n  ): CometChat.GroupsRequest {\n    if (searchText) {\n      if (searchRequestBuilder) {\n        return searchRequestBuilder.setSearchKeyword(searchText).build();\n      } else if (groupsRequestBuilder) {\n        return groupsRequestBuilder.setSearchKeyword(searchText).build();\n      } else {\n        return new CometChat.GroupsRequestBuilder()\n          .setLimit(GroupsService.DEFAULT_LIMIT)\n          .setSearchKeyword(searchText)\n          .build();\n      }\n    } else {\n      if (groupsRequestBuilder) {\n        return groupsRequestBuilder.build();\n      } else {\n        return new CometChat.GroupsRequestBuilder()\n          .setLimit(GroupsService.DEFAULT_LIMIT)\n          .build();\n      }\n    }\n  }\n\n  /**\n   * Cache the logged-in user from the SDK for isLoggedInUser checks.\n   */\n  private cacheLoggedInUser(): void {\n    if (!this.loggedInUser) {\n      CometChat.getLoggedinUser()\n        .then((user: CometChat.User | null) => {\n          this.loggedInUser = user;\n        })\n        .catch((error: CometChat.CometChatException) => {\n          CometChatLogger.error('GroupsService', 'Error getting logged-in user:', error);\n        });\n    }\n  }\n\n  /**\n   * Check if the given user is the logged-in user.\n   */\n  private isLoggedInUser(user: CometChat.User): boolean {\n    if (!this.loggedInUser) {\n      return false;\n    }\n    return user.getUid() === this.loggedInUser.getUid();\n  }\n\n  /**\n   * Propagate an error to the component via the error callback.\n   */\n  private handleError(error: unknown): void {\n    if (this.errorCallback) {\n      const exception = this.toCometChatException(error);\n      this.errorCallback(exception);\n    }\n  }\n\n  /**\n   * Convert an unknown error to a CometChatException.\n   */\n  private toCometChatException(error: unknown): CometChat.CometChatException {\n    if (error instanceof CometChat.CometChatException) {\n      return error;\n    }\n\n    if (error instanceof Error) {\n      return new CometChat.CometChatException({\n        code: 'GROUPS_ERROR',\n        message: error.message,\n        details: error.stack || '',\n      });\n    }\n\n    return new CometChat.CometChatException({\n      code: 'GROUPS_ERROR',\n      message: String(error),\n      details: '',\n    });\n  }\n}\n","/**\n * Keyboard navigation helpers for CometChatGroups component.\n *\n * Extracted from cometchat-groups.component.ts to isolate\n * keyboard navigation and focus management logic.\n */\n\nimport { ChangeDetectorRef } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Moves focus to the next group item, wrapping at the end.\n * Returns the new focusedIndex.\n */\nexport function focusNextGroupItem(\n  groupList: CometChat.Group[],\n  focusedIndex: number,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): number {\n  if (groupList.length === 0) return focusedIndex;\n  let newIndex: number;\n  if (focusedIndex === -1) {\n    newIndex = 0;\n  } else if (focusedIndex < groupList.length - 1) {\n    newIndex = focusedIndex + 1;\n  } else {\n    newIndex = 0;\n  }\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n  return newIndex;\n}\n\n/**\n * Moves focus to the previous group item, wrapping at the start.\n * Returns the new focusedIndex.\n */\nexport function focusPreviousGroupItem(\n  groupList: CometChat.Group[],\n  focusedIndex: number,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): number {\n  if (groupList.length === 0) return focusedIndex;\n  let newIndex: number;\n  if (focusedIndex === -1) {\n    newIndex = groupList.length - 1;\n  } else if (focusedIndex > 0) {\n    newIndex = focusedIndex - 1;\n  } else {\n    newIndex = groupList.length - 1;\n  }\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n  return newIndex;\n}\n\n/**\n * Scrolls the focused group item into view.\n */\nexport function scrollGroupItemIntoView(\n  listContainer: HTMLElement | undefined,\n  focusedIndex: number,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  pendingTimers.push(\n    setTimeout(() => {\n      if (!listContainer) return;\n      const el = listContainer.querySelector(`[data-index=\"${focusedIndex}\"]`);\n      if (el) el.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n    }, 0)\n  );\n}\n\n/**\n * Focuses the DOM element for the group item at the given index.\n */\nexport function focusGroupItemAtIndex(\n  listContainer: HTMLElement | undefined,\n  index: number,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  pendingTimers.push(\n    setTimeout(() => {\n      if (!listContainer) return;\n      const el = listContainer.querySelector(`[data-index=\"${index}\"] cometchat-group-item`);\n      if (el) {\n        const focusable = el.querySelector('[tabindex=\"0\"]') as HTMLElement;\n        if (focusable) focusable.focus();\n      }\n    }, 0)\n  );\n}\n","/**\n * Selection helpers for CometChatGroups component.\n *\n * Pure functions that encapsulate selection logic, operating on state\n * passed as parameters so the component class stays lean.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { EventEmitter } from '@angular/core';\nimport { SelectionMode } from '../../Enums/Enums';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { GroupSelectPayload } from './cometchat-groups.types';\n\n/**\n * Emits a SelectionState event reflecting the current selection.\n *\n * @param selectionMode - Current selection mode\n * @param selectedGroups - Set of currently selected group GUIDs\n * @param lastSelectedId - GUID of the last selected/deselected group, or null\n * @param selectionChange - EventEmitter to emit on\n */\nexport function emitGroupSelectionChange(\n  selectionMode: SelectionMode,\n  selectedGroups: Set<string>,\n  lastSelectedId: string | null,\n  selectionChange: EventEmitter<SelectionState>\n): void {\n  selectionChange.emit({\n    mode: selectionMode,\n    selectedIds: new Set(selectedGroups),\n    lastSelectedId,\n  });\n}\n\n/**\n * Performs shift-click range selection/deselection.\n *\n * The action (select vs deselect) is determined by the clicked item's current state:\n * - If clicked item is already selected → deselect all in range\n * - If clicked item is not selected → select all in range\n *\n * @param groupList - Full list of groups\n * @param startIndex - Anchor index (previous selection)\n * @param endIndex - Currently clicked index\n * @param selectedGroups - Mutable set of selected GUIDs (modified in place)\n * @param selectEmitter - EventEmitter for individual select events\n * @param selectionChange - EventEmitter for bulk selection-change events\n * @param selectionMode - Current selection mode\n * @returns The new lastSelectedIndex value (endIndex)\n */\nexport function selectGroupRange(\n  groupList: CometChat.Group[],\n  startIndex: number,\n  endIndex: number,\n  selectedGroups: Set<string>,\n  selectEmitter: EventEmitter<GroupSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): number {\n  const minIndex = Math.min(startIndex, endIndex);\n  const maxIndex = Math.max(startIndex, endIndex);\n\n  const clickedGroup = groupList[endIndex];\n  const clickedId = clickedGroup.getGuid();\n  const shouldDeselect = selectedGroups.has(clickedId);\n\n  for (let i = minIndex; i <= maxIndex; i++) {\n    const group = groupList[i];\n    const id = group.getGuid();\n\n    if (shouldDeselect) {\n      if (selectedGroups.has(id)) {\n        selectedGroups.delete(id);\n        selectEmitter.emit({ group, selected: false });\n      }\n    } else {\n      if (!selectedGroups.has(id)) {\n        selectedGroups.add(id);\n        selectEmitter.emit({ group, selected: true });\n      }\n    }\n  }\n\n  emitGroupSelectionChange(selectionMode, selectedGroups, clickedId, selectionChange);\n  return endIndex;\n}\n\n/**\n * Selects all groups in the list (multiple mode only).\n * Emits individual select events for newly selected groups, then a single selectionChange.\n *\n * @param groupList - Full list of groups\n * @param selectedGroups - Mutable set of selected GUIDs (modified in place)\n * @param selectEmitter - EventEmitter for individual select events\n * @param selectionChange - EventEmitter for bulk selection-change events\n * @param selectionMode - Current selection mode\n */\nexport function selectAllGroups(\n  groupList: CometChat.Group[],\n  selectedGroups: Set<string>,\n  selectEmitter: EventEmitter<GroupSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): void {\n  if (selectionMode !== SelectionMode.multiple) return;\n\n  groupList.forEach(group => {\n    const guid = group.getGuid();\n    if (!selectedGroups.has(guid)) {\n      selectedGroups.add(guid);\n      selectEmitter.emit({ group, selected: true });\n    }\n  });\n\n  emitGroupSelectionChange(selectionMode, selectedGroups, null, selectionChange);\n}\n\n/**\n * Clears all selections.\n * Emits individual select events for previously selected groups, then a single selectionChange.\n *\n * @param groupList - Full list of groups\n * @param selectedGroups - Mutable set of selected GUIDs (modified in place)\n * @param selectEmitter - EventEmitter for individual select events\n * @param selectionChange - EventEmitter for bulk selection-change events\n * @param selectionMode - Current selection mode\n */\nexport function clearGroupSelection(\n  groupList: CometChat.Group[],\n  selectedGroups: Set<string>,\n  selectEmitter: EventEmitter<GroupSelectPayload>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): void {\n  groupList.forEach(group => {\n    const guid = group.getGuid();\n    if (selectedGroups.has(guid)) {\n      selectEmitter.emit({ group, selected: false });\n    }\n  });\n\n  selectedGroups.clear();\n  emitGroupSelectionChange(selectionMode, selectedGroups, null, selectionChange);\n}\n","import {\n  Component, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef,\n  ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy,\n  inject, HostListener, signal, computed, booleanAttribute, DestroyRef,\n} from '@angular/core';\nimport { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatGroupEvents } from '../../events/CometChatGroupEvents';\nimport { CometChatPaginatedListComponent } from '../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { CometChatGroupItemComponent } from '../cometchat-group-item/cometchat-group-item.component';\nimport { CometChatCheckboxComponent } from '../base-elements/cometchat-checkbox/cometchat-checkbox.component';\nimport { CometChatRadioButtonComponent } from '../base-elements/cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatSearchBarComponent } from '../base-elements/cometchat-search-bar/cometchat-search-bar.component';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { SelectionMode, States } from '../../Enums/Enums';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { GroupsService } from '../../services/groups.service';\nimport { ChatStateService } from '../../services/chat-state.service';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { TypeAheadService } from '../../services/type-ahead.service';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { handleListKeyDown, ListKeyboardHost } from '../../utils/list-keyboard-handler';\nimport { focusNextGroupItem, focusPreviousGroupItem, scrollGroupItemIntoView, focusGroupItemAtIndex } from './cometchat-groups.keyboard';\nimport { emitGroupSelectionChange, selectGroupRange, selectAllGroups, clearGroupSelection } from './cometchat-groups.selection';\n\n@Component({\n  selector: 'cometchat-groups',\n  standalone: true,\n  imports: [CommonModule, CometChatPaginatedListComponent, CometChatGroupItemComponent, CometChatCheckboxComponent, CometChatRadioButtonComponent, CometChatSearchBarComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  templateUrl: './cometchat-groups.component.html',\n  styleUrls: ['./cometchat-groups.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [GroupsService],\n})\nexport class CometChatGroupsComponent implements OnInit, OnDestroy {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n  private cdr = inject(ChangeDetectorRef);\n  private groupsService = inject(GroupsService);\n  private chatStateService = inject(ChatStateService);\n  private templatesService = inject(CometChatTemplatesService);\n  private destroyRef = inject(DestroyRef);\n  private typeAheadService = inject(TypeAheadService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  @ViewChild('paginatedList') paginatedList?: CometChatPaginatedListComponent<CometChat.Group>;\n  @ViewChild('listContainer') listContainer?: ElementRef<HTMLElement>;\n\n  private hideGroupTypeExplicitlySet = signal(false);\n  private showScrollbarExplicitlySet = signal(false);\n  private hideErrorExplicitlySet = signal(false);\n  private _hideGroupType = signal(false);\n  private _showScrollbar = signal(false);\n  private _hideError = signal(false);\n\n  @Input({ transform: booleanAttribute }) hideSearch = false;\n  @Input({ transform: booleanAttribute })\n  set hideError(value: boolean) { this._hideError.set(value); this.hideErrorExplicitlySet.set(true); }\n  get hideError(): boolean { return this._hideError(); }\n  @Input({ transform: booleanAttribute })\n  set hideGroupType(value: boolean) { this._hideGroupType.set(value); this.hideGroupTypeExplicitlySet.set(true); }\n  get hideGroupType(): boolean { return this._hideGroupType(); }\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) { this._showScrollbar.set(value); this.showScrollbarExplicitlySet.set(true); }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n  @Input({ transform: booleanAttribute }) disableDefaultContextMenu = true;\n\n  effectiveHideGroupType = computed(() => {\n    if (this.hideGroupTypeExplicitlySet()) return this._hideGroupType();\n    return this.globalConfig?.hideGroupType ?? false;\n  });\n  effectiveShowScrollbar = computed(() => {\n    if (this.showScrollbarExplicitlySet()) return this._showScrollbar();\n    return this.globalConfig?.showScrollbar ?? false;\n  });\n  effectiveHideError = computed(() => {\n    if (this.hideErrorExplicitlySet()) return this._hideError();\n    return this.globalConfig?.hideError ?? false;\n  });\n\n  @Input() groupsRequestBuilder?: CometChat.GroupsRequestBuilder;\n  @Input() searchRequestBuilder?: CometChat.GroupsRequestBuilder;\n  @Input() activeGroup?: CometChat.Group;\n  @Input() selectionMode: SelectionMode = SelectionMode.none;\n  @Input() options?: (group: CometChat.Group) => CometChatOption[];\n  @Input() headerView?: TemplateRef<any>;\n  @Input() menuView?: TemplateRef<any>;\n  @Input() loadingView?: TemplateRef<any>;\n  @Input() emptyView?: TemplateRef<any>;\n  @Input() errorView?: TemplateRef<any>;\n  @Input() itemView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.Group }>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null;\n  @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null;\n  @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n\n  private get _gt() { return this.templatesService.getGroupTemplates(); }\n  get effectiveItemView(): TemplateRef<any> | undefined { return this.listItemTemplate || this.itemView || this._gt.itemView; }\n  get effectiveLeadingView(): TemplateRef<any> | undefined { return this.leadingView || this._gt.leadingView; }\n  get effectiveTitleView(): TemplateRef<any> | undefined { return this.titleView || this._gt.titleView; }\n  get effectiveSubtitleView(): TemplateRef<any> | undefined { return this.subtitleView || this._gt.subtitleView; }\n  get effectiveTrailingView(): TemplateRef<any> | undefined { return this.trailingView || this._gt.trailingView; }\n  get effectiveLoadingView(): TemplateRef<any> | undefined { return this.loadingStateTemplate || this.loadingView || this.templatesService.resolveTemplate(this._gt, 'loadingView'); }\n  get effectiveEmptyView(): TemplateRef<any> | undefined { return this.emptyStateTemplate || this.emptyView || this.templatesService.resolveTemplate(this._gt, 'emptyView'); }\n  get effectiveErrorView(): TemplateRef<any> | undefined { return this.errorStateTemplate || this.errorView || this.templatesService.resolveTemplate(this._gt, 'errorView'); }\n\n  @Output() itemClick = new EventEmitter<CometChat.Group>();\n  @Output() select = new EventEmitter<{ group: CometChat.Group; selected: boolean }>();\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() selectionChange = new EventEmitter<SelectionState>();\n\n  groupList: CometChat.Group[] = [];\n  fetchState: States = States.loading;\n  lastError: Error | null = null;\n  searchText = '';\n  selectedGroups = new Set<string>();\n  focusedIndex = -1;\n  lastSelectedIndex = -1;\n  private initialLoadComplete = false;\n  isFetchingMore = signal(false);\n  hasMore = signal(true);\n  readonly SelectionMode = SelectionMode;\n  readonly States = States;\n  private searchSubject$ = new Subject<string>();\n  private isFirstFetch = true;\n\n  constructor() {\n    // Sync hasMore from service signal — picks up reconnect resets automatically.\n    // Must be in constructor to ensure injection context for toObservable.\n    toObservable(this.groupsService.hasMore)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(v => this.hasMore.set(v));\n  }\n\n  ngOnInit(): void {\n    this.groupsService.setErrorCallback((error) => { this.lastError = error as unknown as Error; this.error.emit(error); });\n    this.initializeGroupsManager();\n    this.setupSearchDebouncing();\n    this.setupGroupListeners();\n    this.setupGroupEventSubscriptions();\n    this.fetchNextAndAppendGroups();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.groupsService.cleanup();\n  }\n\n  private initializeGroupsManager(): void {\n    this.groupsService.initialize({ searchText: this.searchText, groupsRequestBuilder: this.groupsRequestBuilder || null, searchRequestBuilder: this.searchRequestBuilder || null, groupsSearchText: '' });\n    this.groupList = []; this.fetchState = States.loading; this.isFirstFetch = true; this.hasMore.set(true);\n  }\n\n  private setupSearchDebouncing(): void {\n    this.searchSubject$.pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n      .subscribe(searchText => this.handleSearchTextChange(searchText));\n  }\n\n  private setupGroupListeners(): void { this.groupsService.attachListeners(); }\n\n  private setupGroupEventSubscriptions(): void {\n    const d = this.destroyRef;\n    CometChatGroupEvents.ccGroupCreated.pipe(takeUntilDestroyed(d)).subscribe((group: CometChat.Group) => { this.groupsService.prependGroup(group); this.syncStateFromService(); });\n    CometChatGroupEvents.ccGroupDeleted.pipe(takeUntilDestroyed(d)).subscribe((group: CometChat.Group) => { this.groupsService.removeGroup(group.getGuid()); this.selectedGroups.delete(group.getGuid()); this.syncStateFromService(); });\n    CometChatGroupEvents.ccGroupLeft.pipe(takeUntilDestroyed(d)).subscribe((data: { userLeft: CometChat.User; leftGroup: CometChat.Group; message: CometChat.Action }) => {\n      if (data.leftGroup.getType() === 'private') { this.groupsService.removeGroup(data.leftGroup.getGuid()); this.selectedGroups.delete(data.leftGroup.getGuid()); }\n      else { this.groupsService.updateGroup(data.leftGroup); }\n      this.syncStateFromService();\n    });\n    CometChatGroupEvents.ccGroupMemberJoined.pipe(takeUntilDestroyed(d)).subscribe((data: { joinedUser: CometChat.User; joinedGroup: CometChat.Group }) => { this.groupsService.updateGroup(data.joinedGroup); this.syncStateFromService(); });\n    CometChatGroupEvents.ccGroupMemberKicked.pipe(takeUntilDestroyed(d)).subscribe((data: { kickedUser: CometChat.User; kickedBy: CometChat.User; kickedFrom: CometChat.Group; message: CometChat.Action }) => { this.groupsService.updateGroup(data.kickedFrom); this.syncStateFromService(); });\n    CometChatGroupEvents.ccGroupMemberBanned.pipe(takeUntilDestroyed(d)).subscribe((data: { kickedUser: CometChat.User; kickedBy: CometChat.User; kickedFrom: CometChat.Group; message: CometChat.Action }) => { this.groupsService.updateGroup(data.kickedFrom); this.syncStateFromService(); });\n    CometChatGroupEvents.ccGroupMemberAdded.pipe(takeUntilDestroyed(d)).subscribe((data: { messages: CometChat.Action[]; usersAdded: CometChat.User[]; userAddedIn: CometChat.Group; userAddedBy: CometChat.User }) => { this.groupsService.updateGroup(data.userAddedIn); this.syncStateFromService(); });\n    CometChatGroupEvents.ccOwnershipChanged.pipe(takeUntilDestroyed(d)).subscribe((data: { group: CometChat.Group; newOwner: CometChat.GroupMember }) => { this.groupsService.updateGroup(data.group); this.syncStateFromService(); });\n  }\n\n  private refreshGroupList(): void { this.groupList = []; this.initializeGroupsManager(); this.fetchNextAndAppendGroups(); }\n\n  handleLoadMore(): void { if (this.isFetchingMore() || !this.hasMore()) return; this.fetchNextAndAppendGroups(); }\n\n  fetchNextAndAppendGroups(): void {\n    if (this.isFetchingMore() || !this.hasMore()) return;\n    this.isFetchingMore.set(true);\n    if (this.isFirstFetch) { this.fetchState = States.loading; this.cdr.detectChanges(); }\n    this.groupsService.fetchNext()\n      .then(() => { this.isFetchingMore.set(false); this.syncStateFromService(); this.isFirstFetch = false; if (!this.initialLoadComplete) { this.pendingTimers.push(setTimeout(() => { this.initialLoadComplete = true; }, 100)); } this.paginatedList?.loadComplete(); })\n      .catch(() => { this.isFetchingMore.set(false); this.syncStateFromService(); this.paginatedList?.loadComplete(); });\n  }\n\n  private syncStateFromService(): void {\n    this.groupList = this.groupsService.groups();\n    this.fetchState = this.groupsService.fetchState();\n    this.hasMore.set(this.groupsService.hasMore());\n    if (this.fetchState !== States.error) this.lastError = null;\n    this.cdr.markForCheck();\n  }\n\n  onSearch(searchText: string): void { this.searchSubject$.next(searchText); }\n\n  private handleSearchTextChange(searchText: string): void {\n    this.searchText = searchText; this.groupList = [];\n    this.groupsService.search(searchText, { groupsRequestBuilder: this.groupsRequestBuilder || null, searchRequestBuilder: this.searchRequestBuilder || null });\n    this.isFirstFetch = true; this.hasMore.set(true); this.fetchNextAndAppendGroups();\n  }\n\n  trackByGroup(_index: number, group: CometChat.Group): string { return group.getGuid(); }\n  getMemberCountText(group: CometChat.Group): string { return group.getMembersCount() === 1 ? 'group_member' : 'group_members'; }\n  getGroupType(group: CometChat.Group): string { return group.getType(); }\n\n  handleGroupClick(group: CometChat.Group): void {\n    if (this.itemClick.observed) { this.itemClick.emit(group); } else { this.chatStateService.setActiveGroup(group); }\n  }\n\n  handleSelectionChange(group: CometChat.Group, event?: Event): void {\n    const guid = group.getGuid();\n    const currentIndex = this.groupList.findIndex(g => g.getGuid() === guid);\n    const isCurrentlySelected = this.selectedGroups.has(guid);\n    if (this.selectionMode === SelectionMode.single) {\n      this.selectedGroups.clear();\n      if (!isCurrentlySelected) this.selectedGroups.add(guid);\n      this.select.emit({ group, selected: !isCurrentlySelected });\n      this.emitSelectionChange(guid);\n    } else if (this.selectionMode === SelectionMode.multiple) {\n      const isShiftClick = event instanceof MouseEvent && event.shiftKey;\n      const lastIndex = this.lastSelectedIndex;\n      if (isShiftClick && lastIndex >= 0 && currentIndex !== -1) {\n        this.selectRange(lastIndex, currentIndex);\n      } else {\n        if (isCurrentlySelected) { this.selectedGroups.delete(guid); } else { this.selectedGroups.add(guid); }\n        this.select.emit({ group, selected: !isCurrentlySelected });\n        this.lastSelectedIndex = currentIndex;\n        this.emitSelectionChange(guid);\n      }\n    }\n    this.cdr.markForCheck();\n  }\n\n  private selectRange(startIndex: number, endIndex: number): void {\n    this.lastSelectedIndex = selectGroupRange(this.groupList, startIndex, endIndex, this.selectedGroups, this.select, this.selectionChange, this.selectionMode);\n  }\n\n  handleSelectionControlChange(group: CometChat.Group, changeEvent: Event): void { this.handleSelectionChange(group, changeEvent); }\n\n  private emitSelectionChange(lastSelectedId: string | null): void {\n    emitGroupSelectionChange(this.selectionMode, this.selectedGroups, lastSelectedId, this.selectionChange);\n  }\n\n  selectAll(): void {\n    if (this.selectionMode !== SelectionMode.multiple) return;\n    this.focusedIndex = -1;\n    selectAllGroups(this.groupList, this.selectedGroups, this.select, this.selectionChange, this.selectionMode);\n    this.cdr.markForCheck();\n  }\n\n  clearSelection(): void {\n    clearGroupSelection(this.groupList, this.selectedGroups, this.select, this.selectionChange, this.selectionMode);\n    this.lastSelectedIndex = -1; this.cdr.markForCheck();\n  }\n\n  isGroupSelected(group: CometChat.Group): boolean { return this.selectedGroups.has(group.getGuid()); }\n\n  isGroupActive(group: CometChat.Group): boolean {\n    if (this.activeGroup) return group.getGuid() === this.activeGroup.getGuid();\n    const serviceActiveGroup = this.chatStateService.getActiveGroup();\n    return serviceActiveGroup ? group.getGuid() === serviceActiveGroup.getGuid() : false;\n  }\n\n  getOptionsForGroup(group: CometChat.Group): CometChatOption[] { return this.options ? this.options(group) : []; }\n  handleOptionClick(option: CometChatOption, group: CometChat.Group): void { if (option.onClick) option.onClick(); }\n  getGroupAriaLabel(group: CometChat.Group): string {\n    const count = group.getMembersCount();\n    return `${group.getName() || ''}, ${group.getType()} group, ${count} ${count === 1 ? 'member' : 'members'}`;\n  }\n\n  @HostListener('focus')\n  handleListFocus(): void {\n    if (this.focusedIndex === -1 && this.groupList.length > 0) { this.focusedIndex = 0; this.cdr.markForCheck(); this.scrollFocusedItemIntoView(); }\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void { this.onGroupsKeyDown(event); }\n\n  onGroupsKeyDown(event: KeyboardEvent): void {\n    const host: ListKeyboardHost<CometChat.Group> = {\n      itemList: this.groupList, fetchState: this.fetchState, selectionMode: this.selectionMode,\n      focusedIndex: this.focusedIndex, componentClass: 'cometchat-groups', searchBarClass: 'cometchat-groups__search-bar',\n      selectedCount: this.selectedGroups.size, cdr: this.cdr,\n      clearSelection: () => this.clearSelection(),\n      selectAll: () => this.selectAll(),\n      handleSelectionChange: item => this.handleSelectionChange(item),\n      selectRangeFromAnchor: index => this.selectRangeFromAnchor(index),\n      extendSelectionTo: index => this.extendSelectionTo(index),\n      focusNextItem: () => this.focusNextItem(),\n      focusPreviousItem: () => this.focusPreviousItem(),\n      selectFocusedItem: () => this.selectFocusedItem(),\n      scrollFocusedItemIntoView: () => this.scrollFocusedItemIntoView(),\n      focusItemAtIndex: index => this.focusItemAtIndex(index),\n      handleEscapeKey: () => this.handleEscapeKey(),\n      announceSelectionCount: () => this.announceSelectionCount(),\n      announceSelectionCleared: () => this.announceSelectionCleared(),\n      handleTypeAhead: (key, focusedIdx) => this.typeAheadService.handleCharacter(key, this.groupList, focusedIdx, { getSearchText: (group: CometChat.Group) => group.getName() || '' }),\n    };\n    handleListKeyDown(event, host);\n    if (host.focusedIndex !== this.focusedIndex) this.focusedIndex = host.focusedIndex;\n  }\n\n  private extendSelectionTo(index: number): void {\n    if (index < 0 || index >= this.groupList.length) return;\n    const group = this.groupList[index]; const guid = group.getGuid();\n    if (!this.selectedGroups.has(guid)) { this.selectedGroups.add(guid); this.select.emit({ group, selected: true }); this.emitSelectionChange(guid); }\n  }\n\n  private selectRangeFromAnchor(currentIndex: number): void {\n    const anchorIndex = this.lastSelectedIndex;\n    if (anchorIndex === -1) { if (currentIndex >= 0 && currentIndex < this.groupList.length) this.handleSelectionChange(this.groupList[currentIndex]); return; }\n    this.selectRange(anchorIndex, currentIndex);\n  }\n\n  private focusItemAtIndex(index: number): void { focusGroupItemAtIndex(this.listContainer?.nativeElement, index, this.pendingTimers); }\n\n  private announceSelectionCount(): void {\n    const message = CometChatLocalize.getLocalizedString('accessibility_items_selected').replace('{count}', this.selectedGroups.size.toString());\n    this.liveAnnouncer.announce(message, 'polite');\n  }\n\n  private announceSelectionCleared(): void {\n    this.liveAnnouncer.announce(CometChatLocalize.getLocalizedString('accessibility_selection_cleared'), 'polite');\n  }\n\n  private focusNextItem(): void {\n    this.focusedIndex = focusNextGroupItem(this.groupList, this.focusedIndex, this.cdr, () => this.scrollFocusedItemIntoView());\n  }\n  private focusPreviousItem(): void {\n    this.focusedIndex = focusPreviousGroupItem(this.groupList, this.focusedIndex, this.cdr, () => this.scrollFocusedItemIntoView());\n  }\n\n  handleItemFocus(index: number): void { this.focusedIndex = index; this.cdr.markForCheck(); }\n\n  private selectFocusedItem(): void {\n    if (this.focusedIndex >= 0 && this.focusedIndex < this.groupList.length) {\n      const group = this.groupList[this.focusedIndex];\n      if (this.selectionMode !== SelectionMode.none) { this.handleSelectionChange(group); } else { this.handleGroupClick(group); }\n    }\n  }\n\n  private handleEscapeKey(): void {\n    if (this.searchText) { this.searchText = ''; this.searchSubject$.next(''); this.cdr.markForCheck(); return; }\n    if (this.selectionMode !== SelectionMode.none && this.selectedGroups.size > 0) this.clearSelection();\n    this.focusedIndex = -1; (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck();\n  }\n\n  private scrollFocusedItemIntoView(): void {\n    if (!this.initialLoadComplete) return;\n    scrollGroupItemIntoView(this.listContainer?.nativeElement, this.focusedIndex, this.pendingTimers);\n  }\n\n  getTabIndex(index: number): number {\n    if (this.focusedIndex === index) return 0;\n    if (this.focusedIndex === -1 && index === 0) return 0;\n    return -1;\n  }\n\n  handleFocusIn(event: FocusEvent, index: number): void {\n    if (this.focusedIndex !== index) { this.focusedIndex = index; this.cdr.markForCheck(); }\n  }\n\n  handleMouseDown(event: MouseEvent): void { event.preventDefault(); }\n\n  handleContainerClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement;\n    const isOnItem = target.closest('.cometchat-group-item') !== null;\n    const isOnSelectionControl = target.closest('cometchat-checkbox') !== null || target.closest('cometchat-radio-button') !== null;\n    const isOnSearchBar = target.closest('cometchat-search-bar') !== null;\n    if (!isOnItem && !isOnSelectionControl && !isOnSearchBar) { this.focusedIndex = -1; (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck(); }\n  }\n\n  handleFocusInEvent(event: FocusEvent): void {\n    const target = event.target as HTMLElement;\n    if (!target) return;\n    const groupItemDiv = target.classList.contains('cometchat-group-item') ? target : target.closest('.cometchat-group-item');\n    if (!groupItemDiv) return;\n    const wrapper = groupItemDiv.closest('.cometchat-groups__list-item-wrapper');\n    if (!wrapper) return;\n    const paginatedListItem = wrapper.closest('.cometchat-paginated-list__item');\n    if (!paginatedListItem) return;\n    const itemsContainer = paginatedListItem.parentElement;\n    if (!itemsContainer || !itemsContainer.classList.contains('cometchat-paginated-list__items')) return;\n    const index = Array.from(itemsContainer.children).indexOf(paginatedListItem);\n    if (index !== -1 && this.focusedIndex !== index) { this.focusedIndex = index; this.cdr.markForCheck(); }\n  }\n\n  handleRetryClick(): void {\n    this.lastError = null; this.fetchState = States.loading; this.cdr.markForCheck();\n    this.initializeGroupsManager(); this.fetchNextAndAppendGroups();\n  }\n}\n","<!--\n  CometChatGroups Component Template\n\n  This template provides the structure for displaying a list of groups with:\n  - Header section with title and optional search bar\n  - Group list with type indicators\n  - Loading, empty, and error states\n  - Context menu integration\n  - Full accessibility support\n\n  @see Requirements 8.1, 8.2, 9.1, 12.1, 14.2, 15.1, 16.1-16.6, 17.1-17.4, 18.1-18.8, 19.1-19.11\n-->\n\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'Groups'\">\n<div\n  class=\"cometchat cometchat-groups\"\n  [class.cometchat-groups-hide-scrollbar]=\"!effectiveShowScrollbar()\"\n  role=\"region\"\n  [attr.aria-label]=\"'group_title' | translate\"\n  (focusin)=\"handleFocusInEvent($event)\"\n  (click)=\"handleContainerClick($event)\"\n>\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-groups__header\">\n    <!-- Custom Header View -->\n    @if (headerView) {\n      <ng-container *ngTemplateOutlet=\"headerView\"></ng-container>\n    } @else {\n      <!-- Default Header -->\n      <div class=\"cometchat-groups__header-default\">\n        <h2 class=\"cometchat-groups__header-title\">\n          {{ 'group_title' | translate }}\n        </h2>\n        @if (menuView) {\n          <ng-container *ngTemplateOutlet=\"menuView\"></ng-container>\n        }\n      </div>\n    }\n        @if (!hideSearch) {\n        <div class=\"cometchat-groups__search-bar\">\n          <cometchat-search-bar\n            [searchText]=\"searchText\"\n            [placeholderText]=\"'group_search_placeholder' | translate\"\n            [ariaLabel]=\"'group_search_placeholder' | translate\"\n            (searchChanged)=\"onSearch($event.value)\"\n            (clearClick)=\"onSearch('')\">\n          </cometchat-search-bar>\n        </div>\n      \n    }\n  </div>\n\n  <!-- ==================== List Body using CometChatPaginatedList ==================== -->\n  <cometchat-paginated-list\n    #paginatedList\n    #listContainer\n    [items]=\"groupList\"\n    [trackByFn]=\"trackByGroup.bind(this)\"\n    [isLoading]=\"fetchState === States.loading\"\n    [hasMore]=\"hasMore()\"\n    [error]=\"lastError\"\n    [showScrollbar]=\"effectiveShowScrollbar()\"\n    [loadingTemplate]=\"loadingTemplateRef\"\n    [emptyTemplate]=\"emptyTemplateRef\"\n    [errorTemplate]=\"errorTemplateRef\"\n    [itemTemplate]=\"itemTemplateRef\"\n    (loadMore)=\"handleLoadMore()\"\n    role=\"listbox\"\n    [attr.aria-label]=\"'accessibility_groups_list' | translate\"\n    [attr.aria-busy]=\"fetchState === States.loading\"\n    aria-live=\"polite\">\n  </cometchat-paginated-list>\n\n  <!-- ==================== Loading Template ==================== -->\n  <ng-template #loadingTemplateRef>\n    @if (effectiveLoadingView) {\n      <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-groups__shimmer\" aria-hidden=\"true\">\n        @for (item of shimmerList; track item) {\n          <div class=\"cometchat-groups__shimmer-item\">\n            <div class=\"cometchat-groups__shimmer-item-avatar\"></div>\n            <div class=\"cometchat-groups__shimmer-item-body\">\n              <div class=\"cometchat-groups__shimmer-item-body-title\"></div>\n              <div class=\"cometchat-groups__shimmer-item-body-subtitle\"></div>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Empty Template ==================== -->\n  <ng-template #emptyTemplateRef>\n    @if (effectiveEmptyView) {\n      <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n    } @else {\n      <div\n        class=\"cometchat-groups__empty-state-view\"\n        role=\"status\"\n        [attr.aria-label]=\"'group_empty_title' | translate\"\n      >\n        <div class=\"cometchat-groups__empty-state-view-icon\">\n          <span class=\"cometchat-groups__empty-state-view-icon-mask\" aria-hidden=\"true\"></span>\n        </div>\n        <h3 class=\"cometchat-groups__empty-state-view-title\">\n          {{ 'group_empty_title' | translate }}\n        </h3>\n        <p class=\"cometchat-groups__empty-state-view-subtitle\">\n          {{ 'group_empty_subtitle' | translate }}\n        </p>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Error Template ==================== -->\n  <ng-template #errorTemplateRef let-error>\n    @if (!hideError) {\n      @if (effectiveErrorView) {\n        <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n      } @else {\n        <div\n          class=\"cometchat-groups__error-state-view\"\n          role=\"alert\"\n        >\n          <div class=\"cometchat-groups__error-state-view-icon\">\n            <span class=\"cometchat-groups__error-state-view-icon-mask\" aria-hidden=\"true\"></span>\n          </div>\n          <h3 class=\"cometchat-groups__error-state-view-title\">\n            {{ 'group_error_title' | translate }}\n          </h3>\n          <p class=\"cometchat-groups__error-state-view-subtitle\">\n            {{ 'group_error_subtitle' | translate }}\n          </p>\n          <button\n            class=\"cometchat-groups__error-state-view-retry-button\"\n            (click)=\"handleRetryClick()\"\n            type=\"button\">\n            {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      }\n    }\n  </ng-template>\n\n  <!-- ==================== Item Template ==================== -->\n  <ng-template #itemTemplateRef let-group let-index=\"index\">\n    <!-- Group Item -->\n    <div\n      class=\"cometchat-groups__list-item-wrapper\"\n      [attr.data-index]=\"index\"\n      [class.cometchat-groups__list-item--active]=\"isGroupActive(group)\"\n      [class.cometchat-groups__list-item--selected]=\"isGroupSelected(group)\"\n      [class.cometchat-groups__list-item--public]=\"group.getType() === 'public'\"\n      [class.cometchat-groups__list-item--private]=\"group.getType() === 'private'\"\n      [class.cometchat-groups__list-item--password]=\"group.getType() === 'password'\"\n      role=\"presentation\"\n      [attr.aria-label]=\"getGroupAriaLabel(group)\"\n      [attr.aria-selected]=\"selectionMode !== SelectionMode.none ? isGroupSelected(group) : null\"\n      (mousedown)=\"handleMouseDown($event)\"\n      (click)=\"selectionMode !== SelectionMode.none ? handleSelectionChange(group, $event) : undefined\"\n    >\n      <!-- Custom Item View -->\n      @if (effectiveItemView) {\n        <ng-container *ngTemplateOutlet=\"effectiveItemView; context: { $implicit: group }\"></ng-container>\n      } @else {\n        <!-- Default Item View using CometChatGroupItem -->\n        <cometchat-group-item\n          [group]=\"group\"\n          [isActive]=\"isGroupActive(group)\"\n          [isSelected]=\"isGroupSelected(group)\"\n          [isFocused]=\"focusedIndex === index\"\n          [tabIndex]=\"focusedIndex === -1 ? (index === 0 ? 0 : -1) : (focusedIndex === index ? 0 : -1)\"\n          [hideGroupType]=\"effectiveHideGroupType()\"\n          [disableDefaultContextMenu]=\"disableDefaultContextMenu\"\n          [contextMenuOptions]=\"selectionMode !== SelectionMode.none ? [] : getOptionsForGroup(group)\"\n          [leadingView]=\"effectiveLeadingView\"\n          [titleView]=\"effectiveTitleView\"\n          [subtitleView]=\"effectiveSubtitleView\"\n          [trailingView]=\"selectionMode !== SelectionMode.none ? selectionControlTemplate : effectiveTrailingView\"\n          (itemFocus)=\"handleItemFocus(index)\"\n          (itemClick)=\"handleGroupClick($event)\"\n          (contextMenuOptionClick)=\"handleOptionClick($event.option, $event.group)\">\n        </cometchat-group-item>\n      }\n    </div>\n  </ng-template>\n\n  <!-- ==================== Selection Control Template (for trailing view) ==================== -->\n  <ng-template #selectionControlTemplate let-group>\n    <div class=\"cometchat-groups__selection-control\" \n         (click)=\"$event.stopPropagation()\">\n      @if (selectionMode === SelectionMode.multiple) {\n        <cometchat-checkbox\n          [checked]=\"isGroupSelected(group)\"\n          [ariaLabel]=\"'Select ' + group.getName()\"\n          (checkboxChanged)=\"handleSelectionChange(group)\">\n        </cometchat-checkbox>\n      } @else if (selectionMode === SelectionMode.single) {\n        <cometchat-radio-button\n          [checked]=\"isGroupSelected(group)\"\n          [ariaLabel]=\"'Select ' + group.getName()\"\n          (radioChanged)=\"handleSelectionChange(group)\">\n        </cometchat-radio-button>\n      }\n    </div>\n  </ng-template>\n</div>\n</cometchat-error-boundary>\n","/**\n * CometChatGroups Component Public API\n *\n * This module exports the CometChatGroupsComponent for displaying\n * and managing group lists.\n *\n * @module components/cometchat-groups\n */\n\n// Component export\nexport { CometChatGroupsComponent } from './cometchat-groups.component';\n\n// Re-export commonly used types for convenience\nexport { SelectionMode, States } from '../../Enums/Enums';\nexport { CometChatOption } from '../../modals/CometChatOption';\n","/**\n * CometChatGroupMemberItem Component\n *\n * A standalone component for rendering a single group member item.\n * Follows the same pattern as CometChatUserItem and CometChatGroupItem.\n *\n * Features:\n * - State management (active, selected, focused)\n * - Member avatar with online/offline status indicator\n * - Role badge (owner, admin, moderator)\n * - Custom template support for all sections\n * - Context menu integration (kick, ban, change scope)\n * - Full keyboard accessibility with ARIA support\n *\n * @module components/cometchat-group-member-item\n * @see Requirements 10.1-10.6\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ViewChild,\n  inject,\n  computed,\n  booleanAttribute,\n  signal, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatContextMenuComponent } from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { Placement } from '../../Enums/Enums';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\n\n/**\n * CometChatGroupMemberItem is a standalone Angular component that renders\n * a single group member item with support for:\n * - State management (active, selected, focused)\n * - Member avatar with online/offline status indicator\n * - Role badge (owner, admin, moderator)\n * - Custom templates for leading, title, subtitle, and trailing sections\n * - Context menu integration (kick, ban, change scope)\n * - Full keyboard accessibility with ARIA support\n *\n * @example\n * ```html\n * <cometchat-group-member-item\n *   [member]=\"member\"\n *   [isActive]=\"isActive\"\n *   [isSelected]=\"isSelected\"\n *   (itemClick)=\"onItemClick($event)\">\n * </cometchat-group-member-item>\n * ```\n * @see Requirements 10.1-10.6\n */\n@Component({\n  selector: 'cometchat-group-member-item',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatAvatarComponent, CometChatContextMenuComponent],\n  templateUrl: './cometchat-group-member-item.component.html',\n  styleUrls: ['./cometchat-group-member-item.component.css'],\n})\nexport class CometChatGroupMemberItemComponent {\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  @Input({ required: true }) member!: CometChat.GroupMember;\n  @Input() isActive = false;\n  @Input() isSelected = false;\n  @Input() isFocused = false;\n  @Input() tabIndex = -1;\n\n  private hideUserStatusExplicitlySet = signal(false);\n  private disableDefaultContextMenuExplicitlySet = signal(false);\n  private _hideUserStatus = signal(false);\n  private _disableDefaultContextMenu = signal(true);\n\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n\n  @Input({ transform: booleanAttribute })\n  set disableDefaultContextMenu(value: boolean) { this._disableDefaultContextMenu.set(value); this.disableDefaultContextMenuExplicitlySet.set(true); }\n  get disableDefaultContextMenu(): boolean { return this._disableDefaultContextMenu(); }\n\n  effectiveHideUserStatus = computed(() => {\n    if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus();\n    if (this.globalConfig?.hideUserStatus !== undefined) return this.globalConfig.hideUserStatus;\n    return false;\n  });\n\n  effectiveDisableDefaultContextMenu = computed(() => {\n    if (this.disableDefaultContextMenuExplicitlySet()) return this._disableDefaultContextMenu();\n    if (this.globalConfig?.disableDefaultContextMenu !== undefined) return this.globalConfig.disableDefaultContextMenu;\n    return true;\n  });\n\n  @Input() contextMenuOptions?: CometChatOption[];\n  @ViewChild(CometChatContextMenuComponent) contextMenuRef?: CometChatContextMenuComponent;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n\n  @Output() itemClick = new EventEmitter<CometChat.GroupMember>();\n  @Output() itemFocus = new EventEmitter<void>();\n  @Output() contextMenuOptionClick = new EventEmitter<{ option: CometChatOption; member: CometChat.GroupMember; }>();\n\n  readonly Placement = Placement;\n\n  get avatarImage(): string { return this.member?.getAvatar() || ''; }\n  get avatarName(): string { return this.member?.getName() || ''; }\n  get memberStatus(): string { return this.member?.getStatus() || 'offline'; }\n  get memberScope(): string { return this.member?.getScope() || 'participant'; }\n  get scopeLabel(): string { return CometChatLocalize.getLocalizedString(`member_scope_${this.memberScope}`); }\n\n  get accessibleLabel(): string {\n    const parts: string[] = [this.avatarName];\n    const scope = this.memberScope;\n    if (scope === 'admin') parts.push(CometChatLocalize.getLocalizedString('accessibility_member_scope_admin'));\n    else if (scope === 'moderator') parts.push(CometChatLocalize.getLocalizedString('accessibility_member_scope_moderator'));\n    else if (scope === 'owner') parts.push(this.scopeLabel);\n    if (!this.effectiveHideUserStatus()) {\n      parts.push(CometChatLocalize.getLocalizedString(this.memberStatus === 'online' ? 'accessibility_status_online' : 'accessibility_status_offline'));\n    }\n    return parts.join(', ');\n  }\n\n  handleMouseDown(event: MouseEvent): void {\n    // Prevent focus-steal from the list item on click, but only when the click\n    // is NOT on the context menu — blocking mousedown on the context menu\n    // prevents the subsequent click event from firing on menu options (ENG-35744).\n    const target = event.target as HTMLElement | null;\n    if (!target?.closest('cometchat-context-menu')) {\n      event.preventDefault();\n    }\n  }\n  handleClick(event?: MouseEvent): void {\n    // Don't emit itemClick when the user clicked on the context menu dropdown\n    // — that would trigger navigation/selection and cause the menu to close.\n    if (event) {\n      const target = event.target as HTMLElement | null;\n      if (target?.closest('cometchat-context-menu') || target?.closest('.cometchat-group-member-item__context-menu')) {\n        return;\n      }\n    }\n    this.itemClick.emit(this.member);\n  }\n  onItemFocus(): void { this.itemFocus.emit(); }\n\n  onKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); this.handleClick(); }\n    if ((event.key === 'F10' && event.shiftKey) || event.key === 'ContextMenu') { event.preventDefault(); this.handleContextMenuOpen(); }\n  }\n\n  handleContextMenuOpen(): void {\n    if (this.contextMenuRef && !this.contextMenuRef.showSubMenu) {\n      this.contextMenuRef.handleMenuClick();\n    }\n  }\n\n  handleContextMenu(event: MouseEvent): void {\n    if (!this.effectiveDisableDefaultContextMenu()) return;\n    event.preventDefault();\n    if (this.contextMenuRef?.data?.length) {\n      this.handleContextMenuOpen();\n    }\n  }\n\n  handleContextMenuOptionClick(option: CometChatOption): void { this.contextMenuOptionClick.emit({ option, member: this.member }); }\n}\n","<!--\n  CometChatGroupMemberItem Template\n  \n  A standalone component for rendering a single group member item with:\n  - State management (active, selected, focused)\n  - Member avatar with online/offline status indicator\n  - Role badge (owner, admin, moderator)\n  - Context menu integration\n  - Full keyboard accessibility with ARIA support\n  \n  @see Requirements 10.1-10.6\n-->\n\n<div class=\"cometchat-group-member-item\"\n     [class.cometchat-group-member-item--active]=\"isActive\"\n     [class.cometchat-group-member-item--selected]=\"isSelected\"\n     [class.cometchat-group-member-item--focused]=\"isFocused\"\n     role=\"option\"\n     [attr.tabindex]=\"tabIndex\"\n     [attr.aria-selected]=\"isSelected\"\n     [attr.aria-label]=\"accessibleLabel\"\n     (click)=\"handleClick($event)\"\n     (keydown)=\"onKeyDown($event)\"\n     (mousedown)=\"handleMouseDown($event)\"\n     (focus)=\"onItemFocus()\"\n     (contextmenu)=\"handleContextMenu($event)\">\n  \n  <!-- Leading Section: Avatar and Status Indicator (aria-hidden since info is in aria-label) -->\n  @if (leadingView) {\n    <ng-container *ngTemplateOutlet=\"leadingView; context: { $implicit: member }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-group-member-item__leading\" aria-hidden=\"true\">\n      <cometchat-avatar \n        [image]=\"avatarImage\" \n        [name]=\"avatarName\"\n        class=\"cometchat-group-member-item__avatar\">\n      </cometchat-avatar>\n      \n      <!-- Status indicator (aria-hidden since status is in aria-label) -->\n      @if (!effectiveHideUserStatus() && memberStatus === 'online') {\n        <div class=\"cometchat-group-member-item__status\"\n             [class.cometchat-group-member-item__status--online]=\"memberStatus === 'online'\"\n             aria-hidden=\"true\">\n        </div>\n      }\n    </div>\n  }\n  \n  <!-- Body Section: Title and Subtitle -->\n  <div class=\"cometchat-group-member-item__body\">\n    @if (titleView) {\n      <ng-container *ngTemplateOutlet=\"titleView; context: { $implicit: member }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-group-member-item__title\">\n        <span class=\"cometchat-group-member-item__title-text\">\n          {{ avatarName }}\n        </span>\n      </div>\n    }\n    \n    @if (subtitleView) {\n      <ng-container *ngTemplateOutlet=\"subtitleView; context: { $implicit: member }\"></ng-container>\n    }\n  </div>\n  \n  <!-- Trailing Section: Role Badge and Context Menu -->\n  @if (trailingView) {\n    <ng-container *ngTemplateOutlet=\"trailingView; context: { $implicit: member }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-group-member-item__trailing\">\n      <!-- Role Badge (hidden for participants, aria-hidden since scope is in aria-label) -->\n      @if (memberScope !== 'participant') {\n        <span class=\"cometchat-group-member-item__role-badge\"\n              [class.cometchat-group-member-item__role-badge--owner]=\"memberScope === 'owner'\"\n              [class.cometchat-group-member-item__role-badge--admin]=\"memberScope === 'admin'\"\n              [class.cometchat-group-member-item__role-badge--moderator]=\"memberScope === 'moderator'\"\n              aria-hidden=\"true\">\n          {{ scopeLabel }}\n        </span>\n      }\n      \n      <!-- Context Menu -->\n      @if (contextMenuOptions && contextMenuOptions.length > 0) {\n        <div class=\"cometchat-group-member-item__context-menu\">\n          <cometchat-context-menu\n            [data]=\"contextMenuOptions\"\n            [placement]=\"Placement.bottom\"\n            [topMenuSize]=\"1\"\n            [closeOnOutsideClick]=\"true\"\n            (optionClick)=\"handleContextMenuOptionClick($any($event))\"\n            class=\"cometchat-group-member-item__menu\">\n          </cometchat-context-menu>\n        </div>\n      }\n    </div>\n  }\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  HostListener,\n  ElementRef,\n  AfterViewInit,\n  inject, OnDestroy, ChangeDetectionStrategy} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatRadioButtonComponent } from '../cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatButtonComponent } from '../cometchat-button/cometchat-button.component';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\n\n/**\n * CometChatChangeScope component provides a dialog for changing group member roles/scopes.\n * It displays an icon, title, description, radio button list, and action buttons.\n *\n * Accessibility Features:\n * - Full keyboard navigation support (Tab, Shift+Tab, Arrow keys, Enter, Space, Escape)\n * - ARIA attributes for screen reader support\n * - Visible focus indicators\n * - Focus management (auto-focus first radio button)\n *\n * @example\n * ```html\n * <cometchat-change-scope\n *   [title]=\"'Change Member Role'\"\n *   [buttonText]=\"'Confirm'\"\n *   [options]=\"['admin', 'moderator', 'participant']\"\n *   [defaultSelection]=\"'participant'\"\n *   (scopeChanged)=\"onScopeChange($event)\"\n *   (closeClick)=\"onClose()\">\n * </cometchat-change-scope>\n * ```\n */\n@Component({\n  selector: 'cometchat-change-scope',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, CometChatRadioButtonComponent, CometChatButtonComponent, TranslatePipe],\n  templateUrl: './cometchat-change-scope.component.html',\n  styleUrls: ['./cometchat-change-scope.component.css'],\n})\nexport class CometChatChangeScopeComponent implements OnInit, AfterViewInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  constructor(private elementRef: ElementRef) {}\n\n  // Inject LiveAnnouncerService for accessibility announcements\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  /** Title of the change scope dialog */\n  @Input() title = '';\n\n  /** Text for the confirm button */\n  @Input() buttonText = '';\n\n  /** List of available scope options */\n  @Input() options: string[] = [];\n\n  /** Default selected scope */\n  @Input() defaultSelection = '';\n\n  /** Emitted when scope is changed - parent should handle async operation */\n  @Output() scopeChanged = new EventEmitter<string>();\n\n  /** Emitted when close/cancel button is clicked */\n  @Output() closeClick = new EventEmitter<void>();\n\n  // Internal state\n  selectedValue = '';\n  isLoading = false;\n  isError = false;\n\n  ngOnInit(): void {\n    if (!this.title) {\n      this.title = CometChatLocalize.getLocalizedString('change_scope_title');\n    }\n    if (!this.buttonText) {\n      this.buttonText = CometChatLocalize.getLocalizedString('change_scope_confirm_yes');\n    }\n    this.selectedValue = this.defaultSelection;\n  }\n\n  ngAfterViewInit(): void {\n    // Auto-focus the first radio button for keyboard accessibility\n    this.focusFirstRadioButton();\n  }\n\n  /**\n   * Handle Escape key to close dialog\n   */\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.onCancelClick();\n    }\n  }\n\n  /**\n   * Focus the first radio button in the list\n   */\n  private focusFirstRadioButton(): void {\n    this.pendingTimers.push(setTimeout(() => {\n      const firstRadio = this.elementRef.nativeElement.querySelector(\n        'cometchat-radio-button input[type=\"radio\"]'\n      );\n      if (firstRadio) {\n        firstRadio.focus();\n      }\n    }, 0));\n  }\n\n  /**\n   * Handle radio button selection change\n   */\n  onSelectionChanged(event: { checked: boolean; id: string }): void {\n    if (event.checked) {\n      this.selectedValue = event.id;\n    }\n  }\n\n  /**\n   * Handle scope change button click\n   */\n  async onScopeChangeClick(): Promise<void> {\n    this.isError = false;\n    this.isLoading = true;\n\n    try {\n      this.scopeChanged.emit(this.selectedValue);\n      // Announce scope change for screen readers\n      this.liveAnnouncer.announce(\n        CometChatLocalize.getLocalizedString('accessibility_scope_changed').replace(\n          '{scope}',\n          this.selectedValue\n        ),\n        'polite'\n      );\n    } catch (error) {\n      this.setError();\n    }\n  }\n\n  /**\n   * Set success state (called by parent after successful operation)\n   */\n  setSuccess(): void {\n    this.isLoading = false;\n    this.isError = false;\n  }\n\n  /**\n   * Set error state (called by parent after failed operation)\n   */\n  setError(): void {\n    this.isError = true;\n    this.isLoading = false;\n  }\n\n  /**\n   * Handle cancel button click\n   */\n  onCancelClick(): void {\n    this.closeClick.emit();\n  }\n\n  /**\n   * Check if submit button should be disabled\n   */\n  get isSubmitDisabled(): boolean {\n    return this.defaultSelection === this.selectedValue || this.isLoading;\n  }\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n  }\n\n}\n","<div class=\"cometchat-change-scope\" role=\"dialog\" aria-modal=\"true\" [attr.aria-labelledby]=\"'change-scope-title'\">\n  <!-- Icon -->\n  <div class=\"cometchat-change-scope__icon-container\">\n    <div class=\"cometchat-change-scope__icon\"></div>\n  </div>\n\n  <!-- Text -->\n  <div class=\"cometchat-change-scope__text\">\n    <div class=\"cometchat-change-scope__title\" id=\"change-scope-title\">\n      {{ title }}\n    </div>\n    <div class=\"cometchat-change-scope__description\">\n      {{ 'change_scope_subtitle' | translate }}\n    </div>\n  </div>\n\n  <!-- Scope Options List -->\n  <div class=\"cometchat-change-scope__list\" role=\"radiogroup\" [attr.aria-label]=\"title\">\n    @for (option of options; track option) {\n      <div class=\"cometchat-change-scope__list-item\">\n        <div class=\"cometchat-change-scope__list-item-label\">\n          {{ 'member_scope_' + option.toLowerCase() | translate }}\n        </div>\n        <cometchat-radio-button\n          [id]=\"option\"\n          [name]=\"'scope'\"\n          [value]=\"option\"\n          [ariaLabel]=\"'member_scope_' + option.toLowerCase() | translate\"\n          [checked]=\"selectedValue === option\"\n          [disabled]=\"isLoading\"\n          (radioChanged)=\"onSelectionChanged($event)\">\n        </cometchat-radio-button>\n      </div>\n    }\n  </div>\n\n  <!-- Error Message -->\n  @if (isError) {\n    <div class=\"cometchat-change-scope__error-view\" role=\"alert\">\n      {{ 'change_scope_error' | translate }}\n    </div>\n  }\n\n  <!-- Actions -->\n  <div class=\"cometchat-change-scope__button-container\">\n    <div class=\"cometchat-change-scope__cancel-button\">\n      <cometchat-button\n        [text]=\"'change_scope_confirm_no' | translate\"\n        [ariaLabel]=\"'change_scope_confirm_no' | translate\"\n        [disabled]=\"isLoading\"\n        (buttonClick)=\"onCancelClick()\">\n      </cometchat-button>\n    </div>\n    <div class=\"cometchat-change-scope__submit-button\" [class.cometchat-change-scope__submit-button-disabled]=\"isSubmitDisabled\">\n      <cometchat-button\n        [text]=\"buttonText\"\n        [ariaLabel]=\"buttonText\"\n        [disabled]=\"isSubmitDisabled\"\n        [isLoading]=\"isLoading\"\n        (buttonClick)=\"onScopeChangeClick()\">\n      </cometchat-button>\n    </div>\n  </div>\n</div>\n","/**\n * Utility helpers for CometChatGroupMembers component.\n *\n * Pure functions that operate on component state passed as parameters,\n * keeping the component class lean while centralising reusable logic.\n */\n\nimport { ChangeDetectorRef, WritableSignal } from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { SelectionMode } from '../../Enums/Enums';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { EventEmitter } from '@angular/core';\n\n/**\n * Emits a SelectionState event reflecting the current member selection.\n */\nexport function emitMemberSelectionChange(\n  selectionMode: SelectionMode,\n  selectedMembers: Set<string>,\n  lastSelectedId: string | null,\n  selectionChange: EventEmitter<SelectionState>\n): void {\n  selectionChange.emit({\n    mode: selectionMode,\n    selectedIds: new Set(selectedMembers),\n    lastSelectedId,\n  });\n}\n\n/**\n * Performs shift-click range selection/deselection for group members.\n *\n * @param memberList - Full list of members\n * @param startIndex - Anchor index\n * @param endIndex - Currently clicked index\n * @param selectedMembers - Mutable set of selected UIDs (modified in place)\n * @param selectionChange - EventEmitter for bulk selection-change events\n * @param selectionMode - Current selection mode\n * @returns The new lastSelectedIndex value (endIndex)\n */\nexport function selectMemberRange(\n  memberList: CometChat.GroupMember[],\n  startIndex: number,\n  endIndex: number,\n  selectedMembers: Set<string>,\n  selectionChange: EventEmitter<SelectionState>,\n  selectionMode: SelectionMode\n): number {\n  const minIndex = Math.min(startIndex, endIndex);\n  const maxIndex = Math.max(startIndex, endIndex);\n\n  const clickedMember = memberList[endIndex];\n  const clickedId = clickedMember.getUid();\n  const shouldDeselect = selectedMembers.has(clickedId);\n\n  for (let i = minIndex; i <= maxIndex; i++) {\n    const uid = memberList[i].getUid();\n    if (shouldDeselect) {\n      selectedMembers.delete(uid);\n    } else {\n      selectedMembers.add(uid);\n    }\n  }\n\n  emitMemberSelectionChange(selectionMode, selectedMembers, clickedId, selectionChange);\n  return endIndex;\n}\n\n/**\n * Moves focus to the next member item, wrapping at the end.\n *\n * @param memberCount - Total number of members\n * @param focusedIndex - WritableSignal for the focused index\n * @param cdr - ChangeDetectorRef\n * @param scrollFocusedItemIntoView - Callback to scroll into view\n */\nexport function focusNextMemberItem(\n  memberCount: number,\n  focusedIndex: WritableSignal<number>,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): void {\n  if (memberCount === 0) return;\n  const current = focusedIndex();\n  focusedIndex.set(current === -1 || current >= memberCount - 1 ? 0 : current + 1);\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n}\n\n/**\n * Moves focus to the previous member item, wrapping at the start.\n *\n * @param memberCount - Total number of members\n * @param focusedIndex - WritableSignal for the focused index\n * @param cdr - ChangeDetectorRef\n * @param scrollFocusedItemIntoView - Callback to scroll into view\n */\nexport function focusPreviousMemberItem(\n  memberCount: number,\n  focusedIndex: WritableSignal<number>,\n  cdr: ChangeDetectorRef,\n  scrollFocusedItemIntoView: () => void\n): void {\n  if (memberCount === 0) return;\n  const current = focusedIndex();\n  focusedIndex.set(current <= 0 ? memberCount - 1 : current - 1);\n  cdr.markForCheck();\n  scrollFocusedItemIntoView();\n}\n\n/**\n * Scrolls the focused member item into view.\n *\n * @param listContainer - The native list container element\n * @param focusedIndex - Current focused index\n * @param pendingTimers - Array to push the timer reference into for cleanup\n */\nexport function scrollMemberItemIntoView(\n  listContainer: HTMLElement | undefined,\n  focusedIndex: number,\n  pendingTimers: ReturnType<typeof setTimeout>[]\n): void {\n  pendingTimers.push(\n    setTimeout(() => {\n      if (!listContainer) return;\n      const focusedElement = listContainer.querySelector(`[data-index=\"${focusedIndex}\"]`);\n      if (focusedElement) {\n        focusedElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });\n      }\n    }, 0)\n  );\n}\n","import {\n  Component, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef,\n  ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy,\n  inject, HostListener, signal, computed, DestroyRef, booleanAttribute,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CommonModule } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged } from 'rxjs/operators';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatGroupEvents, IGroupMemberKickedBanned, IGroupMemberScopeChanged, IGroupMemberAdded } from '../../events/CometChatGroupEvents';\nimport { CometChatPaginatedListComponent } from '../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { CometChatGroupMemberItemComponent } from '../cometchat-group-member-item/cometchat-group-member-item.component';\nimport { CometChatChangeScopeComponent } from '../base-elements/cometchat-change-scope/cometchat-change-scope.component';\nimport { CometChatCheckboxComponent } from '../base-elements/cometchat-checkbox/cometchat-checkbox.component';\nimport { CometChatRadioButtonComponent } from '../base-elements/cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatSearchBarComponent } from '../base-elements/cometchat-search-bar/cometchat-search-bar.component';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { SelectionMode, States } from '../../Enums/Enums';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatOption } from '../../modals/CometChatOption';\nimport { SelectionState } from '../../modals/SelectionState';\nimport { GroupMembersService } from '../../services/group-members.service';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { GroupMemberUtils } from '../../utils/GroupMemberUtils';\nimport { emitMemberSelectionChange, selectMemberRange, focusNextMemberItem, focusPreviousMemberItem, scrollMemberItemIntoView } from './cometchat-group-members.utils';\nimport { CometChatUIKitConstants } from '../../constants';\n\n@Component({\n  selector: 'cometchat-group-members',\n  standalone: true,\n  imports: [CommonModule, CometChatPaginatedListComponent, CometChatGroupMemberItemComponent, CometChatChangeScopeComponent, CometChatCheckboxComponent, CometChatRadioButtonComponent, CometChatSearchBarComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  providers: [GroupMembersService],\n  templateUrl: './cometchat-group-members.component.html',\n  styleUrls: ['./cometchat-group-members.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatGroupMembersComponent implements OnInit, OnDestroy {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n  private cdr = inject(ChangeDetectorRef);\n  private destroyRef = inject(DestroyRef);\n  protected groupMembersService = inject(GroupMembersService);\n  private templatesService = inject(CometChatTemplatesService);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n  @ViewChild('paginatedList') paginatedList?: CometChatPaginatedListComponent<CometChat.GroupMember>;\n  @ViewChild('listContainer') listContainer?: ElementRef<HTMLElement>;\n  @ViewChild('changeScopeRef') changeScopeRef?: CometChatChangeScopeComponent;\n\n  private showScrollbarExplicitlySet = signal(false);\n  private hideErrorExplicitlySet = signal(false);\n  private hideUserStatusExplicitlySet = signal(false);\n  private _showScrollbar = signal(false);\n  private _hideError = signal(false);\n  private _hideUserStatus = signal(false);\n\n  @Input() group!: CometChat.Group;\n\n  @Input({ transform: booleanAttribute }) hideSearch = false;\n  @Input({ transform: booleanAttribute })\n  set hideError(value: boolean) { this._hideError.set(value); this.hideErrorExplicitlySet.set(true); }\n  get hideError(): boolean { return this._hideError(); }\n  @Input({ transform: booleanAttribute })\n  set hideUserStatus(value: boolean) { this._hideUserStatus.set(value); this.hideUserStatusExplicitlySet.set(true); }\n  get hideUserStatus(): boolean { return this._hideUserStatus(); }\n  @Input({ transform: booleanAttribute }) hideKickMemberOption = false;\n  @Input({ transform: booleanAttribute }) hideBanMemberOption = false;\n  @Input({ transform: booleanAttribute }) hideScopeChangeOption = false;\n  @Input({ transform: booleanAttribute }) disableLoadingState = false;\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) { this._showScrollbar.set(value); this.showScrollbarExplicitlySet.set(true); }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n  @Input({ transform: booleanAttribute }) disableDefaultContextMenu = true;\n\n  effectiveShowScrollbar = computed(() => {\n    if (this.showScrollbarExplicitlySet()) return this._showScrollbar();\n    return this.globalConfig?.showScrollbar ?? false;\n  });\n  effectiveHideError = computed(() => {\n    if (this.hideErrorExplicitlySet()) return this._hideError();\n    return this.globalConfig?.hideError ?? false;\n  });\n  effectiveHideUserStatus = computed(() => {\n    if (this.hideUserStatusExplicitlySet()) return this._hideUserStatus();\n    return this.globalConfig?.hideUserStatus ?? false;\n  });\n\n  @Input() selectionMode: SelectionMode = SelectionMode.none;\n  @Input() groupMemberRequestBuilder?: CometChat.GroupMembersRequestBuilder;\n  @Input() searchRequestBuilder?: CometChat.GroupMembersRequestBuilder;\n  @Input() searchKeyword = '';\n  @Input() options?: (group: CometChat.Group, member: CometChat.GroupMember) => CometChatOption[];\n  @Input() headerView?: TemplateRef<void>;\n  @Input() menuView?: TemplateRef<any>;\n  @Input() loadingView?: TemplateRef<void>;\n  @Input() errorView?: TemplateRef<void>;\n  @Input() emptyView?: TemplateRef<void>;\n  @Input() itemView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.GroupMember }>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null;\n  @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null;\n  @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n\n  private get _gmt() { return this.templatesService.getGroupMemberTemplates(); }\n  get effectiveItemView(): TemplateRef<any> | undefined { return this.listItemTemplate || this.itemView || this._gmt.itemView; }\n  get effectiveLeadingView(): TemplateRef<any> | undefined { return this.leadingView || this._gmt.leadingView; }\n  get effectiveTitleView(): TemplateRef<any> | undefined { return this.titleView || this._gmt.titleView; }\n  get effectiveSubtitleView(): TemplateRef<any> | undefined { return this.subtitleView || this._gmt.subtitleView; }\n  get effectiveTrailingView(): TemplateRef<any> | undefined { return this.trailingView || this._gmt.trailingView; }\n  get effectiveLoadingView(): TemplateRef<any> | undefined { return this.loadingStateTemplate || this.loadingView || this.templatesService.resolveTemplate(this._gmt, 'loadingView'); }\n  get effectiveEmptyView(): TemplateRef<any> | undefined { return this.emptyStateTemplate || this.emptyView || this.templatesService.resolveTemplate(this._gmt, 'emptyView'); }\n  get effectiveErrorView(): TemplateRef<any> | undefined { return this.errorStateTemplate || this.errorView || this.templatesService.resolveTemplate(this._gmt, 'errorView'); }\n\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() itemClick = new EventEmitter<CometChat.GroupMember>();\n  @Output() selectionChange = new EventEmitter<SelectionState>();\n  @Output() empty = new EventEmitter<void>();\n\n  memberToChangeScope = signal<CometChat.GroupMember | null>(null);\n  searchText = signal<string>('');\n  focusedIndex = signal<number>(-1);\n  loggedInUser = signal<CometChat.User | null>(null);\n  lastError: Error | null = null;\n  readonly SelectionMode = SelectionMode;\n  readonly States = States;\n  private searchSubject$ = new Subject<string>();\n  private isFirstFetch = true;\n  private selectedMembers = new Set<string>();\n  private lastSelectedIndex = signal<number>(-1);\n\n  ngOnInit(): void {\n    this.fetchLoggedInUser();\n    this.initializeService();\n    this.setupSearchDebouncing();\n    this.setupGroupEventSubscriptions();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.groupMembersService.cleanup();\n    this.searchSubject$.complete();\n  }\n\n  private fetchLoggedInUser(): void {\n    CometChat.getLoggedinUser()\n      .then((user: CometChat.User | null) => { if (user) { this.loggedInUser.set(user); this.cdr.markForCheck(); } })\n      .catch((err: unknown) => CometChatLogger.error('CometChatGroupMembers', 'Error fetching logged-in user:', err));\n  }\n\n  private initializeService(): void {\n    if (!this.group) { CometChatLogger.warn('CometChatGroupMembers', 'No group input provided.'); return; }\n    this.groupMembersService.cleanup();\n    this.groupMembersService.setErrorCallback((err: CometChat.CometChatException) => {\n      this.lastError = err as unknown as Error; this.error.emit(err); this.cdr.markForCheck();\n    });\n    this.groupMembersService.initialize(this.group, this.groupMemberRequestBuilder);\n    this.groupMembersService.attachListeners(this.group.getGuid(), this.hideUserStatus);\n  }\n\n  private setupSearchDebouncing(): void {\n    this.searchSubject$.pipe(debounceTime(300), distinctUntilChanged(), takeUntilDestroyed(this.destroyRef))\n      .subscribe((keyword: string) => this.handleSearchTextChange(keyword));\n  }\n\n\n  private setupGroupEventSubscriptions(): void {\n    CometChatGroupEvents.ccGroupMemberKicked.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event: IGroupMemberKickedBanned) => {\n      if (event.kickedFrom?.getGuid() !== this.group?.getGuid()) return;\n      this.groupMembersService.removeMember(event.kickedUser.getUid()); this.checkEmptyState(); this.cdr.markForCheck();\n    });\n    CometChatGroupEvents.ccGroupMemberBanned.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event: IGroupMemberKickedBanned) => {\n      if (event.kickedFrom?.getGuid() !== this.group?.getGuid()) return;\n      this.groupMembersService.removeMember(event.kickedUser.getUid()); this.checkEmptyState(); this.cdr.markForCheck();\n    });\n    CometChatGroupEvents.ccGroupMemberScopeChanged.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event: IGroupMemberScopeChanged) => {\n      if (event.group?.getGuid() !== this.group?.getGuid()) return;\n      this.groupMembersService.updateMemberScopeInList(event.updatedUser.getUid(), event.scopeChangedTo as CometChat.GroupMemberScope);\n      this.cdr.markForCheck();\n    });\n    CometChatGroupEvents.ccGroupMemberAdded.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((event: IGroupMemberAdded) => {\n      if (event.userAddedIn?.getGuid() !== this.group?.getGuid()) return;\n      for (const user of event.usersAdded) {\n        this.groupMembersService.appendMember(GroupMemberUtils.createParticipantGroupMember(user, event.userAddedIn));\n      }\n      this.cdr.markForCheck();\n    });\n  }\n\n  onLoadMore(): void {\n    this.groupMembersService.fetchNext()\n      .then(() => {\n        this.paginatedList?.loadComplete();\n        if (this.isFirstFetch) { this.isFirstFetch = false; this.checkEmptyState(); }\n        this.cdr.markForCheck();\n      })\n      .catch(() => { this.paginatedList?.loadComplete(); this.cdr.markForCheck(); });\n  }\n\n  onSearch(text: string): void { this.searchSubject$.next(text); }\n\n  private handleSearchTextChange(keyword: string): void {\n    this.searchText.set(keyword); this.isFirstFetch = true;\n    this.groupMembersService.search(keyword, this.searchRequestBuilder); this.cdr.markForCheck();\n  }\n\n  onItemClick(member: CometChat.GroupMember): void {\n    if (this.selectionMode !== SelectionMode.none) { this.handleSelectionChange(member); } else { this.itemClick.emit(member); }\n  }\n\n  handleContextMenu(event: MouseEvent): void { if (this.disableDefaultContextMenu) event.preventDefault(); }\n\n  handleSelectionChange(member: CometChat.GroupMember, event?: Event): void {\n    const uid = member.getUid();\n    const currentIndex = this.groupMembersService.members().findIndex(m => m.getUid() === uid);\n    if (this.selectionMode === SelectionMode.single) {\n      const wasSelected = this.selectedMembers.has(uid);\n      this.selectedMembers.clear();\n      if (!wasSelected) this.selectedMembers.add(uid);\n      this.emitSelectionChange(!wasSelected ? uid : null);\n    } else if (this.selectionMode === SelectionMode.multiple) {\n      const isShiftClick = event instanceof MouseEvent && event.shiftKey;\n      const lastIndex = this.lastSelectedIndex();\n      if (isShiftClick && lastIndex >= 0 && currentIndex !== -1) {\n        this.selectRange(lastIndex, currentIndex);\n      } else {\n        const isSelected = this.selectedMembers.has(uid);\n        if (isSelected) { this.selectedMembers.delete(uid); } else { this.selectedMembers.add(uid); }\n        this.lastSelectedIndex.set(currentIndex);\n        this.emitSelectionChange(!isSelected ? uid : null);\n      }\n    }\n    this.cdr.markForCheck();\n  }\n\n  private selectRange(startIndex: number, endIndex: number): void {\n    this.lastSelectedIndex.set(selectMemberRange(this.groupMembersService.members(), startIndex, endIndex, this.selectedMembers, this.selectionChange, this.selectionMode));\n  }\n\n  private emitSelectionChange(lastSelectedId: string | null): void {\n    emitMemberSelectionChange(this.selectionMode, this.selectedMembers, lastSelectedId, this.selectionChange);\n  }\n\n  handleSelectionControlChange(member: CometChat.GroupMember, event?: Event): void {\n    event?.stopPropagation(); this.handleSelectionChange(member, event);\n  }\n\n  isMemberSelected(member: CometChat.GroupMember): boolean { return this.selectedMembers.has(member.getUid()); }\n\n  selectAll(): void {\n    if (this.selectionMode !== SelectionMode.multiple) return;\n    this.groupMembersService.members().forEach(member => this.selectedMembers.add(member.getUid()));\n    this.emitSelectionChange(null); this.cdr.markForCheck();\n  }\n\n  clearSelection(): void {\n    this.selectedMembers.clear(); this.lastSelectedIndex.set(-1); this.emitSelectionChange(null); this.cdr.markForCheck();\n  }\n\n  handleActionOnGroupMember(option: CometChatOption, member: CometChat.GroupMember): void {\n    if (!this.group) return;\n    switch (option.id) {\n      case CometChatUIKitConstants.GroupMemberOptions.kick:\n        this.groupMembersService.kickMember(this.group, member).then(() => { this.checkEmptyState(); this.cdr.markForCheck(); }); break;\n      case CometChatUIKitConstants.GroupMemberOptions.ban:\n        this.groupMembersService.banMember(this.group, member).then(() => { this.checkEmptyState(); this.cdr.markForCheck(); }); break;\n      case CometChatUIKitConstants.GroupMemberOptions.changeScope:\n        this.memberToChangeScope.set(member); this.cdr.markForCheck(); break;\n      default:\n        if (option.onClick) option.onClick(); break;\n    }\n  }\n\n  onOptionClick(option: CometChatOption, member: CometChat.GroupMember): void {\n    if (option instanceof CometChatOption || (option as CometChatOption).id) this.handleActionOnGroupMember(option as CometChatOption, member);\n  }\n\n  getOptionsForMember(member: CometChat.GroupMember): CometChatOption[] | string {\n    const user = this.loggedInUser();\n    if (!user || !this.group) return member.getScope();\n    if (this.options) {\n      try { return this.options(this.group, member); } catch (err) {\n        CometChatLogger.error('CometChatGroupMembers', 'Custom options function error:', err);\n        this.error.emit(new CometChat.CometChatException({ code: 'CUSTOM_OPTIONS_ERROR', message: CometChatLocalize.getLocalizedString('group_members_custom_options_error'), details: String(err) }));\n      }\n    }\n    return GroupMemberUtils.getViewMemberOptions(member, this.group, user.getUid(), { hideKickMemberOption: this.hideKickMemberOption, hideBanMemberOption: this.hideBanMemberOption, hideScopeChangeOption: this.hideScopeChangeOption });\n  }\n\n  hasActionOptions(optionsResult: CometChatOption[] | string): optionsResult is CometChatOption[] { return Array.isArray(optionsResult); }\n  getAllowedScopes(member: CometChat.GroupMember): string[] {\n    return this.group ? GroupMemberUtils.allowScopeChange(this.group, member) : [];\n  }\n\n  onScopeChanged(newScope: string): void {\n    const member = this.memberToChangeScope();\n    if (!member || !this.group) return;\n    this.groupMembersService.updateMemberScope(this.group, member, newScope)\n      .then(() => { this.changeScopeRef?.setSuccess(); this.memberToChangeScope.set(null); this.cdr.markForCheck(); })\n      .catch(() => { this.changeScopeRef?.setError(); this.cdr.markForCheck(); });\n  }\n\n  onChangeScopeClose(): void { this.memberToChangeScope.set(null); this.cdr.markForCheck(); }\n\n  @HostListener('focus')\n  handleListFocus(): void {\n    const members = this.groupMembersService.members();\n    if (this.focusedIndex() === -1 && members.length > 0) { this.focusedIndex.set(0); this.cdr.markForCheck(); this.scrollFocusedItemIntoView(); }\n  }\n\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void {\n    const members = this.groupMembersService.members();\n    if (members.length === 0 || this.groupMembersService.fetchState() !== States.loaded) return;\n    const target = event.target as HTMLElement;\n    if (!target.closest('.cometchat-group-members')) return;\n    const isInSearchBar = target.closest('.cometchat-group-members__search-bar') !== null || target.tagName === 'INPUT';\n    if (this.memberToChangeScope()) { if (event.key === 'Escape') { event.preventDefault(); this.onChangeScopeClose(); } return; }\n    if ((event.ctrlKey || event.metaKey) && event.shiftKey && event.key.toLowerCase() === 'a') {\n      if (this.selectionMode === SelectionMode.multiple) { event.preventDefault(); this.clearSelection(); return; }\n    }\n    if ((event.ctrlKey || event.metaKey) && !event.shiftKey && event.key.toLowerCase() === 'a') {\n      if (this.selectionMode === SelectionMode.multiple) { event.preventDefault(); this.selectAll(); return; }\n    }\n    switch (event.key) {\n      case 'ArrowDown': if (!isInSearchBar) { event.preventDefault(); event.stopPropagation(); this.focusNextItem(); } break;\n      case 'ArrowUp': if (!isInSearchBar) { event.preventDefault(); event.stopPropagation(); this.focusPreviousItem(); } break;\n      case 'Enter': if (!isInSearchBar) { event.preventDefault(); this.selectFocusedItem(); } break;\n      case ' ': if (!isInSearchBar && this.selectionMode === SelectionMode.multiple) { event.preventDefault(); this.toggleFocusedItemSelection(); } break;\n      case 'Escape': event.preventDefault(); this.handleEscapeKey(); break;\n    }\n  }\n\n  private focusNextItem(): void { focusNextMemberItem(this.groupMembersService.members().length, this.focusedIndex, this.cdr, () => this.scrollFocusedItemIntoView()); }\n  private focusPreviousItem(): void { focusPreviousMemberItem(this.groupMembersService.members().length, this.focusedIndex, this.cdr, () => this.scrollFocusedItemIntoView()); }\n  private scrollFocusedItemIntoView(): void { scrollMemberItemIntoView(this.listContainer?.nativeElement, this.focusedIndex(), this.pendingTimers); }\n\n  private selectFocusedItem(): void {\n    const members = this.groupMembersService.members();\n    const idx = this.focusedIndex();\n    if (idx >= 0 && idx < members.length) {\n      if (this.selectionMode !== SelectionMode.none) { this.handleSelectionChange(members[idx]); } else { this.itemClick.emit(members[idx]); }\n    }\n  }\n\n  private toggleFocusedItemSelection(): void {\n    const members = this.groupMembersService.members(); const idx = this.focusedIndex();\n    if (idx >= 0 && idx < members.length) this.handleSelectionChange(members[idx]);\n  }\n\n  private handleEscapeKey(): void {\n    if (this.searchText()) { this.searchText.set(''); this.searchSubject$.next(''); this.cdr.markForCheck(); return; }\n    if (this.selectionMode !== SelectionMode.none && this.selectedMembers.size > 0) this.clearSelection();\n    this.focusedIndex.set(-1); (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck();\n  }\n\n  handleItemFocus(index: number): void { this.focusedIndex.set(index); this.cdr.markForCheck(); }\n  handleItemBlur(): void { this.cdr.markForCheck(); }\n\n  handleItemKeydown(event: KeyboardEvent, member: CometChat.GroupMember, index: number): void {\n    const target = event.target as HTMLElement;\n    if (event.key === 'Enter' && target.classList.contains('cometchat-group-members__list-item-wrapper')) { event.preventDefault(); this.onItemClick(member); }\n    if (event.key === ' ' && this.selectionMode === SelectionMode.multiple && target.classList.contains('cometchat-group-members__list-item-wrapper')) { event.preventDefault(); this.handleSelectionChange(member); }\n  }\n\n  getTabIndex(index: number): number {\n    if (this.focusedIndex() === index) return 0;\n    if (this.focusedIndex() === -1 && index === 0) return 0;\n    return -1;\n  }\n\n  trackByMember(_index: number, member: CometChat.GroupMember): string { return member.getUid(); }\n  getMemberAriaLabel(member: CometChat.GroupMember): string { return `${member.getName() || ''}, ${member.getScope() || ''}`; }\n  private checkEmptyState(): void { if (this.groupMembersService.members().length === 0) this.empty.emit(); }\n\n  handleContainerClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement;\n    const isOnItem = target.closest('.cometchat-group-members__list-item-wrapper') !== null;\n    const isOnSelectionControl = target.closest('cometchat-checkbox') !== null || target.closest('cometchat-radio-button') !== null;\n    const isOnSearchBar = target.closest('cometchat-search-bar') !== null || target.closest('.cometchat-group-members__search-bar') !== null;\n    if (!isOnItem && !isOnSelectionControl && !isOnSearchBar) { this.focusedIndex.set(-1); (document.activeElement as HTMLElement)?.blur(); this.cdr.markForCheck(); }\n  }\n\n  handleRetryClick(): void {\n    if (!this.group) return;\n    this.lastError = null; this.initializeService(); this.groupMembersService.fetchNext();\n  }\n}\n","<!--\n  CometChatGroupMembers Component Template\n\n  This template provides the structure for displaying a list of group members with:\n  - Header section with optional search bar\n  - Member list with role badges and context menus\n  - Loading, empty, and error states\n  - Selection controls (radio/checkbox)\n  - Change scope modal dialog\n  - Full accessibility support\n\n  @see Requirements 1.2-1.5, 4.1-4.4, 5.2-5.3, 8.1, 8.6, 10.1-10.4, 11.1-11.4, 12.1-12.4\n-->\n\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'GroupMembers'\">\n<div\n  class=\"cometchat cometchat-group-members\"\n  [class.cometchat-group-members-hide-scrollbar]=\"!effectiveShowScrollbar()\"\n  role=\"region\"\n  [attr.aria-label]=\"'member_title' | translate\"\n  (click)=\"handleContainerClick($event)\"\n>\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-group-members__header\">\n    @if (headerView) {\n      <ng-container *ngTemplateOutlet=\"headerView\"></ng-container>\n    } @else {\n      <!-- Default Header -->\n      <div class=\"cometchat-group-members__header-default\">\n        @if (menuView) {\n          <ng-container *ngTemplateOutlet=\"menuView\"></ng-container>\n        }\n      </div>\n    }\n        <!-- Search Bar (if not hidden) -->\n      @if (!hideSearch) {\n        <div class=\"cometchat-group-members__search-bar\">\n          <cometchat-search-bar\n            [searchText]=\"searchText()\"\n            [placeholderText]=\"'member_search_placeholder' | translate\"\n            [ariaLabel]=\"'member_search_placeholder' | translate\"\n            (searchChanged)=\"onSearch($event.value)\"\n            (clearClick)=\"onSearch('')\">\n          </cometchat-search-bar>\n        </div>\n      }\n  </div>\n\n  <!-- ==================== List Body using CometChatPaginatedList ==================== -->\n  <cometchat-paginated-list\n    #paginatedList\n    #listContainer\n    [items]=\"groupMembersService.members()\"\n    [trackByFn]=\"trackByMember.bind(this)\"\n    [isLoading]=\"groupMembersService.fetchState() === States.loading && !disableLoadingState\"\n    [hasMore]=\"groupMembersService.hasMore()\"\n    [error]=\"lastError\"\n    [showScrollbar]=\"effectiveShowScrollbar()\"\n    [loadingTemplate]=\"loadingTemplateRef\"\n    [emptyTemplate]=\"emptyTemplateRef\"\n    [errorTemplate]=\"errorTemplateRef\"\n    [itemTemplate]=\"itemTemplateRef\"\n    (loadMore)=\"onLoadMore()\"\n    role=\"listbox\"\n    [attr.aria-label]=\"'member_title' | translate\"\n    [attr.aria-busy]=\"groupMembersService.fetchState() === States.loading\"\n    aria-live=\"polite\">\n  </cometchat-paginated-list>\n\n  <!-- ==================== Loading Template ==================== -->\n  <ng-template #loadingTemplateRef>\n    @if (effectiveLoadingView) {\n      <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-group-members__shimmer\" aria-hidden=\"true\">\n        @for (item of shimmerList; track item) {\n          <div class=\"cometchat-group-members__shimmer-item\">\n            <div class=\"cometchat-group-members__shimmer-item-avatar\"></div>\n            <div class=\"cometchat-group-members__shimmer-item-body\">\n              <div class=\"cometchat-group-members__shimmer-item-body-title\"></div>\n              <div class=\"cometchat-group-members__shimmer-item-body-subtitle\"></div>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Empty Template ==================== -->\n  <ng-template #emptyTemplateRef>\n    @if (effectiveEmptyView) {\n      <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n    } @else {\n      <div\n        class=\"cometchat-group-members__empty-state-view\"\n        role=\"status\"\n        [attr.aria-label]=\"'member_empty_title' | translate\"\n      >\n        <div class=\"cometchat-group-members__empty-state-view-icon\">\n          <span class=\"cometchat-group-members__empty-state-view-icon-mask\" aria-hidden=\"true\"></span>\n        </div>\n        <h3 class=\"cometchat-group-members__empty-state-view-title\">\n          {{ 'member_empty_title' | translate }}\n        </h3>\n        <p class=\"cometchat-group-members__empty-state-view-subtitle\">\n          {{ 'member_empty_subtitle' | translate }}\n        </p>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Error Template ==================== -->\n  <ng-template #errorTemplateRef>\n    @if (!hideError) {\n      @if (effectiveErrorView) {\n        <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n      } @else {\n        <div\n          class=\"cometchat-group-members__error-state-view\"\n          role=\"alert\"\n        >\n          <div class=\"cometchat-group-members__error-state-view-icon\">\n            <span class=\"cometchat-group-members__error-state-view-icon-mask\" aria-hidden=\"true\"></span>\n          </div>\n          <h3 class=\"cometchat-group-members__error-state-view-title\">\n            {{ 'member_error_title' | translate }}\n          </h3>\n          <p class=\"cometchat-group-members__error-state-view-subtitle\">\n            {{ 'member_error_subtitle' | translate }}\n          </p>\n          <button\n            class=\"cometchat-group-members__error-state-view-retry-button\"\n            (click)=\"handleRetryClick()\"\n            type=\"button\">\n            {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      }\n    }\n  </ng-template>\n\n  <!-- ==================== Item Template ==================== -->\n  <ng-template #itemTemplateRef let-member let-index=\"index\">\n    <!-- Custom Item View -->\n    @if (effectiveItemView) {\n      <div\n        class=\"cometchat-group-members__list-item-wrapper\"\n        [class.cometchat-group-members__list-item-wrapper--focused]=\"focusedIndex() === index\"\n        [attr.data-index]=\"index\"\n        role=\"option\"\n        [attr.aria-label]=\"getMemberAriaLabel(member)\"\n        [attr.aria-selected]=\"selectionMode !== SelectionMode.none ? isMemberSelected(member) : null\"\n        [attr.tabindex]=\"getTabIndex(index)\"\n        (focus)=\"handleItemFocus(index)\"\n        (blur)=\"handleItemBlur()\"\n        (click)=\"onItemClick(member)\"\n        (contextmenu)=\"handleContextMenu($event)\"\n        (keydown)=\"handleItemKeydown($event, member, index)\"\n      >\n        <ng-container *ngTemplateOutlet=\"effectiveItemView; context: { $implicit: member }\"></ng-container>\n      </div>\n    } @else {\n      <!-- Default Item View using CometChatGroupMemberItem -->\n      <cometchat-group-member-item\n        [attr.data-index]=\"index\"\n        [member]=\"member\"\n        [isFocused]=\"focusedIndex() === index\"\n        [isSelected]=\"isMemberSelected(member)\"\n        [tabIndex]=\"getTabIndex(index)\"\n        [hideUserStatus]=\"effectiveHideUserStatus()\"\n        [contextMenuOptions]=\"selectionMode === SelectionMode.none && hasActionOptions(getOptionsForMember(member)) ? $any(getOptionsForMember(member)) : undefined\"\n        [leadingView]=\"effectiveLeadingView\"\n        [titleView]=\"effectiveTitleView\"\n        [subtitleView]=\"effectiveSubtitleView\"\n        [trailingView]=\"selectionMode !== SelectionMode.none ? selectionControlTemplate : effectiveTrailingView\"\n        (itemClick)=\"onItemClick($event)\"\n        (itemFocus)=\"handleItemFocus(index)\"\n        (contextMenuOptionClick)=\"onOptionClick($event.option, $event.member)\"\n      >\n      </cometchat-group-member-item>\n\n      <!-- Selection Control Template (for trailing view when selection mode is active) -->\n      <ng-template #selectionControlTemplate let-item>\n        <div class=\"cometchat-group-members__selection-control\"\n             (click)=\"$event.stopPropagation()\">\n          @if (selectionMode === SelectionMode.multiple) {\n            <cometchat-checkbox\n              [checked]=\"isMemberSelected(member)\"\n              [ariaLabel]=\"'Select ' + member.getName()\"\n              (checkboxChanged)=\"handleSelectionControlChange(member)\">\n            </cometchat-checkbox>\n          } @else if (selectionMode === SelectionMode.single) {\n            <cometchat-radio-button\n              [checked]=\"isMemberSelected(member)\"\n              [ariaLabel]=\"'Select ' + member.getName()\"\n              (radioChanged)=\"handleSelectionControlChange(member)\">\n            </cometchat-radio-button>\n          }\n        </div>\n      </ng-template>\n    }\n  </ng-template>\n\n  <!-- ==================== Change Scope Modal ==================== -->\n  @if (memberToChangeScope()) {\n    <div\n      class=\"cometchat-group-members__backdrop\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      [attr.aria-label]=\"'members_change_role' | translate\"\n    >\n      <cometchat-change-scope\n        #changeScopeRef\n        [title]=\"'members_change_role' | translate\"\n        [options]=\"getAllowedScopes(memberToChangeScope()!)\"\n        [defaultSelection]=\"memberToChangeScope()!.getScope()\"\n        (scopeChanged)=\"onScopeChanged($event)\"\n        (closeClick)=\"onChangeScopeClose()\">\n      </cometchat-change-scope>\n    </div>\n  }\n</div>\n</cometchat-error-boundary>\n","/**\n * CometChatGroupMembers Component Public API\n *\n * This module exports the CometChatGroupMembersComponent\n * for displaying and managing group member lists.\n *\n * @module components/cometchat-group-members\n */\n\n// Component export\nexport { CometChatGroupMembersComponent } from './cometchat-group-members.component';\n\n// Re-export commonly used types for convenience\nexport { SelectionMode, States } from '../../Enums/Enums';\nexport { CometChatOption } from '../../modals/CometChatOption';\n","/**\n * CometChatUserItem Public API\n *\n * Exports the CometChatUserItem component for use in other modules.\n *\n * @module components/cometchat-user-item\n */\n\nexport { CometChatUserItemComponent } from './cometchat-user-item.component';\n","/**\n * CometChatGroupItem Public API\n *\n * Exports the CometChatGroupItem component for use in other modules.\n *\n * @module components/cometchat-group-item\n */\n\nexport { CometChatGroupItemComponent } from './cometchat-group-item.component';\n","/**\n * CometChatActionBubble Component\n *\n * A standalone component for rendering action/system messages within the chat interface.\n * This component displays messages like \"User joined the group\", \"User left the group\",\n * or \"Group name changed to X\".\n *\n * Features:\n * - Simple text display with centered layout\n * - Pill-shaped container with subtle styling\n * - Optional icon display for call status messages\n * - Full accessibility support\n * - CSS variable-based theming\n *\n * @module components/cometchat-action-bubble\n * @see Requirements 7.1, 7.5, 7.6\n */\n\nimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { NgStyle } from '@angular/common';\n\n/**\n * CometChatActionBubble is a standalone Angular component that renders\n * action/system messages with a centered, pill-shaped appearance.\n *\n * This is a purely presentational component with no internal state.\n * It does NOT accept a CometChat message object - only a plain text string.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <cometchat-action-bubble\n *   [messageText]=\"'User joined the group'\">\n * </cometchat-action-bubble>\n *\n * <!-- With icon (for call status) -->\n * <cometchat-action-bubble\n *   [messageText]=\"'Outgoing Call'\"\n *   [iconUrl]=\"'assets/outgoing_video_no_fill.svg'\">\n * </cometchat-action-bubble>\n * ```\n *\n * @see Requirements 1.1 - THE Action_Bubble SHALL accept a messageText string input\n * @see Requirements 7.1 - THE Action_Bubble SHALL be a standalone Angular component\n * @see Requirements 7.6 - THE Action_Bubble SHALL use ChangeDetectionStrategy.OnPush\n */\n@Component({\n  selector: 'cometchat-action-bubble',\n  standalone: true,\n  imports: [NgStyle],\n  templateUrl: './cometchat-action-bubble.component.html',\n  styleUrls: ['./cometchat-action-bubble.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatActionBubbleComponent {\n  /**\n   * The action/system message text to display.\n   * If empty, null, undefined, or whitespace-only, the component renders nothing.\n   *\n   * @see Requirements 1.1, 1.2, 1.3\n   */\n  @Input() messageText = '';\n\n  /**\n   * Optional icon URL to display before the message text.\n   * Used for call status messages (outgoing, incoming, missed, etc.).\n   * When provided, the icon will be displayed using CSS mask.\n   *\n   * @see Requirements 4.5, 4.6 - Call messages display with appropriate icons\n   */\n  @Input() iconUrl = '';\n\n  /**\n   * Whether to use error color for the icon.\n   * Used for missed call status to show red icon.\n   *\n   * @see Requirements 4.5, 4.6 - Missed calls show error color\n   */\n  @Input() iconErrorColor = false;\n\n  /**\n   * Determines if the component should render based on messageText validity.\n   * Returns true only if messageText is a non-empty, non-whitespace string.\n   *\n   * @see Requirements 8.1, 8.2, 8.3, 8.4\n   */\n  get shouldRender(): boolean {\n    if (this.messageText === null || this.messageText === undefined) {\n      return false;\n    }\n    return this.messageText.trim().length > 0;\n  }\n\n  /**\n   * Whether to show the icon element.\n   * Returns true if iconUrl is provided.\n   */\n  get showIcon(): boolean {\n    return !!this.iconUrl && this.iconUrl.trim().length > 0;\n  }\n\n  /**\n   * Gets the icon styles for the mask-based icon display.\n   * Uses CSS mask to display the icon with the appropriate color.\n   */\n  get iconStyles(): Record<string, string> {\n    if (!this.iconUrl) {\n      return {};\n    }\n    return {\n      display: 'flex',\n      '-webkit-mask': `url('${this.iconUrl}') center center no-repeat`,\n      mask: `url('${this.iconUrl}') center center no-repeat`,\n      '-webkit-mask-size': 'contain',\n      'mask-size': 'contain',\n    };\n  }\n}\n","<!--\n  CometChatActionBubble Template\n\n  Renders action/system messages with a centered, pill-shaped appearance.\n  The component only renders when messageText is a valid non-empty string.\n  Optionally displays an icon for call status messages.\n\n  @see Requirements 2.1, 4.1, 6.1, 6.2, 6.4, 6.5\n-->\n\n@if (shouldRender) {\n  <div \n    class=\"cometchat-action-bubble\"\n    role=\"status\"\n    [attr.aria-label]=\"messageText\">\n    \n    <!-- Icon (shown when iconUrl is provided, e.g., for call status) -->\n    @if (showIcon) {\n      <div \n        class=\"cometchat-action-bubble__icon\"\n        [class.cometchat-action-bubble__icon--error]=\"iconErrorColor\"\n        [ngStyle]=\"iconStyles\"\n        aria-hidden=\"true\">\n      </div>\n    }\n    \n    <!-- Action Message Text -->\n    <span \n      class=\"cometchat-action-bubble__text\"\n      [class.cometchat-action-bubble__text--error]=\"iconErrorColor\">\n      {{ messageText }}\n    </span>\n  </div>\n}\n","/**\n * CometChatActionBubble Public API\n *\n * Exports the CometChatActionBubble component for use in other modules.\n *\n * @module components/cometchat-action-bubble\n * @see Requirements 7.1\n */\n\nexport { CometChatActionBubbleComponent } from './cometchat-action-bubble.component';\n","/**\n * Shared Extension URL Extractor\n *\n * Extracted from cometchat-collaborative-document-bubble and\n * cometchat-collaborative-whiteboard-bubble to consolidate duplicate\n * metadata navigation logic (~46 shared lines).\n *\n * Both components navigate the same metadata path:\n *   message.getMetadata() -> @injected -> extensions -> {extensionKey} -> {urlKey}\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from './CometChatLogger';\n\n/**\n * Extracts a URL from a CometChat message's extension metadata.\n *\n * Navigates the metadata path:\n *   `@injected -> extensions -> extensionKey -> urlKey`\n *\n * @param message - The CometChat message to extract from\n * @param extensionKey - The extension name (e.g. 'document', 'whiteboard')\n * @param urlKey - The URL property name (e.g. 'document_url', 'board_url')\n * @param logPrefix - Prefix for warning/error log messages\n * @returns The extracted URL string, or empty string if not found\n */\nexport function extractExtensionUrl(\n  message: CometChat.CustomMessage | null | undefined,\n  extensionKey: string,\n  urlKey: string,\n  logPrefix: string\n): string {\n  if (!message) {\n    CometChatLogger.warn(logPrefix, 'Message is null or undefined');\n    return '';\n  }\n\n  try {\n    const metadata = message.getMetadata?.();\n\n    if (!metadata || typeof metadata !== 'object') {\n      CometChatLogger.warn(logPrefix, 'Message has no metadata');\n      return '';\n    }\n\n    const injected = (metadata as any)['@injected'];\n    if (!injected || typeof injected !== 'object') {\n      CometChatLogger.warn(logPrefix, 'Missing @injected in metadata');\n      return '';\n    }\n\n    const extensions = injected['extensions'];\n    if (!extensions || typeof extensions !== 'object') {\n      CometChatLogger.warn(logPrefix, 'Missing extensions in metadata');\n      return '';\n    }\n\n    const extension = extensions[extensionKey];\n    if (!extension || typeof extension !== 'object') {\n      CometChatLogger.warn(logPrefix, `Missing ${extensionKey} in metadata`);\n      return '';\n    }\n\n    const url = extension[urlKey];\n    if (!url || typeof url !== 'string') {\n      CometChatLogger.warn(logPrefix, `Missing ${urlKey} in metadata`);\n      return '';\n    }\n\n    return url;\n  } catch (error) {\n    CometChatLogger.error(logPrefix, `Error extracting ${extensionKey} URL:`, error);\n    return '';\n  }\n}\n","/**\n * CometChatCollaborativeDocumentBubbleComponent\n *\n * A presentational component that renders collaborative document messages within chat.\n * Displays a banner image, title, subtitle, and an action button to open the document.\n *\n * @remarks\n * This component processes CometChat.CustomMessage objects of type `extension_document`\n * to extract and display collaborative document content with support for:\n * - Theme-aware banner images (light/dark)\n * - Localized text for title, subtitle, and button\n * - Sender/receiver styling variants\n * - Full keyboard accessibility and screen reader support\n *\n * @example\n * ```html\n * <cometchat-collaborative-document-bubble\n *   [message]=\"documentMessage\"\n *   [alignment]=\"MessageBubbleAlignment.right\"\n *   (buttonClick)=\"onDocumentOpen($event)\">\n * </cometchat-collaborative-document-bubble>\n * ```\n *\n * @see Requirements 1.1, 10.1, 10.2, 10.5\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { getThemeMode } from '../../utils/util';\nimport { extractExtensionUrl } from '../../utils/extension-url-extractor';\n\n@Component({\n  selector: 'cometchat-collaborative-document-bubble',\n  standalone: true,\n  templateUrl: './cometchat-collaborative-document-bubble.component.html',\n  styleUrls: ['./cometchat-collaborative-document-bubble.component.css'],\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCollaborativeDocumentBubbleComponent implements OnInit, OnChanges {\n  // ============================================\n  // Inputs\n  // ============================================\n\n  /**\n   * The custom message object containing collaborative document metadata.\n   *\n   * @remarks\n   * This is a required input. The component extracts the document URL from\n   * `metadata[\"@injected\"][\"extensions\"][\"document\"][\"document_url\"]`.\n   *\n   * @see Requirements 1.1, 2.1\n   */\n  @Input({ required: true }) message!: CometChat.CustomMessage;\n\n  /**\n   * The alignment of the message bubble.\n   *\n   * @remarks\n   * LEFT for incoming/receiver messages, RIGHT for outgoing/sender messages.\n   *\n   * @default MessageBubbleAlignment.left\n   * @see Requirements 1.3, 1.4\n   */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /**\n   * When true, disables all interactive elements (action button).\n   * Used in thread header to prevent interaction with the parent message.\n   * @default false\n   */\n  @Input() disableInteraction = false;\n\n  // ============================================\n  // Outputs\n  // ============================================\n\n  /**\n   * Event emitted when the action button is clicked.\n   *\n   * @remarks\n   * Emits the document URL string when the button is clicked.\n   *\n   * @see Requirements 5.2, 9.1, 9.2, 9.3\n   */\n  @Output() buttonClick = new EventEmitter<string>();\n\n  // ============================================\n  // Internal State\n  // ============================================\n\n  /** Extracted document URL from message metadata */\n  protected documentUrl = '';\n\n  /** Theme-aware banner image URL */\n  protected bannerImage = '';\n\n  /** Localized title text */\n  protected title = '';\n\n  /** Localized subtitle text */\n  protected subtitle = '';\n\n  /** Localized button text */\n  protected buttonText = '';\n\n  /** Whether this is an outgoing message (sender is logged-in user) */\n  protected isOutgoing = false;\n\n  /** Whether the banner image failed to load */\n  protected bannerImageError = false;\n\n  // ============================================\n  // Template Exposed Properties\n  // ============================================\n\n  /** Expose MessageBubbleAlignment enum to template */\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  // ============================================\n  // Constructor\n  // ============================================\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  // ============================================\n  // Lifecycle Hooks\n  // ============================================\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) {\n      this.processMessage();\n    }\n  }\n\n  // ============================================\n  // Private Methods\n  // ============================================\n\n  /**\n   * Process the message to extract document URL and set up component state.\n   *\n   * @see Requirements 1.1, 2.1\n   */\n  private processMessage(): void {\n    this.extractDocumentUrl();\n    this.determineBannerImage();\n    this.loadLocalizedStrings();\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n    this.bannerImageError = false;\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Extract the document URL from message metadata.\n   *\n   * @remarks\n   * Extracts from `metadata[\"@injected\"][\"extensions\"][\"document\"][\"document_url\"]`.\n   * Handles missing or malformed metadata gracefully.\n   *\n   * @see Requirements 2.1, 2.3, 2.4\n   */\n  private extractDocumentUrl(): void {\n    this.documentUrl = extractExtensionUrl(\n      this.message,\n      'document',\n      'document_url',\n      'CometChatCollaborativeDocumentBubble'\n    );\n  }\n\n  /**\n   * Determine the appropriate banner image based on current theme.\n   *\n   * @remarks\n   * Selects `Collaborative_Document_Light.png` or `Collaborative_Document_Dark.png`\n   * based on the current theme mode.\n   *\n   * @see Requirements 3.1, 3.3\n   */\n  private determineBannerImage(): void {\n    const themeMode = getThemeMode();\n    this.bannerImage =\n      themeMode === 'dark'\n        ? 'assets/Collaborative_Document_Dark.png'\n        : 'assets/Collaborative_Document_Light.png';\n  }\n\n  /**\n   * Load localized strings for title, subtitle, and button text.\n   *\n   * @see Requirements 4.1, 4.2, 4.3, 4.7\n   */\n  private loadLocalizedStrings(): void {\n    this.title = CometChatLocalize.getLocalizedString('message_list_collaborative_document_title');\n    this.subtitle = CometChatLocalize.getLocalizedString(\n      'message_list_collaborative_document_subtitile'\n    );\n    this.buttonText = CometChatLocalize.getLocalizedString(\n      'message_list_collaborative_document_open'\n    );\n  }\n\n  // ============================================\n  // Protected Methods (Template Accessible)\n  // ============================================\n\n  /**\n   * Handle button click to emit event and open URL.\n   *\n   * @remarks\n   * Opens the document URL in a new fullscreen window.\n   *\n   * @see Requirements 5.1, 5.2, 5.3\n   */\n  protected onButtonClick(): void {\n    if (this.documentUrl) {\n      this.buttonClick.emit(this.documentUrl);\n      window.open(this.documentUrl, '', 'fullscreen=yes, scrollbars=auto');\n    }\n  }\n\n  /**\n   * Check if the action button should be disabled.\n   *\n   * @returns True if the URL is empty or invalid\n   * @see Requirements 5.4\n   */\n  protected isButtonDisabled(): boolean {\n    return !this.documentUrl || !this.documentUrl.trim();\n  }\n\n  /**\n   * Handle banner image load error.\n   *\n   * @see Requirements 3.5\n   */\n  protected onBannerImageError(): void {\n    this.bannerImageError = true;\n    this.cdr.markForCheck();\n  }\n}\n","<!-- Collaborative Document Bubble Component Template -->\n<div class=\"cometchat\">\n  <div\n    class=\"cometchat-collaborative-document-bubble\"\n    [class.cometchat-collaborative-document-bubble--outgoing]=\"isOutgoing\"\n    [class.cometchat-collaborative-document-bubble--incoming]=\"!isOutgoing\">\n\n    <!-- Banner Image -->\n    <div\n      *ngIf=\"bannerImage && !bannerImageError\"\n      class=\"cometchat-collaborative-document-bubble__banner-image\">\n      <img\n        [src]=\"bannerImage\"\n        alt=\"\"\n        (error)=\"onBannerImageError()\" />\n    </div>\n\n    <!-- Body Content -->\n    <div class=\"cometchat-collaborative-document-bubble__body\">\n      <div class=\"cometchat-collaborative-document-bubble__body-icon\"></div>\n      <div class=\"cometchat-collaborative-document-bubble__body-content\">\n        <div class=\"cometchat-collaborative-document-bubble__body-content-name\">\n          <span [title]=\"title\">{{ title }}</span>\n        </div>\n        <div class=\"cometchat-collaborative-document-bubble__body-content-description\">\n          <span [title]=\"subtitle\">{{ subtitle }}</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Action Button -->\n    <button\n      class=\"cometchat-collaborative-document-bubble__button\"\n      [title]=\"buttonText\"\n      [disabled]=\"disableInteraction || isButtonDisabled()\"\n      [attr.aria-label]=\"buttonText\"\n      (click)=\"onButtonClick()\"\n      (keydown.enter)=\"onButtonClick()\"\n      (keydown.space)=\"onButtonClick(); $event.preventDefault()\">\n      {{ buttonText }}\n    </button>\n  </div>\n</div>\n","/**\n * CometChatCollaborativeDocumentBubble Component\n *\n * Public API exports for the collaborative document message bubble component.\n *\n * @see Requirements 10.2, 10.5\n */\n\nexport { CometChatCollaborativeDocumentBubbleComponent } from './cometchat-collaborative-document-bubble.component';\n","/**\n * CometChatCollaborativeWhiteboardBubbleComponent\n *\n * A presentational component that renders collaborative whiteboard messages within chat.\n * Displays a banner image, title, subtitle, and an action button to open the whiteboard.\n *\n * @remarks\n * This component processes CometChat.CustomMessage objects of type `extension_whiteboard`\n * to extract and display collaborative whiteboard content with support for:\n * - Theme-aware banner images (light/dark)\n * - Localized text for title, subtitle, and button\n * - Sender/receiver styling variants\n * - Full keyboard accessibility and screen reader support\n *\n * @example\n * ```html\n * <cometchat-collaborative-whiteboard-bubble\n *   [message]=\"whiteboardMessage\"\n *   [alignment]=\"MessageBubbleAlignment.right\"\n *   (buttonClick)=\"onWhiteboardOpen($event)\">\n * </cometchat-collaborative-whiteboard-bubble>\n * ```\n *\n * @see Requirements 1.2, 10.1, 10.2, 10.5\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport type { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { getThemeMode } from '../../utils/util';\nimport { extractExtensionUrl } from '../../utils/extension-url-extractor';\n\n@Component({\n  selector: 'cometchat-collaborative-whiteboard-bubble',\n  standalone: true,\n  templateUrl: './cometchat-collaborative-whiteboard-bubble.component.html',\n  styleUrls: ['./cometchat-collaborative-whiteboard-bubble.component.css'],\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCollaborativeWhiteboardBubbleComponent implements OnInit, OnChanges {\n  // ============================================\n  // Inputs\n  // ============================================\n\n  /**\n   * The custom message object containing collaborative whiteboard metadata.\n   *\n   * @remarks\n   * This is a required input. The component extracts the whiteboard URL from\n   * `metadata[\"@injected\"][\"extensions\"][\"whiteboard\"][\"board_url\"]`.\n   *\n   * @see Requirements 1.2, 2.2\n   */\n  @Input({ required: true }) message!: CometChat.CustomMessage;\n\n  /**\n   * The alignment of the message bubble.\n   *\n   * @remarks\n   * LEFT for incoming/receiver messages, RIGHT for outgoing/sender messages.\n   *\n   * @default MessageBubbleAlignment.left\n   * @see Requirements 1.3, 1.4\n   */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /**\n   * When true, disables all interactive elements (action button).\n   * Used in thread header to prevent interaction with the parent message.\n   * @default false\n   */\n  @Input() disableInteraction = false;\n\n  // ============================================\n  // Outputs\n  // ============================================\n\n  /**\n   * Event emitted when the action button is clicked.\n   *\n   * @remarks\n   * Emits the whiteboard URL string when the button is clicked.\n   *\n   * @see Requirements 5.2, 9.1, 9.2, 9.3\n   */\n  @Output() buttonClick = new EventEmitter<string>();\n\n  // ============================================\n  // Internal State\n  // ============================================\n\n  /** Extracted whiteboard URL from message metadata */\n  protected whiteboardUrl = '';\n\n  /** Theme-aware banner image URL */\n  protected bannerImage = '';\n\n  /** Localized title text */\n  protected title = '';\n\n  /** Localized subtitle text */\n  protected subtitle = '';\n\n  /** Localized button text */\n  protected buttonText = '';\n\n  /** Whether this is an outgoing message (sender is logged-in user) */\n  protected isOutgoing = false;\n\n  /** Whether the banner image failed to load */\n  protected bannerImageError = false;\n\n  // ============================================\n  // Template Exposed Properties\n  // ============================================\n\n  /** Expose MessageBubbleAlignment enum to template */\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  // ============================================\n  // Constructor\n  // ============================================\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  // ============================================\n  // Lifecycle Hooks\n  // ============================================\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) {\n      this.processMessage();\n    }\n  }\n\n  // ============================================\n  // Private Methods\n  // ============================================\n\n  /**\n   * Process the message to extract whiteboard URL and set up component state.\n   *\n   * @see Requirements 1.2, 2.2\n   */\n  private processMessage(): void {\n    this.extractWhiteboardUrl();\n    this.determineBannerImage();\n    this.loadLocalizedStrings();\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n    this.bannerImageError = false;\n    this.cdr.markForCheck();\n  }\n\n  /**\n   * Extract the whiteboard URL from message metadata.\n   *\n   * @remarks\n   * Extracts from `metadata[\"@injected\"][\"extensions\"][\"whiteboard\"][\"board_url\"]`.\n   * Handles missing or malformed metadata gracefully.\n   *\n   * @see Requirements 2.2, 2.3, 2.4\n   */\n  private extractWhiteboardUrl(): void {\n    this.whiteboardUrl = extractExtensionUrl(\n      this.message,\n      'whiteboard',\n      'board_url',\n      'CometChatCollaborativeWhiteboardBubble'\n    );\n  }\n\n  /**\n   * Determine the appropriate banner image based on current theme.\n   *\n   * @remarks\n   * Selects `Collaborative_Whiteboard_Light.png` or `Collaborative_Whiteboard_Dark.png`\n   * based on the current theme mode.\n   *\n   * @see Requirements 3.2, 3.3\n   */\n  private determineBannerImage(): void {\n    const themeMode = getThemeMode();\n    this.bannerImage =\n      themeMode === 'dark'\n        ? 'assets/Collaborative_Whiteboard_Dark.png'\n        : 'assets/Collaborative_Whiteboard_Light.png';\n  }\n\n  /**\n   * Load localized strings for title, subtitle, and button text.\n   *\n   * @see Requirements 4.4, 4.5, 4.6, 4.7\n   */\n  private loadLocalizedStrings(): void {\n    this.title = CometChatLocalize.getLocalizedString(\n      'message_list_collaborative_whiteboard_title'\n    );\n    this.subtitle = CometChatLocalize.getLocalizedString(\n      'message_collaborative_whiteboard_subtitile'\n    );\n    this.buttonText = CometChatLocalize.getLocalizedString(\n      'messag_list_collaborative_whiteboard_open'\n    );\n  }\n\n  // ============================================\n  // Protected Methods (Template Accessible)\n  // ============================================\n\n  /**\n   * Handle button click to emit event and open URL.\n   *\n   * @remarks\n   * Opens the whiteboard URL in a new fullscreen window.\n   *\n   * @see Requirements 5.1, 5.2, 5.3\n   */\n  protected onButtonClick(): void {\n    if (this.whiteboardUrl) {\n      this.buttonClick.emit(this.whiteboardUrl);\n      window.open(this.whiteboardUrl, '', 'fullscreen=yes, scrollbars=auto');\n    }\n  }\n\n  /**\n   * Check if the action button should be disabled.\n   *\n   * @returns True if the URL is empty or invalid\n   * @see Requirements 5.4\n   */\n  protected isButtonDisabled(): boolean {\n    return !this.whiteboardUrl || !this.whiteboardUrl.trim();\n  }\n\n  /**\n   * Handle banner image load error.\n   *\n   * @see Requirements 3.5\n   */\n  protected onBannerImageError(): void {\n    this.bannerImageError = true;\n    this.cdr.markForCheck();\n  }\n}\n","<!-- Collaborative Whiteboard Bubble Component Template -->\n<div class=\"cometchat\">\n  <div\n    class=\"cometchat-collaborative-whiteboard-bubble\"\n    [class.cometchat-collaborative-whiteboard-bubble--outgoing]=\"isOutgoing\"\n    [class.cometchat-collaborative-whiteboard-bubble--incoming]=\"!isOutgoing\">\n\n    <!-- Banner Image -->\n    <div\n      *ngIf=\"bannerImage && !bannerImageError\"\n      class=\"cometchat-collaborative-whiteboard-bubble__banner-image\">\n      <img\n        [src]=\"bannerImage\"\n        alt=\"\"\n        (error)=\"onBannerImageError()\" />\n    </div>\n\n    <!-- Body Content -->\n    <div class=\"cometchat-collaborative-whiteboard-bubble__body\">\n      <div class=\"cometchat-collaborative-whiteboard-bubble__body-icon\"></div>\n      <div class=\"cometchat-collaborative-whiteboard-bubble__body-content\">\n        <div class=\"cometchat-collaborative-whiteboard-bubble__body-content-name\">\n          <span [title]=\"title\">{{ title }}</span>\n        </div>\n        <div class=\"cometchat-collaborative-whiteboard-bubble__body-content-description\">\n          <span [title]=\"subtitle\">{{ subtitle }}</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Action Button -->\n    <button\n      class=\"cometchat-collaborative-whiteboard-bubble__button\"\n      [title]=\"buttonText\"\n      [disabled]=\"disableInteraction || isButtonDisabled()\"\n      [attr.aria-label]=\"buttonText\"\n      (click)=\"onButtonClick()\"\n      (keydown.enter)=\"onButtonClick()\"\n      (keydown.space)=\"onButtonClick(); $event.preventDefault()\">\n      {{ buttonText }}\n    </button>\n  </div>\n</div>\n","/**\n * CometChatCollaborativeWhiteboardBubble Component\n *\n * Public API exports for the collaborative whiteboard message bubble component.\n *\n * @see Requirements 10.2, 10.5\n */\n\nexport { CometChatCollaborativeWhiteboardBubbleComponent } from './cometchat-collaborative-whiteboard-bubble.component';\n","/**\n * CometChatAudioBubble Component\n *\n * Public API exports for the audio message bubble component.\n *\n * Related types (exported from modals):\n * - AudioAttachment: Interface for audio attachment data\n * - AudioState: Interface for audio player state\n *\n * @see Requirements 14.1, 14.2\n */\n\nexport {\n  CometChatAudioBubbleComponent,\n  currentAudioPlayer,\n  closeCurrentMediaPlayer,\n} from './cometchat-audio-bubble.component';\nexport type { AudioAttachment, AudioState } from '../../modals/AudioAttachment';\n","/**\n * Types and utilities for CometChatCallBubble component.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * Possible call status values from CometChat.Call.getStatus().\n * @see Requirements 1.4\n */\nexport type CallBubbleStatus =\n  | 'initiated'\n  | 'ongoing'\n  | 'ended'\n  | 'missed'\n  | 'cancelled'\n  | 'rejected'\n  | 'busy'\n  | 'unanswered';\n\n/**\n * Event emitted when the action button is clicked.\n * @see Requirements 12.2, 12.3\n */\nexport interface CallButtonClickEvent {\n  /** The session ID of the call */\n  sessionId: string;\n  /** The call message object */\n  message: CometChat.Call;\n}\n\n/** All valid call statuses for normalization */\nexport const VALID_CALL_STATUSES: CallBubbleStatus[] = [\n  'initiated',\n  'ongoing',\n  'ended',\n  'missed',\n  'cancelled',\n  'rejected',\n  'busy',\n  'unanswered',\n];\n\n/** Statuses that indicate a missed/failed incoming call */\nexport const MISSED_CALL_STATUSES: CallBubbleStatus[] = [\n  'unanswered',\n  'missed',\n  'cancelled',\n  'rejected',\n  'busy',\n];\n\n/** Month names for date formatting */\nexport const MONTH_NAMES = [\n  'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n  'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n];\n\n/**\n * Normalizes the raw call status to a valid CallBubbleStatus value.\n */\nexport function normalizeCallStatus(rawStatus: string | undefined | null): CallBubbleStatus {\n  if (!rawStatus) return 'ended';\n  const normalized = rawStatus.toLowerCase() as CallBubbleStatus;\n  return VALID_CALL_STATUSES.includes(normalized) ? normalized : 'ended';\n}\n\n/**\n * Formats the call timestamp as a readable date/time string.\n * Format: \"DD MMM, hh:mm A\" (e.g., \"28 Feb, 01:15 PM\")\n */\nexport function formatCallDateTime(timestamp: number): string {\n  const timestampMs = timestamp > 9999999999 ? timestamp : timestamp * 1000;\n  const date = new Date(timestampMs);\n\n  const day = date.getDate();\n  const month = MONTH_NAMES[date.getMonth()];\n\n  let hours = date.getHours();\n  const minutes = date.getMinutes().toString().padStart(2, '0');\n  const ampm = hours >= 12 ? 'PM' : 'AM';\n  hours = hours % 12;\n  hours = hours ? hours : 12;\n  const hoursStr = hours.toString().padStart(2, '0');\n\n  return `${day} ${month}, ${hoursStr}:${minutes} ${ampm}`;\n}\n\n/**\n * Formats call duration in human-readable format.\n * - Duration < 1 hour: \"M:SS\"\n * - Duration >= 1 hour: \"H:MM:SS\"\n * - Invalid inputs: \"0:00\"\n * @see Requirements 11.1, 11.2, 11.4\n */\nexport function formatCallDuration(durationInSeconds: number): string {\n  if (!durationInSeconds || durationInSeconds < 0 || !isFinite(durationInSeconds)) {\n    return '0:00';\n  }\n\n  const totalSeconds = Math.floor(durationInSeconds);\n  const hours = Math.floor(totalSeconds / 3600);\n  const minutes = Math.floor((totalSeconds % 3600) / 60);\n  const seconds = totalSeconds % 60;\n\n  if (hours > 0) {\n    return `${hours}:${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}`;\n  }\n  return `${minutes}:${seconds.toString().padStart(2, '0')}`;\n}\n","/**\n * CometChatCallBubble Component\n *\n * A standalone component for rendering call messages within the chat interface.\n * This component displays call information including call type (audio/video),\n * call status, duration, and an optional action button.\n *\n * Features:\n * - Call type icon display (audio/video, incoming/outgoing)\n * - Call title (Voice Call / Video Call)\n * - Call subtitle (duration or status)\n * - Optional action button (e.g., \"Call Back\")\n * - Sender/receiver styling variants\n * - Full accessibility support\n * - CSS variable-based theming\n *\n * @module components/cometchat-call-bubble\n * @see Requirements 10.1\n */\n\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport {\n  CallBubbleStatus,\n  CallButtonClickEvent,\n  MISSED_CALL_STATUSES,\n  VALID_CALL_STATUSES,\n  normalizeCallStatus,\n  formatCallDateTime,\n  formatCallDuration,\n} from './cometchat-call-bubble.types';\n\nexport type { CallBubbleStatus, CallButtonClickEvent };\n\n/**\n * CometChatCallBubble renders call messages with sender/receiver styling variants.\n * @see Requirements 10.1, 10.7\n */\n@Component({\n  selector: 'cometchat-call-bubble',\n  standalone: true,\n  templateUrl: './cometchat-call-bubble.component.html',\n  styleUrls: ['./cometchat-call-bubble.component.css'],\n  imports: [CommonModule],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCallBubbleComponent implements OnInit, OnChanges {\n  /** The CometChat.Call message object. @see Requirements 1.1 */\n  @Input() message!: CometChat.Call;\n\n  /** Determines sender (right) or receiver (left) styling. @see Requirements 1.2, 6.1 */\n  @Input() alignment: 'left' | 'right' = 'left';\n\n  /** Optional custom icon URL override. @see Requirements 13.1 */\n  @Input() iconUrl?: string;\n\n  /** Optional custom title override. @see Requirements 13.2 */\n  @Input() title?: string;\n\n  /** Optional custom subtitle override. @see Requirements 13.3 */\n  @Input() subtitle?: string;\n\n  /** Optional button text. If provided and non-empty, the button is displayed. @see Requirements 5.2, 13.4 */\n  @Input() buttonText?: string;\n\n  /** When true, disables all interactive elements. @default false */\n  @Input() disableInteraction = false;\n\n  /** Emitted when the action button is clicked. @see Requirements 5.11, 12.1-12.3 */\n  @Output() buttonClick = new EventEmitter<CallButtonClickEvent>();\n\n  // ============================================\n  // Computed State\n  // ============================================\n\n  /** The type of call: 'audio' or 'video' */\n  protected callType: 'audio' | 'video' = 'audio';\n\n  /** The status of the call */\n  protected callStatus: CallBubbleStatus = 'ended';\n\n  /** Whether the call is outgoing (sender) */\n  protected isOutgoing = false;\n\n  /** The session ID of the call */\n  protected sessionId = '';\n\n  /** The computed icon URL based on call type and direction */\n  protected computedIconUrl = '';\n\n  /** The computed title based on call type */\n  protected computedTitle = '';\n\n  /** The computed subtitle based on status/duration */\n  protected computedSubtitle = '';\n\n  /** Whether to show the action button */\n  protected showButton = false;\n\n  // ============================================\n  // Lifecycle Hooks\n  // ============================================\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] || changes['alignment']) {\n      this.processMessage();\n    }\n    // Handle changes to override inputs (iconUrl, title, subtitle)\n    // Re-compute display values when these inputs change\n    // @see Requirements 13.5, 13.6\n    if (changes['iconUrl'] || changes['title'] || changes['subtitle']) {\n      this.updateOverrideValues();\n    }\n    if (changes['buttonText']) {\n      this.updateButtonVisibility();\n    }\n  }\n\n  // ============================================\n  // Private Methods\n  // ============================================\n\n  /**\n   * Processes the message and computes display values.\n   * Handles null/undefined message gracefully by setting fallback state.\n   *\n   * @see Requirements 1.8\n   */\n  private processMessage(): void {\n    if (!this.message) {\n      CometChatLogger.warn('CometChatCallBubble', 'Message is null or undefined');\n      this.setFallbackState();\n      return;\n    }\n\n    try {\n      this.extractCallData();\n    } catch (error) {\n      CometChatLogger.error('CometChatCallBubble', 'Error processing message:', error);\n      this.setFallbackState();\n    }\n\n    this.isOutgoing = this.alignment === 'right';\n    this.updateButtonVisibility();\n  }\n\n  /**\n   * Extracts call data from the message object with safe fallbacks.\n   * Uses optional chaining to handle missing getter methods gracefully.\n   *\n   * @see Requirements 1.3, 1.4, 1.5, 1.6, 1.8\n   */\n  private extractCallData(): void {\n    // Safe extraction with fallbacks for missing methods\n    // Cast message to any to safely access methods that may not be in type definitions\n    const callMessage = this.message as CometChat.Call & {\n      getDuration?: () => number;\n      getCustomData?: () => Record<string, any>;\n    };\n\n    // Extract call type: 'audio' or 'video'\n    // For group meeting messages (CometChat.CustomMessage), getType() returns 'meeting'\n    // and the actual call type is in customData.callType\n    let rawType = callMessage.getType?.();\n    if (rawType === 'meeting' && typeof callMessage.getCustomData === 'function') {\n      const customData = callMessage.getCustomData();\n      if (customData?.['callType']) {\n        rawType = customData['callType'];\n      }\n    }\n    this.callType = (rawType === 'video' ? 'video' : 'audio') as 'audio' | 'video';\n\n    // Extract call status with fallback to 'ended'\n    const rawStatus = callMessage.getStatus?.();\n    this.callStatus = this.normalizeCallStatus(rawStatus);\n\n    // Extract session ID — for meeting (CustomMessage) messages, the session ID\n    // is stored in customData rather than on the message object itself\n    if (rawType === 'meeting' && typeof callMessage.getCustomData === 'function') {\n      const customData = callMessage.getCustomData();\n      this.sessionId = customData?.['sessionID'] || customData?.['sessionId'] || '';\n    }\n    if (!this.sessionId) {\n      this.sessionId = callMessage.getSessionId?.() || '';\n    }\n\n    // Extract duration for ended calls\n    // Note: getDuration may not be available in all SDK versions\n    const duration =\n      typeof callMessage.getDuration === 'function' ? callMessage.getDuration() || 0 : 0;\n\n    // Compute display values based on extracted data\n    this.computeDisplayValues(duration);\n  }\n\n  /**\n   * Normalizes the raw call status to a valid CallBubbleStatus value.\n   */\n  private normalizeCallStatus(rawStatus: string | undefined | null): CallBubbleStatus {\n    return normalizeCallStatus(rawStatus);\n  }\n\n  /**\n   * Computes display values (icon URL, title, subtitle) based on extracted call data.\n   * Uses custom input values if provided, otherwise derives from message data.\n   *\n   * @param duration - The call duration in seconds\n   */\n  private computeDisplayValues(duration: number): void {\n    // Compute icon URL (use custom if provided, else derive from call data)\n    this.computedIconUrl = this.iconUrl ?? this.getCallIconUrl();\n\n    // Compute title (use custom if provided, else derive from call type)\n    this.computedTitle = this.title ?? this.getCallTitle();\n\n    // Compute subtitle (use custom if provided, else derive from status/duration)\n    this.computedSubtitle = this.subtitle ?? this.getCallSubtitle(duration);\n  }\n\n  /**\n   * Generates the call title based on call type.\n   * Returns \"Voice Call\" for audio calls and \"Video Call\" for video calls.\n   * Uses localization keys for internationalization support.\n   *\n   * @returns The localized call title string\n   * @see Requirements 3.2, 3.3\n   */\n  private getCallTitle(): string {\n    return this.callType === 'audio'\n      ? CometChatLocalize.getLocalizedString('message_list_voice_call')\n      : CometChatLocalize.getLocalizedString('message_list_video_call');\n  }\n\n  /**\n   * Gets the appropriate icon URL based on call type, status, and direction.\n   * @see Requirements 2.2, 2.3, 2.4, 2.5\n   */\n  private getCallIconUrl(): string {\n    const isMissed = MISSED_CALL_STATUSES.includes(this.callStatus);\n\n    if (isMissed && !this.isOutgoing) {\n      return this.callType === 'audio'\n        ? 'assets/conversations_incoming-voice-call.svg'\n        : 'assets/conversations_incoming-video-call.svg';\n    }\n\n    return this.callType === 'audio'\n      ? 'assets/conversations_outgoing-voice-call.svg'\n      : 'assets/conversations_outgoing-video-call.svg';\n  }\n\n  /**\n   * Generates the call subtitle based on the message timestamp.\n   * @see Requirements 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 11.3\n   */\n  private getCallSubtitle(_duration: number): string {\n    const sentAt = this.message?.getSentAt?.();\n    if (sentAt) {\n      return formatCallDateTime(sentAt);\n    }\n    return CometChatLocalize.getLocalizedString('message_list_ended_call');\n  }\n\n  /**\n   * Formats call duration in human-readable format.\n   * @see Requirements 11.1, 11.2, 11.4\n   */\n  private formatDuration(durationInSeconds: number): string {\n    return formatCallDuration(durationInSeconds);\n  }\n\n  /**\n   * Sets fallback state when message is invalid or processing fails.\n   * Provides safe default values for all computed properties.\n   * This ensures the component renders gracefully even with null/undefined/malformed input.\n   *\n   * @see Requirements 1.8\n   */\n  private setFallbackState(): void {\n    this.callType = 'audio';\n    this.callStatus = 'ended';\n    this.sessionId = '';\n    this.isOutgoing = this.alignment === 'right';\n    // Use outgoing audio icon as default fallback\n    this.computedIconUrl = 'assets/conversations_outgoing-voice-call.svg';\n    // Use localized voice call title as fallback\n    this.computedTitle = CometChatLocalize.getLocalizedString('message_list_voice_call');\n    // Use localized \"Call Ended\" as fallback subtitle\n    this.computedSubtitle = CometChatLocalize.getLocalizedString('message_list_ended_call');\n    // Hide button in fallback state since we don't have valid session data\n    this.showButton = false;\n  }\n\n  /**\n   * Updates the button visibility based on buttonText.\n   */\n  private updateButtonVisibility(): void {\n    this.showButton =\n      this.buttonText !== undefined &&\n      this.buttonText !== null &&\n      this.buttonText.trim().length > 0;\n  }\n\n  /**\n   * Updates computed values when override inputs (iconUrl, title, subtitle) change.\n   * Uses custom input values if provided, otherwise derives from message data.\n   *\n   * @see Requirements 13.1, 13.2, 13.3, 13.5, 13.6\n   */\n  private updateOverrideValues(): void {\n    // Only update if we have a valid message to derive fallback values from\n    if (!this.message) {\n      return;\n    }\n\n    // Extract duration for subtitle computation\n    const callMessage = this.message as CometChat.Call & {\n      getDuration?: () => number;\n    };\n    const duration =\n      typeof callMessage.getDuration === 'function' ? callMessage.getDuration() || 0 : 0;\n\n    // Update icon URL (use custom if provided, else derive from call data)\n    this.computedIconUrl = this.iconUrl ?? this.getCallIconUrl();\n\n    // Update title (use custom if provided, else derive from call type)\n    this.computedTitle = this.title ?? this.getCallTitle();\n\n    // Update subtitle (use custom if provided, else derive from status/duration)\n    this.computedSubtitle = this.subtitle ?? this.getCallSubtitle(duration);\n  }\n\n  // ============================================\n  // Event Handlers\n  // ============================================\n\n  /**\n   * Handles the action button click.\n   * Emits the buttonClick event with session ID and message.\n   *\n   * @see Requirements 5.11, 12.1, 12.2, 12.3\n   */\n  onButtonClick(): void {\n    this.buttonClick.emit({\n      sessionId: this.sessionId,\n      message: this.message,\n    });\n  }\n\n  // ============================================\n  // Accessibility\n  // ============================================\n\n  /**\n   * Returns the aria-label for the call bubble.\n   *\n   * @see Requirements 7.1\n   */\n  getAriaLabel(): string {\n    return `${this.computedTitle} - ${this.computedSubtitle || this.callStatus}`;\n  }\n}\n","<!--\n  CometChatCallBubble Template\n\n  Renders call messages with call type icon, title, subtitle, and optional action button.\n  Supports sender/receiver styling variants.\n\n  @see Requirements 2.1, 3.1, 4.1, 5.1\n-->\n\n<div \n  class=\"cometchat-call-bubble\"\n  [class.cometchat-call-bubble--sender]=\"isOutgoing\"\n  [class.cometchat-call-bubble--receiver]=\"!isOutgoing\"\n  [attr.aria-label]=\"getAriaLabel()\"\n  role=\"article\">\n  \n  <!-- Body Section -->\n  <div class=\"cometchat-call-bubble__body\">\n    <!-- Icon Container -->\n    <div class=\"cometchat-call-bubble__icon-wrapper\">\n      <div\n        class=\"cometchat-call-bubble__icon\"\n        [style.mask]=\"'url(' + computedIconUrl + ') center center no-repeat'\"\n        [style.-webkit-mask]=\"'url(' + computedIconUrl + ') center center no-repeat'\"\n        [style.mask-size]=\"'contain'\"\n        [style.-webkit-mask-size]=\"'contain'\"\n        aria-hidden=\"true\">\n      </div>\n    </div>\n    \n    <!-- Content -->\n    <div class=\"cometchat-call-bubble__content\">\n      <!-- Title -->\n      <div class=\"cometchat-call-bubble__title\">\n        {{ computedTitle }}\n      </div>\n      \n      <!-- Subtitle -->\n      <div class=\"cometchat-call-bubble__subtitle\">\n        {{ computedSubtitle }}\n      </div>\n    </div>\n  </div>\n  \n  <!-- Action Button (Optional) -->\n  @if (showButton && buttonText && !disableInteraction) {\n    <button \n      class=\"cometchat-call-bubble__button\"\n      (click)=\"onButtonClick()\"\n      (keydown.enter)=\"onButtonClick()\"\n      (keydown.space)=\"onButtonClick(); $event.preventDefault()\"\n      [attr.aria-label]=\"buttonText\"\n      type=\"button\">\n      {{ buttonText }}\n    </button>\n  }\n</div>\n","/**\n * CometChatCallBubble Public API\n *\n * Exports the CometChatCallBubble component for use in other modules.\n *\n * @module components/cometchat-call-bubble\n * @see Requirements 10.1\n */\n\nexport { CometChatCallBubbleComponent } from './cometchat-call-bubble.component';\nexport type { CallButtonClickEvent, CallBubbleStatus } from './cometchat-call-bubble.component';\n","/**\n * CometChatDeleteBubble Component\n *\n * A standalone component for rendering deleted message placeholders within the chat interface.\n * This component displays a simple indicator that a message has been deleted.\n *\n * Features:\n * - Delete icon display\n * - Localized \"This message was deleted\" text (or custom text)\n * - Sender/receiver styling variants\n * - Full accessibility support\n * - CSS variable-based theming\n *\n * @module components/cometchat-delete-bubble\n * @see Requirements 9.1, 9.5\n */\n\nimport { Component, Input, ChangeDetectionStrategy } from '@angular/core';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * CometChatDeleteBubble is a standalone Angular component that renders\n * deleted message placeholders with sender/receiver styling variants.\n *\n * This is a purely presentational component with no internal state.\n * It does NOT accept a CometChat message object - only simple inputs.\n *\n * @example\n * ```html\n * <!-- Receiver variant (default) -->\n * <cometchat-delete-bubble></cometchat-delete-bubble>\n *\n * <!-- Sender variant -->\n * <cometchat-delete-bubble [isSentByMe]=\"true\"></cometchat-delete-bubble>\n *\n * <!-- Custom text -->\n * <cometchat-delete-bubble [text]=\"'Message removed'\"></cometchat-delete-bubble>\n * ```\n *\n * @see Requirements 1.1 - THE Delete_Bubble SHALL accept an isSentByMe boolean input\n * @see Requirements 1.2 - THE Delete_Bubble SHALL accept an optional text string input\n * @see Requirements 9.1 - THE Delete_Bubble SHALL be a standalone Angular component\n */\n@Component({\n  selector: 'cometchat-delete-bubble',\n  standalone: true,\n  templateUrl: './cometchat-delete-bubble.component.html',\n  styleUrls: ['./cometchat-delete-bubble.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatDeleteBubbleComponent {\n  /**\n   * Determines sender (outgoing) or receiver (incoming) styling.\n   * When true, applies primary color background with white text/icon.\n   * When false, applies neutral background with neutral text/icon.\n   *\n   * @see Requirements 1.1, 1.3, 1.4\n   */\n  @Input() isSentByMe = false;\n\n  /**\n   * Optional custom text to display instead of the default localized text.\n   * If not provided, uses the \"message_deleted\" localization key.\n   *\n   * @see Requirements 1.2, 1.5, 1.6\n   */\n  @Input() text?: string;\n\n  /**\n   * Returns the text to display - either custom text or localized default.\n   * Falls back to localized \"message_deleted\" text when text is undefined,\n   * null, or empty string.\n   *\n   * @see Requirements 1.5, 1.6, 7.1, 7.2, 7.4\n   */\n  get displayText(): string {\n    if (this.text !== undefined && this.text !== null && this.text.length > 0) {\n      return this.text;\n    }\n    return CometChatLocalize.getLocalizedString('message_deleted');\n  }\n\n  /**\n   * Returns the CSS class modifier based on isSentByMe.\n   * Used for applying sender or receiver styling.\n   *\n   * @see Requirements 1.3, 1.4, 3.1, 4.1\n   */\n  get variantClass(): string {\n    return this.isSentByMe\n      ? 'cometchat-delete-bubble--sender'\n      : 'cometchat-delete-bubble--receiver';\n  }\n}\n","<!--\n  CometChatDeleteBubble Template\n\n  Renders deleted message placeholders with sender/receiver styling variants.\n  The component always renders (unlike action bubble which conditionally renders).\n\n  @see Requirements 2.1, 2.2, 2.3, 8.1, 8.2, 8.4\n-->\n\n<div \n  class=\"cometchat-delete-bubble\"\n  [class.cometchat-delete-bubble--sender]=\"isSentByMe\"\n  [class.cometchat-delete-bubble--receiver]=\"!isSentByMe\"\n  role=\"status\"\n  [attr.aria-label]=\"displayText\">\n  \n  <!-- Body Container -->\n  <div class=\"cometchat-delete-bubble__body\">\n    <!-- Delete Icon -->\n    <div \n      class=\"cometchat-delete-bubble__icon\"\n      aria-hidden=\"true\">\n    </div>\n    \n    <!-- Deleted Message Text -->\n    <span class=\"cometchat-delete-bubble__text\">\n      {{ displayText }}\n    </span>\n  </div>\n</div>\n","/**\n * CometChatDeleteBubble Public API\n *\n * Exports the CometChatDeleteBubble component for use in other modules.\n *\n * @module components/cometchat-delete-bubble\n * @see Requirements 9.1\n */\n\nexport { CometChatDeleteBubbleComponent } from './cometchat-delete-bubble.component';\n","/**\n * Types, interfaces, and constants for CometChatPollBubble component.\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Constants for accessing poll data from message metadata.\n * Poll data is stored at the path `@injected.extensions.polls`.\n */\nexport const POLLS_CONSTANTS = {\n  INJECTED_KEY: '@injected',\n  EXTENSION_KEY: 'extensions',\n  POLLS_KEY: 'polls',\n};\n\n// ============================================================================\n// Poll Data Interfaces\n// ============================================================================\n\n/** Voter information for a poll option. */\nexport interface VoterInfo {\n  name: string;\n  avatar?: string;\n}\n\n/** Vote result for a single poll option. */\nexport interface PollOptionResult {\n  count: number;\n  voters: Record<string, VoterInfo>;\n}\n\n/** Complete poll results including total votes and per-option results. */\nexport interface PollResults {\n  total: number;\n  options: Record<string, PollOptionResult>;\n}\n\n/** Complete poll data extracted from message metadata. */\nexport interface PollData {\n  id: string | number;\n  question: string;\n  options: Record<string, string>;\n  results: PollResults;\n}\n\n/** Processed poll option ready for display in the poll bubble. */\nexport interface PollBubbleOption {\n  id: string;\n  text: string;\n  count: number;\n  percent: string;\n  selectedByLoggedInUser: boolean;\n  voters: VoterInfo[];\n}\n\n// ============================================================================\n// Event Interfaces\n// ============================================================================\n\n/** Event emitted when a vote is successfully submitted. */\nexport interface PollVoteEvent {\n  pollId: string | number;\n  optionId: string;\n  optionText: string;\n  message: CometChat.CustomMessage;\n}\n\n/** Event emitted when vote submission fails. */\nexport interface PollVoteErrorEvent {\n  pollId: string | number;\n  optionId: string;\n  error: Error;\n  message: CometChat.CustomMessage;\n}\n","/**\n * CometChatPollBubbleComponent\n *\n * Renders poll messages with voting functionality within chat conversations.\n * Extracts poll data from CometChat CustomMessage metadata and displays\n * the poll question, options with radio buttons, vote counts, progress bars,\n * and voter avatars.\n *\n * @module components/cometchat-poll-bubble\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatRadioButtonComponent } from '../base-elements/cometchat-radio-button/cometchat-radio-button.component';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\n\n// Re-export types for backward compatibility\nexport type {\n  VoterInfo,\n  PollOptionResult,\n  PollResults,\n  PollData,\n  PollBubbleOption,\n  PollVoteEvent,\n  PollVoteErrorEvent,\n} from './cometchat-poll-bubble.types';\n\nimport {\n  POLLS_CONSTANTS,\n  PollData,\n  PollBubbleOption,\n  PollVoteEvent,\n  PollVoteErrorEvent,\n  VoterInfo,\n} from './cometchat-poll-bubble.types';\n\n@Component({\n  selector: 'cometchat-poll-bubble',\n  standalone: true,\n  templateUrl: './cometchat-poll-bubble.component.html',\n  styleUrls: ['./cometchat-poll-bubble.component.css'],\n  imports: [CommonModule, TranslatePipe, CometChatRadioButtonComponent, CometChatAvatarComponent],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatPollBubbleComponent implements OnInit, OnChanges {\n  /** The CometChat CustomMessage containing poll data in its metadata. */\n  @Input({ required: true }) message!: CometChat.CustomMessage;\n\n  /** Visual styling variant: LEFT = receiver, RIGHT = sender. */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** The currently logged-in user (used to determine selected options). */\n  @Input() loggedInUser?: CometChat.User;\n\n  /** When true, disables all interactive elements (voting). */\n  @Input() disableInteraction = false;\n\n  /** Emitted when a vote is successfully submitted. */\n  @Output() voteSubmit = new EventEmitter<PollVoteEvent>();\n\n  /** Emitted when vote submission fails. */\n  @Output() voteError = new EventEmitter<PollVoteErrorEvent>();\n\n  /** Emitted after successful vote submission with updated poll data. */\n  @Output() voteUpdate = new EventEmitter<PollData>();\n\n  // ============================================================================\n  // Internal State\n  // ============================================================================\n\n  protected pollData: PollData | null = null;\n  protected pollOptions: PollBubbleOption[] = [];\n  protected isVoting = false;\n  protected isOutgoing = false;\n\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  constructor(private cdr: ChangeDetectorRef) {}\n\n  ngOnInit(): void {\n    this.processMessage();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message']) {\n      this.processMessage();\n    }\n    if (changes['alignment']) {\n      this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n      this.cdr.markForCheck();\n    }\n    if (changes['loggedInUser'] && this.pollData) {\n      this.processPollOptions();\n      this.cdr.markForCheck();\n    }\n  }\n\n  // ============================================================================\n  // Private Methods\n  // ============================================================================\n\n  private processMessage(): void {\n    this.isOutgoing = this.alignment === MessageBubbleAlignment.right;\n    this.extractPollData();\n    this.cdr.markForCheck();\n  }\n\n  private extractPollData(): void {\n    try {\n      if (!this.message) {\n      CometChatLogger.warn('CometChatPollBubble', 'Message is null or undefined');\n        this.pollData = null;\n        this.pollOptions = [];\n        return;\n      }\n\n      const metadata = this.message.getMetadata() as Record<string, any> | null;\n      if (!metadata) {\n        this.pollData = null;\n        this.pollOptions = [];\n        return;\n      }\n\n      const injected = metadata[POLLS_CONSTANTS.INJECTED_KEY];\n      const extensions = injected?.[POLLS_CONSTANTS.EXTENSION_KEY];\n      const pollsData = extensions?.[POLLS_CONSTANTS.POLLS_KEY];\n\n      if (!pollsData) {\n        this.pollData = null;\n        this.pollOptions = [];\n        return;\n      }\n\n      this.pollData = {\n        id: pollsData.id || this.message.getId(),\n        question: pollsData.question || '',\n        options: pollsData.options || {},\n        results: pollsData.results || { total: 0, options: {} },\n      };\n\n      this.processPollOptions();\n    } catch (error) {\n      CometChatLogger.error('CometChatPollBubble', 'Error extracting poll data:', error);\n      this.pollData = null;\n      this.pollOptions = [];\n    }\n  }\n\n  private updateVoteOptimistically(selectedOption: PollBubbleOption): void {\n    if (!this.pollData) return;\n    const loggedInUserUid = this.loggedInUser?.getUid();\n    if (!loggedInUserUid) return;\n\n    const previouslySelectedOption = this.pollOptions.find(opt => opt.selectedByLoggedInUser);\n    const newResults = { ...this.pollData.results, options: { ...this.pollData.results.options } };\n\n    if (previouslySelectedOption && previouslySelectedOption.id !== selectedOption.id) {\n      const prev = newResults.options[previouslySelectedOption.id];\n      if (prev) {\n        newResults.options[previouslySelectedOption.id] = {\n          ...prev,\n          count: Math.max(0, prev.count - 1),\n          voters: { ...prev.voters },\n        };\n        delete newResults.options[previouslySelectedOption.id].voters[loggedInUserUid];\n      }\n      newResults.total = Math.max(0, newResults.total - 1);\n    }\n\n    if (!selectedOption.selectedByLoggedInUser) {\n      const sel = newResults.options[selectedOption.id] || { count: 0, voters: {} };\n      newResults.options[selectedOption.id] = {\n        ...sel,\n        count: sel.count + 1,\n        voters: {\n          ...sel.voters,\n          [loggedInUserUid]: {\n            name: this.loggedInUser?.getName() || '',\n            avatar: this.loggedInUser?.getAvatar(),\n          } as VoterInfo,\n        },\n      };\n      newResults.total = newResults.total + 1;\n    }\n\n    this.pollData = { ...this.pollData, results: newResults };\n    this.processPollOptions();\n  }\n\n  private processPollOptions(): void {\n    if (!this.pollData) {\n      this.pollOptions = [];\n      return;\n    }\n\n    const totalVotes = this.pollData.results?.total || 0;\n    const loggedInUserUid = this.loggedInUser?.getUid();\n\n    this.pollOptions = Object.keys(this.pollData.options || {}).map(optionId => {\n      const optionResult = this.pollData!.results?.options?.[optionId];\n      const voteCount = optionResult?.count || 0;\n      const percentage = totalVotes > 0 ? Math.round((voteCount / totalVotes) * 100) : 0;\n      const selectedByLoggedInUser = loggedInUserUid\n        ? optionResult?.voters?.hasOwnProperty(loggedInUserUid) || false\n        : false;\n      const voters = optionResult?.voters ? Object.values(optionResult.voters).slice(0, 3) : [];\n\n      return {\n        id: optionId,\n        text: this.pollData!.options[optionId],\n        count: voteCount,\n        percent: `${percentage}%`,\n        selectedByLoggedInUser,\n        voters,\n      };\n    });\n  }\n\n  // ============================================================================\n  // Protected Methods (Template Event Handlers)\n  // ============================================================================\n\n  protected async onOptionClick(option: PollBubbleOption): Promise<void> {\n    if (this.disableInteraction || this.isVoting || !this.pollData) return;\n\n    this.isVoting = true;\n    const previousPollData = { ...this.pollData };\n    const previousOptions = [...this.pollOptions];\n\n    this.updateVoteOptimistically(option);\n    this.cdr.markForCheck();\n\n    try {\n      await CometChat.callExtension('polls', 'POST', 'v2/vote', {\n        vote: option.id,\n        id: this.pollData.id,\n      });\n\n      this.voteSubmit.emit({\n        pollId: this.pollData.id,\n        optionId: option.id,\n        optionText: option.text,\n        message: this.message,\n      });\n\n      if (this.pollData) this.voteUpdate.emit(this.pollData);\n\n      // Announce confirmation plus the updated tally (count + percent) so screen\n      // reader users hear the new result, not just that a vote was recorded.\n      const updatedOption = this.pollOptions.find(o => o.id === option.id) ?? option;\n      this.liveAnnouncer.announce(\n        CometChatLocalize.getLocalizedString('accessibility_vote_submitted')\n          .replace('{option}', option.text)\n          + ' ' + this.getOptionAriaLabel(updatedOption),\n        'polite'\n      );\n    } catch (error) {\n      CometChatLogger.error('CometChatPollBubble', 'Vote submission failed:', error);\n      this.pollData = previousPollData;\n      this.pollOptions = previousOptions;\n      this.cdr.markForCheck();\n\n      this.voteError.emit({\n        pollId: this.pollData.id,\n        optionId: option.id,\n        error: error instanceof Error ? error : new Error(String(error)),\n        message: this.message,\n      });\n    } finally {\n      this.isVoting = false;\n      this.cdr.markForCheck();\n    }\n  }\n\n  // ============================================================================\n  // Accessibility Methods\n  // ============================================================================\n\n  protected onOptionKeyDown(event: KeyboardEvent, option: PollBubbleOption): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onOptionClick(option);\n    }\n  }\n\n  protected get pollAriaLabel(): string {\n    return CometChatLocalize.getLocalizedString('accessibility_poll_question')\n      .replace('{question}', this.pollData?.question || '');\n  }\n\n  protected get optionRole(): string {\n    return 'radio';\n  }\n\n  protected getOptionAriaChecked(option: PollBubbleOption): string {\n    return option.selectedByLoggedInUser ? 'true' : 'false';\n  }\n\n  protected get optionsAriaDisabled(): string | null {\n    return this.isVoting ? 'true' : null;\n  }\n\n  protected getOptionAriaLabel(option: PollBubbleOption): string {\n    const votesLabel = CometChatLocalize.getLocalizedString(\n      option.count === 1 ? 'poll_bubble_vote' : 'poll_bubble_votes'\n    );\n    return `${option.text}, ${option.count} ${votesLabel}, ${option.percent}`;\n  }\n}\n","<!-- \n  CometChatPollBubbleComponent Template\n  \n  Renders poll messages with voting functionality.\n  \n  @see Requirements 2.1, 3.1, 4.1, 5.1, 11.1-11.7\n-->\n\n<div \n  class=\"cometchat-poll-bubble\"\n  [class.cometchat-poll-bubble--sender]=\"isOutgoing\"\n  [class.cometchat-poll-bubble--receiver]=\"!isOutgoing\"\n  role=\"group\"\n  [attr.aria-label]=\"pollAriaLabel\">\n  \n  <!-- Poll Question -->\n  <!-- @see Requirements 2.1, 2.3, 2.4 -->\n  <div class=\"cometchat-poll-bubble__question\">\n    {{ pollData?.question }}\n  </div>\n  \n  <!-- Poll Options List -->\n  <!-- @see Requirements 3.1, 3.2, 3.3, 3.4, 8.1, 11.1-11.7 -->\n  <ul \n    class=\"cometchat-poll-bubble__options\"\n    role=\"radiogroup\"\n    [attr.aria-label]=\"'poll_bubble_options_label' | translate\">\n    \n    @for (option of pollOptions; track option.id) {\n      <li \n        class=\"cometchat-poll-bubble__option-item\"\n        [class.cometchat-poll-bubble__option-item--selected]=\"option.selectedByLoggedInUser\"\n        [class.cometchat-poll-bubble__option-item--disabled]=\"isVoting\"\n        (click)=\"onOptionClick(option)\"\n        (keydown)=\"onOptionKeyDown($event, option)\"\n        [class.cometchat-poll-bubble__option-item--disabled-interaction]=\"disableInteraction\"\n        [tabindex]=\"disableInteraction ? -1 : 0\"\n        [attr.role]=\"optionRole\"\n        [attr.aria-checked]=\"getOptionAriaChecked(option)\"\n        [attr.aria-disabled]=\"disableInteraction ? 'true' : optionsAriaDisabled\"\n        [attr.aria-label]=\"getOptionAriaLabel(option)\">\n        \n        <!-- Leading View: Radio Button -->\n        <!-- @see Requirements 3.2, 3.7 -->\n        <div class=\"cometchat-poll-bubble__option-leading\" aria-hidden=\"true\">\n          <cometchat-radio-button\n            [name]=\"'poll-' + pollData?.id + '-msg-' + message.getId()\"\n            [id]=\"'option-' + pollData?.id + '-msg-' + message.getId() + '-' + option.id\"\n            [checked]=\"option.selectedByLoggedInUser\"\n            [disabled]=\"isVoting\">\n          </cometchat-radio-button>\n        </div>\n        \n        <!-- Body: Option Content -->\n        <div class=\"cometchat-poll-bubble__option-body\">\n          <div class=\"cometchat-poll-bubble__option-content\">\n            <!-- Option Text -->\n            <!-- @see Requirements 3.3 -->\n            <div class=\"cometchat-poll-bubble__option-text\">\n              {{ option.text }}\n            </div>\n            \n            <!-- Tail: Voter Avatars + Vote Count -->\n            <!-- @see Requirements 3.4, 5.1, 5.4, 5.6 -->\n            <div class=\"cometchat-poll-bubble__option-tail\" aria-hidden=\"true\">\n              <!-- Voter Avatars -->\n              @if (option.voters.length > 0) {\n                <div class=\"cometchat-poll-bubble__voter-avatars\">\n                  @for (voter of option.voters; track $index; let isLast = $last) {\n                    <div \n                      class=\"cometchat-poll-bubble__voter-avatar\"\n                      [class.cometchat-poll-bubble__voter-avatar--last]=\"isLast\"\n                      [style.z-index]=\"$index\">\n                      <cometchat-avatar\n                        [name]=\"voter.name\"\n                        [image]=\"voter.avatar || ''\">\n                      </cometchat-avatar>\n                    </div>\n                  }\n                </div>\n              }\n              \n              <!-- Vote Count -->\n              <div class=\"cometchat-poll-bubble__vote-count\">\n                {{ option.count }}\n              </div>\n            </div>\n          </div>\n          \n          <!-- Progress Bar -->\n          <!-- @see Requirements 4.1, 4.2, 8.8 -->\n          <div \n            class=\"cometchat-poll-bubble__progress\"\n            role=\"progressbar\"\n            [attr.aria-valuenow]=\"option.count\"\n            [attr.aria-valuemax]=\"pollData?.results?.total || 0\"\n            [attr.aria-label]=\"option.text + ' ' + option.percent\">\n            <div \n              class=\"cometchat-poll-bubble__progress-fill\"\n              [style.width]=\"option.percent\">\n            </div>\n          </div>\n        </div>\n      </li>\n    }\n  </ul>\n  \n  <!-- Empty State -->\n  <!-- @see Requirements 13.1, 13.2 -->\n  @if (!pollData) {\n    <!-- Display when poll data is missing from the message -->\n    <div class=\"cometchat-poll-bubble__empty\" role=\"status\">\n      {{ 'poll_bubble_no_data' | translate }}\n    </div>\n  } @else if (pollOptions.length === 0) {\n    <!-- Display when poll options are empty -->\n    <div class=\"cometchat-poll-bubble__empty\" role=\"status\">\n      {{ 'poll_bubble_no_options' | translate }}\n    </div>\n  }\n  \n</div>\n","/**\n * CometChatPollBubble Public API\n *\n * Exports the CometChatPollBubble component and related interfaces for use in other modules.\n *\n * @module components/cometchat-poll-bubble\n * @see Requirements 11.1\n */\n\nexport { CometChatPollBubbleComponent } from './cometchat-poll-bubble.component';\n\n// Poll data interfaces\nexport type {\n  PollData,\n  PollResults,\n  PollOptionResult,\n  VoterInfo,\n  PollBubbleOption,\n} from './cometchat-poll-bubble.component';\n\n// Event interfaces\nexport type { PollVoteEvent, PollVoteErrorEvent } from './cometchat-poll-bubble.component';\n","/**\n * CometChatStickerBubble Component\n *\n * A standalone component for rendering sticker messages within the chat interface.\n * Extracts the sticker image URL from the message's metadata or custom data\n * using a priority-based fallback chain and renders it as an image.\n *\n * @module components/cometchat-sticker-bubble\n * @see Requirements 1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3, 2.4, 2.5\n */\n\nimport { Component, Input, ChangeDetectionStrategy, OnChanges, SimpleChanges } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * CometChatStickerBubble is a standalone Angular component that renders\n * sticker messages with incoming/outgoing alignment variants.\n *\n * The sticker URL is extracted from the message using a priority chain:\n * 1. `metadata.data.sticker_url`\n * 2. `metadata.sticker_url`\n * 3. `customData.sticker_url`\n *\n * @example\n * ```html\n * <cometchat-sticker-bubble\n *   [message]=\"stickerMessage\"\n *   [alignment]=\"MessageBubbleAlignment.left\">\n * </cometchat-sticker-bubble>\n * ```\n *\n * @see Requirements 1.1, 1.2, 1.3, 1.4, 2.1, 2.2, 2.3\n */\n@Component({\n  selector: 'cometchat-sticker-bubble',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-sticker-bubble.component.html',\n  styleUrls: ['./cometchat-sticker-bubble.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatStickerBubbleComponent implements OnChanges {\n  /**\n   * The sticker custom message to render.\n   *\n   * @see Requirements 1.2\n   */\n  @Input() message: CometChat.CustomMessage | null = null;\n\n  /**\n   * Bubble alignment — left for incoming, right for outgoing.\n   *\n   * @see Requirements 1.3\n   */\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n\n  /** Enum reference for template binding */\n  MessageBubbleAlignment = MessageBubbleAlignment;\n\n  /** Cached sticker URL, recomputed on message changes */\n  stickerUrl = '';\n\n  /**\n   * Recompute stickerUrl when the message input changes.\n   *\n   * @see Requirements 2.1, 2.2, 2.3, 2.4, 2.5\n   */\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message']) {\n      this.stickerUrl = this.getStickerUrl();\n    }\n  }\n\n  /**\n   * Extracts the sticker image URL from the message using a priority-based\n   * fallback chain:\n   * 1. metadata.data.sticker_url\n   * 2. metadata.sticker_url\n   * 3. customData.sticker_url\n   *\n   * @returns The sticker URL string, or empty string if not found\n   * @see Requirements 2.1, 2.2, 2.3, 2.4, 2.5\n   */\n  getStickerUrl(): string {\n    if (!this.message) {\n      return '';\n    }\n    try {\n      const metadata = (this.message as any).getMetadata?.() as Record<string, any> | null;\n      if (!metadata) {\n        const customData = (this.message as any).getCustomData?.();\n        if (customData?.['sticker_url']) {\n          return customData['sticker_url'];\n        }\n        return '';\n      }\n      if (metadata['data']?.['sticker_url']) {\n        return metadata['data']['sticker_url'];\n      }\n      if (metadata['sticker_url']) {\n        return metadata['sticker_url'];\n      }\n      const customData = (this.message as any).getCustomData?.();\n      if (customData?.['sticker_url']) {\n        return customData['sticker_url'];\n      }\n\n      return '';\n    } catch (error) {\n      CometChatLogger.warn('CometChatStickerBubble', 'Error extracting sticker URL:', error);\n      return '';\n    }\n  }\n}\n","<!--\n  CometChatStickerBubble Template\n\n  Renders sticker messages as images with incoming/outgoing alignment variants.\n  Uses BEM CSS methodology and localized accessibility text.\n\n  @see Requirements 3.1, 3.3, 3.4, 3.5, 3.6, 4.1, 4.2, 4.3\n-->\n\n<div\n  class=\"cometchat-sticker-bubble\"\n  [class.cometchat-sticker-bubble--incoming]=\"alignment === MessageBubbleAlignment.left\"\n  [class.cometchat-sticker-bubble--outgoing]=\"alignment === MessageBubbleAlignment.right\"\n  role=\"img\"\n  [attr.aria-label]=\"'conversation_subtitle_sticker' | translate\">\n  <img\n    *ngIf=\"stickerUrl\"\n    [src]=\"stickerUrl\"\n    alt=\"\"\n    aria-hidden=\"true\"\n    class=\"cometchat-sticker-bubble__image\" />\n</div>\n","/**\n * CometChatStickerBubble Public API\n *\n * Exports the CometChatStickerBubble component for use in other modules.\n *\n * @module components/cometchat-sticker-bubble\n * @see Requirements 1.5\n */\n\nexport { CometChatStickerBubbleComponent } from './cometchat-sticker-bubble.component';\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  HostListener,\n  OnInit,\n  OnDestroy,\n  inject,\n  ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\n\n/**\n * CometChatThreadViewComponent displays thread reply indicators on messages\n * and can also serve as a thread panel container for accessibility.\n *\n * This component supports two modes:\n * 1. Indicator Mode (default): Shows reply count for messages with threaded conversations\n * 2. Panel Mode: Serves as an accessible container for thread content\n *\n * Features:\n * - Displays thread icon alongside reply count\n * - Shows unread indicator when there are unread replies\n * - Supports keyboard navigation (Enter/Space to activate)\n * - Uses localization for reply count text (singular/plural)\n * - Only displays when replyCount > 0 (in indicator mode)\n * - Panel mode: role=\"complementary\", aria-label=\"Thread replies\"\n * - Escape key closes thread and restores focus\n * - Announces thread opened with reply count\n *\n * @example\n * ```html\n * <!-- Indicator Mode -->\n * <cometchat-thread-view\n *   [replyCount]=\"5\"\n *   [unreadReplyCount]=\"2\"\n *   [parentMessage]=\"message\"\n *   (threadClick)=\"onThreadClick($event)\">\n * </cometchat-thread-view>\n *\n * <!-- Panel Mode -->\n * <cometchat-thread-view\n *   [mode]=\"'panel'\"\n *   [replyCount]=\"5\"\n *   [parentMessage]=\"message\"\n *   (closeClick)=\"onCloseThread()\">\n *   <ng-content></ng-content>\n * </cometchat-thread-view>\n * ```\n *\n * @see Requirement 2.1 - Standalone Angular component\n * @see Requirement 2.2 - Display reply count for messages with thread replies\n * @see Requirement 2.3 - Display thread icon alongside reply count\n * @see Requirement 2.5 - Display unread indicator when there are unread replies\n * @see Requirement 13.1 - Implement same keyboard navigation as message list\n * @see Requirement 13.2 - Escape closes thread and restores focus\n * @see Requirement 13.3 - role=\"complementary\" and aria-label=\"Thread replies\"\n * @see Requirement 13.5 - Announce thread opened with reply count\n */\n@Component({\n  selector: 'cometchat-thread-view',\n  standalone: true,\n  imports: [CommonModule],\n  templateUrl: './cometchat-thread-view.component.html',\n  styleUrls: ['./cometchat-thread-view.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatThreadViewComponent implements OnInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  // ==================== Services ====================\n\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private elementRef = inject(ElementRef);\n  // ==================== Inputs ====================\n\n  /**\n   * The mode of the thread view component.\n   * - 'indicator': Shows reply count indicator on messages (default)\n   * - 'panel': Serves as an accessible container for thread content\n   * @see Requirement 13.3\n   */\n  @Input() mode: 'indicator' | 'panel' = 'indicator';\n\n  /**\n   * The number of replies in the thread.\n   * @see Requirement 2.2\n   */\n  @Input() replyCount = 0;\n\n  /**\n   * The number of unread replies in the thread.\n   * @see Requirement 2.5\n   */\n  @Input() unreadReplyCount = 0;\n\n  /**\n   * The parent message for the thread.\n   */\n  @Input() parentMessage?: CometChat.BaseMessage;\n\n  /**\n   * Whether to announce thread opened on init (panel mode only).\n   * @see Requirement 13.5\n   */\n  @Input() announceOnOpen = true;\n\n  // ==================== Outputs ====================\n\n  /**\n   * Emitted when the thread view is clicked (indicator mode).\n   * @see Requirement 2.6\n   */\n  @Output() threadClick = new EventEmitter<CometChat.BaseMessage>();\n\n  /**\n   * Emitted when the thread should be closed (panel mode).\n   * Triggered by Escape key.\n   * @see Requirement 13.2\n   */\n  @Output() closeClick = new EventEmitter<void>();\n\n  // ==================== Private Properties ====================\n\n  /**\n   * Reference to the element that had focus before thread opened.\n   * Used for focus restoration on close.\n   */\n  private previouslyFocusedElement: HTMLElement | null = null;\n\n  // ==================== Public Properties ====================\n\n  /**\n   * URL for the thread icon.\n   * @see Requirement 2.3\n   */\n  readonly threadIconUrl: string = 'assets/conversations_thread.svg';\n\n  // ==================== Lifecycle Hooks ====================\n\n  /**\n   * Initializes the component.\n   * In panel mode, announces thread opened and stores focus reference.\n   * @see Requirement 13.5\n   */\n  ngOnInit(): void {\n    if (this.mode === 'panel') {\n      // Store reference to previously focused element for focus restoration\n      this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n      // Announce thread opened with reply count\n      if (this.announceOnOpen) {\n        this.announceThreadOpened();\n      }\n    }\n  }\n\n  /**\n   * Cleanup on component destruction.\n   */\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.previouslyFocusedElement = null;\n  }\n\n  // ==================== Computed Properties ====================\n\n  /**\n   * Whether the thread view should be displayed.\n   * Only shows when replyCount > 0.\n   * @see Requirement 2.9\n   */\n  get shouldDisplay(): boolean {\n    return this.replyCount > 0;\n  }\n\n  /**\n   * Whether there are unread replies.\n   * @see Requirement 2.5\n   */\n  get hasUnreadReplies(): boolean {\n    return this.unreadReplyCount > 0;\n  }\n\n  /**\n   * The localized reply count text.\n   * Uses singular form for 1 reply, plural for multiple.\n   * @see Requirement 2.7\n   */\n  get replyCountText(): string {\n    const displayCount = this.replyCount > 999 ? '999+' : this.replyCount;\n    if (this.replyCount === 1) {\n      return `${displayCount} ${CometChatLocalize.getLocalizedString('thread_reply')}`;\n    }\n    return `${displayCount} ${CometChatLocalize.getLocalizedString('thread_replies')}`;\n  }\n\n  get ariaLabel(): string {\n    const baseLabel = this.replyCountText;\n    if (this.hasUnreadReplies) {\n      return `${baseLabel}, ${this.unreadReplyCount} unread`;\n    }\n    return baseLabel;\n  }\n\n  /**\n   * Gets the aria-label for panel mode.\n   * @see Requirement 13.3\n   */\n  get panelAriaLabel(): string {\n    return CometChatLocalize.getLocalizedString('accessibility_thread_replies');\n  }\n\n  /**\n   * Whether the component is in panel mode.\n   */\n  get isPanelMode(): boolean {\n    return this.mode === 'panel';\n  }\n\n  /**\n   * Whether the component is in indicator mode.\n   */\n  get isIndicatorMode(): boolean {\n    return this.mode === 'indicator';\n  }\n\n  // ==================== Event Handlers ====================\n\n  /**\n   * Handles click events on the thread view (indicator mode).\n   * @see Requirement 2.4, 2.6\n   */\n  onThreadViewClick(): void {\n    if (this.parentMessage) {\n      this.threadClick.emit(this.parentMessage);\n    }\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * - Indicator mode: Activates on Enter or Space key\n   * - Panel mode: Closes on Escape key\n   * @see Requirement 2.8, 13.2\n   */\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    // Indicator mode: Enter/Space to activate\n    if (this.isIndicatorMode) {\n      if (event.key === 'Enter' || event.key === ' ') {\n        event.preventDefault();\n        this.onThreadViewClick();\n      }\n    }\n\n    // Panel mode: Escape to close thread\n    if (this.isPanelMode && event.key === 'Escape') {\n      event.preventDefault();\n      this.closeThread();\n    }\n  }\n\n  /**\n   * Closes the thread and restores focus to the previously focused element.\n   * @see Requirement 13.2\n   */\n  closeThread(): void {\n    this.closeClick.emit();\n\n    // Restore focus to the previously focused element\n    if (\n      this.previouslyFocusedElement &&\n      typeof this.previouslyFocusedElement.focus === 'function'\n    ) {\n      // Use setTimeout to ensure the DOM has updated before focusing\n      this.pendingTimers.push(setTimeout(() => {\n        this.previouslyFocusedElement?.focus();\n      }, 0));\n    }\n  }\n\n  /**\n   * Announces thread opened with reply count via live region.\n   * @see Requirement 13.5\n   */\n  private announceThreadOpened(): void {\n    const message = CometChatLocalize.getLocalizedString('accessibility_thread_opened').replace(\n      '{count}',\n      this.replyCount.toString()\n    );\n    this.liveAnnouncer.announce(message, 'polite');\n  }\n}\n","<!--\n  Thread View Component\n  \n  Supports two modes:\n  1. Indicator Mode: Shows reply count on messages (role=\"button\")\n  2. Panel Mode: Accessible container for thread content (role=\"complementary\")\n  \n  @see Requirement 2.9 - Only displays indicator when replyCount > 0\n  @see Requirement 13.3 - Panel mode: role=\"complementary\", aria-label=\"Thread replies\"\n-->\n\n<!-- ==================== Indicator Mode ==================== -->\n<!-- Only displays when there are replies (replyCount > 0) -->\n@if (isIndicatorMode && shouldDisplay) {\n  <div\n    class=\"cometchat-thread-view\"\n    [class.cometchat-thread-view--unread]=\"hasUnreadReplies\"\n    role=\"button\"\n    tabindex=\"0\"\n    [attr.aria-label]=\"ariaLabel\"\n    (click)=\"onThreadViewClick()\"\n  >\n    <!-- Thread Icon -->\n    <!-- @see Requirement 2.3 -->\n    <img\n      class=\"cometchat-thread-view__icon\"\n      [src]=\"threadIconUrl\"\n      alt=\"\"\n      aria-hidden=\"true\"\n    />\n\n    <!-- Reply Count Text -->\n    <!-- @see Requirement 2.2, 2.7 -->\n    <span class=\"cometchat-thread-view__count\">\n      {{ replyCountText }}\n    </span>\n\n    <!-- Unread Indicator -->\n    <!-- @see Requirement 2.5 -->\n    @if (hasUnreadReplies) {\n      <span\n        class=\"cometchat-thread-view__unread-indicator\"\n        aria-hidden=\"true\"\n      ></span>\n    }\n  </div>\n}\n\n<!-- ==================== Panel Mode ==================== -->\n<!-- Accessible container for thread content -->\n<!-- @see Requirement 13.1, 13.2, 13.3 -->\n@if (isPanelMode) {\n  <aside\n    class=\"cometchat-thread-view cometchat-thread-view--panel\"\n    role=\"complementary\"\n    [attr.aria-label]=\"panelAriaLabel\"\n  >\n    <!-- Content projection for thread header, message list, and composer -->\n    <ng-content></ng-content>\n  </aside>\n}\n","import {\n  Component,\n  Input,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  signal,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../resources/CometChatLocalize';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * CometChatReactionInfoComponent displays a tooltip showing who reacted\n * with a specific emoji on a message.\n *\n * @example\n * ```html\n * <cometchat-reaction-info\n *   [message]=\"message\"\n *   [reaction]=\"'👍'\">\n * </cometchat-reaction-info>\n * ```\n */\n@Component({\n  selector: 'cometchat-reaction-info',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-reaction-info.component.html',\n  styleUrls: ['./cometchat-reaction-info.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatReactionInfoComponent implements OnInit, OnChanges {\n  /**\n   * The message to show reaction info for.\n   */\n  @Input({ required: true }) message!: CometChat.BaseMessage;\n\n  /**\n   * The emoji character to show info for.\n   */\n  @Input({ required: true }) reaction!: string;\n\n  /**\n   * Current component state: loading, loaded, or error.\n   */\n  state = signal<'loading' | 'loaded' | 'error'>('loading');\n\n  /**\n   * Formatted names of users who reacted.\n   */\n  reactionNames = signal<string[]>([]);\n\n  /**\n   * Total count of reactions for this emoji on the message.\n   */\n  totalReactions = signal<number>(0);\n\n  /**\n   * UID of the currently logged-in user.\n   */\n  private loggedInUserUid = '';\n\n  ngOnInit(): void {\n    this.initializeAndFetch();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] && !changes['message'].firstChange) {\n      this.fetchReactionInfo();\n    }\n    if (changes['reaction'] && !changes['reaction'].firstChange) {\n      this.fetchReactionInfo();\n    }\n  }\n\n  /**\n   * Initializes the logged-in user and fetches reaction info.\n   */\n  private async initializeAndFetch(): Promise<void> {\n    try {\n      const user = await CometChat.getLoggedinUser();\n      if (user) {\n        this.loggedInUserUid = user.getUid();\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatReactionInfo', 'Error getting logged-in user:', error);\n    }\n\n    this.computeTotalReactions();\n    this.fetchReactionInfo();\n  }\n\n  /**\n   * Computes total reaction count for this emoji from the message's reactions.\n   */\n  private computeTotalReactions(): void {\n    try {\n      const reactions = this.message.getReactions();\n      if (reactions) {\n        const reactionCount = reactions.find(\n          (r: CometChat.ReactionCount) => r.getReaction() === this.reaction\n        );\n        if (reactionCount) {\n          this.totalReactions.set(reactionCount.getCount());\n        }\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatReactionInfo', 'Error computing total reactions:', error);\n    }\n  }\n\n  /**\n   * Fetches reaction details from the SDK and formats the names.\n   */\n  private async fetchReactionInfo(): Promise<void> {\n    this.state.set('loading');\n    this.reactionNames.set([]);\n\n    try {\n      const limit = CometChatUIKitConstants.requestBuilderLimits.reactionInfoLimit;\n      const request = new CometChat.ReactionsRequestBuilder()\n        .setMessageId(this.message.getId())\n        .setReaction(this.reaction)\n        .setLimit(limit)\n        .build();\n\n      const reactions = await request.fetchNext();\n      const names = this.formatReactionNames(reactions);\n      this.reactionNames.set(names);\n      this.state.set('loaded');\n    } catch (error) {\n      CometChatLogger.error('CometChatReactionInfo', 'Error fetching reactions:', error);\n      this.state.set('error');\n    }\n  }\n\n  /**\n   * Formats reactor names: logged-in user becomes localized \"You\" and is placed first,\n   * other names follow in order.\n   */\n  private formatReactionNames(reactions: CometChat.Reaction[]): string[] {\n    const youText = CometChatLocalize.getLocalizedString('reaction_popup_you');\n    const names: string[] = [];\n    let isLoggedInUserIncluded = false;\n\n    for (const reaction of reactions) {\n      const reactedBy = reaction.getReactedBy();\n      if (reactedBy.getUid() === this.loggedInUserUid) {\n        isLoggedInUserIncluded = true;\n      } else {\n        names.push(reactedBy.getName());\n      }\n    }\n\n    if (isLoggedInUserIncluded) {\n      names.unshift(youText);\n    }\n\n    return names;\n  }\n\n  /**\n   * Returns the formatted display text for reactor names with optional \"and X others\" suffix.\n   */\n  getDisplayText(): string {\n    const names = this.reactionNames();\n    const total = this.totalReactions();\n    const fetchedCount = names.length;\n\n    if (fetchedCount === 0) {\n      return '';\n    }\n\n    let text = names.join(', ');\n\n    if (total > fetchedCount) {\n      const pendingCount = total - fetchedCount;\n      const andText = CometChatLocalize.getLocalizedString('reaction_popup_and');\n      const othersText = CometChatLocalize.getLocalizedString('reaction_popup_others');\n      text += ` ${andText} ${pendingCount} ${othersText}`;\n    }\n\n    return text;\n  }\n}\n","<div \n  class=\"cometchat-reaction-info\"\n  role=\"tooltip\"\n  aria-live=\"polite\">\n  <div class=\"cometchat-reaction-info__content\">\n    @if (state() === 'loading') {\n      <div \n        class=\"cometchat-reaction-info__loading\"\n        role=\"status\"\n        [attr.aria-label]=\"'accessibility_loading' | translate\">\n      </div>\n    }\n\n    @if (state() === 'error') {\n      <div \n        class=\"cometchat-reaction-info__error\"\n        role=\"alert\">\n        {{ 'reaction_list_error' | translate }}\n      </div>\n    }\n\n    @if (state() === 'loaded') {\n      <div class=\"cometchat-reaction-info__emoji-text\">\n        <span class=\"cometchat-reaction-info__emoji\" aria-hidden=\"true\">{{ reaction }}</span>\n        <div>\n          <div class=\"cometchat-reaction-info__title\">{{ getDisplayText() }}</div>\n          <div class=\"cometchat-reaction-info__description\">{{ 'reaction_reacted' | translate }}</div>\n        </div>\n      </div>\n    }\n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  signal,\n  OnInit,\n  OnChanges,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  computed,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar';\nimport { TranslatePipe } from '../../resources/CometChatLocalize';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n/**\n * CometChatReactionListComponent displays all users who reacted to a message,\n * grouped by emoji type with filtering support.\n */\n@Component({\n  selector: 'cometchat-reaction-list',\n  standalone: true,\n  imports: [CommonModule, CometChatAvatarComponent, TranslatePipe],\n  templateUrl: './cometchat-reaction-list.component.html',\n  styleUrls: ['./cometchat-reaction-list.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatReactionListComponent implements OnInit, OnChanges {\n  @Input() message!: CometChat.BaseMessage;\n  @Input() reactionsRequestBuilder?: CometChat.ReactionsRequestBuilder;\n\n  @Output() itemClick = new EventEmitter<{ reaction: CometChat.Reaction; message: CometChat.BaseMessage; }>();\n  @Output() empty = new EventEmitter<void>();\n\n  groupedReactions = signal<Map<string, CometChat.Reaction[]>>(new Map());\n  selectedEmoji = signal<string | null>(null);\n  isLoading = signal<boolean>(false);\n  hasError = signal<boolean>(false);\n  private allReactions = signal<CometChat.Reaction[]>([]);\n  private loggedInUserUid = '';\n  private reactionsRequest: CometChat.ReactionsRequest | null = null;\n  hasMoreReactions = signal<boolean>(true);\n\n  emojiTabs = computed(() => Array.from(this.groupedReactions().keys()));\n\n  filteredReactions = computed(() => {\n    const selected = this.selectedEmoji();\n    if (selected === null) return this.allReactions();\n    return this.groupedReactions().get(selected) || [];\n  });\n\n  totalReactionCount = computed(() => this.allReactions().length);\n\n  ngOnInit(): void { this.initializeLoggedInUser(); }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] && this.message) this.resetAndFetchReactions();\n  }\n\n  private async initializeLoggedInUser(): Promise<void> {\n    try {\n      const user = await CometChat.getLoggedinUser();\n      if (user) this.loggedInUserUid = user.getUid();\n    } catch (error) {\n      CometChatLogger.error('CometChatReactionList', 'Error getting logged-in user:', error);\n    }\n  }\n\n  private resetAndFetchReactions(): void {\n    this.allReactions.set([]);\n    this.groupedReactions.set(new Map());\n    this.selectedEmoji.set(null);\n    this.hasMoreReactions.set(true);\n    this.hasError.set(false);\n    this.reactionsRequest = null;\n    this.fetchReactions();\n  }\n\n  /**\n   * Fetches reactions for the message.\n   */\n  async fetchReactions(): Promise<void> {\n    if (!this.message || this.isLoading() || !this.hasMoreReactions()) {\n      return;\n    }\n\n    this.isLoading.set(true);\n    this.hasError.set(false);\n\n    try {\n      if (!this.reactionsRequest) {\n        this.reactionsRequest = this.createReactionsRequest();\n      }\n\n      const reactions = await this.reactionsRequest.fetchNext();\n\n      if (reactions.length === 0) {\n        this.hasMoreReactions.set(false);\n      } else {\n        const currentReactions = this.allReactions();\n        const updatedReactions = [...currentReactions, ...reactions];\n        this.allReactions.set(updatedReactions);\n        this.groupReactionsByEmoji(updatedReactions);\n\n        if (reactions.length < CometChatUIKitConstants.requestBuilderLimits.reactionListLimit) {\n          this.hasMoreReactions.set(false);\n        }\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatReactionList', 'Error fetching reactions:', error);\n      this.hasError.set(true);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  /**\n   * Creates a reactions request builder.\n   */\n  private createReactionsRequest(): CometChat.ReactionsRequest {\n    if (this.reactionsRequestBuilder) {\n      return this.reactionsRequestBuilder.build();\n    }\n\n    return new CometChat.ReactionsRequestBuilder()\n      .setMessageId(this.message.getId())\n      .setLimit(CometChatUIKitConstants.requestBuilderLimits.reactionListLimit)\n      .build();\n  }\n\n  /**\n   * Groups reactions by emoji type.\n   */\n  private groupReactionsByEmoji(reactions: CometChat.Reaction[]): void {\n    const grouped = new Map<string, CometChat.Reaction[]>();\n\n    for (const reaction of reactions) {\n      const emoji = reaction.getReaction();\n      if (!grouped.has(emoji)) {\n        grouped.set(emoji, []);\n      }\n      grouped.get(emoji)!.push(reaction);\n    }\n\n    this.groupedReactions.set(grouped);\n  }\n\n  /**\n   * Selects an emoji tab to filter reactions.\n   */\n  selectEmoji(emoji: string | null): void {\n    this.selectedEmoji.set(emoji);\n  }\n\n  /**\n   * Handles click on a reaction item.\n   * Only emits for the current user's reactions (to remove them).\n   * Non-user reactions are read-only and not clickable.\n   * After removal, updates the local list and emits `empty` if no reactions remain.\n   * Stops event propagation to prevent the popover from closing.\n   * @see Requirement 4.4\n   * @see Requirement 9.1, 9.2\n   */\n  onItemClick(event: MouseEvent, reaction: CometChat.Reaction): void {\n    // Stop propagation to prevent popover from closing\n    event.stopPropagation();\n\n    if (!this.isCurrentUser(reaction)) {\n      return;\n    }\n\n    this.itemClick.emit({\n      reaction,\n      message: this.message,\n    });\n\n    // Remove the reaction from the local list optimistically\n    const emoji = reaction.getReaction();\n    const uid = reaction.getReactedBy().getUid();\n    const updatedReactions = this.allReactions().filter(\n      r => !(r.getReaction() === emoji && r.getReactedBy().getUid() === uid)\n    );\n    this.allReactions.set(updatedReactions);\n    this.groupReactionsByEmoji(updatedReactions);\n\n    // If the selected emoji tab is now empty, reset to \"All\"\n    if (this.selectedEmoji() !== null) {\n      const grouped = this.groupedReactions();\n      if (!grouped.has(this.selectedEmoji()!)) {\n        this.selectedEmoji.set(null);\n      }\n    }\n\n    // Emit empty when all reactions are removed\n    if (updatedReactions.length === 0) {\n      this.empty.emit();\n    }\n  }\n\n  /**\n   * Handles keyboard navigation for tabs.\n   */\n  onTabKeyDown(event: KeyboardEvent, emoji: string | null, index: number): void {\n    const tabs = this.emojiTabs();\n    const totalTabs = tabs.length + 1; // +1 for \"All\" tab\n\n    switch (event.key) {\n      case 'ArrowLeft':\n        event.preventDefault();\n        this.focusPreviousTab(index, totalTabs);\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        this.focusNextTab(index, totalTabs);\n        break;\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        this.selectEmoji(emoji);\n        break;\n      case 'Home':\n        event.preventDefault();\n        this.focusTab(0);\n        break;\n      case 'End':\n        event.preventDefault();\n        this.focusTab(totalTabs - 1);\n        break;\n    }\n  }\n\n  /**\n   * Handles keyboard navigation for reaction items.\n   * Only triggers click for the current user's reactions.\n   */\n  onItemKeyDown(event: KeyboardEvent, reaction: CometChat.Reaction): void {\n    switch (event.key) {\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        event.stopPropagation();\n        if (this.isCurrentUser(reaction)) {\n          // Create a synthetic MouseEvent to pass to onItemClick\n          const syntheticEvent = new MouseEvent('click', {\n            bubbles: true,\n            cancelable: true,\n            view: window,\n          });\n          this.onItemClick(syntheticEvent, reaction);\n        }\n        break;\n    }\n  }\n\n  /**\n   * Focuses the previous tab.\n   */\n  private focusPreviousTab(currentIndex: number, totalTabs: number): void {\n    const prevIndex = currentIndex === 0 ? totalTabs - 1 : currentIndex - 1;\n    this.focusTab(prevIndex);\n  }\n\n  /**\n   * Focuses the next tab.\n   */\n  private focusNextTab(currentIndex: number, totalTabs: number): void {\n    const nextIndex = currentIndex === totalTabs - 1 ? 0 : currentIndex + 1;\n    this.focusTab(nextIndex);\n  }\n\n  /**\n   * Focuses a tab by index.\n   */\n  private focusTab(index: number): void {\n    const tabElements = document.querySelectorAll('.cometchat-reaction-list__tabs-tab');\n    if (tabElements[index]) {\n      (tabElements[index] as HTMLElement).focus();\n    }\n  }\n\n  /**\n   * Gets the display name for a reaction's user.\n   */\n  getDisplayName(reaction: CometChat.Reaction): string {\n    const reactedBy = reaction.getReactedBy();\n    if (reactedBy.getUid() === this.loggedInUserUid) {\n      return ''; // Will use localization key 'reaction_list_you'\n    }\n    return reactedBy.getName();\n  }\n\n  /**\n   * Checks if the reaction is from the logged-in user.\n   */\n  isCurrentUser(reaction: CometChat.Reaction): boolean {\n    return reaction.getReactedBy().getUid() === this.loggedInUserUid;\n  }\n\n  /**\n   * Gets the count for a specific emoji.\n   */\n  getEmojiCount(emoji: string): number {\n    const grouped = this.groupedReactions();\n    return grouped.get(emoji)?.length || 0;\n  }\n\n  /**\n   * Loads more reactions when scrolling.\n   */\n  onScroll(event: Event): void {\n    const element = event.target as HTMLElement;\n    const scrollBottom = element.scrollHeight - element.scrollTop - element.clientHeight;\n\n    if (scrollBottom < 50 && !this.isLoading() && this.hasMoreReactions()) {\n      this.fetchReactions();\n    }\n  }\n\n  /**\n   * Retries fetching reactions after an error.\n   */\n  retry(): void {\n    this.hasError.set(false);\n    this.fetchReactions();\n  }\n\n  /**\n   * TrackBy function for reaction items.\n   */\n  trackByReaction(index: number, reaction: CometChat.Reaction): string {\n    return `${reaction.getReactedBy().getUid()}-${reaction.getReaction()}`;\n  }\n\n  /**\n   * TrackBy function for emoji tabs.\n   */\n  trackByEmoji(index: number, emoji: string): string {\n    return emoji;\n  }\n}\n","<div class=\"cometchat\">\n  <div \n    class=\"cometchat-reaction-list\"\n    role=\"dialog\"\n    [attr.aria-label]=\"'message_bubble_reactions' | translate\">\n    \n    <!-- Emoji Tabs (shown during loaded and loading states) -->\n    @if (!hasError() || filteredReactions().length > 0) {\n      <div \n        class=\"cometchat-reaction-list__tabs\"\n        role=\"tablist\"\n        [attr.aria-label]=\"'message_bubble_reactions' | translate\">\n        \n        <!-- All Tab -->\n        <button\n          class=\"cometchat-reaction-list__tabs-tab\"\n          [class.cometchat-reaction-list__tabs-tab-active]=\"selectedEmoji() === null\"\n          role=\"tab\"\n          [attr.aria-selected]=\"selectedEmoji() === null\"\n          [attr.tabindex]=\"selectedEmoji() === null ? 0 : -1\"\n          (click)=\"selectEmoji(null)\"\n          (keydown)=\"onTabKeyDown($event, null, 0)\">\n          <span \n            class=\"cometchat-reaction-list__tabs-tab-emoji\"\n            [class.cometchat-reaction-list__tabs-tab-emoji-active]=\"selectedEmoji() === null\">\n            {{ 'reaction_list_all' | translate }}\n          </span>\n          <span \n            class=\"cometchat-reaction-list__tabs-tab-count\"\n            [class.cometchat-reaction-list__tabs-tab-count-active]=\"selectedEmoji() === null\">\n            {{ totalReactionCount() }}\n          </span>\n        </button>\n\n        <!-- Emoji Tabs -->\n        @for (emoji of emojiTabs(); track emoji; let i = $index) {\n          <button\n            class=\"cometchat-reaction-list__tabs-tab\"\n            [class.cometchat-reaction-list__tabs-tab-active]=\"selectedEmoji() === emoji\"\n            role=\"tab\"\n            [attr.aria-selected]=\"selectedEmoji() === emoji\"\n            [attr.tabindex]=\"selectedEmoji() === emoji ? 0 : -1\"\n            (click)=\"selectEmoji(emoji)\"\n            (keydown)=\"onTabKeyDown($event, emoji, i + 1)\">\n            <span \n              class=\"cometchat-reaction-list__tabs-tab-emoji\"\n              [class.cometchat-reaction-list__tabs-tab-emoji-active]=\"selectedEmoji() === emoji\">\n              {{ emoji }}\n            </span>\n            <span \n              class=\"cometchat-reaction-list__tabs-tab-count\"\n              [class.cometchat-reaction-list__tabs-tab-count-active]=\"selectedEmoji() === emoji\">\n              {{ getEmojiCount(emoji) }}\n            </span>\n          </button>\n        }\n      </div>\n    }\n\n    <!-- Shimmer Loading State (initial load) -->\n    @if (isLoading() && filteredReactions().length === 0) {\n      <div \n        class=\"cometchat-reaction-list__shimmer\"\n        role=\"status\"\n        aria-live=\"polite\"\n        [attr.aria-label]=\"'message_bubble_reactions' | translate\">\n        @for (item of [1, 2, 3, 4]; track item) {\n          <div class=\"cometchat-reaction-list__shimmer-item\">\n            <div class=\"cometchat-reaction-list__shimmer-item-icon\"></div>\n            <div class=\"cometchat-reaction-list__shimmer-item-content\"></div>\n            <div class=\"cometchat-reaction-list__shimmer-item-tailview\"></div>\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Error State -->\n    @if (hasError() && filteredReactions().length === 0) {\n      <div \n        class=\"cometchat-reaction-list__error\"\n        role=\"alert\">\n        <span>\n          {{ 'reaction_list_error' | translate }}\n        </span>\n        <button \n          class=\"cometchat-reaction-list__retry-button\"\n          (click)=\"retry()\"\n          (keydown.enter)=\"retry()\"\n          (keydown.space)=\"retry()\">\n          {{ 'retry' | translate }}\n        </button>\n      </div>\n    }\n\n    <!-- Reaction List Content -->\n    @if (!isLoading() || filteredReactions().length > 0) {\n      @if (!hasError() || filteredReactions().length > 0) {\n        @if (filteredReactions().length > 0) {\n          <div \n            class=\"cometchat-reaction-list__list\"\n            role=\"list\"\n            [attr.aria-label]=\"'message_bubble_reactions' | translate\"\n            (scroll)=\"onScroll($event)\">\n            \n            @for (reaction of filteredReactions(); track trackByReaction($index, reaction)) {\n              <div\n                class=\"cometchat-reaction-list__list-item\"\n                [class.cometchat-reaction-list__list-item--current-user]=\"isCurrentUser(reaction)\"\n                [class.cometchat-reaction-list__list-item--readonly]=\"!isCurrentUser(reaction)\"\n                role=\"listitem\"\n                [attr.tabindex]=\"isCurrentUser(reaction) ? 0 : -1\"\n                [attr.aria-label]=\"isCurrentUser(reaction) \n                  ? ('reaction_list_you' | translate) + ' - ' + reaction.getReaction() + ' - ' + ('reaction_list_click_to_remove' | translate)\n                  : reaction.getReactedBy().getName() + ' - ' + reaction.getReaction()\"\n                (click)=\"onItemClick($event, reaction)\"\n                (keydown)=\"onItemKeyDown($event, reaction)\">\n                \n                <!-- User Avatar -->\n                <div class=\"cometchat-reaction-list__item-avatar\">\n                  <cometchat-avatar\n                    [image]=\"reaction.getReactedBy().getAvatar()\"\n                    [name]=\"reaction.getReactedBy().getName()\">\n                  </cometchat-avatar>\n                </div>\n\n                <!-- User Info -->\n                <div class=\"cometchat-reaction-list__item-info\">\n                  <span class=\"cometchat-reaction-list__item-name\">\n                    @if (isCurrentUser(reaction)) {\n                      {{ 'reaction_list_you' | translate }}\n                    } @else {\n                      {{ reaction.getReactedBy().getName() }}\n                    }\n                  </span>\n                  @if (isCurrentUser(reaction)) {\n                    <span class=\"cometchat-reaction-list__item-hint\">\n                      {{ 'reaction_list_click_to_remove' | translate }}\n                    </span>\n                  }\n                </div>\n\n                <!-- Reaction Emoji -->\n                <div class=\"cometchat-reaction-list__item-emoji\">\n                  {{ reaction.getReaction() }}\n                </div>\n              </div>\n            }\n\n            <!-- Loading More Indicator -->\n            @if (isLoading() && filteredReactions().length > 0) {\n              <div \n                class=\"cometchat-reaction-list__loading-more\"\n                role=\"status\"\n                aria-live=\"polite\">\n                <div class=\"cometchat-reaction-list__spinner\"></div>\n              </div>\n            }\n          </div>\n        } @else if (!isLoading() && !hasError()) {\n          <!-- Empty State -->\n          <div \n            class=\"cometchat-reaction-list__empty\"\n            role=\"status\">\n            <span class=\"cometchat-reaction-list__empty-text\">\n              {{ 'reaction_list_empty' | translate }}\n            </span>\n          </div>\n        }\n      }\n    }\n  </div>\n</div>","/**\n * Utility functions for CometChatReactions component.\n */\n\n/**\n * Calculates the maximum number of visible emojis based on available width.\n * Each emoji pill occupies approximately 46px. Result is clamped between 1 and 100.\n */\nexport function getMaxVisibleEmojis(availableWidth: number): number {\n  return Math.min(100, Math.max(1, Math.floor(availableWidth / 46)));\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  AfterViewInit,\n  OnDestroy,\n  OnChanges,\n  DoCheck,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  signal,\n  computed,\n  ElementRef,\n  ViewChild,\n  inject,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatPopoverComponent } from '../base-elements/cometchat-popover';\nimport { CometChatReactionInfoComponent } from '../cometchat-reaction-info';\nimport { CometChatReactionListComponent } from '../cometchat-reaction-list';\nimport { TranslatePipe } from '../../resources/CometChatLocalize';\nimport { MessageBubbleAlignment, Placement } from '../../Enums/Enums';\nimport { LiveAnnouncerService } from '../../services/live-announcer.service';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { getMaxVisibleEmojis } from './cometchat-reactions.utils';\n\nexport { getMaxVisibleEmojis };\n\n/**\n * CometChatReactionsComponent renders emoji reaction pills on a message bubble's footer.\n * Dynamically calculates visible pills based on container width with overflow handling.\n */\n@Component({\n  selector: 'cometchat-reactions',\n  standalone: true,\n  imports: [CommonModule, CometChatPopoverComponent, CometChatReactionInfoComponent, CometChatReactionListComponent, TranslatePipe],\n  templateUrl: './cometchat-reactions.component.html',\n  styleUrls: ['./cometchat-reactions.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatReactionsComponent implements AfterViewInit, OnDestroy, OnChanges, DoCheck {\n  @Input({ required: true }) message!: CometChat.BaseMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.left;\n  @Input() reactionsRequestBuilder?: CometChat.ReactionsRequestBuilder;\n  @Input() hoverDebounceTime = 500;\n\n  @Output() reactionClick = new EventEmitter<{ reaction: CometChat.ReactionCount; message: CometChat.BaseMessage; }>();\n  @Output() reactionListItemClick = new EventEmitter<{ reaction: CometChat.Reaction; message: CometChat.BaseMessage; }>();\n\n  maxVisibleEmojis = signal<number>(5);\n\n  moreListPlacement = signal<Placement>(Placement.right);\n  private reactionsVersion = signal(0);\n\n  visibleReactions = computed<CometChat.ReactionCount[]>(() => {\n    this.reactionsVersion();\n    const reactions = this.getReactions();\n    const max = this.maxVisibleEmojis();\n    const total = reactions.length;\n    const showMore = total > max && max > 2;\n    const visibleCount = showMore ? max - 1 : max;\n    return reactions.slice(0, visibleCount);\n  });\n\n  moreCount = computed<number>(() => {\n    this.reactionsVersion();\n    const reactions = this.getReactions();\n    const total = reactions.length;\n    const max = this.maxVisibleEmojis();\n    const showMore = total > max && max > 2;\n    const visibleCount = showMore ? max - 1 : max;\n    return total > visibleCount ? total - visibleCount : 0;\n  });\n\n  Placement = Placement;\n\n  reactionInfoPopoverStyle: Record<string, string> = { background: 'transparent', boxShadow: 'none', border: 'none', padding: '0' };\n  reactionListPopoverStyle: Record<string, string> = { background: 'transparent', boxShadow: 'none', padding: '0', maxWidth: 'none', borderRadius: '0', border: 'none', overflow: 'visible' };\n\n  forceShowReactionList = signal<boolean>(false);\n\n  @ViewChild('moreListPopover') moreListPopover?: CometChatPopoverComponent;\n\n  showReactionListPopover = computed<boolean>(() => this.moreCount() > 0 || this.forceShowReactionList());\n\n  private resizeObserver: ResizeObserver | null = null;\n  private previousWidth = 0;\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private previousReactionFingerprint = '';\n\n  constructor(private elementRef: ElementRef) {}\n\n  ngAfterViewInit(): void { this.attachResizeObserver(); }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message']) {\n      this.previousReactionFingerprint = this.getReactionFingerprint();\n      this.reactionsVersion.update(v => v + 1);\n      this.updateMoreListPlacement();\n    }\n    if (changes['alignment']) this.updateMoreListPlacement();\n  }\n\n  /** Detects in-place mutations to the message's reactions array via DoCheck. */\n  ngDoCheck(): void {\n    const currentFingerprint = this.getReactionFingerprint();\n    if (currentFingerprint !== this.previousReactionFingerprint) {\n      this.previousReactionFingerprint = currentFingerprint;\n      this.reactionsVersion.update(v => v + 1);\n    }\n  }\n\n  ngOnDestroy(): void {\n    if (this.resizeObserver) {\n      this.resizeObserver.disconnect();\n      this.resizeObserver = null;\n    }\n  }\n\n  /**\n   * Handles click on a reaction pill.\n   * Announces the reaction toggle for screen readers.\n   */\n  onPillClick(reaction: CometChat.ReactionCount): void {\n    this.toggleReaction(reaction);\n  }\n\n  /**\n   * Handles keyboard events on reaction pills.\n   * Supports Enter and Space to toggle reaction.\n   * @see Requirements 18.2\n   */\n  onReactionKeyDown(event: KeyboardEvent, reaction: CometChat.ReactionCount): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.toggleReaction(reaction);\n    }\n  }\n\n  /**\n   * Toggles a reaction and announces the change for screen readers.\n   * @see Requirements 18.2, 18.6\n   */\n  private toggleReaction(reaction: CometChat.ReactionCount): void {\n    // Announce reaction toggle for screen readers\n    const emoji = reaction.getReaction();\n    const isReactedByMe = reaction.getReactedByMe();\n    const messageKey = isReactedByMe\n      ? 'accessibility_reaction_removed'\n      : 'accessibility_reaction_added';\n    const message = CometChatLocalize.getLocalizedString(messageKey).replace('{emoji}', emoji);\n    this.liveAnnouncer.announce(message, 'polite', 2000);\n\n    this.reactionClick.emit({ reaction, message: this.message });\n  }\n\n  /**\n   * Gets aria-label for a reaction pill including emoji, count, and user reaction status.\n   * @see Requirements 18.5\n   */\n  getReactionAriaLabel(reaction: CometChat.ReactionCount): string {\n    const emoji = reaction.getReaction();\n    const count = reaction.getCount();\n    const isReactedByMe = reaction.getReactedByMe();\n\n    if (isReactedByMe) {\n      return CometChatLocalize.getLocalizedString('accessibility_reaction_you_reacted')\n        .replace('{emoji}', emoji)\n        .replace('{count}', count.toString());\n    }\n    return CometChatLocalize.getLocalizedString('accessibility_reaction_count')\n      .replace('{emoji}', emoji)\n      .replace('{count}', count.toString());\n  }\n\n  /**\n   * Handles keyboard events on the more reactions button.\n   * Supports Enter and Space to open the reaction list popover.\n   */\n  onMoreReactionsKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.updateMoreListPlacement();\n    }\n  }\n\n  /**\n   * Handles click on a reaction list item from the overflow popover.\n   */\n  onListItemClick(event: { reaction: CometChat.Reaction; message: CometChat.BaseMessage }): void {\n    this.reactionListItemClick.emit(event);\n  }\n\n  /**\n   * Handles the reaction list becoming empty after all reactions are removed.\n   * Closes the popover and resets the force-show flag.\n   * @see Requirement 9.2\n   */\n  onReactionListEmpty(): void {\n    this.forceShowReactionList.set(false);\n    this.moreListPopover?.closePopover();\n  }\n\n  /**\n   * Called when the reaction list popover is opened.\n   * Sets the force-show flag to prevent premature close on reaction removal.\n   * @see Requirement 9.1\n   */\n  onMoreListPopoverOpened(): void {\n    this.forceShowReactionList.set(true);\n  }\n\n  /**\n   * Called when the reaction list popover is closed (outside click, escape, etc.).\n   * Resets the force-show flag.\n   * @see Requirement 9.3\n   */\n  onMoreListPopoverClosed(): void {\n    this.forceShowReactionList.set(false);\n  }\n\n  /**\n   * Updates the more list placement before opening the overflow popover.\n   */\n  updateMoreListPlacement(): void {\n    if (typeof window !== 'undefined' && window.innerWidth <= 768) {\n      this.moreListPlacement.set(this.checkBubblePosition());\n    } else {\n      this.moreListPlacement.set(\n        this.alignment === MessageBubbleAlignment.left ? Placement.right : Placement.left\n      );\n    }\n  }\n\n  /**\n   * Returns the reactions array from the message, or an empty array.\n   */\n  private getReactions(): CometChat.ReactionCount[] {\n    try {\n      return this.message?.getReactions() || [];\n    } catch {\n      return [];\n    }\n  }\n\n  /**\n   * Generates a lightweight fingerprint of the current reactions for change detection.\n   * Used by ngDoCheck to detect in-place mutations to the message's reactions.\n   */\n  private getReactionFingerprint(): string {\n    try {\n      const reactions = this.message?.getReactions();\n      if (!reactions || reactions.length === 0) return '';\n      return reactions\n        .map(r => `${r.getReaction()}${r.getCount()}${r.getReactedByMe() ? 'm' : ''}`)\n        .join('|');\n    } catch {\n      return '';\n    }\n  }\n\n  /**\n   * Attaches a ResizeObserver to the parent's content view element\n   * to dynamically recalculate maxVisibleEmojis when the container resizes.\n   */\n  private attachResizeObserver(): void {\n    try {\n      const parentNode = this.elementRef.nativeElement?.parentNode?.parentNode;\n      if (!parentNode) {\n        return;\n      }\n\n      const contentView =\n        parentNode.querySelector('.cometchat-message-bubble__body-content-view') ||\n        parentNode.firstElementChild;\n\n      if (!contentView || this.resizeObserver) {\n        return;\n      }\n\n      this.resizeObserver = new ResizeObserver(entries => {\n        for (const entry of entries) {\n          const newWidth = entry.contentRect.width;\n          if (this.previousWidth !== newWidth) {\n            this.previousWidth = newWidth;\n            this.maxVisibleEmojis.set(getMaxVisibleEmojis(newWidth));\n          }\n        }\n      });\n\n      this.resizeObserver.observe(contentView);\n    } catch {\n      // ResizeObserver not supported — keep default maxVisibleEmojis = 5\n    }\n  }\n\n  /**\n   * Checks the bubble's vertical position to determine popover placement on mobile.\n   */\n  private checkBubblePosition(): Placement {\n    try {\n      const bubble = this.elementRef.nativeElement?.parentNode;\n      if (bubble) {\n        const rect = bubble.getBoundingClientRect();\n        const isAtTop = rect.top < window.innerHeight / 2;\n        return isAtTop ? Placement.bottom : Placement.top;\n      }\n    } catch {\n      // Fallback\n    }\n    return Placement.bottom;\n  }\n\n  /**\n   * TrackBy function for reaction pills.\n   */\n  trackByReaction(index: number, reaction: CometChat.ReactionCount): string {\n    return reaction.getReaction();\n  }\n}\n","<div\n  class=\"cometchat-reactions\"\n  role=\"group\"\n  [attr.aria-label]=\"'accessibility_message_reactions' | translate\">\n\n  @for (reaction of visibleReactions(); track trackByReaction($index, reaction)) {\n    <div class=\"cometchat-reactions-info-wrapper\">\n      <cometchat-popover\n        [useParentContainer]=\"true\"\n        [showOnHover]=\"true\"\n        [debounceOnHover]=\"hoverDebounceTime\"\n        [placement]=\"Placement.top\"\n        [content]=\"reactionInfoContent\"\n        [showTooltip]=\"true\"\n        [contentStyle]=\"reactionInfoPopoverStyle\">\n\n        <button\n          class=\"cometchat-reactions__reaction\"\n          [class.cometchat-reactions__reaction-you]=\"reaction.getReactedByMe()\"\n          type=\"button\"\n          [attr.aria-label]=\"getReactionAriaLabel(reaction)\"\n          [attr.aria-pressed]=\"reaction.getReactedByMe()\"\n          (click)=\"onPillClick(reaction)\"\n          (keydown)=\"onReactionKeyDown($event, reaction)\">\n          <span class=\"cometchat-reactions__reaction-emoji\" aria-hidden=\"true\">{{ reaction.getReaction() }}</span>\n          <span class=\"cometchat-reactions__reaction-count\" aria-hidden=\"true\">{{ reaction.getCount() }}</span>\n        </button>\n      </cometchat-popover>\n\n      <ng-template #reactionInfoContent>\n        <div>\n          <cometchat-reaction-info\n            [message]=\"message\"\n            [reaction]=\"reaction.getReaction()\">\n          </cometchat-reaction-info>\n        </div>\n      </ng-template>\n    </div>\n  }\n\n  @if (showReactionListPopover()) {\n    <cometchat-popover\n      #moreListPopover\n      [disableBackgroundInteraction]=\"true\"\n      [useParentContainer]=\"true\"\n      [placement]=\"moreListPlacement()\"\n      [content]=\"moreListContent\"\n      [contentStyle]=\"reactionListPopoverStyle\"\n      (popoverOpened)=\"onMoreListPopoverOpened()\"\n      (popoverClosed)=\"onMoreListPopoverClosed()\">\n\n      <button\n        class=\"cometchat-reactions__more-reaction\"\n        type=\"button\"\n        aria-haspopup=\"dialog\"\n        [attr.aria-label]=\"'+' + moreCount() + ' ' + ('accessibility_more_reactions' | translate)\"\n        [attr.aria-expanded]=\"forceShowReactionList()\"\n        (click)=\"updateMoreListPlacement()\"\n        (keydown)=\"onMoreReactionsKeyDown($event)\">\n        <span class=\"cometchat-reactions__more-reaction-count\" aria-hidden=\"true\">+{{ moreCount() }}</span>\n      </button>\n    </cometchat-popover>\n\n    <ng-template #moreListContent>\n      <div>\n        <cometchat-reaction-list\n          [message]=\"message\"\n          [reactionsRequestBuilder]=\"reactionsRequestBuilder\"\n          (itemClick)=\"onListItemClick($event)\"\n          (empty)=\"onReactionListEmpty()\">\n        </cometchat-reaction-list>\n      </div>\n    </ng-template>\n  }\n</div>\n","/**\n * CometChatMarkdownParser\n * Pure TypeScript — no Angular DI, no external dependencies.\n *\n * Supported constructs:\n *  1.  Headings h1–h6  (# … ######)\n *  2.  Bold  **text**  or  __text__\n *  3.  Italic  *text*  or  _text_\n *  4.  Strikethrough  ~~text~~\n *  5.  Inline code  `code`\n *  6.  Fenced code blocks  ```lang … ```\n *  7.  Blockquotes  > text\n *  8.  Ordered lists  1. item\n *  9.  Unordered lists  - item / * item\n * 10.  Nested lists (up to 3 levels)\n * 11.  Hyperlinks  [text](url)\n * 12.  Images  ![alt](url)\n * 13.  Horizontal rules  ---\n * 14.  Line breaks (blank line)\n * 15.  Paragraphs\n * 16.  GFM tables  | col | col |\n */\n\nexport type MarkdownNodeType =\n  | 'heading'\n  | 'paragraph'\n  | 'bold'\n  | 'italic'\n  | 'underline'\n  | 'strikethrough'\n  | 'inlineCode'\n  | 'codeBlock'\n  | 'blockquote'\n  | 'orderedList'\n  | 'unorderedList'\n  | 'listItem'\n  | 'link'\n  | 'image'\n  | 'hr'\n  | 'lineBreak'\n  | 'table'\n  | 'text';\n\nexport interface MarkdownNode {\n  type: MarkdownNodeType;\n  content?: string;\n  children?: MarkdownNode[];\n  level?: number;\n  lang?: string;\n  href?: string;\n  alt?: string;\n  rows?: string[][];\n  headers?: string[];\n}\n\n// ── XSS helpers ───────────────────────────────────────────────────────────────\n\nfunction escapeHtml(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\n// ── Inline parser ─────────────────────────────────────────────────────────────\n\nexport function parseInline(text: string): MarkdownNode[] {\n  const nodes: MarkdownNode[] = [];\n  let remaining = text;\n\n  // Order: images > links > bold+italic (***) > bold (**/__) > strikethrough > italic (*/_) > inline code\n  // Use negative lookbehind/lookahead on _ to prevent single _ from matching inside __\n  const inlineRe =\n    /!\\[([^\\]]*)\\]\\(([^)]*)\\)|\\[([^\\]]*)\\]\\(([^)]*)\\)|\\*{3}(.+?)\\*{3}|\\*\\*(.+?)\\*\\*|__(.+?)__|~~(.+?)~~|\\*(.+?)\\*|(?<!_)_([^_]+)_(?!_)|`([^`]+)`/g;\n\n  let lastIndex = 0;\n  let match: RegExpExecArray | null;\n  inlineRe.lastIndex = 0;\n\n  while ((match = inlineRe.exec(remaining)) !== null) {\n    if (match.index > lastIndex) {\n      nodes.push({ type: 'text', content: remaining.slice(lastIndex, match.index) });\n    }\n\n    if (match[1] !== undefined) {\n      nodes.push({ type: 'image', alt: match[1], href: match[2] });\n    } else if (match[3] !== undefined) {\n      nodes.push({ type: 'link', content: match[3], href: match[4] });\n    } else if (match[5] !== undefined) {\n      // ***text*** → bold+italic combined\n      nodes.push({ type: 'bold', content: `*${match[5]}*` });\n    } else if (match[6] !== undefined) {\n      nodes.push({ type: 'bold', content: match[6] });\n    } else if (match[7] !== undefined) {\n      nodes.push({ type: 'underline', content: match[7] });\n    } else if (match[8] !== undefined) {\n      nodes.push({ type: 'strikethrough', content: match[8] });\n    } else if (match[9] !== undefined) {\n      nodes.push({ type: 'italic', content: match[9] });\n    } else if (match[10] !== undefined) {\n      nodes.push({ type: 'italic', content: match[10] });\n    } else if (match[11] !== undefined) {\n      nodes.push({ type: 'inlineCode', content: match[11] });\n    }\n\n    lastIndex = match.index + match[0].length;\n  }\n\n  if (lastIndex < remaining.length) {\n    nodes.push({ type: 'text', content: remaining.slice(lastIndex) });\n  }\n\n  return nodes.length > 0 ? nodes : [{ type: 'text', content: text }];\n}\n\n// ── List helpers ──────────────────────────────────────────────────────────────\n\ninterface RawListItem {\n  indent: number;\n  ordered: boolean;\n  content: string;\n}\n\nfunction parseListItems(lines: string[]): MarkdownNode {\n  const rawItems: RawListItem[] = [];\n\n  for (const line of lines) {\n    const orderedMatch = line.match(/^(\\s*)\\d+\\.\\s+(.*)/);\n    const unorderedMatch = line.match(/^(\\s*)[-*]\\s+(.*)/);\n    if (orderedMatch) {\n      rawItems.push({ indent: orderedMatch[1].length, ordered: true, content: orderedMatch[2] });\n    } else if (unorderedMatch) {\n      rawItems.push({ indent: unorderedMatch[1].length, ordered: false, content: unorderedMatch[2] });\n    }\n  }\n\n  function buildList(items: RawListItem[], depth: number): MarkdownNode {\n    const listType: MarkdownNodeType = items[0]?.ordered ? 'orderedList' : 'unorderedList';\n    const listNode: MarkdownNode = { type: listType, children: [] };\n    let i = 0;\n\n    while (i < items.length) {\n      const item = items[i];\n      const listItem: MarkdownNode = {\n        type: 'listItem',\n        children: parseInline(escapeHtml(item.content)),\n      };\n\n      const nestedItems: RawListItem[] = [];\n      i++;\n      while (i < items.length && items[i].indent > item.indent && depth < 3) {\n        nestedItems.push(items[i]);\n        i++;\n      }\n\n      if (nestedItems.length > 0) {\n        listItem.children = [...(listItem.children ?? []), buildList(nestedItems, depth + 1)];\n      }\n\n      listNode.children!.push(listItem);\n    }\n\n    return listNode;\n  }\n\n  return buildList(rawItems, 1);\n}\n\n// ── Table helpers ─────────────────────────────────────────────────────────────\n\nfunction parseTableRow(line: string): string[] {\n  return line.split('|').slice(1, -1).map((c) => c.trim());\n}\n\nfunction isTableSeparator(line: string): boolean {\n  return /^\\|?[\\s\\-:|]+\\|/.test(line);\n}\n\n// ── Fence detection ───────────────────────────────────────────────────────────\n\n/**\n * Returns the language tag if the line opens a fenced code block, otherwise null.\n * Handles: ```python  ``` python  ```Python  leading spaces  \\r endings\n */\nfunction getFenceLang(line: string): string | null {\n  const m = line.trimEnd().match(/^\\s*```\\s*(\\w*)\\s*$/);\n  return m ? m[1] : null;\n}\n\nfunction isClosingFence(line: string): boolean {\n  return /^\\s*```\\s*$/.test(line.trimEnd());\n}\n\n// ── Block parser ──────────────────────────────────────────────────────────────\n\nexport class CometChatMarkdownParser {\n  parse(text: string, streaming?: boolean): MarkdownNode[] {\n    if (!text) return [];\n\n    const nodes: MarkdownNode[] = [];\n    const lines = text.split('\\n').map(l => l.replace(/\\r$/, ''));\n    let i = 0;\n\n    while (i < lines.length) {\n      const line = lines[i];\n\n      // ── Fenced code block ──────────────────────────────────────────────────\n      const fenceLang = getFenceLang(line);\n      if (fenceLang !== null) {\n        const lang = fenceLang;\n        const codeLines: string[] = [];\n        i++;\n        let closed = false;\n\n        while (i < lines.length) {\n          if (isClosingFence(lines[i])) {\n            closed = true;\n            i++;\n            break;\n          }\n          codeLines.push(lines[i]);\n          i++;\n        }\n\n        // During streaming an unclosed fence is still rendered as a code block\n        // so the user sees syntax-highlighted code as it arrives.\n        nodes.push({\n          type: 'codeBlock',\n          lang,\n          content: codeLines.join('\\n'),\n        });\n        continue;\n      }\n\n      // ── Heading ────────────────────────────────────────────────────────────\n      const headingMatch = line.match(/^(#{1,6})\\s+(.*)/);\n      if (headingMatch) {\n        nodes.push({\n          type: 'heading',\n          level: headingMatch[1].length as 1 | 2 | 3 | 4 | 5 | 6,\n          children: parseInline(escapeHtml(headingMatch[2])),\n        });\n        i++;\n        continue;\n      }\n\n      // ── Horizontal rule ────────────────────────────────────────────────────\n      if (/^-{3,}$/.test(line.trim())) {\n        nodes.push({ type: 'hr' });\n        i++;\n        continue;\n      }\n\n      // ── Blockquote ─────────────────────────────────────────────────────────\n      if (line.startsWith('> ')) {\n        const quoteLines: string[] = [];\n        while (i < lines.length && lines[i].startsWith('> ')) {\n          quoteLines.push(lines[i].slice(2));\n          i++;\n        }\n        nodes.push({\n          type: 'blockquote',\n          children: parseInline(escapeHtml(quoteLines.join('\\n'))),\n        });\n        continue;\n      }\n\n      // ── GFM Table ──────────────────────────────────────────────────────────\n      if (line.startsWith('|') && i + 1 < lines.length && isTableSeparator(lines[i + 1])) {\n        const headers = parseTableRow(line);\n        i += 2;\n        const rows: string[][] = [];\n        while (i < lines.length && lines[i].startsWith('|')) {\n          rows.push(parseTableRow(lines[i]));\n          i++;\n        }\n        nodes.push({ type: 'table', headers, rows });\n        continue;\n      }\n\n      // ── Ordered / Unordered list ───────────────────────────────────────────\n      if (/^\\s*\\d+\\.\\s+/.test(line) || /^\\s*[-*]\\s+/.test(line)) {\n        const listLines: string[] = [];\n        while (\n          i < lines.length &&\n          (/^\\s*\\d+\\.\\s+/.test(lines[i]) ||\n            /^\\s*[-*]\\s+/.test(lines[i]) ||\n            /^\\s{2,}/.test(lines[i]))\n        ) {\n          listLines.push(lines[i]);\n          i++;\n        }\n        nodes.push(parseListItems(listLines));\n        continue;\n      }\n\n      // ── Blank line ─────────────────────────────────────────────────────────\n      if (line.trim() === '') {\n        nodes.push({ type: 'lineBreak' });\n        i++;\n        continue;\n      }\n\n      // ── Paragraph ─────────────────────────────────────────────────────────\n      const paraLines: string[] = [];\n      while (\n        i < lines.length &&\n        lines[i].trim() !== '' &&\n        !lines[i].match(/^#{1,6}\\s/) &&\n        getFenceLang(lines[i]) === null &&\n        !lines[i].startsWith('> ') &&\n        !lines[i].startsWith('|') &&\n        !/^\\s*\\d+\\.\\s+/.test(lines[i]) &&\n        !/^\\s*[-*]\\s+/.test(lines[i]) &&\n        !/^-{3,}$/.test(lines[i].trim())\n      ) {\n        paraLines.push(lines[i]);\n        i++;\n      }\n\n      if (paraLines.length > 0) {\n        const paraText = paraLines.join('\\n');\n        nodes.push({\n          type: 'paragraph',\n          children: parseInline(escapeHtml(paraText.trimEnd())),\n        });\n      }\n    }\n\n    return nodes;\n  }\n}\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  ViewEncapsulation,\n  computed,\n  inject,\n  output,\n  signal,\n  WritableSignal,\n  input,\n  PLATFORM_ID,\n  untracked,\n} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport { DomSanitizer, SafeHtml } from '@angular/platform-browser';\nimport { isPlatformBrowser } from '@angular/common';\nimport { CommonModule } from '@angular/common';\nimport { CometChatMarkdownParser, MarkdownNode, parseInline } from './cometchat-markdown-parser';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Walks a MarkdownNode[] AST and produces an HTML string.\n * Code blocks are given a `data-code-block-index` attribute for copy-button wiring.\n */\nfunction renderToHtml(nodes: MarkdownNode[], codeBlockIndex: { value: number }): string {\n  let html = '';\n  for (const node of nodes) {\n    html += renderNode(node, codeBlockIndex);\n  }\n  return html;\n}\n\nfunction renderChildren(node: MarkdownNode, codeBlockIndex: { value: number }): string {\n  if (!node.children?.length) return node.content ?? '';\n  return renderToHtml(node.children, codeBlockIndex);\n}\n\n/**\n * Recursively parse inline content for nested formatting (e.g. bold containing italic).\n * If the content has no formatting markers it returns the text as-is.\n */\nfunction parseAndRenderInline(content: string, codeBlockIndex: { value: number }): string {\n  // Quick check: if there are no formatting markers, just return as-is\n  if (!/[*_~`]/.test(content)) return content;\n  const nodes = parseInline(content);\n  // If parsing produced only a single text node with same content, no nesting found\n  if (nodes.length === 1 && nodes[0].type === 'text') return content;\n  return renderToHtml(nodes, codeBlockIndex);\n}\n\nfunction renderNode(node: MarkdownNode, codeBlockIndex: { value: number }): string {\n  switch (node.type) {\n    case 'heading': {\n      const lvl = node.level ?? 1;\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<h${lvl} class=\"cometchat-markdown-renderer__heading cometchat-markdown-renderer__heading--${lvl}\">${inner}</h${lvl}>`;\n    }\n    case 'paragraph': {\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<p class=\"cometchat-markdown-renderer__paragraph\">${inner}</p>`;\n    }\n    case 'bold': {\n      const inner = parseAndRenderInline(node.content ?? '', codeBlockIndex);\n      return `<strong class=\"cometchat-markdown-renderer__bold\">${inner}</strong>`;\n    }\n    case 'italic': {\n      const inner = parseAndRenderInline(node.content ?? '', codeBlockIndex);\n      return `<em class=\"cometchat-markdown-renderer__italic\">${inner}</em>`;\n    }\n    case 'underline': {\n      const inner = parseAndRenderInline(node.content ?? '', codeBlockIndex);\n      return `<u class=\"cometchat-markdown-renderer__underline\">${inner}</u>`;\n    }\n    case 'strikethrough': {\n      const inner = parseAndRenderInline(node.content ?? '', codeBlockIndex);\n      return `<del class=\"cometchat-markdown-renderer__strikethrough\">${inner}</del>`;\n    }\n    case 'inlineCode':\n      return `<code class=\"cometchat-markdown-renderer__inline-code\">${node.content ?? ''}</code>`;\n    case 'codeBlock': {\n      const idx = codeBlockIndex.value++;\n      const lang = node.lang ?? '';\n      const escaped = escapeHtmlContent(node.content ?? '');\n      const langLabel = lang\n        ? `<span class=\"cometchat-markdown-renderer__code-lang\">${escapeHtmlContent(lang)}</span>`\n        : '';\n      return (\n        `<div class=\"cometchat-markdown-renderer__code-block\">` +\n        `<div class=\"cometchat-markdown-renderer__code-header\">` +\n        langLabel +\n        `<button data-copy-btn data-code-index=\"${idx}\" class=\"cometchat-markdown-renderer__code-copy-btn\" title=\"${CometChatLocalize.getLocalizedString('markdown_copy_code')}\" aria-label=\"${CometChatLocalize.getLocalizedString('markdown_copy_code')}\">` +\n        `<span class=\"cometchat-markdown-renderer__code-copy-icon\"></span>` +\n        `</button>` +\n        `</div>` +\n        `<pre><code class=\"language-${lang}\">${escaped}</code></pre>` +\n        `</div>`\n      );\n    }\n    case 'blockquote': {\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<blockquote class=\"cometchat-markdown-renderer__blockquote\">${inner}</blockquote>`;\n    }\n    case 'orderedList': {\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<ol class=\"cometchat-markdown-renderer__ordered-list\">${inner}</ol>`;\n    }\n    case 'unorderedList': {\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<ul class=\"cometchat-markdown-renderer__unordered-list\">${inner}</ul>`;\n    }\n    case 'listItem': {\n      const inner = renderChildren(node, codeBlockIndex);\n      return `<li class=\"cometchat-markdown-renderer__list-item\">${inner}</li>`;\n    }\n    case 'link': {\n      const href = node.href ?? '#';\n      const content = node.content ?? '';\n      return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"cometchat-markdown-renderer__link\">${content}</a>`;\n    }\n    case 'image': {\n      const src = node.href ?? '';\n      const alt = node.alt ?? '';\n      return `<img src=\"${src}\" alt=\"${alt}\" class=\"cometchat-markdown-renderer__image\" data-img-click=\"${src}\" />`;\n    }\n    case 'hr':\n      return `<hr class=\"cometchat-markdown-renderer__hr\" />`;\n    case 'lineBreak':\n      return `<br />`;\n    case 'table': {\n      const headers = node.headers ?? [];\n      const rows = node.rows ?? [];\n      const headerHtml = headers\n        .map((h) => `<th class=\"cometchat-markdown-renderer__table-header-cell\">${h}</th>`)\n        .join('');\n      const rowsHtml = rows\n        .map(\n          (row) =>\n            `<tr class=\"cometchat-markdown-renderer__table-row\">${row\n              .map((cell) => `<td class=\"cometchat-markdown-renderer__table-cell\">${cell}</td>`)\n              .join('')}</tr>`\n        )\n        .join('');\n      return (\n        `<div class=\"cometchat-markdown-renderer__table-wrapper\">` +\n        `<table class=\"cometchat-markdown-renderer__table\">` +\n        `<thead class=\"cometchat-markdown-renderer__table-head\"><tr class=\"cometchat-markdown-renderer__table-row\">${headerHtml}</tr></thead>` +\n        `<tbody class=\"cometchat-markdown-renderer__table-body\">${rowsHtml}</tbody>` +\n        `</table>` +\n        `</div>`\n      );\n    }\n    case 'text':\n      return node.content ?? '';\n    default:\n      return node.content ?? '';\n  }\n}\n\nfunction escapeHtmlContent(text: string): string {\n  return text\n    .replace(/&/g, '&amp;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&#39;');\n}\n\nfunction collectCodeBlocks(nodes: MarkdownNode[], out: string[]): void {\n  for (const node of nodes) {\n    if (node.type === 'codeBlock') {\n      out.push(node.content ?? '');\n    }\n    if (node.children?.length) {\n      collectCodeBlocks(node.children, out);\n    }\n  }\n}\n\nconst _parser = new CometChatMarkdownParser();\n\n/** Internal parse result — HTML string + extracted code block contents. */\ninterface ParseResult {\n  html: string;\n  codeContents: string[];\n}\n\n@Component({\n  selector: 'cometchat-markdown-renderer',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  encapsulation: ViewEncapsulation.None,\n  imports: [CommonModule],\n  templateUrl: './cometchat-markdown-renderer.component.html',\n  styleUrls: ['./cometchat-markdown-renderer.component.css'],\n  host: {\n    style: 'display: block; min-width: 0; max-width: 100%;',\n  },\n})\nexport class CometChatMarkdownRenderer {\n  private readonly sanitizer = inject(DomSanitizer);\n  private readonly platformId = inject(PLATFORM_ID);\n\n  readonly text = input.required<string>();\n  readonly streaming = input<boolean>(false);\n\n  readonly imageClick = output<string>();\n\n  /** Tracks copy state per code block (parallel array to parsed code blocks). */\n  isCopied: WritableSignal<boolean>[] = [];\n\n  /**\n   * Internal computed that parses the AST and produces both the HTML string\n   * and the list of raw code block contents. Pure computation — no side effects.\n   */\n  private readonly _parseResult = computed<ParseResult>(() => {\n    const ast = _parser.parse(this.text(), this.streaming());\n    const codeContents: string[] = [];\n    collectCodeBlocks(ast, codeContents);\n    const codeBlockIndex = { value: 0 };\n    const html = renderToHtml(ast, codeBlockIndex);\n    return { html, codeContents };\n  });\n\n  /** Sanitized HTML bound via [innerHTML]. Re-runs only when text() or streaming() changes. */\n  readonly renderedHtml = computed<SafeHtml>(() =>\n    this.sanitizer.bypassSecurityTrustHtml(this._parseResult().html)\n  );\n\n  /** Raw code content per code block — derived from the parse result. */\n  readonly codeBlocks = computed<string[]>(() => this._parseResult().codeContents);\n\n  constructor() {\n    // Sync isCopied array length whenever the number of code blocks changes.\n    // Uses untracked() to avoid circular dependency — we only read codeBlocks()\n    // to determine the new length, then mutate the plain array outside the signal graph.\n    safeEffect(() => {\n      const count = this.codeBlocks().length;\n      untracked(() => {\n        while (this.isCopied.length < count) {\n          this.isCopied.push(signal(false));\n        }\n        this.isCopied.length = count;\n      });\n    });\n  }\n\n  onContainerClick(event: MouseEvent): void {\n    const target = event.target as HTMLElement;\n\n    // Handle copy button clicks\n    const copyBtn = target.closest('[data-copy-btn]') as HTMLElement | null;\n    if (copyBtn) {\n      const indexStr = copyBtn.getAttribute('data-code-index');\n      if (indexStr !== null) {\n        const idx = parseInt(indexStr, 10);\n        this._copyCode(idx);\n      }\n      return;\n    }\n\n    // Handle image clicks\n    if (target.tagName === 'IMG') {\n      const imgSrc = target.getAttribute('data-img-click') ?? (target as HTMLImageElement).src;\n      if (imgSrc) {\n        this.imageClick.emit(imgSrc);\n      }\n    }\n  }\n\n  private _copyCode(index: number): void {\n    const blocks = this.codeBlocks();\n    if (index < 0 || index >= blocks.length) return;\n    const code = blocks[index];\n\n    this._writeToClipboard(code);\n\n    const sig = this.isCopied[index];\n    if (sig) {\n      sig.set(true);\n      setTimeout(() => sig.set(false), 2000);\n    }\n  }\n\n  private _writeToClipboard(text: string): void {\n    if (isPlatformBrowser(this.platformId) && navigator?.clipboard) {\n      navigator.clipboard.writeText(text).catch(() => {\n        // Silently fail per spec: no error surfaced to user\n      });\n    } else if (isPlatformBrowser(this.platformId)) {\n      // Fallback for older browsers\n      const textarea = document.createElement('textarea');\n      textarea.value = text;\n      textarea.style.position = 'fixed';\n      textarea.style.opacity = '0';\n      document.body.appendChild(textarea);\n      textarea.select();\n      try {\n        document.execCommand('copy');\n      } catch {\n        // Silently fail\n      }\n      document.body.removeChild(textarea);\n    }\n  }\n}\n","<div\n  class=\"cometchat-markdown-renderer__container\"\n  [innerHTML]=\"renderedHtml()\"\n  (click)=\"onContainerClick($event)\"\n></div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  input,\n  signal,\n  ViewChild,\n  TemplateRef,\n  PLATFORM_ID,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMarkdownRenderer } from '../cometchat-markdown-renderer/cometchat-markdown-renderer.component';\nimport { CometChatUIEvents } from '../../events/CometChatUIEvents';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\n// Same renderer the developer-card bubble uses; agent cards reuse it for their\n// `card` element blocks.\nimport { CometChatCardViewComponent } from '@cometchat/cards-angular';\nimport type { CometChatCardActionEvent } from '@cometchat/cards-angular';\nimport { cardPayloadToJson, safeString } from '../../utils/card-utils';\n\n/**\n * A normalized content block derived from one `AIAssistantElement`.\n * `text` blocks carry the assistant prose; `card` blocks carry the stringified raw\n * card payload (or a fallback string when the payload is empty/invalid).\n */\nexport type AIAssistantContentBlock =\n  | { kind: 'text'; text: string }\n  | { kind: 'card'; cardJson: string; fallback: string };\n\n/**\n * CometChatAIAssistantMessageBubble renders a completed AI assistant message\n * with rich markdown formatting via CometChatMarkdownRenderer.\n *\n * Requirements: 5.1–5.8, 13.1, 16.1, 16.4, 16.5\n */\n@Component({\n  selector: 'cometchat-ai-assistant-message-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatMarkdownRenderer, CometChatCardViewComponent, TranslatePipe],\n  templateUrl: './cometchat-ai-assistant-message-bubble.component.html',\n  styleUrls: ['./cometchat-ai-assistant-message-bubble.component.css'],\n  host: {\n    style: 'content-visibility: auto; contain-intrinsic-size: 0 120px;',\n  },\n})\nexport class CometChatAIAssistantMessageBubble {\n  private readonly platformId = inject(PLATFORM_ID);\n  private readonly destroyRef = inject(DestroyRef);\n\n  /** Required input: the completed AI assistant message to render. */\n  readonly message = input.required<CometChat.AIAssistantMessage>();\n\n  /** Derived text from the message data — re-computes only when message() changes. */\n  readonly messageText = computed(\n    () => this.message().getAssistantMessageData()?.getText() ?? ''\n  );\n\n  /**\n   * Ordered content blocks from `getElements()`, or `null`\n   * when the message has no elements (older messages) — in which case the\n   * template falls back to the existing `getText()` markdown render. The\n   * `agentic/assistant` routing is unchanged; only this content view differs.\n   */\n  readonly blocks = computed<AIAssistantContentBlock[] | null>(() => {\n    let elements: CometChat.AIAssistantElement[] = [];\n    try {\n      elements = this.message().getElements?.() ?? [];\n    } catch {\n      elements = [];\n    }\n    if (!elements || elements.length === 0) return null;\n\n    return elements.map((el): AIAssistantContentBlock => {\n      const type = safeString(() => el.getType?.());\n      let data: unknown;\n      try { data = el.getData?.(); } catch { data = undefined; }\n\n      if (type === 'card') {\n        const card = (data as { card?: unknown } | undefined)?.card;\n        return {\n          kind: 'card',\n          cardJson: cardPayloadToJson(card),\n          fallback: (card as { fallbackText?: string } | undefined)?.fallbackText ?? '',\n        };\n      }\n\n      // \"text\" (and any non-card block) renders as the assistant's existing text.\n      const text =\n        typeof data === 'string'\n          ? data\n          : ((data as { text?: string } | undefined)?.text ?? '');\n      return { kind: 'text', text };\n    });\n  });\n\n  /** Current color scheme, updated via window.matchMedia listener. Also handed to nested card renderers as the theme mode. */\n  readonly colorScheme = signal<'light' | 'dark'>('light');\n\n  /** Template ref for the image fullscreen viewer dialog. */\n  @ViewChild('imageViewerTpl') imageViewerTpl!: TemplateRef<unknown>;\n\n  /** Currently clicked image URL — used by the viewer template. */\n  readonly activeImageUrl = signal<string>('');\n\n  constructor() {\n    if (!isPlatformBrowser(this.platformId)) return;\n\n    const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n\n    const updateScheme = (e: MediaQueryListEvent | MediaQueryList) => {\n      this.colorScheme.set(e.matches ? 'dark' : 'light');\n    };\n\n    // Set initial value\n    updateScheme(mediaQuery);\n\n    // Listen for changes\n    mediaQuery.addEventListener('change', updateScheme);\n\n    // Cleanup on destroy\n    this.destroyRef.onDestroy(() => {\n      mediaQuery.removeEventListener('change', updateScheme);\n    });\n  }\n\n  /**\n   * Handles imageClick from CometChatMarkdownRenderer.\n   * Opens the image in a dialog via CometChatUIEvents.ccShowDialog.\n   */\n  onImageClick(url: string): void {\n    this.activeImageUrl.set(url);\n    CometChatUIEvents.ccShowDialog.next({\n      child: this.imageViewerTpl,\n      confirmCallback: () => {},\n    });\n  }\n\n  /**\n   * Pure-forward of a nested agent-card action. This bubble is\n   * kit-instantiated, so no `(onCardAction)` prop reaches the app — the action is\n   * emitted on the global event bus only, carrying the owning AIAssistantMessage.\n   */\n  onCardAction(event: CometChatCardActionEvent): void {\n    CometChatMessageEvents.ccCardActionClicked.next({\n      message: this.message(),\n      action: event?.action,\n      elementId: event?.elementId,\n      cardJson: event?.cardJson,\n    });\n  }\n}\n","<div class=\"cometchat-ai-assistant-message-bubble\" [attr.data-color-scheme]=\"colorScheme()\">\n  @if (blocks(); as contentBlocks) {\n    <!--\n      Render getElements() blocks IN ORDER: text blocks via the existing markdown\n      renderer, card blocks via the shared CometChatCardView.\n    -->\n    @for (block of contentBlocks; track $index) {\n      @switch (block.kind) {\n        @case ('text') {\n          <cometchat-markdown-renderer\n            class=\"cometchat-ai-assistant-message-bubble__renderer\"\n            [text]=\"block.text\"\n            [streaming]=\"false\"\n            (imageClick)=\"onImageClick($event)\"\n          />\n        }\n        @case ('card') {\n          @if (block.cardJson) {\n            <cometchat-card-view\n              class=\"cometchat-ai-assistant-message-bubble__card\"\n              [cardJson]=\"block.cardJson\"\n              [themeMode]=\"colorScheme()\"\n              (action)=\"onCardAction($event)\"\n            ></cometchat-card-view>\n          } @else {\n            <div class=\"cometchat-ai-assistant-message-bubble__card-fallback\">\n              {{ block.fallback || ('card_message' | translate) }}\n            </div>\n          }\n        }\n      }\n    }\n  } @else {\n    <!-- No elements (older messages) — existing getText() render, unchanged. -->\n    @defer (on viewport) {\n      <cometchat-markdown-renderer\n        class=\"cometchat-ai-assistant-message-bubble__renderer\"\n        [text]=\"messageText()\"\n        [streaming]=\"false\"\n        (imageClick)=\"onImageClick($event)\"\n      />\n    } @placeholder {\n      <div class=\"cometchat-ai-assistant-message-bubble__placeholder\" aria-hidden=\"true\"></div>\n    }\n  }\n</div>\n\n<!-- Image viewer template — opened via CometChatUIEvents.ccShowDialog -->\n<ng-template #imageViewerTpl>\n  <div class=\"cometchat-ai-assistant-message-bubble__image-viewer\">\n    <img\n      [src]=\"activeImageUrl()\"\n      alt=\"\"\n      class=\"cometchat-ai-assistant-message-bubble__image-viewer-img\"\n    />\n  </div>\n</ng-template>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n} from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * CometChatToolCallArgumentBubble displays the arguments passed to a tool call\n * as formatted JSON (pretty-printed when valid, raw otherwise).\n *\n * Requirements: 7.1–7.7, 13.1, 15.1, 15.2, 16.1\n */\n@Component({\n  selector: 'cometchat-toolcall-argument-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [],\n  templateUrl: './cometchat-toolcall-argument-bubble.component.html',\n  styleUrls: ['./cometchat-toolcall-argument-bubble.component.css'],\n})\nexport class CometChatToolCallArgumentBubble {\n  /** Required input: the AI tool argument message to render. */\n  readonly message = input.required<CometChat.AIToolArgumentMessage>();\n\n  /** Derived tool calls array — re-computes only when message() changes. */\n  readonly toolCalls = computed(() =>\n    this.message().getToolArgumentMessageData().getToolCalls() ?? []\n  );\n\n  /**\n   * Formatted arguments per tool call.\n   * Valid JSON is pretty-printed (2-space indent); invalid JSON is passed through raw.\n   * Re-computes only when toolCalls() changes.\n   */\n  readonly formattedArgs = computed(() =>\n    this.toolCalls().map((tc) => {\n      try {\n        return JSON.stringify(JSON.parse(tc.function.arguments), null, 2);\n      } catch {\n        return tc.function.arguments;\n      }\n    })\n  );\n}\n","<div class=\"cometchat-toolcall-argument-bubble\">\n  @for (tc of toolCalls(); track tc.getId()) {\n    <div class=\"cometchat-toolcall-argument-bubble__item\">\n      @if (tc.displayName) {\n        <span class=\"cometchat-toolcall-argument-bubble__name\">\n          {{ tc.displayName }}\n        </span>\n      }\n      @if (tc.executionText) {\n        <span class=\"cometchat-toolcall-argument-bubble__execution-text\">\n          {{ tc.executionText }}\n        </span>\n      }\n      <pre class=\"cometchat-toolcall-argument-bubble__arguments\">{{ formattedArgs()[$index] }}</pre>\n    </div>\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  input,\n} from '@angular/core';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/**\n * CometChatToolCallResultBubble displays the result returned by a tool call\n * as formatted JSON (pretty-printed when valid, raw otherwise).\n * Renders nothing when the result is empty or null.\n *\n * Requirements: 8.1–8.7, 13.1, 15.1, 15.2, 16.1\n */\n@Component({\n  selector: 'cometchat-toolcall-result-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './cometchat-toolcall-result-bubble.component.html',\n  styleUrls: ['./cometchat-toolcall-result-bubble.component.css'],\n})\nexport class CometChatToolCallResultBubble {\n  /** Required input: the AI tool result message to render. */\n  readonly message = input.required<CometChat.AIToolResultMessage>();\n\n  /** Extracted result text — re-computes only when message() changes. */\n  readonly resultText = computed(() =>\n    this.message().getToolResultMessageData().getText()\n  );\n\n  /**\n   * Formatted result text.\n   * Returns null for empty/absent text (template renders nothing).\n   * Valid JSON is pretty-printed (2-space indent); invalid JSON is passed through raw.\n   * Re-computes only when resultText() changes.\n   */\n  readonly formattedResult = computed(() => {\n    const text = this.resultText();\n    if (!text) return null;\n    try {\n      return JSON.stringify(JSON.parse(text), null, 2);\n    } catch {\n      return text;\n    }\n  });\n}\n","@if (formattedResult()) {\n  <div class=\"cometchat-toolcall-result-bubble\">\n    <div class=\"cometchat-toolcall-result-bubble__item\">\n      <pre class=\"cometchat-toolcall-result-bubble__content\">{{ formattedResult() }}</pre>\n    </div>\n  </div>\n}\n","\n\nimport {Component, Input, Output, EventEmitter, OnInit, OnChanges, OnDestroy, AfterViewInit, SimpleChanges, TemplateRef, ChangeDetectionStrategy, ChangeDetectorRef, inject, ViewChild, ElementRef, computed, signal, booleanAttribute, DestroyRef,} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {DatePipe} from '@angular/common';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\n\nimport {TranslatePipe} from '../../resources/CometChatLocalize/translate.pipe';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {MessageBubbleAlignment, Placement} from '../../Enums/Enums';\nimport {CometChatActionsIcon} from '../../modals/CometChatActionsIcon';\nimport {CometChatActionsView} from '../../modals/CometChatActionsView';\nimport {CometChatTextFormatter} from '../../formatters/cometchat-text-formatter';\nimport {CometChatUIKit} from '../../cometchat-uikit';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {MessageUtilsService} from '../../services/message-utils.service';\nimport {MessageBubbleConfigService, BubblePart,} from '../../services/message-bubble-config.service';\nimport {COMETCHAT_GLOBAL_CONFIG, GlobalConfig} from '../../services/global-config.service';\nimport {CallButtonsService} from '../../services/call-buttons.service';\nimport {CalendarObject} from '../../resources/CometChatLocalize/localization.interfaces';\n\nimport {CometChatContextMenuComponent, ContextMenuItem,} from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\nimport {CometChatAvatarComponent} from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport {CometChatDateComponent} from '../base-elements/cometchat-date/cometchat-date.component';\nimport {CometChatTextBubbleComponent} from '../cometchat-text-bubble/cometchat-text-bubble.component';\nimport {CometChatImagesBubbleComponent} from '../cometchat-images-bubble/cometchat-images-bubble.component';\nimport {CometChatVideosBubbleComponent} from '../cometchat-videos-bubble/cometchat-videos-bubble.component';\nimport {CometChatFilesBubbleComponent} from '../cometchat-files-bubble/cometchat-files-bubble.component';\nimport {CometChatAudiosBubbleComponent} from '../cometchat-audios-bubble/cometchat-audios-bubble.component';\nimport {CometChatVoiceNoteBubbleComponent} from '../cometchat-voice-note-bubble/cometchat-voice-note-bubble.component';\nimport {CometChatDeleteBubbleComponent} from '../cometchat-delete-bubble/cometchat-delete-bubble.component';\nimport {CometChatActionBubbleComponent} from '../cometchat-action-bubble/cometchat-action-bubble.component';\nimport {CometChatMessagePreviewComponent} from '../base-elements/cometchat-message-preview/cometchat-message-preview.component';\nimport {CometChatThreadViewComponent} from '../base-elements/cometchat-thread-view/cometchat-thread-view.component';\nimport {CometChatPollBubbleComponent} from '../cometchat-poll-bubble/cometchat-poll-bubble.component';\nimport {CometChatCollaborativeDocumentBubbleComponent} from '../cometchat-collaborative-document-bubble/cometchat-collaborative-document-bubble.component';\nimport {CometChatCollaborativeWhiteboardBubbleComponent} from '../cometchat-collaborative-whiteboard-bubble/cometchat-collaborative-whiteboard-bubble.component';\nimport {CometChatStickerBubbleComponent} from '../cometchat-sticker-bubble/cometchat-sticker-bubble.component';\nimport {CometChatCallBubbleComponent} from '../cometchat-call-bubble/cometchat-call-bubble.component';\nimport {CallButtonClickEvent} from '../cometchat-call-bubble/cometchat-call-bubble.component';\nimport {CometChatReactionsComponent} from '../cometchat-reactions';\nimport {CometChatAIAssistantMessageBubble} from '../cometchat-ai-assistant-message-bubble/cometchat-ai-assistant-message-bubble.component';\nimport {CometChatToolCallArgumentBubble} from '../cometchat-toolcall-argument-bubble/cometchat-toolcall-argument-bubble.component';\nimport {CometChatToolCallResultBubble} from '../cometchat-toolcall-result-bubble/cometchat-toolcall-result-bubble.component';\nimport {isVoiceNote} from '../../utils/message-metadata-utils';\nimport {CometChatCardBubbleComponent} from '../cometchat-card-bubble/cometchat-card-bubble.component';\n\nconst BUBBLE_TYPE_MAP: Record<string, string> = {\n  text_message: 'cometchat-message-bubble__text-message',\n  audio_message: 'cometchat-message-bubble__audio-message',\n  delete_action: 'cometchat-message-bubble__delete-message',\n  file_message: 'cometchat-message-bubble__file-message',\n  groupMember_action: 'cometchat-message-bubble__group-message',\n  image_message: 'cometchat-message-bubble__image-message',\n  video_message: 'cometchat-message-bubble__video-message',\n  extension_document_custom: 'cometchat-message-bubble__document-message',\n  extension_whiteboard_custom: 'cometchat-message-bubble__whiteboard-message',\n  extension_poll_custom: 'cometchat-message-bubble__poll-message',\n  extension_sticker_custom: 'cometchat-message-bubble__sticker-message',\n  audio_call: 'cometchat-message-bubble__audio-call',\n  video_call: 'cometchat-message-bubble__video-call',\n  meeting_custom: 'cometchat-message-bubble__meeting-message',\n};\n\nconst CONTENT_TYPE_MAP: Record<string, string> = {\n  text_message: 'text',\n  image_message: 'image',\n  video_message: 'video',\n  audio_message: 'audio',\n  file_message: 'file',\n\n  extension_poll_custom: 'poll',\n  extension_sticker_custom: 'sticker',\n  extension_document_custom: 'document',\n  extension_whiteboard_custom: 'whiteboard',\n  meeting_custom: 'meeting',\n\n  groupMember_action: 'action',\n\n  assistant_agentic: 'ai-assistant',\n  tool_result_agentic: 'tool-result',\n  tool_arguments_agentic: 'tool-arguments',\n};\n\n@Component({\n  selector: 'cometchat-message-bubble',\n  standalone: true,\n  templateUrl: './cometchat-message-bubble.component.html',\n  styleUrls: ['./cometchat-message-bubble.component.css'],\n  imports: [CommonModule, CometChatContextMenuComponent, CometChatAvatarComponent, CometChatDateComponent, CometChatTextBubbleComponent, CometChatImagesBubbleComponent, CometChatVideosBubbleComponent, CometChatAudiosBubbleComponent, CometChatVoiceNoteBubbleComponent, CometChatFilesBubbleComponent, CometChatDeleteBubbleComponent, CometChatActionBubbleComponent, CometChatMessagePreviewComponent, CometChatThreadViewComponent, CometChatPollBubbleComponent, CometChatCollaborativeDocumentBubbleComponent, CometChatCollaborativeWhiteboardBubbleComponent, CometChatStickerBubbleComponent, CometChatCallBubbleComponent, CometChatReactionsComponent, CometChatAIAssistantMessageBubble, CometChatToolCallArgumentBubble, CometChatToolCallResultBubble, CometChatCardBubbleComponent, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatMessageBubbleComponent\n  implements OnInit, OnChanges, OnDestroy, AfterViewInit\n{\n  @Input({ required: true }) message!: CometChat.BaseMessage;\n  @Input() alignment: MessageBubbleAlignment = MessageBubbleAlignment.right;\n  @Input() group: CometChat.Group | null = null;\n  @Input() options: (CometChatActionsIcon | CometChatActionsView)[] = [];\n  @Input() quickOptionsCount = 2;\n  @Input() leadingView: TemplateRef<any> | null = null;\n  @Input() headerView: TemplateRef<any> | null = null;\n  @Input() replyView: TemplateRef<any> | null = null;\n  @Input() contentView: TemplateRef<any> | null = null;\n  @Input() bottomView: TemplateRef<any> | null = null;\n  @Input() footerView: TemplateRef<any> | null = null;\n  @Input() statusInfoView: TemplateRef<any> | null = null;\n  @Input() threadView: TemplateRef<any> | null = null;\n  @Input({ transform: booleanAttribute }) hideThreadView = false;\n  @Input() bubbleView: TemplateRef<any> | null = null;\n  @Input({ transform: booleanAttribute })\n  set hideAvatar(value: boolean) { this._hideAvatar.set(value); this.hideAvatarExplicitlySet.set(true); }\n  get hideAvatar(): boolean { return this._hideAvatar(); }\n  @Input() hideSenderName = false;\n  @Input({ transform: booleanAttribute })\n  set hideReceipts(value: boolean) { this._hideReceipts.set(value); this.hideReceiptsExplicitlySet.set(true); }\n  get hideReceipts(): boolean { return this._hideReceipts(); }\n  @Input() hideTimestamp = false;\n  @Input({ transform: booleanAttribute }) hideStatusInfoView = false;\n  @Input() showError = false;\n  @Input({ transform: booleanAttribute })\n  set hideModerationView(value: boolean) { this._hideModerationView.set(value); this.hideModerationViewExplicitlySet.set(true); }\n  get hideModerationView(): boolean { return this._hideModerationView(); }\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[] | undefined) { if (value != null) { this._textFormatters.set(value); this.textFormattersExplicitlySet.set(true); } }\n  get textFormatters(): CometChatTextFormatter[] { return this._textFormatters(); }\n  @Input() dateFormat?: CalendarObject;\n  @Input() isSelected = false;\n  @Input() ariaPosinset?: number;\n  @Input() ariaSetsize?: number;\n  @Input() translatedText?: string;\n  @Input() reactionsRequestBuilder?: CometChat.ReactionsRequestBuilder;\n  @Input() disableInteraction = false;\n  /** When true (and left-aligned), reserve the avatar column even though the avatar is hidden, so\n   *  batch-continuation messages align under the first message of the batch. */\n  @Input({ transform: booleanAttribute }) reserveLeadingSpace = false;\n  @Output() optionClick = new EventEmitter<ContextMenuItem>();\n  @Output() replyPreviewClick = new EventEmitter<CometChat.BaseMessage>();\n  @Output() avatarClick = new EventEmitter<CometChat.User>();\n  @Output() threadRepliesClick = new EventEmitter<CometChat.BaseMessage>();\n  @Output() reactionClick = new EventEmitter<{ reaction: CometChat.ReactionCount; message: CometChat.BaseMessage }>();\n  @Output() reactionListItemClick = new EventEmitter<{ reaction: CometChat.Reaction; message: CometChat.BaseMessage }>();\n  @Output() mediaToggle = new EventEmitter<CometChat.BaseMessage>();\n  @Output() messageActionsOpen = new EventEmitter<CometChat.BaseMessage>();\n  @ViewChild('bubbleWrapper') bubbleWrapperRef!: ElementRef<HTMLDivElement>;\n  @ViewChild('contentViewRef') contentViewRef?: ElementRef<HTMLElement>;\n  @ViewChild(CometChatContextMenuComponent) contextMenuRef?: CometChatContextMenuComponent;\n\n  protected isHovering = false; protected isMobile = false; private hoverTimeoutRef: ReturnType<typeof setTimeout> | null = null;\n  loggedInUser: CometChat.User | null = null; contentViewWidth = signal(0); private contentViewResizeObserver: ResizeObserver | null = null;\n\n  private readonly cdr = inject(ChangeDetectorRef); private readonly messageUtils = inject(MessageUtilsService);\n  private readonly bubbleConfigService = inject(MessageBubbleConfigService); private readonly callButtonsService = inject(CallButtonsService);\n  private readonly datePipe = new DatePipe('en-US'); private readonly destroyRef = inject(DestroyRef);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private hideReceiptsExplicitlySet = signal(false); private hideAvatarExplicitlySet = signal(false); private textFormattersExplicitlySet = signal(false); private hideModerationViewExplicitlySet = signal(false);\n  private _hideReceipts = signal(false); private _hideAvatar = signal(false); private _textFormatters = signal<CometChatTextFormatter[]>([]); private _hideModerationView = signal(false);\n  readonly MessageBubbleAlignment = MessageBubbleAlignment; readonly Placement = Placement;\n  effectiveHideReceipts = computed(() => { if (this.hideReceiptsExplicitlySet()) return this._hideReceipts(); return this.globalConfig?.hideReceipts ?? false; });\n  effectiveHideAvatar = computed(() => { if (this.hideAvatarExplicitlySet()) return this._hideAvatar(); return this.globalConfig?.hideAvatar ?? false; });\n  effectiveTextFormatters = computed((): CometChatTextFormatter[] | undefined => { if (this.textFormattersExplicitlySet()) return this._textFormatters(); return this.globalConfig?.textFormatters; });\n  effectiveHideModerationView = computed(() => { if (this.hideModerationViewExplicitlySet()) return this._hideModerationView(); return false; });\n  ngOnInit(): void {\n    this.loggedInUser = CometChatUIKit.getLoggedInUser();\n    this.detectMobileDevice();\n    this.setupMobileResizeListener();\n    this.bubbleConfigService.configChanged$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.cdr.markForCheck();\n    });\n  }\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message']) { this.cdr.markForCheck(); }\n  }\n  ngAfterViewInit(): void { this.setupContentViewResizeObserver(); }\n  ngOnDestroy(): void { this.clearHoverTimeout(); this.contentViewResizeObserver?.disconnect(); this.contentViewResizeObserver = null; }\n  get messageId(): string | number { if (!this.message) return ''; return this.message.getId() || this.message.getMuid() || ''; }\n  get messageType(): string { if (!this.message) return ''; return this.message.getType() || ''; }\n  get messageCategory(): string { if (!this.message) return ''; return this.message.getCategory() || ''; }\n  get bubbleClassName(): string { switch (this.alignment) { case MessageBubbleAlignment.left: return 'cometchat-message-bubble-incoming'; case MessageBubbleAlignment.right: return 'cometchat-message-bubble-outgoing'; case MessageBubbleAlignment.center: return 'cometchat-message-bubble-action'; default: return 'cometchat-message-bubble-outgoing'; } }\n  get bubbleTypeClassName(): string {\n    if (!this.message) return '';\n    // Developer card type is arbitrary, so key the bubble-type class by\n    // CATEGORY (not type_category) so the card gets the standard text-like container.\n    if (this.messageCategory === CometChatUIKitConstants.MessageCategory.card) return 'cometchat-message-bubble__card-message';\n    return BUBBLE_TYPE_MAP[`${this.messageType}_${this.messageCategory}`] || '';\n  }\n  /** A voice note is an audio message tagged with metadata.audioType (see isVoiceNote). */\n  private isVoiceNoteMessage(): boolean {\n    return isVoiceNote(this.message);\n  }\n  get contentType(): string { return this.getBubbleType(); }\n  /** True for the multi-attachment per-type bubbles — used to force a consistent batch width. */\n  get isBatchBubble(): boolean {\n    const t = this.contentType;\n    return t === 'images-batch' || t === 'videos-batch' || t === 'audios-batch' || t === 'files-batch';\n  }\n  getBubbleType(): string {\n    if (!this.message) return 'unsupported';\n    const category = this.messageCategory; const type = this.messageType;\n    if (category === CometChatUIKitConstants.MessageCategory.call || category === 'call') return 'call';\n    if (category === CometChatUIKitConstants.MessageCategory.action || category === 'action') return 'action';\n    if (category === CometChatUIKitConstants.MessageCategory.message || category === 'message') { if (type === CometChatUIKitConstants.MessageTypes.image) return 'images-batch'; if (type === CometChatUIKitConstants.MessageTypes.video) return 'videos-batch'; if (type === CometChatUIKitConstants.MessageTypes.file) return 'files-batch'; if (type === CometChatUIKitConstants.MessageTypes.audio) return this.isVoiceNoteMessage() ? 'voice-note' : 'audios-batch'; return 'text'; }\n    if (category === CometChatUIKitConstants.MessageCategory.custom || category === 'custom') { if (type === CometChatUIKitConstants.ExtensionTypes.poll) return 'poll'; if (type === CometChatUIKitConstants.ExtensionTypes.sticker) return 'sticker'; if (type === CometChatUIKitConstants.ExtensionTypes.document) return 'document'; if (type === CometChatUIKitConstants.ExtensionTypes.whiteboard) return 'whiteboard'; if (type === CometChatUIKitConstants.calls.meeting) return 'meeting'; }\n    if (category === CometChatUIKitConstants.MessageCategory.card || category === 'card') return 'card';\n    return CONTENT_TYPE_MAP[`${type}_${category}`] || 'unsupported';\n  }\n  get shouldShowLeadingView(): boolean { if (this.alignment === MessageBubbleAlignment.center) return false; if (this.effectiveHideAvatar()) return false; if (this.effectiveLeadingView) return true; return this.alignment === MessageBubbleAlignment.left; }\n  get shouldShowHeaderView(): boolean { if (this.alignment === MessageBubbleAlignment.center) return false; if (this.hideSenderName) return false; if (this.effectiveHeaderView) return true; return this.alignment === MessageBubbleAlignment.left; }\n  get shouldShowReplyView(): boolean { if (this.isDeleted) return false; if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) return false; return this.quotedMessage !== null; }\n  get shouldShowStatusInfoView(): boolean {\n    if (this.hideStatusInfoView) { return false; }\n    if (this.alignment === MessageBubbleAlignment.center) { return false; }\n    if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) { return false; }\n    if (this.messageCategory === CometChatUIKitConstants.MessageCategory.call) { return false; }\n    if (this.messageCategory == CometChatUIKitConstants.MessageCategory.custom && this.messageType == 'meeting') return false;\n    return true;\n  }\n  get sender(): CometChat.User | null { if (!this.message) return null; return this.message.getSender() || this.loggedInUser || null; }\n  get isOutgoing(): boolean { if (!this.message || !this.loggedInUser) return false; const sender = this.message.getSender(); if (!sender) return true; return sender.getUid() === this.loggedInUser.getUid(); }\n  get isOutgoingStyle(): boolean { return this.alignment === MessageBubbleAlignment.right; }\n  get isDeleted(): boolean { if (!this.message) return false; return !!this.message.getDeletedAt(); }\n  get quotedMessage(): CometChat.BaseMessage | null {\n    if (!this.message) return null;\n    if (typeof (this.message as any).getQuotedMessage === 'function') {\n      const quoted = (this.message as any).getQuotedMessage();\n      if (!quoted) return null;\n      // ENG-35031: The SDK may return a plain object without prototype methods when\n      // the message is received from the server. Ensure it has the required methods.\n      if (typeof quoted.getType !== 'function') {\n        try {\n          const type = quoted.type || quoted.messageType || 'text';\n          const receiverId = quoted.receiverId || '';\n          const receiverType = quoted.receiverType || 'user';\n          // Use TextMessage as a universal wrapper since it has all the base methods\n          const reconstructed = new CometChat.TextMessage(\n            receiverId,\n            type === 'text' ? (quoted.text || quoted.data?.text || '') : '',\n            receiverType\n          );\n          if (quoted.id) reconstructed.setId(quoted.id);\n          if (quoted.sentAt) reconstructed.setSentAt(quoted.sentAt);\n          if (quoted.sender) {\n            const sender = new CometChat.User({ uid: quoted.sender.uid || '', name: quoted.sender.name || '' });\n            reconstructed.setSender(sender);\n          }\n          if (quoted.deletedAt) reconstructed.setDeletedAt(quoted.deletedAt);\n          // Override getType to return the actual type\n          (reconstructed as any)._originalType = type;\n          const origGetType = reconstructed.getType.bind(reconstructed);\n          (reconstructed as any).getType = () => (reconstructed as any)._originalType || origGetType();\n          return reconstructed;\n        } catch {\n          return null;\n        }\n      }\n      return quoted;\n    }\n    return null;\n  }\n  get isEdited(): boolean { if (!this.message) return false; return !!this.message.getEditedAt() && this.message.getType() == CometChatUIKitConstants.MessageTypes.text && this.message.getCategory() == CometChatUIKitConstants.MessageCategory.message; }\n  get actionMessageText(): string {\n    if (!this.message) { return ''; }\n    const category = this.messageCategory;\n    if (category === CometChatUIKitConstants.MessageCategory.call) { return this.getCallMessageText(); }\n    if (category === CometChatUIKitConstants.MessageCategory.action) { return this.messageUtils.getActionMessage(this.message as CometChat.Action); }\n    return '';\n  }\n  private getCallMessageText(): string {\n    if (!this.message) return '';\n    const callMessage = this.message as any; const callStatus = callMessage.getStatus?.() || callMessage.status || ''; const isSentByMe = this.isOutgoing;\n    const L = CometChatLocalize.getLocalizedString.bind(CometChatLocalize);\n    if (isSentByMe) { switch (callStatus) { case CometChatUIKitConstants.calls.initiated: return L('conversation_subtitle_outgoing_call'); case CometChatUIKitConstants.calls.cancelled: return L('conversation_subtitle_cancelled_call'); case CometChatUIKitConstants.calls.rejected: return L('conversation_subtitle_rejected_call'); case CometChatUIKitConstants.calls.busy: return L('conversation_subtitle_missed_call'); case CometChatUIKitConstants.calls.ended: return L('conversation_subtitle_ended_call'); case CometChatUIKitConstants.calls.ongoing: return L('conversation_subtitle_answered_call'); case CometChatUIKitConstants.calls.unanswered: return L('conversation_subtitle_unasnwered_call'); default: return L('conversation_subtitle_outgoing_call'); } }\n    switch (callStatus) { case CometChatUIKitConstants.calls.initiated: return L('conversation_subtitle_incoming_call'); case CometChatUIKitConstants.calls.ongoing: return L('conversation_subtitle_answered_call'); case CometChatUIKitConstants.calls.ended: return L('conversation_subtitle_ended_call'); case CometChatUIKitConstants.calls.unanswered: case CometChatUIKitConstants.calls.cancelled: return L('conversation_subtitle_missed_call'); case CometChatUIKitConstants.calls.busy: return L('conversation_subtitle_busy_call'); case CometChatUIKitConstants.calls.rejected: return L('conversation_subtitle_rejected_call'); default: return L('conversation_subtitle_outgoing_call'); }\n  }\n  get callStatusClass(): string {\n    if (!this.message || this.messageCategory !== CometChatUIKitConstants.MessageCategory.call) return '';\n    const s = this.getCallMessageText(); const L = CometChatLocalize.getLocalizedString.bind(CometChatLocalize);\n    if (s === L('conversation_subtitle_outgoing_call')) return 'cometchat-message-bubble__outgoing-call';\n    if (s === L('conversation_subtitle_incoming_call')) return 'cometchat-message-bubble__incoming-call';\n    if (s === L('conversation_subtitle_cancelled_call')) return 'cometchat-message-bubble__cancelled-call';\n    if (s === L('conversation_subtitle_rejected_call')) return 'cometchat-message-bubble__rejected-call';\n    if (s === L('conversation_subtitle_busy_call')) return 'cometchat-message-bubble__busy-call';\n    if (s === L('conversation_subtitle_ended_call')) return 'cometchat-message-bubble__ended-call';\n    if (s === L('conversation_subtitle_answered_call')) return 'cometchat-message-bubble__answered-call';\n    if (s === L('conversation_subtitle_unasnwered_call')) return 'cometchat-message-bubble__unanswered-call';\n    if (s === L('conversation_subtitle_missed_call')) return 'cometchat-message-bubble__missed-call';\n    return '';\n  }\n  get callIconUrl(): string {\n    if (!this.message || this.messageCategory !== CometChatUIKitConstants.MessageCategory.call) return '';\n    const isVideo = this.messageType === CometChatUIKitConstants.MessageTypes.video; const s = this.getCallMessageText(); const L = CometChatLocalize.getLocalizedString.bind(CometChatLocalize);\n    if (isVideo) { if (s === L('conversation_subtitle_outgoing_call')) return 'assets/outgoing_video_no_fill.svg'; if (s === L('conversation_subtitle_incoming_call')) return 'assets/incoming_video_no_fill.svg'; if (s === L('conversation_subtitle_missed_call')) return 'assets/missed_video_call_no_fill.svg'; if (s === L('conversation_subtitle_ended_call')) return 'assets/call_end_no_fill.svg'; return 'assets/video_call_button.svg'; }\n    if (s === L('conversation_subtitle_outgoing_call')) return 'assets/phone_outgoing_no_fill.svg'; if (s === L('conversation_subtitle_incoming_call')) return 'assets/phone_incoming_no_fill.svg'; if (s === L('conversation_subtitle_missed_call')) return 'assets/phone_missed_no_fill.svg'; if (s === L('conversation_subtitle_ended_call')) return 'assets/call_end_no_fill.svg'; return 'assets/audio_call_button.svg';\n  }\n  get callIconErrorColor(): boolean {\n    if (!this.message || this.messageCategory !== CometChatUIKitConstants.MessageCategory.call) { return false; }\n    const callMessage = this.message as any;\n    const callStatus = callMessage.getStatus?.() || callMessage.status || '';\n    return (\n      callStatus === CometChatUIKitConstants.calls.unanswered ||\n      callStatus === CometChatUIKitConstants.calls.cancelled ||\n      callStatus === CometChatUIKitConstants.calls.ended ||\n      callStatus === CometChatUIKitConstants.calls.busy ||\n      callStatus === CometChatUIKitConstants.calls.rejected\n    );\n  }\n  get contextMenuPlacement(): Placement {\n    if (this.alignment === MessageBubbleAlignment.left) { return Placement.right; }\n    return Placement.left;\n  }\n  get effectiveQuickOptionsCount(): number {\n    return this.quickOptionsCount;\n  }\n  get distributedOptions(): {\n    quickOptions: (CometChatActionsIcon | CometChatActionsView)[];\n    overflowOptions: (CometChatActionsIcon | CometChatActionsView)[];\n  } {\n    return this.messageUtils.distributeMessageOptions(\n      this.options,\n      this.effectiveQuickOptionsCount\n    );\n  }\n  get optionsPositionClass(): string {\n    return this.messageUtils.getOptionsPositionClass(this.alignment);\n  }\n  get receiptClass(): string { if (!this.message) return ''; const r = this.message.getReadAt(); const d = this.message.getDeliveredAt(); const s = this.message.getSentAt(); if (r) return 'cometchat-receipts-read'; if (d) return 'cometchat-receipts-delivered'; if (s && this.message.getId()) return 'cometchat-receipts-sent'; return 'cometchat-receipts-wait'; }\n  get receiptAriaLabel(): string { if (!this.message) return ''; const r = this.message.getReadAt(); const d = this.message.getDeliveredAt(); const s = this.message.getSentAt(); if (r) return CometChatLocalize.getLocalizedString('message_status_read'); if (d) return CometChatLocalize.getLocalizedString('message_status_delivered'); if (s) return CometChatLocalize.getLocalizedString('message_status_sent'); return CometChatLocalize.getLocalizedString('message_status_sending'); }\n  get calendarObject(): CalendarObject { return this.dateFormat || { today: 'hh:mm A', yesterday: 'hh:mm A', otherDays: 'hh:mm A' }; }\n  get replyCount(): number { if (!this.message) return 0; return this.message.getReplyCount() || 0; }\n  get unreadReplyCount(): number { if (!this.message) return 0; return this.message.getUnreadRepliesCount() || 0; }\n  get shouldShowThreadView(): boolean { if (this.hideThreadView) return false; if (this.isDeleted) return false; if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) return false; return this.replyCount > 0; }\n  get reactions(): CometChat.ReactionCount[] { if (!this.message) return []; return this.message.getReactions() || []; }\n  get hasReactions(): boolean { return this.reactions.length > 0; }\n  get shouldShowReactions(): boolean { if (this.isDeleted) return false; if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) return false; return this.hasReactions; }\n  get moderationStatus(): string { if (!this.message) return CometChatUIKitConstants.moderationStatus.unmoderated; if (typeof (this.message as any).getModerationStatus === 'function') return (this.message as any).getModerationStatus() || CometChatUIKitConstants.moderationStatus.unmoderated; return CometChatUIKitConstants.moderationStatus.unmoderated; }\n  get isPendingModeration(): boolean { return this.moderationStatus === CometChatUIKitConstants.moderationStatus.pending; }\n  get isDisapprovedByModeration(): boolean { return this.moderationStatus === CometChatUIKitConstants.moderationStatus.disapproved; }\n  // Only the sender sees the moderation notice — a disapproved message is invisible to everyone else,\n  // so showing \"your message was blocked\" to a viewer would be wrong. Mirrors the React kit's\n  // getIsMessageModerated (`loggedInUser === sender`); isOutgoing treats a not-yet-sent (senderless)\n  // message as mine too.\n  get shouldShowModerationIndicator(): boolean { if (this.effectiveHideModerationView()) return false; if (this.isDeleted) return false; if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) return false; if (!this.isOutgoing) return false; return this.isDisapprovedByModeration; }\n  /** SDK error on the message — either set directly on it or stashed in its metadata. */\n  private get messageError(): { code?: string } | null { const m = this.message as any; if (!m) return null; return m.error || m.getMetadata?.()?.error || null; }\n  /** Any send/processing error — drives the error receipt tick (see {@link showErrorReceipt}). */\n  get hasMessageError(): boolean { return !!this.messageError; }\n  // A message the server refused on policy grounds (e.g. a disallowed attachment type) carries\n  // ERR_PERMISSION_DENIED. Sender-only, and a message rejected before reaching the server has no\n  // sender yet — so a missing sender counts as mine. Mirrors React's getIsPermissionDeniedError.\n  get isPermissionDeniedError(): boolean { if (!this.message) return false; if (this.messageError?.code !== 'ERR_PERMISSION_DENIED') return false; return this.isOutgoing; }\n  get shouldShowPermissionDeniedIndicator(): boolean { if (this.isDeleted) return false; if (this.messageCategory === CometChatUIKitConstants.MessageCategory.action) return false; return this.isPermissionDeniedError; }\n  /**\n   * True when EITHER block notice (moderation-disapproved or permission-denied) is showing. Both\n   * render the same footer banner, so the body must get the same treatment for both: square off the\n   * bottom corners and drop the batch media-padding, so the banner reads as the bubble's rounded\n   * bottom instead of a detached card floating over a strip of bubble background.\n   */\n  get shouldShowBlockNotice(): boolean { return this.shouldShowModerationIndicator || this.shouldShowPermissionDeniedIndicator; }\n  /** Localization key for whichever block notice is showing (moderation takes precedence). */\n  get moderationIndicatorTextKey(): string { return this.shouldShowModerationIndicator ? 'moderation_block_message' : 'file_type_not_allowed'; }\n  // Besides the explicit `showError` input, a disapproved message or one carrying a send error flips\n  // the sender's receipt to the error tick — matching React's MessageReceiptUtils.getReceiptStatus.\n  get showErrorReceipt(): boolean { if (this.showError) return true; return this.isOutgoing && (this.isDisapprovedByModeration || this.hasMessageError); }\n  moderationIndicatorWidth = computed(() => { const w = this.contentViewWidth(); return w >= 240 ? `calc(${w}px + var(--cometchat-padding-1) * 2)` : '240px'; });\n\n  get messageTypeKey(): string { if (!this.message) return ''; return `${this.messageType}_${this.messageCategory}`; }\n  get effectiveLeadingView(): TemplateRef<any> | null { return this.getEffectiveView('leadingView', this.leadingView); }\n  get effectiveHeaderView(): TemplateRef<any> | null { return this.getEffectiveView('headerView', this.headerView); }\n  get effectiveReplyView(): TemplateRef<any> | null { return this.getEffectiveView('replyView', this.replyView); }\n  get effectiveContentView(): TemplateRef<any> | null { return this.getEffectiveView('contentView', this.contentView); }\n  get effectiveBottomView(): TemplateRef<any> | null { return this.getEffectiveView('bottomView', this.bottomView); }\n  get effectiveFooterView(): TemplateRef<any> | null { return this.getEffectiveView('footerView', this.footerView); }\n  get effectiveStatusInfoView(): TemplateRef<any> | null { return this.getEffectiveView('statusInfoView', this.statusInfoView); }\n  get effectiveThreadView(): TemplateRef<any> | null { return this.getEffectiveView('threadView', this.threadView); }\n  get effectiveBubbleView(): TemplateRef<any> | null { return this.getEffectiveView('bubbleView', this.bubbleView); }\n  private getEffectiveView(part: BubblePart, inputView: TemplateRef<any> | null): TemplateRef<any> | null { if (inputView) return inputView; const sv = this.bubbleConfigService.getView(this.messageTypeKey, part); return sv || null; }\n  onMouseEnter(): void { this.clearHoverTimeout(); this.isHovering = true; this.cdr.markForCheck(); }\n  onMouseLeave(): void { this.clearHoverTimeout(); this.hoverTimeoutRef = setTimeout(() => { this.isHovering = false; this.cdr.markForCheck(); }, 150); }\n  onBodyClick(): void {\n    if (this.isMobile) { this.isHovering = !this.isHovering; this.cdr.markForCheck(); }\n  }\n  onOptionClick(option: ContextMenuItem): void { this.isHovering = false; this.cdr.markForCheck(); this.optionClick.emit(option); this.restoreFocusToBubble(); }\n  onReplyPreviewClick(event?: MouseEvent): void {\n    if (event) { event.stopPropagation(); }\n    if (this.quotedMessage) { this.replyPreviewClick.emit(this.quotedMessage); }\n  }\n  onReplyPreviewKeyDown(event: KeyboardEvent): void { if (event.key === 'Enter' || event.key === ' ') { event.preventDefault(); event.stopPropagation(); if (this.quotedMessage) this.replyPreviewClick.emit(this.quotedMessage); } }\n  onAvatarClick(): void {\n    if (this.sender) { this.avatarClick.emit(this.sender); }\n  }\n  onThreadClick(): void { this.threadRepliesClick.emit(this.message); }\n  onReactionClick(reaction: CometChat.ReactionCount): void { this.reactionClick.emit({ reaction, message: this.message }); }\n  onReactionListItemClick(event: { reaction: CometChat.Reaction; message: CometChat.BaseMessage }): void { this.reactionListItemClick.emit(event); }\n  private detectMobileDevice(): void { this.isMobile = window.innerWidth <= 768; }\n  private setupMobileResizeListener(): void {\n    const handler = () => {\n      const wasMobile = this.isMobile;\n      this.isMobile = window.innerWidth <= 768;\n      if (wasMobile !== this.isMobile) { this.cdr.markForCheck(); }\n    };\n    window.addEventListener('resize', handler);\n    this.destroyRef.onDestroy(() => window.removeEventListener('resize', handler));\n  }\n  private clearHoverTimeout(): void {\n    if (this.hoverTimeoutRef) { clearTimeout(this.hoverTimeoutRef); this.hoverTimeoutRef = null; }\n  }\n  private setupContentViewResizeObserver(): void {\n    if (!this.contentViewRef?.nativeElement) return;\n    const el = this.contentViewRef.nativeElement;\n    let destroyed = false;\n    this.destroyRef.onDestroy(() => { destroyed = true; });\n    this.contentViewResizeObserver = new ResizeObserver(entries => {\n      if (destroyed) return;\n      for (const e of entries) { const w = e.contentRect.width; if (this.contentViewWidth() !== w) this.contentViewWidth.set(w); }\n    });\n    this.contentViewResizeObserver.observe(el); this.contentViewWidth.set(el.offsetWidth);\n  }\n  get accessibleLabel(): string {\n    const parts: string[] = [this.sender?.getName() || CometChatLocalize.getLocalizedString('accessibility_unknown_sender')];\n    const typeKey = `accessibility_message_type_${this.messageType}`; const typeLabel = CometChatLocalize.getLocalizedString(typeKey);\n    parts.push(typeLabel || CometChatLocalize.getLocalizedString('accessibility_message_type_custom'));\n    const preview = this.getContentPreview(); if (preview) parts.push(preview);\n    const timestamp = this.getFormattedTimestamp(); if (timestamp) parts.push(timestamp);\n    if (this.hasReactions) { const rs = this.getReactionsSummary(); if (rs) parts.push(rs); }\n    if (this.isEdited) parts.push(CometChatLocalize.getLocalizedString('accessibility_message_edited'));\n    return parts.join(', ');\n  }\n  getAriaLabel(): string {\n    if (this.isDeleted) { const sn = this.sender?.getName() || CometChatLocalize.getLocalizedString('accessibility_unknown_sender'); return CometChatLocalize.getLocalizedString('accessibility_message_deleted_from').replace('{sender}', sn); }\n    return this.accessibleLabel;\n  }\n  private getContentPreview(): string {\n    if (this.isDeleted) return '';\n    switch (this.messageType) {\n      case 'text': { const tm = this.message as CometChat.TextMessage; return this.truncateText(tm.getText?.() || '', 100); }\n      case 'image': return CometChatLocalize.getLocalizedString('accessibility_image_message');\n      case 'video': return CometChatLocalize.getLocalizedString('accessibility_video_message');\n      case 'audio': return CometChatLocalize.getLocalizedString('accessibility_audio_message');\n      case 'file': { const fm = this.message as CometChat.MediaMessage; return fm.getAttachment?.()?.getName?.() || CometChatLocalize.getLocalizedString('accessibility_file_message'); }\n      default: if (this.messageType === CometChatUIKitConstants.ExtensionTypes.poll) { const cd = (this.message as any).getCustomData?.(); return cd?.question || CometChatLocalize.getLocalizedString('accessibility_poll_message'); } return '';\n    }\n  }\n  private truncateText(text: string, maxLength: number): string {\n    if (!text || text.length <= maxLength) { return text; }\n    return text.substring(0, maxLength).trim() + '...';\n  }\n  private getFormattedTimestamp(): string {\n    if (!this.message) { return ''; }\n    const sentAt = this.message.getSentAt();\n    if (!sentAt) { return ''; }\n    const timestamp = sentAt > 9999999999 ? sentAt : sentAt * 1000;\n    return this.datePipe.transform(timestamp, 'short') || '';\n  }\n  private getReactionsSummary(): string { const reactions = this.reactions; if (!reactions?.length) return ''; const totalCount = reactions.reduce((sum, r) => sum + (r.getCount?.() || 0), 0); if (totalCount === 1) return CometChatLocalize.getLocalizedString('accessibility_one_reaction'); return CometChatLocalize.getLocalizedString('accessibility_reactions_count').replace('{count}', totalCount.toString()); }\n  private getMessageTypeLabel(): string { switch (this.messageType) { case 'text': return CometChatLocalize.getLocalizedString('accessibility_message_type_text'); case 'image': return CometChatLocalize.getLocalizedString('accessibility_message_type_image'); case 'video': return CometChatLocalize.getLocalizedString('accessibility_message_type_video'); case 'audio': return CometChatLocalize.getLocalizedString('accessibility_message_type_audio'); case 'file': return CometChatLocalize.getLocalizedString('accessibility_message_type_file'); default: return CometChatLocalize.getLocalizedString('accessibility_message_type_custom'); } }\n  get isMediaMessage(): boolean {\n    return ['audio', 'video', 'image'].includes(this.messageType);\n  }\n  onKeyDown(event: KeyboardEvent): void {\n    if (this.disableInteraction) { if (event.key === ' ' && this.isMediaMessage) { event.preventDefault(); this.mediaToggle.emit(this.message); } return; }\n    switch (event.key) {\n      case 'Enter': event.preventDefault(); this.openMessageActions(); break;\n      case ' ': event.preventDefault(); if (this.isMediaMessage) { this.mediaToggle.emit(this.message); } else if (this.options.length > 0) { this.isHovering = !this.isHovering; this.cdr.markForCheck(); } break;\n      case 'F10': if (event.shiftKey) { event.preventDefault(); this.openMessageActions(); } break;\n      case 'ContextMenu': event.preventDefault(); this.openMessageActions(); break;\n      case 'Escape': if (this.isHovering) { event.preventDefault(); event.stopPropagation(); this.isHovering = false; this.cdr.markForCheck(); this.restoreFocusToBubble(); } break;\n    }\n  }\n  private openMessageActions(): void {\n    if (this.options.length > 0) { this.isHovering = true; this.cdr.markForCheck(); this.messageActionsOpen.emit(this.message); }\n  }\n  private restoreFocusToBubble(): void {\n    setTimeout(() => {\n      if (this.bubbleWrapperRef?.nativeElement) { this.bubbleWrapperRef.nativeElement.focus(); }\n    }, 0);\n  }\n  getDocumentUrl(): string {\n    if (!this.message) return '';\n    try { const m = (this.message as any).getMetadata?.() as Record<string, any> | null; if (!m) return ''; const inj = m['@injected']; if (inj?.['extensions']?.['document']?.['document_url']) return inj['extensions']['document']['document_url']; if (m['data']?.['document_url']) return m['data']['document_url']; const cd = (this.message as any).getCustomData?.(); if (cd?.['document_url']) return cd['document_url']; return ''; }\n    catch (error) { CometChatLogger.warn('CometChatMessageBubble', 'Error extracting document URL:', error); return ''; }\n  }\n  getWhiteboardUrl(): string {\n    if (!this.message) return '';\n    try { const m = (this.message as any).getMetadata?.() as Record<string, any> | null; if (!m) return ''; const inj = m['@injected']; if (inj?.['extensions']?.['whiteboard']?.['board_url']) return inj['extensions']['whiteboard']['board_url']; if (m['data']?.['board_url']) return m['data']['board_url']; const cd = (this.message as any).getCustomData?.(); if (cd?.['board_url']) return cd['board_url']; return ''; }\n    catch (error) { CometChatLogger.warn('CometChatMessageBubble', 'Error extracting whiteboard URL:', error); return ''; }\n  }\n  getCallButtonText(): string {\n    if (!this.message) { return ''; }\n    const callMessage = this.message as any;\n    const callStatus = callMessage.getStatus?.() || '';\n    if (callStatus === CometChatUIKitConstants.calls.ongoing || callStatus === CometChatUIKitConstants.calls.initiated) return CometChatLocalize.getLocalizedString('message_list_join_call');\n    if (callStatus === CometChatUIKitConstants.calls.ended) { return CometChatLocalize.getLocalizedString('message_list_join_call'); }\n    return '';\n  }\n  onCallBubbleJoinClick(event: CallButtonClickEvent): void {\n    const msg = event.message as any; const sessionId = event.sessionId || msg?.getCustomData?.()?.sessionID || msg?.getCustomData?.()?.sessionId || msg?.getSessionId?.() || '';\n    const callType = msg?.getCustomData?.()?.callType || msg?.getType?.(); const isAudioOnly = callType === CometChatUIKitConstants.MessageTypes.audio;\n    if (sessionId) this.callButtonsService.joinMeeting(sessionId, isAudioOnly);\n  }\n}\n","<!-- CometChatMessageBubble Template -->\n<!-- Requirements: 1.1, 2.1-2.8, 3.1-3.9, 16.1-16.6, 18.1-18.10 -->\n\n<div class=\"cometchat\">\n  <div \n    #bubbleWrapper\n    class=\"cometchat-message-bubble__wrapper\"\n    [class.cometchat-message-bubble__wrapper--selected]=\"isSelected\"\n    [class.cometchat-message-bubble__wrapper--outgoing]=\"alignment === MessageBubbleAlignment.right\"\n    [class.cometchat-message-bubble__wrapper--center]=\"alignment === MessageBubbleAlignment.center\"\n    [attr.data-message-id]=\"messageId\"\n    role=\"article\"\n    [attr.aria-label]=\"getAriaLabel()\"\n    [attr.aria-describedby]=\"'message-content-' + messageId\"\n    [attr.aria-selected]=\"isSelected ? 'true' : null\"\n    [attr.aria-posinset]=\"ariaPosinset\"\n    [attr.aria-setsize]=\"ariaSetsize\"\n    tabindex=\"0\"\n    (keydown)=\"onKeyDown($event)\">\n    \n    <!-- Custom Bubble View - Replaces entire bubble when provided -->\n    @if (effectiveBubbleView) {\n      <ng-container *ngTemplateOutlet=\"effectiveBubbleView; context: { $implicit: message, alignment: alignment, group: group }\"></ng-container>\n    } @else {\n      <!-- Leading View (Avatar) -->\n      @if (shouldShowLeadingView) {\n        <div class=\"cometchat-message-bubble__leading-view\">\n          @if (effectiveLeadingView) {\n            <ng-container *ngTemplateOutlet=\"effectiveLeadingView; context: { $implicit: message }\"></ng-container>\n          } @else {\n            <cometchat-avatar\n              [image]=\"sender?.getAvatar() || ''\"\n              [name]=\"sender?.getName() || ''\"\n              (click)=\"onAvatarClick()\"\n              tabindex=\"0\"\n              role=\"button\"\n              [attr.aria-label]=\"'Avatar for ' + (sender?.getName() || 'Unknown')\"\n              (keydown.enter)=\"onAvatarClick()\"\n              (keydown.space)=\"onAvatarClick()\">\n            </cometchat-avatar>\n          }\n        </div>\n      } @else if (reserveLeadingSpace && alignment === MessageBubbleAlignment.left) {\n        <!-- Reserve the avatar column so batch-continuation messages align under the first message -->\n        <div class=\"cometchat-message-bubble__leading-spacer\" aria-hidden=\"true\"></div>\n      }\n\n      <!-- Message Bubble Container -->\n      <div\n        class=\"cometchat-message-bubble\"\n        [class]=\"bubbleClassName\"\n        [class.cometchat-message-bubble--multi-attachment]=\"isBatchBubble\"\n        [id]=\"'message-' + messageId\">\n      \n      <!-- Header View (Sender Name) -->\n      @if (shouldShowHeaderView) {\n        <div class=\"cometchat-message-bubble__header-view\">\n          @if (effectiveHeaderView) {\n            <ng-container *ngTemplateOutlet=\"effectiveHeaderView; context: { $implicit: message }\"></ng-container>\n          } @else {\n            <span class=\"cometchat-message-bubble__sender-name\">\n              {{ sender?.getName() }}\n            </span>\n          }\n        </div>\n      }\n      \n      <!-- Body Section -->\n      <div class=\"cometchat-message-bubble__content\">\n        <div \n          class=\"cometchat-message-bubble__body-container\"\n          (mouseleave)=\"onMouseLeave()\">\n          \n          <!-- Context Menu Options -->\n          @if (options.length > 0 && !disableInteraction) {\n            <div \n              class=\"cometchat-message-bubble__options\"\n              [class.cometchat-message-bubble__options--visible]=\"isHovering\"\n              [class]=\"optionsPositionClass\">\n              <cometchat-context-menu\n                [data]=\"options\"\n                [topMenuSize]=\"effectiveQuickOptionsCount\"\n                [placement]=\"contextMenuPlacement\"\n                [disableBackgroundInteraction]=\"true\"\n                [useParentContainer]=\"true\"\n                (optionClick)=\"onOptionClick($event)\">\n              </cometchat-context-menu>\n            </div>\n          }\n          \n          <!-- Body Wrapper -->\n          <div class=\"cometchat-message-bubble__body-wrapper\">\n            <div\n              class=\"cometchat-message-bubble__body\"\n              [class]=\"bubbleTypeClassName\"\n              [class.cometchat-message-bubble__body--moderated]=\"shouldShowBlockNotice\"\n              [class.cometchat-message-bubble__body--batch-no-footer]=\"isBatchBubble && !shouldShowStatusInfoView && !shouldShowBlockNotice\"\n              (mouseenter)=\"!disableInteraction && onMouseEnter()\"\n              (click)=\"!disableInteraction && onBodyClick()\">\n              \n              <!-- Reply View -->\n              @if (shouldShowReplyView) {\n                <div \n                  class=\"cometchat-message-bubble__body-reply-view\"\n                  (click)=\"onReplyPreviewClick($event)\"\n                  (keydown)=\"onReplyPreviewKeyDown($event)\"\n                  tabindex=\"0\"\n                  role=\"button\"\n                  [attr.aria-label]=\"'reply_preview_view_original' | translate\">\n                  @if (effectiveReplyView) {\n                    <ng-container *ngTemplateOutlet=\"effectiveReplyView; context: { $implicit: message }\"></ng-container>\n                  } @else {\n                    <cometchat-message-preview\n                      [message]=\"quotedMessage\"\n                      [hideCloseButton]=\"true\">\n                    </cometchat-message-preview>\n                  }\n                </div>\n              }\n              \n              <!-- Content View -->\n              <div \n                #contentViewRef\n                class=\"cometchat-message-bubble__body-content-view\"\n                [id]=\"'message-content-' + messageId\"\n                role=\"region\"\n                [attr.aria-label]=\"'Message content'\">\n                @if (effectiveContentView) {\n                  <ng-container *ngTemplateOutlet=\"effectiveContentView; context: { $implicit: message }\"></ng-container>\n                } @else {\n                  <!-- Default content rendering based on message type -->\n                  @if (isDeleted) {\n                    <!-- Deleted Message -->\n                    <cometchat-delete-bubble [isSentByMe]=\"isOutgoingStyle\"></cometchat-delete-bubble>\n                  } @else {\n                    <!-- Regular Messages - switch based on contentType -->\n                    @switch (contentType) {\n                      @case ('call') {\n                        <!-- Call Message (1v1 audio/video calls) - Requirement 4.3, 4.4, 4.5, 4.6 -->\n                        <!-- Renders as action bubble with call status icon -->\n                        <cometchat-action-bubble \n                          [messageText]=\"actionMessageText\"\n                          [iconUrl]=\"callIconUrl\"\n                          [iconErrorColor]=\"callIconErrorColor\">\n                        </cometchat-action-bubble>\n                      }\n                      @case ('action') {\n                        <!-- Action Message (group member actions) -->\n                        <cometchat-action-bubble [messageText]=\"actionMessageText\"></cometchat-action-bubble>\n                      }\n                      @case ('text') {\n                        <cometchat-text-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [textFormatters]=\"effectiveTextFormatters()\"\n                          [translatedTextOverride]=\"translatedText\">\n                        </cometchat-text-bubble>\n                      }\n                      @case ('images-batch') {\n                        <cometchat-images-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [disableInteraction]=\"disableInteraction\">\n                        </cometchat-images-bubble>\n                      }\n                      @case ('videos-batch') {\n                        <cometchat-videos-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [disableInteraction]=\"disableInteraction\">\n                        </cometchat-videos-bubble>\n                      }\n                      @case ('audios-batch') {\n                        <cometchat-audios-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\">\n                        </cometchat-audios-bubble>\n                      }\n                      @case ('voice-note') {\n                        <cometchat-voice-note-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\">\n                        </cometchat-voice-note-bubble>\n                      }\n                      @case ('files-batch') {\n                        <cometchat-files-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\">\n                        </cometchat-files-bubble>\n                      }\n                      @case ('poll') {\n                        <!-- Poll Bubble - Requirement 3.1 -->\n                        <cometchat-poll-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [loggedInUser]=\"loggedInUser || undefined\"\n                          [disableInteraction]=\"disableInteraction\">\n                        </cometchat-poll-bubble>\n                      }\n                      @case ('sticker') {\n                        <!-- Sticker Bubble - Requirement 3.2 -->\n                        <cometchat-sticker-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"isOutgoingStyle ? MessageBubbleAlignment.right : MessageBubbleAlignment.left\">\n                        </cometchat-sticker-bubble>\n                      }\n                      @case ('document') {\n                        <!-- Document Bubble - Requirement 3.3 -->\n                        <cometchat-collaborative-document-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [disableInteraction]=\"disableInteraction\">\n                        </cometchat-collaborative-document-bubble>\n                      }\n                      @case ('whiteboard') {\n                        <!-- Whiteboard Bubble - Requirement 3.4 -->\n                        <cometchat-collaborative-whiteboard-bubble\n                          [message]=\"$any(message)\"\n                          [alignment]=\"alignment\"\n                          [disableInteraction]=\"disableInteraction\">\n                        </cometchat-collaborative-whiteboard-bubble>\n                      }\n                      @case ('meeting') {\n                        <cometchat-call-bubble\n                        [buttonText]=\"'Join Call'\"\n                          [message]=\"$any(message)\"\n                          [alignment]=\"isOutgoingStyle ? 'right' : 'left'\"\n                          [disableInteraction]=\"disableInteraction\"\n                          (buttonClick)=\"onCallBubbleJoinClick($event)\">\n                        </cometchat-call-bubble>\n                      }\n                      @case ('card') {\n                        <cometchat-card-bubble\n                          [message]=\"$any(message)\">\n                        </cometchat-card-bubble>\n                      }\n                      @case ('ai-assistant') {\n                        <!-- AI Assistant Message Bubble (category: agentic, type: assistant) -->\n                        <cometchat-ai-assistant-message-bubble\n                          [message]=\"$any(message)\">\n                        </cometchat-ai-assistant-message-bubble>\n                      }\n                      @case ('tool-arguments') {\n                        <!-- Tool Call Argument Bubble (category: agentic, type: tool_arguments) -->\n                        <cometchat-toolcall-argument-bubble\n                          [message]=\"$any(message)\">\n                        </cometchat-toolcall-argument-bubble>\n                      }\n                      @case ('tool-result') {\n                        <!-- Tool Call Result Bubble (category: agentic, type: tool_result) -->\n                        <cometchat-toolcall-result-bubble\n                          [message]=\"$any(message)\">\n                        </cometchat-toolcall-result-bubble>\n                      }\n                      @default {\n                        <!-- Fallback for unsupported message types - Requirement 3.6 -->\n                        <div class=\"cometchat-message-bubble__unsupported\">\n                          {{ 'message_type_not_supported' | translate }}\n                        </div>\n                      }\n                    }\n                  }\n                }\n              </div>\n              \n          \n              \n              <!-- Status Info View -->\n              @if (shouldShowStatusInfoView) {\n                <div \n                  class=\"cometchat-message-bubble__body-status-info-view\"\n                  role=\"status\"\n                  aria-live=\"polite\">\n                  @if (effectiveStatusInfoView) {\n                    <ng-container *ngTemplateOutlet=\"effectiveStatusInfoView; context: { $implicit: message }\"></ng-container>\n                  } @else {\n                    <div class=\"cometchat-message-bubble__status-info-view\">\n                      @if (isEdited) {\n                        <span class=\"cometchat-message-bubble__status-info-view-helper-text\">\n                          {{ 'message_list_action_edited' | translate }}\n                        </span>\n                      }\n                      @if (!hideTimestamp) {\n                        <cometchat-date [timestamp]=\"message.getSentAt()\" [calendarObject]=\"calendarObject\"></cometchat-date>\n                      }\n                      @if (showErrorReceipt) {\n                        <!-- Error state indicator - shown when a message is in error / disapproved state -->\n                        <div\n                          class=\"cometchat-receipts cometchat-receipts-error\"\n                          role=\"img\"\n                          [attr.aria-label]=\"'message_status_error' | translate\">\n                          <div class=\"cometchat-message-list__receipt\"></div>\n                        </div>\n                      } @else if (!effectiveHideReceipts() && isOutgoingStyle && !isDeleted) {\n                        <div \n                          class=\"cometchat-receipts\" \n                          [class]=\"receiptClass\"\n                          role=\"img\"\n                          [attr.aria-label]=\"receiptAriaLabel\">\n                          <div class=\"cometchat-message-list__receipt\"></div>\n                        </div>\n                      }\n                    </div>\n                  }\n                </div>\n              }\n              \n           \n            </div>\n            \n            <!-- Bottom View -->\n            @if (effectiveBottomView) {\n              <div class=\"cometchat-message-bubble__body-bottom-view\">\n                <ng-container *ngTemplateOutlet=\"effectiveBottomView; context: { $implicit: message }\"></ng-container>\n              </div>\n            }\n            \n            <!-- Footer View -->\n            @if (effectiveFooterView) {\n              <div class=\"cometchat-message-bubble__body-footer-view\">\n                <ng-container *ngTemplateOutlet=\"effectiveFooterView; context: { $implicit: message }\"></ng-container>\n              </div>\n            }\n            @else {\n                 <!-- Moderation / permission-denied status indicator - Requirement 9.7. A disapproved\n                      message (\"blocked by moderation\") or one the server refused (\"file type not\n                      allowed\") shows the same error notice to the sender; moderation wins if both. -->\n              @if (shouldShowModerationIndicator || shouldShowPermissionDeniedIndicator) {\n                <div\n                  class=\"cometchat-message-bubble__moderation-indicator\"\n                  [class.cometchat-message-bubble__moderation-indicator--disapproved]=\"shouldShowModerationIndicator\"\n                  [class.cometchat-message-bubble__moderation-indicator--permission-denied]=\"!shouldShowModerationIndicator && shouldShowPermissionDeniedIndicator\"\n                  [style.width]=\"moderationIndicatorWidth()\"\n                  role=\"status\"\n                  [attr.aria-label]=\"(moderationIndicatorTextKey | translate)\">\n                  <div class=\"cometchat-message-bubble__moderation-indicator-icon\"></div>\n                  <span class=\"cometchat-message-bubble__moderation-indicator-text\">\n                   {{ moderationIndicatorTextKey | translate }}\n                  </span>\n                </div>\n              }\n              @else if (shouldShowReactions && !disableInteraction) {\n                <cometchat-reactions\n                  [message]=\"message\"\n                  [alignment]=\"alignment\"\n                  [reactionsRequestBuilder]=\"reactionsRequestBuilder\"\n                  (reactionClick)=\"onReactionClick($event.reaction)\"\n                  (reactionListItemClick)=\"onReactionListItemClick($event)\">\n                </cometchat-reactions>\n              }\n            }\n            \n            <!-- Thread View -->\n            @if (shouldShowThreadView || effectiveThreadView) {\n              <div class=\"cometchat-message-bubble__body-thread-view\">\n                @if (effectiveThreadView) {\n                  <ng-container *ngTemplateOutlet=\"effectiveThreadView; context: { $implicit: message }\"></ng-container>\n                } @else if (shouldShowThreadView) {\n                  <cometchat-thread-view\n                    [replyCount]=\"replyCount\"\n                    [unreadReplyCount]=\"unreadReplyCount\"\n                    [parentMessage]=\"message\"\n                    (threadClick)=\"onThreadClick()\">\n                  </cometchat-thread-view>\n                }\n              </div>\n            }\n          </div>\n        </div>\n      </div>\n    </div>\n    }\n  </div>\n</div>\n","/**\n * Public API for CometChatMessageBubble component\n */\n\nexport { CometChatMessageBubbleComponent } from './cometchat-message-bubble.component';\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  signal,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  inject,\n  AfterViewInit,\n  ElementRef,\n  ViewChildren,\n  QueryList,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatUIKitConstants } from '../../../constants';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/** Maximum number of smart replies to display. @see Requirement 2.5 */\nconst MAX_REPLIES = 3;\n\n/**\n * CometChatSmartRepliesComponent displays up to 3 AI-generated reply suggestions.\n * @see Requirements 2.1, 2.3-2.6\n */\n@Component({\n  selector: 'cometchat-smart-replies',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-smart-replies.component.html',\n  styleUrls: ['./cometchat-smart-replies.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatSmartRepliesComponent implements OnDestroy, OnChanges, AfterViewInit {\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  @ViewChildren('replyButton') replyButtons!: QueryList<ElementRef<HTMLButtonElement>>;\n  focusedIndex = signal(0);\n\n  @Input() message?: CometChat.BaseMessage;\n  @Input() user?: CometChat.User;\n  @Input() group?: CometChat.Group;\n  @Input() keywords: string[] = ['what', 'when', 'why', 'who', 'where', 'how', '?'];\n  @Input() delayDuration = 10000;\n\n  @Output() replyClick = new EventEmitter<string>();\n  @Output() closeClick = new EventEmitter<void>();\n\n  isLoading = signal(false);\n  replies = signal<string[]>([]);\n  hasError = signal(false);\n\n  private delayTimeoutId: ReturnType<typeof setTimeout> | null = null;\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message']) { this.resetState(); this.startDelayTimer(); }\n  }\n\n  ngAfterViewInit(): void {}\n\n  ngOnDestroy(): void { this.clearDelayTimeout(); }\n\n  onReplyClick(reply: string): void { this.replyClick.emit(reply); }\n  onCloseClick(): void { this.closeClick.emit(); }\n\n  /** Handle keyboard events on reply items. @see Requirements 24.2, 24.3 */\n  onReplyKeydown(event: KeyboardEvent, reply: string, index: number): void {\n    const repliesCount = this.replies().length;\n\n    switch (event.key) {\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        this.onReplyClick(reply);\n        break;\n      case 'ArrowRight':\n        event.preventDefault();\n        // Move to next reply with wrap-around\n        const nextIndex = (index + 1) % repliesCount;\n        this.focusReply(nextIndex);\n        break;\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        // Move to previous reply with wrap-around\n        const prevIndex = (index - 1 + repliesCount) % repliesCount;\n        this.focusReply(prevIndex);\n        break;\n\n      case 'Home':\n        event.preventDefault();\n        this.focusReply(0);\n        break;\n\n      case 'End':\n        event.preventDefault();\n        this.focusReply(repliesCount - 1);\n        break;\n    }\n  }\n\n  /**\n   * Focuses a reply button by index.\n   * Updates the focused index and moves DOM focus.\n   *\n   * @param index - The index of the reply to focus\n   */\n  private focusReply(index: number): void {\n    this.focusedIndex.set(index);\n    const buttons = this.replyButtons?.toArray();\n    if (buttons && buttons[index]) {\n      buttons[index].nativeElement.focus();\n    }\n  }\n\n  /**\n   * Gets the tabindex for a reply button based on roving tabindex pattern.\n   * Only the focused reply has tabindex=\"0\", others have tabindex=\"-1\".\n   *\n   * @param index - The index of the reply\n   * @returns 0 if focused, -1 otherwise\n   */\n  getReplyTabIndex(index: number): number {\n    return index === this.focusedIndex() ? 0 : -1;\n  }\n\n  /**\n   * Handles focus event on a reply button.\n   * Updates the focused index when a button receives focus.\n   *\n   * @param index - The index of the focused reply\n   */\n  onReplyFocus(index: number): void {\n    this.focusedIndex.set(index);\n  }\n\n  /**\n   * Checks if there are any replies to display.\n   */\n  get hasReplies(): boolean {\n    return this.replies().length > 0;\n  }\n\n  /**\n   * Checks if the component should be visible.\n   * Shows when loading, has replies, or has error.\n   */\n  get isVisible(): boolean {\n    return this.isLoading() || this.hasReplies || this.hasError();\n  }\n\n  /**\n   * Generates an accessible label for the smart replies container.\n   */\n  get ariaLabel(): string {\n    const count = this.replies().length;\n    if (this.isLoading()) {\n      return CometChatLocalize.getLocalizedString('accessibility_loading');\n    }\n    if (count === 0) {\n      return CometChatLocalize.getLocalizedString('accessibility_no_results');\n    }\n    return CometChatLocalize.getLocalizedString('accessibility_smart_replies');\n  }\n\n  /**\n   * Determines if smart replies should be shown for the current message.\n   *\n   * Returns false if:\n   * - No message is provided\n   * - Message is not a text message\n   *\n   * Returns true if:\n   * - Keywords array is empty (show for all messages)\n   * - Message text contains any of the keywords (case-insensitive)\n   *\n   * @returns True if smart replies should be shown, false otherwise\n   * @see Requirement 2.2 - Generated based on the last received message\n   * @see Requirement 2.3 - Only appear for messages containing trigger keywords\n   */\n  shouldShowSmartReplies(): boolean {\n    // Return false if no message\n    if (!this.message) {\n      return false;\n    }\n\n    // Return false if message is not a text message\n    if (!(this.message instanceof CometChat.TextMessage)) {\n      return false;\n    }\n\n    // Return true if keywords array is empty (show for all messages)\n    if (!this.keywords || this.keywords.length === 0) {\n      return true;\n    }\n\n    // Get message text in lowercase for case-insensitive matching\n    const messageText = (this.message as CometChat.TextMessage).getText()?.toLowerCase() || '';\n\n    // Check if message contains any of the keywords\n    // Escape special regex characters in keywords, but handle '?' specially\n    const escapedKeywords = this.keywords.map((word: string) =>\n      word.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n    );\n\n    // Build regex pattern: word boundaries for regular words, direct match for '?'\n    const regularKeywords = escapedKeywords.filter(word => word !== '\\\\?');\n    const hasQuestionMark = this.keywords.includes('?');\n\n    let pattern = '';\n    if (regularKeywords.length > 0) {\n      pattern = `(?:\\\\b(${regularKeywords.join('|')})\\\\b)`;\n    }\n    if (hasQuestionMark) {\n      pattern = pattern ? `${pattern}|\\\\?` : '\\\\?';\n    }\n\n    if (!pattern) {\n      return false;\n    }\n\n    const regex = new RegExp(pattern, 'i');\n    return regex.test(messageText);\n  }\n\n  /**\n   * Fetches smart replies from the CometChat AI extension.\n   *\n   * Sets loading state, calls the API, and updates the replies signal.\n   * Limits results to 3 replies as per requirement.\n   * Handles errors gracefully by setting the error state.\n   * Announces availability to screen readers when replies are loaded.\n   *\n   * @see Requirement 2.5 - Display up to 3 reply suggestions\n   * @see Requirement 2.9 - Use the CometChat AI extension for generation\n   * @see Requirement 24.6 - Announce \"Smart replies available\" when component appears\n   */\n  async fetchSmartReplies(): Promise<void> {\n    // Determine receiver ID and type\n    const receiverId = this.user?.getUid() || this.group?.getGuid();\n    const receiverType = this.user\n      ? CometChatUIKitConstants.MessageReceiverType.user\n      : CometChatUIKitConstants.MessageReceiverType.group;\n\n    if (!receiverId) {\n      CometChatLogger.warn('CometChatSmartReplies', 'No user or group provided for smart replies');\n      return;\n    }\n\n    this.isLoading.set(true);\n    this.hasError.set(false);\n\n    try {\n      // Call CometChat AI extension to get smart replies\n      const response = await CometChat.getSmartReplies(receiverId, receiverType);\n\n      // Convert response object to array of reply strings\n      // The API returns an object with reply keys, we need the values\n      const repliesArray = Object.values(response as Record<string, string>);\n\n      // Limit to MAX_REPLIES (3) as per requirement 2.5\n      const limitedReplies = repliesArray.slice(0, MAX_REPLIES);\n\n      this.replies.set(limitedReplies);\n\n      // Reset focused index when new replies are loaded\n      this.focusedIndex.set(0);\n\n      // Announce smart replies availability to screen readers\n      if (limitedReplies.length > 0) {\n        this.liveAnnouncer.announce(\n          CometChatLocalize.getLocalizedString('accessibility_smart_replies_available'),\n          'polite'\n        );\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatSmartReplies', 'Error fetching smart replies:', error);\n      this.hasError.set(true);\n      this.replies.set([]);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  /**\n   * Starts the delay timer for showing smart replies.\n   *\n   * Checks if smart replies should be shown, then starts a timer.\n   * When the timer fires, fetches smart replies from the AI extension.\n   *\n   * @see Requirement 2.4 - Appear after configurable delay (default 10 seconds)\n   */\n  private startDelayTimer(): void {\n    // Check if smart replies should be shown\n    if (!this.shouldShowSmartReplies()) {\n      return;\n    }\n\n    // If delay is 0, fetch immediately\n    if (this.delayDuration === 0) {\n      this.fetchSmartReplies();\n      return;\n    }\n\n    // Start delay timer\n    this.delayTimeoutId = setTimeout(() => {\n      this.fetchSmartReplies();\n    }, this.delayDuration);\n  }\n\n  /**\n   * Resets the component state.\n   * Called when the message changes.\n   */\n  private resetState(): void {\n    this.clearDelayTimeout();\n    this.replies.set([]);\n    this.hasError.set(false);\n    this.isLoading.set(false);\n  }\n\n  /**\n   * Clears the delay timeout if one exists.\n   */\n  private clearDelayTimeout(): void {\n    if (this.delayTimeoutId !== null) {\n      clearTimeout(this.delayTimeoutId);\n      this.delayTimeoutId = null;\n    }\n  }\n}\n","@if (isVisible) {\n  <div\n    class=\"cometchat-smart-replies\"\n    role=\"region\"\n    [attr.aria-label]=\"ariaLabel\"\n    aria-live=\"polite\"\n  >\n    <!-- Header with title and close button -->\n    <div class=\"cometchat-smart-replies__header\">\n      <span class=\"cometchat-smart-replies__title\">\n        {{ 'ai_smart_replies_title' | translate }}\n      </span>\n      <button\n        class=\"cometchat-smart-replies__close\"\n        type=\"button\"\n        [attr.aria-label]=\"'close' | translate\"\n        (click)=\"onCloseClick()\"\n        (keydown.enter)=\"onCloseClick()\"\n        (keydown.space)=\"$event.preventDefault(); onCloseClick()\"\n      >\n        <span class=\"cometchat-smart-replies__close-icon\" aria-hidden=\"true\"></span>\n      </button>\n    </div>\n\n    <!-- Loading state - shimmer bars -->\n    @if (isLoading()) {\n      <div class=\"cometchat-smart-replies__loading\" role=\"status\">\n        <div class=\"cometchat-smart-replies__shimmer-bar\"></div>\n        <div class=\"cometchat-smart-replies__shimmer-bar\"></div>\n        <div class=\"cometchat-smart-replies__shimmer-bar\"></div>\n      </div>\n    }\n\n    <!-- Error state -->\n    @if (hasError() && !isLoading()) {\n      <div class=\"cometchat-smart-replies__error\" role=\"alert\">\n        <span class=\"cometchat-smart-replies__error-text\">\n          {{ 'ai_smart_replies_error' | translate }}\n        </span>\n      </div>\n    }\n\n    <!-- Replies list -->\n    @if (hasReplies && !isLoading() && !hasError()) {\n      <div\n        class=\"cometchat-smart-replies__list\"\n        role=\"group\"\n        [attr.aria-label]=\"'accessibility_smart_replies' | translate\"\n      >\n        @for (reply of replies(); track reply; let i = $index) {\n          <button\n            #replyButton\n            class=\"cometchat-smart-replies__item\"\n            type=\"button\"\n            [attr.aria-label]=\"reply\"\n            [attr.tabindex]=\"getReplyTabIndex(i)\"\n            (click)=\"onReplyClick(reply)\"\n            (keydown)=\"onReplyKeydown($event, reply, i)\"\n            (focus)=\"onReplyFocus(i)\"\n          >\n            <span class=\"cometchat-smart-replies__item-text\">{{ reply }}</span>\n          </button>\n        }\n      </div>\n    }\n\n    <!-- Empty state -->\n    @if (!hasReplies && !isLoading() && !hasError()) {\n      <div class=\"cometchat-smart-replies__empty\">\n        <span class=\"cometchat-smart-replies__empty-text\">\n          {{ 'ai_smart_replies_empty' | translate }}\n        </span>\n      </div>\n    }\n  </div>\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  signal,\n  OnDestroy,\n  OnInit,\n  AfterViewInit,\n  inject,\n  ViewChildren,\n  QueryList,\n  ElementRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatUIKitConstants } from '../../../constants';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Maximum number of conversation starters to display.\n * @see Requirement 3.2 - Display up to 4 starter suggestions\n */\nconst MAX_STARTERS = 4;\n\n/**\n * CometChatConversationStarterComponent displays AI-generated conversation starter suggestions.\n *\n * This component shows up to 4 conversation starter suggestions for new or empty conversations.\n * It integrates with the CometChat AI extension to generate contextual prompts.\n *\n * Features:\n * - Displays up to 4 starter suggestions as clickable chips\n * - Loading state while fetching suggestions\n * - Error state handling\n * - Keyboard accessible (Tab navigation, Enter/Space to select)\n * - ArrowLeft/ArrowRight navigation with wrap-around\n * - Screen reader announcements when starters appear\n * - Full ARIA accessibility support\n *\n * @example\n * ```html\n * <!-- Basic usage with user -->\n * <cometchat-conversation-starter\n *   [user]=\"activeUser\"\n *   (starterClick)=\"onStarterClick($event)\">\n * </cometchat-conversation-starter>\n *\n * <!-- Usage with group -->\n * <cometchat-conversation-starter\n *   [group]=\"activeGroup\"\n *   (starterClick)=\"onStarterClick($event)\">\n * </cometchat-conversation-starter>\n * ```\n *\n * @see Requirement 3.1 - Display conversation starters when showConversationStarters is true and conversation is empty\n * @see Requirement 3.2 - Display up to 4 starter suggestions\n * @see Requirement 3.3 - Emit conversationStarterClick event when clicked\n * @see Requirement 3.7 - Display loading state while fetching suggestions\n * @see Requirement 25.1 - Container focusable via Tab navigation\n * @see Requirement 25.2 - ArrowRight/ArrowLeft navigation between options\n * @see Requirement 25.3 - Enter/Space to send message\n * @see Requirement 25.4 - role=\"group\" and aria-label=\"Conversation starters\"\n * @see Requirement 25.5 - aria-label with starter text on each button\n * @see Requirement 25.6 - Announce \"Conversation starters available\" when component appears\n */\n@Component({\n  selector: 'cometchat-conversation-starter',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-conversation-starter.component.html',\n  styleUrls: ['./cometchat-conversation-starter.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatConversationStarterComponent implements OnInit, OnDestroy, AfterViewInit {\n  /**\n   * Reference to the LiveAnnouncerService for screen reader announcements.\n   * @see Requirement 25.6 - Announce \"Conversation starters available\" when component appears\n   */\n  private liveAnnouncer = inject(LiveAnnouncerService);\n\n  /**\n   * Reference to starter button elements for keyboard navigation.\n   */\n  @ViewChildren('starterButton') starterButtons!: QueryList<ElementRef<HTMLButtonElement>>;\n\n  /**\n   * Currently focused starter index for keyboard navigation.\n   * @see Requirement 25.2 - ArrowRight/ArrowLeft navigation\n   */\n  focusedIndex = signal(0);\n\n  /**\n   * The user context for generating conversation starters.\n   * Required for 1-on-1 conversations.\n   */\n  @Input() user?: CometChat.User;\n\n  /**\n   * The group context for generating conversation starters.\n   * Required for group conversations.\n   */\n  @Input() group?: CometChat.Group;\n\n  /**\n   * Emitted when a conversation starter is clicked.\n   * The event payload is the starter text that was clicked.\n   *\n   * @see Requirement 3.3 - Emit conversationStarterClick event when clicked\n   */\n  @Output() starterClick = new EventEmitter<string>();\n\n  /**\n   * Loading state signal.\n   * True when fetching conversation starters from the AI extension.\n   *\n   * @see Requirement 3.7 - Display loading state while fetching suggestions\n   */\n  isLoading = signal(false);\n\n  /**\n   * Generated starters signal.\n   * Contains up to 4 starter suggestions.\n   *\n   * @see Requirement 3.2 - Display up to 4 starter suggestions\n   */\n  starters = signal<string[]>([]);\n\n  /**\n   * Error state signal.\n   * True when there was an error fetching conversation starters.\n   */\n  hasError = signal(false);\n\n  /**\n   * Initializes the component and fetches conversation starters.\n   */\n  ngOnInit(): void {\n    this.fetchConversationStarters();\n  }\n\n  /**\n   * Announces conversation starters availability after view is initialized.\n   * @see Requirement 25.6 - Announce \"Conversation starters available\" when component appears\n   */\n  ngAfterViewInit(): void {\n    // Announcement is handled in fetchConversationStarters after starters are loaded\n  }\n\n  /**\n   * Cleanup on component destruction.\n   */\n  ngOnDestroy(): void {\n    // Reset state on destruction\n    this.reset();\n  }\n\n  /**\n   * Handles click on a conversation starter.\n   * Emits the starterClick event with the selected starter text.\n   *\n   * @param starter - The starter text that was clicked\n   * @see Requirement 3.3 - Emit conversationStarterClick event when clicked\n   */\n  onStarterClick(starter: string): void {\n    this.starterClick.emit(starter);\n  }\n\n  /**\n   * Handles keyboard events on starter items.\n   * Supports Enter and Space keys for selection, ArrowLeft/ArrowRight for navigation.\n   *\n   * @param event - The keyboard event\n   * @param starter - The starter text\n   * @param index - The index of the starter in the list\n   * @see Requirement 25.2 - ArrowRight/ArrowLeft navigation with wrap-around\n   * @see Requirement 25.3 - Enter/Space to send message\n   */\n  onStarterKeydown(event: KeyboardEvent, starter: string, index: number): void {\n    const startersCount = this.starters().length;\n\n    switch (event.key) {\n      case 'Enter':\n      case ' ':\n        event.preventDefault();\n        this.onStarterClick(starter);\n        break;\n\n      case 'ArrowRight':\n        event.preventDefault();\n        // Move to next starter with wrap-around\n        const nextIndex = (index + 1) % startersCount;\n        this.focusStarter(nextIndex);\n        break;\n\n      case 'ArrowLeft':\n        event.preventDefault();\n        // Move to previous starter with wrap-around\n        const prevIndex = (index - 1 + startersCount) % startersCount;\n        this.focusStarter(prevIndex);\n        break;\n\n      case 'Home':\n        event.preventDefault();\n        this.focusStarter(0);\n        break;\n\n      case 'End':\n        event.preventDefault();\n        this.focusStarter(startersCount - 1);\n        break;\n    }\n  }\n\n  /**\n   * Focuses a starter button by index.\n   * Updates the focused index and moves DOM focus.\n   *\n   * @param index - The index of the starter to focus\n   */\n  private focusStarter(index: number): void {\n    this.focusedIndex.set(index);\n    const buttons = this.starterButtons?.toArray();\n    if (buttons && buttons[index]) {\n      buttons[index].nativeElement.focus();\n    }\n  }\n\n  /**\n   * Gets the tabindex for a starter button based on roving tabindex pattern.\n   * Only the focused starter has tabindex=\"0\", others have tabindex=\"-1\".\n   *\n   * @param index - The index of the starter\n   * @returns 0 if focused, -1 otherwise\n   * @see Requirement 25.1 - Container focusable via Tab navigation\n   */\n  getStarterTabIndex(index: number): number {\n    return index === this.focusedIndex() ? 0 : -1;\n  }\n\n  /**\n   * Handles focus event on a starter button.\n   * Updates the focused index when a button receives focus.\n   *\n   * @param index - The index of the focused starter\n   */\n  onStarterFocus(index: number): void {\n    this.focusedIndex.set(index);\n  }\n\n  /**\n   * Checks if there are any starters to display.\n   */\n  get hasStarters(): boolean {\n    return this.starters().length > 0;\n  }\n\n  /**\n   * Checks if the component should be visible.\n   * Shows when loading, has starters, or has error.\n   */\n  get isVisible(): boolean {\n    return this.isLoading() || this.hasStarters || this.hasError();\n  }\n\n  /**\n   * Generates an accessible label for the conversation starters container.\n   */\n  get ariaLabel(): string {\n    const count = this.starters().length;\n    if (this.isLoading()) {\n      return CometChatLocalize.getLocalizedString('accessibility_loading');\n    }\n    if (count === 0) {\n      return CometChatLocalize.getLocalizedString('accessibility_no_results');\n    }\n    return CometChatLocalize.getLocalizedString('accessibility_conversation_starters');\n  }\n\n  /**\n   * Fetches conversation starters from the CometChat AI extension.\n   *\n   * Sets loading state, calls the API, and updates the starters signal.\n   * Limits results to 4 starters as per requirement.\n   * Handles errors gracefully by setting the error state.\n   * Announces availability to screen readers when starters are loaded.\n   *\n   * @see Requirement 3.2 - Display up to 4 starter suggestions\n   * @see Requirement 3.6 - Use the CometChat AI extension for generation\n   * @see Requirement 3.7 - Display loading state while fetching suggestions\n   * @see Requirement 25.6 - Announce \"Conversation starters available\" when component appears\n   */\n  async fetchConversationStarters(): Promise<void> {\n    // Determine receiver ID and type\n    const receiverId = this.user?.getUid() || this.group?.getGuid();\n    const receiverType = this.user\n      ? CometChatUIKitConstants.MessageReceiverType.user\n      : CometChatUIKitConstants.MessageReceiverType.group;\n\n    if (!receiverId) {\n      CometChatLogger.warn('CometChatConversationStarter', 'No user or group provided for conversation starters');\n      return;\n    }\n\n    this.isLoading.set(true);\n    this.hasError.set(false);\n\n    try {\n      // Call CometChat AI extension to get conversation starters\n      const response = await CometChat.getConversationStarter(receiverId, receiverType);\n\n      // Convert response to array of starter strings\n      // The API returns an array of strings or an object with starter keys\n      let startersArray: string[];\n      if (Array.isArray(response)) {\n        startersArray = response;\n      } else if (typeof response === 'object' && response !== null) {\n        startersArray = Object.values(response as Record<string, string>);\n      } else {\n        startersArray = [];\n      }\n\n      // Limit to MAX_STARTERS (4) as per requirement 3.2\n      const limitedStarters = startersArray.slice(0, MAX_STARTERS);\n\n      this.starters.set(limitedStarters);\n\n      // Reset focused index when new starters are loaded\n      this.focusedIndex.set(0);\n\n      // Announce conversation starters availability to screen readers\n      if (limitedStarters.length > 0) {\n        this.liveAnnouncer.announce(\n          CometChatLocalize.getLocalizedString('accessibility_conversation_starters_available'),\n          'polite'\n        );\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatConversationStarter', 'Error fetching conversation starters:', error);\n      this.hasError.set(true);\n      this.starters.set([]);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  /**\n   * Resets the component state.\n   * Can be called externally to refresh starters.\n   */\n  reset(): void {\n    this.starters.set([]);\n    this.hasError.set(false);\n    this.isLoading.set(false);\n  }\n\n  /**\n   * Refreshes the conversation starters by fetching new ones.\n   */\n  refresh(): void {\n    this.reset();\n    this.fetchConversationStarters();\n  }\n}\n","@if (isVisible) {\n  <div\n    class=\"cometchat-conversation-starter\"\n    role=\"region\"\n    [attr.aria-label]=\"ariaLabel\"\n    aria-live=\"polite\"\n  >\n    <!-- Loading state - shimmer bars -->\n    @if (isLoading()) {\n      <div class=\"cometchat-conversation-starter__loading\" role=\"status\">\n        <div class=\"cometchat-conversation-starter__shimmer-bar\" aria-hidden=\"true\"></div>\n        <div class=\"cometchat-conversation-starter__shimmer-bar\" aria-hidden=\"true\"></div>\n        <div class=\"cometchat-conversation-starter__shimmer-bar\" aria-hidden=\"true\"></div>\n      </div>\n    }\n\n    <!-- Error state -->\n    @if (hasError() && !isLoading()) {\n      <div class=\"cometchat-conversation-starter__error\" role=\"alert\">\n        <span class=\"cometchat-conversation-starter__error-text\">\n          {{ 'ai_conversation_starter_error' | translate }}\n        </span>\n      </div>\n    }\n\n    <!-- Starters list -->\n    @if (hasStarters && !isLoading() && !hasError()) {\n      <div\n        class=\"cometchat-conversation-starter__list\"\n        role=\"group\"\n        [attr.aria-label]=\"'accessibility_conversation_starters' | translate\"\n      >\n        @for (starter of starters(); track starter; let i = $index) {\n          <button\n            #starterButton\n            class=\"cometchat-conversation-starter__item\"\n            type=\"button\"\n            [attr.aria-label]=\"starter\"\n            [attr.tabindex]=\"getStarterTabIndex(i)\"\n            (click)=\"onStarterClick(starter)\"\n            (keydown)=\"onStarterKeydown($event, starter, i)\"\n            (focus)=\"onStarterFocus(i)\"\n          >\n            <span class=\"cometchat-conversation-starter__item-text\">{{ starter }}</span>\n          </button>\n        }\n      </div>\n    }\n\n    <!-- Empty state (no starters available after loading) -->\n    @if (!hasStarters && !isLoading() && !hasError()) {\n      <div class=\"cometchat-conversation-starter__empty\">\n        <span class=\"cometchat-conversation-starter__empty-text\">\n          {{ 'ai_smart_replies_empty' | translate }}\n        </span>\n      </div>\n    }\n  </div>\n}\n","import { Component, Input, ChangeDetectionStrategy, signal, OnInit } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { States } from '../../../Enums/Enums';\n\n/**\n * CometChatConversationSummaryComponent displays an AI-generated conversation summary\n * in a panel with a localized title, close button, and body area.\n *\n * The component fetches the summary via a provided callback on initialization,\n * showing a loading shimmer during the fetch, then transitions to loaded/empty/error state.\n *\n * @example\n * ```html\n * <cometchat-conversation-summary\n *   [getConversationSummary]=\"summaryCallback\"\n *   [closeCallback]=\"onClose\">\n * </cometchat-conversation-summary>\n * ```\n *\n * @see Requirement 1.1 - Render panel with title, close button, and body\n * @see Requirement 1.2 - Fetch summary and show loading shimmer\n * @see Requirement 1.3 - Display summary text for valid responses\n * @see Requirement 1.4 - Display empty state for empty responses\n * @see Requirement 1.5 - Display error state for errors\n * @see Requirement 1.6 - Close button invokes closeCallback\n * @see Requirement 1.7 - BEM CSS with CSS variables\n * @see Requirement 1.8 - Translate pipe for all text\n * @see Requirement 12.1 - Close button keyboard accessible\n */\n@Component({\n  selector: 'cometchat-conversation-summary',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-conversation-summary.component.html',\n  styleUrls: ['./cometchat-conversation-summary.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatConversationSummaryComponent implements OnInit {\n  /**\n   * Callback that fetches the conversation summary from the SDK.\n   * Returns a Promise resolving to the summary text string.\n   */\n  @Input() getConversationSummary?: () => Promise<string>;\n\n  /**\n   * Callback invoked when the close button is clicked to dismiss the panel.\n   */\n  @Input() closeCallback?: () => void;\n\n  /** Current state of the component (loading, loaded, empty, error). */\n  state = signal<States>(States.loading);\n\n  /** The fetched summary text to display in the body area. */\n  summaryText = signal<string>('');\n\n  /** Expose States enum to the template for @switch comparison. */\n  readonly States = States;\n\n  ngOnInit(): void {\n    this.fetchSummary();\n  }\n\n  /**\n   * Handles close button keyboard events (Enter and Space).\n   * @see Requirement 12.1\n   */\n  onCloseKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.closeCallback?.();\n    }\n  }\n\n  /**\n   * Fetches the conversation summary using the provided callback.\n   * Transitions state from loading to loaded/empty/error based on the response.\n   * @see Requirement 1.2, 1.3, 1.4, 1.5\n   */\n  private async fetchSummary(): Promise<void> {\n    if (!this.getConversationSummary) {\n      this.state.set(States.empty);\n      return;\n    }\n\n    try {\n      const summary = await this.getConversationSummary();\n      if (summary && summary.trim().length > 0) {\n        this.summaryText.set(summary);\n        this.state.set(States.loaded);\n      } else {\n        this.state.set(States.empty);\n      }\n    } catch {\n      this.state.set(States.error);\n    }\n  }\n}\n","<!--\n  CometChatConversationSummary Component Template\n\n  Displays an AI-generated conversation summary panel with:\n  - Header with localized title and close button\n  - Body area with loading shimmer, summary text, empty state, or error state\n\n  Accessibility Features:\n  - role=\"region\" for semantic structure\n  - Close button with aria-label, focusable, keyboard operable (Enter/Space)\n  - Loading state with role=\"status\" for screen readers\n  - Error state with role=\"alert\" for screen readers\n\n  Requirements: 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 12.1\n-->\n\n<div class=\"cometchat-conversation-summary__wrapper\" role=\"region\"\n  [attr.aria-label]=\"'ai_conversation_summary_title' | translate\">\n  <div class=\"cometchat-conversation-summary\">\n\n    <!-- Header: Title + Close Button -->\n    <div class=\"cometchat-conversation-summary__header\">\n      <div class=\"cometchat-conversation-summary__header-title\">\n        {{ 'ai_conversation_summary_title' | translate }}\n      </div>\n      <button\n        type=\"button\"\n        class=\"cometchat-conversation-summary__header-close-button\"\n        [attr.aria-label]=\"'close' | translate\"\n        (click)=\"closeCallback?.()\">\n        <span\n          class=\"cometchat-conversation-summary__header-close-icon\"\n          aria-hidden=\"true\">\n        </span>\n      </button>\n    </div>\n\n    <!-- Body: State-based content -->\n    <div class=\"cometchat-conversation-summary__body\">\n      @switch (state()) {\n        @case (States.loading) {\n          <div class=\"cometchat-conversation-summary__shimmer\" role=\"status\">\n            <div class=\"cometchat-conversation-summary__shimmer-line cometchat-conversation-summary__shimmer-line--long\"></div>\n            <div class=\"cometchat-conversation-summary__shimmer-line cometchat-conversation-summary__shimmer-line--medium\"></div>\n            <div class=\"cometchat-conversation-summary__shimmer-line cometchat-conversation-summary__shimmer-line--short\"></div>\n          </div>\n        }\n        @case (States.loaded) {\n          <div class=\"cometchat-conversation-summary__text\">\n            {{ summaryText() }}\n          </div>\n        }\n        @case (States.empty) {\n          <div class=\"cometchat-conversation-summary__empty\">\n            {{ 'ai_conversation_summary_empty' | translate }}\n          </div>\n        }\n        @case (States.error) {\n          <div class=\"cometchat-conversation-summary__error\" role=\"alert\">\n            {{ 'ai_conversation_summary_error' | translate }}\n          </div>\n        }\n      }\n    </div>\n\n  </div>\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  ElementRef,\n  ViewChild,\n  AfterViewInit,\n  signal,\n  ChangeDetectionStrategy,\n  inject,\n  ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { CometChat, FlagReason } from '@cometchat/chat-sdk-javascript';\nimport { CometChatButtonComponent } from '../cometchat-button/cometchat-button.component';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\nimport { LiveAnnouncerService } from '../../../services/live-announcer.service';\nimport { CometChatLogger } from '../../../utils/CometChatLogger';\n\n/**\n * CometChatFlagMessageDialog is a dialog for flagging/reporting inappropriate messages.\n * Fetches flag reasons from the SDK, allows reason selection and optional remark.\n * @see Requirements 9.2, 9.3\n */\n@Component({\n  selector: 'cometchat-flag-message-dialog',\n  standalone: true,\n  imports: [CommonModule, FormsModule, CometChatButtonComponent],\n  templateUrl: './cometchat-flag-message-dialog.component.html',\n  styleUrls: ['./cometchat-flag-message-dialog.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatFlagMessageDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  @Input() message!: CometChat.BaseMessage;\n  @Input() hideRemarkField = false;\n\n  @Output() confirm = new EventEmitter<{ message: CometChat.BaseMessage; reasonId: string; remark: string; }>();\n\n  /** Emitted when the dialog is cancelled. */\n  @Output() cancel = new EventEmitter<void>();\n\n  @ViewChild('dialogContainer', { static: false }) dialogContainer!: ElementRef<HTMLDivElement>;\n\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private cdr = inject(ChangeDetectorRef);\n\n  titleId = `cometchat-flag-message-dialog-title-${Math.random().toString(36).substr(2, 9)}`;\n  descriptionId = `cometchat-flag-message-dialog-desc-${Math.random().toString(36).substr(2, 9)}`;\n\n  private hasAnnouncedCharacterLimit = false;\n  isLoading = signal(false);\n  isError = signal(false);\n  remarkText = signal('');\n  flagReasons = signal<FlagReason[]>([]);\n  selectedReason = signal<FlagReason | null>(null);\n  isLoadingReasons = signal(true);\n  readonly MAX_REMARK_LENGTH = 500;\n  private previouslyFocusedElement: HTMLElement | null = null;\n  private focusableElements: HTMLElement[] = [];\n  private keydownListener: ((event: KeyboardEvent) => void) | null = null;\n\n  get errorMessage(): string { return CometChatLocalize.getLocalizedString('flag_message_error'); }\n  get dialogTitle(): string { return CometChatLocalize.getLocalizedString('flag_message_title'); }\n  get dialogSubtitle(): string { return CometChatLocalize.getLocalizedString('flag_message_subtitle'); }\n  get remarkLabel(): string { return CometChatLocalize.getLocalizedString('flag_message_remark_label'); }\n  get remarkOptional(): string { return CometChatLocalize.getLocalizedString('flag_message_remark_optional'); }\n  get remarkPlaceholder(): string { return CometChatLocalize.getLocalizedString('flag_message_remark_placeholder'); }\n  get confirmButtonText(): string { return CometChatLocalize.getLocalizedString('flag_message_confirm_yes'); }\n  get cancelButtonText(): string { return CometChatLocalize.getLocalizedString('flag_message_confirm_no'); }\n  get characterLimitMessage(): string { return CometChatLocalize.getLocalizedString('flag_message_character_limit_reached'); }\n  get remainingCharacters(): number { return this.MAX_REMARK_LENGTH - this.remarkText().length; }\n  get isCharacterLimitReached(): boolean { return this.remarkText().length >= this.MAX_REMARK_LENGTH; }\n\n  get isSubmitDisabled(): boolean {\n    return !this.selectedReason() || this.isLoading();\n  }\n\n  /**\n   * Gets the localized label for a flag reason.\n   * Falls back to the reason's name if no localization key exists.\n   */\n  getReasonLabel(reason: FlagReason): string {\n    const key = `flag_message_reason_id_${reason.id}`;\n    const localized = CometChatLocalize.getLocalizedString(key);\n    // If the key returns the key itself (not found), fall back to reason.name\n    return localized && localized !== key ? localized : reason.name;\n  }\n\n  ngOnInit(): void {\n    // Store the currently focused element to restore later\n    this.previouslyFocusedElement = document.activeElement as HTMLElement;\n\n    // Add keyboard event listener for Escape key\n    this.keydownListener = this.handleKeydown.bind(this);\n    document.addEventListener('keydown', this.keydownListener);\n\n    // Fetch flag reasons from the SDK\n    this.fetchFlagReasons();\n  }\n\n  ngAfterViewInit(): void {\n    // Set up focus trapping after view is initialized\n    this.setupFocusTrap();\n\n    // Focus the first focusable element (cancel button)\n    this.pendingTimers.push(setTimeout(() => {\n      if (this.focusableElements.length > 0) {\n        this.focusableElements[0].focus();\n      }\n    }, 0));\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    // Remove keyboard event listener\n    if (this.keydownListener) {\n      document.removeEventListener('keydown', this.keydownListener);\n    }\n\n    // Restore focus to the previously focused element\n    this.restoreFocus();\n  }\n\n  /**\n   * Fetches available flag reasons from the CometChat SDK.\n   * @see React UIKit: CometChat.getFlagReasons()\n   */\n  private async fetchFlagReasons(): Promise<void> {\n    try {\n      const reasons = await CometChat.getFlagReasons();\n      this.flagReasons.set(reasons);\n    } catch (error) {\n      CometChatLogger.error('CometChatFlagMessageDialog', 'fetchFlagReasons: Failed to fetch flag reasons', error);\n      // Don't block the dialog — user can still submit without a reason selection\n    } finally {\n      this.isLoadingReasons.set(false);\n      this.cdr.markForCheck();\n      // Reason buttons render asynchronously after this resolves; rebuild the\n      // focus-trap boundaries so Tab cycling includes them. Don't move focus.\n      this.pendingTimers.push(setTimeout(() => this.setupFocusTrap(), 0));\n    }\n  }\n\n  /**\n   * Toggles the selected flag reason.\n   * Clicking the same reason again deselects it.\n   */\n  toggleReason(reason: FlagReason): void {\n    if (this.selectedReason()?.id === reason.id) {\n      this.selectedReason.set(null);\n    } else {\n      this.selectedReason.set(reason);\n      this.isError.set(false);\n    }\n  }\n\n  /**\n   * Sets up focus trapping within the dialog.\n   * Finds all focusable elements and adds Tab key handling.\n   */\n  private setupFocusTrap(): void {\n    if (!this.dialogContainer) {\n      return;\n    }\n\n    // Find all focusable elements within the dialog\n    const focusableSelectors = [\n      'button:not([disabled])',\n      '[href]',\n      'input:not([disabled])',\n      'select:not([disabled])',\n      'textarea:not([disabled])',\n      '[tabindex]:not([tabindex=\"-1\"])',\n    ];\n\n    const elements = this.dialogContainer.nativeElement.querySelectorAll(\n      focusableSelectors.join(', ')\n    );\n\n    this.focusableElements = Array.from(elements) as HTMLElement[];\n  }\n\n  /**\n   * Handles keyboard events for accessibility.\n   * - Escape key: closes the dialog\n   * - Tab key: traps focus within the dialog\n   */\n  private handleKeydown(event: KeyboardEvent): void {\n    // Handle Escape key to close dialog\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.handleCancelClick();\n      return;\n    }\n\n    // Handle Tab key for focus trapping\n    if (event.key === 'Tab' && this.focusableElements.length > 0) {\n      const firstElement = this.focusableElements[0];\n      const lastElement = this.focusableElements[this.focusableElements.length - 1];\n      const activeElement = document.activeElement as HTMLElement;\n\n      // If Shift+Tab on first element, move to last element\n      if (event.shiftKey && activeElement === firstElement) {\n        event.preventDefault();\n        lastElement.focus();\n      }\n      // If Tab on last element, move to first element\n      else if (!event.shiftKey && activeElement === lastElement) {\n        event.preventDefault();\n        firstElement.focus();\n      }\n    }\n  }\n\n  /**\n   * Restores focus to the element that was focused before the dialog opened.\n   */\n  private restoreFocus(): void {\n    if (\n      this.previouslyFocusedElement &&\n      typeof this.previouslyFocusedElement.focus === 'function'\n    ) {\n      // Use setTimeout to ensure the dialog is fully removed from DOM\n      this.pendingTimers.push(setTimeout(() => {\n        this.previouslyFocusedElement?.focus();\n      }, 0));\n    }\n  }\n\n  /**\n   * Handles remark text input change.\n   * Enforces character limit and announces when limit is reached.\n   * @param event - The input event\n   * @see Requirement 13.12\n   */\n  onRemarkInput(event: Event): void {\n    const target = event.target as HTMLTextAreaElement;\n    let value = target.value;\n\n    // Enforce character limit\n    if (value.length > this.MAX_REMARK_LENGTH) {\n      value = value.substring(0, this.MAX_REMARK_LENGTH);\n      target.value = value;\n    }\n\n    this.remarkText.set(value);\n\n    // Announce character limit reached (only once per reaching limit)\n    if (value.length >= this.MAX_REMARK_LENGTH && !this.hasAnnouncedCharacterLimit) {\n      this.hasAnnouncedCharacterLimit = true;\n      this.liveAnnouncer.announce(this.characterLimitMessage, 'polite');\n    } else if (value.length < this.MAX_REMARK_LENGTH) {\n      // Reset flag when user deletes characters\n      this.hasAnnouncedCharacterLimit = false;\n    }\n  }\n\n  /**\n   * Handles confirm button click.\n   * Validates that a reason is selected, sets loading state, and emits confirm event.\n   * @see Requirement 9.4\n   */\n  handleSubmitClick(): void {\n    const reason = this.selectedReason();\n    if (!reason) {\n      return;\n    }\n    this.isLoading.set(true);\n    this.isError.set(false);\n    this.confirm.emit({\n      message: this.message,\n      reasonId: reason.id,\n      remark: this.remarkText(),\n    });\n  }\n\n  /**\n   * Handles cancel button click.\n   * Emits cancel event.\n   */\n  handleCancelClick(): void {\n    this.cancel.emit();\n  }\n\n  /**\n   * Called by parent to indicate success.\n   * Resets loading and error states.\n   */\n  setSuccess(): void {\n    this.isLoading.set(false);\n    this.isError.set(false);\n  }\n\n  /**\n   * Called by parent to indicate error.\n   * Shows error message and resets loading state.\n   */\n  setError(): void {\n    this.isError.set(true);\n    this.isLoading.set(false);\n  }\n}\n","<div class=\"cometchat\" style=\"width: fit-content; height: fit-content;\">\n  @if (isError()) {\n    <div class=\"cometchat-dialog-error-view cometchat-flag-message-dialog-error-view\" role=\"alert\">\n      {{ errorMessage }}\n    </div>\n  }\n  <div\n    class=\"cometchat-flag-message-dialog\"\n    #dialogContainer\n    role=\"alertdialog\"\n    aria-modal=\"true\"\n    [attr.aria-labelledby]=\"titleId\"\n    [attr.aria-describedby]=\"descriptionId\"\n  >\n    <div class=\"cometchat-flag-message-dialog__header\">\n      <div class=\"cometchat-flag-message-dialog__header-main\">\n        <div\n          class=\"cometchat-flag-message-dialog__header-title\"\n          [id]=\"titleId\"\n        >\n          {{ dialogTitle }}\n        </div>\n      </div>\n      <div\n        class=\"cometchat-flag-message-dialog__header-subtitle\"\n        [id]=\"descriptionId\"\n      >\n        {{ dialogSubtitle }}\n      </div>\n    </div>\n\n    <div class=\"cometchat-flag-message-dialog__body\">\n      <!-- Flag Reasons -->\n      @if (!isLoadingReasons() && flagReasons().length > 0) {\n        <div class=\"cometchat-flag-message-dialog__reasons\" role=\"group\" [attr.aria-label]=\"dialogTitle\">\n          @for (reason of flagReasons(); track reason.id) {\n            <button\n              type=\"button\"\n              class=\"cometchat-flag-message-dialog__reason\"\n              [class.cometchat-flag-message-dialog__reason--selected]=\"selectedReason()?.id === reason.id\"\n              (click)=\"toggleReason(reason)\"\n              [attr.aria-pressed]=\"selectedReason()?.id === reason.id\"\n            >\n              {{ getReasonLabel(reason) }}\n            </button>\n          }\n        </div>\n      }\n\n      <!-- Remark Field -->\n      @if (!hideRemarkField) {\n        <div class=\"cometchat-flag-message-dialog__remark\">\n          <div class=\"cometchat-flag-message-dialog__remark-header\">\n            <label\n              class=\"cometchat-flag-message-dialog__remark-label\"\n              for=\"flag-message-remark\"\n            >\n              {{ remarkLabel }}\n            </label>\n            <span class=\"cometchat-flag-message-dialog__remark-optional\">\n              ({{ remarkOptional }})\n            </span>\n          </div>\n          <textarea\n            id=\"flag-message-remark\"\n            class=\"cometchat-flag-message-dialog__remark-input\"\n            [placeholder]=\"remarkPlaceholder\"\n            [value]=\"remarkText()\"\n            (input)=\"onRemarkInput($event)\"\n            [maxLength]=\"MAX_REMARK_LENGTH\"\n            rows=\"3\"\n            aria-describedby=\"remark-character-count\"\n          ></textarea>\n          <div\n            id=\"remark-character-count\"\n            class=\"cometchat-flag-message-dialog__remark-counter\"\n            [class.cometchat-flag-message-dialog__remark-counter--limit]=\"isCharacterLimitReached\"\n          >\n            @if (isCharacterLimitReached) {\n              {{ characterLimitMessage }}\n            } @else {\n              {{ remainingCharacters }} / {{ MAX_REMARK_LENGTH }}\n            }\n          </div>\n        </div>\n      }\n\n      <!-- Action Buttons -->\n      <div class=\"cometchat-flag-message-dialog__actions\">\n        <div class=\"cometchat-flag-message-dialog__actions-item cometchat-flag-message-dialog__actions-cancel\">\n          <cometchat-button\n            [text]=\"cancelButtonText\"\n            [ariaLabel]=\"cancelButtonText\"\n            (buttonClick)=\"handleCancelClick()\"\n          ></cometchat-button>\n        </div>\n        <div\n          class=\"cometchat-flag-message-dialog__actions-item cometchat-flag-message-dialog__actions-submit\"\n          [class.cometchat-flag-message-dialog__actions-submit--disabled]=\"isSubmitDisabled\"\n        >\n          <cometchat-button\n            [text]=\"confirmButtonText\"\n            [ariaLabel]=\"confirmButtonText\"\n            [isLoading]=\"isLoading()\"\n            [disabled]=\"isSubmitDisabled\"\n            (buttonClick)=\"handleSubmitClick()\"\n          ></cometchat-button>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","/**\n * Types and interfaces for CometChatMessageInformation component.\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n/** Maximum characters for message preview truncation */\nexport const MAX_PREVIEW_LENGTH = 100;\n\n/**\n * Interface for receipt information with user details.\n */\nexport interface ReceiptInfo {\n  /** The user who received/read the message */\n  user: CometChat.User;\n  /** Timestamp when the action occurred (Unix timestamp in seconds) */\n  timestamp: number;\n}\n\n/**\n * Interface for combined user receipt information (for group messages).\n * Shows both read and delivered timestamps for a single user.\n */\nexport interface UserReceiptInfo {\n  /** The user who received/read the message */\n  user: CometChat.User;\n  /** Timestamp when the message was read (Unix timestamp in seconds), 0 if not read */\n  readAt: number;\n  /** Timestamp when the message was delivered (Unix timestamp in seconds), 0 if not delivered */\n  deliveredAt: number;\n}\n","/**\n * Utility functions for CometChatMessageInformation component.\n */\nimport { DatePipe } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { ReceiptInfo, MAX_PREVIEW_LENGTH } from './cometchat-message-information.types';\n\n/**\n * Formats a Unix timestamp (seconds) for accessibility announcements.\n * Returns a human-readable medium date/time string.\n */\nexport function formatTimestampForAccessibility(timestamp: number, datePipe: DatePipe): string {\n  const date = new Date(timestamp * 1000);\n  return datePipe.transform(date, 'medium') || '';\n}\n\n/**\n * Gets the aria-label for a receipt item.\n * Combines the receipt type (delivered/read), user name, and timestamp.\n */\nexport function getReceiptAriaLabel(\n  receipt: ReceiptInfo,\n  type: 'delivered' | 'read',\n  datePipe: DatePipe\n): string {\n  const userName = receipt.user.getName();\n  const timestamp = formatTimestampForAccessibility(receipt.timestamp, datePipe);\n\n  if (type === 'read') {\n    return CometChatLocalize.getLocalizedString('accessibility_read_by_user')\n      .replace('{name}', userName)\n      .replace('{time}', timestamp);\n  }\n\n  return CometChatLocalize.getLocalizedString('accessibility_delivered_to_user')\n    .replace('{name}', userName)\n    .replace('{time}', timestamp);\n}\n\n/**\n * Gets the truncated message preview text for a given message.\n * Returns localized descriptions for media messages.\n */\nexport function getMessagePreview(message: CometChat.BaseMessage): string {\n  if (!message) return '';\n\n  const messageType = message.getType();\n\n  if (messageType === CometChat.MESSAGE_TYPE.TEXT) {\n    const text = (message as CometChat.TextMessage).getText() || '';\n    return text.length > MAX_PREVIEW_LENGTH\n      ? text.substring(0, MAX_PREVIEW_LENGTH) + '...'\n      : text;\n  }\n\n  switch (messageType) {\n    case CometChat.MESSAGE_TYPE.IMAGE:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_image');\n    case CometChat.MESSAGE_TYPE.VIDEO:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_video');\n    case CometChat.MESSAGE_TYPE.AUDIO:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_audio');\n    case CometChat.MESSAGE_TYPE.FILE:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_file');\n    default:\n      return CometChatLocalize.getLocalizedString('message');\n  }\n}\n\n/**\n * Gets the icon URL for media messages, or null for non-media messages.\n */\nexport function getMediaIcon(message: CometChat.BaseMessage): string | null {\n  if (!message) return null;\n  switch (message.getType()) {\n    case CometChat.MESSAGE_TYPE.IMAGE:\n      return 'assets/conversations_image-message.svg';\n    case CometChat.MESSAGE_TYPE.VIDEO:\n      return 'assets/conversations_video-message.svg';\n    case CometChat.MESSAGE_TYPE.AUDIO:\n      return 'assets/conversations_audio-message.svg';\n    case CometChat.MESSAGE_TYPE.FILE:\n      return 'assets/conversations_file-message.svg';\n    default:\n      return null;\n  }\n}\n","/**\n * CometChatMessageInformation Component\n *\n * A panel component for displaying detailed message information including\n * delivery and read receipts with user avatars, names, and timestamps.\n *\n * @example\n * ```html\n * <cometchat-message-information\n *   [message]=\"selectedMessage\"\n *   [dateTimeFormat]=\"customDateFormat\"\n *   (closeClick)=\"onClosePanel()\">\n * </cometchat-message-information>\n * ```\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  signal,\n  OnInit,\n  OnChanges,\n  OnDestroy,\n  SimpleChanges,\n  ChangeDetectionStrategy,\n  computed,\n  ElementRef,\n  inject,\n} from '@angular/core';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar';\nimport { CometChatDateComponent } from '../base-elements/cometchat-date';\nimport { CometChatMessageBubbleComponent } from '../cometchat-message-bubble';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\nimport { CometChatTextFormatter } from '../../formatters/cometchat-text-formatter';\nimport { FocusTrapService } from '../../services/focus-trap.service';\nimport { COMETCHAT_GLOBAL_CONFIG, GlobalConfig } from '../../services/global-config.service';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\n\n// Re-export types for backward compatibility\nexport type { UserReceiptInfo } from './cometchat-message-information.types';\nimport type { ReceiptInfo, UserReceiptInfo } from './cometchat-message-information.types';\nimport {\n  getReceiptAriaLabel,\n  getMessagePreview,\n  getMediaIcon,\n} from './cometchat-message-information.utils';\n\n/**\n * CometChatMessageInformationComponent displays detailed message information\n * including delivery and read receipts.\n */\n@Component({\n  selector: 'cometchat-message-information',\n  standalone: true,\n  imports: [\n    CommonModule,\n    CometChatAvatarComponent,\n    CometChatDateComponent,\n    CometChatMessageBubbleComponent,\n    TranslatePipe,\n  ],\n  templateUrl: './cometchat-message-information.component.html',\n  styleUrls: ['./cometchat-message-information.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatMessageInformationComponent implements OnInit, OnChanges, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  // ==================== Injected Services ====================\n\n  private elementRef = inject(ElementRef);\n  private focusTrapService = inject(FocusTrapService);\n  private datePipe = new DatePipe('en-US');\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, {\n    optional: true,\n  });\n\n  // ==================== ExplicitlySet Flags & Backing Fields ====================\n  private textFormattersExplicitlySet = signal(false);\n  private _textFormatters = signal<CometChatTextFormatter[]>([]);\n\n  // ==================== Inputs ====================\n\n  /** The message to show information for. */\n  @Input() message!: CometChat.BaseMessage;\n\n  /** Date format for timestamps. */\n  @Input() dateTimeFormat?: CalendarObject;\n\n  /** Text formatters for processing message text content. */\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) {\n    this._textFormatters.set(value);\n    this.textFormattersExplicitlySet.set(true);\n  }\n  get textFormatters(): CometChatTextFormatter[] {\n    return this._textFormatters();\n  }\n\n  /** Whether to show the scrollbar in the content area. */\n  @Input() showScrollbar = false;\n\n  // ==================== Outputs ====================\n\n  /** Emitted when the panel close button is clicked. */\n  @Output() closeClick = new EventEmitter<void>();\n\n  // ==================== Effective Values ====================\n\n  effectiveTextFormatters = computed(() => {\n    if (this.textFormattersExplicitlySet()) return this._textFormatters();\n    if (this.globalConfig?.textFormatters !== undefined) return this.globalConfig.textFormatters;\n    return [];\n  });\n\n  // ==================== Signals ====================\n\n  /** Combined user receipts for group messages. */\n  userReceipts = signal<UserReceiptInfo[]>([]);\n\n  /** Delivery receipts signal (legacy, kept for backward compatibility). */\n  deliveryReceipts = signal<ReceiptInfo[]>([]);\n\n  /** Read receipts signal (legacy, kept for backward compatibility). */\n  readReceipts = signal<ReceiptInfo[]>([]);\n\n  isLoading = signal<boolean>(false);\n  hasError = signal<boolean>(false);\n  hasMoreReceipts = signal<boolean>(true);\n\n  /** Read timestamp for 1-on-1 messages (Unix timestamp in seconds). */\n  oneOnOneReadAt = signal<number>(0);\n\n  /** Delivered timestamp for 1-on-1 messages (Unix timestamp in seconds). */\n  oneOnOneDeliveredAt = signal<number>(0);\n\n  // ==================== Private Properties ====================\n\n  private loggedInUserUid = '';\n\n  // ==================== Computed Properties ====================\n\n  get effectiveDateFormat(): CalendarObject {\n    return this.dateTimeFormat || {\n      today: 'hh:mm A',\n      yesterday: '[Yesterday] hh:mm A',\n      otherDays: 'DD/MM/YYYY hh:mm A',\n    };\n  }\n\n  get messageBubbleDateFormat(): CalendarObject {\n    return { today: 'hh:mm A', yesterday: 'hh:mm A', otherDays: 'hh:mm A' };\n  }\n\n  get messagePreview(): string {\n    return getMessagePreview(this.message);\n  }\n\n  get mediaIcon(): string | null {\n    return getMediaIcon(this.message);\n  }\n\n  get isMediaMessage(): boolean {\n    return this.mediaIcon !== null;\n  }\n\n  get sentTimestamp(): number {\n    return this.message?.getSentAt() || 0;\n  }\n\n  get isGroupMessage(): boolean {\n    return this.message?.getReceiverType() === CometChat.RECEIVER_TYPE.GROUP;\n  }\n\n  get ariaLabel(): string {\n    return CometChatLocalize.getLocalizedString('message_information_title');\n  }\n\n  get closeButtonAriaLabel(): string {\n    return CometChatLocalize.getLocalizedString('message_information_close_hover');\n  }\n\n  get messageBubbleAlignment(): MessageBubbleAlignment {\n    if (!this.message || !this.loggedInUserUid) return MessageBubbleAlignment.left;\n    const senderId = this.message.getSender()?.getUid();\n    return senderId == this.loggedInUserUid\n      ? MessageBubbleAlignment.right\n      : MessageBubbleAlignment.left;\n  }\n\n  // ==================== Lifecycle Hooks ====================\n\n  ngOnInit(): void {\n    this.initializeLoggedInUser();\n    this.pendingTimers.push(setTimeout(() => {\n      this.focusTrapService.activate({\n        container: this.elementRef.nativeElement,\n        initialFocus: 'first',\n        returnFocusOnDeactivate: true,\n      });\n    }, 0));\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.focusTrapService.deactivate(this.elementRef.nativeElement);\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['message'] && this.message) {\n      this.resetAndFetchReceipts();\n    }\n  }\n\n  // ==================== Private Methods ====================\n\n  private async initializeLoggedInUser(): Promise<void> {\n    try {\n      const user = await CometChat.getLoggedinUser();\n      if (user) this.loggedInUserUid = user.getUid();\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageInformation', 'Error getting logged-in user:', error);\n    }\n  }\n\n  private resetAndFetchReceipts(): void {\n    this.userReceipts.set([]);\n    this.deliveryReceipts.set([]);\n    this.readReceipts.set([]);\n    this.oneOnOneReadAt.set(0);\n    this.oneOnOneDeliveredAt.set(0);\n    this.hasMoreReceipts.set(true);\n    this.hasError.set(false);\n\n    this.fetchReceipts();\n  }\n\n  async fetchReceipts(): Promise<void> {\n    if (!this.message || this.isLoading() || !this.hasMoreReceipts()) return;\n\n    this.isLoading.set(true);\n    this.hasError.set(false);\n\n    try {\n      if (this.isGroupMessage) {\n        await this.fetchGroupMessageReceipts(this.message.getId());\n      } else {\n        this.processOneOnOneReceipts();\n      }\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageInformation', 'Error fetching receipts:', error);\n      this.hasError.set(true);\n    } finally {\n      this.isLoading.set(false);\n    }\n  }\n\n  private async fetchGroupMessageReceipts(messageId: number): Promise<void> {\n    try {\n      const receiptsResponse = await CometChat.getMessageReceipts(messageId);\n      const receipts = receiptsResponse as CometChat.MessageReceipt[];\n\n      if (!receipts || !Array.isArray(receipts) || receipts.length === 0) {\n        this.hasMoreReceipts.set(false);\n        return;\n      }\n\n      const userReceiptMap = new Map<string, UserReceiptInfo>();\n\n      for (const receipt of receipts) {\n        const sender = receipt.getSender();\n        if (!sender || sender.getUid() === this.loggedInUserUid) continue;\n\n        const uid = sender.getUid();\n        const readAt = receipt.getReadAt() || 0;\n        const deliveredAt = receipt.getDeliveredAt() || 0;\n        const existing = userReceiptMap.get(uid);\n\n        if (existing) {\n          if (readAt > existing.readAt) existing.readAt = readAt;\n          if (deliveredAt > existing.deliveredAt) existing.deliveredAt = deliveredAt;\n        } else {\n          userReceiptMap.set(uid, { user: sender, readAt, deliveredAt });\n        }\n      }\n\n      this.userReceipts.set([...this.userReceipts(), ...Array.from(userReceiptMap.values())]);\n      this.hasMoreReceipts.set(false);\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageInformation', 'Error fetching group receipts:', error);\n      throw error;\n    }\n  }\n\n  private processOneOnOneReceipts(): void {\n    this.oneOnOneReadAt.set(this.message.getReadAt() || 0);\n    this.oneOnOneDeliveredAt.set(this.message.getDeliveredAt() || 0);\n    this.hasMoreReceipts.set(false);\n  }\n\n  // ==================== Event Handlers ====================\n\n  onPanelKeyDown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.onCloseClick();\n    }\n  }\n\n  onCloseClick(): void {\n    this.closeClick.emit();\n  }\n\n  onCloseKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onCloseClick();\n    }\n  }\n\n  onScroll(event: Event): void {\n    const element = event.target as HTMLElement;\n    const scrollBottom = element.scrollHeight - element.scrollTop - element.clientHeight;\n    if (scrollBottom < 50 && !this.isLoading() && this.hasMoreReceipts()) {\n      this.fetchReceipts();\n    }\n  }\n\n  retry(): void {\n    this.hasError.set(false);\n    this.fetchReceipts();\n  }\n\n  // ==================== Accessibility Methods ====================\n\n  getReceiptAriaLabel(receipt: ReceiptInfo, type: 'delivered' | 'read'): string {\n    return getReceiptAriaLabel(receipt, type, this.datePipe);\n  }\n\n  // ==================== TrackBy Functions ====================\n\n  trackByReceipt(index: number, receipt: ReceiptInfo): string {\n    return `${receipt.user.getUid()}-${receipt.timestamp}`;\n  }\n\n  trackByUserReceipt(index: number, receipt: UserReceiptInfo): string {\n    return receipt.user.getUid();\n  }\n}\n","<!--\n  CometChatMessageInformation Component Template\n  \n  Displays detailed message information including:\n  - Message content preview\n  - Sent timestamp\n  - For group messages: User list with avatars, names, and read/delivered timestamps\n  - For 1v1 messages: Read and Delivered sections with timestamps\n  \n  Requirements: 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8\n  Accessibility Requirements: 16.1, 16.2, 16.3, 16.4, 16.5, 16.6, 16.7\n-->\n\n<div \n  class=\"cometchat cometchat-message-information\"\n  role=\"dialog\"\n  aria-modal=\"true\"\n  [attr.aria-labelledby]=\"'cometchat-message-info-title'\"\n  (keydown)=\"onPanelKeyDown($event)\">\n\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-message-information__header\">\n    <h2 \n      id=\"cometchat-message-info-title\"\n      class=\"cometchat-message-information__title\">\n      {{ 'message_information_title' | translate }}\n    </h2>\n    <button\n      type=\"button\"\n      class=\"cometchat-message-information__close-button\"\n      [attr.aria-label]=\"'accessibility_close_message_info' | translate\"\n      [attr.title]=\"closeButtonAriaLabel\"\n      tabindex=\"0\"\n      (click)=\"onCloseClick()\"\n      (keydown)=\"onCloseKeydown($event)\">\n      <span \n        class=\"cometchat-message-information__close-icon\"\n        aria-hidden=\"true\">\n      </span>\n    </button>\n  </div>\n\n  <!-- ==================== Message Bubble Section ==================== -->\n  <div class=\"cometchat-message-information__message-section\">\n    <cometchat-message-bubble\n      [message]=\"message\"\n      [alignment]=\"1\"\n      [hideReceipts]=\"true\"\n      [hideAvatar]=\"true\"\n      [hideTimestamp]=\"false\"\n      [textFormatters]=\"effectiveTextFormatters()\"\n      [dateFormat]=\"messageBubbleDateFormat\">\n    </cometchat-message-bubble>\n  </div>\n\n  <!-- ==================== Content Section ==================== -->\n  <div \n    class=\"cometchat-message-information__content\"\n    [class.cometchat-message-information__content--hide-scrollbar]=\"!showScrollbar\"\n    (scroll)=\"onScroll($event)\">\n\n    <!-- Loading State (Initial) -->\n    @if (isLoading() && userReceipts().length === 0 && !oneOnOneReadAt() && !oneOnOneDeliveredAt()) {\n      <div \n        class=\"cometchat-message-information__loading\"\n        role=\"status\"\n        aria-live=\"polite\">\n        <div class=\"cometchat-message-information__spinner\"></div>\n      </div>\n    }\n\n    <!-- Error State -->\n    @if (hasError() && userReceipts().length === 0 && !oneOnOneReadAt() && !oneOnOneDeliveredAt()) {\n      <div \n        class=\"cometchat-message-information__error\"\n        role=\"alert\">\n        <span class=\"cometchat-message-information__error-text\">\n          {{ 'message_information_error' | translate }}\n        </span>\n        <button \n          class=\"cometchat-message-information__retry-button\"\n          (click)=\"retry()\"\n          (keydown.enter)=\"retry()\"\n          (keydown.space)=\"retry()\">\n          {{ 'retry' | translate }}\n        </button>\n      </div>\n    }\n\n    <!-- ==================== Group Message Receipts ==================== -->\n    @if (isGroupMessage && !isLoading()) {\n      @if (userReceipts().length > 0) {\n        <!-- User receipt list with avatars, names, and both read/delivered timestamps -->\n        <ul \n          class=\"cometchat-message-information__user-list\"\n          role=\"list\"\n          [attr.aria-label]=\"'message_information_title' | translate\">\n          @for (receipt of userReceipts(); track trackByUserReceipt($index, receipt)) {\n            <li \n              class=\"cometchat-message-information__user-item\"\n              role=\"listitem\">\n              <div \n                class=\"cometchat-message-information__user-avatar\"\n                aria-hidden=\"true\">\n                <cometchat-avatar\n                  [image]=\"receipt.user.getAvatar()\"\n                  [name]=\"receipt.user.getName()\">\n                </cometchat-avatar>\n              </div>\n              <div class=\"cometchat-message-information__user-content\">\n                <span class=\"cometchat-message-information__user-name\">\n                  {{ receipt.user.getName() }}\n                </span>\n                <!-- Read row -->\n                @if (receipt.readAt) {\n                  <div class=\"cometchat-message-information__user-receipt-row\">\n                    <span class=\"cometchat-message-information__user-receipt-label\">\n                      {{ 'message_information_read' | translate }}\n                    </span>\n                    <span class=\"cometchat-message-information__user-receipt-time\">\n                      <cometchat-date\n                        [timestamp]=\"receipt.readAt\"\n                        [calendarObject]=\"effectiveDateFormat\">\n                      </cometchat-date>\n                    </span>\n                  </div>\n                }\n                <!-- Delivered row -->\n                @if (receipt.deliveredAt) {\n                  <div class=\"cometchat-message-information__user-receipt-row\">\n                    <span class=\"cometchat-message-information__user-receipt-label\">\n                      {{ 'message_information_delivered' | translate }}\n                    </span>\n                    <span class=\"cometchat-message-information__user-receipt-time\">\n                      <cometchat-date\n                        [timestamp]=\"receipt.deliveredAt\"\n                        [calendarObject]=\"effectiveDateFormat\">\n                      </cometchat-date>\n                    </span>\n                  </div>\n                }\n              </div>\n            </li>\n          }\n        </ul>\n      } @else if (!hasError()) {\n        <!-- Group: no receipts yet -->\n        <div class=\"cometchat-message-information__empty\">\n          <span class=\"cometchat-message-information__empty-text\">\n            {{ 'message_information_group_message_receipt_empty' | translate }}\n          </span>\n        </div>\n      }\n    }\n\n    <!-- ==================== 1v1 Message Receipts ==================== -->\n    @if (!isGroupMessage && !isLoading()) {\n      <!-- Read Section -->\n      <div class=\"cometchat-message-information__section\">\n        <h3 class=\"cometchat-message-information__section-title\">\n          {{ 'message_information_read' | translate }}\n        </h3>\n        @if (oneOnOneReadAt()) {\n          <div class=\"cometchat-message-information__receipt-inline\">\n            <cometchat-date\n              [timestamp]=\"oneOnOneReadAt()\"\n              [calendarObject]=\"effectiveDateFormat\">\n            </cometchat-date>\n          </div>\n        } @else {\n          <span class=\"cometchat-message-information__receipt-empty-dash\" [attr.aria-label]=\"'accessibility_not_yet_read' | translate\">—</span>\n        }\n      </div>\n\n      <!-- Delivered Section -->\n      <div class=\"cometchat-message-information__section\">\n        <h3 class=\"cometchat-message-information__section-title\">\n          {{ 'message_information_delivered' | translate }}\n        </h3>\n        @if (oneOnOneDeliveredAt()) {\n          <div class=\"cometchat-message-information__receipt-inline\">\n            <cometchat-date\n              [timestamp]=\"oneOnOneDeliveredAt()\"\n              [calendarObject]=\"effectiveDateFormat\">\n            </cometchat-date>\n          </div>\n        } @else {\n          <span class=\"cometchat-message-information__receipt-empty-dash\" [attr.aria-label]=\"'accessibility_not_yet_delivered' | translate\">—</span>\n        }\n      </div>\n    }\n\n    <!-- Loading More Indicator -->\n    @if (isLoading() && userReceipts().length > 0) {\n      <div \n        class=\"cometchat-message-information__loading-more\"\n        role=\"status\"\n        aria-live=\"polite\">\n        <div class=\"cometchat-message-information__spinner cometchat-message-information__spinner--small\"></div>\n      </div>\n    }\n  </div>\n</div>\n","/**\n * Read/delivery receipt utilities for CometChatMessageList component.\n *\n * Extracted from cometchat-message-list.component.ts to isolate\n * receipt classification, sender/receiver detection, and unread count logic.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n// ==================== Sender / Receiver Classification ====================\n\n/**\n * Checks whether a message was sent by the logged-in user.\n *\n * @param message - The message to check\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function isSenderMessage(\n  message: CometChat.BaseMessage,\n  loggedInUid: string\n): boolean {\n  const sender = message.getSender();\n  return !!sender && sender.getUid() === loggedInUid;\n}\n\n/**\n * Checks whether a message was received from another user (not the logged-in user).\n *\n * @param message - The message to check\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function isReceiverMessage(\n  message: CometChat.BaseMessage,\n  loggedInUid: string\n): boolean {\n  return !isSenderMessage(message, loggedInUid);\n}\n\n// ==================== Receipt Eligibility ====================\n\n/**\n * Checks whether a message is eligible to be marked as read.\n * Only unread receiver messages that haven't been deleted are eligible.\n *\n * @param message - The message to check\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function isEligibleForReadReceipt(\n  message: CometChat.BaseMessage,\n  loggedInUid: string\n): boolean {\n  if (isSenderMessage(message, loggedInUid)) return false;\n  if (message.getDeletedAt()) return false;\n  if (message.getReadAt()) return false; // Already read\n  return true;\n}\n\n// ==================== Latest Receiver Message ====================\n\n/**\n * Finds the latest (highest ID) receiver message from a list.\n * Used to send a single read receipt for all unread messages.\n *\n * @param messages - Array of messages to search\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function getLatestReceiverMessage(\n  messages: CometChat.BaseMessage[],\n  loggedInUid: string\n): CometChat.BaseMessage | null {\n  let latest: CometChat.BaseMessage | null = null;\n  for (const msg of messages) {\n    if (!isReceiverMessage(msg, loggedInUid)) continue;\n    if (!latest || (msg.getId() ?? 0) > (latest.getId() ?? 0)) {\n      latest = msg;\n    }\n  }\n  return latest;\n}\n\n// ==================== Unread Count Helpers ====================\n\n/**\n * Counts the number of unread receiver messages in a list.\n *\n * @param messages - Array of messages to count\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function countUnreadMessages(\n  messages: CometChat.BaseMessage[],\n  loggedInUid: string\n): number {\n  return messages.filter(msg => isEligibleForReadReceipt(msg, loggedInUid)).length;\n}\n\n// ==================== Conversation ID Helpers ====================\n\n/**\n * Derives the conversation ID from a user or group.\n *\n * @param user - Active user (for 1-on-1 chats)\n * @param group - Active group (for group chats)\n */\nexport function getConversationId(\n  user: CometChat.User | null,\n  group: CometChat.Group | null\n): string | null {\n  if (user) return user.getUid();\n  if (group) return group.getGuid();\n  return null;\n}\n\n/**\n * Derives the conversation type string from a user or group.\n */\nexport function getConversationType(\n  user: CometChat.User | null,\n  group: CometChat.Group | null\n): string {\n  if (user) return CometChat.RECEIVER_TYPE.USER;\n  if (group) return CometChat.RECEIVER_TYPE.GROUP;\n  return '';\n}\n\n// ==================== Message Conversation Matching ====================\n\n/**\n * Checks whether a message belongs to the currently active conversation.\n *\n * @param message - The incoming message\n * @param user - Active user (for 1-on-1 chats)\n * @param group - Active group (for group chats)\n * @param loggedInUid - UID of the currently logged-in user\n */\nexport function isMessageForCurrentConversation(\n  message: CometChat.BaseMessage,\n  user: CometChat.User | null,\n  group: CometChat.Group | null,\n  loggedInUid: string\n): boolean {\n  if (user) {\n    const sender = message.getSender();\n    const receiverId = message.getReceiverId();\n    const senderUid = sender?.getUid();\n    return (\n      (senderUid === user.getUid() && receiverId === loggedInUid) ||\n      (senderUid === loggedInUid && receiverId === user.getUid())\n    );\n  }\n  if (group) {\n    return message.getReceiverId() === group.getGuid();\n  }\n  return false;\n}\n","/**\n * Message options utilities for CometChatMessageList component.\n *\n * Extracted from cometchat-message-list.component.ts to isolate\n * context menu option building and message action resolution.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatUIKitConstants } from '../../constants';\n\n// ==================== Option IDs ====================\n\nexport const MESSAGE_OPTION_IDS = {\n  EDIT: 'edit',\n  DELETE: 'delete',\n  REPLY: 'reply',\n  REPLY_IN_THREAD: 'replyInThread',\n  COPY: 'copy',\n  TRANSLATE: 'translate',\n  REACT: 'react',\n  MESSAGE_INFO: 'messageInfo',\n  MESSAGE_PRIVATELY: 'messagePrivately',\n  MARK_AS_UNREAD: 'markAsUnread',\n  FLAG: 'flag',\n} as const;\n\n// ==================== Default Option Builders ====================\n\n/**\n * Checks whether a message can be edited by the logged-in user.\n */\nexport function canEditMessage(\n  message: CometChat.BaseMessage,\n  loggedInUid: string\n): boolean {\n  if (message.getDeletedAt()) return false;\n  if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) return false;\n  const sender = message.getSender();\n  return !!sender && sender.getUid() === loggedInUid;\n}\n\n/**\n * Checks whether a message can be deleted by the logged-in user.\n */\nexport function canDeleteMessage(\n  message: CometChat.BaseMessage,\n  loggedInUid: string\n): boolean {\n  if (message.getDeletedAt()) return false;\n  const sender = message.getSender();\n  return !!sender && sender.getUid() === loggedInUid;\n}\n\n/**\n * Checks whether a message can be replied to.\n */\nexport function canReplyToMessage(message: CometChat.BaseMessage): boolean {\n  if (message.getDeletedAt()) return false;\n  const category = message.getCategory();\n  return category !== 'action' && category !== 'call';\n}\n\n/**\n * Checks whether a message can be copied to clipboard.\n */\nexport function canCopyMessage(message: CometChat.BaseMessage): boolean {\n  if (message.getDeletedAt()) return false;\n  return message.getType() === CometChatUIKitConstants.MessageTypes.text;\n}\n\n/**\n * Checks whether a message can be translated.\n */\nexport function canTranslateMessage(message: CometChat.BaseMessage): boolean {\n  if (message.getDeletedAt()) return false;\n  return message.getType() === CometChatUIKitConstants.MessageTypes.text;\n}\n\n/**\n * Checks whether a message can have reactions added.\n */\nexport function canReactToMessage(message: CometChat.BaseMessage): boolean {\n  if (message.getDeletedAt()) return false;\n  const category = message.getCategory();\n  return category !== 'action' && category !== 'call';\n}\n\n// ==================== Message Preview Helpers ====================\n\n/**\n * Returns a short preview string for a message (used in accessibility announcements).\n *\n * @param message - The message to preview\n * @param maxLength - Maximum preview length\n */\nexport function getMessagePreview(\n  message: CometChat.BaseMessage,\n  maxLength = 50\n): string {\n  if (message.getDeletedAt()) {\n    return CometChatLocalize.getLocalizedString('message_deleted');\n  }\n\n  const type = message.getType();\n  switch (type) {\n    case CometChatUIKitConstants.MessageTypes.text: {\n      const text = (message as CometChat.TextMessage).getText() || '';\n      return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text;\n    }\n    case CometChatUIKitConstants.MessageTypes.image:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_image');\n    case CometChatUIKitConstants.MessageTypes.video:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_video');\n    case CometChatUIKitConstants.MessageTypes.audio:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_audio');\n    case CometChatUIKitConstants.MessageTypes.file:\n      return CometChatLocalize.getLocalizedString('conversation_subtitle_file');\n    default:\n      return type;\n  }\n}\n\n/**\n * Checks whether a message is a media message (image, video, audio, file).\n */\nexport function isMediaMessage(message: CometChat.BaseMessage): boolean {\n  const type = message.getType();\n  return (\n    type === CometChatUIKitConstants.MessageTypes.image ||\n    type === CometChatUIKitConstants.MessageTypes.video ||\n    type === CometChatUIKitConstants.MessageTypes.audio ||\n    type === CometChatUIKitConstants.MessageTypes.file\n  );\n}\n","/**\n * Types and interfaces for CometChatMessageList component.\n *\n * Extracted from cometchat-message-list.component.ts to keep the\n * component class focused on UI logic while this file owns all type definitions.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\n// ==================== List Item Types ====================\n\n/**\n * Represents an item in the message list.\n * Can be either a message or a date separator.\n */\nexport interface MessageListItem {\n  /** Type of the item */\n  type: 'message' | 'date-separator';\n  /** The message object (only for type 'message') */\n  message?: CometChat.BaseMessage;\n  /** The date timestamp (only for type 'date-separator') */\n  date?: number;\n  /** Unique key for tracking */\n  key: string;\n  /** True when this message is the FIRST of a multi-attachment batch (same metadata.batchId run). */\n  isFirstInBatch?: boolean;\n  /** True when this message is the LAST of a multi-attachment batch (same metadata.batchId run). */\n  isLastInBatch?: boolean;\n}\n\n// ==================== Scroll State Types ====================\n\n/**\n * Saved scroll position for restoration after content changes.\n */\nexport interface ScrollPosition {\n  scrollTop: number;\n  scrollHeight: number;\n}\n\n/**\n * Result of a scroll-to-bottom check.\n */\nexport interface ScrollBottomState {\n  isAtBottom: boolean;\n  distanceFromBottom: number;\n}\n\n// ==================== Translation State Types ====================\n\n/**\n * Tracks the translation state for a single message.\n */\nexport interface MessageTranslationState {\n  isTranslating: boolean;\n  translatedText?: string;\n  language?: string;\n}\n\n// ==================== Delete/Flag Dialog Types ====================\n\n/**\n * State for the delete confirmation dialog.\n */\nexport interface DeleteDialogState {\n  isOpen: boolean;\n  message: CometChat.BaseMessage | null;\n}\n\n/**\n * State for the flag/report confirmation dialog.\n */\nexport interface FlagDialogState {\n  isOpen: boolean;\n  message: CometChat.BaseMessage | null;\n}\n\n// ==================== Emoji Keyboard Position Types ====================\n\n/**\n * Position coordinates for the emoji keyboard popup.\n */\nexport interface EmojiKeyboardPosition {\n  top?: number;\n  bottom?: number;\n  left?: number;\n  right?: number;\n}\n\n// ==================== Constants ====================\n\n/**\n * Threshold in pixels from the bottom to consider the list \"at bottom\".\n */\nexport const SCROLL_BOTTOM_THRESHOLD = 50;\n\n/**\n * Number of retries for scroll-to-bottom after content load.\n */\nexport const SCROLL_RETRY_COUNT = 3;\n\n/**\n * Delay between scroll retries in ms.\n */\nexport const SCROLL_RETRY_DELAY_MS = 100;\n\n/**\n * Debounce delay for scroll event handling in ms.\n */\nexport const SCROLL_DEBOUNCE_MS = 100;\n","/**\n * Scroll utilities for CometChatMessageList component.\n *\n * Extracted from cometchat-message-list.component.ts to isolate\n * scroll position management, sticky date logic, and scroll-to-message helpers.\n */\n\nimport { SCROLL_BOTTOM_THRESHOLD, ScrollPosition } from './cometchat-message-list.types';\n\n// ==================== Scroll Position Helpers ====================\n\n/**\n * Saves the current scroll position of a container element.\n */\nexport function saveScrollPosition(container: HTMLElement): ScrollPosition {\n  return {\n    scrollTop: container.scrollTop,\n    scrollHeight: container.scrollHeight,\n  };\n}\n\n/**\n * Restores a previously saved scroll position after content is prepended.\n * Adjusts scrollTop to maintain the user's visual position.\n */\nexport function restoreScrollPosition(\n  container: HTMLElement,\n  saved: ScrollPosition\n): void {\n  const heightDiff = container.scrollHeight - saved.scrollHeight;\n  container.scrollTop = saved.scrollTop + heightDiff;\n}\n\n/**\n * Checks whether the scroll container is at (or near) the bottom.\n *\n * @param container - The scrollable element\n * @param threshold - Distance from bottom in px to consider \"at bottom\"\n */\nexport function isScrolledToBottom(\n  container: HTMLElement,\n  threshold = SCROLL_BOTTOM_THRESHOLD\n): boolean {\n  const distanceFromBottom =\n    container.scrollHeight - container.scrollTop - container.clientHeight;\n  return distanceFromBottom <= threshold;\n}\n\n/**\n * Scrolls the container to the bottom.\n *\n * @param container - The scrollable element\n * @param smooth - Whether to use smooth scrolling\n */\nexport function scrollToBottom(container: HTMLElement, smooth = false): void {\n  container.scrollTo({\n    top: container.scrollHeight,\n    behavior: smooth ? 'smooth' : 'auto',\n  });\n}\n\n// ==================== Scroll-to-Message Helpers ====================\n\n/**\n * Finds the DOM element for a message by its ID.\n *\n * @param container - The list container element\n * @param messageId - The message ID to find\n */\nexport function findMessageElement(\n  container: HTMLElement,\n  messageId: string | number\n): Element | null {\n  return container.querySelector(`[data-message-id=\"${messageId}\"]`);\n}\n\n/**\n * Scrolls a message element into view and applies a highlight animation.\n *\n * @param element - The message DOM element\n * @param highlightClass - CSS class to apply for highlight effect\n * @param highlightDuration - Duration of highlight in ms\n */\nexport function highlightAndScrollToElement(\n  element: Element,\n  highlightClass = 'cometchat-message-list__message--highlighted',\n  highlightDuration = 2000\n): void {\n  element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n  element.classList.add(highlightClass);\n  setTimeout(() => element.classList.remove(highlightClass), highlightDuration);\n}\n\n// ==================== Sticky Date Helpers ====================\n\n/**\n * Determines which date separator should be shown as the sticky header\n * based on the current scroll position.\n *\n * @param container - The scrollable list container\n * @param dateSeparatorSelector - CSS selector for date separator elements\n */\nexport function getStickyDateFromScroll(\n  container: HTMLElement,\n  dateSeparatorSelector = '[data-date-separator]'\n): number | null {\n  const separators = Array.from(\n    container.querySelectorAll<HTMLElement>(dateSeparatorSelector)\n  );\n\n  if (separators.length === 0) return null;\n\n  const containerTop = container.getBoundingClientRect().top;\n  let stickyDate: number | null = null;\n\n  for (const sep of separators) {\n    const rect = sep.getBoundingClientRect();\n    if (rect.top - containerTop <= 0) {\n      const dateAttr = sep.getAttribute('data-date-separator');\n      if (dateAttr) stickyDate = Number(dateAttr);\n    } else {\n      break;\n    }\n  }\n\n  return stickyDate;\n}\n\n// ==================== Retry Scroll Helpers ====================\n\n/**\n * Attempts to scroll to the bottom with retries, waiting for content to render.\n *\n * @param container - The scrollable element\n * @param retries - Number of retry attempts remaining\n * @param delayMs - Delay between retries in ms\n * @param smooth - Whether to use smooth scrolling\n */\nexport function scrollToBottomWithRetry(\n  container: HTMLElement,\n  retries: number,\n  delayMs = 100,\n  smooth = false\n): void {\n  scrollToBottom(container, smooth);\n  if (retries > 0) {\n    setTimeout(\n      () => scrollToBottomWithRetry(container, retries - 1, delayMs, smooth),\n      delayMs\n    );\n  }\n}\n","/**\n * Extracted event subscription logic for CometChatMessageListComponent.\n * Called from the component via delegation.\n */\nimport {DestroyRef, ChangeDetectorRef} from '@angular/core';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents, IMessages} from '../../events/CometChatMessageEvents';\nimport {CometChatGroupEvents, IGroupLeft, IGroupMemberAdded, IGroupMemberKickedBanned, IGroupMemberScopeChanged, IOwnershipChanged} from '../../events/CometChatGroupEvents';\nimport {CometChatCallEvents} from '../../events/CometChatCallEvents';\nimport {CometChatUIEvents, IDialog, IShowOngoingCall} from '../../events/CometChatUIEvents';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {MessageListService} from '../../services/message-list.service';\n\nexport interface MessageEventContext {\n  destroyRef: DestroyRef;\n  cdr: ChangeDetectorRef;\n  parentMessageId: number | null;\n  user: CometChat.User | null | undefined;\n  group: CometChat.Group | null | undefined;\n  messageListService: MessageListService;\n  isMessageForCurrentConversation(msg: CometChat.BaseMessage): boolean;\n  scrollToBottom(smooth: boolean): void;\n  showInlineToast(msg: string, type?: any, duration?: number): void;\n  subscribeToGroupEvents(): void;\n  subscribeToCallEvents(): void;\n  subscribeToUIDialogEvents(): void;\n}\n\nexport function subscribeToMessageEventsImpl(ctx: MessageEventContext): void {\n  CometChatMessageEvents.ccMessageSent.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(data => {\n    if (data.status === MessageStatus.inprogress) {\n      const messageParentId = data.message.getParentMessageId();\n      if (ctx.parentMessageId) {\n        if (messageParentId !== ctx.parentMessageId) { return; }\n      } else {\n        if (messageParentId) { return; }\n      }\n      requestAnimationFrame(() => { ctx.scrollToBottom(false); });\n    }\n  });\n  CometChatMessageEvents.ccMessageDeleted.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((message: CometChat.BaseMessage) => {\n    const messageId = message.getId();\n    if (messageId) {\n      const existing = ctx.messageListService.getMessageById(messageId);\n      if (existing && !existing.getDeletedAt()) { ctx.messageListService.deleteMessage(messageId); }\n      ctx.cdr.markForCheck();\n    }\n  });\n  CometChatMessageEvents.ccMessageTranslated.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IMessages) => {\n    if (data.status === MessageStatus.success && data.message) {\n      if (ctx.isMessageForCurrentConversation(data.message)) { ctx.messageListService.updateMessageById(data.message.getId(), data.message); ctx.cdr.markForCheck(); }\n    }\n  });\n  CometChatMessageEvents.ccMessageEdited.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IMessages) => {\n    if (ctx.parentMessageId) { if (data.parentMessageId !== ctx.parentMessageId) return; } else { if (data.parentMessageId) return; }\n    if (data.status === MessageStatus.success) { ctx.showInlineToast(CometChatLocalize.getLocalizedString('message_list_message_edited')); } else if (data.status === MessageStatus.error) { ctx.showInlineToast(CometChatLocalize.getLocalizedString('message_edit_error'), undefined, 3000); }\n  });\n  CometChatMessageEvents.ccMessageRead.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((message: CometChat.BaseMessage) => {\n    if (ctx.user && message.getReceiverType() === CometChatUIKitConstants.MessageReceiverType.user) {\n      if (message.getParentMessageId() && !ctx.parentMessageId) { return; }\n    }\n  });\n  ctx.subscribeToGroupEvents();\n  ctx.subscribeToCallEvents();\n  ctx.subscribeToUIDialogEvents();\n}\n\nexport interface GroupEventContext {\n  destroyRef: DestroyRef;\n  cdr: ChangeDetectorRef;\n  parentMessageId: number | null;\n  group: CometChat.Group | null | undefined;\n  messageListService: MessageListService;\n  scrollToBottom(smooth: boolean): void;\n  setGroup(group: CometChat.Group): void;\n}\n\nexport function subscribeToGroupEventsImpl(ctx: GroupEventContext): void {\n  CometChatGroupEvents.ccOwnershipChanged.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IOwnershipChanged) => {\n    if (ctx.group && data.group.getGuid() === ctx.group.getGuid()) { ctx.setGroup(data.group); ctx.cdr.markForCheck(); }\n  });\n  CometChatGroupEvents.ccGroupMemberScopeChanged.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IGroupMemberScopeChanged) => {\n    if (ctx.group && data.group.getGuid() === ctx.group.getGuid()) {\n      ctx.setGroup(data.group);\n      if (!ctx.parentMessageId) { ctx.messageListService.addMessage(data.message); ctx.scrollToBottom(false); }\n      ctx.cdr.markForCheck();\n    }\n  });\n  CometChatGroupEvents.ccGroupMemberAdded.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IGroupMemberAdded) => {\n    if (ctx.group && data.userAddedIn.getGuid() === ctx.group.getGuid()) {\n      ctx.setGroup(data.userAddedIn);\n      if (!ctx.parentMessageId) { data.messages.forEach(message => { ctx.messageListService.addMessage(message); }); ctx.scrollToBottom(false); }\n      ctx.cdr.markForCheck();\n    }\n  });\n  CometChatGroupEvents.ccGroupMemberBanned.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IGroupMemberKickedBanned) => {\n    if (ctx.group && data.kickedFrom.getGuid() === ctx.group.getGuid()) {\n      ctx.setGroup(data.kickedFrom);\n      if (!ctx.parentMessageId) { ctx.messageListService.addMessage(data.message); ctx.scrollToBottom(false); }\n      ctx.cdr.markForCheck();\n    }\n  });\n  CometChatGroupEvents.ccGroupMemberKicked.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IGroupMemberKickedBanned) => {\n    if (ctx.group && data.kickedFrom.getGuid() === ctx.group.getGuid()) {\n      ctx.setGroup(data.kickedFrom);\n      if (!ctx.parentMessageId) { ctx.messageListService.addMessage(data.message); ctx.scrollToBottom(false); }\n      ctx.cdr.markForCheck();\n    }\n  });\n  CometChatGroupEvents.ccGroupLeft.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IGroupLeft) => {\n    if (ctx.group && data.leftGroup.getGuid() === ctx.group.getGuid()) {\n      if (!ctx.parentMessageId) { ctx.messageListService.addMessage(data.message); ctx.scrollToBottom(false); }\n      ctx.cdr.markForCheck();\n    }\n  });\n}\n\nexport interface CallEventContext {\n  destroyRef: DestroyRef;\n  cdr: ChangeDetectorRef;\n  parentMessageId: number | null;\n  messageListService: MessageListService;\n  isCallForCurrentConversation(call: CometChat.Call): boolean;\n  scrollToBottom(smooth: boolean): void;\n  showCallScreen: { set(v: boolean): void };\n  ongoingCallView: { set(v: any): void };\n}\n\nexport function subscribeToCallEventsImpl(ctx: CallEventContext): void {\n  CometChatCallEvents.ccCallEnded.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((call: CometChat.Call) => {\n    ctx.showCallScreen.set(false);\n    ctx.ongoingCallView.set(null);\n    if (call && !ctx.parentMessageId) {\n      if (ctx.isCallForCurrentConversation(call)) { ctx.messageListService.addMessage(call); ctx.scrollToBottom(false); ctx.cdr.markForCheck(); }\n    }\n  });\n  CometChatCallEvents.ccCallRejected.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((call: CometChat.Call) => {\n    if (call && !ctx.parentMessageId) {\n      if (ctx.isCallForCurrentConversation(call)) { ctx.messageListService.addMessage(call); ctx.scrollToBottom(false); ctx.cdr.markForCheck(); }\n    }\n  });\n  CometChatCallEvents.ccOutgoingCall.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((call: CometChat.Call) => {\n    if (call && !ctx.parentMessageId) {\n      if (ctx.isCallForCurrentConversation(call)) { ctx.messageListService.addMessage(call); ctx.scrollToBottom(false); ctx.cdr.markForCheck(); }\n    }\n  });\n  CometChatCallEvents.ccCallAccepted.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((call: CometChat.Call) => {\n    if (call && !ctx.parentMessageId) {\n      if (ctx.isCallForCurrentConversation(call)) { ctx.messageListService.addMessage(call); ctx.scrollToBottom(false); ctx.cdr.markForCheck(); }\n    }\n  });\n}\n\nexport interface UIDialogEventContext {\n  destroyRef: DestroyRef;\n  cdr: ChangeDetectorRef;\n  parentMessageId: number | null;\n  imageModerationDialogContent: { set(v: any): void };\n  showImageModerationDialog: { set(v: boolean): void };\n  showCallScreen: { set(v: boolean): void };\n  ongoingCallView: { set(v: any): void };\n}\n\nexport function subscribeToUIDialogEventsImpl(ctx: UIDialogEventContext): void {\n  CometChatUIEvents.ccShowDialog.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IDialog) => {\n    ctx.imageModerationDialogContent.set(data.child);\n    ctx.showImageModerationDialog.set(true);\n    ctx.cdr.markForCheck();\n  });\n  CometChatUIEvents.ccHideDialog.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe(() => {\n    ctx.imageModerationDialogContent.set(null);\n    ctx.showImageModerationDialog.set(false);\n    ctx.cdr.markForCheck();\n  });\n  CometChatUIEvents.ccShowOngoingCall.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((data: IShowOngoingCall) => {\n    const shouldShow = !!data.child;\n    const isMatch = data.message\n      ? (data.message.getParentMessageId() && ctx.parentMessageId && data.message.getParentMessageId() === ctx.parentMessageId) ||\n        (!ctx.parentMessageId && !data.message?.getParentMessageId())\n      : true;\n    if (isMatch) {\n      ctx.showCallScreen.set(shouldShow);\n      ctx.ongoingCallView.set(data.child);\n      ctx.cdr.markForCheck();\n    }\n  });\n}\n","/**\n * Extracted getMessageOptions logic for CometChatMessageListComponent.\n */\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatActionsIcon} from '../../modals/CometChatActionsIcon';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {hasMediaCaption} from '../../utils/message-metadata-utils';\n\n/**\n * A message disapproved by moderation shows an error indicator on its bubble and must not be\n * editable — editing would let the sender slip a rejected message back into an approved state.\n * Mirrors the bubble's `isDisapprovedByModeration` getter, guarding the SDK method in case an\n * older Chat SDK build doesn't expose `getModerationStatus`.\n */\nfunction isDisapprovedByModeration(message: CometChat.BaseMessage): boolean {\n  const getStatus = (message as any).getModerationStatus;\n  if (typeof getStatus !== 'function') return false;\n  return getStatus.call(message) === CometChatUIKitConstants.moderationStatus.disapproved;\n}\n\n/**\n * A locally-rejected message can have no sender yet, in which case it was authored by the logged-in\n * user — so a missing sender counts as \"mine\". Mirrors the React kit's `isSentByMe`.\n */\nfunction isSentByMe(loggedInUser: CometChat.User | null, message: CometChat.BaseMessage): boolean {\n  const sender = message.getSender();\n  return !sender || sender.getUid() === loggedInUser?.getUid();\n}\n\n/**\n * Options for a message disapproved by moderation. Matches the React kit's `getMessageOptions`\n * whitelist: a rejected message collapses to at most Delete + Copy — every other action\n * (react/reply/thread/edit/translate/info/flag/message-privately/mark-unread) is stripped so the\n * message can't be re-shared or re-surfaced. Returned directly (no `optionsOverride`), exactly as\n * React returns this list early.\n */\nfunction getModeratedMessageOptions(ctx: MessageOptionsContext, message: CometChat.BaseMessage): CometChatActionsIcon[] {\n  const options: CometChatActionsIcon[] = [];\n  const isParticipant = ctx.group?.getScope() === CometChatUIKitConstants.groupMemberScope.participant;\n\n  // Delete: the sender can always remove it; in a group a non-participant (moderator/admin/owner)\n  // can too. Mirrors React's `(isSentByMe || (!isParticipant && group))`.\n  if ((isSentByMe(ctx.loggedInUser, message) || (!isParticipant && !!ctx.group)) && !ctx.hideDeleteMessageOption) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.deleteMessage, title: CometChatLocalize.getLocalizedString('message_list_option_delete'), iconURL: 'assets/delete.svg', onClick: () => {} }));\n  }\n\n  // Copy: text messages only (captioned media is NOT copyable here), matching React.\n  if (message.getType() === 'text' && !ctx.hideCopyMessageOption) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.copyMessage, title: CometChatLocalize.getLocalizedString('message_list_option_copy'), iconURL: 'assets/Copy.svg', onClick: () => {} }));\n  }\n\n  return options;\n}\n\nexport interface MessageOptionsContext {\n  loggedInUser: CometChat.User | null;\n  group: CometChat.Group | null | undefined;\n  hideReactionOption: boolean;\n  hideReplyOption: boolean;\n  hideReplyInThreadOption: boolean;\n  hideCopyMessageOption: boolean;\n  hideEditMessageOption: boolean;\n  hideDeleteMessageOption: boolean;\n  hideTranslateMessageOption: boolean;\n  hideMessageInfoOption: boolean;\n  hideFlagMessageOption: boolean;\n  hideMessagePrivatelyOption: boolean;\n  showMarkAsUnreadOption: boolean;\n  additionalOptions: CometChatActionsIcon[];\n  optionsOverride?: ((message: CometChat.BaseMessage, options: CometChatActionsIcon[]) => CometChatActionsIcon[]) | null;\n}\n\nexport function getMessageOptionsImpl(ctx: MessageOptionsContext, message: CometChat.BaseMessage): CometChatActionsIcon[] {\n  if (message.getDeletedAt()) return [];\n  // A moderation-rejected message gets the restricted (Delete + Copy) set, matching the React kit.\n  if (isDisapprovedByModeration(message)) return getModeratedMessageOptions(ctx, message);\n\n  // Agentic messages (AI agent in group) get copy-only context menu\n  if (message.getCategory() === CometChatUIKitConstants.MessageCategory.agentic) {\n    if (ctx.hideCopyMessageOption) return [];\n    return [\n      new CometChatActionsIcon({\n        id: CometChatUIKitConstants.MessageOption.copyMessage,\n        title: CometChatLocalize.getLocalizedString('message_list_option_copy'),\n        iconURL: 'assets/Copy.svg',\n        onClick: () => {},\n      }),\n    ];\n  }\n\n  const options: CometChatActionsIcon[] = [];\n  if (!ctx.hideReactionOption) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.reactToMessage, title: CometChatLocalize.getLocalizedString('message_list_option_react'), iconURL: 'assets/add_reaction_icon.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideReplyOption && !message.getDeletedAt()) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.replyMessage, title: CometChatLocalize.getLocalizedString('message_list_option_reply_to_message'), iconURL: 'assets/reply.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideReplyInThreadOption) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.replyInThread, title: CometChatLocalize.getLocalizedString('message_list_option_reply_in_thread'), iconURL: 'assets/reply_in_thread.svg', onClick: () => {} }));\n  }\n  // Copy and Edit act on the message's TEXT. A text message always has one; a media message has\n  // one only when it carries a caption — so captioned media gets both options too (matching the\n  // React kit's getMediaMessageOptions).\n  const isTextual = message.getType() === 'text' || hasMediaCaption(message);\n  if (!ctx.hideCopyMessageOption && isTextual) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.copyMessage, title: CometChatLocalize.getLocalizedString('message_list_option_copy'), iconURL: 'assets/Copy.svg', onClick: () => {} }));\n  }\n  const sender = message.getSender();\n  const isOwnMessage = ctx.loggedInUser && sender?.getUid() === ctx.loggedInUser.getUid();\n  if (!ctx.hideEditMessageOption && isOwnMessage && isTextual) {\n    options.push(new CometChatActionsIcon({ id: 'edit', title: CometChatLocalize.getLocalizedString('message_list_option_edit'), iconURL: 'assets/edit_icon.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideDeleteMessageOption && isOwnMessage) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.deleteMessage, title: CometChatLocalize.getLocalizedString('message_list_option_delete'), iconURL: 'assets/delete.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideTranslateMessageOption && message.getType() === 'text') {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.translateMessage, title: CometChatLocalize.getLocalizedString('message_list_option_translate'), iconURL: 'assets/translate.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideMessageInfoOption && isOwnMessage) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.messageInformation, title: CometChatLocalize.getLocalizedString('message_list_option_info'), iconURL: 'assets/info_icon.svg', onClick: () => {} }));\n  }\n  // Developer cards get the same option set as text *minus* edit + copy\n  // (both already gated to type==='text' above, so cards naturally exclude them).\n  // flag / mark-as-unread are message-category-gated; include the card category so\n  // a card matches the text option set, preserving the existing per-option conditions.\n  const isMessageOrCard =\n    message.getCategory() === CometChatUIKitConstants.MessageCategory.message ||\n    message.getCategory() === CometChatUIKitConstants.MessageCategory.card;\n  if (!ctx.hideFlagMessageOption && !isOwnMessage && isMessageOrCard) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.flagMessage, title: CometChatLocalize.getLocalizedString('message_list_option_flag_message'), iconURL: 'assets/flags.svg', onClick: () => {} }));\n  }\n  if (!ctx.hideMessagePrivatelyOption && ctx.group && !isOwnMessage) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.sendMessagePrivately, title: CometChatLocalize.getLocalizedString('message_list_option_message_privately'), iconURL: 'assets/send_message_privately.svg', onClick: () => {} }));\n  }\n  if (ctx.showMarkAsUnreadOption && !isOwnMessage && !message.getDeletedAt() && isMessageOrCard) {\n    options.push(new CometChatActionsIcon({ id: CometChatUIKitConstants.MessageOption.markAsUnread, title: CometChatLocalize.getLocalizedString('message_list_option_mark_as_unread'), iconURL: 'assets/mark_as_unread.svg', onClick: () => {} }));\n  }\n  if (ctx.additionalOptions.length > 0) { options.push(...ctx.additionalOptions); }\n  if (ctx.optionsOverride) { return ctx.optionsOverride(message, options); }\n  return options;\n}\n","/**\n * Scroll handler functions for CometChatMessageList.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { highlightAndScrollToElement as highlightAndScrollToElementUtil } from './cometchat-message-list.scroll-utils';\n\nexport interface ScrollHandlerContext {\n  listContainer: any;\n  scrollTopAnchor: any;\n  scrollBottomAnchor: any;\n  isFetchingPrevious: any;\n  isFetchingNext: any;\n  hasMorePrevious: any;\n  hasMoreNext: any;\n  isAtBottom: any;\n  showScrollToBottom: any;\n  showNewMessagesBanner: any;\n  newMessagesCount: any;\n  unreadMessages: any;\n  markedAsUnreadCount: any;\n  unreadDividerMessageId: any;\n  stickyDateTimestamp: any;\n  showStickyDateHeader: any;\n  hideStickyDate: boolean;\n  scrollHeightBeforeLoad: number;\n  BOTTOM_THRESHOLD: number;\n  user?: CometChat.User;\n  group?: CometChat.Group;\n  loggedInUser: CometChat.User | null;\n  messageListService: any;\n  conversationsService: any;\n  cdr: any;\n  messagesWithSeparators: () => any[];\n  messages: () => CometChat.BaseMessage[];\n  isReceiverMessage: (msg: CometChat.BaseMessage) => boolean;\n  getConversationId: () => string | null;\n  markMessagesReadOnScrollToBottom: () => Promise<void>;\n  scrollToBottomAfterLoad: () => void;\n  publishActiveChatChanged: () => void;\n  announceLoadingMore: () => void;\n}\n\nexport async function handleScrollToTopImpl(ctx: ScrollHandlerContext): Promise<void> {\n  if (ctx.isFetchingPrevious()) { return; }\n  ctx.isFetchingPrevious.set(true);\n  const container = ctx.listContainer?.nativeElement;\n  const scrollHeightBefore = container?.scrollHeight || 0;\n  const scrollTopBefore = container?.scrollTop || 0;\n  try {\n    const hasMore = await ctx.messageListService.fetchPreviousMessages();\n    ctx.hasMorePrevious.set(hasMore);\n    if (container) {\n      requestAnimationFrame(() => {\n        const scrollHeightAfter = container.scrollHeight;\n        const scrollHeightDiff = scrollHeightAfter - scrollHeightBefore;\n        container.scrollTop = scrollTopBefore + scrollHeightDiff;\n      });\n    }\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error fetching previous messages:', error);\n  } finally {\n    ctx.isFetchingPrevious.set(false);\n  }\n}\n\nexport function handleScrollToBottomImpl(ctx: ScrollHandlerContext): void {\n  if (ctx.isFetchingNext() || !ctx.hasMoreNext()) { return; }\n  const container = ctx.listContainer?.nativeElement;\n  const scrollTopBefore = container?.scrollTop || 0;\n  ctx.isFetchingNext.set(true);\n  ctx.messageListService.fetchNextMessages()\n    .then((hasMore: boolean) => {\n      ctx.hasMoreNext.set(hasMore);\n      ctx.isFetchingNext.set(false);\n      if (container) { requestAnimationFrame(() => { container.scrollTop = scrollTopBefore; }); }\n    })\n    .catch((error: unknown) => {\n      CometChatLogger.error('CometChatMessageList', 'Error fetching next messages:', error);\n      ctx.isFetchingNext.set(false);\n    });\n}\n\nexport function saveScrollPositionImpl(ctx: ScrollHandlerContext): void {\n  if (ctx.listContainer?.nativeElement) { (ctx as any).scrollHeightBeforeLoad = ctx.listContainer.nativeElement.scrollHeight; }\n}\n\nexport function restoreScrollPositionImpl(ctx: ScrollHandlerContext): void {\n  if (ctx.listContainer?.nativeElement) {\n    const newScrollHeight = ctx.listContainer.nativeElement.scrollHeight;\n    const scrollDiff = newScrollHeight - ctx.scrollHeightBeforeLoad;\n    ctx.listContainer.nativeElement.scrollTop += scrollDiff;\n  }\n}\n\nexport function saveScrollPositionForReactionImpl(ctx: ScrollHandlerContext): void {\n  if (!ctx.listContainer?.nativeElement) return;\n  const container = ctx.listContainer.nativeElement;\n  const scrollTopBefore = container.scrollTop;\n  const scrollHeightBefore = container.scrollHeight;\n  requestAnimationFrame(() => {\n    if (!ctx.listContainer?.nativeElement) return;\n    const scrollHeightAfter = container.scrollHeight;\n    const heightDiff = scrollHeightAfter - scrollHeightBefore;\n    if (heightDiff !== 0) { container.scrollTop = scrollTopBefore + heightDiff; }\n  });\n}\n\nexport function updateStickyDateImpl(ctx: ScrollHandlerContext): void {\n  if (ctx.hideStickyDate || !ctx.listContainer?.nativeElement) { ctx.showStickyDateHeader.set(false); return; }\n  const container = ctx.listContainer.nativeElement;\n  const items = ctx.messagesWithSeparators();\n  if (items.length === 0) { ctx.showStickyDateHeader.set(false); return; }\n  const messageElements = container.querySelectorAll('.cometchat-message-list__message');\n  for (let i = 0; i < messageElements.length; i++) {\n    const element = messageElements[i] as HTMLElement;\n    const rect = element.getBoundingClientRect();\n    const containerRect = container.getBoundingClientRect();\n    if (rect.top >= containerRect.top) {\n      const itemIndex = parseInt(element.dataset['index'] || '0', 10);\n      const item = items[itemIndex];\n      if (item?.type === 'message' && item.message) {\n        ctx.stickyDateTimestamp.set(item.message.getSentAt());\n        ctx.showStickyDateHeader.set(container.scrollTop > 50);\n      }\n      break;\n    }\n  }\n}\n\nexport function updateIsAtBottomImpl(ctx: ScrollHandlerContext): void {\n  if (!ctx.listContainer?.nativeElement) { return; }\n  const container = ctx.listContainer.nativeElement;\n  const wasAtBottom = ctx.isAtBottom();\n  const isAtBottom = container.scrollHeight - container.scrollTop - container.clientHeight < ctx.BOTTOM_THRESHOLD;\n  ctx.isAtBottom.set(isAtBottom);\n  ctx.showScrollToBottom.set(!isAtBottom);\n  if (isAtBottom) {\n    ctx.showNewMessagesBanner.set(false);\n    ctx.newMessagesCount.set(0);\n    if (ctx.markedAsUnreadCount() > 0) {\n      ctx.markedAsUnreadCount.set(0);\n      // Clear the unread divider when user reaches the bottom\n      ctx.unreadDividerMessageId.set(null);\n      const messages = ctx.messages();\n      if (messages.length > 0 && ctx.loggedInUser) {\n        let latestReceiverMsg: CometChat.BaseMessage | null = null;\n        for (let i = messages.length - 1; i >= 0; i--) {\n          if (ctx.isReceiverMessage(messages[i])) { latestReceiverMsg = messages[i]; break; }\n        }\n        if (latestReceiverMsg) {\n          const msgToRead = latestReceiverMsg;\n          ctx.messageListService.markAsRead(msgToRead).then(() => {\n            const conversationId = ctx.getConversationId();\n            if (conversationId) { ctx.conversationsService.updateConversationUnreadCount(conversationId, 0); }\n          }).catch((err: unknown) => {\n            CometChatLogger.error('CometChatMessageList', 'markAsRead after markAsUnread failed', err);\n          });\n        }\n      }\n    }\n    if (!wasAtBottom && ctx.unreadMessages().length > 0) { ctx.markMessagesReadOnScrollToBottom(); }\n  }\n}\n\nexport function scrollToBottomImpl(ctx: ScrollHandlerContext, smooth = false): void {\n  if (!ctx.listContainer?.nativeElement) { return; }\n  if (ctx.hasMoreNext()) {\n    const user = ctx.user;\n    const group = ctx.group;\n    ctx.showScrollToBottom.set(false);\n    ctx.showNewMessagesBanner.set(false);\n    ctx.newMessagesCount.set(0);\n    ctx.hasMorePrevious.set(true);\n    ctx.hasMoreNext.set(false);\n    if (user) {\n      ctx.messageListService.setUser(user);\n      ctx.messageListService.fetchPreviousMessages().then(() => { ctx.scrollToBottomAfterLoad(); });\n    } else if (group) {\n      ctx.messageListService.setGroup(group);\n      ctx.messageListService.fetchPreviousMessages().then(() => { ctx.scrollToBottomAfterLoad(); });\n    }\n    return;\n  }\n  ctx.showNewMessagesBanner.set(false);\n  ctx.newMessagesCount.set(0);\n  if (ctx.unreadMessages().length > 0) { ctx.markMessagesReadOnScrollToBottom(); }\n  ctx.listContainer.nativeElement.scrollTo({\n    top: ctx.listContainer.nativeElement.scrollHeight,\n    behavior: smooth ? 'smooth' : 'auto',\n  });\n}\n\nexport function scrollToBottomAfterLoadImpl(ctx: ScrollHandlerContext): void {\n  requestAnimationFrame(() => {\n    setTimeout(() => { scrollToBottomWithRetryImpl(ctx, 3); }, 0);\n  });\n}\n\nexport function scrollToBottomWithRetryImpl(ctx: ScrollHandlerContext, retries: number): void {\n  if (!ctx.listContainer?.nativeElement) return;\n  const container = ctx.listContainer.nativeElement;\n  container.scrollTop = container.scrollHeight;\n  if (retries > 0) setTimeout(() => scrollToBottomWithRetryImpl(ctx, retries - 1), 100);\n}\n\nexport function scrollToMessageImpl(ctx: ScrollHandlerContext, messageId: string | number): void {\n  if (!ctx.listContainer?.nativeElement) { return; }\n  const messageElement = ctx.listContainer.nativeElement.querySelector(`[data-message-id=\"${messageId}\"]`);\n  if (messageElement) {\n    highlightAndScrollToElementUtil(messageElement);\n  } else {\n    const numericId = typeof messageId === 'string' ? parseInt(messageId, 10) : messageId;\n    if (isNaN(numericId)) return;\n    ctx.hasMorePrevious.set(false);\n    ctx.hasMoreNext.set(false);\n    ctx.messageListService.fetchMessagesAroundId(numericId)\n      .then(() => {\n        ctx.cdr.markForCheck();\n        scrollToMessageWithRetryImpl(ctx, messageId, 10);\n      })\n      .catch((error: unknown) => {\n        CometChatLogger.error('CometChatMessageList', 'Error fetching messages around ID for scroll:', error);\n      });\n  }\n}\n\nexport function scrollToMessageWithRetryImpl(ctx: ScrollHandlerContext, messageId: string | number, retries: number): void {\n  if (retries <= 0 || !ctx.listContainer?.nativeElement) return;\n  requestAnimationFrame(() => {\n    setTimeout(() => {\n      const messageElement = ctx.listContainer?.nativeElement?.querySelector(`[data-message-id=\"${messageId}\"]`);\n      if (messageElement) {\n        highlightAndScrollToElementUtil(messageElement);\n        setTimeout(() => { ctx.hasMorePrevious.set(true); ctx.hasMoreNext.set(true); }, 300);\n      } else if (retries > 1) {\n        scrollToMessageWithRetryImpl(ctx, messageId, retries - 1);\n      }\n    }, 50);\n  });\n}\n\nexport function disconnectObserversImpl(ctx: ScrollHandlerContext): void {\n  (ctx as any).scrollTopObserver?.disconnect();\n  (ctx as any).scrollBottomObserver?.disconnect();\n}\n","/**\n * Reaction/emoji handler functions for CometChatMessageList.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { MessageBubbleAlignment } from '../../Enums/Enums';\n\nexport interface ReactionHandlerContext {\n  listContainer: any;\n  emojiKeyboardMessage: any;\n  emojiKeyboardPosition: any;\n  messageListService: any;\n  cdr: any;\n  reactionClick: any;\n  reactionListItemClick: any;\n  getMessageAlignment: (msg: CometChat.BaseMessage) => MessageBubbleAlignment;\n  saveScrollPositionForReaction: () => void;\n}\n\nexport function showEmojiKeyboardForMessageImpl(ctx: ReactionHandlerContext, message: CometChat.BaseMessage): void {\n  ctx.emojiKeyboardMessage.set(message);\n  requestAnimationFrame(() => { calculateEmojiKeyboardPositionImpl(ctx, message); });\n}\n\nexport function calculateEmojiKeyboardPositionImpl(ctx: ReactionHandlerContext, message: CometChat.BaseMessage): void {\n  const messageId = message.getId() || message.getMuid();\n  const container = ctx.listContainer?.nativeElement;\n  if (!container || !messageId) return;\n  const rootEl = container.closest('.cometchat-message-list') as HTMLElement;\n  if (!rootEl) return;\n  const msgWrapper = container.querySelector(`[data-message-id=\"${messageId}\"]`) as HTMLElement;\n  if (!msgWrapper) return;\n  const bubbleEl = msgWrapper.querySelector('.cometchat-message-bubble') as HTMLElement;\n  const msgRect = bubbleEl ? bubbleEl.getBoundingClientRect() : msgWrapper.getBoundingClientRect();\n  const rootRect = rootEl.getBoundingClientRect();\n  const alignment = ctx.getMessageAlignment(message);\n  const isOutgoing = alignment === MessageBubbleAlignment.right;\n  const kbWidth = 340;\n  const kbHeight = 350;\n  const gap = 8;\n  const availableWidth = rootRect.width;\n  const effectiveKbWidth = Math.min(kbWidth, availableWidth - 16);\n  let left: number;\n  if (isOutgoing) {\n    left = msgRect.left - rootRect.left - effectiveKbWidth - gap;\n    if (left < 0) { left = gap; }\n  } else {\n    left = msgRect.right - rootRect.left + gap;\n    if (left + effectiveKbWidth > availableWidth) { left = availableWidth - effectiveKbWidth - gap; }\n  }\n  left = Math.max(0, Math.min(left, availableWidth - effectiveKbWidth));\n  const msgCenterY = msgRect.top - rootRect.top + msgRect.height / 2;\n  let top = msgCenterY - kbHeight / 2;\n  top = Math.max(0, Math.min(top, rootRect.height - kbHeight));\n  ctx.emojiKeyboardPosition.set({ top, left, side: isOutgoing ? 'left' : 'right' });\n}\n\nexport async function onEmojiSelectedImpl(ctx: ReactionHandlerContext, emoji: string): Promise<void> {\n  const message = ctx.emojiKeyboardMessage();\n  ctx.emojiKeyboardMessage.set(null);\n  ctx.emojiKeyboardPosition.set(null);\n  if (!message) { CometChatLogger.warn('CometChatMessageList', 'onEmojiSelected: No message reference available'); return; }\n  const messageId = message.getId();\n  if (!messageId || messageId <= 0) { CometChatLogger.warn('CometChatMessageList', 'onEmojiSelected: Invalid messageId', messageId); return; }\n  try {\n    ctx.saveScrollPositionForReaction();\n    await ctx.messageListService.addReaction(messageId, emoji);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'onEmojiSelected: Failed to add reaction', error);\n  }\n}\n\nexport function onEmojiKeyboardCloseImpl(ctx: ReactionHandlerContext): void {\n  ctx.emojiKeyboardMessage.set(null);\n  ctx.emojiKeyboardPosition.set(null);\n}\n\nexport async function onBubbleReactionClickImpl(ctx: ReactionHandlerContext, event: { reaction: CometChat.ReactionCount; message: CometChat.BaseMessage }): Promise<void> {\n  const { reaction, message } = event;\n  ctx.saveScrollPositionForReaction();\n  try {\n    if (reaction.getReactedByMe()) {\n      await ctx.messageListService.removeReaction(message.getId(), reaction.getReaction());\n    } else {\n      await ctx.messageListService.addReaction(message.getId(), reaction.getReaction());\n    }\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'onBubbleReactionClick: Reaction operation failed', error);\n  }\n  ctx.reactionClick.emit(event);\n}\n\nexport async function onBubbleReactionListItemClickImpl(ctx: ReactionHandlerContext, event: { reaction: CometChat.Reaction; message: CometChat.BaseMessage }): Promise<void> {\n  const { reaction, message } = event;\n  ctx.saveScrollPositionForReaction();\n  try {\n    await ctx.messageListService.removeReaction(message.getId(), reaction.getReaction());\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'onBubbleReactionListItemClick: Reaction removal failed', error);\n  }\n  ctx.reactionListItemClick.emit(event);\n}\n","/**\n * Delete/flag handler functions for CometChatMessageList.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { ToastType } from '../base-elements/cometchat-toast/cometchat-toast.component';\n\nexport interface DeleteHandlerContext {\n  messageToDelete: any;\n  showDeleteConfirmDialog: any;\n  isDeleting: any;\n  messageToFlag: any;\n  showFlagMessageDialog: any;\n  isFlagging: any;\n  messageListService: any;\n  error: any;\n  showInlineToast: (text: string, type?: ToastType, duration?: number) => void;\n  announceMessageDeleted: () => void;\n}\n\nexport function showDeleteConfirmationImpl(ctx: DeleteHandlerContext, message: CometChat.BaseMessage): void {\n  ctx.messageToDelete.set(message);\n  ctx.showDeleteConfirmDialog.set(true);\n}\n\nexport async function handleDeleteConfirmImpl(ctx: DeleteHandlerContext): Promise<void> {\n  const message = ctx.messageToDelete();\n  if (!message) { return; }\n  ctx.isDeleting.set(true);\n  const messageId = message.getId();\n  try {\n    await CometChat.deleteMessage(String(messageId));\n    ctx.messageListService.deleteMessage(messageId);\n    const deletedMessage = Object.create(\n      Object.getPrototypeOf(message),\n      Object.getOwnPropertyDescriptors(message)\n    ) as CometChat.BaseMessage;\n    deletedMessage.setDeletedAt(Math.floor(Date.now() / 1000));\n    CometChatMessageEvents.ccMessageDeleted.next(deletedMessage);\n    ctx.announceMessageDeleted();\n    ctx.showInlineToast(CometChatLocalize.getLocalizedString('message_list_message_deleted'));\n    ctx.showDeleteConfirmDialog.set(false);\n    ctx.messageToDelete.set(null);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error deleting message:', error);\n    ctx.error.emit(error as CometChat.CometChatException);\n  } finally {\n    ctx.isDeleting.set(false);\n  }\n}\n\nexport function handleDeleteCancelImpl(ctx: DeleteHandlerContext): void {\n  ctx.showDeleteConfirmDialog.set(false);\n  ctx.messageToDelete.set(null);\n}\n\nexport function getDeleteDialogTitleImpl(): string { return CometChatLocalize.getLocalizedString('message_delete_title'); }\nexport function getDeleteDialogSubtitleImpl(): string { return CometChatLocalize.getLocalizedString('message_delete_subtitle'); }\nexport function getDeleteDialogConfirmTextImpl(): string { return CometChatLocalize.getLocalizedString('message_delete_confirm_yes'); }\nexport function getDeleteDialogCancelTextImpl(): string { return CometChatLocalize.getLocalizedString('message_delete_confirm_no'); }\n\nexport function showFlagConfirmationImpl(ctx: DeleteHandlerContext, message: CometChat.BaseMessage): void {\n  ctx.messageToFlag.set(message);\n  ctx.showFlagMessageDialog.set(true);\n}\n\nexport async function handleFlagConfirmImpl(ctx: DeleteHandlerContext, event: { message: CometChat.BaseMessage; reasonId: string; remark: string }): Promise<void> {\n  const { message, reasonId, remark } = event;\n  ctx.isFlagging.set(true);\n  try {\n    await ctx.messageListService.flagMessage(message, reasonId, remark);\n    ctx.showInlineToast(CometChatLocalize.getLocalizedString('flag_message_reported'));\n    ctx.showFlagMessageDialog.set(false);\n    ctx.messageToFlag.set(null);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error flagging message:', error);\n    ctx.error.emit(error as CometChat.CometChatException);\n    ctx.showInlineToast(CometChatLocalize.getLocalizedString('flag_message_error'), ToastType.error, 3000);\n  } finally {\n    ctx.isFlagging.set(false);\n  }\n}\n\nexport function handleFlagCancelImpl(ctx: DeleteHandlerContext): void {\n  ctx.showFlagMessageDialog.set(false);\n  ctx.messageToFlag.set(null);\n}\n","/**\n * Translation handler functions for CometChatMessageList.\n * Extracted to reduce component file size.\n */\n\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { ToastType } from '../base-elements/cometchat-toast/cometchat-toast.component';\n\nexport interface TranslateHandlerContext {\n  translatedMessages: any;\n  translatingMessages: any;\n  preferredTranslationLanguage: () => string;\n  messageListService: any;\n  showInlineToast: (text: string, type?: ToastType, duration?: number) => void;\n}\n\nexport async function translateMessageImpl(ctx: TranslateHandlerContext, message: CometChat.BaseMessage): Promise<void> {\n  if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) { return; }\n  const messageId = message.getId();\n  const language = ctx.preferredTranslationLanguage();\n  if (ctx.translatedMessages().has(messageId)) {\n    ctx.translatedMessages.update((map: Map<number, string>) => {\n      const newMap = new Map(map);\n      newMap.delete(messageId);\n      return newMap;\n    });\n    return;\n  }\n  if (ctx.translatingMessages().has(messageId)) { return; }\n  ctx.translatingMessages.update((set: Set<number>) => {\n    const newSet = new Set(set);\n    newSet.add(messageId);\n    return newSet;\n  });\n  try {\n    const translatedText = await ctx.messageListService.translateMessage(message, language);\n    ctx.translatedMessages.update((map: Map<number, string>) => {\n      const newMap = new Map(map);\n      newMap.set(messageId, translatedText);\n      return newMap;\n    });\n    ctx.showInlineToast(CometChatLocalize.getLocalizedString('message_list_message_translated'));\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error translating message:', error);\n    ctx.showInlineToast(CometChatLocalize.getLocalizedString('message_translate_error'), ToastType.error, 3000);\n  } finally {\n    ctx.translatingMessages.update((set: Set<number>) => {\n      const newSet = new Set(set);\n      newSet.delete(messageId);\n      return newSet;\n    });\n  }\n}\n\nexport function getTranslatedTextImpl(ctx: TranslateHandlerContext, messageId: number): string | undefined {\n  return ctx.translatedMessages().get(messageId);\n}\n\nexport function isMessageTranslatingImpl(ctx: TranslateHandlerContext, messageId: number): boolean {\n  return ctx.translatingMessages().has(messageId);\n}\n\nexport function isMessageTranslatedImpl(ctx: TranslateHandlerContext, messageId: number): boolean {\n  return ctx.translatedMessages().has(messageId);\n}\n\nexport function getDefaultTranslationLanguageImpl(): string {\n  const browserLang = navigator.language?.split('-')[0] || 'en';\n  return browserLang;\n}\n\nexport function setPreferredTranslationLanguageImpl(ctx: TranslateHandlerContext, language: string): void {\n  (ctx as any).preferredTranslationLanguage.set(language);\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {States} from '../../Enums/Enums';\n\nexport function handleConversationChangeImpl(ctx: any): void {\n  ctx.footerPanelConfig.set(null);\n  ctx.showFooterPanel.set(false);\n  ctx.pendingReadReceipts.clear();\n  ctx.showScrollToBottom.set(false);\n  ctx.showNewMessagesBanner.set(false);\n  ctx.newMessagesCount.set(0);\n  ctx.hasMorePrevious.set(true);\n  ctx.hasMoreNext.set(false);\n  ctx.isFirstLoad = true;\n  // ENG-35029: Clear stale error state before switching conversations.\n  ctx.messageListService.clearError();\n  if (ctx.user) {\n    ctx.messageListService.setUser(ctx.user);\n    if (ctx.isAgentChat && !ctx.parentMessageId) {\n      ctx.messageListService.setLoadingState(false);\n      // When loadLastAgentConversation is true, keep shimmer visible while\n      // the parent fetches history in the background. The parent will set\n      // parentMessageId once resolved, triggering a re-fetch.\n      ctx.listState.set(ctx.loadLastAgentConversation ? States.loading : States.empty);\n      return;\n    }\n    if (ctx.goToMessageId) {\n      const numericId = typeof ctx.goToMessageId === 'string'\n        ? parseInt(ctx.goToMessageId, 10)\n        : Number(ctx.goToMessageId);\n      if (!isNaN(numericId)) {\n        ctx.hasMorePrevious.set(false);\n        ctx.hasMoreNext.set(false);\n        ctx.messageListService.fetchMessagesAroundId(numericId).then(() => {\n          ctx.cdr.markForCheck();\n          ctx.scrollToMessageWithRetry(ctx.goToMessageId, 10);\n          ctx.publishActiveChatChanged();\n        }).catch((error: unknown) => {\n          CometChatLogger.error('CometChatMessageList', 'Error fetching messages around goToMessageId on conversation change:', error);\n        });\n        return;\n      }\n    }\n    ctx.messageListService.fetchPreviousMessages().then(() => {\n      ctx.scrollToBottomAfterLoad();\n      ctx.publishActiveChatChanged();\n    });\n  } else if (ctx.group) {\n    ctx.messageListService.setGroup(ctx.group);\n    if (ctx.isAgentChat && !ctx.parentMessageId) {\n      ctx.messageListService.setLoadingState(false);\n      ctx.listState.set(ctx.loadLastAgentConversation ? States.loading : States.empty);\n      return;\n    }\n    if (ctx.goToMessageId) {\n      const numericId = typeof ctx.goToMessageId === 'string'\n        ? parseInt(ctx.goToMessageId, 10)\n        : Number(ctx.goToMessageId);\n      if (!isNaN(numericId)) {\n        ctx.hasMorePrevious.set(false);\n        ctx.hasMoreNext.set(false);\n        ctx.messageListService.fetchMessagesAroundId(numericId).then(() => {\n          ctx.cdr.markForCheck();\n          ctx.scrollToMessageWithRetry(ctx.goToMessageId, 10);\n          ctx.publishActiveChatChanged();\n        }).catch((error: unknown) => {\n          CometChatLogger.error('CometChatMessageList', 'Error fetching messages around goToMessageId on conversation change:', error);\n        });\n        return;\n      }\n    }\n    ctx.messageListService.fetchPreviousMessages().then(() => {\n      ctx.scrollToBottomAfterLoad();\n      ctx.publishActiveChatChanged();\n    });\n  } else {\n    ctx.messageListService.clearConversation();\n  }\n}\n\nexport function handleParentMessageIdChangeImpl(ctx: any): void {\n  if (ctx.parentMessageId) {\n    ctx.messageListService.setParentMessageId(ctx.parentMessageId);\n    if (ctx.isAgentChat) {\n      if (ctx.user) {\n        ctx.messageListService.setUser(ctx.user);\n      } else if (ctx.group) {\n        ctx.messageListService.setGroup(ctx.group);\n      }\n    }\n    ctx.messageListService.clearMessages();\n    ctx.messageListService.fetchPreviousMessages().then(() => {\n      ctx.scrollToBottomAfterLoad();\n    });\n  } else if (ctx.isAgentChat) {\n    ctx.messageListService.setParentMessageId(null);\n    ctx.messageListService.clearMessages();\n    ctx.messageListService.setLoadingState(false);\n    ctx.listState.set(States.empty);\n  }\n}\n\nexport function subscribeToChatStateServiceImpl(ctx: any): void {\n  ctx.chatStateService.activeUser$.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((user: CometChat.User | null) => {\n    if (user) {\n      ctx.pendingUser = user;\n      ctx.pendingGroup = null;\n      scheduleDeferredConversationChangeImpl(ctx);\n    }\n  });\n  ctx.chatStateService.activeGroup$.pipe(takeUntilDestroyed(ctx.destroyRef)).subscribe((group: CometChat.Group | null) => {\n    if (group) {\n      ctx.pendingGroup = group;\n      ctx.pendingUser = null;\n      scheduleDeferredConversationChangeImpl(ctx);\n    }\n  });\n}\n\nexport function scheduleDeferredConversationChangeImpl(ctx: any): void {\n  if (ctx.conversationChangeScheduled) { return; }\n  ctx.conversationChangeScheduled = true;\n  queueMicrotask(() => {\n    ctx.conversationChangeScheduled = false;\n    if (ctx.pendingUser) {\n      const user = ctx.pendingUser;\n      ctx.pendingUser = null;\n      handleUserChangeImpl(ctx, user);\n    } else if (ctx.pendingGroup) {\n      const group = ctx.pendingGroup;\n      ctx.pendingGroup = null;\n      handleGroupChangeImpl(ctx, group);\n    }\n  });\n}\n\nexport function handleUserChangeImpl(ctx: any, user: CometChat.User): void {\n  ctx.footerPanelConfig.set(null);\n  ctx.showFooterPanel.set(false);\n  ctx.showScrollToBottom.set(false);\n  ctx.showNewMessagesBanner.set(false);\n  ctx.newMessagesCount.set(0);\n  ctx.hasMorePrevious.set(true);\n  ctx.hasMoreNext.set(false);\n  ctx.unreadDividerMessageId.set(null);\n  ctx.markedAsUnreadCount.set(0);\n  ctx.lastUnreadMarkedMessageId.set(null);\n  // ENG-35029: Explicitly clear any error state from the previous conversation\n  // before starting the new fetch, so the error effect doesn't fire with stale data.\n  ctx.messageListService.clearError();\n  ctx.user = user;\n  ctx.group = undefined;\n  if (ctx.parentMessageId) {\n    ctx.messageListService.setParentMessageId(ctx.parentMessageId);\n  }\n  ctx.messageListService.setUser(user);\n  if (ctx.goToMessageId) {\n    const numericId = typeof ctx.goToMessageId === 'string'\n      ? parseInt(ctx.goToMessageId, 10)\n      : Number(ctx.goToMessageId);\n    if (!isNaN(numericId)) {\n      ctx.hasMorePrevious.set(false);\n      ctx.hasMoreNext.set(false);\n      ctx.messageListService.fetchMessagesAroundId(numericId).then(() => {\n        ctx.cdr.markForCheck();\n        ctx.scrollToMessageWithRetry(ctx.goToMessageId, 10);\n      }).catch((error: unknown) => {\n        CometChatLogger.error('CometChatMessageList', 'Error fetching around goToMessageId in handleUserChange:', error);\n      });\n      return;\n    }\n  }\n  // React UIKit pattern: fetch conversation to get lastReadMessageId and unreadCount\n  if (ctx.startFromUnreadMessages && !ctx.parentMessageId) {\n    fetchWithUnreadPivot(ctx, user.getUid(), CometChatUIKitConstants.MessageReceiverType.user);\n  } else {\n    ctx.messageListService.fetchPreviousMessages().then(() => {\n      ctx.scrollToBottomAfterLoad();\n      ctx.publishActiveChatChanged();\n    });\n  }\n}\n\nexport function handleGroupChangeImpl(ctx: any, group: CometChat.Group): void {\n  ctx.footerPanelConfig.set(null);\n  ctx.showFooterPanel.set(false);\n  ctx.showScrollToBottom.set(false);\n  ctx.showNewMessagesBanner.set(false);\n  ctx.newMessagesCount.set(0);\n  ctx.hasMorePrevious.set(true);\n  ctx.hasMoreNext.set(false);\n  ctx.unreadDividerMessageId.set(null);\n  ctx.markedAsUnreadCount.set(0);\n  ctx.lastUnreadMarkedMessageId.set(null);\n  // ENG-35029: Explicitly clear any error state from the previous conversation.\n  ctx.messageListService.clearError();\n  ctx.group = group;\n  ctx.user = undefined;\n  if (ctx.parentMessageId) {\n    ctx.messageListService.setParentMessageId(ctx.parentMessageId);\n  }\n  ctx.messageListService.setGroup(group);\n  if (ctx.goToMessageId) {\n    const numericId = typeof ctx.goToMessageId === 'string'\n      ? parseInt(ctx.goToMessageId, 10)\n      : Number(ctx.goToMessageId);\n    if (!isNaN(numericId)) {\n      ctx.hasMorePrevious.set(false);\n      ctx.hasMoreNext.set(false);\n      ctx.messageListService.fetchMessagesAroundId(numericId).then(() => {\n        ctx.cdr.markForCheck();\n        ctx.scrollToMessageWithRetry(ctx.goToMessageId, 10);\n      }).catch((error: unknown) => {\n        CometChatLogger.error('CometChatMessageList', 'Error fetching around goToMessageId in handleGroupChange:', error);\n      });\n      return;\n    }\n  }\n  // React UIKit pattern: fetch conversation to get lastReadMessageId and unreadCount\n  if (ctx.startFromUnreadMessages && !ctx.parentMessageId) {\n    fetchWithUnreadPivot(ctx, group.getGuid(), CometChatUIKitConstants.MessageReceiverType.group);\n  } else {\n    ctx.messageListService.fetchPreviousMessages().then(() => {\n      ctx.scrollToBottomAfterLoad();\n      ctx.publishActiveChatChanged();\n    });\n  }\n}\n\n/**\n * Fetches the conversation object, checks lastReadMessageId and unreadMessageCount,\n * and either loads messages around the unread pivot or loads latest messages.\n *\n * Follows the React UIKit pattern:\n * 1. CometChat.getConversation() → get lastReadMessageId + unreadMessageCount\n * 2. If unread > 0 and lastReadMessageId exists → fetchMessagesAroundId(lastReadMessageId)\n * 3. Else → fetchPreviousMessages() and scroll to bottom\n */\nasync function fetchWithUnreadPivot(\n  ctx: any,\n  id: string,\n  receiverType: string\n): Promise<void> {\n  // Capture generation at the start so we can abort if the conversation changes\n  // while the async getConversation() call is in-flight (group-specific race condition).\n  const generation = ctx.messageListService.getFetchGeneration?.() ?? 0;\n  try {\n    const conversation: CometChat.Conversation = await CometChat.getConversation(id, receiverType);\n    // ENG-35029: Abort if the conversation changed while we were waiting for getConversation().\n    // This is the group-specific race: switching groups quickly causes stale pivot data\n    // to be applied to the new group's message list.\n    if (ctx.messageListService.getFetchGeneration?.() !== generation) {\n      return;\n    }\n    const lastReadMessageId = conversation.getLastReadMessageId?.();\n    const unreadCount = conversation.getUnreadMessageCount?.() || 0;\n\n    if (unreadCount > 0 && lastReadMessageId && String(lastReadMessageId) !== '0') {\n      const numericLastReadId = typeof lastReadMessageId === 'string'\n        ? parseInt(lastReadMessageId, 10)\n        : Number(lastReadMessageId);\n\n      if (!isNaN(numericLastReadId) && numericLastReadId > 0) {\n        // Fetch messages around the last read message (bidirectional)\n        ctx.hasMorePrevious.set(false);\n        ctx.hasMoreNext.set(false);\n        ctx.messageListService.fetchMessagesAroundId(numericLastReadId).then(() => {\n          // Find the first unread message in the fetched results.\n          // Strategy: find the message right after lastReadMessageId, OR\n          // find the first message from another user that hasn't been read.\n          const allMessages = ctx.messages();\n          let dividerId: number | null = null;\n\n          // Approach 1: Find message right after lastReadMessageId\n          const lastReadIndex = allMessages.findIndex(\n            (msg: CometChat.BaseMessage) => msg.getId() === numericLastReadId\n          );\n          if (lastReadIndex >= 0 && lastReadIndex < allMessages.length - 1) {\n            dividerId = allMessages[lastReadIndex + 1].getId();\n          }\n\n          // Approach 2: If lastRead not found in array, find first unread receiver message\n          if (!dividerId) {\n            const loggedInUid = ctx.loggedInUser?.getUid();\n            const firstUnread = allMessages.find((msg: CometChat.BaseMessage) => {\n              const senderId = msg.getSender()?.getUid();\n              return senderId && senderId !== loggedInUid && !msg.getReadAt();\n            });\n            if (firstUnread) {\n              dividerId = firstUnread.getId();\n            }\n          }\n\n          // Approach 3: If still nothing, use the first message with ID > lastReadId\n          if (!dividerId) {\n            const firstAfterRead = allMessages.find(\n              (msg: CometChat.BaseMessage) => msg.getId() > numericLastReadId\n            );\n            if (firstAfterRead) {\n              dividerId = firstAfterRead.getId();\n            }\n          }\n\n          if (dividerId) {\n            ctx.unreadDividerMessageId.set(dividerId);\n            ctx.markedAsUnreadCount.set(unreadCount);\n            ctx.showScrollToBottom.set(true);\n            ctx.hasMoreNext.set(true);\n            ctx.cdr.markForCheck();\n            // Scroll to the first unread message\n            ctx.scrollToMessageWithRetry(dividerId, 10);\n            // Mark the conversation as read on the server (matches React UIKit's markConversationAsRead).\n            // We do NOT call notifyUnreadCountChange(0) here — the unread divider stays visible\n            // until the user scrolls to the bottom, at which point markMessagesReadOnScrollToBottom\n            // clears it. We only update the server + conversation list badge.\n            const allMessages = ctx.messages();\n            if (allMessages.length > 0 && ctx.loggedInUser) {\n              // Find the latest receiver message to mark as read\n              let latestReceiverMsg: CometChat.BaseMessage | null = null;\n              for (let i = allMessages.length - 1; i >= 0; i--) {\n                const msg = allMessages[i];\n                if (msg.getSender()?.getUid() !== ctx.loggedInUser.getUid() && !msg.getReadAt()) {\n                  latestReceiverMsg = msg;\n                  break;\n                }\n              }\n              if (latestReceiverMsg) {\n                // Reset the scroll-to-bottom badge immediately — the unread divider stays\n                // visible but the count badge should be 0 since we've opened the chat.\n                ctx.markedAsUnreadCount.set(0);\n                ctx.newMessagesCount.set(0);\n                ctx.messageListService.markAsRead(latestReceiverMsg).then(() => {\n                  // Update conversation list badge to 0 immediately\n                  const conversationId = ctx.getConversationId?.();\n                  if (conversationId) {\n                    ctx.conversationsService?.updateConversationUnreadCount?.(conversationId, 0);\n                  }\n                  ctx.notifyMessagesRead?.(latestReceiverMsg);\n                }).catch((err: unknown) => {\n                  CometChatLogger.error('CometChatMessageList', 'markAsRead on chat open failed:', err);\n                });\n              }\n            }\n          } else {\n            // Couldn't determine first unread — just scroll to bottom\n            ctx.hasMoreNext.set(true);\n            ctx.scrollToBottomAfterLoad();\n          }\n          ctx.publishActiveChatChanged();\n        }).catch((error: unknown) => {\n          CometChatLogger.error('CometChatMessageList', 'Error fetching around lastReadMessageId:', error);\n          // Fallback: load latest messages\n          ctx.hasMorePrevious.set(true);\n          ctx.messageListService.fetchPreviousMessages().then(() => {\n            ctx.scrollToBottomAfterLoad();\n            ctx.publishActiveChatChanged();\n          });\n        });\n        return;\n      }\n    }\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error fetching conversation for unread pivot:', error);\n  }\n\n  // No unread messages or couldn't determine pivot → load latest and scroll to bottom\n  ctx.messageListService.fetchPreviousMessages().then(() => {\n    ctx.scrollToBottomAfterLoad();\n    ctx.publishActiveChatChanged();\n  });\n}\n\nexport function scrollToFirstUnreadOrBottomImpl(ctx: any): void {\n  if (ctx.startFromUnreadMessages) {\n    const messages = ctx.messages();\n    const firstUnread = messages.find(\n      (msg: CometChat.BaseMessage) => !msg.getReadAt() && ctx.isReceiverMessage(msg)\n    );\n    if (firstUnread) {\n      const firstUnreadId = firstUnread.getId();\n      const unreadCount = messages.filter(\n        (msg: CometChat.BaseMessage) => !msg.getReadAt() && ctx.isReceiverMessage(msg)\n      ).length;\n      ctx.unreadDividerMessageId.set(firstUnreadId);\n      ctx.markedAsUnreadCount.set(unreadCount);\n      ctx.showScrollToBottom.set(true);\n      // Temporarily disable pagination observers while scrolling to the unread message.\n      // scrollToMessageWithRetryImpl re-enables them after 300ms once the scroll settles.\n      ctx.hasMorePrevious.set(false);\n      ctx.hasMoreNext.set(false);\n      requestAnimationFrame(() => {\n        setTimeout(() => {\n          ctx.scrollToMessageWithRetry(firstUnreadId, 10);\n        }, 0);\n      });\n      ctx.cdr.markForCheck();\n      return;\n    }\n  }\n  ctx.scrollToBottomAfterLoad();\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatSoundManager} from '../../resources/CometChatSoundManager/CometChatSoundManager';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {getBatchId} from '../../utils/message-metadata-utils';\n\nexport function handleNewMessagesImpl(ctx: any, currentMessages: CometChat.BaseMessage[]): void {\n  if (currentMessages.length === 0 || ctx.previousMessages.length === 0) {\n    if (currentMessages.length > 0 && ctx.previousMessages.length === 0) {\n      ctx.hideConversationStarters.set(true);\n      const lastMessage = currentMessages[currentMessages.length - 1];\n      if (\n        lastMessage &&\n        ctx.isReceiverMessage(lastMessage) &&\n        ctx.shouldShowSmartRepliesForMessage(lastMessage)\n      ) {\n        ctx.lastReceivedMessage.set(lastMessage);\n        ctx.hideSmartReplies.set(false);\n      }\n    }\n    return;\n  }\n  const latestMessage = currentMessages[currentMessages.length - 1];\n  const previousLatest = ctx.previousMessages[ctx.previousMessages.length - 1];\n  if (latestMessage.getId() !== previousLatest?.getId()) {\n    ctx.hideConversationStarters.set(true);\n    const sender = latestMessage.getSender();\n    const isOwnMessage = ctx.loggedInUser && sender?.getUid() === ctx.loggedInUser.getUid();\n    if (!isOwnMessage) {\n      ctx.lastReceivedMessage.set(latestMessage);\n      if (ctx.shouldShowSmartRepliesForMessage(latestMessage)) {\n        ctx.hideSmartReplies.set(false);\n      } else {\n        ctx.hideSmartReplies.set(true);\n      }\n      ctx.handleRealtimeMessageReceipt(latestMessage);\n      const senderName = sender?.getName() || CometChatLocalize.getLocalizedString('unknown');\n      const preview = ctx.getMessagePreview(latestMessage);\n      ctx.announceNewMessage(senderName, preview);\n      if (!ctx.isAtBottom()) {\n        ctx.newMessagesCount.update((count: number) => count + 1);\n        ctx.showNewMessagesBanner.set(true);\n        // Update the conversation list unread count when the user is scrolled up\n        // and not reading the latest messages.\n        const conversationId = ctx.getConversationId?.();\n        if (conversationId) {\n          const currentCount = ctx.conversationsService?.findConversation?.(\n            ctx.user?.getUid?.() || ctx.group?.getGuid?.()\n          )?.getUnreadMessageCount?.() ?? 0;\n          ctx.conversationsService?.updateConversationUnreadCount?.(\n            ctx.user?.getUid?.() || ctx.group?.getGuid?.(),\n            currentCount + 1\n          );\n        }\n      }\n    }\n    if (ctx.shouldPlaySound(latestMessage)) { ctx.playMessageSound(); }\n    if (isOwnMessage) {\n      setTimeout(() => ctx.scrollToBottom(), 0);\n    } else if (ctx.scrollToBottomOnNewMessages && ctx.isAtBottom()) {\n      setTimeout(() => ctx.scrollToBottom(), 0);\n    }\n  }\n}\n\nexport function shouldPlaySoundImpl(ctx: any, message: CometChat.BaseMessage): boolean {\n  if (ctx.effectiveDisableSoundForMessages()) { return false; }\n  const sender = message.getSender();\n  if (ctx.loggedInUser && sender?.getUid() === ctx.loggedInUser.getUid()) { return false; }\n  if (Date.now() - ctx.lastSoundPlayedAt < ctx.SOUND_THROTTLE_INTERVAL) { return false; }\n  return true;\n}\n\nexport function playMessageSoundImpl(ctx: any): void {\n  try {\n    ctx.lastSoundPlayedAt = Date.now();\n    CometChatSoundManager.play('incomingMessage', ctx.effectiveCustomSoundForMessages() || null);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error playing sound:', error);\n  }\n}\n\n/**\n * Stable @for track key for a message row. It intentionally keys ONLY on a durable identity —\n * muid first (the client-assigned id that a sent message keeps from its optimistic state through\n * server confirmation), falling back to the server id for messages we never sent optimistically.\n *\n * It must NOT embed volatile fields (readAt/deliveredAt/editedAt/batch position). Every receipt,\n * confirmation, and edit already replaces the message with a fresh object reference and re-renders\n * the bubble through its OnPush @Input bindings — so baking those into the key adds nothing except a\n * changed key, which makes Angular destroy and rebuild the whole bubble subtree. That recreation\n * silently discards transient in-bubble UI state (an open fullscreen viewer, an expanded audio/file\n * list, an open options menu) the instant a receipt lands.\n */\nfunction messageTrackKey(message: CometChat.BaseMessage): string {\n  return `msg-${message.getMuid?.() || message.getId()}`;\n}\n\nexport function computeMessagesWithDateSeparatorsImpl(ctx: any): any[] {\n  const messages = ctx.messages();\n  const idCounts = new Map<number, number>();\n  for (const msg of messages) {\n    const id = msg.getId();\n    idCounts.set(id, (idCounts.get(id) || 0) + 1);\n  }\n  const duplicates = Array.from(idCounts.entries()).filter(([, count]) => count > 1);\n  if (duplicates.length > 0) {\n    CometChatLogger.warn('CometChatMessageList', 'DUPLICATE message IDs in messages array:', duplicates, 'total messages:', messages.length);\n  }\n  // Batch grouping (multi-attachment): consecutive messages sharing metadata.batchId.\n  const batchFlags = computeBatchFlagsImpl(messages);\n  if (messages.length === 0 || ctx.hideDateSeparator) {\n    return messages.map((msg: CometChat.BaseMessage) => {\n      const bf = batchFlags.get(msg);\n      const isFirstInBatch = bf?.isFirstInBatch ?? true;\n      const isLastInBatch = bf?.isLastInBatch ?? true;\n      return {\n        type: 'message' as const,\n        message: msg,\n        isFirstInBatch,\n        isLastInBatch,\n        key: messageTrackKey(msg),\n      };\n    });\n  }\n  const result: any[] = [];\n  let lastDate: string | null = null;\n  for (const message of messages) {\n    const messageDate = getDateStringImpl(message.getSentAt());\n    if (message?.getId() && messageDate !== lastDate) {\n      result.push({\n        type: 'date-separator',\n        date: message.getSentAt(),\n        key: `sep-${messageDate}`,\n      });\n      lastDate = messageDate;\n    }\n    const bf = batchFlags.get(message);\n    const isFirstInBatch = bf?.isFirstInBatch ?? true;\n    const isLastInBatch = bf?.isLastInBatch ?? true;\n    result.push({\n      type: 'message',\n      message,\n      isFirstInBatch,\n      isLastInBatch,\n      key: messageTrackKey(message),\n    });\n  }\n  return result;\n}\n\n/** Read the composer-set `metadata.batchId` from a message (or null). */\nexport function getBatchIdImpl(message: CometChat.BaseMessage): string | null {\n  return getBatchId(message);\n}\n\n/**\n * First/last-in-batch flags. A batch is a run of CONSECUTIVE messages sharing the\n * same `metadata.batchId`. Messages without a batchId are their own group\n * (isFirstInBatch = isLastInBatch = true). Exported for tests.\n */\nexport function computeBatchFlagsImpl(\n  messages: CometChat.BaseMessage[],\n): Map<CometChat.BaseMessage, { isFirstInBatch: boolean; isLastInBatch: boolean }> {\n  const flags = new Map<CometChat.BaseMessage, { isFirstInBatch: boolean; isLastInBatch: boolean }>();\n  for (let i = 0; i < messages.length; i++) {\n    const batchId = getBatchIdImpl(messages[i]);\n    if (!batchId) {\n      flags.set(messages[i], { isFirstInBatch: true, isLastInBatch: true });\n      continue;\n    }\n    const prev = i > 0 ? getBatchIdImpl(messages[i - 1]) : null;\n    const next = i < messages.length - 1 ? getBatchIdImpl(messages[i + 1]) : null;\n    flags.set(messages[i], {\n      isFirstInBatch: batchId !== prev,\n      isLastInBatch: batchId !== next,\n    });\n  }\n  return flags;\n}\n\nexport function getReactionFingerprintImpl(message: CometChat.BaseMessage): string {\n  const reactions = message.getReactions?.();\n  if (!reactions || reactions.length === 0) return '0';\n  return reactions\n    .map((r: CometChat.ReactionCount) => `${r.getReaction()}${r.getCount()}${r.getReactedByMe() ? 'm' : ''}`)\n    .join('|');\n}\n\nexport function getDateStringImpl(timestamp: number): string {\n  const date = new Date(timestamp * 1000);\n  return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\n\nexport async function markInitialMessagesAsReadImpl(ctx: any): Promise<void> {\n  const messages = ctx.messages();\n  if (messages.length === 0 || !ctx.loggedInUser) { return; }\n  for (let i = messages.length - 1; i >= 0; i--) {\n    const msg = messages[i];\n    if (!msg.getReadAt() && ctx.isReceiverMessage(msg)) {\n      try {\n        await ctx.messageListService.markAsRead(msg);\n        const messageId = msg.getId();\n        if (messageId) {\n          ctx.messageListService.updateLocalReadStatus([messageId]);\n        }\n        ctx.notifyUnreadCountChange(0);\n        ctx.notifyMessagesRead(msg);\n        break;\n      } catch (error) {\n        CometChatLogger.error(\n          'CometChatMessageList',\n          'Error marking messages as read on initial load:',\n          error\n        );\n      }\n    }\n  }\n}\n\nexport async function handleRealtimeMessageReceiptImpl(ctx: any, message: CometChat.BaseMessage): Promise<void> {\n  if (!ctx.loggedInUser) { return; }\n  if (!ctx.isReceiverMessage(message)) { return; }\n  const atBottom = ctx.isAtBottom();\n  if (atBottom) {\n    const messageId = message.getId();\n    if (messageId) {\n      ctx.messageListService.updateLocalReadStatus([messageId]);\n    }\n    try {\n      await ctx.messageListService.markAsRead(message);\n    } catch (error) {\n      CometChatLogger.error('CometChatMessageList', 'Error marking message as read:', error);\n    }\n  } else {\n    ctx.unreadMessages.update((msgs: CometChat.BaseMessage[]) => [...msgs, message]);\n  }\n}\n\nexport async function markMessagesReadOnScrollToBottomImpl(ctx: any): Promise<void> {\n  const unreadMsgs = ctx.unreadMessages();\n  if (unreadMsgs.length === 0 || !ctx.loggedInUser) { return; }\n  const latestMessage = ctx.getLatestReceiverMessage(unreadMsgs);\n  if (!latestMessage) { return; }\n  const messageIds = unreadMsgs\n    .map((msg: CometChat.BaseMessage) => msg.getId())\n    .filter((id: number | undefined) => id !== undefined) as number[];\n  ctx.unreadMessages.set([]);\n  try {\n    await ctx.messageListService.markAsRead(latestMessage);\n    ctx.messageListService.updateLocalReadStatus(messageIds);\n    ctx.notifyUnreadCountChange(0);\n    ctx.notifyMessagesRead(latestMessage);\n  } catch (error) {\n    CometChatLogger.error(\n      'CometChatMessageList',\n      'Error marking messages as read on scroll to bottom:',\n      error\n    );\n  }\n}\n\nexport async function markAsReadWithRetryImpl(ctx: any, message: CometChat.BaseMessage, retryCount = 0): Promise<void> {\n  const MAX_RETRIES = 2;\n  const RETRY_DELAYS = [1000, 2000];\n  try {\n    await ctx.messageListService.markAsRead(message);\n  } catch (error) {\n    if (retryCount < MAX_RETRIES) {\n      const delay = RETRY_DELAYS[retryCount];\n      CometChatLogger.warn('CometChatMessageList', `Retrying markAsRead after ${delay}ms (attempt ${retryCount + 1}/${MAX_RETRIES})`);\n      await new Promise(resolve => setTimeout(resolve, delay));\n      return markAsReadWithRetryImpl(ctx, message, retryCount + 1);\n    } else {\n      CometChatLogger.error('CometChatMessageList', 'markAsReadWithRetry failed after max retries:', error);\n      if (error instanceof CometChat.CometChatException) {\n        ctx.error.emit(error);\n      }\n    }\n  }\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatUIEvents} from '../../events/CometChatUIEvents';\nimport {States} from '../../Enums/Enums';\n\nexport function initializeServiceImpl(self: any): void {\n  if (self.user) { self.messageListService.setUser(self.user); } else if (self.group) { self.messageListService.setGroup(self.group); }\n  if (self.isAgentChat) { self.messageListService.setIsAgentChat(true); }\n  if (self.parentMessageId) { self.messageListService.setParentMessageId(self.parentMessageId); }\n  if (self.messagesRequestBuilder) { self.messageListService.setMessagesRequestBuilder(self.messagesRequestBuilder); }\n  if (self.hideGroupActionMessages) { self.messageListService.setHideGroupActionMessages(self.hideGroupActionMessages); }\n  if (self.isAgentChat && !self.parentMessageId) {\n    // Agent chat without parentMessageId: show empty state immediately (no shimmer),\n    // only display real-time messages as they arrive.\n    // When loadLastAgentConversation is true, keep shimmer visible while parent\n    // fetches history in the background and sets parentMessageId once resolved.\n    // Reset loadingState since no fetch will happen (setUser/setGroup sets it to true).\n    self.messageListService.setLoadingState(false);\n    self.listState.set(self.loadLastAgentConversation ? States.loading : States.empty);\n    return;\n  }\n  if (self.goToMessageId) {\n    const numericId = typeof self.goToMessageId === 'string'\n      ? parseInt(self.goToMessageId, 10)\n      : Number(self.goToMessageId);\n    if (!isNaN(numericId)) {\n      self.hasMorePrevious.set(false);\n      self.hasMoreNext.set(false);\n      self.messageListService.fetchMessagesAroundId(numericId).then(() => {\n        self.cdr.markForCheck();\n        self.scrollToMessageWithRetry(self.goToMessageId!, 10);\n        self.publishActiveChatChanged();\n      }).catch((error: unknown) => {\n        CometChatLogger.error('CometChatMessageList', 'Error fetching messages around goToMessageId:', error);\n      });\n      return;\n    }\n  }\n  self.messageListService.fetchPreviousMessages().then(() => {\n    self.scrollToBottomAfterLoad();\n    self.publishActiveChatChanged();\n  });\n}\n\nexport function publishActiveChatChangedImpl(self: any): void {\n  if (!self.isFirstLoad || self.parentMessageId) { return; }\n  self.isFirstLoad = false;\n  const messages = self.messages();\n  const lastMessage = messages.length > 0 ? messages[messages.length - 1] : undefined;\n  CometChatUIEvents.ccActiveChatChanged.next({\n    user: self.user,\n    group: self.group,\n    message: lastMessage,\n    unreadMessageCount: 0,\n  });\n}\n\nexport function setupIntersectionObserversImpl(self: any): void {\n  if (!self.scrollTopAnchor?.nativeElement || !self.scrollBottomAnchor?.nativeElement) { return; }\n  self.disconnectObservers();\n  self.scrollTopObserver = new IntersectionObserver(\n    (entries: IntersectionObserverEntry[]) => {\n      if (entries[0].isIntersecting && !self.isFetchingPrevious() && self.hasMorePrevious()) {\n        self.handleScrollToTop();\n      }\n    },\n    {\n      root: self.listContainer?.nativeElement,\n      threshold: 0.1,\n      rootMargin: '100px 0px 0px 0px',\n    }\n  );\n  self.scrollTopObserver.observe(self.scrollTopAnchor.nativeElement);\n  self.scrollBottomObserver = new IntersectionObserver(\n    (entries: IntersectionObserverEntry[]) => {\n      if (entries[0].isIntersecting) {\n        self.handleScrollToBottom();\n      }\n    },\n    { root: self.listContainer?.nativeElement, threshold: 0.1 }\n  );\n  self.scrollBottomObserver.observe(self.scrollBottomAnchor.nativeElement);\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {ContextMenuItem} from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\n\nexport function handleOptionClickImpl(self: any, option: ContextMenuItem, message: CometChat.BaseMessage): void {\n  switch (option.id) {\n    case CometChatUIKitConstants.MessageOption.copyMessage:\n      self.copyMessageToClipboard(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.deleteMessage:\n      self.showDeleteConfirmation(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.translateMessage:\n      self.translateMessage(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.flagMessage:\n      self.showFlagConfirmation(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.sendMessagePrivately:\n      self.handleMessagePrivately(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.replyMessage:\n      self.onReplyMessage(message.getId());\n      break;\n    case CometChatUIKitConstants.MessageOption.editMessage:\n      self.onEditMessage(message.getId());\n      break;\n    case CometChatUIKitConstants.MessageOption.messageInformation:\n      self.onMessageInfo(message.getId());\n      break;\n    case CometChatUIKitConstants.MessageOption.reactToMessage:\n      self.showEmojiKeyboardForMessage(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.replyInThread:\n      self.threadRepliesClick.emit(message);\n      break;\n    case CometChatUIKitConstants.MessageOption.markAsUnread:\n      self.markMessageAsUnread(message);\n      break;\n    default:\n      break;\n  }\n}\n","import {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\n\nexport function announceNewMessageImpl(self: any, senderName: string, preview: string): void {\n  const message = CometChatLocalize.getLocalizedString('accessibility_new_message')\n    .replace('{sender}', senderName)\n    .replace('{preview}', preview);\n  self.liveAnnouncer.announce(message, 'polite');\n}\n\nexport function announceMessageSentImpl(self: any): void {\n  self.liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('accessibility_message_sent'),\n    'polite'\n  );\n}\n\nexport function announceMessageFailedImpl(self: any): void {\n  self.liveAnnouncer.announceError(\n    CometChatLocalize.getLocalizedString('accessibility_message_failed')\n  );\n}\n\nexport function announceMessageDeletedImpl(self: any): void {\n  self.liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('accessibility_message_deleted'),\n    'polite'\n  );\n}\n\nexport function announceMessageEditedImpl(self: any): void {\n  self.liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('accessibility_message_edited'),\n    'polite'\n  );\n}\n\nexport function announceTypingImpl(self: any, name: string): void {\n  if (self.typingAnnouncementTimeout) { clearTimeout(self.typingAnnouncementTimeout); }\n  self.typingAnnouncementTimeout = setTimeout(() => {\n    const message = CometChatLocalize.getLocalizedString('accessibility_user_typing').replace(\n      '{name}',\n      name\n    );\n    self.liveAnnouncer.announce(message, 'polite');\n    self.typingAnnouncementTimeout = null;\n  }, 1000);\n}\n\nexport function announceLoadingMoreImpl(self: any): void {\n  self.liveAnnouncer.announce(\n    CometChatLocalize.getLocalizedString('accessibility_loading_older_messages'),\n    'polite'\n  );\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {CometChatUIEvents} from '../../events/CometChatUIEvents';\nimport {CometChatConversationEvents} from '../../events/CometChatConversationEvents';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {MessageStatus} from '../../Enums/Enums';\nimport {ToastType} from '../base-elements/cometchat-toast/cometchat-toast.component';\nimport {getMediaCaption, hasMediaCaption} from '../../utils/message-metadata-utils';\nimport {getAgentMessageCopyText} from '../../utils/agent-message-utils';\n\nexport function onEditMessageImpl(self: any, messageId: number): void {\n  const message = self.messages().find((m: CometChat.BaseMessage) => m.getId() === messageId);\n  if (!message) { return; }\n  // Editable: a text message, or a media message whose caption is the thing being edited.\n  if (message instanceof CometChat.TextMessage || hasMediaCaption(message)) {\n    CometChatMessageEvents.ccMessageEdited.next({\n      message: message,\n      status: MessageStatus.inprogress,\n      parentMessageId: self.parentMessageId ?? null,\n    });\n  }\n}\n\nexport function onReplyMessageImpl(self: any, messageId: number): void {\n  const message = self.messages().find((m: CometChat.BaseMessage) => m.getId() === messageId);\n  if (message) {\n    CometChatMessageEvents.ccReplyToMessage.next({\n      message: message,\n      status: MessageStatus.inprogress,\n      // ENG-35025: Include parentMessageId so the composer subscription can scope\n      // the reply event to the correct composer instance (thread vs main).\n      parentMessageId: self.parentMessageId ?? null,\n    });\n    self.replyClick.emit(message);\n  }\n}\n\nexport function onReplyPreviewClickImpl(self: any, quotedMessage: CometChat.BaseMessage): void {\n  const messageId = quotedMessage.getId();\n  if (!messageId) return;\n  const existingMessage = self.messages().find((m: CometChat.BaseMessage) => m.getId() === messageId);\n  if (existingMessage) { self.scrollToMessage(messageId); } else {\n    self.messageListService.fetchMessagesAroundId(messageId).then(() => {\n      self.cdr.markForCheck();\n      self.scrollToMessageWithRetry(messageId, 10);\n    }).catch((error: unknown) => {\n      CometChatLogger.error('CometChatMessageList', 'Error fetching around quoted message:', error);\n    });\n  }\n}\n\nexport function onMessageInfoImpl(self: any, messageId: number): void {\n  const message = self.messages().find((m: CometChat.BaseMessage) => m.getId() === messageId);\n  if (message) { self.messageForInfo.set(message); self.showMessageInfo.set(true); }\n}\n\nexport function closeMessageInfoImpl(self: any): void {\n  self.showMessageInfo.set(false);\n  self.messageForInfo.set(null);\n}\n\nexport async function copyMessageToClipboardImpl(self: any, message: CometChat.BaseMessage): Promise<void> {\n  const isText = message.getType() === CometChatUIKitConstants.MessageTypes.text;\n  if (!isText && !hasMediaCaption(message)) { return; }\n  // Handle agentic (AI agent) messages — extract text from elements or assistantMessageData\n  if (message.getCategory() === CometChatUIKitConstants.MessageCategory.agentic) {\n    try {\n      const text = getAgentMessageCopyText(message);\n      if (text && navigator?.clipboard) {\n        await navigator.clipboard.writeText(text);\n        self.showInlineToast(CometChatLocalize.getLocalizedString('message_list_message_copied'));\n      }\n    } catch (error) {\n      CometChatLogger.error(\n        'CometChatMessageList',\n        'Error copying agent message to clipboard:',\n        error\n      );\n      self.showInlineToast(\n        CometChatLocalize.getLocalizedString('message_copy_error'),\n        ToastType.error,\n        3000\n      );\n    }\n    return;\n  }\n\n  if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) { return; }\n  try {\n    const textMessage = message as CometChat.TextMessage;\n    // Media messages carry their copyable text in the caption, not getText().\n    const rawText = isText ? textMessage.getText() : getMediaCaption(message);\n    if (!rawText) { return; }\n\n    // Replace SDK mention patterns with display names before copying.\n    // <@uid:superhero1> → @DisplayName, <@all:label> → @label\n    const mentionedUsers: CometChat.User[] = textMessage.getMentionedUsers?.() || [];\n    const userMap = new Map<string, string>();\n    mentionedUsers.forEach(u => userMap.set(u.getUid(), u.getName()));\n\n    const text = rawText\n      // Replace user mentions: <@uid:superhero1> → @DisplayName (or @uid as fallback)\n      .replace(/<@uid:(.*?)>/g, (_match, uid) => `@${userMap.get(uid) ?? uid}`)\n      // Replace channel mentions: <@all:all> → @all\n      .replace(/<@all:(.*?)>/g, (_match, label) => `@${label || 'all'}`);\n\n    await navigator.clipboard.writeText(text);\n    self.showInlineToast(CometChatLocalize.getLocalizedString('message_list_message_copied'));\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error copying message to clipboard:', error);\n    self.showInlineToast(CometChatLocalize.getLocalizedString('message_copy_error'), ToastType.error, 3000);\n  }\n}\n\nexport function handleMessagePrivatelyImpl(self: any, message: CometChat.BaseMessage): void {\n  if (!self.group) { return; }\n  const sender = message.getSender();\n  if (!sender || (self.loggedInUser && sender.getUid() === self.loggedInUser.getUid())) { return; }\n  CometChatUIEvents.ccOpenChat.next({ user: sender });\n  self.messagePrivatelyClick.emit({ message, user: sender });\n}\n\nexport async function markMessageAsUnreadImpl(self: any, message: CometChat.BaseMessage): Promise<void> {\n  const messageId = message.getId();\n  if (self.lastUnreadMarkedMessageId() === messageId) { return; }\n  try {\n    const updatedConversation = await self.messageListService.markAsUnread(message);\n    self.lastUnreadMarkedMessageId.set(messageId);\n    self.unreadDividerMessageId.set(messageId);\n    const unreadCount = updatedConversation.getUnreadMessageCount() ?? 0;\n    if (unreadCount > 0) {\n      self.markedAsUnreadCount.set(unreadCount);\n      self.showScrollToBottom.set(true);\n    }\n    CometChatConversationEvents.ccUpdateConversation.next(updatedConversation);\n    self.cdr.markForCheck();\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'markMessageAsUnread failed', error);\n    self.showInlineToast(\n      CometChatLocalize.getLocalizedString('something_went_wrong'),\n      ToastType.error\n    );\n  }\n}\n","import {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\n\nexport function handleKeydownImpl(self: any, event: KeyboardEvent): void {\n  if (self.focusTrapService.hasActiveTraps() || isEventFromOverlayImpl(event)) { return; }\n  const items = self.messagesWithSeparators();\n  if (items.length === 0) { return; }\n  const messageIndices = items\n    .map((item: any, idx: number) => (item.type === 'message' ? idx : -1))\n    .filter((idx: number) => idx !== -1);\n  if (messageIndices.length === 0) { return; }\n  const currentFocused = self.focusedMessageIndex();\n  let currentPos = messageIndices.indexOf(currentFocused);\n  if (currentPos === -1) { currentPos = 0; }\n  const newPos = self.listNavigationService.handleKeyNavigation(event, currentPos, {\n    itemCount: messageIndices.length,\n    wrap: false,\n  });\n  if (newPos !== -1 && messageIndices[newPos] !== self.focusedMessageIndex()) {\n    self.setFocusedIndex(messageIndices[newPos]);\n    if (newPos === 0 && self.hasMorePrevious() && !self.isFetchingPrevious()) {\n      self.announceLoadingMore();\n      self.handleScrollToTop();\n    }\n  }\n  if (event.key === 'Enter') { event.preventDefault(); }\n  if (event.key === ' ') {\n    const focusedItem = items[self.focusedMessageIndex()];\n    if (focusedItem?.message && self.isMediaMessage(focusedItem.message)) {\n      event.preventDefault();\n    }\n  }\n  if (event.key === 'Escape') {\n    event.preventDefault();\n    self.focusedMessageIndex.set(-1);\n    (document.activeElement as HTMLElement)?.blur();\n  }\n}\n\nexport function isEventFromOverlayImpl(event: KeyboardEvent): boolean {\n  const target = event.target as HTMLElement;\n  if (!target || typeof target.closest !== 'function') { return false; }\n  return !!(\n    target.closest('cometchat-emoji-keyboard') ||\n    target.closest('.cometchat-popover__content') ||\n    target.closest('cometchat-confirm-dialog') ||\n    target.closest('cometchat-flag-message-dialog') ||\n    target.closest('cometchat-context-menu') ||\n    target.closest('[aria-modal=\"true\"]')\n  );\n}\n\nexport function setFocusedIndexImpl(self: any, index: number): void {\n  self.focusedMessageIndex.set(index);\n  if (!self.listContainer?.nativeElement) { return; }\n  setTimeout(() => {\n    const element = self.listContainer?.nativeElement.querySelector(\n      `.cometchat-message-list__message[data-index=\"${index}\"]`\n    ) as HTMLElement;\n    if (element) {\n      element.scrollIntoView({ behavior: 'smooth', block: 'nearest' });\n      element.focus();\n    }\n  }, 0);\n}\n\nexport function getMessageTabIndexImpl(self: any, index: number): number {\n  if (self.focusedMessageIndex() === -1) {\n    const items = self.messagesWithSeparators();\n    const firstMessageIndex = items.findIndex((item: any) => item.type === 'message');\n    return index === firstMessageIndex ? 0 : -1;\n  }\n  return self.listNavigationService.getItemTabIndex(index, self.focusedMessageIndex());\n}\n","import {SimpleChanges, DestroyRef} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {CometChatUIEvents, IPanel} from '../../events/CometChatUIEvents';\nimport {PanelAlignment, States} from '../../Enums/Enums';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatMentionsFormatter} from '../../formatters/cometchat-mentions-formatter';\n\nexport function setupMessageListenerImpl(self: any): void {\n  CometChat.addMessageListener(\n    self.messageListenerId,\n    new CometChat.MessageListener({\n      onMessagesDelivered: (_messageReceipt: CometChat.MessageReceipt) => {\n        setTimeout(() => { self.cdr.detectChanges(); }, 500);\n      },\n      onMessagesRead: (_messageReceipt: CometChat.MessageReceipt) => {\n        setTimeout(() => { self.cdr.detectChanges(); }, 500);\n      },\n    })\n  );\n}\n\nexport function ngOnInitImpl(self: any): void {\n  self.messageListenerId = `message_list_${Date.now()}`;\n  self.initializeLoggedInUser().then(() => {\n    self.configureFormattersWithUser();\n    self.setupMessageListener();\n  });\n  self.initializeFormatters();\n  self.subscribeToMessageEvents();\n  if (!self.user && !self.group) {\n    self.propsProvided = false;\n    self.subscribeToChatStateService();\n  } else {\n    self.propsProvided = true;\n    self.initializeService();\n  }\n  CometChatUIEvents.ccShowPanel.pipe(takeUntilDestroyed(self.destroyRef as DestroyRef)).subscribe((panel: IPanel) => {\n    if (panel.position === PanelAlignment.messageListFooter) {\n      self.footerPanelConfig.set(panel);\n      self.showFooterPanel.set(true);\n    }\n  });\n  CometChatUIEvents.ccHidePanel.pipe(takeUntilDestroyed(self.destroyRef as DestroyRef)).subscribe((alignment: void | PanelAlignment) => {\n    if (alignment === PanelAlignment.messageListFooter || alignment === undefined) {\n      self.footerPanelConfig.set(null);\n      self.showFooterPanel.set(false);\n    }\n  });\n}\n\nexport function ngOnChangesImpl(self: any, changes: SimpleChanges): void {\n  const userChange = changes['user'];\n  const groupChange = changes['group'];\n  const goToMessageIdChange = changes['goToMessageId'];\n  if (changes['messagesRequestBuilder'] && self.messagesRequestBuilder) {\n    self.messageListService.setMessagesRequestBuilder(self.messagesRequestBuilder);\n  }\n  if ((userChange && !userChange.firstChange) || (groupChange && !groupChange.firstChange)) {\n    self.handleConversationChange();\n  }\n  if (changes['parentMessageId'] && !changes['parentMessageId'].firstChange) {\n    self.handleParentMessageIdChange();\n  }\n  const conversationAlsoChanged =\n    (userChange && !userChange.firstChange) || (groupChange && !groupChange.firstChange);\n  if (\n    goToMessageIdChange &&\n    !goToMessageIdChange.firstChange &&\n    self.goToMessageId &&\n    !conversationAlsoChanged &&\n    !self.conversationChangeScheduled\n  ) {\n    self.scrollToMessage(self.goToMessageId);\n  }\n  const hideGroupActionChange = changes['hideGroupActionMessages'];\n  if (hideGroupActionChange && !hideGroupActionChange.firstChange) {\n    self.messageListService.setHideGroupActionMessages(self.hideGroupActionMessages);\n    self.messageListService.clearMessages();\n    self.messageListService.fetchPreviousMessages().then(() => {\n      self.scrollToBottomAfterLoad();\n    });\n  }\n}\n\nexport function ngAfterViewInitImpl(self: any): void {\n  self.setupIntersectionObservers();\n  self.setupScrollListeners();\n  // Re-setup observers when list transitions to loaded state\n  safeEffect(\n    () => {\n      const state = self.listState();\n      if (state === States.loaded) {\n        setTimeout(() => { self.setupIntersectionObservers(); }, 0);\n      }\n    },\n    { injector: self.injector }\n  );\n}\n\nexport function ngOnDestroyImpl(self: any): void {\n  if (self.messageListenerId) {\n    CometChat.removeMessageListener(self.messageListenerId);\n  }\n  self.disconnectObservers();\n  self.pendingReadReceipts.clear();\n  if (self.typingAnnouncementTimeout) {\n    clearTimeout(self.typingAnnouncementTimeout);\n    self.typingAnnouncementTimeout = null;\n  }\n  if (self.scrollListener && self.listContainer?.nativeElement) {\n    self.listContainer.nativeElement.removeEventListener('scroll', self.scrollListener);\n    self.scrollListener = null;\n  }\n}\n\nexport async function initializeLoggedInUserImpl(self: any): Promise<void> {\n  try {\n    self.loggedInUser = await CometChat.getLoggedinUser();\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error getting logged-in user:', error);\n  }\n}\n\nexport function initializeFormattersImpl(self: any): void {\n  const effectiveFormatters = self.effectiveTextFormatters();\n  if (effectiveFormatters && effectiveFormatters.length > 0) {\n    self.activeFormatters = [...effectiveFormatters];\n  } else {\n    self.activeFormatters = self.formatterConfigService.getDefaultFormatters();\n  }\n}\n\nexport function configureFormattersWithUserImpl(self: any): void {\n  if (!self.loggedInUser) { return; }\n  self.activeFormatters.forEach((formatter: any) => {\n    if (formatter instanceof CometChatMentionsFormatter) {\n      formatter.setLoggedInUser(self.loggedInUser);\n    }\n  });\n}\n","import {CometChat} from '@cometchat/chat-sdk-javascript';\nimport {Subject} from 'rxjs';\nimport {debounceTime} from 'rxjs/operators';\nimport {takeUntilDestroyed} from '@angular/core/rxjs-interop';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\nimport {CometChatMessageEvents} from '../../events/CometChatMessageEvents';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {States, MessageListAlignment, MessageBubbleAlignment} from '../../Enums/Enums';\nimport {ToastType} from '../base-elements/cometchat-toast/cometchat-toast.component';\nimport {ErrorContext} from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\n\nexport function setupScrollListenersImpl(self: any): void {\n  if (!self.listContainer?.nativeElement) { return; }\n  const scrollSubject$ = new Subject<Event>();\n  scrollSubject$.pipe(debounceTime(100), takeUntilDestroyed(self.destroyRef)).subscribe(() => {\n    self.updateStickyDate();\n    self.updateIsAtBottom();\n  });\n  self.scrollListener = (event: Event) => { scrollSubject$.next(event); };\n  self.listContainer.nativeElement.addEventListener('scroll', self.scrollListener);\n}\n\nexport function getMessageAlignmentImpl(self: any, message: CometChat.BaseMessage): MessageBubbleAlignment {\n  const category = message.getCategory();\n  if (category === CometChatUIKitConstants.MessageCategory.call) { return MessageBubbleAlignment.center; }\n  if (category === CometChatUIKitConstants.MessageCategory.action) { return MessageBubbleAlignment.center; }\n  if (self.messageAlignment === MessageListAlignment.left) { return MessageBubbleAlignment.left; }\n  const sender = message.getSender();\n  if (!sender || (self.loggedInUser && sender?.getUid() === self.loggedInUser.getUid())) { return MessageBubbleAlignment.right; }\n  return MessageBubbleAlignment.left;\n}\n\nexport function isCallForCurrentConversationImpl(self: any, call: CometChat.Call): boolean {\n  const receiverId = call.getReceiverId();\n  const receiverType = call.getReceiverType();\n  if (self.user) {\n    if (receiverType === CometChatUIKitConstants.MessageReceiverType.user) {\n      const senderId = call.getSender()?.getUid();\n      return receiverId === self.user.getUid() || senderId === self.user.getUid();\n    }\n    return false;\n  } else if (self.group) {\n    return (\n      receiverType === CometChatUIKitConstants.MessageReceiverType.group &&\n      receiverId === self.group.getGuid()\n    );\n  }\n  return false;\n}\n\nexport function updateListStateImpl(self: any): void {\n  // In agent chat mode without parentMessageId, skip the normal state machine.\n  // State is managed directly: starts as empty, transitions to loaded when messages arrive.\n  if (self.isAgentChat && !self.parentMessageId) {\n    const messages = self.messages();\n    if (messages.length > 0) {\n      self.listState.set(States.loaded);\n    }\n    // Don't override to 'loading' — keep empty state until messages arrive\n    return;\n  }\n  const loading = self.loadingState();\n  const error = self.errorState();\n  const messages = self.messages();\n  if (loading && messages.length === 0) {\n    self.listState.set(States.loading);\n  } else if (error && !loading && !self.effectiveHideError()) {\n    // ENG-35029: Only show error state when NOT loading. A stale error from a previous\n    // conversation's fetch can arrive after setUser/setGroup clears the error state but\n    // before the new fetch completes. Ignoring errors during loading prevents false\n    // \"Something went wrong\" screens when switching conversations quickly.\n    self.listState.set(States.error);\n  } else if (messages.length === 0) {\n    self.listState.set(States.empty);\n  } else {\n    self.listState.set(States.loaded);\n  }\n}\n\nexport function showInlineToastImpl(self: any, text: string, type: ToastType = ToastType.success, duration = 2000): void {\n  if (self.inlineToastTimer) { clearTimeout(self.inlineToastTimer); }\n  self.inlineToastText.set(text);\n  self.inlineToastType.set(type);\n  self.cdr.markForCheck();\n  self.inlineToastTimer = window.setTimeout(() => {\n    self.inlineToastText.set(null);\n    self.cdr.markForCheck();\n  }, duration);\n}\n\nexport function notifyMessagesReadImpl(self: any, message: CometChat.BaseMessage): void {\n  try {\n    CometChatMessageEvents.ccMessageRead.next(message);\n  } catch (error) {\n    CometChatLogger.error('CometChatMessageList', 'Error emitting message read event:', error);\n  }\n}\n\nexport function handleLifecycleErrorImpl(self: any, error: unknown, hook: string): void {\n  const err = error instanceof Error ? error : new Error(String(error));\n  CometChatLogger.error('CometChatMessageList', `Error in ${hook}:`, err);\n  self.listState.set(States.error);\n  self.error.emit(err as CometChat.CometChatException);\n}\n\nexport function handleServiceErrorImpl(self: any, error: Error): void {\n  CometChatLogger.error('CometChatMessageList', 'Service error:', error);\n  if (!self.effectiveHideError()) {\n    self.listState.set(States.error);\n    self.error.emit(error as CometChat.CometChatException);\n  }\n}\n\nexport function onBubbleErrorImpl(context: ErrorContext): void {\n  CometChatLogger.error(\n    'CometChatMessageList',\n    `Bubble render error [${context.componentName}]:`,\n    context.error\n  );\n}\n\nexport function handleReceiptErrorImpl(self: any, error: CometChat.CometChatException, context: string): void {\n  CometChatLogger.error('CometChatMessageList', `Receipt error in ${context}:`, error);\n  if (error instanceof CometChat.CometChatException) { self.error.emit(error); }\n}\n\nexport function shouldShowSmartRepliesForMessageImpl(self: any, message: CometChat.BaseMessage): boolean {\n  if (!self.smartRepliesKeywords || self.smartRepliesKeywords.length === 0) { return true; }\n  if (message.getType() !== 'text') { return false; }\n  const textMessage = message as CometChat.TextMessage;\n  const text = textMessage.getText()?.toLowerCase() || '';\n  return self.smartRepliesKeywords.some((keyword: string) => text.includes(keyword.toLowerCase()));\n}\n","\nimport {Component, Input, Output, EventEmitter, TemplateRef, ViewChild, ElementRef, ChangeDetectionStrategy, ChangeDetectorRef, OnInit, OnDestroy, OnChanges, AfterViewInit, SimpleChanges, signal, computed, Signal, inject, DestroyRef, booleanAttribute, Injector,} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport {CommonModule} from '@angular/common';\nimport {CometChat} from '@cometchat/chat-sdk-javascript';\n\nimport {CometChatMessageBubbleComponent} from '../cometchat-message-bubble/cometchat-message-bubble.component';\nimport {CometChatDateComponent} from '../base-elements/cometchat-date/cometchat-date.component';\nimport {CometChatButtonComponent} from '../base-elements/cometchat-button/cometchat-button.component';\nimport {CometChatSmartRepliesComponent} from '../base-elements/cometchat-smart-replies/cometchat-smart-replies.component';\nimport {CometChatConversationStarterComponent} from '../base-elements/cometchat-conversation-starter/cometchat-conversation-starter.component';\nimport {CometChatConversationSummaryComponent} from '../base-elements/cometchat-conversation-summary/cometchat-conversation-summary.component';\nimport {CometChatConfirmDialogComponent} from '../base-elements/cometchat-confirm-dialog/cometchat-confirm-dialog.component';\nimport {CometChatFlagMessageDialogComponent} from '../base-elements/cometchat-flag-message-dialog/cometchat-flag-message-dialog.component';\nimport {CometChatMessageInformationComponent} from '../cometchat-message-information/cometchat-message-information.component';\nimport {CometChatEmojiKeyboardComponent} from '../base-elements/cometchat-emoji-keyboard/cometchat-emoji-keyboard.component';\nimport {CometChatErrorBoundaryComponent, ErrorContext,} from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport {ContextMenuItem} from '../base-elements/cometchat-context-menu/cometchat-context-menu.component';\n\nimport {MessageListService} from '../../services/message-list.service';\nimport {ChatStateService} from '../../services/chat-state.service';\nimport {CometChatTemplatesService} from '../../services/templates.service';\nimport {CometChatToastComponent, ToastType} from '../base-elements/cometchat-toast/cometchat-toast.component';\nimport {FormatterConfigService} from '../../services/formatter-config.service';\nimport {ListNavigationService} from '../../services/list-navigation.service';\nimport {LiveAnnouncerService} from '../../services/live-announcer.service';\nimport {FocusTrapService} from '../../services/focus-trap.service';\nimport {COMETCHAT_GLOBAL_CONFIG, GlobalConfig} from '../../services/global-config.service';\nimport {isSenderMessage as isSenderMessageUtil, isReceiverMessage as isReceiverMessageUtil, getLatestReceiverMessage as getLatestReceiverMessageUtil, getConversationId as getConversationIdUtil, getConversationType as getConversationTypeUtil, isMessageForCurrentConversation as isMessageForCurrentConversationUtil} from './cometchat-message-list.receipt-utils';\nimport {getMessagePreview as getMessagePreviewUtil, isMediaMessage as isMediaMessageUtil} from './cometchat-message-list.options-utils';\nimport {highlightAndScrollToElement as highlightAndScrollToElementUtil} from './cometchat-message-list.scroll-utils';\nimport {ConversationsService} from '../../services/conversations.service';\nimport {subscribeToMessageEventsImpl, subscribeToGroupEventsImpl, subscribeToCallEventsImpl, subscribeToUIDialogEventsImpl} from './cometchat-message-list.event-handlers';\nimport {getMessageOptionsImpl} from './cometchat-message-list.option-builders';\nimport {handleScrollToTopImpl, handleScrollToBottomImpl, saveScrollPositionImpl, restoreScrollPositionImpl, saveScrollPositionForReactionImpl, updateStickyDateImpl, updateIsAtBottomImpl, scrollToBottomImpl, scrollToBottomAfterLoadImpl, scrollToBottomWithRetryImpl, scrollToMessageImpl, scrollToMessageWithRetryImpl, disconnectObserversImpl} from './cometchat-message-list.scroll-handlers';\nimport {showEmojiKeyboardForMessageImpl, calculateEmojiKeyboardPositionImpl, onEmojiSelectedImpl, onEmojiKeyboardCloseImpl, onBubbleReactionClickImpl, onBubbleReactionListItemClickImpl} from './cometchat-message-list.reaction-handlers';\nimport {showDeleteConfirmationImpl, handleDeleteConfirmImpl, handleDeleteCancelImpl, getDeleteDialogTitleImpl, getDeleteDialogSubtitleImpl, getDeleteDialogConfirmTextImpl, getDeleteDialogCancelTextImpl, showFlagConfirmationImpl, handleFlagConfirmImpl, handleFlagCancelImpl} from './cometchat-message-list.delete-handlers';\nimport {translateMessageImpl, getTranslatedTextImpl, isMessageTranslatingImpl, isMessageTranslatedImpl, getDefaultTranslationLanguageImpl, setPreferredTranslationLanguageImpl} from './cometchat-message-list.translate-handlers';\nimport {handleConversationChangeImpl, handleParentMessageIdChangeImpl, subscribeToChatStateServiceImpl, scheduleDeferredConversationChangeImpl, handleUserChangeImpl, handleGroupChangeImpl, scrollToFirstUnreadOrBottomImpl} from './cometchat-message-list.conversation-handlers';\nimport {handleNewMessagesImpl, shouldPlaySoundImpl, playMessageSoundImpl, computeMessagesWithDateSeparatorsImpl, getReactionFingerprintImpl, getDateStringImpl} from './cometchat-message-list.message-state';\nimport {markInitialMessagesAsReadImpl, handleRealtimeMessageReceiptImpl, markMessagesReadOnScrollToBottomImpl, markAsReadWithRetryImpl} from './cometchat-message-list.read-handlers';\nimport {initializeServiceImpl, publishActiveChatChangedImpl, setupIntersectionObserversImpl} from './cometchat-message-list.init-utils';\nimport {handleOptionClickImpl} from './cometchat-message-list.option-click';\nimport {announceNewMessageImpl, announceMessageSentImpl, announceMessageFailedImpl, announceMessageDeletedImpl, announceMessageEditedImpl, announceTypingImpl, announceLoadingMoreImpl} from './cometchat-message-list.announce-utils';\nimport {onEditMessageImpl, onReplyMessageImpl, onReplyPreviewClickImpl, onMessageInfoImpl, closeMessageInfoImpl, copyMessageToClipboardImpl, handleMessagePrivatelyImpl, markMessageAsUnreadImpl} from './cometchat-message-list.interaction-utils';\nimport {handleKeydownImpl, setFocusedIndexImpl, getMessageTabIndexImpl} from './cometchat-message-list.keyboard-utils';\nimport {setupMessageListenerImpl, ngOnInitImpl, ngOnChangesImpl, ngAfterViewInitImpl, ngOnDestroyImpl, initializeLoggedInUserImpl, initializeFormattersImpl, configureFormattersWithUserImpl} from './cometchat-message-list.lifecycle-utils';\nimport {setupScrollListenersImpl, getMessageAlignmentImpl, isCallForCurrentConversationImpl, updateListStateImpl, showInlineToastImpl, notifyMessagesReadImpl, handleLifecycleErrorImpl, handleServiceErrorImpl, onBubbleErrorImpl, handleReceiptErrorImpl, shouldShowSmartRepliesForMessageImpl} from './cometchat-message-list.helper-utils';\n\nimport {CometChatSoundManager} from '../../resources/CometChatSoundManager/CometChatSoundManager';\nimport {CometChatLocalize} from '../../resources/CometChatLocalize/cometchat-localize';\nimport {TranslatePipe} from '../../resources/CometChatLocalize/translate.pipe';\nimport {CometChatLogger} from '../../utils/CometChatLogger';\n\nimport {States, MessageListAlignment, MessageBubbleAlignment, Placement, PanelAlignment,} from '../../Enums/Enums';\nimport {CalendarObject} from '../../resources/CometChatLocalize/localization.interfaces';\nimport {CometChatTextFormatter} from '../../formatters/cometchat-text-formatter';\nimport {CometChatUIKitConstants} from '../../constants';\nimport {CometChatActionsIcon} from '../../modals/CometChatActionsIcon';\n\nimport {CometChatUIEvents, IPanel,} from '../../events/CometChatUIEvents';\n\nexport interface MessageListItem {\n  type: 'message' | 'date-separator';\n\n  message?: CometChat.BaseMessage;\n\n  date?: number;\n\n  key: string;\n\n  /** True when this message is the FIRST of a multi-attachment batch (same metadata.batchId run). */\n  isFirstInBatch?: boolean;\n\n  /** True when this message is the LAST of a multi-attachment batch (same metadata.batchId run). */\n  isLastInBatch?: boolean;\n}\n@Component({\n  selector: 'cometchat-message-list',\n  standalone: true,\n  imports: [\n    CommonModule,\n    CometChatMessageBubbleComponent,\n    CometChatDateComponent,\n    CometChatButtonComponent,\n    CometChatSmartRepliesComponent,\n    CometChatConversationStarterComponent,\n    CometChatConversationSummaryComponent,\n    CometChatConfirmDialogComponent,\n    CometChatFlagMessageDialogComponent,\n    CometChatMessageInformationComponent,\n    CometChatEmojiKeyboardComponent,\n    CometChatErrorBoundaryComponent,\n    CometChatToastComponent,\n    TranslatePipe,\n  ],\n  templateUrl: './cometchat-message-list.component.html',\n  styleUrls: ['./cometchat-message-list.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  providers: [MessageListService],\n})\nexport class CometChatMessageListComponent implements OnInit, OnDestroy, OnChanges, AfterViewInit {\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n  private messageListService = inject(MessageListService);\n  private chatStateService = inject(ChatStateService);\n  private templatesService = inject(CometChatTemplatesService);\n  private cdr = inject(ChangeDetectorRef);\n  private destroyRef = inject(DestroyRef);\n  private injector = inject(Injector);\n  private formatterConfigService = inject(FormatterConfigService);\n  private listNavigationService = inject(ListNavigationService);\n  private liveAnnouncer = inject(LiveAnnouncerService);\n  private focusTrapService = inject(FocusTrapService);\n  private conversationsService = inject(ConversationsService);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, {\n    optional: true,\n  });\n  private showScrollbarExplicitlySet = signal(false);\n  private hideErrorExplicitlySet = signal(false);\n  private hideReceiptsExplicitlySet = signal(false);\n  private disableSoundForMessagesExplicitlySet = signal(false);\n  private textFormattersExplicitlySet = signal(false);\n  private hideAvatarExplicitlySet = signal(false);\n  private customSoundForMessagesExplicitlySet = signal(false);\n  private hideModerationViewExplicitlySet = signal(false);\n  private _showScrollbar = signal(false);\n  private _hideError = signal(false);\n  private _hideReceipts = signal(false);\n  private _disableSoundForMessages = signal(false);\n  private _textFormatters = signal<CometChatTextFormatter[]>([]);\n  private _hideAvatar = signal(false);\n  private _customSoundForMessages = signal('');\n  private _hideModerationView = signal(false);\n  @Input() user?: CometChat.User;\n  @Input() group?: CometChat.Group;\n  @Input() parentMessageId?: number;\n  @Input({ transform: booleanAttribute }) isAgentChat = false;\n  @Input({ transform: booleanAttribute }) loadLastAgentConversation = false;\n  @Input() messagesRequestBuilder?: CometChat.MessagesRequestBuilder;\n  @Input() reactionsRequestBuilder?: CometChat.ReactionsRequestBuilder;\n  @Input()\n  set textFormatters(value: CometChatTextFormatter[]) {\n    this._textFormatters.set(value);\n    this.textFormattersExplicitlySet.set(true);\n  }\n  get textFormatters(): CometChatTextFormatter[] {\n    return this._textFormatters();\n  }\n  @Input() messageAlignment: MessageListAlignment = MessageListAlignment.standard;\n  @Input({ transform: booleanAttribute }) scrollToBottomOnNewMessages = false;\n  @Input() quickOptionsCount = 3;\n  @Input({ transform: booleanAttribute })\n  set disableSoundForMessages(value: boolean) { this._disableSoundForMessages.set(value); this.disableSoundForMessagesExplicitlySet.set(true); }\n  get disableSoundForMessages(): boolean { return this._disableSoundForMessages(); }\n  @Input()\n  set customSoundForMessages(value: string) { this._customSoundForMessages.set(value); this.customSoundForMessagesExplicitlySet.set(true); }\n  get customSoundForMessages(): string { return this._customSoundForMessages(); }\n  @Input() goToMessageId?: string;\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) { this._showScrollbar.set(value); this.showScrollbarExplicitlySet.set(true); }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n  @Input({ transform: booleanAttribute })\n  set hideReceipts(value: boolean) { this._hideReceipts.set(value); this.hideReceiptsExplicitlySet.set(true); }\n  get hideReceipts(): boolean { return this._hideReceipts(); }\n  @Input({ transform: booleanAttribute }) hideDateSeparator = false;\n  @Input({ transform: booleanAttribute }) hideStickyDate = false;\n  @Input({ transform: booleanAttribute })\n  set hideAvatar(value: boolean) { this._hideAvatar.set(value); this.hideAvatarExplicitlySet.set(true); }\n  get hideAvatar(): boolean { return this._hideAvatar(); }\n  @Input({ transform: booleanAttribute }) hideGroupActionMessages = false;\n  @Input({ transform: booleanAttribute })\n  set hideError(value: boolean) { this._hideError.set(value); this.hideErrorExplicitlySet.set(true); }\n  get hideError(): boolean { return this._hideError(); }\n  @Input({ transform: booleanAttribute }) hideReplyInThreadOption = false;\n  @Input({ transform: booleanAttribute }) hideTranslateMessageOption = false;\n  @Input({ transform: booleanAttribute }) hideEditMessageOption = false;\n  @Input({ transform: booleanAttribute }) hideDeleteMessageOption = false;\n  @Input({ transform: booleanAttribute }) hideReactionOption = false;\n  @Input({ transform: booleanAttribute }) hideMessagePrivatelyOption = false;\n  @Input({ transform: booleanAttribute }) hideCopyMessageOption = false;\n  @Input({ transform: booleanAttribute }) hideMessageInfoOption = false;\n  @Input() additionalOptions: CometChatActionsIcon[] = [];\n  @Input() optionsOverride?: (\n    message: CometChat.BaseMessage,\n    defaultOptions: CometChatActionsIcon[]\n  ) => CometChatActionsIcon[];\n  @Input({ transform: booleanAttribute })\n  set hideModerationView(value: boolean) { this._hideModerationView.set(value); this.hideModerationViewExplicitlySet.set(true); }\n  get hideModerationView(): boolean { return this._hideModerationView(); }\n  @Input({ transform: booleanAttribute }) hideFlagRemarkField: boolean = false;\n  @Input({ transform: booleanAttribute }) hideFlagMessageOption: boolean = false;\n  @Input({ transform: booleanAttribute }) showMarkAsUnreadOption: boolean = true;\n  @Input({ transform: booleanAttribute }) startFromUnreadMessages: boolean = true;\n  @Input({ transform: booleanAttribute }) hideReplyOption: boolean = false;\n  @Input({ transform: booleanAttribute }) disableInteraction = false;\n  @Input() emptyView?: TemplateRef<any>;\n  @Input() errorView?: TemplateRef<any>;\n  @Input() loadingView?: TemplateRef<any>;\n  @Input() headerView?: TemplateRef<any>;\n  @Input() footerView?: TemplateRef<any>;\n  @Input({ transform: booleanAttribute }) hideTimestamp = false;\n  @Input() bubbleFooterView: TemplateRef<any> | null = null;\n  @Input() appendView?: TemplateRef<any>;\n  @Input() listItemTemplate: TemplateRef<any> | null = null;\n  @Input() emptyStateTemplate: TemplateRef<any> | null = null;\n  @Input() errorStateTemplate: TemplateRef<any> | null = null;\n  @Input() loadingStateTemplate: TemplateRef<any> | null = null;\n  @Input() separatorDateTimeFormat?: CalendarObject;\n  @Input() stickyDateTimeFormat?: CalendarObject;\n  @Input() messageSentAtDateTimeFormat?: CalendarObject;\n  @Input() messageInfoDateTimeFormat?: CalendarObject;\n  @Input({ transform: booleanAttribute }) showConversationStarters = false;\n  @Input({ transform: booleanAttribute }) showSmartReplies = false;\n  @Input() smartRepliesKeywords: string[] = ['what', 'when', 'why', 'who', 'where', 'how', '?'];\n  @Input() smartRepliesDelayDuration = 10000;\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n  @Output() threadRepliesClick = new EventEmitter<CometChat.BaseMessage>();\n  @Output() reactionClick = new EventEmitter<{ reaction: CometChat.ReactionCount; message: CometChat.BaseMessage }>();\n  @Output() reactionListItemClick = new EventEmitter<{ reaction: CometChat.Reaction; message: CometChat.BaseMessage }>();\n  @Output() smartReplyClick = new EventEmitter<string>();\n  @Output() conversationStarterClick = new EventEmitter<string>();\n  @Output() messagePrivatelyClick = new EventEmitter<{ message: CometChat.BaseMessage; user: CometChat.User }>();\n  @Output() replyClick = new EventEmitter<CometChat.BaseMessage>();\n  @ViewChild('listContainer') listContainer?: ElementRef<HTMLElement>;\n  @ViewChild('scrollTopAnchor') scrollTopAnchor?: ElementRef<HTMLElement>;\n  @ViewChild('scrollBottomAnchor') scrollBottomAnchor?: ElementRef<HTMLElement>;\n\n  messages!: Signal<CometChat.BaseMessage[]>; loadingState!: Signal<boolean>;\n\n  errorState!: Signal<Error | null>;\n\n  unreadCount!: Signal<number>;\n  private readonly BOTTOM_THRESHOLD = 100;\n\n  listState = signal<States>(States.loading);\n  showScrollToBottom = signal(false);\n\n  stickyDateTimestamp = signal<number>(0);\n  showStickyDateHeader = signal(false);\n  isAtBottom = signal(true);\n  focusedMessageIndex = signal(-1);\n  isFetchingPrevious = signal(false);\n  isFetchingNext = signal(false);\n  hasMorePrevious = signal(true);\n  hasMoreNext = signal(false);\n  hideSmartReplies = signal(true);\n\n  lastReceivedMessage = signal<CometChat.BaseMessage | undefined>(undefined);\n  hideConversationStarters = signal(false);\n  showNewMessagesBanner = signal(false);\n  newMessagesCount = signal(0);\n\n  unreadMessages = signal<CometChat.BaseMessage[]>([]);\n  private pendingReadReceipts = new Set<number>();\n  private isMarkingAsRead = false;\n  showDeleteConfirmDialog = signal(false);\n\n  messageToDelete = signal<CometChat.BaseMessage | null>(null);\n  isDeleting = signal(false);\n\n  inlineToastText = signal<string | null>(null);\n\n  inlineToastType = signal<ToastType>(ToastType.success);\n  private inlineToastTimer?: number;\n  private lastUnreadMarkedMessageId = signal<number | null>(null);\n\n  unreadDividerMessageId = signal<number | null>(null);\n\n  markedAsUnreadCount = signal<number>(0);\n  showFlagMessageDialog = signal(false);\n\n  messageToFlag = signal<CometChat.BaseMessage | null>(null);\n  isFlagging = signal(false);\n  showMessageInfo = signal(false);\n\n  messageForInfo = signal<CometChat.BaseMessage | null>(null);\n\n  translatedMessages = signal<Map<number, string>>(new Map());\n\n  translatingMessages = signal<Set<number>>(new Set());\n\n  preferredTranslationLanguage = signal<string>(this.getDefaultTranslationLanguage());\n\n  emojiKeyboardMessage = signal<CometChat.BaseMessage | null>(null);\n\n  emojiKeyboardPosition = signal<{ top: number; left: number; side: 'left' | 'right' } | null>(null);\n\n  footerPanelConfig = signal<IPanel | null>(null);\n\n  showFooterPanel = signal<boolean>(false);\n\n  showCallScreen = signal<boolean>(false);\n\n  ongoingCallView = signal<any>(null);\n\n  showImageModerationDialog = signal<boolean>(false);\n\n  imageModerationDialogContent = signal<any>(null);\n  private isFirstLoad = true;\n  messagesWithSeparators = computed(() => this.computeMessagesWithDateSeparators());\n  hasMessages = computed(() => this.messages().length > 0);\n  isLoading = computed(() => this.loadingState());\n  hasError = computed(() => this.errorState() !== null);\n  shouldShowEmptyState = computed(() => !this.isLoading() && !this.hasError() && !this.hasMessages());\n  shouldShowSmartReplies = computed(() => this.showSmartReplies && !this.hideSmartReplies() && this.lastReceivedMessage() !== undefined && !this.showFooterPanel() && !this.parentMessageId);\n  shouldShowConversationStarters = computed(() => this.showConversationStarters && !this.hasMessages() && !this.hideConversationStarters() && !this.showFooterPanel() && this.listState() === States.empty && !this.parentMessageId);\n  effectiveShowScrollbar = computed(() => { if (this.showScrollbarExplicitlySet()) return this._showScrollbar(); if (this.globalConfig?.showScrollbar !== undefined) return this.globalConfig.showScrollbar; return false; });\n  effectiveHideError = computed(() => { if (this.hideErrorExplicitlySet()) return this._hideError(); if (this.globalConfig?.hideError !== undefined) return this.globalConfig.hideError; return false; });\n  effectiveHideReceipts = computed(() => { if (this.hideReceiptsExplicitlySet()) return this._hideReceipts(); if (this.globalConfig?.hideReceipts !== undefined) return this.globalConfig.hideReceipts; return false; });\n  effectiveDisableSoundForMessages = computed(() => { if (this.disableSoundForMessagesExplicitlySet()) return this._disableSoundForMessages(); if (this.globalConfig?.disableSoundForMessages !== undefined) return this.globalConfig.disableSoundForMessages; return false; });\n  effectiveTextFormatters = computed(() => { if (this.textFormattersExplicitlySet()) return this._textFormatters(); if (this.globalConfig?.textFormatters !== undefined) return this.globalConfig.textFormatters; return []; });\n  effectiveHideAvatar = computed(() => { if (this.hideAvatarExplicitlySet()) return this._hideAvatar(); if (this.globalConfig?.hideAvatar !== undefined) return this.globalConfig.hideAvatar; return false; });\n  effectiveCustomSoundForMessages = computed(() => { if (this.customSoundForMessagesExplicitlySet()) return this._customSoundForMessages(); if (this.globalConfig?.customSoundForMessages !== undefined) return this.globalConfig.customSoundForMessages; return ''; });\n  effectiveHideModerationView = computed(() => { if (this.hideModerationViewExplicitlySet()) return this._hideModerationView(); return false; });\n\n  get effectiveLoadingView(): TemplateRef<any> | undefined { return this.loadingStateTemplate || this.loadingView || this.templatesService.resolveTemplate(this.templatesService.getMessageListTemplates(), 'loadingView'); }\n  get effectiveEmptyView(): TemplateRef<any> | undefined { return this.emptyStateTemplate || this.emptyView || this.templatesService.resolveTemplate(this.templatesService.getMessageListTemplates(), 'emptyView'); }\n  get effectiveErrorView(): TemplateRef<any> | undefined { return this.errorStateTemplate || this.errorView || this.templatesService.resolveTemplate(this.templatesService.getMessageListTemplates(), 'errorView'); }\n  get effectiveHeaderView(): TemplateRef<any> | undefined {\n    return this.headerView || this.templatesService.getMessageListTemplates().headerView;\n  }\n  get effectiveFooterView(): TemplateRef<any> | undefined {\n    return this.footerView || this.templatesService.getMessageListTemplates().footerView;\n  }\n  private propsProvided = false;\n  private pendingUser: CometChat.User | null = null;\n  private pendingGroup: CometChat.Group | null = null;\n  private conversationChangeScheduled = false;\n  private loggedInUser: CometChat.User | null = null;\n\n  activeFormatters: CometChatTextFormatter[] = [];\n  private scrollListener: ((event: Event) => void) | null = null;\n  private scrollTopObserver?: IntersectionObserver;\n  private scrollBottomObserver?: IntersectionObserver;\n  private scrollHeightBeforeLoad = 0;\n  private lastSoundPlayedAt = 0;\n  private readonly SOUND_THROTTLE_INTERVAL = 2000;\n  private previousMessages: CometChat.BaseMessage[] = [];\n  private typingAnnouncementTimeout: ReturnType<typeof setTimeout> | null = null;\n  readonly States = States;\n  readonly MessageListAlignment = MessageListAlignment;\n  readonly MessageBubbleAlignment = MessageBubbleAlignment;\n  readonly Placement = Placement;\n  private messageListenerId = `message_list_${Date.now()}`;\n\n  constructor() {\n    this.messages = this.messageListService.messages;\n    this.loadingState = this.messageListService.loadingState;\n    this.errorState = this.messageListService.errorState;\n    this.unreadCount = this.messageListService.unreadCount;\n    safeEffect(() => {\n      const messages = this.messages();\n      this.handleNewMessages(messages);\n      this.previousMessages = [...messages];\n      this.cdr.markForCheck();\n    });\n    safeEffect(() => {\n      const error = this.errorState();\n      if (error && !this.effectiveHideError()) {\n        this.handleServiceError(error);\n      }\n    });\n    safeEffect(() => {\n      this.updateListState();\n    });\n  }\n    private setupMessageListener(): void { setupMessageListenerImpl(this as any); }\n  ngOnInit(): void { try { ngOnInitImpl(this as any); } catch (error) { this.handleLifecycleError(error, 'ngOnInit'); } }\n  ngOnChanges(changes: SimpleChanges): void { try { ngOnChangesImpl(this as any, changes); } catch (error) { CometChatLogger.error('CometChatMessageList', 'Error in ngOnChanges:', error); } }\n  ngAfterViewInit(): void { try { ngAfterViewInitImpl(this as any); } catch (error) { this.handleLifecycleError(error, 'ngAfterViewInit'); } }\n  ngOnDestroy(): void { try { ngOnDestroyImpl(this as any); } catch (error) { CometChatLogger.error('CometChatMessageList', 'Error in ngOnDestroy:', error); } }\n  private async initializeLoggedInUser(): Promise<void> { return initializeLoggedInUserImpl(this as any); }\n  private initializeFormatters(): void { initializeFormattersImpl(this as any); }\n  private configureFormattersWithUser(): void { configureFormattersWithUserImpl(this as any); }\n  private initializeService(): void { initializeServiceImpl(this as any); }\n  private handleConversationChange(): void { handleConversationChangeImpl(this as any); }\n  private handleParentMessageIdChange(): void { handleParentMessageIdChangeImpl(this as any); }\n  private subscribeToChatStateService(): void { subscribeToChatStateServiceImpl(this as any); }\n  private scheduleDeferredConversationChange(): void { scheduleDeferredConversationChangeImpl(this as any); }\n  private handleUserChange(user: CometChat.User): void { handleUserChangeImpl(this as any, user); }\n  private handleGroupChange(group: CometChat.Group): void { handleGroupChangeImpl(this as any, group); }\n  private scrollToFirstUnreadOrBottom(): void { scrollToFirstUnreadOrBottomImpl(this as any); }\n  private subscribeToMessageEvents(): void { subscribeToMessageEventsImpl(this as any); }\n  private subscribeToGroupEvents(): void { subscribeToGroupEventsImpl(this as any); }\n  private subscribeToCallEvents(): void { subscribeToCallEventsImpl(this as any); }\n  private subscribeToUIDialogEvents(): void { subscribeToUIDialogEventsImpl(this as any); }\n  private isCallForCurrentConversation(call: CometChat.Call): boolean { return isCallForCurrentConversationImpl(this as any, call); }\n  private isMessageForCurrentConversation(message: CometChat.BaseMessage): boolean { return isMessageForCurrentConversationUtil(message, this.user || null, this.group || null, this.loggedInUser?.getUid() || ''); }\n  private updateListState(): void { updateListStateImpl(this as any); }\n  private computeMessagesWithDateSeparators(): MessageListItem[] { return computeMessagesWithDateSeparatorsImpl(this as any) as MessageListItem[]; }\n  private getReactionFingerprint(message: CometChat.BaseMessage): string { return getReactionFingerprintImpl(message); }\n  private getDateString(timestamp: number): string { return getDateStringImpl(timestamp); }\n  getDefaultSeparatorDateFormat(): CalendarObject { return { today: CometChatLocalize.getLocalizedString('today'), yesterday: CometChatLocalize.getLocalizedString('yesterday'), otherDays: 'DD MMM, YYYY' }; }\n  getDefaultStickyDateFormat(): CalendarObject { return { today: CometChatLocalize.getLocalizedString('today'), yesterday: CometChatLocalize.getLocalizedString('yesterday'), otherDays: 'DD MMM, YYYY' }; }\n  getDefaultMessageDateFormat(): CalendarObject { return { today: 'hh:mm A', yesterday: 'hh:mm A', otherDays: 'hh:mm A' }; }\n  getEffectiveSeparatorDateFormat(): CalendarObject {\n    return this.separatorDateTimeFormat || this.getDefaultSeparatorDateFormat();\n  }\n  getEffectiveStickyDateFormat(): CalendarObject {\n    return this.stickyDateTimeFormat || this.getDefaultStickyDateFormat();\n  }\n  getEffectiveMessageDateFormat(): CalendarObject {\n    return this.messageSentAtDateTimeFormat || this.getDefaultMessageDateFormat();\n  }\n  getMessageAlignment(message: CometChat.BaseMessage): MessageBubbleAlignment { return getMessageAlignmentImpl(this as any, message); }\n  getMessageOptions(message: CometChat.BaseMessage): CometChatActionsIcon[] { return getMessageOptionsImpl(this as any, message); }\n  private setupIntersectionObservers(): void { setupIntersectionObserversImpl(this as any); }\n  private async handleScrollToTop(): Promise<void> { return handleScrollToTopImpl(this as any); }\n  private handleScrollToBottom(): void { handleScrollToBottomImpl(this as any); }\n  private saveScrollPosition(): void { saveScrollPositionImpl(this as any); }\n  private restoreScrollPosition(): void { restoreScrollPositionImpl(this as any); }\n  private saveScrollPositionForReaction(): void { saveScrollPositionForReactionImpl(this as any); }\n  private disconnectObservers(): void { disconnectObserversImpl(this as any); }\n  private setupScrollListeners(): void { setupScrollListenersImpl(this as any); }\n  private updateStickyDate(): void { updateStickyDateImpl(this as any); }\n  private updateIsAtBottom(): void { updateIsAtBottomImpl(this as any); }\n  scrollToBottom(smooth = false): void { scrollToBottomImpl(this as any, smooth); }\n  private scrollToBottomAfterLoad(): void { scrollToBottomAfterLoadImpl(this as any); }\n  private scrollToBottomWithRetry(retries: number): void { scrollToBottomWithRetryImpl(this as any, retries); }\n  scrollToMessage(messageId: string | number): void { scrollToMessageImpl(this as any, messageId); }\n  private scrollToMessageWithRetry(messageId: string | number, retries: number): void { scrollToMessageWithRetryImpl(this as any, messageId, retries); }\n  private highlightAndScrollToElement(element: Element): void { highlightAndScrollToElementUtil(element); }\n  refreshMessages(): void {\n    this.messageListService.cleanup();\n    this.initializeService();\n  }\n  handleKeydown(event: KeyboardEvent): void { handleKeydownImpl(this as any, event); }\n  setFocusedIndex(index: number): void { setFocusedIndexImpl(this as any, index); }\n  getMessageTabIndex(index: number): number { return getMessageTabIndexImpl(this as any, index); }\n  announceNewMessage(senderName: string, preview: string): void { announceNewMessageImpl(this as any, senderName, preview); }\n  announceMessageSent(): void { announceMessageSentImpl(this as any); }\n  announceMessageFailed(): void { announceMessageFailedImpl(this as any); }\n  announceMessageDeleted(): void { announceMessageDeletedImpl(this as any); }\n  announceMessageEdited(): void { announceMessageEditedImpl(this as any); }\n  announceTyping(name: string): void { announceTypingImpl(this as any, name); }\n  private announceLoadingMore(): void { announceLoadingMoreImpl(this as any); }\n  showInlineToast(text: string, type: ToastType = ToastType.success, duration = 2000): void { showInlineToastImpl(this as any, text, type, duration); }\n  onInlineToastClosed(): void { if (this.inlineToastTimer) { clearTimeout(this.inlineToastTimer); } this.inlineToastText.set(null); }\n  private getMessagePreview(message: CometChat.BaseMessage): string { return getMessagePreviewUtil(message); }\n  private isMediaMessage(message: CometChat.BaseMessage): boolean { return isMediaMessageUtil(message); }\n  private focusMessageAtIndex(index: number): void { this.setFocusedIndex(index); }\n  private async markInitialMessagesAsRead(): Promise<void> { return markInitialMessagesAsReadImpl(this as any); }\n  private async handleRealtimeMessageReceipt(message: CometChat.BaseMessage): Promise<void> { return handleRealtimeMessageReceiptImpl(this as any, message); }\n  private async markMessagesReadOnScrollToBottom(): Promise<void> { return markMessagesReadOnScrollToBottomImpl(this as any); }\n  private getLatestReceiverMessage(messages: CometChat.BaseMessage[]): CometChat.BaseMessage | undefined { return getLatestReceiverMessageUtil(messages, this.loggedInUser?.getUid() || '') ?? undefined; }\n  private isReceiverMessage(message: CometChat.BaseMessage): boolean { return isReceiverMessageUtil(message, this.loggedInUser?.getUid() || ''); }\n  private isSenderMessage(message: CometChat.BaseMessage): boolean { return isSenderMessageUtil(message, this.loggedInUser?.getUid() || ''); }\n  private notifyUnreadCountChange(_count: number): void {\n    // Clear the unread count in the conversation list when messages are marked as read\n    const conversationId = this.getConversationId();\n    if (conversationId) {\n      this.conversationsService.updateConversationUnreadCount(conversationId, _count);\n    }\n    // Also clear the message list unread divider and count\n    if (_count === 0) {\n      this.unreadDividerMessageId.set(null);\n      this.markedAsUnreadCount.set(0);\n      this.showScrollToBottom.set(false);\n      this.showNewMessagesBanner.set(false);\n      this.newMessagesCount.set(0);\n    }\n  }\n  private notifyMessagesRead(message: CometChat.BaseMessage): void { notifyMessagesReadImpl(this as any, message); }\n  private getConversationId(): string | null { return getConversationIdUtil(this.user || null, this.group || null); }\n  private getConversationType(): string { return getConversationTypeUtil(this.user || null, this.group || null); }\n  private publishActiveChatChanged(): void { publishActiveChatChangedImpl(this as any); }\n  private handleNewMessages(currentMessages: CometChat.BaseMessage[]): void { handleNewMessagesImpl(this as any, currentMessages); }\n  private shouldPlaySound(message: CometChat.BaseMessage): boolean { return shouldPlaySoundImpl(this as any, message); }\n  private playMessageSound(): void { playMessageSoundImpl(this as any); }\n  private handleLifecycleError(error: unknown, hook: string): void { handleLifecycleErrorImpl(this as any, error, hook); }\n  private handleServiceError(error: Error): void { handleServiceErrorImpl(this as any, error); }\n  onBubbleError(context: ErrorContext): void { onBubbleErrorImpl(context); }\n  private handleReceiptError(error: CometChat.CometChatException, context: string): void { handleReceiptErrorImpl(this as any, error, context); }\n  private async markAsReadWithRetry(message: CometChat.BaseMessage, retryCount = 0): Promise<void> { return markAsReadWithRetryImpl(this as any, message, retryCount); }\n  private safeCheckScrollPosition(): boolean { try { return this.isAtBottom(); } catch { return true; } }\n  private safeEmitUnreadCountChange(count: number): void { try { this.notifyUnreadCountChange(count); } catch { /* ignore */ } }\n  private shouldShowSmartRepliesForMessage(message: CometChat.BaseMessage): boolean { return shouldShowSmartRepliesForMessageImpl(this as any, message); }\n  handleRetryClick(): void { this.listState.set(States.loading); this.messageListService.clearError(); this.refreshMessages(); }\n  /** Adds a message to the list (used by parent components for temporary messages). */\n  addMessage(message: CometChat.BaseMessage): void { this.messageListService.addMessage(message); }\n  /** Removes a message from the list by ID (used by parent components to remove temporary messages). */\n  removeMessage(messageId: number): void { this.messageListService.removeMessage(messageId); }\n  onUserTyping(): void {}\n  onMessageSent(): void { this.hideSmartReplies.set(true); this.hideConversationStarters.set(true); }\n  onSmartReplyClick(reply: string): void { this.smartReplyClick.emit(reply); this.hideSmartReplies.set(true); CometChatUIEvents.ccComposeMessage.next(reply); }\n  onSmartRepliesClose(): void { this.hideSmartReplies.set(true); }\n  onConversationStarterClick(starter: string): void { this.conversationStarterClick.emit(starter); this.hideConversationStarters.set(true); CometChatUIEvents.ccComposeMessage.next(starter); }\n  onNewMessagesBannerClick(): void { this.scrollToBottom(); this.showNewMessagesBanner.set(false); this.newMessagesCount.set(0); }\n  showDeleteConfirmation(message: CometChat.BaseMessage): void { showDeleteConfirmationImpl(this as any, message); }\n  async handleDeleteConfirm(): Promise<void> { return handleDeleteConfirmImpl(this as any); }\n  handleDeleteCancel(): void { handleDeleteCancelImpl(this as any); }\n  getDeleteDialogTitle(): string { return getDeleteDialogTitleImpl(); }\n  getDeleteDialogSubtitle(): string { return getDeleteDialogSubtitleImpl(); }\n  getDeleteDialogConfirmText(): string { return getDeleteDialogConfirmTextImpl(); }\n  getDeleteDialogCancelText(): string { return getDeleteDialogCancelTextImpl(); }\n  showFlagConfirmation(message: CometChat.BaseMessage): void { showFlagConfirmationImpl(this as any, message); }\n  async handleFlagConfirm(event: { message: CometChat.BaseMessage; reasonId: string; remark: string }): Promise<void> { return handleFlagConfirmImpl(this as any, event); }\n  handleFlagCancel(): void { handleFlagCancelImpl(this as any); }\n  onEditMessage(messageId: number): void { onEditMessageImpl(this as any, messageId); }\n  onReplyMessage(messageId: number): void { onReplyMessageImpl(this as any, messageId); }\n  onReplyPreviewClick(quotedMessage: CometChat.BaseMessage): void { onReplyPreviewClickImpl(this as any, quotedMessage); }\n  onMessageInfo(messageId: number): void { onMessageInfoImpl(this as any, messageId); }\n  closeMessageInfo(): void { closeMessageInfoImpl(this as any); }\n  async copyMessageToClipboard(message: CometChat.BaseMessage): Promise<void> { return copyMessageToClipboardImpl(this as any, message); }\n  handleMessagePrivately(message: CometChat.BaseMessage): void { handleMessagePrivatelyImpl(this as any, message); }\n  handleOptionClick(option: ContextMenuItem, message: CometChat.BaseMessage): void { handleOptionClickImpl(this as any, option, message); }\n  async markMessageAsUnread(message: CometChat.BaseMessage): Promise<void> { return markMessageAsUnreadImpl(this as any, message); }\n  showEmojiKeyboardForMessage(message: CometChat.BaseMessage): void { showEmojiKeyboardForMessageImpl(this as any, message); }\n  private calculateEmojiKeyboardPosition(message: CometChat.BaseMessage): void { calculateEmojiKeyboardPositionImpl(this as any, message); }\n  async onEmojiSelected(emoji: string): Promise<void> { return onEmojiSelectedImpl(this as any, emoji); }\n  onEmojiKeyboardClose(): void { onEmojiKeyboardCloseImpl(this as any); }\n  async onBubbleReactionClick(event: { reaction: CometChat.ReactionCount; message: CometChat.BaseMessage }): Promise<void> { return onBubbleReactionClickImpl(this as any, event); }\n  async onBubbleReactionListItemClick(event: { reaction: CometChat.Reaction; message: CometChat.BaseMessage }): Promise<void> { return onBubbleReactionListItemClickImpl(this as any, event); }\n  async translateMessage(message: CometChat.BaseMessage): Promise<void> { return translateMessageImpl(this as any, message); }\n  getTranslatedText(messageId: number): string | undefined { return getTranslatedTextImpl(this as any, messageId); }\n  isMessageTranslating(messageId: number): boolean { return isMessageTranslatingImpl(this as any, messageId); }\n  isMessageTranslated(messageId: number): boolean { return isMessageTranslatedImpl(this as any, messageId); }\n  private getDefaultTranslationLanguage(): string { return getDefaultTranslationLanguageImpl(); }\n  setPreferredTranslationLanguage(language: string): void { setPreferredTranslationLanguageImpl(this as any, language); }\n  trackByItem(_index: number, item: MessageListItem): string { return item.key; }\n  trackByMessage(_index: number, message: CometChat.BaseMessage): string | number {\n    return message.getId() || message.getMuid();\n  }\n}\n","<!-- CometChatMessageList Component Template -->\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'MessageList'\">\n<div\n  class=\"cometchat-message-list\"\n  [class.cometchat-message-list--show-scrollbar]=\"effectiveShowScrollbar()\"\n  [class.cometchat-message-list--thread]=\"!!parentMessageId\"\n  [class.cometchat-message-list--agent-chat]=\"isAgentChat\"\n  (keydown)=\"handleKeydown($event)\"\n  role=\"log\"\n  [attr.aria-label]=\"'message_list_aria_label' | translate\"\n  aria-live=\"off\"\n  [attr.aria-busy]=\"isFetchingPrevious() || isFetchingNext() || listState() === States.loading\"\n>\n  <!-- Header View -->\n  @if (effectiveHeaderView) {\n    <div class=\"cometchat-message-list__header\">\n      <ng-container *ngTemplateOutlet=\"effectiveHeaderView\"></ng-container>\n    </div>\n  }\n\n  <!-- Sticky Date Header -->\n  @if (!hideStickyDate && showStickyDateHeader() && !isFetchingPrevious() && !isFetchingNext()) {\n    <div class=\"cometchat-message-list__sticky-date\">\n      <cometchat-date\n        [timestamp]=\"stickyDateTimestamp()\"\n        [calendarObject]=\"getEffectiveStickyDateFormat()\">\n      </cometchat-date>\n    </div>\n  }\n\n  <!-- Main Content Container -->\n  <div\n    #listContainer\n    class=\"cometchat-message-list__container\"\n    [class.cometchat-message-list__container--scrollable]=\"true\"\n    [class.cometchat-message-list__container--loading]=\"listState() === States.loading\"\n  >\n    <!-- Loading State -->\n    @if (listState() === States.loading) {\n      <div class=\"cometchat-message-list__loading\">\n        @if (effectiveLoadingView) {\n          <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n        } @else {\n          <!-- Default Loading Shimmer -->\n          <div class=\"cometchat-message-list__shimmer\">\n            <!-- Date Separator Shimmer -->\n            <div class=\"cometchat-message-list__shimmer-date\">\n              <div class=\"cometchat-message-list__shimmer-date-item\"></div>\n            </div>\n\n            <!-- Message Shimmers -->\n            @if (messageAlignment === MessageListAlignment.left) {\n              <!-- Left alignment: All messages on left with avatar and header -->\n              @for (i of shimmerList; track i) {\n                <div class=\"cometchat-message-list__shimmer-wrapper cometchat-message-list__shimmer-wrapper--left\">\n                  <div class=\"cometchat-message-list__shimmer-avatar\"></div>\n                  <div class=\"cometchat-message-list__shimmer-body\">\n                    <div class=\"cometchat-message-list__shimmer-header\"></div>\n                    <div class=\"cometchat-message-list__shimmer-bubble\"></div>\n                  </div>\n                </div>\n              }\n            } @else {\n              <!-- Standard alignment: Alternating left (incoming) and right (outgoing) -->\n              @for (i of shimmerList; track i) {\n                @if (i % 2 === 0) {\n                  <!-- Left-aligned (incoming) message with avatar and header -->\n                  <div class=\"cometchat-message-list__shimmer-wrapper cometchat-message-list__shimmer-wrapper--left\">\n                    <div class=\"cometchat-message-list__shimmer-avatar\"></div>\n                    <div class=\"cometchat-message-list__shimmer-body\">\n                      <div class=\"cometchat-message-list__shimmer-header\"></div>\n                      <div class=\"cometchat-message-list__shimmer-bubble\"></div>\n                    </div>\n                  </div>\n                } @else {\n                  <!-- Right-aligned (outgoing) message without avatar -->\n                  <div class=\"cometchat-message-list__shimmer-wrapper cometchat-message-list__shimmer-wrapper--right\">\n                    <div class=\"cometchat-message-list__shimmer-body\">\n                      <div class=\"cometchat-message-list__shimmer-bubble\"></div>\n                    </div>\n                  </div>\n                }\n              }\n            }\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Empty State -->\n    @if (listState() === States.empty && effectiveEmptyView) {\n      <div class=\"cometchat-message-list__empty\">\n        <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n      </div>\n    }\n\n    <!-- Error State -->\n    @if (listState() === States.error && !effectiveHideError()) {\n      <div class=\"cometchat-message-list__error\">\n        @if (effectiveErrorView) {\n          <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n        } @else {\n          <!-- Default Error State -->\n          <div class=\"cometchat-message-list__error-content\">\n            <div class=\"cometchat-message-list__error-icon\">\n              <span class=\"cometchat-message-list__error-icon-mask\" aria-hidden=\"true\"></span>\n            </div>\n            <p class=\"cometchat-message-list__error-text\">\n              {{ 'component_error_retry' | translate }}\n            </p>\n            <cometchat-button\n              [text]=\"'retry' | translate\"\n              (click)=\"handleRetryClick()\">\n            </cometchat-button>\n          </div>\n        }\n      </div>\n    }\n\n    <!-- Loaded State - Message List -->\n    @if (listState() === States.loaded) {\n      <!-- Scroll Top Anchor for IntersectionObserver -->\n      <div #scrollTopAnchor class=\"cometchat-message-list__scroll-anchor\"></div>\n\n      <!-- Loading indicator for previous messages -->\n      @if (isFetchingPrevious()) {\n        <div class=\"cometchat-message-list__loading-more\">\n          <div class=\"cometchat-message-list__spinner\"></div>\n        </div>\n      }\n\n      <!-- Messages with Date Separators -->\n      <div class=\"cometchat-message-list__messages\">\n        @for (item of messagesWithSeparators(); track item.key; let i = $index) {\n          @if (item.type === 'date-separator' && !hideDateSeparator) {\n            <!-- Date Separator -->\n            <div class=\"cometchat-message-list__date-separator\">\n              <div class=\"cometchat-message-list__date-separator-line\"></div>\n              <cometchat-date\n                [timestamp]=\"item.date!\"\n                [calendarObject]=\"getEffectiveSeparatorDateFormat()\">\n              </cometchat-date>\n              <div class=\"cometchat-message-list__date-separator-line\"></div>\n            </div>\n          } @else if (item.message) {\n            <!-- Unread Divider - shown above the message that was marked as unread -->\n            @if (unreadDividerMessageId() !== null && item.message.getId() === unreadDividerMessageId()) {\n              <div class=\"cometchat-message-list__unread-divider\" role=\"separator\" aria-label=\"{{ 'message_list_unread_divider' | translate }}\">\n                <div class=\"cometchat-message-list__unread-divider-line\"></div>\n                <span class=\"cometchat-message-list__unread-divider-text\">{{ 'message_list_unread_messages' | translate }}</span>\n                <div class=\"cometchat-message-list__unread-divider-line\"></div>\n              </div>\n            }\n            <!-- Message Bubble -->\n            <div\n              class=\"cometchat-message-list__message\"\n              [class.cometchat-message-list__message--focused]=\"focusedMessageIndex() === i\"\n              [attr.data-message-id]=\"item.message.getId() || item.message.getMuid()\"\n              [attr.data-index]=\"i\"\n              [attr.tabindex]=\"getMessageTabIndex(i)\"\n              role=\"article\"\n              [attr.aria-label]=\"'message_aria_label' | translate\"\n            >\n              <cometchat-error-boundary\n                [componentName]=\"'MessageBubble:' + item.message.getType()\"\n                [fallbackView]=\"bubbleFallback\"\n                (error)=\"onBubbleError($event)\">\n                <cometchat-message-bubble\n                  [message]=\"item.message\"\n                  [alignment]=\"getMessageAlignment(item.message)\"\n                  [hideReceipts]=\"effectiveHideReceipts() || item.isLastInBatch === false\"\n                  [hideAvatar]=\"effectiveHideAvatar() || item.isFirstInBatch === false\"\n                  [reserveLeadingSpace]=\"item.isFirstInBatch === false\"\n                  [hideTimestamp]=\"hideTimestamp || (isAgentChat && getMessageAlignment(item.message) !== MessageBubbleAlignment.right) || item.isLastInBatch === false\"\n                  [hideStatusInfoView]=\"(isAgentChat && getMessageAlignment(item.message) !== MessageBubbleAlignment.right) || item.isLastInBatch === false\"\n                  [hideSenderName]=\"isAgentChat || item.isFirstInBatch === false\"\n                  [hideModerationView]=\"effectiveHideModerationView()\"\n                  [textFormatters]=\"activeFormatters\"\n                  [dateFormat]=\"getEffectiveMessageDateFormat()\"\n                  [options]=\"isAgentChat ? [] : getMessageOptions(item.message)\"\n                  [quickOptionsCount]=\"quickOptionsCount\"\n                  [group]=\"group || null\"\n                  [translatedText]=\"getTranslatedText(item.message.getId())\"\n                  [reactionsRequestBuilder]=\"reactionsRequestBuilder\"\n                  [disableInteraction]=\"disableInteraction\"\n                  [hideThreadView]=\"isAgentChat\"\n                  [footerView]=\"bubbleFooterView\"\n                  (optionClick)=\"handleOptionClick($event, item.message)\"\n                  (reactionClick)=\"onBubbleReactionClick($event)\"\n                  (reactionListItemClick)=\"onBubbleReactionListItemClick($event)\"\n                  (replyPreviewClick)=\"onReplyPreviewClick($event)\"\n                  (threadRepliesClick)=\"threadRepliesClick.emit($event)\">\n                </cometchat-message-bubble>\n              </cometchat-error-boundary>\n            </div>\n          }\n        }\n      </div>\n\n      <!-- Loading indicator for next messages -->\n      @if (isFetchingNext()) {\n        <div class=\"cometchat-message-list__loading-more\">\n          <div class=\"cometchat-message-list__spinner\"></div>\n        </div>\n      }\n\n      <!-- Scroll Bottom Anchor for IntersectionObserver -->\n      <div #scrollBottomAnchor class=\"cometchat-message-list__scroll-anchor\"></div>\n\n      <!-- Append View: custom content rendered inside the scroll container after messages -->\n      @if (appendView) {\n        <ng-container *ngTemplateOutlet=\"appendView\"></ng-container>\n      }\n    }\n  </div>\n\n  <!-- Footer Panel (Conversation Summary) -->\n  @if (showFooterPanel() && footerPanelConfig() && !parentMessageId) {\n    <div class=\"cometchat-message-list__footer-panel\">\n      <cometchat-conversation-summary\n        [getConversationSummary]=\"$any(footerPanelConfig()!.configuration?.['getConversationSummary'])\"\n        [closeCallback]=\"$any(footerPanelConfig()!.configuration?.['closeCallback'])\">\n      </cometchat-conversation-summary>\n    </div>\n  }\n\n  <!-- Smart Replies -->\n  @if (shouldShowSmartReplies()) {\n    <div class=\"cometchat-message-list__smart-replies\">\n      <cometchat-smart-replies\n        [message]=\"lastReceivedMessage()\"\n        [user]=\"user\"\n        [group]=\"group\"\n        [keywords]=\"smartRepliesKeywords\"\n        [delayDuration]=\"smartRepliesDelayDuration\"\n        (replyClick)=\"onSmartReplyClick($event)\"\n        (closeClick)=\"onSmartRepliesClose()\">\n      </cometchat-smart-replies>\n    </div>\n  }\n          @if (shouldShowConversationStarters()) {\n          <div class=\"cometchat-message-list__conversation-starters\">\n            <cometchat-conversation-starter\n              [user]=\"user\"\n              [group]=\"group\"\n              (starterClick)=\"onConversationStarterClick($event)\">\n            </cometchat-conversation-starter>\n          </div>\n        }\n\n  <!-- Scroll to Bottom Button with Unread Badge -->\n  @if (showScrollToBottom()) {\n    <div class=\"cometchat-message-list__scroll-to-bottom\">\n      <!-- Unread Count Badge - shows markedAsUnreadCount (from markAsUnread) or newMessagesCount -->\n      @if (markedAsUnreadCount() > 0 || newMessagesCount() > 0 || unreadCount() > 0) {\n        <div class=\"cometchat-message-list__unread-badge\"\n             role=\"status\"\n             aria-live=\"polite\"\n             [attr.aria-label]=\"(markedAsUnreadCount() || newMessagesCount() || unreadCount()) + ' unread messages'\">\n          {{ markedAsUnreadCount() || newMessagesCount() || unreadCount() }}\n        </div>\n      }\n      <cometchat-button\n        [iconURL]=\"'assets/dropdown-arrow.svg'\"\n        [iconOnly]=\"true\"\n        (click)=\"scrollToBottom()\"\n        [ariaLabel]=\"'scroll_to_bottom' | translate\"\n        [tabindex]=\"0\">\n      </cometchat-button>\n    </div>\n  }\n\n  <!-- Footer View -->\n  @if (effectiveFooterView) {\n    <div class=\"cometchat-message-list__footer\">\n      <ng-container *ngTemplateOutlet=\"effectiveFooterView\"></ng-container>\n    </div>\n  }\n\n  <!-- Inline Toast Notification -->\n  @if (inlineToastText()) {\n    <div class=\"cometchat-message-list__toast\">\n      <cometchat-toast\n        [text]=\"inlineToastText()!\"\n        [type]=\"inlineToastType()\"\n        [inline]=\"true\"\n        [duration]=\"0\"\n        [showCloseButton]=\"false\"\n        (toastClosed)=\"onInlineToastClosed()\">\n      </cometchat-toast>\n    </div>\n  }\n\n  <!-- Delete Confirmation Dialog -->\n  @if (showDeleteConfirmDialog()) {\n    <div class=\"cometchat-message-list__dialog-overlay\">\n      <cometchat-confirm-dialog\n        [title]=\"getDeleteDialogTitle()\"\n        [messageText]=\"getDeleteDialogSubtitle()\"\n        [confirmButtonText]=\"getDeleteDialogConfirmText()\"\n        [cancelButtonText]=\"getDeleteDialogCancelText()\"\n        (confirmClick)=\"handleDeleteConfirm()\"\n        (cancelClick)=\"handleDeleteCancel()\">\n      </cometchat-confirm-dialog>\n    </div>\n  }\n\n  <!-- Flag Message Dialog -->\n  @if (showFlagMessageDialog()) {\n    <div class=\"cometchat-message-list__dialog-overlay\">\n      <cometchat-flag-message-dialog\n        [message]=\"messageToFlag()!\"\n        [hideRemarkField]=\"hideFlagRemarkField\"\n        (confirm)=\"handleFlagConfirm($event)\"\n        (cancel)=\"handleFlagCancel()\">\n      </cometchat-flag-message-dialog>\n    </div>\n  }\n\n  <!-- Message Information Panel -->\n  @if (showMessageInfo()) {\n    <div class=\"cometchat-message-list__info-panel\">\n      <cometchat-message-information\n        [message]=\"messageForInfo()!\"\n        [dateTimeFormat]=\"messageInfoDateTimeFormat\"\n        [textFormatters]=\"activeFormatters\"\n        [showScrollbar]=\"false\"\n        (closeClick)=\"closeMessageInfo()\">\n      </cometchat-message-information>\n    </div>\n  }\n\n  <!-- Emoji Keyboard for Reactions -->\n  @if (emojiKeyboardMessage() && emojiKeyboardPosition()) {\n    <div\n      class=\"cometchat-message-list__emoji-keyboard-backdrop\"\n      (click)=\"onEmojiKeyboardClose()\">\n    </div>\n    <div\n      class=\"cometchat-message-list__emoji-keyboard-wrapper\"\n      [style.top.px]=\"emojiKeyboardPosition()!.top\"\n      [style.left.px]=\"emojiKeyboardPosition()!.left\"\n      (click)=\"$event.stopPropagation()\">\n      <cometchat-emoji-keyboard\n        (emojiClick)=\"onEmojiSelected($event)\"\n        (closeKeyboard)=\"onEmojiKeyboardClose()\">\n      </cometchat-emoji-keyboard>\n    </div>\n  }\n</div>\n</cometchat-error-boundary>\n\n<!-- Bubble Error Fallback Template -->\n<ng-template #bubbleFallback let-ctx>\n  <div class=\"cometchat-message-list__bubble-error\">\n    <span class=\"cometchat-message-list__bubble-error-text\">{{ 'message_bubble_render_error' | translate }}</span>\n  </div>\n</ng-template>\n","/**\n * Public API for CometChatMessageList component\n */\n\n// Component\nexport { CometChatMessageListComponent } from './cometchat-message-list.component';\n\n// Types\nexport type { MessageListItem } from './cometchat-message-list.component';\n\n// Service (re-export from services for convenience)\nexport { MessageListService } from '../../services/message-list.service';\n\n// Enums (re-export from Enums for convenience)\nexport { States, MessageListAlignment, MessageBubbleAlignment } from '../../Enums/Enums';\n\n// Types and Interfaces (re-export from their original locations)\nexport type { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nexport { CometChatTextFormatter } from '../../formatters/cometchat-text-formatter';\nexport { CometChatOption } from '../../modals/CometChatOption';\n","/**\n * CometChatThreadHeader displays the header for threaded message views.\n * Shows parent message preview, reply count, and close button.\n * @see Requirements 7.1-7.6, 14.1-14.6\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  HostListener,\n  OnInit,\n  OnDestroy,\n  OnChanges,\n  SimpleChanges,\n  inject,\n  DestroyRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatMessageBubbleComponent } from '../cometchat-message-bubble/cometchat-message-bubble.component';\nimport { MessageBubbleAlignment, MessageStatus } from '../../Enums/Enums';\nimport { CometChatUIKit } from '../../cometchat-uikit';\nimport { CometChatMessageEvents, IMessages } from '../../events/CometChatMessageEvents';\n\nconst MAX_PREVIEW_LENGTH = 50;\n\n@Component({\n  selector: 'cometchat-thread-header',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe, CometChatMessageBubbleComponent],\n  templateUrl: './cometchat-thread-header.component.html',\n  styleUrls: ['./cometchat-thread-header.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatThreadHeaderComponent implements OnInit, OnDestroy, OnChanges {\n  private cdr = inject(ChangeDetectorRef);\n  private readonly destroyRef = inject(DestroyRef);\n  private messageListenerId = '';\n  private processedMessageIds = new Set<number>();\n\n  @Input() parentMessage!: CometChat.BaseMessage;\n  @Input() replyCount = 0;\n\n  protected internalReplyCount = 0;\n\n  @Output() closeClick = new EventEmitter<void>();\n  /** @deprecated Use closeClick instead. */\n  @Output() backClick = new EventEmitter<void>();\n\n  get messagePreview(): string {\n    if (!this.parentMessage) return '';\n    const messageType = this.parentMessage.getType();\n    if (messageType === CometChat.MESSAGE_TYPE.TEXT) {\n      const text = (this.parentMessage as CometChat.TextMessage).getText() || '';\n      return text.length > MAX_PREVIEW_LENGTH ? text.substring(0, MAX_PREVIEW_LENGTH) + '...' : text;\n    }\n    const subtitleMap: Record<string, string> = {\n      [CometChat.MESSAGE_TYPE.IMAGE]: 'conversation_subtitle_image',\n      [CometChat.MESSAGE_TYPE.VIDEO]: 'conversation_subtitle_video',\n      [CometChat.MESSAGE_TYPE.AUDIO]: 'conversation_subtitle_audio',\n      [CometChat.MESSAGE_TYPE.FILE]: 'conversation_subtitle_file',\n    };\n    return CometChatLocalize.getLocalizedString(subtitleMap[messageType] || 'message');\n  }\n\n  get mediaIcon(): string | null {\n    if (!this.parentMessage) return null;\n    const iconMap: Record<string, string> = {\n      [CometChat.MESSAGE_TYPE.IMAGE]: 'assets/conversations_image-message.svg',\n      [CometChat.MESSAGE_TYPE.VIDEO]: 'assets/conversations_video-message.svg',\n      [CometChat.MESSAGE_TYPE.AUDIO]: 'assets/conversations_audio-message.svg',\n      [CometChat.MESSAGE_TYPE.FILE]: 'assets/conversations_file-message.svg',\n    };\n    return iconMap[this.parentMessage.getType()] || null;\n  }\n\n  get replyCountText(): string {\n    const displayCount = this.internalReplyCount > 999 ? '999+' : this.internalReplyCount;\n    return this.internalReplyCount === 1\n      ? `${displayCount} ${CometChatLocalize.getLocalizedString('thread_reply')}`\n      : `${displayCount} ${CometChatLocalize.getLocalizedString('thread_replies')}`;\n  }\n\n  get ariaLabel(): string {\n    const count = this.internalReplyCount > 999 ? '999+' : this.internalReplyCount.toString();\n    return CometChatLocalize.getLocalizedString('accessibility_thread_header').replace('{preview}', this.messagePreview).replace('{count}', count);\n  }\n\n  get closeButtonAriaLabel(): string { return CometChatLocalize.getLocalizedString('accessibility_close_thread'); }\n  /** @deprecated Use closeButtonAriaLabel instead. */\n  get backButtonAriaLabel(): string { return this.closeButtonAriaLabel; }\n  get isMediaMessage(): boolean { return this.mediaIcon !== null; }\n\n  get senderName(): string {\n    if (!this.parentMessage) return '';\n    return this.parentMessage.getSender()?.getName() || '';\n  }\n\n  /**\n   * Determines the alignment for the parent message bubble.\n   * Right-aligned if sent by the logged-in user, left otherwise.\n   */\n  get parentMessageAlignment(): MessageBubbleAlignment {\n    if (!this.parentMessage) return MessageBubbleAlignment.left;\n\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    if (!loggedInUser) return MessageBubbleAlignment.left;\n\n    return this.parentMessage.getSender()?.getUid() === loggedInUser.getUid()\n      ? MessageBubbleAlignment.right\n      : MessageBubbleAlignment.left;\n  }\n\n  // ==================== Event Handlers ====================\n\n  /**\n   * Handles close button click.\n   * Emits both closeClick and backClick for backward compatibility.\n   * @see Requirement 7.4, 14.2\n   */\n  onCloseClick(): void {\n    this.closeClick.emit();\n    this.backClick.emit(); // Backward compatibility\n  }\n\n  /**\n   * @deprecated Use onCloseClick instead.\n   */\n  onBackClick(): void {\n    this.onCloseClick();\n  }\n\n  /**\n   * Handles keyboard events for the close button.\n   * Activates on Enter or Space key.\n   * @see Requirement 14.2\n   */\n  onCloseKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onCloseClick();\n    }\n  }\n\n  /**\n   * @deprecated Use onCloseKeydown instead.\n   */\n  onBackKeydown(event: KeyboardEvent): void {\n    this.onCloseKeydown(event);\n  }\n\n  /**\n   * Handles keyboard events on the header container.\n   * Closes thread on Escape key press.\n   * @see Requirement 14.3\n   */\n  @HostListener('keydown', ['$event'])\n  onHeaderKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      event.stopPropagation();\n      this.onCloseClick();\n    }\n  }\n\n  // ==================== Lifecycle Hooks ====================\n\n  ngOnInit(): void {\n    this.internalReplyCount = this.replyCount || this.parentMessage?.getReplyCount?.() || 0;\n    this.messageListenerId = `thread_header_${Date.now()}`;\n    this.subscribeToMessageEvents();\n    this.attachSdkListener();\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['replyCount'] && !changes['replyCount'].firstChange) {\n      // Only update if the new value is greater (to handle SDK updates)\n      // This prevents resetting when the parent component passes updated count\n      const newCount = changes['replyCount'].currentValue;\n      if (newCount > this.internalReplyCount) {\n        this.internalReplyCount = newCount;\n      }\n    }\n    if (changes['parentMessage'] && !changes['parentMessage'].firstChange) {\n      // Re-subscribe when parent message changes\n      this.processedMessageIds.clear();\n      this.internalReplyCount = this.replyCount || this.parentMessage?.getReplyCount?.() || 0;\n      this.removeSdkListener();\n      this.subscribeToMessageEvents();\n      this.attachSdkListener();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.removeSdkListener();\n  }\n\n  // ==================== Private Methods ====================\n\n  /**\n   * Increment reply count if message hasn't been processed yet.\n   * Prevents double counting from multiple event sources.\n   */\n  private incrementReplyCount(message: CometChat.BaseMessage): void {\n    const messageId = message.getId();\n    if (messageId && !this.processedMessageIds.has(messageId)) {\n      this.processedMessageIds.add(messageId);\n      this.internalReplyCount++;\n      this.cdr.markForCheck();\n    }\n  }\n\n  /**\n   * Subscribe to UI message events for sent messages by current user.\n   */\n  private subscribeToMessageEvents(): void {\n    if (!this.parentMessage) return;\n\n    const parentId = this.parentMessage.getId();\n\n    // Handle messages sent by current user (UI event)\n    CometChatMessageEvents.ccMessageSent.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((data: IMessages) => {\n      if (\n        data.status === MessageStatus.success &&\n        data.message?.getParentMessageId() === parentId\n      ) {\n        this.incrementReplyCount(data.message);\n      }\n    });\n  }\n\n  /**\n   * Attach SDK message listener for real-time received messages.\n   * This is needed because the Angular UIKit doesn't have a global\n   * SDK event initializer like React UIKit does.\n   */\n  private attachSdkListener(): void {\n    if (!this.parentMessage) return;\n\n    const parentId = this.parentMessage.getId();\n    const loggedInUser = CometChatUIKit.getLoggedInUser();\n    const loggedInUid = loggedInUser?.getUid();\n\n    CometChat.addMessageListener(\n      this.messageListenerId,\n      new CometChat.MessageListener({\n        onTextMessageReceived: (message: CometChat.TextMessage) => {\n          if (\n            message?.getParentMessageId() === parentId &&\n            message.getSender()?.getUid() !== loggedInUid\n          ) {\n            this.incrementReplyCount(message);\n          }\n        },\n        onMediaMessageReceived: (message: CometChat.MediaMessage) => {\n          if (\n            message?.getParentMessageId() === parentId &&\n            message.getSender()?.getUid() !== loggedInUid\n          ) {\n            this.incrementReplyCount(message);\n          }\n        },\n        onCustomMessageReceived: (message: CometChat.CustomMessage) => {\n          if (\n            message?.getParentMessageId() === parentId &&\n            message.getSender()?.getUid() !== loggedInUid\n          ) {\n            this.incrementReplyCount(message);\n          }\n        },\n        onInteractiveMessageReceived: (message: CometChat.InteractiveMessage) => {\n          if (\n            message?.getParentMessageId() === parentId &&\n            message.getSender()?.getUid() !== loggedInUid\n          ) {\n            this.incrementReplyCount(message);\n          }\n        },\n      })\n    );\n  }\n\n  /**\n   * Remove SDK message listener.\n   */\n  private removeSdkListener(): void {\n    if (this.messageListenerId) {\n      CometChat.removeMessageListener(this.messageListenerId);\n    }\n  }\n\n}\n","<!--\n  CometChatThreadHeader Component Template\n  \n  Displays the header for threaded message views with:\n  - Close button to return to main chat\n  - Thread title and reply count\n  - Parent message rendered as a full message bubble with sender/receiver alignment\n  \n  Accessibility Features:\n  - role=\"banner\" for semantic structure\n  - aria-label with preview and reply count\n  - Close button with aria-label=\"Close thread\"\n  - Keyboard support: Enter/Space on close button, Escape on header\n  \n  Requirements: 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 14.1-14.6\n-->\n\n<div \n  class=\"cometchat cometchat-thread-header\"\n  role=\"banner\"\n  [attr.aria-label]=\"ariaLabel\">\n\n  <!-- ==================== Top Bar: Title + Sender + Close Button ==================== -->\n  <div class=\"cometchat-thread-header__top-bar\">\n    <div class=\"cometchat-thread-header__content\">\n      <span class=\"cometchat-thread-header__title\">\n        {{ 'thread_title' | translate }}\n      </span>\n      @if (senderName) {\n        <span class=\"cometchat-thread-header__sender-name\">\n          {{ senderName }}\n        </span>\n      }\n    </div>\n\n    <div class=\"cometchat-thread-header__close-button-wrapper\">\n      <button\n        type=\"button\"\n        class=\"cometchat-thread-header__close-button\"\n        [attr.aria-label]=\"closeButtonAriaLabel\"\n        tabindex=\"0\"\n        (click)=\"onCloseClick()\"\n        (keydown)=\"onCloseKeydown($event)\">\n        <span \n          class=\"cometchat-thread-header__close-button-icon\"\n          aria-hidden=\"true\">\n        </span>\n      </button>\n    </div>\n  </div>\n\n  <!-- ==================== Parent Message Bubble ==================== -->\n  @if (parentMessage) {\n    <div class=\"cometchat-thread-header__bubble-wrapper\">\n      <cometchat-message-bubble\n        [message]=\"parentMessage\"\n        [alignment]=\"parentMessageAlignment\"\n        [threadView]=\"emptyThreadView\"\n        [options]=\"[]\"\n        [disableInteraction]=\"true\">\n      </cometchat-message-bubble>\n    </div>\n  }\n\n  <!-- ==================== Reply Count with Divider ==================== -->\n  <div class=\"cometchat-thread-header__reply-count\">\n    <span class=\"cometchat-thread-header__reply-count-text\">\n      {{ replyCountText }}\n    </span>\n    <span class=\"cometchat-thread-header__reply-count-divider\"></span>\n  </div>\n\n  <ng-template #emptyThreadView></ng-template>\n\n</div>\n","/**\n * Public API for CometChatThreadHeader component\n */\nexport * from './cometchat-thread-header.component';\n","import { Component, Input, ChangeDetectionStrategy, computed, signal } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * CometChatTypingIndicatorComponent displays a typing indicator when users are typing.\n *\n * This component shows different text based on the context:\n * - 1-on-1 chats: \"typing...\" or \"{name} is typing...\"\n * - Group chats with one user: \"{name} is typing...\"\n * - Group chats with multiple users: \"Multiple people are typing...\"\n *\n * The component includes animated dots to indicate ongoing typing activity.\n *\n * @example\n * ```html\n * <!-- Basic usage -->\n * <cometchat-typing-indicator\n *   [typingUsers]=\"typingUsersArray\"\n *   [isGroupChat]=\"false\">\n * </cometchat-typing-indicator>\n *\n * <!-- Group chat usage -->\n * <cometchat-typing-indicator\n *   [typingUsers]=\"typingUsersArray\"\n *   [isGroupChat]=\"true\">\n * </cometchat-typing-indicator>\n * ```\n *\n * @see Requirement 1.1 - Display typing indicator when another user is typing\n * @see Requirement 1.2 - Show user's name or \"typing...\" for 1-on-1 chats\n * @see Requirement 1.3 - Show \"{name} is typing...\" for group chats\n * @see Requirement 1.4 - Show \"Multiple people are typing...\" for multiple users\n * @see Requirement 1.6 - Positioned at bottom of message list\n */\n@Component({\n  selector: 'cometchat-typing-indicator',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe],\n  templateUrl: './cometchat-typing-indicator.component.html',\n  styleUrls: ['./cometchat-typing-indicator.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatTypingIndicatorComponent {\n  /**\n   * Array of users currently typing.\n   * Each TypingIndicator contains information about the user who is typing.\n   *\n   * @see Requirement 1.1 - Display typing indicator when another user is typing\n   */\n  @Input()\n  set typingUsers(value: CometChat.TypingIndicator[]) {\n    this.typingUsersSignal.set(value);\n  }\n  get typingUsers(): CometChat.TypingIndicator[] {\n    return this.typingUsersSignal();\n  }\n\n  /**\n   * Whether this is a group conversation.\n   * Affects how the typing text is displayed.\n   *\n   * @see Requirement 1.2 - Different display for 1-on-1 vs group chats\n   * @see Requirement 1.3 - Show \"{name} is typing...\" for group chats\n   */\n  @Input()\n  set isGroupChat(value: boolean) {\n    this.isGroupChatSignal.set(value);\n  }\n  get isGroupChat(): boolean {\n    return this.isGroupChatSignal();\n  }\n\n  /** Internal signal for typing users */\n  private typingUsersSignal = signal<CometChat.TypingIndicator[]>([]);\n\n  /** Internal signal for group chat flag */\n  private isGroupChatSignal = signal<boolean>(false);\n\n  /**\n   * Computed display text based on typing users and chat type.\n   *\n   * Logic:\n   * - No typing users: empty string (component should be hidden)\n   * - 1-on-1 chat: \"typing...\" (uses message_header_typing key)\n   * - Group chat with 1 user: \"{name} is typing...\" (uses message_header_is_typing key)\n   * - Group chat with 2 users: \"{name1} and {name2} are typing...\" (uses message_header_are_typing key)\n   * - Group chat with 3+ users: \"Multiple people are typing...\" (uses message_header_others_typing key)\n   *\n   * @see Requirement 1.2 - Show \"typing...\" for 1-on-1 chats\n   * @see Requirement 1.3 - Show \"{name} is typing...\" for group chats\n   * @see Requirement 1.4 - Show \"Multiple people are typing...\" for multiple users\n   */\n  displayText = computed<string>(() => {\n    const users = this.typingUsersSignal();\n    const isGroup = this.isGroupChatSignal();\n\n    if (!users || users.length === 0) {\n      return '';\n    }\n\n    // For 1-on-1 chats, just show \"typing...\"\n    if (!isGroup) {\n      return 'message_header_typing';\n    }\n\n    // For group chats, show name(s)\n    if (users.length === 1) {\n      // Single user typing in group: \"{name} is typing...\"\n      return 'message_header_is_typing';\n    } else if (users.length === 2) {\n      // Two users typing: \"{name1} and {name2} are typing...\"\n      return 'message_header_are_typing';\n    } else {\n      // Multiple users (3+): \"Multiple people are typing...\"\n      return 'message_header_others_typing';\n    }\n  });\n\n  /**\n   * Get the name of the first typing user.\n   * Used for single user typing display.\n   */\n  get firstTypingUserName(): string {\n    const users = this.typingUsersSignal();\n    if (users && users.length > 0) {\n      const sender = users[0].getSender();\n      return sender?.getName() || '';\n    }\n    return '';\n  }\n\n  /**\n   * Get the name of the second typing user.\n   * Used for two users typing display.\n   */\n  get secondTypingUserName(): string {\n    const users = this.typingUsersSignal();\n    if (users && users.length > 1) {\n      const sender = users[1].getSender();\n      return sender?.getName() || '';\n    }\n    return '';\n  }\n\n  /**\n   * Check if there are any typing users.\n   * Used to conditionally show/hide the component.\n   */\n  get hasTypingUsers(): boolean {\n    const users = this.typingUsersSignal();\n    return users && users.length > 0;\n  }\n\n  /**\n   * Get the number of typing users.\n   * Used for determining display format.\n   */\n  get typingUsersCount(): number {\n    const users = this.typingUsersSignal();\n    return users ? users.length : 0;\n  }\n\n  /**\n   * Generates an accessible label for screen readers.\n   * Describes who is typing for assistive technologies.\n   */\n  get ariaLabel(): string {\n    const users = this.typingUsersSignal();\n    const isGroup = this.isGroupChatSignal();\n\n    if (!users || users.length === 0) {\n      return '';\n    }\n\n    if (!isGroup) {\n      return CometChatLocalize.getLocalizedString('accessibility_typing');\n    }\n\n    if (users.length === 1) {\n      const name = this.firstTypingUserName;\n      return CometChatLocalize.getLocalizedString('accessibility_user_is_typing').replace('{name}', name);\n    } else if (users.length === 2) {\n      return CometChatLocalize.getLocalizedString('accessibility_two_users_typing')\n        .replace('{name1}', this.firstTypingUserName)\n        .replace('{name2}', this.secondTypingUserName);\n    } else {\n      return CometChatLocalize.getLocalizedString('accessibility_multiple_users_typing');\n    }\n  }\n}\n","@if (hasTypingUsers) {\n  <div\n    class=\"cometchat-typing-indicator\"\n    role=\"status\"\n    aria-live=\"polite\"\n  >\n    <div class=\"cometchat-typing-indicator__content\">\n      <!-- Display text based on context -->\n      @if (!isGroupChat) {\n        <!-- 1-on-1 chat: \"typing...\" -->\n        <span class=\"cometchat-typing-indicator__text\">\n          {{ 'message_header_typing' | translate }}\n        </span>\n      } @else if (typingUsersCount === 1) {\n        <!-- Group chat with 1 user: \"{name} is typing...\" -->\n        <span class=\"cometchat-typing-indicator__text\">\n          <span class=\"cometchat-typing-indicator__name\">{{ firstTypingUserName }}</span>\n          {{ 'message_header_is_typing' | translate }}\n        </span>\n      } @else if (typingUsersCount === 2) {\n        <!-- Group chat with 2 users: \"{name1} and {name2} are typing...\" -->\n        <span class=\"cometchat-typing-indicator__text\">\n          <span class=\"cometchat-typing-indicator__name\">{{ firstTypingUserName }}</span>\n          {{ 'message_header_and' | translate }}\n          <span class=\"cometchat-typing-indicator__name\">{{ secondTypingUserName }}</span>\n          {{ 'message_header_are_typing' | translate }}\n        </span>\n      } @else {\n        <!-- Group chat with 3+ users: \"Multiple people are typing...\" -->\n        <span class=\"cometchat-typing-indicator__text\">\n          {{ 'message_header_others_typing' | translate }}\n        </span>\n      }\n\n      <!-- Animated typing dots -->\n      <span class=\"cometchat-typing-indicator__dots\" aria-hidden=\"true\">\n        <span class=\"cometchat-typing-indicator__dot\"></span>\n        <span class=\"cometchat-typing-indicator__dot\"></span>\n        <span class=\"cometchat-typing-indicator__dot\"></span>\n      </span>\n    </div>\n  </div>\n}\n","/**\n * Public API for CometChatMessageInformation component\n */\n\nexport * from './cometchat-message-information.component';\n\n// Re-export types used by the component\nexport type { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  ElementRef,\n  HostListener,\n  OnInit,\n  OnChanges,\n  inject,\n  ViewChild,\n  AfterViewInit, ChangeDetectionStrategy, SimpleChanges} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport {\n  isActivationKey,\n  isEscapeKey,\n  isHomeKey,\n  isEndKey,\n  getNavigationDirection,\n  getNextIndex,\n} from '../../../utils/keyboard-utils';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize/cometchat-localize';\n\n@Component({\n  selector: 'cometchat-dropdown',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule],\n  templateUrl: './cometchat-dropdown.component.html',\n  styleUrls: ['./cometchat-dropdown.component.css'],\n})\nexport class CometChatDropDownComponent implements OnInit, OnChanges, AfterViewInit {\n  /** List of options to display */\n  @Input() options: string[] = [];\n  /** Currently selected option */\n  @Input() selectedOption = '';\n  /** Placeholder text when no option is selected */\n  @Input() placeholder = '';\n  /** Custom ARIA label for the dropdown button */\n  @Input() ariaLabel?: string;\n\n  /** Emitted when an option is selected */\n  @Output() optionsChanged = new EventEmitter<{ value: string }>();\n\n  // Internal state\n  dropdownVisible = false;\n  selectedOptionState = '';\n  focusedIndex = -1;\n  typeAheadBuffer = '';\n  typeAheadTimeout: ReturnType<typeof setTimeout> | null = null;\n\n  /** Unique ID for the listbox element */\n  readonly listboxId = `cometchat-dropdown-listbox-${Math.random().toString(36).substring(2, 9)}`;\n\n  @ViewChild('dropdownButton', { static: false }) dropdownButton?: ElementRef<HTMLButtonElement>;\n\n  private elementRef = inject(ElementRef);\n  private previousFocusElement: HTMLElement | null = null;\n\n  ngOnInit(): void {\n    if (!this.placeholder) {\n      this.placeholder = CometChatLocalize.getLocalizedString('dropdown_placeholder');\n    }\n    // Guard against null/undefined options\n    if (!this.options) {\n      this.options = [];\n    }\n    this.selectedOptionState =\n      this.selectedOption || (this.options.length > 0 ? this.options[0] : '');\n  }\n\n  ngAfterViewInit(): void {\n    // Component initialized\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['selectedOption']) {\n      this.selectedOptionState = changes['selectedOption'].currentValue;\n    }\n  }\n\n  onButtonClick(): void {\n    if (!this.dropdownVisible) {\n      // Save current focus before opening\n      this.previousFocusElement = document.activeElement as HTMLElement;\n    }\n\n    this.dropdownVisible = !this.dropdownVisible;\n    if (this.dropdownVisible) {\n      // Set focused index to selected option when opening\n      this.focusedIndex = this.options.indexOf(this.selectedOptionState);\n      if (this.focusedIndex === -1 && this.options.length > 0) {\n        this.focusedIndex = 0;\n      }\n    } else {\n      // Restore focus to button when closing\n      this.restoreFocus();\n    }\n  }\n\n  onOptionClick(option: string): void {\n    this.selectedOptionState = option;\n    this.dropdownVisible = false;\n    this.optionsChanged.emit({ value: option });\n    // Restore focus to button after selection\n    this.restoreFocus();\n  }\n\n  private restoreFocus(): void {\n    // Restore focus to the dropdown button\n    setTimeout(() => {\n      if (this.dropdownButton?.nativeElement) {\n        this.dropdownButton.nativeElement.focus();\n      } else if (this.previousFocusElement) {\n        this.previousFocusElement.focus();\n      }\n    }, 0);\n  }\n\n  private closeDropdown(): void {\n    this.dropdownVisible = false;\n    this.restoreFocus();\n  }\n\n  @HostListener('document:click', ['$event'])\n  onClickOutside(event: MouseEvent): void {\n    if (!this.elementRef.nativeElement.contains(event.target)) {\n      if (this.dropdownVisible) {\n        this.closeDropdown();\n      }\n    }\n  }\n\n  @HostListener('keydown', ['$event'])\n  onKeyDown(event: KeyboardEvent): void {\n    // Handle Space and Enter to open dropdown when closed\n    if (!this.dropdownVisible && isActivationKey(event)) {\n      this.onButtonClick();\n      event.preventDefault();\n      return;\n    }\n\n    if (!this.dropdownVisible) {\n      return;\n    }\n\n    // Handle Escape to close\n    if (isEscapeKey(event)) {\n      this.closeDropdown();\n      event.preventDefault();\n      return;\n    }\n\n    // Handle Enter/Space to select\n    if (isActivationKey(event)) {\n      if (this.focusedIndex >= 0 && this.focusedIndex < this.options.length) {\n        this.onOptionClick(this.options[this.focusedIndex]);\n      }\n      event.preventDefault();\n      return;\n    }\n\n    // Handle Home key\n    if (isHomeKey(event)) {\n      this.focusedIndex = 0;\n      event.preventDefault();\n      return;\n    }\n\n    // Handle End key\n    if (isEndKey(event)) {\n      this.focusedIndex = this.options.length - 1;\n      event.preventDefault();\n      return;\n    }\n\n    // Handle arrow key navigation\n    const direction = getNavigationDirection(event);\n    if (direction === 'down' || direction === 'up') {\n      this.focusedIndex = getNextIndex(this.focusedIndex, direction, this.options.length, {\n        wrap: true,\n      });\n      event.preventDefault();\n      return;\n    }\n\n    // Type-ahead search\n    if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n      this.handleTypeAhead(event.key);\n      event.preventDefault();\n    }\n  }\n\n  private handleTypeAhead(char: string): void {\n    // Clear previous timeout\n    if (this.typeAheadTimeout) {\n      clearTimeout(this.typeAheadTimeout);\n    }\n\n    // Add character to buffer\n    this.typeAheadBuffer += char.toLowerCase();\n\n    // Find matching option\n    const matchIndex = this.options.findIndex(option =>\n      option.toLowerCase().startsWith(this.typeAheadBuffer)\n    );\n\n    if (matchIndex !== -1) {\n      this.focusedIndex = matchIndex;\n    }\n\n    // Clear buffer after 500ms of no typing\n    this.typeAheadTimeout = setTimeout(() => {\n      this.typeAheadBuffer = '';\n    }, 500);\n  }\n\n  get displayValue(): string {\n    return this.selectedOptionState || this.placeholder;\n  }\n\n  isOptionFocused(index: number): boolean {\n    return this.focusedIndex === index;\n  }\n\n  isOptionSelected(option: string): boolean {\n    return this.selectedOptionState === option;\n  }\n\n  /**\n   * Gets the unique ID for an option element\n   * @param index - The index of the option\n   * @returns string - The unique ID for the option\n   */\n  getOptionId(index: number): string {\n    return `${this.listboxId}-option-${index}`;\n  }\n\n  /**\n   * Gets the ID of the currently focused option for aria-activedescendant\n   * @returns string | null - The ID of the focused option or null if none focused\n   */\n  get activeDescendantId(): string | null {\n    if (\n      !this.dropdownVisible ||\n      this.focusedIndex < 0 ||\n      this.focusedIndex >= this.options.length\n    ) {\n      return null;\n    }\n    return this.getOptionId(this.focusedIndex);\n  }\n}\n","<div class=\"cometchat-dropdown\">\n  <button\n    #dropdownButton\n    class=\"cometchat-dropdown__button\"\n    [class.cometchat-dropdown__button--open]=\"dropdownVisible\"\n    (click)=\"onButtonClick()\"\n    [attr.aria-expanded]=\"dropdownVisible\"\n    aria-haspopup=\"listbox\"\n    [attr.aria-controls]=\"listboxId\"\n    [attr.aria-activedescendant]=\"activeDescendantId\"\n    [attr.aria-label]=\"ariaLabel || displayValue\"\n    type=\"button\"\n  >\n    <span class=\"cometchat-dropdown__button-text\">{{ displayValue }}</span>\n    <span class=\"cometchat-dropdown__button-icon\" [class.cometchat-dropdown__button-icon--open]=\"dropdownVisible\" aria-hidden=\"true\">\n      ▼\n    </span>\n  </button>\n\n  @if (dropdownVisible) {\n    <ul\n      [id]=\"listboxId\"\n      class=\"cometchat-dropdown__menu\"\n      role=\"listbox\"\n      [attr.aria-label]=\"ariaLabel ? ariaLabel + ' options' : 'Dropdown options'\"\n    >\n      @for (option of options; track option; let i = $index) {\n        <li\n          [id]=\"getOptionId(i)\"\n          class=\"cometchat-dropdown__option\"\n          [class.cometchat-dropdown__option--selected]=\"isOptionSelected(option)\"\n          [class.cometchat-dropdown__option--focused]=\"isOptionFocused(i)\"\n          (click)=\"onOptionClick(option)\"\n          [attr.aria-selected]=\"isOptionSelected(option)\"\n          role=\"option\"\n          tabindex=\"-1\"\n        >\n          {{ option }}\n        </li>\n      }\n    </ul>\n  }\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  OnInit,\n  OnDestroy,\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  inject,\n  signal,\n  computed,\n  ViewChild,\n  ElementRef,\n  HostBinding,\n  booleanAttribute,\n  DestroyRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatListItemComponent } from '../base-elements/cometchat-list-item/cometchat-list-item.component';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatButtonComponent } from '../base-elements/cometchat-button/cometchat-button.component';\nimport { CometChatOngoingCallComponent } from '../cometchat-ongoing-call/cometchat-ongoing-call.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { IncomingCallService } from '../../services/incoming-call.service';\nimport { CometChatCallEvents } from '../../events/CometChatCallEvents';\nimport { CallWorkflow } from '../../Enums/Enums';\nimport { CallAnnouncerService } from '../../services/call-announcer.service';\nimport { handleCallError } from '../../utils/call-error-handler';\nimport { DialogFocusManager } from '../../services/dialog-focus-manager.service';\nimport { GlobalConfig, COMETCHAT_GLOBAL_CONFIG } from '../../services/global-config.service';\nimport { IncomingCallTemplateContext } from './cometchat-incoming-call.types';\n\nexport type { IncomingCallTemplateContext };\n\n/**\n * CometChatIncomingCallComponent displays an incoming call notification card\n * when a user receives a voice or video call.\n *\n * It renders a `CometChatListItem` with the caller's name, avatar, and call type,\n * along with Accept and Decline buttons. The component is a thin UI layer that\n * reads state from `IncomingCallService`, with component inputs taking priority\n * over service state.\n *\n * @example\n * ```html\n * <cometchat-incoming-call\n *   [call]=\"incomingCall\"\n *   (callAccepted)=\"onCallAccepted($event)\"\n *   (callDeclined)=\"onCallDeclined($event)\">\n * </cometchat-incoming-call>\n * ```\n */\n@Component({\n  selector: 'cometchat-incoming-call',\n  standalone: true,\n  imports: [CommonModule, CometChatListItemComponent, CometChatAvatarComponent, CometChatButtonComponent, CometChatOngoingCallComponent, CometChatErrorBoundaryComponent, TranslatePipe],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  templateUrl: './cometchat-incoming-call.component.html',\n  styleUrls: ['./cometchat-incoming-call.component.css'],\n})\nexport class CometChatIncomingCallComponent implements OnInit, OnDestroy, AfterViewInit {\n  @HostBinding('class.cometchat-incoming-call--ongoing')\n  get isOngoingCallActive(): boolean { return this.showOngoingCallScreen() && !!this.ongoingCallSessionId(); }\n\n  private incomingCallService = inject(IncomingCallService);\n  private callAnnouncer = inject(CallAnnouncerService);\n  private dialogFocusManager = inject(DialogFocusManager);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private disableSoundForCallsExplicitlySet = signal(false);\n  private customSoundForCallsExplicitlySet = signal(false);\n  private _disableSoundForCalls = signal(false);\n  private _customSoundForCalls = signal('');\n\n  @ViewChild('dialogContainer') dialogContainer!: ElementRef<HTMLElement>;\n  @ViewChild('acceptButton') acceptButton!: ElementRef<HTMLElement>;\n\n  @Input() call: CometChat.Call | null = null;\n\n  @Input({ transform: booleanAttribute })\n  set disableSoundForCalls(value: boolean) { this._disableSoundForCalls.set(value); this.disableSoundForCallsExplicitlySet.set(true); }\n  get disableSoundForCalls(): boolean { return this._disableSoundForCalls(); }\n\n  @Input()\n  set customSoundForCalls(value: string) { this._customSoundForCalls.set(value); this.customSoundForCallsExplicitlySet.set(true); }\n  get customSoundForCalls(): string { return this._customSoundForCalls(); }\n\n  @Input() onAccept: ((call: CometChat.Call) => void) | null = null;\n  @Input() onDecline: ((call: CometChat.Call) => void) | null = null;\n  @Input() onError: ((error: CometChat.CometChatException) => void) | null = null;\n\n  @Input() itemView: TemplateRef<any> | null = null;\n  @Input() titleView: TemplateRef<any> | null = null;\n  @Input() subtitleView: TemplateRef<any> | null = null;\n  @Input() leadingView: TemplateRef<any> | null = null;\n  @Input() trailingView: TemplateRef<any> | null = null;\n  @Input() acceptButtonView: TemplateRef<any> | null = null;\n  @Input() declineButtonView: TemplateRef<any> | null = null;\n\n  @Output() callAccepted = new EventEmitter<CometChat.Call>();\n  @Output() callDeclined = new EventEmitter<CometChat.Call>();\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  showOngoingCallScreen = signal<boolean>(false);\n  ongoingCallSessionId = signal<string>('');\n\n  private readonly destroyRef = inject(DestroyRef);\n  readonly defaultCallingWorkflow = CallWorkflow.defaultCalling;\n  private _incomingCallIsAudioOnly = signal<boolean>(false);\n  get incomingCallIsAudioOnly(): boolean { return this._incomingCallIsAudioOnly(); }\n\n  effectiveDisableSoundForCalls = computed(() => {\n    if (this.disableSoundForCallsExplicitlySet()) return this._disableSoundForCalls();\n    if (this.globalConfig?.disableSoundForCalls !== undefined) return this.globalConfig.disableSoundForCalls;\n    return false;\n  });\n\n  effectiveCustomSoundForCalls = computed(() => {\n    if (this.customSoundForCallsExplicitlySet()) return this._customSoundForCalls();\n    if (this.globalConfig?.customSoundForCalls !== undefined) return this.globalConfig.customSoundForCalls;\n    return '';\n  });\n\n  get effectiveCall(): CometChat.Call | null { return this.call ?? this.incomingCallService.incomingCall(); }\n  get callerName(): string { const call = this.effectiveCall; if (!call) return ''; return call.getCallInitiator()?.getName?.() || ''; }\n  get callerAvatar(): string { const call = this.effectiveCall; if (!call) return ''; return call.getCallInitiator()?.getAvatar?.() || ''; }\n\n  get callTypeIconUrl(): string {\n    const call = this.effectiveCall;\n    if (!call) return '';\n    const callType = call.getType?.() || '';\n    return callType === 'video' ? 'assets/video_call.svg' : 'assets/call.svg';\n  }\n\n  /**\n   * Returns the template context for custom template overrides.\n   */\n  get templateContext(): { $implicit: IncomingCallTemplateContext } {\n    const call = this.effectiveCall;\n    return {\n      $implicit: {\n        call: call!,\n        callerName: this.callerName,\n        callerAvatar: this.callerAvatar,\n        callType: call?.getType?.() || '',\n      },\n    };\n  }\n\n  // ==================== Lifecycle ====================\n\n  /**\n   * Plays the incoming call ringtone when a call is set (if sound is not disabled).\n   * Announces the incoming call for screen readers.\n   *\n   * @see Requirement 2.1 - Play ringtone when call is set\n   * @see Requirement 2.3 - Skip when sound is disabled\n   */\n  ngOnInit(): void {\n    const call = this.effectiveCall;\n    if (call && !this.effectiveDisableSoundForCalls()) {\n      try {\n        this.incomingCallService.setDisableSoundForCalls(this.effectiveDisableSoundForCalls());\n        this.incomingCallService.setCustomSoundForCalls(this.effectiveCustomSoundForCalls());\n        this.incomingCallService.playIncomingSound();\n      } catch (err: unknown) {\n        this.handleError(err);\n      }\n    }\n\n    // Announce incoming call for screen readers\n    if (call) {\n      const callType = call.getType?.() === 'video' ? 'video' : 'audio';\n      this.callAnnouncer.announceIncomingCall(this.callerName, callType);\n    }\n\n    // Subscribe to call ended to hide ongoing call screen\n    CometChatCallEvents.ccCallEnded.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.showOngoingCallScreen.set(false);\n      this.ongoingCallSessionId.set('');\n    });\n  }\n\n  /**\n   * Sets up focus trap and initial focus after view is initialized.\n   */\n  ngAfterViewInit(): void {\n    if (this.effectiveCall && this.dialogContainer?.nativeElement) {\n      // Set up dialog focus management with Escape to decline\n      this.dialogFocusManager.openDialog({\n        container: this.dialogContainer.nativeElement,\n        initialFocus: this.acceptButton?.nativeElement,\n        // Name comes from the template aria-label (robust for custom title views);\n        // omit labelledById so it isn't re-applied and override the aria-label.\n        closeOnEscape: true,\n        onEscape: () => this.onDeclineClick(),\n      });\n    }\n  }\n\n  /**\n   * Pauses the ringtone and cleans up focus trap on component destruction.\n   *\n   * @see Requirement 2.4 - Pause ringtone on destroy\n   */\n  ngOnDestroy(): void {\n    try {\n      this.incomingCallService.stopIncomingSound();\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n\n    // Close dialog focus management\n    if (this.dialogContainer?.nativeElement) {\n      this.dialogFocusManager.closeDialog(this.dialogContainer.nativeElement);\n    }\n  }\n\n  // ==================== Actions ====================\n\n  /**\n   * Handles the Accept button click.\n   *\n   * If an `onAccept` callback is provided, invokes it.\n   * Otherwise, calls `incomingCallService.acceptCall()` (default SDK behavior).\n   * Pauses the ringtone and emits `callAccepted`.\n   *\n   * @see Requirement 3.1 - Pause sound and emit callAccepted\n   * @see Requirement 3.3 - Default accept via SDK\n   * @see Requirement 3.4 - Error handling\n   */\n  async onAcceptClick(): Promise<void> {\n    const call = this.effectiveCall;\n    if (!call) return;\n\n    try {\n      this.incomingCallService.stopIncomingSound();\n\n      // Capture call type before accepting — the incoming call state is\n      // cleared after accept, so we must read it now.\n      this._incomingCallIsAudioOnly.set(call.getType?.() === 'audio');\n\n      if (this.onAccept) {\n        this.onAccept(call);\n      } else {\n        await this.incomingCallService.acceptCall(call.getSessionId());\n        // Show the ongoing call screen after successful accept\n        this.ongoingCallSessionId.set(call.getSessionId());\n        this.showOngoingCallScreen.set(true);\n      }\n\n      this.callAccepted.emit(call);\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  /**\n   * Handles the Decline button click.\n   *\n   * If an `onDecline` callback is provided, invokes it.\n   * Otherwise, calls `incomingCallService.declineCall()` (default SDK behavior).\n   * Pauses the ringtone and emits `callDeclined`.\n   *\n   * @see Requirement 4.1 - Pause sound and emit callDeclined\n   * @see Requirement 4.3 - Default decline via SDK\n   * @see Requirement 4.4 - Error handling\n   */\n  async onDeclineClick(): Promise<void> {\n    const call = this.effectiveCall;\n    if (!call) return;\n\n    try {\n      this.incomingCallService.stopIncomingSound();\n\n      if (this.onDecline) {\n        this.onDecline(call);\n      } else {\n        await this.incomingCallService.declineCall(call.getSessionId());\n      }\n\n      this.callDeclined.emit(call);\n    } catch (err: unknown) {\n      this.handleError(err);\n    }\n  }\n\n  // ==================== Private Helpers ====================\n\n  /**\n   * Handles errors by emitting the `error` output and invoking the `onError` callback.\n   *\n   * @param err - The error to handle\n   * @see Requirement 9.1, 9.2, 9.3 - Error handling\n   */\n  private handleError(err: unknown): void {\n    handleCallError(err, 'INCOMING_CALL_ERROR', 'CometChatIncomingCall', this.error, this.onError);\n  }\n\n  /** No-op retry handler — incoming calls are transient and cannot be retried. */\n  handleRetryClick(): void {}\n}\n","<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'IncomingCall'\">\n@if (effectiveCall) {\n  <div\n    #dialogContainer\n    class=\"cometchat-incoming-call\"\n    role=\"alertdialog\"\n    aria-modal=\"true\"\n    [attr.aria-label]=\"callerName + ' ' + ('incoming_call_subtitle' | translate)\">\n\n    <!-- Item View: custom template or default ListItem -->\n    @if (itemView) {\n      <ng-container *ngTemplateOutlet=\"itemView; context: templateContext\"></ng-container>\n    } @else {\n      <cometchat-list-item\n        [title]=\"callerName\"\n        [avatarName]=\"callerName\"\n        [avatarURL]=\"callerAvatar\"\n        [titleView]=\"titleView ?? defaultTitleView\"\n        [subtitleView]=\"subtitleView ?? defaultSubtitleView\"\n        [leadingView]=\"leadingView ?? emptyLeadingView\"\n        [trailingView]=\"trailingView ?? defaultTrailingView\">\n      </cometchat-list-item>\n    }\n\n    <!-- Button Group -->\n    <div class=\"cometchat-incoming-call__button-group\">\n      <!-- Decline Button -->\n      @if (declineButtonView) {\n        <ng-container *ngTemplateOutlet=\"declineButtonView; context: templateContext\"></ng-container>\n      } @else {\n        <div class=\"cometchat-incoming-call__button-decline\">\n          <cometchat-button\n            [text]=\"'incoming_call_confirm_no' | translate\"\n            [ariaLabel]=\"'incoming_call_confirm_no' | translate\"\n            (buttonClick)=\"onDeclineClick()\">\n          </cometchat-button>\n        </div>\n      }\n\n      <!-- Accept Button -->\n      @if (acceptButtonView) {\n        <ng-container *ngTemplateOutlet=\"acceptButtonView; context: templateContext\"></ng-container>\n      } @else {\n        <div #acceptButton class=\"cometchat-incoming-call__button-accept\">\n          <cometchat-button\n            [text]=\"'incoming_call_confirm_yes' | translate\"\n            [ariaLabel]=\"'incoming_call_confirm_yes' | translate\"\n            (buttonClick)=\"onAcceptClick()\">\n          </cometchat-button>\n        </div>\n      }\n    </div>\n  </div>\n}\n\n<!-- Empty leading view to suppress default avatar in ListItem -->\n<ng-template #emptyLeadingView></ng-template>\n\n<!-- Default Title Template: caller name with id for aria-labelledby -->\n<ng-template #defaultTitleView>\n  <span id=\"incoming-call-title\" class=\"cometchat-incoming-call__title\">\n    {{ callerName }}\n  </span>\n</ng-template>\n\n<!-- Default Subtitle Template: call type icon + \"Incoming Call\" text -->\n<ng-template #defaultSubtitleView>\n  <div class=\"cometchat-incoming-call__subtitle\">\n    <div\n      class=\"cometchat-incoming-call__subtitle-icon\"\n      [style.-webkit-mask-image]=\"'url(' + callTypeIconUrl + ')'\"\n      [style.mask-image]=\"'url(' + callTypeIconUrl + ')'\"\n      aria-hidden=\"true\">\n    </div>\n    <span class=\"cometchat-incoming-call__subtitle-text\">\n      {{ 'incoming_call_subtitle' | translate }}\n    </span>\n  </div>\n</ng-template>\n\n<!-- Default Trailing View Template: 48x48 caller avatar -->\n<ng-template #defaultTrailingView>\n  <div class=\"cometchat-incoming-call__avatar\">\n    <cometchat-avatar\n      [image]=\"callerAvatar\"\n      [name]=\"callerName\">\n    </cometchat-avatar>\n  </div>\n</ng-template>\n\n<!-- Ongoing Call Screen (shown after accepting the call) -->\n@if (showOngoingCallScreen() && ongoingCallSessionId()) {\n  <cometchat-ongoing-call\n    [sessionID]=\"ongoingCallSessionId()\"\n    [callWorkflow]=\"defaultCallingWorkflow\"\n    [isAudioOnly]=\"incomingCallIsAudioOnly\">\n  </cometchat-ongoing-call>\n}\n</cometchat-error-boundary>\n","/**\n * Call Log Utility Functions\n *\n * Pure utility functions for call log processing. These are standalone\n * functions (not tied to Angular DI) so they can be tested independently\n * and reused across components and services.\n *\n * Ported from React UIKit: `src/components/Calling/Utils/utils.ts`\n *\n\n */\n\n/** Missed call statuses — incoming calls with these statuses are classified as missed */\nconst MISSED_CALL_STATUSES = ['unanswered', 'cancelled', 'busy', 'rejected'];\n\n/**\n * Minimal interface for call log / call objects used by utility functions.\n * Covers both CometChat.Call and CallLog objects from the Calls SDK.\n */\ninterface CallLogLike {\n  getStatus(): string;\n  getInitiator(): { getUid(): string };\n  getReceiver(): { getUid(): string; getName?(): string };\n  getCallInitiator?(): { getUid(): string } | null;\n}\n\n/**\n * Determines if the call was initiated by the logged-in user.\n *\n * Checks the call initiator's UID against the logged-in user's UID.\n * Falls back to `getCallInitiator()` first (for CometChat.Call objects),\n * then `getInitiator()` (for CallLog objects from the Calls SDK).\n *\n * @param call - A call log or call object with `getInitiator()` / `getCallInitiator()`\n * @param loggedInUser - The currently logged-in CometChat user\n * @returns `true` if the logged-in user initiated the call\n *\n * @see Requirement 2.2 — Call direction classification\n */\nexport function isSentByMe(call: CallLogLike, loggedInUser: { getUid(): string }): boolean {\n  let senderUid = '';\n  try {\n    senderUid =\n      (call.getCallInitiator && call.getCallInitiator()?.getUid()) ||\n      call?.getInitiator()?.getUid();\n  } catch {\n    // Fallback: if neither method works, treat as sent by me\n  }\n  return !senderUid || senderUid === loggedInUser.getUid();\n}\n\n/**\n * Determines if the call was a missed call for the logged-in user.\n *\n * A call is missed when:\n * 1. The logged-in user did NOT initiate the call (it's incoming), AND\n * 2. The call status is one of: unanswered, cancelled, busy, rejected\n *\n * @param call - A call log or call object with `getStatus()` and `getInitiator()`\n * @param loggedInUser - The currently logged-in CometChat user\n * @returns `true` if the call was missed by the logged-in user\n *\n * @see Requirement 2.2 — Call direction classification\n */\nexport function isMissedCall(call: CallLogLike, loggedInUser: { getUid(): string }): boolean {\n  const sentByMe = isSentByMe(call, loggedInUser);\n  if (sentByMe) {\n    return false;\n  }\n  const callStatus: string = call.getStatus();\n  return MISSED_CALL_STATUSES.includes(callStatus);\n}\n\n/**\n * Returns the other party in a call relative to the logged-in user.\n *\n * - If the logged-in user is the initiator → returns the receiver\n * - If the logged-in user is the receiver → returns the initiator\n *\n * @param call - A call log object with `getInitiator()` and `getReceiver()`\n * @param loggedInUser - The currently logged-in CometChat user\n * @returns The other party object (user entity with `getUid()`, `getName()`, etc.)\n *\n * @see Requirement 2.1 — Other party identification\n */\nexport function verifyCallUser(call: CallLogLike, loggedInUser: { getUid(): string }): { getUid(): string; getName?(): string } {\n  if (call.getInitiator().getUid() === loggedInUser.getUid()) {\n    return call.getReceiver();\n  } else {\n    return call.getInitiator();\n  }\n}\n","/**\n * Utility functions for CometChatCallLogs component.\n */\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { sanitizeCalendarObject } from '../../utils/util';\n\n/**\n * Returns the merged CalendarObject for call initiation timestamps.\n * Merges default → global → component-level formats (component wins).\n */\nexport function buildCallLogDateFormat(\n  componentCalendarFormat: CalendarObject | null\n): CalendarObject {\n  const defaultFormat: CalendarObject = {\n    yesterday: 'DD MMM, hh:mm A',\n    otherDays: 'DD MMM, hh:mm A',\n    today: 'DD MMM, hh:mm A',\n  };\n\n  const globalCalendarFormat = sanitizeCalendarObject(CometChatLocalize.getCalendarObject());\n  const componentFormat = sanitizeCalendarObject(componentCalendarFormat);\n\n  return { ...defaultFormat, ...globalCalendarFormat, ...componentFormat };\n}\n\n/**\n * Wraps an unknown error in a CometChatException.\n */\nexport function wrapCallLogsError(err: unknown): CometChat.CometChatException {\n  if (err instanceof CometChat.CometChatException) return err;\n  if (err instanceof Error) {\n    return new CometChat.CometChatException({\n      code: 'CALL_LOGS_ERROR',\n      message: err.message,\n      details: err.stack || '',\n    });\n  }\n  return new CometChat.CometChatException({\n    code: 'CALL_LOGS_ERROR',\n    message: String(err),\n    details: '',\n  });\n}\n\n/**\n * Computes the accessible label for a call log item.\n * Combines contact name, call type, call status, and timestamp.\n */\nexport function buildCallLogAriaLabel(\n  call: any,\n  callUser: any,\n  isSentByMe: boolean,\n  isMissed: boolean\n): string {\n  const parts: string[] = [];\n\n  const name = callUser?.getName?.() || '';\n  if (name) parts.push(name);\n\n  const typeKey = call?.type === 'video' ? 'accessibility_video_call' : 'accessibility_voice_call';\n  parts.push(CometChatLocalize.getLocalizedString(typeKey));\n\n  let statusKey: string;\n  if (isSentByMe) {\n    statusKey = 'accessibility_call_outgoing';\n  } else if (isMissed) {\n    statusKey = 'accessibility_call_missed';\n  } else {\n    statusKey = 'accessibility_call_incoming';\n  }\n  parts.push(CometChatLocalize.getLocalizedString(statusKey));\n\n  if (call?.initiatedAt) {\n    parts.push(new Date(call.initiatedAt * 1000).toLocaleString());\n  }\n\n  return parts.join(', ');\n}\n","/**\n * CometChatCallLogs Component\n *\n * Displays a paginated list of call history records for the logged-in user.\n * Delegates business logic to `CallLogsService` while handling UI rendering,\n * template overrides, and user interactions.\n */\nimport {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ChangeDetectionStrategy,\n  OnInit,\n  OnDestroy,\n  inject,\n  signal,\n  computed,\n  ChangeDetectorRef,\n  ViewChild,\n  ElementRef,\n  booleanAttribute,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\n\nimport { CometChatPaginatedListComponent } from '../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { CometChatListItemComponent } from '../base-elements/cometchat-list-item/cometchat-list-item.component';\nimport { CometChatDateComponent } from '../base-elements/cometchat-date/cometchat-date.component';\nimport { CometChatOutgoingCallComponent } from '../cometchat-outgoing-call/cometchat-outgoing-call.component';\nimport { CometChatOngoingCallComponent } from '../cometchat-ongoing-call/cometchat-ongoing-call.component';\n\nimport { CallLogsService } from '../../services/call-logs.service';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { CallWorkflow, States } from '../../Enums/Enums';\nimport { CometChatUIKitConstants } from '../../constants';\nimport { CometChatCallEvents } from '../../events/CometChatCallEvents';\nimport { verifyCallUser, isSentByMe, isMissedCall } from '../../utils/CallLogUtils';\nimport { ListNavigationService } from '../../services/list-navigation.service';\nimport { GlobalConfig, COMETCHAT_GLOBAL_CONFIG } from '../../services/global-config.service';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { CometChatUIKitCalls } from '../../CometChatCalls';\nimport { CometChatUIKit } from '../../cometchat-uikit';\nimport { buildCallLogDateFormat, wrapCallLogsError, buildCallLogAriaLabel } from './cometchat-call-logs.utils';\nimport { CometChatLogger } from '../../utils/CometChatLogger';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\n\n@Component({\n  selector: 'cometchat-call-logs',\n  standalone: true,\n  imports: [\n    CommonModule,\n    CometChatPaginatedListComponent,\n    CometChatListItemComponent,\n    CometChatDateComponent,\n    CometChatOutgoingCallComponent,\n    CometChatOngoingCallComponent,\n    CometChatErrorBoundaryComponent,\n    TranslatePipe,\n  ],\n  providers: [CallLogsService],\n  templateUrl: './cometchat-call-logs.component.html',\n  styleUrls: ['./cometchat-call-logs.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatCallLogsComponent implements OnInit, OnDestroy {\n  /** @internal Timer references for cleanup */\n  private pendingTimers: ReturnType<typeof setTimeout>[] = [];\n\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n\n  private callLogsService = inject(CallLogsService);\n  private listNavigationService = inject(ListNavigationService);\n  private templatesService = inject(CometChatTemplatesService);\n  private cdr = inject(ChangeDetectorRef);\n  private globalConfig: Partial<GlobalConfig> | null = inject(COMETCHAT_GLOBAL_CONFIG, { optional: true });\n\n  private showScrollbarExplicitlySet = signal(false);\n  private _showScrollbar = signal(false);\n\n  @ViewChild('listContainer') listContainer!: ElementRef<HTMLElement>;\n  @ViewChild(CometChatPaginatedListComponent) paginatedList?: CometChatPaginatedListComponent<any>;\n\n  // ==================== Data Inputs ====================\n\n  @Input() activeCall: any = null;\n  @Input() callLogRequestBuilder: any = null;\n  @Input() callInitiatedDateTimeFormat: CalendarObject | null = null;\n\n  @Input({ transform: booleanAttribute })\n  set showScrollbar(value: boolean) {\n    this._showScrollbar.set(value);\n    this.showScrollbarExplicitlySet.set(true);\n  }\n  get showScrollbar(): boolean { return this._showScrollbar(); }\n\n  @Input() callSettingsBuilder: typeof CometChatUIKitCalls.CallSettingsBuilder = undefined;\n  @Input() onError: ((error: CometChat.CometChatException) => void) | null = null;\n\n  // ==================== Template Override Inputs ====================\n\n  @Input() menuView: TemplateRef<any> | null = null;\n  @Input() itemView: TemplateRef<any> | null = null;\n  @Input() leadingView: TemplateRef<any> | null = null;\n  @Input() titleView: TemplateRef<any> | null = null;\n  @Input() subtitleView: TemplateRef<any> | null = null;\n  @Input() trailingView: TemplateRef<any> | null = null;\n  @Input() loadingView: TemplateRef<any> | null = null;\n  @Input() emptyView: TemplateRef<any> | null = null;\n  @Input() errorView: TemplateRef<any> | null = null;\n\n  // ==================== Template Resolution ====================\n\n  get effectiveItemView() { return this.itemView || this.templatesService.getCallLogTemplates().itemView || undefined; }\n  get effectiveLeadingView() { return this.leadingView || this.templatesService.getCallLogTemplates().leadingView || undefined; }\n  get effectiveTitleView() { return this.titleView || this.templatesService.getCallLogTemplates().titleView || undefined; }\n  get effectiveSubtitleView() { return this.subtitleView || this.templatesService.getCallLogTemplates().subtitleView || undefined; }\n  get effectiveTrailingView() { return this.trailingView || this.templatesService.getCallLogTemplates().trailingView || undefined; }\n  get effectiveLoadingView() { return this.loadingView || this.templatesService.resolveTemplate(this.templatesService.getCallLogTemplates(), 'loadingView'); }\n  get effectiveEmptyView() { return this.emptyView || this.templatesService.resolveTemplate(this.templatesService.getCallLogTemplates(), 'emptyView'); }\n  get effectiveErrorView() { return this.errorView || this.templatesService.resolveTemplate(this.templatesService.getCallLogTemplates(), 'errorView'); }\n\n  // ==================== Output Events ====================\n\n  @Output() itemClick = new EventEmitter<any>();\n  @Output() callButtonClicked = new EventEmitter<any>();\n\n  // ==================== Effective Values ====================\n\n  effectiveShowScrollbar = computed(() => {\n    if (this.showScrollbarExplicitlySet()) return this._showScrollbar();\n    if (this.globalConfig?.showScrollbar !== undefined) return this.globalConfig.showScrollbar;\n    return false;\n  });\n\n  // ==================== Signal-Based State from Service ====================\n\n  readonly callLogs = this.callLogsService.callLogs;\n  readonly state = this.callLogsService.state;\n  readonly hasMore = this.callLogsService.hasMore;\n  readonly showOutgoingCallScreen = this.callLogsService.showOutgoingCallScreen;\n  readonly showOngoingCall = this.callLogsService.showOngoingCall;\n  readonly activeCallObject = this.callLogsService.activeCallObject;\n  readonly sessionId = this.callLogsService.sessionId;\n\n  loggedInUser: CometChat.User | null = null;\n  isFetchingMore = signal(false);\n  readonly errorObject = new Error('Failed to load call logs');\n  focusedIndex = signal(-1);\n  readonly CallWorkflow = CallWorkflow;\n\n  get callingEnabled(): boolean { return CometChatUIKit.isCallingEnabled(); }\n\n  // ==================== Lifecycle Hooks ====================\n\n  async ngOnInit(): Promise<void> {\n    await this.initializeLoggedInUser();\n    this.initializeService();\n  }\n\n  ngOnDestroy(): void {\n    this.pendingTimers.forEach(t => clearTimeout(t));\n    this.pendingTimers = [];\n    this.callLogsService.cleanup();\n  }\n\n  // ==================== Initialization Methods ====================\n\n  private async initializeLoggedInUser(): Promise<void> {\n    try {\n      this.loggedInUser = await CometChat.getLoggedinUser();\n      this.cdr.markForCheck();\n    } catch (error) {\n      CometChatLogger.error('CometChatCallLogs', 'Error getting logged-in user:', error);\n    }\n  }\n\n  private initializeService(): void {\n    if (this.loggedInUser) this.callLogsService.setLoggedInUser(this.loggedInUser);\n    if (this.callLogRequestBuilder) this.callLogsService.setCallLogRequestBuilder(this.callLogRequestBuilder);\n    if (this.onError) this.callLogsService.setOnError(this.onError);\n    this.callLogsService.initialize();\n    this.callLogsService.fetchCallLogs();\n  }\n\n  // ==================== Utility Wrappers ====================\n\n  getCallUser(call: any): any {\n    if (!this.loggedInUser) return null;\n    return verifyCallUser(call, this.loggedInUser);\n  }\n\n  isCallSentByMe(call: any): boolean {\n    if (!this.loggedInUser) return false;\n    return isSentByMe(call, this.loggedInUser);\n  }\n\n  isCallMissed(call: any): boolean {\n    if (!this.loggedInUser) return false;\n    return isMissedCall(call, this.loggedInUser);\n  }\n\n  getDateFormat(): CalendarObject {\n    return buildCallLogDateFormat(this.callInitiatedDateTimeFormat);\n  }\n\n  // ==================== Event Handlers ====================\n\n  handleInfoClick(call: any): void {\n    try {\n      if (this.callButtonClicked.observed) {\n        this.callButtonClicked.emit(call);\n      } else {\n        const entity = this.getCallUser(call);\n        if (entity?.uid) this.callLogsService.initiateCall(call?.type, entity.uid);\n      }\n    } catch (err) { this.handleError(err); }\n  }\n\n  handleItemClick(call: any): void {\n    try { this.itemClick.emit(call); } catch (err) { this.handleError(err); }\n  }\n\n  handleWrapperEnter(event: Event, call: any): void {\n    event.stopPropagation();\n    this.handleItemClick(call);\n  }\n\n  handleWrapperSpace(event: Event, call: any): void {\n    event.preventDefault();\n    event.stopPropagation();\n    this.handleInfoClick(call);\n  }\n\n  onOutgoingCallCanceled(): void { this.callLogsService.cancelOutgoingCall(); }\n\n  handleLoadMore(): void {\n    if (this.isFetchingMore()) return;\n    this.isFetchingMore.set(true);\n    this.callLogsService.fetchNextCallLogs()\n      .then(() => { this.isFetchingMore.set(false); this.paginatedList?.loadComplete(); })\n      .catch(() => { this.isFetchingMore.set(false); this.paginatedList?.loadComplete(); });\n  }\n\n  // ==================== Ongoing Call Builder ====================\n\n  getCallBuilder(): any {\n    const call = this.activeCallObject();\n    const audioOnlyCall = call?.getType() === CometChatUIKitConstants.MessageTypes.audio;\n\n    let callsBuilder: any;\n    if (this.callSettingsBuilder !== undefined) {\n      callsBuilder = this.callSettingsBuilder;\n    } else if (this.globalConfig?.callSettingsBuilder !== undefined) {\n      callsBuilder = this.globalConfig.callSettingsBuilder;\n    } else {\n      callsBuilder = new CometChatUIKitCalls.CallSettingsBuilder()\n        .enableDefaultLayout(true)\n        .setIsAudioOnlyCall(audioOnlyCall);\n    }\n\n    const currentSessionId = this.sessionId();\n    callsBuilder.setCallListener(\n      new CometChatUIKitCalls.OngoingCallListener({\n        onCallEnded: () => {\n          CometChatUIKitCalls.endSession();\n          CometChat.clearActiveCall();\n          CometChatCallEvents.ccCallEnded.next(null as any);\n        },\n        onCallEndButtonPressed: () => {\n          CometChat.endCall(currentSessionId!)\n            .then((endedCall: CometChat.Call) => {\n              CometChatUIKitCalls.endSession();\n              CometChatCallEvents.ccCallEnded.next(endedCall);\n            })\n            .catch((err: CometChat.CometChatException) => this.handleError(err));\n        },\n        onError: (error: unknown) => this.handleError(error),\n      })\n    );\n\n    return callsBuilder;\n  }\n\n  // ==================== Active Call Matching ====================\n\n  isActiveCall(call: any): boolean {\n    if (!this.activeCall) return false;\n    try { return this.activeCall.getSessionID() === call.getSessionID(); } catch { return false; }\n  }\n\n  trackByCallLog(_index: number, call: any): string {\n    return call?.getSessionID?.() ?? _index;\n  }\n\n  // ==================== Error Handling ====================\n\n  private handleError(err: unknown): void {\n    const exception = wrapCallLogsError(err);\n    if (this.onError) this.onError(exception);\n    CometChatLogger.error('CometChatCallLogs', 'Error:', err);\n  }\n\n  // ==================== Keyboard Navigation ====================\n\n  onCallLogsKeyDown(event: KeyboardEvent): void {\n    const logs = this.callLogs();\n    if (logs.length === 0) return;\n\n    if (event.key === 'Enter') {\n      event.preventDefault();\n      const idx = this.focusedIndex();\n      if (idx >= 0 && idx < logs.length) this.handleItemClick(logs[idx]);\n      return;\n    }\n\n    if (event.key === ' ') {\n      event.preventDefault();\n      const idx = this.focusedIndex();\n      if (idx >= 0 && idx < logs.length) this.handleInfoClick(logs[idx]);\n      return;\n    }\n\n    const newIndex = this.listNavigationService.handleKeyNavigation(event, this.focusedIndex(), {\n      itemCount: logs.length,\n      wrap: false,\n    });\n\n    if (newIndex !== -1 && newIndex !== this.focusedIndex()) {\n      this.focusedIndex.set(newIndex);\n      this.cdr.markForCheck();\n      this.scrollFocusedItemIntoView();\n      if (newIndex === logs.length - 1 && this.hasMore() && !this.isFetchingMore()) {\n        this.handleLoadMore();\n      }\n    }\n  }\n\n  getCallLogAriaLabel(call: any): string {\n    return buildCallLogAriaLabel(\n      call,\n      this.getCallUser(call),\n      this.isCallSentByMe(call),\n      this.isCallMissed(call)\n    );\n  }\n\n  getItemTabIndex(index: number): number {\n    const currentFocused = this.focusedIndex();\n    if (currentFocused === index) return 0;\n    if (currentFocused === -1 && index === 0) return 0;\n    return -1;\n  }\n\n  handleItemFocus(index: number): void {\n    this.focusedIndex.set(index);\n    this.cdr.markForCheck();\n  }\n\n  handleListFocus(): void {\n    if (this.focusedIndex() === -1 && this.callLogs().length > 0) {\n      this.focusedIndex.set(0);\n      this.cdr.markForCheck();\n    }\n  }\n\n  private scrollFocusedItemIntoView(): void {\n    this.pendingTimers.push(setTimeout(() => {\n      if (!this.listContainer) return;\n      const focusedElement = this.listContainer.nativeElement.querySelector(\n        `[data-index=\"${this.focusedIndex()}\"]`\n      );\n      if (focusedElement) {\n        focusedElement.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n        (focusedElement as HTMLElement).focus();\n      }\n    }, 0));\n  }\n\n  handleRetryClick(): void {\n    this.callLogsService.setState(States.loading);\n    this.cdr.markForCheck();\n    this.pendingTimers.push(setTimeout(() => {\n      this.callLogsService.setState(States.error);\n      this.cdr.markForCheck();\n    }, 300));\n  }\n}\n","<!-- CometChatCallLogs Component Template\n     Displays a paginated list of call history records.\n     Uses CometChatPaginatedList for infinite scroll and CometChatListItem for items.\n     Supports 8 template override inputs for full customization.\n     \n     Accessibility Features:\n     - aria-label=\"Call history list\" on container\n     - Full keyboard navigation with ArrowUp/ArrowDown, Home/End\n     - Enter key to view call details, Space key to initiate call\n     - Roving tabindex pattern for efficient keyboard navigation\n     - ARIA labels on each item with name, type, status, timestamp\n     \n     @see Requirements 1.2, 1.4, 1.5, 1.6, 2.1–2.4, 5.1–5.8, 6.1, 8.1–8.3, 11.1–11.6\n-->\n<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'CallLogs'\">\n<div \n  #listContainer\n  class=\"cometchat cometchat-call-logs\"\n  (keydown)=\"onCallLogsKeyDown($event)\"\n  (focus)=\"handleListFocus()\">\n\n  <!-- ==================== Outgoing Call Overlay ==================== -->\n  @if (showOutgoingCallScreen()) {\n    <div class=\"cometchat-call-logs__outgoing-call\">\n      <cometchat-outgoing-call\n        [call]=\"activeCallObject()\"\n        (callCanceled)=\"onOutgoingCallCanceled()\">\n      </cometchat-outgoing-call>\n    </div>\n  }\n\n  <!-- ==================== Ongoing Call Overlay ==================== -->\n  @if (showOngoingCall()) {\n    <div class=\"cometchat-call-logs__ongoing-call\">\n      <cometchat-ongoing-call\n        [sessionID]=\"sessionId()!\"\n        [callWorkflow]=\"CallWorkflow.defaultCalling\"\n        [callSettingsBuilder]=\"getCallBuilder()\">\n      </cometchat-ongoing-call>\n    </div>\n  }\n\n  <!-- ==================== Header Section ==================== -->\n  <div class=\"cometchat-call-logs__header\">\n    <h2 class=\"cometchat-call-logs__header-title\">\n      {{ 'call_logs_title' | translate }}\n    </h2>\n    @if (menuView) {\n      <ng-container *ngTemplateOutlet=\"menuView\"></ng-container>\n    }\n  </div>\n\n  <!-- ==================== List Body ==================== -->\n  <!-- States enum: loading=0, empty=1, error=2, loaded=3 -->\n  <cometchat-paginated-list\n    [items]=\"callLogs()\"\n    [trackByFn]=\"trackByCallLog.bind(this)\"\n    [isLoading]=\"state() === 0\"\n    [hasMore]=\"hasMore()\"\n    [error]=\"state() === 2 ? errorObject : null\"\n    [showScrollbar]=\"effectiveShowScrollbar()\"\n    [ariaLabel]=\"'accessibility_call_history_list' | translate\"\n    [loadingTemplate]=\"loadingTemplateRef\"\n    [emptyTemplate]=\"emptyTemplateRef\"\n    [errorTemplate]=\"errorTemplateRef\"\n    [itemTemplate]=\"itemTemplateRef\"\n    (loadMore)=\"handleLoadMore()\">\n  </cometchat-paginated-list>\n\n  <!-- ==================== Loading Template ==================== -->\n  <ng-template #loadingTemplateRef>\n    @if (effectiveLoadingView) {\n      <ng-container *ngTemplateOutlet=\"effectiveLoadingView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-call-logs__shimmer\">\n        @for (item of shimmerList; track item) {\n          <div class=\"cometchat-call-logs__shimmer-item\">\n            <div class=\"cometchat-call-logs__shimmer-item-avatar\"></div>\n            <div class=\"cometchat-call-logs__shimmer-item-body\">\n              <div class=\"cometchat-call-logs__shimmer-item-body-title-wrapper\">\n                <div class=\"cometchat-call-logs__shimmer-item-body-title\"></div>\n                <div class=\"cometchat-call-logs__shimmer-item-body-subtitle\"></div>\n              </div>\n              <div class=\"cometchat-call-logs__shimmer-item-body-tail\"></div>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Empty Template ==================== -->\n  <ng-template #emptyTemplateRef>\n    @if (effectiveEmptyView) {\n      <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-call-logs__empty-state-view\">\n        <div class=\"cometchat-call-logs__empty-state-view-icon\"></div>\n        <div class=\"cometchat-call-logs__empty-state-view-body\">\n          <div class=\"cometchat-call-logs__empty-state-view-body-title\">\n            {{ 'call_logs_empty_title' | translate }}\n          </div>\n          <div class=\"cometchat-call-logs__empty-state-view-body-description\">\n            {{ 'call_logs_empty_subtitle' | translate }}\n          </div>\n        </div>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Error Template ==================== -->\n  <ng-template #errorTemplateRef>\n    @if (effectiveErrorView) {\n      <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-call-logs__error-state-view\">\n        <div class=\"cometchat-call-logs__error-state-view-icon\"></div>\n        <div class=\"cometchat-call-logs__error-state-view-body\">\n          <div class=\"cometchat-call-logs__error-state-view-body-title\">\n            {{ 'call_logs_error_title' | translate }}\n          </div>\n          <div class=\"cometchat-call-logs__error-state-view-body-description\">\n            {{ 'call_logs_error_subtitle' | translate }}\n          </div>\n          <button\n            class=\"cometchat-call-logs__error-state-view-retry-button\"\n            (click)=\"handleRetryClick()\"\n            type=\"button\">\n            {{ 'error_boundary_retry' | translate }}\n          </button>\n        </div>\n      </div>\n    }\n  </ng-template>\n\n  <!-- ==================== Item Template ==================== -->\n  <ng-template #itemTemplateRef let-call let-i=\"index\">\n    <!-- Custom itemView override (Req 5.1) -->\n    @if (effectiveItemView) {\n      <ng-container *ngTemplateOutlet=\"effectiveItemView; context: { $implicit: call }\"></ng-container>\n    } @else {\n      <div class=\"cometchat-call-logs__list-item\"\n           [class.cometchat-call-logs__list-item--active]=\"isActiveCall(call)\"\n           [attr.data-index]=\"i\"\n           [attr.tabindex]=\"getItemTabIndex(i)\"\n           [attr.aria-label]=\"getCallLogAriaLabel(call)\"\n           role=\"option\"\n           (focus)=\"handleItemFocus(i)\"\n           (keydown.enter)=\"handleWrapperEnter($event, call)\"\n           (keydown.space)=\"handleWrapperSpace($event, call)\"\n           (click)=\"handleItemClick(call)\"\n           >\n        <cometchat-list-item\n          [id]=\"call.getSessionID()\"\n          [avatarURL]=\"getCallUser(call)?.avatar || getCallUser(call)?.icon || ''\"\n          [avatarName]=\"getCallUser(call)?.getName() || ''\"\n          [title]=\"getCallUser(call)?.getName() || ''\"\n          [disableTabIndex]=\"true\"\n          [leadingView]=\"effectiveLeadingView ? customLeadingRef : null\"\n          [titleView]=\"effectiveTitleView ? customTitleRef : null\"\n          [subtitleView]=\"effectiveSubtitleView ? customSubtitleRef : defaultSubtitleRef\"\n          [trailingView]=\"effectiveTrailingView ? customTrailingRef : defaultTrailingRef\"\n          >\n        </cometchat-list-item>\n\n        <!-- Custom leadingView override (Req 5.2) -->\n        <ng-template #customLeadingRef>\n          <ng-container *ngTemplateOutlet=\"effectiveLeadingView; context: { $implicit: call }\"></ng-container>\n        </ng-template>\n\n        <!-- Custom titleView override (Req 5.3) -->\n        <ng-template #customTitleRef>\n          <ng-container *ngTemplateOutlet=\"effectiveTitleView; context: { $implicit: call }\"></ng-container>\n        </ng-template>\n\n        <!-- Custom subtitleView override (Req 5.4) -->\n        <ng-template #customSubtitleRef>\n          <ng-container *ngTemplateOutlet=\"effectiveSubtitleView; context: { $implicit: call }\"></ng-container>\n        </ng-template>\n\n        <!-- Default subtitle: direction icon + date (Req 2.2, 2.3) -->\n        <ng-template #defaultSubtitleRef>\n          <div class=\"cometchat-call-logs__list-item-subtitle\">\n            <!-- Direction icon (aria-hidden since status is in item's aria-label) -->\n            <div class=\"cometchat-call-logs__list-item-subtitle-icon\"\n                 [class.cometchat-call-logs__list-item-subtitle-icon-outgoing-call]=\"isCallSentByMe(call)\"\n                 [class.cometchat-call-logs__list-item-subtitle-icon-missed-call]=\"!isCallSentByMe(call) && isCallMissed(call)\"\n                 [class.cometchat-call-logs__list-item-subtitle-icon-incoming-call]=\"!isCallSentByMe(call) && !isCallMissed(call)\"\n                 aria-hidden=\"true\">\n            </div>\n            <div class=\"cometchat-call-logs__list-item-subtitle-text\" aria-hidden=\"true\">\n              <cometchat-date\n                [timestamp]=\"call.initiatedAt\"\n                [calendarObject]=\"getDateFormat()\">\n              </cometchat-date>\n            </div>\n          </div>\n        </ng-template>\n\n        <!-- Custom trailingView override (Req 5.5) -->\n        <ng-template #customTrailingRef>\n          <ng-container *ngTemplateOutlet=\"effectiveTrailingView; context: { $implicit: call }\"></ng-container>\n        </ng-template>\n\n        <!-- Default trailing: audio/video call button (Req 2.4, 3.1, 8.3) -->\n        <ng-template #defaultTrailingRef>\n          @if (callingEnabled) {\n            <div\n              class=\"cometchat-call-logs__list-item-trailing-view\"\n              [class.cometchat-call-logs__list-item-trailing-view-video]=\"call.type === 'video'\"\n              [class.cometchat-call-logs__list-item-trailing-view-audio]=\"call.type !== 'video'\"\n              role=\"button\"\n              tabindex=\"-1\"\n              [attr.aria-label]=\"(call.type === 'video' ? ('accessibility_video_call' | translate) : ('accessibility_voice_call' | translate)) + ' ' + (getCallUser(call)?.getName() || '')\"\n              (click)=\"$event.stopPropagation(); handleInfoClick(call)\"\n              (keydown.enter)=\"$event.stopPropagation(); handleInfoClick(call)\"\n              (keydown.space)=\"$event.preventDefault(); $event.stopPropagation(); handleInfoClick(call)\">\n            </div>\n          }\n        </ng-template>\n      </div>\n    }\n  </ng-template>\n\n</div>\n</cometchat-error-boundary>\n","/**\n * Public API for CometChatCallLogs component.\n *\n * @module components/cometchat-call-logs\n\n */\nexport { CometChatCallLogsComponent } from './cometchat-call-logs.component';\n\n// Re-export types used by consumers\nexport type { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\n","import {\n  ChangeDetectionStrategy,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  input,\n  OnInit,\n  signal,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatAIStreamingService } from '../../services/cometchat-ai-streaming.service';\nimport { CometChatMarkdownRenderer } from '../cometchat-markdown-renderer/cometchat-markdown-renderer.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\n// Renderer used to draw streamed cards (same component as the persisted bubbles).\nimport { CometChatCardViewComponent } from '@cometchat/cards-angular';\nimport type { CometChatCardActionEvent } from '@cometchat/cards-angular';\nimport { cardPayloadToJson, safeString } from '../../utils/card-utils';\n\n/**\n * A card streamed live inside the AI bubble. Keyed by `cardId`\n * so the `card_start` loader is replaced in place by the `card` payload.\n */\nexport interface StreamedCard {\n  cardId: string;\n  status: 'loading' | 'ready';\n  /** Loader label from card_start (executionText), shown while status === 'loading'. */\n  label: string;\n  /** Stringified raw card payload, set on the `card` event. */\n  cardJson: string;\n}\n\n/**\n * CometChatStreamMessageBubble renders a live-streaming AI response.\n *\n * Mirrors the React CometChatStreamMessageBubble pattern:\n * - Subscribes directly to the global messageStream$ on mount\n * - No runId filtering — the bubble is only alive during one streaming session\n * - Accumulates text deltas and updates signals on every chunk\n */\n@Component({\n  selector: 'cometchat-stream-message-bubble',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CometChatMarkdownRenderer, TranslatePipe, CometChatCardViewComponent],\n  templateUrl: './cometchat-stream-message-bubble.component.html',\n  styleUrls: ['./cometchat-stream-message-bubble.component.css'],\n  host: { style: 'display: block;' },\n})\nexport class CometChatStreamMessageBubble implements OnInit {\n  private readonly streamingService = inject(CometChatAIStreamingService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly document = inject(DOCUMENT);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  /** The chat ID — used to scope events to this chat. */\n  readonly chatId = input.required<string>();\n\n  // ── State signals ─────────────────────────────────────────────────────────\n  readonly isThinking = signal(true);\n  readonly isExecutingTool = signal(false);\n  readonly hasError = signal(false);\n  readonly streamedText = signal('');\n  readonly toolExecutionText = signal('');\n\n  /** Cards streamed in this run (loader → rendered), in arrival order. */\n  readonly streamedCards = signal<StreamedCard[]>([]);\n\n  readonly hasStreamedContent = computed(() => this.streamedText().length > 0);\n\n  ngOnInit(): void {\n    this._subscribeToStream();\n    this._registerOfflineListener();\n  }\n\n  private _subscribeToStream(): void {\n    this.streamingService.messageStream$\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((event) => {\n        // Only handle events for this chat\n        if (event.chatId !== this.chatId()) return;\n\n        const type = event.message.getType();\n\n        switch (type) {\n          case 'run_started':\n            this.isThinking.set(true);\n            this.isExecutingTool.set(false);\n            this.streamedText.set('');\n            this.toolExecutionText.set('');\n            break;\n\n          case 'tool_call_start': {\n            this.isThinking.set(false);\n            this.isExecutingTool.set(true);\n            const execText = (event.message as CometChat.AIAssistantToolStartedEvent).getData?.()?.executionText\n              ?? (event.message as any).getExecutionText?.()\n              ?? '';\n            this.toolExecutionText.set(execText);\n            break;\n          }\n\n          case 'tool_call_end':\n            this.isExecutingTool.set(false);\n            break;\n\n          case 'text_message_content':\n            this.isThinking.set(false);\n            this.isExecutingTool.set(false);\n            if (event.streamedContent !== undefined) {\n              this.streamedText.set(event.streamedContent);\n            }\n            break;\n\n          // ── Streaming card lifecycle ─────────────────────────────────────\n          case 'card_start': {\n            const e = event.message as CometChat.AIAssistantCardStartedEvent;\n            const cardId = safeString(() => e.getCardId?.());\n            const label = safeString(() => e.getExecutionText?.());\n            this.isThinking.set(false);\n            this._upsertCard({ cardId, status: 'loading', label, cardJson: '' });\n            break;\n          }\n\n          case 'card': {\n            const e = event.message as CometChat.AIAssistantCardReceivedEvent;\n            const cardId = safeString(() => e.getCardId?.());\n            let card: unknown;\n            try { card = e.getCard?.(); } catch { card = undefined; }\n            this.isThinking.set(false);\n            // Replace the loader started by card_start (correlated by cardId).\n            this._upsertCard({ cardId, status: 'ready', label: '', cardJson: cardPayloadToJson(card) });\n            break;\n          }\n\n          case 'card_end':\n            // No-op: the run-complete persisted AIAssistantMessage replaces\n            // the streamed bubble via the kit's existing swap.\n            break;\n\n          case 'run_finished':\n            // streaming service already set isStreaming=false; bubble will be removed\n            break;\n        }\n\n        this.cdr.markForCheck();\n      });\n  }\n\n  /**\n   * Pure-forward of a streamed-card action. No persisted message\n   * exists yet, so the event carries `message: null`; the persisted bubble that\n   * follows is the source of truth.\n   */\n  protected onCardAction(event: CometChatCardActionEvent): void {\n    CometChatMessageEvents.ccCardActionClicked.next({\n      message: null,\n      action: event?.action,\n      elementId: event?.elementId,\n      cardJson: event?.cardJson,\n    });\n  }\n\n  /** Inserts a new streamed card or updates the existing one (matched by cardId). */\n  private _upsertCard(card: StreamedCard): void {\n    this.streamedCards.update((cards) => {\n      const idx = cards.findIndex((c) => c.cardId === card.cardId);\n      if (idx === -1) return [...cards, card];\n      const next = cards.slice();\n      next[idx] = card;\n      return next;\n    });\n  }\n\n  private _registerOfflineListener(): void {\n    const win = this.document.defaultView;\n    if (!win) return;\n    const handler = () => {\n      this.streamingService.stopStreamingMessage(this.chatId());\n      this.hasError.set(true);\n      this.cdr.markForCheck();\n    };\n    win.addEventListener('offline', handler);\n    this.destroyRef.onDestroy(() => win.removeEventListener('offline', handler));\n  }\n}\n","<div\n  class=\"cometchat-stream-message-bubble\"\n  role=\"log\"\n  aria-live=\"polite\"\n  aria-relevant=\"additions\"\n>\n  @if (hasError()) {\n    <span class=\"cometchat-stream-message-bubble__error\">\n      {{ 'ai_assistant_chat_no_internet' | translate }}\n    </span>\n  } @else {\n    @if (isThinking() && !hasStreamedContent()) {\n      <span class=\"cometchat-stream-message-bubble__thinking\">\n        {{ 'ai_assistant_chat_thinking' | translate }}\n      </span>\n    }\n\n    @if (isExecutingTool()) {\n      <span class=\"cometchat-stream-message-bubble__tool-execution\">\n        {{ toolExecutionText() || ('ai_assistant_chat_executing_tool' | translate) }}\n      </span>\n    }\n\n    @if (hasStreamedContent()) {\n      <cometchat-markdown-renderer\n        class=\"cometchat-stream-message-bubble__renderer\"\n        [text]=\"streamedText()\"\n        [streaming]=\"true\"\n      />\n    }\n\n    <!-- Streamed cards: card_start → loader, card → rendered card. -->\n    @for (card of streamedCards(); track card.cardId) {\n      @if (card.status === 'loading') {\n        <div class=\"cometchat-stream-message-bubble__card-loader\" aria-busy=\"true\">\n          <div class=\"cometchat-stream-message-bubble__card-loader-skeleton\"></div>\n          <span class=\"cometchat-stream-message-bubble__card-loader-label\">\n            {{ card.label || ('ai_assistant_chat_thinking' | translate) }}\n          </span>\n        </div>\n      } @else if (card.cardJson) {\n        <cometchat-card-view\n          class=\"cometchat-stream-message-bubble__card\"\n          [cardJson]=\"card.cardJson\"\n          themeMode=\"auto\"\n          (action)=\"onCardAction($event)\"\n        ></cometchat-card-view>\n      }\n    }\n  }\n</div>\n","import {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  OnInit,\n  output,\n  signal,\n  TemplateRef,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { MessageStatus } from '../../Enums/Enums';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatUIKitConstants } from '../../constants';\n\n/**\n * CometChatAIAssistantChatHistory renders a sidebar list of past AI conversations.\n * Latest messages appear at the top; scrolling to the bottom fetches older messages.\n *\n * Requirements: 9.1–9.20, 12.2, 12.7, 13.1, 13.8, 16.1, 16.2, 16.4\n */\n@Component({\n  selector: 'cometchat-ai-assistant-chat-history',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [NgTemplateOutlet, TranslatePipe],\n  templateUrl: './cometchat-ai-assistant-chat-history.component.html',\n  styleUrls: ['./cometchat-ai-assistant-chat-history.component.css'],\n})\nexport class CometChatAIAssistantChatHistory implements OnInit {\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly hostRef = inject(ElementRef<HTMLElement>);\n\n  // ── Shared constants ──────────────────────────────────────────────────────\n  readonly shimmerList = CometChatUIKitConstants.shimmerList;\n\n  // ── Signal inputs ─────────────────────────────────────────────────────────\n  readonly user = input<CometChat.User>();\n  readonly group = input<CometChat.Group>();\n  readonly loadLastAgentConversation = input<boolean>(false);\n  readonly showNewChat = input<boolean>(true);\n  readonly emptyStateTemplate = input<TemplateRef<void>>();\n  readonly errorStateTemplate = input<TemplateRef<void>>();\n\n  // ── Signal outputs ────────────────────────────────────────────────────────\n  readonly messageClick = output<CometChat.TextMessage>();\n  readonly newChatClick = output<CometChat.TextMessage | null>();\n  readonly closeClick = output<void>();\n  readonly empty = output<void>();\n\n  // ── State signals ─────────────────────────────────────────────────────────\n  readonly messages = signal<CometChat.TextMessage[]>([]);\n  readonly isLoading = signal(false);\n  readonly hasError = signal(false);\n  readonly focusedIndex = signal(0);\n\n  // ── Private state ─────────────────────────────────────────────────────────\n  private _messagesRequest: CometChat.MessagesRequest | null = null;\n  private _hasMore = true;\n  private _isFirstPage = true;\n  private _activeParentMessageId: number | null = null;\n\n  // ── Computed: messages with date separator metadata ───────────────────────\n  /**\n   * Produces a flat list of items for rendering: each message paired with\n   * a date-separator flag. Computed so no template method calls are needed.\n   */\n  readonly messageItems = computed(() => {\n    const msgs = this.messages();\n    return msgs.map((msg, index) => {\n      const prevMsg = index > 0 ? msgs[index - 1] : null;\n      const showSeparator = prevMsg\n        ? !this._isSameDay(prevMsg.getSentAt() * 1000, msg.getSentAt() * 1000)\n        : true;\n      return { message: msg, showSeparator };\n    });\n  });\n\n  readonly isEmpty = computed(\n    () => !this.isLoading() && !this.hasError() && this.messages().length === 0\n  );\n\n  ngOnInit(): void {\n    this._buildRequest();\n    this.fetchMessages();\n    this._subscribeToMessageSent();\n  }\n\n  // ── Public methods ────────────────────────────────────────────────────────\n\n  /** Called by the scroll handler when the list reaches the bottom — fetches older messages. */\n  onScrollToBottom(): void {\n    if (!this._hasMore || this.isLoading()) return;\n    this.fetchMessages();\n  }\n\n  /** Handles scroll events on the list container. */\n  onListScroll(event: Event): void {\n    const el = event.target as HTMLElement;\n    if (!el) return;\n    const atBottom = el.scrollHeight - el.scrollTop <= el.clientHeight + 50;\n    if (atBottom) {\n      this.onScrollToBottom();\n    }\n  }\n\n  /**\n   * Fetches the next page of messages.\n   *\n   * The SDK's fetchPrevious() returns messages oldest-first within each page.\n   * We reverse each page so the array is always newest-first (index 0 = newest).\n   * Subsequent pages (older) are appended to the end of the array (bottom of list).\n   */\n  fetchMessages(): void {\n    if (!this._messagesRequest || !this._hasMore) return;\n\n    this.isLoading.set(true);\n    this.hasError.set(false);\n\n    this._messagesRequest\n      .fetchPrevious()\n      .then((fetchedMessages: CometChat.BaseMessage[]) => {\n        const textMessages = fetchedMessages.filter(\n          (m): m is CometChat.TextMessage => m instanceof CometChat.TextMessage\n        );\n\n        if (fetchedMessages.length === 0) {\n          this._hasMore = false;\n        }\n\n        // Reverse so newest is at index 0 (top of list).\n        // Each subsequent page contains older messages — append to bottom.\n        const reversed = [...textMessages].reverse();\n\n        if (this._isFirstPage) {\n          this.messages.set(reversed);\n        } else {\n          this.messages.update((prev) => [...prev, ...reversed]);\n        }\n\n        this.isLoading.set(false);\n\n        // Auto-emit most recent message (index 0 = newest after reverse) on first load\n        if (this._isFirstPage && this.loadLastAgentConversation() && reversed.length > 0) {\n          this.messageClick.emit(reversed[0]);\n        }\n\n        if (this._isFirstPage && this.messages().length === 0) {\n          this.empty.emit();\n        }\n\n        this._isFirstPage = false;\n      })\n      .catch(() => {\n        this.isLoading.set(false);\n        if (this.messages().length === 0) {\n          this.hasError.set(true);\n        }\n      });\n  }\n\n  /** Handles clicking a message item. */\n  onMessageClick(message: CometChat.TextMessage): void {\n    this._activeParentMessageId = message.getId();\n    this.messageClick.emit(message);\n  }\n\n  /** Handles deleting a message. */\n  onDeleteMessage(message: CometChat.TextMessage, event: Event): void {\n    event.stopPropagation();\n    const messageId = message.getId().toString();\n\n    CometChat.deleteMessage(messageId)\n      .then(() => {\n        this.messages.update((prev) => prev.filter((m) => m.getId() !== message.getId()));\n\n        if (this._activeParentMessageId === message.getId()) {\n          this._activeParentMessageId = null;\n          this.newChatClick.emit(null);\n        }\n      })\n      .catch(() => {\n        // Silently ignore delete errors — message stays in list\n      });\n  }\n\n  /** Emits closeClick output. */\n  onCloseClick(): void {\n    this.closeClick.emit();\n  }\n\n  /** Emits newChatClick with null. */\n  onNewChatClick(): void {\n    this._activeParentMessageId = null;\n    this.newChatClick.emit(null);\n  }\n\n  // ── Roving tabindex keyboard navigation ───────────────────────────────────\n\n  onKeyDown(event: KeyboardEvent, index: number): void {\n    const msgs = this.messages();\n    if (event.key === 'ArrowDown') {\n      event.preventDefault();\n      this.moveFocusTo(Math.min(index + 1, msgs.length - 1));\n    } else if (event.key === 'ArrowUp') {\n      event.preventDefault();\n      this.moveFocusTo(Math.max(index - 1, 0));\n    } else if (event.key === 'Enter' || event.key === ' ') {\n      event.preventDefault();\n      this.onMessageClick(msgs[index]);\n    }\n  }\n\n  /**\n   * Updates the roving tabindex anchor and moves DOM focus to that option, so\n   * arrow-key navigation actually moves keyboard focus (not just the tabindex).\n   */\n  private moveFocusTo(index: number): void {\n    this.focusedIndex.set(index);\n    const host = this.hostRef.nativeElement as HTMLElement;\n    const items = host.querySelectorAll('.cometchat-ai-assistant-chat-history__item[role=\"option\"]');\n    (items[index] as HTMLElement | undefined)?.focus();\n  }\n\n  /** Returns tabindex for a given list item index. */\n  getTabIndex(index: number): number {\n    return index === this.focusedIndex() ? 0 : -1;\n  }\n\n  // ── Date formatting helper ────────────────────────────────────────────────\n\n  formatDate(timestampSeconds: number): string {\n    const date = new Date(timestampSeconds * 1000);\n    return date.toLocaleDateString(undefined, {\n      year: 'numeric',\n      month: 'short',\n      day: 'numeric',\n    });\n  }\n\n  // ── Private helpers ───────────────────────────────────────────────────────\n\n  private _buildRequest(): void {\n    const user = this.user();\n    const group = this.group();\n\n    const builder = new CometChat.MessagesRequestBuilder()\n      .hideReplies(true)\n      .setLimit(30)\n      .hideDeletedMessages(true);\n\n    if (user) {\n      builder.setUID(user.getUid());\n    } else if (group) {\n      builder.setGUID(group.getGuid());\n    }\n\n    this._messagesRequest = builder.build();\n  }\n\n  private _subscribeToMessageSent(): void {\n    CometChatMessageEvents.ccMessageSent\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((event) => {\n        if (event.status === MessageStatus.success) {\n          const msg = event.message;\n          if (msg instanceof CometChat.TextMessage) {\n            // Prepend so new messages appear at the top (newest-first order)\n            this.messages.update((prev) => [msg, ...prev]);\n          }\n        }\n      });\n  }\n\n  private _isSameDay(tsA: number, tsB: number): boolean {\n    const a = new Date(tsA);\n    const b = new Date(tsB);\n    return (\n      a.getFullYear() === b.getFullYear() &&\n      a.getMonth() === b.getMonth() &&\n      a.getDate() === b.getDate()\n    );\n  }\n}\n","<div class=\"cometchat-ai-assistant-chat-history\">\n\n  <!-- Header: title + close button only -->\n  <div class=\"cometchat-ai-assistant-chat-history__header\">\n    <span class=\"cometchat-ai-assistant-chat-history__title\">\n      {{ 'ai_assistant_chat_history_list_title' | translate }}\n    </span>\n    <button\n      class=\"cometchat-ai-assistant-chat-history__close-btn\"\n      type=\"button\"\n      [attr.aria-label]=\"'close' | translate\"\n      (click)=\"onCloseClick()\"\n    >\n      <span class=\"cometchat-ai-assistant-chat-history__close-icon\" aria-hidden=\"true\"></span>\n    </button>\n  </div>\n\n  <!-- New Chat row: below header, full width -->\n  @if (showNewChat()) {\n    <button\n      class=\"cometchat-ai-assistant-chat-history__new-chat-row\"\n      type=\"button\"\n      [attr.aria-label]=\"'ai_assistant_chat_new_chat' | translate\"\n      (click)=\"onNewChatClick()\"\n    >\n      <span class=\"cometchat-ai-assistant-chat-history__new-chat-icon\" aria-hidden=\"true\"></span>\n      <span class=\"cometchat-ai-assistant-chat-history__new-chat-label\">\n        {{ 'ai_assistant_chat_new_chat' | translate }}\n      </span>\n    </button>\n  }\n\n  <!-- Loading shimmer -->\n  @if (isLoading() && messages().length === 0) {\n    <ul\n      class=\"cometchat-ai-assistant-chat-history__shimmer-list\"\n      aria-busy=\"true\"\n      [attr.aria-label]=\"'accessibility_loading' | translate\"\n    >\n      @for (item of shimmerList; track item) {\n        <li class=\"cometchat-ai-assistant-chat-history__shimmer-item\" aria-hidden=\"true\">\n          <div class=\"cometchat-ai-assistant-chat-history__shimmer-line cometchat-ai-assistant-chat-history__shimmer-line--title\"></div>\n          <div class=\"cometchat-ai-assistant-chat-history__shimmer-line cometchat-ai-assistant-chat-history__shimmer-line--subtitle\"></div>\n        </li>\n      }\n    </ul>\n  }\n\n  <!-- Error state -->\n  @if (hasError()) {\n    <div class=\"cometchat-ai-assistant-chat-history__error-state\" role=\"alert\">\n      @if (errorStateTemplate()) {\n        <ng-container [ngTemplateOutlet]=\"errorStateTemplate()!\" />\n      } @else {\n        <p class=\"cometchat-ai-assistant-chat-history__error-title\">\n          {{ 'ai_assistant_chat_history_error_title' | translate }}\n        </p>\n        <p class=\"cometchat-ai-assistant-chat-history__error-subtitle\">\n          {{ 'ai_assistant_chat_history_error_subtitle' | translate }}\n        </p>\n      }\n    </div>\n  }\n\n  <!-- Empty state -->\n  @if (isEmpty()) {\n    <div class=\"cometchat-ai-assistant-chat-history__empty-state\">\n      @if (emptyStateTemplate()) {\n        <ng-container [ngTemplateOutlet]=\"emptyStateTemplate()!\" />\n      } @else {\n        <p class=\"cometchat-ai-assistant-chat-history__empty-title\">\n          {{ 'ai_assistant_chat_history_empty_title' | translate }}\n        </p>\n        <p class=\"cometchat-ai-assistant-chat-history__empty-subtitle\">\n          {{ 'ai_assistant_chat_history_empty_subtitle' | translate }}\n        </p>\n      }\n    </div>\n  }\n\n  <!-- Message list -->\n  @if (!isLoading() || messages().length > 0) {\n    <ul\n      class=\"cometchat-ai-assistant-chat-history__list\"\n      role=\"listbox\"\n      [attr.aria-label]=\"'ai_assistant_chat_history_list_title' | translate\"\n      (scroll)=\"onListScroll($event)\"\n    >\n      @for (item of messageItems(); track item.message.getId()) {\n        @if (item.showSeparator) {\n          <li\n            class=\"cometchat-ai-assistant-chat-history__date-separator\"\n            role=\"presentation\"\n            aria-hidden=\"true\"\n          >\n            <span class=\"cometchat-ai-assistant-chat-history__date-separator-text\">\n              {{ formatDate(item.message.getSentAt()) }}\n            </span>\n          </li>\n        }\n        <li\n          class=\"cometchat-ai-assistant-chat-history__item\"\n          role=\"option\"\n          [attr.tabindex]=\"getTabIndex($index)\"\n          [attr.aria-selected]=\"false\"\n          (click)=\"onMessageClick(item.message)\"\n          (keydown)=\"onKeyDown($event, $index)\"\n        >\n          <span class=\"cometchat-ai-assistant-chat-history__item-text\">\n            {{ item.message.getText() }}\n          </span>\n          <button\n            class=\"cometchat-ai-assistant-chat-history__delete-btn\"\n            type=\"button\"\n            [attr.aria-label]=\"'message_list_option_delete' | translate\"\n            (click)=\"onDeleteMessage(item.message, $event)\"\n          >\n            <span class=\"cometchat-ai-assistant-chat-history__delete-icon\" aria-hidden=\"true\"></span>\n          </button>\n        </li>\n      }\n\n      <!-- Pagination loading indicator (older messages load at bottom) -->\n      @if (isLoading() && messages().length > 0) {\n        <li class=\"cometchat-ai-assistant-chat-history__loading-more\" aria-hidden=\"true\">\n          <div class=\"cometchat-ai-assistant-chat-history__shimmer-line\"></div>\n        </li>\n      }\n    </ul>\n  }\n\n</div>\n","import {\n  AfterViewInit,\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  DestroyRef,\n  inject,\n  input,\n  OnDestroy,\n  OnInit,\n  output,\n  signal,\n  TemplateRef,\n  untracked,\n  ViewChild,\n  ElementRef,\n} from '@angular/core';\nimport { safeEffect } from '../../utils/safe-effect';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { filter } from 'rxjs';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatAIStreamingService } from '../../services/cometchat-ai-streaming.service';\nimport { CometChatAIAssistantTools } from '../../modals/CometChatAIAssistantTools';\nimport { CometChatMessageEvents } from '../../events/CometChatMessageEvents';\nimport { CometChatUIEvents } from '../../events/CometChatUIEvents';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { MessageStatus } from '../../Enums/Enums';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatMessageHeaderComponent } from '../cometchat-message-header/cometchat-message-header.component';\nimport { CometChatMessageListComponent } from '../cometchat-message-list/cometchat-message-list.component';\nimport { CometChatMessageComposerComponent } from '../cometchat-message-composer/cometchat-message-composer.component';\nimport { CometChatAIAssistantChatHistory } from '../cometchat-ai-assistant-chat-history/cometchat-ai-assistant-chat-history.component';\nimport { CometChatStreamMessageBubble } from '../cometchat-stream-message-bubble/cometchat-stream-message-bubble.component';\nimport { CometChatAvatarComponent } from '../base-elements/cometchat-avatar/cometchat-avatar.component';\nimport { CometChatErrorBoundaryComponent } from '../base-elements/cometchat-error-boundary/cometchat-error-boundary.component';\nimport { MessageBubbleConfigService } from '../../services/message-bubble-config.service';\nimport { CometChatUIKit } from '../../cometchat-uikit';\n\n/**\n * CometChatAIAssistantChat is the top-level orchestrator component for the AI assistant\n * chat experience. It wires together MessageHeader, MessageList, MessageComposer, and the\n * ChatHistory sidebar, managing streaming state, suggestion pills, and focus management.\n *\n * Requirements: 10.1–10.18, 11.1, 12.1, 12.3–12.5, 12.7, 13.1, 13.3, 13.4, 13.7,\n *               13.10, 13.12, 13.13, 16.1\n */\n@Component({\n  selector: 'cometchat-ai-assistant-chat',\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    NgTemplateOutlet,\n    TranslatePipe,\n    CometChatMessageHeaderComponent,\n    CometChatMessageListComponent,\n    CometChatMessageComposerComponent,\n    CometChatAIAssistantChatHistory,\n    CometChatStreamMessageBubble,\n    CometChatAvatarComponent,\n    CometChatErrorBoundaryComponent,\n  ],\n  templateUrl: './cometchat-ai-assistant-chat.component.html',\n  styleUrls: ['./cometchat-ai-assistant-chat.component.css'],\n})\nexport class CometChatAIAssistantChat implements OnInit, AfterViewInit, OnDestroy {\n  // ── DI ───────────────────────────────────────────────────────────────────\n  readonly streamingService = inject(CometChatAIStreamingService);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly bubbleConfigService = inject(MessageBubbleConfigService);\n\n  // ── Signal inputs ─────────────────────────────────────────────────────────\n  readonly user = input.required<CometChat.User>();\n  readonly streamingSpeed = input<number>(30);\n  readonly aiAssistantTools = input<CometChatAIAssistantTools>();\n  readonly loadLastAgentConversation = input<boolean>(false);\n  readonly showSuggestedMessages = input<boolean>(true);\n  readonly suggestedMessages = input<string[]>([]);\n  readonly showBackButton = input<boolean>(false);\n  readonly greetingTemplate = input<TemplateRef<{ $implicit: CometChat.User }>>();\n\n  // ── Outputs ───────────────────────────────────────────────────────────────\n  readonly backClick = output<void>();\n\n  // ── State signals ─────────────────────────────────────────────────────────\n  /**\n   * Parent message ID 7passed to the composer for threading.\n   * Set on first ccMessageSent SUCCESS and when loading from history.\n   */\n  readonly activeParentMessageId = signal<number | null>(null);\n\n  /**\n   * Parent message ID passed to the message list.\n   * Only set when loading an existing conversation from history — NOT on first send.\n   * This prevents the message list from clearing+refetching when the first message is sent.\n   */\n  readonly messageListParentId = signal<number | null>(null);\n\n  readonly isSidebarOpen = signal(false);\n  readonly isSuggestionsVisible = signal(true);\n  readonly newChatKey = signal(0);\n  readonly sidebarTriggerEl = signal<HTMLElement | null>(null);\n  readonly hasComposerText = signal(false);\n  readonly activeRunId = signal<string | null>(null);\n\n  /**\n   * Local mutable copy of loadLastAgentConversation. Set to false after the\n   * first load resolves or when \"New Chat\" is clicked — prevents the message\n   * list from staying in shimmer state forever.\n   */\n  readonly loadLastAgentConversationState = signal(false);\n\n  /** Sentinel message ID used for the temporary streaming placeholder message. */\n  private readonly STREAMING_MESSAGE_ID = -999999;\n\n  /** The currently logged-in user (used in templates for sender checks). */\n  readonly loggedInUser = signal<CometChat.User | null>(CometChatUIKit.getLoggedInUser());\n\n  // ── ViewChild for sidebar focus management ────────────────────────────────\n  @ViewChild('sidebarContainer') sidebarContainerRef?: ElementRef<HTMLElement>;\n  @ViewChild('agentBubbleFooterTpl') agentBubbleFooter?: TemplateRef<any>;\n  @ViewChild('streamBubbleViewTpl') streamBubbleViewTpl?: TemplateRef<any>;\n  @ViewChild(CometChatMessageComposerComponent) composerRef?: CometChatMessageComposerComponent;\n  @ViewChild(CometChatMessageListComponent) messageListRef?: CometChatMessageListComponent;\n\n  // ── Computed signals ──────────────────────────────────────────────────────\n\n  /** True while the AI is streaming a response for this user. */\n  readonly isStreaming = signal(false);\n\n  /** Suggestion pills: prefer explicit input, fall back to user metadata. */\n  readonly availableSuggestions = computed(() => {\n    const explicit = this.suggestedMessages();\n    if (explicit.length > 0) return explicit;\n    const meta = this.user().getMetadata() as Record<string, unknown> | null | undefined;\n    return (meta?.['suggestedMessages'] as string[] | undefined) ?? [];\n  });\n\n  /** Greeting text: from user metadata.greetingMessage, fallback to user name. */\n  readonly greetingMessage = computed(() => {\n    const meta = this.user().getMetadata() as Record<string, unknown> | null | undefined;\n    return (meta?.['greetingMessage'] as string | undefined) ?? this.user().getName();\n  });\n\n  /** Intro message: from user metadata.introductoryMessage, fallback to localized string. */\n  readonly introMessage = computed(() => {\n    const meta = this.user().getMetadata() as Record<string, unknown> | null | undefined;\n    return (\n      (meta?.['introductoryMessage'] as string | undefined) ??\n      CometChatLocalize.getLocalizedString('ai_assistant_chat_intro_message')\n    );\n  });\n\n  /**\n   * MessageList config that disables reply/copy/delete/edit/reactions/thread\n   * for the AI agent chat context.\n   */\n  readonly messageListConfig = computed(() => ({\n    hideReplyInThreadOption: true,\n    hideCopyMessageOption: true,\n    hideDeleteMessageOption: true,\n    hideEditMessageOption: true,\n    hideReactionOption: true,\n    disableInteraction: false,\n  }));\n\n  // ── Effects ───────────────────────────────────────────────────────────────\n\n  constructor() {\n    // Sync streamingSpeed input → service\n    safeEffect(() => {\n      const speed = this.streamingSpeed();\n      untracked(() => this.streamingService.setStreamSpeed(speed));\n    });\n\n    // Sync aiAssistantTools input → service\n    safeEffect(() => {\n      const tools = this.aiAssistantTools();\n      untracked(() => {\n        if (tools) this.streamingService.setAIAssistantTools(tools);\n      });\n    });\n\n    // Reset state when user changes (switching between agent chats)\n    safeEffect(() => {\n      const _user = this.user(); // track user signal\n      untracked(() => {\n        this.streamingService.stopStreamingMessage(_user.getUid());\n        this.activeParentMessageId.set(null);\n        this.messageListParentId.set(null);\n        this.activeRunId.set(null);\n        this.isSuggestionsVisible.set(true);\n        this.hasComposerText.set(false);\n      });\n    });\n\n    // Focus management: when sidebar opens, focus first focusable element inside it\n    safeEffect(() => {\n      const isOpen = this.isSidebarOpen();\n      if (isOpen) {\n        setTimeout(() => {\n          const container = this.sidebarContainerRef?.nativeElement;\n          if (container) {\n            const firstFocusable = container.querySelector<HTMLElement>(\n              'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n            );\n            firstFocusable?.focus();\n          }\n        }, 0);\n      } else {\n        untracked(() => {\n          const trigger = this.sidebarTriggerEl();\n          trigger?.focus();\n        });\n      }\n    });\n  }\n\n  ngOnInit(): void {\n    this.loadLastAgentConversationState.set(this.loadLastAgentConversation());\n    this._subscribeToStreamingState();\n    this._subscribeToMessageSent();\n    this._subscribeToStreamEvents();\n    this._subscribeToAIMessageReceived();\n  }\n\n  ngAfterViewInit(): void {\n    // Register the footer view via the service instead of passing it as an input\n    if (this.agentBubbleFooter) {\n      this.bubbleConfigService.setGlobalView('footerView', this.agentBubbleFooter);\n    }\n    // Register the streaming bubble view for the placeholder message type\n    if (this.streamBubbleViewTpl) {\n      this.bubbleConfigService.setBubbleView('ai_streaming_custom', {\n        bubbleView: this.streamBubbleViewTpl,\n      });\n    }\n  }\n\n  ngOnDestroy(): void {\n    // Clean up service-registered views to avoid leaking templates\n    this.bubbleConfigService.setGlobalView('footerView', null);\n    this.bubbleConfigService.clearType('ai_streaming_custom');\n    this._removeStreamingMessage();\n  }\n\n  // ── Public event handlers ─────────────────────────────────────────────────\n\n  /** Handle back button click — emits backClick output. */\n  onBackClick(): void {\n    this.backClick.emit();\n  }\n\n  /** Start a new chat: reset state, stop streaming, bump key. */\n  onNewChat(): void {\n    this.activeParentMessageId.set(null);\n    this.messageListParentId.set(null);\n    this.activeRunId.set(null);\n    this.streamingService.stopStreamingMessage(this.user().getUid());\n    this.newChatKey.update((k) => k + 1);\n    this.isSuggestionsVisible.set(true);\n    this.hasComposerText.set(false);\n    this.loadLastAgentConversationState.set(false);\n  }\n\n  /** Called by the composer's (textChange) output to track whether text is present. */\n  onComposerTextChange(text: string): void {\n    this.hasComposerText.set(text.trim().length > 0);\n  }\n\n  /** Copy the text content of an AI message to clipboard. */\n  onCopyMessage(message: CometChat.BaseMessage): void {\n    let text = '';\n    // AI assistant messages store text in getAssistantMessageData()\n    const aiMessage = message as any;\n    if (aiMessage.getAssistantMessageData?.()?.getText) {\n      text = aiMessage.getAssistantMessageData().getText() ?? '';\n    }\n    // Fallback to regular getText()\n    if (!text) {\n      text = (message as CometChat.TextMessage).getText?.() ?? '';\n    }\n    if (text && navigator?.clipboard) {\n      navigator.clipboard.writeText(text).catch(() => {});\n    }\n  }\n\n  /** Toggle the chat history sidebar. */\n  onToggleSidebar(triggerEl?: HTMLElement): void {\n    if (triggerEl) this.sidebarTriggerEl.set(triggerEl);\n    this.isSidebarOpen.update((open) => !open);\n  }\n\n  /** Handle a message click from the history sidebar. */\n  onHistoryMessageClick(message: CometChat.TextMessage): void {\n    const msgId = message.getId();\n    this.activeParentMessageId.set(msgId);\n    // Set messageListParentId so the list fetches the historical thread\n    this.messageListParentId.set(msgId);\n    this.isSidebarOpen.set(false);\n    this.streamingService.stopStreamingMessage(this.user().getUid());\n    this.isSuggestionsVisible.set(false);\n    this.loadLastAgentConversationState.set(false);\n  }\n\n  /** Handle new-chat click from the history sidebar. */\n  onHistoryNewChatClick(_message: CometChat.TextMessage | null): void {\n    this.activeParentMessageId.set(null);\n    this.messageListParentId.set(null);\n    this.isSidebarOpen.set(false);\n    this.isSuggestionsVisible.set(true);\n  }\n\n  /** Handle close click from the history sidebar. */\n  onHistoryCloseClick(): void {\n    this.isSidebarOpen.set(false);\n  }\n\n  /** Handle suggestion pill click: emit the text into the composer. */\n  onSuggestionClick(text: string): void {\n    CometChatUIEvents.publishComposeMessage(text);\n    this.isSuggestionsVisible.set(false);\n  }\n\n  /** Handle stop-streaming button click (from the send button view). */\n  onStopStreaming(): void {\n    this.streamingService.stopStreamingMessage(this.user().getUid());\n    this.activeRunId.set(null);\n  }\n\n  /** Handle send button click — delegates to the composer's handleSend(). */\n  onSendClick(): void {\n    if (this.composerRef && this.hasComposerText() && !this.isStreaming()) {\n      this.composerRef.handleSend();\n    }\n  }\n\n  /** Reset conversation state on error boundary retry. */\n  handleRetryClick(): void {\n    this.activeParentMessageId.set(null);\n    this.messageListParentId.set(null);\n    this.activeRunId.set(null);\n    this.streamingService.stopStreamingMessage(this.user().getUid());\n    this.newChatKey.update((k) => k + 1);\n    this.isSuggestionsVisible.set(true);\n    this.hasComposerText.set(false);\n  }\n\n  // ── Private helpers ───────────────────────────────────────────────────────\n\n  /**\n   * Subscribe to the streaming state observable for this user and keep\n   * the isStreaming signal in sync. When streaming stops, remove the\n   * temporary placeholder message from the list.\n   */\n  private _subscribeToStreamingState(): void {\n    this.streamingService.isStreamingFor(this.user().getUid())\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((streaming) => {\n        const wasStreaming = this.isStreaming();\n        this.isStreaming.set(streaming);\n\n        // Only handle removal here — addition is handled after message sent success\n        if (!streaming && wasStreaming) {\n          this._removeStreamingMessage();\n        }\n      });\n  }\n\n  /**\n   * Subscribe to messageStream$ to capture the active runId when run_started fires.\n   * The stream bubble needs the runId to filter events from the shared observable.\n   */\n  private _subscribeToStreamEvents(): void {\n    this.streamingService.messageStream$\n      .pipe(\n        filter((event) => event.chatId === this.user().getUid()),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe((event) => {\n        const type = event.message.getType();\n        if (type === 'run_started' || type === CometChat.AI_ASSISTANT_EVENTS?.RUN_STARTED) {\n          this.activeRunId.set(event.runId);\n        } else if (type === 'run_finished' || type === CometChat.AI_ASSISTANT_EVENTS?.RUN_FINISHED) {\n          this.activeRunId.set(null);\n        }\n      });\n  }\n\n  private _subscribeToMessageSent(): void {\n    CometChatMessageEvents.ccMessageSent\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((event) => {\n        const chatId = this.user().getUid();\n\n        if (event.status === MessageStatus.inprogress) {\n          this.streamingService.startStreamingMessage(chatId);\n          this.isSuggestionsVisible.set(false);\n        } else if (event.status === MessageStatus.success) {\n          this.isSuggestionsVisible.set(false);\n\n          const msg = event.message;\n          if (\n            this.activeParentMessageId() === null &&\n            !msg.getParentMessageId() &&\n            msg.getReceiverId() === chatId\n          ) {\n            const msgId = msg.getId();\n            if (msgId) {\n              // Set the composer threading ID so subsequent messages are sent as thread replies.\n              // Do NOT set messageListParentId here — the message list stays in \"no parentMessageId\"\n              // mode during an active chat session (matching React's goToMessageId pattern).\n              // messageListParentId is only set when loading a historical conversation from the\n              // sidebar (onHistoryMessageClick), which triggers a full thread fetch.\n              // The service's isAgentChatMode flag ensures AI replies (which carry parentMessageId)\n              // are still accepted and displayed in the list without a parentMessageId filter.\n              this.activeParentMessageId.set(msgId);\n            }\n          }\n\n          // Add the streaming placeholder message after the user's message is confirmed sent\n          if (this.isStreaming() && msg.getReceiverId() === chatId) {\n            this._addStreamingMessage();\n          }\n        }\n      });\n  }\n\n  /**\n   * When an AI assistant message is received in real-time, stop streaming\n   * so the stream bubble disappears and only the final message shows.\n   */\n  private _subscribeToAIMessageReceived(): void {\n    CometChatMessageEvents.onAIAssistantMessageReceived\n      .pipe(\n        filter((message) => message.getSender()?.getUid() === this.user().getUid()),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(() => {\n        if (this.isStreaming()) {\n          this.streamingService.stopStreamingMessage(this.user().getUid());\n          this.activeRunId.set(null);\n        }\n      });\n  }\n\n  /**\n   * Adds a temporary placeholder message to the message list that triggers\n   * the streaming bubble view via MessageBubbleConfigService.\n   */\n  private _addStreamingMessage(): void {\n    if (!this.messageListRef) return;\n    const placeholder = new CometChat.TextMessage(\n      this.user().getUid(),\n      '',\n      CometChat.RECEIVER_TYPE.USER\n    );\n    // Use a stable sentinel ID so we can reliably remove it later\n    placeholder.setId(this.STREAMING_MESSAGE_ID);\n    placeholder.setMuid(`streaming_placeholder_${this.user().getUid()}`);\n    placeholder.setType('ai_streaming');\n    placeholder.setCategory(CometChat.CATEGORY_CUSTOM as any);\n    placeholder.setSender(this.user());\n    placeholder.setSentAt(Math.floor(Date.now() / 1000));\n    this.messageListRef.addMessage(placeholder);\n    this.messageListRef.scrollToBottom(false);\n  }\n\n  /**\n   * Removes the temporary streaming placeholder message from the message list.\n   */\n  private _removeStreamingMessage(): void {\n    if (!this.messageListRef) return;\n    this.messageListRef.removeMessage(this.STREAMING_MESSAGE_ID);\n  }\n}\n","<cometchat-error-boundary style=\"display:contents\" [componentName]=\"'AIAssistantChat'\">\n<div class=\"cometchat-ai-assistant-chat\">\n\n  <!-- Message Header -->\n  <div class=\"cometchat-ai-assistant-chat__header\">\n    <cometchat-message-header\n      [user]=\"user()\"\n      [showBackButton]=\"showBackButton()\"\n      [hideVoiceCallButton]=\"true\"\n      [hideVideoCallButton]=\"true\"\n      [auxiliaryButtonView]=\"headerView\"\n      (backClick)=\"onBackClick()\"\n    >\n    </cometchat-message-header>\n\n    <!-- Header action buttons -->\n  <ng-template #headerView>\n      <div class=\"cometchat-ai-assistant-chat__header-actions\">\n      <button\n        class=\"cometchat-ai-assistant-chat__header-icon-btn\"\n        type=\"button\"\n        [attr.aria-label]=\"'ai_assistant_chat_new_chat' | translate\"\n        (click)=\"onNewChat()\"\n      >\n        <span class=\"cometchat-ai-assistant-chat__header-icon cometchat-ai-assistant-chat__header-icon--new-chat\" aria-hidden=\"true\"></span>\n      </button>\n\n      <button\n        #historyToggleBtn\n        class=\"cometchat-ai-assistant-chat__header-icon-btn\"\n        type=\"button\"\n        [attr.aria-label]=\"'ai_assistant_chat_history' | translate\"\n        [attr.aria-expanded]=\"isSidebarOpen()\"\n        [attr.aria-controls]=\"'ai-assistant-chat-sidebar'\"\n        (click)=\"onToggleSidebar(historyToggleBtn)\"\n      >\n        <span class=\"cometchat-ai-assistant-chat__header-icon cometchat-ai-assistant-chat__header-icon--history\" aria-hidden=\"true\"></span>\n      </button>\n    </div>\n  </ng-template>\n  </div>\n\n  <!-- Main content area -->\n  <div class=\"cometchat-ai-assistant-chat__body\">\n\n    <!-- Message List — always rendered; isAgentChat controls fetch behavior -->\n    <!-- When parentMessageId is null: shows emptyView (greeting + suggestions) -->\n    <!-- When parentMessageId is set: fetches and shows that thread's messages -->\n    <div class=\"cometchat-ai-assistant-chat__message-list-wrapper\">\n      @for (key of [newChatKey()]; track key) {\n      <cometchat-message-list\n        [user]=\"user()\"\n        [parentMessageId]=\"messageListParentId() ?? undefined\"\n        [isAgentChat]=\"true\"\n        [loadLastAgentConversation]=\"loadLastAgentConversationState()\"\n        [emptyView]=\"agentEmptyState\"\n        [hideReplyInThreadOption]=\"messageListConfig().hideReplyInThreadOption\"\n        [hideCopyMessageOption]=\"messageListConfig().hideCopyMessageOption\"\n        [hideDeleteMessageOption]=\"messageListConfig().hideDeleteMessageOption\"\n        [hideEditMessageOption]=\"messageListConfig().hideEditMessageOption\"\n        [hideReactionOption]=\"messageListConfig().hideReactionOption\"\n        [disableInteraction]=\"messageListConfig().disableInteraction\"\n        [hideDateSeparator]=\"true\"\n        [hideStickyDate]=\"true\"\n        [hideGroupActionMessages]=\"true\"\n        [disableSoundForMessages]=\"true\"\n      >\n      </cometchat-message-list>\n      }\n    </div>\n\n    <!-- Composer area — send button view handles stop/send inside the composer -->\n    <div\n      class=\"cometchat-ai-assistant-chat__composer-area\"\n      [class.cometchat-ai-assistant-chat__composer-area--streaming]=\"isStreaming()\"\n    >\n      <cometchat-message-composer\n        [user]=\"user()\"\n        [parentMessageId]=\"activeParentMessageId() ?? undefined\"\n        [placeholderText]=\"'ai_assistant_chat_composer_placeholder'\"\n        [hideAttachmentButton]=\"true\"\n        [hideVoiceRecordingButton]=\"true\"\n        [hideStickersButton]=\"true\"\n        [hideLiveReaction]=\"true\"\n        [hideEmojiKeyboardButton]=\"true\"\n        [disableMentions]=\"true\"\n        [sendButtonView]=\"sendButtonTemplate\"\n        (textChange)=\"onComposerTextChange($event)\"\n      >\n      </cometchat-message-composer>\n    </div>\n  </div>\n\n  <!-- Chat History Sidebar — always mounted so history fetches on init.\n       loadLastAgentConversation auto-emits messageClick on first load. -->\n  <div\n    class=\"cometchat-ai-assistant-chat__sidebar\"\n    [class.cometchat-ai-assistant-chat__sidebar--open]=\"isSidebarOpen()\"\n    [attr.aria-hidden]=\"!isSidebarOpen()\"\n  >\n    <div #sidebarContainer\n         id=\"ai-assistant-chat-sidebar\"\n         class=\"cometchat-ai-assistant-chat__sidebar-content\"\n         role=\"complementary\"\n         (keydown.escape)=\"onHistoryCloseClick()\"\n         [attr.aria-label]=\"'ai_assistant_chat_history_title' | translate\">\n      <cometchat-ai-assistant-chat-history\n        [user]=\"user()\"\n        [loadLastAgentConversation]=\"loadLastAgentConversationState()\"\n        (messageClick)=\"onHistoryMessageClick($event)\"\n        (newChatClick)=\"onHistoryNewChatClick($event)\"\n        (closeClick)=\"onHistoryCloseClick()\"\n      >\n      </cometchat-ai-assistant-chat-history>\n    </div>\n  </div>\n\n</div>\n</cometchat-error-boundary>\n\n<!-- Send / Stop button rendered inside the composer -->\n<ng-template #sendButtonTemplate>\n  <div\n    class=\"cometchat-ai-assistant-chat__send-button-view\"\n    [class.cometchat-ai-assistant-chat__send-button-view--streaming]=\"isStreaming()\"\n    [class.cometchat-ai-assistant-chat__send-button-view--active]=\"hasComposerText() && !isStreaming()\"\n    [attr.aria-label]=\"isStreaming() ? ('ai_assistant_chat_stop_streaming' | translate) : ('send_message' | translate)\"\n    role=\"button\"\n    tabindex=\"0\"\n    (click)=\"isStreaming() ? onStopStreaming() : onSendClick()\"\n    (keydown.enter)=\"isStreaming() ? onStopStreaming() : onSendClick()\"\n    (keydown.space)=\"isStreaming() ? onStopStreaming() : onSendClick()\"\n  >\n    <span class=\"cometchat-ai-assistant-chat__send-button-icon\" aria-hidden=\"true\"></span>\n  </div>\n</ng-template>\n\n<!-- Agent bubble footer: copy button shown below each AI response -->\n<ng-template #agentBubbleFooterTpl let-message>\n  @if (message && message.getSender()?.getUid() && message.getSender()?.getUid() !== loggedInUser()?.getUid()) {\n    <div class=\"cometchat-ai-assistant-chat__bubble-footer\">\n      <button\n        class=\"cometchat-ai-assistant-chat__bubble-copy-btn\"\n        type=\"button\"\n        [attr.aria-label]=\"'copy_message' | translate\"\n        (click)=\"onCopyMessage(message)\"\n      >\n        <span class=\"cometchat-ai-assistant-chat__bubble-copy-icon\" aria-hidden=\"true\"></span>\n      </button>\n    </div>\n  }\n</ng-template>\n\n<!-- Stream bubble view: rendered as a full bubble replacement for the streaming placeholder message -->\n<ng-template #streamBubbleViewTpl let-message>\n  <div class=\"cometchat-ai-assistant-chat__stream-bubble-wrapper\">\n    <div class=\"cometchat-ai-assistant-chat__stream-bubble-avatar\">\n      <cometchat-avatar [image]=\"user().getAvatar()\" [name]=\"user().getName()\"></cometchat-avatar>\n    </div>\n    <cometchat-stream-message-bubble [chatId]=\"user().getUid()\" />\n  </div>\n</ng-template>\n\n<!-- Empty state: greeting + intro + suggestion pills -->\n<ng-template #agentEmptyState>\n  <div class=\"cometchat-ai-assistant-chat__empty-state\">\n    <div class=\"cometchat-ai-assistant-chat__empty-state-content\">\n\n      <div class=\"cometchat-ai-assistant-chat__empty-state-icon\">\n        <img src=\"assets/Profile.png\" [attr.alt]=\"'ai_assistant_chat_title' | translate\" />\n      </div>\n\n      @if (greetingTemplate()) {\n        <ng-container\n          [ngTemplateOutlet]=\"greetingTemplate()!\"\n          [ngTemplateOutletContext]=\"{ $implicit: user() }\"\n        />\n      } @else {\n        <div class=\"cometchat-ai-assistant-chat__empty-state-greeting-message\">\n          {{ greetingMessage() }}\n        </div>\n        <div class=\"cometchat-ai-assistant-chat__empty-state-intro-message\">\n          {{ introMessage() }}\n        </div>\n      }\n\n      @if (showSuggestedMessages() && availableSuggestions().length > 0) {\n        <div class=\"cometchat-ai-assistant-chat__empty-state-suggested-messages\">\n          @for (suggestion of availableSuggestions(); track suggestion) {\n            <button\n              class=\"cometchat-ai-assistant-chat__suggested-message-pill\"\n              type=\"button\"\n              [attr.aria-label]=\"suggestion\"\n              (click)=\"onSuggestionClick(suggestion)\"\n            >\n              {{ suggestion }}\n              <span class=\"cometchat-ai-assistant-chat__suggested-message-icon\" aria-hidden=\"true\"></span>\n            </button>\n          }\n        </div>\n      }\n\n    </div>\n  </div>\n</ng-template>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnInit,\n  OnDestroy,\n  TemplateRef,\n  signal,\n  computed,\n  WritableSignal,\n  Signal,\n  ChangeDetectionStrategy,\n  ElementRef,\n  ViewChild,\n  inject,\n  DestroyRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSearchFilter, CometChatSearchScope, States } from '../../Enums/Enums';\nimport { CometChatOption } from '../../modals';\nimport { CalendarObject } from '../../resources/CometChatLocalize/localization.interfaces';\nimport { CometChatTextFormatter } from '../../formatters/cometchat-text-formatter';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport {\n  getAvailableFilters,\n  getVisibleFilters,\n  toggleFilter,\n  shouldRenderConversations,\n  shouldRenderMessages,\n} from './search-filter.utils';\nimport { CometChatSearchConversationsListComponent } from './cometchat-search-conversations-list/cometchat-search-conversations-list.component';\nimport { CometChatSearchMessagesListComponent } from './cometchat-search-messages-list/cometchat-search-messages-list.component';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize';\nimport { CometChatTemplatesService } from '../../services/templates.service';\nimport { FormatterConfigService } from '../../services/formatter-config.service';\nimport { CometChatUIKit } from '../../cometchat-uikit';\nimport { SearchConversationsService } from '../../services/search-conversations.service';\nimport { SearchMessagesService } from '../../services/search-messages.service';\n\nexport interface SearchConversationClickEvent {\n  conversation: CometChat.Conversation;\n  searchKeyword: string;\n}\n\nexport interface SearchMessageClickEvent {\n  message: CometChat.BaseMessage;\n  searchKeyword: string;\n}\n\nconst DEFAULT_FILTERS: CometChatSearchFilter[] = [\n  CometChatSearchFilter.Audio,\n  CometChatSearchFilter.Documents,\n  CometChatSearchFilter.Groups,\n  CometChatSearchFilter.Photos,\n  CometChatSearchFilter.Videos,\n  CometChatSearchFilter.Links,\n  CometChatSearchFilter.Unread,\n];\n\n/* Template inputs use broad context types for consumer flexibility */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n/**\n * Main search container component.\n * Provides search input, filter bar, and orchestrates child result components.\n */\n@Component({\n  selector: 'cometchat-search',\n  standalone: true,\n  imports: [\n    CommonModule,\n    TranslatePipe,\n    CometChatSearchConversationsListComponent,\n    CometChatSearchMessagesListComponent,\n  ],\n  templateUrl: './cometchat-search.component.html',\n  styleUrls: ['./cometchat-search.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  // Provide services at component level so each CometChatSearchComponent instance\n  // gets its own isolated service instances. Without this, both the global search\n  // and the in-chat (scoped) search share the same singleton services, causing\n  // filter selections in one to trigger searches and shimmer in the other.\n  providers: [SearchConversationsService, SearchMessagesService],\n})\nexport class CometChatSearchComponent implements OnInit, OnDestroy {\n  @Input() searchIn: CometChatSearchScope[] = [];\n  @Input() searchFilters: CometChatSearchFilter[] = DEFAULT_FILTERS;\n  @Input() initialSearchFilter?: CometChatSearchFilter;\n  @Input() hideBackButton = false;\n  @Input() defaultSearchText?: string;\n  @Input() uid?: string;\n  @Input() guid?: string;\n  @Input() hideGroupType = false;\n  @Input() hideUserStatus = false;\n  @Input() hideReceipts = false;\n  @Input() textFormatters: CometChatTextFormatter[] = [];\n  @Input() messageSentAtDateTimeFormat?: CalendarObject;\n  @Input() conversationsRequestBuilder?: CometChat.ConversationsRequestBuilder;\n  @Input() messagesRequestBuilder?: CometChat.MessagesRequestBuilder;\n  @Input() conversationOptions?: (conv: CometChat.Conversation) => CometChatOption[];\n\n  // Conversation templates\n  @Input() conversationItemView?: TemplateRef<any>;\n  @Input() conversationLeadingView?: TemplateRef<any>;\n  @Input() conversationTitleView?: TemplateRef<any>;\n  @Input() conversationSubtitleView?: TemplateRef<any>;\n  @Input() conversationTrailingView?: TemplateRef<any>;\n\n  // Message templates\n  @Input() messageItemView?: TemplateRef<any>;\n  @Input() messageLeadingView?: TemplateRef<any>;\n  @Input() messageTitleView?: TemplateRef<any>;\n  @Input() messageSubtitleView?: TemplateRef<any>;\n  @Input() messageTrailingView?: TemplateRef<any>;\n\n  // State view templates\n  @Input() initialView?: TemplateRef<any>;\n  @Input() loadingView?: TemplateRef<any>;\n  @Input() emptyView?: TemplateRef<any>;\n  @Input() errorView?: TemplateRef<any>;\n\n  @Output() backClick = new EventEmitter<void>();\n  @Output() conversationClick = new EventEmitter<SearchConversationClickEvent>();\n  @Output() messageClick = new EventEmitter<SearchMessageClickEvent>();\n  @Output() searchError = new EventEmitter<CometChat.CometChatException>();\n\n  // ==================== Service Injection ====================\n  private templatesService = inject(CometChatTemplatesService);\n  private formatterConfig = inject(FormatterConfigService);\n\n  // ==================== Effective Text Formatters ====================\n\n  /**\n   * Resolves the effective text formatters to pass to child lists.\n   *\n   * If the consumer provided `textFormatters`, use those. Otherwise, fall back\n   * to the default formatters from `FormatterConfigService` with the logged-in\n   * user set on the mentions formatter so SDK mentions render as `@DisplayName`\n   * instead of the raw `<@uid:xxx>` tag.\n   */\n  get effectiveTextFormatters(): CometChatTextFormatter[] {\n    if (this.textFormatters && this.textFormatters.length > 0) {\n      return this.textFormatters;\n    }\n    const loggedInUser = CometChatUIKit.getLoggedInUser() ?? undefined;\n    return this.formatterConfig.getFormattersWithContext(loggedInUser);\n  }\n\n  // ==================== Template Resolution (@Input > Service Template > Shared > undefined) ====================\n\n  // Conversation result templates\n  get effectiveConversationItemView(): TemplateRef<any> | undefined {\n    return this.conversationItemView || this.templatesService.getSearchTemplates().conversationItemView;\n  }\n  get effectiveConversationLeadingView(): TemplateRef<any> | undefined {\n    return this.conversationLeadingView || this.templatesService.getSearchTemplates().conversationLeadingView;\n  }\n  get effectiveConversationTitleView(): TemplateRef<any> | undefined {\n    return this.conversationTitleView || this.templatesService.getSearchTemplates().conversationTitleView;\n  }\n  get effectiveConversationSubtitleView(): TemplateRef<any> | undefined {\n    return this.conversationSubtitleView || this.templatesService.getSearchTemplates().conversationSubtitleView;\n  }\n  get effectiveConversationTrailingView(): TemplateRef<any> | undefined {\n    return this.conversationTrailingView || this.templatesService.getSearchTemplates().conversationTrailingView;\n  }\n\n  // Message result templates\n  get effectiveMessageItemView(): TemplateRef<any> | undefined {\n    return this.messageItemView || this.templatesService.getSearchTemplates().messageItemView;\n  }\n  get effectiveMessageLeadingView(): TemplateRef<any> | undefined {\n    return this.messageLeadingView || this.templatesService.getSearchTemplates().messageLeadingView;\n  }\n  get effectiveMessageTitleView(): TemplateRef<any> | undefined {\n    return this.messageTitleView || this.templatesService.getSearchTemplates().messageTitleView;\n  }\n  get effectiveMessageSubtitleView(): TemplateRef<any> | undefined {\n    return this.messageSubtitleView || this.templatesService.getSearchTemplates().messageSubtitleView;\n  }\n  get effectiveMessageTrailingView(): TemplateRef<any> | undefined {\n    return this.messageTrailingView || this.templatesService.getSearchTemplates().messageTrailingView;\n  }\n\n  // State view templates (@Input > Search service > Shared service > undefined)\n  get effectiveInitialView(): TemplateRef<any> | undefined {\n    return this.initialView || this.templatesService.getSearchTemplates().initialView;\n  }\n  get effectiveLoadingView(): TemplateRef<any> | undefined {\n    return this.loadingView\n      || this.templatesService.getSearchTemplates().loadingView\n      || this.templatesService.getSharedTemplates().loadingView;\n  }\n  get effectiveEmptyView(): TemplateRef<any> | undefined {\n    return this.emptyView\n      || this.templatesService.getSearchTemplates().emptyView\n      || this.templatesService.getSharedTemplates().emptyView;\n  }\n  get effectiveErrorView(): TemplateRef<any> | undefined {\n    return this.errorView\n      || this.templatesService.getSearchTemplates().errorView\n      || this.templatesService.getSharedTemplates().errorView;\n  }\n\n  @ViewChild('searchInput') searchInputRef!: ElementRef<HTMLInputElement>;\n\n  readonly searchValue: WritableSignal<string> = signal<string>('');\n  readonly searchText: WritableSignal<string> = signal<string>('');\n  readonly activeFilters: WritableSignal<CometChatSearchFilter[]> = signal<CometChatSearchFilter[]>(\n    []\n  );\n\n  private readonly searchSubject = new Subject<string>();\n  private readonly destroyRef = inject(DestroyRef);\n\n  readonly visibleFilters: Signal<CometChatSearchFilter[]> = computed(() =>\n    getVisibleFilters(\n      getAvailableFilters(this.searchIn, this.searchFilters),\n      this.activeFilters(),\n      this.uid,\n      this.guid,\n      this.searchIn\n    )\n  );\n\n  readonly showConversations: Signal<boolean> = computed(() =>\n    shouldRenderConversations(\n      this.searchText(),\n      this.activeFilters(),\n      this.searchIn,\n      this.uid,\n      this.guid\n    )\n  );\n\n  readonly showMessages: Signal<boolean> = computed(() =>\n    shouldRenderMessages(\n      this.searchText(),\n      this.activeFilters(),\n      this.searchIn,\n      this.uid,\n      this.guid\n    )\n  );\n\n  readonly showInitialView: Signal<boolean> = computed(\n    () => this.searchText().trim() === '' && this.activeFilters().length === 0\n  );\n\n  // ==================== Unified empty/error state ====================\n  readonly conversationsState: WritableSignal<States> = signal<States>(States.loaded);\n  readonly messagesState: WritableSignal<States> = signal<States>(States.loaded);\n\n  /** True when both scopes are active (so we coordinate a unified empty/error view). */\n  readonly bothScopesActive: Signal<boolean> = computed(\n    () => this.showConversations() && this.showMessages()\n  );\n\n  /**\n   * Hide the conversations section entirely when:\n   * - Both scopes active AND conversations is empty AND messages has data\n   * - Both scopes active AND both empty (unified empty shown by parent, no headers)\n   * - Both scopes active AND both error (unified error shown by parent, no headers)\n   */\n  readonly hideConversationsSection: Signal<boolean> = computed(() => {\n    if (!this.bothScopesActive()) return false;\n    const cs = this.conversationsState();\n    const ms = this.messagesState();\n    // Both empty → parent shows unified empty, hide both sections\n    if (cs === States.empty && ms === States.empty) return true;\n    // Both error → parent shows unified error, hide both sections\n    if (cs === States.error && ms === States.error) return true;\n    // Conversations empty but messages has data → hide conversations entirely\n    if (cs === States.empty && ms === States.loaded) return true;\n    return false;\n  });\n\n  /**\n   * Hide the messages section entirely when:\n   * - Both scopes active AND messages is empty AND conversations has data\n   * - Both scopes active AND both empty (unified empty shown by parent)\n   * - Both scopes active AND both error (unified error shown by parent)\n   */\n  readonly hideMessagesSection: Signal<boolean> = computed(() => {\n    if (!this.bothScopesActive()) return false;\n    const cs = this.conversationsState();\n    const ms = this.messagesState();\n    if (cs === States.empty && ms === States.empty) return true;\n    if (cs === States.error && ms === States.error) return true;\n    if (ms === States.empty && cs === States.loaded) return true;\n    return false;\n  });\n\n  /** Show a single unified empty view when both child lists report empty. */\n  readonly showUnifiedEmpty: Signal<boolean> = computed(() => {\n    if (!this.bothScopesActive()) return false;\n    return this.conversationsState() === States.empty && this.messagesState() === States.empty;\n  });\n\n  /** Show a single unified error view when both child lists report error. */\n  readonly showUnifiedError: Signal<boolean> = computed(() => {\n    if (!this.bothScopesActive()) return false;\n    return this.conversationsState() === States.error && this.messagesState() === States.error;\n  });\n\n  handleConversationsStateChange(state: States): void {\n    this.conversationsState.set(state);\n  }\n\n  handleMessagesStateChange(state: States): void {\n    this.messagesState.set(state);\n  }\n\n  ngOnInit(): void {\n    this.searchSubject.pipe(debounceTime(500), takeUntilDestroyed(this.destroyRef)).subscribe(text => {\n      this.searchText.set(text);\n    });\n\n    if (this.initialSearchFilter && this.activeFilters().length === 0) {\n      this.activeFilters.set([this.initialSearchFilter]);\n    }\n\n    // ENG-35072: When scoped to a specific user/group (uid/guid), reset active filters\n    // to prevent conversation-scope filters from a previous global search from leaking\n    // into the message search results for this conversation.\n    if ((this.uid || this.guid) && this.activeFilters().some(f => [\n      CometChatSearchFilter.Conversations,\n      CometChatSearchFilter.Unread,\n      CometChatSearchFilter.Groups,\n    ].includes(f))) {\n      this.activeFilters.set([]);\n    }\n\n    if (this.defaultSearchText) {\n      this.searchValue.set(this.defaultSearchText);\n      this.searchText.set(this.defaultSearchText);\n    }\n\n    setTimeout(() => this.searchInputRef?.nativeElement?.focus(), 100);\n  }\n\n  ngOnDestroy(): void {\n    // Subscriptions are cleaned up automatically via takeUntilDestroyed(this.destroyRef)\n  }\n\n  handleSearchInput(event: Event): void {\n    const value = (event.target as HTMLInputElement).value;\n    this.searchValue.set(value);\n    this.searchSubject.next(value.trim());\n  }\n\n  handleClearSearch(): void {\n    this.searchValue.set('');\n    this.searchText.set('');\n    this.activeFilters.set([]);\n    this.searchInputRef?.nativeElement?.focus();\n  }\n\n  handleBackClick(): void {\n    this.backClick.emit();\n  }\n\n  handleFilterToggle(filterId: CometChatSearchFilter): void {\n    this.activeFilters.update(current => toggleFilter(current, filterId));\n  }\n\n  isFilterActive(filterId: CometChatSearchFilter): boolean {\n    return this.activeFilters().includes(filterId);\n  }\n\n  handleConversationClick(event: SearchConversationClickEvent): void {\n    this.conversationClick.emit(event);\n  }\n\n  handleMessageClick(event: SearchMessageClickEvent): void {\n    this.messageClick.emit(event);\n  }\n\n  getFilterLabel(filterId: CometChatSearchFilter): string {\n    const keyMap: Record<string, string> = {\n      [CometChatSearchFilter.Audio]: 'search_filter_audio',\n      [CometChatSearchFilter.Conversations]: 'search_filter_conversations',\n      [CometChatSearchFilter.Documents]: 'search_filter_documents',\n      [CometChatSearchFilter.Groups]: 'search_filter_groups',\n      [CometChatSearchFilter.Links]: 'search_filter_links',\n      [CometChatSearchFilter.Messages]: 'search_filter_messages',\n      [CometChatSearchFilter.Photos]: 'search_filter_photos',\n      [CometChatSearchFilter.Unread]: 'search_filter_unread',\n      [CometChatSearchFilter.Videos]: 'search_filter_videos',\n    };\n    return CometChatLocalize.getLocalizedString(keyMap[filterId] ?? '');\n  }\n}\n","<div class=\"cometchat cometchat-search\" role=\"search\" [attr.aria-label]=\"'search_title' | translate\">\n  <!-- Header: back button + search input -->\n  <div class=\"cometchat-search__header\">\n    @if (!hideBackButton) {\n      <button class=\"cometchat-search__back-button\"\n              data-testid=\"search-back-button\"\n              [attr.aria-label]=\"'accessibility_back' | translate\"\n              (click)=\"handleBackClick()\">\n        <span class=\"cometchat-search__back-button-icon\"></span>\n      </button>\n    }\n    <div class=\"cometchat-search__search-bar\">\n      <div class=\"cometchat-search__input\">\n        <input #searchInput\n               type=\"text\"\n               role=\"searchbox\"\n               [value]=\"searchValue()\"\n               (input)=\"handleSearchInput($event)\"\n               [placeholder]=\"'search_placeholder' | translate\"\n               [attr.aria-label]=\"'search_placeholder' | translate\"\n               data-testid=\"search-input\" />\n        @if (searchValue() || activeFilters().length > 0) {\n          <button class=\"cometchat-search__input-clear-button\"\n                  data-testid=\"search-clear-button\"\n                  [attr.aria-label]=\"'accessibility_clear_search' | translate\"\n                  (click)=\"handleClearSearch()\">\n            <span class=\"cometchat-search__input-clear-button-icon\"></span>\n          </button>\n        }\n      </div>\n    </div>\n  </div>\n\n  <!-- Filter bar -->\n  <div class=\"cometchat-search__body\">\n    <div class=\"cometchat-search__body-filters\" role=\"toolbar\" [attr.aria-label]=\"'search_title' | translate\">\n      @for (filterId of visibleFilters(); track filterId) {\n        <button class=\"cometchat-search__body-filter\"\n                [class.cometchat-search__body-filter-active]=\"isFilterActive(filterId)\"\n                [attr.aria-pressed]=\"isFilterActive(filterId)\"\n                [attr.data-testid]=\"'search-filter-' + filterId\"\n                (click)=\"handleFilterToggle(filterId)\">\n          <span class=\"cometchat-search__body-filter-icon\"\n                [ngClass]=\"'cometchat-search__body-filter-icon--' + filterId\"></span>\n          {{ getFilterLabel(filterId) }}\n          @if (isFilterActive(filterId)) {\n            <span class=\"cometchat-search__body-filter-close-icon\"></span>\n          }\n        </button>\n      }\n    </div>\n  </div>\n\n  <!-- Results -->\n  @if (showInitialView()) {\n    @if (effectiveInitialView) {\n      <ng-container *ngTemplateOutlet=\"effectiveInitialView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-search__initial-view\">\n        <div class=\"cometchat-search__initial-view-icon\"></div>\n        <span class=\"cometchat-search__initial-view-title\">{{ 'search_empty_title' | translate }}</span>\n        <span class=\"cometchat-search__initial-view-subtitle\">{{ 'search_empty_subtitle' | translate }}</span>\n      </div>\n    }\n  } @else {\n    <div class=\"cometchat-search__results\">\n      @if (showConversations()) {\n        @defer {\n          <cometchat-search-conversations-list\n            [searchKeyword]=\"searchText()\"\n            [activeFilters]=\"activeFilters()\"\n            [useScrollPagination]=\"!!guid || !!uid || activeFilters().length > 0\"\n            [conversationsRequestBuilder]=\"conversationsRequestBuilder\"\n            [hideUserStatus]=\"hideUserStatus\"\n            [hideGroupType]=\"hideGroupType\"\n            [hideReceipts]=\"hideReceipts\"\n            [textFormatters]=\"effectiveTextFormatters\"\n            [itemTemplate]=\"effectiveConversationItemView\"\n            [leadingView]=\"effectiveConversationLeadingView\"\n            [titleView]=\"effectiveConversationTitleView\"\n            [subtitleView]=\"effectiveConversationSubtitleView\"\n            [trailingView]=\"effectiveConversationTrailingView\"\n            [loadingView]=\"effectiveLoadingView\"\n            [emptyView]=\"effectiveEmptyView\"\n            [errorView]=\"effectiveErrorView\"\n            [conversationOptions]=\"conversationOptions\"\n            [hideSection]=\"hideConversationsSection()\"\n            [suppressEmptyErrorView]=\"bothScopesActive()\"\n            (stateChange)=\"handleConversationsStateChange($event)\"\n            (itemClick)=\"handleConversationClick($event)\"\n            (searchError)=\"searchError.emit($event)\">\n          </cometchat-search-conversations-list>\n        }\n      }\n\n      @if (showMessages()) {\n        @defer {\n          <cometchat-search-messages-list\n            [searchKeyword]=\"searchText()\"\n            [activeFilters]=\"activeFilters()\"\n            [uid]=\"uid\"\n            [guid]=\"guid\"\n            [alwaysShowSeeMore]=\"!guid && !uid && activeFilters().length === 0\"\n            [messagesRequestBuilder]=\"messagesRequestBuilder\"\n            [textFormatters]=\"effectiveTextFormatters\"\n            [messageDateTimeFormat]=\"messageSentAtDateTimeFormat\"\n            [itemTemplate]=\"effectiveMessageItemView\"\n            [leadingView]=\"effectiveMessageLeadingView\"\n            [titleView]=\"effectiveMessageTitleView\"\n            [subtitleView]=\"effectiveMessageSubtitleView\"\n            [trailingView]=\"effectiveMessageTrailingView\"\n            [loadingView]=\"effectiveLoadingView\"\n            [emptyView]=\"effectiveEmptyView\"\n            [errorView]=\"effectiveErrorView\"\n            [hideSection]=\"hideMessagesSection()\"\n            [suppressEmptyErrorView]=\"bothScopesActive()\"\n            (stateChange)=\"handleMessagesStateChange($event)\"\n            (itemClick)=\"handleMessageClick($event)\"\n            (searchError)=\"searchError.emit($event)\">\n          </cometchat-search-messages-list>\n        }\n      }\n\n      <!-- Unified empty view (shown when both lists are empty) -->\n      @if (showUnifiedEmpty()) {\n        @if (effectiveEmptyView) {\n          <ng-container *ngTemplateOutlet=\"effectiveEmptyView\"></ng-container>\n        } @else {\n          <div class=\"cometchat-search__empty-view\" aria-live=\"assertive\">\n            <div class=\"cometchat-search__empty-view-icon\"></div>\n            <div class=\"cometchat-search__empty-view-body\">\n              <div class=\"cometchat-search__empty-view-body-title\">\n                {{ 'search_no_result_title' | translate }}\n              </div>\n              <div class=\"cometchat-search__empty-view-body-description\">\n                {{ 'search_no_result_subtitle' | translate }}\n              </div>\n            </div>\n          </div>\n        }\n      }\n\n      <!-- Unified error view (shown when either list errors and neither has data) -->\n      @if (showUnifiedError()) {\n        @if (effectiveErrorView) {\n          <ng-container *ngTemplateOutlet=\"effectiveErrorView\"></ng-container>\n        } @else {\n          <div class=\"cometchat-search__error-view\" aria-live=\"assertive\">\n            <div class=\"cometchat-search__error-view-icon\"></div>\n            <div class=\"cometchat-search__error-view-body\">\n              <div class=\"cometchat-search__error-view-body-title\">\n                {{ 'search_error_title' | translate }}\n              </div>\n              <div class=\"cometchat-search__error-view-body-description\">\n                {{ 'search_error_subtitle' | translate }}\n              </div>\n            </div>\n          </div>\n        }\n      }\n    </div>\n  }\n</div>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnChanges,\n  OnInit,\n  OnDestroy,\n  SimpleChanges,\n  TemplateRef,\n  ViewChild,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { safeEffect } from '../../../utils/safe-effect';\nimport { CommonModule } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSearchFilter, States } from '../../../Enums/Enums';\nimport { SearchConversationsService } from '../../../services/search-conversations.service';\nimport { CometChatOption } from '../../../modals';\nimport { CalendarObject } from '../../../resources/CometChatLocalize/localization.interfaces';\nimport { CometChatTextFormatter } from '../../../formatters/cometchat-text-formatter';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatUIKit } from '../../../cometchat-uikit';\nimport { CometChatConversationItemComponent } from '../../cometchat-conversation-item/cometchat-conversation-item.component';\nimport { CometChatPaginatedListComponent } from '../../cometchat-paginated-list/cometchat-paginated-list.component';\n\n/**\n * Renders conversation search results using CometChatConversationItem\n * for proper avatar, receipts, badges, and date display.\n *\n * Uses CometChatPaginatedList for scroll-based pagination when\n * useScrollPagination is true.\n */\n@Component({\n  selector: 'cometchat-search-conversations-list',\n  standalone: true,\n  imports: [\n    CommonModule,\n    TranslatePipe,\n    CometChatConversationItemComponent,\n    CometChatPaginatedListComponent,\n  ],\n  templateUrl: './cometchat-search-conversations-list.component.html',\n  styleUrls: ['./cometchat-search-conversations-list.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatSearchConversationsListComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() searchKeyword = '';\n  @Input() activeFilters: CometChatSearchFilter[] = [];\n  @Input() useScrollPagination = false;\n  @Input() conversationsRequestBuilder?: CometChat.ConversationsRequestBuilder;\n  @Input() hideUserStatus = false;\n  @Input() hideGroupType = false;\n  @Input() hideReceipts = false;\n  @Input() textFormatters: CometChatTextFormatter[] = [];\n  @Input() lastMessageDateTimeFormat?: CalendarObject;\n  @Input()\n  conversationOptions?: (conversation: CometChat.Conversation) => CometChatOption[];\n\n  // Template customization\n  @Input() itemTemplate?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.Conversation }>;\n  @Input() loadingView?: TemplateRef<void>;\n  @Input() emptyView?: TemplateRef<void>;\n  @Input() errorView?: TemplateRef<void>;\n\n  @Output() itemClick = new EventEmitter<{\n    conversation: CometChat.Conversation;\n    searchKeyword: string;\n  }>();\n  @Output() searchError = new EventEmitter<CometChat.CometChatException>();\n  @Output() stateChange = new EventEmitter<States>();\n\n  /** When true, the component hides itself entirely (including header). */\n  @Input() hideSection = false;\n\n  /** When true, the component suppresses its own empty/error views (parent handles them). */\n  @Input() suppressEmptyErrorView = false;\n\n  /** Reference to the paginated list for calling loadComplete() */\n  @ViewChild('paginatedList')\n  paginatedList?: CometChatPaginatedListComponent<CometChat.Conversation>;\n\n  readonly service = inject(SearchConversationsService);\n  readonly States = States;\n\n  loggedInUser: CometChat.User | null = null;\n\n  constructor() {\n    safeEffect(() => {\n      this.stateChange.emit(this.service.fetchState() as States);\n    });\n  }\n\n  /** Get typing indicator for a conversation */\n  getTypingIndicator(conversation: CometChat.Conversation): CometChat.TypingIndicator | null {\n    const convWith = conversation.getConversationWith();\n    const id =\n      convWith instanceof CometChat.User\n        ? convWith.getUid()\n        : (convWith as CometChat.Group).getGuid();\n    return this.service.typingIndicatorMap().get(id) ?? null;\n  }\n\n  /** Default date format for search conversation results: DD/MM/YYYY */\n  readonly searchDateFormat: CalendarObject = {\n    today: 'DD/MM/YYYY',\n    yesterday: 'DD/MM/YYYY',\n    otherDays: 'DD/MM/YYYY',\n  };\n\n  /** Effective date format — use input if provided, otherwise search default */\n  get effectiveDateFormat(): CalendarObject {\n    return this.lastMessageDateTimeFormat ?? this.searchDateFormat;\n  }\n\n  /** Whether the paginated list is in loading state (initial load only) */\n  get isLoading(): boolean {\n    return this.service.fetchState() === States.loading;\n  }\n\n  /** Error object for the paginated list (null when no error) */\n  get listError(): Error | null {\n    return this.service.fetchState() === States.error ? new Error('search_error') : null;\n  }\n\n  async ngOnInit(): Promise<void> {\n    try {\n      this.loggedInUser = await CometChat.getLoggedinUser();\n      if (this.loggedInUser) {\n        this.service.attachListeners(this.loggedInUser);\n      }\n    } catch {\n      // Fallback: try UIKit cached user\n      this.loggedInUser = CometChatUIKit.getLoggedInUser() ?? null;\n      if (this.loggedInUser) {\n        this.service.attachListeners(this.loggedInUser);\n      }\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['searchKeyword'] || changes['activeFilters']) {\n      this.triggerSearch();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.service.reset();\n  }\n\n  handleItemClick(conversation: CometChat.Conversation): void {\n    this.itemClick.emit({ conversation, searchKeyword: this.searchKeyword });\n  }\n\n  /** Called by CometChatPaginatedList when user scrolls to bottom */\n  handleLoadMore(): void {\n    this.service\n      .loadMore()\n      .then(() => {\n        this.paginatedList?.loadComplete();\n      })\n      .catch(err => {\n        this.paginatedList?.loadComplete();\n        this.searchError.emit(err);\n      });\n  }\n\n  /** Called by the \"See More\" button in non-scroll mode */\n  handleSeeMore(): void {\n    this.service.loadMore().catch(err => this.searchError.emit(err));\n  }\n\n  getConversationName(conversation: CometChat.Conversation): string {\n    const convWith = conversation.getConversationWith();\n    return convWith?.getName?.() ?? '';\n  }\n\n  getLastMessageText(conversation: CometChat.Conversation): string {\n    const lastMsg = conversation.getLastMessage();\n    if (!lastMsg) return '';\n    if (lastMsg.getType() === 'text') {\n      return (lastMsg as CometChat.TextMessage).getText() ?? '';\n    }\n    return lastMsg.getType() ?? '';\n  }\n\n  getUnreadCount(conversation: CometChat.Conversation): number {\n    return conversation.getUnreadMessageCount() ?? 0;\n  }\n\n  trackByConversation(_index: number, conversation: CometChat.Conversation): string {\n    return conversation.getConversationId();\n  }\n\n  private triggerSearch(): void {\n    this.service\n      .search(this.searchKeyword, this.activeFilters, this.conversationsRequestBuilder)\n      .catch(err => this.searchError.emit(err));\n  }\n}\n","@if (!hideSection) {\n<div class=\"cometchat-search__conversations\"\n     [class.cometchat-search__conversations-full]=\"useScrollPagination\"\n     role=\"region\"\n     [attr.aria-label]=\"'search_conversation_header' | translate\">\n\n  <h3 class=\"cometchat-search__conversations-header\">\n    {{ 'search_conversation_header' | translate }}\n  </h3>\n\n  @if (useScrollPagination) {\n    <!-- Scroll-based pagination via CometChatPaginatedList -->\n    <cometchat-paginated-list\n      #paginatedList\n      [items]=\"service.conversations()\"\n      [trackByFn]=\"trackByConversation\"\n      [isLoading]=\"isLoading\"\n      [hasMore]=\"service.hasMoreResults()\"\n      [error]=\"suppressEmptyErrorView ? null : listError\"\n      [hideError]=\"suppressEmptyErrorView\"\n      [itemTemplate]=\"conversationItemTpl\"\n      [loadingTemplate]=\"shimmerTpl\"\n      [emptyTemplate]=\"suppressEmptyErrorView ? undefined : emptyTpl\"\n      [errorTemplate]=\"suppressEmptyErrorView ? undefined : errorTpl\"\n      [enableKeyboardNavigation]=\"true\"\n      [observeScrollFromViewport]=\"true\"\n      [ariaLabel]=\"'search_conversation_header' | translate\"\n      (loadMore)=\"handleLoadMore()\">\n    </cometchat-paginated-list>\n  } @else {\n    <!-- Non-scroll mode: manual state management with \"See More\" button -->\n    @switch (service.fetchState()) {\n      @case (States.loading) {\n        <ng-container *ngTemplateOutlet=\"shimmerTpl\"></ng-container>\n      }\n\n      @case (States.empty) {\n        @if (!suppressEmptyErrorView) {\n          <ng-container *ngTemplateOutlet=\"emptyTpl\"></ng-container>\n        }\n      }\n\n      @case (States.error) {\n        @if (!suppressEmptyErrorView) {\n          <ng-container *ngTemplateOutlet=\"errorTpl\"></ng-container>\n        }\n      }\n\n      @case (States.loaded) {\n        <div class=\"cometchat-search__conversations-list\" role=\"listbox\">\n          @for (conversation of service.conversations(); track trackByConversation($index, conversation)) {\n            <ng-container *ngTemplateOutlet=\"conversationItemTpl; context: { $implicit: conversation }\"></ng-container>\n          }\n        </div>\n\n        @if (service.hasMoreResults()) {\n          <button class=\"cometchat-search-conversations__see-more\"\n                  data-testid=\"search-conversations-see-more\"\n                  (click)=\"handleSeeMore()\">\n            {{ 'search_result_see_more' | translate }}\n          </button>\n        }\n      }\n    }\n  }\n</div>\n}\n\n<!-- ═══ Shared Templates ═══ -->\n\n<!-- Conversation item template (used by both paginated list and @for loop) -->\n<ng-template #conversationItemTpl let-conversation>\n  @if (itemTemplate) {\n    <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: conversation }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__conversations-list-item\"\n         [attr.data-testid]=\"'search-conversation-item-' + conversation.getConversationId()\"\n         (click)=\"handleItemClick(conversation)\">\n      <cometchat-conversation-item\n        [conversation]=\"conversation\"\n        [tabIndex]=\"0\"\n        [loggedInUser]=\"loggedInUser\"\n        [typingIndicator]=\"getTypingIndicator(conversation)\"\n        [hideReceipts]=\"hideReceipts\"\n        [hideUserStatus]=\"hideUserStatus\"\n        [hideGroupType]=\"hideGroupType\"\n        [textFormatters]=\"textFormatters\"\n        [dateFormat]=\"effectiveDateFormat\"\n        [leadingView]=\"leadingView\"\n        [titleView]=\"titleView\"\n        [subtitleView]=\"subtitleView\"\n        [trailingView]=\"trailingView\"\n        [contextMenuOptions]=\"conversationOptions ? conversationOptions(conversation) : undefined\"\n        (itemClick)=\"handleItemClick($event)\">\n      </cometchat-conversation-item>\n    </div>\n  }\n</ng-template>\n\n<!-- Shimmer loading template -->\n<ng-template #shimmerTpl>\n  @if (loadingView) {\n    <ng-container *ngTemplateOutlet=\"loadingView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__shimmer\" aria-live=\"polite\">\n      @for (item of [1,2,3]; track item) {\n        <div class=\"cometchat-search__shimmer-item\">\n          <div class=\"cometchat-search__shimmer-item-avatar\"></div>\n          <div class=\"cometchat-search__shimmer-item-body\">\n            <div class=\"cometchat-search__shimmer-item-body-title-wrapper\">\n              <div class=\"cometchat-search__shimmer-item-body-title\"></div>\n              <div class=\"cometchat-search__shimmer-item-body-tail\"></div>\n            </div>\n            <div class=\"cometchat-search__shimmer-item-body-subtitle\"></div>\n          </div>\n        </div>\n      }\n    </div>\n  }\n</ng-template>\n\n<!-- Empty state template -->\n<ng-template #emptyTpl>\n  @if (emptyView) {\n    <ng-container *ngTemplateOutlet=\"emptyView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__empty-view\" aria-live=\"assertive\">\n      <div class=\"cometchat-search__empty-view-icon\"></div>\n      <div class=\"cometchat-search__empty-view-body\">\n        <div class=\"cometchat-search__empty-view-body-title\">\n          {{ 'search_no_result_title' | translate }}\n        </div>\n        <div class=\"cometchat-search__empty-view-body-description\">\n          {{ 'search_no_result_subtitle' | translate }}\n        </div>\n      </div>\n    </div>\n  }\n</ng-template>\n\n<!-- Error state template -->\n<ng-template #errorTpl>\n  @if (errorView) {\n    <ng-container *ngTemplateOutlet=\"errorView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__error-view\" aria-live=\"assertive\">\n      <div class=\"cometchat-search__error-view-icon\"></div>\n      <div class=\"cometchat-search__error-view-body\">\n        <div class=\"cometchat-search__error-view-body-title\">\n          {{ 'search_error_title' | translate }}\n        </div>\n        <div class=\"cometchat-search__error-view-body-description\">\n          {{ 'search_error_subtitle' | translate }}\n        </div>\n      </div>\n    </div>\n  }\n</ng-template>\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  OnChanges,\n  OnInit,\n  OnDestroy,\n  SimpleChanges,\n  TemplateRef,\n  ViewChild,\n  inject,\n  ChangeDetectionStrategy,\n} from '@angular/core';\nimport { safeEffect } from '../../../utils/safe-effect';\nimport { CommonModule, DatePipe } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { CometChatSearchFilter, States } from '../../../Enums/Enums';\nimport { SearchMessagesService } from '../../../services/search-messages.service';\nimport { CometChatUIKitConstants } from '../../../constants';\nimport { CalendarObject } from '../../../resources/CometChatLocalize/localization.interfaces';\nimport { CometChatTextFormatter } from '../../../formatters/cometchat-text-formatter';\nimport { CometChatMentionsFormatter } from '../../../formatters/cometchat-mentions-formatter';\nimport { TranslatePipe } from '../../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatUIKit } from '../../../cometchat-uikit';\nimport { CometChatLocalize } from '../../../resources/CometChatLocalize';\nimport { CometChatPaginatedListComponent } from '../../cometchat-paginated-list/cometchat-paginated-list.component';\nimport { getMediaPreview, isMediaPreviewType, getAttachmentCount, MediaPreviewType } from '../../../utils/message-preview-utils';\nimport { HtmlSanitizerService } from '../../../services/html-sanitizer.service';\nimport { FormatterConfigService } from '../../../services/formatter-config.service';\nimport { stripRichTextFormatting } from '../../../utils/util';\n\n/**\n * Renders message search results with type-specific views,\n * date separators, and pagination.\n *\n * Uses CometChatPaginatedList for scroll-based pagination when\n * alwaysShowSeeMore is false\n */\n@Component({\n  selector: 'cometchat-search-messages-list',\n  standalone: true,\n  imports: [CommonModule, TranslatePipe, DatePipe, CometChatPaginatedListComponent],\n  templateUrl: './cometchat-search-messages-list.component.html',\n  styleUrls: ['./cometchat-search-messages-list.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatSearchMessagesListComponent implements OnInit, OnChanges, OnDestroy {\n  @Input() searchKeyword = '';\n  @Input() activeFilters: CometChatSearchFilter[] = [];\n  @Input() uid?: string;\n  @Input() guid?: string;\n  @Input() alwaysShowSeeMore = false;\n  @Input() messagesRequestBuilder?: CometChat.MessagesRequestBuilder;\n  @Input() textFormatters: CometChatTextFormatter[] = [];\n  @Input() messageDateTimeFormat?: CalendarObject;\n\n  // Template customization\n  @Input() itemTemplate?: TemplateRef<{ $implicit: CometChat.BaseMessage }>;\n  @Input() leadingView?: TemplateRef<{ $implicit: CometChat.BaseMessage }>;\n  @Input() titleView?: TemplateRef<{ $implicit: CometChat.BaseMessage }>;\n  @Input() subtitleView?: TemplateRef<{ $implicit: CometChat.BaseMessage }>;\n  @Input() trailingView?: TemplateRef<{ $implicit: CometChat.BaseMessage }>;\n  @Input() loadingView?: TemplateRef<void>;\n  @Input() emptyView?: TemplateRef<void>;\n  @Input() errorView?: TemplateRef<void>;\n\n  @Output() itemClick = new EventEmitter<{\n    message: CometChat.BaseMessage;\n    searchKeyword: string;\n  }>();\n  @Output() searchError = new EventEmitter<CometChat.CometChatException>();\n  @Output() stateChange = new EventEmitter<States>();\n\n  /** When true, the component hides itself entirely (including header). */\n  @Input() hideSection = false;\n\n  /** When true, the component suppresses its own empty/error views (parent handles them). */\n  @Input() suppressEmptyErrorView = false;\n\n  /** Reference to the paginated list for calling loadComplete() */\n  @ViewChild('paginatedList')\n  paginatedList?: CometChatPaginatedListComponent<CometChat.BaseMessage>;\n\n  readonly service = inject(SearchMessagesService);\n  readonly States = States;\n  readonly MessageTypes = CometChatUIKitConstants.MessageTypes;\n\n  private readonly htmlSanitizer = inject(HtmlSanitizerService);\n  private readonly formatterConfig = inject(FormatterConfigService);\n  private loggedInUser: CometChat.User | null = null;\n\n  constructor() {\n    safeEffect(() => {\n      this.stateChange.emit(this.service.fetchState() as States);\n    });\n  }\n\n  /** Whether the paginated list is in loading state (initial load only) */\n  get isLoading(): boolean {\n    return this.service.fetchState() === States.loading;\n  }\n\n  /** Error object for the paginated list (null when no error) */\n  get listError(): Error | null {\n    return this.service.fetchState() === States.error ? new Error('search_error') : null;\n  }\n\n  /** Whether to use scroll-based pagination (inverse of alwaysShowSeeMore) */\n  get useScrollPagination(): boolean {\n    return !this.alwaysShowSeeMore;\n  }\n\n  async ngOnInit(): Promise<void> {\n    try {\n      this.loggedInUser = await CometChat.getLoggedinUser();\n    } catch {\n      this.loggedInUser = CometChatUIKit.getLoggedInUser() ?? null;\n    }\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes['searchKeyword'] || changes['activeFilters'] || changes['uid'] || changes['guid']) {\n      this.triggerSearch();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.service.reset();\n  }\n\n  handleItemClick(message: CometChat.BaseMessage): void {\n    this.itemClick.emit({ message, searchKeyword: this.searchKeyword });\n  }\n\n  /** Called by CometChatPaginatedList when user scrolls to bottom */\n  handleLoadMore(): void {\n    this.service\n      .loadMore()\n      .then(() => {\n        this.paginatedList?.loadComplete();\n      })\n      .catch(err => {\n        this.paginatedList?.loadComplete();\n        this.searchError.emit(err);\n      });\n  }\n\n  /** Called by the \"See More\" button in non-scroll mode */\n  handleSeeMore(): void {\n    this.service.loadMore().catch(err => this.searchError.emit(err));\n  }\n\n  getMessageTitle(message: CometChat.BaseMessage): string {\n    if (this.uid || this.guid) {\n      return message.getSender()?.getName() ?? '';\n    }\n    const receiver = message.getReceiver();\n    return (receiver as CometChat.User | CometChat.Group)?.getName?.() ?? '';\n  }\n\n  shouldShowDateSeparator(index: number): boolean {\n    if (index === 0) return true;\n    const messages = this.service.messages();\n    const current = messages[index]?.getSentAt();\n    const previous = messages[index - 1]?.getSentAt();\n    if (!current || !previous) return false;\n    const d1 = new Date(current * 1000);\n    const d2 = new Date(previous * 1000);\n    return d1.getMonth() !== d2.getMonth() || d1.getFullYear() !== d2.getFullYear();\n  }\n\n  /**\n   * The full subtitle as one string: `\"You: test-video.mov\"`. Kept for the `subtitleView` override\n   * and for callers that want plain text. The template renders the pieces separately so the media\n   * glyph can sit between the sender prefix and the text, as in the React kit.\n   */\n  getMessageSubtitle(message: CometChat.BaseMessage): string {\n    const prefix = this.getSubtitleSenderPrefix(message);\n    const content = this.getMessageSubtitleContent(message);\n    return prefix ? `${prefix} ${content}` : content;\n  }\n\n  /** `\"You:\"` / `\"Alice:\"`, or `''` when the search is already scoped to one conversation. */\n  getSubtitleSenderPrefix(message: CometChat.BaseMessage): string {\n    if (this.uid || this.guid) {\n      return '';\n    }\n    const sender = message.getSender();\n    const isMe = sender?.getUid() === this.loggedInUser?.getUid();\n    const senderName = isMe\n      ? CometChatLocalize.getLocalizedString('search_message_subtitle_you')\n      : (sender?.getName() ?? '');\n    return senderName ? `${senderName}:` : '';\n  }\n\n  /**\n   * The media type whose glyph precedes the subtitle text, or `null` for everything else.\n   * Note this is independent of the LEADING view: images and videos have no leading icon, but they\n   * do get this inline one.\n   */\n  getSubtitleIconType(message: CometChat.BaseMessage): MediaPreviewType | null {\n    const type = message.getType();\n    return isMediaPreviewType(type) ? type : null;\n  }\n\n  /** Whether the message is a thread reply, which prefixes the subtitle with a thread glyph. */\n  hasThreadReply(message: CometChat.BaseMessage): boolean {\n    return !!message.getParentMessageId?.();\n  }\n\n  /** The subtitle text, WITHOUT the sender prefix. */\n  getMessageSubtitleContent(message: CometChat.BaseMessage): string {\n    const type = message.getType();\n\n    if (type === CometChatUIKitConstants.MessageTypes.text) {\n      let text = (message as CometChat.TextMessage).getText() ?? '';\n      // Strip markdown links [text](url) → text\n      text = text.replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n      // Convert SDK mention tags <@uid:xxx> → @DisplayName (or @uid fallback)\n      const mentionedUsers = (message as CometChat.TextMessage).getMentionedUsers?.() ?? [];\n      return this.formatPlainMentions(text, mentionedUsers);\n    }\n\n    if (isMediaPreviewType(type)) {\n      // Filename when there is nothing better to say; otherwise the caption, or a count such as\n      // \"3 Images\". See getMediaPreview for the full table. Search renders plain text, so the\n      // caption is stripped of markdown rather than turned into HTML.\n      return getMediaPreview(message, 'search', {\n        formatCaption: (raw) => {\n          if (!raw.trim()) return '';\n          const mentionedUsers = (message as CometChat.TextMessage).getMentionedUsers?.() ?? [];\n          const plain = stripRichTextFormatting(raw).replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, '$1');\n          return this.formatPlainMentions(plain, mentionedUsers).replace(/\\s+/g, ' ').trim();\n        },\n      });\n    }\n\n    return type;\n  }\n\n  /**\n   * Returns true when the subtitle for a text message should be rendered as HTML\n   * (i.e. it contains markdown, rich text metadata, or SDK mention tags).\n   * Mirrors CometChatConversationItem.subtitleHasHtml.\n   */\n  subtitleHasHtml(message: CometChat.BaseMessage): boolean {\n    if (message.getType() !== CometChatUIKitConstants.MessageTypes.text) return false;\n    if (message.getCategory() !== 'message') return false;\n    const textMessage = message as CometChat.TextMessage;\n    const rawText = textMessage.getText() || '';\n\n    if (!rawText) {\n      // Fallback: no text — check metadata\n      try {\n        const metadata = textMessage.getMetadata?.() as Record<string, unknown> | undefined;\n        const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n        if (richText?.html && richText?.hasFormatting) return true;\n      } catch { /* ignore */ }\n      return false;\n    }\n\n    // Plain URL or markdown link — render as plain text\n    if (this.isURL(rawText) || /\\[([^\\]]+)\\]\\([^)]+\\)/.test(rawText)) return false;\n\n    // Markdown syntax\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s|^&gt;\\s?|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText)) return true;\n\n    // SDK mention tags\n    const hasSdkMentions = /<@uid:[^>]+>/.test(rawText) || /<@all:[^>]+>/.test(rawText);\n    const formatters = this.getFormattersForSubtitle();\n    const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter);\n    const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    return (hasSdkMentions && hasMentionsFormatter) || hasCustomFormatters;\n  }\n\n  /**\n   * Returns sanitized HTML for the subtitle when subtitleHasHtml() is true.\n   * Mirrors CometChatConversationItem.formatLastMessageSubtitle.\n   */\n  getMessageSubtitleHtml(message: CometChat.BaseMessage): string {\n    const textMessage = message as CometChat.TextMessage;\n    const rawText = textMessage.getText() || '';\n    const mentionedUsers = textMessage.getMentionedUsers?.() ?? [];\n\n    if (!rawText) {\n      // Fallback: no text — try metadata as last resort\n      try {\n        const metadata = textMessage.getMetadata?.() as Record<string, unknown> | undefined;\n        const richText = metadata?.['richText'] as { html?: string; hasFormatting?: boolean } | undefined;\n        if (richText?.html && richText?.hasFormatting) {\n          const sanitized = this.sanitizeSubtitleHtml(richText.html);\n          if (sanitized) return this.prependSenderHtml(sanitized, message);\n        }\n      } catch { /* ignore */ }\n      return '';\n    }\n\n    const formatters = this.getFormattersForSubtitle();\n    const hasSdkMentions = /<@uid:[^>]+>/.test(rawText) || /<@all:[^>]+>/.test(rawText);\n\n    // 2. Markdown path\n    if (/(\\*\\*|(?<!\\*)\\*(?!\\*|\\s)|__|~~|`|_(?=[^\\s_])|^>\\s|^&gt;\\s?|^ *[-*]\\s|^ *\\d+\\.\\s)/m.test(rawText)) {\n      const escaped = this.htmlSanitizer.escapeUserHtml(rawText);\n      let formattedText = escaped;\n      for (const formatter of formatters) {\n        try {\n          if (formatter instanceof CometChatMentionsFormatter) {\n            if (hasSdkMentions && formatter.shouldFormat(formattedText, message)) {\n              formattedText = (formatter as CometChatMentionsFormatter).formatSdkMentions(formattedText, mentionedUsers);\n            }\n          } else if (formatter.id !== 'tiptap-formatter') {\n            if (formatter.shouldFormat(formattedText, message)) {\n              formattedText = formatter.format(formattedText);\n            }\n          }\n        } catch { /* ignore formatter errors */ }\n      }\n      return this.prependSenderHtml(this.sanitizeSubtitleHtml(formattedText), message);\n    }\n\n    // 3. Plain text path with mention formatting\n    const plainText = stripRichTextFormatting(rawText);\n    if (!formatters || formatters.length === 0) {\n      return this.prependSenderHtml(this.formatPlainMentions(plainText, mentionedUsers), message);\n    }\n    const hasCustomFormatters = formatters.some(f => !(f instanceof CometChatMentionsFormatter) && f.id !== 'tiptap-formatter');\n    const hasMentionsFormatter = formatters.some(f => f instanceof CometChatMentionsFormatter);\n    if (!hasSdkMentions && !hasCustomFormatters) {\n      return this.prependSenderHtml(plainText, message);\n    }\n    if (!hasMentionsFormatter && !hasCustomFormatters) {\n      return this.prependSenderHtml(this.formatPlainMentions(plainText, mentionedUsers), message);\n    }\n    const escapedText = this.htmlSanitizer.escapeUserHtml(plainText);\n    let formattedText = escapedText;\n    for (const formatter of formatters) {\n      try {\n        if (formatter instanceof CometChatMentionsFormatter) {\n          if (hasSdkMentions && formatter.shouldFormat(formattedText, message)) {\n            formattedText = (formatter as CometChatMentionsFormatter).formatSdkMentions(formattedText, mentionedUsers);\n          }\n        } else if (formatter.id !== 'tiptap-formatter') {\n          if (formatter.shouldFormat(formattedText, message)) {\n            formattedText = formatter.format(formattedText);\n          }\n        }\n      } catch { /* ignore formatter errors */ }\n    }\n    return this.prependSenderHtml(this.sanitizeSubtitleHtml(formattedText), message);\n  }\n\n  /** Prepend \"You: \" or \"SenderName: \" as plain text before the HTML subtitle. */\n  private prependSenderHtml(html: string, message: CometChat.BaseMessage): string {\n    if (this.uid || this.guid) return html;\n    const sender = message.getSender();\n    const isMe = sender?.getUid() === this.loggedInUser?.getUid();\n    const senderName = isMe\n      ? CometChatLocalize.getLocalizedString('search_message_subtitle_you')\n      : (sender?.getName() ?? '');\n    if (!senderName) return html;\n    const escapedName = this.htmlSanitizer.escapeUserHtml(senderName);\n    return `${escapedName}: ${html}`;\n  }\n\n  /** Get the active text formatters — explicit input takes priority over global config. */\n  private getFormattersForSubtitle(): CometChatTextFormatter[] {\n    if (this.textFormatters?.length > 0) return this.textFormatters;\n    return this.formatterConfig.getDefaultFormatters();\n  }\n\n  /** Sanitize HTML to safe inline tags only for search subtitle — single line, truncated. */\n  private sanitizeSubtitleHtml(html: string): string {\n    // Inject list markers as plain text before stripping list tags,\n    // so \"1. item1 2. item2\" appears inline instead of \"item1 item2\".\n    let processed = html;\n\n    // Ordered lists: replace <li> with counter prefix \"N. \"\n    processed = processed.replace(/<ol[^>]*>([\\s\\S]*?)<\\/ol>/gi, (_match, inner) => {\n      let counter = 0;\n      return inner.replace(/<li[^>]*>/gi, () => {\n        counter++;\n        return `${counter}. `;\n      });\n    });\n\n    // Unordered lists: replace <li> with bullet \"• \"\n    processed = processed.replace(/<ul[^>]*>([\\s\\S]*?)<\\/ul>/gi, (_match, inner) => {\n      return inner.replace(/<li[^>]*>/gi, () => '• ');\n    });\n\n    // Collapse remaining block-level elements to spaces\n    processed = processed\n      .replace(/<\\/li>/gi, ' ')\n      .replace(/<\\/p>/gi, ' ')\n      .replace(/<\\/blockquote>/gi, ' ')\n      .replace(/<\\/h[1-6]>/gi, ' ');\n\n    let s = this.htmlSanitizer.sanitizeWithConfig(processed, {\n      ALLOWED_TAGS: ['span', 'strong', 'em', 'b', 'i', 'u', 's', 'code', 'a'],\n      ALLOWED_ATTR: ['class', 'data-uid', 'data-mention-type', 'data-hashtag', 'href', 'target', 'rel', 'style'],\n    });\n    return String(s).replace(/\\n/g, ' ').replace(/\\s{2,}/g, ' ').trim();\n  }\n\n  /**\n   * Convert SDK mention tags into plain-text `@DisplayName`.\n   * Falls back to the UID when a mentioned user is not hydrated on the message.\n   */\n  private formatPlainMentions(\n    text: string,\n    mentionedUsers: CometChat.User[]\n  ): string {\n    if (!text) return '';\n    const userMap = new Map<string, string>();\n    mentionedUsers.forEach(u => userMap.set(u.getUid(), u.getName()));\n    let result = text.replace(/<@uid:(.*?)>/g, (_m, uid) => `@${userMap.get(uid) || uid}`);\n    result = result.replace(/<@all:(.*?)>/g, (_m, label) => `@${label}`);\n    return result;\n  }\n\n  trackByMessage(_index: number, message: CometChat.BaseMessage): number {\n    return message.getId();\n  }\n\n  /** Get the index of a message in the service's messages array (fallback for date separator) */\n  getMessageIndex(message: CometChat.BaseMessage): number {\n    return this.service.messages().findIndex(m => m.getId() === message.getId());\n  }\n\n  // ── Leading / trailing view helpers ──\n\n  /** Determine leading view type for a message */\n  getLeadingViewType(message: CometChat.BaseMessage): 'audio' | 'file' | 'link' | 'none' {\n    const type = message.getType();\n    if (type === CometChatUIKitConstants.MessageTypes.audio) return 'audio';\n    if (type === CometChatUIKitConstants.MessageTypes.file) return 'file';\n    if (type === CometChatUIKitConstants.MessageTypes.text) {\n      const metadata = (message as CometChat.TextMessage).getMetadata();\n      if (\n        this.hasLinkPreview(metadata) ||\n        this.isURL((message as CometChat.TextMessage).getText())\n      ) {\n        return 'link';\n      }\n    }\n    return 'none';\n  }\n\n  /**\n   * Leading-view glyph for a file result: one stacked-sheets illustration for EVERY file, matching\n   * the React kit. Deliberately not the per-extension icon used in the message bubble and composer\n   * tray — a search result may carry several attachments of different types, and picking the first\n   * one's icon would misrepresent the rest.\n   */\n  getFileTypeIcon(_message?: CometChat.BaseMessage): string {\n    return 'assets/document-file-icon.svg';\n  }\n\n  /** Get link favicon URL from message metadata */\n  getLinkFavicon(message: CometChat.BaseMessage): string | null {\n    try {\n      const metadata = (message as CometChat.TextMessage).getMetadata();\n      const links = this.extractLinkPreviewLinks(metadata);\n      if (links?.[0] && (links[0] as Record<string, string>)['favicon']) {\n        return (links[0] as Record<string, string>)['favicon'];\n      }\n    } catch {\n      // metadata may not be present\n    }\n    return null;\n  }\n\n  /** Determine trailing view type */\n  getTrailingViewType(message: CometChat.BaseMessage): 'image' | 'video' | 'date' {\n    const type = message.getType();\n    if (type === CometChatUIKitConstants.MessageTypes.image) return 'image';\n    if (type === CometChatUIKitConstants.MessageTypes.video) return 'video';\n    return 'date';\n  }\n\n  /**\n   * Attachments hidden behind the single thumbnail, shown as a \"+N\" badge. The thumbnail already\n   * accounts for one of them, hence `count - 1`.\n   */\n  getAttachmentOverflow(message: CometChat.BaseMessage): number {\n    return Math.max(0, getAttachmentCount(message) - 1);\n  }\n\n  /**\n   * Backend-generated video poster, when the thumbnail-generation extension supplied one. Without\n   * it the `<video>` element paints its own first frame, which costs a media fetch.\n   */\n  getVideoPosterUrl(message: CometChat.BaseMessage): string | null {\n    try {\n      const metadata = (message as CometChat.MediaMessage).getMetadata?.() as\n        | Record<string, any>\n        | null;\n      const url = metadata?.['@injected']?.['extensions']?.['thumbnail-generation']?.['url_medium'];\n      return typeof url === 'string' && url.length > 0 ? url : null;\n    } catch {\n      return null;\n    }\n  }\n\n  /** Get attachment URL for image/video thumbnails */\n  getAttachmentUrl(message: CometChat.BaseMessage): string {\n    const media = message as CometChat.MediaMessage;\n    const attachments = media.getAttachments();\n    return attachments?.[0]?.getUrl() || '';\n  }\n\n  /** Format date for trailing view using Angular DatePipe for locale-aware formatting */\n  getFormattedDate(message: CometChat.BaseMessage): string {\n    const sentAt = message.getSentAt();\n    if (!sentAt) return '';\n    const date = new Date(sentAt * 1000);\n    // Use Angular DatePipe for locale-aware month abbreviation\n    const datePipe = new DatePipe('en-US');\n    return datePipe.transform(date, 'd MMM, hh:mm a') ?? '';\n  }\n\n  /** Check if metadata has link preview */\n  private hasLinkPreview(metadata: unknown): boolean {\n    try {\n      return !!this.extractLinkPreviewLinks(metadata)?.length;\n    } catch {\n      return false;\n    }\n  }\n\n  /** Extract link-preview links array from message metadata */\n  private extractLinkPreviewLinks(metadata: unknown): unknown[] | undefined {\n    const meta = metadata as Record<string, unknown> | undefined;\n    const injected = meta?.['@injected'] as Record<string, unknown> | undefined;\n    const ext = injected?.['extensions'] as Record<string, unknown> | undefined;\n    const lp = ext?.['link-preview'] as Record<string, unknown> | undefined;\n    return lp?.['links'] as unknown[] | undefined;\n  }\n\n  /** Simple URL check */\n  private isURL(text: string): boolean {\n    if (!text) return false;\n    return /^https?:\\/\\//.test(text.trim()) || /\\bhttps?:\\/\\/\\S+/i.test(text);\n  }\n\n  private triggerSearch(): void {\n    this.service\n      .search(\n        this.searchKeyword,\n        this.activeFilters,\n        this.uid,\n        this.guid,\n        this.messagesRequestBuilder,\n        this.alwaysShowSeeMore\n      )\n      .catch(err => this.searchError.emit(err));\n  }\n}\n","@if (!hideSection) {\n<div class=\"cometchat-search__messages\"\n     [class.cometchat-search__messages-full]=\"useScrollPagination || activeFilters.length > 0\"\n     role=\"region\"\n     [attr.aria-label]=\"'search_messages_header' | translate\">\n\n  <h3 class=\"cometchat-search__messages-header\">\n    {{ 'search_messages_header' | translate }}\n  </h3>\n\n  @if (useScrollPagination) {\n    <!-- Scroll-based pagination via CometChatPaginatedList -->\n    <cometchat-paginated-list\n      #paginatedList\n      [items]=\"service.messages()\"\n      [trackByFn]=\"trackByMessage\"\n      [isLoading]=\"isLoading\"\n      [hasMore]=\"service.hasMoreResults()\"\n      [error]=\"suppressEmptyErrorView ? null : listError\"\n      [hideError]=\"suppressEmptyErrorView\"\n      [itemTemplate]=\"messageItemTpl\"\n      [loadingTemplate]=\"shimmerTpl\"\n      [emptyTemplate]=\"suppressEmptyErrorView ? undefined : emptyTpl\"\n      [errorTemplate]=\"suppressEmptyErrorView ? undefined : errorTpl\"\n      [enableKeyboardNavigation]=\"true\"\n      [observeScrollFromViewport]=\"true\"\n      [ariaLabel]=\"'search_messages_header' | translate\"\n      (loadMore)=\"handleLoadMore()\">\n    </cometchat-paginated-list>\n  } @else {\n    <!-- Non-scroll mode: manual state management with \"See More\" button -->\n    @switch (service.fetchState()) {\n      @case (States.loading) {\n        <ng-container *ngTemplateOutlet=\"shimmerTpl\"></ng-container>\n      }\n\n      @case (States.empty) {\n        @if (!suppressEmptyErrorView) {\n          <ng-container *ngTemplateOutlet=\"emptyTpl\"></ng-container>\n        }\n      }\n\n      @case (States.error) {\n        @if (!suppressEmptyErrorView) {\n          <ng-container *ngTemplateOutlet=\"errorTpl\"></ng-container>\n        }\n      }\n\n      @case (States.loaded) {\n        <div class=\"cometchat-search__messages-list\" role=\"list\">\n          @for (message of service.messages(); track trackByMessage($index, message)) {\n            <ng-container *ngTemplateOutlet=\"messageItemTpl; context: { $implicit: message, index: $index }\"></ng-container>\n          }\n        </div>\n\n        @if (service.hasMoreResults()) {\n          <button class=\"cometchat-search-messages__see-more\"\n                  data-testid=\"search-messages-see-more\"\n                  (click)=\"handleSeeMore()\">\n            {{ 'search_result_see_more' | translate }}\n          </button>\n        }\n      }\n    }\n  }\n</div>\n}\n\n<!-- ═══ Shared Templates ═══ -->\n\n<!-- Message item template (used by both paginated list and @for loop) -->\n<ng-template #messageItemTpl let-message let-idx=\"index\">\n  @if (shouldShowDateSeparator(idx ?? getMessageIndex(message))) {\n    <div class=\"cometchat-search__messages-date-separator\">\n      {{ message.getSentAt() * 1000 | date:'MMMM yyyy' }}\n    </div>\n  }\n\n  @if (itemTemplate) {\n    <ng-container *ngTemplateOutlet=\"itemTemplate; context: { $implicit: message }\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search-messages__list-item\"\n         role=\"listitem\"\n         tabindex=\"0\"\n         [attr.data-testid]=\"'search-message-item-' + message.getId()\"\n         (click)=\"handleItemClick(message)\"\n         (keydown.enter)=\"handleItemClick(message)\"\n         (keydown.space)=\"handleItemClick(message); $event.preventDefault()\">\n\n      <!-- Leading view -->\n      @if (leadingView) {\n        <ng-container *ngTemplateOutlet=\"leadingView; context: { $implicit: message }\"></ng-container>\n      } @else {\n        @switch (getLeadingViewType(message)) {\n          @case ('audio') {\n            <div class=\"cometchat-search__messages-leading-view cometchat-search__messages-leading-view-audio\">\n              <div class=\"cometchat-search__messages-leading-view-icon\"></div>\n            </div>\n          }\n          @case ('file') {\n            <div class=\"cometchat-search__messages-leading-view cometchat-search__messages-leading-view-file\">\n              <img [src]=\"getFileTypeIcon(message)\" class=\"cometchat-search__messages-leading-view-file-icon\" alt=\"\" />\n            </div>\n          }\n          @case ('link') {\n            <div class=\"cometchat-search__messages-leading-view cometchat-search__messages-leading-view-link\">\n              @if (getLinkFavicon(message); as favicon) {\n                <img [src]=\"favicon\" class=\"cometchat-search__messages-leading-view-link-img\" alt=\"\" loading=\"lazy\" />\n              } @else {\n                <div class=\"cometchat-search__messages-leading-view-icon\"></div>\n              }\n            </div>\n          }\n        }\n      }\n\n      <!-- Body (title + subtitle) -->\n      <div class=\"cometchat-search-messages__list-item-body\">\n        <div class=\"cometchat-search-messages__list-item-title\">\n          @if (titleView) {\n            <ng-container *ngTemplateOutlet=\"titleView; context: { $implicit: message }\"></ng-container>\n          } @else {\n            {{ getMessageTitle(message) }}\n          }\n        </div>\n        <div class=\"cometchat-search-messages__list-item-subtitle\">\n          @if (subtitleView) {\n            <ng-container *ngTemplateOutlet=\"subtitleView; context: { $implicit: message }\"></ng-container>\n          } @else if (subtitleHasHtml(message)) {\n            <span [innerHTML]=\"getMessageSubtitleHtml(message)\"></span>\n          } @else {\n            <!-- [thread] \"You:\" [type glyph] text -->\n            @if (hasThreadReply(message)) {\n              <span\n                class=\"cometchat-search__messages-subtitle-icon-thread\"\n                [attr.aria-label]=\"'thread_reply' | translate\"></span>\n            }\n            @if (getSubtitleSenderPrefix(message); as prefix) {\n              <span class=\"cometchat-search__messages-subtitle-sender\">{{ prefix }}</span>\n            }\n            @if (getSubtitleIconType(message); as iconType) {\n              <span\n                class=\"cometchat-search__messages-subtitle-icon\"\n                aria-hidden=\"true\"\n                [class.cometchat-search__messages-subtitle-icon--image]=\"iconType === 'image'\"\n                [class.cometchat-search__messages-subtitle-icon--video]=\"iconType === 'video'\"\n                [class.cometchat-search__messages-subtitle-icon--audio]=\"iconType === 'audio'\"\n                [class.cometchat-search__messages-subtitle-icon--file]=\"iconType === 'file'\"></span>\n            }\n            <span class=\"cometchat-search__messages-list-item-subtitle-content\">{{\n              getMessageSubtitleContent(message)\n            }}</span>\n          }\n        </div>\n      </div>\n\n      <!-- Trailing view -->\n      @if (trailingView) {\n        <ng-container *ngTemplateOutlet=\"trailingView; context: { $implicit: message }\"></ng-container>\n      } @else {\n        @switch (getTrailingViewType(message)) {\n          @case ('image') {\n            <div class=\"cometchat-search__messages-trailing-view cometchat-search__messages-trailing-view-image\">\n              <img [src]=\"getAttachmentUrl(message)\" alt=\"\" loading=\"lazy\" />\n              <!-- The subtitle omits the count for image/video batches; this badge carries it. -->\n              @if (getAttachmentOverflow(message) > 0) {\n                <div class=\"cometchat-search__messages-trailing-overlay\" aria-hidden=\"true\">\n                  +{{ getAttachmentOverflow(message) }}\n                </div>\n              }\n            </div>\n          }\n          @case ('video') {\n            <div class=\"cometchat-search__messages-trailing-view cometchat-search__messages-trailing-view-video\">\n              <!-- Prefer the backend-generated poster; the raw <video> first frame is the fallback. -->\n              <video\n                [src]=\"getAttachmentUrl(message)\"\n                [attr.poster]=\"getVideoPosterUrl(message)\"\n                preload=\"metadata\"></video>\n              <div class=\"cometchat-search__messages-video-play-button\"></div>\n              @if (getAttachmentOverflow(message) > 0) {\n                <div class=\"cometchat-search__messages-trailing-overlay\" aria-hidden=\"true\">\n                  +{{ getAttachmentOverflow(message) }}\n                </div>\n              }\n            </div>\n          }\n          @case ('date') {\n            <div class=\"cometchat-search__messages-trailing-view-date\">\n              {{ getFormattedDate(message) }}\n            </div>\n          }\n        }\n      }\n    </div>\n  }\n</ng-template>\n\n<!-- Shimmer loading template -->\n<ng-template #shimmerTpl>\n  @if (loadingView) {\n    <ng-container *ngTemplateOutlet=\"loadingView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__shimmer\" aria-live=\"polite\">\n      @for (item of [1,2,3]; track item) {\n        <div class=\"cometchat-search__shimmer-item\">\n          <div class=\"cometchat-search__shimmer-item-avatar\"></div>\n          <div class=\"cometchat-search__shimmer-item-body\">\n            <div class=\"cometchat-search__shimmer-item-body-title-wrapper\">\n              <div class=\"cometchat-search__shimmer-item-body-title\"></div>\n              <div class=\"cometchat-search__shimmer-item-body-tail\"></div>\n            </div>\n            <div class=\"cometchat-search__shimmer-item-body-subtitle\"></div>\n          </div>\n        </div>\n      }\n    </div>\n  }\n</ng-template>\n\n<!-- Empty state template -->\n<ng-template #emptyTpl>\n  @if (emptyView) {\n    <ng-container *ngTemplateOutlet=\"emptyView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__empty-view\" aria-live=\"assertive\">\n      <div class=\"cometchat-search__empty-view-icon\"></div>\n      <div class=\"cometchat-search__empty-view-body\">\n        <div class=\"cometchat-search__empty-view-body-title\">\n          {{ 'search_no_result_title' | translate }}\n        </div>\n        <div class=\"cometchat-search__empty-view-body-description\">\n          {{ 'search_no_result_subtitle' | translate }}\n        </div>\n      </div>\n    </div>\n  }\n</ng-template>\n\n<!-- Error state template -->\n<ng-template #errorTpl>\n  @if (errorView) {\n    <ng-container *ngTemplateOutlet=\"errorView\"></ng-container>\n  } @else {\n    <div class=\"cometchat-search__error-view\" aria-live=\"assertive\">\n      <div class=\"cometchat-search__error-view-icon\"></div>\n      <div class=\"cometchat-search__error-view-body\">\n        <div class=\"cometchat-search__error-view-body-title\">\n          {{ 'search_error_title' | translate }}\n        </div>\n        <div class=\"cometchat-search__error-view-body-description\">\n          {{ 'search_error_subtitle' | translate }}\n        </div>\n      </div>\n    </div>\n  }\n</ng-template>\n","import { NotificationFeedItem, TimestampGroup } from './cometchat-notification-feed.types';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\n\n/**\n * Groups feed items by their sentAt timestamp into labeled sections.\n *\n * Rules:\n * - sentAt is today → localized \"Today\"\n * - sentAt is yesterday → localized \"Yesterday\"\n * - sentAt is within this week → Day name (e.g., \"Monday\")\n * - sentAt is older → Localized date (e.g., \"Jan 15, 2025\")\n */\nexport function groupByTimestamp(items: NotificationFeedItem[]): TimestampGroup[] {\n  if (!items || items.length === 0) return [];\n\n  const now = new Date();\n  const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());\n  const yesterday = new Date(today.getTime() - 86400000);\n  const startOfWeek = new Date(today.getTime() - today.getDay() * 86400000);\n\n  const groupMap = new Map<string, NotificationFeedItem[]>();\n  const groupOrder: string[] = [];\n\n  for (const item of items) {\n    const sentAt = item.getSentAt();\n    const itemDate = new Date(sentAt * 1000);\n    const itemDay = new Date(itemDate.getFullYear(), itemDate.getMonth(), itemDate.getDate());\n\n    let label: string;\n\n    if (itemDay.getTime() === today.getTime()) {\n      label = CometChatLocalize.getLocalizedString('today');\n    } else if (itemDay.getTime() === yesterday.getTime()) {\n      label = CometChatLocalize.getLocalizedString('yesterday');\n    } else if (itemDay.getTime() >= startOfWeek.getTime()) {\n      label = itemDate.toLocaleDateString(undefined, { weekday: 'long' });\n    } else {\n      label = itemDate.toLocaleDateString(undefined, {\n        month: 'short',\n        day: 'numeric',\n        year: 'numeric',\n      });\n    }\n\n    if (!groupMap.has(label)) {\n      groupMap.set(label, []);\n      groupOrder.push(label);\n    }\n    groupMap.get(label)!.push(item);\n  }\n\n  return groupOrder.map((label) => ({\n    label,\n    items: groupMap.get(label)!,\n  }));\n}\n\n/**\n * Visibility tracker using IntersectionObserver.\n * Tracks which items are visible and manages read/viewed engagement timers.\n */\nexport class VisibilityTracker {\n  private observer: IntersectionObserver | null = null;\n  private timers: Map<string, ReturnType<typeof setTimeout>> = new Map();\n  private viewedItems: Set<string> = new Set();\n  private readItems: Set<string> = new Set();\n  private onViewed: (item: NotificationFeedItem) => void;\n  private onRead: (item: NotificationFeedItem) => void;\n  private itemMap: Map<string, NotificationFeedItem> = new Map();\n\n  constructor(\n    onViewed: (item: NotificationFeedItem) => void,\n    onRead: (item: NotificationFeedItem) => void\n  ) {\n    this.onViewed = onViewed;\n    this.onRead = onRead;\n  }\n\n  /**\n   * Initialize the IntersectionObserver.\n   */\n  init(root: HTMLElement | null): void {\n    this.observer = new IntersectionObserver(\n      (entries) => {\n        for (const entry of entries) {\n          const itemId = entry.target.getAttribute('data-feed-item-id');\n          if (!itemId) continue;\n\n          const item = this.itemMap.get(itemId);\n          if (!item) continue;\n\n          if (entry.isIntersecting) {\n            this.handleItemVisible(item);\n          } else {\n            this.handleItemHidden(item);\n          }\n        }\n      },\n      {\n        root,\n        threshold: 0.5,\n      }\n    );\n  }\n\n  /**\n   * Observe a DOM element for a feed item.\n   */\n  observe(element: HTMLElement, item: NotificationFeedItem): void {\n    this.itemMap.set(item.getId(), item);\n    this.observer?.observe(element);\n  }\n\n  /**\n   * Unobserve a DOM element.\n   */\n  unobserve(element: HTMLElement): void {\n    this.observer?.unobserve(element);\n  }\n\n  /**\n   * Handle item becoming visible in viewport.\n   */\n  private handleItemVisible(item: NotificationFeedItem): void {\n    // Report viewed (once per item)\n    if (!this.viewedItems.has(item.getId())) {\n      this.viewedItems.add(item.getId());\n      this.onViewed(item);\n    }\n\n    // Start 1-second timer for read (only if not already read)\n    if (!this.readItems.has(item.getId()) && item.getReadAt() === null) {\n      const timer = setTimeout(() => {\n        this.readItems.add(item.getId());\n        this.onRead(item);\n        this.timers.delete(item.getId());\n      }, 1000);\n      this.timers.set(item.getId(), timer);\n    }\n  }\n\n  /**\n   * Handle item leaving viewport.\n   */\n  private handleItemHidden(item: NotificationFeedItem): void {\n    // Cancel read timer if item leaves before 1 second\n    const timer = this.timers.get(item.getId());\n    if (timer) {\n      clearTimeout(timer);\n      this.timers.delete(item.getId());\n    }\n  }\n\n  /**\n   * Mark an item as already read (e.g., when state updates externally).\n   */\n  markAsRead(itemId: string): void {\n    this.readItems.add(itemId);\n    const timer = this.timers.get(itemId);\n    if (timer) {\n      clearTimeout(timer);\n      this.timers.delete(itemId);\n    }\n  }\n\n  /**\n   * Reset the tracker state (call on category switch to prevent memory leak).\n   * Note: After disconnect(), the existing IntersectionObserver instance remains valid.\n   * Calling observe() on it after disconnect() will resume observation for newly\n   * added elements — this is per the IntersectionObserver spec. No re-creation needed.\n   */\n  reset(): void {\n    this.timers.forEach((timer) => {\n      clearTimeout(timer);\n    });\n    this.timers.clear();\n    this.viewedItems.clear();\n    this.readItems.clear();\n    this.itemMap.clear();\n    // Disconnect stops observing all current targets but keeps the observer reusable\n    if (this.observer) {\n      this.observer.disconnect();\n    }\n  }\n\n  /**\n   * Cleanup all observers and timers.\n   */\n  dispose(): void {\n    this.observer?.disconnect();\n    this.observer = null;\n    this.timers.forEach((timer) => {\n      clearTimeout(timer);\n    });\n    this.timers.clear();\n    this.viewedItems.clear();\n    this.readItems.clear();\n    this.itemMap.clear();\n  }\n}\n","import { CometChat } from '@cometchat/chat-sdk-javascript';\nimport {\n  NotificationFeedItem,\n  NotificationCategory,\n  NotificationFeedState,\n  TimestampGroup,\n} from './cometchat-notification-feed.types';\nimport { groupByTimestamp } from './cometchat-notification-feed.utils';\n\n/**\n * ViewModel for CometChatNotificationFeed.\n * Manages all data operations: fetching, pagination, engagement, real-time updates.\n */\nexport class NotificationFeedViewModel {\n  private feedRequestBuilder: any = null;\n  private customFeedRequestBuilder: any = null;\n  private categoriesRequestBuilder: any = null;\n  private listenerId: string = '';\n  private pollingInterval: ReturnType<typeof setInterval> | null = null;\n  private deliveredItemIds: Set<string> = new Set();\n  private fetchVersion: number = 0;\n  private onStateChange: (state: NotificationFeedState) => void;\n\n  private state: NotificationFeedState = {\n    items: [],\n    groupedItems: [],\n    categories: [],\n    activeCategory: null,\n    totalUnreadCount: 0,\n    categoryUnreadCounts: new Map(),\n    screenState: 'loading',\n    isLoadingMore: false,\n    isRefreshing: false,\n    isOffline: false,\n    error: null,\n    hasMorePages: true,\n    paginationError: false,\n  };\n\n  constructor(\n    onStateChange: (state: NotificationFeedState) => void,\n    feedRequestBuilder?: any,\n    categoriesRequestBuilder?: any\n  ) {\n    this.onStateChange = onStateChange;\n    this.customFeedRequestBuilder = feedRequestBuilder || null;\n    this.feedRequestBuilder = feedRequestBuilder || null;\n    this.categoriesRequestBuilder = categoriesRequestBuilder || null;\n    this.listenerId = `notification_feed_${Date.now()}`;\n  }\n\n  /**\n   * Get current state.\n   */\n  getState(): NotificationFeedState {\n    return this.state;\n  }\n\n  /**\n   * Update state and notify the view.\n   */\n  private setState(partial: Partial<NotificationFeedState>): void {\n    this.state = { ...this.state, ...partial };\n    if (partial.items !== undefined) {\n      this.state.groupedItems = groupByTimestamp(this.state.items);\n    }\n    this.onStateChange(this.state);\n  }\n\n  /**\n   * Initialize: fetch categories, first page, register listener.\n   */\n  async init(): Promise<void> {\n    this.setState({ screenState: 'loading' });\n\n    await this.fetchCategories();\n    await this.fetchInitialItems();\n    this.registerListener();\n  }\n\n  /**\n   * Cleanup: remove listener, stop polling.\n   */\n  dispose(): void {\n    this.removeListener();\n    this.stopUnreadCountPolling();\n  }\n\n  /**\n   * Fetch available categories for filter chips.\n   */\n  async fetchCategories(): Promise<void> {\n    try {\n      let builder = this.categoriesRequestBuilder;\n      if (!builder) {\n        builder = new CometChat.NotificationCategoriesRequestBuilder()\n          .setLimit(50)\n          .build();\n      }\n      const categories: NotificationCategory[] = await builder.fetchNext();\n      this.setState({ categories });\n    } catch (error) {\n      // Categories fetch failure is non-fatal — show \"All\" chip only\n      console.warn('[NotificationFeed] Failed to fetch categories:', error);\n      this.setState({ categories: [] });\n    }\n  }\n\n  /**\n   * Fetch the first page of feed items.\n   * Uses fetchVersion to discard stale results from previous category switches.\n   */\n  async fetchInitialItems(): Promise<void> {\n    const version = ++this.fetchVersion;\n    try {\n      this.initFeedRequestBuilder();\n      const items: NotificationFeedItem[] = await this.feedRequestBuilder.fetchNext();\n\n      // Discard result if a newer fetch was triggered (category switch race)\n      if (version !== this.fetchVersion) return;\n\n      if (items.length === 0) {\n        this.setState({ items: [], screenState: 'empty', hasMorePages: false });\n      } else {\n        this.setState({ items, screenState: 'loaded', hasMorePages: true });\n        this.reportDeliveredBatch(items);\n      }\n\n      await this.fetchUnreadCount();\n    } catch (error: any) {\n      if (version !== this.fetchVersion) return;\n      this.setState({\n        screenState: 'error',\n        error: error as CometChat.CometChatException,\n      });\n    }\n  }\n\n  /**\n   * Fetch next page (infinite scroll).\n   */\n  async fetchNextPage(): Promise<void> {\n    if (this.state.isLoadingMore || !this.state.hasMorePages) return;\n\n    this.setState({ isLoadingMore: true, paginationError: false });\n\n    try {\n      const items: NotificationFeedItem[] = await this.feedRequestBuilder.fetchNext();\n\n      if (items.length === 0) {\n        this.setState({ isLoadingMore: false, hasMorePages: false });\n      } else {\n        // Deduplicate: filter out items already in the list\n        const existingIds = new Set(this.state.items.map((i) => i.getId()));\n        const newItems = items.filter((item) => !existingIds.has(item.getId()));\n\n        if (newItems.length === 0) {\n          this.setState({ isLoadingMore: false, hasMorePages: false });\n        } else {\n          const allItems = [...this.state.items, ...newItems];\n          this.setState({ items: allItems, isLoadingMore: false });\n          this.reportDeliveredBatch(newItems);\n        }\n      }\n    } catch (error) {\n      console.warn('[NotificationFeed] Pagination error:', error);\n      this.setState({ isLoadingMore: false, paginationError: true });\n    }\n  }\n\n  /**\n   * Retry pagination after error.\n   */\n  retryPagination(): void {\n    this.setState({ paginationError: false, hasMorePages: true });\n    this.fetchNextPage();\n  }\n\n  /**\n   * Refresh feed (pull-to-refresh or reconnect).\n   */\n  async refresh(): Promise<void> {\n    if (this.state.isRefreshing) return;\n\n    this.setState({ isRefreshing: true });\n    this.deliveredItemIds.clear();\n\n    try {\n      this.initFeedRequestBuilder();\n      const items: NotificationFeedItem[] = await this.feedRequestBuilder.fetchNext();\n\n      if (items.length === 0) {\n        this.setState({ items: [], screenState: 'empty', isRefreshing: false, hasMorePages: false });\n      } else {\n        this.setState({ items, screenState: 'loaded', isRefreshing: false, hasMorePages: true });\n        this.reportDeliveredBatch(items);\n      }\n\n      await this.fetchUnreadCount();\n    } catch (error: any) {\n      this.setState({\n        screenState: 'error',\n        isRefreshing: false,\n        error: error as CometChat.CometChatException,\n      });\n    }\n  }\n\n  /**\n   * Switch category filter.\n   */\n  switchCategory(category: string | null): void {\n    this.setState({ activeCategory: category, screenState: 'loading', items: [], hasMorePages: true });\n    this.deliveredItemIds.clear();\n    this.fetchInitialItems();\n  }\n\n  // --- Engagement Methods ---\n\n  /**\n   * Report delivered for a batch of items (once per item).\n   */\n  private reportDeliveredBatch(items: NotificationFeedItem[]): void {\n    for (const item of items) {\n      this.reportDelivered(item);\n    }\n  }\n\n  /**\n   * Report item as delivered (fire-and-forget, once per item).\n   */\n  reportDelivered(item: NotificationFeedItem): void {\n    if (this.deliveredItemIds.has(item.getId())) return;\n    this.deliveredItemIds.add(item.getId());\n\n    try {\n      const result = CometChat.markFeedItemAsDelivered(item);\n      if (result && result.catch) {\n        result.catch(() => { /* fire-and-forget */ });\n      }\n    } catch (error) {\n      // Silently ignore - engagement is fire-and-forget\n    }\n  }\n\n  /**\n   * Report item as viewed (fire-and-forget).\n   */\n  reportViewed(item: NotificationFeedItem): void {\n    try {\n      const result = CometChat.reportFeedEngagement(item, 'viewed');\n      if (result && result.catch) {\n        result.catch(() => { /* fire-and-forget */ });\n      }\n    } catch (error) {\n      // Silently ignore\n    }\n  }\n\n  /**\n   * Report item as read (after 1s visibility).\n   */\n  reportRead(item: NotificationFeedItem): void {\n    try {\n      const result = CometChat.markFeedItemAsRead(item);\n      if (result && result.catch) {\n        result.catch(() => { /* fire-and-forget */ });\n      }\n      // Update local state\n      const updatedItems = this.state.items.map((i) =>\n        i.getId() === item.getId()\n          ? (() => { i.setReadAt(Math.floor(Date.now() / 1000)); return i; })()\n          : i\n      );\n      const newUnreadCount = Math.max(0, this.state.totalUnreadCount - 1);\n\n      // Decrement per-category unread count\n      const categoryUnreadCounts = new Map(this.state.categoryUnreadCounts);\n      if (item.getCategory()) {\n        const currentCount = categoryUnreadCounts.get(item.getCategory()) || 0;\n        if (currentCount > 0) {\n          categoryUnreadCounts.set(item.getCategory(), currentCount - 1);\n        }\n      }\n\n      this.setState({ items: updatedItems, totalUnreadCount: newUnreadCount, categoryUnreadCounts });\n    } catch (error) {\n      console.warn('[NotificationFeed] Failed to mark read:', error);\n    }\n  }\n\n  /**\n   * Report item as clicked.\n   */\n  reportClicked(item: NotificationFeedItem): void {\n    try {\n      const result = CometChat.reportFeedEngagement(item, 'clicked');\n      if (result && result.catch) {\n        result.catch(() => { /* fire-and-forget */ });\n      }\n    } catch (error) {\n      // Silently ignore\n    }\n  }\n\n  /**\n   * Report item as interacted (action button tap).\n   */\n  reportInteracted(item: NotificationFeedItem): void {\n    try {\n      const result = CometChat.reportFeedEngagement(item, 'interacted');\n      if (result && result.catch) {\n        result.catch(() => { /* fire-and-forget */ });\n      }\n    } catch (error) {\n      // Silently ignore\n    }\n  }\n\n  // --- Real-Time ---\n\n  /**\n   * Register WebSocket listener for new feed items.\n   */\n  private registerListener(): void {\n    try {\n      CometChat.addNotificationFeedListener(\n        this.listenerId,\n        {\n          onFeedItemReceived: (feedItem: NotificationFeedItem) => {\n            this.onFeedItemReceived(feedItem);\n          },\n        }\n      );\n    } catch (error) {\n      console.warn('[NotificationFeed] Failed to register listener:', error);\n    }\n  }\n\n  /**\n   * Remove WebSocket listener.\n   */\n  private removeListener(): void {\n    try {\n      CometChat.removeNotificationFeedListener(this.listenerId);\n    } catch (error) {\n      console.warn('[NotificationFeed] Failed to remove listener:', error);\n    }\n  }\n\n  /**\n   * Handle new feed item received via WebSocket.\n   */\n  onFeedItemReceived(item: NotificationFeedItem): void {\n    // Always update unread counts (regardless of active filter)\n    const newUnreadCount = this.state.totalUnreadCount + 1;\n    const categoryUnreadCounts = new Map(this.state.categoryUnreadCounts);\n    if (item.getCategory()) {\n      const currentCount = categoryUnreadCounts.get(item.getCategory()) || 0;\n      categoryUnreadCounts.set(item.getCategory(), currentCount + 1);\n    }\n\n    // Only prepend to visible list if no category filter is active,\n    // or if the item matches the active category filter\n    const matchesFilter = !this.state.activeCategory || item.getCategory() === this.state.activeCategory;\n\n    if (matchesFilter) {\n      const updatedItems = [item, ...this.state.items];\n      this.setState({\n        items: updatedItems,\n        screenState: 'loaded',\n        totalUnreadCount: newUnreadCount,\n        categoryUnreadCounts,\n      });\n    } else {\n      // Update counts only — don't insert into visible list\n      this.setState({\n        totalUnreadCount: newUnreadCount,\n        categoryUnreadCounts,\n      });\n    }\n\n    // Mark as delivered\n    this.reportDelivered(item);\n  }\n\n  // --- Unread Count ---\n\n  /**\n   * Fetch current unread count.\n   */\n  private async fetchUnreadCount(): Promise<void> {\n    try {\n      const result = await CometChat.getNotificationFeedUnreadCount();\n      const count = typeof result === 'number' ? result : result?.count ?? 0;\n      this.setState({ totalUnreadCount: count });\n    } catch (error: any) {\n      if (error?.code !== 'ERR_BAD_REQUEST') {\n        console.warn('[NotificationFeed] Failed to fetch unread count:', error);\n      }\n    }\n  }\n\n  /**\n   * Start polling unread count every 30 seconds.\n   */\n  startUnreadCountPolling(intervalMs: number = 30000): void {\n    this.stopUnreadCountPolling();\n    this.pollingInterval = setInterval(() => {\n      this.fetchUnreadCount();\n    }, intervalMs);\n  }\n\n  /**\n   * Stop polling.\n   */\n  stopUnreadCountPolling(): void {\n    if (this.pollingInterval) {\n      clearInterval(this.pollingInterval);\n      this.pollingInterval = null;\n    }\n  }\n\n  // --- Helpers ---\n\n  /**\n   * Initialize or re-initialize the feed request builder.\n   * Respects custom builder if provided via constructor (when no category filter active).\n   */\n  private initFeedRequestBuilder(): void {\n    try {\n      // If a custom builder was provided and no category filter is active, rebuild from it\n      if (this.customFeedRequestBuilder && !this.state.activeCategory) {\n        this.feedRequestBuilder = this.customFeedRequestBuilder;\n        return;\n      }\n\n      const builder = new CometChat.NotificationFeedRequestBuilder().setLimit(15);\n\n      if (this.state.activeCategory) {\n        builder.setCategory(this.state.activeCategory);\n      }\n\n      this.feedRequestBuilder = builder.build();\n    } catch (error) {\n      console.warn('[NotificationFeed] Failed to init request builder:', error);\n    }\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { NotificationFeedItem } from './cometchat-notification-feed.types';\n\n/**\n * Pure pipe to format badge count with 99+ cap.\n * Replaces method call in template to avoid re-evaluation on every CD cycle.\n */\n@Pipe({\n  name: 'badgeCount',\n  standalone: true,\n  pure: true,\n})\nexport class BadgeCountPipe implements PipeTransform {\n  transform(count: number, max: number = 99): string {\n    return count > max ? `${max}+` : `${count}`;\n  }\n}\n\n/**\n * Pure pipe to extract card JSON string from a NotificationFeedItem.\n * Replaces method call in template to avoid JSON.stringify on every CD cycle.\n */\n@Pipe({\n  name: 'cardJson',\n  standalone: true,\n  pure: true,\n})\nexport class CardJsonPipe implements PipeTransform {\n  transform(item: NotificationFeedItem): string {\n    try {\n      const content = item.getContent();\n      return typeof content === 'string' ? content : JSON.stringify(content);\n    } catch {\n      return '';\n    }\n  }\n}\n\n/**\n * Pure pipe to get category unread count from the Map.\n * Replaces method call in template to avoid re-evaluation on every CD cycle.\n */\n@Pipe({\n  name: 'categoryUnreadCount',\n  standalone: true,\n  pure: true,\n})\nexport class CategoryUnreadCountPipe implements PipeTransform {\n  transform(categoryId: string, categoryUnreadCounts: Map<string, number>): number {\n    return categoryUnreadCounts.get(categoryId) || 0;\n  }\n}\n","import {\n  Component,\n  Input,\n  Output,\n  EventEmitter,\n  TemplateRef,\n  ChangeDetectionStrategy,\n  OnInit,\n  OnDestroy,\n  signal,\n  ElementRef,\n  ViewChild,\n  NgZone,\n  ChangeDetectorRef,\n  inject,\n  booleanAttribute,\n  AfterViewInit,\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { CometChat } from '@cometchat/chat-sdk-javascript';\nimport { NotificationFeedViewModel } from './cometchat-notification-feed-view-model';\nimport { VisibilityTracker } from './cometchat-notification-feed.utils';\nimport {\n  NotificationFeedItem,\n  NotificationFeedState,\n  NotificationCategory,\n  TimestampGroup,\n  CometChatNotificationFeedStyle,\n} from './cometchat-notification-feed.types';\nimport { BadgeCountPipe, CardJsonPipe, CategoryUnreadCountPipe } from './cometchat-notification-feed.pipes';\nimport { CometChatDateComponent } from '../base-elements/cometchat-date/cometchat-date.component';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { CometChatLocalize } from '../../resources/CometChatLocalize/cometchat-localize';\nimport { CometChatCardViewComponent } from '@cometchat/cards-angular';\nimport type { CometChatCardAction, CometChatCardActionEvent } from '@cometchat/cards-angular';\n\n/**\n * CometChatNotificationFeed — Main notification feed component.\n * Displays campaign/promotional notifications in a scrollable list with\n * card rendering, real-time updates, and engagement reporting.\n */\n@Component({\n  selector: 'cometchat-notification-feed',\n  standalone: true,\n  imports: [NgTemplateOutlet, CometChatDateComponent, TranslatePipe, CometChatCardViewComponent, BadgeCountPipe, CardJsonPipe, CategoryUnreadCountPipe],\n  templateUrl: './cometchat-notification-feed.component.html',\n  styleUrls: ['./cometchat-notification-feed.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatNotificationFeedComponent implements OnInit, OnDestroy, AfterViewInit {\n  private ngZone = inject(NgZone);\n  private cdr = inject(ChangeDetectorRef);\n\n  // --- Inputs ---\n\n  /** Title displayed in the header. Default: localized 'notifications_title' */\n  @Input() title: string = '';\n\n  /** Whether to show the header. Default: true */\n  @Input({ transform: booleanAttribute }) showHeader: boolean = true;\n\n  /** Whether to show the back button. Default: false */\n  @Input({ transform: booleanAttribute }) showBackButton: boolean = false;\n\n  /** Whether to show filter chips. Default: true */\n  @Input({ transform: booleanAttribute }) showFilterChips: boolean = true;\n\n  /** Deep link: scroll to a specific item by ID */\n  @Input() scrollToItemId: string | undefined;\n\n  /** Custom request builder for fetching feed items */\n  @Input() notificationFeedRequestBuilder: any;\n\n  /** Custom request builder for fetching categories */\n  @Input() notificationCategoriesRequestBuilder: any;\n\n  /** Custom header template */\n  @Input() headerView: TemplateRef<any> | undefined;\n\n  /** Custom empty state template */\n  @Input() emptyStateView: TemplateRef<any> | undefined;\n\n  /** Custom error state template */\n  @Input() errorStateView: TemplateRef<any> | undefined;\n\n  /** Custom loading state template */\n  @Input() loadingStateView: TemplateRef<any> | undefined;\n\n  /** Style customization */\n  @Input() style: CometChatNotificationFeedStyle | undefined;\n\n  /** Card theme mode forwarded to @cometchat/cards-angular */\n  @Input() cardThemeMode: 'auto' | 'light' | 'dark' = 'auto';\n\n  /** Card theme override forwarded to @cometchat/cards-angular */\n  @Input() cardThemeOverride: Record<string, any> | undefined;\n\n  // --- Outputs ---\n\n  /** Emitted when a feed item is clicked */\n  @Output() itemClick = new EventEmitter<NotificationFeedItem>();\n\n  /** Emitted when a card action button is clicked */\n  @Output() actionClick = new EventEmitter<{\n    item: NotificationFeedItem;\n    action: CometChatCardAction;\n  }>();\n\n  /** Emitted when an error occurs */\n  @Output() error = new EventEmitter<CometChat.CometChatException>();\n\n  /** Emitted when back button is pressed */\n  @Output() backClick = new EventEmitter<void>();\n\n  // --- Internal State ---\n\n  @ViewChild('contentRef', { static: false }) contentRef!: ElementRef<HTMLDivElement>;\n\n  state = signal<NotificationFeedState>({\n    items: [],\n    groupedItems: [],\n    categories: [],\n    activeCategory: null,\n    totalUnreadCount: 0,\n    categoryUnreadCounts: new Map(),\n    screenState: 'loading',\n    isLoadingMore: false,\n    isRefreshing: false,\n    isOffline: false,\n    error: null,\n    hasMorePages: true,\n    paginationError: false,\n  });\n\n  private viewModel: NotificationFeedViewModel | null = null;\n  private visibilityTracker: VisibilityTracker | null = null;\n  private observedItemIds: Set<string> = new Set();\n\n  // --- Lifecycle ---\n\n  ngOnInit(): void {\n    this.viewModel = new NotificationFeedViewModel(\n      (newState) => {\n        this.ngZone.run(() => {\n          this.state.set({ ...newState });\n          if (newState.error) {\n            this.error.emit(newState.error);\n          }\n          this.cdr.markForCheck();\n        });\n      },\n      this.notificationFeedRequestBuilder,\n      this.notificationCategoriesRequestBuilder\n    );\n\n    this.viewModel.init();\n  }\n\n  ngAfterViewInit(): void {\n    this.initVisibilityTracker();\n\n    // Handle scrollToItemId\n    if (this.scrollToItemId) {\n      this.scrollToItem(this.scrollToItemId);\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.viewModel?.dispose();\n    this.visibilityTracker?.dispose();\n  }\n\n  // --- Visibility Tracking ---\n\n  private initVisibilityTracker(): void {\n    this.visibilityTracker = new VisibilityTracker(\n      (item) => this.viewModel?.reportViewed(item),\n      (item) => this.viewModel?.reportRead(item)\n    );\n\n    const contentEl = this.contentRef?.nativeElement || null;\n    this.visibilityTracker.init(contentEl);\n  }\n\n  /**\n   * Called by the template to observe each feed item element.\n   * Tracks observed items to avoid redundant IntersectionObserver.observe() calls.\n   * Returns null for use in [attr.data-observe] binding.\n   */\n  observeItem(element: HTMLElement, item: NotificationFeedItem): null {\n    const itemId = item.getId();\n    if (element && this.visibilityTracker && !this.observedItemIds.has(itemId)) {\n      this.observedItemIds.add(itemId);\n      this.visibilityTracker.observe(element, item);\n    }\n    return null;\n  }\n\n  // --- Event Handlers ---\n\n  onScroll(event: Event): void {\n    const target = event.target as HTMLElement;\n    const threshold = 100;\n    const isNearBottom =\n      target.scrollHeight - target.scrollTop - target.clientHeight < threshold;\n\n    const currentState = this.state();\n    if (isNearBottom && !currentState.isLoadingMore && currentState.hasMorePages) {\n      this.viewModel?.fetchNextPage();\n    }\n  }\n\n  onItemClick(item: NotificationFeedItem): void {\n    this.viewModel?.reportClicked(item);\n    this.itemClick.emit(item);\n  }\n\n  onCardAction(item: NotificationFeedItem, event: CometChatCardActionEvent): void {\n    this.viewModel?.reportInteracted(item);\n    // Unwrap the renderer event — consumers expect the bare action, matching the\n    // card bubble and the ccCardActionClicked bus.\n    this.actionClick.emit({ item, action: event?.action });\n  }\n\n  onChipClick(category: string | null): void {\n    // Reset visibility tracker to prevent memory leak on category switch\n    this.visibilityTracker?.reset();\n    this.observedItemIds.clear();\n    this.viewModel?.switchCategory(category);\n  }\n\n  onRetry(): void {\n    this.viewModel?.refresh();\n  }\n\n  onRetryPagination(): void {\n    this.viewModel?.retryPagination();\n  }\n\n  onBackClick(): void {\n    this.backClick.emit();\n  }\n\n  // --- Helpers ---\n\n  private scrollToItem(itemId: string): void {\n    setTimeout(() => {\n      const element = this.contentRef?.nativeElement?.querySelector(\n        `[data-feed-item-id=\"${itemId}\"]`\n      );\n      if (element) {\n        element.scrollIntoView({ behavior: 'smooth', block: 'center' });\n      }\n    }, 500);\n  }\n\n  /**\n   * TrackBy function for grouped items.\n   */\n  trackByGroup(index: number, group: TimestampGroup): string {\n    return group.label;\n  }\n\n  /**\n   * TrackBy function for feed items.\n   */\n  trackByItem(index: number, item: NotificationFeedItem): string {\n    return item.getId();\n  }\n\n  /**\n   * TrackBy function for categories.\n   */\n  trackByCategory(index: number, cat: NotificationCategory): string {\n    return cat.id;\n  }\n\n  /**\n   * Get the card content as a JSON string for the cards renderer.\n   */\n  getCardJson(item: NotificationFeedItem): string {\n    try {\n      const content = item.getContent();\n      return typeof content === 'string' ? content : JSON.stringify(content);\n    } catch {\n      return '';\n    }\n  }\n\n  /**\n   * Get fallback text for card content.\n   * Extracts readable text from the card JSON when @cometchat/cards-angular is not available.\n   */\n  getFallbackText(item: NotificationFeedItem): string {\n    try {\n      const content = item.getContent();\n      if (!content) return CometChatLocalize.getLocalizedString('notifications_card_fallback');\n\n      const data = typeof content === 'string' ? JSON.parse(content) : content;\n\n      // Try to extract title/body from common card schema patterns\n      if (data.title) return data.title;\n      if (data.body?.text) return data.body.text;\n      if (data.header?.title) return data.header.title;\n      if (data.fallbackText) return data.fallbackText;\n\n      // Try nested body array (Card_Schema format)\n      if (Array.isArray(data.body)) {\n        for (const block of data.body) {\n          if (block.text) return block.text;\n          if (block.type === 'TextBlock' && block.text) return block.text;\n        }\n      }\n\n      return CometChatLocalize.getLocalizedString('notifications_card_fallback');\n    } catch {\n      return CometChatLocalize.getLocalizedString('notifications_card_fallback');\n    }\n  }\n\n  /**\n   * Get category unread count.\n   */\n  getCategoryUnreadCount(categoryId: string): number {\n    return this.state().categoryUnreadCounts.get(categoryId) || 0;\n  }\n\n  /**\n   * Format badge count with 99+ cap.\n   */\n  formatBadgeCount(count: number): string {\n    return count > 99 ? '99+' : `${count}`;\n  }\n}\n","<div\n  class=\"cometchat-notification-feed\"\n  [style.backgroundColor]=\"style?.backgroundColor\"\n  [style.width]=\"style?.width\"\n  [style.height]=\"style?.height\"\n>\n  <!-- Header -->\n  @if (showHeader) {\n    @if (headerView) {\n      <ng-container *ngTemplateOutlet=\"headerView\"></ng-container>\n    } @else {\n      <div class=\"cometchat-notification-feed__header\">\n        <div class=\"cometchat-notification-feed__header-left\">\n          @if (showBackButton) {\n            <div\n              class=\"cometchat-notification-feed__header-back\"\n              (click)=\"onBackClick()\"\n              (keydown.enter)=\"onBackClick()\"\n              (keydown.space)=\"onBackClick(); $event.preventDefault()\"\n              role=\"button\"\n              tabindex=\"0\"\n              [attr.aria-label]=\"'back' | translate\"\n            ></div>\n          }\n          <h2\n            class=\"cometchat-notification-feed__header-title\"\n            [style.color]=\"style?.headerTitleColor\"\n            [style.font]=\"style?.headerTitleFont\"\n          >\n            {{ title || ('notifications_title' | translate) }}\n          </h2>\n        </div>\n      </div>\n    }\n  }\n\n  <!-- Filter Chips -->\n  @if (showFilterChips) {\n    <div\n      class=\"cometchat-notification-feed__chips\"\n      role=\"group\"\n      [attr.aria-label]=\"'notifications_filter_all' | translate\"\n    >\n      <!-- \"All\" chip -->\n      <button\n        class=\"cometchat-notification-feed__chip\"\n        [class.cometchat-notification-feed__chip--active]=\"state().activeCategory === null\"\n        [class.cometchat-notification-feed__chip--inactive-with-badge]=\"state().activeCategory !== null && state().totalUnreadCount > 0\"\n        [class.cometchat-notification-feed__chip--inactive]=\"state().activeCategory !== null && state().totalUnreadCount === 0\"\n        (click)=\"onChipClick(null)\"\n        [attr.aria-pressed]=\"state().activeCategory === null\"\n        [style.backgroundColor]=\"state().activeCategory === null ? style?.chipActiveBackgroundColor : undefined\"\n        [style.color]=\"state().activeCategory === null ? style?.chipActiveTextColor : undefined\"\n        [style.borderColor]=\"state().activeCategory !== null ? style?.chipBorderColor : undefined\"\n      >\n        <span class=\"cometchat-notification-feed__chip-text\">{{ 'notifications_filter_all' | translate }}</span>\n        @if (state().totalUnreadCount > 0) {\n          <span\n            class=\"cometchat-notification-feed__chip-badge\"\n            [class.cometchat-notification-feed__chip-badge--active]=\"state().activeCategory === null\"\n            [class.cometchat-notification-feed__chip-badge--inactive]=\"state().activeCategory !== null\"\n          >\n            {{ state().totalUnreadCount | badgeCount }}\n          </span>\n        }\n      </button>\n\n      <!-- Category chips -->\n      @for (cat of state().categories; track cat.id) {\n        <button\n          class=\"cometchat-notification-feed__chip\"\n          [class.cometchat-notification-feed__chip--active]=\"state().activeCategory === cat.label\"\n          [class.cometchat-notification-feed__chip--inactive-with-badge]=\"state().activeCategory !== cat.label && (cat.id | categoryUnreadCount:state().categoryUnreadCounts) > 0\"\n          [class.cometchat-notification-feed__chip--inactive]=\"state().activeCategory !== cat.label && (cat.id | categoryUnreadCount:state().categoryUnreadCounts) === 0\"\n          (click)=\"onChipClick(cat.label)\"\n          [attr.aria-pressed]=\"state().activeCategory === cat.label\"\n          [style.backgroundColor]=\"state().activeCategory === cat.label ? style?.chipActiveBackgroundColor : undefined\"\n          [style.color]=\"state().activeCategory === cat.label ? style?.chipActiveTextColor : undefined\"\n          [style.borderColor]=\"state().activeCategory !== cat.label ? style?.chipBorderColor : undefined\"\n        >\n          <span class=\"cometchat-notification-feed__chip-text\">{{ cat.label }}</span>\n          @if ((cat.id | categoryUnreadCount:state().categoryUnreadCounts) > 0) {\n            <span\n              class=\"cometchat-notification-feed__chip-badge\"\n              [class.cometchat-notification-feed__chip-badge--active]=\"state().activeCategory === cat.label\"\n              [class.cometchat-notification-feed__chip-badge--inactive]=\"state().activeCategory !== cat.label\"\n            >\n              {{ (cat.id | categoryUnreadCount:state().categoryUnreadCounts) | badgeCount }}\n            </span>\n          }\n        </button>\n      }\n    </div>\n  }\n\n  <!-- Connectivity Banner -->\n  @if (state().isOffline) {\n    <div\n      class=\"cometchat-notification-feed__connectivity-banner\"\n      role=\"alert\"\n      aria-live=\"polite\"\n    >\n      {{ 'notifications_offline_banner' | translate }}\n    </div>\n  }\n\n  <!-- Content Area -->\n  <div\n    #contentRef\n    class=\"cometchat-notification-feed__content\"\n    (scroll)=\"onScroll($event)\"\n    [attr.aria-busy]=\"state().screenState === 'loading'\"\n  >\n    <!-- Loading State -->\n    @if (state().screenState === 'loading') {\n      @if (loadingStateView) {\n        <ng-container *ngTemplateOutlet=\"loadingStateView\"></ng-container>\n      } @else {\n        <div class=\"cometchat-notification-feed__loading\" aria-busy=\"true\" [attr.aria-label]=\"'loading' | translate\">\n          <div class=\"cometchat-notification-feed__loading-spinner\"></div>\n          <p class=\"cometchat-notification-feed__loading-text\">{{ 'loading' | translate }}</p>\n        </div>\n      }\n    }\n\n    <!-- Empty State -->\n    @if (state().screenState === 'empty') {\n      @if (emptyStateView) {\n        <ng-container *ngTemplateOutlet=\"emptyStateView\"></ng-container>\n      } @else {\n        <div class=\"cometchat-notification-feed__empty\">\n          <div class=\"cometchat-notification-feed__empty-illustration\">\n            <div class=\"cometchat-notification-feed__empty-illustration-icon\"></div>\n          </div>\n          <div class=\"cometchat-notification-feed__empty-text-container\">\n            <p class=\"cometchat-notification-feed__empty-title\">{{ 'notifications_empty_title' | translate }}</p>\n            <p class=\"cometchat-notification-feed__empty-subtitle\">{{ 'notifications_empty_subtitle' | translate }}</p>\n          </div>\n        </div>\n      }\n    }\n\n    <!-- Error State -->\n    @if (state().screenState === 'error') {\n      @if (errorStateView) {\n        <ng-container *ngTemplateOutlet=\"errorStateView\"></ng-container>\n      } @else {\n        <div class=\"cometchat-notification-feed__error\">\n          <div class=\"cometchat-notification-feed__error-illustration\">\n            <div class=\"cometchat-notification-feed__error-illustration-icon\"></div>\n          </div>\n          <div class=\"cometchat-notification-feed__error-text-container\">\n            <p class=\"cometchat-notification-feed__error-title\">{{ 'notifications_error_title' | translate }}</p>\n            <p class=\"cometchat-notification-feed__error-subtitle\">{{ 'notifications_error_subtitle' | translate }}</p>\n          </div>\n          <button\n            class=\"cometchat-notification-feed__error-retry-button\"\n            (click)=\"onRetry()\"\n            [attr.aria-label]=\"'notifications_tap_to_retry' | translate\"\n          >\n            {{ 'retry' | translate }}\n          </button>\n        </div>\n      }\n    }\n\n    <!-- Feed List -->\n    @if (state().screenState === 'loaded') {\n      <div role=\"feed\" [attr.aria-label]=\"'notifications_title' | translate\" [attr.aria-busy]=\"state().isLoadingMore\">\n        @for (group of state().groupedItems; track group.label) {\n          @for (item of group.items; track item.getId()) {\n            <div\n              class=\"cometchat-notification-feed__item\"\n              [class.cometchat-notification-feed__item--unread]=\"item.getReadAt() === null\"\n              [attr.data-feed-item-id]=\"item.getId()\"\n              (click)=\"onItemClick(item)\"\n              (keydown.enter)=\"onItemClick(item)\"\n              (keydown.space)=\"onItemClick(item); $event.preventDefault()\"\n              role=\"article\"\n              tabindex=\"0\"\n              [attr.aria-label]=\"('notifications_item_from' | translate) + ' ' + item.getCategory()\"\n              #feedItem\n              [attr.data-observe]=\"observeItem(feedItem, item)\"\n            >\n              <!-- Unread indicator -->\n              @if (item.getReadAt() === null) {\n                <div\n                  class=\"cometchat-notification-feed__unread-indicator\"\n                  [style.background]=\"style?.unreadIndicatorColor\"\n                ></div>\n              }\n\n              <!-- Item meta -->\n              <div class=\"cometchat-notification-feed__item-meta\">\n                <span class=\"cometchat-notification-feed__item-category\">\n                  {{ item.getCategory() }}\n                </span>\n                <span class=\"cometchat-notification-feed__item-time\">\n                  <cometchat-date\n                    [timestamp]=\"item.getSentAt()\"\n                    [calendarObject]=\"{ today: 'hh:mm A', yesterday: 'YESTERDAY', otherDays: 'DD/MM/YYYY' }\"\n                  ></cometchat-date>\n                </span>\n              </div>\n\n              <!-- Card container -->\n              <div\n                class=\"cometchat-notification-feed__card-container\"\n                [style.backgroundColor]=\"style?.cardBackgroundColor\"\n                [style.borderColor]=\"style?.cardBorderColor\"\n                [style.borderRadius]=\"style?.cardBorderRadius\"\n                [style.borderWidth]=\"style?.cardBorderWidth\"\n                [style.borderStyle]=\"style?.cardBorderWidth ? 'solid' : undefined\"\n              >\n                <cometchat-card-view\n                  [cardJson]=\"item | cardJson\"\n                  [themeMode]=\"cardThemeMode\"\n                  [themeOverride]=\"cardThemeOverride\"\n                  (action)=\"onCardAction(item, $event)\"\n                ></cometchat-card-view>\n              </div>\n            </div>\n          }\n        }\n\n        <!-- Loading More -->\n        @if (state().isLoadingMore) {\n          <div class=\"cometchat-notification-feed__loading-more\" aria-busy=\"true\">\n            <div class=\"cometchat-notification-feed__loading-more-spinner\"></div>\n            <span class=\"cometchat-notification-feed__loading-more-text\">{{ 'loading' | translate }}</span>\n          </div>\n        }\n\n        <!-- Pagination Error -->\n        @if (state().paginationError && !state().isLoadingMore) {\n          <div\n            class=\"cometchat-notification-feed__pagination-error\"\n            (click)=\"onRetryPagination()\"\n            (keydown.enter)=\"onRetryPagination()\"\n            (keydown.space)=\"onRetryPagination(); $event.preventDefault()\"\n            role=\"button\"\n            tabindex=\"0\"\n            [attr.aria-label]=\"'notifications_tap_to_retry' | translate\"\n          >\n            <div class=\"cometchat-notification-feed__pagination-error-icon\"></div>\n            <div class=\"cometchat-notification-feed__pagination-error-text\">\n              <p class=\"cometchat-notification-feed__pagination-error-message\">{{ 'notifications_pagination_error' | translate }}</p>\n              <p class=\"cometchat-notification-feed__pagination-error-retry\">{{ 'notifications_tap_to_retry' | translate }}</p>\n            </div>\n          </div>\n        }\n      </div>\n    }\n  </div>\n</div>\n","/**\n * Public API for CometChatNotificationFeed component\n */\n\n// Component\nexport { CometChatNotificationFeedComponent } from './cometchat-notification-feed.component';\n\n// ViewModel\nexport { NotificationFeedViewModel } from './cometchat-notification-feed-view-model';\n\n// Types\nexport type {\n  NotificationFeedItem,\n  NotificationCategory,\n  NotificationFeedState,\n  TimestampGroup,\n  CardAction,\n  CometChatNotificationFeedStyle,\n  ScreenState,\n  FeedEngagementType,\n} from './cometchat-notification-feed.types';\n\n// Utilities\nexport { VisibilityTracker, groupByTimestamp } from './cometchat-notification-feed.utils';\n\n// Pipes\nexport { BadgeCountPipe, CardJsonPipe, CategoryUnreadCountPipe } from './cometchat-notification-feed.pipes';\n","import {\n  Component,\n  Input,\n  ChangeDetectionStrategy,\n  OnInit,\n  OnDestroy,\n  signal,\n  computed,\n  inject,\n} from '@angular/core';\nimport { NotificationUnreadCountService } from '../../services/notification-unread-count.service';\nimport { NotificationBadgeStyle } from './cometchat-notification-badge.types';\nimport { TranslatePipe } from '../../resources/CometChatLocalize/translate.pipe';\nimport { Subscription } from 'rxjs';\n\n/**\n * CometChatNotificationBadge — Displays unread notification count.\n * Subscribes to real-time updates and re-syncs on window focus.\n *\n * Usage:\n * ```html\n * <cometchat-notification-badge [max]=\"99\"></cometchat-notification-badge>\n * ```\n */\n@Component({\n  selector: 'cometchat-notification-badge',\n  standalone: true,\n  imports: [TranslatePipe],\n  templateUrl: './cometchat-notification-badge.component.html',\n  styleUrls: ['./cometchat-notification-badge.component.css'],\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CometChatNotificationBadgeComponent implements OnInit, OnDestroy {\n  private unreadCountService = inject(NotificationUnreadCountService);\n\n  /** Filter count by category */\n  @Input() category: string | undefined;\n\n  /** Maximum count to display before showing \"N+\". Default: 99 */\n  @Input() max: number = 99;\n\n  /** Style overrides */\n  @Input() style: NotificationBadgeStyle | undefined;\n\n  /** Internal count signal */\n  count = signal<number>(0);\n\n  private subscription: Subscription | null = null;\n\n  ngOnInit(): void {\n    // Start the unread count service if not already started\n    this.unreadCountService.start({ category: this.category });\n\n    // Subscribe to count updates\n    this.subscription = this.unreadCountService.count$.subscribe((count) => {\n      this.count.set(count);\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.subscription?.unsubscribe();\n    this.unreadCountService.stop();\n  }\n\n  /**\n   * Display text for the badge (computed signal for performance).\n   */\n  readonly displayText = computed(() => {\n    const c = this.count();\n    return c > this.max ? `${this.max}+` : `${c}`;\n  });\n}\n","@if (count() > 0) {\n  <span\n    class=\"cometchat-notification-badge\"\n    [style.backgroundColor]=\"style?.backgroundColor\"\n    [style.color]=\"style?.textColor\"\n    [style.fontSize]=\"style?.fontSize\"\n    [style.borderRadius]=\"style?.borderRadius\"\n    [attr.aria-label]=\"displayText() + ' ' + ('notifications_unread_badge' | translate)\"\n    role=\"status\"\n  >\n    {{ displayText() }}\n  </span>\n}\n","/**\n * Public API for CometChatNotificationBadge component\n */\n\n// Component\nexport { CometChatNotificationBadgeComponent } from './cometchat-notification-badge.component';\n\n// Types\nexport type { NotificationBadgeStyle } from './cometchat-notification-badge.types';\n","/**\n * Public API for CometChat UIKit components\n */\n\n// Error Boundary\nexport * from './base-elements/cometchat-error-boundary';\n\n// Base Components\nexport * from './base-elements/cometchat-action-sheet';\nexport * from './base-elements/cometchat-avatar';\nexport * from './base-elements/cometchat-button';\nexport * from './base-elements/cometchat-confirm-dialog';\nexport * from './base-elements/cometchat-link-dialog';\nexport * from './base-elements/cometchat-link-popover';\nexport * from './base-elements/cometchat-context-menu';\nexport * from './cometchat-conversation-item';\nexport * from './cometchat-create-poll';\nexport * from './cometchat-conversations';\nexport * from './base-elements/cometchat-date';\nexport * from './base-elements/cometchat-emoji-keyboard';\nexport * from './base-elements/cometchat-fullscreen-viewer';\nexport * from './base-elements/cometchat-list-item';\nexport * from './cometchat-stickers-keyboard';\nexport * from './cometchat-message-composer';\nexport * from './cometchat-message-header';\nexport * from './base-elements/cometchat-message-preview';\nexport * from './cometchat-paginated-list';\nexport * from './cometchat-text-bubble';\nexport * from './cometchat-card-bubble';\nexport * from './cometchat-image-bubble';\nexport * from './cometchat-video-bubble';\nexport * from './cometchat-file-bubble';\n// Per-type bubbles for media messages — the message bubble always routes here.\n// See message-bubble getBubbleType().\nexport * from './cometchat-images-bubble';\nexport * from './cometchat-videos-bubble';\nexport * from './cometchat-audios-bubble';\nexport * from './cometchat-voice-note-bubble';\nexport * from './cometchat-files-bubble';\nexport * from './cometchat-users';\nexport * from './cometchat-groups';\nexport * from './cometchat-group-members';\nexport * from './cometchat-group-member-item';\nexport * from './cometchat-user-item';\nexport * from './cometchat-group-item';\nexport * from './cometchat-action-bubble';\nexport * from './cometchat-collaborative-document-bubble';\nexport * from './cometchat-collaborative-whiteboard-bubble';\nexport * from './cometchat-audio-bubble';\nexport * from './cometchat-call-bubble';\nexport * from './cometchat-delete-bubble';\nexport * from './cometchat-poll-bubble';\nexport * from './cometchat-sticker-bubble';\nexport * from './cometchat-message-bubble';\nexport * from './cometchat-message-list';\nexport * from './base-elements/cometchat-thread-view';\nexport * from './cometchat-thread-header';\nexport * from './base-elements/cometchat-typing-indicator';\nexport * from './base-elements/cometchat-smart-replies';\nexport * from './base-elements/cometchat-conversation-starter';\nexport * from './cometchat-reactions';\nexport * from './cometchat-reaction-info';\nexport * from './cometchat-reaction-list';\nexport * from './cometchat-message-information';\nexport * from './base-elements/cometchat-flag-message-dialog';\n\n// Base Elements\nexport * from './base-elements/cometchat-checkbox';\nexport * from './base-elements/cometchat-radio-button';\nexport * from './base-elements/cometchat-dropdown';\nexport * from './base-elements/cometchat-search-bar';\nexport * from './base-elements/cometchat-toast';\nexport * from './base-elements/cometchat-popover';\nexport * from './base-elements/cometchat-media-recorder';\nexport * from './base-elements/cometchat-change-scope';\nexport * from './cometchat-incoming-call';\nexport * from './cometchat-outgoing-call';\nexport * from './cometchat-call-buttons';\n\nexport * from './cometchat-ongoing-call';\nexport * from './cometchat-call-logs';\n\n// AI Features\nexport * from './base-elements/cometchat-conversation-summary';\nexport * from './cometchat-markdown-renderer/cometchat-markdown-parser';\nexport * from './cometchat-markdown-renderer/cometchat-markdown-renderer.component';\nexport * from './cometchat-ai-assistant-message-bubble';\nexport * from './cometchat-stream-message-bubble';\nexport * from './cometchat-toolcall-argument-bubble';\nexport * from './cometchat-toolcall-result-bubble';\nexport * from './cometchat-ai-assistant-chat-history';\nexport * from './cometchat-ai-assistant-chat';\n\n// Search\nexport * from './cometchat-search';\n\n\n// Notification Feed\nexport * from './cometchat-notification-feed';\nexport * from './cometchat-notification-badge';\n","/*\n * Public API Surface of cometchat-uikit\n */\n\nexport * from './lib/cometchat-uikit';\nexport * from './lib/UIKitSettings';\nexport * from './lib/constants';\n\n// Localization\nexport * from './lib/resources/CometChatLocalize';\n\n// Modals/Interfaces\nexport * from './lib/modals';\n\n// Interfaces (ConversationSlots, etc.)\nexport * from './lib/interfaces';\n\n// Enums (includes Placement)\nexport * from './lib/Enums/Enums';\nexport { CometChatUIKitCalls } from './lib/CometChatCalls';\n// Services\nexport * from './lib/services';\n\n// Events\nexport { CometChatConversationEvents } from './lib/events/CometChatConversationEvents';\n\nexport { CometChatMessageEvents } from './lib/events/CometChatMessageEvents';\nexport type { IMessages, ICardActionEvent } from './lib/events/CometChatMessageEvents';\nexport { CometChatCallEvents } from './lib/events/CometChatCallEvents';\nexport { CometChatGroupEvents } from './lib/events/CometChatGroupEvents';\nexport type {\n  IGroupMemberJoined,\n  IGroupLeft,\n  IGroupMemberAdded,\n  IGroupMemberScopeChanged,\n  IGroupMemberKickedBanned,\n  IGroupMemberUnBanned,\n  IOwnershipChanged,\n} from './lib/events/CometChatGroupEvents';\nexport { CometChatUserEvents } from './lib/events/CometChatUserEvents';\nexport { CometChatUIEvents } from './lib/events/CometChatUIEvents';\nexport type {\n  IActiveChatChanged,\n  IOpenChat,\n  IPanel,\n  IModal,\n  IDialog,\n  IShowOngoingCall,\n  IMouseEvent,\n  IMentionsCountWarning,\n} from './lib/events/CometChatUIEvents';\n\n// Components\nexport * from './lib/components';\n\n// Text Formatters\nexport * from './lib/formatters';\n\n// Logger\nexport { CometChatLogger, LogLevel } from './lib/utils/CometChatLogger';\n\n// Effect utility — Angular 18–21 compatible signal-write-safe effect wrapper\nexport { safeEffect } from './lib/utils/safe-effect';\nexport type { SafeEffectOptions } from './lib/utils/safe-effect';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["formatDateHelper","setupMessageListener","setupGroupListener","setupCallListener","isRecoverableError","getUserFriendlyErrorMessage","toCometchatException","delay","isMediaMessage","escapeHtml","handlePasteImpl","handleDropImpl","markdownToHtmlUtil","isMentionNodeUtil","findMentionAncestorUtil","moveCursorToMentionBoundaryUtil","getMentionsInRangeUtil","doesRangeIntersectNodeUtil","extendSelectionToIncludeMentionsUtil","htmlToMarkdownUtil","markInitialMessagesAsReadImpl","translateMessageImpl","delayUtil","setupMsgListener","setupGrpListener","setupCallLstnr","setupConnListener","getFocusableElements","EventEmitter","i1.FormatterConfigService","i2.HtmlSanitizerService","debounceTime","i1","formatFileSize","renderNode","getFileType","handleKeydownImpl","announceMessageSentImpl","ngOnInitImpl","ngOnChangesImpl","composerNgOnInitImpl","composerNgOnChangesImpl","getFileTypeUtil","getFileTypeLabelUtil","getPluralFileTypeUtil","i2.FormatterConfigService","i3.HtmlSanitizerService","MISSED_CALL_STATUSES","MAX_PREVIEW_LENGTH","getMessagePreview","isSentByMe","highlightAndScrollToElementUtil","isMessageForCurrentConversationUtil","getMessagePreviewUtil","isMediaMessageUtil","getLatestReceiverMessageUtil","isReceiverMessageUtil","isSenderMessageUtil","getConversationIdUtil","getConversationTypeUtil","filter"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAGrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAGrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBAIA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBAGrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC,KAAK;uBAAC,EAAE,SAAS,EAAE,gBAAgB,EAAE;;sBACrC;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA;;sBACA,SAAS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"}