Конфигурация
Docara читает три вида JSON:
| Уровень | Файл | Область |
|---|---|---|
| Сайт | docara.json |
Все страницы |
| Раздел | section.json |
Каталог и все потомки |
| Страница | <page>.page.json |
Одна Markdown-страница |
Каждый файл содержит поле schema. Неизвестное поле, неправильный тип, пустая
presentation-ветка и невалидный путь останавливают сборку.
Встроенные значения и starter — не одно и то же
Resolver начинает с небольшого встроенного набора:
| Поле | Встроенное значение |
|---|---|
content_root |
"content" |
layout.key |
"docara.docs" |
layout.container.max |
7 |
layout.content.gap |
0 |
layout.scrollbar.preset |
"overlay" |
layout.regions.header.enabled |
true |
layout.regions.sidebar.enabled |
true |
layout.regions.main.enabled |
true |
layout.regions.outline.enabled |
true |
layout.regions.footer.enabled |
false |
search.enabled |
false |
search.indexed |
true |
reading.breadcrumbs |
true |
reading.toc |
true |
reading.mobile_toc |
"auto" |
reading.toc_depth |
3 |
reading.previous_next |
true |
examples.fullscreen |
true |
examples.wrap |
true |
code.wrap |
true |
Поставляемый starter затем задаёт свои project-owned значения в
docara.json: preset docs, русский locale, корневой base_url, бренд,
контейнер 7, системную тему, версию документации, файл redirects и включённый
интерфейс поиска. Там же starter включает боковую панель читательских настроек
с полем темы. Это не скрытые defaults — их можно увидеть и изменить в файле
проекта.
Пример docara.json
{
"schema": "docara.site.v1",
"title": "Мой проект",
"preset": "docs",
"content_root": "content/ru",
"framework_lock": "simai-framework.lock.json",
"default_locale": "ru",
"locales": {
"missing_page_policy": "skip",
"ru": {
"label": "Русский",
"direction": "ltr",
"content_root": "content/ru",
"public_prefix": "ru",
"fallbacks": []
}
},
"locale_routing": {
"strategy": "prefixed",
"root": "redirect",
"detect_browser_language": false,
"legacy_unprefixed_redirects": true
},
"documentation_version": "current",
"redirects_file": "redirects.json",
"base_url": "/",
"branding": {
"title": "Мой проект",
"mode": "compact",
"size": "medium",
"logo": "assets/logo.svg",
"favicon": "assets/favicon.ico"
},
"layout": {
"key": "docara.docs",
"container": { "max": 7 },
"content": { "gap": 0 },
"scrollbar": { "preset": "overlay" }
},
"settings": {
"theme": "system",
"modal_blur": "none",
"ui_radius": "default"
},
"examples": {
"fullscreen": true,
"wrap": true
},
"code": {
"wrap": true
},
"reader_preferences": {
"enabled": true,
"view": "side-panel",
"groups": [
{
"id": "appearance",
"fields": ["appearance.theme", "appearance.font_size", "appearance.content_width"]
}
]
},
"search": { "enabled": true, "indexed": true },
"reading": {
"breadcrumbs": true,
"toc": true,
"mobile_toc": "auto",
"toc_depth": 3,
"previous_next": true
}
}
framework_lock, совместимый content_root и реестр locales разрешены только
на уровне сайта.
base_url задавайте до production-сборки: например, "/" для корня домена или
"/docs/" для публикации в подкаталоге.
Что можно задавать на каждом уровне
| Поле | Site | Section | Page |
|---|---|---|---|
preset, title, locale |
✓ | ✓ | ✓ |
branding, layout, settings, examples, code |
✓ | ✓ | ✓ |
navigation, search, reading |
✓ | ✓ | ✓ |
reader_preferences |
✓ | — | — |
framework_lock, content_root, base_url, default_locale |
✓ | — | — |
documentation_version, redirects_file, page_transforms |
✓ | — | — |
description, slug |
— | — | ✓ |
schema обязателен на каждом уровне. version необязателен и, если указан,
равен 1. Это версия JSON schema, а не версия документации.
default_locale выбирает язык, на который ведёт корень, но одна сборка может содержать любое
число локалей из locales. Для каждой задаются отдельное Markdown-дерево,
URL-префикс, направление ltr/rtl и явные fallback для UI-подписей. Подробный
контракт описан в разделе Языки и локали.
locales.missing_page_policy имеет два значения: skip публикует только
фактически существующие Markdown-owner, error требует одинаковый route set у
всех локалей и останавливает сборку с LOCALE_PAGE_MISSING. Ни один режим не
копирует редакторский текст из другой локали.
locale_routing задаётся только на уровне сайта. Новый starter использует
симметричную стратегию prefixed; прежняя стратегия
default_unprefixed поддерживается для существующих сайтов.
Перенаправления
redirects_file указывает на JSON относительно корня проекта:
{
"schema": "docara.redirects.v1",
"version": 1,
"redirects": [
{
"from": "old/installation",
"to": "start"
}
]
}
Маршруты записываются без начального и конечного /; base_url добавляет
builder. to обязан быть существующей сгенерированной страницей. External
URL, query, fragment, self redirect, chain, cycle, collision со страницей или
ассетом и небезопасный путь отклоняются до очистки старого output.
Обработка готовых страниц
page_transforms — команды, которые получают готовый сайт до того, как
Docara его измеряет: например, раскрашивают код во время сборки. Каждая
команда запускается в корне проекта, последним аргументом получает папку
сайта и меняет страницы на месте:
{
"page_transforms": [
{"command": ["node", "scripts/highlight-code.mjs"]}
]
}
Команды выполняются по порядку, после записи страниц и до отчёта о
производительности и квитанции сборки, поэтому verify-static проверяет
страницы такими, какими их опубликовали. Ненулевой код выхода останавливает
сборку с PORTABLE_PAGE_TRANSFORM_FAILED. Страница, изменённая после сборки
вручную, по-прежнему не проходит проверку.
Presentation-ветки
branding:title, необязательныйlabel,mode,size, обычный/тёмный logo и favicon;layout.key: зарегистрированный макетdocara.docs;layout.container.max: целое число1..8, соответствующееmax-container-1..8SIMAI Framework;layout.content.gap: расстояние между соседними блоками статьи по шкалеgap-0..gap-8SIMAI Framework. Для обычной документации используйте0: статья остаётся в обычном блочном потоке, поэтому вертикальные отступы соседних заголовков, абзацев, списков и других элементов схлопываются по стандартным правилам CSS и сохраняют собственный ритм. Значения1..8нужны только для страниц, где блоки намеренно собираются в свободный вертикальный стек, например в лендинге;layout.scrollbar.preset: внешний вид полос прокрутки в левом меню и содержании страницы —overlay,persistent,standardилиhidden;layout.regions: включение и состав областей макета;settings.theme:system,light,dark;settings.modal_blur:none,small,medium,large; по умолчанию размытие выключено (none), остаётся штатное затемнение подложки. Это настройка автора: в панели читателя её нет;settings.ui_radius:default,medium,large; безопасно выбирает общий токен Framework--sf-radius--ui, без произвольного CSS. Это тоже настройка только автора;examples.fullscreen: включать режим проверки адаптивности для изолированных примеров; имя поля сохранено для совместимости;examples.wrap: показывать CSS-перенос длинных строк на вкладках исходников;code.wrap: показывать такое же действие в самостоятельных блоках кода;reader_preferences: включение и состав зарегистрированных настроек читателя; ветка разрешена только вdocara.json;navigation.hidden: убрать страницу из меню;navigation.order: неотрицательный порядок среди siblings;search.enabled: показать локальный search UI;search.indexed: включить страницу в индекс;reading: breadcrumbs, outline depth и previous/next.
Brand assets задаются безопасными путями от корня проекта. Допустимы SVG, PNG, JPG, WebP и ICO до 2 МиБ. Symlink, reserved/build path и тёмный logo без основного logo отклоняются.
navigation.hidden и search.indexed: false не закрывают доступ к HTML.
Секретное содержание нельзя помещать в source или output.
Раздел
{
"schema": "docara.section.v1",
"title": "Руководства",
"branding": { "label": "Руководство пользователя" },
"layout": { "container": { "max": 6 } },
"search": { "indexed": true },
"reading": { "toc_depth": 4 }
}
Страница
{
"schema": "docara.page.v1",
"title": "Установка",
"description": "Как установить проект.",
"slug": "guides/install",
"navigation": { "order": 20 },
"reading": { "previous_next": false }
}
Отсутствие, пустой объект и reset
- отсутствующее поле продолжает наследоваться;
{}и[]недопустимы для presentation-ветки;{"$reset": true}очищает всю унаследованную ветку;- reset с соседними полями сначала очищает ветку, затем задаёт новые значения.
Для layout структурные key и regions после reset восстанавливаются из
зарегистрированного layout contract. layout.container после reset принимает
встроенное значение {"max": 7}, если рядом не задано новое.
Полосы прокрутки
Docara не рисует собственные полосы прокрутки. Левое дерево документации и
правое содержание страницы используют компонент sf-scrollbar из
зафиксированной пары SIMAI Framework.
{
"layout": {
"scrollbar": {
"preset": "overlay"
}
}
}
Доступны четыре режима:
| Preset | Поведение |
|---|---|
overlay |
По умолчанию. Тонкая полоса появляется при прокрутке, расширяется при наведении и скрывается после паузы |
persistent |
Та же компактная полоса остаётся видимой постоянно |
standard |
Используется стандартная полоса браузера и операционной системы |
hidden |
Полоса скрыта визуально, но содержимое по-прежнему прокручивается |
Если ветка layout.scrollbar отсутствует, используется overlay. Настройку
можно унаследовать на уровне раздела или заменить для отдельной страницы.
Цвет, ширина, hover, drag, таймер скрытия, клавиатурная прокрутка и
направление ltr/rtl принадлежат Framework и не переопределяются CSS-кодом
проекта.
Подробные примеры: наследование настроек.
Как узнать, откуда пришло значение
После сборки откройте:
build_<environment>.docara/resolved-page-plans.json
Найдите страницу по output или url, затем:
- посмотрите итог в
resolved_page_plan.configuration; - возьмите JSON Pointer поля, например
/layout/container/max; - найдите тот же pointer в
provenance; - проверьте указанный source в
traceи его SHA-256.
@defaults означает встроенное значение. docara.json, section.json или
page sidecar показывают точный владеющий файл.
Полный перечень и ограничения: справочник schemas. Практический контракт областей: области макета. Пользовательская панель: настройки чтения.