Dev handoff
Превращает готовый HTML-макет/прототип в передаваемый пакет: токены, инвентарь компонентов, состояния, копирайт.
Структура пакета
handoff/
README.md ← обзор: что это, как открыть, ссылки
tokens.css ← извлечённые CSS-переменные (или скопированные)
tokens.json ← те же токены как JSON для дизайн-инструментов
components.md ← инвентарь компонентов с размерами и состояниями
copy.md ← все тексты из макета
screens/ ← PNG каждого ключевого экрана
source/ ← исходные HTML/CSS/JS
Алгоритм
- Прочитай исходный HTML. Найди все CSS-переменные в
:root — это твоя база токенов. Сохрани в tokens.css.
- Сделай из них JSON для совместимости с Style Dictionary / Tokens Studio:
{ "color": { "primary": { "value": "#D97757" } } }
- Инвентарь компонентов. Пройди по разметке, выпиши уникальные блоки (кнопки, карточки, инпуты). Для каждого:
- Размеры (width/height, padding, gap).
- Радиус, тень, бордер.
- Состояния, которые есть в коде (hover, focus, disabled). Если каких-то нет — отметь как «to be defined».
- Копирайт. Собери все видимые тексты в
copy.md с привязкой к экрану. Это полезно для перевода и редактуры.
- Скриншоты экранов. Через Playwright (см.
export-png) сними каждый ключевой стейт.
- README.md в корне handoff: ссылки на оригинал, как запустить локально, на каких разрешениях тестировалось, какие фичи не реализованы.
Шаблон components.md
# Components
## Button — primary
- **Где:** Header, Onboarding step 2
- **Размеры:** padding 12px 20px, border-radius 8px, min-height 44px
- **Цвета:** bg `var(--color-primary)`, text `#fff`
- **Шрифт:** 14px / 600 / -0.01em
- **Состояния:**
- default: `var(--color-primary)`
- hover: `oklch(from var(--color-primary) calc(l - 0.05) c h)`
- active: `oklch(from var(--color-primary) calc(l - 0.1) c h)`
- disabled: opacity 0.4, cursor not-allowed
- focus: outline 2px var(--color-primary), offset 2px
## Card
...
Шаблон tokens.json
{
"color": {
"bg": { "value": "#FAF9F6" },
"fg": { "value": "#111111" },
"primary": { "value": "#D97757" }
},
"font": {
"display": { "value": "Helvetica Neue, sans-serif" },
"body": { "value": "Helvetica Neue, sans-serif" }
},
"radius": {
"sm": { "value": "4px" },
"md": { "value": "8px" },
"lg": { "value": "16px" }
},
"spacing": {
"1": { "value": "4px" }, "2": { "value": "8px" },
"3": { "value": "12px" }, "4": { "value": "16px" },
"6": { "value": "24px" }, "8": { "value": "32px" }
}
}
Что добавить, если попросят углублённый handoff
- Storybook stub. Каждый компонент как
.stories.tsx с props и controls.
- Spec-листы: PDF с разметкой расстояний и подписями (легко делать через
export-pdf поверх макета с overlay-сеткой).
- Анимации: список переходов с длительностью и easing. Например:
transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1).
- Адаптивность: breakpoints + что меняется на каждом.
Чего не делать
- Не выгружай как handoff макет, в котором ещё всё в
inline-style и магических числах. Сначала вынеси в переменные.
- Не пиши «hover: чуть темнее» — давай конкретное значение или формулу через
oklch(from ...).
- Не плоди
tokens.unused.json. Включай только то, что реально используется в макете.
1---2name: dev-handoff3description: Handoff-пакет разработчику из готового HTML: токены, компоненты, README. Триггеры: «пакет для разраба», «передать разработчику», «хендофф».4---56# Dev handoff78Превращает готовый HTML-макет/прототип в передаваемый пакет: токены, инвентарь компонентов, состояния, копирайт.910## Структура пакета1112```13handoff/14 README.md ← обзор: что это, как открыть, ссылки15 tokens.css ← извлечённые CSS-переменные (или скопированные)16 tokens.json ← те же токены как JSON для дизайн-инструментов17 components.md ← инвентарь компонентов с размерами и состояниями18 copy.md ← все тексты из макета19 screens/ ← PNG каждого ключевого экрана20 source/ ← исходные HTML/CSS/JS21```2223## Алгоритм24251. **Прочитай исходный HTML.** Найди все CSS-переменные в `:root` — это твоя база токенов. Сохрани в `tokens.css`.262. **Сделай из них JSON** для совместимости с Style Dictionary / Tokens Studio:27 ```json28 { "color": { "primary": { "value": "#D97757" } } }29 ```303. **Инвентарь компонентов.** Пройди по разметке, выпиши уникальные блоки (кнопки, карточки, инпуты). Для каждого:31 - Размеры (width/height, padding, gap).32 - Радиус, тень, бордер.33 - Состояния, которые есть в коде (hover, focus, disabled). Если каких-то нет — отметь как «to be defined».344. **Копирайт.** Собери все видимые тексты в `copy.md` с привязкой к экрану. Это полезно для перевода и редактуры.355. **Скриншоты экранов.** Через Playwright (см. `export-png`) сними каждый ключевой стейт.366. **README.md** в корне handoff: ссылки на оригинал, как запустить локально, на каких разрешениях тестировалось, какие фичи не реализованы.3738## Шаблон components.md3940```md41# Components4243## Button — primary44- **Где:** Header, Onboarding step 245- **Размеры:** padding 12px 20px, border-radius 8px, min-height 44px46- **Цвета:** bg `var(--color-primary)`, text `#fff`47- **Шрифт:** 14px / 600 / -0.01em48- **Состояния:**49 - default: `var(--color-primary)`50 - hover: `oklch(from var(--color-primary) calc(l - 0.05) c h)`51 - active: `oklch(from var(--color-primary) calc(l - 0.1) c h)`52 - disabled: opacity 0.4, cursor not-allowed53 - focus: outline 2px var(--color-primary), offset 2px5455## Card56...57```5859## Шаблон tokens.json6061```json62{63 "color": {64 "bg": { "value": "#FAF9F6" },65 "fg": { "value": "#111111" },66 "primary": { "value": "#D97757" }67 },68 "font": {69 "display": { "value": "Helvetica Neue, sans-serif" },70 "body": { "value": "Helvetica Neue, sans-serif" }71 },72 "radius": {73 "sm": { "value": "4px" },74 "md": { "value": "8px" },75 "lg": { "value": "16px" }76 },77 "spacing": {78 "1": { "value": "4px" }, "2": { "value": "8px" },79 "3": { "value": "12px" }, "4": { "value": "16px" },80 "6": { "value": "24px" }, "8": { "value": "32px" }81 }82}83```8485## Что добавить, если попросят углублённый handoff8687- **Storybook stub.** Каждый компонент как `.stories.tsx` с props и controls.88- **Spec-листы:** PDF с разметкой расстояний и подписями (легко делать через `export-pdf` поверх макета с overlay-сеткой).89- **Анимации:** список переходов с длительностью и easing. Например: `transition: opacity 200ms cubic-bezier(0.4, 0, 0.2, 1)`.90- **Адаптивность:** breakpoints + что меняется на каждом.9192## Чего не делать9394- Не выгружай как handoff макет, в котором ещё всё в `inline-style` и магических числах. Сначала вынеси в переменные.95- Не пиши «hover: чуть темнее» — давай конкретное значение или формулу через `oklch(from ...)`.96- Не плоди `tokens.unused.json`. Включай только то, что реально используется в макете.