К содержанию

Навигация

Карта стандартов

Карта стандартов показывает все стандарты Framework, их версии и то, на что каждый опирается. По карте видно, какие требования действуют для вашего компонента: каждый следующий уровень добавляет требования и не отменяет предыдущие.

Уровни стандартов

Читайте таблицу снизу вверх по уровням: уровень 1 задаёт форму, уровень 5 — самые конкретные требования.

Уровень Стандарт Имя (id) Версия Что задаёт Опирается на
1 Standard Contract standard-contract 1.0.0 Форму любого стандарта —
2 Recipe simai.composition-recipe 1.1.0 Правила сборки документа страницы Standard Contract
2 Манифест Smart-компонента simai.smart-component-manifest 2.5.0 Контракт одного компонента Standard Contract
3 Составной компонент simai.composite-component 1.0.3 Внешнюю сторону составного компонента Recipe, манифест
3 Пакет компонентов simai.component-package 1.1.1 Пакет Smart-компонентов владельца: устройство, сборку, квитанцию, поставку и подключение манифест (uses); ссылается на составной, динамический составной, порт хоста, жизненный цикл изменений
4 Динамический составной компонент simai.dynamic-composite-component 1.0.3 Поведение составного компонента на стыке с приложением наследует уровень 3
4 Порт хоста simai.composite-host-port 1.0.4 Сам стык: объявленный и версионированный порт наследует динамический
5 Фрагмент интерфейса simai.interface-fragment 1.0.2 Составной компонент в области страницы рядом с другими: описание фрагмента, типы значений страницы, навигацию по областям наследует порт хоста
сквозной Жизненный цикл изменений simai.change-lifecycle 1.0.0 Как публичное имя уходит из Framework схема журнала, политика сроков
сквозной Правила взаимодействия simai.interaction-rules 1.0.0 Как любой Smart-компонент загружается, говорит с соседями и рисует —
сквозной Разработка с ИИ simai.ai-development 1.0.0 Как ИИ-агент разрабатывает на Framework и вместе с ним: контракты, публичная поверхность, выпуски, проверка и приёмка —
2 Фоновый эффект simai.effect 1.1.0 Анимированный фон в области страницы: манифест, модуль, правила работы, набор проверок Standard Contract; схема манифеста эффекта; правила взаимодействия

Переиздания без новых требований. Стандарт закрепляет то, на что опирается, по версии и хешу (см. Закрепление по хешу), поэтому новое издание опоры переиздаёт всю цепочку над ней. Recipe 1.1.0 принимает имена форматов без версии (см. Recipe (simai.composition-recipe)). Составной компонент закрепил новый lock-файл Recipe и вышел изданием 1.0.3. Динамический составной компонент (1.0.3) и порт хоста (1.0.4) переизданы, потому что каждый наследует (extends) предыдущий по хешу. Пакет компонентов (1.1.1) переиздан, потому что ссылается (references) на эти издания по хешу. Требования ни в одном из них не изменились. Фрагмент интерфейса 1.0.2 закрепляет схему описания фрагмента 1.2.0, которая принимает тип значения по имени без версии, и требование closed-value-types называет типы без версии; остальные требования те же (см. Фрагмент интерфейса). Прежние издания хранятся в истории исходников Framework (contracts/standards/history/).

Форматы данных и их старшие версии. Старшая версия формата равна старшей версии стандарта, который его определяет (см. Имена и версии).

Формат (schema) Старшая версия (schema_version) Определяет стандарт
simai.composition.recipe 1 simai.composition-recipe
simai.composition.document 1 simai.composition-recipe
simai.composition.inputs 1 simai.composition-recipe
simai.composition.dependencies 1 simai.composition-recipe
Манифест Smart-компонента (smart.manifest.json) 2 simai.smart-component-manifest
simai.composite.host-port — объявление порта 1 simai.composite-host-port
simai.interface-fragment — описание фрагмента 1 simai.interface-fragment
simai.effect — манифест эффекта (effect.json) 1 simai.effect
simai.change-journal 1 simai.change-lifecycle
simai.framework.product-package-source-lock 1 simai.component-package
simai.framework.product-package-receipt 1 simai.component-package

Где записана версия, зависит от формата. Квитанция пакета записывает имя в поле schema_id, а версию — в schema_version. Форматы композиции (Recipe, документ, входы, перечень зависимостей), журнал изменений и framework.lock.json пакета, описание фрагмента и манифест эффекта несут старшую версию в самой метке schema ("simai.framework.product-package-source-lock.v1") и отдельного поля schema_version не имеют. Такую метку пишут точно, как в примерах (см. Имена и версии).

Порты хоста и их текущие версии. Все изданные версии лежат в поставке ui в distr/core/contracts/ports/<порт>/<версия>/ (см. Объявление порта); текущая — последняя изданная:

Порт Компонент Текущая версия Изданы Случаев в наборе проверок
simai.dataview-port smart.data-view-composite (sf-data-view) 1.12.0 1.0.0–1.12.0 44
simai.property-view-port smart.property-view (sf-property-view) 1.13.0 1.0.0–1.13.0 42
simai.admin-navigation-port smart.admin-menu (sf-admin-menu) 1.0.0 1.0.0 37

Компоненты этих портов поставляет пакет larena (см. Пакеты компонентов продуктов); порты и наборы проверок входят в поставку Framework.

Машиночитаемые копии на сайте документации:

Что Адрес
Схема конверта Standard Contract /ai/standards/standard-contract/1.0.0/standard.schema.json
Комплект Recipe /ai/standards/composition-recipe/1.1.0/
Схема манифеста Smart-компонента /ai/standards/smart-component-manifest/2.5.0/manifest.schema.json
Конверт составного компонента /ai/standards/simai.composite-component/1.0.3/standard.json
Конверт динамического составного компонента /ai/standards/simai.dynamic-composite-component/1.0.3/standard.json
Конверт порта хоста /ai/standards/simai.composite-host-port/1.0.4/standard.json
Схема объявления порта /ai/standards/composite-host-port-schema/1.0.0/port.schema.json
Конверт фрагмента интерфейса /ai/standards/simai.interface-fragment/1.0.2/standard.json
Схема описания фрагмента /ai/standards/interface-fragment-schema/1.2.0/descriptor.schema.json
Конверт правил взаимодействия /ai/standards/simai.interaction-rules/1.0.0/standard.json
Конверт разработки с ИИ /ai/standards/simai.ai-development/1.0.0/standard.json
Конверт фонового эффекта /ai/standards/simai.effect/1.1.0/standard.json
Схема манифеста эффекта /ai/standards/effect-schema/1.2.0/effect.schema.json
Конверт жизненного цикла изменений /ai/standards/simai.change-lifecycle/1.0.0/standard.json
Конверт пакета компонентов /ai/standards/simai.component-package/1.1.1/standard.json
Порты и наборы проверок /ai/ports/<порт>/<версия>/port.json и набор kit/ рядом — каждая версия каждого порта, например simai.dataview-port/1.9.0

Копии берутся из закреплённого выпуска при каждой сборке сайта: схема манифеста — действующее издание 2.5.0, порты — все версии, которые поставляет выпуск.

Версии стандартов, форматов и портов руководство называет только в этих таблицах; остальной текст называет их по имени.

Действующие версии — в исходниках Framework (contracts/standards/); сайт документации публикует конверты в /ai/standards/ (Машиночитаемые источники).

Профили продуктов в карту не входят. Роли полей, типы представлений, устройство запроса к хранилищу — вопросы конкретного продукта. Такие профили описываются поверх стандартов в документации продукта; Framework о продуктах не знает.

Recipe (simai.composition-recipe)

Стандарт Recipe — правила сборки страницы: как из шаблонов, фрагментов, мест вставки, выбора вариантов и объявленных входов получить проверенный документ композиции (Document). На этих правилах держатся и сервер, и браузер: одна и та же запись даёт одну и ту же страницу.

Грамматику самого дерева — какие бывают узлы, как они вкладываются, какие у узла слоты и в каком порядке они отрисовываются — задают схема Document (simai.composition.document) и манифест типа. Recipe описывает, как это дерево собирается.

Recipe издаётся нормативным комплектом, а не одним файлом:

  • схемы Recipe, входных данных и зависимостей;
  • ограничения (limits.json);
  • проверенные примеры;
  • lock-файл, хеш которого покрывает каждый нормативный файл комплекта.

Изменение любого файла комплекта сразу видно по хешу.

Издание 1.1.0 принимает имена форматов без версии: схемы Recipe, манифеста шаблона, входов и перечня зависимостей принимают и прежнюю метку simai.composition.<имя>.v1, и имя simai.composition.<имя> с "schema_version": 1, а профиль канонизации называется simai.recipe.canonical-json.v1 или simai.recipe.canonical-json. Рецепт в прежней форме даёт те же байты Document и те же digest, что и в издании 1.0.1; рецепт без версии в имени даёт Document и перечень зависимостей без версии в имени. Подробно — в Где взять спецификацию.

Комплект лежит в исходниках Framework (src/core/contracts/composition-recipe-v1/), в поставке ui (distr/core/contracts/composition-recipe-v1/) и на сайте документации; ИИ находит его в индексе по идентификатору urn:simai:framework:composition-recipe:specification.

Требования к слотам, порядку и глубине вложенности составных компонентов (Составной компонент (simai.composite-component)) сформулированы в терминах грамматики композиции. Подробно Recipe и Document описаны в Три представления страницы: Recipe, Document и HTML, Шаблоны, вставки и варианты и Где взять спецификацию.

Манифест Smart-компонента (simai.smart-component-manifest)

Манифест Smart-компонента — контракт одного компонента. Он описывает: входные свойства со схемой, методы, события, состояния, доступность, владение данными, безопасность, готовность, происхождение вплоть до хешей файлов исходника и указания для ИИ.

Схема манифеста закрытая: поле, которого в ней нет, не принимается. Поэтому манифест пригоден для машинного чтения и для проверки в гейте владельца. Версию схемы называет поле x-simai-version, действующая версия — в карте стандартов (см. Уровни стандартов). Схема лежит в исходниках Framework (contracts/schema/smart-component-manifest.v2.schema.json); машиночитаемая копия на сайте — в таблице выше. Все Smart-компоненты Framework описаны манифестом версии 2. Манифест — опора составного компонента и место, где компонент объявляет свой порт хоста.

Манифест обязательно содержит разделы schema_version, id, version, title, summary, kind, reuse_mode, lifecycle, tags, capabilities, custom_element, composition, inputs, methods, events, state, persistence, ownership, security, accessibility, presentation, adapter, artifacts, readiness, compatibility, provenance и ai_guidance; форму каждого задаёт схема.

  • id Smart-компонента начинается с smart.: у компонентов Framework это smart. и имя папки (smart.buttons в distr/smart/buttons/).
  • custom_element — тег с дефисом (sf-button).
  • readiness.level — один из уровней inventoried, described, runnable, composable, exportable, accepted, host-required и список проверок required_checks.

Устройство манифеста описано в Манифест.

Составной компонент (simai.composite-component)

Стандарт составного компонента задаёт внешнюю сторону компонента, собранного из других компонентов: таблицы с панелью и меню, административного меню, редактора страницы. Он покрывает состав, слоты, вид, серверную разметку и подхват, поведение без скриптов и доступность. Работу с данными приложения задаёт следующий стандарт (Динамический составной компонент (simai.dynamic-composite-component)).

Требования:

Требование Уровень Суть
slot-order-complete обязательно Слоты и порядок отрисовки объявлены; неизвестный, пропущенный или повторный слот — ошибка, а не повод догадываться
nesting-bounded обязательно Глубина ограничена; повтор пары «компонент и вид» в стеке — цикл
deterministic-placement-id обязательно Идентификатор места — из экземпляра и позиции, не из данных и не случайный
instance-isolation обязательно Экземпляры не делят идентификаторы, ключи хранилища и записи реестров
presentation-declared обязательно Вид выбирается только объявленными в манифесте настройками
asset-contract-exact обязательно Объявленные ресурсы — ровно те, что нужны отрисовке: ничего не пропущено и ничего лишнего
accessible-name-and-keys обязательно Есть доступное имя; ориентир или виджет объявляет клавиши и сохраняет видимый фокус
hydration-claim-truthful обязательно Компонент, который заменяет серверную разметку, не называет это подхватом
render-deterministic обязательно Те же документ, данные и язык дают ту же разметку
owns-its-subtree обязательно Меняет только своё поддерево и созданные им поверхности, удаляет их вместе с собой
direction-and-theme-neutral обязательно Одна разметка для обоих направлений письма и любой темы
no-script-equivalent следует Без скриптов — осмысленный эквивалент или прямое сообщение
handlers-scoped-to-host следует Обработчики привязаны к своему элементу и действуют на экземпляр, который отправил событие
escaped-structural-props следует Структурные свойства экранируются; структурный документ вида не содержит разметки
style-contained следует Без глобальных селекторов и сброса стилей страницы

Опоры стандарта: Recipe (simai.composition-recipe) и схема манифеста Smart-компонента (simai.smart-component-manifest) — замороженная копия той версии схемы, на которой стандарт издан; обе закреплены по версии и хешу.

Стандарт рамочный: имена событий, классы и ширины колонок — документация конкретного компонента. Требования проверяются вручную: автор компонента показывает, чем выполнено каждое; соответствие доказывают конкретные компоненты, а не стандарт. Уровень «следует» означает, что отступление объясняют в документации компонента.

Динамический составной компонент (simai.dynamic-composite-component)

Стандарт динамического составного компонента задаёт границу между составным компонентом и приложением, когда компонент показывает записи, сохраняет настройки и просит выполнить действия. Он наследует стандарт составного компонента целиком и отвечает на вопросы: кто чем владеет, как компонент просит, как приложение отвечает, что происходит при конфликте.

Требование Уровень Суть
structure-and-data-separated обязательно Структурные свойства и данные запроса идут разными каналами; данные — только через свойства, объявленные связанными с запросом
request-data-not-persisted обязательно Данные запроса не сохраняются как определение, рецепт или общий снимок
intent-not-patch обязательно Компонент сообщает намерение; решает и проверяет приложение
intent-carries-no-transport обязательно В намерении нет адреса, запроса, токена
intent-payload-exact обязательно Содержимое намерения сверяется по точному набору ключей
identity-by-reference обязательно Идентификаторы из браузера — только ссылки; приложение перечитывает данные само
mutation-carries-revision обязательно Каждое изменение несёт последнюю увиденную ревизию
server-compares-revision обязательно Приложение сравнивает ревизию под блокировкой и на конфликт отвечает текущей ревизией
conflict-keeps-draft обязательно При конфликте несохранённый ввод не выбрасывается
batch-all-or-nothing обязательно Групповое изменение — всё или ничего
sequenced-responses обязательно Ответ старше последнего запроса отбрасывается
dispose-releases обязательно Уничтожение экземпляра отменяет его подписки и незавершённые запросы и не задевает другие
settings-layers обязательно Настройки: пакет → общие → личные; поля только общего слоя объявлены
reset-is-a-write обязательно Сброс настройки — запись со сравнением ревизии, а не удаление
shared-and-personal-separated обязательно Общие и личные настройки идут разными адресами с разными правами; владелец — из сессии
endpoints-are-relative обязательно Адреса — относительные пути; путь сам по себе не даёт доступа
honest-unavailable следует Без адреса компонент прямо говорит, что возможность не подключена
shared-state-in-link следует Состояние, которое другой человек должен увидеть по ссылке, живёт в адресе
data-states-declared следует Загрузка, есть данные, пусто, ошибка — объявлены и показаны

Роли полей, типы представлений и модель запроса — профиль продукта поверх этого стандарта, а не он сам. Проверка ручная: автор компонента показывает, чем выполнено каждое требование.

Как это выглядит в компоненте — см. Связь с приложением: порты хоста и намерения.

Порт хоста (simai.composite-host-port)

Стандарт порта хоста делает сам стык между динамическим компонентом и приложением предметом договора. Стык объявлен, версионирован и проверяется набором проверок, поэтому изменение компонента не обнаруживается приложением только по поломке.

Требование Уровень Суть
port-declared обязательно Порт объявлен в манифесте: данные, намерения, настройки — каждое со схемой
port-versioned-separately обязательно У порта своя версия, независимая от компонента
port-schemas-closed обязательно Схемы закрыты; лишний ключ отклоняют обе стороны
intent-answers-declared обязательно У намерения устойчивое имя, схема, признак «несёт ревизию» и перечень ответов хоста
capabilities-negotiated обязательно Необязательные части — именованные возможности; компонент предлагает только данные хостом
permissions-come-with-data обязательно Права приходят с данными, по каждой записи; компонент не выводит их сам
answer-echoes-request обязательно Ответ повторяет запрос, на который отвечает
minor-is-additive / major-for-breaking обязательно Младшая версия только добавляет; всё ломающее — новая старшая
previous-major-kept обязательно Прежняя старшая версия остаётся в изданных выпусках объявленный срок; отказ называет замену и дату
host-declares-supported обязательно Хост объявляет, какие версии порта реализует
mismatch-is-honest обязательно Если хост не реализует нужную версию, компонент сообщает, что возможность не подключена
conformance-kit-published обязательно С каждой версией порта издаётся набор проверок
kit-is-transport-neutral обязательно Набор описывает данные, намерения и ответы, а не адреса и форматы передачи
host-claim-backed-by-kit обязательно Поддержка заявляется только после прохождения набора
reference-host-tested следует Владелец проверяет каждый выпуск на эталонном хосте
port-owned-by-component-owner обязательно Продукт просит изменить порт, но не расширяет его у себя
product-rules-in-profiles обязательно Правила продукта — хранилище, права, типы полей — живут в профиле поверх порта
change-recorded-with-recheck обязательно Версия порта записывает, что изменилось и что хосту перепроверить
pinned-by-exact-release следует Продукт закрепляет компонент и порт точным изданным выпуском

Стандарт наследует динамический составной компонент целиком. Проверка автоматическая у владельца: гейт сверяет объявление порта со схемой, байты порта — с закреплёнными в манифесте, намерения — с событиями, отпечаток набора — с самим набором, а эталонный хост проходит весь набор.

Порты и наборы проверок описаны в Порты и наборы проверок.

Фрагмент интерфейса (simai.interface-fragment)

Стандарт фрагмента интерфейса описывает страницу, собранную из составных компонентов, которые обновляют друг друга через объявленные контракты, и оболочку, у которой область содержимого меняется без полной загрузки страницы. Фрагмент — составной компонент с одним портом хоста, поставленный в именованную область страницы. Стандарт наследует порт хоста целиком; доступ к данным, права и ответы областей остаются за продуктом, а описание фрагмента, типы значений, маршруты и навигация по областям — за Framework.

Требование Уровень Суть
fragment-is-a-composite обязательно Фрагмент — составной Smart-компонент в именованной области страницы: один порт хоста и опубликованные порты композиции; не страница, не шаблон и не серверная вставка со своим поведением
descriptor-published обязательно У каждого фрагмента есть описание simai.interface-fragment.v1: имя, элемент, области, стандарт и версия порта, выходы и входы с типами значений, операция доступа, ключи адреса и бюджет
descriptor-checked обязательно Гейт пакета проверяет каждое описание по схеме (SF.Composition.checkFragmentDescriptor) до выпуска; фрагмент без верного описания на страницу не ставится
no-direct-calls обязательно Фрагмент не вызывает методы и порт хоста другого фрагмента и не ищет его в DOM; сказанное другому уходит через опубликованный выход и приходит на объявленный вход
routes-on-the-page обязательно Страница — один layout.scope: фрагменты — его конечные точки, маршруты между портами объявляет страница; типы значений на концах маршрута совпадают
closed-value-types обязательно Значения между фрагментами — из закрытого перечня типов (record-changed, record-removed, collection-changed, files-moved, counter, navigation, preference-changed и типы композиции); имя типа без версии, прежняя метка (record-changed.v1) называет тот же тип и читается до 2026-12-01; у каждого типа схема и проверка; значение, не прошедшее проверку, отклоняется, а не приводится
values-say-what-changed обязательно Значение говорит, что и где изменилось, но не несёт сами данные: фрагмент перечитывает запись через свой порт со своими правами
host-is-an-endpoint обязательно Хост страницы — конечная точка layout.scope: последствия ответа порта публикуются на его выходах типизированными значениями и доставляются объявленными маршрутами
failure-is-contained обязательно Фрагмент, упавший при загрузке или отрисовке, заменяется на своём месте состоянием ошибки с повтором; остальная страница и маршруты работают
five-states обязательно Пять состояний, как у любого Smart-компонента: загрузка, есть данные, пусто, нет доступа, ошибка; загрузка — скелетон в своей области, а не пустой ответ
access-before-placement обязательно Фрагмент, операция которого человеку недоступна, не ставится или ставится в состоянии «нет доступа»; элементов управления, которые хост отклонит, он не показывает
shareable-state-in-the-address обязательно Состояние, которым делятся или к которому возвращаются, живёт в адресе под ключами из url_state; двум фрагментам страницы один ключ не принадлежит
region-navigation обязательно Ссылка внутри оболочки меняет область содержимого, а не страницу: заголовок запроса области, замена на месте со скелетоном только в этой области, адрес в истории, «Назад» и «Вперёд» с возвратом прокрутки, фокус на новом заголовке
full-load-fallback обязательно Если ревизия оболочки другая, ссылка просит полную загрузку, адрес на другом источнике или ответ области не такой, как объявлено, страница загружается целиком; наполовину заменённая страница не остаётся
assets-once обязательно Область приносит ресурсы своих фрагментов; ресурс, который уже есть на странице, повторно не запрашивается
release-on-leave обязательно Фрагмент, ушедший при замене области, отключается: маршруты, слушатели и таймеры освобождаются
budget-declared обязательно Фрагмент объявляет бюджет — килобайты сверх общей основы и миллисекунды до первого ответа; бюджет измеряют проверки пакета, превышение не проходит гейт
versioned-with-its-port обязательно Описание следует версиям порта: младшая версия только добавляет необязательные выходы, входы и ключи адреса; удаление, переименование или смена типа значения — новая старшая

Проверка ручная: автор фрагмента показывает, чем выполнено каждое требование. Форму описания и значения проверяет Framework (SF.Composition.checkFragmentDescriptor по закреплённой схеме описания 1.2.0 и проверки типов значений). Маршруты между фрагментами задаёт комплект Composition Routing 1.1.0: он сравнивает типы по имени без версии и записывает обе формы имён в контрольном примере fixtures/value-type-names.json.

Как устроены описание и страница из фрагментов — см. Фрагменты интерфейса; типы значений — Типы значений маршрутов; навигация по областям — Навигация по областям страницы.

Правила взаимодействия (simai.interaction-rules)

Стандарт правил взаимодействия задаёт, как любой Smart-компонент — простой или составной — загружается, говорит с другими компонентами и рисует: одно действие — одна отрисовка, пять состояний со скелетоном для загрузки и sf-empty-state для остальных, ожидание вместо «недоступно», свойства вниз и события вверх, маршруты между соседями, настройки вида через SF.Preferences, лёгкая разметка для повторов, ресурсы вместе и один раз, устойчивая геометрия, уменьшение движения, изоляция сбоев, работа без кадров анимации и проверка каждого правила в сборке. Стандарт сквозной: он относится ко всем компонентам и составным компонентам и не наследует другие стандарты. Восемнадцать требований с пояснениями — на странице Правила взаимодействия компонентов.

Разработка с ИИ (simai.ai-development)

Стандарт разработки с ИИ задаёт, как агент работает над Framework и с ним: сначала читает машинные контракты, пользуется только публичной поверхностью, не правит сгенерированное, закрепляет точные выпуски, обновляется по журналу изменений, называет форматы без версий, подключает порты по их наборам проверок, проверяет видимое в браузере и сдаёт работу доказательствами. Стандарт сквозной и не наследует другие. Шестнадцать требований с пояснениями — на странице Разработка с ИИ.

Фоновый эффект (simai.effect)

Стандарт фонового эффекта задаёт анимированный фон в одной области страницы: манифест effect.json с типизированными настройками в границах, один модуль с mount, update, pause, resume и destroy, неподвижный кадр при уменьшении движения, покой в скрытой вкладке, отсутствие сетевых запросов, чистое уничтожение, чужие эффекты в изолированном фрейме и набор проверок перед показом в списке. Издание 1.1.0 содержит двадцать требований и использует (uses) схему манифеста эффекта 1.2.0; на правила взаимодействия оно опирается в части движения и сбоев. Требования о теме и окнах:

Требование Суть
schemes-and-pair-declared Манифест называет схемы, для которых эффект нарисован: тёмную, светлую или обе, основную первой; каждая схема рисуется под свой фон, а не переворотом картинки. Без схем — обе. Эффект одной схемы может назвать пару — эффект другой схемы с той же ролью
theme-follows-the-placement У размещения есть режим темы: как у страницы (по умолчанию), всегда тёмная или всегда светлая. Если эффект не рисует нужную схему, показывается пара; без пары тёмный эффект остаётся тёмным на светлой странице, а светлый на тёмной не показывается — вместо него ровная поверхность этой темы. Редактор предлагает только те режимы, которые эффект или его пара рисуют
area-takes-the-drawn-theme Область эффекта получает тему, в которой он нарисован (theme-dark или theme-light), поэтому текст и элементы управления над ним берут роли этой темы. При настройках по умолчанию на самом светлом кадре основной текст даёт контраст не ниже 4.5:1, приглушённый — не ниже 3:1. Поэтому приглушённым над эффектом пишут только крупный текст, а мелкий текст берёт основную роль
drawn-with-palette-tones Эффект рисует тонами палитры (--sf-primary-40, --sf-neutral-98): они одинаковы во всех темах и несут цвета проекта. Роли темы эффект не использует
windows-are-mask-safe Эффект с возможностью windows рисует одну сплошную сцену за группой карточек, видную только сквозь них, следует размеру группы и не полагается на то, что скрыто маской. Тему эффекта получают только карточки-окна
pair-under-the-same-trust Пара загружается под тем же доверием, что любой эффект: идентификатор проверяется по каталогу и его SHA-256, адрес вне закреплённого каталога — чужой и выполняется только в изолированном фрейме. В этом выпуске исполнителя для изолированного фрейма нет, поэтому такая пара отклоняется

Как написать, подключить и проверить эффект и все требования — на странице Фоновые эффекты.

Жизненный цикл изменений (simai.change-lifecycle)

Стандарт жизненного цикла изменений задаёт, как публичное имя уходит из Framework, не ломая проекты. Он сквозной: применяется не к виду компонента, а ко всем публичным именам Framework — компонентам, утилитам, токенам.

Сроки записаны в политике contracts/lifecycle-policy.json, изменения — в журнале contracts/changes/journal.json.

Требование Уровень Суть
one-version-line обязательно Одна линия версий; имя уходит по календарю, а не с номером версии
two-stages обязательно Совместимость и удаление; третьего, недатированного состояния нет
journal-records-every-change обязательно Изменение, которое требует действий потребителя, без записи не выпускается
record-says-what-to-write обязательно Запись называет старую форму, замену и, если замена не механическая, инструкцию с примером «было — стало»
record-dated-by-policy обязательно Запись несёт дату отметки и день чистки, вычисленный по политике
journal-append-only обязательно Записи не удаляются; удалённое имя остаётся «надгробием»
journal-chronological обязательно Журнал идёт по датам и читается как история публичных имён
no-alias-without-record обязательно Прежнее имя в коде без записи в журнале роняет гейт
sweep-on-schedule обязательно Просроченная запись совместимости роняет гейт
compat-out-of-the-way следует Совместимость решается в общих местах (таблицы псевдонимов), а не в коде компонентов
runtime-notes-use обязательно Страница видит свои прежние имена в SF.deprecations.list()
upgrade-from-the-journal обязательно Обновление продукта читает журнал инструментом, а не прозу
consumers-scanned-before-sweep следует Перед чисткой известных потребителей проверяют инструментом обновления и переводят
documented-for-readers обязательно Политика, журнал и порядок обновления опубликованы; замена видна на странице компонента
verified-by-gate обязательно Гейт держит форму журнала, даты, правило дописывания и покрытие псевдонимов; браузерная проверка — заметку в работе
extension-once-with-reason можно Одно продление с причиной

Как этим пользоваться в проекте — два этапа, календарь удалений, продление, журнал и инструмент sf-upgrade — описано в Жизненный цикл изменений и совместимость и Как обновить проект; у Smart-компонентов — в Ошибки и диагностика.

Пакет компонентов (simai.component-package)

Стандарт пакета компонентов задаёт, как владелец продукта или сторонний автор расширяет Framework набором своих Smart-компонентов, в том числе составных. Он покрывает устройство папки пакета, закрепление ревизии Framework, правило и манифест каждого компонента, имена, воспроизводимую сборку с квитанцией, поставку, объявление на странице, лицензию и доверие к коду пакета. Владелец стандарта — Framework; стандарт лежит в исходниках Framework (contracts/standards/simai.component-package/<версия>/).

Связи с другими стандартами (см. Связи между стандартами):

  • uses — манифест Smart-компонента (simai.smart-component-manifest), замороженная копия схемы 2.5.0 — той же, что действует для компонентов Framework;
  • references — simai.composite-component, simai.dynamic-composite-component, simai.composite-host-port и simai.change-lifecycle, каждый по версии и хешу. Их требования действуют для компонентов пакета так, как изданы, и в этом стандарте не повторяются.

Стандарт не наследует ни одного требования (extends у него нет): он относится к отдельному виду — пакету компонентов.

Издания. Действующее издание — 1.1.1. С издания 1.1.0 стандарт закрепляет схему манифеста 2.5.0, поэтому манифест компонента пакета объявляет те же поля, что и компоненты Framework, в том числе presentation.skeleton и персональный вид. Издание 1.1.1 только обновляет хеши изданий, на которые стандарт ссылается (см. Переиздания без новых требований). Требования во всех изданиях те же, что в 1.0.0. Издание 1.0.0 закрепляло схему 2.2.0, хотя компоненты Framework, а значит и пакет, построенный на них, уже объявляли поля до 2.5.0. Издания 1.0.0 и 1.1.0 остались в истории: их байты хранятся в исходниках Framework (contracts/standards/history/simai.component-package/<версия>/), а сайт документации публикует только действующее издание.

Требование Уровень Суть
extension-points-only обязательно Пакет только добавляет к Framework через объявленные точки расширения; не заменяет его файлы и не меняет Loader, основу Smart-компонентов, компоненты и глобальные объекты Framework
layout-like-framework обязательно Папка устроена как исходники Smart-компонентов Framework: framework.lock.json, src/smart/<папка>/, tests/, по желанию docs/; остальное в пакет не входит
package-may-be-a-folder можно Пакет — корень репозитория или любая вложенная папка; папка в src/smart без файла правил — вспомогательная и как компонент не собирается
framework-lock-form обязательно framework.lock.json объявляет формат simai.framework.product-package-source-lock той старшей версии, которую задаёт стандарт
one-framework-revision обязательно Пакет собирается и тестируется на одной ревизии исходников Framework — полный коммит; переход на новую — правка lock-файла после выхода выпуска, тесты и новая сборка
component-complete обязательно У компонента есть index.js, rule.js, smart.manifest.json, объявленные шаблоны и стили; связи правила ведут к правилам пакета или выпуска Framework
rule-is-own-plain-data обязательно Файл правил компонента пишет ровно одно правило cl-<папка> простыми данными: без регулярных выражений, функций и поля пакета
manifest-conforms обязательно Манифест соответствует закреплённой схеме манифеста и называет тот же элемент, что и правило; составной компонент объявлен составным
package-name-grammar обязательно Одно имя пакета — строчные латинские буквы, цифры и дефис, начинается с буквы — во всех местах: lock-файл, сборка, файл правил, квитанция, страница
names-do-not-collide обязательно Папки, правила и элементы пакета не совпадают с Framework и с другими пакетами страницы; два правила пакета не называют один элемент
own-element-prefix следует Новый элемент получает префикс владельца, а не sf-
tests-travel-with-package следует Пакет несёт свои тесты и прогоняет их на закреплённой ревизии и своей сборке до использования
builds-reproducibly обязательно Сборка — только из закоммиченных файлов, дважды в новых каталогах, с побайтным совпадением
receipt-for-every-build обязательно Каждая используемая сборка сопровождается квитанцией; квитанция не объявляет пакет готовым к промышленной эксплуатации
delivered-in-owners-distribution обязательно Владелец поставляет пакет в своей поставке, рядом с выпуском Framework из квитанции, каждую сборку по своему пути
declared-before-core обязательно Страница объявляет пакет в SF_BOOT_CONFIG.packages.<имя>.base до запуска ядра; не загруженный компонент пакета не ищется среди компонентов Framework
licence-is-owners обязательно Пакет распространяется по лицензии владельца; код Framework внутри сборки сохраняет лицензию Framework
package-code-is-trusted обязательно Код пакета работает на странице с теми же правами, что и Framework; страница объявляет только пакеты, которым доверяет владелец
ports-pinned-by-bytes обязательно Компонент, который реализует порт Framework, объявляет его в манифесте по имени, версии и хешу байтов; порт не копируется и не меняется
public-names-follow-lifecycle обязательно Публичные имена пакета уходят по жизненному циклу изменений, записанному в журнале владельца

Требование framework-lock-form проверяется машинно (equals), остальные показывает автор пакета (manual).

О требовании own-element-prefix: новые элементы пакета получают префикс владельца (shop-catalog), поэтому будущий элемент Framework не займёт их имя. Loader это поддерживает: он загружает любой тег, который перечислен в правиле пакета, а тег без префикса sf- может занять только правило пакета (см. Пакеты компонентов). Компонент, перенесённый из Framework в пакет, сохраняет имя с sf-, пока его не переименуют через жизненный цикл изменений. В манифесте компонента пакета custom_element называет тег с префиксом владельца, а id начинается с smart. (см. Разделы манифеста).

О требовании tests-travel-with-package: тесты лежат в tests/ папки пакета и запускаются в дереве, где исходники Framework закреплённой ревизии соединены с src/, tests/ и docs/ пакета, — том же, из которого собирается пакет (см. Пакеты компонентов продуктов). sf-build их не запускает: пакет запускает их сам стандартным исполнителем Node — node --test с файлами tests/*.test.mjs в этом дереве. Так делает пакет larena: его scripts/test.mjs раскладывает дерево и запускает в нём свои тесты и общие проверки Framework.

Как устроен, собирается и подключается пакет — см. Пакеты компонентов продуктов, Сборка пакета: sf-build и Пакеты компонентов.

Имена и версии

Имя стандарта, формата данных или порта не содержит версии. Версия меняется с каждым изданием, имя остаётся прежним, поэтому тексты, документы и ссылки, которые называют имя, при выпуске не правятся.

Правила:

  • Стандарт — id без версии и version отдельно, полная версия <старшая>.<младшая>.<исправление> (см. Конверт). Пример: simai.composite-host-port.
  • Формат данных — имя в поле schema (simai.<имя>) без версии и старшая версия отдельно, в поле schema_version, целым числом. Совместимое добавление её не меняет, поэтому сохранённые файлы ради него не переписываются.
  • Старшая версия формата равна старшей версии стандарта, который его определяет. Стандарт simai.composition-recipe определяет simai.composition.document, и старшие версии у них совпадают (см. Уровни стандартов).
  • Тексты называют только имя. Версия записана в поле самого файла, в карте стандартов (см. Уровни стандартов) и в записи о выпуске (см. Выпуск и запись о выпуске). Где требование зависит от версии, текст говорит «по версии и хешу» или «новая старшая версия», не называя номер.
  • Путь может содержать версию там, где рядом лежат несколько версий: contracts/standards/<id>/<version>/, distr/core/contracts/ports/<порт>/<версия>/, закреплённые копии в pinned/. В тексте такой путь записывается с подстановкой <версия>.

Форматы со старшей версией в самой метке (всего 40 меток) переходят на пару schema и schema_version путём, описанным ниже: запись журнала format-names-without-version (совместимость до 2026-12-01). Каждый читатель Framework, sf-build и читатель файла закрепления Larena принимают обе формы — simai.<имя>.v<n> и simai.<имя> с schema_version рядом, поэтому документ в любой из них читается одинаково.

Писатели Framework выпускают форму без версии: документы композиции ("schema": "simai.composition.document", "schema_version": 1), манифесты типов, портов и редакторов композиции, виды полей, реестры типов, портов и манифестов редакторов, журнал изменений (simai.change-journal) и файлы данных поставки — публичные переменные, уведомления о стороннем коде и другие. Документ, собранный из рецепта, берёт форму рецепта: рецепт с версией в метке даёт simai.composition.document.v1. С версией в метке пишутся реестр контрактов Smart-компонентов, порты хоста и их наборы проверок, закрепления контрактов возможностей и рецептов, lock-файл и примеры комплекта Recipe (рецепт с версией в метке даёт те же digest), а также форматы продуктов и инструментов: описание фрагмента (simai.interface-fragment.v1), манифест эффекта (simai.effect.v1), файл закрепления пакета (simai.framework.product-package-source-lock.v1) и файл настроек sf-build (simai.sf-build.config.v1). Примеры документации записаны в той форме, в которой их пишет Framework.

Типы значений маршрутов называются без версии (record-removed); метка с версией (record-removed.v1) называет тот же тип и читается до 2026-12-01 (запись журнала value-types-without-version). Манифест sf-table, выходы <sf-page-host> и ключи SF.Composition.VALUE_TYPES записаны метками с версией, поэтому их байты и digest не меняются (см. Имя типа).

Обе формы разбирает модуль Framework core/js/composition/schema-name.mjs (в поставке — рядом с модулями композиции): readSchema() сводит simai.<имя>.v<n> и simai.<имя> с schema_version к одному {name, version}, а schemaFields() выдаёт писателю новую форму.

Несовместимое изменение формата проходит жизненный цикл изменений (см. Жизненный цикл изменений и совместимость и Как обновить проект):

  1. Совместимость. Читатели принимают обе формы, писатели выпускают новую; журнал изменений получает запись об изменении формата (см. Журнал изменений).
  2. Перевод проекта. sf-upgrade переписывает данные проекта в новую форму, при несовместимом изменении — преобразователем (см. Инструмент sf-upgrade).
  3. Удаление. Старая форма удаляется на плановой чистке по календарю (см. Календарь).

Новый формат сразу использует пару schema и schema_version.

Смотрите также

Поиск по документации

Введите минимум 2 символа

    Настройки

    Тема
    Размер шрифта
    Ширина страницы