UNPKG

hexo-theme-redefine

Version:

Redefine your writing with Hexo Theme Redefine.

159 lines (136 loc) 3.53 kB
const navbarState = { isNavigating: false, navbarHeight: 0, }; let didInit = false; const handleScroll = () => { if (navbarState.isNavigating) { return; } const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; const shouldShrink = scrollTop > navbarState.navbarHeight; document.body.classList.toggle("navbar-shrink", shouldShrink); }; const handleSubmenuToggle = (event) => { const toggle = event.target.closest("[navbar-data-toggle]"); if (!toggle) { return false; } const target = document.querySelector( `[data-target="${toggle.getAttribute("navbar-data-toggle")}"]`, ); if (!target) { return true; } const submenuItems = target.children; const icon = toggle.querySelector(".fa-chevron-right"); const isVisible = !target.classList.contains("hidden"); if (icon) { icon.classList.toggle("icon-rotated", !isVisible); } if (typeof anime === "undefined") { target.classList.toggle("hidden", isVisible); return true; } if (isVisible) { anime({ targets: submenuItems, opacity: 0, translateY: -10, duration: 300, easing: "easeInQuart", delay: anime.stagger(80, { start: 20, direction: "reverse" }), complete: function () { target.classList.add("hidden"); }, }); } else { target.classList.remove("hidden"); anime({ targets: submenuItems, opacity: [0, 1], translateY: [10, 0], duration: 300, easing: "easeOutQuart", delay: anime.stagger(80, { start: 20 }), }); } return true; }; const handleDrawerClose = (event) => { const logoTitleDom = event.target.closest( ".navbar-container .navbar-content .logo-title", ); if (!logoTitleDom) { return false; } document.body.classList.remove("navbar-drawer-show"); return true; }; const handleDrawerToggle = (event) => { const toggleTarget = event.target.closest( ".window-mask, .navbar-bar, .navbar-drawer .drawer-navbar-list .drawer-navbar-item, .navbar-drawer .tag-count-item", ); if (!toggleTarget) { return false; } document.body.classList.toggle("navbar-drawer-show"); return true; }; const registerGlobalHandlers = (signal) => { if (didInit) { return; } didInit = true; if (signal) { window.addEventListener("scroll", handleScroll, { signal }); document.addEventListener( "click", (event) => { if (handleSubmenuToggle(event)) { return; } if (handleDrawerClose(event)) { return; } handleDrawerToggle(event); }, { signal }, ); } else { window.addEventListener("scroll", handleScroll); document.addEventListener("click", (event) => { if (handleSubmenuToggle(event)) { return; } if (handleDrawerClose(event)) { return; } handleDrawerToggle(event); }); } }; export const navbarShrink = { navbarDom: null, initGlobals({ signal } = {}) { if (signal) { registerGlobalHandlers(signal); return; } registerGlobalHandlers(); }, refresh() { this.navbarDom = document.querySelector(".navbar-container"); if (!this.navbarDom) { return; } navbarState.navbarHeight = this.navbarDom.getBoundingClientRect().height; handleScroll(); }, setNavigating(isNavigating) { navbarState.isNavigating = isNavigating; if (isNavigating) { document.body.classList.remove("navbar-shrink"); } }, };