mirror of
https://github.com/d0zingcat/NotionNext.git
synced 2026-05-31 07:26:43 +00:00
feature:
排班优化,按钮缩小
This commit is contained in:
@@ -44,7 +44,7 @@ export default function ArticleDetail ({ post, blockMap, recommendPosts, prev, n
|
|||||||
<>
|
<>
|
||||||
<Progress targetRef={targetRef} />
|
<Progress targetRef={targetRef} />
|
||||||
|
|
||||||
<div id="article-wrapper" ref={targetRef} className="flex-grow">
|
<div id="article-wrapper" ref={targetRef} className="flex-grow mt-14 md:mt-0">
|
||||||
<div className="max-w-5xl mx-auto w-screen md:w-full ">
|
<div className="max-w-5xl mx-auto w-screen md:w-full ">
|
||||||
<article
|
<article
|
||||||
itemScope
|
itemScope
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import React from 'react'
|
|||||||
|
|
||||||
const CategoryGroup = ({ currentCategory, categories }) => {
|
const CategoryGroup = ({ currentCategory, categories }) => {
|
||||||
return <>
|
return <>
|
||||||
<div id='category-list' className='dark:border-gray-600 dark:bg-gray-800 flex flex-wrap'>
|
<div id='category-list' className='dark:border-gray-600 flex flex-wrap'>
|
||||||
{Object.keys(categories).map(category => {
|
{Object.keys(categories).map(category => {
|
||||||
const selected = currentCategory === category
|
const selected = currentCategory === category
|
||||||
return <Link key={category} href={`/category/${category}`} passHref>
|
return <Link key={category} href={`/category/${category}`} passHref>
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ const DarkModeButton = () => {
|
|||||||
saveTheme(newTheme)
|
saveTheme(newTheme)
|
||||||
changeTheme(newTheme)
|
changeTheme(newTheme)
|
||||||
}
|
}
|
||||||
return <div className='z-10 duration-200 text-lg cursor-pointer'>
|
return <div className='z-10 duration-200 text-xs cursor-pointer py-1.5 px-1'>
|
||||||
<FontAwesomeIcon icon={userTheme === 'dark' ? faSun : faMoon} id='darkModeButton' className='mx-2 my-2 hover:scale-125 transform duration-200'
|
<FontAwesomeIcon icon={userTheme === 'dark' ? faSun : faMoon} id='darkModeButton' className='hover:scale-125 transform duration-200'
|
||||||
onClick={handleChangeDarkMode} />
|
onClick={handleChangeDarkMode} />
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ export default function FloatDarkModeButton () {
|
|||||||
const [show, switchShow] = useState(false)
|
const [show, switchShow] = useState(false)
|
||||||
const scrollListener = () => {
|
const scrollListener = () => {
|
||||||
const scrollY = window.pageYOffset
|
const scrollY = window.pageYOffset
|
||||||
const shouldShow = scrollY > 100 && scrollY < windowTop
|
// const shouldShow = scrollY > 100 && scrollY < windowTop
|
||||||
|
const shouldShow = scrollY > 100
|
||||||
windowTop = scrollY
|
windowTop = scrollY
|
||||||
if (shouldShow !== show) {
|
if (shouldShow !== show) {
|
||||||
switchShow(shouldShow)
|
switchShow(shouldShow)
|
||||||
|
|||||||
@@ -25,7 +25,8 @@ const JumpToTopButton = ({ targetRef, showPercent = true }) => {
|
|||||||
const fullHeight = clientHeight - window.outerHeight
|
const fullHeight = clientHeight - window.outerHeight
|
||||||
let per = parseFloat(((scrollY / fullHeight * 100)).toFixed(0))
|
let per = parseFloat(((scrollY / fullHeight * 100)).toFixed(0))
|
||||||
if (per > 100) per = 100
|
if (per > 100) per = 100
|
||||||
const shouldShow = scrollY > 100 && per > 0 && scrollY < windowTop
|
// const shouldShow = scrollY > 100 && per > 0 && scrollY < windowTop
|
||||||
|
const shouldShow = scrollY > 100 && per > 0
|
||||||
windowTop = scrollY
|
windowTop = scrollY
|
||||||
|
|
||||||
if (shouldShow !== show) {
|
if (shouldShow !== show) {
|
||||||
@@ -39,11 +40,11 @@ const JumpToTopButton = ({ targetRef, showPercent = true }) => {
|
|||||||
return () => document.removeEventListener('scroll', scrollListener)
|
return () => document.removeEventListener('scroll', scrollListener)
|
||||||
}, [show])
|
}, [show])
|
||||||
|
|
||||||
return (<div id='jump-to-top' className='right-5 fixed flex bottom-52 duration-500 z-20'>
|
return (<div id='jump-to-top' className='right-5 fixed flex bottom-48 duration-500 z-20'>
|
||||||
<div onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
|
<div onClick={() => window.scrollTo({ top: 0, behavior: 'smooth' })}
|
||||||
className={(show ? '' : 'hidden') + ' animate__fadeInRight animate__animated animate__faster shadow-card rounded-full glassmorphism p-2 cursor-pointer '}>
|
className={(show ? '' : 'hidden') + ' animate__fadeInRight animate__animated animate__faster shadow-card rounded-full glassmorphism py-1 cursor-pointer '}>
|
||||||
<div className='text-center'>
|
<div className='text-center'>
|
||||||
<div className='w-10 dark:text-gray-200 transform hover:scale-125 duration-200' title={locale.POST.TOP} >
|
<div className='w-10 dark:text-gray-200 transform hover:scale-125 duration-200 text-xs' title={locale.POST.TOP} >
|
||||||
<FontAwesomeIcon icon={faArrowUp} />
|
<FontAwesomeIcon icon={faArrowUp} />
|
||||||
</div>
|
</div>
|
||||||
{showPercent && (<div className='w-10 text-xs dark:text-gray-200'>{percent}</div>)}
|
{showPercent && (<div className='w-10 text-xs dark:text-gray-200'>{percent}</div>)}
|
||||||
|
|||||||
@@ -86,8 +86,8 @@ const SideArea = ({ title, tags, currentTag, post, posts, categories, currentCat
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{post && (
|
{post && (
|
||||||
<section id='left-toc' className='sticky pb-20 top-0 pt-2 rounded-xl shadow-lg bg-white dark:bg-gray-800'>
|
<section id='left-toc' className='sticky pb-20 top-6 rounded-xl shadow-lg bg-white dark:bg-gray-800'>
|
||||||
<div className='border-b text-2xl bg-white text-black dark:border-gray-700 dark:bg-gray-700 dark:text-white py-6 px-6'>
|
<div className='border-b text-2xl bg-white text-black rounded-t-xl dark:border-gray-700 dark:bg-gray-700 dark:text-white py-6 px-6'>
|
||||||
{locale.COMMON.TABLE_OF_CONTENTS}
|
{locale.COMMON.TABLE_OF_CONTENTS}
|
||||||
</div>
|
</div>
|
||||||
<Toc toc={post.toc} />
|
<Toc toc={post.toc} />
|
||||||
|
|||||||
@@ -1,45 +0,0 @@
|
|||||||
import React, { useImperativeHandle, useState } from 'react'
|
|
||||||
import SideArea from './SideArea'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 侧边栏抽屉面板,可以从侧面拉出
|
|
||||||
* @returns {JSX.Element}
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
const SideAreaDrawer = ({ post, currentTag, cRef, tags, posts, categories, currentCategory }) => {
|
|
||||||
// 暴露给父组件 通过cRef.current.handleMenuClick 调用
|
|
||||||
useImperativeHandle(cRef, () => {
|
|
||||||
return {
|
|
||||||
handleSwitchSideDrawerVisible: () => switchSideDrawerVisible()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const [isShow, changeHiddenStatus] = useState(false)
|
|
||||||
// 点击按钮更改侧边抽屉状态
|
|
||||||
const switchSideDrawerVisible = () => {
|
|
||||||
const showStatus = !isShow
|
|
||||||
changeHiddenStatus(showStatus)
|
|
||||||
if (window) {
|
|
||||||
const sideBarDrawer = window.document.getElementById('sidebar-drawer')
|
|
||||||
const sideBarDrawerBackground = window.document.getElementById('sidebar-drawer-background')
|
|
||||||
|
|
||||||
if (showStatus) {
|
|
||||||
sideBarDrawer.classList.replace('-ml-72', 'ml-2')
|
|
||||||
sideBarDrawerBackground.classList.replace('hidden', 'block')
|
|
||||||
} else {
|
|
||||||
sideBarDrawer.classList.replace('ml-2', '-ml-72')
|
|
||||||
sideBarDrawerBackground.classList.replace('block', 'hidden')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return <>
|
|
||||||
<div id='sidebar-drawer' className='-ml-72 flex flex-col duration-300 fixed h-full left-0 overflow-y-scroll scroll-hidden top-0 z-50'>
|
|
||||||
<SideArea tags={tags} post={post} posts={posts} categories={categories} currentCategory={currentCategory} />
|
|
||||||
</div>
|
|
||||||
{/* 背景蒙版 */}
|
|
||||||
<div id='sidebar-drawer-background'
|
|
||||||
className='hidden fixed top-0 left-0 z-30 w-full h-full bg-black bg-opacity-30'
|
|
||||||
onClick={switchSideDrawerVisible} />
|
|
||||||
|
|
||||||
</>
|
|
||||||
}
|
|
||||||
export default SideAreaDrawer
|
|
||||||
@@ -25,7 +25,7 @@ import { faAngleDoubleRight, faArchive, faTags, faThList } from '@fortawesome/fr
|
|||||||
*/
|
*/
|
||||||
const SideBar = ({ title, tags, currentTag, post, posts, categories, currentCategory, currentSearch }) => {
|
const SideBar = ({ title, tags, currentTag, post, posts, categories, currentCategory, currentSearch }) => {
|
||||||
const { locale } = useGlobal()
|
const { locale } = useGlobal()
|
||||||
return <aside id='sidebar' className='pt-5 bg-white dark:bg-gray-900 w-72 z-10 dark:border-gray-500 border-gray-200 scroll-hidden h-full'>
|
return <aside id='sidebar' className='pt-5 bg-white dark:bg-gray-900 w-80 z-10 dark:border-gray-500 border-gray-200 scroll-hidden h-full'>
|
||||||
|
|
||||||
<section className='hidden lg:block'>
|
<section className='hidden lg:block'>
|
||||||
<InfoCard />
|
<InfoCard />
|
||||||
@@ -86,7 +86,7 @@ const SideBar = ({ title, tags, currentTag, post, posts, categories, currentCate
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{post && (
|
{post && (
|
||||||
<section id='left-toc' className='sticky pb-20 top-0 bg-white dark:bg-gray-900'>
|
<section id='left-toc' className='sticky pb-20 top-0 bg-white dark:bg-gray-900 hidden md:block'>
|
||||||
<div className='border-b text-2xl bg-white text-black dark:border-gray-700 dark:bg-gray-700 dark:text-white py-6 px-6'>
|
<div className='border-b text-2xl bg-white text-black dark:border-gray-700 dark:bg-gray-700 dark:text-white py-6 px-6'>
|
||||||
{locale.COMMON.TABLE_OF_CONTENTS}
|
{locale.COMMON.TABLE_OF_CONTENTS}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -23,16 +23,16 @@ const SideBarDrawer = ({ post, currentTag, cRef, tags, posts, categories, curren
|
|||||||
const sideBarDrawerBackground = window.document.getElementById('sidebar-drawer-background')
|
const sideBarDrawerBackground = window.document.getElementById('sidebar-drawer-background')
|
||||||
|
|
||||||
if (showStatus) {
|
if (showStatus) {
|
||||||
sideBarDrawer.classList.replace('-ml-72', 'ml-0')
|
sideBarDrawer.classList.replace('-ml-80', 'ml-0')
|
||||||
sideBarDrawerBackground.classList.replace('hidden', 'block')
|
sideBarDrawerBackground.classList.replace('hidden', 'block')
|
||||||
} else {
|
} else {
|
||||||
sideBarDrawer.classList.replace('ml-0', '-ml-72')
|
sideBarDrawer.classList.replace('ml-0', '-ml-80')
|
||||||
sideBarDrawerBackground.classList.replace('block', 'hidden')
|
sideBarDrawerBackground.classList.replace('block', 'hidden')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return <>
|
return <>
|
||||||
<div id='sidebar-drawer' className='-ml-72 flex flex-col duration-300 fixed h-full left-0 overflow-y-scroll scroll-hidden top-0 z-50'>
|
<div id='sidebar-drawer' className='-ml-80 bg-white dark:bg-gray-900 flex flex-col duration-300 fixed h-full left-0 overflow-y-scroll scroll-hidden top-0 z-50'>
|
||||||
<SideBar tags={tags} post={post} posts={posts} categories={categories} currentCategory={currentCategory} />
|
<SideBar tags={tags} post={post} posts={posts} categories={categories} currentCategory={currentCategory} />
|
||||||
</div>
|
</div>
|
||||||
{/* 背景蒙版 */}
|
{/* 背景蒙版 */}
|
||||||
|
|||||||
@@ -16,7 +16,8 @@ const TocDrawerButton = (props) => {
|
|||||||
const [show, switchShow] = useState(false)
|
const [show, switchShow] = useState(false)
|
||||||
const scrollListener = () => {
|
const scrollListener = () => {
|
||||||
const scrollY = window.pageYOffset
|
const scrollY = window.pageYOffset
|
||||||
const shouldShow = scrollY > 100 && scrollY < windowTop
|
// const shouldShow = scrollY > 100 && scrollY < windowTop
|
||||||
|
const shouldShow = scrollY > 100
|
||||||
windowTop = scrollY
|
windowTop = scrollY
|
||||||
|
|
||||||
if (shouldShow !== show) {
|
if (shouldShow !== show) {
|
||||||
@@ -29,10 +30,10 @@ const TocDrawerButton = (props) => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div id='toc-drawer-button' className='right-5 fixed bottom-72 duration-500 z-40' onClick={props.onClick}>
|
<div id='toc-drawer-button' className='right-5 fixed bottom-60 duration-500 z-40' onClick={props.onClick}>
|
||||||
<div className={(show ? 'animate__fadeInRight' : 'hidden') + ' px-2 py-4 animate__animated glassmorphism rounded-full cursor-pointer shadow-card' }>
|
<div className={(show ? 'animate__fadeInRight' : 'hidden') + ' py-3 px-3.5 animate__animated glassmorphism rounded-full cursor-pointer shadow-card' }>
|
||||||
<div className='w-10 dark:text-gray-200 text-center transform hover:scale-125 duration-200' title={locale.POST.TOP} >
|
<div className='dark:text-gray-200 text-center transform hover:scale-125 duration-200 text-xs' title={locale.POST.TOP} >
|
||||||
<div className='w-10 text-md' title={locale.COMMON.TABLE_OF_CONTENTS} ><FontAwesomeIcon icon={faListOl} /> </div>
|
<FontAwesomeIcon icon={faListOl} />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
import { useRef } from 'react'
|
import { useRef } from 'react'
|
||||||
import SideBarDrawer from '@/components/SideBarDrawer'
|
import SideBarDrawer from '@/components/SideBarDrawer'
|
||||||
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
|
||||||
import { faBars } from '@fortawesome/free-solid-svg-icons'
|
|
||||||
import BLOG from '@/blog.config'
|
import BLOG from '@/blog.config'
|
||||||
import Link from 'next/link'
|
import Link from 'next/link'
|
||||||
import Image from 'next/image'
|
import Image from 'next/image'
|
||||||
import { useGlobal } from '@/lib/global'
|
import { useGlobal } from '@/lib/global'
|
||||||
|
import { faSearch } from '@fortawesome/free-solid-svg-icons'
|
||||||
|
|
||||||
const TopNav = ({ tags, currentTag, post, posts, categories, currentCategory }) => {
|
const TopNav = ({ tags, currentTag, post, posts, categories, currentCategory }) => {
|
||||||
const drawer = useRef()
|
const drawer = useRef()
|
||||||
@@ -46,9 +46,8 @@ const TopNav = ({ tags, currentTag, post, posts, categories, currentCategory })
|
|||||||
<a>{locale.NAV.ABOUT}</a>
|
<a>{locale.NAV.ABOUT}</a>
|
||||||
</Link>
|
</Link>
|
||||||
<div onClick={() => { drawer.current.handleSwitchSideDrawerVisible() }}
|
<div onClick={() => { drawer.current.handleSwitchSideDrawerVisible() }}
|
||||||
className='ppb-1z-30 text-gray-600 text-2xl flex items-center cursor-pointer dark:text-gray-300'>
|
className='cursor-pointer dark:text-gray-300'>
|
||||||
<FontAwesomeIcon icon={faBars} className='hover:scale-125 transform duration-200'
|
{locale.NAV.SEARCH}
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user