Собственный контракт становится юнитом или компонентом. Паттерн описывает, как сущности работают вместе. Композиция, зависимая от данных одного продукта, остаётся в этом продукте.
Принятые решения
Form section
Тип: паттерн · Цель: form · Отношение: region.
Секция группирует поля и не добавляет поведения. Нужную семантику задают heading или fieldset с legend.
Основания
- У сущности нет собственных состояний, клавиатурного поведения или обязательного компонентного API.
- Обычный раздел и один групповой вопрос требуют разной HTML-семантики.
Что делать. Описывать секции в паттерне form. Универсальная обёртка FormSection скрыла бы выбор семантики.
Tagger (ADMY Kit)
Тип: компонент · Цель: tag-input · Отношение: entity.
Поле свободных меток с чипами и крестиками — это Tag Input: собственный ввод, значения и удаление.
Основания
- В ките
tagger и tagger__tag — поле ввода и чип с крестиком; свободные значения, справочника нет. - Multi Select канона свободные значения запрещает, поэтому потребовалась отдельная сущность.
Что делать. Использовать tag-input; чип внутри — tag с clearable. Имя tagger остаётся алиасом продукта.
Snippet (ADMY Kit)
Тип: компонент · Цель: copy-field · Отношение: entity.
Значение только для чтения с кнопкой копирования — Copy Field; имя snippet в системе занято под Svelte snippets.
Основания
- На экранах продукта это поле «Tracker link» с кнопкой COPY и подсказкой под ним.
- У сущности собственное поведение: копирование в буфер, подтверждение, запасное выделение текста.
Что делать. Использовать copy-field; snippet — алиас продукта в описании компонента.
Updown (ADMY Kit)
Тип: компонент · Цель: flipper · Отношение: entity.
Переключатель направления сортировки в тулбаре списка — круглая кнопка-значок с циклическим значением, то есть Flipper.
Основания
- В ките Tesseract тот же контрол называется
flipper с value 0..3 и type default/plain. - Двухпозиционный
flipper-pin уже закрыт Toggle Button short.
Что делать. Использовать flipper для циклических режимов, toggle-button — для двоичных.
Toggle passer (ADMY Kit)
Тип: компонент · Цель: segmented-control · Отношение: entity.
Три сегмента none / include / exclude с тонами — Segmented Control с tone include и exclude.
Основания
- Варианты кита: state=include, state=exclude, state=none.
- У Segmented Control есть
deselectable и tone сегментов include/exclude.
Что делать. Собирать из segmented-control; отдельная сущность не нужна.
Drag list (ADMY Kit)
Тип: компонент · Цель: checkbox-group · Отношение: entity.
Список с перетаскиванием порядка на экранах продукта — настройка видимых колонок таблицы: набор признаков, у которых меняют порядок. Это Checkbox Group с reorderable, а не отдельная сущность.
Основания
- В ките
drag-list и drag-list__item — строки с рукояткой и чекбоксом; собственного значения, кроме набора и порядка, нет. - Единственный экран продукта с ним — модалка Setting списков; там это видимость и порядок колонок.
Что делать. Использовать checkbox-group с reorderable: рукоятки меняют порядок items, чекбоксы — видимость, а продукт сохраняет порядок через bind:items. Отдельный sortable-list нужен только после появления второго сценария с собственным контрактом.
Cashback level (ADMY Kit)
Тип: продуктовая деталь · Цель: admy-cashback-level · Отношение: local.
Уровни кешбэка — бизнес-данные одного продукта: шкала, пороги и подписи не переносятся.
Основания
- Варианты кита перечисляют уровни программы лояльности ADMY.
- Переносимая часть — Meter или Progress канона с данными продукта.
Что делать. Собирать из meter либо progress с продуктовыми данными; в канон не регистрировать.
Placeholder chart (ADMY Kit)
Тип: продуктовая деталь · Цель: admy-placeholder-chart · Отношение: local.
Заглушка графика — пустое состояние области с продуктовой иллюстрацией; графиков в каноне нет.
Основания
- Пустое и загружающееся состояние области экран выражает
areaStates, а не компонентом. - Иллюстрация и текст заглушки принадлежат продукту.
Что делать. На экране — область в состоянии empty; заглушка остаётся в продукте.
Feed (ADMY Kit)
Тип: продуктовая деталь · Цель: admy-feed · Отношение: local.
Лента событий определяется данными и типами событий одного продукта.
Основания
- Варианты
feed и feed__item перечисляют продуктовые события. - Строка ленты собирается из текста, статуса и метки канона без нового поведения.
Что делать. Собирать ленту из text, status, tag и avatar в паттерне списка; отдельной сущности нет.
Payments (ADMY Kit)
Тип: паттерн · Цель: entity-list · Отношение: local.
Список платежей — экземпляр «Списка сущностей»: строки с суммой, датой и состоянием.
Основания
payments и payments__item повторяют строку выдачи с наведением; собственного поведения нет.- Тулбар, фильтры и страницы у платежей те же, что у любой выдачи.
Что делать. Описывать экран платежей паттерном entity-list; компонент не заводить.
Login (ADMY Kit)
Тип: паттерн · Цель: form · Отношение: local.
Экран входа и восстановления пароля — экземпляры «Формы» с полями и одним главным действием.
Основания
login и login-password-recovery состоят из Input (пароль — type=password) и Button.- Собственного поведения у экрана нет: правила формы покрывают его целиком.
Что делать. Собирать по паттерну form в каркасе shell: auth: каркас приложения на экране входа не рисуется, документ стоит в Auth Layout.
Tree Select и Tree View
Тип: продуктовая деталь · Цель: hierarchical-selector · Отношение: local.
Иерархический выбор в продукте уже признан продуктовым: решение hierarchical-choice отдаёт правила обхода уровней и наследования продукту. Одиночное дерево осталось единственной сущностью канона, которая эти правила частично описывала.
Основания
- Ни
tree-select, ни tree-view не встречаются в китах ADMY Kit и Tesseract и ни на одном из 126 экранов frontend_old. - Оба заведены как
authored в 2026-07: контракт написан от идеи иерархии, а не снят с кита. - Схема узла
treeNodeSchema была единственной рекурсивной формой экранного документа — рекурсия обслуживала только эти две сущности.
Что делать. Иерархию собирать поверх плоских полей канона (select, combobox, multi-select) продуктовым селектором. В канон дерево не возвращать без имени в ките или экрана продукта.
Action Field
Тип: компонент · Цель: input · Отношение: entity.
Короткое поле с одним действием и ответом под ним — это Input с кнопкой-суффиксом и подсказкой: собственного контракта у сущности не осталось.
Основания
- Имени нет ни в одном ките; на экранах продукта поле не встречается; сущность заведена как
authored в 2026-08. - Copy Field, зеркалом которого её объявили, снят с кита (
snippet) и остаётся — обратного направления кит не знает.
Что делать. Промокод и код приглашения собирать из input с кнопкой-суффиксом; ответ показывать сообщением поля.
Проверочные сценарии для ИИ
Для каждого сценария агент должен выбрать подходящую сущность и отклонить ложные варианты по указанной причине.
Собрать постоянную глобальную навигацию приложения с основным содержимым.
global-application-navigation
Контекст
- Навигация действует на несколько маршрутов.
- На узком экране нужен управляемый переход к меню.
Выбрать: pattern:application-shell
Не выбирать
header - Отдельная оболочка шапки не фиксирует отношения с navigation и main.sidebar - Отдельная боковая панель не задаёт адаптивность и возврат фокуса всего каркаса.
Причина. Задача связывает несколько регионов страницы, поэтому её описывает паттерн.
Разделить длинную форму на именованные смысловые блоки.
long-form-sections
Контекст
- Поля остаются частью одной отправки.
- Каждый блок отвечает за одну локальную задачу.
Выбрать: pattern:form
Не выбирать
form-section - Универсальная обёртка скроет различие heading и fieldset/legend.
Причина. Секция остаётся регионом формы. У неё нет самостоятельного поведения или переносимого API.
Изменить одно булево значение с немедленным эффектом.
immediate-binary-setting
Контекст
- Отдельной отправки нет.
- Новое состояние применяется сразу.
Выбрать: component:switch
Не выбирать
checkbox - Checkbox выражает значение, которое обычно подтверждается вместе с формой.button - Button запускает действие и не сообщает устойчивое булево состояние.toggle-button - Toggle Button переключает локальный режим инструмента, а не самостоятельную настройку с немедленным эффектом.
Причина. Switch одновременно показывает текущее состояние и обещает немедленное переключение.
Собрать булево значение и отправить его вместе с остальной формой.
submitted-binary-value
Контекст
- Изменение не применяется немедленно.
- Значение отправляется вместе с остальными данными формы.
Выбрать: component:checkbox
Не выбирать
switch - Switch обещал бы немедленный эффект, которого здесь нет.
Причина. Checkbox честно выражает отмечаемое значение до отдельного подтверждения формы.
Ввести точное число, которое участвует в вычислениях.
exact-numeric-value
Контекст
- Значение должно оставаться number, пустота должна оставаться null.
- Min, max и step являются частью арифметического контракта.
Выбрать: component:input-number
Не выбирать
input - Input хранит строку и подходит цифрам только как идентификатору, телефону или коду.slider - Slider подходит быстрому выбору положения, когда точный ввод вторичен.
Причина. Input Number сохраняет числовую форму значения и объединяет точный ввод с границами и шагом.
Выбрать ровно один вариант из небольшого набора, который нужно сравнить целиком.
visible-single-choice
Контекст
- Варианты являются ответами на один вопрос.
- Все ответы помещаются рядом без перегрузки.
Выбрать: component:radio
Не выбирать
select - Select скроет варианты, которые важно сравнить до выбора.segmented-control - Segmented control предназначен для коротких режимов, а не ответов формы.
Причина. Radio сохраняет весь набор видимым и связывает варианты общим вопросом.
Переключать один из нескольких коротких взаимоисключающих режимов представления.
short-view-mode
Контекст
- Вариантов от двух до шести.
- Выбор меняет текущий режим, а не заполняет вопрос формы.
Выбрать: component:segmented-control
Не выбирать
radio - Radio создаст семантику вопроса формы вместо переключателя режима.select - Select без причины спрячет короткий ряд режимов.tabs - Tabs переключает панели одного контекста, а не значение режима.toggle-group - Toggle Group допускает снять single-выбор или включить несколько независимых режимов.
Причина. Segmented control держит короткие режимы видимыми и подчёркивает единственный активный.
Показать текущий этап заранее известного многошагового процесса.
fixed-process-position
Контекст
- Этапы имеют устойчивый порядок и один текущий value.
- Индикатор сообщает положение, но не выполняет переходы.
Выбрать: component:steps
Не выбирать
progress - Progress показывает непрерывный или числовой ход одной операции, а не именованные этапы.breadcrumbs - Breadcrumbs описывает иерархический путь страницы, а не последовательность процесса.pagination - Pagination переходит между страницами коллекции и является навигацией.
Причина. Steps вычисляет completed, current и upcoming по порядку items. Сам компонент остаётся статическим индикатором.
Выбрать одно значение из короткого известного списка, который нужно скрыть до запроса.
compact-known-single-choice
Контекст
- Варианты быстро просматриваются после открытия.
- Поиск и произвольный ввод не нужны.
Выбрать: component:select
Не выбирать
radio - Radio без необходимости займёт место постоянно видимым списком.combobox - Combobox добавит поле поиска к списку, который и без него быстро просматривается.menu - Menu запускает команды, а не хранит выбранное значение формы.
Причина. Select сворачивает короткий закрытый список и сохраняет видимым выбранное значение.
Выбрать одно значение из длинного плоского списка с поиском.
long-single-choice
Контекст
- Список нельзя быстро просмотреть целиком.
- Поисковый запрос только фильтрует варианты и не становится значением.
Выбрать: component:combobox
Не выбирать
select - Select не фильтрует длинный список по введённому запросу.input - Input примет произвольный текст вместо значения из закрытого набора.
Причина. Combobox сохраняет single-choice и добавляет поиск без свободного значения.
Подтвердить необратимое или дорого восстанавливаемое действие.
destructive-expensive-action
Контекст
- Цена ошибки выше цены дополнительного шага.
- Нужно назвать объект и последствие.
Выбрать: pattern:destructive-confirmation
Не выбирать
button - Одна кнопка не содержит проверки объекта и последствия.alert - Alert сообщает риск, но сам не организует подтверждение и отмену.dialog - Один Dialog даёт модальную оболочку, но не фиксирует объект, последствие и пару действий подтверждения.
Причина. Задача требует композиции сообщения, спокойной отмены и конкретного danger-действия.
Выполнить обратимое действие сразу и оставить короткую отмену.
reversible-action-with-undo
Контекст
- Результат надёжно восстанавливается одним действием.
- Дополнительное подтверждение замедлит частый сценарий сильнее, чем защитит от ошибки.
Выбрать: component:toast
Не выбирать
destructive-confirmation - Паттерн подтверждения нужен только при необратимой или дорогой ошибке.dialog - Модальная пауза избыточна, когда действие можно сразу отменить.
Причина. Toast сообщает о результате и даёт отменить действие без отдельного подтверждения заранее.
Выбрать несколько значений из плоского списка с поиском в компактном поле.
compact-searchable-multiple-choice
Контекст
- Выбранный набор помещается внутри поля как удаляемые метки.
- Отдельный обзор, массовые действия и значимый порядок не нужны.
Выбрать: component:multi-select
Не выбирать
combobox - Combobox выбирает одно значение и не показывает выбранный набор.dualist - Две рабочие области избыточны для компактного выбранного набора.
Причина. Multi Select объединяет поиск и удаляемые выбранные значения в одном поле формы.
Управлять большим выбранным набором из длинного списка с поиском.
searchable-multiple-choice
Контекст
- Список нельзя эффективно показать целиком.
- Выбранные элементы нужно проверять отдельно от доступных и массово выбирать или очищать.
Выбрать: component:dualist
Не выбирать
checkbox-group - Плоская группа не решает поиск и обзор большого выбранного набора.multi-select - Компактное поле не даёт отдельной области для проверки и массового управления выбранным.
Причина. Dualist делает доступный и выбранный наборы отдельными областями одного сценария.
Выбрать значение из иерархии: один конечный узел или несколько веток и листьев.
hierarchical-choice
Контекст
- Связь родителя и потомка участвует в решении.
- Нужны прикладные правила обхода уровней, частичного выбора или наследования.
Выбрать: product-local:hierarchical-selector
Не выбирать
select - Плоский список скроет уровни и родительский путь значения.combobox - Плоский поиск не сохраняет пошаговый просмотр иерархии.multi-select - Multi Select работает с плоским набором и теряет отношения родителей и потомков.
Причина. Иерархия осталась за каноном целиком: правила обхода уровней, частичного выбора и наследования задаёт продукт. Канон даёт плоские поля выбора, дерево собирается поверх них.
Показать сводку кампании с продуктовой метрикой, статусом и локальными действиями.
business-specific-dashboard-block
Контекст
- Состав зависит от доменной модели кампании.
- Другие продукты не разделяют те же данные и действия.
Выбрать: product-local:campaign-summary
Не выбирать
application-shell - Глобальный каркас не должен поглощать бизнес-виджеты страницы.form - Паттерн ввода не описывает продуктовую сводку.
Причина. Повторяется бизнес-композиция одного продукта, а не переносимый контракт дизайн-системы.