{"version":3,"file":"main.Ds7bAb.js","sources":["theme-26/virtual:theme","theme-26/discourse/components/ai-bot/ai-bot.gjs","theme-26/discourse/components/avatar-menu/profile.gjs","theme-26/discourse/components/messages/chat-icon.gjs","theme-26/discourse/components/modal/messages-modal.gjs","theme-26/discourse/components/messages/messages-icon.gjs","theme-26/discourse/components/multi-tab/multi-tab-messages.gjs","theme-26/discourse/components/notifications/all-unread.gjs","theme-26/discourse/components/notifications/reviewable.gjs","theme-26/discourse/components/f-nav/f-nav-item.gjs","theme-26/discourse/components/f-nav/f-nav.gjs","theme-26/discourse/components/notifications/new-pm.gjs","theme-26/discourse/initializers/header-avatar-icon.gjs","theme-26/discourse/initializers/init-f-nav.js","theme-26/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(26);\n\nexport function themePrefix(key) {\n  return `theme_translations.26.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { getOwner } from \"@ember/application\";\nimport { on } from \"@ember/modifier\";\nimport getURL from \"discourse/lib/get-url\";\nimport DButton from \"discourse/ui-kit/d-button\";\nimport dIcon from \"discourse-common/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nconst AI_CONVERSATIONS_PANEL = \"ai-conversations\";\n\nexport default class AiBot extends Component {\n  @service appEvents;\n  @service sidebarState;\n\n  get isInConversations() {\n    return this.sidebarState.currentPanel?.key === AI_CONVERSATIONS_PANEL;\n  }\n\n  get manager() {\n    return getOwner(this)?.lookup(\"service:ai-conversations-sidebar-manager\");\n  }\n\n  get title() {\n    return i18n(\n      this.isInConversations\n        ? \"discourse_ai.ai_bot.exit\"\n        : \"discourse_ai.ai_bot.shortcut_title\"\n    );\n  }\n\n  get icon() {\n    return this.isInConversations ? \"shuffle\" : \"far-discobot\";\n  }\n\n  get href() {\n    if (this.isInConversations) {\n      return getURL(this.manager?.lastKnownAppURL || \"/\");\n    }\n\n    return getURL(\"/discourse-ai/ai-bot/conversations\");\n  }\n\n  @action\n  onClick(event) {\n    event.stopPropagation();\n\n    if (!this.isInConversations) {\n      this.appEvents.trigger(\"discourse-ai:bot-header-icon-clicked\");\n    }\n  }\n\n  <template>\n    <DButton\n      @href={{this.href}}\n      @action={{unless this.href this.onClick}}\n      @icon={{this.icon}}\n      title={{this.title}}\n      class=\"ai-bot-button icon btn-flat\"\n    />\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { service } from \"@ember/service\";\nimport { LinkTo } from \"@ember/routing\";\nimport { on } from \"@ember/modifier\";\nimport routeAction from \"discourse/helpers/route-action\";\nimport avatar from \"discourse/helpers/bound-avatar-template\";\nimport DMenu from \"float-kit/components/d-menu\";\nimport DButton from \"discourse/components/d-button\";\nimport discourseLater from \"discourse-common/lib/later\";\nimport DoNotDisturbModal from \"discourse/components/modal/do-not-disturb\";\nimport UserStatusModal from \"discourse/components/modal/user-status\";\nimport UserStatusBubble from \"discourse/components/header/user-dropdown/user-status-bubble\";\nimport formatAge from \"discourse/helpers/format-age\";\nimport dIcon from \"discourse-common/helpers/d-icon\";\nimport emoji from \"discourse/helpers/emoji\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport { ajax } from \"discourse/lib/ajax\";\nimport DoNotDisturb from \"discourse/lib/do-not-disturb\";\nimport { userPath } from \"discourse/lib/url\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class AvatarProfile extends Component {\n  @service currentUser;\n  @service site;\n  @service siteSettings;\n  @service userStatus;\n  @service modal;\n\n  saving = false;\n\n  get shouldRender() {\n    return this.site.mobileView && this.currentUser;\n  }\n\n  get showToggleAnonymousButton() {\n    return (\n      this.currentUser.can_post_anonymously || this.currentUser.is_anonymous\n    );\n  }\n\n  get isInDoNotDisturb() {\n    return !!this.#doNotDisturbUntilDate;\n  }\n\n  get doNotDisturbDateTime() {\n    return this.#doNotDisturbUntilDate.getTime();\n  }\n\n  get showDoNotDisturbEndDate() {\n    return !DoNotDisturb.isEternal(\n      this.currentUser.get(\"do_not_disturb_until\")\n    );\n  }\n\n  get #doNotDisturbUntilDate() {\n    if (!this.currentUser.get(\"do_not_disturb_until\")) {\n      return;\n    }\n    const date = new Date(this.currentUser.get(\"do_not_disturb_until\"));\n    if (date < new Date()) {\n      return;\n    }\n    return date;\n  }\n\n  get isPresenceHidden() {\n    return this.currentUser.get(\"user_option.hide_presence\");\n  }\n\n  @action\n  doNotDisturbClick() {\n    if (this.saving) {\n      return;\n    }\n    this.saving = true;\n    if (this.currentUser.do_not_disturb_until) {\n      return this.currentUser.leaveDoNotDisturb().finally(() => {\n        this.saving = false;\n      });\n    } else {      \n      this.dMenu.close();\n\n      // Set delay to ensure modal is opening correctly\n      discourseLater(() => {\n        this.modal.show(DoNotDisturbModal);\n        this.saving = false;\n      }, 100);\n    }\n  }\n\n  @action\n  togglePresence() {\n    this.currentUser.set(\"user_option.hide_presence\", !this.isPresenceHidden);\n    this.currentUser.save([\"hide_presence\"]);\n  }\n\n  @action\n  setUserStatusClick() {\n    this.dMenu.close();\n    \n    // Set delay to ensure modal is opening correctly\n    discourseLater(() => {\n      this.modal.show(UserStatusModal, {\n        model: {\n          status: this.currentUser.status,\n          pauseNotifications: this.currentUser.isInDoNotDisturb(),\n          saveAction: (status, pauseNotifications) =>\n            this.userStatus.set(status, pauseNotifications),\n          deleteAction: () => this.userStatus.clear(),\n        },\n      });\n    }, 100);\n  }\n\n  @action\n  async toggleAnonymous() {\n    await ajax(userPath(\"toggle-anon\"), { type: \"POST\" });\n    window.location.reload();\n  }\n\n  @action\n  onRegisterApi(api) {\n    this.dMenu = api;\n  }\n\n  <template>\n    {{#if this.shouldRender}}\n      <li id=\"current-user\" class=\"header-dropdown-toggle current-user user-menu-panel\">\n        <DMenu\n          @identifier=\"avatar-profile\"\n          class=\"icon btn-flat\"\n          @modalForMobile={{true}}\n          @onRegisterApi={{this.onRegisterApi}}\n        >\n          <:trigger>\n            {{avatar this.currentUser.avatar_template \"medium\"}}\n            {{#if this.currentUser.status}}\n              <UserStatusBubble\n                @timezone={{this.this.currentUser.user_option.timezone}}\n                @status={{this.currentUser.status}}\n              />\n            {{/if}}\n          </:trigger>\n          <:content as |args|>\n            <ul class=\"user-menu-items\">\n              {{#if this.siteSettings.enable_user_status}}\n                <li {{on \"click\" args.close}} class=\"set-user-status\">\n                  <DButton\n                    @action={{this.setUserStatusClick}}\n                    class=\"btn-flat profile-tab-btn\"\n                  >\n                    {{#if this.currentUser.status}}\n                      {{emoji this.currentUser.status.emoji}}\n                      <span class=\"item-label\">\n                        {{this.currentUser.status.description}}\n                        {{#if this.currentUser.status.ends_at}}\n                          {{formatAge this.currentUser.status.ends_at}}\n                        {{/if}}\n                      </span>\n                    {{else}}\n                      {{dIcon \"circle-plus\"}}\n                      <span class=\"item-label\">\n                        {{i18n \"user_status.set_custom_status\"}}\n                      </span>\n                    {{/if}}\n                  </DButton>\n                </li>\n              {{/if}}\n            \n              <li\n                class={{concatClass\n                  \"presence-toggle\"\n                  (unless this.isPresenceHidden \"enabled\")\n                }}\n                title={{i18n \"presence_toggle.title\"}}\n              >\n                <DButton @action={{this.togglePresence}} class=\"btn-flat profile-tab-btn\">\n                  {{dIcon (if this.isPresenceHidden \"toggle-off\" \"toggle-on\")}}\n                  <span class=\"item-label\">\n                    {{#if this.isPresenceHidden}}\n                      {{i18n \"presence_toggle.offline\"}}\n                    {{else}}\n                      {{i18n \"presence_toggle.online\"}}\n                    {{/if}}\n                  </span>\n                </DButton>\n              </li>\n            \n              <li\n                class={{concatClass \"do-not-disturb\" (if this.isInDoNotDisturb \"enabled\")}}\n              >\n                <DButton\n                  @action={{this.doNotDisturbClick}}\n                  class=\"btn-flat profile-tab-btn\"\n                >\n                  {{dIcon (if this.isInDoNotDisturb \"toggle-on\" \"toggle-off\")}}\n                  <span class=\"item-label\">\n                    {{#if this.isInDoNotDisturb}}\n                      <span>{{i18n \"pause_notifications.label\"}}</span>\n                      {{#if this.showDoNotDisturbEndDate}}\n                        {{formatAge this.doNotDisturbDateTime}}\n                      {{/if}}\n                    {{else}}\n                      {{i18n \"pause_notifications.label\"}}\n                    {{/if}}\n                  </span>\n                </DButton>\n              </li>\n            \n              <hr />\n            \n              <li {{on \"click\" args.close}} class=\"summary\">\n                <LinkTo @route=\"user.summary\" @model={{this.currentUser}}>\n                  {{dIcon \"user\"}}\n                  <span class=\"item-label\">\n                    {{i18n \"user.summary.title\"}}\n                  </span>\n                </LinkTo>\n              </li>\n            \n              <li {{on \"click\" args.close}} class=\"activity\">\n                <LinkTo @route=\"userActivity\" @model={{this.currentUser}}>\n                  {{dIcon \"bars-staggered\"}}\n                  <span class=\"item-label\">\n                    {{i18n \"user.activity_stream\"}}\n                  </span>\n                </LinkTo>\n              </li>\n            \n              {{#if this.currentUser.can_invite_to_forum}}\n                <li {{on \"click\" args.close}} class=\"invites\">\n                  <LinkTo @route=\"userInvited\" @model={{this.currentUser}}>\n                    {{dIcon \"user-plus\"}}\n                    <span class=\"item-label\">\n                      {{i18n \"user.invited.title\"}}\n                    </span>\n                  </LinkTo>\n                </li>\n              {{/if}}\n            \n              <li {{on \"click\" args.close}} class=\"drafts\">\n                <LinkTo @route=\"userActivity.drafts\" @model={{this.currentUser}}>\n                  {{dIcon \"user_menu.drafts\"}}\n                  <span class=\"item-label\">\n                    {{#if this.currentUser.draft_count}}\n                      {{i18n \"drafts.label_with_count\" count=this.currentUser.draft_count}}\n                    {{else}}\n                      {{i18n \"drafts.label\"}}\n                    {{/if}}\n                  </span>\n                </LinkTo>\n              </li>\n            \n              <li {{on \"click\" args.close}} class=\"preferences\">\n                <LinkTo @route=\"preferences\" @model={{this.currentUser}}>\n                  {{dIcon \"gear\"}}\n                  <span class=\"item-label\">\n                    {{i18n \"user.preferences.title\"}}\n                  </span>\n                </LinkTo>\n              </li>\n            \n              {{#if this.showToggleAnonymousButton}}\n                <li\n                  {{on \"click\" args.close}}\n                  class={{if\n                    this.currentUser.is_anonymous\n                    \"disable-anonymous\"\n                    \"enable-anonymous\"\n                  }}\n                >\n                  <DButton\n                    @action={{this.toggleAnonymous}}\n                    class=\"btn-flat profile-tab-btn\"\n                  >\n                    {{#if this.currentUser.is_anonymous}}\n                      {{dIcon \"ban\"}}\n                      <span class=\"item-label\">\n                        {{i18n \"switch_from_anon\"}}\n                      </span>\n                    {{else}}\n                      {{dIcon \"user-secret\"}}\n                      <span class=\"item-label\">\n                        {{i18n \"switch_to_anon\"}}\n                      </span>\n                    {{/if}}\n                  </DButton>\n                </li>\n              {{/if}}\n\n              {{#each settings.profile_extra_items as |item|}}\n                <li {{on \"click\" args.close}} class=\"custom-extra-item\">\n                  <a\n                    title={{item.label}}\n                    href={{item.url}}\n                  >\n                    {{#if item.icon}}\n                      {{dIcon item.icon}}\n                    {{/if}}\n                    <span class=\"item-label\">\n                      {{item.label}}\n                    </span>\n                  </a>\n                </li>\n              {{/each}}\n\n              <hr />\n        \n              <li class=\"logout\">\n                <DButton @action={{routeAction \"logout\"}} class=\"btn-flat profile-tab-btn\">\n                  {{dIcon \"right-from-bracket\"}}\n                  <span class=\"item-label\">\n                    {{i18n \"user.log_out\"}}\n                  </span>\n                </DButton>\n              </li>\n            </ul>\n          </:content>\n        </DMenu>\n      </li>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport icon from \"discourse-common/helpers/d-icon\";\nimport getURL from \"discourse-common/lib/get-url\";\nimport { optionalRequire } from \"discourse/lib/utilities\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class ChatIcon extends Component {\n  @service currentUser;\n  @service site;\n  @service chatStateManager;\n\n  get showUnreadIndicator() {\n    return !this.currentUserInDnD;\n  }\n\n  get ChatHeaderIconUnreadIndicator() {\n    return optionalRequire(\n      \"discourse/plugins/chat/discourse/components/chat/header/icon/unread-indicator\"\n    );\n  }\n\n  get currentUserInDnD() {\n    return this.args.currentUserInDnD || this.currentUser.isInDoNotDisturb();\n  }\n\n  get title() {\n    return i18n(\"chat.title_capitalized\");\n  }\n\n  get icon() {\n    return \"d-chat\";\n  }\n\n  get href() {\n    return getURL(this.chatStateManager.lastKnownChatURL || \"/chat\");\n  }\n\n  <template>\n    <DButton\n      @href={{this.href}}\n      tabindex=\"0\"\n      class=\"icon chat-icon btn-flat\"\n      title={{this.title}}\n    >\n      {{~icon this.icon~}}\n      {{#if this.showUnreadIndicator}}\n        <this.ChatHeaderIconUnreadIndicator\n          @urgentCount={{@urgentCount}}\n          @unreadCount={{@unreadCount}}\n          @indicatorPreference={{@indicatorPreference}}\n        />\n      {{/if}}\n    </DButton>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked, cached } from \"@glimmer/tracking\";\nimport { service } from \"@ember/service\";\nimport { action } from \"@ember/object\";\nimport { on } from \"@ember/modifier\";\nimport { htmlSafe } from \"@ember/template\";\nimport replaceEmoji from \"discourse/helpers/replace-emoji\";\nimport dirSpan from \"discourse/helpers/dir-span\";\nimport formatDate from \"discourse/helpers/format-date\";\nimport { ajax } from \"discourse/lib/ajax\";\nimport { fn, concat } from \"@ember/helper\";\nimport { and, or, eq } from \"truth-helpers\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport { renderAvatar } from \"discourse/helpers/user-avatar\";\nimport loadingSpinner from \"discourse/helpers/loading-spinner\";\nimport Composer from \"discourse/models/composer\";\nimport dIcon from \"discourse-common/helpers/d-icon\";\nimport DModal from \"discourse/components/d-modal\";\nimport DButton from \"discourse/components/d-button\";\nimport getURL from \"discourse-common/lib/get-url\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class MessageModal extends Component {\n  @service currentUser;\n  @service site;\n  @service composer;\n  @service modal;\n\n  @tracked inboxes = null;\n  @tracked loading = true;\n  @tracked selectedTabIndex = 0;\n\n  constructor() {\n    super(...arguments);\n    this.fetchAllInboxes();\n  }\n\n  async fetchAllInboxes() {\n    if (this.inboxes) {\n      return this.inboxes; // Cache\n    }\n\n    const currentUser = this.currentUser;\n\n    try {\n      const data = await ajax(\"/u/\" + currentUser.username + \"/messages.json\");\n\n      const personalRequests = [\n        \"/topics/private-messages/\" + currentUser.username + \".json\",\n        \"/topics/private-messages-sent/\" + currentUser.username + \".json\",\n        \"/topics/private-messages-new/\" + currentUser.username + \".json\",\n        \"/topics/private-messages-unread/\" + currentUser.username + \".json\",\n      ];\n\n      const personalData = await Promise.all(\n        personalRequests.map(async (url, index) => {\n          const messages = await ajax(url);\n          const fullName = [\n            i18n(\"user.messages.latest\"),\n            i18n(\"user.messages.sent\"),\n            i18n(\"user.messages.new\"),\n            i18n(\"user.messages.unread\")\n          ][index];\n          return {\n            full_name: fullName,\n            ...messages,\n          };\n        })\n      );\n\n      const groupInboxes = await Promise.all(\n        data.user.groups\n          .filter((inbox) => inbox.has_messages)\n          .map(async (inbox) => {\n            const messages = await ajax(\n              \"/topics/private-messages-group/\" +\n                currentUser.username +\n                \"/\" +\n                inbox.name +\n                \".json\"\n            );\n            return { ...inbox, ...messages };\n          })\n      );\n\n      const inboxes = groupInboxes.concat(\n        personalData.map((messages) => ({\n          full_name: messages.full_name,\n          ...messages,\n        }))\n      );\n\n      inboxes.forEach((inbox) => {\n        inbox.unread_total = inbox.topic_list?.topics?.reduce((total, topic) => {\n          if (!topic) return total;\n\n          const unread =\n            (Number.isInteger(topic.unread_posts) && topic.unread_posts > 0) ||\n            (Number.isInteger(topic.unread_posts) && topic.unseen === true) ||\n            (Number.isInteger(topic.unread_posts) && topic.last_read_post_number === null);\n\n          if (unread) {\n            total++;\n            topic.unread = 1;\n          } else {\n            topic.unread = 0;\n          }\n\n          topic.posters.forEach((poster) => {\n            const matchingUser = inbox.users.find((user) => user.id === poster.user_id);\n            if (matchingUser) {\n              Object.assign(poster, matchingUser);\n            }\n          });\n\n          topic.participants.forEach((participant) => {\n            const matchingUser = inbox.users.find((user) => user.id === participant.user_id);\n            if (matchingUser) {\n              Object.assign(participant, matchingUser);\n            }\n          });\n\n          topic.first_poster = topic.posters[0];\n          topic.last_poster = topic.posters[topic.posters.length - 1];\n          topic.first_participant = topic.participants[0];\n          topic.less_count = topic.allowed_user_count < 3;\n          topic.more_count = topic.allowed_user_count - 2;\n          topic.no_replies = topic.participants.length === 1 && topic.posters.length === 1;\n          topic.valid_reply_count = topic.posts_count - 1;\n          topic.first_last_poster = topic.first_poster === topic.last_poster;\n          topic.has_one_poster = topic.posters.length === 1;\n\n          return total;\n        }, 0);\n      });\n\n      this.inboxes = inboxes;\n      this.loading = false;\n    } catch (error) {\n      console.error(\"Error fetching inbox data:\", error);\n    }\n  }\n\n  @cached\n  get allUnread() {\n    return this.inboxes.reduce((total, inbox) => total + (inbox.unread_total || 0), 0);\n  }\n\n  get canSendPm() {\n    return this.currentUser.can_send_private_messages;\n  }\n\n  @action\n  selectTab(index) {\n    this.selectedTabIndex = index;\n  }\n\n  @action\n  newMessage() {\n    this.composer.open({\n      action: Composer.PRIVATE_MESSAGE,\n      draftKey: Composer.NEW_PRIVATE_MESSAGE_KEY,\n      archetypeId: \"private_message\",\n    });\n    this.modal.close();\n  }\n\n  <template>\n    <DModal \n      @closeModal={{@closeModal}}\n      @title={{i18n \"js.user.private_messages\"}}\n      class=\"message-modal\"\n    >\n      <:body>\n        <div class=\"message-panel\">\n          <ul class=\"message-panel__inboxes nav-pills\">\n            {{#each this.inboxes as |inbox index|}}\n              <li class=\"message-panel__inbox\">\n                <a\n                  {{on \"click\" (fn this.selectTab index)}}\n                  class={{concatClass\n                    \"inbox-item\"\n                    (if (eq index this.selectedTabIndex) \"active\")\n                  }}\n                >\n                  {{if inbox.full_name inbox.full_name inbox.name}}\n                  {{#unless (eq inbox.unread_total 0)}}\n                    ({{inbox.unread_total}})\n                  {{/unless}}\n                </a>\n              </li>\n            {{/each}}\n          </ul>\n          \n          {{#if this.loading}}\n            {{loadingSpinner}}\n          {{else}}\n            {{#each this.inboxes as |inbox index|}}\n              <ul\n                class={{concatClass\n                  \"message-panel__messages\"\n                  (if (eq index this.selectedTabIndex) \"active\")\n                }}\n              >\n                {{#if inbox.topic_list.topics}}\n                  {{#each inbox.topic_list.topics as |message|}}\n                    <li class={{concatClass (unless (eq message.unread 0) \"unread\")}}>\n                      <a\n                        class=\"message-panel__main-link\"\n                        href={{concat\n                          \"/t/\"\n                          message.slug\n                          \"/\"\n                          message.id\n                          \"/\"\n                          message.last_read_post_number\n                        }}\n                      >\n                        <div \n                          class={{concatClass\n                            \"message-panel__info\"\n                            (unless message.has_one_poster \"has-reply\")\n                          }}\n                        >\n                          <span class=\"message-panel__title\">\n                            {{#if (or message.closed message.bookmarked)}}\n                              <div class=\"topic-statuses\">\n                                {{#if message.bookmarked}}\n                                  <span\n                                    title={{i18n \"js.topic_statuses.bookmarked.help\"}}\n                                    class=\"topic-status op-bookmark\"\n                                  >\n                                    {{dIcon \"bookmark\"}}\n                                  </span>\n                                {{/if}}\n                                {{#if message.closed}}\n                                  <span\n                                    title={{i18n \"js.topic_statuses.locked.help\"}}\n                                    class=\"topic-status\"\n                                  >\n                                    {{dIcon \"lock\"}}\n                                  </span>\n                                {{/if}}\n                              </div>\n                            {{/if}}\n                            {{htmlSafe (replaceEmoji message.title)}}\n                            {{#unless (eq message.unread_posts 0)}}\n                              <span class=\"badge-notification unread-notifications\">\n                                {{message.unread_posts}}\n                              </span>\n                            {{/unless}}\n                          </span>\n                          \n                          <span class=\"message-panel__participants\">\n                            {{#unless message.has_one_poster}}\n                              {{#each message.posters as |poster|}}\n                                <a\n                                  href={{concat \"/u/\" poster.username}}\n                                  data-user-card={{poster.username}}\n                                >\n                                  {{htmlSafe\n                                    (renderAvatar\n                                      poster\n                                      avatarTemplatePath=\"avatar_template\"\n                                      title=this.user.username\n                                      usernamePath=\"username\"\n                                      imageSize=\"tiny\"\n                                    )\n                                  }}\n                                </a>\n                              {{/each}}\n                            {{else}}\n                              {{#if \n                                (and message.no_replies\n                                (eq message.first_poster.username message.first_participant.username))\n                              }}\n                                <a\n                                  href={{concat \"/u/\" message.first_poster.username}}\n                                  data-user-card={{message.first_poster.username}}\n                                >\n                                  {{htmlSafe\n                                    (renderAvatar\n                                      message.first_poster\n                                      avatarTemplatePath=\"avatar_template\"\n                                      title=this.user.username\n                                      imageSize=\"tiny\"\n                                    )\n                                  }}\n                                </a>\n                              {{else if (eq message.first_poster.username message.first_participant.username)}}\n                                {{#each message.participants as |participant|}}\n                                  <a\n                                    href={{concat \"/u/\" participant.username}}\n                                    data-user-card={{participant.username}}\n                                  >\n                                    {{htmlSafe\n                                      (renderAvatar\n                                        participant\n                                        avatarTemplatePath=\"avatar_template\"\n                                        title=this.user.username\n                                        imageSize=\"tiny\"\n                                      )\n                                    }}\n                                  </a>\n                                {{/each}}\n                              {{else}}\n                                <a\n                                  href={{concat \"/u/\" message.first_poster.username}}\n                                  data-user-card={{message.first_poster.username}}\n                                >\n                                  {{htmlSafe\n                                    (renderAvatar\n                                      message.first_poster\n                                      avatarTemplatePath=\"avatar_template\"\n                                      title=this.user.username\n                                      imageSize=\"tiny\"\n                                    )\n                                  }}\n                                </a>\n                                {{#each message.participants as |participant|}}\n                                  <a\n                                    href={{concat \"/u/\" participant.username}}\n                                    data-user-card={{participant.username}}\n                                  >\n                                    {{htmlSafe\n                                      (renderAvatar\n                                        participant\n                                        avatarTemplatePath=\"avatar_template\"\n                                        title=this.user.username\n                                        imageSize=\"tiny\"\n                                      )\n                                    }}\n                                  </a>\n                                {{/each}}\n                              {{/if}}\n                            {{/unless}}\n                          </span>\n                          \n                          <span class=\"message-panel__excerpt\">\n                            {{replaceEmoji (dirSpan message.excerpt htmlSafe=\"true\")}}\n                          </span>\n                          \n                          {{#if message.tags}}\n                            <ul class=\"message-panel__tags\">\n                              {{#each message.tags as |tag|}}\n                                <li>{{tag}}</li>\n                              {{/each}}\n                            </ul>\n                          {{/if}}\n                          \n                          {{#if message.image_url}}\n                            <div class=\"message-panel__topic-image\">\n                              <div class=\"topic-image\">\n                                <img src={{message.image_url}} alt=\"\" />\n                              </div>\n                            </div>\n                          {{/if}}\n                          \n                          <div class=\"message-panel__info-bottom\">\n                            <span class=\"message-panel__date\">\n                              {{formatDate message.last_posted_at format=\"tiny\"}}\n                              {{dIcon \"clock\"}}\n                            </span>\n                            <span class=\"message-panel__comment\">\n                              {{message.valid_reply_count}}\n                              {{dIcon \"comment\"}}\n                            </span>\n                            <span class=\"message-panel__reactions\">\n                              {{message.like_count}}\n                              {{dIcon \"heart\"}}\n                            </span>\n                            <span class=\"message-panel__views\">\n                              {{message.views}}\n                              {{dIcon \"eye\"}}\n                            </span>\n                          </div>\n                        </div>\n                      </a>\n                    </li>\n                  {{/each}}\n                {{else}}\n                  <div class=\"empty-state\">\n                    <span class=\"empty-state-title\">\n                      {{i18n \"user.no_messages_title\"}}\n                    </span>\n                    <div class=\"empty-state-body\">\n                      <p>\n                        {{htmlSafe\n                          (i18n\n                            \"user.no_messages_body\"\n                            icon=(dIcon \"envelope\")\n                            aboutUrl=(getURL \"/about\")\n                          )\n                        }}\n                      </p>\n                    </div>\n                  </div>\n                {{/if}}\n              </ul>\n            {{/each}}\n          {{/if}}\n        </div>\n      </:body>\n      <:footer>\n        {{#unless this.loading}}\n          {{#if this.canSendPm}}\n            <DButton\n              @class=\"btn-primary new-pm\"\n              @icon=\"envelope\"\n              @translatedLabel={{i18n \"js.user.new_private_message\"}}\n              @action={{this.newMessage}}\n            />\n          {{/if}}\n          <DButton\n            @class=\"btn-transparent all-messages\"\n            @translatedLabel={{i18n \"js.user.messages.all\"}}\n            @href={{concat \"/u/\" this.currentUser.username_lower \"/messages\"}}\n          >\n            {{dIcon \"angle-right\"}}\n          </DButton>\n        {{/unless}}\n      </:footer>\n    </DModal>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { action } from \"@ember/object\";\nimport DButton from \"discourse/components/d-button\";\nimport { i18n } from \"discourse-i18n\";\nimport MessagesModal from \"../modal/messages-modal\";\n\nexport default class MessagesIcon extends Component {\n  @service currentUser;\n  @service site;\n  @service modal;\n\n  get isInDoNotDisturb() {\n    return this.currentUser.isInDoNotDisturb();\n  }\n\n  @action\n  openMessagesModal() {\n    this.modal.show(MessagesModal);\n  }\n\n  <template>\n    <DButton\n      @icon=\"envelope\"\n      class=\"icon btn-flat message-icon\"\n      @translatedTitle={{i18n \"user.private_messages\"}}\n      @action={{this.openMessagesModal}}\n    >\n      {{#unless this.isInDoNotDisturb}}\n        {{#if this.currentUser.new_personal_messages_notifications_count}}\n          <div class=\"message-unread-indicator -urgent\">\n            {{this.currentUser.new_personal_messages_notifications_count}}\n          </div>\n        {{/if}}\n      {{/unless}}\n    </DButton>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { optionalRequire } from \"discourse/lib/utilities\";\nimport DMenu from \"float-kit/components/d-menu\";\nimport dIcon from \"discourse-common/helpers/d-icon\";\nimport ChatIcon from \"../messages/chat-icon\";\nimport MessagesIcon from \"../messages/messages-icon\";\n\nexport default class MultiTabMessages extends Component {\n  @service site;\n  @service currentUser;\n  @service siteSettings;\n\n  get canUseChat() {\n    return (\n      this.currentUser?.has_chat_enabled && this.siteSettings?.chat_enabled\n    );\n  }\n\n  get ChatHeaderIconUnreadIndicator() {\n    return optionalRequire(\n      \"discourse/plugins/chat/discourse/components/chat/header/icon/unread-indicator\"\n    );\n  }\n\n  get currentUserInDnD() {\n    return this.args.currentUserInDnD || this.currentUser.isInDoNotDisturb();\n  }\n\n  @action\n  onRegisterApi(api) {\n    this.dMenu = api;\n  }\n\n  @action\n  closeMenu() {\n    this.dMenu.close();\n  }\n\n  <template>\n    {{#if this.canUseChat}}\n      <DMenu\n        @arrow={{true}}\n        @identifier=\"multi-tab\"\n        @closeOnScroll={{true}}\n        id=\"multi-tab-messages\"\n        class=\"icon btn-flat\"\n        @modalForMobile={{false}}\n        @onRegisterApi={{this.onRegisterApi}}\n      >\n        <:trigger>\n          {{#unless this.currentUserInDnD}}\n            {{#if this.currentUser.new_personal_messages_notifications_count}}\n              <div class=\"message-unread-indicator -urgent\"></div>\n            {{/if}}\n            <this.ChatHeaderIconUnreadIndicator\n              @urgentCount={{@urgentCount}}\n              @unreadCount={{@unreadCount}}\n              @indicatorPreference={{@indicatorPreference}}\n            />\n          {{/unless}}\n          {{dIcon \"message\"}}\n        </:trigger>\n        <:content>\n          <ul class=\"messages-options\">\n            <li class=\"messages-icon\">\n              <MessagesIcon />\n            </li>\n            <li {{on \"click\" this.closeMenu}} class=\"chat-header-icon\">\n              <ChatIcon />\n            </li>\n          </ul>\n        </:content>\n      </DMenu>\n    {{else}}\n      <MessagesIcon />\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { service } from \"@ember/service\";\nimport { and, eq, not, or } from \"truth-helpers\";\nimport icon from \"discourse-common/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class AllUnread extends Component {\n  @service currentUser;\n\n  get isInDoNotDisturb() {\n    return this.currentUser.isInDoNotDisturb();\n  }\n\n  <template>\n    {{#unless this.isInDoNotDisturb}}\n      {{#if this.currentUser.all_unread_notifications_count}}\n        <a\n          href=\"#\"\n          class=\"badge-notification unread-notifications\"\n          title={{i18n\n            \"notifications.tooltip.regular\"\n            (hash count=this.currentUser.all_unread_notifications_count)\n          }}\n          aria-label={{i18n\n            \"user.notifications\"\n            (hash count=this.currentUser.all_unread_notifications_count)\n          }}\n          tabindex=\"-1\"\n        >\n          {{this.currentUser.all_unread_notifications_count}}\n        </a>\n      {{/if}}\n    {{/unless}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { service } from \"@ember/service\";\nimport { and, eq, not, or } from \"truth-helpers\";\nimport icon from \"discourse-common/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class Reviewable extends Component {\n  @service currentUser;\n\n  get isInDoNotDisturb() {\n    return this.currentUser.isInDoNotDisturb();\n  }\n\n  <template>\n    {{#unless this.isInDoNotDisturb}}\n      {{#if this.currentUser.unseen_reviewable_count}}\n        <a\n          href=\"#\"\n          class=\"badge-notification with-icon new-reviewables\"\n          title={{i18n\n            \"notifications.tooltip.new_reviewable\"\n            (hash count=this.currentUser.unseen_reviewable_count)\n          }}\n          aria-label={{i18n\n            \"notifications.tooltip.new_reviewable\"\n            (hash count=this.currentUser.unseen_reviewable_count)\n          }}\n        >\n          {{icon \"flag\"}}\n        </a>\n      {{/if}}\n    {{/unless}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { getOwner } from \"@ember/application\";\nimport { service } from \"@ember/service\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { and } from \"truth-helpers\";\nimport dIcon from \"discourse-common/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\nimport formatAge from \"discourse/helpers/format-age\";\nimport MultiTabMessages from \"../multi-tab/multi-tab-messages\";\nimport AllUnreadNotifications from \"../notifications/all-unread\";\nimport ReviewableNotifications from \"../notifications/reviewable\";\nimport MessagesIcon from \"../messages/messages-icon\";\nimport ChatIcon from \"../messages/chat-icon\";\nimport AiBot from \"../ai-bot/ai-bot\";\n\nexport default class FNavItem extends Component {\n  @service currentUser;\n\n  get isHome() {\n    return this.args.tab?.function === \"home\";\n  }\n\n  get isHamburger() {\n    return this.args.tab?.function === \"hamburger\";\n  }\n\n  get isMulti() {\n    return this.args.tab?.function === \"multi\";\n  }\n\n  get isMessage() {\n    return this.args.tab?.function === \"message\";\n  }\n\n  get isChat() {\n    return this.args.tab?.function === \"chat\";\n  }\n\n  get isNotification() {\n    return [\"notificationToRoute\", \"notificationMenu\"].includes(this.args.tab?.function);\n  }\n\n  get isSearch() {\n    return this.args.tab?.function === \"search\";\n  }\n\n  get isAiBot() {\n    return this.args.tab?.function === \"aiBot\";\n  }\n\n  get isNotificationToRoute() {\n    return this.args.tab?.function === \"notificationToRoute\";\n  }\n\n  get destination() {\n    if (this.isHome) {\n      return this.args.homeDestination;\n    }\n    if (this.isMulti || this.isMessage) {\n      return this.args.messagesDestination;\n    }\n    if (this.isNotification) {\n      return this.args.notificationsDestination;\n    }\n    if (this.isAiBot) {\n      return this.args.aiBotDestination;\n    }\n    if (this.isSearch) {\n      return this.args.searchDestination;\n    }\n\n    return this.args.tab?.destination;\n  }\n\n  get clickHandler() {\n    if (this.isHome) {\n      return this.args.onHomeClick;\n    }\n    if (this.isHamburger) {\n      return this.args.onHamburgerClick;\n    }\n    if (this.isNotification) {\n      return this.isNotificationToRoute \n        ? this.args.onNotificationClick \n        : this.args.onToggleNotification;\n    }\n    if (this.isSearch) {\n      return this.args.onSearchClick;\n    }\n    if (this.isAiBot) {\n      return () => {};\n    }\n\n    return () => this.args.onNavigate(this.args.tab);\n  }\n\n  get showLabels() {\n    return settings.f_nav_show_labels;\n  }\n\n  get manager() {\n    return getOwner(this)?.lookup(\"service:ai-conversations-sidebar-manager\");\n  }\n\n  get bots() {\n    const availableBots = this.currentUser?.ai_enabled_chat_bots\n      ?.filter((bot) => !bot.is_agent || bot.has_default_llm)\n      .filter(Boolean);\n\n    return availableBots ? availableBots.map((bot) => bot.model_name) : [];\n  }\n\n  get isHidden() {\n    if (this.isAiBot) {\n      return !this.manager || this.bots.length === 0;\n    }\n  \n    return this.isChat && !this.args.canUseChat;\n  }\n\n  <template>\n    {{#unless this.isHidden}}\n      {{! Use <button> instead of a role=\"link\" div so keyboard users get\n          native Enter/Space handling without extra ARIA scaffolding. }}\n      <button\n        type=\"button\"\n        class=\"tab\"\n        data-destination={{this.destination}}\n        {{on \"click\" this.clickHandler}}\n      >\n        {{#if this.isHome}}\n          {{#if @isTopicRoute}}\n            {{dIcon \"angle-left\"}}\n          {{else}}\n            {{#if @topicTrackingState.hasIncoming}}\n              <a href=\"#\" class=\"badge-notification has-incoming\" tabindex=\"-1\"></a>\n            {{/if}}\n            {{dIcon @tab.icon}}\n          {{/if}}\n        {{else if this.isMulti}}\n          <MultiTabMessages />\n        {{else if this.isMessage}}\n          <MessagesIcon />\n        {{else if this.isAiBot}}\n          <AiBot />\n        {{else if this.isChat}}\n          {{#if @canUseChat}}\n            <ChatIcon />\n          {{/if}}\n        {{else if this.isNotification}}\n          {{#if @isInDoNotDisturbBadge}}\n            <div title={{i18n \"notifications.paused\"}}>\n              {{#if @showDoNotDisturbEndDate}}\n                {{formatAge @doNotDisturbDateTime}}\n              {{/if}}\n              {{dIcon \"bell-slash\"}}\n            </div>\n          {{else}}\n            {{#if @currentUser.unseen_reviewable_count}}\n              <ReviewableNotifications />\n            {{else}}\n              <AllUnreadNotifications />\n            {{/if}}\n            {{dIcon @tab.icon}}\n          {{/if}}\n        {{else}}\n          {{dIcon @tab.icon}}\n        {{/if}}\n        {{#if this.showLabels}}\n          <div class=\"tab-label\">\n            {{#if (and this.isHome @isTopicRoute)}}\n              {{i18n \"js.back_button\"}}\n            {{else}}\n              {{@tab.name}}\n            {{/if}}\n          </div>\n        {{/if}}\n      </button>\n    {{/unless}}\n  </template>\n}\n","import Component from \"@ember/component\";\nimport { service } from \"@ember/service\";\nimport { action } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport willDestroy from \"@ember/render-modifiers/modifiers/will-destroy\";\nimport DiscourseURL from \"discourse/lib/url\";\nimport DoNotDisturb from \"discourse/lib/do-not-disturb\";\nimport EmbedMode from \"discourse/lib/embed-mode\";\nimport FNavItem from \"./f-nav-item\";\n\nconst SCROLL_MAX = 30;\nconst HIDDEN_F_NAV_CLASS = \"f-nav-hidden\";\nconst MODAL_OPEN_CLASS = \"modal-open\";\nconst SCROLL_LOCK_CLASS = \"scroll-lock\";\n\nexport default class FNav extends Component {\n  @service router;\n  @service currentUser;\n  @service site;\n  @service siteSettings;\n  @service topicTrackingState;\n\n  tabs = settings.f_nav_tabs;\n\n  // Scroll handling\n  lastScrollTop = 0;\n  scrollTimeout = null;\n\n  @action\n  scrollListener(event) {\n    if (\n      document.documentElement.classList.contains(MODAL_OPEN_CLASS) ||\n      document.documentElement.classList.contains(SCROLL_LOCK_CLASS)\n    ) {\n      return;\n    }\n\n    if (this.scrollTimeout) {\n      return;\n    }\n\n    this.scrollTimeout = requestAnimationFrame(() => {\n      const currentScroll = window.scrollY;\n      const shouldHide = this.lastScrollTop < currentScroll && currentScroll > SCROLL_MAX;\n\n      document.body.classList.toggle(HIDDEN_F_NAV_CLASS, shouldHide);\n      this.lastScrollTop = currentScroll;\n      this.scrollTimeout = null;\n    });\n  }\n\n  @action\n  setupScrollListener() {\n    this.lastScrollTop = window.scrollY;\n    document.addEventListener(\"scroll\", this.scrollListener, { passive: true });\n  }\n\n  @action\n  removeScrollListener() {\n    document.removeEventListener(\"scroll\", this.scrollListener);\n  }\n\n  // Computed properties for visibility and states\n  get shouldShowNav() {\n    return (\n      this.currentUser &&\n      this.site.mobileView &&\n      !EmbedMode.enabled &&\n      this.tabs.length\n    );\n  }\n\n  get canUseChat() {\n    return this.currentUser?.has_chat_enabled && this.siteSettings?.chat_enabled;\n  }\n\n  get isTopicRoute() {\n    return this.router.currentRouteName.startsWith(\"topic.\");\n  }\n\n  // DoNotDisturb related computeds\n  get isInDoNotDisturbBadge() {\n    return this.currentUser.isInDoNotDisturb();\n  }\n\n  get doNotDisturbDateTime() {\n    const date = this.#getDoNotDisturbDate();\n    return date?.getTime();\n  }\n\n  get showDoNotDisturbEndDate() {\n    return !DoNotDisturb.isEternal(this.currentUser.get(\"do_not_disturb_until\"));\n  }\n\n  // Destination computeds\n  get homeDestination() {\n    return \"/\";\n  }\n\n  get messagesDestination() {\n    return `/u/${this.currentUser.username_lower}/messages`;\n  }\n\n  get searchDestination() {\n    return \"/search\";\n  }\n\n  get notificationsDestination() {\n    if (this.currentUser.unseen_reviewable_count) {\n      return \"/review\";\n    }\n    const base = `/u/${this.currentUser.username_lower}/notifications`;\n    return this.currentUser.all_unread_notifications_count \n      ? `${base}?filter=unread` \n      : base;\n  }\n\n  get aiBotDestination() {\n    return \"/discourse-ai/ai-bot/conversations\";\n  }\n\n  // Private methods\n  #getDoNotDisturbDate() {\n    const until = this.currentUser.get(\"do_not_disturb_until\");\n    if (!until) {\n      return null;\n    }\n    \n    const date = new Date(until);\n    return date < new Date() ? null : date;\n  }\n\n  #handleElementClick(elementId) {\n    const element = document.getElementById(elementId);\n    element?.click();\n  }\n\n  // Navigation actions\n  @action\n  homeTabRouteSwitcher() {\n    this.isTopicRoute ? window.history.back() : DiscourseURL.routeTo(\"/\");\n  }\n\n  @action\n  toggleHamburger() {\n    this.#handleElementClick(\"toggle-hamburger-menu\");\n  }\n\n  @action\n  toggleNotification() {\n    this.#handleElementClick(\"toggle-current-user\");\n  }\n\n  @action\n  navigateNotifications() {\n    DiscourseURL.routeTo(this.notificationsDestination);\n  }\n\n  @action\n  toggleSearchMenu() {\n    this.#handleElementClick(\"search-button\");\n  }\n\n  @action\n  navigate(tab) {\n    DiscourseURL.routeTo(tab.destination);\n  }\n\n  <template>\n    {{#if this.shouldShowNav}}\n      <div\n        class=\"f-nav\"\n        {{didInsert this.setupScrollListener}}\n        {{willDestroy this.removeScrollListener}}\n      >\n        {{#each this.tabs as |tab|}}\n          <FNavItem\n            @tab={{tab}}\n            @isTopicRoute={{this.isTopicRoute}}\n            @canUseChat={{this.canUseChat}}\n            @isInDoNotDisturbBadge={{this.isInDoNotDisturbBadge}}\n            @showDoNotDisturbEndDate={{this.showDoNotDisturbEndDate}}\n            @doNotDisturbDateTime={{this.doNotDisturbDateTime}}\n            @currentUser={{this.currentUser}}\n            @topicTrackingState={{this.topicTrackingState}}\n            @homeDestination={{this.homeDestination}}\n            @messagesDestination={{this.messagesDestination}}\n            @searchDestination={{this.searchDestination}}\n            @notificationsDestination={{this.notificationsDestination}}\n            @aiBotDestination={{this.aiBotDestination}}\n            @onHomeClick={{this.homeTabRouteSwitcher}}\n            @onHamburgerClick={{this.toggleHamburger}}\n            @onNotificationClick={{this.navigateNotifications}}\n            @onToggleNotification={{this.toggleNotification}}\n            @onSearchClick={{this.toggleSearchMenu}}\n            @onNavigate={{this.navigate}}\n          />\n        {{/each}}\n      </div>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { hash } from \"@ember/helper\";\nimport { service } from \"@ember/service\";\nimport { and, eq, not, or } from \"truth-helpers\";\nimport icon from \"discourse-common/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class NewPM extends Component {\n  @service currentUser;\n\n  get isInDoNotDisturb() {\n    return this.currentUser.isInDoNotDisturb();\n  }\n\n  <template>\n    {{#unless this.isInDoNotDisturb}}\n      {{#if this.currentUser.new_personal_messages_notifications_count}}\n        <a\n          href=\"#\"\n          class=\"badge-notification with-icon new-pms\"\n          title={{i18n\n            \"notifications.tooltip.new_message_notification\"\n            (hash\n              count=this.currentUser.new_personal_messages_notifications_count\n            )\n          }}\n          aria-label={{i18n\n            \"notifications.tooltip.new_message_notification\"\n            (hash\n              count=this.currentUser.new_personal_messages_notifications_count\n            )\n          }}\n        >\n          {{icon \"envelope\"}}\n        </a>\n      {{/if}}\n    {{/unless}}\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport AvatarProfile from \"../components/avatar-menu/profile\";\n\nexport default apiInitializer(\"1.8.0\", (api) => {\n  api.headerIcons.add(\"avatar\", AvatarProfile, { before: \"user-menu\" });\n});\n","import { apiInitializer } from \"discourse/lib/api\";\nimport FNav from \"../components/f-nav/f-nav\";\n\nfunction highlight(destination) {\n  const tabs = document.querySelectorAll(\".f-nav .tab\");\n  tabs.forEach((tab) => {\n    if (compareURLs(tab.dataset.destination, destination)) {\n      tab.classList.add(\"active\");\n    } else {\n      tab.classList.remove(\"active\");\n    }\n  });\n}\n\nfunction compareURLs(url1, url2) {\n  if (!url1 || !url2) {\n    return false;\n  }\n  // Clean URL parameters and trailing slashes\n  const cleanURL1 = url1.replace(/(\\?|#).*/g, \"\").replace(/\\/$/, \"\");\n  const cleanURL2 = url2.replace(/(\\?|#).*/g, \"\").replace(/\\/$/, \"\");\n  \n  // Exact match check\n  if (cleanURL1 === cleanURL2) {\n    return true;\n  }\n  \n  // Special case for home page\n  if (cleanURL1 === \"/\" || cleanURL1 === \"\") {\n    return cleanURL2 === \"/\" || cleanURL2 === \"\";\n  }\n  \n  // For other pages, check if paths match\n  return cleanURL2.startsWith(cleanURL1 + \"/\") || cleanURL2 === cleanURL1;\n}\n\nfunction resolveMyAlias(url, username) {\n  if (!url) {\n    return \"\";\n  }\n  if (url.startsWith(\"/my/\")) {\n    return url.replace(\"/my/\", `/u/${username}/`);\n  }\n  return url;\n}\n\nfunction updateDataDestinations(username) {\n  const tabs = document.querySelectorAll(\".f-nav .tab\");\n  tabs.forEach((tab) => {\n    const originalDestination = tab.dataset.destination;\n    if (originalDestination?.startsWith(\"/my/\")) {\n      tab.dataset.destination = resolveMyAlias(originalDestination, username);\n    }\n  });\n}\n\nexport default apiInitializer(\"1.8.0\", (api) => {\n  const user = api.getCurrentUser();\n  \n  if (!user) {\n    return;\n  }\n\n  api.onPageChange(() => {\n    const navElement = document.querySelector(\".f-nav\");\n    if (navElement) {\n      updateDataDestinations(user.username_lower);\n    }\n  });\n\n  const tabs = settings.f_nav_tabs;\n  if (tabs.length === 0) {\n    return;\n  }\n\n  // Highlight the corresponding tab when the page changes\n  api.onAppEvent(\"page:changed\", (data) => {\n    const resolvedURL = resolveMyAlias(data.url, user.username_lower);\n    highlight(resolvedURL);\n  });\n\n  tabs.forEach((tab) => {\n    if (tab.destination) {\n      const route = api.container.lookup(`route:${tab.destination}`);\n      if (route) {\n        route.reopen({\n          actions: {\n            didTransition() {\n              const resolvedDestination = resolveMyAlias(tab.destination, user.username_lower);\n              highlight(resolvedDestination);\n              this._super(...arguments);\n              return true;\n            },\n          },\n        });\n      }\n    }\n  });\n\n  // FNav component connector\n  api.renderInOutlet(\"above-footer\", FNav);\n});\n","import * as Mod1 from \"./discourse/components/ai-bot/ai-bot\";\nimport * as Mod2 from \"./discourse/components/avatar-menu/profile\";\nimport * as Mod3 from \"./discourse/components/f-nav/f-nav-item\";\nimport * as Mod4 from \"./discourse/components/f-nav/f-nav\";\nimport * as Mod5 from \"./discourse/components/messages/chat-icon\";\nimport * as Mod6 from \"./discourse/components/messages/messages-icon\";\nimport * as Mod7 from \"./discourse/components/modal/messages-modal\";\nimport * as Mod8 from \"./discourse/components/multi-tab/multi-tab-messages\";\nimport * as Mod9 from \"./discourse/components/notifications/all-unread\";\nimport * as Mod10 from \"./discourse/components/notifications/new-pm\";\nimport * as Mod11 from \"./discourse/components/notifications/reviewable\";\nimport * as Mod12 from \"./discourse/initializers/header-avatar-icon\";\nimport * as Mod13 from \"./discourse/initializers/init-f-nav\";\nconst compatModules = {\n  \"discourse/components/ai-bot/ai-bot\": Mod1,\n  \"discourse/components/avatar-menu/profile\": Mod2,\n  \"discourse/components/f-nav/f-nav-item\": Mod3,\n  \"discourse/components/f-nav/f-nav\": Mod4,\n  \"discourse/components/messages/chat-icon\": Mod5,\n  \"discourse/components/messages/messages-icon\": Mod6,\n  \"discourse/components/modal/messages-modal\": Mod7,\n  \"discourse/components/multi-tab/multi-tab-messages\": Mod8,\n  \"discourse/components/notifications/all-unread\": Mod9,\n  \"discourse/components/notifications/new-pm\": Mod10,\n  \"discourse/components/notifications/reviewable\": Mod11,\n  \"discourse/initializers/header-avatar-icon\": Mod12,\n  \"discourse/initializers/init-f-nav\": Mod13,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","AiBot","Component","dt7948","g","this","prototype","service","appEvents","i","sidebarState","isInConversations","currentPanel","key","manager","getOwner","lookup","title","i18n","icon","href","getURL","lastKnownAppURL","onClick","event","stopPropagation","trigger","n","action","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","DButton","isStrictMode","AvatarProfile","currentUser","site","siteSettings","userStatus","modal","saving","shouldRender","mobileView","showToggleAnonymousButton","can_post_anonymously","is_anonymous","isInDoNotDisturb","doNotDisturbUntilDate","doNotDisturbDateTime","getTime","showDoNotDisturbEndDate","DoNotDisturb","isEternal","get","date","Date","isPresenceHidden","doNotDisturbClick","do_not_disturb_until","leaveDoNotDisturb","finally","dMenu","close","discourseLater","show","DoNotDisturbModal","togglePresence","set","save","setUserStatusClick","UserStatusModal","model","status","pauseNotifications","saveAction","deleteAction","clear","toggleAnonymous","ajax","userPath","type","window","location","reload","onRegisterApi","api","DMenu","avatar","UserStatusBubble","on","emoji","formatAge","dIcon","concatClass","LinkTo","routeAction","ChatIcon","chatStateManager","showUnreadIndicator","currentUserInDnD","ChatHeaderIconUnreadIndicator","optionalRequire","args","lastKnownChatURL","MessageModal","composer","tracked","inboxes","loading","selectedTabIndex","constructor","super","arguments","fetchAllInboxes","data","username","personalRequests","personalData","Promise","all","map","async","url","index","messages","full_name","user","groups","filter","inbox","has_messages","name","concat","forEach","unread_total","topic_list","topics","reduce","total","topic","Number","isInteger","unread_posts","unseen","last_read_post_number","unread","posters","poster","matchingUser","users","find","user_id","Object","assign","participants","participant","first_poster","last_poster","length","first_participant","less_count","allowed_user_count","more_count","no_replies","valid_reply_count","posts_count","first_last_poster","has_one_poster","error","console","allUnread","cached","canSendPm","can_send_private_messages","selectTab","newMessage","open","Composer","PRIVATE_MESSAGE","draftKey","NEW_PRIVATE_MESSAGE_KEY","archetypeId","DModal","eq","fn","loadingSpinner","or","htmlSafe","replaceEmoji","renderAvatar","and","dirSpan","formatDate","MessagesIcon","openMessagesModal","MessagesModal","MultiTabMessages","canUseChat","has_chat_enabled","chat_enabled","closeMenu","AllUnread","hash","Reviewable","FNavItem","isHome","tab","function","isHamburger","isMulti","isMessage","isChat","isNotification","includes","isSearch","isAiBot","isNotificationToRoute","destination","homeDestination","messagesDestination","notificationsDestination","aiBotDestination","searchDestination","clickHandler","onHomeClick","onHamburgerClick","onNotificationClick","onToggleNotification","onSearchClick","onNavigate","showLabels","f_nav_show_labels","bots","availableBots","ai_enabled_chat_bots","bot","is_agent","has_default_llm","Boolean","model_name","isHidden","ReviewableNotifications","AllUnreadNotifications","FNav","router","topicTrackingState","tabs","f_nav_tabs","lastScrollTop","scrollTimeout","scrollListener","document","documentElement","classList","contains","requestAnimationFrame","currentScroll","scrollY","shouldHide","body","toggle","setupScrollListener","addEventListener","passive","removeScrollListener","removeEventListener","shouldShowNav","EmbedMode","enabled","isTopicRoute","currentRouteName","startsWith","isInDoNotDisturbBadge","getDoNotDisturbDate","username_lower","unseen_reviewable_count","base","all_unread_notifications_count","until","handleElementClick","elementId","element","getElementById","click","homeTabRouteSwitcher","history","back","DiscourseURL","routeTo","toggleHamburger","toggleNotification","navigateNotifications","toggleSearchMenu","navigate","didInsert","willDestroy","NewPM","headerAvatarIcon","apiInitializer","headerIcons","add","before","highlight","querySelectorAll","url1","url2","cleanURL1","replace","cleanURL2","compareURLs","dataset","remove","resolveMyAlias","initFNav","getCurrentUser","onPageChange","querySelector","originalDestination","onAppEvent","route","container","reopen","actions","didTransition","_super","renderInOutlet","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12"],"mappings":"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"}