Design System  /  Components  /  Forms

Forms

Формы — место, где интерфейс просит. Лейбл сверху, outline 40 px, валидация on-blur для формата, on-submit для логики. Одна колонка по умолчанию. Текст подсказки лучше извинения.

Не спрашиваем больше, чем нужно. Каждое поле — цена. Каждая звёздочка — цена. Если поле необязательно — скажи это словом «не обязательно». Если ошибка — объясни что именно не так и дай пример.

Анатомия поля

Лейбл сверху. Это стандарт web-форм: меньше eye-tracking, лучше для мобильных, проще выровнять. Подсказка — под инпутом, заранее. Ошибка — на её месте, с иконкой и конкретным объяснением.

— все элементы поля
Используем для уведомлений о продакшн-инцидентах.

Required vs optional

Помечаем опциональные, а не обязательные (подход Adam Silver). В большинстве форм большинство полей — обязательные, логичнее помечать исключения. Меньше визуального шума.

Text input

Outlined-стиль: 1 px бордер, белый фон, radius 8. Один размер по умолчанию — 40 px. Дополнительный .sm 32 px для плотных форм Analyst.

Размеры

— sm 32 / md 40 / lg 48

Состояния

— default / focus / disabled / invalid / success
Кольцо фокуса — 3 px rgba(17,17,17,0.08).
Похоже, домен неполный. Попробуйте ivan@aist.tech.
Email подтверждён.

С иконкой / addon

— иконка слева, clear-кнопка справа, addons
https://
₽ / мес

Textarea

Тот же стиль, что и input. min-height 88 px, resize vertical. Padding 10 × 12.

— textarea с подсказкой
Чем конкретнее, тем точнее посчитаем оценку.

Select

Используем нативный <select> для простого выбора (страна, валюта, язык). Кастомный dropdown — только там, где нужны иконки, поиск или богатые опции. Native всегда доступнее и на mobile открывает родную карусель.

— нативный select

Native vs custom — когда что

Если…Используй
Простой список (<15 опций, текст)Native select
Поиск нужен или 50+ опцийCustom (combobox)
Иконки / описание у опцииCustom dropdown
Multi-selectCustom + chips

Checkbox / Radio

Стандартные — квадрат для checkbox, круг для radio. 18 × 18, бордер 1.5 px. Заполняются foreground при active.

— checkbox: default, hover, checked, indeterminate, disabled
— radio: выбор одного из нескольких

Карточный выбор

Когда выбор — это решение, а не галка. Pricing, онбординг, выбор тарифа. Те же radio-семантика, но вся карточка кликается.

— pricing-выбор

Switch

Только для настроек, которые применяются мгновенно — автосохранение, тема, уведомления. Не используем как «чекбокс на стероидах» в формах.

— настройки уведомлений

Switch vs Checkbox

SwitchПрименяется сразу. «Включить тёмную тему» — и тема меняется. Без Submit-кнопки.
CheckboxЧасть формы. Применится после Submit. «Я согласен с условиями».

File upload

Drag-and-drop зона + клик для выбора. Под ней — список загруженных файлов с возможностью удалить.

— загрузка прайс-листа
Перетащите файлы или выберите на диске
PDF, DOCX, XLSX — до 10 MB
price-2026-q1-final.xlsx 1.2 MB
contract-acme-2025.pdf 340 KB

Валидация

Mix-стратегия. Не дёргаем юзера, пока он печатает.

КогдаЧто проверяем
On blur (юзер ушёл из поля)Формат — email, телефон, дата, URL. Дать обратную связь немедленно.
On submitОбязательность, бизнес-правила, кросс-полевые правила («password = confirm»).
On input (live)Только помощь — счётчик символов, индикатор силы пароля. Не ошибки.
Снять ошибкуКак только юзер исправил, до blur. Иначе он видит ошибку, исправляя её.

Сообщение ошибки — шаблон

DO — конкретно + пример

«Похоже, домен неполный. Попробуйте ivan@aist.tech

«Пароль должен содержать минимум 8 символов. Сейчас 5.»

DON'T — обвинение

«Invalid input. Try again.»

«Вы ввели неправильный пароль.»

Раскладка форм

Одна колонка по умолчанию. Это самый эффективный формат — eye-tracking прямой, completion rate выше. Две колонки — только для связанных пар: «Имя / Фамилия», «Город / Индекс», «Дата С / по».

— настройки профиля

Сетка с label слева — для settings

На широких settings-страницах хорошо работает «split» — слева заголовок секции и описание, справа — поля. Лейблы полей по-прежнему сверху над инпутом, но вся секция получает контекст.

— /settings/general

Организация

Имя организации видят все участники. Slug — часть URL и API-ключей.

aist.tech /
Изменение slug сломает старые ссылки и интеграции.

Регион данных

Где физически хранятся ваши данные. Сменить можно только при пустом workspace.

Длинные формы

Когда полей много — разбиваем. Три паттерна, выбирай по контексту.

ПаттернКогда
Одна страница (single-page)Settings. Юзер хочет видеть всё и скроллить. Sticky-сабменю слева — бонус.
Step-by-step (wizard)Онбординг, регистрация, оплата. Юзер не знает структуру — ведём его.
Tabs / accordionПрофиль организации, конфигурация продукта. Логически независимые группы.

Wizard — stepper сверху

— регистрация, шаг 2 из 3
1Аккаунт
2Организация
3Подписка

Voice / Copy

Не такТак
First NameИмя
Required field(ничего — по умолчанию обязательно)
SubmitСохранить · Создать · Отправить · Подтвердить
Please enter a valid emailПохоже, домен неполный.
Are you sure?Удалить «Voice Operator»? Это нельзя отменить.

Принципы

Tokens reference

ElementPropertyValue
Inputheight (sm / md / lg)32 / 40 / 48 px
Inputradius / border8 / 1 px #E0E0E0
Inputfocus ring3 px rgba(17,17,17,0.08)
Input invalidfocus ring3 px rgba(220,38,38,0.12)
Labelfont / size / weightCommissioner 13/500
Helpfont / sizeCommissioner 12, muted
Errorfont / sizeCommissioner 13, destructive
Checkbox / Radiosize18 × 18 px, border 1.5
Switchtrack / thumb36 × 20 / 16 × 16
File-dropborder / padding1.5 dashed / 24 px
Field gaplabel↔input / field↔field6 / 20 px
Связанные: States (validation, error copy) ·  Buttons (submit / cancel) ·  Navigation (search input)
К хабу: Design System →