diff --git a/theme/src/client/components/VPDoc.vue b/theme/src/client/components/VPDoc.vue
index a5099149..78ed99f0 100644
--- a/theme/src/client/components/VPDoc.vue
+++ b/theme/src/client/components/VPDoc.vue
@@ -6,6 +6,7 @@ import VPDocAside from '@theme/VPDocAside.vue'
import VPDocFooter from '@theme/VPDocFooter.vue'
import VPEncryptPage from '@theme/VPEncryptPage.vue'
import VPDocMeta from '@theme/VPDocMeta.vue'
+import VPDocBreadcrumbs from '@theme/VPDocBreadcrumbs.vue'
import {
useBlogPageData,
useData,
@@ -116,6 +117,7 @@ watch(
+
+import { computed } from 'vue'
+import { useRouteLocale } from 'vuepress/client'
+import VPLink from '@theme/VPLink.vue'
+import {
+ useBlogExtract,
+ useBlogNavTitle,
+ useBlogPageData,
+ useData,
+ useSidebarData,
+} from '../composables/index.js'
+import type { ResolvedSidebarItem } from '../../shared/index.js'
+
+interface Breadcrumb {
+ text: string
+ link?: string
+ current?: boolean
+}
+
+const { page } = useData<'post'>()
+const routeLocale = useRouteLocale()
+const { isBlogPost } = useBlogPageData()
+const { categoriesLink, blogLink } = useBlogExtract()
+const sidebar = useSidebarData()
+
+const hasBreadcrumb = computed(() => {
+ if (isBlogPost.value && page.value.categoryList)
+ return page.value.categoryList.length > 0
+ return sidebar.value.length > 0
+})
+const homeTitle = useBlogNavTitle('home')
+const blogTile = useBlogNavTitle('blog')
+
+const breadcrumbList = computed(() => {
+ if (!hasBreadcrumb.value)
+ return []
+ const list: Breadcrumb[] = [{ text: homeTitle.value, link: routeLocale.value }]
+
+ if (isBlogPost.value) {
+ list.push({ text: blogTile.value, link: blogLink.value })
+ const categoryList = page.value.categoryList ?? []
+ for (const category of categoryList) {
+ list.push({
+ text: category.name,
+ link: `${categoriesLink.value}?id=${category.id}`,
+ })
+ }
+ }
+ else if (sidebar.value.length > 0) {
+ list.push(...(resolveSidebar(sidebar.value) || []))
+ }
+ list.push({ text: page.value.title, link: page.value.path, current: true })
+ return list
+})
+
+function resolveSidebar(
+ sidebar: ResolvedSidebarItem[],
+ result: Breadcrumb[] = [],
+): Breadcrumb[] | null {
+ for (const item of sidebar) {
+ if (item.link === page.value.path) {
+ return result
+ }
+ else if (item.items) {
+ const res = resolveSidebar(
+ item.items,
+ [...result, { text: item.text!, link: item.link }],
+ )
+ if (res)
+ return res
+ }
+ }
+ return null
+}
+
+
+
+
+
+
+
diff --git a/theme/src/client/components/VPDocMeta.vue b/theme/src/client/components/VPDocMeta.vue
index ed298519..db794b2c 100644
--- a/theme/src/client/components/VPDocMeta.vue
+++ b/theme/src/client/components/VPDocMeta.vue
@@ -1,19 +1,11 @@
-
-
-
- {{ name }}
-
- ›
-
-
{{ page.title }}