PageSourceSearch

https://hoshino-yumetsuki.github.io/js/main/navigation.js

js hoshino-yumetsuki.github.io collected 2026-10-03 09:18:30 UTC 3,714 bytes, 128 lines download raw bytes

1"use strict"
2
3window.AcrypleMainNavigation = (() => {
4  const createNavigationRuntime = () => {
5    let blogNameWidth
6    let menusWidth
7    let searchWidth
8    let navElement
9    let mobileSidebarOpen = false
10
11    const adjustMenu = (init) => {
12      if (init) {
13        const siteNameEle = document.getElementById("site-name")
14        if (!siteNameEle) return
15
16        blogNameWidth = siteNameEle.offsetWidth
17        const menusEle = document.querySelectorAll("#menus .menus_item")
18        menusWidth = 0
19        menusEle.forEach((item) => {
20          menusWidth += item.offsetWidth
21        })
22
23        const searchEle = document.querySelector("#search-button")
24        searchWidth = searchEle ? searchEle.offsetWidth : 0
25        navElement = document.getElementById("nav")
26        if (!navElement) return
27      }
28
29      if (!navElement) return
30
31      let hideMenuIndex = false
32      if (window.innerWidth < 768) {
33        hideMenuIndex = true
34      } else {
35        hideMenuIndex = blogNameWidth + menusWidth + searchWidth > navElement.offsetWidth - 120
36      }
37
38      navElement.classList.toggle("hide-menu", hideMenuIndex)
39    }
40
41    const initAdjust = () => {
42      try {
43        adjustMenu(true)
44      } catch (err) {
45        console.error("Header initialization error:", err)
46      }
47    }
48
49    const sidebar = {
50      open: () => {
51        btf.sidebarPaddingR()
52        document.body.style.overflow = "hidden"
53        const menuMask = document.getElementById("menu-mask")
54        const sidebarMenus = document.getElementById("sidebar-menus")
55        if (menuMask) btf.animateIn(menuMask, "to_show 0.5s")
56        if (sidebarMenus) sidebarMenus.classList.add("open")
57        mobileSidebarOpen = true
58      },
59      close: () => {
60        const body = document.body
61        body.style.overflow = ""
62        body.style.paddingRight = ""
63        const menuMask = document.getElementById("menu-mask")
64        const sidebarMenus = document.getElementById("sidebar-menus")
65        if (menuMask) btf.animateOut(menuMask, "to_hide 0.5s")
66        if (sidebarMenus) sidebarMenus.classList.remove("open")
67        mobileSidebarOpen = false
68      },
69      isOpen: () => mobileSidebarOpen
70    }
71
72    const scrollDownInIndex = () => {
73      try {
74        const scrollDownEle = document.getElementById("scroll-down")
75        const contentInner = document.getElementById("content-inner")
76        if (scrollDownEle && contentInner) {
77          scrollDownEle.addEventListener("click", () => {
78            btf.scrollToDest(contentInner.offsetTop, 300)
79          })
80        }
81      } catch (err) {
82        console.error("Scroll down setup error:", err)
83      }
84    }
85
86    const bindSubMenu = () => {
87      document.querySelectorAll("#sidebar-menus .site-page.group").forEach((item) => {
88        item.addEventListener("click", function () {
89          this.classList.toggle("hide")
90        })
91      })
92    }
93
94    const bindPersistentEvents = () => {
95      const toggleMenu = document.getElementById("toggle-menu")
96      if (toggleMenu) toggleMenu.addEventListener("click", sidebar.open)
97
98      window.addEventListener("resize", () => {
99        adjustMenu(false)
100        const toggleMenu = document.getElementById("toggle-menu")
101        if (toggleMenu && btf.isHidden(toggleMenu) && mobileSidebarOpen) {
102          sidebar.close()
103        }
104      })
105
106      const menuMask = document.getElementById("menu-mask")
107      if (menuMask) {
108        menuMask.addEventListener("click", () => {
109          sidebar.close()
110        })
111      }
112
113      bindSubMenu()
114    }
115
116    return {
117      adjustMenu,
118      initAdjust,
119      sidebar,
120      scrollDownInIndex,
121      bindPersistentEvents
122    }
123  }
124
125  return {
126    createNavigationRuntime
127  }
128})()

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.