← Вернуться к кейсу PLANT
PLANT UI
Copy library Ready to build
DESIGN SYSTEM · 2026

Выращиваем
хороший интерфейс.

Компонентная система интернет-магазина растений, собранная из трёх мобильных референсов и готовая к масштабированию.

38компонентов
4уровня токенов
AAконтраст
01 · FOUNDATION

Основа системы

Палитра, типографика и ритм задают единое ощущение во всех точках контакта.

Цветовая палитра

Core tokens

Назначение. Восемь опорных цветов, по одному на смысл. Leaf 600 — действие и подтверждение, Sage 300 — выбор и рамки, Canvas и Sand — фоны разной глубины, Ink и Muted — два уровня текста, Sun — рейтинг и скидка, Bloom — новизна. Близкие зелёные не взаимозаменяемы: Leaf 600 означает «действие», Leaf 700 — «наведение на действие». Полная таблица токенов с назначением и контрастом — в разделе Правила системы.

Типографика

Manrope
Aa
Display64 / 1.05 · ExtraBold
Aa
Heading32 / 1.15 · Bold
Aa
Body16 / 1.6 · Regular
Aa
Caption12 / 1.4 · SemiBold

Назначение. Одна гарнитура на всю систему — Manrope, четыре смысловых уровня. Display только для первого экрана, Heading для разделов, Body для всего остального, Caption для подписей и счётчиков. Пятого размера в системе нет: если текст «не помещается» между уровнями, менять нужно длину текста, а не размер. Реальные значения, которыми пользуются компоненты, приведены в разделе Правила системы.

Радиусы и тени

Shape
12
18
28
999
Surface 0 8 32 / 6%
Float 0 16 48 / 10%

Назначение. Радиус кодирует размер элемента. Здесь показаны четыре ступени из одиннадцати: 12 px — мелкие управляющие элементы, 18 px — средние блоки, 28 px — крупные поверхности, 999 px — бейджи и переключатели. Полная шкала с назначением каждой ступени — в разделе Правила системы. Две тени различают уровни: Surface — элемент лежит на странице, Float — элемент над ней (нижняя навигация, всплывающие карточки). Третьего уровня в системе нет, и он не нужен: выше плавающего слоя находится только тост.

02 · ACTIONS

Кнопки и действия

Зелёный резервируем для ключевого действия, контур — для альтернативы.

Button

5 states · 3 sizes

Назначение. Запускает действие на экране. Зелёная заливка — единственный первичный акцент в блоке: если на экране две кнопки Primary, значит иерархия действий не определена. Secondary — альтернатива того же уровня, Ghost — необязательное действие, которое не должно перетягивать внимание.

Оригинал из макета

Кнопка «Войти» с экрана входа.

Спецификация
ПараметрЗначение
Варианты.btn-primary — заливка --green-600, белый текст, тень 0 8 18 rgba(40,106,53,.18); .btn-secondary — прозрачный фон, обводка --line; .btn-ghost — без фона и обводки, текст --green-600
РазмерыSmall 36 px / радиус 12 · Medium 48 px / радиус 14 · Large 58 px / радиус 18. Ширина — по содержимому, горизонтальный padding 14 / 20 / 26 px
СостоянияDefault · Hover (--green-700 + сдвиг на −1 px) · Focus (системное кольцо браузера, собственного стиля нет) · Disabled (#c9cec7, текст #f5f5f5, cursor:not-allowed). нет Loading
ИконкаНеобязательная, 18 px, справа от текста, gap: 10px. Наследует цвет текста через currentColor
ПоведениеТекст не переносится — кнопка растёт по содержимому. На ширине ≤ 680 px кнопки в ряду получают flex:1 и min-width:145px, то есть занимают строку целиком
В макете«Войти» на экране входа, «Смотреть» в промо-баннере каталога, «В корзину» в карточке товара

Chips & badges

Filter / Status
Хит продажНовинка−25%Нет в наличии

Назначение. Chip — фильтр каталога с одиночным выбором: активен ровно один, счётчик показывает количество товаров в категории. Badge — неинтерактивная метка состояния товара; она сообщает, но не кликается. Разница важна: chip меняет выдачу, badge только описывает.

Оригинал из макета

Пара состояний: обычный и выбранный. Бейджа в листе компонентов нет — он существует только внутри карточки товара.

Спецификация
ПараметрЗначение
Chip · состоянияDefault (фон --canvas, прозрачная рамка) · Active (--sage-100 + рамка --sage-300, текст --green-700). нет Hover и Disabled
Chip · поведениеКлик снимает active со всех остальных чипов группы — выбор одиночный, ни один вариант не оставляет выдачу без фильтра. Фактическая фильтрация списка в прототипе не реализована
Badge · тонаgreen — «Хит», подтверждённый спрос · purple — «Новинка» · yellow — скидка, единственный тон с числом · neutral — «Нет в наличии», отсутствие действия
Badge · размерВысота по содержимому, padding 5 / 10 px, радиус 999px, текст 10 px / 700. Ширина max-content — бейдж не растягивается по контейнеру
Контрастgreen 5.62 : 1 · purple 6.28 : 1 · yellow 6.90 : 1 · neutral 4.49 : 1 — последний на границе AA, крупный текст на нём недопустим
ОграничениеТон бейджа задаётся классом, а не токеном: purple, yellow и neutral объявлены литеральными цветами в styles.css. См. раздел «Токены»
03 · FORMS

Поля и выбор

Крупные зоны касания, спокойные обводки и явная обратная связь.

Input

Interactive

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

Оригинал из макета

Пара состояний: пароль скрыт и пароль показан. Обратите внимание на иконку — в макете она меняется.

Спецификация
ПараметрЗначение
РазмерМинимальная высота 68 px, радиус 16 px, внутренний отступ 16 px, gap: 14px между иконкой, содержимым и действием
АнатомияИконка типа 22 px (--muted) → лейбл 10 px (--muted) + значение 15 px (--ink) → кнопка действия
СостоянияDefault · Focus-within (рамка --green-500 + кольцо 3 px rgba(40,106,53,.09)) · Success (.input-success: рамка #82ad6b, фон rgba(167,196,138,.08), подпись справа). нет Error и Disabled
ПоведениеКнопка глаза переключает type поля между password и text. Иконка при этом не меняется — расхождение с макетом компонентов, где закрытый глаз соответствует скрытому паролю
ВалидацияВ прототипе не реализована: «Применён» — статичное состояние показа, проверки промокода нет. Правила валидации и тексты ошибок нужно согласовать до вёрстки
ДоступностьПоле обёрнуто в <label>, поэтому клик по лейблу и иконке ставит фокус в поле. Отдельного видимого стиля :focus-visible у кнопки-глаза нет

Selection

Radio / Switch

Назначение. Size option — выбор размера растения: один из трёх, цена меняется вместе с выбором, поэтому вариант несёт и параметр, и стоимость. Switch — мгновенное переключение настройки без кнопки «Сохранить». Оба элемента выбирают, но switch применяет изменение сразу, а size option только готовит заказ.

Оригинал из макета

Пара состояний варианта размера. Переключателя в листе компонентов нет.

Спецификация
ПараметрЗначение
Size option · составБуква размера (800), диапазон высоты (--muted), цена, галочка-индикатор 20 px в правом верхнем углу
Size option · состоянияDefault (рамка --line) · Selected (рамка --green-500, фон rgba(167,196,138,.09), показана галочка). Выбор одиночный и обязательный — пустого состояния нет
Switch · размерыДорожка 44 × 25 px, кружок 19 px, ход 19 px, длительность 0.2 s. Off — #d7dbd6, On — --green-600
ПоведениеКлик по варианту размера снимает выбор с остальных. Switch управляется нативным <input type="checkbox">, скрытым визуально, — состояние доступно с клавиатуры и читается скринридером
АдаптивНа ширине ≤ 680 px три варианта размера перестраиваются в вертикальные строки с сеткой 35px 1fr auto
Не реализованоНедоступный размер (нет в наличии) и подтверждение сохранения настройки. требует проработки
05 · CARDS

Контентные карточки

Основной носитель изображения, цены, рейтинга и быстрого действия.

Хит
Комнатное растение

Монстера Делишиоза

★ 4,9 (128)
1 490 ₽
New
Для начинающих

Монстера Минима

★ 4,8 (96)
1 190 ₽

Спецификация карточек

Product card · Care card

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

Оригинал из макета

Карточка товара и два её интерактивных элемента парами.

Спецификация
ПараметрЗначение
Product · анатомияИзображение 260 px (бейдж слева-сверху, избранное справа-сверху) → категория 15 px --muted → название → рейтинг → строка цены с кнопкой быстрого добавления
Product · состоянияИзбранное: Default / Active (#f1d9dc + #a03643, иконка получает заливку). Быстрое добавление: Default (--sage-100) / Added (--green-600, белая иконка). нет Loading и «Нет в наличии»
Product · поведениеИзбранное переключается и показывает тост «Добавлено в избранное» / «Удалено из избранного». Быстрое добавление необратимо в пределах сессии: класс added снимается только перезагрузкой — отмена действия не предусмотрена
Care · формаМинимальная высота 390 px, фото под градиентом rgba(40,106,53,.87), содержимое прижато к нижнему краю, белый текст, ссылка со временем чтения
РейтингЗвезда цветом --sun (контраст к белому 1.77 : 1 — декоративный). Значение продублировано текстом, поэтому информация не теряется при слабом зрении
АдаптивСетка 3 → 2 колонки на ≤ 980 px (care card занимает всю ширину) → 1 колонка на ≤ 680 px
06 · COMMERCE

Покупка и доверие

Составные блоки для выбора варианта, количества и подтверждения ценности.

Order action

Sticky-ready
1

Безопасная оплата

Назначение. Составной блок покупки: количество и добавление в корзину в одной строке, потому что это одно решение пользователя, а не два. Цена внутри кнопки пересчитывается сразу — сумма видна до нажатия, а не после перехода в корзину.

Оригинал из макета

Счётчик количества на всех четырёх значениях и состояние «В корзине», которого на сайте нет.

Спецификация
ПараметрЗначение
StepperКнопки 45 × 50 px, значение по центру с минимальной шириной 24 px, рамка --line, радиус 14 px
Границы значенияМинимум 1 — уменьшение ниже единицы игнорируется. Максимум в прототипе не задан; в макете компонентов «плюс» на значении 4 показан неактивным, поэтому верхний предел нужно согласовать со складскими остатками
Пересчёт ценыБазовая цена 1 490 ₽ умножается на количество и форматируется локалью ru-RU — разряды разделяются неразрывным пробелом
КнопкаЗанимает оставшуюся ширину (flex:1), содержимое разнесено по краям: иконка и подпись слева, сумма справа. Добавление увеличивает счётчик корзины на выбранное количество и показывает тост
СостоянияDefault. В макете компонентов есть состояние «В корзине» с галочкой и суммой — в прототипе оно не реализовано. нет Loading и ошибки оплаты
АдаптивНа ≤ 680 px строка разворачивается вертикально: stepper растягивается по ширине, кнопка получает высоту 56 px

Trust banner

Info action
◷
Доставим завтраБесплатно от 3 000 ₽

Назначение. Trust banner снимает главное возражение при покупке живого растения — «а если оно приедет сломанным». Это интерактивный блок: шеврон справа обещает продолжение, поэтому он обязан вести к условиям замены. Delivery — статичная справка о сроке и пороге бесплатной доставки, она ничего не обещает по нажатию и поэтому не кликается.

Спецификация
ПараметрЗначение
Trust · формаКнопка во всю ширину, рамка rgba(40,106,53,.22), градиент от rgba(167,196,138,.12) к прозрачному, радиус 18 px, эмодзи-иконка 28 px
Trust · поведениеЦель перехода в прототипе не задана — обработчика у баннера нет. требует уточнения куда ведёт нажатие: условия замены, страница гарантии или раскрывающийся блок
Delivery · формаИконка 38 px на подложке --sage-100, срок основным цветом, порог бесплатной доставки — --muted
ДанныеСрок «завтра» и порог «3 000 ₽» зашиты в разметку. При подключении к бэкенду обе величины становятся динамическими и зависят от региона
СостоянияТолько Default у обоих блоков. Наведение, нажатие и фокус у trust banner не оформлены, хотя элемент кликабелен
07 · SHOWCASE

Собранный экран

Токены и компоненты вместе — адаптивный hero для будущего сайта.

Новая коллекция

Дом, в котором
легко дышится.

Живые растения с доставкой и понятными советами по уходу.

01

Монстера ДелишиозаНеприхотлива · от 1 490 ₽

Спецификация hero

Composition

Назначение. Первый экран магазина: обещание, одно первичное действие и одно необязательное. Композиция намеренно сложная — текст лежит поверх фотографии, а карточка-подпись вынесена за поток. Это единственное место в системе, где допускается наложение; в Auto Layout такую компоновку переводить нельзя, она рассыплется.

Спецификация
ПараметрЗначение
РазмерМинимальная высота 580 px, радиус 34 px, внутренний отступ clamp(30px, 6vw, 72px), фото center / cover
Заголовокclamp(42px, 6vw, 76px), интерлиньяж 1.02, трекинг −0.05em. Второе слово — Georgia курсивом цветом --green-600: единственное место, где система выходит за пределы Manrope
Hero noteАбсолютное позиционирование в правом нижнем углу, подложка из 94 % белого с backdrop-filter: blur(16px) и тенью для отрыва от фотографии. Текст набран токенами --ink-fixed и --muted-fixed, которые не переворачиваются вместе с темой: подложка карточки остаётся светлой в обеих темах. На ≤ 680 px растягивается по ширине с отступом 18 px
Читаемость текстаСветлая тема ≤ 680 px: сверху добавляется градиент от rgba(247,245,239,.98) — текст перестаёт лежать на листьях. Тёмная тема: слева накладывается rgba(18,23,20,.72). Контраст зависит от фотографии, поэтому при замене изображения его нужно проверять заново
Адаптив≤ 980 px фон смещается к 62 % по горизонтали. ≤ 680 px высота 640 px, содержимое прижимается к верху, действия выстраиваются колонкой
ОграничениеФон — растровое изображение 1.9 МБ без srcset. Для продакшена нужны адаптивные размеры и формат WebP / AVIF
08 · GUIDELINE

Правила системы

То, что нельзя показать одним компонентом: шкалы, сетка, именование, состояния и доступность.

Токены

8.1 · Единый источник значений

Компонент не содержит литеральных цветов и радиусов — только переменные. Тему меняют переопределением токена, а не правкой селектора компонента. Пятьдесят четыре токена, и каждый используется хотя бы один раз. Значения, переопределения тёмной темы и число обращений в таблицах ниже прочитаны из styles.css, а не набраны руками: раздел, который ловит расхождение между шкалой и разметкой, не должен сам от неё отставать. В переносимой библиотеке assets/ui-kit/css/tokens.css базовые значения объявлены с префиксом --plant-.

Палитра. 13 токенов.

ТокенЗначениеТёмная темаНазначениеОбращений
--green-700#1F562A—Наведение на первичную кнопку, текст на светло-зелёной подложке7
--green-600#286A35—Первичное действие, активное состояние, акцентный текст и иконки28
--green-500#348642—Обводка поля в фокусе и выбранного варианта размера2
--green-400#55A762—Индикатор готовности в верхнем баре1
--sage-300#A7C48A—Рамка активного фильтра, акцент документации в тёмной теме6
--sage-100#E9F0DF#273729Подложка бейджей, чипов, иконочных кнопок и блоков-подсказок8
--canvas#F7F5EF#121714Фон страницы и невыбранного чипа9
--surface#FFF#1A211CФон карточек, блоков и полей6
--sand-100#EEE9DD#242B26Тёплая половина градиента первого экрана1
--nav-bg#183D24—Фон боковой навигации — темнее любого зелёного из палитры1
--nav-mark#DFEAD3—Подложка знака бренда в навигации1
--sun#F4B942—Звезда рейтинга. Декоративный цвет: значение продублировано текстом2
--bloom#D5B1FF—Акцент новизны в палитре2

Текст и контент. 10 токенов.

ТокенЗначениеТёмная темаНазначениеОбращений
--ink#171A18#F2F4EFОсновной текст и заголовки17
--muted#6F746F#A4AAA4Вторичный текст, подписи, неактивные пункты навигации39
--on-dark#FFFFFF—Текст и иконки на брендовой или тёмной подложке — не переворачивается12
--ink-fixed#171A18—Название на карточке-подписи поверх фотографии1
--muted-fixed#4F544F—Вторичная строка там же. Подложка карточки светлая в обеих темах1
--on-photo#171A18#FFFFFFЗаголовок прямо на фотографии — переворачивается вместе с затемнением2
--on-photo-soft#555B56#C0C7C1Текст под ним1
--accent-soft-ink#1F562A#A7C48AАкцент на светло-зелёной подложке: код, ссылки оглавления2
--link#286A35#A7C48AСсылка в таблицах и описаниях документации3
--link-hover#1F562A#FFFFFFОна же при наведении1

Состояния и чипы. 16 токенов.

ТокенЗначениеТёмная темаНазначениеОбращений
--disabled-bg#C9CEC7—Фон отключённой кнопки1
--disabled-ink#F5F5F5—Текст на ней1
--switch-off#D7DBD6—Дорожка выключенного переключателя1
--success-line#82AD6B—Рамка поля с успешно применённым значением1
--danger#A03643—Активное избранное2
--danger-soft#F1D9DC—Его подложка1
--chip-ok-bg#E9F0DF—Чип «выполнено»: фон. 5.62 : 11
--chip-ok-ink#286A35—Он же: текст1
--chip-new-bg#EFE3FF—Чип «новинка»: фон. 6.28 : 11
--chip-new-ink#6D36A5—Он же: текст1
--chip-sale-bg#FFE06B—Чип скидки: фон. 6.90 : 11
--chip-sale-ink#5A4700—Он же: текст1
--chip-off-bg#EBEDEB—Чип «нет» и «не применимо»: фон. 4.49 : 1 — на границе AA2
--chip-off-ink#686D68—Он же: текст2
--chip-warn-bg#FFE6CF—Чип «требует внимания»: фон. 5.69 : 11
--chip-warn-ink#8A4A12—Он же: текст1

Шкала радиусов. 11 ступеней.

ТокенЗначениеТёмная темаНазначениеОбращений
--r-2xs4px—Образец цвета в таблице токенов, инлайн-код3
--r-xs10px—Индикатор внутри элемента, вложенное изображение2
--r-sm12px—Мелкий управляющий элемент: пункт меню, малая кнопка, ссылка-чип7
--r-ctl14px—Кнопка, чип, иконочная кнопка, степпер7
--r-field16px—Поле ввода, вариант размера, образец цвета4
--r-md18px—Средний блок: подсказка, баннер, таблица, крупная кнопка10
--r-card24px—Карточка товара и плавающая панель3
--r-lg28px—Крупная поверхность: блок витрины2
--r-xl34px—Собранный экран1
--r-pill999px—Бейдж, переключатель, тост5
--r-circle50%—Круглые элементы: аватар, индикатор, кнопка избранного9

Структура. 4 токенов.

ТокенЗначениеТёмная темаНазначениеОбращений
--linergba(23,26,24,.12)rgba(255,255,255,.11)Все границы и разделители26
--shadow0 18px 50px rgba(28,45,29,.08)0 18px 50px rgba(0,0,0,.25)Плавающий уровень: нижняя навигация, hero, поднятая кнопка3
--sidebar260px—Ширина боковой навигации; от неё считается отступ основной колонки2
--figma-canvas#F6F8F6—Фон артборда в экспортах из Figma2
Как шкала стала шкалой

Здесь было три расхождения. Токены --sand-100, --sand-200 и --bloom объявлялись и ни разу не вызывались. Шкала радиусов состояла из четырёх ступеней, а в стилях встречалось тринадцать числовых значений. Вне блока :root было задано семнадцать литеральных цветов. Сейчас литералов цвета вне токенов ноль — двадцать семь вхождений переведены на переменные. --sand-200 удалён: назначения у него не было. --sand-100 подключён к градиенту первого экрана через color-mix, --bloom — к своему образцу в палитре. Радиусы сведены к одиннадцати именованным ступеням, сорок одно объявление переведено на них, близкие значения слиты: 11 → 12, 13 → 14, 17 → 18, 22 → 24, а 99px и 999px стали одним --r-pill. Отдельная находка: #A9CA89 в боковой панели отличался от --sage-300 на шесть единиц — это был не цвет, а опечатка, теперь один токен. Вне шкалы намеренно остались альфа-значения rgba() и органический радиус декоративного круга на первом экране.

Почему четыре образца в палитре остались литералами

Образцы Leaf 600, Sage 300, Sun и Bloom читают значение из токена: style="--swatch:var(--bloom)". Canvas, Sand 100, Ink и Muted оставлены литералами намеренно — тёмная тема их переопределяет, и образец, привязанный к такому токену, показывал бы в тёмной теме не тот цвет, который подписан под ним. Образец документирует объявленное значение, а не текущее состояние темы.

Отступы и сетка

8.2 · Ритм

Шаг системы — 8 px, с двумя половинными ступенями для плотных мест. Отступ выбирают по смыслу расстояния, а не по внешнему виду: 4 px разделяет части одного элемента, 8–12 px — соседние элементы внутри блока, 16–24 px — блоки между собой, 32–48 px — смысловые части экрана.

space-1Внутри одного элемента: лейбл и значение, подпись под иконкой4px
space-2Иконка и текст в кнопке, части бейджа8px
space-3Соседние управляющие элементы в ряду12px
space-4Внутренний отступ поля и мелкой карточки16px
space-5Блоки внутри карточки, промежуток между колонками24px
space-6Внутренний отступ крупного блока32px
space-7Разделение смысловых частей экрана48px
Правило сеткиЗначениеКомментарий
Боковая навигация260 px, фиксированнаяОсновная колонка получает отступ слева ровно на эту величину
Поля разделаclamp(24px, 6vw, 88px)Растут вместе с окном и упираются в 88 px на широком экране
Вертикальный ритм разделов96 px, на мобильной ширине 68 pxРазделы отделены линией --line, а не только расстоянием
Колонки2 (.split-grid), 3 (.cards-grid), 4 (.swatch-grid)Промежуток 20 px между колонками, 12 px между образцами цвета
Брейкпоинты980 px · 680 px · 520 pxНе диапазоны устройств, а точки, где текущая раскладка ломается
Отступ якоряscroll-margin-top: 70pxКомпенсирует липкий верхний бар при переходе по ссылке

Типографика

8.3 · Реальные значения

Одна гарнитура — Manrope, запасная Arial. Карточка в разделе «Основа системы» показывает номинальную шкалу; ниже — размеры, которыми фактически пользуются компоненты. Заголовки набираются плотно, с отрицательным трекингом, текст — свободно: контраст между ними и создаёт ощущение системы.

РольРазмер и интерлиньяжНачертаниеГде применяется
Displayclamp(50px, 6.4vw, 94px) / 0.98, трекинг −0.055em800Заголовок первого экрана
Heroclamp(42px, 6vw, 76px) / 1.02, трекинг −0.05em800Заголовок собранной композиции
Headingclamp(32px, 4vw, 50px) / 1.05, трекинг −0.04em700Заголовки разделов
Subheading25 px / 1.18700Заголовок контентной карточки
Block title16 px700Заголовки блоков и названия товара
Body L17–18 px / 1.5400Подзаголовок первого экрана и hero
Body15 px / 1.55400Основной текст, значения полей, пункты навигации
Caption11–13 px / 1.4–1.6400Подписи, рейтинг, вторичный текст карточек
Overline9–11 px, трекинг 0.08–0.18em700, прописныеМетки разделов, статус, лейблы полей, бейджи
АкцентGeorgia, курсив, цвет --green-600400Второе слово в заголовках Display и Hero — единственное исключение из Manrope
Внешняя зависимость

Manrope подключается с fonts.googleapis.com. При открытии страницы без сети подставляется Arial: метрики отличаются, и заголовки с плотным трекингом становятся шире. Для передачи в разработку шрифт нужно положить рядом с проектом и подключить через @font-face.

Иконки

8.4 · Пятнадцать символов

Один встроенный SVG-спрайт, никаких иконочных шрифтов и внешних запросов. Все иконки нарисованы обводкой одной толщины и наследуют цвет текста через currentColor — поэтому одна и та же иконка работает и на светлом фоне, и внутри зелёной кнопки.

Оригинал из макета

Восемь иконок, нарисованных в макете. Остальные семь добавлены на витрине.

leaf
search
bag
heart
user
sun
moon
check
chevron
mail
lock
eye
arrow
menu
close
ПравилоЗначение
ХолстviewBox="0 0 24 24" у всех символов без исключения
Обводкаstroke: currentColor, толщина 1.8, скругления round, заливки нет
Размеры22 px по умолчанию · 18 px внутри кнопки · 16 px в ссылке карточки · 13–15 px в мелких индикаторах
ИсключениеАктивный пункт нижней навигации добавляет иконке заливку rgba(40,106,53,.13) — единственное место, где обводочная иконка становится залитой
ПодключениеСпрайт лежит первым элементом <body> и скрыт правилом .svg-sprite; ссылка — <use href="#i-имя">
ИменованиеПрефикс i- на витрине, plant- в переносимой библиотеке; далее существительное в единственном числе строчными буквами
Не покрытоНет иконок фильтра, доставки, полива и температуры, которые встречаются на мобильных экранах — там они нарисованы отдельно. расширить спрайт

Именование

8.5 · Три пространства имён

Имя обязано отвечать на вопрос «что это», а не «как выглядит». .btn-primary — это роль; .btn-green было бы описанием, и при смене палитры такое имя начинает врать. Правило одинаково действует и для слоёв макета, и для классов.

ПространствоШаблонПримерКомментарий
Классы витриныблок / блок-модификатор.btn, .btn-primary, .product-cardБез префикса: страница самостоятельная и ни с чем не соседствует
Классы библиотекиplant-блок__элемент--модификатор.plant-product__title, .plant-btn--primaryПрефикс обязателен: библиотеку копируют в чужой проект с Bootstrap или Tailwind
Состояние.active на витрине, .is-active в библиотеке.chip.active, .plant-bottom-nav .is-activeСостояние — отдельный класс, а не отдельный компонент
Идентификатор разделаСуществительное латиницей строчными#foundation, #commerce, #docsПопадает в адресную строку, поэтому не меняется после публикации
Иконкаi-имя / plant-имя#i-heartИмя описывает предмет, а не действие: heart, не favorite
Токен--группа-ступень--green-600, --space-4, --r-mdЧисло — ступень шкалы, а не значение в пикселях
Экран в макетеScreen / НазваниеScreen / КаталогСовпадает с конвенцией плагина Project 7
Компонент в макетеКатегория / Название, вариант Свойство=ЗначениеButton / Primary, State=HoverКатегория задаёт группировку в панели ассетов

Состояния

8.6 · Что есть и чего нет

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

КомпонентDefaultHoverВыбранFocusDisabledLoadingError
Buttonестьесть—браузерныйесть——
Icon buttonестьестьестьбраузерный———
Chipесть—есть————
Badgeестьне нуженне нуженне нуженне нужен——
Inputесть——есть———
Size optionесть—есть————
Switchесть—естьнативный———
Пункт навигацииестьестьесть——не нуженне нужен
Product cardесть——————
Избранноеесть—есть————
Быстрое добавлениеесть—есть————
Stepperесть—не нужен—только в макете——
Trust bannerесть——————
СостояниеЧто означает
DefaultИсходный вид, элемент доступен для взаимодействия
HoverКурсор над элементом. Только для указательных устройств — на телефоне это состояние недостижимо
ВыбранТекущий вариант, раздел или отметка пользователя. Сохраняется после того, как курсор ушёл
FocusЭлемент получил фокус клавиатуры. Обязателен для доступности
DisabledДействие недоступно; элемент не принимает ввод и не отправляет событий
LoadingВыполняется запрос; повторное нажатие заблокировано до ответа
ErrorЗначение не прошло проверку; сопровождается сообщением
Системный пробел

Loading и Error не реализованы нигде. Пока интерфейс статичен, это незаметно; как только появится сеть, оба состояния понадобятся сразу у всех действий — вход, добавление в корзину, применение промокода. Их стоит спроектировать до подключения бэкенда, а не по факту первой ошибки.

Доступность

8.7 · Измерено, а не заявлено

Контрастность посчитана по формуле WCAG 2.1 для всех сочетаний текста и фона, которые встречаются в системе. Порог AA — 4.5 : 1 для обычного текста и 3 : 1 для крупного (от 24 px или от 18.5 px полужирного).

СочетаниеКонтрастВердикт
Ink на Canvas — основной текст16.09 : 1AAA
Ink на Surface — текст карточек17.54 : 1AAA
Белый на Leaf 600 — первичная кнопка6.56 : 1AA
Белый на Leaf 700 — кнопка при наведении8.67 : 1AAA
Leaf 600 на Surface — акцентный текст и ссылки6.56 : 1AA
Muted на Surface — подписи в карточках4.77 : 1AA
Muted на Canvas — подписи на фоне страницы4.37 : 1ниже AA
Бейдж «Хит» — зелёный5.62 : 1AA
Бейдж «Новинка» — фиолетовый6.28 : 1AA
Бейдж скидки — жёлтый6.90 : 1AA
Бейдж «Нет в наличии» — нейтральный4.49 : 1на границе AA
Избранное в активном состоянии5.06 : 1AA
Карточка-подпись на фото: название15.87 : 1AAA
Карточка-подпись на фото: вторичная строка7.00 : 1AAA
Карточка-подпись на фото: номер5.93 : 1AA
Звезда рейтинга на белом1.77 : 1декоративная
Текст отключённой кнопки1.47 : 1вне требований
Тёмная тема: Ink на Canvas16.37 : 1AAA
Тёмная тема: Muted на Canvas7.65 : 1AAA
Тёмная тема: Leaf 600 на Sage 100 — бейдж «Хит», активный чип1.92 : 1не читается
Тёмная тема: Leaf 700 на Sage 100 — быстрое добавление1.46 : 1не читается
ПравилоКак выполнено
Зона касанияКнопка 48 px, поле 68 px, пункт нижней навигации ≈ 45 px. Иконочная кнопка 42 × 42 px — на 2 px меньше рекомендованных 44
Фокус клавиатурыСобственного стиля :focus-visible нет: виден только системный контур браузера. Поле ввода — исключение, у него есть :focus-within
Смысл без цветаВыбранный размер и активный фильтр помечены не только цветом: у размера появляется галочка, у чипа — рамка. Рейтинг продублирован числом
Подписи к иконкамУ иконочных кнопок есть aria-label. У пунктов нижней навигации подпись видна на десктопе и скрывается на мобильной ширине, оставляя иконку без текстовой альтернативы
Текст поверх фотографииКарточка-подпись hero лежит на подложке из 94 % белого и набрана фиксированными токенами. Три значения выше посчитаны для худшего случая — тёмного листа под карточкой. До правки подложка была 80 %, вторичная строка использовала --muted и давала 3.39 : 1, а в тёмной теме название карточки становилось почти белым на белом фоне
Анимацияprefers-reduced-motion: reduce отключает все переходы и плавную прокрутку
Тёмная темаПереключается вручную и запоминается в localStorage. Системная настройка prefers-color-scheme не учитывается — пользователь с тёмной ОС при первом заходе увидит светлую тему
СемантикаРазделы — <section>, карточки — <article>, навигация — <nav> с aria-label. Поля обёрнуты в <label>, поэтому клик по подписи ставит фокус в поле
Тёмная тема переопределяет фон, но не акцент

В тёмной теме --sage-100 становится #273729, а --green-600 и --green-700 остаются прежними. Все пары «зелёный текст на светло-зелёной подложке» — бейдж «Хит», активный чип, кнопка быстрого добавления — падают до 1.92 : 1 и 1.46 : 1, то есть перестают читаться. Правка на одну строку: переопределить акцент в тёмной теме на #A9CA89, который уже есть в палитре боковой панели и даёт 6.91 : 1. Чипы документации на этой странице решают это иначе: у них фиксированная пара токенов, которая не переворачивается вообще, — ровно как у бейджей «Новинка», «−25 %» и «Нет в наличии». Бейдж «Хит», активный чип и кнопка быстрого добавления намеренно оставлены как есть: правка дизайна витрины должна быть отдельным осознанным шагом, а не побочным эффектом написания документации.

Жабка

8.8 · Маскот

Маскот появился по итогам copy-теста UX-исследования: из четырёх участников трое выбрали дружелюбный вариант текста, нейтральный не выбрал никто. Жабка — самый дешёвый способ нести эту интонацию, не трогая визуальную систему: она маленькая, появляется в считаных местах и никогда не находится внутри управляющего элемента. Исходник — Result/scripts/lib/mascot.mjs, оттуда же позы попадают в панель плагина Project 7 и на борды гайдлайна.

Himascot-hi

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

Happymascot-happy

Раздел без замечаний. Зажмуренные глаза, широкая улыбка и единственная лаймовая искра — самый яркий цвет во всей системе.

Sleepymascot-sleepy

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

Watermascot-water

Раздел требует внимания или ручной проверки. Капля вынесена правее глазного бугорка, чтобы силуэт не слипался.

ЦветЗначениеГде в фигуре
Sage 300#A7C48AТело и глазные бугорки — тот же токен, что и рамка активного фильтра
Sage 300 тёмный#8FB474Лапы и затенение листа. Единственный оттенок вне общей палитры — нужен, чтобы лапы отделялись от тела
Leaf 700#1F562AКонтуры, улыбка, лист, буква «z» и обводка капли
Sage 100#E9F0DFЖивот и заливка капли
Lime#C8FF28Искра у позы Happy. Больше нигде в системе не встречается — в этом и смысл акцента
Ink#171A18Зрачки и закрытые глаза
Surface#FFFFFFБелки глаз
ПравилоЗначение
Холст64 × 64, viewBox="0 0 64 64" — вдвое крупнее иконок, потому что у маскота есть черты лица
Размер отображения26–44 px в интерфейсе плагина, 56 px на этой странице. Ниже 26 px глаза перестают читаться, выше 72 px фигура начинает кричать
ЦветЕдинственный элемент системы, который не перекрашивается. Маскот, приведённый к одному цвету, превращается в силуэт, поэтому палитра запечена в фигуру, а assets/icons.ts исключает её из перекраски
Общая базаЛапы, тело и живот одинаковы во всех четырёх позах — так Smart Animate в прототипе плавно переводит одну позу в другую
Почему без рукМашущая лапа пробовалась и была убрана: на 26–44 px обводка 3 px плюс кисть — это примерно по одному пикселю на каждое, и жест читался как хвост. Позы различаются глазами и одним предметом — это переживает уменьшение
Где уместнаЗаголовок страницы, шапка раздела, пустое состояние, строка-подсказка рядом с текстом
Где недопустимаВнутри кнопки, поля, чипа или любого управляющего элемента; в карточке товара; рядом с ценой, ошибкой или предупреждением о деньгах
Что она не делаетНе несёт обязательной инструкции. Если убрать все реплики Жабки, документация останется полной — это проверяемое свойство, а не пожелание
09 · DOCUMENTATION

Документация проекта

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

Исходник в Figma

Структура файла и состав элементов

Всё, что описано на этой странице, собрано в одном файле Figma. Ссылка ведёт на рабочую страницу с экранами и компонентами; две страницы рядом созданы плагином из папки Project 7 и обновляются его командой Verify. Структура ниже прочитана по панели слоёв файла.

Открыть макет в Figma
СтраницаЧто содержитКто создаёт
UX/UI7 · 1 Product & PrototypeРабочая страница: секции 01 APP SCREENS и 02 COMPONENTS, три заблокированных референсаДизайнер
Project 7 / UI GuidelinesБорды гайдлайна: цвета, типографика, отступы, сетки, радиусы, эффекты, иконки, именование, Жабка и каталог компонентов с живыми инстансамиПлагин Project 7
Project 7 / DocumentationДевять разделов документации на канвасе плюс навигация по узламПлагин Project 7
Верхний уровень рабочей страницыТипНазначение
02 COMPONENTSSection, 1084 × 875Лист компонентов: каждый элемент показан парой «обычное состояние — активное»
01 APP SCREENSSectionТри экрана приложения в размере устройства
REFERENCE / Enter.pngИзображение, заблокированоРеференс экрана входа
REFERENCE / Catalogue.pngИзображение, заблокированоРеференс каталога
REFERENCE / Card.pngИзображение, заблокированоРеференс карточки товара

Девятнадцать компонентов. Одиннадцать элементов интерфейса и восемь иконок. Лист показывает не отдельные состояния россыпью, а пары: слева обычное, справа активное — так расхождение между ними видно без переключения слоёв.

Компонент в FigmaНа сайтеЧто показано на листе
Button / PrimaryButton · .btn-primaryКнопка «Войти» в основном состоянии
Product CardProduct cardКарточка целиком: бейдж «Хит», избранное, категория, рейтинг, цена и быстрое добавление
Bottom NavigationBottom navigationПанель из пяти пунктов, активен «Каталог»
Nav ItemПункт нижней навигацииПара: неактивный серый и активный зелёный с залитой иконкой
Category ChipChipПара: обычный на белом и выбранный на светло-зелёном
Size OptionSize optionПара: обычный и выбранный с зелёной рамкой и галочкой
Password FieldInputПара: скрытый пароль с перечёркнутым глазом и открытый с зелёной рамкой и текстом plant2026
QuantityStepperЧетыре значения: 1 с неактивным минусом, 2, 3 и 4 с неактивным плюсом — отсюда и вывод о верхнем пределе
Cart ButtonAdd to cartСостояние «В корзине» с галочкой и суммой 1 490 ₽ — на сайте не реализовано
Cart IconQuick addПара: обычная на светло-зелёном и добавленная — зелёная с галочкой
FavoriteFavoriteПара: обычное и активное с красным контуром сердца
Icon / plant-leaf, plant-droplet, plant-sun, plant-home, plant-search, plant-heart, plant-bag, plant-userСпрайт #i-*Восемь иконок одной обводкой. На сайте их пятнадцать: добавлены moon, check, chevron, mail, lock, eye, arrow, menu, close
Лист компонентов из Figma: ряд иконок, пары состояний для избранного, быстрого добавления, счётчика количества, поля пароля, кнопки корзины, варианта размера, чипа категории и пункта навигации, карточка товара, первичная кнопка и нижняя навигация
02 COMPONENTS · 1084 × 875 · векторный экспорт из Figma без изменений
Фрейм экранаЗакреплено при прокруткеПрокручиваетсяПримечание
EnterStatus bar, Home indicatorContentHero вынесен отдельным слоем — фотография и логотип над формой
CatalogueHeader, Bottom NavigationScroll ContentЕдинственный экран, где нижняя навигация вставлена инстансом компонента, а не нарисована заново
CardStatus bar, Top actions, Home indicatorScroll ContentКнопки «назад», «поделиться» и «в избранное» закреплены поверх галереи
Что стоит за разделением FIXED и SCROLLS

Статус-бар, индикатор и нижняя навигация вынесены из потока прокрутки — это не оформительское решение, а готовая инструкция для вёрстки: эти блоки остаются на месте, всё остальное едет. Каталог показывает и вторую половину правила — навигация там инстанс, поэтому правка компонента доходит до экрана сама.

1 · Обзор проекта

Назначение и состав

Продукт. PLANT STORE — магазин комнатных растений. Аудитория — покупатель без опыта ухода за растениями: отсюда рейтинг и отметка «Легко ухаживать» в карточке товара, блок ухода с четырьмя параметрами и обещание замены живого растения. Интерфейс должен снимать страх «я его загублю» раньше, чем предложит купить.

Задачи пользователя. Войти в аккаунт, чтобы сохранить избранное и отслеживать заказы. Найти растение — через категорию, поиск или подборку «Популярные». Понять, подойдёт ли оно, — по цене, рейтингу, условиям ухода и размеру. Купить: выбрать размер, количество и добавить в корзину.

Состав. Три мобильных экрана в макете (Вход, Каталог, Карточка товара) и одна десктопная витрина — эта страница. Двадцать четыре компонента, пятнадцать иконок в спрайте, четыре позы маскота, пятьдесят четыре переменные в styles.css и двадцать восемь в переносимой библиотеке tokens.css. Две темы, три брейкпоинта. Фреймворков и сборщика нет: HTML, CSS, SVG, JavaScript и JSON.

АртефактГде лежитНазначение
МакетФайл в FigmaПервоисточник: три экрана, девятнадцать компонентов и две страницы, созданные плагином. Разбор структуры — в блоке «Исходник в Figma»
Витрина системыindex.html, styles.css, app.jsЭта страница: гайдлайн, каталог компонентов и документация в одном месте
Переносимая библиотекаassets/ui-kit/Токены, компоненты, спрайт и семь готовых сниппетов для копирования в проект
Тексты интерфейсаassets/ui-kit/content/texts.jsonВесь основной текст одним файлом — для локализации и правок без вёрстки
Экспорт экрановComponents/01 APP SCREENS.png и .svgТри экрана из макета. Страница показывает растр: векторная версия весит 11 МБ из-за встроенных фотографий
Экспорт компонентовComponents/02 COMPONENTS.svgСостояния элементов парами: обычное и активное. Векторный, 191 КБ — показан на странице как есть
Плагин проверкиProject 7/Аудит Figma-файла и генерация гайдлайна и документации на страницах макета

2 · Спецификации экранов

Три мобильных экрана и витрина

Состав экранов прочитан по исходнику в Figma и его экспорту. Точные размеры фреймов нужно смотреть в самом файле — из растра они не измеряются; пропорция кадра соответствует телефону около 19.5 : 9. Разделение слоёв на закреплённые и прокручиваемые приведено в блоке «Исходник в Figma».

Три экрана приложения PLANT STORE: Вход с формой и входом через Google и Apple, Каталог с фильтрами, промо-баннером и сеткой карточек, Карточка товара с галереей, ценой, блоком ухода и выбором размера
01 APP SCREENS · экспорт из Figma без изменений. Векторная версия лежит в Components/01 APP SCREENS.svg, но весит 11 МБ из-за встроенных фотографий, поэтому на странице растр
Экран 01

Вход

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

  • Шапка: вордмарк PLANT STORE, заголовок «Добро пожаловать!», подпись о том, зачем входить
  • Форма: поле «Эл. почта» с плейсхолдером name@mail.ru, поле «Пароль» с маской и кнопкой глаза, ссылка «Забыли пароль?»
  • Действия: первичная кнопка «Войти», разделитель «или», вход через Google и Apple
  • Низ: «Нет аккаунта? Зарегистрироваться»
  • Не определено: экран регистрации, восстановление пароля, тексты ошибок входа
Экран 02

Каталог

Основной экран выбора. Три способа сузить выдачу — поиск, фильтры и категории — стоят до товаров, промо-баннер разделяет фильтры и сетку.

  • Шапка: «Каталог», подпись «Найдите растение для своего дома», кнопки поиска и фильтров
  • Категории: горизонтальная лента чипов со счётчиками — Все 124, Комнатные 68, Суккуленты 32, лента прокручивается
  • Промо: баннер «Террариумы со скидкой» с бейджем −25 % и кнопкой «Смотреть»
  • Сетка: «Популярные растения» + ссылка «Смотреть все», карточки по три в ряд с бейджем, избранным, рейтингом и ценой
  • Навигация: нижняя панель из пяти пунктов, активен «Каталог»
  • Не определено: содержимое панели фильтров, поведение поиска, пустая выдача
Экран 03

Карточка товара

Экран решения о покупке. Галерея на всю ширину, карточка с данными наезжает на неё снизу — изображение остаётся главным, но не занимает весь экран.

  • Галерея: счётчик «1 / 6», кнопка «назад», «поделиться» и «в избранное» поверх изображения
  • Заголовок: бейдж «Хит продаж», название, категория, рейтинг «4,9 (128 отзывов)», отметка «Легко ухаживать»
  • Цена: 1 490 ₽ и срок доставки «1–2 дня»
  • Доверие: баннер «Растение живое» с обещанием замены
  • Описание: текст с сворачиванием «Читать полностью»
  • Уход: четыре параметра — Полив, Освещение, Температура, Влажность
  • Размер: три варианта S / M / L, выбран M
  • Не определено: закреплённая кнопка покупки, экран корзины, отзывы
Витрина

Эта страница

Десктопный каталог системы: постоянная боковая навигация 260 px и прокручиваемая колонка разделов. Работает как офлайн-файл — сервер не нужен.

  • Структура: девять разделов, каждый с якорем и подсветкой активного пункта при прокрутке
  • Ширины: поля clamp(24px, 6vw, 88px), до 980 px боковая панель уезжает за экран
  • Состояния: светлая и тёмная тема, выбор сохраняется
  • Не определено: печатная версия и поиск по документации

3 · Компоненты

Двадцать четыре элемента системы

Краткое назначение каждого компонента и его параметры. Развёрнутая спецификация — в блоке «Спецификация» рядом с самим компонентом в разделах 02–07; соответствие компонентам макета и лист состояний — в блоке «Исходник в Figma».

КомпонентНазначениеПараметрыСостояния
ButtonЗапускает действие; зелёная заливка означает главное действие экранаВариант: Primary / Secondary / Ghost. Размер: S / M / L. Иконка: есть / нетDefault, Hover, Disabled
Icon buttonДействие без подписи там, где смысл считывается по иконке42 × 42 px, радиус 14Default, Hover, Active
ChipФильтр каталога по категории, выбор одиночныйПодпись, счётчик, эмодзиDefault, Active
BadgeНеинтерактивная метка состояния товараТон: green / purple / yellow / neutralDefault
InputВвод данных в формах входа и оформленияИконка типа, лейбл, значение, действие справаDefault, Focus, Success
Size optionВыбор размера растения вместе с ценойРазмер, диапазон высоты, ценаDefault, Selected
SwitchМгновенное переключение настройки без сохраненияЗаголовок, пояснениеOff, On
Top navigationНавигация по разделам на десктопеВордмарк, до трёх ссылок, действияDefault, Active-ссылка
Bottom navigationОсновная навигация на телефоне, ровно пять направленийИконка и подпись у каждого пунктаDefault, Active
Cart counterПоказывает число товаров в корзинеЧисло, 17 × 17 pxDefault
Product cardНоситель товара в каталоге с быстрым добавлениемИзображение, бейдж, категория, название, рейтинг, ценаDefault
FavoriteОтметка «в избранное» поверх изображения товара38 × 38 px, полупрозрачная подложкаDefault, Active
Quick addДобавление одной штуки прямо из каталога42 × 42 pxDefault, Added
Care cardКарточка совета по уходу; намеренно не похожа на товарТема, заголовок, время чтенияDefault
StepperКоличество товара перед добавлением в корзинуМинимум 1, максимум не заданDefault
Add to cartДобавление с показом итоговой суммы до нажатияИконка, подпись, суммаDefault
Trust bannerСнимает возражение о сохранности живого растенияИконка, заголовок, пояснение, шевронDefault
Delivery noteСрок доставки и порог бесплатнойИконка, срок, условиеDefault
HeroПервый экран: обещание и одно первичное действиеБейдж, заголовок, текст, два действияDefault
Hero noteПодпись к растению на фотографииНомер, название, краткая характеристикаDefault
SwatchОбразец цвета с копированием значенияЦвет, имя, hex, размер обычный / крупныйDefault
ToastПодтверждение действия на 1.6 секундыТекст сообщенияHidden, Shown
Theme toggleПереключение светлой и тёмной темыИконка луны или солнцаLight, Dark
Sidebar navigationПостоянная навигация витрины по разделамНомер и название раздела, блок-подсказка внизуDefault, Active, Open (на мобильной ширине)

4 · Пользовательские сценарии

Переходы и их основание

Прототип в Figma-файле здесь не читался, поэтому переходы между мобильными экранами восстановлены по составу экранов, а не по связям прототипа. Колонка «Основание» показывает, на что опирается каждая строка: проверяемый обработчик или предположение по структуре.

СценарийОткудаКудаОснование
Вход в аккаунтВход · кнопка «Войти»КаталогСтруктура экранов требует подтверждения
Вход через провайдераВход · Google / AppleКаталогСтруктура экранов требует подтверждения
РегистрацияВход · «Зарегистрироваться»Экрана нет в макетене спроектировано
Просмотр товараКаталог · карточка товараКарточка товараСтруктура экранов требует подтверждения
Фильтрация по категорииКаталог · чипКаталог с отфильтрованной выдачейОбработчик в app.js: выбор переключается, сама выдача не фильтруется
Возврат из карточкиКарточка · кнопка «назад»КаталогСтруктура экранов требует подтверждения
Добавление в избранноеКаталог или КарточкаОстаётся на месте, состояние меняетсяОбработчик в app.js + пара состояний на листе компонентов
Быстрое добавление в корзинуКаталог · кнопка на карточкеОстаётся на месте, счётчик растётОбработчик в app.js
Покупка с выбором количестваКарточка · stepper и «В корзину»Остаётся на месте, счётчик растётОбработчик в app.js
Переход в корзинуЛюбой экран · иконка корзиныЭкрана нет в макетене спроектировано
Смена разделаНижняя навигацияГлавная, Каталог, Избранное, Корзина, ПрофильНарисованы пять пунктов; четыре экрана из пяти отсутствуют не спроектировано
Навигация по витринеБоковая панельРаздел страницы по якорюЯкорные ссылки + IntersectionObserver

5 · Правила взаимодействия

Проверяемое поведение

Всё, что перечислено ниже, реализовано в app.js и проверяется открытием страницы. Поведение, которого в коде нет, в эту таблицу не попало — оно перечислено в разделах 4 и 8 как неопределённое.

ЭлементСобытиеЧто происходитОбратная связь
Образец цветаКликЗначение hex копируется в буфер обменаТост «#XXXXXX скопирован»
Переключатель темыКликНа <body> переключается класс dark, выбор пишется в localStorage и восстанавливается при следующем открытииИконка меняется с луны на солнце
Кнопка менюКликБоковая панель выезжает; клик по крестику или по любому пункту закрывает еёСдвиг панели 0.3 s и тень
Прокрутка страницыIntersectionObserverАктивным становится пункт раздела, попавшего в полосу от 25 % до 35 % высоты окнаПодсветка пункта в боковой панели
Чип категорииКликВыбор переходит на нажатый чип, с остальных снимаетсяСмена фона и рамки
Вариант размераКликВыбор переходит на нажатый вариантРамка и галочка в углу
Кнопка глазаКликТип поля переключается между password и textСимволы пароля становятся видимыми
ИзбранноеКликСостояние переключается в обе стороныЗаливка иконки и тост «Добавлено» / «Удалено из избранного»
StepperКлик по «−» или «+»Количество меняется на единицу, ниже 1 не опускается; сумма пересчитывается как цена × количество в формате ru-RUЧисло и сумма в кнопке обновляются сразу
Добавление в корзинуКликСчётчик корзины растёт на выбранное количество (из каталога — на одну штуку), кнопка каталога получает класс addedТост «Добавлено в корзину», счётчик и цвет кнопки
ТостАвтоматическиСкрывается через 1600 мс; новый вызов сбрасывает таймер предыдущегоПоявление и уход снизу за 0.25 s
Переключатель уведомленийКликНативный checkbox меняет состояние; обработчика нет, значение никуда не сохраняетсяСдвиг кружка и смена цвета дорожки
Ложное подтверждение

Копирование цвета обёрнуто в try / catch, но тост «скопировано» показывается в любом случае — в том числе когда браузер запретил доступ к буферу обмена, что происходит при открытии файла по протоколу file://. Сообщение об успехе должно показываться только после успешной записи.

6 · Адаптивность

Три брейкпоинта

Точки переключения выбраны по тому, где ломается раскладка, а не по моделям устройств. Между ними макет тянется: колонки заданы долями, поля и заголовки — функцией clamp(), поэтому промежуточных состояний рисовать не требуется.

ШиринаЧто меняется
Больше 980 pxБоковая панель закреплена, основная колонка со сдвигом 260 px. Карточки по три в ряд, образцы цвета по четыре, парные блоки в две колонки
980 px и меньшеБоковая панель уезжает за экран и открывается бургером, появляется кнопка закрытия и мобильный вордмарк. Карточки и образцы — по две в ряд, контентная карточка занимает всю ширину, заголовок раздела и подпись встают друг под друга, фон hero смещается к 62 %
680 px и меньшеОдна колонка везде. Верхний бар 62 px, статус скрыт, ссылки верхней навигации скрыты, подписи нижней навигации скрыты. Кнопки в ряду растягиваются, варианты размера становятся строками, строка покупки разворачивается вертикально, hero получает высоту 640 px и светлую подложку под текстом
520 px и меньшеКнопка перехода в библиотеку теряет иконку и сжимает поля
ПравилоКак реализовано
Тянущиеся величиныclamp() для полей разделов, заголовков и внутренних отступов hero — минимум, предпочтительное значение во vw и максимум
Поведение при длинном текстеБлоки растут по содержимому: везде flex и grid, фиксированных высот у текстовых контейнеров нет. Исключение — кнопка: текст в ней не переносится
Горизонтальная прокруткаЗапрещена на уровне страницы (body { overflow-x: hidden }); широкие таблицы документации прокручиваются внутри своего контейнера
ИзображенияФоновые, с cover и точкой фокуса в процентах, — кадр смещается вместе с шириной. srcset не используется
Не провереноПоведение при увеличении шрифта в системе и при масштабе страницы выше 200 %. требует тестирования

7 · Нестандартные ситуации

Проверено, что отражено, а что нет

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

СитуацияВ системеКак проверено
Пустое состояниене найденоВ разметке и стилях нет ни одного блока-заглушки: ни пустой выдачи каталога, ни пустого избранного, ни пустой корзины
Состояние ошибкине найденоНет класса ошибки ни у поля, ни у кнопки; красный цвет используется только для активного избранного
Состояние загрузкине найденоНет скелетонов, спиннеров и блокировки повторного нажатия
Длинный текстчастичноКонтейнеры растут по содержимому, но название товара не обрезается и не ограничено числом строк — карточки в ряду разъедутся по высоте. Текст кнопки не переносится вовсе
Товар закончилсячастичноБейдж «Нет в наличии» существует, но у карточки товара нет соответствующего состояния: кнопка добавления остаётся активной
Недоступное действиеестьТолько у кнопки — псевдокласс :disabled. У остальных интерактивных элементов такого состояния нет
Изображение не загрузилосьне найденоИзображения подключены как CSS-фон, поэтому при ошибке загрузки останется пустой блок без запасного варианта и без alt
Буфер обмена недоступенчастичноОшибка перехвачена try / catch, страница не ломается, но пользователю всё равно сообщают об успехе
JavaScript отключёнчастичноНавигация якорями, вся вёрстка и наведение работают; тема, фильтры, счётчик корзины и копирование — нет
Нет сетичастичноСтраница открывается как локальный файл целиком, кроме шрифта Manrope с Google Fonts — подставляется Arial

8 · Примечания для разработчиков

Ограничения и открытые вопросы

Первая таблица — то, что измерено в проекте и требует решения до вёрстки. Вторая — вопросы, ответ на которые нельзя вывести из макета и кода: их нужно задать автору дизайна, а не додумывать.

ТипОписание
Ограничение системыАльфа-значения заданы литеральными rgba(): одна и та же зелень записана как rgba(40,106,53,…) в семи местах с разной прозрачностью. Следующий шаг — хранить компоненты цвета в токене (--brand-rgb: 40,106,53) и собирать прозрачность из него
ЗакрытоЛитеральные цвета вне :root, неиспользуемые токены и неприменяемая шкала радиусов — исправлено: двадцать семь вхождений цвета и сорок одно объявление радиуса переведены на токены, --sand-200 удалён. Подробности — в разделе 8.1 Токены
Доступность--muted на --canvas даёт 4.37 : 1 — ниже порога AA для обычного текста, хотя на первом экране заявлен контраст AA. Затемнение до #5F645F закрывает вопрос без заметной смены оттенка
ДоступностьТёмная тема переопределяет подложку --sage-100, но не акцент на ней: бейдж «Хит», активный чип и кнопка быстрого добавления падают до 1.92 : 1 и 1.46 : 1. Исправляется одной строкой — переопределением акцента на #A9CA89
ДоступностьИконочные кнопки 42 × 42 px при рекомендованных 44. Собственного стиля фокуса клавиатуры нет ни у одного элемента, кроме поля ввода
ПроизводительностьФоновое изображение hero весит 1.9 МБ и подключается без srcset и без современных форматов. На мобильной сети это основной вклад в время загрузки
ДанныеВсе значения зашиты в разметку: цена 1 490 ₽, счётчики категорий, счётчик корзины «2», срок доставки, порог бесплатной доставки 3 000 ₽. Тексты продублированы в texts.json, но разметка его не читает — при подключении к бэкенду источник должен стать один
РасхождениеНазвание товара: «Монстера Делишиоза» на витрине и в texts.json, «Монстера Делициоза» на мобильных экранах. Нужно выбрать одно написание
РасхождениеРазмеры растения расходятся в трёх местах: витрина — S 20–30 см / M 40–60 см / L 60–80 см с ценами, экран товара — S 20–30 / M 30–50 / L 50–80 без цен, лист компонентов — M 30–40. Диапазон для M отличается во всех трёх источниках
РасхождениеСчётчик «38 компонентов» на первом экране не совпадает с каталогом документации, где их 24. Вероятно, счётчик считает варианты — требует уточнения
РасхождениеКнопка глаза переключает видимость пароля, но иконка не меняется, тогда как на листе компонентов скрытому паролю соответствует перечёркнутый глаз
Необратимое действиеКласс added у кнопки быстрого добавления не снимается: убрать товар из корзины на этом экране невозможно
Требует уточненияКуда ведёт нажатие на баннер «Растение живое» — на страницу условий, в раскрывающийся блок или никуда
Требует уточненияВерхний предел количества в stepper: на листе компонентов «плюс» на значении 4 показан неактивным, в коде предела нет
Требует уточненияПравила валидации полей входа и промокода, тексты ошибок, поведение при неверном пароле
Требует уточненияЭкраны, на которые ведёт нижняя навигация: из пяти направлений нарисован один — «Каталог»
Требует уточненияПоведение поиска и содержимое панели фильтров в каталоге
Требует уточненияМаксимальная длина названия товара и число строк, после которого оно обрезается

9 · Соответствие требованиям

Карта, а не оценка

Таблица показывает, где на этом сайте выполнено каждое требование к передаче дизайна. Это карта разделов, а не результат проверки: статус требований к самому Figma-файлу — организация слоёв, сетки, Auto Layout, стили, компоненты, данные для Inspect — измеряется плагином из папки Project 7 командой Verify и зависит от состояния файла, а не этой страницы.

ТребованиеЧто должно бытьГде на сайте
Организация слоёв и имёнПонятные имена, единая конвенция8.5 Именование — конвенция для классов, токенов, иконок и слоёв макета
Сетка и отступыЗаданная и описанная сетка8.2 Отступы и сетка — шкала, колонки, поля, брейкпоинты
Поведение при изменении содержимогоПравила роста и переноса6 Адаптивность — тянущиеся величины и поведение при длинном тексте
Стили и переменныеЗначения вынесены в токены8.1 Токены — пятьдесят четыре токена с назначением, значением в обеих темах и числом обращений
Компоненты и вариантыКаталог с параметрами3 Компоненты и блоки «Спецификация» в разделах 02–07
Данные для разработчикаРазмеры, отступы, цвета, состояния в машинно-проверяемом видеСпецификации компонентов + 8.1; исходники styles.css и assets/ui-kit/ читаются напрямую
Примечания для разработчиковОграничения и открытые вопросы8 Примечания — девятнадцать пунктов с разделением на ограничения и вопросы
Готовность к передачеВсё нужное собрано в одном местеРазделы 08 и 09 плюс переносимая библиотека с инструкцией
UI-гайдлайнОтдельный раздел с правилами системы08 Правила системы — восемь блоков
Документирование цветовВсе цвета с названиями и назначением01 Основа системы — образцы с копированием, 8.1 — назначение и охват
Документирование шрифтовГарнитура, размеры, начертания8.3 Типографика — десять ролей с реальными значениями
Документирование кнопокВарианты, размеры, состояния02 Кнопки и действия + спецификация
Документирование состоянийПеречень состояний и их смысл8.6 Состояния — матрица по тринадцати компонентам и словарь состояний
Страница документацииДевять обязательных разделов09 Документация — оглавление вверху раздела
Описания компонентовКраткое назначение у каждого3 Компоненты — назначение всех двадцати четырёх; развёрнуто — в блоках «Спецификация»
Описания поведенияЧто происходит при взаимодействии5 Правила взаимодействия — двенадцать проверяемых правил
Пользовательские сценарииПереходы между экранами4 Сценарии — с указанием основания каждой строки
Нестандартные ситуацииПустые состояния, ошибки, загрузка7 Нестандартные ситуации — десять проверок с честным результатом
Понятность названийИмена отражают роль, а не вид8.5 Именование
Ссылки и навигацияПо документации можно перемещатьсяБоковая панель, оглавление раздела 09 и перекрёстные ссылки внутри таблиц
Ссылка на исходникДокументация ведёт к макетуИсходник в Figma — ссылка на файл, состав страниц, девятнадцать компонентов и разбор фреймов; та же ссылка в таблице артефактов раздела 1
Описание элементов макетаЧто именно лежит в файлеИсходник в Figma — соответствие каждого компонента Figma элементу сайта и оригинальные экспорты обоих листов
МаскотПозы, палитра и правила применения8.8 Жабка — четыре позы с назначением, семь цветов и восемь правил
Чего эта страница не заменяет

Сайт документирует дизайн-систему и то, что реализовано в вёрстке. Он не проверяет Figma-файл: организация слоёв, сетки на фреймах, Auto Layout, привязка стилей, варианты компонентов и данные для Inspect живут в макете и измеряются плагином Project 7. Нативные комментарии Figma плагин создать не может — вместо них он готовит фреймы DEV NOTE и список текстов для ручного переноса. Сроки, цены и остатки на этой странице — значения из макета, а не данные магазина.

Скопировано