Skip to content

Commit ff3f5e6

Browse files
committed
feat(theme): add separator support for sidebar items
1 parent 1dba45f commit ff3f5e6

File tree

3 files changed

+67
-11
lines changed

3 files changed

+67
-11
lines changed

docs/notes/theme/guide/知识笔记.md

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ export default defineUserConfig({
8787

8888
:::
8989

90-
### 编写notes配置
90+
## 编写notes配置
9191

9292
由于 `notes` 配置全部写在 `plumeTheme({ })` 中可能会导致 代码层级嵌套过深,因此更推荐使用主题提供的
9393
`defineNotesConfig()``defineNoteConfig()` 将 notes 配置提取到外部,它们还能帮助你获得更好的类型提示,
@@ -572,6 +572,43 @@ icon: ep:guide
572572

573573
:::
574574

575+
### 侧边栏组内分隔
576+
577+
在组内对 项 进行分隔 是一个相对小众的需求,它在组的项比较多,但又不适合拆分为多个组,或者组内拆分多组的情况下,
578+
可能会比较适用,它提供了一个平级的,使用辅助文本颜色显示一个分隔项名 的方式,对项进行简单的分隔。
579+
580+
::: code-tabs
581+
@tab .vuepress/notes.ts
582+
583+
```ts
584+
import { defineNoteConfig } from 'vuepress-theme-plume'
585+
586+
const typescript = defineNoteConfig({
587+
dir: 'typescript',
588+
link: '/typescript/',
589+
sidebar: [
590+
{
591+
text: '指南',
592+
items: [
593+
'项目 1',
594+
'项目 2',
595+
'项目 3',
596+
{ text: '分隔', link: '---' }, // [!code ++]
597+
'项目 4',
598+
'项目 5',
599+
// ...
600+
],
601+
},
602+
]
603+
})
604+
```
605+
606+
:::
607+
608+
在组内完成分隔非常简单,你只需要在合适的位置插入一个 `{ text: 'xxxx', link: '---' }` 即可,
609+
它的重点仅是将 `link` 设置为 连续的 `---` 即可,至少三个 `-`
610+
你可以随意定义文本,还可以添加图标。
611+
575612
## 笔记首页
576613

577614
你可能注意到,在 `typescript` 目录下,有一个 `README.md` 文件,它会被作为笔记首页显示。

theme/src/client/components/VPSidebarItem.vue

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ const textTag = computed(() => {
3434
3535
const itemRole = computed(() => (isLink.value ? undefined : 'button'))
3636
37+
const isSeparator = computed(() => props.item.link?.startsWith('---'))
38+
3739
const classes = computed(() => [
3840
[`level-${props.depth}`],
3941
{ collapsible: collapsible.value },
@@ -73,18 +75,18 @@ function onCaretClick() {
7375
>
7476
<div class="indicator" />
7577

76-
<VPIcon v-if="item.icon" :name="item.icon" />
78+
<VPIcon v-if="item.icon" :name="item.icon" :class="{ separator: isSeparator }" />
7779

7880
<VPLink
79-
v-if="item.link"
81+
v-if="item.link && !isSeparator"
8082
:tag="linkTag"
8183
class="link"
8284
:href="item.link"
8385
>
8486
<Component :is="textTag" class="text" v-html="item.text" />
8587
</VPLink>
8688

87-
<Component :is="textTag" v-else class="text" v-html="item.text" />
89+
<Component :is="textTag" v-else class="text" :class="{ separator: isSeparator }" v-html="item.text" />
8890

8991
<div
9092
v-if="item.collapsed != null"
@@ -176,6 +178,23 @@ function onCaretClick() {
176178
color: var(--vp-c-text-2);
177179
}
178180
181+
.vp-sidebar-item.level-1 .text.separator,
182+
.vp-sidebar-item.level-2 .text.separator,
183+
.vp-sidebar-item.level-3 .text.separator,
184+
.vp-sidebar-item.level-4 .text.separator,
185+
.vp-sidebar-item.level-5 .text.separator {
186+
color: var(--vp-c-text-3);
187+
}
188+
189+
.vp-sidebar-item.level-0 :deep(.vp-icon.separator),
190+
.vp-sidebar-item.level-1 :deep(.vp-icon.separator),
191+
.vp-sidebar-item.level-2 :deep(.vp-icon.separator),
192+
.vp-sidebar-item.level-3 :deep(.vp-icon.separator),
193+
.vp-sidebar-item.level-4 :deep(.vp-icon.separator),
194+
.vp-sidebar-item.level-5 :deep(.vp-icon.separator) {
195+
color: var(--vp-c-text-3) !important;
196+
}
197+
179198
.vp-sidebar-item.level-0.has-active > .item > .text,
180199
.vp-sidebar-item.level-1.has-active > .item > .text,
181200
.vp-sidebar-item.level-2.has-active > .item > .text,
@@ -206,12 +225,12 @@ function onCaretClick() {
206225
.vp-sidebar-item.level-3.is-link > .item > .link:hover .text,
207226
.vp-sidebar-item.level-4.is-link > .item > .link:hover .text,
208227
.vp-sidebar-item.level-5.is-link > .item > .link:hover .text,
209-
.vp-sidebar-item.level-0.is-link > .item > .link:hover :deep(.icon),
210-
.vp-sidebar-item.level-1.is-link > .item > .link:hover :deep(.icon),
211-
.vp-sidebar-item.level-2.is-link > .item > .link:hover :deep(.icon),
212-
.vp-sidebar-item.level-3.is-link > .item > .link:hover :deep(.icon),
213-
.vp-sidebar-item.level-4.is-link > .item > .link:hover :deep(.icon),
214-
.vp-sidebar-item.level-5.is-link > .item > .link:hover :deep(.icon) {
228+
.vp-sidebar-item.level-0.is-link > .item > .link:hover :deep(.vp-icon),
229+
.vp-sidebar-item.level-1.is-link > .item > .link:hover :deep(.vp-icon),
230+
.vp-sidebar-item.level-2.is-link > .item > .link:hover :deep(.vp-icon),
231+
.vp-sidebar-item.level-3.is-link > .item > .link:hover :deep(.vp-icon),
232+
.vp-sidebar-item.level-4.is-link > .item > .link:hover :deep(.vp-icon),
233+
.vp-sidebar-item.level-5.is-link > .item > .link:hover :deep(.vp-icon) {
215234
color: var(--vp-c-brand-1);
216235
}
217236

theme/src/client/composables/sidebar.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ function resolveSidebarItems(
146146
const { link, items, prefix, dir, ...args } = item
147147
const navLink = { ...args } as ResolvedSidebarItem
148148
if (link) {
149-
navLink.link = normalizeLink(_prefix, link)
149+
navLink.link = link.startsWith('---') ? link : normalizeLink(_prefix, link)
150150
const nav = resolveNavLink(navLink.link)
151151
navLink.icon = nav.icon || navLink.icon
152152
}

0 commit comments

Comments
 (0)