Skip to content

Commit 5d2fc3f

Browse files
authored
feat(theme): allow removing badge text from outline (#1825)
1 parent 977dad0 commit 5d2fc3f

File tree

6 files changed

+27
-6
lines changed

6 files changed

+27
-6
lines changed

src/client/theme-default/components/VPDocAsideOutline.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ const pageOutline = computed<DefaultTheme.Config['outline']>(
1717
1818
const onContentUpdated = inject('onContentUpdated') as Ref<() => void>
1919
onContentUpdated.value = () => {
20-
headers.value = getHeaders(pageOutline.value)
20+
headers.value = getHeaders(pageOutline.value, theme.value.outlineBadges)
2121
}
2222
2323
const headers = ref<MenuItem[]>([])

src/client/theme-default/composables/outline.ts

+16-2
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,30 @@ export type MenuItem = Omit<Header, 'slug' | 'children'> & {
1111
children?: MenuItem[]
1212
}
1313

14-
export function getHeaders(pageOutline: DefaultTheme.Config['outline']) {
14+
export function getHeaders(
15+
pageOutline: DefaultTheme.Config['outline'],
16+
outlineBadges: DefaultTheme.Config['outlineBadges']
17+
) {
1518
if (pageOutline === false) return []
1619
let updatedHeaders: MenuItem[] = []
20+
1721
document
1822
.querySelectorAll<HTMLHeadingElement>('h2, h3, h4, h5, h6')
1923
.forEach((el) => {
2024
if (el.textContent && el.id) {
25+
let title = el.textContent
26+
27+
if (outlineBadges === false) {
28+
const clone = el.cloneNode(true) as HTMLElement
29+
for (const child of clone.querySelectorAll('.VPBadge')) {
30+
child.remove()
31+
}
32+
title = clone.textContent || ''
33+
}
34+
2135
updatedHeaders.push({
2236
level: Number(el.tagName[1]),
23-
title: el.innerText.replace(/\s+#\s*$/, ''),
37+
title: title.replace(/\s+#\s*$/, ''),
2438
link: `#${el.id}`
2539
})
2640
}

src/client/tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
"declaration": true,
1010
"declarationDir": "../../dist/client-types",
1111
"jsx": "preserve",
12-
"lib": ["ESNext", "DOM"],
12+
"lib": ["esnext", "dom", "dom.iterable"],
1313
"types": ["vite/client"],
1414
"paths": {
1515
"vitepress": ["index.ts"],

src/shared/tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"extends": "../../tsconfig.json",
33
"compilerOptions": {
44
"baseUrl": ".",
5-
"lib": ["ESNext", "DOM"]
5+
"lib": ["esnext", "dom", "dom.iterable"]
66
},
77
"include": ["."]
88
}

tsconfig.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"preserveValueImports": true,
1313
"importsNotUsedAsValues": "error",
1414
"jsx": "preserve",
15-
"lib": ["ESNext", "DOM"]
15+
"lib": ["esnext", "dom", "dom.iterable"]
1616
},
1717
"exclude": ["**/node_modules/**", "**/dist/**"]
1818
}

types/default-theme.d.ts

+7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@ export namespace DefaultTheme {
2222
*/
2323
outline?: Outline | Outline['level'] | false
2424

25+
/**
26+
* Disable this to hide badge text from outline.
27+
*
28+
* @default true
29+
*/
30+
outlineBadges?: boolean
31+
2532
/**
2633
* @deprecated
2734
* Use `outline.label` instead.

0 commit comments

Comments
 (0)