Files
easy-png-tools/docs/plan-redesign.md
T

192 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План: переезд на новый дизайн (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.