{"version":3,"file":"main.DNSn8_.js","sources":["theme-5/virtual:theme","theme-5/discourse/components/details/footer/previews-actions.gjs","theme-5/discourse/components/details/footer/previews-meta.gjs","theme-5/discourse/components/details/footer/previews-users.gjs","theme-5/discourse/components/details/previews-excerpt.gjs","theme-5/discourse/components/details/previews-footer.gjs","theme-5/discourse/components/modal/tlp-thumbnail-selector.gjs","theme-5/discourse/components/portfolio-button.gjs","theme-5/discourse/components/previews-details.gjs","theme-5/discourse/components/previews-thumbnail.gjs","theme-5/discourse/components/previews-tiles-thumbnail.gjs","theme-5/discourse/components/select-thumbnail.gjs","theme-5/discourse/components/tlp-featured-topic.gjs","theme-5/discourse/lib/featured-carousel-layout.js","theme-5/discourse/components/tlp-featured-topics-carousel.gjs","theme-5/discourse/lib/featured-topics-cache.js","theme-5/discourse/lib/featured-topics-filter.js","theme-5/discourse/components/tlp-featured-topics.gjs","theme-5/discourse/components/tlp-featured-topics-placement.gjs","theme-5/discourse/components/tlp-user-preferences.gjs","theme-5/discourse/lib/gridupdate.js","theme-5/discourse/connectors/before-topic-list-body/layout-refresh.gjs","theme-5/discourse/connectors/discovery-list-container-top/featured-topics-discovery.gjs","theme-5/discourse/connectors/discovery-list-controls-above/featured-topics-discovery.gjs","theme-5/discourse/connectors/edit-topic/select-thumbnail-connector.gjs","theme-5/discourse/connectors/search-results-topic-title-suffix/search-thumbnail.gjs","theme-5/discourse/connectors/user-activity-bottom/portfolio-list.gjs","theme-5/discourse/connectors/user-card-additional-buttons/portfolio-button.gjs","theme-5/discourse/connectors/user-custom-preferences/tlp-user-preferences.gjs","theme-5/discourse/initializers/preview-edits.gjs","theme-5/discourse/previews-route-map.js","theme-5/discourse/routes/user-activity/portfolio.js","theme-5/discourse/services/topic-list-previews.js","theme-5/virtual:entrypoint:main"],"sourcesContent":["import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(5);\n\nexport function themePrefix(key) {\n  return `theme_translations.5.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport ShareTopicModal from \"discourse/components/modal/share-topic\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport { ajax } from \"discourse/lib/ajax\";\nimport { popupAjaxError } from \"discourse/lib/ajax-error\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class PreviewsActionsComponent extends Component {\n  @service siteSettings;\n  @service currentUser;\n  @service modal;\n\n  @tracked\n  canUnlike =\n    this.args.topic.topic_post_can_unlike || !this.args.topic.topic_post_liked;\n  @tracked likeCount = this.args.topic.like_count;\n  @tracked hasLiked = this.args.topic.topic_post_liked;\n  @tracked bookmarked = this.args.topic.topic_post_bookmarked;\n  topicId = this.args.topic.id;\n  postId = this.args.topic.topic_post_id;\n\n  @action\n  shareTopic() {\n    this.modal.show(ShareTopicModal, {\n      model: {\n        category: this.args.topic.category,\n        topic: this.args.topic,\n      },\n    });\n  }\n\n  @action\n  toggleLike() {\n    if (this.hasLiked) {\n      ajax(\"/post_actions/\" + this.postId, {\n        type: \"DELETE\",\n        data: {\n          post_action_type_id: 2,\n        },\n      })\n        .then(() => {\n          this.hasLiked = false;\n          this.likeCount--;\n        })\n        .catch(function (error) {\n          popupAjaxError(error);\n        });\n    } else {\n      ajax(\"/post_actions\", {\n        type: \"POST\",\n        data: {\n          id: this.postId,\n          post_action_type_id: 2,\n        },\n        returnXHR: true,\n      })\n        .then(() => {\n          this.hasLiked = true;\n          this.likeCount++;\n        })\n        .catch(function (error) {\n          popupAjaxError(error);\n        });\n    }\n  }\n\n  @action\n  toggleBookmark() {\n    if (!this.bookmarked) {\n      const data = {\n        reminder_type: null,\n        reminder_at: null,\n        name: null,\n        bookmarkable_id: this.postId,\n        bookmarkable_type: \"Post\",\n      };\n      ajax(\"/bookmarks\", {\n        type: \"POST\",\n        data,\n      })\n        .then(() => {\n          this.bookmarked = true;\n        })\n        .catch((error) => {\n          popupAjaxError(error);\n        });\n    } else {\n      ajax(`/t/${this.topicId}/remove_bookmarks`, {\n        type: \"PUT\",\n      })\n        .then(() => {\n          this.bookmarked = false;\n        })\n        .catch((error) => {\n          popupAjaxError(error);\n        });\n    }\n  }\n\n  get sidecarInstalled() {\n    return this.siteSettings.topic_list_previews_enabled;\n  }\n\n  get showLikeButton() {\n    if (!this.sidecarInstalled) {\n      return false;\n    }\n\n    return (\n      this.args.topic.like_count ||\n      this.args.topic.topic_post_can_like ||\n      !this.currentUser ||\n      settings.topic_list_show_like_on_current_users_posts\n    );\n  }\n\n  get disabledLikeButton() {\n    return (\n      this.args.topic.topic_post_is_current_users ||\n      (this.args.topic.topic_post_liked &&\n        !this.args.topic.topic_post_can_unlike)\n    );\n  }\n\n  get hasLike() {\n    return this.hasLiked ? \"has-liked\" : \"\";\n  }\n\n  get likeDisabled() {\n    let disabled = this.args.topic.topic_post_is_current_users;\n    if (this.hasLiked) {\n      disabled = disabled ? true : !this.canUnlike;\n    }\n    return disabled;\n  }\n\n  get showBookmarkButton() {\n    if (!this.sidecarInstalled) {\n      return false;\n    }\n\n    return this.currentUser;\n  }\n\n  get bookmarkClass() {\n    return this.bookmarked ? \"bookmarked\" : \"\";\n  }\n\n  get bookmarkTitle() {\n    const suffix = this.bookmarked ? \"remove\" : \"not_bookmarked\";\n    return `bookmarks.${suffix}`;\n  }\n\n  <template>\n    <div class=\"topic-actions\">\n      <div class=\"inline\">\n        {{#if this.showLikeButton}}\n          {{#if this.likeCount}}\n            <span class=\"like-count\">{{this.likeCount}}</span>\n          {{/if}}\n          <DButton\n            @action={{this.toggleLike}}\n            class={{concatClass\n              \"list-button btn-transparent topic-like\"\n              this.hasLike\n            }}\n            title={{i18n \"post.controls.like\"}}\n            disabled={{this.likeDisabled}}\n            data-topic_id={{@topic.id}}\n            data-topic_post_id={{@topic_post_id}}\n          >\n            {{icon \"heart\"}}\n          </DButton>\n        {{/if}}\n        <DButton\n          @action={{this.shareTopic}}\n          class=\"list-button btn-transparent topic-share\"\n          title={{i18n \"js.topic.share.help\"}}\n          data-topic_id={{@topic.id}}\n          data-topic_post_id={{@topic_post_id}}\n          @icon=\"link\"\n        />\n        {{#if this.showBookmarkButton}}\n          <DButton\n            @action={{this.toggleBookmark}}\n            class={{concatClass\n              \"list-button btn-transparent topic-bookmark\"\n              this.bookmarkClass\n            }}\n            title={{i18n this.bookmarkTitle}}\n            data-topic_id={{@topic.id}}\n            data-topic_post_id={{@topic_post_id}}\n            @icon=\"bookmark\"\n          />\n        {{/if}}\n      </div>\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { trustHTML } from \"@ember/template\";\nimport coldAgeClass from \"discourse/helpers/cold-age-class\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport icon from \"discourse/helpers/d-icon\";\nimport formatDate from \"discourse/helpers/format-date\";\nimport { number } from \"discourse/lib/formatter\";\n\nexport default class PreviewsMeta extends Component {\n  @service siteSettings;\n\n  get ratio() {\n    const likes = parseFloat(this.args.topic.like_count);\n    const posts = parseFloat(this.args.topic.posts_count);\n\n    if (posts < 10) {\n      return 0;\n    }\n\n    return (likes || 0) / posts;\n  }\n\n  get ratioText() {\n    if (this.ratio > this.siteSettings.topic_post_like_heat_high) {\n      return \"high\";\n    }\n    if (this.ratio > this.siteSettings.topic_post_like_heat_medium) {\n      return \"med\";\n    }\n    if (this.ratio > this.siteSettings.topic_post_like_heat_low) {\n      return \"low\";\n    }\n    return \"\";\n  }\n\n  get likesHeat() {\n    if (this.ratioText?.length) {\n      return `heatmap-${this.ratioText}`;\n    }\n  }\n\n  <template>\n    <div class=\"topic-meta\">\n      <div class=\"container\">\n        <div class=\"top-line\">\n          <div class=\"topic-views {{@topic.viewsHeat}} inline sub\">\n            {{icon \"far-eye\"}}\n            {{number @topic.views numberKey=\"views_long\"}}\n          </div>\n          <div\n            class={{concatClass\n              \"topic-replies num posts-map inline sub\"\n              this.likesHeat\n            }}\n          >\n            <span class=\"middot inline sub\"></span>\n            <a href={{@topic.firstPostUrl}} class=\"badge-posts\">\n              {{icon \"far-comment\"}}\n              {{number @topic.replyCount noTitle=\"true\"}}\n            </a>\n          </div>\n        </div>\n        <div class=\"bottom-line\">\n          <div\n            class={{concatClass\n              \"topic-timing activity num inline sub topic-list-data\"\n              (coldAgeClass @topic.createdAt startDate=@topic.bumpedAt class=\"\")\n            }}\n            title={{trustHTML @topic.bumpedAtTitle}}\n          >\n            <span class=\"middot inline sub\"></span>\n            <a href={{@topic.lastPostUrl}}>\n              {{icon \"far-clock\"}}\n              {{formatDate\n                @topic.bumpedAt\n                format=\"medium-with-ago\"\n                noTitle=\"true\"\n              }}\n            </a>\n          </div>\n        </div>\n      </div>\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport avatar from \"discourse/helpers/avatar\";\n\nexport default class PreviewsUsers extends Component {\n  get abbrieviatedPosters() {\n    let abbreviatedPosters = [];\n    if (this.args.topic.posters.length < 6) {\n      abbreviatedPosters = this.args.topic.posters;\n    } else {\n      this.args.topic.posters[0].count = false;\n      abbreviatedPosters.push(this.args.topic.posters[0]);\n      this.args.topic.posters[1].count = false;\n      abbreviatedPosters.push(this.args.topic.posters[1]);\n      let count = { count: this.args.topic.posters.length - 4 };\n      abbreviatedPosters.push(count);\n      this.args.topic.posters[this.args.topic.posters.length - 2].count = false;\n      abbreviatedPosters.push(\n        this.args.topic.posters[this.args.topic.posters.length - 2]\n      );\n      this.args.topic.posters[this.args.topic.posters.length - 1].count = false;\n      abbreviatedPosters.push(\n        this.args.topic.posters[this.args.topic.posters.length - 1]\n      );\n    }\n    return abbreviatedPosters;\n  }\n\n  <template>\n    <div class=\"topic-users\">\n      <div class=\"inline\">\n        {{#each this.abbrieviatedPosters as |poster|}}\n          {{#if poster.count}}\n            ({{poster.count}})\n          {{else}}\n            <a\n              href={{poster.user.path}}\n              data-user-card={{poster.user.username}}\n              class={{poster.extras}}\n            >\n              {{avatar\n                poster\n                avatarTemplatePath=\"user.avatar_template\"\n                usernamePath=\"user.username\"\n                imageSize=\"small\"\n              }}\n            </a>\n          {{/if}}\n        {{/each}}\n      </div>\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { trustHTML } from \"@ember/template\";\n\nexport default class PreviewsExcerpt extends Component {\n  @service topicListPreviews;\n\n  get showExcerpt() {\n    return this.topicListPreviews.displayExcerpts;\n  }\n\n  get destinationUrl() {\n    if (this.args.topic.force_latest_post_nav && this.args.topic.last_post_id) {\n      return `/t/${this.args.topic.slug}/${this.args.topic.id}/${this.args.topic.last_post_id}`;\n    } else {\n      return this.args.topic.url;\n    }\n  }\n\n  get excerpt() {\n    return this.args.topic.show_latest_post_excerpt\n      ? trustHTML(this.args.topic.last_post_excerpt)\n      : trustHTML(this.args.topic.excerpt);\n  }\n\n  <template>\n    {{#if this.showExcerpt}}\n      <a class=\"topic-excerpt\" href={{this.destinationUrl}}>\n        {{this.excerpt}}\n      </a>\n    {{/if}}\n  </template>\n}\n","import PreviewsActions from \"./footer/previews-actions\";\nimport PreviewsMeta from \"./footer/previews-meta\";\nimport PreviewsUsers from \"./footer/previews-users\";\n\nexport default <template>\n  <div class=\"topic-footer\">\n    <PreviewsMeta @topic={{@topic}} />\n    <PreviewsUsers @topic={{@topic}} />\n    <PreviewsActions @topic={{@topic}} />\n  </div>\n</template>\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { fn } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport BufferedProxy from \"ember-buffered-proxy/proxy\";\nimport DModal from \"discourse/components/d-modal\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class TlpThumbnailSelectorComponent extends Component {\n  @tracked buffered = BufferedProxy.create({\n    content: this.args.model,\n  });\n\n  @action\n  selectThumbnail(imageUrl, uploadId) {\n    this.args.model.buffered.set(\"user_chosen_thumbnail_url\", imageUrl);\n    this.args.model.buffered.set(\"image_upload_id\", uploadId);\n    this.args.closeModal();\n  }\n\n  <template>\n    <DModal\n      @closeModal={{@closeModal}}\n      @flash={{this.flash}}\n      class=\"select-thumbnail\"\n      @title={{i18n (themePrefix \"tlp.thumbnail_selector.title\")}}\n    >\n      <h3>\n        {{i18n (themePrefix \"tlp.thumbnail_selector.topic_title_prefix\")}}\n        \"{{@model.topic_title}}\"\n      </h3>\n\n      <span class=\"select-thumbnail\">\n        {{#each @model.thumbnails as |thumbnail|}}\n          <button\n            type=\"button\"\n            class=\"select-thumbnail-options\"\n            {{on\n              \"click\"\n              (fn this.selectThumbnail thumbnail.image_url thumbnail.upload_id)\n            }}\n          >\n            <img src={{thumbnail.image_url}} alt=\"Thumbnail\" />\n          </button>\n        {{/each}}\n      </span>\n    </DModal>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\n\nexport default class PortfolioButton extends Component {\n  @service router;\n\n  @action\n  openPortfolio() {\n    this.router.transitionTo(\"userActivity.portfolio\", this.args.user);\n  }\n\n  get portfolioIcon() {\n    return settings.topic_list_portfolio_icons;\n  }\n\n  <template>\n    <DButton\n      class=\"btn-primary\"\n      @icon={{this.portfolioIcon}}\n      @action={{this.openPortfolio}}\n      @label={{themePrefix \"tlp.user_activity_portfolio_title\"}}\n    />\n  </template>\n}\n","import ItemTopicCell from \"discourse/components/topic-list/item/topic-cell\";\nimport PreviewsExcerpt from \"./details/previews-excerpt\";\nimport PreviewsFooter from \"./details/previews-footer\";\n\nexport default <template>\n  <div class=\"topic-details\">\n    <ItemTopicCell @topic={{@topic}} @showTopicPostBadges={{true}} />\n    <PreviewsExcerpt @topic={{@topic}} />\n    <PreviewsFooter @topic={{@topic}} />\n  </div>\n</template>\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport concatClass from \"discourse/helpers/concat-class\";\n\nexport default class PreviewsThumbnail extends Component {\n  @service currentUser;\n  @service topicListPreviews;\n\n  get getDefaultThumbnail() {\n    const defaultThumbnail = settings.topic_list_default_thumbnail_fallback;\n    return defaultThumbnail ? settings.topic_list_default_thumbnail : false;\n  }\n\n  get previewUrl() {\n    const preferLowRes =\n      this.currentUser !== undefined && this.currentUser !== null\n        ? this.currentUser.custom_fields\n            .tlp_user_prefs_prefer_low_res_thumbnails\n        : false;\n    if (this.args.topic.thumbnails) {\n      let resLevel = settings.topic_list_thumbnail_resolution_level;\n      resLevel = Math.round(\n        ((this.args.topic.thumbnails.length - 1) / 6) * resLevel\n      );\n      if (preferLowRes) {\n        resLevel++;\n      }\n      if (window.devicePixelRatio && resLevel > 0) {\n        resLevel--;\n      }\n      return resLevel <= this.args.topic.thumbnails.length - 1\n        ? this.args.topic.thumbnails[resLevel].url\n        : this.args.topic.thumbnails[this.args.topic.thumbnails.length - 1].url;\n    } else {\n      return this.getDefaultThumbnail;\n    }\n  }\n\n  get isTiles() {\n    return this.args.tiles ? \"tiles-thumbnail\" : \"non-tiles-thumbnail\";\n  }\n\n  get destinationUrl() {\n    if (this.args.topic.force_latest_post_nav && this.args.topic.last_post_id) {\n      return `/t/${this.args.topic.slug}/${this.args.topic.id}/${this.args.topic.last_post_id}`;\n    } else {\n      return this.args.topic.url;\n    }\n  }\n\n  <template>\n    {{#if this.previewUrl}}\n      <a href={{this.destinationUrl}}>\n        <img\n          class={{concatClass \"thumbnail\" this.isTiles}}\n          src={{this.previewUrl}}\n          loading=\"lazy\"\n        />\n      </a>\n    {{/if}}\n  </template>\n}\n","import PreviewsThumbnail from \"./previews-thumbnail\";\n\nexport default class PreviewsTilesThumbnail extends PreviewsThumbnail {\n  <template>\n    <div class=\"topic-thumbnail\">\n      <PreviewsThumbnail @topic={{@topic}} @tiles={{true}} />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { on } from \"@ember/modifier\";\nimport { action, computed } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport DToggleSwitch from \"discourse/components/d-toggle-switch\";\nimport { ajax } from \"discourse/lib/ajax\";\nimport { popupAjaxError } from \"discourse/lib/ajax-error\";\nimport TlpThumbnailSelectorModalComponent from \"../components/modal/tlp-thumbnail-selector\";\n\nexport default class SelectThumbnailComponent extends Component {\n  @service modal;\n\n  @action\n  showThumbnailSelector() {\n    ajax(`/topic-previews/thumbnail-selection.json?topic=${this.args.topic_id}`)\n      .then((result) => {\n        this.modal.show(TlpThumbnailSelectorModalComponent, {\n          model: {\n            thumbnails: result.thumbnailselection,\n            topic_id: this.args.topic_id,\n            topic_title: this.args.topic_title,\n            buffered: this.args.buffered,\n          },\n        });\n      })\n      .catch((error) => {\n        popupAjaxError(error);\n      });\n  }\n\n  @computed(\"args.buffered.show_latest_post_excerpt\")\n  get showLatestPostExcerpt() {\n    return this.args.buffered.get(\"show_latest_post_excerpt\") || false;\n  }\n\n  @computed(\"args.buffered.force_latest_post_nav\")\n  get forceLatestPostNav() {\n    return this.args.buffered.get(\"force_latest_post_nav\") || false;\n  }\n\n  @action\n  updateForceLatestPostNav() {\n    this.args.buffered.set(\n      \"force_latest_post_nav\",\n      !this.args.buffered.get(\"force_latest_post_nav\")\n    );\n  }\n\n  @action\n  updateShowLatestPostExcerpt() {\n    this.args.buffered.set(\n      \"show_latest_post_excerpt\",\n      !this.args.buffered.get(\"show_latest_post_excerpt\")\n    );\n  }\n\n  <template>\n    <div class=\"select-thumbnail\">\n      <DButton\n        id=\"select-thumbnail-button\"\n        class=\"btn-default select-thumbnail\"\n        @action={{this.showThumbnailSelector}}\n        @icon=\"id-card\"\n        @label={{themePrefix \"tlp.thumbnail_selector.select_preview_button\"}}\n      />\n      {{#if @buffered.user_chosen_thumbnail_url}}\n        <img\n          src={{@buffered.user_chosen_thumbnail_url}}\n          class=\"select-thumbnail-preview\"\n        />\n      {{/if}}\n      <DToggleSwitch\n        @label={{themePrefix \"tlp.thumbnail_selector.force_latest_post_nav\"}}\n        @state={{this.forceLatestPostNav}}\n        {{on \"click\" this.updateForceLatestPostNav}}\n      />\n      <DToggleSwitch\n        @label={{themePrefix \"tlp.thumbnail_selector.show_latest_post_excerpt\"}}\n        @state={{this.showLatestPostExcerpt}}\n        {{on \"click\" this.updateShowLatestPostExcerpt}}\n      />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { trustHTML } from \"@ember/template\";\nimport avatar from \"discourse/helpers/avatar\";\nimport concatClass from \"discourse/helpers/concat-class\";\nimport DUserLink from \"discourse/ui-kit/d-user-link\";\nimport PreviewsThumbnail from \"./previews-thumbnail\";\n\nexport default class TlpFeaturedTopicComponent extends Component {\n  @service capabilities;\n  @service currentUser;\n\n  get featuredUser() {\n    return this.args.topic.posters[0].user;\n  }\n\n  get featuredUsername() {\n    return this.args.topic.posters[0].user.username;\n  }\n\n  get featuredExcerpt() {\n    return this.featuredExcerptLength > 0 && this.args.topic.excerpt\n      ? this.args.topic.excerpt.slice(0, this.featuredExcerptLength)\n      : false;\n  }\n\n  get featuredExcerptLength() {\n    const configuredLength = this.capabilities.viewport.sm\n      ? settings.topic_list_featured_excerpt_desktop\n      : settings.topic_list_featured_excerpt_mobile;\n\n    return Math.max(0, Number(configuredLength) || 0);\n  }\n\n  get featuredTags() {\n    if (settings.topic_list_featured_images_filter_type === \"category\") {\n      return [];\n    }\n\n    return settings.topic_list_featured_images_tag.split(\"|\");\n  }\n\n  get featuredTag() {\n    return this.args.topic.tags.filter(\n      (tag) => this.featuredTags.indexOf(tag) > -1\n    )[0];\n  }\n\n  get href() {\n    return `/t/${this.args.topic.id}`;\n  }\n\n  get detailsPresentation() {\n    return this.capabilities.viewport.sm\n      ? settings.topic_list_featured_details_desktop\n      : settings.topic_list_featured_details_mobile;\n  }\n\n  get detailsPositionClass() {\n    return this.detailsPresentation === \"Under\" ? \"--under\" : \"--over\";\n  }\n\n  get isDesktop() {\n    return this.capabilities.viewport.sm;\n  }\n\n  get detailsVisibilityClass() {\n    return this.detailsPresentation === \"Always over\" ||\n      (!this.capabilities.viewport.sm && this.detailsPresentation === \"Over\")\n      ? \"is-always-visible\"\n      : \"\";\n  }\n\n  get showAuthor() {\n    return this.isDesktop\n      ? settings.topic_list_featured_author_desktop\n      : settings.topic_list_featured_author_mobile;\n  }\n\n  get showOverImageAuthor() {\n    return this.showAuthor && this.detailsPositionClass === \"--over\";\n  }\n\n  get showUnderImageAuthor() {\n    return this.showAuthor && this.detailsPositionClass === \"--under\";\n  }\n\n  <template>\n    <a href={{this.href}} class=\"tlp-featured-topic {{this.featuredTag}}\">\n      <div\n        class={{concatClass\n          \"featured-details\"\n          this.detailsPositionClass\n          this.detailsVisibilityClass\n        }}\n      >\n        <div class=\"featured-details__image\">\n          <PreviewsThumbnail @topic={{@topic}} />\n        </div>\n        <div class=\"content\">\n          <div class=\"featured-details__heading\">\n            <div class=\"title\">\n              {{@topic.title}}\n            </div>\n            {{#if this.showUnderImageAuthor}}\n              {{#if this.isDesktop}}\n                <DUserLink\n                  @user={{this.featuredUser}}\n                  class=\"featured-details__author\"\n                >\n                  {{avatar this.featuredUser imageSize=\"small\"}}\n                </DUserLink>\n              {{else}}\n                <span class=\"featured-details__author\">\n                  {{avatar this.featuredUser imageSize=\"small\"}}\n                </span>\n              {{/if}}\n            {{/if}}\n          </div>\n          {{#if this.featuredExcerpt}}\n            <div class=\"excerpt\">\n              {{trustHTML this.featuredExcerpt}}\n            </div>\n          {{/if}}\n          {{#if this.showOverImageAuthor}}\n            <span class=\"user\">\n              {{this.featuredUsername}}\n              {{#if this.isDesktop}}\n                <DUserLink\n                  @user={{this.featuredUser}}\n                  class=\"featured-details__author\"\n                >\n                  {{avatar this.featuredUser imageSize=\"small\"}}\n                </DUserLink>\n              {{else}}\n                <span class=\"featured-details__author\">\n                  {{avatar this.featuredUser imageSize=\"small\"}}\n                </span>\n              {{/if}}\n            </span>\n          {{/if}}\n        </div>\n      </div>\n    </a>\n  </template>\n}\n","export function carouselCountForWidth({ gap, maximum, minimumWidth, width }) {\n  if (width <= 0) {\n    return maximum;\n  }\n\n  return Math.min(\n    maximum,\n    Math.max(1, Math.floor((width + gap) / (minimumWidth + gap)))\n  );\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { registerDestructor } from \"@ember/destroyable\";\nimport { hash } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { trustHTML } from \"@ember/template\";\nimport DButton from \"discourse/ui-kit/d-button\";\nimport dOnResize from \"discourse/ui-kit/modifiers/d-on-resize\";\nimport dPointerDrag from \"discourse/ui-kit/modifiers/d-pointer-drag\";\nimport { i18n } from \"discourse-i18n\";\nimport { carouselCountForWidth } from \"../lib/featured-carousel-layout\";\n\nconst DRAG_RESISTANCE = 0.28;\nconst DESKTOP_GAP_EM = 0.75;\nconst FLICK_PROJECTION_SECONDS = 0.18;\nconst MIN_FLICK_VELOCITY = 600;\nconst SPRING_DAMPING = 24;\nconst SPRING_STIFFNESS = 210;\n\nexport default class TlpFeaturedTopicsCarouselComponent extends Component {\n  @service a11y;\n  @service capabilities;\n\n  @tracked currentPosition = 0;\n  @tracked dragOffset = 0;\n  @tracked isSettling = false;\n  @tracked responsiveDesktopCount;\n\n  #animationFrame;\n  #dragStartPosition = 0;\n  #lastPointerTime = 0;\n  #lastPointerX = 0;\n  #pointerVelocity = 0;\n  #suppressClickUntil = 0;\n  #viewportWidth = 1;\n\n  constructor() {\n    super(...arguments);\n    registerDestructor(this, () => this.#cancelSpring());\n  }\n\n  get topics() {\n    return this.args.topics ?? [];\n  }\n\n  get desktopCarouselCount() {\n    const configured = Number(\n      settings.topic_list_featured_images_carousel_count\n    );\n    return Math.min(4, Math.max(1, configured || 3));\n  }\n\n  get visibleCount() {\n    return this.capabilities.viewport.sm ? this.desktopVisibleCount : 1;\n  }\n\n  get desktopVisibleCount() {\n    return Math.min(\n      this.desktopCarouselCount,\n      this.responsiveDesktopCount ?? this.desktopCarouselCount,\n      Math.max(1, this.topics.length)\n    );\n  }\n\n  get minimumDesktopSlideWidth() {\n    const featuredHeight = Number(settings.topic_list_featured_height) || 250;\n    return Math.min(320, Math.max(180, featuredHeight));\n  }\n\n  get maxPosition() {\n    return Math.max(0, this.topics.length - this.visibleCount);\n  }\n\n  get position() {\n    return Math.min(this.currentPosition, this.maxPosition);\n  }\n\n  get atStart() {\n    return this.position === 0;\n  }\n\n  get atEnd() {\n    return this.position === this.maxPosition;\n  }\n\n  get inMiddle() {\n    return !this.atStart && !this.atEnd;\n  }\n\n  get isRtl() {\n    return document.documentElement.dir === \"rtl\";\n  }\n\n  get previousIcon() {\n    return this.isRtl ? \"chevron-right\" : \"chevron-left\";\n  }\n\n  get nextIcon() {\n    return this.isRtl ? \"chevron-left\" : \"chevron-right\";\n  }\n\n  get positionLabel() {\n    const start = this.topics.length ? this.position + 1 : 0;\n    const end = Math.min(this.position + this.visibleCount, this.topics.length);\n\n    return i18n(themePrefix(\"tlp.featured_topics.position\"), {\n      start,\n      end,\n      total: this.topics.length,\n    });\n  }\n\n  get positionDots() {\n    if (!this.capabilities.viewport.sm && this.topics.length <= 7) {\n      return this.topics.map((_topic, index) => ({\n        id: `topic-${index}`,\n        isActive: index === this.position,\n      }));\n    }\n\n    return [\n      { id: \"start\", isActive: this.atStart },\n      { id: \"middle\", isActive: this.inMiddle },\n      { id: \"end\", isActive: this.atEnd },\n    ];\n  }\n\n  get trackStyle() {\n    const desktopOffset = (this.position * 100) / this.desktopVisibleCount;\n    const desktopGapOffset =\n      (this.position * DESKTOP_GAP_EM) / this.desktopVisibleCount;\n    const desktopWidth = 100 / this.desktopVisibleCount;\n    const desktopWidthGap =\n      (DESKTOP_GAP_EM * (this.desktopVisibleCount - 1)) /\n      this.desktopVisibleCount;\n    const mobileOffset = this.position * 100;\n\n    return trustHTML(\n      `--tlp-desktop-carousel-width: calc(${desktopWidth}% - ${desktopWidthGap}em); ` +\n        `--tlp-carousel-gap: ${DESKTOP_GAP_EM}em; ` +\n        `--tlp-desktop-offset: calc(-${desktopOffset}% - ${desktopGapOffset}em); ` +\n        `--tlp-desktop-offset-rtl: calc(${desktopOffset}% + ${desktopGapOffset}em); ` +\n        `--tlp-mobile-offset: -${mobileOffset}%; ` +\n        `--tlp-mobile-offset-rtl: ${mobileOffset}%; ` +\n        `--tlp-drag-offset: ${this.dragOffset}px;`\n    );\n  }\n\n  announcePosition() {\n    this.a11y.announce(this.positionLabel);\n  }\n\n  moveTo(position, announce = true) {\n    const nextPosition = Math.min(this.maxPosition, Math.max(0, position));\n    if (nextPosition === this.position) {\n      return;\n    }\n\n    this.#cancelSpring();\n    this.dragOffset = 0;\n    this.isSettling = false;\n    this.currentPosition = nextPosition;\n\n    if (announce) {\n      this.announcePosition();\n    }\n  }\n\n  @action\n  previous() {\n    this.moveTo(this.position - 1);\n  }\n\n  @action\n  next() {\n    this.moveTo(this.position + 1);\n  }\n\n  @action\n  onKeydown(event) {\n    let nextPosition;\n\n    switch (event.key) {\n      case \"ArrowLeft\":\n        nextPosition = this.position + (this.isRtl ? 1 : -1);\n        break;\n      case \"ArrowRight\":\n        nextPosition = this.position + (this.isRtl ? -1 : 1);\n        break;\n      case \"Home\":\n        nextPosition = 0;\n        break;\n      case \"End\":\n        nextPosition = this.maxPosition;\n        break;\n      default:\n        return;\n    }\n\n    event.preventDefault();\n    this.moveTo(nextPosition);\n  }\n\n  @action\n  onResize([entry]) {\n    if (!this.capabilities.viewport.sm) {\n      return;\n    }\n\n    const width = entry.contentRect.width;\n    const fontSize = parseFloat(getComputedStyle(entry.target).fontSize) || 16;\n    const previousPosition = this.position;\n\n    this.responsiveDesktopCount = carouselCountForWidth({\n      gap: DESKTOP_GAP_EM * fontSize,\n      maximum: this.desktopCarouselCount,\n      minimumWidth: this.minimumDesktopSlideWidth,\n      width,\n    });\n    this.currentPosition = Math.min(previousPosition, this.maxPosition);\n  }\n\n  @action\n  onDragStart(event) {\n    if (this.capabilities.viewport.sm || this.maxPosition === 0) {\n      return false;\n    }\n\n    this.#cancelSpring();\n    this.currentPosition = this.position;\n    this.dragOffset = 0;\n    this.isSettling = false;\n    this.#dragStartPosition = this.position;\n    this.#lastPointerX = event.clientX;\n    this.#lastPointerTime = event.timeStamp;\n    this.#pointerVelocity = 0;\n    this.#viewportWidth = Math.max(1, event.currentTarget.clientWidth);\n  }\n\n  @action\n  onDrag(event, info) {\n    let logicalDelta = info.delta.x * (this.isRtl ? 1 : -1);\n\n    if (\n      (this.#dragStartPosition === 0 && logicalDelta < 0) ||\n      (this.#dragStartPosition === this.maxPosition && logicalDelta > 0)\n    ) {\n      logicalDelta *= DRAG_RESISTANCE;\n    }\n\n    this.dragOffset = logicalDelta * (this.isRtl ? 1 : -1);\n\n    const elapsed = event.timeStamp - this.#lastPointerTime;\n    if (elapsed > 0) {\n      this.#pointerVelocity =\n        ((event.clientX - this.#lastPointerX) / elapsed) * 1000;\n    }\n    this.#lastPointerX = event.clientX;\n    this.#lastPointerTime = event.timeStamp;\n\n    if (Math.abs(info.delta.x) > 8) {\n      this.#suppressClickUntil = Date.now() + 350;\n    }\n  }\n\n  @action\n  onDragEnd(event, info) {\n    if (!info.moved) {\n      return;\n    }\n\n    const directionFactor = this.isRtl ? 1 : -1;\n    const logicalDelta = this.dragOffset * directionFactor;\n    const logicalVelocity = this.#pointerVelocity * directionFactor;\n    const projectedDelta =\n      logicalDelta + logicalVelocity * FLICK_PROJECTION_SECONDS;\n    const distanceThreshold = this.#viewportWidth * 0.2;\n    let step = 0;\n\n    if (\n      projectedDelta > distanceThreshold ||\n      logicalVelocity > MIN_FLICK_VELOCITY\n    ) {\n      step = 1;\n    } else if (\n      projectedDelta < -distanceThreshold ||\n      logicalVelocity < -MIN_FLICK_VELOCITY\n    ) {\n      step = -1;\n    }\n\n    const nextPosition = Math.min(\n      this.maxPosition,\n      Math.max(0, this.#dragStartPosition + step)\n    );\n    const oldBase =\n      directionFactor * this.#dragStartPosition * this.#viewportWidth;\n    const newBase = directionFactor * nextPosition * this.#viewportWidth;\n\n    this.dragOffset += oldBase - newBase;\n    this.currentPosition = nextPosition;\n    this.isSettling = true;\n    this.#startSpring(this.#pointerVelocity);\n\n    if (nextPosition !== this.#dragStartPosition) {\n      this.announcePosition();\n    }\n  }\n\n  @action\n  onDragCancel() {\n    this.isSettling = true;\n    this.#startSpring(0);\n  }\n\n  @action\n  preventDraggedClick(event) {\n    if (Date.now() < this.#suppressClickUntil) {\n      event.preventDefault();\n      event.stopPropagation();\n    }\n  }\n\n  #startSpring(initialVelocity) {\n    this.#cancelSpring();\n\n    if (window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches) {\n      this.dragOffset = 0;\n      this.isSettling = false;\n      return;\n    }\n\n    let lastTime;\n    let velocity = initialVelocity;\n\n    const settle = (time) => {\n      const elapsed = lastTime ? Math.min((time - lastTime) / 1000, 0.032) : 0;\n      lastTime = time;\n\n      if (elapsed > 0) {\n        const acceleration =\n          -SPRING_STIFFNESS * this.dragOffset - SPRING_DAMPING * velocity;\n        velocity += acceleration * elapsed;\n        this.dragOffset += velocity * elapsed;\n      }\n\n      if (Math.abs(this.dragOffset) < 0.5 && Math.abs(velocity) < 5) {\n        this.dragOffset = 0;\n        this.isSettling = false;\n        this.#animationFrame = undefined;\n        return;\n      }\n\n      this.#animationFrame = requestAnimationFrame(settle);\n    };\n\n    this.#animationFrame = requestAnimationFrame(settle);\n  }\n\n  #cancelSpring() {\n    if (this.#animationFrame) {\n      cancelAnimationFrame(this.#animationFrame);\n      this.#animationFrame = undefined;\n    }\n  }\n\n  <template>\n    <div\n      class=\"tlp-featured-topics__carousel\"\n      aria-label={{i18n (themePrefix \"tlp.featured_topics.label\")}}\n      role=\"region\"\n    >\n      <DButton\n        class=\"tlp-featured-topics__navigation --previous\"\n        @action={{this.previous}}\n        @disabled={{this.atStart}}\n        @icon={{this.previousIcon}}\n        @title={{themePrefix \"tlp.featured_topics.previous\"}}\n      />\n      <div\n        class=\"tlp-featured-topics__viewport\"\n        tabindex=\"0\"\n        {{dOnResize this.onResize (hash delay=100 immediate=true)}}\n        {{on \"click\" this.preventDraggedClick capture=true}}\n        {{on \"keydown\" this.onKeydown}}\n        {{dPointerDrag\n          onDragStart=this.onDragStart\n          onDrag=this.onDrag\n          onDragEnd=this.onDragEnd\n          onDragCancel=this.onDragCancel\n          cancelCommits=this.capabilities.isIOS\n          draggingClass=\"is-dragging\"\n          threshold=4\n          touchAction=\"pan-y\"\n        }}\n      >\n        <div\n          class=\"tlp-featured-topics__track\n            {{if this.isSettling 'is-settling'}}\"\n          style={{this.trackStyle}}\n        >\n          {{#each this.topics as |topic|}}\n            <div class=\"tlp-featured-topics__slide\">\n              {{yield topic}}\n            </div>\n          {{/each}}\n        </div>\n      </div>\n      <DButton\n        class=\"tlp-featured-topics__navigation --next\"\n        @action={{this.next}}\n        @disabled={{this.atEnd}}\n        @icon={{this.nextIcon}}\n        @title={{themePrefix \"tlp.featured_topics.next\"}}\n      />\n    </div>\n    <div class=\"tlp-featured-topics__position\">\n      <div class=\"tlp-featured-topics__position-dots\">\n        <span class=\"sr-only\">{{this.positionLabel}}</span>\n        {{#each this.positionDots key=\"id\" as |dot|}}\n          <span\n            aria-hidden=\"true\"\n            class=\"tlp-featured-topics__position-dot\n              {{if dot.isActive 'is-active'}}\"\n          ></span>\n        {{/each}}\n      </div>\n\n      {{#if (has-block \"positionTrailing\")}}\n        <div class=\"tlp-featured-topics__position-trailing\">\n          {{yield to=\"positionTrailing\"}}\n        </div>\n      {{/if}}\n    </div>\n  </template>\n}\n","const CACHE_TTL_MS = 60_000;\nconst sessionCaches = new WeakMap();\n\nfunction requestKey(request, userId) {\n  const params = Object.entries(request.params ?? {}).sort(([left], [right]) =>\n    left.localeCompare(right)\n  );\n\n  return JSON.stringify([userId ?? null, request.filter, params]);\n}\n\nfunction cacheFor(session, now) {\n  let cache = sessionCaches.get(session);\n\n  if (!cache) {\n    cache = new Map();\n    sessionCaches.set(session, cache);\n  }\n\n  for (const [key, entry] of cache) {\n    if (entry.expiresAt <= now) {\n      cache.delete(key);\n    }\n  }\n\n  return cache;\n}\n\nexport async function findCachedFeaturedTopicList({\n  request,\n  session,\n  store,\n  userId,\n}) {\n  const now = Date.now();\n  const cache = cacheFor(session, now);\n  const key = requestKey(request, userId);\n  const cached = cache.get(key);\n\n  if (cached) {\n    return cached.promise;\n  }\n\n  const promise = store.findFiltered(\"topicList\", request);\n  cache.set(key, { expiresAt: now + CACHE_TTL_MS, promise });\n\n  try {\n    return await promise;\n  } catch (error) {\n    if (cache.get(key)?.promise === promise) {\n      cache.delete(key);\n    }\n    throw error;\n  }\n}\n","const MAX_TOPIC_LIST_PAGE_SIZE = 30;\nconst FEATURED_TOPIC_BUFFER_MULTIPLIER = 2;\n\nexport function featuredTopicsPageSize(count) {\n  const normalizedCount = Math.max(0, Math.floor(Number(count) || 0));\n\n  if (normalizedCount === 0) {\n    return;\n  }\n\n  return Math.min(\n    MAX_TOPIC_LIST_PAGE_SIZE,\n    normalizedCount * FEATURED_TOPIC_BUFFER_MULTIPLIER\n  );\n}\n\nexport function featuredTopicsRequest(\n  filterType,\n  parameter,\n  {\n    count = 0,\n    currentCategory,\n    featuredCategory,\n    order = \"latest\",\n    restrictToCurrentCategory = false,\n  } = {}\n) {\n  const params = {};\n  let requestCategory = featuredCategory;\n\n  if (restrictToCurrentCategory && currentCategory) {\n    if (\n      filterType === \"category\" &&\n      !categoryContainsTopic(featuredCategory, currentCategory)\n    ) {\n      return;\n    }\n\n    requestCategory = currentCategory;\n    params.no_subcategories = true;\n  }\n\n  if (filterType === \"category\") {\n    params.category = String(requestCategory?.id ?? parameter);\n  } else if (requestCategory) {\n    params.category = String(requestCategory.id);\n  }\n\n  const perPage = featuredTopicsPageSize(count);\n  if (perPage) {\n    params.per_page = perPage;\n  }\n\n  if (order === \"created\") {\n    params.order = \"created\";\n  }\n\n  const request = {\n    filter: filterType === \"category\" ? \"latest\" : `tag/${parameter}`,\n  };\n\n  if (Object.keys(params).length > 0) {\n    request.params = params;\n  }\n\n  return request;\n}\n\nexport function categoryContainsTopic(featuredCategory, topicCategory) {\n  if (!featuredCategory || !topicCategory) {\n    return false;\n  }\n\n  return (\n    topicCategory.id === featuredCategory.id ||\n    topicCategory.ancestors?.some(\n      (category) => category.id === featuredCategory.id\n    ) === true\n  );\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action, computed } from \"@ember/object\";\nimport didInsert from \"@ember/render-modifiers/modifiers/did-insert\";\nimport didUpdate from \"@ember/render-modifiers/modifiers/did-update\";\nimport { service } from \"@ember/service\";\nimport { cook } from \"discourse/lib/text\";\nimport Category from \"discourse/models/category\";\nimport dCategoryBadge from \"discourse/ui-kit/helpers/d-category-badge\";\nimport dDiscourseTag from \"discourse/ui-kit/helpers/d-discourse-tag\";\nimport { findCachedFeaturedTopicList } from \"../lib/featured-topics-cache\";\nimport { featuredTopicsRequest } from \"../lib/featured-topics-filter\";\nimport TlpFeaturedTopic from \"./tlp-featured-topic\";\nimport TlpFeaturedTopicsCarousel from \"./tlp-featured-topics-carousel\";\n\nexport default class TlpFeaturedTopicsComponent extends Component {\n  @service appEvents;\n  @service currentUser;\n  @service store;\n  @service session;\n\n  @tracked featuredTitle = \"\";\n  @tracked featuredTopics = [];\n\n  featuredTopicsLoadId = 0;\n\n  constructor() {\n    super(...arguments);\n    this.appEvents.trigger(\"topic:refresh-timeline-position\");\n\n    if (this.showFeaturedTitle) {\n      const raw = settings.topic_list_featured_title;\n      cook(raw).then((cooked) => (this.featuredTitle = cooked));\n    }\n  }\n\n  @action\n  async getFeaturedTopics() {\n    const loadId = ++this.featuredTopicsLoadId;\n    const source = settings.topic_list_featured_images_tag.trim();\n\n    if (!this.featuredImagesEnabled || source.length === 0) {\n      this.featuredTopics = [];\n      return;\n    }\n\n    const filterType = settings.topic_list_featured_images_filter_type;\n    const featuredCategory =\n      filterType === \"category\" ? Category.findSingleBySlug(source) : undefined;\n    const request = featuredTopicsRequest(filterType, source, {\n      count: settings.topic_list_featured_images_count,\n      currentCategory: this.args.category,\n      featuredCategory,\n      order: settings.topic_list_featured_images_order,\n      restrictToCurrentCategory:\n        Boolean(this.args.category) &&\n        settings.topic_list_featured_images_from_current_category_only,\n    });\n\n    if (!request) {\n      this.featuredTopics = [];\n      return;\n    }\n\n    const list = await findCachedFeaturedTopicList({\n      request,\n      session: this.session,\n      store: this.store,\n      userId: this.currentUser?.id,\n    });\n\n    if (loadId !== this.featuredTopicsLoadId) {\n      return;\n    }\n\n    if (typeof list !== \"undefined\") {\n      let topics = [...(list.topics ?? list.topic_list?.topics ?? [])].filter(\n        (topic) => this.hasUsableImage(topic)\n      );\n\n      if (settings.topic_list_featured_images_order === \"random\") {\n        topics = this.shuffle(topics);\n      }\n\n      const count = Math.max(\n        0,\n        Number(settings.topic_list_featured_images_count) || 0\n      );\n      this.featuredTopics = count > 0 ? topics.slice(0, count) : topics;\n    }\n  }\n\n  get featuredImagesEnabled() {\n    return this.args.category\n      ? settings.topic_list_featured_images_category\n      : settings.topic_list_featured_images;\n  }\n\n  hasUsableImage(topic) {\n    return (\n      topic.thumbnails?.length > 0 ||\n      (settings.topic_list_default_thumbnail_fallback &&\n        settings.topic_list_default_thumbnail)\n    );\n  }\n\n  shuffle(topics) {\n    const shuffled = [...topics];\n\n    for (let index = shuffled.length - 1; index > 0; index--) {\n      const swapIndex = Math.floor(Math.random() * (index + 1));\n      [shuffled[index], shuffled[swapIndex]] = [\n        shuffled[swapIndex],\n        shuffled[index],\n      ];\n    }\n\n    return shuffled;\n  }\n\n  @computed(\"featuredTopics\")\n  get showFeatured() {\n    return (\n      ((settings.topic_list_featured_images && this.args.category == null) ||\n        (settings.topic_list_featured_images_category &&\n          this.args.category !== null)) &&\n      this.featuredTopics.length > 0\n    );\n  }\n\n  @computed\n  get showFeaturedTitle() {\n    return settings.topic_list_featured_title;\n  }\n\n  @computed\n  get featuredTags() {\n    if (settings.topic_list_featured_images_filter_type === \"category\") {\n      return [];\n    }\n\n    return settings.topic_list_featured_images_tag.split(\"|\");\n  }\n\n  @computed\n  get featuredCategory() {\n    if (settings.topic_list_featured_images_filter_type !== \"category\") {\n      return;\n    }\n\n    return Category.findSingleBySlug(settings.topic_list_featured_images_tag);\n  }\n\n  @computed\n  get showFeaturedSource() {\n    return (\n      settings.topic_list_featured_images_source_show &&\n      (this.featuredTags.length > 0 || this.featuredCategory)\n    );\n  }\n\n  get carouselView() {\n    return settings.topic_list_featured_images_view_type === \"Carousel\";\n  }\n\n  <template>\n    <div\n      {{didInsert this.getFeaturedTopics}}\n      {{didUpdate this.getFeaturedTopics @category.id}}\n      class=\"tlp-featured-topics\n        {{if this.showFeatured 'has-topics'}}\n        {{if this.carouselView '--carousel'}}\"\n    >\n      {{#if this.showFeatured}}\n        {{#if this.showFeaturedTitle}}\n          <div class=\"featured-title\">\n            {{this.featuredTitle}}\n          </div>\n        {{/if}}\n        {{#if this.carouselView}}\n          <TlpFeaturedTopicsCarousel @topics={{this.featuredTopics}}>\n            <:default as |topic|>\n              <TlpFeaturedTopic @topic={{topic}} />\n            </:default>\n\n            <:positionTrailing>\n              {{#if this.showFeaturedSource}}\n                <div class=\"featured-source\">\n                  {{#if this.featuredCategory}}\n                    {{dCategoryBadge this.featuredCategory link=true}}\n                  {{else}}\n                    {{#each this.featuredTags as |tag|}}\n                      {{dDiscourseTag tag}}\n                    {{/each}}\n                  {{/if}}\n                </div>\n              {{/if}}\n            </:positionTrailing>\n          </TlpFeaturedTopicsCarousel>\n        {{else}}\n          <div class=\"topics\">\n            {{#each this.featuredTopics as |t|}}\n              <TlpFeaturedTopic @topic={{t}} />\n            {{/each}}\n          </div>\n        {{/if}}\n        {{#unless this.carouselView}}\n          {{#if this.showFeaturedSource}}\n            <div class=\"featured-source\">\n              {{#if this.featuredCategory}}\n                {{dCategoryBadge this.featuredCategory link=true}}\n              {{else}}\n                {{#each this.featuredTags as |tag|}}\n                  {{dDiscourseTag tag}}\n                {{/each}}\n              {{/if}}\n            </div>\n          {{/if}}\n        {{/unless}}\n      {{/if}}\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport TlpFeaturedTopics from \"./tlp-featured-topics\";\n\nexport default class TlpFeaturedTopicsPlacementComponent extends Component {\n  get featuredImagesEnabled() {\n    return this.args.category\n      ? settings.topic_list_featured_images_category\n      : settings.topic_list_featured_images;\n  }\n\n  get shouldRender() {\n    return (\n      settings.topic_list_featured_images_placement === this.args.placement &&\n      this.featuredImagesEnabled &&\n      settings.topic_list_featured_images_tag.trim().length > 0\n    );\n  }\n\n  <template>\n    {{#if this.shouldRender}}\n      <TlpFeaturedTopics @category={{@category}} />\n    {{/if}}\n  </template>\n}\n","import { themePrefix } from \"virtual:theme\";\nimport PreferenceCheckbox from \"discourse/components/preference-checkbox\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default <template>\n  <label class=\"control-label\">\n    {{i18n (themePrefix \"tlp.user_prefs.title\")}}\n  </label>\n  <PreferenceCheckbox\n    @labelKey={{themePrefix \"tlp.user_prefs.prefer_low_res_thumbnails\"}}\n    @checked={{@model.custom_fields.tlp_user_prefs_prefer_low_res_thumbnails}}\n  />\n</template>\n","function resizeGridItem(item, isSideBySide, rowHeight, rowGap) {\n  let contentHeight = 0;\n\n  if (isSideBySide) {\n    // Only use the height of the first child\n    const firstChild = item.children[0];\n    if (firstChild) {\n      contentHeight = firstChild.getBoundingClientRect().height;\n    }\n  } else {\n    // Sum all children's heights\n    for (const child of item.children) {\n      contentHeight += child.getBoundingClientRect().height;\n    }\n  }\n\n  const rowSpan = Math.max(\n    1,\n    Math.ceil((contentHeight + rowGap) / (rowHeight + rowGap)) || 1\n  );\n\n  return { item, rowSpan };\n}\n\nfunction resizeGridItems(topicList, isSideBySide, items) {\n  const grid = topicList.querySelector(\"tbody\");\n\n  if (!grid) {\n    return;\n  }\n\n  const rowHeight = parseInt(\n    window.getComputedStyle(grid).getPropertyValue(\"grid-auto-rows\"),\n    10\n  );\n  const rowGap = parseInt(\n    window.getComputedStyle(grid).getPropertyValue(\"grid-row-gap\"),\n    10\n  );\n\n  const gridItems = items\n    ? Array.from(items).filter((item) => grid.contains(item))\n    : Array.from(grid.getElementsByClassName(\"topic-list-item\"));\n\n  // Read all layout values before writing styles to avoid forced reflows between\n  // individual topic-list items.\n  const updates = gridItems.map((item) =>\n    resizeGridItem(item, isSideBySide, rowHeight, rowGap)\n  );\n\n  for (const { item, rowSpan } of updates) {\n    const gridRowEnd = `span ${rowSpan}`;\n    if (item.style.gridRowEnd !== gridRowEnd) {\n      item.style.gridRowEnd = gridRowEnd;\n    }\n  }\n}\n\nexport { resizeGridItems };\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport { modifier } from \"ember-modifier\";\nimport { resizeGridItems } from \"../../lib/gridupdate\";\n\nexport default class LayoutRefresh extends Component {\n  @service topicListPreviews;\n\n  attachResizeObserver = modifier((element) => {\n    const topicList = element.closest(\".topic-list\");\n    const topicListBody = topicList?.querySelector(\"tbody\");\n    const listArea = document.getElementById(\"list-area\");\n\n    if (!topicList || !topicListBody) {\n      // eslint-disable-next-line no-console\n      console.error(\n        \"topic-list-previews resize-observer requires a topic-list body\"\n      );\n      return;\n    }\n\n    let animationFrame = null;\n    let resizeAll = false;\n    const pendingItems = new Set();\n\n    const triggerResize = (item) => {\n      if (item && !resizeAll) {\n        pendingItems.add(item);\n      } else {\n        resizeAll = true;\n        pendingItems.clear();\n      }\n\n      if (animationFrame !== null) {\n        return;\n      }\n\n      animationFrame = requestAnimationFrame(() => {\n        animationFrame = null;\n        const items = resizeAll ? null : pendingItems;\n        const isSideBySide =\n          topicList?.classList.contains(\"side-by-side\") &&\n          listArea &&\n          listArea.offsetWidth > 900;\n\n        resizeGridItems(topicList, isSideBySide, items);\n        resizeAll = false;\n        pendingItems.clear();\n      });\n    };\n\n    const observedWidths = new WeakMap([\n      [topicList, topicList.getBoundingClientRect().width],\n    ]);\n    if (listArea) {\n      observedWidths.set(listArea, listArea.getBoundingClientRect().width);\n    }\n\n    const onResize = (entries) => {\n      for (const entry of entries) {\n        const width = entry.contentRect.width;\n        if (width !== observedWidths.get(entry.target)) {\n          observedWidths.set(entry.target, width);\n          triggerResize();\n          break;\n        }\n      }\n    };\n\n    const onImageComplete = (event) => {\n      if (!(event.target instanceof HTMLImageElement)) {\n        return;\n      }\n\n      const item = event.target.closest(\".topic-list-item\");\n      if (item && topicListBody.contains(item)) {\n        triggerResize(item);\n      }\n    };\n\n    const resizeObserver = new ResizeObserver(onResize);\n    resizeObserver.observe(topicList);\n    if (listArea) {\n      resizeObserver.observe(listArea);\n    }\n\n    const mutationObserver = new MutationObserver((mutationsList) => {\n      for (const mutation of mutationsList) {\n        if (mutation.type === \"childList\") {\n          triggerResize();\n          break;\n        }\n      }\n    });\n\n    mutationObserver.observe(topicListBody, { childList: true });\n    topicListBody.addEventListener(\"load\", onImageComplete, true);\n    topicListBody.addEventListener(\"error\", onImageComplete, true);\n\n    // Size the initial list immediately. Images which are still loading will\n    // update their own item through the captured load/error handlers above.\n    triggerResize();\n\n    return () => {\n      if (animationFrame !== null) {\n        cancelAnimationFrame(animationFrame);\n      }\n      resizeObserver.disconnect();\n      mutationObserver.disconnect();\n      topicListBody.removeEventListener(\"load\", onImageComplete, true);\n      topicListBody.removeEventListener(\"error\", onImageComplete, true);\n    };\n  });\n\n  get fallbackNoCSSMasonry() {\n    if (\n      this.topicListPreviews.displayTiles &&\n      !CSS.supports(\"display: grid-lanes\")\n    ) {\n      return true;\n    }\n    return false;\n  }\n\n  <template>\n    {{#if this.fallbackNoCSSMasonry}}\n      <div class=\"resize-watcher\" {{this.attachResizeObserver}}></div>\n    {{/if}}\n  </template>\n}\n","import TlpFeaturedTopicsPlacement from \"../../components/tlp-featured-topics-placement\";\n\nexport default <template>\n  <TlpFeaturedTopicsPlacement\n    @category={{@outletArgs.category}}\n    @placement=\"Above topic list\"\n  />\n</template>\n","import TlpFeaturedTopicsPlacement from \"../../components/tlp-featured-topics-placement\";\n\nexport default <template>\n  <TlpFeaturedTopicsPlacement\n    @category={{@outletArgs.category}}\n    @placement=\"Above navigation controls\"\n  />\n</template>\n","import SelectThumbnail from \"../../components/select-thumbnail\";\n\nexport default <template>\n  {{#if @outletArgs.model.sidecar_installed}}\n    <SelectThumbnail\n      @topic_id={{@outletArgs.model.id}}\n      @topic_title={{@outletArgs.model.title}}\n      @buffered={{@outletArgs.buffered}}\n    />\n  {{/if}}\n</template>\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport PreviewsThumbnail from \"../../components/previews-thumbnail\";\n\nexport default class SearchThumbnail extends Component {\n  @service siteSettings;\n\n  <template>\n    {{#if this.siteSettings.topic_list_search_previews_enabled}}\n      <PreviewsThumbnail @topic={{@outletArgs.topic}} @tiles={{true}} />\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { LinkTo } from \"@ember/routing\";\nimport icon from \"discourse/helpers/d-icon\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class UserVotedTopics extends Component {\n  get portfolioIcon() {\n    return settings.topic_list_portfolio_icons || \"images\";\n  }\n\n  get portfolioEnabled() {\n    return settings.topic_list_portfolio;\n  }\n\n  <template>\n    {{#if this.portfolioEnabled}}\n      <li class=\"user-nav__activity-portfolio\">\n        <LinkTo @route=\"userActivity.portfolio\">\n          {{icon this.portfolioIcon}}\n          {{i18n (themePrefix \"tlp.user_activity_portfolio_title\")}}\n        </LinkTo>\n      </li>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport PortfolioButton from \"../../components/portfolio-button\";\n\nexport default class PortfolioButtonContainer extends Component {\n  get portfolioEnabled() {\n    return settings.topic_list_portfolio;\n  }\n\n  <template>\n    {{#if this.portfolioEnabled}}\n      <PortfolioButton @user={{@user}} />\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport TlpUserPreferences from \"../../components/tlp-user-preferences\";\n\nexport default class UserCustomPreferencesTlpUserPreferences extends Component {\n  @service siteSettings;\n\n  <template>\n    {{#if this.siteSettings.topic_list_previews_enabled}}\n      <TlpUserPreferences @model={{@outletArgs.model}} />\n    {{/if}}\n  </template>\n}\n","import { trustHTML } from \"@ember/template\";\nimport { apiInitializer } from \"discourse/lib/api\";\nimport { wantsNewWindow } from \"discourse/lib/intercept-click\";\nimport Category from \"discourse/models/category\";\nimport PreviewsDetails from \"./../components/previews-details\";\nimport PreviewsThumbnail from \"./../components/previews-thumbnail\";\nimport PreviewsTilesThumbnail from \"./../components/previews-tiles-thumbnail\";\nimport { categoryContainsTopic } from \"../lib/featured-topics-filter\";\n\nconst PLUGIN_ID = \"discourse-tc-topic-list-previews\";\nconst INTERACTIVE_TILE_SELECTOR = [\n  \"a\",\n  \"button\",\n  \"input\",\n  \"label\",\n  \"select\",\n  \"textarea\",\n  \"[role='button']\",\n  \"[role='link']\",\n  \".avatar\",\n  \".badge-category\",\n  \".badge-category__wrapper\",\n  \".badge-notification\",\n  \".badge-posts\",\n  \".badge-wrapper\",\n  \".discourse-tag\",\n  \".discourse-tags\",\n  \".topic-actions\",\n  \".topic-category\",\n  \".topic-status\",\n  \".topic-statuses\",\n].join(\",\");\n\nconst previewsTilesThumbnail = <template>\n  <PreviewsTilesThumbnail @topic={{@topic}} />\n</template>;\n\nconst previewsDetails = <template>\n  <PreviewsDetails @topic={{@topic}} />\n</template>;\n\nfunction destinationUrl(topic) {\n  if (topic.force_latest_post_nav && topic.last_post_id) {\n    return `/t/${topic.slug}/${topic.id}/${topic.last_post_id}`;\n  }\n\n  const topicUrl =\n    topic.linked_post_number && typeof topic.urlForPostNumber === \"function\"\n      ? topic.urlForPostNumber(topic.linked_post_number)\n      : topic.lastUnreadUrl;\n\n  return topicUrl || topic.url;\n}\n\nfunction dominantColour(topic) {\n  return topic?.dominant_colour ?? {};\n}\n\nfunction hasDominantColour(topic) {\n  return Object.keys(dominantColour(topic)).length > 0;\n}\n\nfunction isFeaturedTopic(topic) {\n  if (!topic) {\n    return false;\n  }\n\n  if (settings.topic_list_featured_images_filter_type === \"category\") {\n    const featuredCategory = Category.findSingleBySlug(\n      settings.topic_list_featured_images_tag\n    );\n    const topicCategory = Category.findById(topic.category_id);\n\n    return categoryContainsTopic(featuredCategory, topicCategory);\n  }\n\n  const featuredTags = settings.topic_list_featured_images_tag.split(\"|\");\n  return topic.tags?.some((tag) => featuredTags.includes(tag.name));\n}\n\nexport default apiInitializer((api) => {\n  const siteSettings = api.container.lookup(\"service:site-settings\");\n  const topicListPreviewsService = api.container.lookup(\n    \"service:topic-list-previews\"\n  );\n  const supportsGridLanes = CSS.supports(\"display: grid-lanes\");\n\n  if (!supportsGridLanes) {\n    // eslint-disable-next-line no-console\n    console.warn(\n      \"TLP: your browser does not support CSS Grid Lanes. Topic List Previews will fall back to a standard grid layout approximation for masonry. Please consider updating your browser for the best experience.  Check out CanIUse for compatibility information: https://caniuse.com/css-grid-lanes\"\n    );\n  }\n\n  api.registerValueTransformer(\"topic-list-columns\", ({ value: columns }) => {\n    if (topicListPreviewsService.displayTiles) {\n      columns.delete(\"activity\");\n      columns.delete(\"replies\");\n      columns.delete(\"views\");\n      columns.delete(\"posters\");\n      columns.delete(\"topic\");\n    }\n    return columns;\n  });\n\n  api.registerValueTransformer(\"topic-list-item-mobile-layout\", ({ value }) => {\n    if (topicListPreviewsService.displayTiles) {\n      // Force the desktop layout\n      return false;\n    }\n    return value;\n  });\n\n  api.registerValueTransformer(\n    \"topic-list-item-class\",\n    ({ value, context }) => {\n      if (topicListPreviewsService.displayTiles) {\n        value.push(\"tiles-style\");\n      }\n      if (\n        topicListPreviewsService.displayThumbnails &&\n        (context.topic?.thumbnails?.length > 0 ||\n          (settings.topic_list_default_thumbnail_fallback &&\n            settings.topic_list_default_thumbnail !== \"\"))\n      ) {\n        value.push(\"has-thumbnail\");\n      }\n      if (settings.topic_list_tiles_larger_featured_tiles) {\n        if (isFeaturedTopic(context.topic)) {\n          value.push(\"featured-topic\");\n        }\n      }\n      if (\n        siteSettings.topic_list_enable_thumbnail_colour_determination &&\n        topicListPreviewsService.displayThumbnails\n      ) {\n        const colour = dominantColour(context.topic);\n        let red = colour.red || 0;\n        let green = colour.green || 0;\n        let blue = colour.blue || 0;\n\n        //make 1 the minimum value to avoid total black\n        red = red === 0 ? 1 : red;\n        green = green === 0 ? 1 : green;\n        blue = blue === 0 ? 1 : blue;\n\n        let averageIntensity = hasDominantColour(context.topic)\n          ? (red + green + blue) / 3\n          : null;\n\n        if (\n          !hasDominantColour(context.topic) ||\n          !(\n            settings.topic_list_dominant_color_background === \"always\" ||\n            (topicListPreviewsService.displayTiles &&\n              settings.topic_list_dominant_color_background === \"tiles only\")\n          )\n        ) {\n          value.push(\"no-background-colour\");\n        } else if (averageIntensity > 127) {\n          value.push(\"dark-text\");\n        } else {\n          value.push(\"white-text\");\n        }\n      } else {\n        value.push(\"no-background-colour\");\n      }\n\n      return value;\n    }\n  );\n\n  api.registerValueTransformer(\n    \"topic-list-item-style\",\n    ({ value, context }) => {\n      if (\n        siteSettings.topic_list_enable_thumbnail_colour_determination &&\n        topicListPreviewsService.displayThumbnails &&\n        (settings.topic_list_dominant_color_background === \"always\" ||\n          (topicListPreviewsService.displayTiles &&\n            settings.topic_list_dominant_color_background === \"tiles only\")) &&\n        hasDominantColour(context.topic)\n      ) {\n        const colour = dominantColour(context.topic);\n        let red = colour.red || 0;\n        let green = colour.green || 0;\n        let blue = colour.blue || 0;\n\n        //make 1 the minimum value to avoid total black\n        red = red === 0 ? 1 : red;\n        green = green === 0 ? 1 : green;\n        blue = blue === 0 ? 1 : blue;\n\n        let newRgb = \"rgb(\" + red + \",\" + green + \",\" + blue + \")\";\n\n        value.push(trustHTML(`background: ${newRgb};`));\n      }\n      return value;\n    }\n  );\n\n  api.registerValueTransformer(\"topic-list-class\", ({ value }) => {\n    if (topicListPreviewsService.displayTiles) {\n      value.push(\"tiles-style\");\n      if (settings.topic_list_tiles_wide_format) {\n        value.push(\"side-by-side\");\n      }\n    }\n    return value;\n  });\n\n  api.renderInOutlet(\n    \"topic-list-before-link\",\n    <template>\n      {{#unless topicListPreviewsService.displayTiles}}\n        {{#if topicListPreviewsService.displayThumbnails}}\n          <div class=\"topic-thumbnail\">\n            <PreviewsThumbnail @tiles={{false}} @topic={{@outletArgs.topic}} />\n          </div>\n        {{/if}}\n      {{/unless}}\n    </template>\n  );\n\n  api.registerValueTransformer(\"topic-list-item-expand-pinned\", ({ value }) => {\n    if (\n      !topicListPreviewsService.displayTiles &&\n      topicListPreviewsService.displayExcerpts\n    ) {\n      return true;\n    }\n    return value; // Return default value\n  });\n\n  api.registerValueTransformer(\"topic-list-columns\", ({ value: columns }) => {\n    if (\n      topicListPreviewsService.displayTiles &&\n      topicListPreviewsService.displayThumbnails\n    ) {\n      columns.add(\n        \"previews-thumbnail\",\n        { item: previewsTilesThumbnail },\n        { before: \"topic\" }\n      );\n    }\n    if (topicListPreviewsService.displayTiles) {\n      columns.add(\n        \"previews-details\",\n        { item: previewsDetails },\n        { after: \"topic\" }\n      );\n    }\n    return columns;\n  });\n\n  api.registerBehaviorTransformer(\n    \"topic-list-item-click\",\n    ({ next, context }) => {\n      if (!topicListPreviewsService.displayTiles) {\n        return next();\n      }\n\n      const result = next();\n      const { event, navigateToTopic, topic } = context;\n      const target = event\n        .composedPath()\n        .find((element) => element instanceof Element);\n\n      if (\n        event.defaultPrevented ||\n        wantsNewWindow(event) ||\n        !target ||\n        typeof navigateToTopic !== \"function\" ||\n        target.closest(INTERACTIVE_TILE_SELECTOR)\n      ) {\n        return result;\n      }\n\n      event.preventDefault();\n      navigateToTopic(topic, destinationUrl(topic));\n\n      return result;\n    }\n  );\n\n  api.modifyClass(\"component:search-result-entries\", {\n    pluginId: PLUGIN_ID,\n    tagName: \"div\",\n    classNameBindings: [\"thumbnailGrid:thumbnail-grid\"],\n\n    thumbnailGrid() {\n      return siteSettings.topic_list_search_previews_enabled;\n    },\n  });\n\n  api.modifyClass(\"component:search-result-entry\", {\n    pluginId: PLUGIN_ID,\n\n    thumbnailGrid() {\n      return siteSettings.topic_list_search_previews_enabled;\n    },\n  });\n});\n","export default {\n  resource: \"user.userActivity\",\n  map() {\n    this.route(\"portfolio\");\n  },\n};\n","import UserAction from \"discourse/models/user-action\";\nimport UserTopicListRoute from \"discourse/routes/user-topic-list\";\n\nexport default class UserActivityPortfolioRoute extends UserTopicListRoute {\n  userActionType = UserAction.TYPES.topics;\n\n  model() {\n    let filter_type = settings.topic_list_portfolio_filter_type;\n    const filter_parameter = settings.topic_list_portfolio_filter_parameter;\n\n    if (filter_type === \"tag\") {\n      filter_type = \"tags\";\n    }\n\n    return this.store.findFiltered(\"topicList\", {\n      filter:\n        \"topics/created-by/\" + this.modelFor(\"user\").get(\"username_lower\"),\n      params: { [filter_type]: filter_parameter },\n    });\n  }\n}\n","import { computed } from \"@ember/object\";\nimport { dependentKeyCompat } from \"@ember/object/compat\";\nimport Service, { service } from \"@ember/service\";\nimport Site from \"discourse/models/site\";\n\nconst thumbnailsTopicLists =\n  settings.topic_list_thumbnails_topic_lists.split(\"|\");\nconst tilesTopicLists = settings.topic_list_tiles_topic_lists.split(\"|\");\nconst excerptsTopicLists = settings.topic_list_excerpts_topic_lists.split(\"|\");\nconst actionsTopicLists = settings.topic_list_actions_topic_lists.split(\"|\");\n\nconst thumbnailCategories = settings.topic_list_thumbnails_categories\n  .split(\"|\")\n  .map((id) => parseInt(id, 10));\n\nconst tilesCategories = settings.topic_list_tiles_categories\n  .split(\"|\")\n  .map((id) => parseInt(id, 10));\n\nconst excerptCategories = settings.topic_list_excerpts_categories\n  .split(\"|\")\n  .map((id) => parseInt(id, 10));\n\nconst actionCategories = settings.topic_list_actions_categories\n  .split(\"|\")\n  .map((id) => parseInt(id, 10));\n\nconst thumbnailTags = settings.topic_list_thumbnails_tags.split(\"|\");\nconst excerptTags = settings.topic_list_excerpts_tags.split(\"|\");\nconst tilesTags = settings.topic_list_tiles_tags.split(\"|\");\nconst actionTags = settings.topic_list_actions_tags.split(\"|\");\n\nexport default class TopicListPreviewsService extends Service {\n  @service router;\n  @service discovery;\n\n  @dependentKeyCompat\n  get isTopicListRoute() {\n    return this.discovery.onDiscoveryRoute;\n  }\n\n  @computed(\"router.currentRouteName\")\n  get isTopicRoute() {\n    return this.router.currentRouteName.match(/^topic\\./);\n  }\n\n  @dependentKeyCompat\n  get viewingCategoryId() {\n    return this.discovery.category?.id;\n  }\n\n  @dependentKeyCompat\n  get viewingTagName() {\n    return this.discovery.tag?.name;\n  }\n\n  get wideFormat() {\n    return settings.topic_list_tiles_wide_format;\n  }\n\n  enabledForCurrentTopicListRouteType(infoType) {\n    let checkList = [];\n\n    switch (infoType) {\n      case \"thumbnails\":\n        checkList = thumbnailsTopicLists;\n        break;\n      case \"tiles\":\n        checkList = tilesTopicLists;\n        break;\n      case \"excerpts\":\n        checkList = excerptsTopicLists;\n        break;\n      case \"actions\":\n        checkList = actionsTopicLists;\n    }\n\n    let currentTopicListRoute = this.currentTopicListRoute;\n\n    if (currentTopicListRoute === \"userActivity.portfolio\") {\n      currentTopicListRoute = \"activity-portfolio\";\n    }\n    if (currentTopicListRoute === \"userActivity.topics\") {\n      currentTopicListRoute = \"activity-topics\";\n    }\n    if (currentTopicListRoute.indexOf(\"topic\") > -1) {\n      currentTopicListRoute = \"suggested\";\n    }\n\n    let onMobile = Site.current().mobileView;\n\n    let found_item = checkList.find((item) => {\n      let mobileSetting = false;\n      let itemShortRouteName = item;\n\n      if (item.indexOf(\"-mobile\") > -1) {\n        mobileSetting = true;\n        itemShortRouteName = item.substring(0, item.indexOf(\"-mobile\"));\n      }\n\n      if (settings.topic_list_set_category_defaults) {\n        if (currentTopicListRoute.indexOf(\"Category\") > -1) {\n          currentTopicListRoute = currentTopicListRoute.substring(\n            0,\n            currentTopicListRoute.indexOf(\"Category\")\n          );\n        } else {\n          if (currentTopicListRoute === \"discovery.category\") {\n            currentTopicListRoute = \"discovery.latest\";\n          }\n        }\n      }\n\n      if (\n        currentTopicListRoute.indexOf(itemShortRouteName) > -1 &&\n        ((onMobile && mobileSetting) || (!onMobile && !mobileSetting))\n      ) {\n        return true;\n      }\n      return false;\n    });\n    return found_item && found_item.length > 0;\n  }\n\n  @computed(\"router.currentRouteName\")\n  get currentTopicListRoute() {\n    return this.router.currentRouteName;\n  }\n\n  @computed(\n    \"viewingCategoryId\",\n    \"viewingTagName\",\n    \"router.currentRoute.metadata.customThumbnailMode\",\n    \"currentTopicListRoute\"\n  )\n  get displayMode() {\n    let displayMode = [];\n\n    if (\n      thumbnailCategories.includes(this.viewingCategoryId) ||\n      thumbnailTags.includes(this.viewingTagName) ||\n      this.enabledForCurrentTopicListRouteType(\"thumbnails\")\n    ) {\n      displayMode.push(\"thumbnails\");\n    }\n    if (\n      tilesCategories.includes(this.viewingCategoryId) ||\n      tilesTags.includes(this.viewingTagName) ||\n      this.enabledForCurrentTopicListRouteType(\"tiles\")\n    ) {\n      displayMode.push(\"tiles\");\n    }\n    if (\n      excerptCategories.includes(this.viewingCategoryId) ||\n      excerptTags.includes(this.viewingTagName) ||\n      this.enabledForCurrentTopicListRouteType(\"excerpts\")\n    ) {\n      displayMode.push(\"excerpts\");\n    }\n    if (\n      actionCategories.includes(this.viewingCategoryId) ||\n      actionTags.includes(this.viewingTagName) ||\n      this.enabledForCurrentTopicListRouteType(\"actions\")\n    ) {\n      displayMode.push(\"actions\");\n    }\n\n    return displayMode;\n  }\n\n  @computed(\"displayMode\")\n  get enabledForRoute() {\n    return this.displayMode.length !== 0;\n  }\n\n  @computed(\"enabledForRoute\", \"displayMode\")\n  get displayThumbnails() {\n    return this.enabledForRoute && this.displayMode.includes(\"thumbnails\");\n  }\n\n  @computed(\"enabledForRoute\", \"displayMode\")\n  get displayTiles() {\n    return this.enabledForRoute && this.displayMode.includes(\"tiles\");\n  }\n\n  @computed(\"enabledForRoute\", \"displayMode\")\n  get displayExcerpts() {\n    return this.enabledForRoute && this.displayMode.includes(\"excerpts\");\n  }\n\n  @computed(\"enabledForRoute\", \"displayMode\")\n  get displayActions() {\n    return this.enabledForRoute && this.displayMode.includes(\"actions\");\n  }\n}\n","import * as Mod1 from \"./discourse/components/details/footer/previews-actions\";\nimport * as Mod2 from \"./discourse/components/details/footer/previews-meta\";\nimport * as Mod3 from \"./discourse/components/details/footer/previews-users\";\nimport * as Mod4 from \"./discourse/components/details/previews-excerpt\";\nimport * as Mod5 from \"./discourse/components/details/previews-footer\";\nimport * as Mod6 from \"./discourse/components/modal/tlp-thumbnail-selector\";\nimport * as Mod7 from \"./discourse/components/portfolio-button\";\nimport * as Mod8 from \"./discourse/components/previews-details\";\nimport * as Mod9 from \"./discourse/components/previews-thumbnail\";\nimport * as Mod10 from \"./discourse/components/previews-tiles-thumbnail\";\nimport * as Mod11 from \"./discourse/components/select-thumbnail\";\nimport * as Mod12 from \"./discourse/components/tlp-featured-topic\";\nimport * as Mod13 from \"./discourse/components/tlp-featured-topics-carousel\";\nimport * as Mod14 from \"./discourse/components/tlp-featured-topics-placement\";\nimport * as Mod15 from \"./discourse/components/tlp-featured-topics\";\nimport * as Mod16 from \"./discourse/components/tlp-user-preferences\";\nimport * as Mod17 from \"./discourse/connectors/before-topic-list-body/layout-refresh.gjs\";\nimport * as Mod18 from \"./discourse/connectors/discovery-list-container-top/featured-topics-discovery.gjs\";\nimport * as Mod19 from \"./discourse/connectors/discovery-list-controls-above/featured-topics-discovery.gjs\";\nimport * as Mod20 from \"./discourse/connectors/edit-topic/select-thumbnail-connector.gjs\";\nimport * as Mod21 from \"./discourse/connectors/search-results-topic-title-suffix/search-thumbnail.gjs\";\nimport * as Mod22 from \"./discourse/connectors/user-activity-bottom/portfolio-list.gjs\";\nimport * as Mod23 from \"./discourse/connectors/user-card-additional-buttons/portfolio-button.gjs\";\nimport * as Mod24 from \"./discourse/connectors/user-custom-preferences/tlp-user-preferences.gjs\";\nimport * as Mod25 from \"./discourse/initializers/preview-edits\";\nimport * as Mod26 from \"./discourse/lib/featured-carousel-layout\";\nimport * as Mod27 from \"./discourse/lib/featured-topics-cache\";\nimport * as Mod28 from \"./discourse/lib/featured-topics-filter\";\nimport * as Mod29 from \"./discourse/lib/gridupdate\";\nimport * as Mod30 from \"./discourse/previews-route-map\";\nimport * as Mod31 from \"./discourse/routes/user-activity/portfolio\";\nimport * as Mod32 from \"./discourse/services/topic-list-previews\";\nconst compatModules = {\n  \"discourse/components/details/footer/previews-actions\": Mod1,\n  \"discourse/components/details/footer/previews-meta\": Mod2,\n  \"discourse/components/details/footer/previews-users\": Mod3,\n  \"discourse/components/details/previews-excerpt\": Mod4,\n  \"discourse/components/details/previews-footer\": Mod5,\n  \"discourse/components/modal/tlp-thumbnail-selector\": Mod6,\n  \"discourse/components/portfolio-button\": Mod7,\n  \"discourse/components/previews-details\": Mod8,\n  \"discourse/components/previews-thumbnail\": Mod9,\n  \"discourse/components/previews-tiles-thumbnail\": Mod10,\n  \"discourse/components/select-thumbnail\": Mod11,\n  \"discourse/components/tlp-featured-topic\": Mod12,\n  \"discourse/components/tlp-featured-topics-carousel\": Mod13,\n  \"discourse/components/tlp-featured-topics-placement\": Mod14,\n  \"discourse/components/tlp-featured-topics\": Mod15,\n  \"discourse/components/tlp-user-preferences\": Mod16,\n  \"discourse/connectors/before-topic-list-body/layout-refresh\": Mod17,\n  \"discourse/connectors/discovery-list-container-top/featured-topics-discovery\": Mod18,\n  \"discourse/connectors/discovery-list-controls-above/featured-topics-discovery\": Mod19,\n  \"discourse/connectors/edit-topic/select-thumbnail-connector\": Mod20,\n  \"discourse/connectors/search-results-topic-title-suffix/search-thumbnail\": Mod21,\n  \"discourse/connectors/user-activity-bottom/portfolio-list\": Mod22,\n  \"discourse/connectors/user-card-additional-buttons/portfolio-button\": Mod23,\n  \"discourse/connectors/user-custom-preferences/tlp-user-preferences\": Mod24,\n  \"discourse/initializers/preview-edits\": Mod25,\n  \"discourse/lib/featured-carousel-layout\": Mod26,\n  \"discourse/lib/featured-topics-cache\": Mod27,\n  \"discourse/lib/featured-topics-filter\": Mod28,\n  \"discourse/lib/gridupdate\": Mod29,\n  \"discourse/previews-route-map\": Mod30,\n  \"discourse/routes/user-activity/portfolio\": Mod31,\n  \"discourse/services/topic-list-previews\": Mod32,\n};\nexport { compatModules };\nexport default compatModules;\n"],"names":["settings","getObjectForTheme","themePrefix","key","PreviewsActionsComponent","Component","dt7948","g","this","prototype","service","siteSettings","i","currentUser","modal","tracked","args","topic","topic_post_can_unlike","topic_post_liked","canUnlike","like_count","likeCount","hasLiked","topic_post_bookmarked","bookmarked","topicId","id","postId","topic_post_id","shareTopic","show","ShareTopicModal","model","category","n","action","toggleLike","ajax","type","data","post_action_type_id","then","catch","error","popupAjaxError","returnXHR","toggleBookmark","reminder_type","reminder_at","name","bookmarkable_id","bookmarkable_type","sidecarInstalled","topic_list_previews_enabled","showLikeButton","topic_post_can_like","topic_list_show_like_on_current_users_posts","disabledLikeButton","topic_post_is_current_users","hasLike","likeDisabled","disabled","showBookmarkButton","bookmarkClass","bookmarkTitle","setComponentTemplate","createTemplateFactory","block","moduleName","scope","DButton","concatClass","i18n","icon","isStrictMode","PreviewsMeta","ratio","likes","parseFloat","posts","posts_count","ratioText","topic_post_like_heat_high","topic_post_like_heat_medium","topic_post_like_heat_low","likesHeat","length","number","coldAgeClass","trustHTML","formatDate","PreviewsUsers","abbrieviatedPosters","abbreviatedPosters","posters","count","push","avatar","PreviewsExcerpt","topicListPreviews","showExcerpt","displayExcerpts","destinationUrl","force_latest_post_nav","last_post_id","slug","url","excerpt","show_latest_post_excerpt","last_post_excerpt","__discourseComponentClass","PreviewsActions","templateOnly","TlpThumbnailSelectorComponent","BufferedProxy","create","content","buffered","selectThumbnail","imageUrl","uploadId","set","closeModal","DModal","on","fn","PortfolioButton","router","openPortfolio","transitionTo","user","portfolioIcon","topic_list_portfolio_icons","ItemTopicCell","PreviewsFooter","PreviewsThumbnail","getDefaultThumbnail","topic_list_default_thumbnail_fallback","topic_list_default_thumbnail","previewUrl","preferLowRes","undefined","custom_fields","tlp_user_prefs_prefer_low_res_thumbnails","thumbnails","resLevel","topic_list_thumbnail_resolution_level","Math","round","window","devicePixelRatio","isTiles","tiles","PreviewsTilesThumbnail","SelectThumbnailComponent","showThumbnailSelector","topic_id","result","TlpThumbnailSelectorModalComponent","thumbnailselection","topic_title","showLatestPostExcerpt","get","computed","forceLatestPostNav","updateForceLatestPostNav","updateShowLatestPostExcerpt","DToggleSwitch","TlpFeaturedTopicComponent","capabilities","featuredUser","featuredUsername","username","featuredExcerpt","featuredExcerptLength","slice","configuredLength","viewport","sm","topic_list_featured_excerpt_desktop","topic_list_featured_excerpt_mobile","max","Number","featuredTags","topic_list_featured_images_filter_type","topic_list_featured_images_tag","split","featuredTag","tags","filter","tag","indexOf","href","detailsPresentation","topic_list_featured_details_desktop","topic_list_featured_details_mobile","detailsPositionClass","isDesktop","detailsVisibilityClass","showAuthor","topic_list_featured_author_desktop","topic_list_featured_author_mobile","showOverImageAuthor","showUnderImageAuthor","DUserLink","carouselCountForWidth","gap","maximum","minimumWidth","width","min","floor","DESKTOP_GAP_EM","TlpFeaturedTopicsCarouselComponent","a11y","currentPosition","dragOffset","isSettling","responsiveDesktopCount","animationFrame","dragStartPosition","lastPointerTime","lastPointerX","pointerVelocity","suppressClickUntil","viewportWidth","constructor","super","arguments","registerDestructor","cancelSpring","topics","desktopCarouselCount","configured","topic_list_featured_images_carousel_count","visibleCount","desktopVisibleCount","minimumDesktopSlideWidth","featuredHeight","topic_list_featured_height","maxPosition","position","atStart","atEnd","inMiddle","isRtl","document","documentElement","dir","previousIcon","nextIcon","positionLabel","start","end","total","positionDots","map","_topic","index","isActive","trackStyle","desktopOffset","desktopGapOffset","desktopWidth","desktopWidthGap","mobileOffset","announcePosition","announce","moveTo","nextPosition","previous","next","onKeydown","event","preventDefault","onResize","entry","contentRect","fontSize","getComputedStyle","target","previousPosition","onDragStart","clientX","timeStamp","currentTarget","clientWidth","onDrag","info","logicalDelta","delta","x","elapsed","abs","Date","now","onDragEnd","moved","directionFactor","logicalVelocity","projectedDelta","distanceThreshold","step","oldBase","newBase","startSpring","onDragCancel","preventDraggedClick","stopPropagation","initialVelocity","matchMedia","matches","lastTime","velocity","settle","time","acceleration","requestAnimationFrame","cancelAnimationFrame","dOnResize","hash","dPointerDrag","sessionCaches","WeakMap","async","findCachedFeaturedTopicList","request","session","store","userId","cache","Map","expiresAt","delete","cacheFor","params","Object","entries","sort","left","right","localeCompare","JSON","stringify","requestKey","cached","promise","findFiltered","featuredTopicsPageSize","normalizedCount","featuredTopicsRequest","filterType","parameter","currentCategory","featuredCategory","order","restrictToCurrentCategory","requestCategory","categoryContainsTopic","no_subcategories","String","perPage","per_page","keys","topicCategory","ancestors","some","TlpFeaturedTopicsComponent","appEvents","featuredTitle","featuredTopics","featuredTopicsLoadId","trigger","showFeaturedTitle","raw","topic_list_featured_title","cook","cooked","getFeaturedTopics","loadId","source","trim","featuredImagesEnabled","Category","findSingleBySlug","topic_list_featured_images_count","topic_list_featured_images_order","Boolean","topic_list_featured_images_from_current_category_only","list","topic_list","hasUsableImage","shuffle","topic_list_featured_images_category","topic_list_featured_images","shuffled","swapIndex","random","showFeatured","showFeaturedSource","topic_list_featured_images_source_show","carouselView","topic_list_featured_images_view_type","didInsert","didUpdate","TlpFeaturedTopicsCarousel","TlpFeaturedTopic","dCategoryBadge","dDiscourseTag","TlpFeaturedTopicsPlacementComponent","shouldRender","topic_list_featured_images_placement","placement","TlpFeaturedTopics","PreferenceCheckbox","resizeGridItems","topicList","isSideBySide","items","grid","querySelector","rowHeight","parseInt","getPropertyValue","rowGap","updates","Array","from","item","contains","getElementsByClassName","contentHeight","firstChild","children","getBoundingClientRect","height","child","rowSpan","ceil","resizeGridItem","gridRowEnd","style","LayoutRefresh","attachResizeObserver","modifier","element","closest","topicListBody","listArea","getElementById","console","resizeAll","pendingItems","Set","triggerResize","add","clear","classList","offsetWidth","observedWidths","onImageComplete","HTMLImageElement","resizeObserver","ResizeObserver","observe","mutationObserver","MutationObserver","mutationsList","mutation","childList","addEventListener","disconnect","removeEventListener","fallbackNoCSSMasonry","displayTiles","CSS","supports","featuredTopicsDiscovery$1","TlpFeaturedTopicsPlacement","featuredTopicsDiscovery","selectThumbnailConnector","SelectThumbnail","SearchThumbnail","UserVotedTopics","portfolioEnabled","topic_list_portfolio","LinkTo","PortfolioButtonContainer","UserCustomPreferencesTlpUserPreferences","TlpUserPreferences","PLUGIN_ID","INTERACTIVE_TILE_SELECTOR","join","previewsTilesThumbnail","previewsDetails","PreviewsDetails","dominantColour","dominant_colour","hasDominantColour","previewEdits","apiInitializer","api","container","lookup","topicListPreviewsService","warn","registerValueTransformer","value","columns","context","displayThumbnails","topic_list_tiles_larger_featured_tiles","findById","category_id","includes","isFeaturedTopic","topic_list_enable_thumbnail_colour_determination","colour","red","green","blue","averageIntensity","topic_list_dominant_color_background","newRgb","topic_list_tiles_wide_format","renderInOutlet","before","after","registerBehaviorTransformer","navigateToTopic","composedPath","find","Element","defaultPrevented","wantsNewWindow","linked_post_number","urlForPostNumber","lastUnreadUrl","modifyClass","pluginId","tagName","classNameBindings","thumbnailGrid","topic_list_search_previews_enabled","previewsRouteMap","resource","route","UserTopicListRoute","userActionType","UserAction","TYPES","filter_type","topic_list_portfolio_filter_type","filter_parameter","topic_list_portfolio_filter_parameter","modelFor","thumbnailsTopicLists","topic_list_thumbnails_topic_lists","tilesTopicLists","topic_list_tiles_topic_lists","excerptsTopicLists","topic_list_excerpts_topic_lists","actionsTopicLists","topic_list_actions_topic_lists","thumbnailCategories","topic_list_thumbnails_categories","tilesCategories","topic_list_tiles_categories","excerptCategories","topic_list_excerpts_categories","actionCategories","topic_list_actions_categories","thumbnailTags","topic_list_thumbnails_tags","excerptTags","topic_list_excerpts_tags","tilesTags","topic_list_tiles_tags","actionTags","topic_list_actions_tags","TopicListPreviewsService","Service","discovery","isTopicListRoute","onDiscoveryRoute","dependentKeyCompat","isTopicRoute","currentRouteName","match","viewingCategoryId","viewingTagName","wideFormat","enabledForCurrentTopicListRouteType","infoType","checkList","currentTopicListRoute","onMobile","Site","current","mobileView","found_item","mobileSetting","itemShortRouteName","substring","topic_list_set_category_defaults","displayMode","enabledForRoute","displayActions","compatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12","Mod13","Mod14","Mod15","Mod16","Mod17","Mod18","Mod19","Mod20","Mod21","Mod22","Mod23","Mod24","Mod25","Mod26","Mod27","Mod28","Mod29","Mod30","Mod31"],"mappings":"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"}