diff --git a/docs/backlog.md b/docs/backlog.md index f1db7a5..f186e1d 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -4,15 +4,6 @@ > находки — `docs/plan-seo.md`, `docs/plan-platform.md`, > `docs/plan-fields-audit-fixes.md`, `docs/tools-audit.md`, `docs/decisions.md`. -## UX — приоритетная очередь - -Порядок согласован: D (pipeline). Делать по одной, сверху вниз. - -- [ ] **D. Pipeline** — процесс редактирования и настройки: drag-n-drop, - удаление, добавление инструментов; переход «один инструмент ↔ pipeline» - без перезагрузки. Следом — идеи 1–3 (смена первого инструмента, - сворачивание шагов, несколько цепочек) - ## lint и прочие правила - [ ] `tseslint.config(...)` deprecated: сигнатура @@ -25,6 +16,13 @@ ## Мелочи всякие +- [ ] названия инструментов - сейчас в pipeline инструмент называется "обрезать + png", но он работает с любыми картинками, наверное надо убрать. но в + заголовке - возможно надо все форматы указать (SEO задача?) +- [ ] кнопка добавить инструмент в pipeline - обдумать селектор с номальным + поиском, фильтром возможных инструментов и т.д. +- [ ] pipeline - промежуточные результаты +- [ ] pipeline - drag-n-drop инструментов - [ ] split-into-parts-png - увеличить максимальные значения, плохо работает для нарезки ассетов - [ ] split-into-parts-png — режим «по размеру тайла»: указываешь размер тайла @@ -37,21 +35,30 @@ - [ ] e2e webkit: случайные падения по таймауту 5с (элемент не появляется), каждый прогон падают разные тесты — webkit под Windows слишком медленный. Рассмотреть увеличение timeout/expectTimeout для webkit-проекта в - `playwright.config.ts` + `playwright.config.ts`. После фикса перепроверить `tool-flows.spec.ts` + «chain: remove step» — на webkit удаление шага не успевает за 5с (на + остальных движках стабильно) - [ ] мёртвый i18n-ключ `noParams` («нет параметров — результат готов»): его ничем не читают. Либо показывать подсказку для инструментов с пустой схемой (FA-E1), либо удалить ключ из обеих локалей - [ ] Пересмотреть тесты — убрать точные совпадения текстов и любые селекторы, привязанные к разметке или svelte-классам (сейчас остались: `tool-flows.spec.ts`, `schema-tool-strings.test.ts`) +- [ ] можно ли в тестах получать i18n ключ вместо текста? можно ли написать lint + правило такое (запретить toContain без i18n) - [ ] нужен инструмент для удаления фона по выбранной точке - удалять внутри выделенной области - [ ] сделать конвертацию в смайлики\награды для твитча (6 размеров или выбор - какой размер и 2 сетки) + какой размер - 112\56\28px или 72\36\18) +- [ ] сделать несколько проходное сжатие png для получения необходимого размера + файлов, посмотреть реализацию в + [https://github.com/tma02/twitch-emote-resizer](https://github.com/tma02/twitch-emote-resizer) - [ ] неудобно настраивать ползунками, некоторые инструменты удобнее настроить через drag-n-drop. звучит сложно, но надо придумать процесс -- [ ] можно ли в тестах получать i18n ключ вместо текста? -- [ ] убрать в тестах все нестандартные символы `→`, длинные тире и т.д. +- [ ] убрать в тестах все нестандартные символы `→`, длинные тире, русский язык + и т.д., сделать lint правило +- [ ] комментарии на английском, lint правило +- [ ] уменьшить количество и многословность комментариев (lint правило?) - [ ] Пересмотреть прозрачность в инструментах - Create empty PNG - прозрачность должны быть настраиваемой 0-100%, а не переключателем - [ ] обдумать объединение пар `inputMode + source` и `resultKind + result` в @@ -89,6 +96,11 @@ (`app.css`, `SchemaToolView.svelte`). Решить, где скругления реально есть в дизайне, а где должен быть 0 +## Инструменты + +- [ ] qr code to text, text to qr code +- [ ] bar code to text, text to bar code + ## Переезд - [ ] множественные числа (часть/части/частей; «N параметров», счётчики) — diff --git a/web/e2e/tool-flows.spec.ts b/web/e2e/tool-flows.spec.ts index be62b58..aaa1c83 100644 --- a/web/e2e/tool-flows.spec.ts +++ b/web/e2e/tool-flows.spec.ts @@ -263,6 +263,43 @@ test("runs without Web Worker (fallback)", async ({ browser }, testInfo) => { } }); +test("chain: add step extends pipeline without reload and persists", async ({ + page, +}) => { + const sink = trackErrors(page); + await openTool(page, "flip-png"); + await uploadImage(page, opaquePng); + await expect(resultImage(page)).toBeVisible(); + await page.getByRole("button", { name: "Add step" }).last().click(); + await page.getByRole("menuitem", { name: "Grayscale PNG" }).click(); + const stepTwo = page.getByRole("heading", { + name: "Grayscale PNG", + exact: true, + }); + await expect(stepTwo).toBeVisible(); + await expect(resultImage(page)).toBeVisible(); + // цепочка переживает перезагрузку (localStorage) + await page.reload(); + await expect(stepTwo).toBeVisible(); + await expectNoErrorAlert(page); + expectNoErrors(sink); +}); + +test("chain: remove step returns to a single tool", async ({ page }) => { + const sink = trackErrors(page); + await openTool(page, "flip-png"); + await page.getByRole("button", { name: "Add step" }).last().click(); + await page.getByRole("menuitem", { name: "Grayscale PNG" }).click(); + const stepTwo = page.getByRole("heading", { + name: "Grayscale PNG", + exact: true, + }); + await expect(stepTwo).toBeVisible(); + await page.getByRole("button", { name: "Remove step" }).last().click(); + await expect(stepTwo).toHaveCount(0); + expectNoErrors(sink); +}); + test("invalid file upload shows error, no crash", async ({ page }) => { const sink = trackErrors(page); await openTool(page, "flip-png"); diff --git a/web/src/app.css b/web/src/app.css index de8a8c2..bbab20b 100644 --- a/web/src/app.css +++ b/web/src/app.css @@ -155,9 +155,6 @@ --size-tool-icon: 42px; --size-tool-min-height: 106px; --size-tool-arrow: 18px; - --size-step-min-height: 138px; - --size-step-index: 46px; - --size-step-grip: 20px; --size-card-min: 240px; --size-card-min-narrow: 200px; --size-parts-grid-min: 120px; diff --git a/web/src/lib/components/display/StepCard.svelte b/web/src/lib/components/display/StepCard.svelte index 29f9b07..197e769 100644 --- a/web/src/lib/components/display/StepCard.svelte +++ b/web/src/lib/components/display/StepCard.svelte @@ -1,5 +1,5 @@ -
-
{index.toString().padStart(2, "0")}
-
diff --git a/web/src/lib/components/schema/AddStepButton.svelte b/web/src/lib/components/schema/AddStepButton.svelte new file mode 100644 index 0000000..fba6712 --- /dev/null +++ b/web/src/lib/components/schema/AddStepButton.svelte @@ -0,0 +1,123 @@ + + +
+ + {#if open} + + {/if} +
+ + diff --git a/web/src/lib/components/schema/SchemaFields.svelte b/web/src/lib/components/schema/SchemaFields.svelte index 6b50725..5f4d8c7 100644 --- a/web/src/lib/components/schema/SchemaFields.svelte +++ b/web/src/lib/components/schema/SchemaFields.svelte @@ -98,7 +98,6 @@ size="s" onclick={onreset} /> - {t("ui.autoUpdate")} diff --git a/web/src/lib/components/schema/SchemaToolView.svelte b/web/src/lib/components/schema/SchemaToolView.svelte index 4669141..87e2375 100644 --- a/web/src/lib/components/schema/SchemaToolView.svelte +++ b/web/src/lib/components/schema/SchemaToolView.svelte @@ -1,8 +1,10 @@