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