diff --git a/docs/src/.vuepress/client.ts b/docs/src/.vuepress/client.ts
index 02726b64c..3b50201be 100644
--- a/docs/src/.vuepress/client.ts
+++ b/docs/src/.vuepress/client.ts
@@ -1,5 +1,6 @@
import { defineClientConfig } from "vuepress/client";
import DesktopSidebarToggle from "./components/DesktopSidebarToggle.vue";
+import DesktopTocToggle from "./components/DesktopTocToggle.vue";
import FloatingControlsToggle from "./components/FloatingControlsToggle.vue";
import FocusReadingToggle from "./components/FocusReadingToggle.vue";
import ArticleHumanVerify from "./components/ArticleHumanVerify.vue";
@@ -8,6 +9,7 @@ import MZNXQRcodeBanner from "./components/mznxqrcode.vue";
export default defineClientConfig({
rootComponents: [
DesktopSidebarToggle,
+ DesktopTocToggle,
FocusReadingToggle,
FloatingControlsToggle,
ArticleHumanVerify,
diff --git a/docs/src/.vuepress/components/DesktopTocToggle.vue b/docs/src/.vuepress/components/DesktopTocToggle.vue
new file mode 100644
index 000000000..35565054b
--- /dev/null
+++ b/docs/src/.vuepress/components/DesktopTocToggle.vue
@@ -0,0 +1,265 @@
+
+
+
+
+
+
+
diff --git a/docs/src/.vuepress/styles/index.scss b/docs/src/.vuepress/styles/index.scss
index 6f8b05e02..77320cd46 100644
--- a/docs/src/.vuepress/styles/index.scss
+++ b/docs/src/.vuepress/styles/index.scss
@@ -327,6 +327,7 @@ body.focus-reading-mode {
body.focus-reading-mode .vp-notice-wrapper,
body.focus-reading-mode .desktop-sidebar-toggle,
+body.focus-reading-mode .desktop-toc-toggle,
body.focus-reading-mode .pwa-inline-update-control,
body.focus-reading-mode .floating-controls-toggle,
body.focus-reading-mode .toggle-sidebar-wrapper,
@@ -1114,3 +1115,63 @@ html[data-theme="dark"] .agent-interview-page .vp-footer-wrapper {
box-shadow: 3px 3px 0 rgb(23 33 43 / 16%);
}
}
+
+/* 右侧「此页内容」目录:
+ 主题默认要窗口 ≥1440px 才把它放到正文右侧(hope-config.$pc),窄一点就收成正文上方的折叠条。
+ 这里不新设门槛,直接复用主题已有的桌面断点(≥960px 出现左侧栏的那条线),把目录做成固定在右侧的浮窗:
+ - 目录脱离文档流,不再挤占正文,因此任何桌面宽度都能显示;
+ - 给 .vp-page 加 13.5rem 右内边距预留槽位。注意不能靠收窄 --content-width 来腾地方:
+ 正文在剩余空间里是居中的,一收窄就会左右对半分,右侧反而没让出来。 */
+@media (min-width: 960px) and (max-width: 1439px) {
+ /* toc-panel-desktop 由 DesktopTocToggle 在「目录确实存在且未收起」时挂上,
+ 避免没有小标题的页面白留一条空槽 */
+ .theme-container.toc-panel-desktop .vp-page {
+ padding-inline-end: 13.5rem;
+ }
+
+ .vp-toc-placeholder {
+ top: calc(var(--navbar-height) + 2rem);
+ }
+
+ #toc {
+ position: fixed;
+ top: calc(var(--navbar-height) + 2rem);
+ inset-inline-end: 0.75rem;
+ min-width: 10rem;
+ max-width: 12rem;
+ margin-bottom: 0;
+ border-radius: 0;
+ background: transparent;
+ }
+
+ .vp-toc-header {
+ padding-top: 0;
+ font-size: 0.875rem;
+ }
+
+ .vp-toc-header .arrow {
+ display: none;
+ }
+
+ .vp-toc-header .print-button {
+ display: inline-block;
+ }
+
+ .vp-toc-wrapper {
+ height: auto;
+ max-height: 75vh;
+ }
+
+ .vp-toc-marker {
+ display: block;
+ }
+
+ .vp-toc-item {
+ padding: 0 0.5rem;
+ }
+}
+
+/* 右侧目录的收起状态,由 DesktopTocToggle 切换并记忆 */
+.theme-container.toc-collapsed-desktop #toc {
+ display: none;
+}