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 @@ -