Files
nextjs-style-guide/.vitepress/config.ts

190 lines
9.3 KiB
TypeScript
Raw Normal View History

2026-01-29 16:00:19 +03:00
import { defineConfig } from 'vitepress';
const sidebar = [
feat: llms-full.txt, README архива и доработка лендинга - добавлен генератор llms-full.txt: вся документация локали в одном файле с мета-якорями, порядок повторяет sidebar - архив теперь содержит README.md как точку входа: карта документации с относительными ссылками, описаниями и метаинфо сборки - ссылки /ru/... в .md-файлах архива преобразуются в относительные пути (через path.relative) — внутренняя навигация работает локально - веб-index.md удаляется из архива (его роль выполняет README.md) - llms-full.txt добавлен в архив для одноразового чтения LLM - в sidebar добавлен пункт «Главная» / «Home» со ссылкой на корень локали - карточка «Ассистенту» на лендинге: две кнопки llms.txt и llms-full.txt с открытием в новой вкладке - активирована карточка «Скачать правила» (ru) с ссылкой на zip-архив - удалён устаревший блок «Для ассистентов» из docs/{ru,en}/index.md - обновлены описания на главных локалей и заменён FSD на SLM в EN - в манифесте появилось поле llmsFull рядом с llms
2026-04-25 19:56:44 +03:00
{
text: 'Главная',
link: '/docs/',
feat: llms-full.txt, README архива и доработка лендинга - добавлен генератор llms-full.txt: вся документация локали в одном файле с мета-якорями, порядок повторяет sidebar - архив теперь содержит README.md как точку входа: карта документации с относительными ссылками, описаниями и метаинфо сборки - ссылки /ru/... в .md-файлах архива преобразуются в относительные пути (через path.relative) — внутренняя навигация работает локально - веб-index.md удаляется из архива (его роль выполняет README.md) - llms-full.txt добавлен в архив для одноразового чтения LLM - в sidebar добавлен пункт «Главная» / «Home» со ссылкой на корень локали - карточка «Ассистенту» на лендинге: две кнопки llms.txt и llms-full.txt с открытием в новой вкладке - активирована карточка «Скачать правила» (ru) с ссылкой на zip-архив - удалён устаревший блок «Для ассистентов» из docs/{ru,en}/index.md - обновлены описания на главных локалей и заменён FSD на SLM в EN - в манифесте появилось поле llmsFull рядом с llms
2026-04-25 19:56:44 +03:00
},
2026-03-28 21:15:15 +03:00
{
2026-04-28 10:52:09 +03:00
text: 'Подсказки',
link: '/docs/workflow',
2026-03-28 21:15:15 +03:00
},
{
text: 'Базовые правила',
items: [
{ text: 'Технологии и библиотеки', link: '/docs/basics/tech-stack' },
{ text: 'Именование', link: '/docs/basics/naming' },
{
text: 'Архитектура',
collapsed: true,
items: [
{ text: 'Обзор', link: '/docs/basics/architecture/' },
docs: переработать архитектуру и прикладные разделы компонента и модуля - обновлена каноническая спецификация SLM Design из slm-design.gromlab.ru - файлы архитектуры перенесены из reference/ в basics/architecture/ - добавлена предупреждающая плашка о локальной копии архитектуры - infrastructure/ переименован в infra/ по канону спецификации - прикладной раздел «Компонент» переписан: определение заменено ссылкой на архитектуру, добавлен пример UserStatus с типами, стилями и JSDoc - прикладной раздел «Модуль» переписан: показаны три типа модулей (UI, бизнес, инфраструктурный), добавлен пример фабрики бизнес-модуля - добавлен запрет ручного создания компонентов: только через кодогенератор - обновлён раздел типизации: возвращаемый тип React-компонентов не указывается - обновлён шаблон компонента в templates-create: суффикс -props.type.ts - обновлены ссылки в page-level, project-structure, aliases - сгенерированы llms.txt, llms-full.txt, README и публичные копии
2026-05-03 04:22:26 +03:00
{ text: 'Слои', link: '/docs/basics/architecture/layers' },
{ text: 'Модули', link: '/docs/basics/architecture/modules' },
{ text: 'Сегменты', link: '/docs/basics/architecture/segments' },
],
},
{ text: 'Стиль кода', link: '/docs/basics/code-style' },
{ text: 'Документирование', link: '/docs/basics/documentation' },
{ text: 'Типизация', link: '/docs/basics/typing' },
2026-03-28 21:15:15 +03:00
],
},
{
2026-04-28 10:52:09 +03:00
text: 'Создание проекта',
items: [
{ text: 'Из шаблона', link: '/docs/creating-project/from-template' },
{ text: 'По гайду вручную', link: '/docs/creating-project/manual' },
{ text: 'Чистый Next.js', link: '/docs/creating-project/nextjs' },
],
},
{
text: 'Работа с данными',
// collapsed: true,
2026-03-28 21:15:15 +03:00
items: [
{ text: 'Введение', link: '/docs/data/' },
2026-04-28 10:52:09 +03:00
{
text: 'REST',
collapsed: true,
items: [
2026-04-30 16:01:18 +03:00
{ text: 'Обзор', link: '/docs/data/rest/' },
2026-04-28 10:52:09 +03:00
{
2026-04-30 16:01:18 +03:00
text: 'Создание клиента',
2026-04-28 10:52:09 +03:00
collapsed: true,
items: [
2026-04-30 16:01:18 +03:00
{ text: 'Обзор', link: '/docs/data/rest/clients/' },
{ text: 'Автогенерация из OpenAPI', link: '/docs/data/rest/clients/auto' },
{ text: 'Ручное создание', link: '/docs/data/rest/clients/manual' },
2026-04-30 16:01:18 +03:00
{ text: 'GET-хуки REST-клиента', link: '/docs/data/rest/clients/hooks' },
2026-04-28 10:52:09 +03:00
],
},
{
text: 'Использование',
2026-04-28 10:52:09 +03:00
collapsed: true,
items: [
2026-04-30 16:01:18 +03:00
{ text: 'Стратегии получения данных', link: '/docs/data/rest/strategies/' },
{ text: 'Серверный await', link: '/docs/data/rest/strategies/server-await' },
{ text: 'Параллельные серверные запросы', link: '/docs/data/rest/strategies/parallel-server-requests' },
{ text: 'Передача промиса ниже', link: '/docs/data/rest/strategies/pass-promise-down' },
{ text: 'Начальные данные для клиентских хуков', link: '/docs/data/rest/strategies/client-hooks-initial-data' },
{ text: 'Клиентский GET-хук', link: '/docs/data/rest/strategies/client-get-hook' },
{ text: 'Business-композиция', link: '/docs/data/rest/strategies/business-composition' },
2026-04-28 10:52:09 +03:00
],
},
],
},
{ text: 'Realtime', link: '/docs/data/realtime' },
],
},
{
text: 'Прикладные разделы',
items: [
{ text: 'Структура проекта', link: '/docs/applied/project-structure' },
{ text: 'Страницы', link: '/docs/applied/page-level' },
{ text: 'Компонент', link: '/docs/applied/component' },
{ text: 'Модуль', link: '/docs/applied/module' },
{
text: 'Стили',
collapsed: true,
items: [
{ text: 'Настройка', link: '/docs/applied/styles/styles-setup' },
{ text: 'Использование', link: '/docs/applied/styles/styles-usage' },
],
},
{
text: 'SVG-спрайты',
collapsed: true,
items: [
{ text: 'Введение', link: '/docs/applied/svg-sprites/svg-sprites-intro' },
{ text: 'Настройка', link: '/docs/applied/svg-sprites/svg-sprites-setup' },
{ text: 'Использование', link: '/docs/applied/svg-sprites/svg-sprites-usage' },
],
},
{ text: 'Изображения', link: '/docs/applied/images' },
{ text: 'Шрифты', link: '/docs/applied/fonts' },
{ text: 'Алиасы импортов', link: '/docs/applied/aliases' },
{
text: 'Шаблоны генерации',
collapsed: true,
items: [
{ text: 'Введение', link: '/docs/applied/templates/templates-intro' },
{ text: 'Настройка', link: '/docs/applied/templates/templates-setup' },
{ text: 'Создание шаблонов', link: '/docs/applied/templates/templates-create' },
{ text: 'Использование', link: '/docs/applied/templates/templates-usage' },
],
},
{ text: 'Biome', link: '/docs/applied/biome' },
{ text: 'PostCSS', link: '/docs/applied/postcss' },
{ text: 'VS Code', link: '/docs/applied/vscode' },
{ text: 'Локализация', link: '/docs/applied/localization' },
// Неактивные разделы: страницы существуют, но пока пустые.
// Оставляем в sidebar без `link`, чтобы видеть план, но без перехода.
{ text: 'Stores · в разработке' }
2026-04-28 10:52:09 +03:00
],
},
2026-03-28 21:15:15 +03:00
];
feat: генерация llms.txt, лендинг с выбором языка и ZIP-архивов - удалён concat-md.js: вместо единого RULES.md теперь llms.txt - добавлен generate-llms.ts: собирает llms.txt из sidebar config, копирует .md-файлы для отдачи LLM и упаковывает ZIP-архивы по локалям - добавлен корневой /llms.txt как роутер на /ru/llms.txt и /en/llms.txt - добавлен манифест /manifest.json со ссылками и версией сборки - добавлен лендинг docs/index.md (layout: false) с автоопределением языка, переключателями языка и темы - английская локаль временно заблокирована: карточки как заглушки, ссылка на /en/ в роутере без href - добавлены поля llmsBlockquote и llmsContext в локали для технодокументационного описания в llms.txt - разделены VitePress-локали: root (только лендинг), ru (/ru/), en (/en/) - добавлен srcExclude: ['public/**'] чтобы VitePress не рендерил сгенерированные .md как страницы - добавлен Vite-плагин для отдачи .txt и .md с charset=utf-8 - добавлена секция в Caddyfile для текстовых файлов - BUILD_VERSION пробрасывается из Gitea CI через docker --build-arg и подставляется в лендинг через Vite define - Dockerfile: установка zip, npm run llms перед npm run build - обновлены внутренние ссылки в docs/ru/**/*.md на префикс /ru/ - обновлены AGENTS.md и CONTRIBUTING.md под новый процесс - README/README_RU генерируются из docs/{lang}/index.md, остаются в репо
2026-04-25 18:06:27 +03:00
/**
* Vite-плагин: отдаёт `.txt` и `.md` с явной кодировкой UTF-8.
* Без этого браузер декодирует как ISO-8859-1 и кириллица ломается.
*/
const utf8TextPlugin = {
name: 'utf8-text-files',
configureServer(server: any) {
server.middlewares.use((req: any, res: any, next: any) => {
const url: string = req.url || '';
if (url.endsWith('.txt') || url.endsWith('.md')) {
res.setHeader('Content-Type', 'text/plain; charset=utf-8');
}
next();
});
},
};
2026-03-28 21:15:15 +03:00
export default defineConfig({
srcDir: 'docs',
feat: генерация llms.txt, лендинг с выбором языка и ZIP-архивов - удалён concat-md.js: вместо единого RULES.md теперь llms.txt - добавлен generate-llms.ts: собирает llms.txt из sidebar config, копирует .md-файлы для отдачи LLM и упаковывает ZIP-архивы по локалям - добавлен корневой /llms.txt как роутер на /ru/llms.txt и /en/llms.txt - добавлен манифест /manifest.json со ссылками и версией сборки - добавлен лендинг docs/index.md (layout: false) с автоопределением языка, переключателями языка и темы - английская локаль временно заблокирована: карточки как заглушки, ссылка на /en/ в роутере без href - добавлены поля llmsBlockquote и llmsContext в локали для технодокументационного описания в llms.txt - разделены VitePress-локали: root (только лендинг), ru (/ru/), en (/en/) - добавлен srcExclude: ['public/**'] чтобы VitePress не рендерил сгенерированные .md как страницы - добавлен Vite-плагин для отдачи .txt и .md с charset=utf-8 - добавлена секция в Caddyfile для текстовых файлов - BUILD_VERSION пробрасывается из Gitea CI через docker --build-arg и подставляется в лендинг через Vite define - Dockerfile: установка zip, npm run llms перед npm run build - обновлены внутренние ссылки в docs/ru/**/*.md на префикс /ru/ - обновлены AGENTS.md и CONTRIBUTING.md под новый процесс - README/README_RU генерируются из docs/{lang}/index.md, остаются в репо
2026-04-25 18:06:27 +03:00
// `docs/public/` содержит сгенерированные `.md`-копии и `llms.txt` для LLM
// (попадают в корень `dist/` как статика). Исключаем из сканирования
// страниц, иначе VitePress рендерит их как HTML-страницы.
//
// `DEVELOP.md` и `MAP.md` — файлы архива (точка входа и карта).
// Содержат относительные ссылки, на сайте им делать нечего —
// эту роль выполняют сайдбар и `llms.txt`.
srcExclude: ['public/**', '**/DEVELOP.md', '**/MAP.md'],
lang: 'ru-RU',
2026-03-28 21:15:15 +03:00
title: 'NextJS Style Guide',
description: 'Стандарты разработки на Next.js + TypeScript с архитектурой SLM',
2026-03-28 21:15:15 +03:00
// Чистые URL без `.html` — канон для индексации.
// Серверная поддержка реализована в Caddyfile (try_files + редирект).
cleanUrls: true,
// Дублируем указатель на llms.txt в <head> — для агентов,
// которые читают HTML, но не парсят полный DOM/href.
head: [
['link', { rel: 'alternate', type: 'text/plain', href: '/llms.txt', title: 'llms.txt' }],
['link', { rel: 'alternate', type: 'text/plain', href: '/llms-full.txt', title: 'llms-full.txt' }],
],
feat: генерация llms.txt, лендинг с выбором языка и ZIP-архивов - удалён concat-md.js: вместо единого RULES.md теперь llms.txt - добавлен generate-llms.ts: собирает llms.txt из sidebar config, копирует .md-файлы для отдачи LLM и упаковывает ZIP-архивы по локалям - добавлен корневой /llms.txt как роутер на /ru/llms.txt и /en/llms.txt - добавлен манифест /manifest.json со ссылками и версией сборки - добавлен лендинг docs/index.md (layout: false) с автоопределением языка, переключателями языка и темы - английская локаль временно заблокирована: карточки как заглушки, ссылка на /en/ в роутере без href - добавлены поля llmsBlockquote и llmsContext в локали для технодокументационного описания в llms.txt - разделены VitePress-локали: root (только лендинг), ru (/ru/), en (/en/) - добавлен srcExclude: ['public/**'] чтобы VitePress не рендерил сгенерированные .md как страницы - добавлен Vite-плагин для отдачи .txt и .md с charset=utf-8 - добавлена секция в Caddyfile для текстовых файлов - BUILD_VERSION пробрасывается из Gitea CI через docker --build-arg и подставляется в лендинг через Vite define - Dockerfile: установка zip, npm run llms перед npm run build - обновлены внутренние ссылки в docs/ru/**/*.md на префикс /ru/ - обновлены AGENTS.md и CONTRIBUTING.md под новый процесс - README/README_RU генерируются из docs/{lang}/index.md, остаются в репо
2026-04-25 18:06:27 +03:00
vite: {
plugins: [utf8TextPlugin],
define: {
__BUILD_VERSION__: JSON.stringify(process.env.BUILD_VERSION || 'dev'),
},
2026-03-28 21:15:15 +03:00
},
themeConfig: {
sidebar,
socialLinks: [
{ icon: 'github', link: 'https://gromlab.ru/docs/nextjs-style-guide' },
],
2026-01-29 16:00:19 +03:00
},
// Расширенный блок описания для llms.txt — даёт LLM полный
// технический контекст: стек, методология, охват тем.
// Используется в generate-llms.ts.
llmsBlockquote:
'Стандарты разработки frontend-приложений на Next.js (App Router) + TypeScript + React с архитектурой SLM (Scoped Layered Module Design — модульная архитектура со слоями ответственности, где каждый модуль содержит всё необходимое: компоненты, хуки, сторы, типы, стили).',
llmsContext:
'Стек: React, TypeScript, Next.js App Router, Mantine UI, SWR, Zustand, i18next, PostCSS Modules, Vitest, clsx.\n\nДокументация покрывает архитектуру SLM (слои, модули, сегменты, направление зависимостей, публичный API), правила оформления кода (именование, форматирование, импорты, типизация, JSDoc), реализацию компонентов и хуков, работу с App Router, кодогенерацию из шаблонов, стилизацию (Mobile First, токены), работу с API и сокетами, управление состоянием через Zustand, локализацию, ассеты (шрифты, изображения, SVG-спрайты) и настройку VS Code.',
} as any);