Surface
Surface создаёт оформленную полосу вокруг обычного Markdown. Внешняя ширина
может оставаться в потоке (content) или достигать границы активного region
(full); внутренний контент независимо остаётся в .container либо занимает
полную ширину.
Surface выбирают для общей контентной полосы: нескольких абзацев, Grid/Card
композиции или admitted project Smart. Для первого экрана с H1, описанием и
действиями используйте Hero. Hero, Showcase и Promo уже
используют ту же внутреннюю Surface presentation и не требуют внешней
:::surface-обёртки. Такое двойное оборачивание запрещено container contract.
Surface в границе main
Эта полоса достигает краёв только текущего main region: в документации она
не перекрывает sidebar и outline, а внутренний текст остаётся в контейнере.
Один контентный ритм
Текст внутри полной полосы выровнен с соседним контентом страницы.
Безопасный декоративный фон
Фон берётся только из локального /assets/ проекта, скрыт от accessibility tree
и не получает фокус или события указателя. Позиция, overlay, отступ и tone —
ограниченные значения, а не произвольные CSS-классы.
Документация как продукт
Читаемый контент остаётся поверх декоративного слоя.
Контейнерный контракт
Surface принимает обычный Markdown и только зарегистрированные content-embeddable
компоненты. Вложенный Surface, Hero, Promo, Showcase, shell-компоненты,
неизвестные children и небезопасные пути отклоняются до публикации. Допустимые
children, slot content, порядок, количество и глубина публикуются в Design
Atlas из реального registry descriptor. max_depth=3 считается относительно
Surface как уровня 1; вложенный Grid отдельно считает себя уровнем 1, поэтому
каноническая цепочка Surface → Grid → Card допустима без глобального depth.
Проектный Smart тоже проходит тот же Gateway, если его собственный manifest
явно объявляет capability content.embeddable:
Локальный конфигуратор
Выбрано: Стартовый — без дополнительных возможностей
Итог примера: 2 500 ₽
Это демонстрация интерфейса: она не создаёт заказ, не принимает оплату и не отправляет данные.
:::project.product-configurator {“title”:“Локальный конфигуратор”,“base_price”:2500,“team_price”:4500,“business_price”:8000,“currency”:“₽“} :::
Параметры: width=content|full, content_width=container|full,
background_fit=cover|contain|auto, background_x=left|center|right,
background_y=top|center|bottom, overlay=none|light|dark,
overlay_strength=soft|medium|strong, padding=none|sm|md|lg|xl и
tone=default|muted|accent|contrast.
Доступность и адаптивность
fullдостигает только границы разрешённого Layout region: на лендинге — края страницы, в документации — краяmain, не sidebar или outline;- внутренний
containerсохраняет одну линию выравнивания с соседним текстом: приcontent_width=containerпараметрpaddingзадаёт только отступы сверху и снизу, а отступ слева и справа остаётся отступомcontainer, тем же, что у основного текста страницы. Приcontent_width=fullpaddingзадаёт отступы со всех сторон; - декоративное изображение выводится один раз с
alt=""иaria-hidden="true", overlay не получает фокус и не перехватывает указатель; cover,containиautoне создают отдельный мобильный источник или произвольный breakpoint; responsive geometry принадлежит общей presentation;- авторский текст и интерактивные children остаются поверх overlay в обычном DOM-порядке и доступны с клавиатуры.
Fail-closed граница
| Ошибка автора | Результат |
|---|---|
| Surface внутри Surface или вокруг Hero/Showcase/Promo | вложение отклоняется до render |
remote, data:, protocol-relative, traversal, symlink или hardlink media |
локальная asset policy отклоняет путь |
background_x/y/fit без background_image |
MARKDOWN_SURFACE_BACKGROUND_REQUIRED |
overlay_strength без overlay |
MARKDOWN_SURFACE_OVERLAY_REQUIRED |
| неизвестный prop, CSS class, style, callback или template path | schema/admission error |
Глобальной настройки Surface нет: каждое значение выше принадлежит конкретной typed-директиве и публикуется в Atlas из admitted definition.
