Скилл для Claude

Соберите любой макет на дизайн-системе Fast Reel

Установите скилл — и Claude будет рисовать экраны, флоу, лендинги и отдельные компоненты в языке Fast Reel: теми же цветами, шрифтами, компонентами и кодом, что в прототипе. На выходе — готовый HTML, который можно открыть в браузере.

Скачать скилл .zip · 1.9 МБ
  1. Скачайте архив. Распаковывать не нужно.
  2. Загрузите в Claude: Customize → Skills → + → Upload a skill и выберите архив. В настройках должно быть включено выполнение кода (Code execution).
  3. Попросите макет — в любом чате, скилл подключится сам.

В Claude Code: распакуйте архив в ~/.claude/skills/

01

Обзор

Fast Reel — прототип приложения, которое превращает длинное видео в вертикальный ролик: речь расшифровывается, пользователь тыкает в нужные слова, остальное вырезается. Язык интерфейса — мягкий скевоморфизм без стекла: плотные матовые поверхности, суперэллипс вместо круглых углов, свет вместо обводок.

8экранов сценария
4техники формы угла
11токенов темы
390×844кадр прототипа
0стекла и блюра

Из чего состоит

СлойЧто задаётГде лежит
Тема кейсапалитра, радиус, тень, кривая ускорения:root → --fr-*
Базовый прототипкаркас экранов, типовые компоненты.screen, .btn, .chip, .row…
Скоуп кейсавсё, что отличает Fast Reel от остальных прототипов.v2-case[data-case="fastreel"] .phone …
Форма угласуперэллипс поверх обычного border-radiusmask-image / border-image / clip-path

Чем этот язык отличается

Плотность вместо стекла

Ни одного backdrop-filter. Поверхности матовые и непрозрачные, глубину даёт свет сверху и мягкая тень вниз.

highlightsvideo

Свет вместо обводок

Выделение — ореол, а не рамка. Обводка в этом языке появляется только там, где нужна подсказка «это контур, а не объект».

Суперэллипс везде

Все скругления — суперэллипс четвёртой степени. Настоящие круги остаются кругами: аватар, тумблер, точка прогресса.

02

Принципы

Семь правил, по которым собирается любой новый экран Fast Reel.

  • Углы — суперэллипс, без исключений. Обычное круглое скругление допустимо только у настоящих кругов: аватар, круглая кнопка, тумблер, точка, полоса прогресса.
  • Стекла нет. backdrop-filter отключён по всему прототипу принудительно. Полупрозрачность допустима, размытие подложки — нет.
  • Глубина — светом. Сверху мягкий радиальный блик внутри поверхности, снизу рассеянная тень. Никаких внутренних «губ» и псевдообъёма.
  • Выделение светится. Активное состояние — заливка акцентом плюс ореол наружу. Ореол никогда не обрезается: контейнеру нужен запас поля.
  • Одна кривая на весь прототип. cubic-bezier(.22,1,.36,1) для появления, cubic-bezier(.65,0,.35,1) для переходов между экранами.
  • Контент уезжает вниз, приходит снизу. Экраны не ездят вбок: содержимое уходит по частям вниз, следующий экран приезжает снизу тоже по частям.
  • Фото — всегда в край или в форму. Кадр либо занимает всю площадь экрана и растворяется маской, либо лежит в блоке с суперэллипсом. Промежуточных вариантов нет.

03

Цвет

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

Поверхности

Фон экрана, верх#2B1C4Fверхняя точка градиента экрана
Фон экрана, середина#221741середина градиента, 56%
Фон экрана, низ#1A1133нижняя точка градиента
Карточка--fr-surf · #3A2A5Dglass, hstep, меню настроек
Карточка, приподнятая--fr-surf-2 · #453268выпадающие списки, второй слой
Чип в покое#42305Fневыбранное слово, кнопка шрифта

Акцент и сигналы

Акцент#9179F2главная кнопка, выбранный чип, Preview
Акцент, токен--fr-acc · #8F76F0заливка слайдеров, чекпоинты
Акцент светлый--fr-acc-2 · #A892F7иконки, точка счётчика, подписи
Светлая кнопка#F3EEFEUpload video, Open in Photos
Успех#5EE6A8Ready, галочка, подсветка «скопировано»
Тёплый отсвет#FF8CAFтолько в фоне экрана и в фоне первого экрана

Текст

ТокенЗначениеГде
--fr-ink#FFFFFFзаголовки, подписи на акценте, значения
--fr-ink-2rgba(255,255,255,.84)основной текст, лиды, подписи полей
--fr-ink-3rgba(255,255,255,.66)второстепенное: единицы, счётчики, хинты

Правила цвета

  • Зелёный — только сигнал. Он не бывает фоном, кнопкой или акцентом навигации: «Ready», галочка, зелёная подсветка после нажатия.
  • Розовый живёт только в фоне: радиальный отсвет экрана и фон первого экрана. В компонентах его нет.
  • Между --fr-surf и фоном экрана нет обводки. Разделяет их разница светлоты, а не линия.
  • Текст на акценте — всегда чистый белый. --fr-ink-2 на #9179F2 даёт контраст ниже 4.5:1.

04

Типографика

Один шрифт на всё — Jost. Роли различает вес и кегль, не гарнитура. Ниже каждая роль показана живьём, тем же начертанием, что в прототипе.

Aa Яя
ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz
АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ
абвгдеёжзийклмнопрстуфхцчшщъыьэюя
0123456789 · % → ₽ — «» ()

Веса

Type. Tap. Done.300 · лиды и подзаголовки
Type. Tap. Done.400 · подписи чекпоинтов
Type. Tap. Done.500 · чипсы, плашки, значения
Type. Tap. Done.600 · кнопки, строки списка
Type. Tap. Done.700 · заголовки экранов

Роли

ОбразецРольКегль / весЦвет и применение
Type. Tap. Done.
Герой.hero-h26px · 700#fff · первый экран
Your videos
Заголовок экрана.topbar h226px · 700#fff · «Your videos», «Share»
Generate clip
Кнопка.btn17px · 600#fff или #2A1355
We transcribe, you pick the phrases
Подзаголовок.hero-p15.5px · 300--fr-ink-2 · лид под заголовком
Morning standup recap
Строка списка.rinfo b15px · 600#fff · название ролика
highlights
Чип слова.chip14.5px · 500#fff · слово в ленте
Preview · 05:40
Кнопка-плашка.fr-preview, .dt-dur13.5px · 500#fff · Preview, таймер, файл
Size · Position · Font
Подпись поля.ctlrow-h b12.5px · 500--fr-ink-2
28 pt · Bottom · 0:28
Значение.ctlrow-h span12px · 500--fr-ink-3 · табличные цифры
Transcribing
words
Чекпоинт.ck span11px · 400--fr-ink-3 · подписи шагов
Цифры, которые меняются на ходу — таймер, счётчик слов, размер шрифта, проценты — идут с font-variant-numeric: tabular-nums. Без этого строка дёргается при каждом тике.
TodayIwillshowhowtocuthighlightsfromanyvideo
Type. Tap. Done.
We transcribe, you pick the phrases, we deliver a vertical video with captions
Type. Tap. Done.
We transcribe, you pick the phrases, we deliver a vertical video with captions

Пара «герой + лид»

Заголовок 700, лид 300 — контраст веса делает больше, чем разница кегля. Лид никогда не идёт весом 400, иначе пара схлопывается.

.hero-h + .hero-p

05

Геометрия и ритм

Поля кратны 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: карточки, шаги «как это работает»
30px48% высотыглавные кнопки; больше нельзя — углы начнут сплющиваться
Правило доли. Одинаковый радиус на элементах разного размера выглядит по-разному: 22px на плитке 56px — это 39% стороны, а на строке высотой 66px — 33%. Чтобы два соседних компонента читались одинаково, сравнивать нужно долю, а не число.

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, иначе движок рисует контрол сам.

.btn::before
English

Мелкая форма

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

.lang-badge

07

Свет и подсветка

Объём в этом языке даёт не тень под объектом, а свет внутри него и ореол вокруг.

Три приёма

ПриёмЗначениеГде
Блик внутри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)карточки, меню, панели
fromhighlights

Ореол выбора

Выбранный чип светится наружу. Поэтому лента слов идёт с запасом поля 24px сверху — иначе ореол верхнего ряда обрезается краем прокрутки.

.chip / .chip.sel

Карточка

Ровная заливка --fr-surf, без обводки и без внутреннего блика. Отделяется от фона только светлотой.

.glass
Тень и форма. Внешний box-shadow не повторяет суперэллипс и обрезается маской. Там, где форму задаёт маска или подложка, тень переносится на filter: drop-shadow — он применяется к уже полученной альфе и повторяет контур точно.

08

Движение

Две кривые, три длительности. Всё остальное — производные.

РольКриваяДлительность
Появление, выездcubic-bezier(.22,1,.36,1) · --fr-ease0.42–0.52s
Переход между экранамиcubic-bezier(.65,0,.35,1) — ease-in-out0.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 покой · проигрываниеэкран выбора слов
Export quality1080p · 60fps
Auto-captions
Меню настроек.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-*.

ОбразецКомпонентСостоянияГде пригодится
Поиск.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 свёрнут · развёрнутсправка, частые вопросы
РоликСловДлит.
Morning standup280:28
Product demo340:36
Таблица.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 ₽ / мес
  • Без водяного знака
  • Экспорт 4K
  • Безлимит роликов
Блок тарифа.fx-price текущий · доступныйэкран подписки
Готово
Секция ниже
Разделитель.fx-div один видразбивка длинных списков
Водяной знакPro
Строка настройки.fx-surf значение · бейдж · переходэкран настроек

10

Экраны и каркас

Восемь экранов, один каркас. Различаются они тем, чем заполнена середина, — шапка и низ одинаковы везде.

Каркас

СлойСелекторПравило
Кадр.phone390×844, радиус 42px, overflow:hidden
Экран.screenабсолютный, колонка; активный — .active
Поле.s-pad8px 20px 40px, колонка на всю высоту
Шапка.topbarлоготип или назад + заголовок + «•••»
Фон-кадр.tr-bgфото во всю площадь, низ растворяется маской, заходит на 48px ниже края

Сценарий

ЭкранКлючЧто на нём
Первыйwelcomeфон-картинка, чипсы сверху, персонаж, герой, две кнопки
Выбор видеоpickвкладки, сетка плиток, кнопка «Use this video»
Расшифровкаtranscribeкадр во всю площадь, прогресс, четыре чекпоинта в ряд
Выбор словdetailкадр, панель Preview, лента чипсов, итог, кнопка
Настройкаcustomizeпревью, колорпикер, колесо шрифтов, два слайдера
Сохраненоsavedкадр во всю площадь, круг подтверждения, плашка файла
Поделитьсяshareкадр, сетка приложений, строки действий
Как работаетhowitтри шага, приходят по очереди снизу
Единое положение нижней кнопки. На всех экранах низ кнопки отстоит от края кадра на 40px. Экран выбора слов — исключение по разметке: кнопка живёт внутри .dt-sheet, и отступ задаётся его собственным padding-bottom, а не полем экрана.

11

Кнопки

Главная кнопка одна на экран. Всё остальное — плашки, ссылки и круглые кнопки шапки.

Основная

Высота 62px, радиус 30px, подпись 17/600. Фон снят с элемента — форму и заливку даёт подложка. У <button> обязателен appearance:none.

.btn.btn-primary

Светлая

Тот же размер и форма, заливка #F3EEFE, текст #2A1355. Ставится там, где действие ведёт наружу приложения.

.btn.btn-white

Preview

Высота 38px, радиус 18px. В проигрывании заливка гаснет до #4A3570, иконка меняется на паузу. Ширина не фиксируется — подпись одна и та же.

.fr-preview / .playing

Ссылка-кнопка

Без фона и рамки, 15/500. Ставится под главной кнопкой или как отмена. Никогда не бывает единственным действием на экране.

.linkbtn

Отклик

  • Наведение — подъём на 1.5px плюс мягкая подсветка поверх заливки. Подсветка — накладка той же формы с переходом по прозрачности, а не filter:brightness: фильтр на 9-slice-картинке даёт рывок.
  • Нажатие — scale(.98) и подсветка ярче. Никаких смещений вниз и «вдавленных» теней.
  • Подпись центрируется по оптике, а не по геометрии: у Jost прописные сидят выше середины, поэтому текст опущен на 2px.

12

Чипсы слов

Главный элемент продукта: расшифровка — это не текст, а набор нажимаемых слов.

Heyeveryonewelcome backtothe channeltoday

Лента расшифровки

Минимальная высота 44px — палец. Радиус 19px, кегль 14.5/500, промежуток 9px. Выбранные слова и есть будущий ролик: их порядок и есть монтаж.

#words .chip
video

В покое

Заливка #42305F, блик сверху внутри, ореол 0 0 13px 1px rgba(86,62,134,.55). Чип не бывает плоским — без ореола он читается как надпись, а не как объект.

highlights

Выбран

Заливка #9179F2, ореол вдвое шире и ярче. Переход по цвету 0.26s, по тени 0.3s — тень догоняет цвет, это и даёт ощущение «загорелся».

.chip.sel

Правила ленты

  • Запас поля сверху 24px, снизу 26px: ореол верхнего ряда при наведении иначе срезается краем прокрутки.
  • Лента растворяется маской сверху и снизу. Верхний градиент включается только когда есть что прокручивать вверх — в начале ленты первый ряд должен быть полностью плотным.
  • При прокрутке к элементу добавляется scroll-padding, равный полю, иначе прилипание сдвигает ленту.
  • Во время Preview лента доезжает до текущего слова плавным твином, а не скачком scrollTop.
  • Чипсы — единственный компонент, форму которого не обрезают маской: это срезало бы ореол.

13

Списки и плитки

Два способа показать видео: строка с описанием и плитка-кадр.

0:24
Morning standup recap2h ago · 8 words
0:32
Product demo — final cutyesterday · 12 words

Строка ролика

Миниатюра 54px с радиусом 10px, название 15/600, метаданные 13px приглушённо, шеврон справа. Радиус строки 16px — это те же 30% высоты, что у панелей.

.list .row
00:36

Плитка

Квадрат с кадром и длительностью в углу. Форма — маска; у вложенного кадра своего скругления быть не должно.

.vcell + .thumb

Плитка выбрана

Кольцо выбора — внутреннее, через ::after с border. Внешний box-shadow формой суперэллипса не повторяется и пропадает.

.vcell.on

14

Формы и ввод

В продукте нет ни одного текстового поля — зато есть четыре нестандартных контрола. Ниже и они, и типовые поля на случай будущих экранов.

Выбор цвета субтитров

Сплошная градиентная полоса высотой 36px, границы размыты. Цвет считается интерполяцией между восемью опорными точками, ручка — небольшая точка, её ход поджат внутрь, чтобы не свисала с краёв.

.hue + .hue-knob

Колесо шрифтов

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

.fwheel
Size28 pt
PositionBottom

Слайдер

Подпись и значение над дорожкой, пройденная часть подкрашена акцентом через переменную --p, которую обновляет обработчик. Высота дорожки 5px, кружок 17px.

input[type=range]

Типовые поля — на будущее

Morning standup
Название ролика в галерее

Поле ввода

Заливка чипа, радиус 16px, подсказка под полем 12px. Рамки нет — граница читается по светлоте.

alexey@startup
Неверный формат email

Поле с ошибкой

Ошибка — тёплая заливка плюс тонкое кольцо и подпись под полем, а не сводкой сверху. Красный только здесь.

Auto-captions
Notifications

Переключатель

Единственный компонент, который остаётся полностью круглым — и дорожка, и кружок. Строка целиком кликабельна.

.am-toggle

Неактивная кнопка

Прозрачность 45%, отклик отключён. Цвет не меняется — иначе появляется второй «серый» тон, которого в палитре нет.

Обратная связь

Успех

Зелёная подсветка строки — внутренняя: клип-путь срезал бы внешнюю. Держится 2.4s и гаснет.

.share-row.done
Transcribing speech

Загрузка

Кольцевой индикатор рядом с подписью процесса. Одиночного спиннера по центру экрана в этом продукте нет — всегда есть текст, что именно происходит.

.tr-spin

15

Панели и меню

Три поверхности второго уровня: панель проигрывания, меню настроек, выпадающий список.

05:40

Панель проигрывания

Общая подложка радиусом 22px, внутри две плашки по 38px с радиусом 18px и полем 5px. Внешний радиус больше внутреннего — иначе панель читается как рамка, а не как подложка.

.dt-top
SG
Sam GreenPro plan · renews Jul 12
Export quality1080p · 60fps
Auto-captions
LanguageEnglish

Меню настроек

Выезжает от правого края экрана и так же уезжает. Ширина 236px, радиус 22px, строки 10px. Доступно с любого экрана по кнопке «•••».

.app-menu.open

16

Прогресс и статусы

Расшифровка — самый долгий шаг сценария, поэтому у неё свой набор индикаторов.

62%about 23 s left
Uploading video
Detecting speech
Transcribing words
Scoring key phrases

Роудмап расшифровки

Четыре чекпоинта в ряд под прогрессом, подписи в две строки по центру, между точками соединительная линия. Проценты и оставшееся время — одной строкой над полосой.

.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, а кнопка рядом — нет.
Не сравнивать скругления по абсолютному радиусу. 22px на плитке 56px — это 39% стороны, а на строке 66px — 33%. Одинаковое число даёт разный вид; сравнивать нужно долю.
Не вешать свечение на ::before с отрицательным z-index. Такой псевдоэлемент рисуется под фоном предка, и ореол пропадает. Нужен либо box-shadow, либо стекинг-контекст у самого элемента.
Не обрезать ореол контейнером. Ленте слов нужен запас поля сверху: без него подсветка верхнего ряда срезается краем прокрутки.
Не ставить внешний box-shadow там, где форму даёт маска или клип. Тень либо не повторит суперэллипс, либо будет срезана. Переносить на filter: drop-shadow.
Не анимировать filter на 9-slice-картинке. Каждый кадр перерисовывает изображение — получается рывок. Анимировать прозрачность накладки.
Не ставить автоплей на паузу по любому клику. Сценарий сам нажимает кнопки внутри прототипа. Пауза только по event.isTrusted.
Не квантовать PNG с 3D-рендером. Палитра в 200 цветов превращает мягкие градиенты персонажа в пятна. Полноцветный PNG весит вчетверо больше и это нормально.
Не оставлять зелёную кайму после хромакея. Альфа берётся по перевесу зелёного над максимумом красного и синего, и в полупрозрачных краях зелёный гасится отдельно. Порога по цвету недостаточно.
Что делать вместо: проверять числом, а не глазом. Контур угла снимается попиксельно и подгоняется к окружности и к суперэллипсу. Меньшая ошибка и есть ответ — это ловит случаи, когда «кажется, что похоже».

21

Токены

Все числа прототипа в одном месте.

Переменные темы

ТокенЗначениеСмысл
--fr-r26pxбазовый радиус карточки
--fr-r-sm18pxрадиус мелких плашек
--fr-surf#3A2A5Dповерхность карточки
--fr-surf-2#453268приподнятая поверхность
--fr-acc#8F76F0акцент
--fr-acc-2#A892F7акцент светлый
--fr-ink#FFFFFFосновной текст
--fr-ink-2rgba(255,255,255,.84)текст второго уровня
--fr-ink-3rgba(255,255,255,.66)второстепенное
--fr-soft0 22px 44px -28px rgba(10,4,30,.9)мягкая тень
--fr-easecubic-bezier(.22,1,.36,1)кривая появления

Радиусы по компонентам

КомпонентРадиусРазмерДоля
Главная кнопка30px62px высота48%
Панель Preview22px48px46%
Строка списка / шеринга16–22px66px~30%
Чип слова19px44px43%
Кнопка Preview / плашка файла18px38px47%
Иконка приложения18px56px32%
Плитка видео18px169px11%
Миниатюра в строке10px54px19%
Карточка26px——
Кадр телефона42px390×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

Как пользоваться

Порядок действий, когда нужно собрать новый экран или компонент.

  1. Найти похожее в каталоге. Раздел 09 — таблица с живыми образцами; селектор под названием ведёт прямо к коду в index-v1-backup.html.
  2. Взять размеры из раздела 21. Новых чисел не придумывать: если нужного размера нет, скорее всего подходит соседний.
  3. Выбрать технику формы по разделу 06. Заливка — подложка-псевдоэлемент. Обрезает содержимое — многослойная маска. Квадрат — clip-path.
  4. Проверить долю радиуса. Рядом стоящие компоненты должны иметь близкую долю радиуса к размеру, а не одинаковое число.
  5. Не ставить обводку. Если элемент не отделяется от фона — менять светлоту поверхности, а не добавлять линию.
  6. Проверить ореолы. У любого светящегося элемента контейнер должен иметь запас поля.
  7. Прогнать по разделу 20. Двенадцать пунктов «чего не делать» — это ровно те ошибки, которые уже были допущены здесь.
Документ живой. Если правило в прототипе изменилось — образец здесь надо обновить, иначе дизайн-система начинает врать, а это хуже, чем её отсутствие.