{"version":3,"sources":["jsdelivr-header.js","/npm/hexo-theme-next@8.13.0/source/js/utils.js"],"names":[],"mappings":"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","file":"/npm/hexo-theme-next@8.13.0/source/js/utils.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/hexo-theme-next@8.13.0/source/js/utils.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/* global NexT, CONFIG */\n\nHTMLElement.prototype.wrap = function(wrapper) {\n  this.parentNode.insertBefore(wrapper, this);\n  this.parentNode.removeChild(this);\n  wrapper.appendChild(this);\n};\n\n(function() {\n  const onPageLoaded = () => document.dispatchEvent(\n    new Event('page:loaded', {\n      bubbles: true\n    })\n  );\n\n  if (document.readyState === 'loading') {\n    document.addEventListener('readystatechange', onPageLoaded, { once: true });\n  } else {\n    onPageLoaded();\n  }\n  document.addEventListener('pjax:success', onPageLoaded);\n})();\n\nNexT.utils = {\n\n  registerExtURL: function() {\n    document.querySelectorAll('span.exturl').forEach(element => {\n      const link = document.createElement('a');\n      // https://stackoverflow.com/questions/30106476/using-javascripts-atob-to-decode-base64-doesnt-properly-decode-utf-8-strings\n      link.href = decodeURIComponent(atob(element.dataset.url).split('').map(c => {\n        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n      }).join(''));\n      link.rel = 'noopener external nofollow noreferrer';\n      link.target = '_blank';\n      link.className = element.className;\n      link.title = element.title;\n      link.innerHTML = element.innerHTML;\n      element.parentNode.replaceChild(link, element);\n    });\n  },\n\n  /**\n   * One-click copy code support.\n   */\n  registerCopyCode: function() {\n    let figure = document.querySelectorAll('figure.highlight');\n    if (figure.length === 0) figure = document.querySelectorAll('pre:not(.mermaid)');\n    figure.forEach(element => {\n      element.querySelectorAll('.code .line span').forEach(span => {\n        span.classList.forEach(name => {\n          span.classList.replace(name, `hljs-${name}`);\n        });\n      });\n      if (!CONFIG.copycode.enable) return;\n      let target = element;\n      if (CONFIG.copycode.style !== 'mac') target = element.querySelector('.table-container') || element;\n      target.insertAdjacentHTML('beforeend', '<div class=\"copy-btn\"><i class=\"fa fa-copy fa-fw\"></i></div>');\n      const button = element.querySelector('.copy-btn');\n      button.addEventListener('click', () => {\n        const lines = element.querySelector('.code') || element.querySelector('code');\n        const code = lines.innerText;\n        if (navigator.clipboard) {\n          // https://caniuse.com/mdn-api_clipboard_writetext\n          navigator.clipboard.writeText(code).then(() => {\n            button.querySelector('i').className = 'fa fa-check-circle fa-fw';\n          }, () => {\n            button.querySelector('i').className = 'fa fa-times-circle fa-fw';\n          });\n        } else {\n          const ta = document.createElement('textarea');\n          ta.style.top = window.scrollY + 'px'; // Prevent page scrolling\n          ta.style.position = 'absolute';\n          ta.style.opacity = '0';\n          ta.readOnly = true;\n          ta.value = code;\n          document.body.append(ta);\n          ta.select();\n          ta.setSelectionRange(0, code.length);\n          ta.readOnly = false;\n          const result = document.execCommand('copy');\n          button.querySelector('i').className = result ? 'fa fa-check-circle fa-fw' : 'fa fa-times-circle fa-fw';\n          ta.blur(); // For iOS\n          button.blur();\n          document.body.removeChild(ta);\n        }\n      });\n      element.addEventListener('mouseleave', () => {\n        setTimeout(() => {\n          button.querySelector('i').className = 'fa fa-copy fa-fw';\n        }, 300);\n      });\n    });\n  },\n\n  wrapTableWithBox: function() {\n    document.querySelectorAll('table').forEach(element => {\n      const box = document.createElement('div');\n      box.className = 'table-container';\n      element.wrap(box);\n    });\n  },\n\n  registerVideoIframe: function() {\n    document.querySelectorAll('iframe').forEach(element => {\n      const supported = [\n        'www.youtube.com',\n        'player.vimeo.com',\n        'player.youku.com',\n        'player.bilibili.com',\n        'www.tudou.com'\n      ].some(host => element.src.includes(host));\n      if (supported && !element.parentNode.matches('.video-container')) {\n        const box = document.createElement('div');\n        box.className = 'video-container';\n        element.wrap(box);\n        const width = Number(element.width);\n        const height = Number(element.height);\n        if (width && height) {\n          box.style.paddingTop = (height / width * 100) + '%';\n        }\n      }\n    });\n  },\n\n  registerScrollPercent: function() {\n    const backToTop = document.querySelector('.back-to-top');\n    const readingProgressBar = document.querySelector('.reading-progress-bar');\n    // For init back to top in sidebar if page was scrolled after page refresh.\n    window.addEventListener('scroll', () => {\n      if (backToTop || readingProgressBar) {\n        const contentHeight = document.body.scrollHeight - window.innerHeight;\n        const scrollPercent = contentHeight > 0 ? Math.min(100 * window.scrollY / contentHeight, 100) : 0;\n        if (backToTop) {\n          backToTop.classList.toggle('back-to-top-on', Math.round(scrollPercent) >= 5);\n          backToTop.querySelector('span').innerText = Math.round(scrollPercent) + '%';\n        }\n        if (readingProgressBar) {\n          readingProgressBar.style.setProperty('--progress', scrollPercent.toFixed(2) + '%');\n        }\n      }\n      if (!Array.isArray(NexT.utils.sections)) return;\n      let index = NexT.utils.sections.findIndex(element => {\n        return element && element.getBoundingClientRect().top > 10;\n      });\n      if (index === -1) {\n        index = NexT.utils.sections.length - 1;\n      } else if (index > 0) {\n        index--;\n      }\n      this.activateNavByIndex(index);\n    }, { passive: true });\n\n    backToTop && backToTop.addEventListener('click', () => {\n      window.anime({\n        targets  : document.scrollingElement,\n        duration : 500,\n        easing   : 'linear',\n        scrollTop: 0\n      });\n    });\n  },\n\n  /**\n   * Tabs tag listener (without twitter bootstrap).\n   */\n  registerTabsTag: function() {\n    // Binding `nav-tabs` & `tab-content` by real time permalink changing.\n    document.querySelectorAll('.tabs ul.nav-tabs .tab').forEach(element => {\n      element.addEventListener('click', event => {\n        event.preventDefault();\n        // Prevent selected tab to select again.\n        if (element.classList.contains('active')) return;\n        const nav = element.parentNode;\n        // Add & Remove active class on `nav-tabs` & `tab-content`.\n        [...nav.children].forEach(target => {\n          target.classList.toggle('active', target === element);\n        });\n        // https://stackoverflow.com/questions/20306204/using-queryselector-with-ids-that-are-numbers\n        const tActive = document.getElementById(element.querySelector('a').getAttribute('href').replace('#', ''));\n        [...tActive.parentNode.children].forEach(target => {\n          target.classList.toggle('active', target === tActive);\n        });\n        // Trigger event\n        tActive.dispatchEvent(new Event('tabs:click', {\n          bubbles: true\n        }));\n        if (!CONFIG.stickytabs) return;\n        const offset = nav.parentNode.getBoundingClientRect().top + window.scrollY + 10;\n        window.anime({\n          targets  : document.scrollingElement,\n          duration : 500,\n          easing   : 'linear',\n          scrollTop: offset\n        });\n      });\n    });\n\n    window.dispatchEvent(new Event('tabs:register'));\n  },\n\n  registerCanIUseTag: function() {\n    // Get responsive height passed from iframe.\n    window.addEventListener('message', ({ data }) => {\n      if (typeof data === 'string' && data.includes('ciu_embed')) {\n        const featureID = data.split(':')[1];\n        const height = data.split(':')[2];\n        document.querySelector(`iframe[data-feature=${featureID}]`).style.height = parseInt(height, 10) + 5 + 'px';\n      }\n    }, false);\n  },\n\n  registerActiveMenuItem: function() {\n    document.querySelectorAll('.menu-item a[href]').forEach(target => {\n      const isSamePath = target.pathname === location.pathname || target.pathname === location.pathname.replace('index.html', '');\n      const isSubPath = !CONFIG.root.startsWith(target.pathname) && location.pathname.startsWith(target.pathname);\n      target.classList.toggle('menu-item-active', target.hostname === location.hostname && (isSamePath || isSubPath));\n    });\n  },\n\n  registerLangSelect: function() {\n    const selects = document.querySelectorAll('.lang-select');\n    selects.forEach(sel => {\n      sel.value = CONFIG.page.lang;\n      sel.addEventListener('change', () => {\n        const target = sel.options[sel.selectedIndex];\n        document.querySelectorAll('.lang-select-label span').forEach(span => {\n          span.innerText = target.text;\n        });\n        // Disable Pjax to force refresh translation of menu item\n        window.location.href = target.dataset.href;\n      });\n    });\n  },\n\n  registerSidebarTOC: function() {\n    this.sections = [...document.querySelectorAll('.post-toc li a.nav-link')].map(element => {\n      const target = document.getElementById(decodeURI(element.getAttribute('href')).replace('#', ''));\n      // TOC item animation navigate.\n      element.addEventListener('click', event => {\n        event.preventDefault();\n        const offset = target.getBoundingClientRect().top + window.scrollY;\n        window.anime({\n          targets  : document.scrollingElement,\n          duration : 500,\n          easing   : 'linear',\n          scrollTop: offset,\n          complete : () => {\n            history.pushState(null, document.title, element.href);\n          }\n        });\n      });\n      return target;\n    });\n  },\n\n  registerPostReward: function() {\n    const button = document.querySelector('.reward-container button');\n    if (!button) return;\n    button.addEventListener('click', () => {\n      document.querySelector('.post-reward').classList.toggle('active');\n    });\n  },\n\n  activateNavByIndex: function(index) {\n    const target = document.querySelectorAll('.post-toc li a.nav-link')[index];\n    if (!target || target.classList.contains('active-current')) return;\n\n    document.querySelectorAll('.post-toc .active').forEach(element => {\n      element.classList.remove('active', 'active-current');\n    });\n    target.classList.add('active', 'active-current');\n    let parent = target.parentNode;\n    while (!parent.matches('.post-toc')) {\n      if (parent.matches('li')) parent.classList.add('active');\n      parent = parent.parentNode;\n    }\n    // Scrolling to center active TOC element if TOC content is taller then viewport.\n    const tocElement = document.querySelector('.sidebar-panel-container');\n    if (!tocElement.parentNode.classList.contains('sidebar-toc-active')) return;\n    window.anime({\n      targets  : tocElement,\n      duration : 200,\n      easing   : 'linear',\n      scrollTop: tocElement.scrollTop - (tocElement.offsetHeight / 2) + target.getBoundingClientRect().top - tocElement.getBoundingClientRect().top\n    });\n  },\n\n  updateSidebarPosition: function() {\n    if (window.innerWidth < 992 || CONFIG.scheme === 'Pisces' || CONFIG.scheme === 'Gemini') return;\n    // Expand sidebar on post detail page by default, when post has a toc.\n    const hasTOC = document.querySelector('.post-toc');\n    let display = CONFIG.page.sidebar;\n    if (typeof display !== 'boolean') {\n      // There's no definition sidebar in the page front-matter.\n      display = CONFIG.sidebar.display === 'always' || (CONFIG.sidebar.display === 'post' && hasTOC);\n    }\n    if (display) {\n      window.dispatchEvent(new Event('sidebar:show'));\n    }\n  },\n\n  activateSidebarPanel: function(index) {\n    const duration = 200;\n    const sidebar = document.querySelector('.sidebar-inner');\n    const panel = document.querySelector('.sidebar-panel-container');\n    const activeClassName = ['sidebar-toc-active', 'sidebar-overview-active'];\n\n    if (sidebar.classList.contains(activeClassName[index])) return;\n\n    window.anime({\n      duration,\n      targets   : panel,\n      easing    : 'linear',\n      opacity   : 0,\n      translateY: [0, -20],\n      complete  : () => {\n        // Prevent adding TOC to Overview if Overview was selected when close & open sidebar.\n        sidebar.classList.replace(activeClassName[1 - index], activeClassName[index]);\n        window.anime({\n          duration,\n          targets   : panel,\n          easing    : 'linear',\n          opacity   : [0, 1],\n          translateY: [-20, 0]\n        });\n      }\n    });\n  },\n\n  getScript: function(src, options = {}, legacyCondition) {\n    if (typeof options === 'function') {\n      return this.getScript(src, {\n        condition: legacyCondition\n      }).then(options);\n    }\n    const {\n      condition = false,\n      attributes: {\n        id = '',\n        async = false,\n        defer = false,\n        crossOrigin = '',\n        dataset = {},\n        ...otherAttributes\n      } = {},\n      parentNode = null\n    } = options;\n    return new Promise((resolve, reject) => {\n      if (condition) {\n        resolve();\n      } else {\n        const script = document.createElement('script');\n\n        if (id) script.id = id;\n        if (crossOrigin) script.crossOrigin = crossOrigin;\n        script.async = async;\n        script.defer = defer;\n        Object.assign(script.dataset, dataset);\n        Object.entries(otherAttributes).forEach(([name, value]) => {\n          script.setAttribute(name, String(value));\n        });\n\n        script.onload = resolve;\n        script.onerror = reject;\n\n        if (typeof src === 'object') {\n          const { url, integrity } = src;\n          script.src = url;\n          if (integrity) {\n            script.integrity = integrity;\n            script.crossOrigin = 'anonymous';\n          }\n        } else {\n          script.src = src;\n        }\n        (parentNode || document.head).appendChild(script);\n      }\n    });\n  },\n\n  loadComments: function(selector, legacyCallback) {\n    if (legacyCallback) {\n      return this.loadComments(selector).then(legacyCallback);\n    }\n    return new Promise(resolve => {\n      const element = document.querySelector(selector);\n      if (!CONFIG.comments.lazyload || !element) {\n        resolve();\n        return;\n      }\n      const intersectionObserver = new IntersectionObserver((entries, observer) => {\n        const entry = entries[0];\n        if (!entry.isIntersecting) return;\n\n        resolve();\n        observer.disconnect();\n      });\n      intersectionObserver.observe(element);\n    });\n  }\n};\n"]}