{"version":3,"file":"main.DkksTu.js","sources":["theme-14/virtual:theme","theme-14/discourse/components/custom-icon.gjs","theme-14/discourse/components/custom-header-link.gjs","theme-14/discourse/components/custom-header-links.gjs","theme-14/discourse/api-initializers/dropdown-header.gjs","theme-14/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(14);\n\nexport function themePrefix(key) {\n  return `theme_translations.14.${key}`;\n}\n","import Component from \"@ember/component\";\nimport { equal } from \"@ember/object/computed\";\nimport { tagName } from \"@ember-decorators/component\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport dIcon from \"discourse/helpers/d-icon\";\n\n@tagName(\"\")\nexport default class CustomIcon extends Component {\n  @equal(\"sourceType\", \"image_url\") isImageUrl;\n  @equal(\"sourceType\", \"font_awesome\") isFontAwesome;\n\n  get sourceType() {\n    return settings.icon_source;\n  }\n\n  get source() {\n    return this.icon?.trim();\n  }\n\n  <template>\n    {{#if this.source}}\n      <span class={{concatClass \"custom-header-link-icon\" @class}}>\n        {{#if this.isImageUrl}}\n          <img src={{this.source}} />\n        {{else if this.isFontAwesome}}\n          {{dIcon this.source}}\n        {{/if}}\n      </span>\n    {{/if}}\n  </template>\n}\n","import { tracked } from \"@glimmer/tracking\";\nimport Component from \"@ember/component\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { notEmpty } from \"@ember/object/computed\";\nimport { service } from \"@ember/service\";\nimport { and, not } from \"truth-helpers\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport dIcon from \"discourse/helpers/d-icon\";\nimport DiscourseURL from \"discourse/lib/url\";\nimport CustomIcon from \"./custom-icon\";\n\nexport default class CustomHeaderLink extends Component {\n  @service siteSettings;\n  @service site;\n  @service currentUser;\n\n  @tracked dropdownOpen = true;\n\n  @notEmpty(\"dropdownLinks\") hasDropdown;\n\n  get shouldDisplay() {\n    if (!settings.security) {\n      return true;\n    }\n\n    const permissions = JSON.parse(settings.security);\n    const getPermissions = permissions\n      .filter((p) => p.headerLinkId === this.item.id)\n      .map((p) => p.title);\n\n    const currentUserGroups = this.currentUser?.groups.map((g) => g.name);\n\n    if (getPermissions?.length < 1) {\n      return true;\n    }\n\n    if (getPermissions.length < 0) {\n      return false;\n    }\n\n    if (!this.currentUser) {\n      return false;\n    }\n\n    if (currentUserGroups.includes(getPermissions[0])) {\n      return true;\n    }\n\n    return false;\n  }\n\n  get showCaret() {\n    return (\n      settings.show_caret_icons &&\n      this.hasDropdown &&\n      (!this.site.mobileView || !this.item.url)\n    );\n  }\n\n  get dropdownLinks() {\n    const allDropdownItems = settings.dropdown_links\n      ? JSON.parse(settings.dropdown_links)\n      : [];\n\n    const dropdownLinks = allDropdownItems.filter(\n      (d) => d.headerLinkId === this.item.id\n    );\n\n    return dropdownLinks;\n  }\n\n  @action\n  toggleDropdown() {\n    this.dropdownOpen = !this.dropdownOpen;\n  }\n\n  @action\n  redirectToUrl(item, event) {\n    if (this.site.mobileView) {\n      this.toggleHeaderLinks();\n    }\n\n    if (item.newTab) {\n      window.open(item.url, \"_blank\");\n    } else {\n      DiscourseURL.routeTo(item.url);\n    }\n\n    event.stopPropagation();\n  }\n\n  <template>\n    {{#if this.shouldDisplay}}\n      <li\n        class={{concatClass\n          \"custom-header-link\"\n          (if @item.url \"with-url\")\n          (if this.hasDropdown \"has-dropdown\")\n          (if this.dropdownOpen \"is-open\")\n        }}\n        title={{@item.title}}\n        {{(if @item.url (modifier on \"click\" (fn this.redirectToUrl @item)))}}\n        {{(if\n          (and (not @item.url) this.site.mobileView this.hasDropdown)\n          (modifier on \"click\" this.toggleDropdown)\n        )}}\n      >\n        <CustomIcon @icon={{@item.icon}} />\n        <span class=\"custom-header-link-title\">{{@item.title}}</span>\n\n        {{#if this.showCaret}}\n          <span class=\"custom-header-link-caret\">\n            {{dIcon \"caret-down\"}}\n          </span>\n        {{/if}}\n\n        {{#if this.hasDropdown}}\n          <ul class=\"custom-header-dropdown\">\n            {{#each this.dropdownLinks as |dropdownItem|}}\n              <li\n                class=\"custom-header-dropdown-link\"\n                title={{dropdownItem.title}}\n                role=\"button\"\n                {{on \"click\" (fn this.redirectToUrl dropdownItem)}}\n              >\n                <CustomIcon @icon={{dropdownItem.icon}} />\n                <span\n                  class=\"custom-header-link-title\"\n                >{{dropdownItem.title}}</span>\n                {{#if dropdownItem.description}}\n                  <span\n                    class=\"custom-header-link-desc\"\n                  >{{dropdownItem.description}}</span>\n                {{/if}}\n              </li>\n            {{/each}}\n          </ul>\n        {{/if}}\n      </li>\n    {{/if}}\n  </template>\n}\n","import { tracked } from \"@glimmer/tracking\";\nimport Component from \"@ember/component\";\nimport { hash } from \"@ember/helper\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport closeOnClickOutside from \"discourse/modifiers/close-on-click-outside\";\nimport { i18n } from \"discourse-i18n\";\nimport CustomHeaderLink from \"./custom-header-link\";\n\nexport default class CustomHeaderLinks extends Component {\n  @service siteSettings;\n  @service site;\n\n  @tracked showLinks = !this.site.mobileView;\n\n  @action\n  toggleHeaderLinks() {\n    this.showLinks = !this.showLinks;\n\n    if (this.showLinks) {\n      document.body.classList.add(\"dropdown-header-open\");\n    } else {\n      document.body.classList.remove(\"dropdown-header-open\");\n    }\n  }\n\n  get headerLinks() {\n    return JSON.parse(settings.header_links);\n  }\n\n  <template>\n    <nav\n      class={{concatClass\n        \"custom-header-links\"\n        (if @outletArgs.minimized \"scrolling\")\n      }}\n    >\n      {{#if this.site.mobileView}}\n        <span class=\"btn-custom-header-dropdown-mobile\">\n          <DButton\n            @icon=\"square-caret-down\"\n            @title={{i18n \"custom_header.discord\"}}\n            @action={{this.toggleHeaderLinks}}\n          />\n        </span>\n      {{/if}}\n\n      {{#if this.showLinks}}\n        <ul\n          class=\"top-level-links\"\n          {{(if\n            this.site.mobileView\n            (modifier\n              closeOnClickOutside\n              this.toggleHeaderLinks\n              (hash target=this.element)\n            )\n          )}}\n        >\n          {{#each this.headerLinks as |item|}}\n            <CustomHeaderLink\n              @item={{item}}\n              @toggleHeaderLinks={{this.toggleHeaderLinks}}\n            />\n          {{/each}}\n        </ul>\n      {{/if}}\n    </nav>\n  </template>\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport CustomHeaderLinks from \"../components/custom-header-links\";\n\nexport default apiInitializer(\"1.29.0\", (api) => {\n  if (!settings.header_links) {\n    return;\n  }\n\n  if (settings.links_position === \"right\") {\n    api.headerButtons.add(\"dropdown-header\", CustomHeaderLinks, {\n      before: \"auth\",\n    });\n  } else {\n    api.renderAfterWrapperOutlet(\"home-logo\", CustomHeaderLinks);\n  }\n});\n","import * as Mod1 from \"./discourse/api-initializers/dropdown-header\";\nimport * as Mod2 from \"./discourse/components/custom-header-link\";\nimport * as Mod3 from \"./discourse/components/custom-header-links\";\nimport * as Mod4 from \"./discourse/components/custom-icon\";\nconst compatModules = {\n  \"discourse/api-initializers/dropdown-header\": Mod1,\n  \"discourse/components/custom-header-link\": Mod2,\n  \"discourse/components/custom-header-links\": Mod3,\n  \"discourse/components/custom-icon\": Mod4,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","CustomIcon","dt7948","c","Component","g","this","prototype","equal","isImageUrl","i","isFontAwesome","sourceType","icon_source","source","icon","trim","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","concatClass","dIcon","isStrictMode","tagName","CustomHeaderLink","service","siteSettings","site","currentUser","tracked","dropdownOpen","notEmpty","hasDropdown","shouldDisplay","security","getPermissions","JSON","parse","filter","p","headerLinkId","item","map","title","currentUserGroups","groups","name","length","includes","showCaret","show_caret_icons","mobileView","url","dropdownLinks","dropdown_links","d","toggleDropdown","n","action","redirectToUrl","event","toggleHeaderLinks","newTab","window","open","DiscourseURL","routeTo","stopPropagation","on","fn","and","not","CustomHeaderLinks","showLinks","document","body","classList","add","remove","headerLinks","header_links","DButton","i18n","closeOnClickOutside","hash","dropdownHeader","apiInitializer","api","links_position","headerButtons","before","renderAfterWrapperOutlet","compatModules","Mod2","Mod3","Mod4"],"mappings":"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"}