docs: add new design references

This commit is contained in:
2026-08-27 16:02:08 +05:00
parent 83d3ce1198
commit 84534b2f58
28 changed files with 17131 additions and 0 deletions
+191
View File
@@ -0,0 +1,191 @@
# План: переезд на новый дизайн (refs)
> Статус: план к выполнению.
>
> Источники: `refs/` — Next/React-референс (правда по пикселям), `refs-html/` —
> статические HTML-снимки для быстрого просмотра в браузере.
## 1. Что происходит
В `refs/` лежит новый визуальный язык проекта: «чертёжный» техно-стиль —
сетка на фоне, IBM Plex Sans/Mono, моно-микролейблы в верхнем регистре,
острые углы 4px, панели с 1px-бордером, акценты синий/циан/амбер, зелёные
статус-точки. Референс написан на Next 16 + Tailwind v4, но **переезд
дизайновый, а не фреймворковый**: SvelteKit в `web/` остаётся, переносится
только дизайн-слой (токены → примитивы → UI-kit → страницы).
Чего не делаем: не тащим Tailwind и React в проект. Токены из
`refs/app/globals.css` переносятся в наш vanilla-CSS слой почти один в один,
классы референса (`step-card`, `setting-group`, …) воспроизводятся как наши
глобальные утилиты и стили компонентов.
## 2. Токены (фундамент)
Маппинг старых токенов `web/src/app.css` → новые из референса:
| Старый | Новый | Light | Dark |
| -------------- | -------------- | --------- | ------------------------ |
| `--bg` | `--background` | `#eef1f4` | `#11171d` |
| `--surface` | `--panel` | `#f8fafb` | `#182129` |
| `--text` | `--foreground` | `#17212b` | `#e8eef2` |
| `--text-muted` | `--muted` | `#6d7883` | `#91a0ac` |
| `--border` | `--line` | `#cbd3da` | `#33414c` |
| `--accent` | `--blue` | `#1769d2` | `#54a2ff` |
| — | `--cyan` | `#00a8c7` | `#00a8c7` |
| — | `--amber` | `#bd7411` | `#bd7411` |
| — | `--success` | `#25a96a` | `#25a96a` (статус-точки) |
| `--danger` | без изменений | `#e5484d` | `#ff7479` |
Прочее:
- Радиусы: вместо `--radius-s/m` один `--radius: 4px`. Скруглённая мягкость
старой темы уходит.
- Шрифты: `IBM Plex Sans` + `IBM Plex Mono`, self-host через `@fontsource`
(проект offline-first, CDN нельзя). Mono — рабочий шрифт для лейблов,
метаданных, цифр; Sans — для заголовков и текста.
- Фон-сетка приложения (32px blueprint-grid) и шахматка канвасов —
отдельные утилиты `.app-shell`, `.checker-canvas`, не токены.
- Тёмная тема остаётся на `[data-theme='dark']` (инлайн-скрипт в `app.html`
уже есть); класс `.dark-mode` из референса не переносим.
- На переходный период старые имена живут как алиасы
(`--bg: var(--background)` …), чтобы существующие компоненты не ломались
до этапа D. В конце алиасы удаляются.
## 3. Базовые примитивы дизайн-системы
Повторяющиеся паттерны референса выносим в глобальные классы `app.css`
(по одному определению, без копипасты между компонентами):
- `.mono-label` — микро-лейбл: mono 10px, uppercase, letter-spacing .1em,
цвет muted; модификаторы `.mono-label--accent` (синие eyebrow/version).
- `.status-dot` / `.status-line` — точка `--success` + подпись
(«AUTO PIPELINE», «LIVE PREVIEW»).
- `.panel` — панель: фон `--panel`, бордер `--line`; композиция
`.panel-heading` (label + strong + правый слот) / `.setting-group` /
`.settings-footer` с разделителями.
- `.checker-canvas` — рабочая поверхность превью: тёмная подложка +
шахматка; размеры через контейнер.
- `.meta-row` — пары «CAPTION значение» (dimensions/format/size,
result-meta).
- `.segmented` — сегмент-переключатель (общий для языка, типа градиента,
пресетов).
## 4. Минимальный UI-kit (`src/lib/components/ui/`)
API компонентов сохраняем, меняем внутренности. Новые компоненты — только
те, для которых нет аналога:
| Компонент | Статус | Что меняется |
| --------------------------------------------- | --------- | ------------------------------------------------------------------------------------------------------- |
| `Button.svelte` | рестайл | варианты `primary` (синий solid) / `secondary` (outline) / `ghost` + `icon`-режим; busy-логика остаётся |
| `Field.svelte` | рестайл | обёртка в стиле `.setting-group`: mono-label + output справа |
| `SliderField` | рестайл | range + `<output>` значения, опциональная строка подсказок («strict edges … more removal») |
| `ColorField` | рестайл | swatch + hex-input + нативный color-picker в одном поле |
| `TextField` / `SelectField` / `CheckboxField` | рестайл | чекбокс → switch-toggle 32×18 как в рефе |
| `SegmentedControl.svelte` | **новый** | RU/EN, Linear/Radial, пресеты прозрачности |
| `Badge.svelte` | **новый** | тег типа шага (BACKGROUND/TRANSFORM/STYLE), чип «✓ AUTO» |
| `MetaList.svelte` | **новый** | `.meta-row` для DIMENSIONS/FORMAT/SIZE |
| `EmptyState.svelte` | рестайл | под новый стиль панелей |
Иконки: в рефе lucide-react; берём `lucide-svelte` (те же пути, MIT) —
1617px, stroke, приглушённый цвет.
## 5. Шелл и страницы
### 5.1 Layout (`+layout.svelte`)
- Topbar: brand-mark «EP» (синий квадрат 30px) + `easy-png-tools` + версия
суффиксом `/ v0.x`; справа — статус «LOCAL-ONLY», icon-btn темы
(Moon/Sun), сегмент RU|EN.
- Footer: `easy-png-tools vX` · `pipeline is local-only` · © год.
- Фон-сетка на корневом контейнере `.app-shell`.
### 5.2 `/` — воркспейс
Текущий hero + ToolSearch переезжает в рампу референса: eyebrow
«PNG PROCESSING / WORKSPACE», крупный h1 (clamp 3664px, tracking 0.06em),
lede; поиск — строка в стиле file-chip/pipeline-head. «Открыть последний» —
кнопка secondary. Каталог `/list-tools` — сетка карточек в стиле
`image-card` (label сверху, canvas-превью).
### 5.3 `/tools/[id]` — страница инструмента
Главная перестройка. Целевая раскладка из рефа — двухпанельная:
```txt
eyebrow + tool-title (+ LIVE PREVIEW)
┌─ settings-panel ────────┐ ┌─ preview-panel ─────────┐
│ panel-heading │ │ preview-toolbar │
│ setting-group ×N │ │ checker-canvas / source │
│ (Slider/Color/Toggle…) │ │ + result comparison │
│ settings-footer (reset) │ │ meta-row │
└─────────────────────────┘ └─────────────────────────┘
```
- `ParamsCard`/`ParamForm` → секция настроек: поля становятся
`.setting-group` через обновлённый `ui/*`.
- `SourceCard`/`ResultCard`/`Preview` → превью-панель: toolbar с именем
файла и download-btn, canvas на шахматке, result-meta снизу.
- Chain-блоки (`ChainToolBlock`) — нумерованные step-cards из главной
рефа: индекс `01`, drag-handle, Badge типа, заголовок, кнопка удаления;
параметры этапа — те же setting-groups внутри карточки.
- Существующий `ToolStageClassic`/inline-вариант заменяются целевой
раскладкой; stage-абстракция из plan-inline-params закрывается этим
переездом.
### 5.4 `/demo`
Зеркало `refs-html/index.html` — витрина пайплайна, используется как
приёмочный стенд нового стиля (делается первым среди страниц).
## 6. Этапы и проверки
Каждый этап заканчивается зелёными `test`/`check`/`build` и ревью в браузере
(обе темы) против соответствующего HTML из `refs-html/`.
- **A. Фундамент** — новые токены + алиасы старых, @fontsource IBM Plex,
утилиты §3, тёмная тема на `[data-theme]`. Критерий: приложение выглядит
по-старому (алиасы дают прежние цвета близко к новым), тесты зелёные,
FOUC-скрипт темы работает.
- **B. UI-kit** — компоненты §4: сначала рестайл существующих, потом новые
(`SegmentedControl`, `Badge`, `MetaList`). Критерий: демо-страница kit'а
или `/demo` показывает все состояния; unit-тесты форм не падают.
- **C. Шелл** — topbar/footer по §5.1, переключение темы и языка в новом
виде. Критерий: i18n/theme тесты зелёные, разметка шапки соответствует
рефу.
- **D. Страница инструмента** — раскладка §5.3 на `/demo`, затем на всех
инструментах; chain-карточки. Критерий: смоук §7, скриншоты против
`refs-html/gradient.html` и `background-remover.html`.
- **E. Главная и каталог** — §5.2. Критерий: поиск/фильтры работают,
покрытие search-coverage/i18n тестов зелёное.
- **F. Чистка** — удаление алиасов старых токенов, неиспользуемых классов
`app.css` (`.tool-stage`, `.pane*`…), финальный проход по брейкпоинтам
1200/1100/800/480 из рефа. Критерий: grep по старым токенам пуст,
build без предупреждений.
Оценка объёма: A+B — фундамент (~полдня), C+D — основная работа (~1–2 дня),
E+F — добивка (~полдня).
## 7. Смоук (после этапа D)
1. Светлая и тёмная тема: сетка фона, панели, шахматка канвасов читаются,
контраст mono-лейблов достаточный.
2. Инструмент с параметрами (градиент): slider/color/toggle в стиле
setting-groups, автозапуск не регрессировал.
3. Удаление фона: сравнение source/result, маска, пипетка работают на новой
шахматке.
4. Chain из 3+ инструментов: step-cards рендерятся, удаление/сброс работают.
5. Узкий экран 800px: настройки над превью, sticky выключается как в рефе.
6. RU/EN: новые лейблы локализованы; mono-лейблы рефа либо ключи i18n,
либо осознанно английские брендовые элементы (см. §8).
## 8. Открытые вопросы
- Mono-лейблы рефа на английском (`PROCESSING PIPELINE`). Предложение:
завести i18n-ключи, но для техно-эстетики допустимо оставить часть
английскими как «приборную панель». Решить на этапе A.
- Версия в топбаре/футере: брать из package.json при сборке (define) или
захардкодить? Мелочь, решить на этапе C.
- `refs/` оставляем в репо как источник правды; при изменении дизайна —
правки там, затем синхронизация вручную. Регенерация refs-html описана в
его README.