-
- {links.map(link => {
- if (link.show) {
- return link &&
- {link.name}
-
- } else {
- return null
- }
- })}
-
+
+ {/* {links.map(link => )} */}
+ {links.map(link => )}
+
{/* */}
diff --git a/themes/example/components/NormalMenuItem.js b/themes/example/components/NormalMenuItem.js
new file mode 100644
index 00000000..aec74837
--- /dev/null
+++ b/themes/example/components/NormalMenuItem.js
@@ -0,0 +1,14 @@
+import Link from 'next/link'
+
+/**
+ * 旧的普通菜单
+ * @param {*} props
+ * @returns
+ */
+export const NormalMenuItem = (props) => {
+ const { link } = props
+ return link?.show &&
+ {link.name}
+
+}
diff --git a/themes/hexo/components/Collapse.js b/themes/hexo/components/Collapse.js
deleted file mode 100644
index 769ac602..00000000
--- a/themes/hexo/components/Collapse.js
+++ /dev/null
@@ -1,43 +0,0 @@
-import React, { useEffect, useRef } from 'react'
-
-const Collapse = props => {
- const { id, className } = props
- const collapseRef = useRef(null)
- const collapseSection = element => {
- const sectionHeight = element.scrollHeight
- const currentHeight = element.style.height
- if (currentHeight === '0px') {
- return
- }
- requestAnimationFrame(function () {
- element.style.height = sectionHeight + 'px'
- requestAnimationFrame(function () {
- element.style.height = 0 + 'px'
- })
- })
- }
- const expandSection = element => {
- const sectionHeight = element.scrollHeight
- element.style.height = sectionHeight + 'px'
- const clearTime = setTimeout(() => {
- element.style.height = 'auto'
- }, 400)
- clearTimeout(clearTime)
- }
- useEffect(() => {
- const element = collapseRef.current
- if (props.isOpen) {
- expandSection(element)
- } else {
- collapseSection(element)
- }
- }, [props.isOpen])
- return (
-
- {props.children}
-
- )
-}
-Collapse.defaultProps = { isOpen: false }
-
-export default Collapse
diff --git a/themes/hexo/components/TopNav.js b/themes/hexo/components/TopNav.js
index 43aa5340..5e60525f 100644
--- a/themes/hexo/components/TopNav.js
+++ b/themes/hexo/components/TopNav.js
@@ -2,7 +2,6 @@ import { useGlobal } from '@/lib/global'
import Link from 'next/link'
import { useCallback, useEffect, useRef, useState } from 'react'
import CategoryGroup from './CategoryGroup'
-import Collapse from './Collapse'
import Logo from './Logo'
import SearchDrawer from './SearchDrawer'
import TagGroups from './TagGroups'
@@ -10,6 +9,7 @@ import MenuButtonGroupTop from './MenuButtonGroupTop'
import MenuList from './MenuList'
import { useRouter } from 'next/router'
import throttle from 'lodash.throttle'
+import Collapse from '@/components/Collapse'
let windowTop = 0
diff --git a/themes/matery/components/Collapse.js b/themes/matery/components/Collapse.js
deleted file mode 100644
index dffc8645..00000000
--- a/themes/matery/components/Collapse.js
+++ /dev/null
@@ -1,75 +0,0 @@
-import React from 'react'
-
-/**
- * 折叠面板组件,支持水平折叠、垂直折叠
- * @param {type:['horizontal','vertical'],isOpen} props
- * @returns
- */
-const Collapse = props => {
- const collapseRef = React.useRef(null)
- const type = props.type || 'vertical'
- const collapseSection = element => {
- const sectionHeight = element.scrollHeight
- const sectionWidth = element.scrollWidth
-
- requestAnimationFrame(function () {
- switch (type) {
- case 'horizontal':
- element.style.width = sectionWidth + 'px'
- requestAnimationFrame(function () {
- element.style.width = 0 + 'px'
- })
- break
- case 'vertical':
- element.style.height = sectionHeight + 'px'
- requestAnimationFrame(function () {
- element.style.height = 0 + 'px'
- })
- }
- })
- }
-
- /**
- * 展开
- * @param {*} element
- */
- const expandSection = element => {
- const sectionHeight = element.scrollHeight
- const sectionWidth = element.scrollWidth
- let clearTime = 0
- switch (type) {
- case 'horizontal':
- element.style.width = sectionWidth + 'px'
- clearTime = setTimeout(() => {
- element.style.width = 'auto'
- }, 400)
- break
- case 'vertical':
- element.style.height = sectionHeight + 'px'
- clearTime = setTimeout(() => {
- element.style.height = 'auto'
- }, 400)
- }
-
- clearTimeout(clearTime)
- }
-
- React.useEffect(() => {
- const element = collapseRef.current
- if (props.isOpen) {
- expandSection(element)
- } else {
- collapseSection(element)
- }
- }, [props.isOpen])
-
- return (
-
- {props.children}
-
- )
-}
-Collapse.defaultProps = { isOpen: false }
-
-export default Collapse
diff --git a/themes/next/components/Collapse.js b/themes/next/components/Collapse.js
deleted file mode 100644
index 7607b732..00000000
--- a/themes/next/components/Collapse.js
+++ /dev/null
@@ -1,38 +0,0 @@
-import React, { useEffect, useRef } from 'react'
-
-const Collapse = props => {
- const collapseRef = useRef(null)
- const collapseSection = element => {
- const sectionHeight = element.scrollHeight
- requestAnimationFrame(function () {
- element.style.height = sectionHeight + 'px'
- requestAnimationFrame(function () {
- element.style.height = 0 + 'px'
- })
- })
- }
- const expandSection = element => {
- const sectionHeight = element.scrollHeight
- element.style.height = sectionHeight + 'px'
- const clearTime = setTimeout(() => {
- element.style.height = 'auto'
- }, 400)
- clearTimeout(clearTime)
- }
- useEffect(() => {
- const element = collapseRef.current
- if (props.isOpen) {
- expandSection(element)
- } else {
- collapseSection(element)
- }
- }, [props.isOpen])
- return (
-
- {props.children}
-
- )
-}
-Collapse.defaultProps = { isOpen: false }
-
-export default Collapse
diff --git a/themes/next/components/CollapseMenu.js b/themes/next/components/CollapseMenu.js
new file mode 100644
index 00000000..e2a1b1e6
--- /dev/null
+++ b/themes/next/components/CollapseMenu.js
@@ -0,0 +1,54 @@
+import Collapse from '@/components/Collapse'
+import Link from 'next/link'
+import { useState } from 'react'
+
+/**
+ * 折叠菜单
+ * @param {*} param0
+ * @returns
+ */
+export const CollapseMenu = (props) => {
+ const { link } = props
+ const [show, changeShow] = useState(false)
+ const hasSubMenu = link?.subMenus?.length > 0
+
+ const [isOpen, changeIsOpen] = useState(false)
+
+ const toggleShow = () => {
+ changeShow(!show)
+ }
+
+ const toggleOpenSubMenu = () => {
+ changeIsOpen(!isOpen)
+ }
+
+ return <>
+
+ {!hasSubMenu &&
+
+ }
+
+ {hasSubMenu &&
}
+
+
+ {/* 折叠子菜单 */}
+ {hasSubMenu &&
+ {link.subMenus.map(sLink => {
+ return
+ })}
+ }
+ >
+}
diff --git a/themes/next/components/DropMenu.js b/themes/next/components/DropMenu.js
new file mode 100644
index 00000000..179604a0
--- /dev/null
+++ b/themes/next/components/DropMenu.js
@@ -0,0 +1,35 @@
+import Link from 'next/link'
+import { useState } from 'react'
+
+export const DropMenu = ({ link }) => {
+ const [show, changeShow] = useState(false)
+ const hasSubMenu = link?.subMenus?.length > 0
+
+ return
changeShow(true)} onMouseOut={() => changeShow(false)}
+ className='relative py-1.5 px-5 duration-300 text-base justify-between hover:bg-gray-700 hover:text-white hover:shadow-lg cursor-pointer font-light flex flex-nowrap items-center '>
+
+ {!hasSubMenu &&
+
+
+ {link.slot}
+ }
+
+ {hasSubMenu &&
+
+
+ {link.slot}
+ {hasSubMenu &&
}
+
}
+
+ {/* 子菜单 */}
+ {hasSubMenu &&
+ {link.subMenus.map(sLink => {
+ return -
+
+
{sLink.name}
+ {sLink.slot}
+
+ })}
}
+
+
+}
diff --git a/themes/next/components/MenuButtonGroup.js b/themes/next/components/MenuButtonGroup.js
index e5ef7c2c..7e525696 100644
--- a/themes/next/components/MenuButtonGroup.js
+++ b/themes/next/components/MenuButtonGroup.js
@@ -1,13 +1,13 @@
import React from 'react'
-import Link from 'next/link'
-import { useRouter } from 'next/router'
import { useGlobal } from '@/lib/global'
import CONFIG_NEXT from '../config_next'
+import BLOG from '@/blog.config'
+import { DropMenu } from './DropMenu'
+import { CollapseMenu } from './CollapseMenu'
const MenuButtonGroup = (props) => {
- const { postCount, customNav } = props
+ const { postCount, customNav, customMenu } = props
const { locale } = useGlobal()
- const router = useRouter()
const archiveSlot =
{postCount}
const defaultLinks = [
@@ -21,33 +21,23 @@ const MenuButtonGroup = (props) => {
links = defaultLinks.concat(customNav)
}
+ // 如果 开启自定义菜单,则覆盖Page生成的菜单
+ if (BLOG.CUSTOM_MENU) {
+ links = customMenu
+ }
+
return (
-
+ {/* 移动端菜单 */}
+
+ >
)
}
export default MenuButtonGroup
diff --git a/themes/next/components/SideAreaLeft.js b/themes/next/components/SideAreaLeft.js
index 0cba620e..9471d4fb 100644
--- a/themes/next/components/SideAreaLeft.js
+++ b/themes/next/components/SideAreaLeft.js
@@ -23,7 +23,7 @@ const SideAreaLeft = props => {
const { post, slot, postCount } = props
const { locale } = useGlobal()
const showToc = post && post.toc && post.toc.length > 1
- return