mirror of
https://github.com/Ku6epXBOCTuK/easy-png-tools.git
synced 2026-11-13 17:08:20 +00:00
docs: review all
This commit is contained in:
+75
-65
@@ -1,36 +1,38 @@
|
||||
# Backlog
|
||||
|
||||
> Статус: **active**. Продуктовые, UX- и инфраструктурные задачи. Здесь только
|
||||
> **открытые** задачи: выполненные удаляются, а критичные для проекта факты из
|
||||
> них переносятся в тематический документ (архитектура, quality gates, lint,
|
||||
> e2e) по мере закрытия.
|
||||
>
|
||||
> «Что сознательно не вводим и почему» живёт в `docs/decisions.md`, архитектура
|
||||
> — в `docs/architecture.md`. Raw-находки UX-аудита — `docs/tools-audit.md`, их
|
||||
> разбивка на волны — `docs/plan-fields-audit-fixes.md`.
|
||||
>
|
||||
> Ids инструментов сверять с `web/src/lib/registry/`; полный список —
|
||||
> `docs/tools-map.md`.
|
||||
> Статус: **active**. Открытые задачи. Подробные планы, разбор решений и сырые
|
||||
> находки — `docs/plan-seo.md`, `docs/plan-platform.md`,
|
||||
> `docs/plan-fields-audit-fixes.md`, `docs/tools-audit.md`, `docs/decisions.md`.
|
||||
|
||||
## lint и прочие правила
|
||||
|
||||
- [ ] `tseslint.config(...)` deprecated: сигнатура
|
||||
`(...configs: InfiniteDepthConfigWithExtends[]): ConfigArray` помечена
|
||||
устаревшей, нужен переход на `defineConfig` из `typescript-eslint` —
|
||||
`web/eslint.config.js`.
|
||||
устаревшей, нужен переход на `defineConfig` из `eslint/config` (ESLint
|
||||
core, а не `typescript-eslint`) — `web/eslint.config.js`.
|
||||
- [ ] удалить мёртвые `tools.*.params` из root i18n после проверки потребителей;
|
||||
до этого действует pattern-based policy-исключение
|
||||
(`web/eslint-plugins/README.md`, раздел `dict-consistency`)
|
||||
|
||||
## Мелочи всякие
|
||||
|
||||
Порядок правок полей и раскладки — `docs/plan-fields-audit-fixes.md`, сами
|
||||
находки («что плохо», с датой аудита) — `docs/tools-audit.md`. Здесь — как это
|
||||
исправить; находка в аудите не отменяет задачу здесь.
|
||||
|
||||
- [ ] Пересмотреть тесты - исправить всякие хрупкие, которые проверяют
|
||||
количество инструментов, точное совпадение текстов, поиск по
|
||||
`img[alt="Result image"]`, svelte классам и тому подобные
|
||||
- [ ] split-into-parts-png - увеличить максимальные значения, плохо работает для
|
||||
нарезки ассетов
|
||||
- [ ] crop, resize (но скорее всего все инструменты) - при загрузке нового
|
||||
изображения сбрасывает размеры, настроенные пользователем
|
||||
- [ ] split-into-parts-png, resize (может еще какие-то) - возможность указывать
|
||||
размеры из заранее одобренного списка размеров - 16х16, 32х32, 64х64 как
|
||||
минимум, может еще какие-то размеры добавить, единый список из предыдущей
|
||||
задачи - (для инди разработчиков, стандартные тайлы часто делаются)
|
||||
- [ ] e2e: `i18n.spec.ts` и `text-and-verdicts.spec.ts` дублируют локаторы из
|
||||
`helpers/page.ts` вместо вызова — правило «спека зовёт helpers»
|
||||
(`docs/testing-strategy.md`, раздел 5)
|
||||
- [ ] мёртвый i18n-ключ `noParams` («нет параметров — результат готов»): его
|
||||
ничем не читают. Либо показывать подсказку для инструментов с пустой
|
||||
схемой (FA-E1), либо удалить ключ из обеих локалей
|
||||
- [ ] Пересмотреть тесты — убрать точные совпадения текстов и любые селекторы,
|
||||
привязанные к разметке или svelte-классам (сейчас остались:
|
||||
`tool-flows.spec.ts`, `schema-tool-strings.test.ts`)
|
||||
- [ ] нужен инструмент для удаления фона по выбранной точке - удалять внутри
|
||||
выделенной области
|
||||
- [ ] сделать конвертацию в смайлики\награды для твитча (6 размеров или выбор
|
||||
@@ -63,8 +65,10 @@
|
||||
строку для svg - форматирование или подсветку синтаксиса??? для bin\hex -
|
||||
форматирование по колонкам??? для hex\bytes\rgba - пример в placeholder
|
||||
- [ ] сделать загрузку картинки исходника по ctrl+v и drag-and-drop (dropzone)
|
||||
- [ ] square-mask-png - проверить работу - параметры неверно считаются. width -
|
||||
100, height - 100, x - 100, y - 100, обрезает 50% на 50% картинку
|
||||
- [ ] square-mask-png — перепроверить баг-репорт: он устарел, в схеме больше нет
|
||||
параметров `width`/`height`/`x`/`y` (теперь `widthPct`/`heightPct` 10..100
|
||||
и один `offset` в диапазоне −50..50, значения 100 недостижимы). Либо
|
||||
подтвердить, что баг исправлен, либо найти новый repro
|
||||
- [ ] прикрутить кастомный color picker, добавить прозрачность (range?)
|
||||
- [ ] проверить настройки range slider на crop-png - слишком большие значения
|
||||
- [ ] для range slider field - добавить поле для ввода цифр и кнопку сброса
|
||||
@@ -72,48 +76,45 @@
|
||||
- [ ] для keep Aspect field - пересчитывать второе поле, учитывать какое было
|
||||
изменено
|
||||
- [ ] обновить страницу kit или сделать storybook
|
||||
- [ ] Свести convert-страницы на один инструмент `convert` — реализация уже
|
||||
умеет «скопировать пиксели, декодировать вход, отдать в заданном формате»,
|
||||
а страницы различаются только форматом вывода. **Зависит от S1f**
|
||||
(`docs/plan-seo.md` §1): пока `quality` живёт в схеме страницы, у
|
||||
`convert-png-to-bmp` и `convert-png-to-jpg` разные наборы полей, и один
|
||||
инструмент на них не сойдётся. Качество — настройка кнопки Download
|
||||
(«Download as JPEG»), а не поле страницы; после его переезда пресеты схемы
|
||||
не нужны, страницы различаются только `output` и `params` шага. Модель
|
||||
страницы к этому готова: `Page.steps` — список инструментов, один
|
||||
инструмент может обслуживать много страниц (`docs/architecture.md`, раздел
|
||||
3).
|
||||
- [ ] Свести convert-страницы (`convert-png-to-jpg`, `convert-png-to-webp`,
|
||||
`png-to-bmp`) на один инструмент `convert` — зависит от S1f
|
||||
(`docs/plan-seo.md` §4). Мешает не только `quality` (он живёт в схеме
|
||||
инструмента), а сама модель: `output` с mime/ext — свойство `Tool`, а
|
||||
`PageStep` умеет только `{ id, params? }`, поэтому страницы на общий `id`
|
||||
получат одинаковый формат вывода. Нужно научить шаг переопределять формат
|
||||
вывода
|
||||
- [ ] придумать процесс редактирования и настройки pipeline - drag-n-drop,
|
||||
удаление, добавление инструментов. переход один инструмент - pipeline без
|
||||
перезагрузки
|
||||
- [ ] `CatalogToolbar`: фильтры используют сырой `<button>`, а не `ui/Button` —
|
||||
единый контрол для всей библиотеки
|
||||
(`web/src/lib/components/CatalogToolbar.svelte`).
|
||||
- [ ] Вынести `ToneVariant`/варианты в общий модуль: `const`-объект с тонами
|
||||
продублирован в `ui/Badge.svelte` и кнопках
|
||||
(`web/src/lib/components/ui/Badge.svelte`).
|
||||
- [ ] `PreviewTile`: canvas должен сам выбирать соотношение сторон в диапазоне
|
||||
16:9…9:16 вместо фиксированного
|
||||
- [ ] `SchemaTextResult` вердикт-бейдж рисует руками: свои классы
|
||||
`badge`/`badge-tone--{tone}` и свой CSS в `<style>` вместо
|
||||
`ui/Badge.svelte` — тон и разметка бейджа живут в двух местах
|
||||
(`web/src/lib/components/SchemaTextResult.svelte`).
|
||||
- [ ] `PreviewTile`: высота плитки задана только `min-height: clamp(...)`,
|
||||
поэтому она не следует за пропорциями результата — широкий результат
|
||||
уезжает в узкую полосу, а высокий упирается в `max-height: 100vh`. Нужно,
|
||||
чтобы соотношение сторон выбиралось по результату в диапазоне 16:9…9:16
|
||||
(`web/src/lib/components/layout/PreviewTile.svelte`).
|
||||
- [ ] `ThemeToggle`: свои анимации иконок и своя кнопка вместо `IconButton`
|
||||
(`web/src/lib/components/ui/ThemeToggle.svelte`).
|
||||
- [ ] Радиусы бордеров не совпадают с референсом: в `refs` радиусы были 0, а мы
|
||||
взяли ненулевой `--radius-m` для всех бордеров. Проверить токен против
|
||||
референсов; возможно он должен быть 0, а скругления оставить только там,
|
||||
где они реально есть в дизайне.
|
||||
- [ ] Радиусы бордеров: `--radius-m` ненулевой и применён ко всем бордерам
|
||||
(`app.css`, `SchemaToolView.svelte`). Решить, где скругления реально есть
|
||||
в дизайне, а где должен быть 0
|
||||
- [ ] `Footer`: версию брать из `package.json`, а не писать `v0.1.0` вручную
|
||||
(`web/src/lib/components/layout/Footer.svelte`).
|
||||
|
||||
## Переезд
|
||||
|
||||
- [ ] множественные числа (часть/части/частей; «N параметров», счётчики) —
|
||||
`tPlural()` и формат `PluralForms`; детали и критерии — в этом backlog
|
||||
функция `tPlural(path, n)` и форма `PluralForms` (обязательное `other`,
|
||||
опциональные `one`/`few`/`many`); первые потребители — `part`/`parts` в
|
||||
подписи результата и счётчики параметров. **Критерий приёмки:** у ключа с
|
||||
plurals есть все формы, для которых нужен перевод, `other` никогда не
|
||||
пустой, число подставляется в текст без склейки
|
||||
|
||||
## SEO/GEO
|
||||
|
||||
Общий план: `docs/plan-seo.md` (S1–S4). Старт возможен — пока только domain-free
|
||||
часть S1. Полное содержание этапов не дублируется здесь, только идентификаторы.
|
||||
|
||||
- [ ] переименование бренда + домен: чек-лист в локальном файле
|
||||
`plan-domain.local.md` (в git не входит, в клоне отсутствует; подробности
|
||||
и порядок — `docs/plan-seo.md` §6, R1/R2)
|
||||
@@ -127,16 +128,17 @@
|
||||
(`docs/plan-seo.md` §5)
|
||||
- [ ] sitemap.xml из реестра + `Sitemap:` в robots.txt (S1b/S1c)
|
||||
- [ ] Seo.svelte: canonical + OG-теги, per-tool OG-картинки (S1d/S1e)
|
||||
- [ ] контент страницы инструмента: seo-блок в словарях, H1/how-to/FAQ/related
|
||||
(S2)
|
||||
- [ ] контент страницы инструмента: seo-блок в словарях, how-to/FAQ/related (S2)
|
||||
- [ ] JSON-LD (SoftwareApplication/FAQPage/Breadcrumb) + llms.txt (S3)
|
||||
- [ ] GSC + приватная аналитика (Plausible/Umami/CF), дистрибуция (S4)
|
||||
- [ ] дистрибуция: закрепить репо, alternative.to, Product Hunt, Reddit/HN (S4c)
|
||||
- [ ] GSC: подключить домен, отправить sitemap, мониторинг индексации (S4a)
|
||||
- [ ] GA4: cookieless-конфигурация, отключить рекламные audiences и signals,
|
||||
`anonymize_ip` — сейчас в `web/src/app.html` голый `gtag('config')` (S4b)
|
||||
- [ ] GA4: отсечь попадания с локальных и preview-сборок — тег стоит в
|
||||
prerender-оболочке и грузится на каждой странице, нужен флаг окружения
|
||||
|
||||
## Платформа (API/PWA)
|
||||
|
||||
Общий план: `docs/plan-platform.md`; WASM-ядро, эталоны и CLI —
|
||||
`docs/roadmap.md` (фазы 2–8). Здесь только треки, которых нет в roadmap.
|
||||
|
||||
- [ ] PWA: manifest + service worker, оффлайн-режим, установка (после S1)
|
||||
- [ ] API: спайк серверного ядра (нативный Rust vs edge-wasm), ключи, free tier
|
||||
(после wasm-фаз 5–7)
|
||||
@@ -145,8 +147,15 @@
|
||||
|
||||
## Качество production UI
|
||||
|
||||
Политика проверок — `docs/quality-gates.md`, e2e — `docs/testing-strategy.md`.
|
||||
|
||||
- [ ] `/` и `/list-tools` выходят без `<title>`: `svelte:head` есть только на
|
||||
странице инструмента, а готовые ключи `home.defaultTitle`,
|
||||
`catalog.pageTitle`, `catalog.metaDescription` не читает ни один компонент
|
||||
(S1d)
|
||||
- [ ] **Баг e2e:** `tool-flows.spec.ts:179` создаёт контекст через
|
||||
`browser.newContext()`, который не наследует `use.baseURL` из
|
||||
`playwright.config.ts`, — относительный `goto('/tools/flip-png')` внутри
|
||||
`openTool` не резолвится, и тест «работает без Web Worker (fallback)»
|
||||
падает на всех движках. В CI это не видно: job `e2e` неблокирующий
|
||||
- [ ] Component-тесты `SchemaToolView`/`SchemaPreview` требуют отдельного
|
||||
решения: node Vitest не имеет DOM/canvas, а e2e уже покрывает поведение.
|
||||
- [ ] Ошибка декодирования изображения из `createImageBitmap` пока показывается
|
||||
@@ -154,9 +163,8 @@
|
||||
|
||||
## Идеи
|
||||
|
||||
Идеи 1–5 и 15 относятся к **пайплайну (цепочкам шагов)**, которого в коде пока
|
||||
нет: это фаза 11 `docs/roadmap.md`. Идеи 6–14 — к существующим инструментам и
|
||||
UI. Оценки (S/M/L) — оценка труда, не приоритет.
|
||||
Идеи 1–5 и 15 — про пайплайн (фаза 11 `docs/roadmap.md`). Идеи 6–14 и 16 — про
|
||||
существующие инструменты и UI. Оценки (S/M/L) — оценка труда, не приоритет.
|
||||
|
||||
1. **Менять первый инструмент цепочки** — оценка M. Сейчас базовый инструмент
|
||||
зафиксирован при открытии страницы; хочется заменить его на другой без
|
||||
@@ -171,8 +179,8 @@ UI. Оценки (S/M/L) — оценка труда, не приоритет.
|
||||
3. **Несколько цепочек: сохранение и загрузка** — оценка M. Именованные цепочки
|
||||
в localStorage (список, создать/переименовать/удалить), быстрое переключение.
|
||||
Формат экспортного JSON расширить опциональным полем имени; обратной
|
||||
совместимости со старыми выгрузками не делаем (см. задачу про `id`/`slug`
|
||||
выше — формат ещё не устоялся).
|
||||
совместимости со старыми выгрузками не делаем — формат не устоялся: он
|
||||
появится вместе с фазой 11 `docs/roadmap.md` и до её старта может измениться.
|
||||
|
||||
4. **Batch-обработка архивов выбранным chain** — оценка L. Вход — zip-архив
|
||||
картинок (распаковка в браузере), прогон текущего или выбранного сохранённого
|
||||
@@ -192,9 +200,11 @@ UI. Оценки (S/M/L) — оценка труда, не приоритет.
|
||||
(`OutputFormat`: mime/ext/qualityParamId) и кодирование по нему в
|
||||
`SchemaToolView.download()` — `docs/architecture.md`, раздел 3. Что осталось
|
||||
сверх S1f:
|
||||
- экспорт с лимитом размера → закрывает отложенную страницу
|
||||
`reduce-to-size-png` (целевой KB, бинарный поиск по k из квантования).
|
||||
Проработать вместе с достройкой download-флоу.
|
||||
- экспорт с лимитом размера → «сжатие до целевого КБ»: для lossy это quality
|
||||
в селекторе формата, для PNG — бинарный поиск по k из квантования. Нужна ли
|
||||
отдельная страница под этот интент — открытый вопрос с вордстатом, имя не
|
||||
выбрано (`docs/plan-seo.md` §5). Проработать вместе с достройкой
|
||||
download-флоу.
|
||||
|
||||
7. **Страница `watermark-image-png` (водяной знак картинкой)** — оценка M. Нужна
|
||||
overlay-механика: второй источник изображения (getOverlay/store), параметры
|
||||
@@ -259,7 +269,7 @@ UI. Оценки (S/M/L) — оценка труда, не приоритет.
|
||||
- частичные ошибки: один битый файл не должен ронять весь шаг — нужен
|
||||
per-file отчёт, а не один `ToolError` на шаг;
|
||||
- имена частей на каждом шаге и Download для набора (сейчас zip по
|
||||
`tool.id`, `SchemaToolView.download()`);
|
||||
`page.slug`, `SchemaToolView.download()`);
|
||||
- обратная сторона: распаковка zip в браузере, порядок файлов, поведение
|
||||
many → 1 → many в одной цепочке. Зависит от идеи 10 (остальные потребители
|
||||
1 → many) и идеи 4 (batch по архиву), `docs/roadmap.md` фаза 8
|
||||
|
||||
Reference in New Issue
Block a user