# Модуль: Компоненты **Ответственность**: содержит проверенные переиспользуемые визуальные примитивы, которые не принадлежат одному профилю документа. **Расположение**: `.template/lib/presentation/components.typ` ## Публичный интерфейс | Символ | Тип | Описание | |--------|-----|----------| | `corp-table()` | функция | Корпоративная таблица со сложной шапкой, spans и продолжениями | | `formula()` | функция | Блочная формула, совместимая с профильной нумерацией | | `info-block()` | функция | Цветная информационная плашка для замечаний и пояснений | | `signature-block()` | функция | Один подписант с media policy | | `multi-party-signing()` | функция | Подписание несколькими сторонами | | `approval-block()` | функция | Блок утверждения отчёта | | `company-footer()` | функция | Контакты и реквизиты организации в footer | | `letter-header()` | функция | Общая геометрия исходящего письма и ТКП | | `attachment-list()` | функция | Перечень приложений к письму или ТКП | | `requisites-table()` | функция | Реквизиты одной или нескольких сторон | ## Зависимости | Модуль | Что использует | |--------|----------------| | `.template/lib/domain/company.typ` | Нормализованные реквизиты и brand | | `.template/lib/domain/parties.typ` | Signer, Approval и Party | | `.template/lib/domain/attachments.typ` | AttachmentSet для перечней | | `.template/lib/presentation/foundation.typ` | Design tokens и `render-media-slot()` | | `.template/lib/shared/numbering.typ` | Общие numbering functions | ## Инварианты - Компонент не читает JSON и не конструирует пользовательский path. - Компонент не определяет global page settings. - `corp-table` сохраняет поддержку auto/multirow headers, rowspan/colspan, repeat header и continuation label. - `corp-table.list-layout` локально задаёт геометрию списков в ячейках; `auto` сохраняет оформление документа, а параметры конкретного списка имеют приоритет. - `row_breakable: true` действительно передаётся в `table.cell(breakable:)`; режим проверяется fixture с одной строкой, которая продолжается на трёх страницах. - Центрирование блока `corp-table` не наследуется текстом ячеек: шапка по умолчанию центрирована, тело выровнено влево; явный `align` имеет приоритет. - Блок подписи сохраняет эталонную геометрию для обычных реквизитов и переключается на ограниченные равные боковые колонки при длинных наименованиях. - Письмо и ТКП используют один эталонный footer; на страницах приложений footer скрывается. - Обязательный positional `body` идёт первым в функциях, используемых через `.with`, если это требуется Typst. - Компонент принимает domain-значение и layout options отдельно. - Любая работа с изображением проходит через media slot или проверку `resource != none`. - Компоненты не импортируют profile renderers. ## Намеренно НЕ обрабатывает - Полный жизненный цикл документа. - Profile-specific обязательность полей. - Выбор компании по id. - Сброс глобальных counters между главами. ## Заметки для агента > `corp_table` считается особо хрупким: не переписывайте рекурсивное определение header rows без unit и visual fixtures на rowspan/colspan. Общность компонента доказывается использованием хотя бы в двух профилях; иначе оставьте его внутри конкретного renderer. Layout offsets изображений должны быть параметрами компонента или design tokens, но не данными Signer.