21 KiB
Backlog
lint и прочие правила
- линт правило для
interface Props {...}+let {}: Props = $props()(плагинconventions, правилоinterface-props; автофикс для нетипизированной деструктуризации) - линт правило для
object as const, нежелательно использоватьtype Kind = 'a' | 'b' | 'c'- это приводит к дублированию описаний в разных местах, и к непонятным новым типам типаtype Kind2 = 'a' | 'c'(правилоconventions/no-string-union-alias) - можно ли сделать правило для минимизации новых
constопределений? чтобы дубли автоматически определялись? ИИ агент иногда дублирует определения (как линт-правило — нереализуемо без семантики; решено ограничением в AGENTS.md «сначала искать», авто-детект дублей в файле — открытый вопрос)
Мелочи всякие
- сгенерировать или найти файлы для ручной проверки
A. Краевые PNG-файлы - Переделать внешний вид инструментов без настроек, например Remove alpha channel PNG "remove-alpha-channel-png". Сейчас выглядит слишком пустым.
- Убрать описание формата в отображении исходник\результат - это должно быть в кнопке Download
- Кнопка download должна сразу писать какой формат сейчас, быть с селектором формата и подсвечивать предупреждение если формат не совместим (альфа канал)
- Пересмотреть поля - Plate, Position, Font Style - сейчас второй label
- Font Style - обдумать выбор шрифта (google fonts???) как организовать
шрифты с кириллицей? сделать галочку "только с кириллицей"??? (решение о
наборе и лицензиях:
docs/plan-platform.md§4 — только OFL/Apache с паспортом, семейства с кириллицей) - Посмотреть темную тему - слишком темная и слишком много оттенка (убавить c в hct?)
- на картинке результате при работе дергается высота надписи (высота иконки)
- Глянуть что за ошибка (воспроизвелось на blur-png, в том числе и повторно)
баг в хроме
Uncaught TypeError: Cannot read properties of undefined (reading 'startTime')at et.reportAllChanges (anonymous:2:19429) - сделать загрузку картинки исходника по ctrl+v и drag-and-drop (dropzone)
- не работают генераторы картинок (create-empty-png)
- генераторы работают не автоматически - требуется нажать кнопку generate (create-empty-png)
- square-mask-png - проверить работу - параметры неверно считаются. width - 100, height - 100, x - 100, y - 100, обрезает 50% на 50% картинку
- прикрутить кастомный color picker (есть в old), добавить прозрачность (range?)
- проверить настройки range slider на crop-png - слишком большие значения
- для range slider field - добавить поле для ввода цифр и кнопку сброса значения
- для keep Aspect field - пересчитывать второе поле, учитывать какое было изменено
- поле ввода текста - сделать по умолчанию нормального размера, а не одну строку для svg - форматирование или подсветку синтаксиса??? для bin\hex - форматирование по колонкам??? для hex\bytes\rgba - пример в placeholder
- обновить страницу kit или сделать storybook
- придумать процесс редактирования и настройки pipeline - drag-n-drop, удаление, добавление инструментов. переход один инструмент - pipeline без перезагрузки
- Слаги инструментов (
*-png) — надо обдумать, возможно что ссылки\маршруты должны быть с png, а названия инструментов - без. Это упростит названия инструментов и сделает их более понятными
Переезд
- составить план переноса preview -> корень, старый корень -> old
- сам перенос (C17) —
docs/archive/plan-c17.md - добавить i18n в preview
SEO/GEO
Общий план: docs/plan-seo.md (S0–S4). C17 выполнен; старт возможен — пока
только domain-free часть S1.
- переименование бренда + домен: чек-лист в локальном плане
docs/plan-domain.local.md(вне git, имя домена в репо не публикуется; план-seo §6, R1/R2) - download с селектором формата PNG/JPG/WebP/BMP для всех инструментов (райз №7 → S1f)
- форматные страницы (
crop-jpeg, …) — только по вордстату с уникальным контентом; редиректы только для опечаток; клонов с canonical не делать (план §5) - sitemap.xml из реестра +
Sitemap:в robots.txt (S1b/S1c) - Seo.svelte: canonical + OG-теги, per-tool OG-картинки (S1d/S1e)
- контент страницы инструмента: seo-блок в словарях, H1/how-to/FAQ/related (S2)
- JSON-LD (SoftwareApplication/FAQPage/Breadcrumb) + llms.txt (S3)
- GSC + приватная аналитика (Plausible/Umami/CF), дистрибуция (S4)
Платформа (API/PWA)
Общий план: docs/plan-platform.md; WASM-ядро и CLI уже в docs/roadmap.md
(фазы 3–8) — здесь только новые треки.
- PWA: manifest + service worker, оффлайн-режим, установка (после C17 и S1; C19 отложен — не блокер)
- API: спайк серверного ядра (нативный Rust vs edge-wasm), ключи, free tier (после wasm-фаз 5–7)
Баги preview
Зарегистрированы при написании e2e (web/e2e/, pnpm --dir web test:e2e) и
ручного чек-листа — см. docs/checklist-manual-testing.md (раздел G). Каждый
зафиксирован как test.fixme. После фикса бага: убрать соответствующий
test.fixme и отметить пункт G в чек-листе как пройденный.
- Генераторы без кнопки «Generate» — все 21 инструмент категории GENERATE
открываются, но в UI нет кнопки Generate и полей схемы (только RU/EN/Reset);
результат через UI недостижим. В
SchemaToolView.svelteisGeneratorопределяется какtool.generate && !tool.run, кнопка рисуется только еслиongenerateпрокинут, а для генераторов с дефолтнымinput: "file"— нет. Ожидание: поля схемы + кнопка «Generate», результат-картинка по дефолтам. Fixme:web/e2e/generators.spec.ts. Кнопки и не должно быть, все процессы должны запускаться автоматически - resize-png с дефолтами падает — схема по умолчанию
size: 0×0+keepAspect: true→ при загрузке ЛЮБОГО PNG сразуerrors.resizeSize(alert), результата нет.registry-new/geometry.ts. Ожидание: осмысленный дефолт-размер (например, исходный) либо кнопка, а не авто-ошибка. - crop-png с дефолтами падает — аналогично:
width: 0, height: 0→ сразуerrors.cropSize.registry-new/geometry.ts. Ожидание: базовый кроп по умолчанию либо внятное предзаполнение. - Сырые ключи ошибок в UI — alert на tool-странице показывает сырой ключ
i18n (
errors.resizeSize), а не сообщение изen.ts/ru.ts(тамresizeSize: "Width and/or height must be positive"). Проверяется на resize-png / crop-png. Ожидание: человекочитаемое сообщение на текущем языке. Fixme:web/e2e/known-issues.spec.ts(тест «error message localized»).
Идеи
-
Менять первый инструмент цепочки — оценка M. Сейчас базовый инструмент зафиксирован при открытии страницы; хочется заменить его на другой без разборки цепочки: шаги и их параметры сохраняются, вход перечитывается. Открытый вопрос: что делать с несовместимыми параметрами (text-source ↔ file).
-
UI-эксперимент: параметры между исходником и результатом — оценка S/M. Раскладка «Исходник → Параметры → Результат» в один ряд вместо параметров отдельным блоком снизу. Проверить на узких экранах; возможно за флагом/A-B, чтобы сравнить с текущей. Перекрыто редизайном: старый план (
docs/archive/plan-inline-params.md) закрыт, страницы инструментов теперьSchemaToolView/SchemaPreview. Эксперимент переосмыслить уже для нового этапа инструментов (сетка source|params|result), если понадобится. -
Сворачивать инструменты в chain — оценка S. Тоггл сворачивания звена до заголовка «Шаг n: название» (превью скрываются). Состояние свёрнутости помнить в workspace-pipeline.
-
Несколько цепочек: сохранение и загрузка — оценка M. Именованные цепочки в localStorage (список, создать/переименовать/удалить), быстрое переключение. Формат экспортного JSON расширить опциональным полем имени, старые файлы читаются как безымянные.
-
Batch-обработка архивов выбранным chain — оценка L. Вход — zip-архив картинок (распаковка в браузере), прогон текущего или выбранного сохранённого chain по каждому файлу, сборка результата обратно в zip для скачивания. Зависит от п.4 (выбор цепочки) и от экспортного формата pipeline JSON; прогресс и ошибки — пофайлово.
-
Избранные инструменты (fav tools) — оценка S/M. Тоггл-звёздочка на карточках каталога, результатах поиска и в шапке страницы инструмента; список id в localStorage. Избранное показывается отдельной секцией сверху каталога и поднимается в выдаче поиска (бонус к popularity при скоринге).
-
Конвертация формата — НЕ отдельный инструмент, а выбор в кнопке Download — оценка M/L. Инструменты
convert-png-to-jpg/convert-png-to-webp(и др. форматы) не должны жить как самостоятельные инструменты цепочки. Вместо этого — бесшовное внедрение выбора формата/качества прямо в кнопку/диалог Download: юзер скачивает результат в нужном формате (mime/ext/quality), а pipeline при этом не усложняется лишним звеном. Сделано (2026-09): механическая часть реализована в preview —ToolEntry.output(OutputFormat: mime/ext/qualityParamId) вregistry-new/types.ts;SchemaToolView.download()кодирует поoutput(jpg/webp/bmp уже настроены;png-to-bmpпереведён сюда же). Осталось (UX-райз «Download»):- выбор формата/качества прямо в кнопке/диалоге Download для любого результата (не отдельными конвертерами);
- экспорт с лимитом размера → закрывает отложенный
reduce-to-size-png(целевой KB, бинарный поиск по k из квантования). Проработать вместе с достройкой download-флоу нового UI.
-
watermark-image-png(водяной знак картинкой) — оценка M. Отложен из миграции (archive/plan-migrate-remaining.md). Нужна overlay-механика: второй источник изображения (getOverlay/store), параметры scale/opacity/ position/margin/aspect. Решается вместе с вопросом, как второй источник картинки вписывается в schema-driven preview (SchemaToolView). -
png-info(детальная информация о PNG) — оценка M/L. Отложен из миграции. Отдельный райз: exif-теги, редактирование, структурированный вывод; нужен свой отдельный случай в UI, не «ещё один text/verdict». -
Region-инструменты (censor/erase/pixelate-area/blur-area/sharpen-area/ reverse-area) — ждут UI выделения области на превью. Из
archive/plan-gap-waves.md(«вне очереди»). -
Мультифайловые инструменты-потребители (gif-to-frames, separate-colors) — механизм «результат = набор файлов» (1 → many) реализован:
FileResult+result: "files"+ скачивание zip-архивом + грид-превью частей. Первый потребитель —split-into-parts-png. Остальные подключаются по мере нужды. -
Анимационные (slow-reveal/fade/scrolling) — выход не PNG; отдельное решение о формате. Из
archive/plan-gap-waves.md. -
HARD-серия (glitch, barcode, signature-extract, handwritten-digital). Из
archive/plan-gap-waves.md. -
Переезд старых файлов в папки— ЗАКРЫТО. Старые файлы (old/lib/registry.ts,lib/registry/,lib/registry-helpers.ts,lib/categories.ts,lib/tools/,lib/components/кромеkit/) перенесены вlib/old/. Isolation-плагин упрощён доlib/old/**. Все импорты обновлены. svelte-check 0, тесты 618/618, lint:all чист, билд проходит. -
Техдолг (чинить по заведённым задачам, не игнорировать правила)ЗАКРЫТО. Подробности:docs/archive/plan-tech-debt.md. -
Контраст текста на акцентных кнопках — пересмотреть после готовности сайта. Текст
--color-backgroundна фоне--color-main/--color-accent(тон 48) даёт контраст ~4.1–4.3 (light) — ниже AA 4.5 для обычного текста;palette.test.tsдержит для кнопок порог 4.0 (AA large-text) осознанно, как компромисс текущего дизайна. После полного завершения редизайна пересмотреть тона (например поднять tone кнопок до ~55) и вернуть порог 4.5. Также проверить--color-danger(dark, тон 55): текст на нём 4.93 — ок, но light-danger тон 48 = 4.25 на границе. -
Отображение маски для инструментов (runMask/preview-mask) — придумать и реализовать процесс показа маски результата. Контекст: в старом контракте поле
previewуremove-color/remove-backgroundпоказывало быстрый ч/б превью-маску (colorMask/backgroundMaskPreview) того, что будет вырезано. При миграции на единыйrun(ctx)поле убрано (шаг 8,registry-new/alpha.ts) — новый executor и schema-превью зовутrun()напрямую, маска пока не нужна. Идея 1: дать каждомуrunвозможность вернуть (или инструмент — объявить)runMask— ч/б изображение маски изменений либо иной подход (отдельное полеmask+ функция маски, второй результат, overlay). Оценка — на усмотрение при проработке (S/M). Пока живём без неё. Идея 2: каждыйrunвозвращает два изображения - для отображения (показывает маску или сам результат), и для передачи в следующий инструмент (всегда результат. Оценка — на усмотрение при проработке (S/M). Пока живём без неё. -
Процесс работы с инструментами 1 → many и many → 1 — абстракция результата «набор файлов» оформлена и работает: тип
FileResult,result: "files"в реестре, сериализация через executor, скачивание zip-архивом, грид-превью частей. Реализовано на первом потребителеsplit-into-parts-png(2026-09,docs/archive/plan-split-into-parts.md). 1 → many: подключение остальных потребителей (gif-to-frames, separate-colors) при необходимости; формат/качество файлов внутри zip — отложено до UX-райза «Download» (п.7). many → 1 (вход = архив/несколько картинок → единый результат): не реализовано. Зависит от batch-обработки архивов (п.5 идей, roadmap фаза 8 «batch-страница»). Нужна отдельная проработка входа (распаковка zip в браузере, порядок файлов, поведение в пайплайне — такие инструменты терминальны, как и 1 → many).