From 5121b71bfc678fedca701da58449899bc21dbf75 Mon Sep 17 00:00:00 2001 From: pfqgauxfb <3521106529@qq.com> Date: Mon, 2 Jun 2025 21:00:57 +0800 Subject: [PATCH] feng --- src/components/DocBookmark/index.js | 47 ++++++++++++++++++++ src/components/DocBookmark/styles.module.css | 42 +++++++++++++++++ src/css/custom.css | 24 ++++++++++ src/theme/DocPage/index.js | 17 +++++++ src/theme/DocSidebarItem/index.js | 19 +++++--- 5 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 src/components/DocBookmark/index.js create mode 100644 src/components/DocBookmark/styles.module.css create mode 100644 src/theme/DocPage/index.js diff --git a/src/components/DocBookmark/index.js b/src/components/DocBookmark/index.js new file mode 100644 index 0000000..c3765ea --- /dev/null +++ b/src/components/DocBookmark/index.js @@ -0,0 +1,47 @@ +import React, { useState, useEffect } from 'react'; +import styles from './styles.module.css'; + +export default function DocBookmark({ docId }) { + const [isBookmarked, setIsBookmarked] = useState(false); + + useEffect(() => { + // 从localStorage中读取标记状态 + const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}'); + setIsBookmarked(bookmarks[docId] || false); + }, [docId]); + + const toggleBookmark = () => { + const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}'); + const newState = !isBookmarked; + bookmarks[docId] = newState; + localStorage.setItem('docBookmarks', JSON.stringify(bookmarks)); + setIsBookmarked(newState); + }; + + return ( +
+ +
+ ); +} \ No newline at end of file diff --git a/src/components/DocBookmark/styles.module.css b/src/components/DocBookmark/styles.module.css new file mode 100644 index 0000000..3463646 --- /dev/null +++ b/src/components/DocBookmark/styles.module.css @@ -0,0 +1,42 @@ +.bookmarkContainer { + display: flex; + justify-content: flex-end; + margin-bottom: 1rem; + padding: 0.5rem; + border-bottom: 1px solid var(--ifm-color-emphasis-200); +} + +.bookmarkButton { + display: flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 1rem; + border: 1px solid var(--ifm-color-emphasis-300); + border-radius: 4px; + background: var(--ifm-background-color); + color: var(--ifm-color-emphasis-700); + cursor: pointer; + transition: all 0.2s ease; +} + +.bookmarkButton:hover { + background: var(--ifm-color-emphasis-100); + border-color: var(--ifm-color-primary); + color: var(--ifm-color-primary); +} + +.bookmarked { + background: var(--ifm-color-primary); + color: white; + border-color: var(--ifm-color-primary); +} + +.bookmarked:hover { + background: var(--ifm-color-primary-darker); + color: white; +} + +.bookmarkText { + font-size: 0.9rem; + font-weight: 500; +} \ No newline at end of file diff --git a/src/css/custom.css b/src/css/custom.css index 6966a29..7192007 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -203,4 +203,28 @@ html[data-theme='dark'] .docusaurus-highlight-code-line { .bookmarkButton { z-index: 2; +} + +/* 标记项目的样式 */ +.menu__link--bookmarked { + color: var(--ifm-color-primary) !important; + font-weight: 500 !important; + background-color: var(--ifm-color-emphasis-100) !important; +} + +/* 标记按钮的动画效果 */ +@keyframes bookmarkPulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } + 100% { + transform: scale(1); + } +} + +.bookmarkButton.bookmarked { + animation: bookmarkPulse 0.3s ease; } \ No newline at end of file diff --git a/src/theme/DocPage/index.js b/src/theme/DocPage/index.js new file mode 100644 index 0000000..003d38d --- /dev/null +++ b/src/theme/DocPage/index.js @@ -0,0 +1,17 @@ +import React from 'react'; +import DocPage from '@theme-original/DocPage'; +import DocBookmark from '@site/src/components/DocBookmark'; +import {useLocation} from '@docusaurus/router'; + +export default function DocPageWrapper(props) { + const {content} = props; + const location = useLocation(); + const docId = location.pathname; + + return ( + <> + + + + ); +} \ No newline at end of file diff --git a/src/theme/DocSidebarItem/index.js b/src/theme/DocSidebarItem/index.js index 800fe93..803bb95 100644 --- a/src/theme/DocSidebarItem/index.js +++ b/src/theme/DocSidebarItem/index.js @@ -1,17 +1,24 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; import DocSidebarItem from '@theme-original/DocSidebarItem'; -import Bookmark from '@site/src/components/Bookmark'; export default function DocSidebarItemWrapper(props) { const { item } = props; - - // 只为文档类型的项目添加标记功能 + const [isBookmarked, setIsBookmarked] = useState(false); + + useEffect(() => { + if (item.type === 'doc') { + const bookmarks = JSON.parse(localStorage.getItem('docBookmarks') || '{}'); + setIsBookmarked(bookmarks[item.docId] || false); + } + }, [item]); + if (item.type === 'doc') { return (
  • -
    +
    -
  • );