Решения о границах канона

Собственный контракт становится юнитом или компонентом. Паттерн описывает, как сущности работают вместе. Композиция, зависимая от данных одного продукта, остаётся в этом продукте.

Что считать частью канона

  1. Есть ли у сущности собственные состояния, семантика или повторяемый API?

    Юнит или компонент
    Да. Юнит или компонент можно проверить отдельно от окружающего экрана.
    Паттерн
    Нет. Поведение возникает только при координации частей.
    Продуктовая деталь
    Нет. Повторяется разметка конкретной бизнес-задачи.
  2. Нужно ли зафиксировать порядок и отношения нескольких компонентов?

    Юнит или компонент
    Нет. Самостоятельная сущность сохраняет смысл без соседних частей.
    Паттерн
    Да. Правило задаёт композицию и последовательность.
    Продуктовая деталь
    Да, но отношения зависят от одного продукта.
  3. Определяются ли части навигацией, данными или ролями конкретного продукта?

    Юнит или компонент
    Нет. Публичный контракт переносится между продуктами.
    Паттерн
    Только содержимое; структура решения остаётся переносимой.
    Продуктовая деталь
    Да. Без продуктового контекста сущность теряет смысл.
  4. Перенесётся ли решение без копирования маршрутов, терминов и бизнес-логики?

    Юнит или компонент
    Да, как автономный юнит или компонент.
    Паттерн
    Да, как схема отношений с заменяемым содержимым.
    Продуктовая деталь
    Нет. В другом продукте решение потеряет исходный смысл.
  5. Повторяется ли решение и можно ли отличить его контракт?

    Юнит или компонент
    Повторяются API, семантика и проверяемые ограничения; интерактивные состояния обязательны только там, где есть взаимодействие.
    Паттерн
    Повторяются роли, порядок и правила композиции.
    Продуктовая деталь
    Пока повторяется только внешний каркас одного решения.

Принятые решения

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 - Паттерн ввода не описывает продуктовую сводку.

Причина. Повторяется бизнес-композиция одного продукта, а не переносимый контракт дизайн-системы.