Композиция интерфейса
Docara собирает интерфейс как LEGO на трёх уровнях: page Layout задаёт регионы, Section наполняет region разрешёнными slots/blocks, а Smart/View рисует конечный элемент. Это конфигурация из принятых registry descriptors, а не второй шаблонный движок.
Атлас проекта
docara.brandingbindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.navigationbindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.outlinebindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.outline.
content.documentblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
content.iconblockrejectedВладелец: simai/docara; namespace: content; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: add_semantic_icon.
content.markdownblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
content.smartblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
docara.alertblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: report_status.
docara.backlinksblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_pages_linking_here.
docara.badgeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: label_status.
docara.bannerblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_bounded_page_announcement.
docara.buttonblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: link_as_action.
docara.cardblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: content.embeddable.
docara.codeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: include_external_code.
docara.detailsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: disclose_optional_content.
docara.diagramblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_declarative_diagram.
docara.downloadblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: download_file.
docara.embedblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: embed_external_content.
docara.exampleblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_live_example_and_source.
docara.figureblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_illustration_with_caption.
docara.gridblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: container.
Capabilities: content.embeddable.
Container: allowed_children=[docara.card]; slots=[]; min_children=1; max_children=12; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.heroblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: explain_product_value, primary_landing_action.
docara.htmlblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_isolated_trusted_html.
docara.iconblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: add_semantic_icon.
docara.kbdblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: name_keyboard_input.
docara.logosblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_ecosystem_members, show_trust_signals.
docara.mathblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_tex_formula.
docara.mediablocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: pair_content_with_media.
docara.stepsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: content.embeddable.
docara.surfaceblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: container.
Capabilities: present_content_surface.
Container: allowed_children=[]; slots=[content]; min_children=1; max_children=64; order=declared; max_depth=3, depth_semantics=relative_subtree_root_level_1.
docara.tabsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: switch_between_equivalent_views.
docara.treeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_file_structure.
native.codeblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: show_code.
native.code.enhancedblockrejectedВладелец: simai/docara; namespace: native; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: enhance_code.
native.footnotes_and_sourcesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: cite_source_with_footnote.
native.headings_and_textblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: structure_prose.
native.links_and_imagesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: illustrate_content, link_content.
native.lists_and_quotesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: list_items, quote_content.
native.tableblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: compare_small_datasets.
project.footer-smartblockprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: configuration.
shell.elementblocksupportedВладелец: simai/docara; namespace: shell; origin: docara; provider: docara.builtin; authoring: configuration.
shell.smartblocksupportedВладелец: simai/docara; namespace: shell; origin: docara; provider: docara.builtin; authoring: configuration.
ui.badgeblockproposalВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: label_status.
ui.dataviewblockproposalВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: present_structured_data.
ui.tabsblockrejectedВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: switch_content_panels.
docara.docslayoutsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Container: allowed_children=[section]; slots=[header, sidebar, main, outline, footer]; min_children=1; max_children=7; order=layout_regions; max_depth=3, depth_semantics=relative_subtree_root_level_1.
docara.branding:compactpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.branding:defaultpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.branding:logopresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.branding:textpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.navigation:compactpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.navigation:defaultpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.navigation:headerpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.navigation:treepresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.outline:defaultpresetsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.outline.
ui.checkbox:defaultpresetsupportedВладелец: simai/bx-simai.main; namespace: ui; origin: framework; provider: framework.lock; authoring: configuration.
Capabilities: smart.preset.
ui.dropdown:defaultpresetsupportedВладелец: simai/bx-simai.main; namespace: ui; origin: framework; provider: framework.lock; authoring: configuration.
Capabilities: smart.preset.
ui.input:defaultpresetsupportedВладелец: simai/bx-simai.main; namespace: ui; origin: framework; provider: framework.lock; authoring: configuration.
Capabilities: smart.preset.
ui.list-item:defaultpresetsupportedВладелец: simai/bx-simai.main; namespace: ui; origin: framework; provider: framework.lock; authoring: configuration.
Capabilities: smart.preset.
docara.articlesectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: content.document.
Container: allowed_children=[content.document, content.markdown, content.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.headersectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.brand, shell.primary-navigation.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.navigationsectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.secondary-navigation.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.outlinesectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.outline.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.shellsectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.brand, shell.content-after, shell.content-before, shell.footer, shell.outline, shell.primary-navigation, shell.secondary-navigation.
Container: allowed_children=[shell.element, shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
project.footersectionprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: container.
Capabilities: shell.footer.
Container: allowed_children=[project.footer-smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
layout.docara.docsviewsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: configuration.
section.docara.articleviewsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: configuration.
section.docara.headerviewsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: configuration.
section.docara.shellviewsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: configuration.
section.project.footerviewprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: configuration.
Atlas строится командой docara atlas --json только из admitted DesignRegistry, SmartRegistry и BindingRegistry. Его fingerprint входит в build-owned projection; ручного списка компонентов здесь нет.
Композиционная модель
Три уровня
- Layout владеет геометрией страницы и именами regions.
- Section допускается в совместимый region и раскладывает Blocks по slots.
- Block/Smart/View получает проверенные данные и создаёт конечный render artifact через общие registry/Gateway.
Content Markdown компилируется отдельно в typed in-memory Document IR. Длина ::: fence не выбирает уровень архитектуры.
Проверенные настройки и прочитанный Markdown превращаются в общий Recipe. Стандартный сборщик SIMAI Framework создаёт Composition Document — готовое дерево страницы. Docara восстанавливает из него вход своих рендереров и создаёт HTML. Авторские файлы при этом не переписываются.
Реальная insertion chain
| Шаг | Реальный зарегистрированный файл | Ответственность |
|---|---|---|
| Layout | resources/layouts/docara.docs.json |
regions, required flags, container limits |
| Layout View Tree | resources/views/layout.docara.docs.json |
безопасные element/region nodes |
| Region | descriptor-owned header, sidebar, main, outline, footer |
insertion point, не компонент ID branch |
| Section | resources/sections/docara.article.json, docara.header.json, docara.navigation.json, docara.outline.json, docara.shell.json |
compatible regions и allowed blocks |
| Section View | resources/views/section.docara.article.json, section.docara.header.json, section.docara.shell.json |
admitted slots |
| Block | resources/blocks/content.document.json, content.markdown.json, content.smart.json, shell.element.json, shell.smart.json |
payload schema/capability |
| Smart | package, Framework или project artifact | props/views/presets/slots/assets/hydration |
| View | registered view/preset/template | конечный HTML/assets/provenance |
| Surface presentation | src/PortableSite/SurfacePresentation.php |
единая admitted outer geometry для Surface, Hero, Showcase и Promo; semantic content остаётся у компонента |
Markdown owner
-> typed Document IR
-> Layout docara.docs
-> region main
-> Section docara.article
-> slot content
-> Block content.document
-> generated Composition Recipe
-> Framework resolveRecipe
-> Composition Document
-> Docara renderer projection
-> SmartComponentGateway when a Smart leaf is present
-> registered View
-> LayoutComposer
-> PageBuilder result
Кто проверяет совместимость
Atlas публикует для каждого container allowed_children, slots, min_children,
max_children, order, max_depth и machine-readable depth_semantics.
Значение relative_subtree_root_level_1 означает, что каждый container считает
собственный root уровнем 1. Registry отклоняет unknown View Tree
kind/tag/attribute/utility/region/slot до registration. Project config выбирает
только admitted IDs и не содержит class/callback/PHP/template path.
content.documentblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
content.iconblockrejectedВладелец: simai/docara; namespace: content; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: add_semantic_icon.
content.markdownblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
content.smartblocksupportedВладелец: simai/docara; namespace: content; origin: docara; provider: docara.builtin; authoring: configuration.
docara.alertblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: report_status.
docara.backlinksblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_pages_linking_here.
docara.badgeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: label_status.
docara.bannerblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_bounded_page_announcement.
docara.buttonblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: link_as_action.
docara.cardblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: content.embeddable.
docara.codeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: include_external_code.
docara.detailsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: disclose_optional_content.
docara.diagramblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_declarative_diagram.
docara.downloadblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: download_file.
docara.embedblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: embed_external_content.
docara.exampleblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_live_example_and_source.
docara.figureblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_illustration_with_caption.
docara.gridblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: container.
Capabilities: content.embeddable.
Container: allowed_children=[docara.card]; slots=[]; min_children=1; max_children=12; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.heroblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: explain_product_value, primary_landing_action.
docara.htmlblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_isolated_trusted_html.
docara.iconblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: add_semantic_icon.
docara.kbdblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.inline_definition; authoring: inline.
Capabilities: name_keyboard_input.
docara.logosblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_ecosystem_members, show_trust_signals.
docara.mathblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: render_tex_formula.
docara.mediablocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: pair_content_with_media.
docara.stepsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: content.embeddable.
docara.surfaceblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: container.
Capabilities: present_content_surface.
Container: allowed_children=[]; slots=[content]; min_children=1; max_children=64; order=declared; max_depth=3, depth_semantics=relative_subtree_root_level_1.
docara.tabsblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: switch_between_equivalent_views.
docara.treeblocksupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: component.catalog.typed_definition; authoring: block.
Capabilities: show_file_structure.
native.codeblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: show_code.
native.code.enhancedblockrejectedВладелец: simai/docara; namespace: native; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: enhance_code.
native.footnotes_and_sourcesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: cite_source_with_footnote.
native.headings_and_textblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: structure_prose.
native.links_and_imagesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: illustrate_content, link_content.
native.lists_and_quotesblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: list_items, quote_content.
native.tableblocksupportedВладелец: simai/docara; namespace: native; origin: native; provider: component.catalog.portable_markdown_profile; authoring: markdown.
Capabilities: compare_small_datasets.
project.footer-smartblockprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: configuration.
shell.elementblocksupportedВладелец: simai/docara; namespace: shell; origin: docara; provider: docara.builtin; authoring: configuration.
shell.smartblocksupportedВладелец: simai/docara; namespace: shell; origin: docara; provider: docara.builtin; authoring: configuration.
ui.badgeblockproposalВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: label_status.
ui.dataviewblockproposalВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: present_structured_data.
ui.tabsblockrejectedВладелец: simai/docara; namespace: ui; origin: requirement; provider: component.catalog.product_requirement; authoring: block.
Capabilities: switch_content_panels.
docara.docslayoutsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Container: allowed_children=[section]; slots=[header, sidebar, main, outline, footer]; min_children=1; max_children=7; order=layout_regions; max_depth=3, depth_semantics=relative_subtree_root_level_1.
docara.articlesectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: content.document.
Container: allowed_children=[content.document, content.markdown, content.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.headersectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.brand, shell.primary-navigation.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.navigationsectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.secondary-navigation.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.outlinesectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.outline.
Container: allowed_children=[shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
docara.shellsectionsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin; authoring: container.
Capabilities: shell.brand, shell.content-after, shell.content-before, shell.footer, shell.outline, shell.primary-navigation, shell.secondary-navigation.
Container: allowed_children=[shell.element, shell.smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
project.footersectionprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: container.
Capabilities: shell.footer.
Container: allowed_children=[project.footer-smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
Общая presentation не меняет semantic owner
Surface — authored content container. Hero, Showcase и Promo — отдельные typed semantic definitions. Их Atlas ownership, states, props и provenance берутся из реальных admitted definitions, но outer width/container/background frame собирает одна immutable Surface presentation. Оборачивать эти semantic blocks в Surface нельзя; page/head и границы region по-прежнему принадлежат LayoutComposer.
Матрица интерфейса
Один publisher shell обслуживает docs, site и landing presets. Варианты меняют зарегистрированное presentation, а не renderer path.
| Поверхность | Effective owner | Capability / presentation | Можно заменить проектом |
|---|---|---|---|
| Brand | docara.brand / branding binding |
full, compact, logo, text | через admitted branding capability |
| Header navigation | docara.navigation |
header |
да |
| Sidebar tree | docara.navigation |
tree |
да |
| Mobile/compact navigation | docara.navigation |
compact |
да |
| Outline / TOC | docara.toc |
outline binding | да |
| Search | registered search Smart leaf | shell search capability | да |
| Breadcrumbs | registered breadcrumbs Smart leaf | reading context | да |
| Previous/next pager | registered pager Smart leaf | reading context | да |
| Reader preferences | docara.preferences |
side panel | да |
| Footer | registered/project shell Smart | footer capability | да |
Outer document, <head>, canonical, metadata, asset ledger |
PageBuilder/application | application-owned | нет |
Navigation presentations
header, tree и compact — три presentation одного docara.navigation. BindingRegistry выбирает их по capability и provider descriptor; Gateway, renderer, LayoutComposer и PageBuilder остаются теми же.
docara.brandingbindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.brand.
docara.navigationbindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.primary-navigation, shell.secondary-navigation.
docara.outlinebindingsupportedВладелец: simai/docara; namespace: docara; origin: docara; provider: docara.builtin-bindings; authoring: configuration.
Capabilities: shell.outline.
Граница page/head
Project contribution не может заменить canonical URL, locale metadata, build receipt, search/navigation provenance или произвольный <head> fragment. Эти поверхности остаются application-owned, чтобы static verification и full/single parity были проверяемыми.
Вклад проекта в оболочку
Project-owned shell contribution — это data-only artifact в разрешённом design//smart/ root и ссылка на admitted binding ID. Он не требует изменения engine src/.
Порядок подключения
- Выберите собственный namespace в
docara.json. - Создайте artifact через hash-bound scaffold dry-run/apply.
- Проверьте manifest/schema/namespace/capabilities.
- Убедитесь через
docara atlas --json, что owner=projectи support=project. - Выполните isolated preview на реальной странице.
- Только затем соберите full output.
project.footer-smartblockprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: configuration.
project.footersectionprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: container.
Capabilities: shell.footer.
Container: allowed_children=[project.footer-smart]; slots=[content]; min_children=0; max_children=64; order=declared; max_depth=2, depth_semantics=relative_subtree_root_level_1.
project.footer-linkssmartprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: block.
Capabilities: smart.render.
project.install-buildersmartprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: container.
Capabilities: smart.children, smart.hydration, smart.render.
Container: allowed_children=[ui.checkbox, ui.dropdown, ui.input]; slots=[controls]; min_children=1; max_children=64; order=declared; max_depth=8, depth_semantics=relative_subtree_root_level_1.
project.product-configuratorsmartprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: container.
Capabilities: content.embeddable, smart.children, smart.hydration, smart.render.
Container: allowed_children=[ui.checkbox, ui.dropdown]; slots=[controls]; min_children=1; max_children=64; order=declared; max_depth=8, depth_semantics=relative_subtree_root_level_1.
section.project.footerviewprojectВладелец: project/project; namespace: project; origin: project; provider: project.project; authoring: configuration.
Fail-closed границы
- project ID не затеняет package/Framework ID;
- binding-owned props нельзя переопределить config-ом;
- capability/region/slot collision отклоняется;
- traversal, symlink, hardlink, case collision и arbitrary path отклоняются;
- shell contribution не меняет outer page/head.
Пример footer из принятого Goal B показывает shell-role, а install builder и product configurator — content-role. Все три проходят существующие registries и Gateway.
Просмотр по пути сборки
Preview не имеет собственного renderer. PreviewKernel вызывает те же parser/compiler, DesignRegistry, SmartComponentGateway, renderer, asset collector, LayoutComposer и PageBuilder; output помечен preview-purpose и production verifier его не принимает.
Полная композиция
Docs preset
Landing preset
Команда docara preview smart|region|layout|page публикует isolated tree в .docara-preview/output/<target>/. verify-static обязан вернуть PREVIEW_BUILD_PURPOSE_FORBIDDEN; для production нужен обычный full build.
Свои макеты и блоки проекта
Проект может добавить свой Layout, Section, Block и безопасный View Tree в
каталог design/. Менять движок для этого не нужно.
Цепочка проекта
Layout → Region → Section → Slot → Block → Smart или безопасный element
Все определения читает один DesignRegistry. Встроенные ID принадлежат
пакету, project ID — namespace из docara.json:
{"smart":{"namespace":"project"}}
Project artifact должен начинаться с project.. Он не может заменить
docara.*, content.*, shell.* или ui.*. Дубликаты, symlink, выход из
корня и неизвестные определения останавливают сборку.
Команда docara atlas --json показывает effective Layout, View, Section,
Block, Smart, binding и preset из принятых registries. Atlas — только
детерминированная проекция: редактировать его как источник регистрации нельзя.
Для контейнеров он также показывает допустимые children, slots, порядок,
количество и максимальную глубину.
Привязки данных оболочки
Блок shell.smart может выбрать только зарегистрированную привязку bind.
Привязка соединяет данные страницы с уже зарегистрированным Smart-компонентом;
она не является PHP callback или путём к шаблону. Встроенный реестр содержит:
| ID | Возможности | Smart |
|---|---|---|
docara.branding |
shell.brand |
docara.brand |
docara.navigation |
shell.primary-navigation, shell.secondary-navigation |
docara.navigation |
docara.outline |
shell.outline |
docara.toc |
Проверьте effective descriptor и его происхождение командами:
docara list binding
docara inspect binding docara.navigation
docara schema binding
Layout region и Section объявляют совместимые capabilities. Сборка до render отклонит неизвестную привязку, несовместимую capability, попытку передать binding-owned props или подменить package ID. Project JSON не может задавать class, callback, PHP/template path или произвольный filesystem path.
Один docara.navigation поддерживает presentations header, tree и
compact. Вызов остаётся тем же shell.smart, Gateway и PageBuilder; меняется
только зарегистрированный view. Если view явно не указан, сохраняется
совместимое поведение по умолчанию.
Starter содержит небольшой footer-пример: project Section и Block допускают
только зарегистрированный project.footer-links в region footer. Ни config,
ни Markdown не выбирают PHP/template path; component, View и assets разрешает
обычный project Smart provider.
Файлы
design/
├── layouts/project.docs.json
├── sections/project.article.json
├── blocks/project.document.json
└── views/
├── layout.project.docs.json
└── section.project.article.json
Layout задаёт безопасный View Tree, regions, их defaults и место документа:
{
"schema": "docara.layout.v1",
"key": "project.docs",
"default": false,
"view": "layout.project.docs",
"configuration": {
"container": {"max": 7},
"scrollbar": {"preset": "overlay"},
"content": {"gap": 0}
},
"document": {
"region": "stage",
"section": "project.article",
"slot": "content",
"block": "project.document"
},
"regions": {
"stage": {
"required": true,
"default_enabled": true,
"default_sections": [],
"section_types": ["content"]
}
},
"assets": []
}
Section объявляет совместимые regions, slots и blocks. Block выбирает один из уже зарегистрированных безопасных renderer kinds. JSON не принимает PHP, template path, callback, произвольный HTML или CSS.
Чтобы выбрать project layout, сбросьте унаследованную ветку:
{
"layout": {
"$reset": true,
"key": "project.docs"
}
}
Предпросмотр
Preview использует обычный PortableSiteBuilder, PageBuilder, registries,
Smart gateway, renderer и layout composer. Результат изолирован в
.docara-preview/ и не считается production build receipt. Cache receipt
имеет build.purpose=preview, поэтому verify-static завершится ошибкой
PREVIEW_BUILD_PURPOSE_FORBIDDEN. Это защита самого receipt, а не соседний
служебный marker.
docara preview page --page=/ru/components/alert/
docara preview layout --page=/ru/components/alert/
docara preview region --page=/ru/components/alert/ --selector=main
docara preview smart --page=/ru/components/alert/ --selector=ui.alert
Для автоматизации добавьте --json. Команда watch следит за effective input
chain выбранного route, locale UI-copy и реально разрешёнными layout, section,
block, Smart, template и asset dependencies из package/project providers:
docara preview region --page=/ru/components/alert/ --selector=main --watch
artifact.html содержит точный выбранный fragment, index.html — ту же
production page для проверки в браузере, preview.json — assets, provenance,
dependencies и hashes. В том же preview-root публикуются нужные local CSS, JS,
Framework и content assets, поэтому открывайте index.html через HTTP именно
из .docara-preview/output/<target>/. Production receipt и прочие HTML routes
туда не копируются. Normal build_* preview не перезаписывает.
Изменение нерелевантного project Smart не пересобирает выбранный target.
Изменение, появление или удаление файла внутри реально выбранного project или
package artifact вызывает одну single-page пересборку. target_only=true
выводится из scope и результата пересборки, а не задаётся константой.
Проверка
php vendor/bin/phpunit --filter 'DesignRegistryTest|ProjectDesignCompositionTest|PreviewKernelTest'
cd docs/site
php ../../docara build production
php ../../docara verify-static build_production
Не добавляйте ID проекта в engine PHP или schema enum. Если нужен новый исполняемый renderer/API, это отдельное расширение платформы, а не project JSON.
См. также
- Области макета — настройка областей автором сайта
- Примеры для разработчиков