{"version":3,"file":"main.xJumrD.js","sources":["theme-54/virtual:theme","theme-54/discourse/api-initializers/resources-sidebar.js","theme-54/discourse/connectors/below-custom-sidebar-sections/resources-anon.gjs","theme-54/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(54);\n\nexport function themePrefix(key) {\n  return `theme_translations.54.${key}`;\n}\n","import { apiInitializer } from \"discourse/lib/api\";\nimport getURL from \"discourse/lib/get-url\";\nimport { i18n } from \"discourse-i18n\";\n\nconst SECTION_NAME = \"resources\";\n\nfunction isExternalUrl(url) {\n  return /^https?:\\/\\//i.test(url);\n}\n\nfunction shouldRender(currentUser, visibility) {\n  if (visibility === \"logged_in\") {\n    return Boolean(currentUser);\n  }\n  if (visibility === \"staff_only\") {\n    return Boolean(currentUser?.staff);\n  }\n  return true;\n}\n\n// Translate a theme i18n key (e.g. \"resources_sidebar.about\").\n// `themePrefix` is injected globally by the Discourse theme runtime and\n// rewrites the key to the theme-scoped translation path\n// `theme_translations.<id>.js.<key>`. If the translation is missing, fall\n// back to the raw key so an admin who hasn't supplied one still sees\n// something readable instead of \"[missing key]\".\nfunction safeTranslate(key) {\n  if (!key) {\n    return \"\";\n  }\n  // `themePrefix` is injected as a global by the Discourse theme runtime.\n  const scopedKey = themePrefix(`js.${key}`);\n  const translated = i18n(scopedKey);\n  if (!translated || translated.startsWith(\"[\")) {\n    return key;\n  }\n  return translated;\n}\n\nexport default apiInitializer((api) => {\n  const currentUser = api.getCurrentUser();\n  // `settings` is injected as a global by the Discourse theme runtime.\n  const themeSettings = settings;\n\n  const links = themeSettings.resources_links || [];\n  if (!shouldRender(currentUser, themeSettings.resources_visibility)) {\n    return;\n  }\n  if (!Array.isArray(links) || links.length === 0) {\n    return;\n  }\n\n  const titleKey = themeSettings.resources_section_title_key;\n\n  api.addSidebarSection(\n    (BaseCustomSidebarSection, BaseCustomSidebarSectionLink) => {\n      class ResourceLink extends BaseCustomSidebarSectionLink {\n        constructor(link, index) {\n          super();\n          this._link = link;\n          this._index = index;\n        }\n\n        get name() {\n          return `${SECTION_NAME}-${this._index}-${this._link.label_key}`;\n        }\n\n        get title() {\n          return safeTranslate(this._link.label_key);\n        }\n\n        get text() {\n          return this.title;\n        }\n\n        get href() {\n          return isExternalUrl(this._link.url)\n            ? this._link.url\n            : getURL(this._link.url);\n        }\n\n        get prefixType() {\n          return \"icon\";\n        }\n\n        get prefixValue() {\n          return this._link.icon || \"link\";\n        }\n\n        get classNames() {\n          const classes = [\"resources-sidebar__link\"];\n          if (this._link.divider_above) {\n            classes.push(\"resources-sidebar__link--with-divider\");\n          }\n          return classes.join(\" \");\n        }\n      }\n\n      return class extends BaseCustomSidebarSection {\n        get name() {\n          return SECTION_NAME;\n        }\n\n        get title() {\n          return safeTranslate(titleKey);\n        }\n\n        get text() {\n          return this.title;\n        }\n\n        get displaySection() {\n          return links.length > 0;\n        }\n\n        get collapsedByDefault() {\n          return false;\n        }\n\n        get links() {\n          return links.map((link, index) => new ResourceLink(link, index));\n        }\n      };\n    }\n  );\n});\n","import Component from \"@glimmer/component\";\nimport getURL from \"discourse/lib/get-url\";\nimport dIcon from \"discourse/ui-kit/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nconst SECTION_NAME = \"resources\";\n\nfunction isExternalUrl(url) {\n  return /^https?:\\/\\//i.test(url);\n}\n\n// Translate a key scoped to this theme. Falls back to the raw key when the\n// translation is missing so admins always see something usable.\nfunction safeTranslate(key) {\n  if (!key) {\n    return \"\";\n  }\n  const scopedKey = themePrefix(`js.${key}`);\n  const translated = i18n(scopedKey);\n  if (!translated || translated.startsWith(\"[\")) {\n    return key;\n  }\n  return translated;\n}\n\n// Renders the Resources sidebar section for anonymous visitors.\n//\n// Logged-in users get this section via Discourse's `addSidebarSection` API\n// (see api-initializers/resources-sidebar.js). The anonymous sidebar\n// component does not render plugin-registered sections, so we instead plug\n// into the `below-custom-sidebar-sections` outlet and emit the same markup\n// the real sidebar uses.\nexport default class ResourcesAnonSection extends Component {\n  static shouldRender(_args, _ctx, owner) {\n    // Only render for anonymous users — logged-in users get the proper\n    // section from the plugin API path.\n    if (owner.lookup(\"service:current-user\")) {\n      return false;\n    }\n\n    const visibility = settings?.resources_visibility;\n    return visibility === \"everyone\";\n  }\n\n  hrefFor = (link) => (isExternalUrl(link.url) ? link.url : getURL(link.url));\n\n  classFor = (link) => {\n    const classes = [\n      \"sidebar-section-link\",\n      \"sidebar-row\",\n      \"resources-sidebar__link\",\n    ];\n    if (link.divider_above) {\n      classes.push(\"resources-sidebar__link--with-divider\");\n    }\n    return classes.join(\" \");\n  };\n\n  textFor = (link) => safeTranslate(link.label_key);\n\n  iconFor = (link) => link.icon || \"link\";\n\n  get links() {\n    return Array.isArray(settings?.resources_links)\n      ? settings.resources_links\n      : [];\n  }\n\n  get titleText() {\n    return safeTranslate(settings?.resources_section_title_key);\n  }\n\n  <template>\n    {{#if this.links.length}}\n      <div\n        data-section-name={{SECTION_NAME}}\n        class=\"sidebar-section sidebar-section-wrapper sidebar-section--expanded\"\n      >\n        <div class=\"sidebar-section-header-wrapper sidebar-row\">\n          <span\n            class=\"sidebar-section-header sidebar-section-header-collapsable\"\n          >\n            <span class=\"sidebar-section-header-text\">{{this.titleText}}</span>\n          </span>\n        </div>\n\n        <ul class=\"sidebar-section-content\">\n          {{#each this.links as |link index|}}\n            <li\n              data-list-item-name=\"{{SECTION_NAME}}-{{index}}-{{link.label_key}}\"\n              class=\"sidebar-section-link-wrapper\"\n            >\n              <a\n                href={{this.hrefFor link}}\n                title={{this.textFor link}}\n                class={{this.classFor link}}\n              >\n                <span class=\"sidebar-section-link-prefix icon\">\n                  {{dIcon (this.iconFor link)}}\n                </span>\n                <span class=\"sidebar-section-link-content-text\">\n                  {{this.textFor link}}\n                </span>\n              </a>\n            </li>\n          {{/each}}\n        </ul>\n      </div>\n    {{/if}}\n  </template>\n}\n","import * as Mod1 from \"./discourse/api-initializers/resources-sidebar\";\nimport * as Mod2 from \"./discourse/connectors/below-custom-sidebar-sections/resources-anon.gjs\";\nconst compatModules = {\n  \"discourse/api-initializers/resources-sidebar\": Mod1,\n  \"discourse/connectors/below-custom-sidebar-sections/resources-anon\": Mod2,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","SECTION_NAME","safeTranslate","scopedKey","translated","i18n","startsWith","resourcesSidebar","apiInitializer","api","currentUser","getCurrentUser","themeSettings","links","resources_links","visibility","Boolean","staff","shouldRender","resources_visibility","Array","isArray","length","titleKey","resources_section_title_key","addSidebarSection","BaseCustomSidebarSection","BaseCustomSidebarSectionLink","ResourceLink","constructor","link","index","super","this","_link","_index","name","label_key","title","text","href","url","test","getURL","prefixType","prefixValue","icon","classNames","classes","divider_above","push","join","displaySection","collapsedByDefault","map","ResourcesAnonSection","Component","_args","_ctx","owner","lookup","hrefFor","isExternalUrl","classFor","textFor","iconFor","titleText","setComponentTemplate","createTemplateFactory","id","block","moduleName","scope","dIcon","isStrictMode","compatModules","Mod1"],"mappings":"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"}