14 KiB
План: переезд на новый дизайн (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) —
16–17px, 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 36–64px, tracking −0.06em),
lede; поиск — строка в стиле file-chip/pipeline-head. «Открыть последний» —
кнопка secondary. Каталог /list-tools — сетка карточек в стиле
image-card (label сверху, canvas-превью).
5.3 /tools/[id] — страница инструмента
Главная перестройка. Целевая раскладка из рефа — двухпанельная:
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)
- Светлая и тёмная тема: сетка фона, панели, шахматка канвасов читаются, контраст mono-лейблов достаточный.
- Инструмент с параметрами (градиент): slider/color/toggle в стиле setting-groups, автозапуск не регрессировал.
- Удаление фона: сравнение source/result, маска, пипетка работают на новой шахматке.
- Chain из 3+ инструментов: step-cards рендерятся, удаление/сброс работают.
- Узкий экран 800px: настройки над превью, sticky выключается как в рефе.
- RU/EN: новые лейблы локализованы; mono-лейблы рефа либо ключи i18n, либо осознанно английские брендовые элементы (см. §8).
8. Открытые вопросы
- Mono-лейблы рефа на английском (
PROCESSING PIPELINE). Предложение: завести i18n-ключи, но для техно-эстетики допустимо оставить часть английскими как «приборную панель». Решить на этапе A. - Версия в топбаре/футере: брать из package.json при сборке (define) или захардкодить? Мелочь, решить на этапе C.
refs/оставляем в репо как источник правды; при изменении дизайна — правки там, затем синхронизация вручную. Регенерация refs-html описана в его README.