From 375e18b206430640f4e9f8d96304983b90063bb7 Mon Sep 17 00:00:00 2001 From: pfqgauxfb <3521106529@qq.com> Date: Mon, 2 Jun 2025 20:31:55 +0800 Subject: [PATCH] feng --- src/components/Bookmark/index.js | 41 +++++++++++++++++++++++ src/components/Bookmark/styles.module.css | 33 ++++++++++++++++++ src/css/custom.css | 27 +++++++++++++++ src/theme/DocSidebarItem/index.js | 19 +++++++++++ 4 files changed, 120 insertions(+) create mode 100644 src/components/Bookmark/index.js create mode 100644 src/components/Bookmark/styles.module.css create mode 100644 src/theme/DocSidebarItem/index.js diff --git a/src/components/Bookmark/index.js b/src/components/Bookmark/index.js new file mode 100644 index 0000000..c513da6 --- /dev/null +++ b/src/components/Bookmark/index.js @@ -0,0 +1,41 @@ +import React, { useState, useEffect } from 'react'; +import styles from './styles.module.css'; + +export default function Bookmark({ 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/Bookmark/styles.module.css b/src/components/Bookmark/styles.module.css new file mode 100644 index 0000000..7cdd29f --- /dev/null +++ b/src/components/Bookmark/styles.module.css @@ -0,0 +1,33 @@ +.bookmarkButton { + position: absolute; + left: -30px; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + padding: 4px; + color: var(--ifm-color-emphasis-600); + transition: all 0.2s ease; + opacity: 0; +} + +.bookmarkButton:hover { + color: var(--ifm-color-primary); + transform: translateY(-50%) scale(1.1); +} + +.bookmarked { + color: var(--ifm-color-primary); + opacity: 1; +} + +/* 当鼠标悬停在侧边栏项目上时显示标记按钮 */ +:global(.menu__link-wrapper:hover) .bookmarkButton { + opacity: 1; +} + +/* 已标记的项目始终显示标记按钮 */ +:global(.menu__link-wrapper) .bookmarked { + opacity: 1; +} \ No newline at end of file diff --git a/src/css/custom.css b/src/css/custom.css index f0b0f1a..12873ab 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -149,4 +149,31 @@ html[data-theme='dark'] .docusaurus-highlight-code-line { .widget{ display: none!important; opacity: 0; +} + +/* 标记按钮的全局样式 */ +.menu__link-wrapper { + position: relative; +} + +/* 已标记项目的样式 */ +.menu__link-wrapper--active { + font-weight: bold; +} + +/* 标记按钮的动画效果 */ +@keyframes bookmarkPulse { + 0% { + transform: translateY(-50%) scale(1); + } + 50% { + transform: translateY(-50%) scale(1.1); + } + 100% { + transform: translateY(-50%) scale(1); + } +} + +.bookmarkButton.bookmarked { + animation: bookmarkPulse 0.3s ease; } \ No newline at end of file diff --git a/src/theme/DocSidebarItem/index.js b/src/theme/DocSidebarItem/index.js new file mode 100644 index 0000000..a85d1c0 --- /dev/null +++ b/src/theme/DocSidebarItem/index.js @@ -0,0 +1,19 @@ +import React from 'react'; +import DocSidebarItem from '@theme-original/DocSidebarItem'; +import Bookmark from '@site/src/components/Bookmark'; + +export default function DocSidebarItemWrapper(props) { + const { item } = props; + + // 只为文档类型的项目添加标记功能 + if (item.type === 'doc') { + return ( +
+ + +
+ ); + } + + return ; +} \ No newline at end of file