Соберите любой макет на дизайн-системе Fast Reel
Установите скилл — и Claude будет рисовать экраны, флоу, лендинги и отдельные компоненты в языке Fast Reel: теми же цветами, шрифтами, компонентами и кодом, что в прототипе. На выходе — готовый HTML, который можно открыть в браузере.
- Скачайте архив. Распаковывать не нужно.
- Загрузите в Claude: Customize → Skills → + → Upload a skill и выберите архив. В настройках должно быть включено выполнение кода (Code execution).
- Попросите макет — в любом чате, скилл подключится сам.
В Claude Code: распакуйте архив в ~/.claude/skills/
01
Обзор
Fast Reel — прототип приложения, которое превращает длинное видео в вертикальный ролик: речь расшифровывается, пользователь тыкает в нужные слова, остальное вырезается. Язык интерфейса — мягкий скевоморфизм без стекла: плотные матовые поверхности, суперэллипс вместо круглых углов, свет вместо обводок.
Из чего состоит
| Слой | Что задаёт | Где лежит |
|---|---|---|
| Тема кейса | палитра, радиус, тень, кривая ускорения | :root → --fr-* |
| Базовый прототип | каркас экранов, типовые компоненты | .screen, .btn, .chip, .row… |
| Скоуп кейса | всё, что отличает Fast Reel от остальных прототипов | .v2-case[data-case="fastreel"] .phone … |
| Форма угла | суперэллипс поверх обычного border-radius | mask-image / border-image / clip-path |
Чем этот язык отличается
Плотность вместо стекла
Ни одного backdrop-filter. Поверхности матовые и непрозрачные, глубину даёт свет сверху и мягкая тень вниз.
Свет вместо обводок
Выделение — ореол, а не рамка. Обводка в этом языке появляется только там, где нужна подсказка «это контур, а не объект».
Суперэллипс везде
Все скругления — суперэллипс четвёртой степени. Настоящие круги остаются кругами: аватар, тумблер, точка прогресса.
02
Принципы
Семь правил, по которым собирается любой новый экран Fast Reel.
- Углы — суперэллипс, без исключений. Обычное круглое скругление допустимо только у настоящих кругов: аватар, круглая кнопка, тумблер, точка, полоса прогресса.
- Стекла нет.
backdrop-filterотключён по всему прототипу принудительно. Полупрозрачность допустима, размытие подложки — нет. - Глубина — светом. Сверху мягкий радиальный блик внутри поверхности, снизу рассеянная тень. Никаких внутренних «губ» и псевдообъёма.
- Выделение светится. Активное состояние — заливка акцентом плюс ореол наружу. Ореол никогда не обрезается: контейнеру нужен запас поля.
- Одна кривая на весь прототип.
cubic-bezier(.22,1,.36,1)для появления,cubic-bezier(.65,0,.35,1)для переходов между экранами. - Контент уезжает вниз, приходит снизу. Экраны не ездят вбок: содержимое уходит по частям вниз, следующий экран приезжает снизу тоже по частям.
- Фото — всегда в край или в форму. Кадр либо занимает всю площадь экрана и растворяется маской, либо лежит в блоке с суперэллипсом. Промежуточных вариантов нет.
03
Цвет
Палитра держится на двух фиолетовых поверхностях и одном акценте. Всё остальное — белый с разной прозрачностью.
Поверхности
Акцент и сигналы
Текст
| Токен | Значение | Где |
|---|---|---|
| --fr-ink | #FFFFFF | заголовки, подписи на акценте, значения |
| --fr-ink-2 | rgba(255,255,255,.84) | основной текст, лиды, подписи полей |
| --fr-ink-3 | rgba(255,255,255,.66) | второстепенное: единицы, счётчики, хинты |
Правила цвета
- Зелёный — только сигнал. Он не бывает фоном, кнопкой или акцентом навигации: «Ready», галочка, зелёная подсветка после нажатия.
- Розовый живёт только в фоне: радиальный отсвет экрана и фон первого экрана. В компонентах его нет.
- Между
--fr-surfи фоном экрана нет обводки. Разделяет их разница светлоты, а не линия. - Текст на акценте — всегда чистый белый.
--fr-ink-2на#9179F2даёт контраст ниже 4.5:1.
04
Типографика
Один шрифт на всё — Jost. Роли различает вес и кегль, не гарнитура. Ниже каждая роль показана живьём, тем же начертанием, что в прототипе.
Веса
Роли
| Образец | Роль | Кегль / вес | Цвет и применение |
|---|---|---|---|
Type. Tap. Done. |
Герой.hero-h | 26px · 700 | #fff · первый экран |
Your videos |
Заголовок экрана.topbar h2 | 26px · 700 | #fff · «Your videos», «Share» |
Generate clip |
Кнопка.btn | 17px · 600 | #fff или #2A1355 |
We transcribe, you pick the phrases |
Подзаголовок.hero-p | 15.5px · 300 | --fr-ink-2 · лид под заголовком |
Morning standup recap |
Строка списка.rinfo b | 15px · 600 | #fff · название ролика |
highlights |
Чип слова.chip | 14.5px · 500 | #fff · слово в ленте |
Preview · 05:40 |
Кнопка-плашка.fr-preview, .dt-dur | 13.5px · 500 | #fff · Preview, таймер, файл |
Size · Position · Font |
Подпись поля.ctlrow-h b | 12.5px · 500 | --fr-ink-2 |
28 pt · Bottom · 0:28 |
Значение.ctlrow-h span | 12px · 500 | --fr-ink-3 · табличные цифры |
Transcribing words |
Чекпоинт.ck span | 11px · 400 | --fr-ink-3 · подписи шагов |
font-variant-numeric: tabular-nums. Без этого строка дёргается при каждом тике.Пара «герой + лид»
Заголовок 700, лид 300 — контраст веса делает больше, чем разница кегля. Лид никогда не идёт весом 400, иначе пара схлопывается.
.hero-h + .hero-p05
Геометрия и ритм
Поля кратны 4, вертикальный ритм экрана держится на трёх числах: 16, 20 и 40.
Поля экрана
| Что | Значение | Почему |
|---|---|---|
| Боковое поле | 20px | общее для всех экранов, задаётся .s-pad |
| Верх под статус-баром | 8px | шапка сама добавляет высоту |
| Низ до края | 40px | полоса home сидит на 9px + 5px высоты — остаётся зазор 26px |
| Между блоками | 16px | превью → колорпикер → контролы |
| Над главной кнопкой | 28px | кнопка должна отделяться от контента сильнее, чем блоки друг от друга |
Радиусы
| Радиус | Доля стороны | Где |
|---|---|---|
| 10px | ~25% | миниатюра в строке списка, плашка иконки в строке |
| 14px | ~28% | вкладки, пилюля статуса, бейдж языка |
| 18px | ~32% | иконки приложений, кнопка Preview, плашка файла |
| 20–22px | ~30% | строки списка, строки шеринга, панель Preview, меню |
| 26px | — | --fr-r: карточки, шаги «как это работает» |
| 30px | 48% высоты | главные кнопки; больше нельзя — углы начнут сплющиваться |
06
Суперэллипс
Главная формальная черта языка и главный источник багов. Ниже — что именно рисуется и какой техникой, в зависимости от того, что умеет движок.
Контур угла — суперэллипс четвёртой степени: |x/r|⁴ + |y/r|⁴ = 1. У окружности показатель 2. Разница видна тем сильнее, чем большую долю стороны занимает радиус.
Четыре способа задать форму
| Техника | Когда применяется | Поддержка | Ограничение |
|---|---|---|---|
| corner-shapecorner-shape:squircle | основной путь | Chrome/Edge 139+ | в Safari не поддерживается вовсе |
| Подложка-псевдоэлемент::before + border-image | кнопки, строки, панели, плашки | везде | только заливка — содержимое не обрезает |
| Многослойная маскаmask-image, 4 угла + 2 полосы | всё, что обрезает содержимое: превью, плитки, миниатюры | везде | обрезает и внешнюю тень тоже |
| clip-path в процентахpolygon(… %) | квадратные элементы | везде | на неквадратном элементе углы вытягиваются |
Как выбрать
- Нужна только заливка формы (кнопка, строка, панель) — подложка-псевдоэлемент. Тень переносится на
filter: drop-shadow, иначе форма её не повторит. - Внутри есть фото или контент, который надо обрезать, — многослойная маска: четыре угловых тайла фиксированного размера плюс две прямоугольные полосы. Углы не растягиваются при любом размере элемента.
- Элемент квадратный и фиксированный — можно clip-path в процентах, он самый дешёвый.
- Если форму задаёт маска, собственный
border-radiusдолжен быть нулевым. Иначеoverflow:hiddenрежет содержимое по окружности, и суперэллипса не видно.
Маска: плитка
Фото внутри обрезано по суперэллипсу. У вложенного изображения своего скругления быть не должно — форму задаёт плитка.
.thumbПодложка: кнопка
Фон кнопки снят, форму рисует псевдоэлемент 9-slice-картинкой. У <button> обязателен appearance:none, иначе движок рисует контрол сам.
Мелкая форма
На маленьких элементах разница между кругом и суперэллипсом почти не читается — но правило всё равно единое, иначе в ряду соседних плашек появляется разнобой.
.lang-badge07
Свет и подсветка
Объём в этом языке даёт не тень под объектом, а свет внутри него и ореол вокруг.
Три приёма
| Приём | Значение | Где |
|---|---|---|
| Блик внутри | radial-gradient(125% 100% at 50% -28%, rgba(255,255,255,.20), transparent 62%) | чипсы, кнопка шрифта, главные кнопки |
| Ореол наружу | 0 0 13px 1px rgba(86,62,134,.55) | чип в покое; у выбранного ореол ярче и шире |
| Мягкая тень | --fr-soft · 0 22px 44px -28px rgba(10,4,30,.9) | карточки, меню, панели |
Ореол выбора
Выбранный чип светится наружу. Поэтому лента слов идёт с запасом поля 24px сверху — иначе ореол верхнего ряда обрезается краем прокрутки.
.chip / .chip.selКарточка
Ровная заливка --fr-surf, без обводки и без внутреннего блика. Отделяется от фона только светлотой.
box-shadow не повторяет суперэллипс и обрезается маской. Там, где форму задаёт маска или подложка, тень переносится на filter: drop-shadow — он применяется к уже полученной альфе и повторяет контур точно.08
Движение
Две кривые, три длительности. Всё остальное — производные.
| Роль | Кривая | Длительность |
|---|---|---|
| Появление, выезд | cubic-bezier(.22,1,.36,1) · --fr-ease | 0.42–0.52s |
| Переход между экранами | cubic-bezier(.65,0,.35,1) — ease-in-out | 0.36s уход / 0.52s приход |
| Отклик на наведение | cubic-bezier(.4,0,.2,1) | 0.2–0.3s |
| Нажатие | та же | 0.18–0.22s |
Переход между экранами
- Содержимое уходящего экрана уезжает вниз по частям: шаг задержки 35 мс, смещение 190px, прозрачность в ноль.
- Экран гаснет только после того, как содержимое уехало — задержка 0.32s.
- Приходящий экран собирается снизу по частям: шаг 55 мс, старт 0.26s, смещение 64px.
- Чипсы слов приезжают поштучно: задержка
0.34s + 0.022s × min(индекс, 18). Ограничение по индексу держит общую длительность около 0.75s. - Экраны не ездят вбок. Боковой сдвиг в этом прототипе отключён принудительно.
Автопроигрывание
Прототип на странице кейса играет сам: 11 шагов сценария, у каждого своя длительность, суммарно около 33 секунд, затем цикл. Под телефоном — полоса перемотки и четыре кнопки: шаг назад, начало, пауза, шаг вперёд.
event.isTrusted — иначе сценарий, который сам нажимает кнопку Preview, останавливает сам себя.09
Каталог компонентов
В первой колонке — сам компонент, живой, тем же CSS, что и в прототипе. Селектор под названием ведёт к коду.
| Образец | Компонент | Состояния | Где встречается |
|---|---|---|---|
| Главная кнопка.btn.btn-primary | покой · наведение · нажатие | низ каждого экрана сценария | |
| Светлая кнопка.btn.btn-white | покой · наведение | первый экран, «Сохранено» | |
| Кнопка Preview.fr-preview | покой · проигрывание | экран выбора слов | |
fromhighlights |
Чип слова.chip / .chip.sel | невыбран · выбран · вспышка | лента расшифровки, первый экран |
SG |
Круглая кнопка и аватар.circ-btn · .avatar | покой · наведение | шапка любого экрана |
VideosAlbums |
Вкладка.tab / .tab.on | активная · обычная | экран выбора видео |
ReadyEnglish |
Статус и бейдж.pill-green · .lang-badge | один вид | шеринг · расшифровка |
0:24 Morning standup recap2h ago · 8 words
|
Строка списка.list .row | покой · наведение · нажатие | «Your videos» |
00:36 |
Плитка видео.vcell + .thumb + .dur | обычная · выбранная | сетка выбора видео |
| Карточка.glass | один вид | базовая поверхность прототипа | |
Upload Drop in any video |
Шаг сценария.hstep + .hstep-ic | покой · появление по очереди | «How it works» |
| Иконка приложения.share-app + .share-ic | покой · наведение · нажатие | экран «Поделиться» | |
| Строка действия.share-row | покой · выполнено (зелёная) | экран «Поделиться» | |
▶reel_20250415.mp4 · 0:20 · 14,8 MB |
Плашка файла.filepill | один вид | экран «Сохранено» |
05:40 |
Панель проигрывания.dt-top + .dt-dur | покой · проигрывание | экран выбора слов |
| Меню настроек.app-menu + .am-row | закрыто · открыто · тумблер вкл/выкл | шапка, кнопка «•••» | |
| Выбор цвета субтитров.hue + .hue-knob | перетаскивание · клавиатура | настройка субтитров | |
| Колесо шрифтов.fwheel | прокрутка · выбранный по центру | настройка субтитров | |
Size28 pt
|
Слайдерinput[type=range] | покой · перетаскивание | размер и позиция субтитров |
| Полоса прогресса.bar > i | 0 → 100% | экран расшифровки | |
Uploading video
Detecting speech
|
Чекпоинт.ck / .ck.done / .ck.cur | ждёт · текущий · выполнен | экран расшифровки |
Ship it on Friday |
Превью с субтитром.preview + .cap | цвет · кегль · позиция · шрифт | настройка субтитров |
| Ссылка-кнопка.linkbtn | покой · наведение | под главной кнопкой | |
| Круг подтверждения.check-circ | появление с пружиной | экран «Сохранено» | |
| Управление прототипом.ctrl-btn · .ctrl-arrow | покой · наведение | под телефоном на странице кейса | |
| Полоса перемотки#frProgress | перетаскивание · клик | под телефоном на странице кейса | |
| Кнопка загрузки.dl-btn · .v2-figma | покой · наведение | шапка кейса на сайте |
09b
Расширенный каталог
Компонентов, которых в прототипе пока нет, но которые понадобятся любому следующему экрану. Нарисованы в том же языке: те же поверхности, тот же акцент, та же форма угла. Это предложение, а не документация существующего кода — поэтому у них отдельное пространство имён .fx-*.
| Образец | Компонент | Состояния | Где пригодится | |||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
Search in transcript |
Поиск.fx-field.fx-search | пусто · ввод · очистка | поиск по расшифровке и по галерее | |||||||||
Morning standup |
Текстовое поле.fx-field | покой · фокус · заполнено | название ролика, подпись | |||||||||
Описание для публикации… |
Текстовая область.fx-field.fx-ta | покой · фокус | описание при публикации | |||||||||
alexey@startup Неверный формат email |
Поле с ошибкой.fx-field.err | ошибка · исправлено | любая форма | |||||||||
1080p · 60fps |
Выпадающий список.fx-field.fx-sel | закрыт · открыт · выбран | качество экспорта, формат | |||||||||
Сохранять в галерею Публиковать сразу |
Чекбокс.fx-box | выкл · вкл · неактивен | настройки экспорта | |||||||||
Вертикально 9:16 Квадрат 1:1 |
Радиокнопка.fx-radio | выбран · не выбран | выбор формата кадра | |||||||||
9:161:116:9 |
Сегментированный контрол.fx-seg | активный сегмент | соотношение сторон, скорость | |||||||||
1.5× |
Степпер.fx-step | минимум · шаг · максимум | скорость, длительность паузы | |||||||||
| Диапазон.fx-range | две ручки | обрезка по времени | ||||||||||
482 |
Поле кода.fx-code | ввод · ошибка · готово | подтверждение входа | |||||||||
ПВСЧПСВ12131415161718 |
Календарь.fx-cal | день · выбран · сегодня | отложенная публикация | |||||||||
Перетащите видео сюдаMP4, MOV · до 2 ГБ |
Зона загрузки.fx-drop | покой · наведение · загрузка | импорт файла | |||||||||
MP4reel_20250415.mp40:20 · 14,8 МБ |
Строка файла.fx-file | загружается · готов · ошибка | список импортов | |||||||||
ЧерновикГотовОчередьОшибка |
Бейдж статуса.fx-badge | нейтральный · успех · внимание · ошибка | список роликов | |||||||||
312 |
Счётчик.fx-count | число · 99+ | уведомления, очередь экспорта | |||||||||
SGAKML+4 |
Группа аватаров.fx-avs | до 3 + остаток | совместный доступ к проекту | |||||||||
| Оценка.fx-stars | выбор · только чтение | отзыв о результате | ||||||||||
Экспорт в очередиРолик появится в галерее через пару минут. |
Информационный баннер.fx-alert | инфо · успех · внимание · ошибка | верх экрана, под шапкой | |||||||||
Не удалось расшифроватьВ файле нет звуковой дорожки. |
Баннер ошибки.fx-alert.err | с действием · без действия | после сбоя операции | |||||||||
Ссылка скопирована |
Тост.fx-toast | появление снизу · авто-уход 2.4s | подтверждение действия | |||||||||
Удалить ролик?Восстановить не получится. ОтменаУдалить |
Модальное окно.fx-modal | подтверждение · форма | опасные действия | |||||||||
ПоделитьсяЗакрыть |
Шторка снизу.fx-sheet | закрыта · открыта · тянется | быстрые действия | |||||||||
| Меню действий.fx-menu | покой · наведение · опасный пункт | долгое нажатие на ролик | ||||||||||
Слово попадёт в ролик |
Подсказка.fx-tip | сверху · снизу | обучение первому сценарию | |||||||||
Как считается длительность Одно выбранное слово — примерно одна секунда готового ролика. |
Аккордеон.fx-acc | свёрнут · развёрнут | справка, частые вопросы | |||||||||
|
Таблица.fx-tbl | сортировка · пустая | история экспортов | |||||||||
23 |
Шаги визарда.fx-steps | пройден · текущий · будущий | многошаговый экспорт | |||||||||
Галерея›Travel›Morning standup |
Хлебные крошки.fx-crumbs | до 3 уровней | вложенные альбомы | |||||||||
123…9 |
Пагинация.fx-page | страница · многоточие | длинная история | |||||||||
ВсеЧерновикиОпубликованные |
Вкладки с подчёркиванием.fx-utabs | активная · обычная | фильтр галереи | |||||||||
| Нижняя навигация.fx-tabbar | до 5 пунктов | каркас приложения | ||||||||||
| Плавающая кнопка.fx-fab | покой · нажатие | быстрый импорт из галереи | ||||||||||
Пока ни одного роликаЗагрузите видео — расшифровка займёт минуту |
Пустое состояние.fx-empty | первый запуск · пустой фильтр | галерея, поиск | |||||||||
| Скелетон.fx-sk | загрузка списка | ожидание ответа сервера | ||||||||||
62% |
Кольцо прогресса.fx-ring | определённый · бесконечный | экспорт, выгрузка | |||||||||
0:09 |
Плеер.fx-player | пауза · проигрывание · буфер | просмотр исходника | |||||||||
| Звуковая волна.fx-wave | выбранный фрагмент | визуализация речи | ||||||||||
490 ₽ / мес
|
Блок тарифа.fx-price | текущий · доступный | экран подписки | |||||||||
Готово Секция ниже |
Разделитель.fx-div | один вид | разбивка длинных списков | |||||||||
Водяной знакPro |
Строка настройки.fx-surf | значение · бейдж · переход | экран настроек |
10
Экраны и каркас
Восемь экранов, один каркас. Различаются они тем, чем заполнена середина, — шапка и низ одинаковы везде.
Каркас
| Слой | Селектор | Правило |
|---|---|---|
| Кадр | .phone | 390×844, радиус 42px, overflow:hidden |
| Экран | .screen | абсолютный, колонка; активный — .active |
| Поле | .s-pad | 8px 20px 40px, колонка на всю высоту |
| Шапка | .topbar | логотип или назад + заголовок + «•••» |
| Фон-кадр | .tr-bg | фото во всю площадь, низ растворяется маской, заходит на 48px ниже края |
Сценарий
| Экран | Ключ | Что на нём |
|---|---|---|
| Первый | welcome | фон-картинка, чипсы сверху, персонаж, герой, две кнопки |
| Выбор видео | pick | вкладки, сетка плиток, кнопка «Use this video» |
| Расшифровка | transcribe | кадр во всю площадь, прогресс, четыре чекпоинта в ряд |
| Выбор слов | detail | кадр, панель Preview, лента чипсов, итог, кнопка |
| Настройка | customize | превью, колорпикер, колесо шрифтов, два слайдера |
| Сохранено | saved | кадр во всю площадь, круг подтверждения, плашка файла |
| Поделиться | share | кадр, сетка приложений, строки действий |
| Как работает | howit | три шага, приходят по очереди снизу |
.dt-sheet, и отступ задаётся его собственным padding-bottom, а не полем экрана.12
Чипсы слов
Главный элемент продукта: расшифровка — это не текст, а набор нажимаемых слов.
Лента расшифровки
Минимальная высота 44px — палец. Радиус 19px, кегль 14.5/500, промежуток 9px. Выбранные слова и есть будущий ролик: их порядок и есть монтаж.
#words .chipВ покое
Заливка #42305F, блик сверху внутри, ореол 0 0 13px 1px rgba(86,62,134,.55). Чип не бывает плоским — без ореола он читается как надпись, а не как объект.
Выбран
Заливка #9179F2, ореол вдвое шире и ярче. Переход по цвету 0.26s, по тени 0.3s — тень догоняет цвет, это и даёт ощущение «загорелся».
Правила ленты
- Запас поля сверху 24px, снизу 26px: ореол верхнего ряда при наведении иначе срезается краем прокрутки.
- Лента растворяется маской сверху и снизу. Верхний градиент включается только когда есть что прокручивать вверх — в начале ленты первый ряд должен быть полностью плотным.
- При прокрутке к элементу добавляется
scroll-padding, равный полю, иначе прилипание сдвигает ленту. - Во время Preview лента доезжает до текущего слова плавным твином, а не скачком
scrollTop. - Чипсы — единственный компонент, форму которого не обрезают маской: это срезало бы ореол.
13
Списки и плитки
Два способа показать видео: строка с описанием и плитка-кадр.
Строка ролика
Миниатюра 54px с радиусом 10px, название 15/600, метаданные 13px приглушённо, шеврон справа. Радиус строки 16px — это те же 30% высоты, что у панелей.
.list .rowПлитка
Квадрат с кадром и длительностью в углу. Форма — маска; у вложенного кадра своего скругления быть не должно.
.vcell + .thumbПлитка выбрана
Кольцо выбора — внутреннее, через ::after с border. Внешний box-shadow формой суперэллипса не повторяется и пропадает.
14
Формы и ввод
В продукте нет ни одного текстового поля — зато есть четыре нестандартных контрола. Ниже и они, и типовые поля на случай будущих экранов.
Выбор цвета субтитров
Сплошная градиентная полоса высотой 36px, границы размыты. Цвет считается интерполяцией между восемью опорными точками, ручка — небольшая точка, её ход поджат внутрь, чтобы не свисала с краёв.
.hue + .hue-knobКолесо шрифтов
Прокручиваемый список с прилипанием по центру. Рамка нарисована суперэллипсом, верхняя и нижняя линии уходят в прозрачность — остаются боковые и углы. Соседние названия стоят ровно по линиям.
.fwheelСлайдер
Подпись и значение над дорожкой, пройденная часть подкрашена акцентом через переменную --p, которую обновляет обработчик. Высота дорожки 5px, кружок 17px.
Типовые поля — на будущее
Поле ввода
Заливка чипа, радиус 16px, подсказка под полем 12px. Рамки нет — граница читается по светлоте.
Поле с ошибкой
Ошибка — тёплая заливка плюс тонкое кольцо и подпись под полем, а не сводкой сверху. Красный только здесь.
Переключатель
Единственный компонент, который остаётся полностью круглым — и дорожка, и кружок. Строка целиком кликабельна.
.am-toggleНеактивная кнопка
Прозрачность 45%, отклик отключён. Цвет не меняется — иначе появляется второй «серый» тон, которого в палитре нет.
Обратная связь
Успех
Зелёная подсветка строки — внутренняя: клип-путь срезал бы внешнюю. Держится 2.4s и гаснет.
.share-row.doneЗагрузка
Кольцевой индикатор рядом с подписью процесса. Одиночного спиннера по центру экрана в этом продукте нет — всегда есть текст, что именно происходит.
.tr-spin15
Панели и меню
Три поверхности второго уровня: панель проигрывания, меню настроек, выпадающий список.
Панель проигрывания
Общая подложка радиусом 22px, внутри две плашки по 38px с радиусом 18px и полем 5px. Внешний радиус больше внутреннего — иначе панель читается как рамка, а не как подложка.
.dt-topМеню настроек
Выезжает от правого края экрана и так же уезжает. Ширина 236px, радиус 22px, строки 10px. Доступно с любого экрана по кнопке «•••».
.app-menu.open16
Прогресс и статусы
Расшифровка — самый долгий шаг сценария, поэтому у неё свой набор индикаторов.
Роудмап расшифровки
Четыре чекпоинта в ряд под прогрессом, подписи в две строки по центру, между точками соединительная линия. Проценты и оставшееся время — одной строкой над полосой.
.checklist + .ck- Полоса прогресса и её заливка — единственные элементы, которые остаются круглыми по всей длине.
- Числа идут таблично: проценты и секунды меняются каждые 380 мс.
- По достижении 100% экран сам уходит на следующий через 650 мс — без кнопки.
17
Медиа и фон
Кадр из видео — полноправный слой интерфейса, а не картинка в рамке.
| Способ | Где | Правило |
|---|---|---|
| Во всю площадь | расшифровка, выбор слов, сохранено, поделиться | кадр заходит на 48px ниже края экрана, низ растворяется маской — видимой границы нет |
| В блоке | первый экран, превью субтитров | суперэллипс, форма задаётся маской, внутреннему кадру скругление не нужно |
| Плитка | сетка выбора, строки списка | квадрат или 9:16, радиус по доле стороны |
- Поверх кадра всегда лежит затемняющий градиент — иначе белый текст на светлом кадре пропадает. Верх экрана «Поделиться» — исключение: там затемнение начинается с 30% высоты.
- Кадр на всех экранах сценария один и тот же — тот, что пользователь выбрал в списке. Экран «Сохранено» подхватывает его так же, как остальные.
- Фон первого экрана — отдельная картинка 1080×1935, мягкие размытые пятна в палитре проекта, центр темнее, чтобы контент читался.
18
Состояния и отклик
Каждый нажимаемый элемент отвечает движением и светом. Ничего не меняет размер скачком.
| Состояние | Что происходит | Длительность |
|---|---|---|
| Наведение | подъём 1–2px, подсветка поверх заливки | 0.22–0.3s |
| Нажатие | scale(.96–.98), подсветка ярче | 0.18s |
| Выбран | заливка акцентом, ореол шире | 0.26s цвет / 0.3s тень |
| Переключение чипа | отдельная вспышка поверх смены цвета | 0.42s |
| Выполнено | зелёная внутренняя подсветка, гаснет сама | 2.4s |
| Неактивно | прозрачность 45%, отклик выключен | — |
19
Доступность
Прототип показывают с экрана, но правила общие: он должен работать и с клавиатуры.
- Зона нажатия — не меньше 44px. У чипа слова это задано явно через
min-height, хотя текст в нём 14.5px. - Кружки цвета и элементы колеса — настоящие
<button>сaria-pressedиaria-selected, а неdivс обработчиком. - Колорпикер —
role="slider"сaria-valuenow, стрелки влево-вправо меняют цвет шагом 4%. - Фокус виден:
:focus-visibleдаёт кольцо акцентом. Снимать обводку фокуса нельзя нигде. - Текст на акценте — только чистый белый. Приглушённые градации на
#9179F2не проходят по контрасту. prefers-reduced-motionотключает все поэтапные появления и вспышки; состояния при этом остаются.
20
Чего не делать
Каждый пункт — реальная ошибка из работы над этим прототипом.
corner-shape как на единственный способ формы.
Свойство есть только в Chrome/Edge. В Safari все скругления молча остаются круглыми, и это не видно, пока не откроешь там.border-radius у элемента, форму которого задаёт маска.
overflow:hidden отрежет содержимое по окружности, и суперэллипса не будет видно — при том что маска применена правильно.mask-border без ключевого слова fill.
Без него центральная область не рисуется: у кнопки выбивает середину и остаётся рамка.appearance:none у <button>.
Нативный контрол рисует свой фон сам и игнорирует форму. Именно поэтому обложки выглядели как squircle, а кнопка рядом — нет.::before с отрицательным z-index.
Такой псевдоэлемент рисуется под фоном предка, и ореол пропадает. Нужен либо box-shadow, либо стекинг-контекст у самого элемента.box-shadow там, где форму даёт маска или клип.
Тень либо не повторит суперэллипс, либо будет срезана. Переносить на filter: drop-shadow.filter на 9-slice-картинке.
Каждый кадр перерисовывает изображение — получается рывок. Анимировать прозрачность накладки.event.isTrusted.21
Токены
Все числа прототипа в одном месте.
Переменные темы
| Токен | Значение | Смысл |
|---|---|---|
| --fr-r | 26px | базовый радиус карточки |
| --fr-r-sm | 18px | радиус мелких плашек |
| --fr-surf | #3A2A5D | поверхность карточки |
| --fr-surf-2 | #453268 | приподнятая поверхность |
| --fr-acc | #8F76F0 | акцент |
| --fr-acc-2 | #A892F7 | акцент светлый |
| --fr-ink | #FFFFFF | основной текст |
| --fr-ink-2 | rgba(255,255,255,.84) | текст второго уровня |
| --fr-ink-3 | rgba(255,255,255,.66) | второстепенное |
| --fr-soft | 0 22px 44px -28px rgba(10,4,30,.9) | мягкая тень |
| --fr-ease | cubic-bezier(.22,1,.36,1) | кривая появления |
Радиусы по компонентам
| Компонент | Радиус | Размер | Доля |
|---|---|---|---|
| Главная кнопка | 30px | 62px высота | 48% |
| Панель Preview | 22px | 48px | 46% |
| Строка списка / шеринга | 16–22px | 66px | ~30% |
| Чип слова | 19px | 44px | 43% |
| Кнопка Preview / плашка файла | 18px | 38px | 47% |
| Иконка приложения | 18px | 56px | 32% |
| Плитка видео | 18px | 169px | 11% |
| Миниатюра в строке | 10px | 54px | 19% |
| Карточка | 26px | — | — |
| Кадр телефона | 42px | 390×844 | — |
Отступы и размеры
| Что | Значение |
|---|---|
| Боковое поле экрана | 20px |
| Низ экрана до края | 40px |
| Между блоками | 16px |
| Над главной кнопкой | 28px |
| Промежуток чипсов | 9px |
| Запас поля ленты сверху / снизу | 24px / 26px |
| Высота главной кнопки | 62px |
| Высота плашки (Preview, таймер, файл) | 38px |
| Минимальная высота чипа | 44px |
| Ширина меню настроек | 236px |
Время
| Что | Значение |
|---|---|
| Наведение, нажатие | 0.18–0.3s |
| Смена цвета чипа | 0.26s |
| Вспышка чипа | 0.42s |
| Уход содержимого экрана | 0.36s, шаг 35ms |
| Приход содержимого | 0.52s, шаг 55ms, старт 0.26s |
| Приезд чипсов | 0.46s, шаг 22ms, максимум 18 шагов |
| Выезд меню настроек | 0.44s |
| Тик прогресса расшифровки | 380ms |
| Подсветка «выполнено» | 2.4s |
22
Как пользоваться
Порядок действий, когда нужно собрать новый экран или компонент.
- Найти похожее в каталоге. Раздел 09 — таблица с живыми образцами; селектор под названием ведёт прямо к коду в
index-v1-backup.html. - Взять размеры из раздела 21. Новых чисел не придумывать: если нужного размера нет, скорее всего подходит соседний.
- Выбрать технику формы по разделу 06. Заливка — подложка-псевдоэлемент. Обрезает содержимое — многослойная маска. Квадрат — clip-path.
- Проверить долю радиуса. Рядом стоящие компоненты должны иметь близкую долю радиуса к размеру, а не одинаковое число.
- Не ставить обводку. Если элемент не отделяется от фона — менять светлоту поверхности, а не добавлять линию.
- Проверить ореолы. У любого светящегося элемента контейнер должен иметь запас поля.
- Прогнать по разделу 20. Двенадцать пунктов «чего не делать» — это ровно те ошибки, которые уже были допущены здесь.