From c4eab388662b927aa5a6527be75350686e903865 Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sun, 4 Oct 2026 08:48:14 +0500 Subject: [PATCH] refactor: separate components --- docs/architecture.md | 15 ++-- docs/backlog.md | 4 +- web/src/lib/components/SchemaActions.svelte | 62 -------------- .../{ => catalog}/CatalogGroup.svelte | 0 .../{ => catalog}/CatalogHeader.svelte | 0 .../{ => catalog}/CatalogToolbar.svelte | 28 ++----- .../components/{ => catalog}/ToolCard.svelte | 2 +- .../{ => display}/CheckerCanvas.svelte | 0 .../components/{ => display}/CodeBlock.svelte | 2 +- .../components/{ => display}/ImageCard.svelte | 0 .../components/{ => display}/MetaList.svelte | 0 .../components/{ => display}/MetaRow.svelte | 0 .../components/{ => display}/MonoLabel.svelte | 0 .../{ => display}/SettingGroup.svelte | 0 .../{ => display}/SettingsFooter.svelte | 0 .../components/{ => display}/StepCard.svelte | 28 ++----- .../{ => feedback}/EmptyState.svelte | 2 +- .../{ => feedback}/StatusDot.svelte | 0 .../{ => feedback}/StatusLine.svelte | 2 +- web/src/lib/components/fields/Field.svelte | 2 +- .../fields/schema/AngleControl.svelte | 29 ++----- .../fields/schema/CheckboxControl.svelte | 19 +---- .../fields/schema/ColorControl.svelte | 49 ++--------- .../fields/schema/ColorPairControl.svelte | 52 ++---------- .../fields/schema/ColorSwatchInput.svelte | 44 ++++++++++ .../fields/schema/ColorsControl.svelte | 82 +++++-------------- .../components/fields/schema/Control.svelte | 57 +++++++++++++ .../fields/{ => schema}/DimensionField.svelte | 20 +---- .../fields/schema/FontStyleControl.svelte | 54 ++---------- .../fields/schema/GradientControl.svelte | 51 ++---------- .../fields/schema/OffsetControl.svelte | 20 +---- .../fields/schema/PlateControl.svelte | 55 ++----------- .../fields/schema/PositionControl.svelte | 20 +---- .../fields/schema/RangeControl.svelte | 24 ++---- .../fields/schema/SelectControl.svelte | 14 +--- .../fields/schema/TextControl.svelte | 14 +--- web/src/lib/components/layout/Panel.svelte | 2 +- .../{ => layout}/PanelHeading.svelte | 2 +- web/src/lib/components/layout/TopBar.svelte | 6 +- .../components/{ui => layout}/TopNav.svelte | 0 .../components/{ => schema}/Dropzone.svelte | 0 .../{layout => schema}/PreviewTile.svelte | 0 .../components/schema/SchemaActions.svelte | 37 +++++++++ .../{ => schema}/SchemaFields.svelte | 51 +++++------- .../{ => schema}/SchemaPreview.svelte | 10 +-- .../{ => schema}/SchemaResultTile.svelte | 2 +- .../{ => schema}/SchemaSourceTile.svelte | 2 +- .../{ => schema}/SchemaTextResult.svelte | 2 +- .../{ => schema}/SchemaTextSource.svelte | 55 ++++--------- .../{ => schema}/SchemaToolView.svelte | 4 +- .../{ => schema}/schema-preview-model.test.ts | 2 +- .../{ => schema}/schema-preview-model.ts | 4 +- web/src/lib/components/ui/Button.svelte | 48 ++++++++++- web/src/lib/components/ui/ChipButton.svelte | 56 +++++++++++++ web/src/lib/components/ui/IconButton.svelte | 18 +++- web/src/lib/components/ui/ThemeToggle.svelte | 2 +- web/src/lib/components/ui/UploadButton.svelte | 47 +++++++++++ web/src/lib/components/{ => ui}/define.ts | 8 ++ web/src/routes/+page.svelte | 8 +- web/src/routes/kit/+page.svelte | 43 +++++++--- web/src/routes/list-tools/+page.svelte | 8 +- web/src/routes/tools/[slug]/+page.svelte | 4 +- web/vitest.config.ts | 2 +- 63 files changed, 529 insertions(+), 645 deletions(-) delete mode 100644 web/src/lib/components/SchemaActions.svelte rename web/src/lib/components/{ => catalog}/CatalogGroup.svelte (100%) rename web/src/lib/components/{ => catalog}/CatalogHeader.svelte (100%) rename web/src/lib/components/{ => catalog}/CatalogToolbar.svelte (75%) rename web/src/lib/components/{ => catalog}/ToolCard.svelte (97%) rename web/src/lib/components/{ => display}/CheckerCanvas.svelte (100%) rename web/src/lib/components/{ => display}/CodeBlock.svelte (94%) rename web/src/lib/components/{ => display}/ImageCard.svelte (100%) rename web/src/lib/components/{ => display}/MetaList.svelte (100%) rename web/src/lib/components/{ => display}/MetaRow.svelte (100%) rename web/src/lib/components/{ => display}/MonoLabel.svelte (100%) rename web/src/lib/components/{ => display}/SettingGroup.svelte (100%) rename web/src/lib/components/{ => display}/SettingsFooter.svelte (100%) rename web/src/lib/components/{ => display}/StepCard.svelte (84%) rename web/src/lib/components/{ => feedback}/EmptyState.svelte (95%) rename web/src/lib/components/{ => feedback}/StatusDot.svelte (100%) rename web/src/lib/components/{ => feedback}/StatusLine.svelte (83%) create mode 100644 web/src/lib/components/fields/schema/ColorSwatchInput.svelte create mode 100644 web/src/lib/components/fields/schema/Control.svelte rename web/src/lib/components/fields/{ => schema}/DimensionField.svelte (80%) rename web/src/lib/components/{ => layout}/PanelHeading.svelte (93%) rename web/src/lib/components/{ui => layout}/TopNav.svelte (100%) rename web/src/lib/components/{ => schema}/Dropzone.svelte (100%) rename web/src/lib/components/{layout => schema}/PreviewTile.svelte (100%) create mode 100644 web/src/lib/components/schema/SchemaActions.svelte rename web/src/lib/components/{ => schema}/SchemaFields.svelte (68%) rename web/src/lib/components/{ => schema}/SchemaPreview.svelte (88%) rename web/src/lib/components/{ => schema}/SchemaResultTile.svelte (98%) rename web/src/lib/components/{ => schema}/SchemaSourceTile.svelte (96%) rename web/src/lib/components/{ => schema}/SchemaTextResult.svelte (98%) rename web/src/lib/components/{ => schema}/SchemaTextSource.svelte (56%) rename web/src/lib/components/{ => schema}/SchemaToolView.svelte (98%) rename web/src/lib/components/{ => schema}/schema-preview-model.test.ts (98%) rename web/src/lib/components/{ => schema}/schema-preview-model.ts (92%) create mode 100644 web/src/lib/components/ui/ChipButton.svelte create mode 100644 web/src/lib/components/ui/UploadButton.svelte rename web/src/lib/components/{ => ui}/define.ts (61%) diff --git a/docs/architecture.md b/docs/architecture.md index 9d92b8a..d68f8fe 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -19,7 +19,10 @@ web/src/lib/ core/ # операции над ImageData; без DOM, кроме io.ts/domText.ts executor/ # единственная точка исполнения инструментов i18n/ # словари ru/en, t(), состояние локали - components/ # UI (fields/, layout/, ui/, schema-компоненты) + components/ # UI по слоям: ui/ примитивы, layout/ каркас, + # catalog/ каталог, schema/ view инструмента, + # fields/ поля (+ fields/schema/ контролы схемы), + # display/ типографика и карточки, feedback/ состояния zip.ts # сборка мультифайлового результата (1 → many) theme.svelte.ts # light/dark + localStorage web/src/routes/ @@ -49,9 +52,10 @@ Coverage). Всё остальное в `core/**` — чистые функци него нет. Модель страницы уже хранит список `steps`, но исполняет первый шаг, а `registry.test.ts` требует, чтобы шаг был ровно один: композиция формы из полей двух инструментов — отдельная работа, описанная как фаза 11 - `docs/roadmap.md`. Под неё зарезервированы `components/StepCard.svelte` - (сейчас импортируется только витриной `/kit`) и ключи `chain.*`, - `errors.badPipelineShape`, `errors.pipelineVersion`, `errors.noSteps`. + `docs/roadmap.md`. Под неё зарезервированы + `components/display/StepCard.svelte` (сейчас импортируется только витриной + `/kit`) и ключи `chain.*`, `errors.badPipelineShape`, + `errors.pipelineVersion`, `errors.noSteps`. - **Разделения страниц, которые делят один инструмент** — сводит все convert-страницы на один инструмент; задача в `docs/backlog.md`. Пока `registry.test.ts` не требует, чтобы на инструмент ссылались две страницы, а @@ -169,8 +173,7 @@ registry/{tools,pages}/*.ts допустимому виду. Правка поведения полей идёт здесь, а не в компоненте. Новый вид поля требует: спека + фабрика `field.*` → запись в `fieldSpecs` → -контрол (`components/fields/schema/`, а для `dimension` — -`fields/DimensionField.svelte`) → ключ в `FIELDS` → дефолт и санитизация → +контрол (`components/fields/schema/`) → ключ в `FIELDS` → дефолт и санитизация → i18n-подписи → тест в `registry-schema.test.ts`. ## 5. Исполнение diff --git a/docs/backlog.md b/docs/backlog.md index 72767da..f8fb017 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -92,12 +92,12 @@ - [ ] `SchemaTextResult` вердикт-бейдж рисует руками: свои классы `badge`/`badge-tone--{tone}` и свой CSS в ` diff --git a/web/src/lib/components/CatalogGroup.svelte b/web/src/lib/components/catalog/CatalogGroup.svelte similarity index 100% rename from web/src/lib/components/CatalogGroup.svelte rename to web/src/lib/components/catalog/CatalogGroup.svelte diff --git a/web/src/lib/components/CatalogHeader.svelte b/web/src/lib/components/catalog/CatalogHeader.svelte similarity index 100% rename from web/src/lib/components/CatalogHeader.svelte rename to web/src/lib/components/catalog/CatalogHeader.svelte diff --git a/web/src/lib/components/CatalogToolbar.svelte b/web/src/lib/components/catalog/CatalogToolbar.svelte similarity index 75% rename from web/src/lib/components/CatalogToolbar.svelte rename to web/src/lib/components/catalog/CatalogToolbar.svelte index 4a210c2..1786f32 100644 --- a/web/src/lib/components/CatalogToolbar.svelte +++ b/web/src/lib/components/catalog/CatalogToolbar.svelte @@ -1,5 +1,6 @@ - + + + onchange?.(v)} /> + diff --git a/web/src/lib/components/fields/schema/ColorPairControl.svelte b/web/src/lib/components/fields/schema/ColorPairControl.svelte index a1226aa..43ae765 100644 --- a/web/src/lib/components/fields/schema/ColorPairControl.svelte +++ b/web/src/lib/components/fields/schema/ColorPairControl.svelte @@ -5,6 +5,8 @@ ColorPairSpec, FieldSpec, } from "$lib/registry-schema"; + import ColorSwatchInput from "./ColorSwatchInput.svelte"; + import Control from "./Control.svelte"; interface Props { label: string; @@ -28,45 +30,26 @@ } -
- {label} +
-
+ diff --git a/web/src/lib/components/fields/schema/ColorSwatchInput.svelte b/web/src/lib/components/fields/schema/ColorSwatchInput.svelte new file mode 100644 index 0000000..6701460 --- /dev/null +++ b/web/src/lib/components/fields/schema/ColorSwatchInput.svelte @@ -0,0 +1,44 @@ + + + + + onchange?.((e.target as HTMLInputElement).value)} + /> + + + diff --git a/web/src/lib/components/fields/schema/ColorsControl.svelte b/web/src/lib/components/fields/schema/ColorsControl.svelte index 296ea85..d3ccdea 100644 --- a/web/src/lib/components/fields/schema/ColorsControl.svelte +++ b/web/src/lib/components/fields/schema/ColorsControl.svelte @@ -1,10 +1,14 @@ -
- {label} +
{#each current as hex, i (i)}
@@ -55,38 +58,28 @@ /> {hex} - + />
{/each}
- -
+
+
+ diff --git a/web/src/lib/components/fields/schema/Control.svelte b/web/src/lib/components/fields/schema/Control.svelte new file mode 100644 index 0000000..eb4e7fe --- /dev/null +++ b/web/src/lib/components/fields/schema/Control.svelte @@ -0,0 +1,57 @@ + + + + + {label} + {#if trailing}{@render trailing()}{/if} + + {@render children()} + + + diff --git a/web/src/lib/components/fields/DimensionField.svelte b/web/src/lib/components/fields/schema/DimensionField.svelte similarity index 80% rename from web/src/lib/components/fields/DimensionField.svelte rename to web/src/lib/components/fields/schema/DimensionField.svelte index f208396..ec6f8df 100644 --- a/web/src/lib/components/fields/DimensionField.svelte +++ b/web/src/lib/components/fields/schema/DimensionField.svelte @@ -5,6 +5,7 @@ DimensionSpec, FieldSpec, } from "$lib/registry-schema"; + import Control from "./Control.svelte"; interface Props { label: string; @@ -34,8 +35,7 @@ } -
- {label} +
-
+ diff --git a/web/src/lib/components/fields/schema/OffsetControl.svelte b/web/src/lib/components/fields/schema/OffsetControl.svelte index 765c46d..2c513df 100644 --- a/web/src/lib/components/fields/schema/OffsetControl.svelte +++ b/web/src/lib/components/fields/schema/OffsetControl.svelte @@ -1,5 +1,6 @@ -
- {label} +
-
+ diff --git a/web/src/lib/components/SchemaFields.svelte b/web/src/lib/components/schema/SchemaFields.svelte similarity index 68% rename from web/src/lib/components/SchemaFields.svelte rename to web/src/lib/components/schema/SchemaFields.svelte index 362e88a..2426339 100644 --- a/web/src/lib/components/SchemaFields.svelte +++ b/web/src/lib/components/schema/SchemaFields.svelte @@ -9,19 +9,20 @@ import { t } from "$lib/i18n/t"; import { RotateCcw } from "@lucide/svelte"; import type { Component } from "svelte"; - import DimensionField from "./fields/DimensionField.svelte"; - import CheckboxControl from "./fields/schema/CheckboxControl.svelte"; - import ColorControl from "./fields/schema/ColorControl.svelte"; - import ColorPairControl from "./fields/schema/ColorPairControl.svelte"; - import ColorsControl from "./fields/schema/ColorsControl.svelte"; - import RangeControl from "./fields/schema/RangeControl.svelte"; - import SelectControl from "./fields/schema/SelectControl.svelte"; - import TextControl from "./fields/schema/TextControl.svelte"; - import OffsetControl from "./fields/schema/OffsetControl.svelte"; - import PositionControl from "./fields/schema/PositionControl.svelte"; - import FontStyleControl from "./fields/schema/FontStyleControl.svelte"; - import PlateControl from "./fields/schema/PlateControl.svelte"; - import GradientControl from "./fields/schema/GradientControl.svelte"; + import Button from "$lib/components/ui/Button.svelte"; + import DimensionField from "$lib/components/fields/schema/DimensionField.svelte"; + import CheckboxControl from "$lib/components/fields/schema/CheckboxControl.svelte"; + import ColorControl from "$lib/components/fields/schema/ColorControl.svelte"; + import ColorPairControl from "$lib/components/fields/schema/ColorPairControl.svelte"; + import ColorsControl from "$lib/components/fields/schema/ColorsControl.svelte"; + import RangeControl from "$lib/components/fields/schema/RangeControl.svelte"; + import SelectControl from "$lib/components/fields/schema/SelectControl.svelte"; + import TextControl from "$lib/components/fields/schema/TextControl.svelte"; + import OffsetControl from "$lib/components/fields/schema/OffsetControl.svelte"; + import PositionControl from "$lib/components/fields/schema/PositionControl.svelte"; + import FontStyleControl from "$lib/components/fields/schema/FontStyleControl.svelte"; + import PlateControl from "$lib/components/fields/schema/PlateControl.svelte"; + import GradientControl from "$lib/components/fields/schema/GradientControl.svelte"; interface FieldControlProps { label: string; @@ -86,10 +87,13 @@ {/each}
- +
@@ -120,19 +124,6 @@ padding-top: var(--space-l); border-top: var(--size-border) solid var(--color-border); } - .reset-btn { - display: inline-flex; - align-items: center; - gap: var(--space-m); - background: none; - border: none; - color: var(--color-text-muted); - font: var(--font-size-s) var(--font-mono); - cursor: pointer; - } - .reset-btn:hover { - color: var(--color-text); - } .auto-note i { width: var(--size-border-thick); height: var(--size-border-thick); diff --git a/web/src/lib/components/SchemaPreview.svelte b/web/src/lib/components/schema/SchemaPreview.svelte similarity index 88% rename from web/src/lib/components/SchemaPreview.svelte rename to web/src/lib/components/schema/SchemaPreview.svelte index 9e57199..ba81bfa 100644 --- a/web/src/lib/components/SchemaPreview.svelte +++ b/web/src/lib/components/schema/SchemaPreview.svelte @@ -1,9 +1,9 @@ + + diff --git a/web/src/lib/components/ui/IconButton.svelte b/web/src/lib/components/ui/IconButton.svelte index dfe8577..b0311f8 100644 --- a/web/src/lib/components/ui/IconButton.svelte +++ b/web/src/lib/components/ui/IconButton.svelte @@ -1,6 +1,10 @@ -