Skip to content

vitepress-plugin-breadcrumbs

Динамические «хлебные крошки» в стиле VitePress, построенные по положению текущей страницы в сайдбаре. Не делает предположений о структуре контента — подходит для любого VitePress-проекта.

Установка

bash
npm install @ampernic/vitepress-plugin-breadcrumbs

Концепция

Полная цепочка крошек собирается так:

prefix  →  home  →  группы-предки из сайдбара  →  текущая страница
  1. Каждый элемент цепочки несёт ссылку.
  2. Текущей становится последняя крошка цепочки, чья ссылка совпадает с текущим маршрутом (поэтому индекс/лендинг документа показывает собственную крошку как текущую); иначе текущая страница добавляется отдельным элементом.
  3. Идущие подряд крошки с одинаковой ссылкой схлопываются (дедуп).
  4. hideSingle затем скрывает одиночную крошку (например, на «голом» лендинге).

Сайдбар-путь ищется в themeConfig.sidebar (поддерживаются массив, SidebarMulti и группы { base, items }). Если страница в сайдбаре не найдена и fallback: 'path', крошки выводятся из сегментов URL.

Использование

Добавьте компонент в слот лейаута (обычно doc-before, над заголовком страницы):

ts
// .vitepress/theme/index.ts
import DefaultTheme from 'vitepress/theme'
import { h } from 'vue'
import Breadcrumbs from '@ampernic/vitepress-plugin-breadcrumbs/components/Breadcrumbs.vue'

export default {
  extends: DefaultTheme,
  Layout: () =>
    h(DefaultTheme.Layout, null, {
      'doc-before': () => h(Breadcrumbs),
    }),
}

Конфигурация

Глобально через themeConfig.breadcrumbs либо попропсово (пропсы важнее конфига, конфиг важнее значений по умолчанию). Конфиг можно типизировать через defineBreadcrumbsConfig:

ts
// .vitepress/config.ts
import { defineBreadcrumbsConfig } from '@ampernic/vitepress-plugin-breadcrumbs'

export default {
  themeConfig: {
    breadcrumbs: defineBreadcrumbsConfig({
      home: 'auto',
      separator: '›',
      hideSingle: true,
      fallback: 'path',
    }),
  },
}
ОпцияПо умолчаниюОписание
homefalseКрошка-корень документа (ведёт на лендинг/индекс документа). false — нет; { text, link? } — статическая (ссылка по умолчанию = вычисленный лендинг); 'auto' — ссылка на лендинг, текст = homeText ?? заголовок сайта ?? slug базы; (ctx) => ({ text, link? }) | false — резолвер из BreadcrumbHomeCtx. На самой индексной странице рендерится как текущая (без ссылки) крошка.
homeTextзаголовок сайтаТекст для home: 'auto'
prefixfalseКрошки-предки перед home (например, кросс-секционный корень сайта и/или лендинг дистрибутива). BreadcrumbHome[] или (ctx) => BreadcrumbHome[]. Крошка prefix, чья ссылка совпала с текущей страницей, становится текущей; подряд идущие дубли по ссылке схлопываются.
showOnHomefalseРендерить и на страницах layout: home / когда нет контекста документа — чтобы prefix показывал крошки на корне сайта и лендингах
separator'/'Разделитель между крошками
showCurrentPagetrueДобавлять текущую страницу последней (без ссылки) крошкой
hideSingletrueНичего не рендерить, если крошек ≤ 1
fallback'none''path' — выводить крошки из URL, если страницы нет в сайдбаре; 'none' — не рендерить
classДоп. класс на корневой <nav>
ariaLabel'Breadcrumb'ARIA-метка для landmark

Отключить на конкретной странице через frontmatter:

yaml
---
breadcrumbs: false
---

Контекст резолвера

Функции home/prefix получают BreadcrumbHomeCtx:

ПолеОписание
pathСырой путь маршрута
segsСегменты пути без базы
baseБаза сайта ('/', '/alt-server/', …)
distroSlug базы ('alt-server'); '' если база '/'
versionПервый сегмент, если он похож на версию (1.2, 1.2.3, p11)
sidebarBaseВычисленная база сайдбара ('/11.1/' или '')
landingСсылка на лендинг/индекс документа (база сайта + база сайдбара)
siteTitleЗаголовок сайта из themeConfig
pageTitleЗаголовок текущей страницы

Пример — многоуровневая цепочка (корень сайта → лендинг дистрибутива → индекс документа → путь по сайдбару → текущая страница):

ts
import type { BreadcrumbHomeCtx } from '@ampernic/vitepress-plugin-breadcrumbs'

breadcrumbs: defineBreadcrumbsConfig({
  showOnHome: true,
  hideSingle: false,
  home: (c: BreadcrumbHomeCtx) =>
    c.distro
      ? { text: c.version ? `${c.distro} ${c.version}` : c.distro, link: c.landing }
      : false,
  prefix: (c: BreadcrumbHomeCtx) => {
    const arr = [{ text: 'Главная', link: '/' }]
    if (c.distro && c.version) arr.push({ text: c.distro, link: `/${c.distro}/` })
    return arr
  },
})

Стилизация

Стили scoped, используют CSS-переменные VitePress. Доступны стабильные классы для переопределения: .vp-breadcrumbs, .vp-breadcrumbs-list, .vp-breadcrumbs-item, .vp-breadcrumbs-link, .vp-breadcrumbs-current, .vp-breadcrumbs-sep.

Лицензия

GPL-3.0-or-later