{"version":3,"file":"virtual_main.js","sources":["theme-74/virtual:init-settings","theme-74/virtual:theme","theme-74/discourse/components/toc-heading.gjs","theme-74/discourse/components/toc-large-buttons.gjs","theme-74/discourse/components/toc-mini-buttons.gjs","theme-74/discourse/components/toc-contents.gjs","theme-74/discourse/components/toc-mini.gjs","theme-74/discourse/components/toc-toggle.gjs","theme-74/discourse/components/toc-timeline.gjs","theme-74/discourse/connectors/below-docs-topic/d-toc-wrapper.gjs","theme-74/discourse/connectors/topic-navigation/d-toc-wrapper.gjs","theme-74/discourse/initializers/disco-toc-composer.js","theme-74/discourse/initializers/init-toc-mini.js","theme-74/discourse/initializers/init-toc-toggle.js","theme-74/discourse/services/toc-processor.js","theme-74/virtual:main"],"sourcesContent":["import { registerSettings } from \"discourse/lib/theme-settings-store\";\n\nregisterSettings(74, {\n  \"minimum_trust_level_to_create_TOC\": 0,\n  \"composer_toc_text\": \"This topic will contain a table of contents\",\n  \"auto_TOC_categories\": \"\",\n  \"auto_TOC_tags\": \"\",\n  \"enable_TOC_for_replies\": false,\n  \"TOC_min_heading\": 3,\n  \"theme_uploads\": {\n    \"icons-sprite\": \"https://forum-cdn.spyhub.tv/uploads/default/original/4X/2/9/2/292be3c6fe014e7eb9620ab5cfe253f811c12214.svg\"\n  }\n});\n","import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(74);\n\nexport function themePrefix(key) {\n  return `theme_translations.74.${key}`;\n}\n","import Component from \"@glimmer/component\";\nimport { concat } from \"@ember/helper\";\nimport { on } from \"@ember/modifier\";\nimport { action } from \"@ember/object\";\nimport { service } from \"@ember/service\";\nimport { headerOffset } from \"discourse/lib/offset-calculator\";\nimport { slugify } from \"discourse/lib/utilities\";\n\nconst SCROLL_BUFFER = 25;\n\nexport default class TocHeading extends Component {\n  @service tocProcessor;\n\n  get isActive() {\n    return this.args.activeHeadingId === this.args.item.id;\n  }\n\n  get isAncestorActive() {\n    return this.args.activeAncestorIds?.includes(this.args.item.id);\n  }\n\n  get classNames() {\n    const baseClass = \"d-toc-item\";\n    const typeClass = this.args.item.tagName\n      ? ` d-toc-${this.args.item.tagName}`\n      : \"\";\n    let activeClass = \"\";\n    if (this.isActive) {\n      activeClass = \" direct-active active\";\n    } else if (this.isAncestorActive) {\n      activeClass = \" active\";\n    }\n    return `${baseClass}${typeClass}${activeClass}`;\n  }\n\n  @action\n  handleTocLinkClick(event) {\n    event.preventDefault();\n\n    const targetId = event.target.href?.split(\"#\").pop();\n    if (!targetId) {\n      return;\n    }\n\n    const targetElement =\n      document.querySelector(`a[name=\"${targetId}\"]`) ||\n      document.getElementById(targetId);\n    if (targetElement) {\n      const headerOffsetValue = headerOffset();\n      const elementPosition =\n        targetElement.getBoundingClientRect().top + window.pageYOffset;\n      const offsetPosition =\n        elementPosition - headerOffsetValue - SCROLL_BUFFER;\n\n      window.scrollTo({ top: offsetPosition, behavior: \"smooth\" });\n\n      // hide TOC overlay when navigating to link\n      this.tocProcessor.setOverlayVisible(false);\n    }\n  }\n\n  <template>\n    <li class={{this.classNames}}>\n      <a\n        href=\"#{{@item.id}}\"\n        {{on \"click\" this.handleTocLinkClick}}\n        data-d-toc={{concat \"toc-\" @item.tagName \"-\" (slugify @item.text)}}\n      >\n        {{@item.text}}\n      </a>\n      {{#if @item.subItems}}\n        <ul class=\"d-toc-sublevel\">\n          {{#each @item.subItems as |subItem|}}\n            <TocHeading\n              @item={{subItem}}\n              @activeHeadingId={{@activeHeadingId}}\n              @activeAncestorIds={{@activeAncestorIds}}\n            />\n          {{/each}}\n        </ul>\n      {{/if}}\n    </li>\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\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class TocLargeButtons extends Component {\n  @service tocProcessor;\n\n  @action\n  callJumpToEnd() {\n    this.tocProcessor.jumpToEnd(this.args.renderTimeline, this.args.postID);\n  }\n\n  <template>\n    <div class=\"d-toc-footer-icons\">\n      <DButton\n        @action={{this.callJumpToEnd}}\n        @icon=\"downward\"\n        @translatedLabel={{i18n (themePrefix \"jump_bottom\")}}\n        class=\"btn btn-transparent scroll-to-bottom\"\n      />\n    </div>\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 TocMiniButtons extends Component {\n  @service tocProcessor;\n\n  @action\n  callCloseOverlay() {\n    this.tocProcessor.setOverlayVisible(false);\n  }\n\n  @action\n  callJumpToEnd() {\n    this.tocProcessor.jumpToEnd(this.args.renderTimeline, this.args.postID);\n  }\n\n  <template>\n    <div class=\"d-toc-icons\">\n      <DButton\n        @action={{this.callJumpToEnd}}\n        @icon=\"downward\"\n        class=\"btn btn-transparent scroll-to-bottom\"\n      />\n      <DButton\n        @action={{this.closeOverlay}}\n        @icon=\"xmark\"\n        class=\"btn btn-transparent d-toc-close\"\n      />\n    </div>\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } 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 { debounce } from \"discourse/lib/decorators\";\nimport { headerOffset } from \"discourse/lib/offset-calculator\";\nimport TocHeading from \"../components/toc-heading\";\nimport TocLargeButtons from \"../components/toc-large-buttons\";\nimport TocMiniButtons from \"../components/toc-mini-buttons\";\n\nconst POSITION_BUFFER = 150;\nconst SCROLL_DEBOUNCE = 50;\nconst RESIZE_DEBOUNCE = 200;\n\nexport default class TocContents extends Component {\n  @service tocProcessor;\n  @service appEvents;\n\n  @tracked activeHeadingId = null;\n  @tracked headingPositions = [];\n  @tracked activeAncestorIds = [];\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    window.removeEventListener(\"scroll\", this.updateActiveHeadingOnScroll);\n    window.removeEventListener(\"resize\", this.calculateHeadingPositions);\n    this.appEvents.off(\n      \"topic:current-post-changed\",\n      this.calculateHeadingPositions\n    );\n  }\n\n  get mappedToc() {\n    return this.mappedTocStructure(this.args.tocStructure);\n  }\n\n  @action\n  setup() {\n    this.listenForScroll();\n    this.listenForPostChange();\n    this.listenForResize();\n    this.updateHeadingPositions();\n    this.updateActiveHeadingOnScroll(); // manual on setup so active class is added\n  }\n\n  @action\n  listenForScroll() {\n    window.addEventListener(\"scroll\", this.updateActiveHeadingOnScroll);\n  }\n\n  @action\n  listenForResize() {\n    //  due to text reflow positions will change after significant resize\n    window.addEventListener(\"resize\", this.calculateHeadingPositions);\n  }\n\n  @action\n  listenForPostChange() {\n    this.appEvents.on(\n      \"topic:current-post-changed\",\n      this.calculateHeadingPositions\n    );\n  }\n\n  @debounce(RESIZE_DEBOUNCE)\n  calculateHeadingPositions() {\n    this.updateHeadingPositions();\n  }\n\n  @action\n  updateHeadingPositions() {\n    // get the heading positions, so we know when to activate the TOC item on scroll\n    const postElement = document.querySelector(\n      `[data-post-id=\"${this.args.postID}\"]`\n    );\n\n    if (!postElement) {\n      return;\n    }\n\n    const headings = postElement.querySelectorAll(\"h1, h2, h3, h4, h5\");\n    if (!headings.length) {\n      return;\n    }\n\n    const sameIdCount = new Map();\n    const mappedToc = this.mappedToc;\n    this.headingPositions = Array.from(headings)\n      .map((heading) => {\n        const id = this.tocProcessor.getIdFromHeading(\n          this.args.postID,\n          heading,\n          sameIdCount\n        );\n        return mappedToc[id]\n          ? {\n              id,\n              position:\n                heading.getBoundingClientRect().top +\n                window.scrollY -\n                headerOffset() -\n                POSITION_BUFFER,\n            }\n          : null;\n      })\n      .compact();\n  }\n\n  @debounce(SCROLL_DEBOUNCE)\n  updateActiveHeadingOnScroll() {\n    const scrollPosition = window.pageYOffset - headerOffset();\n\n    // binary search to find the active item\n    let activeIndex = 0;\n    let low = 0;\n    let high = this.headingPositions.length - 1;\n    while (low <= high) {\n      let mid = Math.floor((low + high) / 2);\n      let heading = this.headingPositions[mid];\n\n      if (scrollPosition >= heading.position) {\n        low = mid + 1;\n        activeIndex = mid;\n      } else {\n        high = mid - 1;\n      }\n    }\n\n    const activeHeading =\n      this.mappedToc[this.headingPositions[activeIndex]?.id];\n\n    this.activeHeadingId = activeHeading?.id;\n    this.activeAncestorIds = [];\n    let ancestor = activeHeading;\n    while (ancestor && ancestor.parent) {\n      this.activeAncestorIds.push(ancestor.parent.id);\n      ancestor = ancestor.parent;\n    }\n  }\n\n  mappedTocStructure(tocStructure, map = null) {\n    map ??= {};\n    for (const item of tocStructure) {\n      map[item.id] = item;\n      if (item.subItems) {\n        this.mappedTocStructure(item.subItems, map);\n      }\n    }\n    return map;\n  }\n\n  <template>\n    {{#unless @renderTimeline}}\n      <TocMiniButtons @renderTimeline={{@renderTimeline}} @postID={{@postID}} />\n    {{/unless}}\n    <div\n      id=\"d-toc\"\n      {{didInsert this.setup}}\n      {{didUpdate this.updateHeadingPositions @postID}}\n    >\n\n      {{#each @tocStructure as |heading|}}\n        <ul class=\"d-toc-heading\">\n          <TocHeading\n            @item={{heading}}\n            @activeHeadingId={{this.activeHeadingId}}\n            @activeAncestorIds={{this.activeAncestorIds}}\n            @renderTimeline={{@renderTimeline}}\n          />\n        </ul>\n      {{/each}}\n\n      {{#if @renderTimeline}}\n        <TocLargeButtons\n          @postID={{@postID}}\n          @renderTimeline={{@renderTimeline}}\n        />\n      {{/if}}\n    </div>\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 TocMini extends Component {\n  @service tocProcessor;\n\n  willDestroy() {\n    super.willDestroy(...arguments);\n    this.removeClickOutsideListener();\n  }\n\n  @action\n  clickOutside() {\n    this.tocProcessor.setOverlayVisible(false);\n    this.removeClickOutsideListener();\n  }\n\n  @action\n  addClickOutsideListener() {\n    document.addEventListener(\"click\", this.clickOutside);\n  }\n\n  @action\n  toggleTOCOverlay() {\n    this.tocProcessor.toggleOverlay();\n    if (this.tocProcessor.isOverlayVisible) {\n      this.addClickOutsideListener();\n    } else {\n      this.removeClickOutsideListener();\n    }\n  }\n\n  @action\n  removeClickOutsideListener() {\n    document.removeEventListener(\"click\", this.clickOutside);\n  }\n\n  <template>\n    {{#if this.tocProcessor.hasTOC}}\n      <span class=\"d-toc-mini\">\n        <DButton\n          class=\"btn-primary\"\n          @icon=\"bars-staggered\"\n          @action={{this.toggleTOCOverlay}}\n        />\n      </span>\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { service } from \"@ember/service\";\nimport DButton from \"discourse/components/d-button\";\nimport { i18n } from \"discourse-i18n\";\n\nexport default class TocToggle extends Component {\n  @service tocProcessor;\n\n  get shouldShow() {\n    // docs and topics with 1 post don't need a toggle\n    if (this.tocProcessor.isDocs || this.args.topic?.posts_count === 1) {\n      return false;\n    }\n\n    return this.tocProcessor.hasTOC;\n  }\n\n  get toggleLabel() {\n    return this.tocProcessor.isTocVisible\n      ? \"toggle_toc.show_timeline\"\n      : \"toggle_toc.show_toc\";\n  }\n\n  get toggleIcon() {\n    return this.tocProcessor.isTocVisible ? \"timeline\" : \"bars-staggered\";\n  }\n\n  <template>\n    {{#if this.shouldShow}}\n      <DButton\n        @action={{this.tocProcessor.toggleTocVisibility}}\n        @icon={{this.toggleIcon}}\n        @translatedLabel={{i18n (themePrefix this.toggleLabel)}}\n        class=\"btn btn-default timeline-toggle\"\n      />\n    {{/if}}\n  </template>\n}\n","import Component from \"@glimmer/component\";\nimport { tracked } from \"@glimmer/tracking\";\nimport { action } 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 bodyClass from \"discourse/helpers/body-class\";\nimport TocContents from \"../components/toc-contents\";\nimport TocToggle from \"../components/toc-toggle\";\n\nexport default class TocTimeline extends Component {\n  @service tocProcessor;\n\n  @tracked\n  isTocVisible = localStorage.getItem(\"tocVisibility\") === \"true\" || true;\n\n  get shouldRenderToc() {\n    if (!this.tocProcessor.hasTOC) {\n      return false;\n    }\n\n    // should always show on docs routes\n    if (this.tocProcessor.isDocs) {\n      return true;\n    }\n\n    if (this.args.renderTimeline) {\n      // single post topics might not have a timeline\n      // so we should ignore state\n      if (this.args.topic?.posts_count === 1) {\n        return true;\n      }\n\n      // timeline state controlled by localStorage\n      return this.tocProcessor.isTocVisible;\n    } else {\n      // progress state controlled by overlay state\n      return this.tocProcessor.isOverlayVisible;\n    }\n  }\n\n  get isTopicProgress() {\n    return (\n      !this.args.renderTimeline ||\n      (this.args.renderTimeline && this.args.topicProgressExpanded)\n    );\n  }\n\n  @action\n  callCheckPostforTOC() {\n    this.tocProcessor.checkPostforTOC(this.args.topic);\n  }\n\n  @action\n  handleTimelineUpdate() {\n    if (this.args.renderTimeline) {\n      this.tocProcessor.setOverlayVisible(false);\n    }\n  }\n\n  <template>\n    <div\n      {{didInsert this.callCheckPostforTOC}}\n      {{didUpdate this.callCheckPostforTOC @topic.currentPost}}\n      {{didUpdate this.handleTimelineUpdate @renderTimeline}}\n      class=\"d-toc-main\"\n    >\n      {{bodyClass \"d-toc-installed\"}}\n      {{#if this.shouldRenderToc}}\n        {{#unless this.isTopicProgress}}\n          {{bodyClass \"d-toc-active\"}}\n        {{/unless}}\n        <TocContents\n          @postContent={{this.tocProcessor.postContent}}\n          @postID={{this.tocProcessor.postID}}\n          @tocStructure={{this.tocProcessor.tocStructure}}\n          @renderTimeline={{@renderTimeline}}\n        />\n        {{#if @renderTimeline}}\n          <TocToggle @topic={{@topic}} />\n        {{/if}}\n      {{/if}}\n    </div>\n  </template>\n}\n","import Component from \"@ember/component\";\nimport { classNames, tagName } from \"@ember-decorators/component\";\nimport TocTimeline from \"../../components/toc-timeline\";\n\n@tagName(\"div\")\n@classNames(\"below-docs-topic-outlet\", \"d-toc-wrapper\")\nexport default class DTocWrapper extends Component {\n  <template>\n    <TocTimeline @topic={{@outletArgs.topic}} @renderTimeline={{true}} />\n  </template>\n}\n","import Component from \"@ember/component\";\nimport { classNames, tagName } from \"@ember-decorators/component\";\nimport TocTimeline from \"../../components/toc-timeline\";\n\n@tagName(\"div\")\n@classNames(\"topic-navigation-outlet\", \"d-toc-wrapper\")\nexport default class DTocWrapper extends Component {\n  <template>\n    <TocTimeline\n      @topic={{@outletArgs.topic}}\n      @renderTimeline={{@outletArgs.renderTimeline}}\n      @topicProgressExpanded={{@outletArgs.topicProgressExpanded}}\n    />\n  </template>\n}\n","import { withPluginApi } from \"discourse/lib/plugin-api\";\nimport I18n from \"discourse-i18n\";\n\nexport default {\n  name: \"disco-toc-composer\",\n\n  initialize() {\n    withPluginApi(\"1.0.0\", (api) => {\n      const currentUser = api.getCurrentUser();\n      if (!currentUser) {\n        return;\n      }\n\n      const minimumTL = settings.minimum_trust_level_to_create_TOC;\n\n      if (currentUser.trust_level >= minimumTL || currentUser.staff) {\n        if (!I18n.translations[I18n.currentLocale()].js.composer) {\n          I18n.translations[I18n.currentLocale()].js.composer = {};\n        }\n        I18n.translations[I18n.currentLocale()].js.composer.contains_dtoc = \" \";\n\n        api.addComposerToolbarPopupMenuOption({\n          action: (toolbarEvent) => {\n            toolbarEvent.applySurround(\n              `<div data-theme-toc=\"true\">`,\n              `</div>`,\n              \"contains_dtoc\"\n            );\n          },\n          icon: \"align-left\",\n          label: themePrefix(\"insert_table_of_contents\"),\n          condition: (composer) => {\n            return (\n              settings.enable_TOC_for_replies || composer.model.topicFirstPost\n            );\n          },\n        });\n\n        if (settings.enable_TOC_for_replies) {\n          document.body.classList.add(\"toc-for-replies-enabled\");\n        }\n      }\n    });\n  },\n};\n","import { apiInitializer } from \"discourse/lib/api\";\nimport TocMini from \"../components/toc-mini\";\n\nexport default apiInitializer(\"1.14.0\", (api) => {\n  api.renderInOutlet(\"before-topic-progress\", TocMini);\n});\n","import { apiInitializer } from \"discourse/lib/api\";\nimport TocToggle from \"../components/toc-toggle\";\n\nexport default apiInitializer(\"1.14.0\", (api) => {\n  api.renderInOutlet(\"timeline-footer-controls-after\", TocToggle);\n});\n","import { tracked } from \"@glimmer/tracking\";\nimport { action } from \"@ember/object\";\nimport Service, { service } from \"@ember/service\";\nimport { slugify } from \"discourse/lib/utilities\";\n\nexport default class TocProcessor extends Service {\n  @service router;\n\n  @tracked hasTOC = false;\n  @tracked postContent = null;\n  @tracked postID = null;\n  @tracked tocStructure = null;\n  @tracked isTocVisible = localStorage.getItem(\"tocVisibility\") !== \"false\";\n  @tracked isOverlayVisible = false;\n  @tracked isDocs = false;\n\n  @action\n  toggleTocVisibility() {\n    this.isTocVisible = !this.isTocVisible;\n    localStorage.setItem(\"tocVisibility\", this.isTocVisible);\n  }\n\n  setOverlayVisible(visible) {\n    this.isOverlayVisible = visible;\n    const tocWrapper = document.querySelector(\".d-toc-wrapper\");\n    if (tocWrapper) {\n      tocWrapper.classList.toggle(\"overlay\", visible);\n    }\n  }\n\n  toggleOverlay() {\n    this.setOverlayVisible(!this.isOverlayVisible);\n  }\n\n  checkPostforTOC(topic) {\n    this.hasTOC = false;\n    if (\n      this.isValidTopic(topic) &&\n      this.shouldDisplayToc(this.getCurrentPost(topic))\n    ) {\n      const content = this.getCurrentPost(topic).cooked;\n      if (this.containsTocMarkup(content) || this.autoTOC(topic)) {\n        this.processPostContent(content, this.getCurrentPost(topic).id);\n      }\n    }\n    this.setOverlayVisible(false);\n  }\n\n  isValidTopic(topic) {\n    return !!topic;\n  }\n\n  getCurrentPost(topic) {\n    const docs = this.router?.currentRouteName?.includes(\"docs\");\n\n    if (docs) {\n      this.isDocs = true;\n      return topic.post_stream.posts[0];\n    }\n\n    this.isDocs = false;\n    return topic.postStream?.posts?.find(\n      (post) => post.post_number === topic.currentPost\n    );\n  }\n\n  shouldDisplayToc(post) {\n    return settings.enable_TOC_for_replies || post.post_number === 1;\n  }\n\n  containsTocMarkup(content) {\n    return content.includes(`<div data-theme-toc=\"true\">`);\n  }\n\n  processPostContent(content, postId) {\n    // no headings, no parsing\n    if (this.containsHeadings(content)) {\n      const parsedPost = new DOMParser().parseFromString(content, \"text/html\");\n\n      // direct descendants to avoid picking up headings in quotes\n      const headings = parsedPost.querySelectorAll(\n        \"body > h1,body > h2,body > h3,body > h4,body > h5\"\n      );\n\n      if (headings.length < settings.TOC_min_heading) {\n        this.setOverlayVisible(false);\n        return;\n      }\n\n      this.populateTocData(postId, content, headings);\n    } else {\n      this.setOverlayVisible(false);\n    }\n  }\n\n  containsHeadings(content) {\n    return [\"<h1\", \"<h2\", \"<h3\", \"<h4\", \"<h5\"].some((tag) =>\n      content.includes(tag)\n    );\n  }\n\n  populateTocData(postId, content, headings) {\n    this.hasTOC = true;\n    this.postID = postId;\n    this.postContent = content;\n    this.tocStructure = this.generateTocStructure(headings);\n  }\n\n  autoTOC(topic) {\n    // check topic for categories or tags from settings\n    const autoCategories = settings.auto_TOC_categories\n      ? settings.auto_TOC_categories.split(\"|\").map((id) => parseInt(id, 10))\n      : [];\n\n    const autoTags = settings.auto_TOC_tags\n      ? settings.auto_TOC_tags.split(\"|\")\n      : [];\n\n    if ((!autoCategories.length && !autoTags.length) || !topic) {\n      return false;\n    }\n\n    const topicCategory = topic.category_id;\n    const topicTags = topic.tags || [];\n\n    const hasMatchingTags = autoTags.some((tag) => topicTags.includes(tag));\n    const hasMatchingCategory = autoCategories.includes(topicCategory);\n\n    // only apply autoTOC on first post\n    // the docs plugin only shows the first post, and does not have topic.currentPost defined\n    return (\n      (hasMatchingTags || hasMatchingCategory) &&\n      (topic.currentPost === 1 || topic.currentPost === undefined)\n    );\n  }\n\n  /**\n   * @param {number} postId\n   * @param {HTMLHeadingElement} heading\n   * @param {Map<string, number>} sameIdCount\n   */\n  getIdFromHeading(postId, heading, sameIdCount) {\n    const anchor = heading.querySelector(\"a.anchor\");\n    if (anchor) {\n      return anchor.name;\n    }\n    const lowerTagName = heading.tagName.toLowerCase();\n    const text = heading.textContent.trim();\n    let slug = `${slugify(text)}`;\n    if (sameIdCount.has(slug)) {\n      sameIdCount.set(slug, sameIdCount.get(slug) + 1);\n      slug = `${slug}-${sameIdCount.get(slug)}`;\n    } else {\n      sameIdCount.set(slug, 1);\n    }\n    const res = `p-${postId}-toc-${lowerTagName}-${slug}`;\n    heading.id = res;\n    return res;\n  }\n\n  generateTocStructure(headings) {\n    let root = { subItems: [], level: 0 };\n    let ancestors = [root];\n\n    const sameIdCount = new Map();\n\n    headings.forEach((heading) => {\n      const level = parseInt(heading.tagName[1], 10);\n      const text = heading.textContent.trim();\n      const lowerTagName = heading.tagName.toLowerCase();\n\n      const id = this.getIdFromHeading(this.postID, heading, sameIdCount);\n\n      // Remove irrelevant ancestors\n      while (ancestors[ancestors.length - 1].level >= level) {\n        ancestors.pop();\n      }\n\n      let headingData = {\n        id,\n        tagName: lowerTagName,\n        text,\n        subItems: [],\n        level,\n        parent: ancestors.length > 1 ? ancestors[ancestors.length - 1] : null,\n      };\n\n      ancestors[ancestors.length - 1].subItems.push(headingData);\n      ancestors.push(headingData);\n    });\n\n    return root.subItems;\n  }\n\n  jumpToEnd(renderTimeline, postID) {\n    let buffer = 150;\n    const postContainer = document.querySelector(`[data-post-id=\"${postID}\"]`);\n\n    if (!renderTimeline) {\n      this.setOverlayVisible(false);\n    }\n\n    if (postContainer) {\n      // if the topic map is present, we don't want to scroll past it\n      // so the post controls are still visible\n      const topicMapHeight =\n        postContainer.querySelector(`.topic-map`)?.offsetHeight || 0;\n\n      if (\n        postContainer.parentElement?.nextElementSibling?.querySelector(\n          \"div[data-theme-toc]\"\n        )\n      ) {\n        // but if the next post also has a toc, just jump to it\n        buffer = 30 - topicMapHeight;\n      }\n\n      const offsetPosition =\n        postContainer.getBoundingClientRect().bottom +\n        window.scrollY -\n        buffer -\n        topicMapHeight;\n\n      window.scrollTo({ top: offsetPosition, behavior: \"smooth\" });\n    }\n  }\n}\n","import \"virtual:init-settings\";\n\nconst themeCompatModules = {};\nimport * as Mod1 from \"./discourse/components/toc-contents\";\nthemeCompatModules[\"discourse/components/toc-contents\"] = Mod1;\n\nimport * as Mod2 from \"./discourse/components/toc-heading\";\nthemeCompatModules[\"discourse/components/toc-heading\"] = Mod2;\n\nimport * as Mod3 from \"./discourse/components/toc-large-buttons\";\nthemeCompatModules[\"discourse/components/toc-large-buttons\"] = Mod3;\n\nimport * as Mod4 from \"./discourse/components/toc-mini-buttons\";\nthemeCompatModules[\"discourse/components/toc-mini-buttons\"] = Mod4;\n\nimport * as Mod5 from \"./discourse/components/toc-mini\";\nthemeCompatModules[\"discourse/components/toc-mini\"] = Mod5;\n\nimport * as Mod6 from \"./discourse/components/toc-timeline\";\nthemeCompatModules[\"discourse/components/toc-timeline\"] = Mod6;\n\nimport * as Mod7 from \"./discourse/components/toc-toggle\";\nthemeCompatModules[\"discourse/components/toc-toggle\"] = Mod7;\n\nimport * as Mod8 from \"./discourse/connectors/below-docs-topic/d-toc-wrapper\";\nthemeCompatModules[\"discourse/connectors/below-docs-topic/d-toc-wrapper\"] = Mod8;\n\nimport * as Mod9 from \"./discourse/connectors/topic-navigation/d-toc-wrapper\";\nthemeCompatModules[\"discourse/connectors/topic-navigation/d-toc-wrapper\"] = Mod9;\n\nimport * as Mod10 from \"./discourse/initializers/disco-toc-composer\";\nthemeCompatModules[\"discourse/initializers/disco-toc-composer\"] = Mod10;\n\nimport * as Mod11 from \"./discourse/initializers/init-toc-mini\";\nthemeCompatModules[\"discourse/initializers/init-toc-mini\"] = Mod11;\n\nimport * as Mod12 from \"./discourse/initializers/init-toc-toggle\";\nthemeCompatModules[\"discourse/initializers/init-toc-toggle\"] = Mod12;\n\nimport * as Mod13 from \"./discourse/services/toc-processor\";\nthemeCompatModules[\"discourse/services/toc-processor\"] = Mod13;\n\nexport default themeCompatModules;\n"],"names":["registerSettings","minimum_trust_level_to_create_TOC","composer_toc_text","auto_TOC_categories","auto_TOC_tags","enable_TOC_for_replies","TOC_min_heading","theme_uploads","settings","getObjectForTheme","themePrefix","key","TocHeading","Component","static","dt7948","g","this","prototype","service","tocProcessor","i","isActive","args","activeHeadingId","item","id","isAncestorActive","activeAncestorIds","includes","classNames","typeClass","tagName","activeClass","handleTocLinkClick","event","preventDefault","targetId","target","href","split","pop","targetElement","document","querySelector","getElementById","headerOffsetValue","headerOffset","offsetPosition","getBoundingClientRect","top","window","pageYOffset","scrollTo","behavior","setOverlayVisible","n","action","setComponentTemplate","createTemplateFactory","block","moduleName","scope","concat","slugify","on","isStrictMode","TocLargeButtons","callJumpToEnd","jumpToEnd","renderTimeline","postID","DButton","i18n","TocMiniButtons","callCloseOverlay","TocContents","appEvents","tracked","headingPositions","willDestroy","super","arguments","removeEventListener","updateActiveHeadingOnScroll","calculateHeadingPositions","off","mappedToc","mappedTocStructure","tocStructure","setup","listenForScroll","listenForPostChange","listenForResize","updateHeadingPositions","addEventListener","debounce","postElement","headings","querySelectorAll","length","sameIdCount","Map","Array","from","map","heading","getIdFromHeading","position","scrollY","compact","scrollPosition","activeIndex","low","high","mid","Math","floor","activeHeading","ancestor","parent","push","undefined","subItems","didInsert","didUpdate","TocMini","removeClickOutsideListener","clickOutside","addClickOutsideListener","toggleTOCOverlay","toggleOverlay","isOverlayVisible","TocToggle","shouldShow","isDocs","topic","posts_count","hasTOC","toggleLabel","isTocVisible","toggleIcon","TocTimeline","localStorage","getItem","shouldRenderToc","isTopicProgress","topicProgressExpanded","callCheckPostforTOC","checkPostforTOC","handleTimelineUpdate","bodyClass","DTocWrapper","c","discoTocComposer","name","initialize","withPluginApi","api","currentUser","getCurrentUser","minimumTL","trust_level","staff","I18n","translations","currentLocale","js","composer","contains_dtoc","addComposerToolbarPopupMenuOption","toolbarEvent","applySurround","icon","label","condition","model","topicFirstPost","body","classList","add","initTocMini","apiInitializer","renderInOutlet","initTocToggle","TocProcessor","Service","router","postContent","toggleTocVisibility","setItem","visible","tocWrapper","toggle","isValidTopic","shouldDisplayToc","getCurrentPost","content","cooked","containsTocMarkup","autoTOC","processPostContent","docs","currentRouteName","post_stream","posts","postStream","find","post","post_number","currentPost","postId","containsHeadings","DOMParser","parseFromString","populateTocData","some","tag","generateTocStructure","autoCategories","parseInt","autoTags","topicCategory","category_id","topicTags","tags","hasMatchingTags","hasMatchingCategory","anchor","lowerTagName","toLowerCase","text","textContent","trim","slug","has","set","get","res","root","level","ancestors","forEach","headingData","buffer","postContainer","topicMapHeight","offsetHeight","parentElement","nextElementSibling","bottom","themeCompatModules","Mod1","Mod2","Mod3","Mod4","Mod5","Mod6","Mod7","Mod8","Mod9","Mod10","Mod11","Mod12","Mod13"],"mappings":"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"}