feat: add analyze, generate, text tools and update plan

This commit is contained in:
2026-09-07 09:09:29 +05:00
parent e2735c52ab
commit cc70750727
4 changed files with 488 additions and 85 deletions
+49 -80
View File
@@ -1,7 +1,9 @@
# План: дожать перевод инструментов в preview и переезд ветки `old/`
> Статус: **план.** Основа — `plan-composite-params.md` (Фазы 15). Текущее
> состояние: **40 из 125 инструментов переведены в `registry-new`**, старый UI
> Статус: **переведено всё простое, осталось 23 спец-случая.** Основа —
> `plan-composite-params.md` (Фазы 15). Текущее
> состояние: **101 инструмент из 125 переведены в `registry-new`** (включая
> ранее переведённые 40; из оставшихся 85 перенесены 62 простых), старый UI
> уже живёт на `(old)/`-маршрутах, линтер-изоляция old↔preview на месте
> (плагин `isolation/no-mixed-imports`). Здесь — что сделать, чтобы:
>
@@ -16,13 +18,14 @@
## Текущая картина (факты)
- `registry.ts` + `registry/`**125 инструментов**; `registry-new/`**40**;
остаток — **85**. (Ранний подсчёт «104» был занижен: извлечение суффиксом
`-png` теряло каналы `png-to-hsl/…`, текстовые вердикты `png-info` и т.п. и
обратные конвертеры `png-to-base64/…`.)
- Preview (`/preview`) показывает только переведённые 40; старый UI работает
- `registry.ts` + `registry/`**125 инструментов**; `registry-new/`**101**;
остаток — **23 спец-случая**. (Ранний подсчёт «104» был занижен: извлечение
суффиксом `-png` теряло каналы `png-to-hsl/…`, текстовые вердикты
`png-info` и т.п. и обратные конвертеры `png-to-base64/…`.)
- Preview (`/preview`) показывает переведённые 101; старый UI работает
на `/`-маршрутах (группа `(old)/`): `+page`, `demo`, `list-tools`,
`tools/[id]`.
`tools/[id]`. Все «простые» инструменты переведены (color 18, filters 3,
geometry 13, alpha 13, generate 8, analyze-маски 6, text 1).
- Плагин `isolation/no-mixed-imports` (`web/eslint-plugins/isolation/`)
полностью разделяет ветки: старый `lib/registry.ts|/registry/**`,
`lib/registry-helpers.ts`, `lib/categories.ts`, `lib/tools/**`,
@@ -39,48 +42,20 @@
`ColorField.svelte`, пустой ruleset в `Toggle.svelte`, неиспользуемые токены
в `preview.css`.
## Скоуп перевода: 85 инструментов осталось
## Скоуп перевода: осталось 23 особых случая
По категориям (в скобках — сколько из категории уже переведено; подсчёт по
`registry/` vs `registry-new/`, без учёта генерируемых `SpaceId` и params):
Все инструменты без специальных фич переведены (суммарно 62 простых из 85,
плюс ранее переведённые 40). Остаток — 23 инструмента, требующих достройки
фундамента preview. По категориям:
- **color — 18** (из 25, переведено 7): grayscale-png, invert-colors-png,
adjust-brightness-contrast-png, auto-contrast-png, sepia-png, posterize-png,
black-and-white-png, decrease-color-count-png, extract-channel-png,
swap-channels-png, change-png-opacity, change-png-hue, плюс 6 канальных
`png-to-{hsl,hsv,hsi,cmyk,ycbcr,lab}` (генерируются из `SPACES`);
`compress-png`/`reduce-to-size-png` — нет, они в convert. Простое; канальные
на `core/channels.ts` (`renderSpace`). Нюанс: `change-png-opacity`/`hue`
похожи на переведённые, но это отдельные инструменты, не дубли.
- **geometry — 13** (из 18): rotate, flip, skew, zoom, shift, add-padding, tile,
trim-empty-space, change-aspect-ratio, swap-orientation, symmetric-copy,
center-by-alpha, rotate-free. В основном простое (slider/select/color/checkbox).
Нюансы: `rotate-free` — угол 0..360 (посмотреть reuse `AngleControl` или
slider); `tile` — cols/rows (два числа, можно `dimension` или два slider);
`shift` — offsetX/Y в px + цвет (не путать с `offset`-процентами).
- **alpha — 14** (из 21): remove-alpha, set-alpha, extract-alpha-mask,
round-corners, invert-alpha, remove-background, make-thicker, make-thinner,
feather-edges, clean-edges, harden-alpha, despeckle-alpha, close-holes +
**`watermark-image-png`** (см. особый случай). Остальное простое.
- **generate — 10** (из 21): emoji-to-png (emoji+size); палитровые генераторы
color-wheel, complementary, analogous, triadic, tetradic, monochromatic,
shades (baseColor + count/spread — простое); **`mix-colors`** и
**`sort-colors`** — особые случаи (списки).
- **convert — 14** (из 16): text-source-инструменты
base64/data-uri/hex/bytes/rgb-values-to-png + обратные
png-to-base64/data-uri/hex/bytes/rgb-values/bmp — **особый случай** (нужен
text-источник в preview); `compress-png`/`reduce-to-size-png` — **особый
случай** (output/формат, связан с backlog №7); `svg-to-png` — width.
- **analyze — 12** (из 13): show-transparent, show-grayscale, show-color,
light/dark-pixel-mask, unique-color-mask (color+opacity+tolerance+mode) —
простое, частично переиспользуемый предикат; **`verify-is-png`** — текстовый
вердикт, особый случай; плюс 5 text-вердиктов `png-info`, `png-is-grayscale`,
`png-file-size`, `png-is-transparent`, `png-orientation` — тоже текстовый
вывод (см. text-source/вердикт-механику).
- **filters — 3** (из 8): blur (radius), sharpen (strength), silhouette
(color+threshold). Простое.
- **text — 1** (из 3): **`watermark-tile-png`** — text+font-style+opacity+angle+
stepX/stepY. Переиспользует font-style; угол — AngleControl-подобный.
- **alpha — 1**: `watermark-image-png`.
- **analyze — 6**: text-вердикты `png-info`, `png-is-grayscale`,
`png-file-size`, `png-is-transparent`, `png-orientation`, `verify-is-png`.
- **generate — 2**: `mix-colors-png`, `sort-colors-png` (списки значений).
- **convert — 14**: text-source-конвертеры
`base64/data-uri/hex/bytes/rgb-values-to-png` + обратные
`png-to-base64/…`; output/формат `compress-png`, `reduce-to-size-png`,
`png-to-bmp`; `svg-to-png` (text-source + DOM).
### Особые случаи (требуют достройки фундамента, не просто перевод)
@@ -89,19 +64,20 @@
применяется поверх. В новом preview это единственный непереведённый
инструмент с источником-картинкой помимо основного входа. Учесть связь с
`overlay-store` (упомянут в `plan-redesign.md`).
2. **Text-source / text-вердикты** (base64/data-uri/hex/bytes/rgb-values-to-png
и обратные png-to-base64/…; аналитические `png-info`, `png-is-grayscale`,
`png-file-size`, `png-is-transparent`, `png-orientation`, `verify-is-png`) —
в старом UI это `text`-параметры, из которых собирается изображение, либо
текстовый результат вместо картинки. В новом preview нужно решить, как
подаётся текст-вход (текстовое поле/паста на странице инструмента) и как
показывается результат для вердиктных инструментов (в конверсиях — не
картинка, а текст/бейдж).
3. **Output/формат** (`compress-png`, `reduce-to-size-png`; пересекается с
`convert-png-to-jpg`/`webp`) — по `backlog.md` №7 формат переезжает в
кнопку Download, а не в отдельный инструмент. Перед переводом решить:
переводим как инструменты с quality-параметром или дожидаемся достройки
download-формата.
2. **Text-source / text-вердикты** (вход: `base64/data-uri/hex/bytes/
rgb-values-to-png`, `svg-to-png`; выход-вердикт: `png-to-base64/…`,
аналитические `png-info`, `png-is-grayscale`, `png-file-size`,
`png-is-transparent`, `png-orientation`, `verify-is-png`) — тип `ToolEntry`
уже имеет `toText`/`textToText`/`runFromText`, но executor превью их **не
вызывает** (только `run`/`generate`). Нужно решить, как подаётся текст-вход
(текстовое поле/паста на странице инструмента) и как показывается результат
для вердиктных инструментов (в конверсиях — не картинка, а текст/бейдж), и
протащить эти поля через executor/UI.
3. **Output/формат** (`compress-png`, `reduce-to-size-png`, `png-to-bmp`;
пересекается с `convert-png-to-jpg`/`webp`) — по `backlog.md` №7 формат
переезжает в кнопку Download, а не в отдельный инструмент. Перед переводом
решить: переводим как инструменты с quality-параметром или дожидаемся
достройки download-формата.
4. **`mix-colors` / `sort-colors`** — нужен список значений (цвета/веса или
источник). В схеме нет list-kind: либо новый kind, либо фиксированное
число слотов, либо отложить до отдельной задачи про списки.
@@ -119,20 +95,16 @@ a11y `ColorField`, пустой ruleset `Toggle`. Плюс два, мешающ
## Шаги перевода остатка (порядок)
1. **Простые пачки** (основной объём, 1 инструмент = 1 диф, паттерн Фазы 2):
color (18) → filters (3) → geometry простое → alpha (кроме watermark-image).
2. **Analyze-маски и вердикты** (12): переиспользование предикатов
`core/masks` в новом `registry-new/analyze.ts`; `show-color-pixels` — аналог
переведённого `extract-color-from-png` (уже в registry-new); text-вердикты
(png-info, png-is-grayscale, png-file-size, png-is-transparent,
png-orientation, verify-is-png) — вместе с text-source-механикой (п. 5).
3. **Generate-палитры** (8 без mix/sort): генераторы с палитрой (как
`color-spectrum`/`step-colors`, кнопка Generate).
4. **Raw-пакеты** (watermark-tile): font-style + угол + dimension(+),
сверить с `add-text` (переведён).
5. **Особые случаи** — отдельным переговоренным решением (overlay для
watermark-image, text-source, output-формат, списки для mix/sort).
6. После категории — `schema.layout` для сгруппированных инструментов
1. **Простые пачки** — **выполнено**: color (18) → filters (3) → geometry (13)
→ alpha (13/14, кроме watermark-image) → generate (8/10) → analyze-маски
(6/12) → text `watermark-tile-png`. Каждая пачка после себя гнала гейты
(eslint/svelte-check/тесты/prettier); в тестах только предсуществующий фейл
`palette.test.ts`.
2. **Особые случаи** — отдельным переговоренным решением (overlay для
watermark-image, text-source/вердикты — через `toText`/`runFromText` в
executor, output-формат, списки для mix/sort). Это единственный реальный
объём для дожатия каталога.
3. После категории — `schema.layout` для сгруппированных инструментов
(шаг 32-33 паттерн) и ручная проверка в `/preview`.
## Переезд в `old/` (шаг 37 основного плана)
@@ -188,15 +160,12 @@ a11y `ColorField`, пустой ruleset `Toggle`. Плюс два, мешающ
| Часть | Сложность | Оценка |
| ---------------------------------------------------------------- | --------------- | --------------------- |
| Простые инструменты (color/filters/geometry/alpha без watermark) | Низкая-Средняя | ~5-8ч (≈47 шт) |
| Analyze-маски (12, часть в п.5 с text-source) | Средняя | ~2ч |
| Generate-палитры (8) | Средняя | ~2-3ч |
| watermark-tile (text) | Средняя | ~1ч |
| Простые инструменты (color/filters/geometry/alpha/generate/маски/text) | Низкая-Средняя | **выполнено** (62 шт) |
| Особые случаи (overlay/text-source/format/списки) | Средняя-Высокая | ~4-6ч + ревью решения |
| Долги (ToolCard, palette.test.ts, lint:all остаток) | Средняя | ~2-4ч |
| Переезд в `old/` + конфиг плагина + гейты | Средняя-Низкая | ~2-4ч |
| Проверка/фидбек + правки | Зависит | ~3-6ч |
| **Итого** | | **~21-34ч** по фазам |
| **Итого** | | **~11-20ч** по фазам |
> Оценки ориентировочные; особые случаи — с ревью решения, объём финальных
> правок по фидбеку не предсказуем.