+
+
+
+
+
diff --git a/docs/ru/guide/asset-handling.md b/docs/ru/guide/asset-handling.md
new file mode 100644
index 00000000..c24bfa73
--- /dev/null
+++ b/docs/ru/guide/asset-handling.md
@@ -0,0 +1,63 @@
+# Обработка ресурсов {#asset-handling}
+
+## Ссылки на статические ресурсы {#referencing-static-assets}
+
+Все файлы Markdown компилируются в компоненты Vue и обрабатываются [Vite](https://vitejs.dev/guide/assets.html). Вы можете, **и должны**, ссылаться на любые ресурсы, используя относительные URL:
+
+```md
+![Изображение](./image.png)
+```
+
+Вы можете ссылаться на статические ресурсы в ваших файлах разметки, компоненты `*.vue` в теме, стили и обычные файлы `.css`, используя абсолютные пути (основанные на корне проекта) или относительные пути (основанные на вашей файловой системе). Последнее похоже на поведение, к которому вы привыкли, если использовали Vite, Vue CLI или `file-loader` в webpack.
+
+Распространенные типы файлов изображений, мультимедиа и шрифтов определяются и включаются в качестве ресурсов автоматически.
+
+::: tip Связанные файлы не рассматриваются как ресурсы
+PDF-файлы или другие документы, на которые есть ссылки в файлах с разметкой, не рассматриваются автоматически как ресурсы. Чтобы сделать связанные файлы доступными, вы должны вручную поместить их в каталог [`public`](#the-public-directory) вашего проекта.
+:::
+
+Все ссылающиеся ресурсы, включая те, которые используют абсолютные пути, будут скопированы в выходной каталог с хэшированным именем файла в производственной сборке. Ресурсы, на которые никогда не ссылались, не будут скопированы. Изображения размером менее 4 КБ будут вставляться в формате base64 — это можно настроить с помощью опции конфигурации [`vite`](../reference/site-config#vite).
+
+Все **статические** ссылки на пути, включая абсолютные пути, должны быть основаны на структуре ваших рабочих каталогов.
+
+## Директория `public` {#the-public-directory}
+
+Иногда вам может понадобиться предоставить статические ресурсы, на которые нет прямых ссылок ни в одном из компонентов Markdown или темы, или вы можете захотеть предоставить определённые файлы с оригинальным именем. Примерами таких файлов являются `robots.txt`, `favicon.ico` и иконки PWA.
+
+Вы можете поместить эти файлы в директорию `public` в [директории с исходными файлами](./routing#source-directory). Например, если корень вашего проекта — `./docs`, и вы используете стандартное расположение исходного каталога, то ваш публичный каталог будет `./docs/public`.
+
+Ресурсы, размещённые в `public`, будут скопированы в корень выходного каталога как есть.
+
+Обратите внимание, что вы должны ссылаться на файлы, размещённые в `public`, используя корневой абсолютный путь — например, `public/icon.png` всегда должен упоминаться в исходном коде как `/icon.png`.
+
+## Базовый URL {#base-url}
+
+Если ваш сайт развёрнут на URL-адресе, не являющемся корневым, вам нужно установить параметр `base` в файле `.vitepress/config.js`. Например, если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то параметр `base` следует установить на `'/bar/'` (он всегда должен начинаться и заканчиваться слэшем).
+
+Все пути к статическим ресурсам автоматически обрабатываются с учётом различных значений конфигурации `base`. Например, если в вашей разметке есть абсолютная ссылка на ресурс в директории `public`:
+
+```md
+![Изображение](/image-inside-public.png)
+```
+
+В этом случае вам **не** нужно обновлять его при изменении значения конфигурации `base`.
+
+Однако если вы создаете компонент темы, который динамически ссылается на активы, например, изображение, атрибут `src` которого основан на значении конфигурации темы:
+
+```vue
+
+```
+
+В этом случае рекомендуется обернуть путь с помощью [хелпера `withBase`](../reference/runtime-api#withbase), предоставляемого VitePress:
+
+```vue
+
+
+
+
+
+```
diff --git a/docs/ru/guide/cms.md b/docs/ru/guide/cms.md
new file mode 100644
index 00000000..9781e756
--- /dev/null
+++ b/docs/ru/guide/cms.md
@@ -0,0 +1,58 @@
+---
+outline: deep
+---
+
+# Подключение к CMS {#connecting-to-a-cms}
+
+## Общий рабочий процесс {#general-workflow}
+
+Подключение VitePress к CMS в значительной степени зависит от [динамических маршрутов](./routing#dynamic-routes). Прежде чем приступить к работе, убедитесь, что вы понимаете, как это работает.
+
+Поскольку каждая CMS работает по-своему, здесь мы можем предоставить лишь общую схему работы, которую вам нужно будет адаптировать под свой конкретный сценарий.
+
+1. Если ваша CMS требует аутентификации, создайте файл `.env` для хранения токенов API и загрузите его таким образом:
+
+ ```js
+ // posts/[id].paths.js
+ import { loadEnv } from 'vitepress'
+
+ const env = loadEnv('', process.cwd())
+ ```
+
+2. Получите необходимые данные из CMS и преобразуйте их в соответствующие пути:
+
+ ```js
+ export default {
+ async paths() {
+ // при необходимости используйте соответствующую клиентскую библиотеку CMS
+ const data = await (
+ await fetch('https://my-cms-api', {
+ headers: {
+ // токен, если необходимо
+ }
+ })
+ ).json()
+
+ return data.map((entry) => {
+ return {
+ params: { id: entry.id /* заголовок, автор, дата и т. д. */ },
+ content: entry.content
+ }
+ })
+ }
+ }
+ ```
+
+3. Отрисуйте содержимое страницы:
+
+ ```md
+ # {{ $params.title }}
+
+ - by {{ $params.author }} on {{ $params.date }}
+
+
+ ```
+
+## Руководства по интеграции {#integration-guides}
+
+Если вы написали руководство по интеграции VitePress с конкретной CMS, воспользуйтесь ссылкой «Редактировать эту страницу», чтобы отправить его сюда!
diff --git a/docs/ru/guide/custom-theme.md b/docs/ru/guide/custom-theme.md
new file mode 100644
index 00000000..05ca3b23
--- /dev/null
+++ b/docs/ru/guide/custom-theme.md
@@ -0,0 +1,222 @@
+# Пользовательская тема {#using-a-custom-theme}
+
+## Разрешение темы {#theme-resolving}
+
+Вы можете включить пользовательскую тему, создав файл `.vitepress/theme/index.js` или `.vitepress/theme/index.ts` («файл входа темы»):
+
+```
+.
+├─ docs # корень проекта
+│ ├─ .vitepress
+│ │ ├─ theme
+│ │ │ └─ index.js # файл входа темы
+│ │ └─ config.js # файл конфигурации
+│ └─ index.md
+└─ package.json
+```
+
+VitePress всегда будет использовать пользовательскую тему вместо темы по умолчанию, если обнаружит наличие входного файла темы. Однако вы можете [расширить тему по умолчанию](./extending-default-theme), чтобы выполнить расширенные настройки поверх нее.
+
+## Интерфейс темы {#theme-interface}
+
+Пользовательская тема VitePress определяется как объект со следующим интерфейсом:
+
+```ts
+interface Theme {
+ /**
+ * Корневой компонент макета для каждой страницы
+ * @required
+ */
+ Layout: Component
+ /**
+ * Улучшение экземпляра приложения Vue
+ * @optional
+ */
+ enhanceApp?: (ctx: EnhanceAppContext) => Awaitable
+ /**
+ * Расширяем другую тему, вызывая её `enhanceApp` перед нашей
+ * @optional
+ */
+ extends?: Theme
+}
+
+interface EnhanceAppContext {
+ app: App // Экземпляр приложения Vue
+ router: Router // Экземпляр маршрутизатора VitePress
+ siteData: Ref // Метаданные на уровне сайта
+}
+```
+
+Файл входа темы должен экспортировать тему по умолчанию:
+
+```js
+// .vitepress/theme/index.js
+
+// Вы можете напрямую импортировать файлы Vue в файле входа темы.
+// VitePress предварительно настроен с помощью @vitejs/plugin-vue.
+import Layout from './Layout.vue'
+
+export default {
+ Layout,
+ enhanceApp({ app, router, siteData }) {
+ // ...
+ }
+}
+```
+
+Экспорт по умолчанию является единственным контрактом для пользовательской темы, и только свойство `Layout` является обязательным. Таким образом, технически тема VitePress может быть простой, как один компонент Vue.
+
+Внутри компонент макета работает так же, как и обычное приложение Vite + Vue 3. Обратите внимание, что тема также должна быть [SSR-совместимой](./ssr-compat).
+
+## Создание макета {#building-a-layout}
+
+Самый базовый компонент макета должен содержать компонент [``](../reference/runtime-api#content):
+
+```vue
+
+
+
Пользовательский макет!
+
+
+
+
+```
+
+Приведённая выше схема просто отображает разметку каждой страницы в виде HTML. Добавим обработку 404 ошибки в качестве первого улучшения:
+
+```vue{1-4,9-12}
+
+
+
+
Пользовательский макет!
+
+
+ Пользовательская страница 404!
+
+
+
+```
+
+Хелпер [`useData()`](../reference/runtime-api#usedata) предоставляет нам все данные во время выполнения, необходимые для условной отрисовки различных макетов. Среди различных данных, к которым мы можем получить доступ, являются метаданные текущей страницы. Мы можем использовать это, чтобы позволить конечному пользователю управлять макетом на каждой странице. Например, пользователь может указать, что страница должна использовать специальный макет главной страницы:
+
+```md
+---
+layout: home
+---
+```
+
+И мы можем настроить нашу тему, чтобы справиться с этим:
+
+```vue{3,12-14}
+
+
+
+
Пользовательский макет!
+
+
+ Пользовательская страница 404!
+
+
+ Пользовательская домашняя страница!
+
+
+
+```
+
+Конечно, вы можете разделить макет на большее количество компонентов:
+
+```vue{3-5,12-15}
+
+
+
+
Пользовательский макет!
+
+
+
+
+
+```
+
+Обратитесь к [Справочнику Runtime API](../reference/runtime-api), чтобы узнать обо всём, что доступно в компонентах темы. Кроме того, вы можете использовать [загрузку данных в режиме реального времени](./data-loading) для создания макета, управляемого данными — например, страницы со списком всех записей в блоге текущего проекта.
+
+## Распространение пользовательской темы {#distributing-a-custom-theme}
+
+Самый простой способ распространить пользовательскую тему — предоставить её в виде [репозитория шаблонов на GitHub](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-template-repository).
+
+Если вы хотите распространить тему в виде пакета npm, выполните следующие действия:
+
+1. Экспортируйте объект темы в качестве экспорта по умолчанию в записи пакета.
+
+2. Если есть возможность, экспортируйте определение типа конфигурации темы как `ThemeConfig`.
+
+3. Если ваша тема требует настройки конфигурации VitePress, экспортируйте эту конфигурацию в подпапку пакета (например. `my-theme/config`), чтобы пользователь мог расширить её.
+
+4. Документируйте параметры конфигурации темы (как через файл конфигурации, так и через метаданные).
+
+5. Предоставьте чёткие инструкции по использованию вашей темы (см. ниже).
+
+## Использование пользовательской темы {#consuming-a-custom-theme}
+
+Чтобы использовать внешнюю тему, импортируйте и реэкспортируйте её из элемента пользовательской темы:
+
+```js
+// .vitepress/theme/index.js
+import Theme from 'awesome-vitepress-theme'
+
+export default Theme
+```
+
+Если тема требует расширения:
+
+```js
+// .vitepress/theme/index.js
+import Theme from 'awesome-vitepress-theme'
+
+export default {
+ extends: Theme,
+ enhanceApp(ctx) {
+ // ...
+ }
+}
+```
+
+Если тема требует специальных настроек VitePress, вам нужно будет также расширить их в своем собственном конфиге:
+
+```ts
+// .vitepress/config.ts
+import baseConfig from 'awesome-vitepress-theme/config'
+
+export default {
+ // расширить базовый конфиг темы (если необходимо)
+ extends: baseConfig
+}
+```
+
+Наконец, если тема предоставляет типы для своего конфига темы:
+
+```ts
+// .vitepress/config.ts
+import baseConfig from 'awesome-vitepress-theme/config'
+import { defineConfigWithTheme } from 'vitepress'
+import type { ThemeConfig } from 'awesome-vitepress-theme'
+
+export default defineConfigWithTheme({
+ extends: baseConfig,
+ themeConfig: {
+ // Тип `ThemeConfig`
+ }
+})
+```
diff --git a/docs/ru/guide/data-loading.md b/docs/ru/guide/data-loading.md
new file mode 100644
index 00000000..a611dc88
--- /dev/null
+++ b/docs/ru/guide/data-loading.md
@@ -0,0 +1,258 @@
+# Загрузка данных в режиме реального времени {#build-time-data-loading}
+
+VitePress предоставляет функцию **загрузчиков данных**, которая позволяет загружать произвольные данные и импортировать их со страниц или компонентов. Загрузка данных выполняется **только во время сборки**: Полученные данные будут сериализованы в виде JSON в финальной сборке JavaScript.
+
+Загрузчики данных могут использоваться для получения удалённых данных или генерирования метаданных на основе локальных файлов. Например, вы можете использовать загрузчики данных для анализа всех локальных страниц API и автоматического создания индекса всех записей API.
+
+## Пример использования {#basic-usage}
+
+Файл загрузчика данных должен заканчиваться либо `.data.js`, либо `.data.ts`. Файл должен предоставлять экспорт объекта по умолчанию с помощью метода `load()`:
+
+```js
+// example.data.js
+export default {
+ load() {
+ return {
+ hello: 'мир'
+ }
+ }
+}
+```
+
+Модуль загрузчика выполняется только в Node.js, поэтому вы можете импортировать любые API Node и зависимости npm по мере необходимости.
+
+Затем вы можете импортировать данные из этого файла в страницы `.md` и компоненты `.vue` с помощью экспорта с именем `data`:
+
+```vue
+
+
+
{{ data }}
+```
+
+Результат:
+
+```json
+{
+ "hello": "мир"
+}
+```
+
+Вы заметите, что сам загрузчик данных не экспортирует `data`. Это VitePress вызывает метод `load()` за кулисами и неявно раскрывает результат через именованный экспорт `data`.
+
+Это работает, даже если загрузчик асинхронный:
+
+```js
+export default {
+ async load() {
+ // получение удалённых данных
+ return (await fetch('...')).json()
+ }
+}
+```
+
+## Данные из локальных файлов {#data-from-local-files}
+
+Если вам нужно генерировать данные на основе локальных файлов, используйте опцию `watch` в загрузчике данных, чтобы изменения, внесённые в эти файлы, вызывали горячие обновления.
+
+Опция `watch` удобна ещё и тем, что вы можете использовать [шаблоны glob](https://github.com/mrmlnc/fast-glob#pattern-syntax) для соответствия нескольким файлам. Шаблоны могут быть относительными к самому файлу загрузчика, а функция `load()` будет получать совпадающие файлы в виде абсолютных путей.
+
+В следующем примере показана загрузка CSV-файлов и их преобразование в JSON с помощью [csv-parse](https://github.com/adaltas/node-csv/tree/master/packages/csv-parse/). Поскольку этот файл выполняется только во время сборки, вы не будете передавать CSV-парсер клиенту!
+
+```js
+import fs from 'node:fs'
+import { parse } from 'csv-parse/sync'
+
+export default {
+ watch: ['./data/*.csv'],
+ load(watchedFiles) {
+ // watchedFiles будет представлять собой массив абсолютных путей к найденным файлам.
+ // Формируем массив метаданных записи блога, которые можно использовать для визуализации списка в макете темы
+ return watchedFiles.map((file) => {
+ return parse(fs.readFileSync(file, 'utf-8'), {
+ columns: true,
+ skip_empty_lines: true
+ })
+ })
+ }
+}
+```
+
+## `createContentLoader` {#createcontentloader}
+
+При создании сайта, ориентированного на контент, нам часто приходится создавать страницы типа «архив», или «индекс», на которых мы перечисляем все доступные записи в нашей коллекции контента. Например, записи в блоге или страницы API. Мы **можем** реализовать это напрямую с помощью API загрузчика данных, но поскольку это очень распространённый случай использования, VitePress также предоставляет функцию `createContentLoader`, чтобы упростить эту задачу:
+
+```js
+// posts.data.js
+import { createContentLoader } from 'vitepress'
+
+export default createContentLoader('posts/*.md' /* параметры */)
+```
+
+Эта функция принимает шаблон glob относительно [исходного каталога](./routing#source-directory) и возвращает объект `{ watch, load }` загрузчика данных, который может быть использован в качестве экспорта по умолчанию в файле загрузчика данных. В нем также реализовано кэширование на основе временных меток изменения файлов для повышения производительности dev.
+
+Обратите внимание, что загрузчик работает только с файлами Markdown — совпадающие файлы, не относящиеся к Markdown, будут пропущены.
+
+Загруженные данные будут представлять собой массив с типом `ContentData[]`:
+
+```ts
+interface ContentData {
+ // отображаемый URL-адрес страницы, например: /posts/hello.html (не включает `base`)
+ // выполните итерацию вручную или используйте пользовательскую `трансформацию` для нормализации путей
+ url: string
+ // метаданные страницы
+ frontmatter: Record
+
+ // следующие параметры присутствуют только в том случае, если соответствующие опции включены
+ // мы рассмотрим их ниже
+ src: string | undefined
+ html: string | undefined
+ excerpt: string | undefined
+}
+```
+
+По умолчанию указываются только `url` и `frontmatter`. Это связано с тем, что загруженные данные будут вложены в клиентский пакет в виде JSON, поэтому нам нужно быть осторожными с их размером. Вот пример использования этих данных для создания минимальной индексной страницы блога:
+
+```vue
+
+
+
+
+
+```
+
+### Параметры {#options}
+
+Данные по умолчанию могут не соответствовать всем требованиям — вы можете изменить данные с помощью параметров:
+
+```js
+// posts.data.js
+import { createContentLoader } from 'vitepress'
+
+export default createContentLoader('posts/*.md', {
+ includeSrc: true, // включить исходный текст в формате Markdown?
+ render: true, // включать в себя полный HTML страницы?
+ excerpt: true, // включить отрывок?
+ transform(rawData) {
+ // составляйте карты, сортируйте или фильтруйте исходные данные по своему усмотрению.
+ // конечный результат — это то, что будет отправлено клиенту.
+ return rawData
+ .sort((a, b) => {
+ return +new Date(b.frontmatter.date) - +new Date(a.frontmatter.date)
+ })
+ .map((page) => {
+ page.src // исходный текст в формате Markdown
+ page.html // отображение полной страницы HTML
+ page.excerpt // отображаемый отрывок HTML (содержимое выше первого `---`)
+ return {
+ /* ... */
+ }
+ })
+ }
+})
+```
+
+Посмотрите, как он используется в [блоге Vue.js](https://github.com/vuejs/blog/blob/main/.vitepress/theme/posts.data.ts).
+
+API `createContentLoader` также можно использовать внутри [хуков сборки](../reference/site-config#build-hooks):
+
+```js
+// .vitepress/config.js
+export default {
+ async buildEnd() {
+ const posts = await createContentLoader('posts/*.md').load()
+ // генерируем файлы на основе метаданных сообщений, например, RSS-канал
+ }
+}
+```
+
+**Types**
+
+```ts
+interface ContentOptions {
+ /**
+ * Включаем src?
+ * @default false
+ */
+ includeSrc?: boolean
+
+ /**
+ * Преобразовываем src в HTML и включаем в данные?
+ * @default false
+ */
+ render?: boolean
+
+ /**
+ * Если `boolean`, то следует ли разбирать и включать отрывок? (отображается как HTML)
+ *
+ * Если `function`, то управляйте тем, как отрывок извлекается из содержимого.
+ *
+ * Если `string`, определите пользовательский разделитель, который будет использоваться для извлечения
+ * отрывка. Разделителем по умолчанию является `---`, если `excerpt` имеет значение `true`.
+ *
+ * @see https://github.com/jonschlinkert/gray-matter#optionsexcerpt
+ * @see https://github.com/jonschlinkert/gray-matter#optionsexcerpt_separator
+ *
+ * @default false
+ */
+ excerpt?:
+ | boolean
+ | ((
+ file: {
+ data: { [key: string]: any }
+ content: string
+ excerpt?: string
+ },
+ options?: any
+ ) => void)
+ | string
+
+ /**
+ * Преобразуйте данные. Обратите внимание, что при импорте из компонентов или файлов
+ * с разметкой данные будут вложены в клиентский пакет в виде JSON.
+ */
+ transform?: (data: ContentData[]) => T | Promise
+}
+```
+
+## Загрузчики типизированных данных {#typed-data-loaders}
+
+При использовании TypeScript вы можете ввести свой загрузчик и экспортировать `data` следующим образом:
+
+```ts
+import { defineLoader } from 'vitepress'
+
+export interface Data {
+ // тип данных
+}
+
+declare const data: Data
+export { data }
+
+export default defineLoader({
+ // тип проверенных опций загрузчика
+ watch: ['...'],
+ async load(): Promise {
+ // ...
+ }
+})
+```
+
+## Конфигурация {#configuration}
+
+Чтобы получить информацию о конфигурации внутри загрузчика, вы можете использовать код, подобный этому:
+
+```ts
+import type { SiteConfig } from 'vitepress'
+
+const config: SiteConfig = (globalThis as any).VITEPRESS_CONFIG
+```
diff --git a/docs/ru/guide/deploy.md b/docs/ru/guide/deploy.md
new file mode 100644
index 00000000..d8ed1c53
--- /dev/null
+++ b/docs/ru/guide/deploy.md
@@ -0,0 +1,293 @@
+---
+outline: deep
+---
+
+# Развёртывание вашего сайта VitePress {#deploy-your-vitepress-site}
+
+Следующие руководства основаны на некоторых общих предположениях:
+
+- Сайт VitePress находится в директории `docs` вашего проекта.
+- Вы используете выходной каталог сборки по умолчанию (`.vitepress/dist`).
+- VitePress установлен как локальная зависимость в вашем проекте, и вы установили следующие скрипты в вашем `package.json`:
+
+ ```json
+ {
+ "scripts": {
+ "docs:build": "vitepress build docs",
+ "docs:preview": "vitepress preview docs"
+ }
+ }
+ ```
+
+## Создание и локальное тестирование {#build-and-test-locally}
+
+1. Выполните эту команду, чтобы собрать документацию:
+
+ ```sh
+ $ npm run docs:build
+ ```
+
+2. После сборки просмотрите её локально, запустив команду:
+
+ ```sh
+ $ npm run docs:preview
+ ```
+
+ Команда `preview` загрузит локальный статический веб-сервер, который будет обслуживать выходной каталог `.vitepress/dist` по адресу `http://localhost:4173`. Вы можете использовать это, чтобы убедиться, что всё выглядит хорошо, прежде чем отправлять в производство.
+
+3. Вы можете настроить порт сервера, передав `--port` в качестве аргумента.
+
+ ```json
+ {
+ "scripts": {
+ "docs:preview": "vitepress preview docs --port 8080"
+ }
+ }
+ ```
+
+ Теперь метод `docs:preview` запустит сервер по адресу `http://localhost:8080`.
+
+## Установка публичного базового пути {#setting-a-public-base-path}
+
+По умолчанию предполагается, что сайт будет развёрнут по корневому пути домена (`/`). Если ваш сайт будет обслуживаться по подпути, например, `https://mywebsite.com/blog/`, то в конфигурации VitePress необходимо установить для опции [`base`](../reference/site-config#base) значение `'/blog/'`.
+
+**Пример:** Если вы используете Github (или GitLab) Pages и развёртываете на `user.github.io/repo/`, то установите `base` на `/repo/`.
+
+## Заголовки кэша HTTP {#http-cache-headers}
+
+Если вы контролируете HTTP-заголовки на своем рабочем сервере, вы можете настроить заголовки `cache-control` для достижения лучшей производительности при повторных посещениях.
+
+В производственной сборке используются хэшированные имена файлов для статических ресурсов (JavaScript, CSS и другие импортированные ресурсы, не находящиеся в `public`). Если вы просмотрите предварительную версию с помощью сетевой вкладки devtools вашего браузера, вы увидите файлы типа `app.4f283b18.js`.
+
+Этот хэш `4f283b18` генерируется из содержимого этого файла. Один и тот же хэшированный URL гарантированно обслуживает одно и то же содержимое файла — если содержимое меняется, то и URL тоже. Это означает, что вы можете смело использовать самые сильные заголовки кэша для этих файлов. Все такие файлы будут помещены в каталог `assets/` в выходном каталоге, поэтому вы можете настроить для них следующий заголовок:
+
+```
+Cache-Control: max-age=31536000,immutable
+```
+
+::: details Пример файла Netlify `_headers`
+
+```
+/assets/*
+ cache-control: max-age=31536000
+ cache-control: immutable
+```
+
+Примечание: файл `_headers` должен быть помещён в [директорию `public`](./asset-handling#the-public-directory) — в нашем случае `docs/public/_headers` — так, чтобы он был скопирован в выходной каталог.
+
+[Netlify custom headers documentation](https://docs.netlify.com/routing/headers/)
+
+:::
+
+::: details Пример конфигурации Vercel в файле `vercel.json`
+
+```json
+{
+ "headers": [
+ {
+ "source": "/assets/(.*)",
+ "headers": [
+ {
+ "key": "Cache-Control",
+ "value": "max-age=31536000, immutable"
+ }
+ ]
+ }
+ ]
+}
+```
+
+Примечание: Файл `vercel.json` должен быть помещен в корень вашего **репозитория**.
+
+[Документация Vercel по конфигурации заголовков](https://vercel.com/docs/concepts/projects/project-configuration#headers)
+
+:::
+
+## Руководства по платформам {#platform-guides}
+
+### Netlify / Vercel / Cloudflare Pages / AWS Amplify / Render {#netlify-vercel-cloudflare-pages-aws-amplify-render}
+
+Создайте новый проект и измените эти настройки с помощью панели управления:
+
+- **Build Command:** `npm run docs:build`
+- **Output Directory:** `docs/.vitepress/dist`
+- **Node Version:** `18` (или выше)
+
+::: warning ПРЕДУПРЕЖДЕНИЕ
+Не включайте такие опции, как _Auto Minify_ для HTML-кода. Он удалит из вывода комментарии, которые имеют значение для Vue. При их удалении могут возникать ошибки несоответствия гидратации.
+:::
+
+### GitHub Pages {#github-pages}
+
+1. Создайте файл с именем `deploy.yml` в директории `.github/workflows` вашего проекта с примерно таким содержанием:
+
+ ```yaml
+ # Пример рабочего процесса для создания и развёртывания сайта VitePress на GitHub Pages
+ #
+ name: Deploy VitePress site to Pages
+
+ on:
+ # Выполняется при пушах, направленных в ветку `main`. Измените это значение на `master`, если вы
+ # используете ветку `master` в качестве ветки по умолчанию.
+ push:
+ branches: [main]
+
+ # Позволяет запустить этот рабочий процесс вручную на вкладке «Actions».
+ workflow_dispatch:
+
+ # Устанавливает разрешения GITHUB_TOKEN, чтобы разрешить развёртывание на страницах GitHub.
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+
+ # Разрешите только одно одновременное развёртывание, пропуская запуски, стоящие в очереди.
+ # Однако НЕ отменяйте текущие запуски, поскольку мы хотим дать возможность завершить производственные развёртывания.
+ concurrency:
+ group: pages
+ cancel-in-progress: false
+
+ jobs:
+ # Сборка
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0 # Не требуется, если функция lastUpdated не включена
+ # - uses: pnpm/action-setup@v3 # Раскомментируйте, если вы используете pnpm
+ # - uses: oven-sh/setup-bun@v1 # Раскомментируйте, если вы используете Bun
+ - name: Setup Node
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20
+ cache: npm # или pnpm / yarn
+ - name: Setup Pages
+ uses: actions/configure-pages@v4
+ - name: Install dependencies
+ run: npm ci # или pnpm install / yarn install / bun install
+ - name: Build with VitePress
+ run: npm run docs:build # или pnpm docs:build / yarn docs:build / bun run docs:build
+ - name: Upload artifact
+ uses: actions/upload-pages-artifact@v3
+ with:
+ path: docs/.vitepress/dist
+
+ # Развёртывание
+ deploy:
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ needs: build
+ runs-on: ubuntu-latest
+ name: Deploy
+ steps:
+ - name: Deploy to GitHub Pages
+ id: deployment
+ uses: actions/deploy-pages@v4
+ ```
+
+ ::: warning ПРЕДУПРЕЖДЕНИЕ
+ Убедитесь, что опция `base` в вашем VitePress настроена правильно. Дополнительные сведения см. в секции [Установка публичного базового пути](#setting-a-public-base-path).
+ :::
+
+2. В настройках вашего репозитория в разделе «Pages» выберите пункт меню «GitHub Actions» в секции «Build and deployment > Source».
+
+3. Внесите свои изменения в ветку `main` и дождитесь завершения процесса GitHub Actions. Вы должны увидеть, что ваш сайт развёрнут по адресу `https://.github.io/[repository]/` или `https:///` в зависимости от ваших настроек. Ваш сайт будет автоматически разворачиваться при каждом внесении изменений в ветке `main`.
+
+### GitLab Pages {#gitlab-pages}
+
+1. Установите `outDir` в конфигурации VitePress на `../public`. Настройте опцию `base` на `'/<репозиторий>/'`, если вы хотите развернуть ваш проект по адресу на `https://<имя пользователя>.gitlab.io/<репозиторий>/`.
+
+2. Создайте файл с именем `.gitlab-ci.yml` в корне вашего проекта с приведённым ниже содержимым. Это позволит создавать и развёртывать ваш сайт каждый раз, когда вы вносите изменения в его содержимое:
+
+ ```yaml
+ image: node:18
+ pages:
+ cache:
+ paths:
+ - node_modules/
+ script:
+ # - apk add git # Отметьте это, если вы используете небольшие докер-образы, такие как alpine, и у вас включен lastUpdated
+ - npm install
+ - npm run docs:build
+ artifacts:
+ paths:
+ - public
+ only:
+ - main
+ ```
+
+### Статические веб-приложения Azure {#azure-static-web-apps}
+
+1. Следуйте [официальной документации](https://docs.microsoft.com/ru-ru/azure/static-web-apps/build-configuration).
+
+2. Установите эти значения в вашем конфигурационном файле (и удалите те, которые вам не нужны, например, `api_location`):
+
+ - **`app_location`**: `/`
+ - **`output_location`**: `docs/.vitepress/dist`
+ - **`app_build_command`**: `npm run docs:build`
+
+### Firebase {#firebase}
+
+1. Создайте `firebase.json` и `.firebaserc` в корне вашего проекта:
+
+ `firebase.json`:
+
+ ```json
+ {
+ "hosting": {
+ "public": "docs/.vitepress/dist",
+ "ignore": []
+ }
+ }
+ ```
+
+ `.firebaserc`:
+
+ ```json
+ {
+ "projects": {
+ "default": ""
+ }
+ }
+ ```
+
+2. После запуска `npm run docs:build` выполните эту команду для развёртывания:
+
+ ```sh
+ firebase deploy
+ ```
+
+### Surge {#surge}
+
+1. После запуска `npm run docs:build` выполните эту команду для развёртывания:
+
+ ```sh
+ npx surge docs/.vitepress/dist
+ ```
+
+### Heroku {#heroku}
+
+1. Следуйте документации и руководству, приведённому в [`heroku-buildpack-static`](https://elements.heroku.com/buildpacks/heroku/heroku-buildpack-static).
+
+2. Создайте файл `static.json` в корне вашего проекта со следующим содержимым:
+
+ ```json
+ {
+ "root": "docs/.vitepress/dist"
+ }
+ ```
+
+### Edgio {#edgio}
+
+См. [Создание и развёртывание приложения VitePress в Edgio](https://docs.edg.io/applications/v6/sites_frameworks/getting_started/vitepress).
+
+### Хостинг статических файлов Kinsta {#kinsta-static-site-hosting}
+
+Вы можете развернуть свой сайт Vitepress на [Kinsta](https://kinsta.com/static-site-hosting/), следуя этим [инструкциям](https://kinsta.com/docs/vitepress-static-site-example/).
+
+### Stormkit
+
+Вы можете развернуть свой проект VitePress на [Stormkit](https://www.stormkit.io), следуя следующим [инструкциям](https://stormkit.io/blog/how-to-deploy-vitepress).
diff --git a/docs/ru/guide/extending-default-theme.md b/docs/ru/guide/extending-default-theme.md
new file mode 100644
index 00000000..ef43dd5d
--- /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). Поскольку компоненты являются внутренними, есть небольшая вероятность того, что их название будет обновлено между минорными выпусками.
diff --git a/docs/ru/guide/frontmatter.md b/docs/ru/guide/frontmatter.md
new file mode 100644
index 00000000..967338f8
--- /dev/null
+++ b/docs/ru/guide/frontmatter.md
@@ -0,0 +1,48 @@
+# Метаданные {#frontmatter}
+
+## Использование {#usage}
+
+VitePress поддерживает метаданные YAML во всех Markdown-файлах, разбирая их с помощью [gray-matter](https://github.com/jonschlinkert/gray-matter). Метаданные должны находиться в верхней части Markdown-файла (перед любыми элементами, включая теги `
+
+
+
+
+```
+
+## Поддержка RTL (экспериментально) {#rtl-support-experimental}
+
+Для поддержки языков с написанием справа налево укажите `dir: 'rtl'` в конфиге и используйте какой-нибудь плагин RTLCSS PostCSS, например , или . Вам нужно настроить плагин PostCSS на использование `:where([dir="ltr"])` и `:where([dir="rtl"])` в качестве префиксов, чтобы избежать проблем со спецификой CSS.
diff --git a/docs/ru/guide/markdown.md b/docs/ru/guide/markdown.md
new file mode 100644
index 00000000..65bd897f
--- /dev/null
+++ b/docs/ru/guide/markdown.md
@@ -0,0 +1,933 @@
+# Расширения Markdown {#markdown-extensions}
+
+VitePress поставляется со встроенными расширениями Markdown.
+
+## Якоря заголовков {#header-anchors}
+
+К заголовкам автоматически применяются якорные ссылки. Отрисовку якорей можно настроить с помощью опции `markdown.anchor`.
+
+### Пользовательские якоря {#custom-anchors}
+
+Чтобы указать пользовательский тег якоря для заголовка, а не использовать автоматически сгенерированный, добавьте суффикс к заголовку:
+
+```
+# Использование пользовательских якорей {#мой-якорь}
+```
+
+Это позволит вам ссылаться на заголовок как `#мой-якорь` вместо стандартного `#использование-пользовательских-якорей`.
+
+## Ссылки {#links}
+
+Особое внимание уделяется как внутренним, так и внешним ссылкам.
+
+### Внутренние ссылки {#internal-links}
+
+Внутренние ссылки преобразуются в ссылки маршрутизатора для навигации SPA. Кроме того, каждый `index.md`, содержащийся в каждом подкаталоге, будет автоматически преобразован в `index.html`, с соответствующим URL `/`.
+
+Например, при следующей структуре каталогов:
+
+```
+.
+├─ index.md
+├─ foo
+│ ├─ index.md
+│ ├─ one.md
+│ └─ two.md
+└─ bar
+ ├─ index.md
+ ├─ three.md
+ └─ four.md
+```
+
+И при условии, что вы находитесь в `foo/one.md`:
+
+```md
+[Home](/)
+[foo](/foo/)
+[foo heading](./#heading)
+[bar - three](../bar/three)
+[bar - three](../bar/three.md)
+[bar - four](../bar/four.html)
+```
+
+### Суффикс страницы {#page-suffix}
+
+Страницы и внутренние ссылки по умолчанию генерируются с суффиксом `.html`.
+
+### Внешние ссылки {#external-links}
+
+Исходящие ссылки автоматически получают значение `target="_blank" rel="noreferrer"`:
+
+- [vuejs.org](https://vuejs.org)
+- [VitePress on GitHub](https://github.com/vuejs/vitepress)
+
+## Метаданные {#frontmatter}
+
+[Метаданные YAML](https://jekyllrb.com/docs/front-matter/) поддерживаются из коробки:
+
+```yaml
+---
+title: Веду блог как хакер
+lang: ru-RU
+---
+```
+
+Эти данные будут доступны остальной части страницы, а также всем пользовательским и тематическим компонентам.
+
+Более подробную информацию можно найти в главе [Метаданные](../reference/frontmatter-config).
+
+## Таблицы в стиле GitHub {#github-style-tables}
+
+**Разметка**
+
+```md
+| Таблицы | это | круто |
+| ---------------- | :----------------------: | ----: |
+| столбец 3 | выровнен по правому краю | $1600 |
+| столбец 2 | отцентрован | $12 |
+| полосатые строки | как полоски у зебры | $1 |
+```
+
+**Результат**
+
+| Таблицы | это | круто |
+| ---------------- | :----------------------: | -----: |
+| столбец 3 | выровнен по правому краю | \$1600 |
+| столбец 2 | отцентрован | \$12 |
+| полосатые строки | как полоски у зебры | \$1 |
+
+## Эмодзи :tada: {#emoji}
+
+**Разметка**
+
+```
+:tada: :100:
+```
+
+**Результат**
+
+:tada: :100:
+
+[Список всех эмодзи](https://github.com/markdown-it/markdown-it-emoji/blob/master/lib/data/full.mjs).
+
+## Оглавление {#table-of-contents}
+
+**Разметка**
+
+```
+[[toc]]
+```
+
+**Результат**
+
+[[toc]]
+
+Отрисовка TOC может быть настроена с помощью опции `markdown.toc`.
+
+## Пользовательские контейнеры {#custom-containers}
+
+Пользовательские контейнеры можно определить по их типам, заголовкам и содержимому.
+
+### Заголовок по умолчанию {#default-title}
+
+**Разметка**
+
+```md
+::: info
+Это информация.
+:::
+
+::: tip
+Это совет.
+:::
+
+::: warning
+Это предупреждение.
+:::
+
+::: danger
+Это сигнал об опасности.
+:::
+
+::: details
+Это блок-спойлер.
+:::
+```
+
+**Результат**
+
+::: info
+Это информация.
+:::
+
+::: tip
+Это совет.
+:::
+
+::: warning
+Это предупреждение.
+:::
+
+::: danger
+Это сигнал об опасности.
+:::
+
+::: details
+Это блок-спойлер.
+:::
+
+### Пользовательский заголовок {#custom-title}
+
+Вы можете задать собственный заголовок, добавив текст сразу после «типа» контейнера.
+
+**Разметка**
+
+````md
+::: danger СТОП
+Опасная зона, остановитесь
+:::
+
+::: details Нажмите на меня, чтобы просмотреть код
+
+```js
+console.log('Привет, VitePress!')
+```
+
+:::
+````
+
+**Результат**
+
+::: danger СТОП
+Опасная зона, остановитесь
+:::
+
+::: details Нажмите на меня, чтобы просмотреть код
+
+```js
+console.log('Привет, VitePress!')
+```
+
+:::
+
+Кроме того, вы можете установить пользовательские заголовки глобально, добавив следующее содержимое в конфигурацию сайта, полезное, если вы пишете не на английском языке:
+
+```ts
+// config.ts
+export default defineConfig({
+ // ...
+ markdown: {
+ container: {
+ tipLabel: 'СОВЕТ',
+ warningLabel: 'ПРЕДУПРЕЖДЕНИЕ',
+ dangerLabel: 'ОПАСНОСТЬ',
+ infoLabel: 'ИНФОРМАЦИЯ',
+ detailsLabel: 'Подробная информация'
+ }
+ }
+ // ...
+})
+```
+
+### `raw` {#raw}
+
+Это специальный контейнер, который можно использовать для предотвращения конфликтов стилей и маршрутизаторов с VitePress. Это особенно полезно при документировании библиотек компонентов. Вы также можете посмотреть [whyframe](https://whyframe.dev/docs/integrations/vitepress) для лучшей изоляции.
+
+**Syntax**
+
+```md
+::: raw
+Заворачивается в
+:::
+```
+
+Класс `vp-raw` можно использовать и непосредственно на элементах. Изоляция стиля в настоящее время осуществляется по желанию:
+
+- Установите `postcss` с помощью предпочитаемого менеджера пакетов:
+
+ ```sh
+ $ npm add -D postcss
+ ```
+
+- Создайте файл с именем `docs/postcss.config.mjs` и добавьте в него следующее:
+
+ ```js
+ import { postcssIsolateStyles } from 'vitepress'
+
+ export default {
+ plugins: [postcssIsolateStyles()]
+ }
+ ```
+
+ Он использует [`postcss-prefix-selector`](https://github.com/postcss/postcss-load-config) под капотом. Вы можете передать ему параметры следующим образом:
+
+ ```js
+ postcssIsolateStyles({
+ includeFiles: [/vp-doc\.css/] // по умолчанию /base\.css/
+ })
+ ```
+
+## Оповещения в стиле GitHub {#github-flavored-alerts}
+
+VitePress также поддерживает [Оповещения в стиле GitHub](https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts) для отображения в виде призывов. Они будут отображаться так же, как и [пользовательские контейнеры](#custom-containers).
+
+```md
+> [!NOTE]
+> Выделяет информацию, на которую пользователи должны обратить внимание, даже при беглом просмотре.
+
+> [!TIP]
+> Дополнительная информация, которая поможет пользователю добиться большего успеха.
+
+> [!IMPORTANT]
+> Важнейшая информация, необходимая пользователям для достижения успеха.
+
+> [!WARNING]
+> Критический контент, требующий немедленного внимания пользователей из-за потенциальных рисков.
+
+> [!CAUTION]
+> Негативные потенциальные последствия того или иного действия.
+```
+
+> [!NOTE]
+> Выделяет информацию, на которую пользователи должны обратить внимание, даже при беглом просмотре.
+
+> [!TIP]
+> Дополнительная информация, которая поможет пользователю добиться большего успеха.
+
+> [!IMPORTANT]
+> Важнейшая информация, необходимая пользователям для достижения успеха.
+
+> [!WARNING]
+> Критический контент, требующий немедленного внимания пользователей из-за потенциальных рисков.
+
+> [!CAUTION]
+> Негативные потенциальные последствия того или иного действия.
+
+## Подсветка синтаксиса в блоках кода {#syntax-highlighting-in-code-blocks}
+
+VitePress использует [Shiki](https://github.com/shikijs/shiki) для выделения синтаксиса языка в блоках кода Markdown с помощью цветного текста. Shiki поддерживает широкий спектр языков программирования. Всё, что вам нужно сделать, это добавить правильный псевдоним языка к начальным значкам блока кода:
+
+**Разметка**
+
+````
+```js
+export default {
+ name: 'MyComponent',
+ // ...
+}
+```
+````
+
+````
+```html
+
+```
+
+[Список всех поддерживаемых языков](https://shiki.style/languages).
+
+Вы также можете настроить тему подсветки синтаксиса в конфигурации приложения. Более подробную информацию см. в секции [`markdown`](../reference/site-config#markdown).
+
+## Выделение строк в блоках кода {#line-highlighting-in-code-blocks}
+
+**Разметка**
+
+````
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Подсвечено!'
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js{4}
+export default {
+ data () {
+ return {
+ msg: 'Подсвечено!'
+ }
+ }
+}
+```
+
+Помимо одной строки, вы можете указать несколько отдельных строк, диапазонов или и то, и другое:
+
+– Диапазоны строк, например: `{5-8}`, `{3-10}`, `{10-17}`
+
+- Несколько одиночных строк, например: `{4,7,9}`
+- Диапазоны строк и отдельные строки, например: `{4,7-13,16,23-27,40}`
+
+**Разметка**
+
+````
+```js{1,4,6-8}
+export default { // Подсвечено
+ data () {
+ return {
+ msg: `Подсвечено!
+ Эта строка не выделена,
+ но эта и две следующих - да.`,
+ motd: 'VitePress - это потрясающе',
+ lorem: 'ipsum'
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js{1,4,6-8}
+export default { // Подсвечено
+ data () {
+ return {
+ msg: `Подсвечено!
+ Эта строка не выделена,
+ но эта и две следующих - да.`,
+ motd: 'VitePress - это потрясающе',
+ lorem: 'ipsum',
+ }
+ }
+}
+```
+
+Кроме того, можно выделять непосредственно в строке, используя комментарий `// [!code highlight]`.
+
+**Разметка**
+
+````
+```js
+export default {
+ data () {
+ return {
+ msg: 'Подсвечено!' // [!!code highlight]
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js
+export default {
+ data() {
+ return {
+ msg: 'Подсвечено!' // [!code highlight]
+ }
+ }
+}
+```
+
+## Фокус в блоках кода {#focus-in-code-blocks}
+
+Добавление комментария `// [!code focus]` к строке сфокусирует её и размоет остальные части кода.
+
+Кроме того, вы можете задать количество строк для фокусировки с помощью `// [!code focus:]`.
+
+**Разметка**
+
+````
+```js
+export default {
+ data () {
+ return {
+ msg: 'Фокус!' // [!!code focus]
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js
+export default {
+ data() {
+ return {
+ msg: 'Фокус!' // [!code focus]
+ }
+ }
+}
+```
+
+## Подсветка различий в блоках кода {#colored-diffs-in-code-blocks}
+
+Добавление в строку комментариев `// [!code --]` или `// [!code ++]` создаст diff этой строки, сохраняя цвета блока кода.
+
+**Разметка**
+
+````
+```js
+export default {
+ data () {
+ return {
+ msg: 'Удалено' // [!!code --]
+ msg: 'Добавлено' // [!!code ++]
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js
+export default {
+ data () {
+ return {
+ msg: 'Удалено' // [!code --]
+ msg: 'Добавлено' // [!code ++]
+ }
+ }
+}
+```
+
+## Ошибки и предупреждения в блоках кода {#errors-and-warnings-in-code-blocks}
+
+Добавление в строку комментариев `// [!code warning]` или `// [!code error]` окрасит её соответствующим образом.
+
+**Разметка**
+
+````
+```js
+export default {
+ data () {
+ return {
+ msg: 'Ошибка', // [!!code error]
+ msg: 'Предупреждение' // [!!code warning]
+ }
+ }
+}
+```
+````
+
+**Результат**
+
+```js
+export default {
+ data() {
+ return {
+ msg: 'Ошибка', // [!code error]
+ msg: 'Предупреждение' // [!code warning]
+ }
+ }
+}
+```
+
+## Номера строк {#line-numbers}
+
+Вы можете включить нумерацию строк для каждого блока кода в конфигурации:
+
+```js
+export default {
+ markdown: {
+ lineNumbers: true
+ }
+}
+```
+
+Более подробную информацию см. в секции [`markdown`](../reference/site-config#markdown).
+
+Вы можете добавить метки `:line-numbers` / `:no-line-numbers` в ваши ограждённые блоки кода, чтобы переопределить значение, установленное в конфиге.
+
+Вы также можете настроить номер начальной строки, добавив `=` после `:line-numbers`. Например, `:line-numbers=2` означает, что номера строк в блоках кода будут начинаться с `2`.
+
+**Разметка**
+
+````md
+```ts {1}
+// опция line-numbers по умолчанию отключена
+const line2 = 'Строка 2'
+const line3 = 'Строка 3'
+```
+
+```ts:line-numbers {1}
+// опция line-numbers включена
+const line2 = 'Строка 2'
+const line3 = 'Строка 3'
+```
+
+```ts:line-numbers=2 {1}
+// опция line-numbers включена, нумерация начинается с 2
+const line3 = 'Строка 3'
+const line4 = 'Строка 4'
+```
+````
+
+**Результат**
+
+```ts {1}
+// опция line-numbers по умолчанию отключена
+const line2 = 'Строка 2'
+const line3 = 'Строка 3'
+```
+
+```ts:line-numbers {1}
+// опция line-numbers включена
+const line2 = 'Строка 2'
+const line3 = 'Строка 3'
+```
+
+```ts:line-numbers=2 {1}
+// опция line-numbers включена, нумерация начинается с 2
+const line3 = 'Строка 3'
+const line4 = 'Строка 4'
+```
+
+## Импорт фрагментов кода {#import-code-snippets}
+
+Вы можете импортировать фрагменты кода из существующих файлов, используя следующий синтаксис:
+
+```md
+<<< @/filepath
+```
+
+[Выделение строк](#line-highlighting-in-code-blocks) тоже поддерживается:
+
+```md
+<<< @/filepath{highlightLines}
+```
+
+**Разметка**
+
+```md
+<<< @/snippets/snippet.js{2}
+```
+
+**Файл с кодом**
+
+<<< @/snippets/snippet.js
+
+**Результат**
+
+<<< @/snippets/snippet.js{2}
+
+::: tip СОВЕТ
+Значение `@` соответствует корню источника. По умолчанию это корень проекта VitePress, если не настроен `srcDir`. Альтернативно вы также можете импортировать из относительных путей:
+
+```md
+<<< ../snippets/snippet.js
+```
+
+:::
+
+Вы также можете использовать [регион VS Code](https://code.visualstudio.com/docs/editor/codebasics#_folding), чтобы включить только соответствующую часть файла кода. Имя пользовательского региона начинается с `#` после пути к файлу:
+
+**Разметка**
+
+```md
+<<< @/snippets/snippet-with-region.js#snippet{1}
+```
+
+**Файл с кодом**
+
+<<< @/snippets/snippet-with-region.js
+
+**Результат**
+
+<<< @/snippets/snippet-with-region.js#snippet{1}
+
+Вы также можете указать язык внутри фигурных скобок (`{}`) следующим образом:
+
+```md
+<<< @/snippets/snippet.cs{c#}
+
+
+
+<<< @/snippets/snippet.cs{1,2,4-6 c#}
+
+
+
+<<< @/snippets/snippet.cs{1,2,4-6 c#:line-numbers}
+```
+
+Это полезно, если исходный язык нельзя определить по расширению вашего файла.
+
+## Группы кодов {#code-groups}
+
+Вы можете сгруппировать несколько блоков кода следующим образом:
+
+**Разметка**
+
+````md
+::: code-group
+
+```js [config.js]
+/**
+ * @type {import('vitepress').UserConfig}
+ */
+const config = {
+ // ...
+}
+
+export default config
+```
+
+```ts [config.ts]
+import type { UserConfig } from 'vitepress'
+
+const config: UserConfig = {
+ // ...
+}
+
+export default config
+```
+
+:::
+````
+
+**Результат**
+
+::: code-group
+
+```js [config.js]
+/**
+ * @type {import('vitepress').UserConfig}
+ */
+const config = {
+ // ...
+}
+
+export default config
+```
+
+```ts [config.ts]
+import type { UserConfig } from 'vitepress'
+
+const config: UserConfig = {
+ // ...
+}
+
+export default config
+```
+
+:::
+
+Вы также можете [импортировать фрагменты](#import-code-snippets) в группы кода:
+
+**Разметка**
+
+```md
+::: code-group
+
+
+
+<<< @/snippets/snippet.js
+
+
+
+<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [фрагмент с регионом]
+
+:::
+```
+
+**Результат**
+
+::: code-group
+
+<<< @/snippets/snippet.js
+
+<<< @/snippets/snippet-with-region.js#snippet{1,2 ts:line-numbers} [фрагмент с регионом]
+
+:::
+
+## Включение файла Markdown {#markdown-file-inclusion}
+
+Вы можете включить файл Markdown в другой файл Markdown, даже вложенный.
+
+::: tip
+Вы также можете добавить в префикс пути к Markdown `@`, он будет выступать в качестве корня источника. По умолчанию это корень проекта VitePress, если не настроен `srcDir`.
+:::
+
+Например, вы можете включить относительный файл Markdown следующим образом:
+
+**Разметка**
+
+```md
+# Документация
+
+## Основы
+
+
+```
+
+**Файл части** (`parts/basics.md`)
+
+```md
+Некоторые вещи для начала.
+
+### Конфигурация
+
+Может быть создана с помощью `.foorc.json`.
+```
+
+**Эквивалентный код**
+
+```md
+# Документация
+
+## Основы
+
+Некоторые вещи для начала.
+
+### Конфигурация
+
+Может быть создана с помощью `.foorc.json`.
+```
+
+Он также поддерживает выбор диапазона строк:
+
+**Разметка**
+
+```md
+# Документация
+
+## Основы
+
+
+```
+
+**Файл части** (`parts/basics.md`)
+
+```md
+Некоторые вещи для начала.
+
+### Конфигурация
+
+Может быть создана с помощью `.foorc.json`.
+```
+
+**Эквивалентный код**
+
+```md
+# Документация
+
+## Основы
+
+### Конфигурация
+
+Может быть создана с помощью `.foorc.json`.
+```
+
+Формат выбранного диапазона строк может быть следующим: `{3,}`, `{,10}`, `{1,10}`
+
+::: warning ПРЕДУПРЕЖДЕНИЕ
+Обратите внимание, что это не приводит к ошибкам, если ваш файл отсутствует. Поэтому при использовании этой функции убедитесь, что содержимое отображается так, как ожидается.
+:::
+
+## Математические уравнения {#math-equations}
+
+В настоящее время эта фича предоставляется по желанию. Чтобы включить её, вам нужно установить `markdown-it-mathjax3` и установить значение `true` для опции `markdown.math` в вашем файле конфигурации:
+
+```sh
+npm add -D markdown-it-mathjax3
+```
+
+```ts
+// .vitepress/config.ts
+export default {
+ markdown: {
+ math: true
+ }
+}
+```
+
+**Разметка**
+
+```md
+Когда $a \ne 0$, существует два решения $(ax^2 + bx + c = 0)$:
+$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
+
+**Уравнения Максвелла:**
+
+| уравнение | описание |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
+| $\nabla \cdot \vec{\mathbf{B}} = 0$ | дивергенция $\vec{\mathbf{B}}$ равна нулю |
+| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | искривление $\vec{\mathbf{E}}$ пропорционально скорости изменения $\vec{\mathbf{B}}$ |
+| $\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$ | _что?_ |
+```
+
+**Результат**
+
+Когда $a \ne 0$, существует два решения $(ax^2 + bx + c = 0)$:
+$$ x = {-b \pm \sqrt{b^2-4ac} \over 2a} $$
+
+**Уравнения Максвелла:**
+
+| уравнение | описание |
+| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
+| $\nabla \cdot \vec{\mathbf{B}} = 0$ | дивергенция $\vec{\mathbf{B}}$ равна нулю |
+| $\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} = \vec{\mathbf{0}}$ | искривление $\vec{\mathbf{E}}$ пропорционально скорости изменения $\vec{\mathbf{B}}$ |
+| $\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} = \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} = 4 \pi \rho$ | _что?_ |
+
+## Ленивая загрузка изображений {#image-lazy-loading}
+
+Вы можете включить ленивую загрузку для каждого изображения, добавленного через markdown, установив значение `true` для опции `lazyLoading` в вашем файле конфигурации:
+
+```js
+export default {
+ markdown: {
+ image: {
+ // ленивая загрузка изображений отключена по умолчанию
+ lazyLoading: true
+ }
+ }
+}
+```
+
+## Расширенная конфигурация {#advanced-configuration}
+
+VitePress использует [markdown-it](https://github.com/markdown-it/markdown-it) для отрисовки Markdown. Многие из вышеперечисленных расширений реализованы с помощью пользовательских плагинов. Вы можете дополнительно настроить экземпляр `markdown-it` с помощью опции `markdown` в файле `.vitepress/config.js`:
+
+```js
+import { defineConfig } from 'vitepress'
+import markdownItAnchor from 'markdown-it-anchor'
+import markdownItFoo from 'markdown-it-foo'
+
+export default defineConfig({
+ markdown: {
+ // опции для markdown-it-anchor
+ // https://github.com/valeriangalliat/markdown-it-anchor#usage
+ anchor: {
+ permalink: markdownItAnchor.permalink.headerLink()
+ },
+
+ // опции для @mdit-vue/plugin-toc
+ // https://github.com/mdit-vue/mdit-vue/tree/main/packages/plugin-toc#options
+ toc: { level: [1, 2] },
+
+ config: (md) => {
+ // используйте любые плагины для markdown-it!
+ md.use(markdownItFoo)
+ }
+ }
+})
+```
+
+Полный список настраиваемых свойств см. в секции [`markdown`](../reference/site-config#markdown).
diff --git a/docs/ru/guide/migration-from-vitepress-0.md b/docs/ru/guide/migration-from-vitepress-0.md
new file mode 100644
index 00000000..4d5c7426
--- /dev/null
+++ b/docs/ru/guide/migration-from-vitepress-0.md
@@ -0,0 +1,23 @@
+# Переход с VitePress 0.x
+
+Если вы переходите с версии VitePress 0.x, то в ней есть несколько изменений, связанных с новыми функциями и улучшениями. Следуйте этому руководству, чтобы узнать, как перенести ваше приложение на последнюю версию VitePress.
+
+## Конфигурация приложения
+
+- Функция интернационализации ещё не реализована.
+
+## Конфигурация темы
+
+- Опция `sidebar` изменила свою структуру.
+ - Ключ `children` теперь называется `items`.
+ - Элемент верхнего уровня может не содержать `link` в данный момент. Мы планируем вернуть его обратно.
+- `repo`, `repoLabel`, `docsDir`, `docsBranch`, `editLinks`, `editLinkText` удалены в пользу более гибкого api.
+ - Для добавления ссылки GitHub с иконкой в навигацию используйте функцию [Социальные ссылки](../reference/default-theme-nav#navigation-links).
+ - Для добавления ссылки «Редактировать эту страницу» используйте функцию [Ссылка для редактирования](../reference/default-theme-edit-link).
+- Опция `lastUpdated` теперь разделена на `config.lastUpdated` и `themeConfig.lastUpdatedText`.
+- Опция `carbonAds.carbon` заменена на `carbonAds.code`.
+
+## Конфигурация метаданных
+
+- Опция `home: true` заменена на `layout: home`. Кроме того, многие настройки, связанные с главной страницей, были изменены для обеспечения дополнительных возможностей. Подробности см. в разделе [Главная страница](../reference/default-theme-home-page).
+- Опция `footer` перенесена в [`themeConfig.footer`](../reference/default-theme-config#footer).
diff --git a/docs/ru/guide/migration-from-vuepress.md b/docs/ru/guide/migration-from-vuepress.md
new file mode 100644
index 00000000..d5158220
--- /dev/null
+++ b/docs/ru/guide/migration-from-vuepress.md
@@ -0,0 +1,30 @@
+# Переход с VuePress
+
+## Конфигурация
+
+### Сайдбар
+
+Боковая панель больше не заполняется автоматически из метаданных. Вы можете [самостоятельно прочитать вступление](https://github.com/vuejs/vitepress/issues/572#issuecomment-1170116225), чтобы научиться динамически заполнять боковую панель. [Дополнительные утилиты для этого](https://github.com/vuejs/vitepress/issues/96) могут быть предоставлены в будущем.
+
+## Markdown
+
+### Изображения
+
+В отличие от VuePress, VitePress автоматически обрабатывает опцию [`base`](./asset-handling#base-url) вашего конфига, когда вы используете статическое изображение.
+
+Таким образом, теперь вы можете выводить изображения без тега `img`.
+
+```diff
+-
++ ![foo](/foo.png)
+```
+
+::: warning Предупреждение
+Для динамических изображений вам всё ещё нужно использовать `withBase`, как показано в [Руководстве по базовому URL](./asset-handling#base-url).
+:::
+
+Используйте регулярное выражение `` для поиска всех изображений с синтаксисом `![](...)` и замены на `![$2]($1)`.
+
+---
+
+продолжение следует...
diff --git a/docs/ru/guide/mpa-mode.md b/docs/ru/guide/mpa-mode.md
new file mode 100644
index 00000000..81843708
--- /dev/null
+++ b/docs/ru/guide/mpa-mode.md
@@ -0,0 +1,23 @@
+# Режим MPA {#mpa-mode}
+
+Режим MPA (Multi-Page Application — «Многостраничное приложение») можно включить через командную строку с помощью команды `vitepress build --mpa`, или через конфигурацию с помощью опции `mpa: true`.
+
+В режиме MPA все страницы по умолчанию отображаются без включенного JavaScript. В результате производственный сайт, скорее всего, получит более высокую оценку эффективности первых посещений с помощью инструментов аудита.
+
+Однако из-за отсутствия навигации SPA межстраничные ссылки будут приводить к полной перезагрузке страницы. После загрузки навигация в режиме MPA будет не такой мгновенной, как в режиме SPA.
+
+Также обратите внимание, что «no-JS-by-default» («без JS по умолчанию») означает, что вы используете Vue исключительно как серверный язык шаблонов. Никаких обработчиков событий в браузере не будет, поэтому интерактивности не будет. Чтобы загрузить JavaScript со стороны клиента, вам нужно использовать специальный тег `
+
+# Привет
+```
+
+`
+```
+
+### Рендеринг необработанного содержимого {#rendering-raw-content}
+
+Параметры, передаваемые странице, будут сериализованы в полезной нагрузке клиентского JavaScript, поэтому вам следует избегать передачи в параметрах больших объемов данных, например, необработанного Markdown или HTML-контента, полученного из удаленной CMS.
+
+Вместо этого вы можете передавать такое содержимое на каждую страницу с помощью свойства `content` каждого объекта path:
+
+```js
+export default {
+ async paths() {
+ const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
+
+ return posts.map((post) => {
+ return {
+ params: { id: post.id },
+ content: post.content // необработанный Markdown или HTML
+ }
+ })
+ }
+}
+```
+
+Затем используйте следующий специальный синтаксис, чтобы отобразить содержимое как часть самого файла Markdown:
+
+```md
+
+```
diff --git a/docs/ru/guide/sitemap-generation.md b/docs/ru/guide/sitemap-generation.md
new file mode 100644
index 00000000..da79a5be
--- /dev/null
+++ b/docs/ru/guide/sitemap-generation.md
@@ -0,0 +1,53 @@
+# Генерация карты сайта {#sitemap-generation}
+
+VitePress поставляется с готовой поддержкой генерации файла `sitemap.xml` для вашего сайта. Чтобы включить её, добавьте следующее в файл `.vitepress/config.js`:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ sitemap: {
+ hostname: 'https://example.com'
+ }
+})
+```
+
+Чтобы теги `` присутствовали в вашем файле `sitemap.xml`, вы можете включить опцию [`lastUpdated`](../reference/default-theme-last-updated).
+
+## Параметры {#options}
+
+Поддержка карты сайта осуществляется с помощью модуля [`sitemap`](https://www.npmjs.com/package/sitemap). Вы можете передать любые поддерживаемые им параметры в опцию `sitemap` в вашем конфигурационном файле. Они будут переданы непосредственно в конструктор `SitemapStream`. Более подробную информацию см. в документации [`sitemap`](https://www.npmjs.com/package/sitemap#options-you-can-pass). Пример:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ sitemap: {
+ hostname: 'https://example.com',
+ lastmodDateOnly: false
+ }
+})
+```
+
+## Хук `transformItems` {#transformitems-hook}
+
+Вы можете использовать хук `sitemap.transformItems` для изменения элементов карты сайта перед их записью в файл `sitemap.xml`. Этот хук вызывается с массивом элементов sitemap и ожидает возвращения массива элементов sitemap. Пример:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ sitemap: {
+ hostname: 'https://example.com',
+ transformItems: (items) => {
+ // добавляем новые элементы или изменяем/фильтруем существующие
+ items.push({
+ url: '/extra-page',
+ changefreq: 'monthly',
+ priority: 0.8
+ })
+ return items
+ }
+ }
+})
+```
diff --git a/docs/ru/guide/ssr-compat.md b/docs/ru/guide/ssr-compat.md
new file mode 100644
index 00000000..fd8c6ae8
--- /dev/null
+++ b/docs/ru/guide/ssr-compat.md
@@ -0,0 +1,137 @@
+---
+outline: deep
+---
+
+# Совместимость с SSR {#ssr-compatibility}
+
+VitePress предварительно рендерит приложение в Node.js во время производственной сборки, используя возможности Vue по рендерингу на стороне сервера (SSR). Это означает, что весь пользовательский код в компонентах темы подлежит проверке на совместимость с SSR.
+
+Глава [Рендеринг на стороне сервера](https://ru.vuejs.org/guide/scaling-up/ssr.html) в документации Vue содержит более подробную информацию о том, что такое SSR, взаимосвязь между SSR и SSG, а также общие указания по написанию кода, дружественного к SSR. Правило заключается в том, чтобы обращаться к API браузера / DOM только в хуках `beforeMount` или `mounted` компонентов Vue.
+
+## `` {#clientonly}
+
+Если вы используете или демонстрируете компоненты, которые не являются SSR-дружественными (например, содержат пользовательские директивы), вы можете обернуть их внутри встроенного компонента ``:
+
+```md
+
+
+
+```
+
+## Библиотеки, обращающиеся к API браузера при импорте {#libraries-that-access-browser-api-on-import}
+
+Некоторые компоненты или библиотеки получают доступ к API браузера **при импорте**. Чтобы использовать код, предполагающий наличие среды браузера при импорте, необходимо динамически импортировать их.
+
+### Импорт в хуке `onMounted` {#importing-in-mounted-hook}
+
+```vue
+
+```
+
+### Условный импорт {#conditional-import}
+
+Вы также можете условно импортировать зависимость с помощью флага `import.meta.env.SSR` (часть [env-переменных Vite](https://vitejs.dev/guide/env-and-mode.html#env-variables)):
+
+```js
+if (!import.meta.env.SSR) {
+ import('./lib-that-access-window-on-import').then((module) => {
+ // используем код
+ })
+}
+```
+
+Поскольку [`Theme.enhanceApp`](./custom-theme#theme-interface) может быть асинхронным, вы можете условно импортировать и регистрировать плагины Vue, которые получают доступ к API браузера при импорте:
+
+```js
+// .vitepress/theme/index.js
+/** @type {import('vitepress').Theme} */
+export default {
+ // ...
+ async enhanceApp({ app }) {
+ if (!import.meta.env.SSR) {
+ const plugin = await import('plugin-that-access-window-on-import')
+ app.use(plugin.default)
+ }
+ }
+}
+```
+
+Если вы используете TypeScript:
+
+```ts
+// .vitepress/theme/index.ts
+import type { Theme } from 'vitepress'
+
+export default {
+ // ...
+ async enhanceApp({ app }) {
+ if (!import.meta.env.SSR) {
+ const plugin = await import('plugin-that-access-window-on-import')
+ app.use(plugin.default)
+ }
+ }
+} satisfies Theme
+```
+
+### `defineClientComponent` {#defineclientcomponent}
+
+VitePress предоставляет удобный помощник для импорта компонентов Vue, которые получают доступ к API браузера при импорте.
+
+```vue
+
+
+
+
+
+```
+
+Вы также можете передавать параметры/дочерние элементы/слоты целевому компоненту:
+
+```vue
+
+
+
+
+
+```
+
+Целевой компонент будет импортирован только в смонтированный хук компонента-обёртки.
diff --git a/docs/ru/guide/using-vue.md b/docs/ru/guide/using-vue.md
new file mode 100644
index 00000000..25467be7
--- /dev/null
+++ b/docs/ru/guide/using-vue.md
@@ -0,0 +1,253 @@
+# Использование Vue в Markdown {#using-vue-in-markdown}
+
+В VitePress каждый Markdown-файл компилируется в HTML, а затем обрабатывается как [однофайловый компонент Vue](https://ru.vuejs.org/guide/scaling-up/sfc.html). Это означает, что вы можете использовать любые возможности Vue внутри Markdown, включая динамический шаблонизатор, использование компонентов Vue или произвольную логику компонентов Vue на странице, добавив тег `
+
+## Содержание в формате Markdown. Счётчик: {{ count }}
+
+
+
+
+```
+
+::: warning Избегайте `
+```
+
+## Использование телепортов {#using-teleports}
+
+В настоящее время Vitepress поддерживает SSG только для телепортов к элементу `body`. Для других целей вы можете обернуть их внутри встроенного компонента `` или внедрить разметку телепортации в нужное место HTML конечной страницы через [хук `postRender`](../reference/site-config#postrender).
+
+
+
+::: details Исходный код
+<<< @/ru/components/ModalDemo.vue
+:::
+
+```md
+
+
+
+ // ...
+
+
+
+```
+
+
+
+
diff --git a/docs/ru/guide/what-is-vitepress.md b/docs/ru/guide/what-is-vitepress.md
new file mode 100644
index 00000000..1bcc3e18
--- /dev/null
+++ b/docs/ru/guide/what-is-vitepress.md
@@ -0,0 +1,57 @@
+# Что такое VitePress? {#what-is-vitepress}
+
+VitePress — это [Генератор статических сайтов](https://en.wikipedia.org/wiki/Static_site_generator) (ГСС), предназначенный для быстрого создания сайтов, ориентированных на контент. В двух словах, VitePress берёт ваш исходный контент, написанный в [Markdown](https://ru.wikipedia.org/wiki/Markdown), применяет к нему тему и генерирует статические HTML-страницы, которые можно легко развернуть в любом месте.
+
+
+
+Хотите попробовать прямо сейчас? Перейдите к главе [Первые шаги](./getting-started).
+
+
+
+## Примеры использования {#use-cases}
+
+- **Документация**
+
+ VitePress поставляется с темой по умолчанию, предназначенной для технической документации. Она содержит эту страницу, которую вы сейчас читаете, а также документацию по [Vite](https://vitejs.dev/), [Rollup](https://rollupjs.org/), [Pinia](https://pinia.vuejs.org/), [VueUse](https://vueuse.org/), [Vitest](https://vitest.dev/), [D3](https://d3js.org/), [UnoCSS](https://unocss.dev/), [Iconify](https://iconify.design/) и [многое другое](https://www.vuetelescope.com/explore?framework.slug=vitepress).
+
+ [Официальная документация Vue.js](https://vuejs.org/) также основана на VitePress, но использует пользовательскую тему, разделяемую между несколькими переводами.
+
+- **Блоги, портфолио и маркетинговые сайты**
+
+ VitePress поддерживает [полностью кастомизированные темы](./custom-theme), при этом разработчики могут использовать стандартное приложение Vite + Vue. То, что он построен на базе Vite, также означает, что вы можете напрямую использовать плагины Vite из его богатой экосистемы. Кроме того, VitePress предоставляет гибкие API для [загрузки данных](./data-loading) (локальной или удаленной) и [динамической генерации маршрутов](./routing#dynamic-routes). С его помощью можно построить практически всё, что угодно, если данные могут быть определены во время сборки.
+
+ Официальный [блог Vue.js](https://blog.vuejs.org/) — это простой блог, который генерирует свою индексную страницу на основе локального контента.
+
+## Опыт разработчика {#developer-experience}
+
+VitePress стремится обеспечить отличные возможности для разработчиков при работе с содержимым в формате Markdown.
+
+- **[На базе Vite:](https://vitejs.dev/)** мгновенный запуск сервера, правки всегда отражаются мгновенно (<100 мс) без перезагрузки страницы.
+
+- **[Встроенные расширения Markdown:](./markdown)** Frontmatter, таблицы, подсветка синтаксиса... называйте как хотите. В частности, VitePress предоставляет множество расширенных возможностей для работы с блоками кода, что делает его идеальным для создания технической документации.
+
+- **[Markdown с возможностями Vue:](./using-vue)** каждая Markdown-страница также является [однофайловым компонентом](https://ru.vuejs.org/guide/scaling-up/sfc.html) Vue, благодаря 100% синтаксической совместимости шаблона Vue с HTML. Вы можете внедрить интерактивность в статический контент, используя шаблонизаторы Vue или импортированные компоненты Vue.
+
+## Производительность {#performance}
+
+В отличие от многих традиционных ГСС, где каждая навигация приводит к полной перезагрузке страницы, сайт, созданный VitePress, обслуживает статический HTML при первом посещении, но становится [Одностраничным приложением](https://ru.wikipedia.org/wiki/%D0%9E%D0%B4%D0%BD%D0%BE%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%87%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5) (SPA) для последующей навигации по сайту. Эта модель, на наш взгляд, обеспечивает оптимальный баланс производительности:
+
+- **Быстрая начальная загрузка**
+
+ При первом посещении любой страницы будет использоваться статичный, предварительно отрендеренный HTML для быстрой загрузки и оптимального SEO. Затем на страницу загружается пакет JavaScript, который превращает страницу в Vue SPA («гидратация»). Вопреки распространённому мнению о медленной гидратации SPA, этот процесс на самом деле чрезвычайно быстр благодаря высокой производительности Vue 3 и оптимизациям компилятора. По данным [PageSpeed Insights](https://pagespeed.web.dev/report?url=https%3A%2F%2Fvitepress.dev%2F), типичные сайты VitePress достигают почти идеальных показателей производительности даже на мобильных устройствах с низкой скоростью передачи данных.
+
+- **Быстрая навигация после загрузки**
+
+ Что ещё более важно, модель SPA приводит к улучшению пользовательского опыта **после** первоначальной загрузки. Последующая навигация по сайту больше не будет приводить к полной перезагрузке страницы. Вместо этого содержимое входящей страницы будет получено и динамически обновлено. VitePress также автоматически выполняет предварительную выборку фрагментов страницы для ссылок, которые находятся в пределах области просмотра. В большинстве случаев навигация после загрузки будет ощущаться мгновенно.
+
+- **Интерактивность без штрафов**
+
+ Для того чтобы динамические части Vue, встроенные в статический Markdown, могли работать в режиме гидратации, каждая страница Markdown обрабатывается как компонент Vue и компилируется в JavaScript. Это может показаться неэффективным, но компилятор Vue достаточно умён, чтобы разделить статическую и динамическую части, минимизируя как стоимость гидратации, так и размер полезной нагрузки. При первоначальной загрузке страницы статические части автоматически исключаются из полезной нагрузки JavaScript и пропускаются во время гидратации.
+
+## Что насчёт VuePress? {#what-about-vuepress}
+
+VitePress — это духовный наследник VuePress. Оригинальный VuePress был основан на Vue 2 и webpack. Благодаря Vue 3 и Vite под капотом, VitePress обеспечивает значительно лучший опыт разработки, лучшую производительность, более отточенную тему по умолчанию и более гибкий API для настройки.
+
+Разница в API между VitePress и VuePress заключается в основном в тематическом оформлении и настройке. Если вы используете VuePress 1 с темой по умолчанию, то переход на VitePress будет относительно простым.
+
+Также были приложены усилия для создания VuePress 2, который также поддерживает Vue 3 и Vite с большей совместимостью с VuePress 1. Однако поддерживать два генератора параллельно не представляется возможным, поэтому команда Vue решила сосредоточиться на VitePress как основном рекомендуемом генераторе статических сайтов в долгосрочной перспективе.
diff --git a/docs/ru/index.md b/docs/ru/index.md
new file mode 100644
index 00000000..5d2e52e5
--- /dev/null
+++ b/docs/ru/index.md
@@ -0,0 +1,60 @@
+---
+layout: home
+
+title: VitePress
+titleTemplate: Генератор статических сайтов на основе Vite и Vue
+
+hero:
+ name: VitePress
+ text: Генератор статических сайтов на основе Vite и Vue
+ tagline: Из Markdown в красивую документацию за считанные минуты
+ actions:
+ - theme: brand
+ text: Что такое VitePress?
+ link: /ru/guide/what-is-vitepress
+ - theme: alt
+ text: Первые шаги
+ link: /ru/guide/getting-started
+ - theme: alt
+ text: GitHub
+ link: https://github.com/vuejs/vitepress
+ image:
+ src: /vitepress-logo-large.webp
+ alt: VitePress
+
+features:
+ - icon: 📝
+ title: Сосредоточьтесь на своем контенте
+ details: Легко создавайте красивые сайты с документацией, используя только Markdown.
+ - icon:
+ title: Наслаждайтесь опытом разработчиков Vite
+ details: Мгновенный запуск сервера, молниеносные горячие обновления и использование плагинов экосистемы Vite.
+ - icon:
+ title: Настройка с помощью Vue
+ details: Используйте синтаксис Vue и компоненты прямо в Markdown или создавайте собственные темы с помощью Vue.
+ - icon: 🚀
+ title: Быстрый запуск веб-сайтов
+ details: Быстрая начальная загрузка с помощью статического HTML, быстрая навигация после загрузки с помощью маршрутизации на стороне клиента.
+---
+
+
diff --git a/docs/ru/reference/cli.md b/docs/ru/reference/cli.md
new file mode 100644
index 00000000..93954da2
--- /dev/null
+++ b/docs/ru/reference/cli.md
@@ -0,0 +1,74 @@
+# Интерфейс командной строки {#command-line-interface}
+
+## `vitepress dev` {#vitepress-dev}
+
+Запуск сервера разработки VitePress, с использованием указанного каталога в качестве корневого. По умолчанию используется текущий каталог. Команду `dev` также можно опустить при работе в текущем каталоге.
+
+### Использование {#usage}
+
+```sh
+# запуск в текущем каталоге, опускаем `dev`
+vitepress
+
+# запуск в подкаталоге
+vitepress dev [root]
+```
+
+### Параметры {#options}
+
+| Параметр | Описание |
+| --------------- | ------------------------------------------------------------------------------ |
+| `--open [path]` | Открытие браузера при запуске (`boolean \| string`) |
+| `--port ` | Номер порта (`number`) |
+| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) |
+| `--cors` | Включить CORS |
+| `--strictPort` | Выйти, если указанный порт уже используется (`boolean`) |
+| `--force` | Заставить оптимизатор игнорировать кэш и повторно объединять файлы (`boolean`) |
+
+## `vitepress build` {#vitepress-build}
+
+Создание производственной сборки текущего сайта VitePress.
+
+### Использование {#usage-1}
+
+```sh
+vitepress build [root]
+```
+
+### Параметры {#options-1}
+
+| Параметр | Описание |
+| ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
+| `--mpa` (экспериментально) | Сборка в режиме [MPA](../guide/mpa-mode) без гидратации на стороне клиента (`boolean`) |
+| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) |
+| `--target ` | Транспилировать цель (по умолчанию: `"modules"`) (`string`) |
+| `--outDir ` | Выходной каталог относительно **cwd** (по умолчанию: `/.vitepress/dist`) (`string`) |
+| `--minify [minifier]` | Включить/выключить минификацию или задать используемый минификатор (по умолчанию: `"esbuild"`) (`boolean \| "terser" \| "esbuild"`) |
+| `--assetsInlineLimit ` | Статический встроенный порог ресурса base64 в байтах (по умолчанию: `4096`) (`number`) |
+
+## `vitepress preview` {#vitepress-preview}
+
+Локальный предварительный просмотр производственной сборки.
+
+### Использование {#usage-2}
+
+```sh
+vitepress preview [root]
+```
+
+### Параметры {#options-2}
+
+| Параметр | Описание |
+| --------------- | ----------------------------------------------------- |
+| `--base ` | Публичный базовый путь (по умолчанию: `/`) (`string`) |
+| `--port ` | Номер порта (`number`) |
+
+## `vitepress init` {#vitepress-init}
+
+Запуск [Мастера настройки](../guide/getting-started#setup-wizard) в текущем каталоге.
+
+### Использование {#usage-3}
+
+```sh
+vitepress init
+```
diff --git a/docs/ru/reference/default-theme-badge.md b/docs/ru/reference/default-theme-badge.md
new file mode 100644
index 00000000..fc546436
--- /dev/null
+++ b/docs/ru/reference/default-theme-badge.md
@@ -0,0 +1,72 @@
+# Значки {#badge}
+
+С помощью значков удобно добавлять статус к заголовкам. Например, может быть полезно указать тип раздела или поддерживаемую версию.
+
+## Использование {#usage}
+
+Вы можете использовать компонент `Badge`, который доступен глобально.
+
+```html
+### Заголовок ### Заголовок
+ ### Заголовок
+ ### Заголовок
+
+```
+
+Приведённый выше код даёт такой результат:
+
+### Заголовок {#title}
+
+### Заголовок {#title-1}
+
+### Заголовок {#title-2}
+
+### Заголовок {#title-3}
+
+## Дочерние элементы {#custom-children}
+
+`` принимает параметр `children`, который будет отображаться внутри значка.
+
+```html
+### Заголовок вложенный элемент
+```
+
+### Заголовок вложенный элемент
+
+## Настройка стиля значков {#customize-type-color}
+
+Вы можете настроить стиль значков, переопределив переменные CSS. Ниже приведены значения по умолчанию:
+
+```css
+:root {
+ --vp-badge-info-border: transparent;
+ --vp-badge-info-text: var(--vp-c-text-2);
+ --vp-badge-info-bg: var(--vp-c-default-soft);
+
+ --vp-badge-tip-border: transparent;
+ --vp-badge-tip-text: var(--vp-c-brand-1);
+ --vp-badge-tip-bg: var(--vp-c-brand-soft);
+
+ --vp-badge-warning-border: transparent;
+ --vp-badge-warning-text: var(--vp-c-warning-1);
+ --vp-badge-warning-bg: var(--vp-c-warning-soft);
+
+ --vp-badge-danger-border: transparent;
+ --vp-badge-danger-text: var(--vp-c-danger-1);
+ --vp-badge-danger-bg: var(--vp-c-danger-soft);
+}
+```
+
+## `` {#badge-1}
+
+Компонент `` принимает следующие параметры:
+
+```ts
+interface Props {
+ // Когда передается ``, это значение игнорируется.
+ text?: string
+
+ // По умолчанию: `tip`.
+ type?: 'info' | 'tip' | 'warning' | 'danger'
+}
+```
diff --git a/docs/ru/reference/default-theme-carbon-ads.md b/docs/ru/reference/default-theme-carbon-ads.md
new file mode 100644
index 00000000..457b92b1
--- /dev/null
+++ b/docs/ru/reference/default-theme-carbon-ads.md
@@ -0,0 +1,22 @@
+# Carbon Ads {#carbon-ads}
+
+В VitePress встроена встроенная поддержка [Carbon Ads](https://www.carbonads.net/). Определив в конфиге учётные данные Carbon Ads, VitePress будет отображать рекламу на странице.
+
+```js
+export default {
+ themeConfig: {
+ carbonAds: {
+ code: 'код-рекламы',
+ placement: 'место-размещения-рекламы'
+ }
+ }
+}
+```
+
+Эти значения используются для вызова сценария carbon CDN, как показано ниже:
+
+```js
+;`//cdn.carbonads.com/carbon.js?serve=${code}&placement=${placement}`
+```
+
+Чтобы узнать больше о конфигурации Carbon Ads, посетите [веб-сайт Carbon Ads](https://www.carbonads.net/).
diff --git a/docs/ru/reference/default-theme-config.md b/docs/ru/reference/default-theme-config.md
new file mode 100644
index 00000000..265d17f1
--- /dev/null
+++ b/docs/ru/reference/default-theme-config.md
@@ -0,0 +1,452 @@
+# Настройка темы по умолчанию {#default-theme-config}
+
+Конфигурация темы позволяет настроить её под себя. Вы можете настроить тему с помощью опции `themeConfig` в файле конфигурации:
+
+```ts
+export default {
+ lang: 'ru-RU',
+ title: 'VitePress',
+ description: 'Генератор статического сайта на базе Vite и Vue.',
+
+ // Конфигурации, связанные с темой.
+ themeConfig: {
+ logo: '/logo.svg',
+ nav: [...],
+ sidebar: { ... }
+ }
+}
+```
+
+**Параметры, описанные на этой странице, применимы только к теме по умолчанию.** Разные темы предполагают разные конфигурации темы. При использовании пользовательской темы объект конфигурации темы будет передан теме, чтобы она могла определить условное поведение на его основе.
+
+## i18nRouting {#i18nrouting}
+
+- Тип: `boolean`
+
+При смене локали на `ru` URL изменится с `/foo` (или `/en/foo/`) на `/ru/foo`. Вы можете отключить это поведение, установив для параметра `themeConfig.i18nRouting` значение `false`.
+
+## logo {#logo}
+
+- Тип: `ThemeableImage`
+
+Файл логотипа для отображения в навигационной панели, прямо перед заголовком сайта. Принимает строку пути или объект, чтобы установить другой логотип для светлого/тёмного режима.
+
+```ts
+export default {
+ themeConfig: {
+ logo: '/logo.svg'
+ }
+}
+```
+
+```ts
+type ThemeableImage =
+ | string
+ | { src: string; alt?: string }
+ | { light: string; dark: string; alt?: string }
+```
+
+## siteTitle {#sitetitle}
+
+- Тип: `string | false`
+
+Вы можете настроить этот элемент для замены стандартного заголовка сайта (`title` в конфигурации приложения) в nav. При установке значения `false` заголовок в панели навигации будет отключен. Пригодится, если у вас есть `logo`, который уже содержит текст названия сайта.
+
+```ts
+export default {
+ themeConfig: {
+ siteTitle: 'Привет, мир'
+ }
+}
+```
+
+## nav {#nav}
+
+- Тип: `NavItem`
+
+Конфигурация для пункта навигационного меню. Подробнее в главе [Тема по умолчанию: Навигация](./default-theme-nav#navigation-links).
+
+```ts
+export default {
+ themeConfig: {
+ nav: [
+ { text: 'Руководство', link: '/guide' },
+ {
+ text: 'Выпадающее меню',
+ items: [
+ { text: 'Пункт A', link: '/item-1' },
+ { text: 'Пункт B', link: '/item-2' },
+ { text: 'Пункт C', link: '/item-3' }
+ ]
+ }
+ ]
+ }
+}
+```
+
+```ts
+type NavItem = NavItemWithLink | NavItemWithChildren
+
+interface NavItemWithLink {
+ text: string
+ link: string
+ activeMatch?: string
+ target?: string
+ rel?: string
+ noIcon?: boolean
+}
+
+interface NavItemChildren {
+ text?: string
+ items: NavItemWithLink[]
+}
+
+interface NavItemWithChildren {
+ text?: string
+ items: (NavItemChildren | NavItemWithLink)[]
+ activeMatch?: string
+}
+```
+
+## sidebar {#sidebar}
+
+- Тип: `Sidebar`
+
+Конфигурация для пунктов меню боковой панели. Подробнее в главе [Тема по умолчанию: Сайдбар](./default-theme-sidebar).
+
+```ts
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Руководство',
+ items: [
+ { text: 'Введение', link: '/introduction' },
+ { text: 'Первые шаги', link: '/getting-started' },
+ ...
+ ]
+ }
+ ]
+ }
+}
+```
+
+```ts
+export type Sidebar = SidebarItem[] | SidebarMulti
+
+export interface SidebarMulti {
+ [path: string]: SidebarItem[]
+}
+
+export type SidebarItem = {
+ /**
+ * Текстовая метка элемента
+ */
+ text?: string
+
+ /**
+ * Ссылка на элемент
+ */
+ link?: string
+
+ /**
+ * Потомки элемента
+ */
+ items?: SidebarItem[]
+
+ /**
+ * Если не указано, группа не будет сворачиваться
+ *
+ * Если `true`, то группа будет сворачиваться и разворачиваться по умолчанию
+ *
+ * Если `false`, группа сворачивается, но по умолчанию разворачивается
+ */
+ collapsed?: boolean
+}
+```
+
+## aside {#aside}
+
+- Тип: `boolean | 'left'`
+- По умолчанию: `true`
+- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#aside)
+
+Установка этого значения в `false` предотвращает отрисовку контейнера сайдбара.\
+Установка этого значения в `true` приведёт к отображению сайдбара справа.\
+Установка этого значения в `left` приведёт к отображению сайдбара слева.
+
+Если вы хотите отключить его для всех режимов просмотра, используйте `aside: false`.
+
+## outline {#outline}
+
+- Тип: `Outline | Outline['level'] | false`
+- Уровень можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#outline)
+
+Установка этого значения в `false` предотвращает отрисовку оглавления. Для получения более подробной информации обратитесь к этому интерфейсу:
+
+```ts
+interface Outline {
+ /**
+ * Уровни заголовков, которые будут отображаться в оглавлении.
+ * Одиночное число означает, что будут отображаться только заголовки этого уровня.
+ * Если передается кортеж, то первое число — это минимальный уровень, а второе — максимальный.
+ * `'deep'` то же самое, что `[2, 6]`, что означает, что будут отображены все заголовки от `
`. Если вы хотите добавить блочные элементы, рассмотрите возможность использования слота [`layout-bottom`](../guide/extending-default-theme#layout-slots).
+:::
+
+Обратите внимание, что подвал не будет отображаться, если виден [Сайдбар](./default-theme-sidebar).
+
+## Настройка в метаданных {#frontmatter-config}
+
+Отображение подвала можно отключить на конкретной странице с помощью опции `footer` в метаданных:
+
+```yaml
+---
+footer: false
+---
+```
diff --git a/docs/ru/reference/default-theme-home-page.md b/docs/ru/reference/default-theme-home-page.md
new file mode 100644
index 00000000..a526496f
--- /dev/null
+++ b/docs/ru/reference/default-theme-home-page.md
@@ -0,0 +1,196 @@
+# Главная страница {#home-page}
+
+Тема VitePress по умолчанию предоставляет макет главной страницы, который вы также можете увидеть на [главной странице этого сайта](../). Вы можете использовать его на любой из своих страниц, указав `layout: home` в [метаданных](./frontmatter-config) страницы.
+
+```yaml
+---
+layout: home
+---
+```
+
+Однако сам по себе этот вариант мало что даст. Вы можете добавить несколько различных готовых «секций» на главную страницу, установив дополнительные опции, такие как `hero` и `features`.
+
+## Секция `hero` {#hero-section}
+
+Секция `hero` находится в верхней части главной страницы. Вот как можно её настроить:
+
+```yaml
+---
+layout: home
+
+hero:
+ name: VitePress
+ text: Генератор статических сайтов на основе Vite и Vue.
+ tagline: Lorem ipsum...
+ image:
+ src: /logo.png
+ alt: VitePress
+ actions:
+ - theme: brand
+ text: Начать
+ link: /guide/what-is-vitepress
+ - theme: alt
+ text: Посмотреть на GitHub
+ link: https://github.com/vuejs/vitepress
+---
+```
+
+```ts
+interface Hero {
+ // Строка, отображаемая поверх `text`. Поставляется в фирменном цвете и,
+ // как ожидается, будет короткой — например, название продукта
+ name?: string
+
+ // Основной текст секции. Будет использоваться внутри тега `h1`
+ text: string
+
+ // Заголовок, отображаемый под `text`
+ tagline?: string
+
+ // Изображение отображается рядом с `text` и `tagline`
+ image?: ThemeableImage
+
+ // Кнопки действий для отображения в секции
+ actions?: HeroAction[]
+}
+
+type ThemeableImage =
+ | string
+ | { src: string; alt?: string }
+ | { light: string; dark: string; alt?: string }
+
+interface HeroAction {
+ // Цветовая тема кнопки. По умолчанию принимает значение `brand`.
+ theme?: 'brand' | 'alt'
+
+ // Метка кнопки.
+ text: string
+
+ // Ссылка назначения кнопки.
+ link: string
+
+ // Атрибут цели ссылки.
+ target?: string
+
+ // Атрибут rel ссылки.
+ rel?: string
+}
+```
+
+### Настройка цвета заголовка секции {#customizing-the-name-color}
+
+VitePress использует фирменный цвет (`--vp-c-brand-1`) для атрибута `name` в секции `hero`. Однако вы можете настроить этот цвет, переопределив переменную `--vp-home-hero-name-color`.
+
+```css
+:root {
+ --vp-home-hero-name-color: blue;
+}
+```
+
+Также вы можете настроить его ещё больше, комбинируя `--vp-home-hero-name-background`, чтобы придать `name` градиентный цвет.
+
+```css
+:root {
+ --vp-home-hero-name-color: transparent;
+ --vp-home-hero-name-background: -webkit-linear-gradient(
+ 120deg,
+ #bd34fe,
+ #41d1ff
+ );
+}
+```
+
+## Секция `features` {#features-section}
+
+В секции `features` можно перечислить любое количество функций, которые вы хотели бы показать сразу после секции `hero`. Чтобы настроить её, передайте опцию `features` в метаданных страницы.
+
+Для каждой функции можно указать иконку, который может быть эмодзи или любым другим изображением. Если настраиваемая иконка представляет собой изображение (svg, png, jpeg...), вы должны предоставить ей соответствующую ширину и высоту. При необходимости можно указать описание, собственный размер, а также варианты для тёмной и светлой темы.
+
+```yaml
+---
+layout: home
+
+features:
+ - icon: 🛠️
+ title: Просто и минималистично, всегда
+ details: Lorem ipsum...
+ - icon:
+ src: /cool-feature-icon.svg
+ title: Ещё одна интересная функция
+ details: Lorem ipsum...
+ - icon:
+ dark: /dark-feature-icon.svg
+ light: /light-feature-icon.svg
+ title: Ещё одна интересная функция
+ details: Lorem ipsum...
+---
+```
+
+```ts
+interface Feature {
+ // Иконка
+ icon?: FeatureIcon
+
+ // Заголовок фичи
+ title: string
+
+ // Описание фичи
+ details: string
+
+ // Ссылка при нажатии на компонент функции. Ссылка может быть как внутренней, так и внешней.
+ //
+ // например, `guide/reference/default-theme-home-page` или `https://example.com`
+ link?: string
+
+ // Текст ссылки, который будет отображаться внутри компонента функции. Лучше всего использовать с опцией `link`.
+ //
+ // например, `Узнать подробнее`, `Посетить страницу` и т. д.
+ linkText?: string
+
+ // Атрибут rel для опции `link`
+ //
+ // например, `external`
+ rel?: string
+
+ // Атрибут target для опции `link`
+ target?: string
+}
+
+type FeatureIcon =
+ | string
+ | { src: string; alt?: string; width?: string; height: string }
+ | {
+ light: string
+ dark: string
+ alt?: string
+ width?: string
+ height: string
+ }
+```
+
+## Содержимое Markdown {#markdown-content}
+
+Вы можете добавить дополнительный контент на главную страницу вашего сайта, просто добавив Markdown под разделителем `---`.
+
+````md
+---
+layout: home
+
+hero:
+ name: VitePress
+ text: Генератор статических сайтов на основе Vite и Vue.
+---
+
+## Начало работы
+
+Вы можете начать использовать VitePress прямо сейчас, используя `npx`!
+
+```sh
+npm init
+npx vitepress init
+```
+````
+
+::: info Примечание
+VitePress не всегда автоматически стилизовал дополнительный контент страницы с макетом `layout: home`. Чтобы вернуться к старому поведению, добавьте `markdownStyles: false` в метаданных.
+:::
diff --git a/docs/ru/reference/default-theme-last-updated.md b/docs/ru/reference/default-theme-last-updated.md
new file mode 100644
index 00000000..7d926dc5
--- /dev/null
+++ b/docs/ru/reference/default-theme-last-updated.md
@@ -0,0 +1,27 @@
+# Последнее обновление {#last-updated}
+
+Время последнего обновления содержимого будет отображаться в правом нижнем углу страницы. Чтобы включить его, добавьте опцию `lastUpdated` в свой конфиг.
+
+::: tip Совет
+Чтобы увидеть обновленное время, необходимо зафиксировать файл Markdown.
+:::
+
+## Настройка в файле конфигурации {#site-level-config}
+
+```js
+export default {
+ lastUpdated: true
+}
+```
+
+## Настройка в метаданных {#frontmatter-config}
+
+Эту информацию можно отключить на конкретной странице с помощью опции `lastUpdated` в метаданных:
+
+```yaml
+---
+lastUpdated: false
+---
+```
+
+Также смотрите [Тема по умолчанию: `lastUpdated`](./default-theme-config#lastupdated) для получения более подробной информации. Любое истинное значение на уровне темы также включит функцию, если только она не будет явно отключена на уровне сайта или страницы.
diff --git a/docs/ru/reference/default-theme-layout.md b/docs/ru/reference/default-theme-layout.md
new file mode 100644
index 00000000..f02af7d5
--- /dev/null
+++ b/docs/ru/reference/default-theme-layout.md
@@ -0,0 +1,62 @@
+# Макет {#layout}
+
+Вы можете выбрать макет страницы, установив опцию `layout` в [метаданных](./frontmatter-config). Изначально есть 3 макета: `doc`, `page` и `home`. Если ничего не указано, то страница будет использовать макет `doc`.
+
+```yaml
+---
+layout: doc
+---
+```
+
+## Макет `doc` {#doc-layout}
+
+Вариант `doc` — это макет по умолчанию, который стилизует всё содержимое Markdown в виде «документации». Он работает, оборачивая весь контент в CSS-класс `vp-doc` и применяя стили к вложенным элементам.
+
+Почти все общие элементы, такие как `p` или `h2`, получают специальную стилизацию. Поэтому имейте в виду, что если вы добавите какой-либо пользовательский HTML внутри Markdown-контента, то он также будет подвержен влиянию этих стилей.
+
+Кроме того, в нём предусмотрены специальные функции, перечисленные ниже. Эти функции включены только в данном макете.
+
+- Ссылка «Редактировать»
+- Ссылки предыдущая/следующая
+- Оглавление
+- Реклама [Carbon Ads](./default-theme-carbon-ads)
+
+## Макет `page` {#page-layout}
+
+Вариант `page` сгенерирует «пустую страницу». Markdown всё равно будет разобран, и все [расширения Markdown](../guide/markdown) будут работать так же, как и с макетом `doc`, но никаких стилей по умолчанию применено не будет.
+
+Макет `page` позволит вам оформить всё самостоятельно, без влияния темы VitePress на разметку. Это удобно, когда вы хотите создать свою собственную страницу.
+
+Обратите внимание, что даже при таком раскладе сайдбар всё равно будет отображаться, если у страницы есть соответствующая конфигурация сайдбара.
+
+## Макет `home` {#home-layout}
+
+Вариант `home` сгенерирует шаблонную «домашнюю страницу». В этом макете вы можете установить дополнительные параметры, такие как `hero` и `features`, для дальнейшей настройки контента. Посетите секцию [Тема по умолчанию: Домашняя страница](./default-theme-home-page) для получения более подробной информации.
+
+## Без макета {#no-layout}
+
+Если вам не нужен макет, вы можете указать `layout: false` в метаданных. Этот параметр полезен, если вам нужна полностью настраиваемая целевая страница (по умолчанию без сайдбара, панели навигации или подвала).
+
+## Свой макет {#custom-layout}
+
+Вы также можете использовать собственный макет:
+
+```md
+---
+layout: foo
+---
+```
+
+Будет выполнен поиск компонента с именем `foo`, зарегистрированного в контексте. Например, вы можете зарегистрировать свой компонент глобально в `.vitepress/theme/index.ts`:
+
+```ts
+import DefaultTheme from 'vitepress/theme'
+import Foo from './Foo.vue'
+
+export default {
+ extends: DefaultTheme,
+ enhanceApp({ app }) {
+ app.component('foo', Foo)
+ }
+}
+```
diff --git a/docs/ru/reference/default-theme-nav.md b/docs/ru/reference/default-theme-nav.md
new file mode 100644
index 00000000..4448af5b
--- /dev/null
+++ b/docs/ru/reference/default-theme-nav.md
@@ -0,0 +1,162 @@
+# Навигация {#nav}
+
+Ключ `nav` в конфигурации — это панель навигации, отображаемая в верхней части страницы. Она содержит заголовок сайта, ссылки глобального меню и т. д.
+
+## Название и логотип сайта {#site-title-and-logo}
+
+По умолчанию навигация отображает название сайта, ссылаясь на значение [`config.title`](./site-config#title). Если вы хотите изменить то, что отображается в панели навигации, задайте пользовательский текст в опции `themeConfig.siteTitle`.
+
+```js
+export default {
+ themeConfig: {
+ siteTitle: 'Мой заголовок'
+ }
+}
+```
+
+Если у вас есть логотип для вашего сайта, вы можете отобразить его, передав путь к изображению. Вы должны поместить логотип непосредственно в директорию `public` и указать абсолютный путь к нему.
+
+```js
+export default {
+ themeConfig: {
+ logo: '/my-logo.svg'
+ }
+}
+```
+
+При добавлении логотипа он отображается вместе с названием сайта. Если вам нужен только логотип и вы хотите скрыть текст заголовка сайта, установите `false` для параметра `SiteTitle`.
+
+```js
+export default {
+ themeConfig: {
+ logo: '/my-logo.svg',
+ siteTitle: false
+ }
+}
+```
+
+Вы также можете передать объект в качестве логотипа, если хотите добавить атрибут `alt` или настроить его в зависимости от тёмного/светлого режима. Подробности смотрите в [`themeConfig.logo`](./default-theme-config#logo).
+
+## Навигационные ссылки {#navigation-links}
+
+Вы можете определить опцию `themeConfig.nav`, чтобы добавить ссылки в панель навигации:
+
+```js
+export default {
+ themeConfig: {
+ nav: [
+ { text: 'Руководство', link: '/guide' },
+ { text: 'Настройка', link: '/config' },
+ { text: 'Изменения', link: 'https://github.com/...' }
+ ]
+ }
+}
+```
+
+`text` — это текст, отображаемый в навигации, а `link` — это ссылка, на которую будет осуществлён переход при нажатии на текст. Для ссылки задайте путь к фактическому файлу без префикса `.md` и всегда начинайте с `/`.
+
+Навигационные ссылки также могут быть выпадающими меню. Для этого установите ключ `items` вместо ключа `link`:
+
+```js
+export default {
+ themeConfig: {
+ nav: [
+ { text: 'Руководство', link: '/guide' },
+ {
+ text: 'Выпадающее меню',
+ items: [
+ { text: 'Пункт A', link: '/item-1' },
+ { text: 'Пункт B', link: '/item-2' },
+ { text: 'Пункт C', link: '/item-3' }
+ ]
+ }
+ ]
+ }
+}
+```
+
+Обратите внимание, что заголовок выпадающего меню (`Выпадающее меню` в примере выше) не может иметь свойство `link`, так как он становится кнопкой для открытия выпадающего диалога.
+
+Вы можете добавить «секции» в пункты выпадающего меню, передавая больше вложенных элементов:
+
+```js
+export default {
+ themeConfig: {
+ nav: [
+ { text: 'Руководство', link: '/guide' },
+ {
+ text: 'Выпадающее меню',
+ items: [
+ {
+ // Заголовок секции
+ text: 'Секция A',
+ items: [
+ { text: 'Пункт A в секции A', link: '...' },
+ { text: 'Пункт B в секции A', link: '...' }
+ ]
+ }
+ ]
+ },
+ {
+ text: 'Выпадающее меню',
+ items: [
+ {
+ // Заголовок можно опустить
+ items: [
+ { text: 'Пункт A в секции A', link: '...' },
+ { text: 'Пункт B в секции A', link: '...' }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+### Настройка «активного» состояния ссылки {#customize-link-s-active-state}
+
+Пункты меню навигации будут выделены, если текущая страница находится под соответствующим путём. Если вы хотите настроить сопоставление путей, определите свойство `activeMatch` и регулярное выражение в качестве строкового значения.
+
+```js
+export default {
+ themeConfig: {
+ nav: [
+ // Эта ссылка получает активное состояние, когда пользователь
+ // переходит по пути `/config/`.
+ {
+ text: 'Руководство',
+ link: '/guide',
+ activeMatch: '/config/'
+ }
+ ]
+ }
+}
+```
+
+::: warning Предупреждение
+Ожидается, что `activeMatch` будет регулярным выражением, но вы должны определить его как строку. Мы не можем использовать здесь реальный объект RegExp, потому что он не сериализуется во время сборки.
+:::
+
+### Настройка атрибутов «target» и «rel» {#customize-link-s-target-and-rel-attributes}
+
+По умолчанию VitePress автоматически определяет атрибуты `target` и `rel` в зависимости от того, является ли ссылка внешней. Но при желании их можно настроить и вручную.
+
+```js
+export default {
+ themeConfig: {
+ nav: [
+ {
+ text: 'Товары',
+ link: 'https://www.thegithubshop.com/',
+ target: '_self',
+ rel: 'sponsored'
+ }
+ ]
+ }
+}
+```
+
+## Социальные ссылки {#social-links}
+
+См. [`socialLinks`](./default-theme-config#sociallinks).
diff --git a/docs/ru/reference/default-theme-prev-next-links.md b/docs/ru/reference/default-theme-prev-next-links.md
new file mode 100644
index 00000000..e2da9501
--- /dev/null
+++ b/docs/ru/reference/default-theme-prev-next-links.md
@@ -0,0 +1,43 @@
+# Предыдущая и следующая страницы {#prev-next-links}
+
+Вы можете настроить текст и ссылку для предыдущей и следующей страниц (отображаются в нижней части страницы). Это полезно, если вы хотите, чтобы текст отличался от того, что находится в сайдбаре. Кроме того, вы можете счесть полезным отключить подвал или ссылку на страницу, которая не включена в сайдбар.
+
+## prev {#prev}
+
+- Тип: `string | false | { text?: string; link?: string }`
+
+- Подробности:
+
+ Указывает текст/ссылку, который должен отображаться при переходе на предыдущую страницу. Если вы не зададите это в метаданных, текст/ссылка будет определяться из конфигурации сайдбара.
+
+- Примеры:
+
+ - Для настройки только текста:
+
+ ```yaml
+ ---
+ prev: 'Начать | Markdown'
+ ---
+ ```
+
+ - Для настройки текста и ссылки:
+
+ ```yaml
+ ---
+ prev:
+ text: 'Markdown'
+ link: '/guide/markdown'
+ ---
+ ```
+
+ - Для скрытия предыдущей страницы:
+
+ ```yaml
+ ---
+ prev: false
+ ---
+ ```
+
+## next {#next}
+
+Аналогично параметру `prev`, но для следующей страницы.
diff --git a/docs/ru/reference/default-theme-search.md b/docs/ru/reference/default-theme-search.md
new file mode 100644
index 00000000..6bbce96e
--- /dev/null
+++ b/docs/ru/reference/default-theme-search.md
@@ -0,0 +1,382 @@
+---
+outline: deep
+---
+
+# Поиск {#search}
+
+## Локальный поиск {#local-search}
+
+VitePress поддерживает нечёткий полнотекстовый поиск с использованием внутрибраузерного индекса благодаря [MiniSearch](https://github.com/lucaong/minisearch/). Чтобы включить эту функцию, просто установите значение `'local'` для опции `themeConfig.search.provider` в файле `.vitepress/config.ts`:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local'
+ }
+ }
+})
+```
+
+Пример результата:
+
+![скриншот модального окна поиска](/search.png)
+
+В качестве альтернативы можно использовать [Algolia DocSearch](#algolia-search) или некоторые плагины сообщества, например или .
+
+### i18n {#local-search-i18n}
+
+Вы можете использовать подобную конфигурацию для использования многоязычного поиска:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local',
+ options: {
+ locales: {
+ ru: {
+ translations: {
+ button: {
+ buttonText: 'Поиск',
+ buttonAriaLabel: 'Поиск'
+ },
+ modal: {
+ noResultsText: 'Нет результатов для',
+ resetButtonTitle: 'Сбросить поиск',
+ footer: {
+ selectText: 'выбрать',
+ navigateText: 'перейти'
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+})
+```
+
+### Параметры MiniSearch {#minisearch-options}
+
+Вы можете настроить MiniSearch следующим образом:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local',
+ options: {
+ miniSearch: {
+ /**
+ * @type {Pick}
+ */
+ options: {
+ /* ... */
+ },
+ /**
+ * @type {import('minisearch').SearchOptions}
+ * @default
+ * { fuzzy: 0.2, prefix: true, boost: { title: 4, text: 2, titles: 1 } }
+ */
+ searchOptions: {
+ /* ... */
+ }
+ }
+ }
+ }
+ }
+})
+```
+
+Подробнее в [документации MiniSearch](https://lucaong.github.io/minisearch/classes/MiniSearch.MiniSearch.html).
+
+### Пользовательский рендерер содержимого {#custom-content-renderer}
+
+Вы можете настроить функцию, используемую для отображения содержимого в формате Markdown перед его индексацией:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local',
+ options: {
+ /**
+ * @param {string} src
+ * @param {import('vitepress').MarkdownEnv} env
+ * @param {import('markdown-it')} md
+ */
+ _render(src, env, md) {
+ // возвращаем html
+ }
+ }
+ }
+ }
+})
+```
+
+Эта функция будет очищена от данных сайта на стороне клиента, поэтому вы можете использовать в ней API Node.js.
+
+#### Пример: Исключение страниц из поиска {#example-excluding-pages-from-search}
+
+Вы можете исключить страницы из поиска, добавив `search: false` в блок метаданных страницы. Альтернативный вариант:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local',
+ options: {
+ _render(src, env, md) {
+ const html = md.render(src, env)
+ if (env.frontmatter?.search === false) return ''
+ if (env.relativePath.startsWith('some/path')) return ''
+ return html
+ }
+ }
+ }
+ }
+})
+```
+
+::: warning Примечание
+В случае, если предоставляется пользовательская функция `_render`, вам нужно самостоятельно обработать заголовок `search: false`. Кроме того, объект `env` не будет полностью заполнен до вызова `md.render`, поэтому любые проверки необязательных свойств `env`, таких как `frontmatter`, должны быть выполнены после этого.
+:::
+
+#### Пример: Преобразование содержимого - добавление якорей {#example-transforming-content-adding-anchors}
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'local',
+ options: {
+ _render(src, env, md) {
+ const html = md.render(src, env)
+ if (env.frontmatter?.title)
+ return md.render(`# ${env.frontmatter.title}`) + html
+ return html
+ }
+ }
+ }
+ }
+})
+```
+
+## Поиск Algolia {#algolia-search}
+
+VitePress поддерживает поиск в вашей документации с помощью [Algolia DocSearch](https://docsearch.algolia.com/docs/what-is-docsearch). Обратитесь к руководству по началу работы. В файле `.vitepress/config.ts` вам нужно будет указать, по крайней мере, следующее, чтобы всё работало:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'algolia',
+ options: {
+ appId: '...',
+ apiKey: '...',
+ indexName: '...'
+ }
+ }
+ }
+})
+```
+
+### i18n {#algolia-search-i18n}
+
+Вы можете использовать подобную конфигурацию для использования многоязычного поиска:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ search: {
+ provider: 'algolia',
+ options: {
+ appId: '...',
+ apiKey: '...',
+ indexName: '...',
+ locales: {
+ ru: {
+ placeholder: 'Поиск в документации',
+ translations: {
+ button: {
+ buttonText: 'Поиск',
+ buttonAriaLabel: 'Поиск'
+ },
+ modal: {
+ searchBox: {
+ resetButtonTitle: 'Сбросить поиск',
+ resetButtonAriaLabel: 'Сбросить поиск',
+ cancelButtonText: 'Отменить поиск',
+ cancelButtonAriaLabel: 'Отменить поиск'
+ },
+ startScreen: {
+ recentSearchesTitle: 'История поиска',
+ noRecentSearchesText: 'Нет истории поиска',
+ saveRecentSearchButtonTitle: 'Сохранить в истории поиска',
+ removeRecentSearchButtonTitle: 'Удалить из истории поиска',
+ favoriteSearchesTitle: 'Избранное',
+ removeFavoriteSearchButtonTitle: 'Удалить из избранного'
+ },
+ errorScreen: {
+ titleText: 'Невозможно получить результаты',
+ helpText:
+ 'Вам может потребоваться проверить подключение к Интернету'
+ },
+ footer: {
+ selectText: 'выбрать',
+ navigateText: 'перейти',
+ closeText: 'закрыть',
+ searchByText: 'поставщик поиска'
+ },
+ noResultsScreen: {
+ noResultsText: 'Нет результатов для',
+ suggestedQueryText: 'Вы можете попытаться узнать',
+ reportMissingResultsText:
+ 'Считаете, что поиск даёт ложные результаты?',
+ reportMissingResultsLinkText:
+ 'Нажмите на кнопку «Обратная связь»'
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+})
+```
+
+[Эти параметры](https://github.com/vuejs/vitepress/blob/main/types/docsearch.d.ts) можно переопределить. Чтобы узнать о них больше, обратитесь к официальной документации Algolia.
+
+### Конфигурация поискового робота {#crawler-config}
+
+Вот пример конфигурации, основанной на той, что используется на этом сайте:
+
+```ts
+new Crawler({
+ appId: '...',
+ apiKey: '...',
+ rateLimit: 8,
+ startUrls: ['https://vitepress.dev/'],
+ renderJavaScript: false,
+ sitemaps: [],
+ exclusionPatterns: [],
+ ignoreCanonicalTo: false,
+ discoveryPatterns: ['https://vitepress.dev/**'],
+ schedule: 'at 05:10 on Saturday',
+ actions: [
+ {
+ indexName: 'vitepress',
+ pathsToMatch: ['https://vitepress.dev/**'],
+ recordExtractor: ({ $, helpers }) => {
+ return helpers.docsearch({
+ recordProps: {
+ lvl1: '.content h1',
+ content: '.content p, .content li',
+ lvl0: {
+ selectors: '',
+ defaultValue: 'Documentation'
+ },
+ lvl2: '.content h2',
+ lvl3: '.content h3',
+ lvl4: '.content h4',
+ lvl5: '.content h5'
+ },
+ indexHeadings: true
+ })
+ }
+ }
+ ],
+ initialIndexSettings: {
+ vitepress: {
+ attributesForFaceting: ['type', 'lang'],
+ attributesToRetrieve: ['hierarchy', 'content', 'anchor', 'url'],
+ attributesToHighlight: ['hierarchy', 'hierarchy_camel', 'content'],
+ attributesToSnippet: ['content:10'],
+ camelCaseAttributes: ['hierarchy', 'hierarchy_radio', 'content'],
+ searchableAttributes: [
+ 'unordered(hierarchy_radio_camel.lvl0)',
+ 'unordered(hierarchy_radio.lvl0)',
+ 'unordered(hierarchy_radio_camel.lvl1)',
+ 'unordered(hierarchy_radio.lvl1)',
+ 'unordered(hierarchy_radio_camel.lvl2)',
+ 'unordered(hierarchy_radio.lvl2)',
+ 'unordered(hierarchy_radio_camel.lvl3)',
+ 'unordered(hierarchy_radio.lvl3)',
+ 'unordered(hierarchy_radio_camel.lvl4)',
+ 'unordered(hierarchy_radio.lvl4)',
+ 'unordered(hierarchy_radio_camel.lvl5)',
+ 'unordered(hierarchy_radio.lvl5)',
+ 'unordered(hierarchy_radio_camel.lvl6)',
+ 'unordered(hierarchy_radio.lvl6)',
+ 'unordered(hierarchy_camel.lvl0)',
+ 'unordered(hierarchy.lvl0)',
+ 'unordered(hierarchy_camel.lvl1)',
+ 'unordered(hierarchy.lvl1)',
+ 'unordered(hierarchy_camel.lvl2)',
+ 'unordered(hierarchy.lvl2)',
+ 'unordered(hierarchy_camel.lvl3)',
+ 'unordered(hierarchy.lvl3)',
+ 'unordered(hierarchy_camel.lvl4)',
+ 'unordered(hierarchy.lvl4)',
+ 'unordered(hierarchy_camel.lvl5)',
+ 'unordered(hierarchy.lvl5)',
+ 'unordered(hierarchy_camel.lvl6)',
+ 'unordered(hierarchy.lvl6)',
+ 'content'
+ ],
+ distinct: true,
+ attributeForDistinct: 'url',
+ customRanking: [
+ 'desc(weight.pageRank)',
+ 'desc(weight.level)',
+ 'asc(weight.position)'
+ ],
+ ranking: [
+ 'words',
+ 'filters',
+ 'typo',
+ 'attribute',
+ 'proximity',
+ 'exact',
+ 'custom'
+ ],
+ highlightPreTag: '',
+ highlightPostTag: '',
+ minWordSizefor1Typo: 3,
+ minWordSizefor2Typos: 7,
+ allowTyposOnNumericTokens: false,
+ minProximity: 1,
+ ignorePlurals: true,
+ advancedSyntax: true,
+ attributeCriteriaComputedByMinProximity: true,
+ removeWordsIfNoResults: 'allOptional'
+ }
+ }
+})
+```
+
+
diff --git a/docs/ru/reference/default-theme-sidebar.md b/docs/ru/reference/default-theme-sidebar.md
new file mode 100644
index 00000000..92fd89c1
--- /dev/null
+++ b/docs/ru/reference/default-theme-sidebar.md
@@ -0,0 +1,213 @@
+# Сайдбар {#sidebar}
+
+Сайдбар (боковая панель) — основной навигационный блок вашей документации. Меню боковой панели можно настроить в секции [`themeConfig.sidebar`](./default-theme-config#sidebar).
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Руководство',
+ items: [
+ { text: 'Введение', link: '/ru/introduction' },
+ { text: 'Первые шаги', link: '/ru/getting-started' },
+ ...
+ ]
+ }
+ ]
+ }
+}
+```
+
+## Основы {#the-basics}
+
+Простейшая форма сайдбара — это передача массива ссылок. Элемент первого уровня определяет «секцию» сайдбара. Он должен содержать `text`, который является заголовком секции, и `items`, которые являются фактическими навигационными ссылками.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Заголовок секции A',
+ items: [
+ { text: 'Пункт A', link: '/item-a' },
+ { text: 'Пункт B', link: '/item-b' },
+ ...
+ ]
+ },
+ {
+ text: 'Заголовок секции B',
+ items: [
+ { text: 'Пункт C', link: '/item-c' },
+ { text: 'Пункт D', link: '/item-d' },
+ ...
+ ]
+ }
+ ]
+ }
+}
+```
+
+Каждый элемент `link` должен указывать путь к фактическому файлу, начинающийся с `/`. Если добавить в конец ссылки косую черту, то будет показан `index.md` соответствующего каталога.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Руководство',
+ items: [
+ // Ссылка на страницу `/ru/guide/index.md`
+ { text: 'Введение', link: '/ru/guide/' }
+ ]
+ }
+ ]
+ }
+}
+```
+
+Вы можете вложить элементы боковой панели на 6 уровней вглубь, считая от корневого уровня. Обратите внимание, что более 6 уровней вложенных элементов будут игнорироваться и не отображаться на боковой панели.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Уровень 1',
+ items: [
+ {
+ text: 'Уровень 2',
+ items: [
+ {
+ text: 'Уровень 3',
+ items: [
+ ...
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
+```
+
+## Несколько сайдбаров {#multiple-sidebars}
+
+Вы можете показывать разные боковые панели в зависимости от текущего маршрута. Например, как показано на этом сайте, вы можете создать в документации отдельные разделы, например, «Руководство» и «Настройка».
+
+Для этого сначала организуйте страницы в каталоги для каждого нужного раздела:
+
+```
+.
+├─ guide/
+│ ├─ index.md
+│ ├─ one.md
+│ └─ two.md
+└─ config/
+ ├─ index.md
+ ├─ three.md
+ └─ four.md
+```
+
+Затем обновите конфигурацию, чтобы определить боковую панель для каждого раздела. На этот раз вместо массива нужно передать объект.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: {
+ // Эта боковая панель отображается, когда пользователь находится в директории `guide`
+ '/guide/': [
+ {
+ text: 'Руководство',
+ items: [
+ { text: 'Index', link: '/guide/' },
+ { text: 'One', link: '/guide/one' },
+ { text: 'Two', link: '/guide/two' }
+ ]
+ }
+ ],
+
+ // Эта боковая панель отображается, когда пользователь находится в директории `config`
+ '/config/': [
+ {
+ text: 'Настройка',
+ items: [
+ { text: 'Index', link: '/config/' },
+ { text: 'Three', link: '/config/three' },
+ { text: 'Four', link: '/config/four' }
+ ]
+ }
+ ]
+ }
+ }
+}
+```
+
+## Сворачиваемые группы {#collapsible-sidebar-groups}
+
+Добавив опцию `collapsed` внутри группы `sidebar`, вы увидите кнопку переключения для скрытия/показа каждой секции.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Заголовок секции A',
+ collapsed: false,
+ items: [...]
+ }
+ ]
+ }
+}
+```
+
+Все секции «развёрнуты» по умолчанию. Если вы хотите, чтобы они были «свёрнуты» при первоначальной загрузке страницы, установите для опции `collapsed` значение `true`.
+
+```js
+export default {
+ themeConfig: {
+ sidebar: [
+ {
+ text: 'Заголовок секции A',
+ collapsed: true,
+ items: [...]
+ }
+ ]
+ }
+}
+```
+
+## `useSidebar` {#usesidebar}
+
+Возвращает данные, связанные с сайдбаром. Возвращаемый объект имеет следующий тип:
+
+```ts
+export interface DocSidebar {
+ isOpen: Ref
+ sidebar: ComputedRef
+ sidebarGroups: ComputedRef
+ hasSidebar: ComputedRef
+ hasAside: ComputedRef
+ leftAside: ComputedRef
+ isSidebarEnabled: ComputedRef
+ open: () => void
+ close: () => void
+ toggle: () => void
+}
+```
+
+**Пример:**
+
+```vue
+
+
+
+
Показывать только при наличии сайдбара
+
+```
diff --git a/docs/ru/reference/default-theme-team-page.md b/docs/ru/reference/default-theme-team-page.md
new file mode 100644
index 00000000..0eebaa24
--- /dev/null
+++ b/docs/ru/reference/default-theme-team-page.md
@@ -0,0 +1,252 @@
+
+
+# Страница команды {#team-page}
+
+Если вы хотите представить свою команду, вы можете использовать компоненты Team для создания страницы команды. Есть два варианта использования этих компонентов. Один из вариантов — встроить их в страницу с макетом `doc`, а другой — создать полноценную страницу команды.
+
+## Отображение членов команды на странице {#show-team-members-in-a-page}
+
+Вы можете использовать компонент ``, доступный из `vitepress/theme`, для отображения списка членов команды на любой странице.
+
+```html
+
+
+# Поприветствуйте нашу замечательную команду
+
+
+```
+
+Вышеуказанное отобразит члена команды в виде карточки. Должно отобразиться что-то похожее на то, что показано ниже.
+
+
+
+Компонент `` поставляется в двух различных размерах, `small` и `medium`. Хотя это зависит от ваших предпочтений, обычно размер `small` лучше подходит для использования на странице с макетом `doc`. Кроме того, вы можете добавить дополнительные свойства для карточки члена команды, например, добавить «описание» или кнопку «спонсировать». Подробнее об этом в секции [``](#vpteammembers).
+
+Встраивание членов команды в страницу документа хорошо подходит для небольших команд, где наличие полной страницы команды может быть слишком большим, или для представления частичных членов команды в качестве ссылки на контекст документации.
+
+Если у вас большое количество участников или вы просто хотите иметь больше места для отображения членов команды, подумайте о [создании отдельной страницы команды](#create-a-full-team-page).
+
+## Создание отдельной страницы команды {#create-a-full-team-page}
+
+Вместо того чтобы добавлять членов команды на страницу с макетом `doc`, вы можете создать полноценную страницу команды, подобно созданию пользовательской [главной страницы](./default-theme-home-page).
+
+Чтобы создать страницу команды, сначала создайте новый md-файл. Имя файла не имеет значения, но здесь мы назовем его `team.md`. В этом файле установите в блоке метаданных параметр `layout: page`, а затем вы можете организовать структуру страницы, используя компоненты `TeamPage`.
+
+```html
+---
+layout: page
+---
+
+
+
+
+
+ Наша команда
+
+ Разработкой VitePress руководит международная команда, некоторые члены
+ которой представлены ниже.
+
+
+
+
+```
+
+При создании полной страницы команды не забудьте обернуть все компоненты компонентом ``. Этот компонент обеспечит всем вложенным компонентам, связанным с командой, правильную структуру макета, например, расстояние между ними.
+
+Компонент `` добавляет блок заголовка страницы. Заголовок — это тег `
`. Используйте слоты `#title` и `#lead`, чтобы рассказать о своей команде.
+
+`` работает так же, как и при использовании в doc-странице. Отобразится список участников.
+
+### Добавление секций для разделения членов команды {#add-sections-to-divide-team-members}
+
+Вы можете добавить «секции» на страницу команды. Например, у вас могут быть разные типы членов команды, такие как члены основной команды и партнёры сообщества. Вы можете разделить этих членов на секции, чтобы лучше объяснить роли каждой группы.
+
+Для этого добавьте компонент `` в файл `team.md`, который мы создали ранее.
+
+```html
+---
+layout: page
+---
+
+
+
+
+
+ Наша команда
+ ...
+
+
+
+ Партнёры
+ ...
+
+
+
+
+
+```
+
+Компонент `` может иметь слоты `#title` и `#lead`, аналогичные компоненту `VPTeamPageTitle`, а также слот `#members` для отображения членов команды.
+
+Не забудьте поместить компонент `` в слот `#members`.
+
+## `` {#vpteammembers}
+
+Компонент `` отображает заданный список членов команды.
+
+```html
+
+```
+
+```ts
+interface Props {
+ // Размер карточки каждого члена команды. По умолчанию `medium`.
+ size?: 'small' | 'medium'
+
+ // Список членов команды для отображения.
+ members: TeamMember[]
+}
+
+interface TeamMember {
+ // Изображение аватара.
+ avatar: string
+
+ // Имя члена команды.
+ name: string
+
+ // Заголовок, отображаемый под именем члена команды.
+ // например: разработчик, инженер-программист и т. д.
+ title?: string
+
+ // Организация, в которой состоит текущий член команды.
+ org?: string
+
+ // URL-адрес сайта организации.
+ orgLink?: string
+
+ // Описание члена команды.
+ desc?: string
+
+ // Социальные ссылки: GitHub, Twitter и т. д.
+ // Могут быть переданы в виде объекта.
+ // См. https://vitepress.dev/reference/default-theme-config.html#sociallinks
+ links?: SocialLink[]
+
+ // URL-адрес спонсорской страницы члена команды.
+ sponsor?: string
+
+ // Текст спонсорской ссылки. По умолчанию 'Sponsor'.
+ actionText?: string
+}
+```
+
+## `` {#vpteampage}
+
+Корневой компонент при создании отдельной страницы команды. Принимает только один слот. Он будет стилизовать все передаваемые компоненты, связанные с командой.
+
+## `` {#vpteampagetitle}
+
+Добавляет блок «заголовка» страницы. Лучше всего использовать в самом начале внутри ``. Принимает слоты `#title` и `#lead`.
+
+```html
+
+
+ Наша команда
+
+ Разработкой VitePress руководит международная команда, некоторые члены
+ которой представлены ниже.
+
+
+
+```
+
+## `` {#vpteampagesection}
+
+Создает «секцию» на странице команды. Принимает слоты `#title`, `#lead` и `#members`. Внутри `` вы можете добавить столько секций, сколько захотите.
+
+```html
+
+ ...
+
+ Партнёры
+ Lorem ipsum...
+
+
+
+
+
+```
diff --git a/docs/ru/reference/frontmatter-config.md b/docs/ru/reference/frontmatter-config.md
new file mode 100644
index 00000000..5c4b3a93
--- /dev/null
+++ b/docs/ru/reference/frontmatter-config.md
@@ -0,0 +1,221 @@
+---
+outline: deep
+---
+
+# Конфигурация метаданных {#frontmatter-config}
+
+Метаданные обеспечивают настройку отдельных страниц. В каждом файле Markdown можно использовать метаданные, чтобы переопределить параметры конфигурации сайта или темы. Кроме того, есть параметры конфигурации, которые можно задать только через метаданные.
+
+Пример использования:
+
+```md
+---
+title: Документация с VitePress
+editLink: true
+---
+```
+
+Вы можете получить доступ к метаданным через глобальный объект `$frontmatter` в выражениях Vue:
+
+```md
+{{ $frontmatter.title }}
+```
+
+## title {#title}
+
+- Тип: `string`
+
+Заголовок страницы. Это то же самое, что [config.title](./site-config#title), и оно переопределяет конфигурацию сайта.
+
+```yaml
+---
+title: VitePress
+---
+```
+
+## titleTemplate {#titletemplate}
+
+- Тип: `string | boolean`
+
+Суффикс для названия. Это то же самое, что и [config.titleTemplate](./site-config#titletemplate), и оно переопределяет конфигурацию сайта.
+
+```yaml
+---
+title: VitePress
+titleTemplate: Генератор статических сайтов на основе Vite и Vue
+---
+```
+
+## description {#description}
+
+- Тип: `string`
+
+Описание для страницы. Это то же самое, что и [config.description](./site-config#description), и оно переопределяет конфигурацию сайта.
+
+```yaml
+---
+description: VitePress
+---
+```
+
+## head {#head}
+
+- Тип: `HeadConfig[]`
+
+Укажите дополнительные теги, которые будут выводиться для текущей страницы. Они будут добавляться после других тегов внутри блока head, введённых в конфигурации сайта.
+
+```yaml
+---
+head:
+ - - meta
+ - name: description
+ content: привет
+ - - meta
+ - name: keywords
+ content: супер-пупер SEO
+---
+```
+
+```ts
+type HeadConfig =
+ | [string, Record]
+ | [string, Record, string]
+```
+
+## Только для темы по умолчанию {#default-theme-only}
+
+Следующие параметры метаданных применимы только при использовании темы по умолчанию.
+
+### layout {#layout}
+
+- Тип: `doc | home | page`
+- По умолчанию: `doc`
+
+Определяет макет страницы.
+
+- `doc` - Применяет стили документации по умолчанию к содержимому Markdown.
+- `home` - Вы можете добавить дополнительные параметры, такие как `hero` и `features`, чтобы быстро создать красивую целевую страницу.
+- `page` - Ведет себя аналогично `doc`, но не применяет стили к содержимому. Полезно, если вы хотите создать полностью настраиваемую страницу.
+
+```yaml
+---
+layout: doc
+---
+```
+
+### hero {#hero}
+
+Определяет содержимое секции `hero`, когда `layout` имеет значение `home`. Подробнее в главе [Тема по умолчанию: Главная страница](./default-theme-home-page).
+
+### features {#features}
+
+Определяет элементы для отображения в секции `features`, когда `layout` имеет значение `home`. Подробнее в главе [Тема по умолчанию: Главная страница](./default-theme-home-page).
+
+### navbar {#navbar}
+
+- Тип: `boolean`
+- По умолчанию: `true`
+
+Отображать ли [панель навигации](./default-theme-nav).
+
+```yaml
+---
+navbar: false
+---
+```
+
+### sidebar {#sidebar}
+
+- Тип: `boolean`
+- По умолчанию: `true`
+
+Отображать ли [сайдбар](./default-theme-sidebar).
+
+```yaml
+---
+sidebar: false
+---
+```
+
+### aside {#aside}
+
+- Тип: `boolean | 'left'`
+- По умолчанию: `true`
+
+Определяет расположение компонента aside в макете `doc`.
+
+Установка этого значения в `false` предотвращает отрисовку контейнера сайдбара.\
+Установка этого значения в `true` приведёт к отображению сайдбара справа.\
+Установка этого значения в `left` приведёт к отображению сайдбара слева.
+
+```yaml
+---
+aside: false
+---
+```
+
+### outline {#outline}
+
+- Тип: `number | [number, number] | 'deep' | false`
+- По умолчанию: `2`
+
+Уровни заголовков в оглавлении для отображения на странице. Это то же самое, что и [config.themeConfig.outline.level](./default-theme-config#outline), и оно переопределяет значение, установленное в конфигурации сайта.
+
+### lastUpdated {#lastupdated}
+
+- Тип: `boolean | Date`
+- По умолчанию: `true`
+
+Отображать ли текст [Обновлено](./default-theme-last-updated) в нижнем колонтитуле текущей страницы. Если указано время даты, оно будет отображаться вместо временной метки последнего изменения git.
+
+```yaml
+---
+lastUpdated: false
+---
+```
+
+### editLink {#editlink}
+
+- Тип: `boolean`
+- По умолчанию: `true`
+
+Отображать ли [ссылку для редактирования](./default-theme-edit-link) в нижнем колонтитуле текущей страницы.
+
+```yaml
+---
+editLink: false
+---
+```
+
+### footer {#footer}
+
+- Тип: `boolean`
+- По умолчанию: `true`
+
+Отображать ли [подвал](./default-theme-footer).
+
+```yaml
+---
+footer: false
+---
+```
+
+### pageClass {#pageclass}
+
+- Тип: `string`
+
+Добавьте дополнительное имя класса на определённую страницу.
+
+```yaml
+---
+pageClass: custom-page-class
+---
+```
+
+Вы также можете настроить стили этой конкретной страницы в файле `.vitepress/theme/custom.css`:
+
+```css
+.custom-page-class {
+ /* стили для конкретной страницы */
+}
+```
diff --git a/docs/ru/reference/runtime-api.md b/docs/ru/reference/runtime-api.md
new file mode 100644
index 00000000..5d21d29a
--- /dev/null
+++ b/docs/ru/reference/runtime-api.md
@@ -0,0 +1,165 @@
+# Runtime API {#runtime-api}
+
+VitePress предлагает несколько встроенных API, позволяющих получить доступ к данным приложения. VitePress также поставляется с несколькими встроенными компонентами, которые можно использовать глобально.
+
+Вспомогательные методы глобально импортируются из `vitepress` и обычно используются в компонентах Vue для пользовательских тем. Однако их можно использовать и внутри страниц `.md`, так как файлы markdown компилируются в [однофайловые компоненты](https://ru.vuejs.org/guide/scaling-up/sfc.html) Vue.
+
+Методы, начинающиеся с `use*`, указывают на то, что это функция [Vue 3 Composition API](https://ru.vuejs.org/guide/introduction.html#composition-api) («композабл»), которая может быть использована только внутри `setup()` или `
+
+
+
{{ theme.footer.copyright }}
+
+```
+
+## `useRoute` {#useroute}
+
+Возвращает текущий объект маршрута со следующим типом:
+
+```ts
+interface Route {
+ path: string
+ data: PageData
+ component: Component | null
+}
+```
+
+## `useRouter` {#userouter}
+
+Возвращает экземпляр маршрутизатора VitePress, чтобы вы могли программно перейти на другую страницу.
+
+```ts
+interface Router {
+ /**
+ * Текущий маршрут.
+ */
+ route: Route
+ /**
+ * Переход к новому URL-адресу.
+ */
+ go: (to?: string) => Promise
+ /**
+ * Вызывается перед изменением маршрута. Верните `false`, чтобы отменить навигацию.
+ */
+ onBeforeRouteChange?: (to: string) => Awaitable
+ /**
+ * Вызывается перед загрузкой компонента страницы (после того, как состояние истории
+ * обновлено). Верните `false`, чтобы отменить навигацию.
+ */
+ onBeforePageLoad?: (to: string) => Awaitable
+ /**
+ * Вызывается после изменения маршрута.
+ */
+ onAfterRouteChanged?: (to: string) => Awaitable
+}
+```
+
+## `withBase` {#withbase}
+
+- **Тип**: `(path: string) => string`
+
+Добавляет настроенный [`base`](./site-config#base) к заданному URL-пути. Также смотрите секцию [Базовый URL](../guide/asset-handling#base-url).
+
+## `` {#content}
+
+Компонент `` отображает отрисованное содержимое Markdown. Полезно [при создании собственной темы](../guide/custom-theme).
+
+```vue
+
+
Пользовательский макет!
+
+
+```
+
+## `` {#clientonly}
+
+Компонент `` отображает свой слот только на стороне клиента.
+
+Поскольку приложения VitePress при генерации статических сборок рендерятся в Node.js, любое использование Vue должно соответствовать универсальным требованиям к коду. Короче говоря, убедитесь, что доступ к API Browser / DOM осуществляется только в хуках `beforeMount` или `mounted`.
+
+Если вы используете или демонстрируете компоненты, которые не являются SSR-дружественными (например, содержат пользовательские директивы), вы можете обернуть их внутри компонента `ClientOnly`.
+
+```vue-html
+
+
+
+```
+
+- См. также: [Совместимость с SSR](../guide/ssr-compat)
+
+## `$frontmatter` {#frontmatter}
+
+Прямой доступ к [метаданным](../guide/frontmatter) текущей страницы в выражениях Vue.
+
+```md
+---
+title: Привет
+---
+
+# {{ $frontmatter.title }}
+```
+
+## `$params` {#params}
+
+Прямой доступ к параметрам [динамических маршрутов](../guide/routing#dynamic-routes) текущей страницы в выражениях Vue.
+
+```md
+- имя пакета: {{ $params.pkg }}
+- версия: {{ $params.version }}
+```
diff --git a/docs/ru/reference/site-config.md b/docs/ru/reference/site-config.md
new file mode 100644
index 00000000..1b1a8483
--- /dev/null
+++ b/docs/ru/reference/site-config.md
@@ -0,0 +1,720 @@
+---
+outline: deep
+---
+
+# Конфигурация сайта {#site-config}
+
+Конфигурация сайта — это место, где вы можете определить глобальные настройки сайта. Параметры конфигурации приложения определяют настройки, которые применяются к каждому сайту VitePress, независимо от того, какая тема на нем используется. Например, базовый каталог или название сайта.
+
+## Обзор {#overview}
+
+### Разрешение конфигурации {#config-resolution}
+
+Файл конфигурации всегда разрешается из `/.vitepress/config.[ext]`, где `` — это корень вашего [проекта](../guide/routing#root-and-source-directory) VitePress, а `[ext]` — одно из поддерживаемых расширений файла. TypeScript поддерживается из коробки. Поддерживаемые расширения включают `.js`, `.ts`, `.mjs` и `.mts`.
+
+В файлах конфигурации рекомендуется использовать синтаксис ES-модулей. Файл конфигурации должен по умолчанию экспортировать объект:
+
+```ts
+export default {
+ // параметры конфигурации на уровне приложения
+ lang: 'ru-RU',
+ title: 'VitePress',
+ description: 'Генератор статических сайтов на основе Vite и Vue.',
+ ...
+}
+```
+
+:::details Динамическая (асинхронная) конфигурация
+
+Если вам нужно генерировать конфигурацию динамически, вы также можете экспортировать функцию по умолчанию. Например:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default async () => {
+ const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
+
+ return defineConfig({
+ // параметры конфигурации на уровне приложения
+ lang: 'ru-RU',
+ title: 'VitePress',
+ description: 'Генератор статических сайтов на основе Vite и Vue.',
+
+ // параметры конфигурации на уровне темы
+ themeConfig: {
+ sidebar: [
+ ...posts.map((post) => ({
+ text: post.name,
+ link: `/posts/${post.name}`
+ }))
+ ]
+ }
+ })
+}
+```
+
+Вы также можете использовать `await` верхнего уровня. Например:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+const posts = await (await fetch('https://my-cms.com/blog-posts')).json()
+
+export default defineConfig({
+ // параметры конфигурации на уровне приложения
+ lang: 'ru-RU',
+ title: 'VitePress',
+ description: 'Генератор статических сайтов на основе Vite и Vue.',
+
+ // параметры конфигурации на уровне темы
+ themeConfig: {
+ sidebar: [
+ ...posts.map((post) => ({
+ text: post.name,
+ link: `/posts/${post.name}`
+ }))
+ ]
+ }
+})
+```
+
+:::
+
+### Интеллектуальная настройка {#config-intellisense}
+
+Использование помощника `defineConfig` обеспечит интеллектуальный анализ опций конфигурации на основе TypeScript. Если ваша IDE поддерживает эту функцию, она должна работать как в JavaScript, так и в TypeScript.
+
+```js
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ // ...
+})
+```
+
+### Типизированная конфигурация темы {#typed-theme-config}
+
+По умолчанию помощник `defineConfig` ожидает тип конфигурации темы из темы по умолчанию:
+
+```ts
+import { defineConfig } from 'vitepress'
+
+export default defineConfig({
+ themeConfig: {
+ // Тип `DefaultTheme.Config`
+ }
+})
+```
+
+Если вы используете пользовательскую тему и хотите проверять типы для конфигурации темы, вам нужно использовать `defineConfigWithTheme`, и передавать тип конфигурации для вашей пользовательской темы через общий аргумент:
+
+```ts
+import { defineConfigWithTheme } from 'vitepress'
+import type { ThemeConfig } from 'your-theme'
+
+export default defineConfigWithTheme({
+ themeConfig: {
+ // Tип `ThemeConfig`
+ }
+})
+```
+
+### Настройка Vite, Vue и Markdown {#vite-vue-markdown-config}
+
+- **Vite**
+
+ Вы можете настроить базовый экземпляр Vite с помощью опции [vite](#vite) в конфигурации VitePress. Нет необходимости создавать отдельный файл конфигурации Vite.
+
+- **Vue**
+
+ VitePress уже включает в себя официальный плагин Vue для Vite ([@vitejs/plugin-vue](https://github.com/vitejs/vite-plugin-vue)). Вы можете настроить его параметры с помощью опции [vue](#vue) в конфигурации VitePress.
+
+- **Markdown**
+
+ Вы можете настроить базовый экземпляр [Markdown-It](https://github.com/markdown-it/markdown-it) с помощью опции [markdown](#markdown) в конфигурации VitePress.
+
+## Метаданные сайта {#site-metadata}
+
+### title {#title}
+
+- Тип: `string`
+- По умолчанию: `VitePress`
+- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#title)
+
+Название для сайта. При использовании темы по умолчанию оно будет отображаться в панели навигации.
+
+Оно также будет использоваться в качестве суффикса по умолчанию для всех заголовков отдельных страниц, если не определен [`titleTemplate`](#titletemplate). Окончательный заголовок отдельной страницы будет представлять собой текстовое содержимое её первого заголовка `
`, объединённое с глобальным `title` в качестве суффикса. Например, со следующей конфигурацией и содержимым страницы:
+
+```ts
+export default {
+ title: 'Мой замечательный сайт'
+}
+```
+
+```md
+# Привет
+```
+
+Заголовок страницы будет таким: `Привет | Мой замечательный сайт`.
+
+### titleTemplate {##titletemplate}
+
+- Тип: `string | boolean`
+- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#titletemplate)
+
+Позволяет настраивать суффикс заголовка каждой страницы или весь заголовок. Например:
+
+```ts
+export default {
+ title: 'Мой замечательный сайт',
+ titleTemplate: 'Пользовательский суффикс'
+}
+```
+
+```md
+# Привет
+```
+
+Заголовок страницы будет таким: `Привет | Пользовательский суффикс`.
+
+Чтобы полностью настроить отображение заголовка, вы можете использовать символ `:title` в `titleTemplate`:
+
+```ts
+export default {
+ titleTemplate: ':title - Пользовательский суффикс'
+}
+```
+
+Здесь `:title` будет заменён текстом, выведенным из первого заголовка страницы `
`. Заголовок страницы предыдущего примера будет `Привет - Пользовательский суффикс`.
+
+Опция может быть установлена в значение `false`, чтобы отключить суффиксы заголовков.
+
+### description {#description}
+
+- Тип: `string`
+- По умолчанию: `A VitePress site`
+- Можно переопределить для каждой страницы с помощью [метаданных](./frontmatter-config#description)
+
+Описание для сайта. Это будет отображаться как тег `` в HTML-странице.
+
+```ts
+export default {
+ description: 'A VitePress site'
+}
+```
+
+### head {#head}
+
+- Тип: `HeadConfig[]`
+- По умолчанию: `[]`
+- Можно добавлять на страницу через [метаданные](./frontmatter-config#head)
+
+Дополнительные элементы для отображения в теге `` в HTML-странице. Добавленные пользователем теги выводятся перед закрывающим тегом `head`, после тегов VitePress.
+
+```ts
+type HeadConfig =
+ | [string, Record]
+ | [string, Record, string]
+```
+
+#### Пример: Добавление значка сайта {#example-adding-a-favicon}
+
+```ts
+export default {
+ head: [['link', { rel: 'icon', href: '/favicon.ico' }]]
+} // поместите favicon.ico в публичную директорию; если установлен параметр base, используйте /base/favicon.ico
+
+/* Отрисуется так:
+
+*/
+```
+
+#### Пример: Добавление шрифтов Google {#example-adding-google-fonts}
+
+```ts
+export default {
+ head: [
+ ['link', { rel: 'preconnect', href: 'https://fonts.googleapis.com' }],
+ [
+ 'link',
+ { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossorigin: '' }
+ ],
+ [
+ 'link',
+ {
+ href: 'https://fonts.googleapis.com/css2?family=Roboto&display=swap',
+ rel: 'stylesheet'
+ }
+ ]
+ ]
+}
+
+/* Отрисуется так:
+
+
+
+*/
+```
+
+#### Пример: Регистрация сервис-воркера {#example-registering-a-service-worker}
+
+```ts
+export default {
+ head: [
+ [
+ 'script',
+ { id: 'register-sw' },
+ `;(() => {
+ if ('serviceWorker' in navigator) {
+ navigator.serviceWorker.register('/sw.js')
+ }
+ })()`
+ ]
+ ]
+}
+
+/* Отрисуется так:
+
+*/
+```
+
+#### Пример: Использование Google Analytics {#example-using-google-analytics}
+
+```ts
+export default {
+ head: [
+ [
+ 'script',
+ { async: '', src: 'https://www.googletagmanager.com/gtag/js?id=TAG_ID' }
+ ],
+ [
+ 'script',
+ {},
+ `window.dataLayer = window.dataLayer || [];
+ function gtag(){dataLayer.push(arguments);}
+ gtag('js', new Date());
+ gtag('config', 'TAG_ID');`
+ ]
+ ]
+}
+
+/* Отрисуется так:
+
+
+*/
+```
+
+### lang {#lang}
+
+- Тип: `string`
+- По умолчанию: `en-US`
+
+Атрибут lang для сайта. Будет выглядеть как тег `` в HTML-странице.
+
+```ts
+export default {
+ lang: 'en-US'
+}
+```
+
+### base {#base}
+
+- Тип: `string`
+- По умолчанию: `/`
+
+Базовый URL-адрес, по которому будет развёрнут сайт. Этот параметр необходимо задать, если вы планируете развернуть свой сайт по подпути, например, для страниц GitHub. Если вы планируете развернуть свой сайт на `https://foo.github.io/bar/`, то вам следует установить base на `'/bar/'`. Он всегда должен начинаться и заканчиваться косой чертой.
+
+Параметр `base` автоматически добавляется ко всем URL, которые начинаются с `/` в других опциях, поэтому вам нужно указать его только один раз.
+
+```ts
+export default {
+ base: '/base/'
+}
+```
+
+## Маршрутизация {#routing}
+
+### cleanUrls {#cleanurls}
+
+- Тип: `boolean`
+- По умолчанию: `false`
+
+Если установить значение `true`, VitePress будет удалять из URL-адресов завершающий `.html`. Также смотрите [Создание чистого URL-адреса](../guide/routing#generating-clean-url).
+
+::: warning Требуется поддержка сервера
+Для включения этой функции может потребоваться дополнительная настройка на вашей хостинговой платформе. Чтобы это сработало, ваш сервер должен быть способен обслуживать `/foo.html` при посещении `/foo` **без редиректа**.
+:::
+
+### rewrites {#rewrites}
+
+- Тип: `Record`
+
+Определяет сопоставление пользовательских каталогов с URL-адресами. Дополнительную информацию см. в секции [Маршрутизация: перезапись маршрутов](../guide/routing#route-rewrites).
+
+```ts
+export default {
+ rewrites: {
+ 'source/:page': 'destination/:page'
+ }
+}
+```
+
+## Сборка {#build}
+
+### srcDir {#srcdir}
+
+- Тип: `string`
+- По умолчанию: `.`
+
+Каталог, в котором хранятся ваши страницы в формате Markdown, относительно корня проекта. Также смотрите [Корневая директория и директория с исходными файлами](../guide/routing#root-and-source-directory).
+
+```ts
+export default {
+ srcDir: './src'
+}
+```
+
+### srcExclude {#srcexclude}
+
+- Тип: `string`
+- По умолчанию: `undefined`
+
+[Шаблон](https://github.com/mrmlnc/fast-glob#pattern-syntax) для поиска файлов, которые должны быть исключены из исходного содержимого.
+
+```ts
+export default {
+ srcExclude: ['**/README.md', '**/TODO.md']
+}
+```
+
+### outDir {#outdir}
+
+- Тип: `string`
+- По умолчанию: `./.vitepress/dist`
+
+Расположение вывода сборки для сайта, относительно [корня проекта](../guide/routing#root-and-source-directory).
+
+```ts
+export default {
+ outDir: '../public'
+}
+```
+
+### assetsDir {#assetsdir}
+
+- Тип: `string`
+- По умолчанию: `assets`
+
+Укажите каталог, в котором будут храниться сгенерированные ресурсы. Путь должен находиться внутри [`outDir`](#outdir) и разрешается относительно него.
+
+```ts
+export default {
+ assetsDir: 'static'
+}
+```
+
+### cacheDir {#cachedir}
+
+- Тип: `string`
+- По умолчанию: `./.vitepress/cache`
+
+Каталог для файлов кэша, относительно [корня проекта](../guide/routing#root-and-source-directory). См. также: [cacheDir](https://vitejs.dev/config/shared-options.html#cachedir).
+
+```ts
+export default {
+ cacheDir: './.vitepress/.vite'
+}
+```
+
+### ignoreDeadLinks {#ignoredeadlinks}
+
+- Тип: `boolean | 'localhostLinks' | (string | RegExp | ((link: string) => boolean))[]`
+- По умолчанию: `false`
+
+Если установлено значение `true`, VitePress не будет завершать сборку из-за неработающих ссылок.
+
+Если установить значение `'localhostLinks'`, сборка будет завершаться при наличии неработающих ссылок, но не будет проверять ссылки `localhost`.
+
+```ts
+export default {
+ ignoreDeadLinks: true
+}
+```
+
+Это также может быть массив точных строк url, шаблонов regex или пользовательских функций фильтрации.
+
+```ts
+export default {
+ ignoreDeadLinks: [
+ // игнорировать url "/playground"
+ '/playground',
+ // игнорировать все ссылки на localhost
+ /^https?:\/\/localhost/,
+ // игнорировать все ссылки, включающие "/repl/""
+ /\/repl\//,
+ // пользовательская функция, игнорирует все ссылки, включающие "ignore"
+ (url) => {
+ return url.toLowerCase().includes('ignore')
+ }
+ ]
+}
+```
+
+### metaChunk {#metachunk}
+
+- Тип: `boolean`
+- По умолчанию: `false`
+
+Если установлено значение `true`, метаданные страницы извлекаются в отдельный фрагмент JavaScript, а не вставляются в исходный HTML. Это уменьшает полезную нагрузку HTML каждой страницы и делает метаданные страниц кэшируемыми, что позволяет снизить пропускную способность сервера при наличии большого количества страниц на сайте.
+
+### mpa {#mpa}
+
+- Тип: `boolean`
+- По умолчанию: `false`
+
+Если установлено значение `true`, производственное приложение будет создано в [режиме MPA](../guide/mpa-mode). В режиме MPA по умолчанию используется 0 КБ JavaScript, что приводит к отключению навигации на стороне клиента и требует явного согласия на интерактивность.
+
+## Тема {#theming}
+
+### appearance {#appearance}
+
+- Тип: `boolean | 'dark' | 'force-dark' | import('@vueuse/core').UseDarkOptions`
+- По умолчанию: `true`
+
+Включать ли тёмный режим (путём добавления класса `.dark` к элементу ``).
+
+- Если опция имеет значение `true`, тема по умолчанию будет определяться цветовой гаммой, предпочитаемой пользователем.
+- Если опция имеет значение `dark`, тема по умолчанию будет тёмной, если пользователь не переключит её вручную.
+- Если установить значение `false`, пользователи не смогут переключать тему.
+
+Эта опция вставляет встроенный скрипт, который восстанавливает настройки пользователей из локального хранилища с помощью ключа `vitepress-theme-appearance`. Это гарантирует, что класс `.dark` будет применён до отрисовки страницы, чтобы избежать мерцания.
+
+`appearance.initialValue` может быть только `'dark' | undefined`. Ссылки или геттеры не поддерживаются.
+
+### lastUpdated {#lastupdated}
+
+- Тип: `boolean`
+- По умолчанию: `false`
+
+Получать ли временную метку последнего обновления для каждой страницы с помощью Git. Временная метка будет включена в данные каждой страницы, доступные через [`useData`](./runtime-api#usedata).
+
+При использовании темы по умолчанию включение этой опции приведёт к отображению времени последнего обновления каждой страницы. Вы можете настроить текст с помощью опции [`themeConfig.lastUpdatedText`](./default-theme-config#lastupdatedtext).
+
+## Кастомизация {#customization}
+
+### markdown {#markdown}
+
+- Тип: `MarkdownOption`
+
+Настройте параметры парсера Markdown. VitePress использует [Markdown-it](https://github.com/markdown-it/markdown-it) в качестве парсера и [Shiki](https://github.com/shikijs/shiki) для подсветки синтаксиса языка. Внутри этой опции вы можете передать различные параметры, связанные с Markdown, в соответствии с вашими потребностями.
+
+```js
+export default {
+ markdown: {...}
+}
+```
+
+Проверьте [объявление типа и jsdocs](https://github.com/vuejs/vitepress/blob/main/src/node/markdown/markdown.ts) на наличие всех доступных опций.
+
+### vite {#vite}
+
+- Тип: `import('vite').UserConfig`
+
+Передаёт необработанную [конфигурацию Vite](https://vitejs.dev/config/) внутреннему серверу разработки / сборщику Vite.
+
+```js
+export default {
+ vite: {
+ // параметры конфигурации Vite
+ }
+}
+```
+
+### vue {#vue}
+
+- Тип: `import('@vitejs/plugin-vue').Options`
+
+Передаёт необработанные [параметры `@vitejs/plugin-vue`](https://github.com/vitejs/vite-plugin-vue/tree/main/packages/plugin-vue#options) внутреннему экземпляру плагина.
+
+```js
+export default {
+ vue: {
+ // параметры @vitejs/plugin-vue
+ }
+}
+```
+
+## Хуки сборки {#build-hooks}
+
+Хуки для сборки VitePress позволяют добавлять на сайт новую функциональность и поведение:
+
+- Карта сайта
+- Поисковая индексация
+- PWA
+- Телепорты
+
+### buildEnd {#buildend}
+
+- Тип: `(siteConfig: SiteConfig) => Awaitable`
+
+`buildEnd` — это хук CLI сборки, который будет запущен после завершения сборки (SSG), но до выхода из процесса VitePress CLI.
+
+```ts
+export default {
+ async buildEnd(siteConfig) {
+ // ...
+ }
+}
+```
+
+### postRender {#postrender}
+
+- Тип: `(context: SSGContext) => Awaitable`
+
+`postRender` — это хук сборки, вызываемый после завершения рендеринга SSG. Это позволит вам обрабатывать содержимое телепортов во время SSG.
+
+```ts
+export default {
+ async postRender(context) {
+ // ...
+ }
+}
+```
+
+```ts
+interface SSGContext {
+ content: string
+ teleports?: Record
+ [key: string]: any
+}
+```
+
+### transformHead {#transformhead}
+
+- Тип: `(context: TransformContext) => Awaitable`
+
+`transformHead` — это хук сборки для преобразования заголовка перед генерацией каждой страницы. Это позволит вам добавить в конфигурацию VitePress записи, которые не могут быть добавлены статически. Вам нужно только вернуть дополнительные записи, они будут автоматически объединены с существующими.
+
+::: warning Предупреждение
+Не мутируйте ничего внутри `context`.
+:::
+
+```ts
+export default {
+ async transformHead(context) {
+ // ...
+ }
+}
+```
+
+```ts
+interface TransformContext {
+ page: string // например, index.md (относительно srcDir)
+ assets: string[] // все ресурсы, не относящиеся к js/css, в виде полностью разрешённых публичных URL-адресов
+ siteConfig: SiteConfig
+ siteData: SiteData
+ pageData: PageData
+ title: string
+ description: string
+ head: HeadConfig[]
+ content: string
+}
+```
+
+Обратите внимание, что этот хук вызывается только при статической генерации сайта. Он не вызывается во время разработки. Если вам нужно добавить динамические записи в голову во время разработки, вместо этого вы можете использовать хук [`transformPageData`](#transformpagedata):
+
+```ts
+export default {
+ transformPageData(pageData) {
+ pageData.frontmatter.head ??= []
+ pageData.frontmatter.head.push([
+ 'meta',
+ {
+ name: 'og:title',
+ content:
+ pageData.frontmatter.layout === 'home'
+ ? `VitePress`
+ : `${pageData.title} | VitePress`
+ }
+ ])
+ }
+}
+```
+
+#### Пример: Добавление канонического URL-адреса `` {#example-adding-a-canonical-url-link}
+
+```ts
+export default {
+ transformPageData(pageData) {
+ const canonicalUrl = `https://example.com/${pageData.relativePath}`
+ .replace(/index\.md$/, '')
+ .replace(/\.md$/, '.html')
+
+ pageData.frontmatter.head ??= []
+ pageData.frontmatter.head.push([
+ 'link',
+ { rel: 'canonical', href: canonicalUrl }
+ ])
+ }
+}
+```
+
+### transformHtml {#transformhtml}
+
+- Тип: `(code: string, id: string, context: TransformContext) => Awaitable`
+
+`transformHtml` — это хук сборки для преобразования содержимого каждой страницы перед сохранением на диск.
+
+::: warning Предупреждение
+Не мутируйте ничего внутри `контекста`. Кроме того, изменение html-содержимого может вызвать проблемы с гидратацией во время выполнения.
+:::
+
+```ts
+export default {
+ async transformHtml(code, id, context) {
+ // ...
+ }
+}
+```
+
+### transformPageData {#transformpagedata}
+
+- Тип: `(pageData: PageData, context: TransformPageContext) => Awaitable | { [key: string]: any } | void>`
+
+`transformPageData` — это хук для преобразования `pageData` каждой страницы. Вы можете напрямую изменять `pageData` или возвращать изменённые значения, которые будут объединены с данными страницы.
+
+::: warning Предупреждение
+Не мутируйте ничего внутри `context` и будьте осторожны, это может повлиять на производительность dev-сервера, особенно если у вас есть некоторые сетевые запросы или тяжёлые вычисления (например, генерация изображений) в хуке. Вы можете проверить `process.env.NODE_ENV === 'production'` для условной логики.
+:::
+
+```ts
+export default {
+ async transformPageData(pageData, { siteConfig }) {
+ pageData.contributors = await getPageContributors(pageData.relativePath)
+ }
+
+ // или возвращаем данные для объединения
+ async transformPageData(pageData, { siteConfig }) {
+ return {
+ contributors: await getPageContributors(pageData.relativePath)
+ }
+ }
+}
+```
+
+```ts
+interface TransformPageContext {
+ siteConfig: SiteConfig
+}
+```