diff --git a/docs/ru/guide/extending-default-theme.md b/docs/ru/guide/extending-default-theme.md new file mode 100644 index 00000000..55e989e7 --- /dev/null +++ b/docs/ru/guide/extending-default-theme.md @@ -0,0 +1,342 @@ +--- +outline: deep +--- + +# Расширение темы по умолчанию {#extending-the-default-theme} + +Тема VitePress по умолчанию оптимизирована для документации и может быть настроена по своему усмотрению. Полный список опций можно найти в разделе [Настройки темы по умолчанию](../reference/default-theme-config). + +Однако есть ряд случаев, когда одной лишь конфигурации будет недостаточно. Например: + +1. Вам нужно изменить стили CSS; +2. Вам нужно изменить экземпляр приложения Vue, например, чтобы зарегистрировать глобальные компоненты; +3. Вам нужно внедрить пользовательский контент в тему через слоты макета. + +Эти расширенные настройки потребуют использования пользовательской темы, которая «расширяет» тема по умолчанию. + +::: tip Совет +Прежде чем приступить к работе, обязательно прочитайте главу [Пользовательская тема](./custom-theme), чтобы понять, как работают пользовательские темы. +::: + +## Настройка CSS {#customizing-css} + +CSS темы по умолчанию можно настроить, переопределив переменные CSS корневого уровня: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' +import './custom.css' + +export default DefaultTheme +``` + +```css +/* .vitepress/theme/custom.css */ +:root { + --vp-c-brand-1: #646cff; + --vp-c-brand-2: #747bff; +} +``` + +См. [переменные CSS темы по умолчанию](https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css), которые можно переопределить. + +## Использование различных шрифтов {#using-different-fonts} + +VitePress использует [Inter](https://rsms.me/inter/) в качестве шрифта по умолчанию, и будет включать шрифты в вывод сборки. Шрифт также автоматически загружается в производство. Однако это может быть нежелательно, если вы хотите использовать другой основной шрифт. + +Чтобы не включать Inter в вывод сборки, импортируйте тему из `vitepress/theme-without-fonts`: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme-without-fonts' +import './my-fonts.css' + +export default DefaultTheme +``` + +```css +/* .vitepress/theme/custom.css */ +:root { + --vp-font-family-base: /* normal text font */ --vp-font-family-mono: + /* code font */; +} +``` + +::: warning Предупреждение +Если вы используете дополнительные компоненты, такие как [Страница команды](../reference/default-theme-team-page), убедитесь, что они также импортированы из `vitepress/theme-without-fonts`! +::: + +Если ваш шрифт — это локальный файл, на который ссылаются через `@font-face`, он будет обработан как ресурс и включён в каталог `.vitepress/dist/assets` с хэшированным именем файла. Чтобы предварительно загрузить этот файл, используйте хук сборки [transformHead](../reference/site-config#transformhead): + +```js +// .vitepress/config.js +export default { + transformHead({ assets }) { + // настраиваем regex соответствующим образом, чтобы он соответствовал вашему шрифту + const myFontFile = assets.find((file) => /font-name\.\w+\.woff2/) + if (myFontFile) { + return [ + [ + 'link', + { + rel: 'preload', + href: myFontFile, + as: 'font', + type: 'font/woff2', + crossorigin: '' + } + ] + ] + } + } +} +``` + +## Регистрация глобальных компонентов {#registering-global-components} + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' + +/** @type {import('vitepress').Theme} */ +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // регистрируем пользовательские глобальные компоненты + app.component('MyGlobalComponent' /* ... */) + } +} +``` + +Если вы используете TypeScript: + +```ts +// .vitepress/theme/index.ts +import type { Theme } from 'vitepress' +import DefaultTheme from 'vitepress/theme' + +export default { + extends: DefaultTheme, + enhanceApp({ app }) { + // регистрируем пользовательские глобальные компоненты + app.component('MyGlobalComponent' /* ... */) + } +} satisfies Theme +``` + +Поскольку мы используем Vite, вы также можете использовать [глобальную функцию импорта](https://vitejs.dev/guide/features.html#glob-import) Vite для автоматической регистрации каталога компонентов. + +## Слоты макета {#layout-slots} + +Компонент `` темы по умолчанию имеет несколько слотов, которые можно использовать для вставки содержимого в определённые места страницы. Вот пример внедрения компонента в структуру before: + +```js +// .vitepress/theme/index.js +import DefaultTheme from 'vitepress/theme' +import MyLayout from './MyLayout.vue' + +export default { + extends: DefaultTheme, + // переопределяем макет с помощью компонента-обёртки, который + // вводит слоты + Layout: MyLayout +} +``` + +```vue + + + + +``` + +Также можно использовать функцию рендеринга. + +```js +// .vitepress/theme/index.js +import { h } from 'vue' +import DefaultTheme from 'vitepress/theme' +import MyComponent from './MyComponent.vue' + +export default { + extends: DefaultTheme, + Layout() { + return h(DefaultTheme.Layout, null, { + 'aside-outline-before': () => h(MyComponent) + }) + } +} +``` + +Полный список слотов, доступных в макете темы по умолчанию: + +- Когда `layout: 'doc'` (по умолчанию) включен через метаданные: + - `doc-top` + - `doc-bottom` + - `doc-footer-before` + - `doc-before` + - `doc-after` + - `sidebar-nav-before` + - `sidebar-nav-after` + - `aside-top` + - `aside-bottom` + - `aside-outline-before` + - `aside-outline-after` + - `aside-ads-before` + - `aside-ads-after` +- Когда `layout: 'home'` включен через метаданные: + - `home-hero-before` + - `home-hero-info-before` + - `home-hero-info` + - `home-hero-info-after` + - `home-hero-actions-after` + - `home-hero-image` + - `home-hero-after` + - `home-features-before` + - `home-features-after` +- Когда `layout: 'page'` включен через метаданные: + - `page-top` + - `page-bottom` +- На странице «Не найдено (404)»: + - `not-found` +- Всегда: + - `layout-top` + - `layout-bottom` + - `nav-bar-title-before` + - `nav-bar-title-after` + - `nav-bar-content-before` + - `nav-bar-content-after` + - `nav-screen-content-before` + - `nav-screen-content-after` + +## Использование View Transitions API {#using-view-transitions-api} + +### Переключение внешнего вида {#on-appearance-toggle} + +Вы можете расширить стандартную тему, чтобы обеспечить пользовательский переход при переключении цветового режима. Пример: + +```vue + + + + + + + +``` + +Результат (**предупреждение!**: мигающие цвета, резкие движения, яркий свет): + +
+Демонстрация + +![Демонстрация переходов](/appearance-toggle-transition.webp) + +
+ +Более подробно о переходах между представлениями читайте в [документации Chrome](https://developer.chrome.com/docs/web-platform/view-transitions/). + +### Изменение маршрута {#on-route-change} + +Скоро будет. + +## Переопределение внутренних компонентов {#overriding-internal-components} + +Вы можете использовать [псевдонимы](https://vitejs.dev/config/shared-options.html#resolve-alias) Vite, чтобы заменить стандартные компоненты темы на свои собственные: + +```ts +import { fileURLToPath, URL } from 'node:url' +import { defineConfig } from 'vitepress' + +export default defineConfig({ + vite: { + resolve: { + alias: [ + { + find: /^.*\/VPNavBar\.vue$/, + replacement: fileURLToPath( + new URL('./components/CustomNavBar.vue', import.meta.url) + ) + } + ] + } + } +}) +``` + +Чтобы узнать точное название компонента, обратитесь к [нашему исходному коду](https://github.com/vuejs/vitepress/tree/main/src/client/theme-default/components). Поскольку компоненты являются внутренними, есть небольшая вероятность того, что их название будет обновлено между минорными выпусками.