{"version":3,"file":"virtual_main.js","sources":["theme-4/virtual:init-settings","theme-4/virtual:theme","theme-4/discourse/components/toc-heading.gjs","theme-4/discourse/components/toc-large-buttons.gjs","theme-4/discourse/components/toc-mini-buttons.gjs","theme-4/discourse/components/toc-contents.gjs","theme-4/discourse/components/toc-mini.gjs","theme-4/discourse/components/toc-toggle.gjs","theme-4/discourse/components/toc-timeline.gjs","theme-4/discourse/connectors/below-docs-topic/d-toc-wrapper.gjs","theme-4/discourse/connectors/topic-navigation/d-toc-wrapper.gjs","theme-4/discourse/initializers/disco-toc-composer.js","theme-4/discourse/initializers/init-toc-mini.js","theme-4/discourse/initializers/init-toc-toggle.js","theme-4/discourse/services/toc-processor.js","theme-4/virtual:main"],"sourcesContent":["import { registerSettings } from \"discourse/lib/theme-settings-store\";\n\nregisterSettings(4, {\n  \"minimum_trust_level_to_create_TOC\": 0,\n  \"composer_toc_text\": \"This topic will contain a table of contents\",\n  \"auto_TOC_categories\": \"5|16|30|17\",\n  \"auto_TOC_tags\": \"\",\n  \"enable_TOC_for_replies\": false,\n  \"TOC_min_heading\": 3,\n  \"theme_uploads\": {\n    \"icons-sprite\": \"/uploads/default/original/1X/292be3c6fe014e7eb9620ab5cfe253f811c12214.svg\"\n  }\n});\n","import { getObjectForTheme } from \"discourse/lib/theme-settings-store\";\n\nexport const settings = getObjectForTheme(4);\n\nexport function themePrefix(key) {\n  return `theme_translations.4.${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.gjs\";\nthemeCompatModules[\"discourse/connectors/below-docs-topic/d-toc-wrapper\"] = Mod8;\n\nimport * as Mod9 from \"./discourse/connectors/topic-navigation/d-toc-wrapper.gjs\";\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","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","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","undefined","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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"}