)
}
@@ -133,9 +151,13 @@ const LayoutIndex = props => {
*/
const LayoutPostList = props => {
return (
- <>
- {siteConfig('POST_LIST_STYLE') === 'page' ?
}
- >
+ <>
+ {siteConfig('POST_LIST_STYLE') === 'page' ? (
+
+ )}
+ >
)
}
@@ -150,29 +172,34 @@ const LayoutSlug = props => {
useEffect(() => {
// 404
if (!post) {
- setTimeout(() => {
- if (isBrowser) {
- const article = document.getElementById('notion-article')
- if (!article) {
- router.push('/404').then(() => {
- console.warn('找不到页面', router.asPath)
- })
+ setTimeout(
+ () => {
+ if (isBrowser) {
+ const article = document.getElementById('notion-article')
+ if (!article) {
+ router.push('/404').then(() => {
+ console.warn('找不到页面', router.asPath)
+ })
+ }
}
- }
- }, siteConfig('POST_WAITING_TIME_FOR_404') * 1000)
+ },
+ siteConfig('POST_WAITING_TIME_FOR_404') * 1000
+ )
}
}, [post])
return (
- <>
- {lock
- ?
+ )}
+ >
)
}
@@ -181,7 +208,7 @@ const LayoutSlug = props => {
* @param {*} props
* @returns
*/
-const Layout404 = (props) => {
+const Layout404 = props => {
return <>404 Not found.>
}
@@ -220,13 +247,19 @@ const LayoutSearch = props => {
*/
const LayoutArchive = props => {
const { archivePosts } = props
- return (<>
-
- {Object.keys(archivePosts).map(archiveTitle => (
-
- ))}
-
+ >
+ )
}
/**
@@ -237,11 +270,25 @@ const LayoutArchive = props => {
const LayoutCategoryIndex = props => {
const { categoryOptions } = props
return (
- <>
-
- {categoryOptions?.map(category =>
)}
+ <>
+
+ {categoryOptions?.map(category => (
+
+
+
+ {category.name}({category.count})
- >
+
+ ))}
+
+ >
)
}
@@ -250,26 +297,39 @@ const LayoutCategoryIndex = props => {
* @param {*} props
* @returns
*/
-const LayoutTagIndex = (props) => {
+const LayoutTagIndex = props => {
const { tagOptions } = props
return (
- <>
-
- {tagOptions.map(tag => )}
-
- >
+ <>
+
+ >
)
}
export {
- CONFIG as THEME_CONFIG,
- LayoutBase,
- LayoutIndex,
- LayoutSearch,
- LayoutArchive,
- LayoutSlug,
Layout404,
- LayoutPostList,
+ LayoutArchive,
+ LayoutBase,
LayoutCategoryIndex,
- LayoutTagIndex
+ LayoutIndex,
+ LayoutPostList,
+ LayoutSearch,
+ LayoutSlug,
+ LayoutTagIndex,
+ CONFIG as THEME_CONFIG
}
diff --git a/themes/hexo/components/Header.js b/themes/hexo/components/Header.js
new file mode 100644
index 00000000..9c3da194
--- /dev/null
+++ b/themes/hexo/components/Header.js
@@ -0,0 +1,187 @@
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import throttle from 'lodash.throttle'
+import Link from 'next/link'
+import { useRouter } from 'next/router'
+import { useCallback, useEffect, useRef, useState } from 'react'
+import CONFIG from '../config'
+import CategoryGroup from './CategoryGroup'
+import Logo from './Logo'
+import { MenuListTop } from './MenuListTop'
+import SearchButton from './SearchButton'
+import SearchDrawer from './SearchDrawer'
+import SideBar from './SideBar'
+import SideBarDrawer from './SideBarDrawer'
+import TagGroups from './TagGroups'
+
+let windowTop = 0
+
+/**
+ * 顶部导航
+ * @param {*} param0
+ * @returns
+ */
+const Header = props => {
+ const searchDrawer = useRef()
+ const { tags, currentTag, categories, currentCategory } = props
+ const { locale } = useGlobal()
+ const router = useRouter()
+ const [isOpen, changeShow] = useState(false)
+ const showSearchButton = siteConfig('HEXO_MENU_SEARCH', false, CONFIG)
+
+ const toggleMenuOpen = () => {
+ changeShow(!isOpen)
+ }
+
+ const toggleSideBarClose = () => {
+ changeShow(false)
+ }
+
+ // 监听滚动
+ useEffect(() => {
+ window.addEventListener('scroll', topNavStyleHandler)
+ router.events.on('routeChangeComplete', topNavStyleHandler)
+ topNavStyleHandler()
+ return () => {
+ router.events.off('routeChangeComplete', topNavStyleHandler)
+ window.removeEventListener('scroll', topNavStyleHandler)
+ }
+ }, [])
+
+ const throttleMs = 200
+
+ const topNavStyleHandler = useCallback(
+ throttle(() => {
+ const scrollS = window.scrollY
+ const nav = document.querySelector('#sticky-nav')
+ // 首页和文章页会有头图
+ const header = document.querySelector('#header')
+ // 导航栏和头图是否重叠
+ const scrollInHeader =
+ header && (scrollS < 10 || scrollS < header?.clientHeight - 50) // 透明导航条的条件
+
+ // const textWhite = header && scrollInHeader
+
+ if (scrollInHeader) {
+ nav && nav.classList.replace('bg-white', 'bg-none')
+ nav && nav.classList.replace('border', 'border-transparent')
+ nav && nav.classList.replace('drop-shadow-md', 'shadow-none')
+ nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent')
+ } else {
+ nav && nav.classList.replace('bg-none', 'bg-white')
+ nav && nav.classList.replace('border-transparent', 'border')
+ nav && nav.classList.replace('shadow-none', 'drop-shadow-md')
+ nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray')
+ }
+
+ if (scrollInHeader) {
+ nav && nav.classList.replace('text-black', 'text-white')
+ } else {
+ nav && nav.classList.replace('text-white', 'text-black')
+ }
+
+ // 导航栏不在头图里,且页面向下滚动一定程度 隐藏导航栏
+ const showNav =
+ scrollS <= windowTop ||
+ scrollS < 5 ||
+ (header && scrollS <= header.clientHeight + 100)
+ if (!showNav) {
+ nav && nav.classList.replace('top-0', '-top-20')
+ windowTop = scrollS
+ } else {
+ nav && nav.classList.replace('-top-20', 'top-0')
+ windowTop = scrollS
+ }
+ }, throttleMs)
+ )
+
+ const searchDrawerSlot = (
+ <>
+ {categories && (
+
+
+
+
+ {locale.COMMON.CATEGORY}
+
+
+ {locale.COMMON.MORE}
+
+
+
+
+ )}
+
+ {tags && (
+
+
+
+
+ {locale.COMMON.TAGS}
+
+
+ {locale.COMMON.MORE}
+
+
+
+
+
+
+ )}
+ >
+ )
+
+ return (
+
+
+
+ {/* 导航栏 */}
+
+
+
+
+
+
+ {/* 右侧功能 */}
+
+
+ {' '}
+
+
+
+ {isOpen ? (
+
+ ) : (
+
+ )}
+
+ {showSearchButton &&
}
+
+
+
+
+ {/* 折叠侧边栏 */}
+
+
+
+
+ )
+}
+
+export default Header
diff --git a/themes/hexo/components/PostHeader.js b/themes/hexo/components/PostHeader.js
deleted file mode 100644
index aa94acb9..00000000
--- a/themes/hexo/components/PostHeader.js
+++ /dev/null
@@ -1,85 +0,0 @@
-import Link from 'next/link'
-import TagItemMini from './TagItemMini'
-import { useGlobal } from '@/lib/global'
-import NotionIcon from '@/components/NotionIcon'
-import LazyImage from '@/components/LazyImage'
-import { formatDateFmt } from '@/lib/utils/formatDate'
-import { siteConfig } from '@/lib/config'
-
-export default function PostHeader({ post, siteInfo }) {
- const { locale, fullWidth } = useGlobal()
-
- if (!post) {
- return <>>
- }
-
- // 文章全屏隐藏标头
- if (fullWidth) {
- return
- }
-
- const headerImage = post?.pageCover ? post.pageCover : siteInfo?.pageCover
-
- return (
-
- )
-}
diff --git a/themes/hexo/components/PostHero.js b/themes/hexo/components/PostHero.js
new file mode 100644
index 00000000..4cedf597
--- /dev/null
+++ b/themes/hexo/components/PostHero.js
@@ -0,0 +1,99 @@
+import LazyImage from '@/components/LazyImage'
+import NotionIcon from '@/components/NotionIcon'
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { formatDateFmt } from '@/lib/utils/formatDate'
+import Link from 'next/link'
+import TagItemMini from './TagItemMini'
+
+/**
+ * 文章详情页的Hero块
+ */
+export default function PostHero({ post, siteInfo }) {
+ const { locale, fullWidth } = useGlobal()
+
+ if (!post) {
+ return <>>
+ }
+
+ // 文章全屏隐藏标头
+ if (fullWidth) {
+ return
+ }
+
+ const headerImage = post?.pageCover ? post.pageCover : siteInfo?.pageCover
+
+ return (
+
+ )
+}
diff --git a/themes/hexo/components/TopNav.js b/themes/hexo/components/TopNav.js
deleted file mode 100644
index 6f199fa6..00000000
--- a/themes/hexo/components/TopNav.js
+++ /dev/null
@@ -1,159 +0,0 @@
-import { useGlobal } from '@/lib/global'
-import Link from 'next/link'
-import { useCallback, useEffect, useRef, useState } from 'react'
-import CategoryGroup from './CategoryGroup'
-import Logo from './Logo'
-import SearchDrawer from './SearchDrawer'
-import TagGroups from './TagGroups'
-import { MenuListTop } from './MenuListTop'
-import throttle from 'lodash.throttle'
-import SideBar from './SideBar'
-import SideBarDrawer from './SideBarDrawer'
-import { siteConfig } from '@/lib/config'
-import SearchButton from './SearchButton'
-import CONFIG from '../config'
-import { useRouter } from 'next/router'
-
-let windowTop = 0
-
-/**
- * 顶部导航
- * @param {*} param0
- * @returns
- */
-const TopNav = props => {
- const searchDrawer = useRef()
- const { tags, currentTag, categories, currentCategory } = props
- const { locale } = useGlobal()
- const router = useRouter()
- const [isOpen, changeShow] = useState(false)
- const showSearchButton = siteConfig('HEXO_MENU_SEARCH', false, CONFIG)
-
- const toggleMenuOpen = () => {
- changeShow(!isOpen)
- }
-
- const toggleSideBarClose = () => {
- changeShow(false)
- }
-
- // 监听滚动
- useEffect(() => {
- window.addEventListener('scroll', topNavStyleHandler)
- router.events.on('routeChangeComplete', topNavStyleHandler)
- topNavStyleHandler()
- return () => {
- router.events.off('routeChangeComplete', topNavStyleHandler)
- window.removeEventListener('scroll', topNavStyleHandler)
- }
- }, [])
-
- const throttleMs = 200
-
- const topNavStyleHandler = useCallback(throttle(() => {
- const scrollS = window.scrollY
- const nav = document.querySelector('#sticky-nav')
- // 首页和文章页会有头图
- const header = document.querySelector('#header')
- // 导航栏和头图是否重叠
- const scrollInHeader = header && (scrollS < 10 || scrollS < header?.clientHeight - 50) // 透明导航条的条件
-
- // const textWhite = header && scrollInHeader
-
- if (scrollInHeader) {
- nav && nav.classList.replace('bg-white', 'bg-none')
- nav && nav.classList.replace('border', 'border-transparent')
- nav && nav.classList.replace('drop-shadow-md', 'shadow-none')
- nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent')
- } else {
- nav && nav.classList.replace('bg-none', 'bg-white')
- nav && nav.classList.replace('border-transparent', 'border')
- nav && nav.classList.replace('shadow-none', 'drop-shadow-md')
- nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray')
- }
-
- if (scrollInHeader) {
- nav && nav.classList.replace('text-black', 'text-white')
- } else {
- nav && nav.classList.replace('text-white', 'text-black')
- }
-
- // 导航栏不在头图里,且页面向下滚动一定程度 隐藏导航栏
- const showNav = scrollS <= windowTop || scrollS < 5 || (header && scrollS <= header.clientHeight + 100)
- if (!showNav) {
- nav && nav.classList.replace('top-0', '-top-20')
- windowTop = scrollS
- } else {
- nav && nav.classList.replace('-top-20', 'top-0')
- windowTop = scrollS
- }
- }, throttleMs)
- )
-
- const searchDrawerSlot = <>
- {categories && (
-
-
-
{locale.COMMON.CATEGORY}
-
-
- {locale.COMMON.MORE}
-
-
-
-
-
- )}
-
- {tags && (
-
-
-
{locale.COMMON.TAGS}
-
-
- {locale.COMMON.MORE}
-
-
-
-
-
-
-
- )}
- >
-
- return (
-
-
- {/* 导航栏 */}
-
-
-
-
-
-
- {/* 右侧功能 */}
-
-
-
- {isOpen ? : }
-
- {showSearchButton &&
}
-
-
-
-
- {/* 折叠侧边栏 */}
-
-
-
-
)
-}
-
-export default TopNav
diff --git a/themes/hexo/index.js b/themes/hexo/index.js
index 664b9698..8dd08ec9 100644
--- a/themes/hexo/index.js
+++ b/themes/hexo/index.js
@@ -19,9 +19,10 @@ import BlogPostListPage from './components/BlogPostListPage'
import BlogPostListScroll from './components/BlogPostListScroll'
import Card from './components/Card'
import Footer from './components/Footer'
+import Header from './components/Header'
import Hero from './components/Hero'
import JumpToCommentButton from './components/JumpToCommentButton'
-import PostHeader from './components/PostHeader'
+import PostHero from './components/PostHero'
import RightFloatArea from './components/RightFloatArea'
import SearchNav from './components/SearchNav'
import SideRight from './components/SideRight'
@@ -29,7 +30,6 @@ import SlotBar from './components/SlotBar'
import TagItemMini from './components/TagItemMini'
import TocDrawer from './components/TocDrawer'
import TocDrawerButton from './components/TocDrawerButton'
-import TopNav from './components/TopNav'
import CONFIG from './config'
import { Style } from './style'
@@ -54,7 +54,7 @@ const LayoutBase = props => {
const router = useRouter()
const headerSlot = post ? (
-
+
) : router.route === '/' &&
siteConfig('HEXO_HOME_BANNER_ENABLE', null, CONFIG) ? (
@@ -89,7 +89,7 @@ const LayoutBase = props => {
{/* 顶部导航 */}
-
+
{/* 顶部嵌入 */}
{
+ const { tags, currentTag, categories, currentCategory } = props
+ const { locale } = useGlobal()
+ const searchDrawer = useRef()
+ const { isDarkMode } = useGlobal()
+ const throttleMs = 200
+ const showSearchButton = siteConfig('MATERY_MENU_SEARCH', false, CONFIG)
+
+ const scrollTrigger = useCallback(
+ throttle(() => {
+ requestAnimationFrame(() => {
+ const scrollS = window.scrollY
+ const nav = document.querySelector('#sticky-nav')
+ const header = document.querySelector('#header')
+ const showNav =
+ scrollS <= windowTop ||
+ scrollS < 5 ||
+ (header && scrollS <= header.clientHeight * 2) // 非首页无大图时影藏顶部 滚动条置顶时隐藏// 非首页无大图时影藏顶部 滚动条置顶时隐藏
+ // 是否将导航栏透明
+ const navTransparent = header && scrollS < 300 // 透明导航条的条件
+
+ if (navTransparent) {
+ nav && nav.classList.replace('bg-indigo-700', 'bg-none')
+ nav && nav.classList.replace('text-black', 'text-white')
+ nav && nav.classList.replace('shadow-xl', 'shadow-none')
+ nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent')
+ } else {
+ nav && nav.classList.replace('bg-none', 'bg-indigo-700')
+ nav && nav.classList.replace('text-white', 'text-black')
+ nav && nav.classList.replace('shadow-none', 'shadow-xl')
+ nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray')
+ }
+
+ if (!showNav) {
+ nav && nav.classList.replace('top-0', '-top-20')
+ windowTop = scrollS
+ } else {
+ nav && nav.classList.replace('-top-20', 'top-0')
+ windowTop = scrollS
+ }
+ navDarkMode()
+ })
+ }, throttleMs)
+ )
+
+ const navDarkMode = () => {
+ const nav = document.getElementById('sticky-nav')
+ const header = document.querySelector('#header')
+ if (!isDarkMode && nav && header) {
+ if (window.scrollY < header.clientHeight) {
+ nav?.classList?.add('dark')
+ } else {
+ nav?.classList?.remove('dark')
+ }
+ }
+ }
+
+ // 监听滚动
+ useEffect(() => {
+ scrollTrigger()
+
+ window.addEventListener('scroll', scrollTrigger)
+ return () => {
+ window.removeEventListener('scroll', scrollTrigger)
+ }
+ }, [])
+
+ const [isOpen, changeShow] = useState(false)
+
+ const toggleMenuOpen = () => {
+ changeShow(!isOpen)
+ }
+
+ const toggleMenuClose = () => {
+ changeShow(false)
+ }
+
+ const searchDrawerSlot = (
+ <>
+ {categories && (
+
+
+
+
+ {locale.COMMON.CATEGORY}
+
+
+ {locale.COMMON.MORE}
+
+
+
+
+ )}
+
+ {tags && (
+
+
+
+
+ {locale.COMMON.TAGS}
+
+
+ {locale.COMMON.MORE}
+
+
+
+
+
+
+ )}
+ >
+ )
+
+ return (
+
+
+ {/* 导航栏 */}
+
+
+ {/* 左侧功能 */}
+
+
+ {isOpen ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+ {/* 右侧功能 */}
+
+
+ {' '}
+
+
+ {showSearchButton &&
}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Header
diff --git a/themes/matery/components/PostHeader.js b/themes/matery/components/PostHero.js
similarity index 94%
rename from themes/matery/components/PostHeader.js
rename to themes/matery/components/PostHero.js
index 6c880ffc..6187d197 100644
--- a/themes/matery/components/PostHeader.js
+++ b/themes/matery/components/PostHero.js
@@ -5,7 +5,7 @@ import { siteConfig } from '@/lib/config'
/**
* 文章背景图
*/
-export default function PostHeader({ post, siteInfo }) {
+export default function PostHero({ post, siteInfo }) {
const headerImage = post?.pageCoverThumbnail
? post?.pageCoverThumbnail
: siteInfo?.pageCover
diff --git a/themes/matery/components/SearchButton.js b/themes/matery/components/SearchButton.js
new file mode 100644
index 00000000..1a0f6c3d
--- /dev/null
+++ b/themes/matery/components/SearchButton.js
@@ -0,0 +1,34 @@
+import { siteConfig } from '@/lib/config'
+import { useGlobal } from '@/lib/global'
+import { useRouter } from 'next/router'
+import { useMateryGlobal } from '..'
+
+/**
+ * 搜索按钮
+ * @returns
+ */
+export default function SearchButton(props) {
+ const { locale } = useGlobal()
+ const router = useRouter()
+ const { searchModal } = useMateryGlobal()
+
+ function handleSearch() {
+ if (siteConfig('ALGOLIA_APP_ID')) {
+ searchModal.current.openSearch()
+ } else {
+ router.push('/search')
+ }
+ }
+
+ return (
+ <>
+
+
+
+ >
+ )
+}
diff --git a/themes/matery/components/TopNav.js b/themes/matery/components/TopNav.js
deleted file mode 100644
index 9f6db386..00000000
--- a/themes/matery/components/TopNav.js
+++ /dev/null
@@ -1,164 +0,0 @@
-import { useGlobal } from '@/lib/global'
-import Link from 'next/link'
-import { useCallback, useEffect, useRef, useState } from 'react'
-import CategoryGroup from './CategoryGroup'
-import Logo from './Logo'
-import SearchDrawer from './SearchDrawer'
-import TagGroups from './TagGroups'
-import { MenuListTop } from './MenuListTop'
-import SideBarDrawer from '@/components/SideBarDrawer'
-import SideBar from './SideBar'
-import throttle from 'lodash.throttle'
-
-let windowTop = 0
-
-/**
- * 顶部导航
- * @param {*} param0
- * @returns
- */
-const TopNav = props => {
- const { tags, currentTag, categories, currentCategory } = props
- const { locale } = useGlobal()
- const searchDrawer = useRef()
- const { isDarkMode } = useGlobal()
- const throttleMs = 200
- const scrollTrigger = useCallback(throttle(() => {
- requestAnimationFrame(() => {
- const scrollS = window.scrollY
- const nav = document.querySelector('#sticky-nav')
- const header = document.querySelector('#header')
- const showNav = scrollS <= windowTop || scrollS < 5 || (header && scrollS <= header.clientHeight * 2)// 非首页无大图时影藏顶部 滚动条置顶时隐藏// 非首页无大图时影藏顶部 滚动条置顶时隐藏
- // 是否将导航栏透明
- const navTransparent = header && scrollS < 300 // 透明导航条的条件
-
- if (navTransparent) {
- nav && nav.classList.replace('bg-indigo-700', 'bg-none')
- nav && nav.classList.replace('text-black', 'text-white')
- nav && nav.classList.replace('shadow-xl', 'shadow-none')
- nav && nav.classList.replace('dark:bg-hexo-black-gray', 'transparent')
- } else {
- nav && nav.classList.replace('bg-none', 'bg-indigo-700')
- nav && nav.classList.replace('text-white', 'text-black')
- nav && nav.classList.replace('shadow-none', 'shadow-xl')
- nav && nav.classList.replace('transparent', 'dark:bg-hexo-black-gray')
- }
-
- if (!showNav) {
- nav && nav.classList.replace('top-0', '-top-20')
- windowTop = scrollS
- } else {
- nav && nav.classList.replace('-top-20', 'top-0')
- windowTop = scrollS
- }
- navDarkMode()
- })
- }, throttleMs))
-
- const navDarkMode = () => {
- const nav = document.getElementById('sticky-nav')
- const header = document.querySelector('#header')
- if (!isDarkMode && nav && header) {
- if (window.scrollY < header.clientHeight) {
- nav?.classList?.add('dark')
- } else {
- nav?.classList?.remove('dark')
- }
- }
- }
-
- // 监听滚动
- useEffect(() => {
- scrollTrigger()
-
- window.addEventListener('scroll', scrollTrigger)
- return () => {
- window.removeEventListener('scroll', scrollTrigger)
- }
- }, [])
-
- const [isOpen, changeShow] = useState(false)
-
- const toggleMenuOpen = () => {
- changeShow(!isOpen)
- }
-
- const toggleMenuClose = () => {
- changeShow(false)
- }
-
- const searchDrawerSlot = <>
- {categories && (
-
-
-
{locale.COMMON.CATEGORY}
-
-
- {locale.COMMON.MORE}
-
-
-
-
-
- )}
-
- {tags && (
-
-
-
{locale.COMMON.TAGS}
-
-
- {locale.COMMON.MORE}
-
-
-
-
-
-
-
- )}
- >
-
- return (
-
-
- {/* 导航栏 */}
-
-
- {/* 左侧功能 */}
-
-
-
-
-
-
- {/* 右侧功能 */}
-
-
-
-
-
-
-
-
-
-
- )
-}
-
-export default TopNav
diff --git a/themes/matery/index.js b/themes/matery/index.js
index eddc2e1c..8889b6a8 100644
--- a/themes/matery/index.js
+++ b/themes/matery/index.js
@@ -9,9 +9,10 @@ import { siteConfig } from '@/lib/config'
import { useGlobal } from '@/lib/global'
import { loadWowJS } from '@/lib/plugins/wow'
import { isBrowser } from '@/lib/utils'
+import dynamic from 'next/dynamic'
import Link from 'next/link'
import { useRouter } from 'next/router'
-import { useEffect } from 'react'
+import { createContext, useContext, useEffect, useRef } from 'react'
import Announcement from './components/Announcement'
import ArticleAdjacent from './components/ArticleAdjacent'
import ArticleCopyright from './components/ArticleCopyright'
@@ -24,16 +25,25 @@ import BlogPostListScroll from './components/BlogPostListScroll'
import Card from './components/Card'
import CatalogWrapper from './components/CatalogWrapper'
import Footer from './components/Footer'
+import Header from './components/Header'
import Hero from './components/Hero'
import JumpToCommentButton from './components/JumpToCommentButton'
-import PostHeader from './components/PostHeader'
+import PostHero from './components/PostHero'
import RightFloatButtons from './components/RightFloatButtons'
import SearchNave from './components/SearchNav'
import TagItemMiddle from './components/TagItemMiddle'
-import TopNav from './components/TopNav'
import CONFIG from './config'
import { Style } from './style'
+const AlgoliaSearchModal = dynamic(
+ () => import('@/components/AlgoliaSearchModal'),
+ { ssr: false }
+)
+
+// 主题全局状态
+const ThemeGlobalMatery = createContext()
+export const useMateryGlobal = () => useContext(ThemeGlobalMatery)
+
/**
* 基础布局
* 采用左右两侧布局,移动端使用顶部导航栏
@@ -60,74 +70,59 @@ const LayoutBase = props => {
router.route === '/' ? (
) : post && !fullWidth ? (
-
+
) : null
const floatRightBottom = post ? : null
+ // Algolia搜索框
+ const searchModal = useRef(null)
+
return (
-
-
+
+
+
- {/* 顶部导航栏 */}
-
+ {/* 顶部导航栏 */}
+
- {/* 顶部嵌入 */}
- {/*
*/}
- {headerSlot}
- {/* */}
+ {/* 顶部嵌入 */}
+ {headerSlot}
-
- {/* 嵌入区域 */}
-
- {containerSlot}
+
+ {/* 嵌入区域 */}
+
+ {containerSlot}
+
+
+
+ {children}
+
+
+
+ {/* 左下角悬浮 */}
+
+
-
- {/* */}
- {children}
- {/* */}
-
-
+ {/* 右下角悬浮 */}
+
- {/* 左下角悬浮 */}
-
-
+ {/* 全文搜索 */}
+
+
+ {/* 页脚 */}
+
-
- {/* 右下角悬浮 */}
-
-
- {/* 页脚 */}
-
-
+
)
}