From 6be9d10c42580a984b78e95fb0e317b2d4d6993a Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Mon, 7 Sep 2026 10:15:49 +0500 Subject: [PATCH] feat: add multiple colors field --- .../lib/components/kit/SchemaFields.svelte | 2 + .../kit/fields/schema/ColorsControl.svelte | 156 ++++++++++++++++++ web/src/lib/registry-schema.ts | 23 +++ 3 files changed, 181 insertions(+) create mode 100644 web/src/lib/components/kit/fields/schema/ColorsControl.svelte diff --git a/web/src/lib/components/kit/SchemaFields.svelte b/web/src/lib/components/kit/SchemaFields.svelte index 442c424..1fee64b 100644 --- a/web/src/lib/components/kit/SchemaFields.svelte +++ b/web/src/lib/components/kit/SchemaFields.svelte @@ -10,6 +10,7 @@ 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"; @@ -31,6 +32,7 @@ slider: RangeControl, color: ColorControl, "color-pair": ColorPairControl, + colors: ColorsControl, select: SelectControl, checkbox: CheckboxControl, text: TextControl, diff --git a/web/src/lib/components/kit/fields/schema/ColorsControl.svelte b/web/src/lib/components/kit/fields/schema/ColorsControl.svelte new file mode 100644 index 0000000..adeb9ef --- /dev/null +++ b/web/src/lib/components/kit/fields/schema/ColorsControl.svelte @@ -0,0 +1,156 @@ + + +
+ {label} +
+ {#each current as hex, i (i)} +
+ + {hex} + +
+ {/each} +
+ +
+ + diff --git a/web/src/lib/registry-schema.ts b/web/src/lib/registry-schema.ts index e174525..9a9f69d 100644 --- a/web/src/lib/registry-schema.ts +++ b/web/src/lib/registry-schema.ts @@ -79,6 +79,14 @@ export interface ColorPairSpec { to: string; } +/** Список цветов (палитра): массив hex-строк. */ +export type ColorList = string[]; + +export interface ColorListSpec { + kind: "colors"; + default: string[]; +} + /** Смещение фигуры/объекта по центру: x + y в процентах. */ export interface Offset { x: number; @@ -187,6 +195,7 @@ export const fieldSpecs = { checkbox: {} as CheckboxSpec, dimension: {} as DimensionSpec, "color-pair": {} as ColorPairSpec, + colors: {} as ColorListSpec, offset: {} as OffsetSpec, position9: {} as Position9Spec, "font-style": {} as FontStyleSpec, @@ -262,6 +271,9 @@ export const field = { colorPair: (s: { from: string; to: string }): Field => ({ spec: { kind: "color-pair", ...s }, }), + colors: (s: { default: string[] }): Field => ({ + spec: { kind: "colors", ...s }, + }), offset: (s: { min: number; max: number; @@ -327,6 +339,8 @@ export function defaultSchemaParams

( out[key] = { width: spec.width, height: spec.height }; } else if (spec.kind === "color-pair") { out[key] = { from: spec.from, to: spec.to }; + } else if (spec.kind === "colors") { + out[key] = [...spec.default]; } else if (spec.kind === "offset") { out[key] = { x: spec.x, y: spec.y }; } else if (spec.kind === "font-style") { @@ -431,6 +445,15 @@ export function sanitizeSchemaParams

( out[key] = { from, to }; break; } + case "colors": { + const r = + Array.isArray(raw) && + raw.every((c) => typeof c === "string" && /^#[0-9a-f]{6}$/i.test(c)) + ? (raw as string[]) + : undefined; + out[key] = r && r.length > 0 ? [...r] : [...spec.default]; + break; + } case "position9": out[key] = typeof raw === "string" &&