{"version":3,"sources":["jsdelivr-header.js","/npm/hexo-theme-butterfly@5.7.0/source/js/utils.js"],"names":[],"mappings":"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","file":"/npm/hexo-theme-butterfly@5.7.0/source/js/utils.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.48.0.\n * Original file: /npm/hexo-theme-butterfly@5.7.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","(() => {\r\n  const btfFn = {\r\n    debounce: (func, wait = 0, immediate = false) => {\r\n      let timeout\r\n      return (...args) => {\r\n        const later = () => {\r\n          timeout = null\r\n          if (!immediate) func(...args)\r\n        }\r\n        const callNow = immediate && !timeout\r\n        clearTimeout(timeout)\r\n        timeout = setTimeout(later, wait)\r\n        if (callNow) func(...args)\r\n      }\r\n    },\r\n\r\n    throttle: (func, wait, options = {}) => {\r\n      let timeout, args\r\n      let previous = 0\r\n\r\n      const later = () => {\r\n        previous = options.leading === false ? 0 : new Date().getTime()\r\n        timeout = null\r\n        func(...args)\r\n        if (!timeout) args = null\r\n      }\r\n\r\n      return (...params) => {\r\n        const now = new Date().getTime()\r\n        if (!previous && options.leading === false) previous = now\r\n        const remaining = wait - (now - previous)\r\n        args = params\r\n\r\n        if (remaining <= 0 || remaining > wait) {\r\n          if (timeout) {\r\n            clearTimeout(timeout)\r\n            timeout = null\r\n          }\r\n          previous = now\r\n          func(...args)\r\n          if (!timeout) args = null\r\n        } else if (!timeout && options.trailing !== false) {\r\n          timeout = setTimeout(later, remaining)\r\n        }\r\n      }\r\n    },\r\n\r\n    rafThrottle: fn => {\r\n      let rafId = null\r\n      return (...args) => {\r\n        if (rafId) return\r\n        rafId = requestAnimationFrame(() => {\r\n          fn(...args)\r\n          rafId = null\r\n        })\r\n      }\r\n    },\r\n\r\n    overflowPaddingR: (() => {\r\n      let headerElement = null\r\n      let menuElement = null\r\n\r\n      const getElements = () => {\r\n        if (!headerElement) {\r\n          headerElement = document.getElementById('page-header')\r\n        }\r\n        if (!menuElement) {\r\n          menuElement = document.getElementById('menus')\r\n        }\r\n        return { headerElement, menuElement }\r\n      }\r\n\r\n      return {\r\n        add: () => {\r\n          const paddingRight = window.innerWidth - document.body.clientWidth\r\n\r\n          if (paddingRight > 0) {\r\n            document.body.style.paddingRight = `${paddingRight}px`\r\n            document.body.style.overflow = 'hidden'\r\n            const { headerElement: header, menuElement: menu } = getElements()\r\n            if (header && menu && header.classList.contains('nav-fixed')) {\r\n              menu.style.paddingRight = `${paddingRight}px`\r\n            }\r\n          }\r\n        },\r\n        remove: () => {\r\n          document.body.style.paddingRight = ''\r\n          document.body.style.overflow = ''\r\n          const { headerElement: header, menuElement: menu } = getElements()\r\n          if (header && menu && header.classList.contains('nav-fixed')) {\r\n            menu.style.paddingRight = ''\r\n          }\r\n        }\r\n      }\r\n    })(),\r\n\r\n    snackbarShow: (text, showAction = false, duration = 2000) => {\r\n      const { position, bgLight, bgDark } = GLOBAL_CONFIG.Snackbar\r\n      const bg = document.documentElement.getAttribute('data-theme') === 'light' ? bgLight : bgDark\r\n      Snackbar.show({\r\n        text,\r\n        backgroundColor: bg,\r\n        showAction,\r\n        duration,\r\n        pos: position,\r\n        customClass: 'snackbar-css'\r\n      })\r\n    },\r\n\r\n    diffDate: (inputDate, more = false) => {\r\n      const dateNow = new Date()\r\n      const datePost = new Date(inputDate)\r\n      const diffMs = dateNow - datePost\r\n      const diffSec = diffMs / 1000\r\n      const diffMin = diffSec / 60\r\n      const diffHour = diffMin / 60\r\n      const diffDay = diffHour / 24\r\n      const diffMonth = diffDay / 30\r\n      const { dateSuffix } = GLOBAL_CONFIG\r\n\r\n      if (!more) return Math.floor(diffDay)\r\n\r\n      if (diffMonth > 12) return datePost.toISOString().slice(0, 10)\r\n      if (diffMonth >= 1) return `${Math.floor(diffMonth)} ${dateSuffix.month}`\r\n      if (diffDay >= 1) return `${Math.floor(diffDay)} ${dateSuffix.day}`\r\n      if (diffHour >= 1) return `${Math.floor(diffHour)} ${dateSuffix.hour}`\r\n      if (diffMin >= 1) return `${Math.floor(diffMin)} ${dateSuffix.min}`\r\n      return dateSuffix.just\r\n    },\r\n\r\n    loadComment: (dom, callback) => {\r\n      if ('IntersectionObserver' in window) {\r\n        const observerItem = new IntersectionObserver(entries => {\r\n          if (entries[0].isIntersecting) {\r\n            callback()\r\n            observerItem.disconnect()\r\n          }\r\n        }, { threshold: [0] })\r\n        observerItem.observe(dom)\r\n      } else {\r\n        callback()\r\n      }\r\n    },\r\n\r\n    scrollToDest: (pos, time = 500) => {\r\n      const currentPos = window.scrollY\r\n      const isNavFixed = document.getElementById('page-header').classList.contains('fixed')\r\n      if (currentPos > pos || isNavFixed) pos = pos - 70\r\n\r\n      if ('scrollBehavior' in document.documentElement.style) {\r\n        window.scrollTo({\r\n          top: pos,\r\n          behavior: 'smooth'\r\n        })\r\n        return\r\n      }\r\n\r\n      const startTime = performance.now()\r\n      const animate = currentTime => {\r\n        const timeElapsed = currentTime - startTime\r\n        const progress = Math.min(timeElapsed / time, 1)\r\n        const easedProgress = 1 - Math.pow(1 - progress, 4) // easeOutQuart\r\n        window.scrollTo(0, currentPos + (pos - currentPos) * easedProgress)\r\n        if (progress < 1) {\r\n          requestAnimationFrame(animate)\r\n        }\r\n      }\r\n      requestAnimationFrame(animate)\r\n    },\r\n\r\n    animateIn: (ele, animation) => {\r\n      ele.style.display = 'block'\r\n      ele.style.animation = animation\r\n    },\r\n\r\n    animateOut: (ele, animation) => {\r\n      const handleAnimationEnd = () => {\r\n        ele.style.display = ''\r\n        ele.style.animation = ''\r\n        ele.removeEventListener('animationend', handleAnimationEnd)\r\n      }\r\n      ele.addEventListener('animationend', handleAnimationEnd)\r\n      ele.style.animation = animation\r\n    },\r\n\r\n    wrap: (selector, eleType, options) => {\r\n      const createEle = document.createElement(eleType)\r\n      for (const [key, value] of Object.entries(options)) {\r\n        createEle.setAttribute(key, value)\r\n      }\r\n      selector.parentNode.insertBefore(createEle, selector)\r\n      createEle.appendChild(selector)\r\n    },\r\n\r\n    isHidden: ele => ele.offsetHeight === 0 && ele.offsetWidth === 0,\r\n\r\n    getEleTop: ele => ele.getBoundingClientRect().top + window.scrollY,\r\n\r\n    loadLightbox: ele => {\r\n      const service = GLOBAL_CONFIG.lightbox\r\n\r\n      if (service === 'medium_zoom') {\r\n        mediumZoom(ele, { background: 'var(--zoom-bg)' })\r\n        return\r\n      }\r\n\r\n      if (service === 'fancybox') {\r\n        ele.forEach(i => {\r\n          if (i.parentNode.tagName !== 'A') {\r\n            const dataSrc = i.dataset.lazySrc || i.src\r\n            const dataCaption = i.title || i.alt || ''\r\n            btf.wrap(i, 'a', { href: dataSrc, 'data-fancybox': 'gallery', 'data-caption': dataCaption, 'data-thumb': dataSrc })\r\n          }\r\n        })\r\n\r\n        if (!window.fancyboxRun) {\r\n          let options = ''\r\n          if (Fancybox.version < '6') {\r\n            options = {\r\n              Hash: false,\r\n              Thumbs: {\r\n                showOnStart: false\r\n              },\r\n              Images: {\r\n                Panzoom: {\r\n                  maxScale: 4\r\n                }\r\n              },\r\n              Carousel: {\r\n                transition: 'slide'\r\n              },\r\n              Toolbar: {\r\n                display: {\r\n                  left: ['infobar'],\r\n                  middle: [\r\n                    'zoomIn',\r\n                    'zoomOut',\r\n                    'toggle1to1',\r\n                    'rotateCCW',\r\n                    'rotateCW',\r\n                    'flipX',\r\n                    'flipY'\r\n                  ],\r\n                  right: ['slideshow', 'thumbs', 'close']\r\n                }\r\n              },\r\n              hideScrollbar: false\r\n            }\r\n          } else {\n            options = {\r\n              Hash: false,\r\n              Carousel: {\r\n                transition: 'slide',\r\n                Thumbs: {\r\n                  showOnStart: false\r\n                },\r\n                Toolbar: {\r\n                  display: {\r\n                    left: ['counter'],\r\n                    middle: [\r\n                      'zoomIn',\r\n                      'zoomOut',\r\n                      'toggle1to1',\r\n                      'rotateCCW',\r\n                      'rotateCW',\r\n                      'flipX',\r\n                      'flipY',\r\n                      'reset'\r\n                    ],\r\n                    right: ['autoplay', 'thumbs', 'close']\r\n                  }\r\n                },\r\n                Zoomable: {\r\n                  Panzoom: {\r\n                    maxScale: 4\r\n                  }\r\n                }\r\n              },\r\n              hideScrollbar: false\r\n            }\r\n          }\r\n\r\n          Fancybox.bind('[data-fancybox]', options)\r\n          window.fancyboxRun = true\r\n        }\r\n      }\r\n    },\r\n\r\n    setLoading: {\r\n      add: ele => {\r\n        const html = `\r\n        <div class=\"loading-container\">\r\n          <div class=\"loading-item\">\r\n            <div></div><div></div><div></div><div></div><div></div>\r\n          </div>\r\n        </div>\r\n      `\r\n        ele.insertAdjacentHTML('afterend', html)\r\n      },\r\n      remove: ele => {\r\n        ele.nextElementSibling.remove()\r\n      }\r\n    },\r\n\r\n    updateAnchor: anchor => {\r\n      if (anchor !== window.location.hash) {\r\n        if (!anchor) anchor = location.pathname\r\n        const title = GLOBAL_CONFIG_SITE.title\r\n        window.history.replaceState({\r\n          url: location.href,\r\n          title\r\n        }, title, anchor)\r\n      }\r\n    },\r\n\r\n    getScrollPercent: (() => {\r\n      let docHeight, winHeight, headerHeight, contentMath\r\n\r\n      return (currentTop, ele) => {\r\n        if (!docHeight || ele.clientHeight !== docHeight) {\r\n          docHeight = ele.clientHeight\r\n          winHeight = window.innerHeight\r\n          headerHeight = ele.offsetTop\r\n          contentMath = Math.max(docHeight - winHeight, document.documentElement.scrollHeight - winHeight)\r\n        }\r\n\r\n        const scrollPercent = (currentTop - headerHeight) / contentMath\r\n        return Math.max(0, Math.min(100, Math.round(scrollPercent * 100)))\r\n      }\r\n    })(),\r\n\r\n    addEventListenerPjax: (ele, event, fn, option = false) => {\r\n      ele.addEventListener(event, fn, option)\r\n      btf.addGlobalFn('pjaxSendOnce', () => {\r\n        ele.removeEventListener(event, fn, option)\r\n      })\r\n    },\r\n\r\n    removeGlobalFnEvent: (key, parent = window) => {\r\n      const globalFn = parent.globalFn || {}\r\n      const keyObj = globalFn[key]\r\n      if (!keyObj) return\r\n\r\n      Object.keys(keyObj).forEach(i => keyObj[i]())\r\n\r\n      delete globalFn[key]\r\n    },\r\n\r\n    switchComments: (el = document, path) => {\r\n      const switchBtn = el.querySelector('#switch-btn')\r\n      if (!switchBtn) return\r\n\r\n      let switchDone = false\r\n      const postComment = el.querySelector('#post-comment')\r\n      const handleSwitchBtn = () => {\r\n        postComment.classList.toggle('move')\r\n        if (!switchDone && typeof loadOtherComment === 'function') {\r\n          switchDone = true\r\n          loadOtherComment(el, path)\r\n        }\r\n      }\r\n      btf.addEventListenerPjax(switchBtn, 'click', handleSwitchBtn)\r\n    }\r\n  }\r\n\r\n  window.btf = { ...window.btf, ...btfFn }\r\n})()\r\n"]}