Skip to content

Commit 9a4ee07

Browse files
authoredAug 8, 2023
fix(theme): fix sidebar collapsing and restore base property (#2753)
1 parent 5ef1195 commit 9a4ee07

File tree

4 files changed

+67
-50
lines changed

4 files changed

+67
-50
lines changed
 

‎docs/.vitepress/config.ts

+37-37
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ export default defineConfig({
5353
nav: nav(),
5454

5555
sidebar: {
56-
'/guide/': sidebarGuide(),
57-
'/reference/': sidebarReference()
56+
'/guide/': { base: '/guide/', items: sidebarGuide() },
57+
'/reference/': { base: '/reference/', items: sidebarReference() }
5858
},
5959

6060
editLink: {
@@ -122,72 +122,72 @@ function sidebarGuide(): DefaultTheme.SidebarItem[] {
122122
text: 'Introduction',
123123
collapsed: false,
124124
items: [
125-
{ text: 'What is VitePress?', link: '/guide/what-is-vitepress' },
126-
{ text: 'Getting Started', link: '/guide/getting-started' },
127-
{ text: 'Routing', link: '/guide/routing' },
128-
{ text: 'Deploy', link: '/guide/deploy' }
125+
{ text: 'What is VitePress?', link: 'what-is-vitepress' },
126+
{ text: 'Getting Started', link: 'getting-started' },
127+
{ text: 'Routing', link: 'routing' },
128+
{ text: 'Deploy', link: 'deploy' }
129129
]
130130
},
131131
{
132132
text: 'Writing',
133133
collapsed: false,
134134
items: [
135-
{ text: 'Markdown Extensions', link: '/guide/markdown' },
136-
{ text: 'Asset Handling', link: '/guide/asset-handling' },
137-
{ text: 'Frontmatter', link: '/guide/frontmatter' },
138-
{ text: 'Using Vue in Markdown', link: '/guide/using-vue' },
139-
{ text: 'Internationalization', link: '/guide/i18n' }
135+
{ text: 'Markdown Extensions', link: 'markdown' },
136+
{ text: 'Asset Handling', link: 'asset-handling' },
137+
{ text: 'Frontmatter', link: 'frontmatter' },
138+
{ text: 'Using Vue in Markdown', link: 'using-vue' },
139+
{ text: 'Internationalization', link: 'i18n' }
140140
]
141141
},
142142
{
143143
text: 'Customization',
144144
collapsed: false,
145145
items: [
146-
{ text: 'Using a Custom Theme', link: '/guide/custom-theme' },
147-
{ text: 'Extending the Default Theme', link: '/guide/extending-default-theme' },
148-
{ text: 'Build-Time Data Loading', link: '/guide/data-loading' },
149-
{ text: 'SSR Compatibility', link: '/guide/ssr-compat' },
150-
{ text: 'Connecting to a CMS', link: '/guide/cms' }
146+
{ text: 'Using a Custom Theme', link: 'custom-theme' },
147+
{ text: 'Extending the Default Theme', link: 'extending-default-theme' },
148+
{ text: 'Build-Time Data Loading', link: 'data-loading' },
149+
{ text: 'SSR Compatibility', link: 'ssr-compat' },
150+
{ text: 'Connecting to a CMS', link: 'cms' }
151151
]
152152
},
153153
{
154154
text: 'Experimental',
155155
collapsed: false,
156156
items: [
157-
{ text: 'MPA Mode', link: '/guide/mpa-mode' },
158-
{ text: 'Sitemap Generation', link: '/guide/sitemap-generation' }
157+
{ text: 'MPA Mode', link: 'mpa-mode' },
158+
{ text: 'Sitemap Generation', link: 'sitemap-generation' }
159159
]
160160
},
161-
{ text: 'Config & API Reference', link: '/reference/site-config' }
161+
{ text: 'Config & API Reference', base: '/reference/', link: 'site-config' }
162162
]
163163
}
164164

165-
/* prettier-ignore */
166165
function sidebarReference(): DefaultTheme.SidebarItem[] {
167166
return [
168167
{
169168
text: 'Reference',
170169
items: [
171-
{ text: 'Site Config', link: '/reference/site-config' },
172-
{ text: 'Frontmatter Config', link: '/reference/frontmatter-config' },
173-
{ text: 'Runtime API', link: '/reference/runtime-api' },
174-
{ text: 'CLI', link: '/reference/cli' },
170+
{ text: 'Site Config', link: 'site-config' },
171+
{ text: 'Frontmatter Config', link: 'frontmatter-config' },
172+
{ text: 'Runtime API', link: 'runtime-api' },
173+
{ text: 'CLI', link: 'cli' },
175174
{
176175
text: 'Default Theme',
176+
base: '/reference/default-theme-',
177177
items: [
178-
{ text: 'Overview', link: '/reference/default-theme-config' },
179-
{ text: 'Nav', link: '/reference/default-theme-nav' },
180-
{ text: 'Sidebar', link: '/reference/default-theme-sidebar' },
181-
{ text: 'Home Page', link: '/reference/default-theme-home-page' },
182-
{ text: 'Footer', link: '/reference/default-theme-footer' },
183-
{ text: 'Layout', link: '/reference/default-theme-layout' },
184-
{ text: 'Badge', link: '/reference/default-theme-badge' },
185-
{ text: 'Team Page', link: '/reference/default-theme-team-page' },
186-
{ text: 'Prev / Next Links', link: '/reference/default-theme-prev-next-links' },
187-
{ text: 'Edit Link', link: '/reference/default-theme-edit-link' },
188-
{ text: 'Last Updated Timestamp', link: '/reference/default-theme-last-updated' },
189-
{ text: 'Search', link: '/reference/default-theme-search' },
190-
{ text: 'Carbon Ads', link: '/reference/default-theme-carbon-ads' }
178+
{ text: 'Overview', link: 'config' },
179+
{ text: 'Nav', link: 'nav' },
180+
{ text: 'Sidebar', link: 'sidebar' },
181+
{ text: 'Home Page', link: 'home-page' },
182+
{ text: 'Footer', link: 'footer' },
183+
{ text: 'Layout', link: 'layout' },
184+
{ text: 'Badge', link: 'badge' },
185+
{ text: 'Team Page', link: 'team-page' },
186+
{ text: 'Prev / Next Links', link: 'prev-next-links' },
187+
{ text: 'Edit Link', link: 'edit-link' },
188+
{ text: 'Last Updated Timestamp', link: 'last-updated' },
189+
{ text: 'Search', link: 'search' },
190+
{ text: 'Carbon Ads', link: 'carbon-ads' }
191191
]
192192
}
193193
]

‎src/client/theme-default/composables/sidebar.ts

+9-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
1+
import { useMediaQuery } from '@vueuse/core'
2+
import type { DefaultTheme } from 'vitepress/theme'
13
import {
2-
type ComputedRef,
3-
type Ref,
44
computed,
55
onMounted,
66
onUnmounted,
77
ref,
8+
watch,
89
watchEffect,
9-
watch
10+
watchPostEffect,
11+
type ComputedRef,
12+
type Ref
1013
} from 'vue'
11-
import { useMediaQuery } from '@vueuse/core'
12-
import { useRoute } from 'vitepress'
13-
import type { DefaultTheme } from 'vitepress/theme'
1414
import { inBrowser, isActive } from '../../shared'
1515
import {
1616
hasActiveLink as containsActiveLink,
@@ -30,15 +30,14 @@ export interface SidebarControl {
3030
}
3131

3232
export function useSidebar() {
33-
const route = useRoute()
34-
const { theme, frontmatter } = useData()
33+
const { frontmatter, page, theme } = useData()
3534
const is960 = useMediaQuery('(min-width: 960px)')
3635

3736
const isOpen = ref(false)
3837

3938
const sidebar = computed(() => {
4039
const sidebarConfig = theme.value.sidebar
41-
const relativePath = route.data.relativePath
40+
const relativePath = page.value.relativePath
4241
return sidebarConfig ? getSidebar(sidebarConfig, relativePath) : []
4342
})
4443

@@ -176,7 +175,7 @@ export function useSidebarControl(
176175
collapsed.value = !!(collapsible.value && item.value.collapsed)
177176
})
178177

179-
watchEffect(() => {
178+
watchPostEffect(() => {
180179
;(isActiveLink.value || hasActiveLink.value) && (collapsed.value = false)
181180
})
182181

‎src/client/theme-default/support/sidebar.ts

+15-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function getSidebar(
2020
_sidebar: DefaultTheme.Sidebar | undefined,
2121
path: string
2222
): SidebarItem[] {
23-
if (Array.isArray(_sidebar)) return _sidebar
23+
if (Array.isArray(_sidebar)) return addBase(_sidebar)
2424
if (_sidebar == null) return []
2525

2626
path = ensureStartingSlash(path)
@@ -34,7 +34,10 @@ export function getSidebar(
3434
return path.startsWith(ensureStartingSlash(dir))
3535
})
3636

37-
return dir ? _sidebar[dir] : []
37+
const sidebar = dir ? _sidebar[dir] : []
38+
return Array.isArray(sidebar)
39+
? addBase(sidebar)
40+
: addBase(sidebar.items, sidebar.base)
3841
}
3942

4043
/**
@@ -104,3 +107,13 @@ export function hasActiveLink(
104107
? hasActiveLink(path, items.items)
105108
: false
106109
}
110+
111+
function addBase(items: SidebarItem[], _base?: string): SidebarItem[] {
112+
return [...items].map((_item) => {
113+
const item = { ..._item }
114+
const base = item.base || _base
115+
if (base && item.link) item.link = base + item.link
116+
if (item.items) item.items = addBase(item.items, base)
117+
return item
118+
})
119+
}

‎types/default-theme.d.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ export namespace DefaultTheme {
202202
export type Sidebar = SidebarItem[] | SidebarMulti
203203

204204
export interface SidebarMulti {
205-
[path: string]: SidebarItem[]
205+
[path: string]: SidebarItem[] | { items: SidebarItem[]; base: string }
206206
}
207207

208208
export type SidebarItem = {
@@ -230,6 +230,11 @@ export namespace DefaultTheme {
230230
*/
231231
collapsed?: boolean
232232

233+
/**
234+
* Base path for the children items.
235+
*/
236+
base?: string
237+
233238
/**
234239
* Customize text that appears on the footer of previous/next page.
235240
*/

0 commit comments

Comments
 (0)
Please sign in to comment.