diff --git a/.vitepress/theme/components/DocBreadcrumb.vue b/.vitepress/theme/components/DocBreadcrumb.vue
new file mode 100644
index 00000000..c19e32ef
--- /dev/null
+++ b/.vitepress/theme/components/DocBreadcrumb.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
diff --git a/.vitepress/theme/document-ui.css b/.vitepress/theme/document-ui.css
new file mode 100644
index 00000000..4c71086e
--- /dev/null
+++ b/.vitepress/theme/document-ui.css
@@ -0,0 +1,287 @@
+/* Reading layout and navigation shared by normal and doc-only builds. */
+.Layout:has(.VPDoc) {
+ --vp-sidebar-width: 272px;
+ --vp-font-family-base: var(--df-md-font-sans);
+ --vp-font-family-mono: var(--df-md-font-mono);
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDoc > .container > .content {
+ min-width: 0;
+}
+
+.Layout:has(.VPDoc) .VPDoc .content-container {
+ max-width: var(--df-md-reading-width);
+}
+
+.Layout:has(.VPDoc) .VPDoc > .container {
+ max-width: 1056px;
+}
+
+.Layout:has(.VPDoc) .VPDoc .aside {
+ max-width: 240px;
+ padding-left: 40px;
+}
+
+.Layout:has(.VPDoc) .VPDoc .aside-container,
+.Layout:has(.VPDoc) .VPDoc .aside-curtain {
+ width: 200px;
+}
+
+.Layout:has(.VPDoc) .VPDoc .aside-container {
+ padding-top: calc(var(--vp-nav-height) + 48px);
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline > .content {
+ padding: 0 0 0 16px;
+ border-color: var(--df-md-border-1);
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline .outline-title {
+ margin-bottom: 8px;
+ color: var(--df-md-text-1);
+ font-weight: var(--df-md-font-strong);
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline .outline-link {
+ color: var(--df-md-text-2);
+ line-height: 28px;
+ font-size: 13px;
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline .outline-link:hover {
+ color: var(--df-md-text-1);
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline .outline-link.active {
+ color: var(--df-md-text-1);
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDocAsideOutline .outline-marker {
+ background-color: var(--df-md-primary-6);
+}
+
+.Layout:has(.VPDoc) .VPSidebar {
+ font-family: var(--df-md-font-sans);
+ border-right: 1px solid var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .group {
+ padding: 12px 0 0;
+ border-top: 0;
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.level-0 {
+ padding-bottom: 8px;
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.level-0 > .item .text {
+ padding: 8px 0;
+ font-size: 13px;
+ line-height: 20px;
+ font-weight: var(--df-md-font-normal);
+ color: var(--df-md-text-2);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem:not(.level-0) > .item {
+ width: calc(100% + 8px);
+ margin-left: -8px;
+ padding-left: 8px;
+ border-radius: 8px;
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem:not(.level-0) > .item .text {
+ padding: 6px 8px 6px 0;
+ line-height: 22px;
+ font-size: 14px;
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem:not(.level-0) > .item:hover,
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.is-active > .item {
+ background-color: var(--df-md-fill-2);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.is-active > .item .text {
+ color: var(--df-md-text-1);
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem .items {
+ border-color: var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem .caret {
+ align-self: center;
+ color: var(--df-md-text-3);
+}
+
+.Layout:has(.VPDoc) .VPSidebar .sidebar-actions {
+ width: 100%;
+ padding-bottom: 12px;
+ border-bottom: 0;
+}
+
+.Layout:has(.VPDoc) .sidebar-actions .search-box {
+ border-radius: 8px;
+ border-color: var(--df-md-border-1);
+ background: var(--df-md-bg-1);
+}
+
+.Layout:has(.VPDoc) .sidebar-actions .search-box:hover {
+ border-color: var(--df-md-border-2);
+ background: var(--df-md-fill-1);
+}
+
+.Layout:has(.VPDoc) .sidebar-actions .search-box:focus {
+ border-color: var(--df-md-primary-6);
+}
+
+.Layout:has(.VPDoc) .sidebar-actions .theme-toggle {
+ border-radius: 8px;
+ border-color: var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) .doc-header {
+ --vp-c-text-1: var(--df-md-text-1);
+ --vp-c-text-2: var(--df-md-text-2);
+ --vp-c-text-3: var(--df-md-text-3);
+ --vp-c-border: var(--df-md-border-1);
+ --vp-c-brand-1: var(--df-md-primary-6);
+ --vp-c-bg: var(--df-md-bg-1);
+ --vp-c-bg-soft: var(--df-md-fill-1);
+ font-family: var(--df-md-font-sans);
+}
+
+.Layout:has(.VPDoc) .doc-header .doc-search,
+.Layout:has(.VPDoc) .doc-header .theme-toggle,
+.Layout:has(.VPDoc) .doc-header .lang-switch-trigger {
+ border-radius: 8px;
+ border-color: var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) .doc-header .doc-search {
+ background: var(--df-md-bg-1);
+}
+
+.Layout:has(.VPDoc) .doc-header .doc-search:hover,
+.Layout:has(.VPDoc) .doc-header .theme-toggle:hover,
+.Layout:has(.VPDoc) .doc-header .lang-switch-trigger:hover {
+ border-color: var(--df-md-border-2);
+ background-color: var(--df-md-fill-1);
+}
+
+.Layout:has(.VPDoc) .doc-header .doc-search:focus {
+ border-color: var(--df-md-primary-6);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter {
+ margin-top: 56px;
+ font-family: var(--df-md-font-sans);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .edit-link-button {
+ color: var(--df-md-text-3);
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .edit-link-button:hover {
+ color: var(--df-md-primary-6);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .VPLastUpdated {
+ color: var(--df-md-text-3);
+ font-size: 13px;
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .prev-next {
+ border-color: var(--df-md-border-1);
+ padding-top: 24px;
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .pager-link {
+ padding: 16px 20px;
+ border-color: var(--df-md-border-1);
+ border-radius: 12px;
+ background-color: var(--df-md-bg-1);
+ transition: background-color 0.2s, border-color 0.2s;
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .pager-link:hover {
+ border-color: var(--df-md-border-2);
+ background-color: var(--df-md-fill-1);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .pager-link .desc {
+ margin-bottom: 8px;
+ color: var(--df-md-text-3);
+ font-size: 13px;
+ font-weight: var(--df-md-font-normal);
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .pager-link .title {
+ color: var(--df-md-text-1);
+ font-size: 16px;
+ line-height: 1.5;
+ font-weight: 500;
+}
+
+.Layout:has(.VPDoc) .VPDocFooter .pager-link:hover .title {
+ color: var(--df-md-primary-6);
+}
+
+.Layout:has(.VPDoc) .embedded-sidebar-button {
+ color: var(--df-md-text-2);
+ background: var(--df-md-bg-1);
+ border-color: var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) :is(.VPSidebar, .VPDocFooter, .doc-header, .embedded-sidebar-button) :is(a, button):focus-visible {
+ outline: 2px solid var(--df-md-primary-6);
+ outline-offset: 2px;
+}
+
+@media (min-width: 960px) {
+ .Layout:has(.VPDoc) .VPDoc {
+ padding: 40px 24px 0;
+ }
+
+ .Layout:has(.VPDoc) .VPDoc > .container > .content {
+ padding: 0 16px 96px;
+ }
+
+ .Layout:has(.VPDoc) .VPSidebar {
+ padding-left: 24px;
+ padding-right: 24px;
+ }
+}
+
+@media (min-width: 1280px) {
+ .Layout:has(.VPDoc) .VPDoc > .container > .content {
+ flex: 1 1 680px;
+ max-width: 744px;
+ }
+}
+
+@media (max-width: 639px) {
+ .Layout:has(.VPDoc) .VPDoc {
+ padding-left: 24px;
+ padding-right: 24px;
+ }
+
+ .Layout:has(.VPDoc) .VPDocFooter .pager-link {
+ padding: 14px 16px;
+ }
+}
+
+@media (prefers-reduced-motion: reduce) {
+ .Layout:has(.VPDoc) *,
+ .VPLocalSearchBox * {
+ scroll-behavior: auto;
+ transition-duration: 0.01ms;
+ animation-duration: 0.01ms;
+ }
+}
diff --git a/.vitepress/theme/index.ts b/.vitepress/theme/index.ts
index 51b61921..def86bc7 100644
--- a/.vitepress/theme/index.ts
+++ b/.vitepress/theme/index.ts
@@ -1,4 +1,4 @@
-import { h, nextTick, onMounted, watch } from 'vue'
+import { defineComponent, h, nextTick, onMounted, watch } from 'vue'
import { useRoute } from 'vitepress'
import DefaultTheme from 'vitepress/theme'
import mediumZoom from 'medium-zoom'
@@ -8,41 +8,46 @@ import SiteFooter from './components/SiteFooter.vue'
import HomeHero from './components/HomeHero.vue'
import EmbeddedSidebarButton from './components/EmbeddedSidebarButton.vue'
import SidebarActions from './components/SidebarActions.vue'
+import DocBreadcrumb from './components/DocBreadcrumb.vue'
import './custom.css'
import './markdown.css'
+import './document-ui.css'
import './search.css'
export default {
extends: DefaultTheme,
- Layout: () => {
- const route = useRoute()
- const initZoom = () =>
- mediumZoom('.vp-doc img:not(.no-zoom)', { background: 'var(--vp-c-bg)' })
- onMounted(initZoom)
- watch(
- () => route.path,
- () => nextTick(initZoom)
- )
- return h(DefaultTheme.Layout, null, {
- // 顶部导航:还原旧版 DeepFlow 自定义导航栏(替代 VitePress 默认 navbar,
- // 默认导航已在 custom.css 中隐藏)
- 'layout-top': () => [
- h(SiteNavbar),
- // doc-only 变体的 doc 专属顶栏:常规构建也渲染,但 html 未标记
- // doc-only 时由 custom.css 隐藏(显隐机制与 SiteNavbar 一致)
- h(DocHeader)
- ],
- // 首页 hero:还原旧版 vdoing Home 布局(单行大标题 + 描述)
- 'home-hero-info': () => h(HomeHero),
- // 页脚:旧版深色链接矩阵 footer。组件内部按官方 VPFooter 的规则
- // 只在无侧边栏的页面(首页/404)渲染,内容页不显示
- 'layout-bottom': () => h(SiteFooter),
- // 嵌入式(iframe)移动端:内容区左上角的侧边栏悬浮按钮(默认隐藏,
- // 仅 html.embedded 且 <960px 显示,见 custom.css)
- 'doc-top': () => h(EmbeddedSidebarButton),
- // 侧边栏菜单上方的搜索 + 语言切换(自 SiteNavbar 迁来):iframe 嵌入
- // 模式下导航栏整体隐藏,这两项能力常驻侧边栏保持可用
- 'sidebar-nav-before': () => h(SidebarActions)
- })
- }
+ Layout: defineComponent({
+ setup() {
+ const route = useRoute()
+ const initZoom = () =>
+ mediumZoom('.vp-doc img:not(.no-zoom)', { background: 'var(--vp-c-bg)' })
+ onMounted(initZoom)
+ watch(
+ () => route.path,
+ () => nextTick(initZoom)
+ )
+ return () => h(DefaultTheme.Layout, null, {
+ // 顶部导航:还原旧版 DeepFlow 自定义导航栏(替代 VitePress 默认 navbar,
+ // 默认导航已在 custom.css 中隐藏)
+ 'layout-top': () => [
+ h(SiteNavbar),
+ // doc-only 变体的 doc 专属顶栏:常规构建也渲染,但 html 未标记
+ // doc-only 时由 custom.css 隐藏(显隐机制与 SiteNavbar 一致)
+ h(DocHeader)
+ ],
+ // 首页 hero:还原旧版 vdoing Home 布局(单行大标题 + 描述)
+ 'home-hero-info': () => h(HomeHero),
+ // 页脚:旧版深色链接矩阵 footer。组件内部按官方 VPFooter 的规则
+ // 只在无侧边栏的页面(首页/404)渲染,内容页不显示
+ 'layout-bottom': () => h(SiteFooter),
+ // 嵌入式(iframe)移动端:内容区左上角的侧边栏悬浮按钮(默认隐藏,
+ // 仅 html.embedded 且 <960px 显示,见 custom.css)
+ 'doc-top': () => h(EmbeddedSidebarButton),
+ 'doc-before': () => h(DocBreadcrumb),
+ // 侧边栏菜单上方的搜索 + 语言切换(自 SiteNavbar 迁来):iframe 嵌入
+ // 模式下导航栏整体隐藏,这两项能力常驻侧边栏保持可用
+ 'sidebar-nav-before': () => h(SidebarActions)
+ })
+ }
+ })
}
diff --git a/.vitepress/theme/markdown.css b/.vitepress/theme/markdown.css
index 022252b2..68367cab 100644
--- a/.vitepress/theme/markdown.css
+++ b/.vitepress/theme/markdown.css
@@ -1,66 +1,73 @@
-/* Shared DeepFlow Markdown styles for all VitePress documentation pages. */
+/* Documentation colors sampled from LobeHub docs (light and dark modes). */
:root {
- /* Semantic tokens from DeepFlow design.md — light mode. */
- --df-md-bg-0: #e9ecf2;
- --df-md-bg-0-1: #f4f5f7;
+ --df-md-font-sans: Geist, -apple-system, BlinkMacSystemFont, "Segoe UI Variable Display", "Segoe UI", Roboto, "Helvetica Neue", Arial, "HarmonyOS Sans SC", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", "Source Han Sans SC", "Noto Sans CJK SC", ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
+ --df-md-font-mono: "Geist Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, "Cascadia Code", Consolas, "Liberation Mono", monospace;
+ --df-md-font-normal: 400;
+ --df-md-font-strong: 600;
+ --df-md-font-heading: 700;
+ --df-md-reading-width: 680px;
+ --df-md-bg-0: #f8f8f8;
+ --df-md-bg-0-1: #f5f5f5;
--df-md-bg-1: #ffffff;
- --df-md-bg-2: #ffffff;
+ --df-md-bg-2: rgba(0, 0, 0, 0.016);
--df-md-bg-4: #ffffff;
- --df-md-fill-1: #f4f5f7;
- --df-md-fill-2: #e9ecf2;
- --df-md-fill-3: #d8dce5;
- --df-md-border-1: #e9ecf2;
- --df-md-border-2: #d8dce5;
- --df-md-border-3: #c1c9d6;
- --df-md-sidebar-divider: #d8dce5;
- --df-md-text-1: #18212e;
- --df-md-text-2: #3c485c;
- --df-md-text-3: #5a677a;
- --df-md-primary-6: #5a65f6;
- --df-md-primary-link: #5a65f6;
- --df-md-primary-hover: #4f46e5;
+ --df-md-fill-1: rgba(0, 0, 0, 0.03);
+ --df-md-fill-2: rgba(0, 0, 0, 0.06);
+ --df-md-fill-3: rgba(0, 0, 0, 0.12);
+ --df-md-border-1: #eeeeee;
+ --df-md-border-2: #e3e3e3;
+ --df-md-border-3: #dddddd;
+ --df-md-sidebar-divider: var(--df-md-border-1);
+ --df-md-text-1: #080808;
+ --df-md-text-2: #666666;
+ --df-md-text-3: #999999;
+ --df-md-primary-6: #222222;
+ --df-md-primary-hover: #333333;
+ --df-md-primary-link: #0072f5;
+ --df-md-link-hover: #4c90ff;
--df-md-text-on-primary: #ffffff;
- --df-md-mask-bg: rgba(0, 0, 0, 0.7);
- --df-md-success-border: #aff0b5;
- --df-md-success-bg: #e8ffea;
- --df-md-success-text: #008026;
- --df-md-warning-border: #ffe4ba;
- --df-md-warning-bg: #fff7e8;
- --df-md-warning-text: #d96a00;
- --df-md-danger-border: #fdcdc5;
- --df-md-danger-bg: #ffece8;
- --df-md-danger-text: #da3838;
+ --df-md-mask-bg: rgba(0, 0, 0, 0.44);
+ --df-md-success-border: #c7eabd;
+ --df-md-success-bg: #f4fdeb;
+ --df-md-success-text: #379d4a;
+ --df-md-warning-border: #ffd591;
+ /* Give warning callouts a visible amber tint on the white canvas. */
+ --df-md-warning-bg: #fff7e6;
+ --df-md-warning-text: #ee9e0b;
+ --df-md-danger-border: #ffcec5;
+ --df-md-danger-bg: #fff7f6;
+ --df-md-danger-text: #ec5e41;
}
.dark {
- /* The same roles resolve to the dark values in DeepFlow design.md. */
- --df-md-bg-0: #11151f;
- --df-md-bg-0-1: #161b29;
- --df-md-bg-1: #11151f;
- --df-md-bg-2: #161b29;
- --df-md-bg-4: #1f283d;
- --df-md-fill-1: rgba(255, 255, 255, 0.04);
- --df-md-fill-2: rgba(255, 255, 255, 0.08);
- --df-md-fill-3: rgba(255, 255, 255, 0.12);
- --df-md-border-1: #1e293b;
- --df-md-border-2: #2a3646;
- --df-md-border-3: #475569;
- --df-md-sidebar-divider: #1e293b;
- --df-md-text-1: #e2e8f0;
- --df-md-text-2: #cbd5e1;
- --df-md-text-3: #94a3b8;
- --df-md-primary-6: #5a65f6;
- --df-md-primary-link: #5a65f6;
- --df-md-primary-hover: #b1b3fa;
- --df-md-success-border: #0a802d;
- --df-md-success-bg: rgba(0, 180, 42, 0.12);
- --df-md-success-text: #b2f0b7;
- --df-md-warning-border: #a64b0a;
- --df-md-warning-bg: rgba(255, 125, 0, 0.12);
- --df-md-warning-text: #ff7d00;
- --df-md-danger-border: #a1161f;
- --df-md-danger-bg: rgba(245, 63, 63, 0.12);
- --df-md-danger-text: #f53f3f;
+ --df-md-bg-0: #000000;
+ --df-md-bg-0-1: #141414;
+ --df-md-bg-1: #151518;
+ --df-md-bg-2: rgba(255, 255, 255, 0.02);
+ --df-md-bg-4: #1a1a1a;
+ --df-md-fill-1: rgba(255, 255, 255, 0.06);
+ --df-md-fill-2: rgba(255, 255, 255, 0.10);
+ --df-md-fill-3: rgba(255, 255, 255, 0.16);
+ --df-md-border-1: #1a1a1a;
+ --df-md-border-2: #202020;
+ --df-md-border-3: #333333;
+ --df-md-text-1: #ffffff;
+ --df-md-text-2: #aaaaaa;
+ --df-md-text-3: #6f6f6f;
+ --df-md-primary-6: #eeeeee;
+ --df-md-primary-hover: #ffffff;
+ --df-md-primary-link: #0072f5;
+ --df-md-link-hover: #a7d3ff;
+ --df-md-text-on-primary: #080808;
+ --df-md-success-border: #4b6800;
+ --df-md-success-bg: #142100;
+ --df-md-success-text: #c4f042;
+ --df-md-warning-border: #916400;
+ --df-md-warning-bg: #2a1b00;
+ --df-md-warning-text: #ffb224;
+ --df-md-danger-border: #9d0042;
+ --df-md-danger-bg: #380015;
+ --df-md-danger-text: #f4416c;
}
body:has(.VPDoc) {
@@ -68,7 +75,7 @@ body:has(.VPDoc) {
}
.Layout:has(.VPDoc) .VPSidebar {
- --vp-sidebar-bg-color: var(--df-md-bg-0-1);
+ --vp-sidebar-bg-color: var(--df-md-bg-1);
--vp-c-text-1: var(--df-md-text-1);
--vp-c-text-2: var(--df-md-text-2);
--vp-c-text-3: var(--df-md-text-3);
@@ -91,28 +98,32 @@ body:has(.VPDoc) {
--shadow-1: none;
}
-.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.level-1.is-link > .item {
- width: calc(100% + 8px);
- margin-left: -8px;
- padding-left: 8px;
-}
-
-.Layout:has(.VPDoc) .VPSidebar .VPSidebarItem.level-1.is-link > .item:hover {
- border-radius: 4px;
- background-color: var(--df-md-fill-3);
-}
-
.Layout:has(.VPDoc) .VPDoc {
--vp-c-brand-1: var(--df-md-primary-link);
- --vp-c-brand-2: var(--df-md-primary-hover);
+ --vp-c-brand-2: var(--df-md-link-hover);
+ --vp-c-text-1: var(--df-md-text-1);
+ --vp-c-text-2: var(--df-md-text-2);
+ --vp-c-text-3: var(--df-md-text-3);
+ --vp-c-divider: var(--df-md-border-1);
+ --vp-c-border: var(--df-md-border-2);
+ --vp-c-bg-soft: var(--df-md-fill-1);
+ font-family: var(--df-md-font-sans);
}
.Layout:has(.VPDoc) .vp-doc {
--vp-code-font-size: 1em;
+ --vp-code-line-height: 1.8;
--vp-code-color: var(--df-md-text-1);
- --vp-code-bg: var(--df-md-fill-1);
+ --vp-code-bg: var(--df-md-fill-2);
--vp-code-block-bg: var(--df-md-bg-2);
--vp-code-block-divider-color: var(--df-md-border-2);
+ --vp-code-line-highlight-color: var(--df-md-fill-1);
+ --vp-code-line-error-color: var(--df-md-danger-bg);
+ --vp-code-line-warning-color: var(--df-md-warning-bg);
+ --vp-code-line-diff-add-color: var(--df-md-success-bg);
+ --vp-code-line-diff-add-symbol-color: var(--df-md-success-text);
+ --vp-code-line-diff-remove-color: var(--df-md-danger-bg);
+ --vp-code-line-diff-remove-symbol-color: var(--df-md-danger-text);
--vp-code-tab-bg: var(--df-md-fill-1);
--vp-code-tab-divider: var(--df-md-border-1);
--vp-code-tab-text-color: var(--df-md-text-3);
@@ -123,10 +134,11 @@ body:has(.VPDoc) {
--vp-code-copy-code-bg: var(--df-md-fill-1);
--vp-code-copy-code-hover-border-color: var(--df-md-primary-6);
--vp-code-copy-code-hover-bg: var(--df-md-fill-2);
- color: var(--df-md-text-2);
- font-family: "PingFang SC", "Microsoft YaHei", system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
+ color: var(--df-md-text-1);
+ font-family: var(--df-md-font-sans);
+ font-weight: var(--df-md-font-normal);
font-size: 16px;
- line-height: 1.7;
+ line-height: 1.8;
overflow-wrap: break-word;
}
@@ -142,25 +154,31 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc h1,
.Layout:has(.VPDoc) .vp-doc h2,
.Layout:has(.VPDoc) .vp-doc h3,
-.Layout:has(.VPDoc) .vp-doc h4 {
+.Layout:has(.VPDoc) .vp-doc h4,
+.Layout:has(.VPDoc) .vp-doc h5,
+.Layout:has(.VPDoc) .vp-doc h6 {
color: var(--df-md-text-1);
- font-weight: 500;
- letter-spacing: -0.02em;
+ font-weight: var(--df-md-font-heading);
+ letter-spacing: normal;
}
.Layout:has(.VPDoc) .vp-doc h1 {
- margin: 0 0 20px;
- font-size: 32px;
- line-height: 1.3;
+ margin: 0 0 24px;
+ font-size: 40px;
+ line-height: 1.25;
}
-.Layout:has(.VPDoc) .vp-doc h2 {
- --df-md-heading-padding-top: 16px;
+.Layout:has(.VPDoc) .vp-doc h1 ~ h1 {
margin-top: 48px;
+}
+
+.Layout:has(.VPDoc) .vp-doc h2 {
+ --df-md-heading-padding-top: 0px;
+ margin: 40px 0 20px;
padding-top: var(--df-md-heading-padding-top);
- border-top: 1px solid var(--df-md-border-1);
- font-size: 24px;
- line-height: 1.35;
+ border-top: 0;
+ font-size: 32px;
+ line-height: 1.25;
}
.Layout:has(.VPDoc) .vp-doc h2 .header-anchor {
@@ -168,18 +186,27 @@ body:has(.VPDoc) {
}
.Layout:has(.VPDoc) .vp-doc h3 {
- margin-top: 32px;
+ margin: 32px 0 16px;
+ font-size: 24px;
+ line-height: 1.25;
+}
+
+.Layout:has(.VPDoc) .vp-doc h4 {
+ margin: 28px 0 12px;
font-size: 20px;
line-height: 1.4;
}
-.Layout:has(.VPDoc) .vp-doc h4 {
+.Layout:has(.VPDoc) .vp-doc h5,
+.Layout:has(.VPDoc) .vp-doc h6 {
+ margin: 24px 0 12px;
font-size: 16px;
+ line-height: 1.5;
}
.Layout:has(.VPDoc) .vp-doc p,
.Layout:has(.VPDoc) .vp-doc li {
- line-height: 1.7;
+ line-height: 1.8;
}
.Layout:has(.VPDoc) .vp-doc p {
@@ -188,19 +215,20 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc strong {
color: var(--df-md-text-1);
- font-weight: 500;
+ font-weight: var(--df-md-font-strong);
}
.Layout:has(.VPDoc) .vp-doc a:not(.header-anchor) {
color: var(--df-md-primary-link);
+ font-weight: inherit;
text-decoration-color: var(--df-md-primary-link);
text-decoration-thickness: 1px;
text-underline-offset: 3px;
}
.Layout:has(.VPDoc) .vp-doc a:not(.header-anchor):hover {
- color: var(--df-md-primary-hover);
- text-decoration-color: var(--df-md-primary-hover);
+ color: var(--df-md-link-hover);
+ text-decoration-color: var(--df-md-link-hover);
}
.Layout:has(.VPDoc) .vp-doc a:focus-visible,
@@ -212,20 +240,20 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc :not(pre) > code {
padding: 0.14em 0.34em;
- border: 1px solid var(--df-md-border-1);
+ border: 0;
border-radius: 4px;
- background-color: var(--df-md-fill-1);
+ background-color: var(--df-md-fill-2);
color: var(--df-md-text-1);
font-size: var(--vp-code-font-size);
- font-weight: 500;
+ font-weight: var(--df-md-font-normal);
overflow-wrap: break-word;
}
.Layout:has(.VPDoc) .vp-doc blockquote {
margin: 24px 0;
padding: 8px 0 8px 16px;
- border-left: 2px solid var(--df-md-primary-6);
- color: var(--df-md-text-3);
+ border-left: 2px solid var(--df-md-border-3);
+ color: var(--df-md-text-2);
}
.Layout:has(.VPDoc) .vp-doc blockquote p {
@@ -251,7 +279,7 @@ body:has(.VPDoc) {
}
.Layout:has(.VPDoc) .vp-doc li::marker {
- color: var(--df-md-primary-link);
+ color: var(--df-md-text-3);
}
.Layout:has(.VPDoc) .vp-doc input[type='checkbox'] {
@@ -261,14 +289,14 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc div[class*='language-'] {
margin: 20px 0 24px;
border: 1px solid var(--df-md-border-1);
- border-radius: 6px;
+ border-radius: 12px;
background-color: var(--df-md-bg-2);
box-shadow: none;
}
.Layout:has(.VPDoc) .vp-doc div[class*='language-'] pre {
- font-size: 13px;
- line-height: 1.7;
+ font-size: 14px;
+ line-height: 1.8;
}
.Layout:has(.VPDoc) .vp-doc .vp-code-group {
@@ -278,39 +306,39 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc .vp-code-group .tabs {
border: 1px solid var(--df-md-border-1);
border-bottom: 0;
- border-radius: 6px 6px 0 0;
+ border-radius: 12px 12px 0 0;
}
.Layout:has(.VPDoc) .vp-doc .vp-code-group div[class*='language-'] {
margin: 0;
- border-radius: 0 0 6px 6px;
+ border-radius: 0 0 12px 12px;
}
.Layout:has(.VPDoc) .vp-doc table {
- display: table;
- width: 100%;
+ display: block;
+ width: fit-content;
max-width: 100%;
margin: 20px 0 24px;
overflow-x: auto;
border: 1px solid var(--df-md-border-1);
- border-radius: 6px;
+ border-radius: 12px;
border-collapse: separate;
border-spacing: 0;
- font-size: 14px;
+ font-size: 16px;
}
.Layout:has(.VPDoc) .vp-doc tr,
.Layout:has(.VPDoc) .vp-doc tr:nth-child(2n) {
border: 0;
- background-color: var(--df-md-bg-2);
+ background-color: var(--df-md-bg-1);
}
.Layout:has(.VPDoc) .vp-doc th,
.Layout:has(.VPDoc) .vp-doc td {
- padding: 10px 12px;
+ padding: 12px 16px;
border: 0;
border-bottom: 1px solid var(--df-md-border-1);
- color: var(--df-md-text-2);
+ color: var(--df-md-text-1);
text-align: left;
vertical-align: top;
}
@@ -318,8 +346,8 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc th {
background-color: var(--df-md-fill-1);
color: var(--df-md-text-1);
- font-size: 14px;
- font-weight: 500;
+ font-size: inherit;
+ font-weight: var(--df-md-font-heading);
}
.Layout:has(.VPDoc) .vp-doc tr:last-child td {
@@ -328,11 +356,11 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc .custom-block {
margin: 20px 0;
- padding: 14px 16px;
+ padding: 12px 16px;
border: 1px solid var(--df-md-border-1);
- border-radius: 6px;
+ border-radius: 12px;
background-color: var(--df-md-fill-1);
- color: var(--df-md-text-2);
+ color: var(--df-md-text-1);
box-shadow: none;
}
@@ -381,7 +409,8 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc .custom-block-title {
color: var(--df-md-text-1);
- font-weight: 500;
+ font-size: 14px;
+ font-weight: var(--df-md-font-strong);
}
.Layout:has(.VPDoc) .vp-doc .custom-block.tip .custom-block-title,
@@ -390,7 +419,9 @@ body:has(.VPDoc) {
}
.Layout:has(.VPDoc) .vp-doc .custom-block.tip .custom-block-title,
+.Layout:has(.VPDoc) .vp-doc .custom-block.info .custom-block-title,
.Layout:has(.VPDoc) .vp-doc .custom-block.warning .custom-block-title,
+.Layout:has(.VPDoc) .vp-doc .custom-block.success .custom-block-title,
.Layout:has(.VPDoc) .vp-doc .custom-block.danger .custom-block-title {
display: flex;
align-items: center;
@@ -398,6 +429,8 @@ body:has(.VPDoc) {
}
.Layout:has(.VPDoc) .vp-doc .custom-block.tip .custom-block-title::before,
+.Layout:has(.VPDoc) .vp-doc .custom-block.info .custom-block-title::before,
+.Layout:has(.VPDoc) .vp-doc .custom-block.success .custom-block-title::before,
.Layout:has(.VPDoc) .vp-doc .custom-block.warning .custom-block-title::before,
.Layout:has(.VPDoc) .vp-doc .custom-block.danger .custom-block-title::before {
content: '';
@@ -420,7 +453,7 @@ body:has(.VPDoc) {
.Layout:has(.VPDoc) .vp-doc .custom-block p {
color: var(--df-md-text-2);
- line-height: 1.7;
+ line-height: 1.8;
}
.Layout:has(.VPDoc) .vp-doc .footnotes {
@@ -432,22 +465,117 @@ body:has(.VPDoc) {
border-color: var(--df-md-border-1);
}
+/* Smaller Markdown elements, media and legacy content use the same palette. */
+.Layout:has(.VPDoc) .vp-doc :is(hr, .footnotes-sep) {
+ height: 0;
+ margin: 32px 0;
+ border: 0;
+ border-top: 1px solid var(--df-md-border-1);
+}
+
+.Layout:has(.VPDoc) .vp-doc :is(h1, h2, h3, h4, h5, h6) .header-anchor {
+ color: var(--df-md-primary-link);
+ font-weight: var(--df-md-font-heading);
+}
+
+.Layout:has(.VPDoc) .vp-doc li + li { margin-top: 6px; }
+.Layout:has(.VPDoc) .vp-doc li > :is(ul, ol) { margin: 8px 0; }
+.Layout:has(.VPDoc) .vp-doc .contains-task-list { list-style: none; padding-left: 0; }
+.Layout:has(.VPDoc) .vp-doc .task-list-item { padding-left: 0; }
+.Layout:has(.VPDoc) .vp-doc .task-list-item input { margin-right: 8px; }
+
+.Layout:has(.VPDoc) .vp-doc kbd {
+ padding: 2px 6px;
+ border: 1px solid var(--df-md-border-2);
+ border-radius: 4px;
+ background: var(--df-md-fill-1);
+ color: var(--df-md-text-2);
+ font-size: 13px;
+}
+
+.Layout:has(.VPDoc) .vp-doc mark {
+ padding: 1px 3px;
+ border-radius: 3px;
+ background: var(--df-md-warning-bg);
+ color: var(--df-md-text-1);
+}
+
+.Layout:has(.VPDoc) .vp-doc :is(s, del) { color: var(--df-md-text-3); }
+.Layout:has(.VPDoc) .vp-doc sup,
+.Layout:has(.VPDoc) .vp-doc sub { line-height: 0; }
+
+.Layout:has(.VPDoc) .vp-doc div[class*='language-'] .line-numbers-wrapper {
+ border-color: var(--df-md-border-2);
+ color: var(--df-md-text-3);
+ font-size: 14px;
+ line-height: 1.8;
+}
+
+.Layout:has(.VPDoc) .vp-doc div[class*='language-'] > span.lang {
+ color: var(--df-md-text-3);
+ font-size: 12px;
+}
+
+.Layout:has(.VPDoc) .vp-doc div[class*='language-'] > button.copy {
+ width: 32px;
+ height: 32px;
+ top: 8px;
+ right: 8px;
+ border-radius: 6px;
+}
+
+.Layout:has(.VPDoc) .vp-doc .vp-code-group .tabs label {
+ font-size: 13px;
+ font-weight: 500;
+}
+
+.Layout:has(.VPDoc) .vp-doc :is(img, video, iframe) {
+ max-width: 100%;
+ border-radius: 12px;
+}
+.Layout:has(.VPDoc) .vp-doc img { height: auto; margin: 24px auto; }
+.Layout:has(.VPDoc) .vp-doc .mermaid { margin: 24px 0; overflow-x: auto; }
+.Layout:has(.VPDoc) .vp-doc .csv-box { display: block; width: 100%; }
+.Layout:has(.VPDoc) .vp-doc .csv-url { color: var(--df-md-text-3); font-size: 13px; }
+
+.Layout:has(.VPDoc) .vp-doc .custom-block > :first-child { margin-top: 0; }
+.Layout:has(.VPDoc) .vp-doc .custom-block > :last-child { margin-bottom: 0; }
+.Layout:has(.VPDoc) .vp-doc .custom-block .custom-block-title + p { margin-top: 8px; }
+.Layout:has(.VPDoc) .vp-doc .custom-block.details > summary {
+ color: var(--df-md-text-2);
+ font-size: 14px;
+ font-weight: var(--df-md-font-strong);
+ cursor: pointer;
+}
+.Layout:has(.VPDoc) .vp-doc .custom-block.details > summary:hover { color: var(--df-md-text-1); }
+.Layout:has(.VPDoc) .vp-doc .custom-block.info {
+ --df-md-callout-icon: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='12' cy='12' r='10'/%3E%3Cpath d='M12 16v-4M12 8h.01'/%3E%3C/svg%3E");
+ border-color: var(--df-md-border-1);
+ background: var(--df-md-fill-1);
+}
+.Layout:has(.VPDoc) .vp-doc .custom-block.info .custom-block-title {
+ color: var(--df-md-primary-link);
+}
+
+.Layout:has(.VPDoc) .vp-doc .footnote-ref { font-size: 0.8em; }
+.Layout:has(.VPDoc) .vp-doc .footnotes li::marker { color: var(--df-md-text-3); }
+
@media (max-width: 640px) {
.Layout:has(.VPDoc) .vp-doc h1 {
- font-size: 28px;
+ font-size: 32px;
}
.Layout:has(.VPDoc) .vp-doc h2 {
- margin-top: 40px;
- font-size: 22px;
+ margin-top: 32px;
+ font-size: 26px;
}
.Layout:has(.VPDoc) .vp-doc h3 {
- font-size: 18px;
+ font-size: 22px;
}
.Layout:has(.VPDoc) .vp-doc table {
display: block;
- white-space: nowrap;
+ font-size: 14px;
}
}
diff --git a/.vitepress/theme/search.css b/.vitepress/theme/search.css
index ee30b884..756468f9 100644
--- a/.vitepress/theme/search.css
+++ b/.vitepress/theme/search.css
@@ -1,5 +1,5 @@
-/* The local-search dialog is teleported to body; it shares the DeepFlow tokens. */
-.VPLocalSearchBox {
+/* The local-search dialog is teleported to body; it shares the documentation theme tokens. */
+.VPLocalSearchBox.VPLocalSearchBox {
--vp-c-brand-1: var(--df-md-primary-6);
--vp-c-brand-2: var(--df-md-primary-hover);
--vp-c-text-1: var(--df-md-text-1);
@@ -7,6 +7,7 @@
--vp-c-text-3: var(--df-md-text-3);
--vp-c-divider: var(--df-md-border-2);
--vp-code-color: var(--df-md-text-1);
+ --vp-font-family-mono: var(--df-md-font-mono);
--vp-code-bg: var(--df-md-fill-1);
--vp-backdrop-bg-color: var(--df-md-mask-bg);
--vp-local-search-bg: var(--df-md-bg-4);
@@ -14,43 +15,92 @@
--vp-local-search-result-border: var(--df-md-border-1);
--vp-local-search-result-selected-bg: var(--df-md-fill-1);
--vp-local-search-result-selected-border: var(--df-md-primary-6);
- --vp-local-search-highlight-bg: var(--df-md-primary-6);
- --vp-local-search-highlight-text: var(--df-md-text-on-primary);
+ --vp-local-search-highlight-bg: var(--df-md-primary-link);
+ --vp-local-search-highlight-text: var(--df-md-bg-1);
color: var(--df-md-text-1);
+ font-family: var(--df-md-font-sans);
}
-.VPLocalSearchBox .shell {
+.VPLocalSearchBox.VPLocalSearchBox .shell {
border: 1px solid var(--df-md-border-2);
+ width: min(720px, calc(100vw - 48px));
+ padding: 16px;
+ border-radius: 16px;
}
-.VPLocalSearchBox .search-bar {
+.VPLocalSearchBox.VPLocalSearchBox .search-bar {
background-color: var(--df-md-fill-1);
+ min-height: 48px;
+ border-color: var(--df-md-border-1);
+ border-radius: 10px;
}
-.VPLocalSearchBox .search-input {
+.VPLocalSearchBox.VPLocalSearchBox .search-bar:focus-within {
+ border-color: var(--df-md-primary-6);
+}
+
+.VPLocalSearchBox.VPLocalSearchBox .search-input {
color: var(--df-md-text-1);
+ font-size: 16px;
+ line-height: 1.5;
}
-.VPLocalSearchBox .search-input::placeholder,
-.VPLocalSearchBox .search-icon,
-.VPLocalSearchBox .search-actions,
-.VPLocalSearchBox .no-results {
+.VPLocalSearchBox.VPLocalSearchBox .search-input::placeholder,
+.VPLocalSearchBox.VPLocalSearchBox .search-icon,
+.VPLocalSearchBox.VPLocalSearchBox .search-actions,
+.VPLocalSearchBox.VPLocalSearchBox .no-results {
color: var(--df-md-text-3);
}
-.VPLocalSearchBox .result {
+.VPLocalSearchBox.VPLocalSearchBox .result {
background-color: var(--vp-local-search-result-bg);
color: var(--df-md-text-2);
+ border-radius: 10px;
+}
+
+.VPLocalSearchBox.VPLocalSearchBox .results { gap: 8px; }
+.VPLocalSearchBox.VPLocalSearchBox .search-actions button { border-radius: 6px; }
+.VPLocalSearchBox.VPLocalSearchBox .search-actions button:not(:disabled):hover {
+ background-color: var(--df-md-fill-2);
+ color: var(--df-md-primary-6);
}
+.VPLocalSearchBox.VPLocalSearchBox .no-results { font-size: 14px; }
-.VPLocalSearchBox .search-keyboard-shortcuts {
+.VPLocalSearchBox.VPLocalSearchBox .excerpt .vp-doc {
+ color: var(--df-md-text-2);
+ font-family: var(--df-md-font-sans);
+ --vp-code-block-bg: var(--df-md-fill-1);
+ --vp-c-bg: var(--df-md-bg-4);
+ --vp-c-bg-soft: var(--df-md-fill-1);
+}
+
+.VPLocalSearchBox.VPLocalSearchBox .search-keyboard-shortcuts {
color: var(--df-md-text-3);
opacity: 1;
+ border-top: 1px solid var(--df-md-border-1);
+ padding-top: 12px;
+ font-size: 12px;
}
-.VPLocalSearchBox .search-keyboard-shortcuts kbd {
+.VPLocalSearchBox.VPLocalSearchBox .search-keyboard-shortcuts kbd {
background-color: var(--df-md-fill-1);
border-color: var(--df-md-border-2);
color: var(--df-md-text-2);
box-shadow: none;
}
+
+.VPLocalSearchBox.VPLocalSearchBox :is(a, button):focus-visible {
+ outline: 2px solid var(--df-md-primary-6);
+ outline-offset: 2px;
+}
+
+@media (max-width: 767px) {
+ .VPLocalSearchBox.VPLocalSearchBox .shell {
+ margin: 0;
+ width: 100%;
+ height: 100dvh;
+ max-height: 100dvh;
+ border: 0;
+ border-radius: 0;
+ }
+}