Поле ввода — один из самых частых элементов интерфейса. Оно встречается в формах авторизации, поиске, настройках и чатах. Без хорошо продуманного компонента легко потерять консистентность и замедлить разработку.
Мы уже научились создавать кнопки с состояниями и размерами. Теперь применим те же принципы к полю ввода. Главное — не просто нарисовать, а создать гибкий, переиспользуемый компонент, который легко адаптировать под разные сценарии.
Базовая структура поля ввода
Начнём с простого: создадим контейнер с автолейаутом (Auto Layout). Это будет основа нашего компонента.
- Создайте фрейм и включите автолейаут (горизонтальное направление).
- Примените внутренние отступы через переменные, например:
spacing/md(16px) — для горизонтальных отступовspacing/sm(8px) — для вертикальных
- Добавьте обводку — используйте семантический токен, например
border/default, который ссылается наneutral/300. - Скругление угла:
radius/sm(4px).
Теперь добавьте текстовое поле:
- Вложите текстовый слой внутрь контейнера.
- Выровняйте по центру (вертикально и горизонтально).
- Примените типографические переменные:
text/body,font/primary,line-height/md.
Совет: не задавайте фиксированную ширину. Пусть автолейаут управляет размером — это сделает поле адаптивным.
Вложенные иконки: как и зачем
Теперь добавим иконки слева и справа. Это может быть, например, лупа в поиске или крестик для очистки.
Здесь важно понимать, что вложенная иконка — это не просто SVG-файл, а экземпляр компонента. Это позволяет:
- Менять цвет через переменные
- Управлять размером
- Быстро заменять иконку в разных состояниях
Как добавить иконку:
- Импортируйте SVG-иконку и превратите её в компонент (например,
Icon/Search,Icon/Clear). - Вставьте её в левую часть поля ввода.
- Установите размер через переменную, например
icon/md(20px). - Цвет задайте через
fillи переменнуюicon/primary.
Повторите для правой иконки.
Важно: установите для иконок режим
Hugв автолейауте, а для текстового поля —Fill. Это обеспечит правильное поведение: иконки не будут растягиваться, а текст — займёт всё свободное пространство.
Состояния: от базового до интерактивного
Мы уже работали с состояниями на примере кнопок: hover, active, disabled. Теперь расширим эту логику на поле ввода.
Ключевые состояния:
| Состояние | Визуальные изменения |
|---|---|
Default | Стандартная обводка, нет иконки справа |
Focus | Обводка меняет цвет, появляется тень |
Error | Красная обводка, иконка ошибки, подсказка |
Success | Зелёная обводка, иконка успеха |
Disabled | Серая обводка, прозрачный текст |
Состояние фокуса — особенно важно. Оно показывает пользователю, что поле активно. В Next.js-приложениях это критично для UX и доступности.
Как реализовать:
- Превратите фрейм в компонент.
- Добавьте булевы свойства:
hasLeftIconhasRightIconisFocusedhasErrorhasSuccessisDisabled
- Создайте варианты, комбинируя свойства.
Например:
Default→isFocused = false,hasError = falseFocus→isFocused = trueError→hasError = true,hasRightIcon = true(и подставьте иконку ошибки)
Лайфхак: используйте режимы переменных (например,
Light/Dark), чтобы поле корректно отображалось в обеих темах. Это особенно важно для стартапов, где важна современная визуальная подача.
Практический пример: поле поиска
Создадим конкретный кейс — поле поиска с иконками:
- Базовое поле с автолейаутом
- Левая иконка:
Icon/Search, цветicon/secondary - Правая иконка:
Icon/Clear, появляется только при вводе текста - Состояния:
Focus: обводкаprimary/500, теньshadow/focusError: если введён невалидный запрос — обводкаdanger/500, иконкаIcon/Error
Такой компонент можно использовать в Next.js-приложении для поиска курсов, как в вашем стартапе.
Упражнение
Создайте поле ввода электронной почты с такими требованиями:
- Ширина — подстраивается под контейнер
- Автолейаут — включён
- Иконка слева:
Icon/Email - При фокусе: обводка
primary/500, тень - При ошибке: обводка
danger/500, иконкаIcon/Error, подсказка "Введите корректный email"
Проверьте, что:
- Используются переменные для цветов, отступов, размеров
- Иконки — вложенные компоненты
- Состояния переключаются через варианты
Подводим итог
Мы создали гибкий компонент поля ввода, который:
- Использует автолейаут для адаптивности
- Применяет дизайн-токены для консистентности
- Поддерживает вложенные иконки как переиспользуемые элементы
- Реализует ключевые состояния, включая состояние фокуса
Теперь вы можете быстро создавать любые формы — от авторизации до настроек профиля.
Что дальше?
Поля ввода часто используются вместе с другими интерактивными элементами — например, чекбоксами и радиокнопками.
В следующей теме мы создадим компоненты чекбоксов и радиокнопок, используя ту же логику: автолейаут, варианты, вложенность и состояния. Вы увидите, как легко масштабировать дизайн-систему, когда основа уже заложена.
Готовы к следующему шагу? Это восхитительно! 💡