@syncropel/projections 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/schema.d.ts +247 -15
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +18 -7
- package/dist/schema.js.map +1 -1
- package/dist/validators.d.ts +1 -1
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +159 -5
- package/dist/validators.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,44 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `@syncropel/projections` are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project uses [SemVer](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [0.4.0] — 2026-05-18
|
|
6
|
+
|
|
7
|
+
SRP v0.4 — eight visualization + hierarchy node types plus `data-table` row selection and a two-line cell kind. Additive and backwards-compatible: every v0.1/v0.2/v0.3 document remains valid; the `srp` field now accepts `"0.1"`, `"0.2"`, `"0.3"`, or `"0.4"`. See ADR-104.
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
- **Eight new node types** (`NODE_TYPES` 25 → 33):
|
|
12
|
+
- **`meter`** — a horizontal bar gauge for a `0..1` reading; `continuous` or `segmented` variant, optional value→tone `thresholds`. For energy bands, trust scores, match confidence, cost-vs-budget.
|
|
13
|
+
- **`gauge`** — a 270° radial arc gauge for a `0..1` reading; optional coloured `zones`. Doubles as the Syncropel Dial (the `d ∈ [0,1]` control surface, F3).
|
|
14
|
+
- **`avatar`** — a compact identity token: image `src`, initials from `name`, or a `glyph` fallback.
|
|
15
|
+
- **`progress`** — a determinate or `indeterminate` progress bar.
|
|
16
|
+
- **`sparkline`** — a tiny axis-less inline chart (`line` or `bar`) for trend-at-a-glance.
|
|
17
|
+
- **`chart`** — a labelled `line` / `area` / `bar` / `pie` chart with axes + an optional legend.
|
|
18
|
+
- **`tree`** — a hierarchical, collapsible list (playlist folders, namespace trees, thread forks); host owns `bind.selected` / `bind.expanded`.
|
|
19
|
+
- **`tag-input`** — an editable tag set with optional autocomplete `suggestions`; the fourth stateful input, host owns `bind.tags`.
|
|
20
|
+
|
|
21
|
+
- **`data-table` `props.selectable`** — render a leading checkbox column with a select-all header; the table dispatches `onSelectionChange` with the selected rows.
|
|
22
|
+
|
|
23
|
+
- **`data-table` `kind: "lines"` cell** — a two-line cell rendering the `key` value as the primary line and the column's new `subKey` value as a muted subtitle.
|
|
24
|
+
|
|
25
|
+
- **New token unions + supporting types** — `VizTone`, `VizSize`, `MeterVariant`, `SparklineVariant`, `ChartKind`; exported interfaces `MeterNode`, `GaugeNode`, `AvatarNode`, `ProgressNode`, `SparklineNode`, `ChartNode`, `TreeNode`, `TagInputNode`, `VizThreshold`, `GaugeZone`, `ChartPoint`, `ChartSeries`, `TreeItem`. `TableCellKind` gains `"lines"`.
|
|
26
|
+
|
|
27
|
+
### Validators
|
|
28
|
+
|
|
29
|
+
- `validateSRP` / `validateNode` accept `srp: "0.4"` and validate all eight new nodes — `meter`/`gauge` require a numeric `value`; `avatar` requires a non-empty `name`; `sparkline` requires a `values` number array; `chart` requires a known `kind` + non-empty `series`; `tree` requires an `items` array (recursively validating each `{id, label}`); `tag-input` requires `bind.tags`. The `data-table` `kind` enum gains `"lines"` and `subKey` is type-checked.
|
|
30
|
+
|
|
31
|
+
### Compatibility
|
|
32
|
+
|
|
33
|
+
- Additive minor release (SemVer-minor). Every v0.1/v0.2/v0.3 type export is unchanged; every prior document validates unchanged. The v0.4 additions are new node types validated by `NODE_TYPES` membership plus optional `data-table` props — the `srp` version is a capability advertisement, not an enforcement boundary.
|
|
34
|
+
|
|
35
|
+
## [0.3.1] — 2026-05-18
|
|
36
|
+
|
|
37
|
+
Additive, backwards-compatible — a `segmented` presentation hint.
|
|
38
|
+
|
|
39
|
+
### Features
|
|
40
|
+
|
|
41
|
+
- **`segmented` node `props.variant`** — a `segmented` control may now declare `variant: "solid" | "underline"`. `solid` (default) is a light pill group; `underline` is a borderless tab strip (the active option underlined). New `SegmentedVariant` token union. Validators reject any other value. Every 0.3.0 document remains valid — `variant` is optional and defaults to `solid`.
|
|
42
|
+
|
|
5
43
|
## [0.3.0] — 2026-05-18
|
|
6
44
|
|
|
7
45
|
SRP v0.3 — a polished-data-grid increment. One new node type plus optional props on `data-table` and `record-line`. Additive and backwards-compatible: every v0.1 and v0.2 document remains valid; the `srp` field now accepts `"0.1"`, `"0.2"`, or `"0.3"`. See ADR-103.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.
|
|
2
|
+
* @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.4.
|
|
3
3
|
*
|
|
4
4
|
* TypeScript schema + runtime validators for declarative UI documents
|
|
5
5
|
* rendered by @syncropel/react (and other renderers). Zero runtime
|
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
*
|
|
8
8
|
* v0.2 adds five interactive container + input node types (tabs,
|
|
9
9
|
* data-table, board, text-input, form). v0.3 adds the `segmented` node
|
|
10
|
-
* plus a polished-data-grid increment to `data-table`.
|
|
11
|
-
*
|
|
10
|
+
* plus a polished-data-grid increment to `data-table`. v0.4 adds eight
|
|
11
|
+
* visualization + hierarchy nodes (meter, gauge, avatar, progress,
|
|
12
|
+
* sparkline, chart, tree, tag-input) plus `data-table` row selection.
|
|
13
|
+
* Every increment is additive and backwards-compatible.
|
|
12
14
|
*
|
|
13
15
|
* Docs: https://syncropel.com
|
|
14
16
|
*/
|
|
15
|
-
export type { SRPDocument, SRPMeta, SRPNode, NodeType, ColumnNode, RowNode, GridNode, CardNode, DividerNode, RecordLineNode, RecordLineListNode, ChipNode, HeadingNode, TextNode, StatNode, KeyValueNode, ButtonNode, IconButtonNode, CopyButtonNode, SelectNode, EmptyStateNode, ErrorStateNode, SkeletonNode, TabsNode, DataTableNode, BoardNode, TextInputNode, FormNode, SegmentedNode, SegmentedOption, DataTableColumnDef, TableSort, TableRowAction, TableRowTone, Gap, Padding, DividerSpacing, Cols, ColumnAlign, RowAlign, Justify, RecordLineVariant, ChipTone, TextSize, TextWeight, TextTone, ButtonVariant, ButtonSize, SkeletonShape, TableColumnAlign, TableCellKind, DataTableVariant, TextInputKind, RowTone, SortDirection, RowActionPosition, GlyphKind, ActionDesc, VQLQuery, } from "./schema.js";
|
|
17
|
+
export type { SRPDocument, SRPMeta, SRPNode, NodeType, ColumnNode, RowNode, GridNode, CardNode, DividerNode, RecordLineNode, RecordLineListNode, ChipNode, HeadingNode, TextNode, StatNode, KeyValueNode, ButtonNode, IconButtonNode, CopyButtonNode, SelectNode, EmptyStateNode, ErrorStateNode, SkeletonNode, TabsNode, DataTableNode, BoardNode, TextInputNode, FormNode, SegmentedNode, SegmentedOption, DataTableColumnDef, TableSort, TableRowAction, TableRowTone, MeterNode, GaugeNode, AvatarNode, ProgressNode, SparklineNode, ChartNode, TreeNode, TagInputNode, VizThreshold, GaugeZone, ChartPoint, ChartSeries, TreeItem, Gap, Padding, DividerSpacing, Cols, ColumnAlign, RowAlign, Justify, RecordLineVariant, ChipTone, TextSize, TextWeight, TextTone, ButtonVariant, ButtonSize, SkeletonShape, TableColumnAlign, TableCellKind, DataTableVariant, TextInputKind, RowTone, SortDirection, RowActionPosition, SegmentedVariant, VizTone, VizSize, MeterVariant, SparklineVariant, ChartKind, GlyphKind, ActionDesc, VQLQuery, } from "./schema.js";
|
|
16
18
|
export { NODE_TYPES } from "./schema.js";
|
|
17
19
|
export { validateSRP, validateNode, isSRPDocument, isSRPNode, } from "./validators.js";
|
|
18
20
|
export type { ValidationResult, ValidationError, ValidationErrorCode, } from "./validators.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,YAAY,EACV,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EAER,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAAW,EAEX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EAER,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EAEZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EAEV,cAAc,EACd,cAAc,EACd,YAAY,EAEZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,aAAa,EACb,QAAQ,EAER,aAAa,EACb,eAAe,EAEf,kBAAkB,EAClB,SAAS,EACT,cAAc,EACd,YAAY,EAEZ,SAAS,EACT,SAAS,EACT,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,QAAQ,EACR,YAAY,EAEZ,YAAY,EACZ,SAAS,EACT,UAAU,EACV,WAAW,EACX,QAAQ,EAER,GAAG,EACH,OAAO,EACP,cAAc,EACd,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,OAAO,EACP,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,OAAO,EACP,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,SAAS,EACT,SAAS,EAET,UAAU,EACV,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.
|
|
2
|
+
* @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.4.
|
|
3
3
|
*
|
|
4
4
|
* TypeScript schema + runtime validators for declarative UI documents
|
|
5
5
|
* rendered by @syncropel/react (and other renderers). Zero runtime
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
*
|
|
8
8
|
* v0.2 adds five interactive container + input node types (tabs,
|
|
9
9
|
* data-table, board, text-input, form). v0.3 adds the `segmented` node
|
|
10
|
-
* plus a polished-data-grid increment to `data-table`.
|
|
11
|
-
*
|
|
10
|
+
* plus a polished-data-grid increment to `data-table`. v0.4 adds eight
|
|
11
|
+
* visualization + hierarchy nodes (meter, gauge, avatar, progress,
|
|
12
|
+
* sparkline, chart, tree, tag-input) plus `data-table` row selection.
|
|
13
|
+
* Every increment is additive and backwards-compatible.
|
|
12
14
|
*
|
|
13
15
|
* Docs: https://syncropel.com
|
|
14
16
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAgGH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,aAAa;AACb,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAQzB,yBAAyB;AACzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC","sourcesContent":["/**\n * @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.4.\n *\n * TypeScript schema + runtime validators for declarative UI documents\n * rendered by @syncropel/react (and other renderers). Zero runtime\n * dependencies; universal runtime (Node, Deno, Bun, Workers, browsers).\n *\n * v0.2 adds five interactive container + input node types (tabs,\n * data-table, board, text-input, form). v0.3 adds the `segmented` node\n * plus a polished-data-grid increment to `data-table`. v0.4 adds eight\n * visualization + hierarchy nodes (meter, gauge, avatar, progress,\n * sparkline, chart, tree, tag-input) plus `data-table` row selection.\n * Every increment is additive and backwards-compatible.\n *\n * Docs: https://syncropel.com\n */\n\n// Schema types\nexport type {\n SRPDocument,\n SRPMeta,\n SRPNode,\n NodeType,\n // Container nodes\n ColumnNode,\n RowNode,\n GridNode,\n CardNode,\n DividerNode,\n // Record-rendering nodes\n RecordLineNode,\n RecordLineListNode,\n ChipNode,\n // Data-display nodes\n HeadingNode,\n TextNode,\n StatNode,\n KeyValueNode,\n // Interactive nodes\n ButtonNode,\n IconButtonNode,\n CopyButtonNode,\n SelectNode,\n // Feedback nodes\n EmptyStateNode,\n ErrorStateNode,\n SkeletonNode,\n // Interactive containers + inputs (SRP v0.2)\n TabsNode,\n DataTableNode,\n BoardNode,\n TextInputNode,\n FormNode,\n // Choice control (SRP v0.3)\n SegmentedNode,\n SegmentedOption,\n // Data-grid supporting types (SRP v0.3)\n DataTableColumnDef,\n TableSort,\n TableRowAction,\n TableRowTone,\n // Visualization + hierarchy nodes (SRP v0.4)\n MeterNode,\n GaugeNode,\n AvatarNode,\n ProgressNode,\n SparklineNode,\n ChartNode,\n TreeNode,\n TagInputNode,\n // Visualization + hierarchy supporting types (SRP v0.4)\n VizThreshold,\n GaugeZone,\n ChartPoint,\n ChartSeries,\n TreeItem,\n // Token unions\n Gap,\n Padding,\n DividerSpacing,\n Cols,\n ColumnAlign,\n RowAlign,\n Justify,\n RecordLineVariant,\n ChipTone,\n TextSize,\n TextWeight,\n TextTone,\n ButtonVariant,\n ButtonSize,\n SkeletonShape,\n TableColumnAlign,\n TableCellKind,\n DataTableVariant,\n TextInputKind,\n RowTone,\n SortDirection,\n RowActionPosition,\n SegmentedVariant,\n VizTone,\n VizSize,\n MeterVariant,\n SparklineVariant,\n ChartKind,\n GlyphKind,\n // Actions + queries\n ActionDesc,\n VQLQuery,\n} from \"./schema.js\";\n\nexport { NODE_TYPES } from \"./schema.js\";\n\n// Validators\nexport {\n validateSRP,\n validateNode,\n isSRPDocument,\n isSRPNode,\n} from \"./validators.js\";\n\nexport type {\n ValidationResult,\n ValidationError,\n ValidationErrorCode,\n} from \"./validators.js\";\n\n// Markdown subset parser\nexport { parseInline, stripFormatting } from \"./markdown.js\";\nexport type { InlineNode } from \"./markdown.js\";\n"]}
|
package/dist/schema.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SRP v0.
|
|
2
|
+
* SRP v0.4 — TypeScript schema types.
|
|
3
3
|
*
|
|
4
4
|
* The Syncropel Rendering Protocol is a narrow JSON schema of block-level
|
|
5
5
|
* primitives for declarative UI documents. See the spec and examples at
|
|
@@ -7,10 +7,12 @@
|
|
|
7
7
|
*
|
|
8
8
|
* v0.2 adds five interactive container + input nodes (tabs, data-table,
|
|
9
9
|
* board, text-input, form). v0.3 adds the `segmented` node plus a
|
|
10
|
-
* polished-data-grid increment to `data-table
|
|
11
|
-
*
|
|
12
|
-
* `
|
|
13
|
-
*
|
|
10
|
+
* polished-data-grid increment to `data-table`. v0.4 adds eight
|
|
11
|
+
* visualization + hierarchy nodes — `meter`, `gauge`, `avatar`,
|
|
12
|
+
* `progress`, `sparkline`, `chart`, `tree`, `tag-input` — plus
|
|
13
|
+
* `data-table` row selection and a two-line cell kind. Every addition is
|
|
14
|
+
* additive + backwards-compatible: every v0.1/v0.2/v0.3 document remains
|
|
15
|
+
* valid. See ADR-102, ADR-103, and ADR-104.
|
|
14
16
|
*/
|
|
15
17
|
/**
|
|
16
18
|
* An SRP v0.1 document — the top-level envelope a Tier-1 extension emits.
|
|
@@ -19,10 +21,12 @@ export interface SRPDocument {
|
|
|
19
21
|
/**
|
|
20
22
|
* Protocol version. A `"0.2"` document may use the v0.2 node additions;
|
|
21
23
|
* a `"0.3"` document may additionally use `segmented` + the data-grid
|
|
22
|
-
* props
|
|
23
|
-
*
|
|
24
|
+
* props; a `"0.4"` document may additionally use the visualization +
|
|
25
|
+
* hierarchy nodes. The version is a capability advertisement, not an
|
|
26
|
+
* enforcement boundary — node validity is decided by `NODE_TYPES`
|
|
27
|
+
* membership.
|
|
24
28
|
*/
|
|
25
|
-
srp: "0.1" | "0.2" | "0.3";
|
|
29
|
+
srp: "0.1" | "0.2" | "0.3" | "0.4";
|
|
26
30
|
meta?: SRPMeta;
|
|
27
31
|
root: SRPNode;
|
|
28
32
|
}
|
|
@@ -32,12 +36,12 @@ export interface SRPMeta {
|
|
|
32
36
|
description?: string;
|
|
33
37
|
publisher?: string;
|
|
34
38
|
}
|
|
35
|
-
export type SRPNode = ColumnNode | RowNode | GridNode | CardNode | DividerNode | RecordLineNode | RecordLineListNode | ChipNode | HeadingNode | TextNode | StatNode | KeyValueNode | ButtonNode | IconButtonNode | CopyButtonNode | SelectNode | EmptyStateNode | ErrorStateNode | SkeletonNode | TabsNode | DataTableNode | BoardNode | TextInputNode | FormNode | SegmentedNode;
|
|
39
|
+
export type SRPNode = ColumnNode | RowNode | GridNode | CardNode | DividerNode | RecordLineNode | RecordLineListNode | ChipNode | HeadingNode | TextNode | StatNode | KeyValueNode | ButtonNode | IconButtonNode | CopyButtonNode | SelectNode | EmptyStateNode | ErrorStateNode | SkeletonNode | TabsNode | DataTableNode | BoardNode | TextInputNode | FormNode | SegmentedNode | MeterNode | GaugeNode | AvatarNode | ProgressNode | SparklineNode | ChartNode | TreeNode | TagInputNode;
|
|
36
40
|
/**
|
|
37
|
-
* The
|
|
38
|
-
* 1 v0.3).
|
|
41
|
+
* The 33 canonical node-type discriminator strings (19 v0.1 + 5 v0.2 +
|
|
42
|
+
* 1 v0.3 + 8 v0.4).
|
|
39
43
|
*/
|
|
40
|
-
export declare const NODE_TYPES: readonly ["column", "row", "grid", "card", "divider", "record-line", "record-line-list", "chip", "heading", "text", "stat", "key-value", "button", "icon-button", "copy-button", "select", "empty-state", "error-state", "skeleton", "tabs", "data-table", "board", "text-input", "form", "segmented"];
|
|
44
|
+
export declare const NODE_TYPES: readonly ["column", "row", "grid", "card", "divider", "record-line", "record-line-list", "chip", "heading", "text", "stat", "key-value", "button", "icon-button", "copy-button", "select", "empty-state", "error-state", "skeleton", "tabs", "data-table", "board", "text-input", "form", "segmented", "meter", "gauge", "avatar", "progress", "sparkline", "chart", "tree", "tag-input"];
|
|
41
45
|
export type NodeType = (typeof NODE_TYPES)[number];
|
|
42
46
|
interface NodeBase {
|
|
43
47
|
when?: string;
|
|
@@ -64,9 +68,11 @@ export type DataTableVariant = "default" | "compact";
|
|
|
64
68
|
export type TextInputKind = "text" | "search";
|
|
65
69
|
/**
|
|
66
70
|
* How a `data-table` column renders its cell value. `text` (default) is a
|
|
67
|
-
* plain string; `chip` renders the value as a compact metadata chip
|
|
71
|
+
* plain string; `chip` renders the value as a compact metadata chip;
|
|
72
|
+
* `lines` (SRP v0.4) renders a two-line cell — the value at `key` as the
|
|
73
|
+
* primary line and the value at the column's `subKey` as a muted subtitle.
|
|
68
74
|
*/
|
|
69
|
-
export type TableCellKind = "text" | "chip";
|
|
75
|
+
export type TableCellKind = "text" | "chip" | "lines";
|
|
70
76
|
/**
|
|
71
77
|
* A row accent tone — `data-table` `rowTone` paints a left-border (and a
|
|
72
78
|
* subtle tint) keyed off a column value. Wider than `ChipTone`: it adds
|
|
@@ -77,6 +83,25 @@ export type RowTone = "default" | "accent" | "success" | "warn" | "error" | "inf
|
|
|
77
83
|
export type SortDirection = "asc" | "desc";
|
|
78
84
|
/** Which side of the row a `data-table` `rowActions` cell sits on. */
|
|
79
85
|
export type RowActionPosition = "leading" | "trailing";
|
|
86
|
+
/**
|
|
87
|
+
* How a `segmented` control presents. `solid` (default) is a light pill
|
|
88
|
+
* group; `underline` is a borderless tab strip (active option underlined).
|
|
89
|
+
* Added in SRP v0.3.1.
|
|
90
|
+
*/
|
|
91
|
+
export type SegmentedVariant = "solid" | "underline";
|
|
92
|
+
/**
|
|
93
|
+
* A visualization tone — shared by `meter`, `gauge`, `progress`,
|
|
94
|
+
* `sparkline`, and `chart`. Drives the fill / stroke colour. Added SRP v0.4.
|
|
95
|
+
*/
|
|
96
|
+
export type VizTone = "neutral" | "accent" | "success" | "warn" | "error" | "info";
|
|
97
|
+
/** A visualization size step — shared by the SRP v0.4 viz nodes. */
|
|
98
|
+
export type VizSize = "xs" | "sm" | "md" | "lg";
|
|
99
|
+
/** How a `meter` renders its fill — one bar, or a row of discrete cells. */
|
|
100
|
+
export type MeterVariant = "continuous" | "segmented";
|
|
101
|
+
/** How a `sparkline` renders its series. */
|
|
102
|
+
export type SparklineVariant = "line" | "bar";
|
|
103
|
+
/** The plot kind a `chart` draws. */
|
|
104
|
+
export type ChartKind = "line" | "area" | "bar" | "pie";
|
|
80
105
|
/**
|
|
81
106
|
* Glyph kinds — the closed enumeration of semantic symbols the palette renders.
|
|
82
107
|
* Covers act types, domain objects, thread states, and the AITL marker.
|
|
@@ -337,6 +362,11 @@ export interface DataTableColumnDef {
|
|
|
337
362
|
* absent from the list sort after the listed ones.
|
|
338
363
|
*/
|
|
339
364
|
order?: string[];
|
|
365
|
+
/**
|
|
366
|
+
* SRP v0.4 — for a `kind: "lines"` column, the dotted path whose value
|
|
367
|
+
* renders as the muted second line beneath the `key` value.
|
|
368
|
+
*/
|
|
369
|
+
subKey?: string;
|
|
340
370
|
}
|
|
341
371
|
/** SRP v0.3 — a `data-table` sort descriptor. */
|
|
342
372
|
export interface TableSort {
|
|
@@ -372,7 +402,8 @@ export interface TableRowTone {
|
|
|
372
402
|
* alignment, optional sort. `column.key` is a dotted path into each row.
|
|
373
403
|
*
|
|
374
404
|
* SRP v0.3 adds the polished-data-grid props: column `tones` + `order`,
|
|
375
|
-
* `defaultSort`, `rowActions`, and `rowTone
|
|
405
|
+
* `defaultSort`, `rowActions`, and `rowTone`. SRP v0.4 adds `selectable`
|
|
406
|
+
* (a leading checkbox column with multi-select) — all optional + additive.
|
|
376
407
|
*/
|
|
377
408
|
export interface DataTableNode extends NodeBase {
|
|
378
409
|
type: "data-table";
|
|
@@ -387,6 +418,12 @@ export interface DataTableNode extends NodeBase {
|
|
|
387
418
|
rowActions?: TableRowAction[];
|
|
388
419
|
/** SRP v0.3 — a value-keyed row accent. */
|
|
389
420
|
rowTone?: TableRowTone;
|
|
421
|
+
/**
|
|
422
|
+
* SRP v0.4 — render a leading checkbox column with a select-all
|
|
423
|
+
* header. The table owns selection state and dispatches
|
|
424
|
+
* `onSelectionChange` with the selected rows.
|
|
425
|
+
*/
|
|
426
|
+
selectable?: boolean;
|
|
390
427
|
};
|
|
391
428
|
bind: {
|
|
392
429
|
query: VQLQuery;
|
|
@@ -396,6 +433,8 @@ export interface DataTableNode extends NodeBase {
|
|
|
396
433
|
actions?: {
|
|
397
434
|
onRowClick?: ActionDesc;
|
|
398
435
|
onSort?: ActionDesc;
|
|
436
|
+
/** SRP v0.4 — fired (with `rows`) when the selection changes. */
|
|
437
|
+
onSelectionChange?: ActionDesc;
|
|
399
438
|
};
|
|
400
439
|
}
|
|
401
440
|
/**
|
|
@@ -482,6 +521,9 @@ export interface SegmentedNode extends NodeBase {
|
|
|
482
521
|
props: {
|
|
483
522
|
options: SegmentedOption[];
|
|
484
523
|
size?: ButtonSize;
|
|
524
|
+
/** Presentation — `solid` (light pill group, default) or `underline`
|
|
525
|
+
* (borderless tab strip). Added in SRP v0.3.1. */
|
|
526
|
+
variant?: SegmentedVariant;
|
|
485
527
|
};
|
|
486
528
|
bind: {
|
|
487
529
|
value: string;
|
|
@@ -490,5 +532,195 @@ export interface SegmentedNode extends NodeBase {
|
|
|
490
532
|
onChange?: ActionDesc;
|
|
491
533
|
};
|
|
492
534
|
}
|
|
535
|
+
/**
|
|
536
|
+
* A value→tone threshold for a `meter`. The meter's value selects the
|
|
537
|
+
* highest threshold whose `at` it reaches; that tone recolours the fill.
|
|
538
|
+
* List thresholds in ascending `at` order.
|
|
539
|
+
*/
|
|
540
|
+
export interface VizThreshold {
|
|
541
|
+
at: number;
|
|
542
|
+
tone: VizTone;
|
|
543
|
+
}
|
|
544
|
+
/**
|
|
545
|
+
* A horizontal bar gauge — renders a `0..1` reading as a proportional
|
|
546
|
+
* fill. `continuous` is a single bar; `segmented` is a row of discrete
|
|
547
|
+
* cells. `thresholds` recolours the meter by value (energy low→high,
|
|
548
|
+
* trust score, match confidence).
|
|
549
|
+
*/
|
|
550
|
+
export interface MeterNode extends NodeBase {
|
|
551
|
+
type: "meter";
|
|
552
|
+
props: {
|
|
553
|
+
/** The reading, clamped to `0..1`. */
|
|
554
|
+
value: number;
|
|
555
|
+
tone?: VizTone;
|
|
556
|
+
variant?: MeterVariant;
|
|
557
|
+
/** Cell count when `variant: "segmented"`. Default 5. */
|
|
558
|
+
segments?: number;
|
|
559
|
+
/** Value-keyed recolouring; overrides `tone` for the matched band. */
|
|
560
|
+
thresholds?: VizThreshold[];
|
|
561
|
+
size?: VizSize;
|
|
562
|
+
/** Optional caption rendered beside the bar. */
|
|
563
|
+
label?: string;
|
|
564
|
+
};
|
|
565
|
+
}
|
|
566
|
+
/** A coloured band on a `gauge` arc — e.g. a Dial zone. */
|
|
567
|
+
export interface GaugeZone {
|
|
568
|
+
from: number;
|
|
569
|
+
to: number;
|
|
570
|
+
tone: VizTone;
|
|
571
|
+
label?: string;
|
|
572
|
+
}
|
|
573
|
+
/**
|
|
574
|
+
* A radial arc gauge — renders a `0..1` reading on a 270° arc. Doubles as
|
|
575
|
+
* the Syncropel Dial (the `d ∈ [0,1]` control surface, F3): `zones` paints
|
|
576
|
+
* the REPLAY / ADAPT / EXPLORE / CREATE bands.
|
|
577
|
+
*/
|
|
578
|
+
export interface GaugeNode extends NodeBase {
|
|
579
|
+
type: "gauge";
|
|
580
|
+
props: {
|
|
581
|
+
/** The reading, clamped to `0..1`. */
|
|
582
|
+
value: number;
|
|
583
|
+
label?: string;
|
|
584
|
+
tone?: VizTone;
|
|
585
|
+
/** Coloured arc bands — drawn behind the value sweep. */
|
|
586
|
+
zones?: GaugeZone[];
|
|
587
|
+
size?: VizSize;
|
|
588
|
+
/** Render the numeric value in the arc centre. Default true. */
|
|
589
|
+
showValue?: boolean;
|
|
590
|
+
/** How the centre value reads. Default `decimal`. */
|
|
591
|
+
format?: "percent" | "decimal";
|
|
592
|
+
};
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* A compact identity token — an image (`src`), or initials derived from
|
|
596
|
+
* `name`, or a semantic `glyph` fallback. Square, rounded.
|
|
597
|
+
*/
|
|
598
|
+
export interface AvatarNode extends NodeBase {
|
|
599
|
+
type: "avatar";
|
|
600
|
+
props: {
|
|
601
|
+
/** Display name — the source of initials + the accessible label. */
|
|
602
|
+
name: string;
|
|
603
|
+
src?: string;
|
|
604
|
+
glyph?: GlyphKind;
|
|
605
|
+
size?: VizSize;
|
|
606
|
+
};
|
|
607
|
+
}
|
|
608
|
+
/**
|
|
609
|
+
* A progress bar. With `value` it fills proportionally (determinate);
|
|
610
|
+
* with `indeterminate` it animates with no known extent. Distinct from
|
|
611
|
+
* `meter`: `progress` reads as "advancing toward done", `meter` as a
|
|
612
|
+
* static measurement.
|
|
613
|
+
*/
|
|
614
|
+
export interface ProgressNode extends NodeBase {
|
|
615
|
+
type: "progress";
|
|
616
|
+
props?: {
|
|
617
|
+
/** The fraction complete, `0..1`. Omit when `indeterminate`. */
|
|
618
|
+
value?: number;
|
|
619
|
+
indeterminate?: boolean;
|
|
620
|
+
tone?: VizTone;
|
|
621
|
+
label?: string;
|
|
622
|
+
/** Render the percentage as text. Default false. */
|
|
623
|
+
showValue?: boolean;
|
|
624
|
+
size?: VizSize;
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* A tiny inline chart — a bare series with no axes or legend, for
|
|
629
|
+
* trend-at-a-glance (cost over time, dispatch throughput, energy shape).
|
|
630
|
+
*/
|
|
631
|
+
export interface SparklineNode extends NodeBase {
|
|
632
|
+
type: "sparkline";
|
|
633
|
+
props: {
|
|
634
|
+
values: number[];
|
|
635
|
+
variant?: SparklineVariant;
|
|
636
|
+
tone?: VizTone;
|
|
637
|
+
/** Width in px, or `"full"` to fill the container. Default 96. */
|
|
638
|
+
width?: number | "full";
|
|
639
|
+
/** Height in px. Default 24. */
|
|
640
|
+
height?: number;
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
/** One point in a `chart` series. */
|
|
644
|
+
export interface ChartPoint {
|
|
645
|
+
x: string | number;
|
|
646
|
+
y: number;
|
|
647
|
+
}
|
|
648
|
+
/** One series in a `chart` — or, for a `pie`, one ring of slices. */
|
|
649
|
+
export interface ChartSeries {
|
|
650
|
+
label?: string;
|
|
651
|
+
tone?: VizTone;
|
|
652
|
+
points: ChartPoint[];
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* A labelled chart — a `line` / `area` / `bar` plot, or a `pie` whose
|
|
656
|
+
* slices are `series[0].points`. Richer than `sparkline`: axes, a legend,
|
|
657
|
+
* a title.
|
|
658
|
+
*/
|
|
659
|
+
export interface ChartNode extends NodeBase {
|
|
660
|
+
type: "chart";
|
|
661
|
+
props: {
|
|
662
|
+
kind: ChartKind;
|
|
663
|
+
series: ChartSeries[];
|
|
664
|
+
title?: string;
|
|
665
|
+
/** Plot height in px. Default 200. */
|
|
666
|
+
height?: number;
|
|
667
|
+
/** Draw axes + gridlines (ignored for `pie`). Default true. */
|
|
668
|
+
showAxis?: boolean;
|
|
669
|
+
/** Draw a series legend. Default false. */
|
|
670
|
+
showLegend?: boolean;
|
|
671
|
+
};
|
|
672
|
+
}
|
|
673
|
+
/** One node in a `tree`. Recursive — `children` nest arbitrarily deep. */
|
|
674
|
+
export interface TreeItem {
|
|
675
|
+
id: string;
|
|
676
|
+
label: string;
|
|
677
|
+
glyph?: GlyphKind;
|
|
678
|
+
/** A small trailing count / marker. */
|
|
679
|
+
badge?: string | number;
|
|
680
|
+
children?: TreeItem[];
|
|
681
|
+
}
|
|
682
|
+
/**
|
|
683
|
+
* A hierarchical, collapsible list — playlist folders, namespace trees,
|
|
684
|
+
* thread forks, file browsers. The host owns `bind.selected` /
|
|
685
|
+
* `bind.expanded`; a click dispatches `onSelect` / `onToggle`. When `bind`
|
|
686
|
+
* is omitted the tree manages expand/collapse internally.
|
|
687
|
+
*/
|
|
688
|
+
export interface TreeNode extends NodeBase {
|
|
689
|
+
type: "tree";
|
|
690
|
+
props: {
|
|
691
|
+
items: TreeItem[];
|
|
692
|
+
/** Item ids expanded on first render. */
|
|
693
|
+
defaultExpanded?: string[];
|
|
694
|
+
};
|
|
695
|
+
bind?: {
|
|
696
|
+
selected?: string;
|
|
697
|
+
expanded?: string[];
|
|
698
|
+
};
|
|
699
|
+
actions?: {
|
|
700
|
+
onSelect?: ActionDesc;
|
|
701
|
+
onToggle?: ActionDesc;
|
|
702
|
+
};
|
|
703
|
+
}
|
|
704
|
+
/**
|
|
705
|
+
* An editable set of tags — type-and-enter to add, click ✕ to remove,
|
|
706
|
+
* optional autocomplete `suggestions`. The fourth stateful input
|
|
707
|
+
* (alongside `select`, `text-input`, `segmented`); the host owns
|
|
708
|
+
* `bind.tags` and re-renders on `onChange`.
|
|
709
|
+
*/
|
|
710
|
+
export interface TagInputNode extends NodeBase {
|
|
711
|
+
type: "tag-input";
|
|
712
|
+
props?: {
|
|
713
|
+
placeholder?: string;
|
|
714
|
+
suggestions?: string[];
|
|
715
|
+
size?: TextSize;
|
|
716
|
+
disabled?: boolean;
|
|
717
|
+
};
|
|
718
|
+
bind: {
|
|
719
|
+
tags: string[];
|
|
720
|
+
};
|
|
721
|
+
actions?: {
|
|
722
|
+
onChange?: ActionDesc;
|
|
723
|
+
};
|
|
724
|
+
}
|
|
493
725
|
export {};
|
|
494
726
|
//# sourceMappingURL=schema.d.ts.map
|
package/dist/schema.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/schema.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* SRP v0.
|
|
2
|
+
* SRP v0.4 — TypeScript schema types.
|
|
3
3
|
*
|
|
4
4
|
* The Syncropel Rendering Protocol is a narrow JSON schema of block-level
|
|
5
5
|
* primitives for declarative UI documents. See the spec and examples at
|
|
@@ -7,14 +7,16 @@
|
|
|
7
7
|
*
|
|
8
8
|
* v0.2 adds five interactive container + input nodes (tabs, data-table,
|
|
9
9
|
* board, text-input, form). v0.3 adds the `segmented` node plus a
|
|
10
|
-
* polished-data-grid increment to `data-table
|
|
11
|
-
*
|
|
12
|
-
* `
|
|
13
|
-
*
|
|
10
|
+
* polished-data-grid increment to `data-table`. v0.4 adds eight
|
|
11
|
+
* visualization + hierarchy nodes — `meter`, `gauge`, `avatar`,
|
|
12
|
+
* `progress`, `sparkline`, `chart`, `tree`, `tag-input` — plus
|
|
13
|
+
* `data-table` row selection and a two-line cell kind. Every addition is
|
|
14
|
+
* additive + backwards-compatible: every v0.1/v0.2/v0.3 document remains
|
|
15
|
+
* valid. See ADR-102, ADR-103, and ADR-104.
|
|
14
16
|
*/
|
|
15
17
|
/**
|
|
16
|
-
* The
|
|
17
|
-
* 1 v0.3).
|
|
18
|
+
* The 33 canonical node-type discriminator strings (19 v0.1 + 5 v0.2 +
|
|
19
|
+
* 1 v0.3 + 8 v0.4).
|
|
18
20
|
*/
|
|
19
21
|
export const NODE_TYPES = [
|
|
20
22
|
"column",
|
|
@@ -44,5 +46,14 @@ export const NODE_TYPES = [
|
|
|
44
46
|
"form",
|
|
45
47
|
// SRP v0.3 — choice control
|
|
46
48
|
"segmented",
|
|
49
|
+
// SRP v0.4 — visualization + hierarchy
|
|
50
|
+
"meter",
|
|
51
|
+
"gauge",
|
|
52
|
+
"avatar",
|
|
53
|
+
"progress",
|
|
54
|
+
"sparkline",
|
|
55
|
+
"chart",
|
|
56
|
+
"tree",
|
|
57
|
+
"tag-input",
|
|
47
58
|
];
|
|
48
59
|
//# sourceMappingURL=schema.js.map
|
package/dist/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkEH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;IACb,QAAQ;IACR,aAAa;IACb,aAAa;IACb,UAAU;IACV,6CAA6C;IAC7C,MAAM;IACN,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,MAAM;IACN,4BAA4B;IAC5B,WAAW;CACH,CAAC","sourcesContent":["/**\n * SRP v0.3 — TypeScript schema types.\n *\n * The Syncropel Rendering Protocol is a narrow JSON schema of block-level\n * primitives for declarative UI documents. See the spec and examples at\n * https://syncropel.com.\n *\n * v0.2 adds five interactive container + input nodes (tabs, data-table,\n * board, text-input, form). v0.3 adds the `segmented` node plus a\n * polished-data-grid increment to `data-table` (column `tones` + `order`,\n * `defaultSort`, `rowActions`, `rowTone`) and a `chipField` body-chip on\n * `record-line`. Every addition is additive + backwards-compatible: every\n * v0.1 and v0.2 document remains valid. See ADR-102 and ADR-103.\n */\n\n// ---------------------------------------------------------------------------\n// Document envelope\n// ---------------------------------------------------------------------------\n\n/**\n * An SRP v0.1 document — the top-level envelope a Tier-1 extension emits.\n */\nexport interface SRPDocument {\n /**\n * Protocol version. A `\"0.2\"` document may use the v0.2 node additions;\n * a `\"0.3\"` document may additionally use `segmented` + the data-grid\n * props. The version is a capability advertisement, not an enforcement\n * boundary — node validity is decided by `NODE_TYPES` membership.\n */\n srp: \"0.1\" | \"0.2\" | \"0.3\";\n meta?: SRPMeta;\n root: SRPNode;\n}\n\nexport interface SRPMeta {\n name?: string;\n version?: string;\n description?: string;\n publisher?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all 25 node types\n// ---------------------------------------------------------------------------\n\nexport type SRPNode =\n // Containers (5)\n | ColumnNode\n | RowNode\n | GridNode\n | CardNode\n | DividerNode\n // Record rendering (3)\n | RecordLineNode\n | RecordLineListNode\n | ChipNode\n // Data display (4)\n | HeadingNode\n | TextNode\n | StatNode\n | KeyValueNode\n // Interactive (4)\n | ButtonNode\n | IconButtonNode\n | CopyButtonNode\n | SelectNode\n // Feedback (3)\n | EmptyStateNode\n | ErrorStateNode\n | SkeletonNode\n // Interactive containers + inputs — SRP v0.2 (5)\n | TabsNode\n | DataTableNode\n | BoardNode\n | TextInputNode\n | FormNode\n // Choice control — SRP v0.3 (1)\n | SegmentedNode;\n\n/**\n * The 25 canonical node-type discriminator strings (19 v0.1 + 5 v0.2 +\n * 1 v0.3).\n */\nexport const NODE_TYPES = [\n \"column\",\n \"row\",\n \"grid\",\n \"card\",\n \"divider\",\n \"record-line\",\n \"record-line-list\",\n \"chip\",\n \"heading\",\n \"text\",\n \"stat\",\n \"key-value\",\n \"button\",\n \"icon-button\",\n \"copy-button\",\n \"select\",\n \"empty-state\",\n \"error-state\",\n \"skeleton\",\n // SRP v0.2 — interactive containers + inputs\n \"tabs\",\n \"data-table\",\n \"board\",\n \"text-input\",\n \"form\",\n // SRP v0.3 — choice control\n \"segmented\",\n] as const;\n\nexport type NodeType = (typeof NODE_TYPES)[number];\n\n// ---------------------------------------------------------------------------\n// Fields every node may carry\n// ---------------------------------------------------------------------------\n\ninterface NodeBase {\n when?: string;\n bind?: Record<string, unknown>;\n actions?: Record<string, ActionDesc>;\n}\n\n// ---------------------------------------------------------------------------\n// Token unions (mirror @syncropel/react token scales)\n// ---------------------------------------------------------------------------\n\nexport type Gap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type Padding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type DividerSpacing = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type Cols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type RowAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type Justify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"between\"\n | \"around\"\n | \"evenly\";\n\nexport type RecordLineVariant =\n | \"feed\"\n | \"compact\"\n | \"detail\"\n | \"search\"\n | \"thread\";\n\nexport type ChipTone = \"default\" | \"info\" | \"warn\" | \"error\";\n\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type TextWeight = \"normal\" | \"medium\" | \"semibold\";\nexport type TextTone =\n | \"primary\"\n | \"secondary\"\n | \"muted\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\";\n\nexport type SkeletonShape = \"rect\" | \"circle\" | \"text\";\n\n// --- SRP v0.2 tokens ---\nexport type TableColumnAlign = \"start\" | \"end\";\nexport type DataTableVariant = \"default\" | \"compact\";\nexport type TextInputKind = \"text\" | \"search\";\n/**\n * How a `data-table` column renders its cell value. `text` (default) is a\n * plain string; `chip` renders the value as a compact metadata chip.\n */\nexport type TableCellKind = \"text\" | \"chip\";\n\n// --- SRP v0.3 tokens ---\n\n/**\n * A row accent tone — `data-table` `rowTone` paints a left-border (and a\n * subtle tint) keyed off a column value. Wider than `ChipTone`: it adds\n * `accent` and `success` so a row can read as \"in progress\" / \"done\".\n */\nexport type RowTone =\n | \"default\"\n | \"accent\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"info\";\n\n/** Sort direction for a `data-table` column. */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** Which side of the row a `data-table` `rowActions` cell sits on. */\nexport type RowActionPosition = \"leading\" | \"trailing\";\n\n/**\n * Glyph kinds — the closed enumeration of semantic symbols the palette renders.\n * Covers act types, domain objects, thread states, and the AITL marker.\n */\nexport type GlyphKind =\n // Act types (coordination)\n | \"INTEND\"\n | \"DO\"\n | \"KNOW\"\n | \"LEARN\"\n // Act types (effects)\n | \"GET\"\n | \"PUT\"\n | \"CALL\"\n | \"MAP\"\n // AITL marker\n | \"AITL\"\n // Domain objects\n | \"thread\"\n | \"fork\"\n | \"record-parent\"\n | \"namespace\"\n | \"actor\"\n | \"file\"\n | \"pattern\"\n | \"page\"\n | \"view\"\n // Thread states\n | \"state-open\"\n | \"state-active\"\n | \"state-converged\"\n | \"state-closed\"\n | \"state-abandoned\";\n\n// ---------------------------------------------------------------------------\n// Actions + queries\n// ---------------------------------------------------------------------------\n\nexport interface ActionDesc {\n intent: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * VQL (Value Query Language) — the query shape a Syncropel server resolves\n * against its record store. Used by `record-line-list` nodes that bind to\n * a live query rather than a static list of record ids.\n *\n * The shape is deliberately open (index signature) — additional fields\n * are protocol extensions the server understands.\n */\nexport interface VQLQuery {\n act?: string;\n actor?: string;\n thread?: string;\n kind?: string;\n since?: number;\n limit?: number;\n [k: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Container node definitions (5)\n// ---------------------------------------------------------------------------\n\nexport interface ColumnNode extends NodeBase {\n type: \"column\";\n props?: { gap?: Gap; align?: ColumnAlign; justify?: Justify };\n children?: SRPNode[];\n}\n\nexport interface RowNode extends NodeBase {\n type: \"row\";\n props?: {\n gap?: Gap;\n align?: RowAlign;\n justify?: Justify;\n wrap?: boolean;\n };\n children?: SRPNode[];\n}\n\nexport interface GridNode extends NodeBase {\n type: \"grid\";\n props: { cols: Cols; gap?: Gap; rowGap?: Gap; colGap?: Gap };\n children?: SRPNode[];\n}\n\nexport interface CardNode extends NodeBase {\n type: \"card\";\n props?: { padding?: Padding; interactive?: boolean };\n children?: SRPNode[];\n}\n\nexport interface DividerNode extends NodeBase {\n type: \"divider\";\n props?: { orientation?: \"horizontal\" | \"vertical\"; spacing?: DividerSpacing };\n}\n\n// ---------------------------------------------------------------------------\n// Record-rendering (3)\n// ---------------------------------------------------------------------------\n\nexport interface RecordLineNode extends NodeBase {\n type: \"record-line\";\n props: {\n variant: RecordLineVariant;\n /**\n * SRP v0.3 — an optional dotted body path (`body.priority`). When set,\n * the line renders a small chip carrying that field's value. Lets\n * `board` cards (which render through `record-line`) show a priority\n * or status chip.\n */\n chipField?: string;\n };\n bind: { record: string };\n}\n\nexport interface RecordLineListNode extends NodeBase {\n type: \"record-line-list\";\n props: { variant: RecordLineVariant; max?: number; empty?: string };\n bind: { query: VQLQuery } | { items: string[] };\n}\n\nexport interface ChipNode extends NodeBase {\n type: \"chip\";\n props: { label: string; tone?: ChipTone; glyph?: GlyphKind };\n}\n\n// ---------------------------------------------------------------------------\n// Data display (4)\n// ---------------------------------------------------------------------------\n\nexport interface HeadingNode extends NodeBase {\n type: \"heading\";\n props: { level: 1 | 2 | 3 | 4 | 5 | 6; text: string };\n}\n\nexport interface TextNode extends NodeBase {\n type: \"text\";\n props: {\n text: string;\n size?: TextSize;\n weight?: TextWeight;\n tone?: TextTone;\n inline?: boolean;\n };\n}\n\nexport interface StatNode extends NodeBase {\n type: \"stat\";\n props: {\n label: string;\n value: string | number;\n delta?: string | number;\n deltaTone?: \"auto\" | \"neutral\";\n };\n}\n\nexport interface KeyValueNode extends NodeBase {\n type: \"key-value\";\n props: { label: string; value: string };\n}\n\n// ---------------------------------------------------------------------------\n// Interactive (4)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonNode extends NodeBase {\n type: \"button\";\n props: {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface IconButtonNode extends NodeBase {\n type: \"icon-button\";\n props: {\n glyph: GlyphKind;\n ariaLabel: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface CopyButtonNode extends NodeBase {\n type: \"copy-button\";\n props: { value: string; label?: string };\n}\n\nexport interface SelectNode extends NodeBase {\n type: \"select\";\n props: { options: { label: string; value: string }[] };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n\n// ---------------------------------------------------------------------------\n// Feedback (3)\n// ---------------------------------------------------------------------------\n\nexport interface EmptyStateNode extends NodeBase {\n type: \"empty-state\";\n props: {\n message: string;\n action?: { label: string; intent: string };\n };\n}\n\nexport interface ErrorStateNode extends NodeBase {\n type: \"error-state\";\n props: {\n message: string;\n retry?: { intent: string };\n };\n}\n\nexport interface SkeletonNode extends NodeBase {\n type: \"skeleton\";\n props?: {\n shape?: SkeletonShape;\n width?: string | number | \"full\";\n height?: string | number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 — interactive containers + inputs (5)\n//\n// All five reuse the v0.1 contract: `props` is static config, `bind` is\n// host-supplied state, `actions` declares intents the host dispatches. SRP\n// owns layout + shape; the host owns state + behaviour. See ADR-102 and the\n// SRP v0.2 design spec.\n// ---------------------------------------------------------------------------\n\n/**\n * A container whose children are panels; one panel shows at a time. The host\n * supplies the active tab id via `bind.active` and renders the panel whose\n * index matches it in `props.tabs`.\n */\nexport interface TabsNode extends NodeBase {\n type: \"tabs\";\n props: { tabs: { id: string; label: string; glyph?: GlyphKind }[] };\n bind: { active: string };\n actions?: { onTabChange?: ActionDesc };\n /** Panels, parallel to `props.tabs` by index. */\n children?: SRPNode[];\n}\n\n/** A single `data-table` column definition. */\nexport interface DataTableColumnDef {\n /** Dotted path into each row (`body.goal`, `actor`). */\n key: string;\n label: string;\n align?: TableColumnAlign;\n width?: string;\n /** How the cell value renders. Default `text`. */\n kind?: TableCellKind;\n /**\n * SRP v0.3 — for a `kind: \"chip\"` column, a map from cell value to chip\n * tone. A value with no entry renders a `default`-tone chip.\n */\n tones?: Record<string, ChipTone>;\n /**\n * SRP v0.3 — an explicit value order for sorting this column. When the\n * column is the sort key, rows order by each value's index in this list\n * (so `critical` < `high` < `medium` < `low`, not alphabetical). Values\n * absent from the list sort after the listed ones.\n */\n order?: string[];\n}\n\n/** SRP v0.3 — a `data-table` sort descriptor. */\nexport interface TableSort {\n key: string;\n direction: SortDirection;\n}\n\n/**\n * SRP v0.3 — a per-row action affordance on a `data-table`. Rendered as a\n * small button in a leading or trailing cell; a click dispatches `intent`\n * with the row merged into the payload as `row`.\n */\nexport interface TableRowAction {\n intent: string;\n /** A semantic glyph for an icon-only affordance. */\n glyph?: GlyphKind;\n /** A text label — used when no `glyph` is given (or as the aria-label). */\n label?: string;\n /** Which side of the row the action cell sits on. Default `leading`. */\n position?: RowActionPosition;\n}\n\n/**\n * SRP v0.3 — a `data-table` row accent. The row paints a left-border (and\n * a subtle tint) whose tone is looked up from `tones` by the value at\n * `key`. A value with no entry gets no accent.\n */\nexport interface TableRowTone {\n /** Dotted path into the row whose value selects the tone. */\n key: string;\n tones: Record<string, RowTone>;\n}\n\n/**\n * A columnar record list — richer than `record-line-list`: explicit columns,\n * alignment, optional sort. `column.key` is a dotted path into each row.\n *\n * SRP v0.3 adds the polished-data-grid props: column `tones` + `order`,\n * `defaultSort`, `rowActions`, and `rowTone` — all optional and additive.\n */\nexport interface DataTableNode extends NodeBase {\n type: \"data-table\";\n props: {\n columns: DataTableColumnDef[];\n variant?: DataTableVariant;\n sortable?: boolean;\n empty?: string;\n /** SRP v0.3 — the sort applied before any header interaction. */\n defaultSort?: TableSort;\n /** SRP v0.3 — per-row action affordances. */\n rowActions?: TableRowAction[];\n /** SRP v0.3 — a value-keyed row accent. */\n rowTone?: TableRowTone;\n };\n bind: { query: VQLQuery } | { rows: Record<string, unknown>[] };\n actions?: { onRowClick?: ActionDesc; onSort?: ActionDesc };\n}\n\n/**\n * A kanban board — records bucketed into columns by the `props.groupBy` field.\n * A record lands in the column whose `id` equals its `groupBy` value; records\n * matching no column are dropped. `onCardMove` is advisory — a host MAY\n * support drag; a board without drag is read-only and still valid.\n */\nexport interface BoardNode extends NodeBase {\n type: \"board\";\n props: {\n columns: { id: string; label: string }[];\n groupBy: string;\n cardVariant?: RecordLineVariant;\n /**\n * SRP v0.3 — a dotted body path passed through to each card's\n * `record-line` as its `chipField`, so cards show a metadata chip\n * (e.g. `body.priority`).\n */\n cardChipField?: string;\n };\n bind: { query: VQLQuery };\n actions?: { onCardClick?: ActionDesc; onCardMove?: ActionDesc };\n}\n\n/**\n * An editable text field — the `select` of free text. The host owns\n * `bind.value` and re-renders on change (identical ownership model to\n * `select`).\n */\nexport interface TextInputNode extends NodeBase {\n type: \"text-input\";\n props?: {\n placeholder?: string;\n multiline?: boolean;\n inputKind?: TextInputKind;\n size?: TextSize;\n disabled?: boolean;\n };\n bind: { value: string };\n actions?: { onChange?: ActionDesc; onSubmit?: ActionDesc };\n}\n\n/**\n * A container that groups inputs and declares a submit intent. The host\n * collects child input values (by their `bind`) and dispatches `onSubmit`.\n */\nexport interface FormNode extends NodeBase {\n type: \"form\";\n props?: { submitLabel?: string; busy?: boolean };\n actions?: { onSubmit?: ActionDesc };\n children?: SRPNode[];\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.3 — choice control (1)\n//\n// `segmented` is the third stateful input (alongside `select` + `text-input`)\n// and reuses the same ownership model: `bind.value` is host-supplied, a\n// pick dispatches `onChange`. See ADR-103.\n// ---------------------------------------------------------------------------\n\n/** One option in a `segmented` control. */\nexport interface SegmentedOption {\n value: string;\n label: string;\n /** An optional count/marker rendered as a small badge on the option. */\n badge?: string | number;\n}\n\n/**\n * A row of mutually-exclusive options — a filter/choice control. Distinct\n * from `tabs`: it has no panels, it is purely a bound value. The host owns\n * `bind.value`; picking an option dispatches `onChange` with the new value.\n */\nexport interface SegmentedNode extends NodeBase {\n type: \"segmented\";\n props: { options: SegmentedOption[]; size?: ButtonSize };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AA6EH;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;IACb,QAAQ;IACR,aAAa;IACb,aAAa;IACb,UAAU;IACV,6CAA6C;IAC7C,MAAM;IACN,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,MAAM;IACN,4BAA4B;IAC5B,WAAW;IACX,uCAAuC;IACvC,OAAO;IACP,OAAO;IACP,QAAQ;IACR,UAAU;IACV,WAAW;IACX,OAAO;IACP,MAAM;IACN,WAAW;CACH,CAAC","sourcesContent":["/**\n * SRP v0.4 — TypeScript schema types.\n *\n * The Syncropel Rendering Protocol is a narrow JSON schema of block-level\n * primitives for declarative UI documents. See the spec and examples at\n * https://syncropel.com.\n *\n * v0.2 adds five interactive container + input nodes (tabs, data-table,\n * board, text-input, form). v0.3 adds the `segmented` node plus a\n * polished-data-grid increment to `data-table`. v0.4 adds eight\n * visualization + hierarchy nodes — `meter`, `gauge`, `avatar`,\n * `progress`, `sparkline`, `chart`, `tree`, `tag-input` — plus\n * `data-table` row selection and a two-line cell kind. Every addition is\n * additive + backwards-compatible: every v0.1/v0.2/v0.3 document remains\n * valid. See ADR-102, ADR-103, and ADR-104.\n */\n\n// ---------------------------------------------------------------------------\n// Document envelope\n// ---------------------------------------------------------------------------\n\n/**\n * An SRP v0.1 document — the top-level envelope a Tier-1 extension emits.\n */\nexport interface SRPDocument {\n /**\n * Protocol version. A `\"0.2\"` document may use the v0.2 node additions;\n * a `\"0.3\"` document may additionally use `segmented` + the data-grid\n * props; a `\"0.4\"` document may additionally use the visualization +\n * hierarchy nodes. The version is a capability advertisement, not an\n * enforcement boundary — node validity is decided by `NODE_TYPES`\n * membership.\n */\n srp: \"0.1\" | \"0.2\" | \"0.3\" | \"0.4\";\n meta?: SRPMeta;\n root: SRPNode;\n}\n\nexport interface SRPMeta {\n name?: string;\n version?: string;\n description?: string;\n publisher?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all 33 node types\n// ---------------------------------------------------------------------------\n\nexport type SRPNode =\n // Containers (5)\n | ColumnNode\n | RowNode\n | GridNode\n | CardNode\n | DividerNode\n // Record rendering (3)\n | RecordLineNode\n | RecordLineListNode\n | ChipNode\n // Data display (4)\n | HeadingNode\n | TextNode\n | StatNode\n | KeyValueNode\n // Interactive (4)\n | ButtonNode\n | IconButtonNode\n | CopyButtonNode\n | SelectNode\n // Feedback (3)\n | EmptyStateNode\n | ErrorStateNode\n | SkeletonNode\n // Interactive containers + inputs — SRP v0.2 (5)\n | TabsNode\n | DataTableNode\n | BoardNode\n | TextInputNode\n | FormNode\n // Choice control — SRP v0.3 (1)\n | SegmentedNode\n // Visualization + hierarchy — SRP v0.4 (8)\n | MeterNode\n | GaugeNode\n | AvatarNode\n | ProgressNode\n | SparklineNode\n | ChartNode\n | TreeNode\n | TagInputNode;\n\n/**\n * The 33 canonical node-type discriminator strings (19 v0.1 + 5 v0.2 +\n * 1 v0.3 + 8 v0.4).\n */\nexport const NODE_TYPES = [\n \"column\",\n \"row\",\n \"grid\",\n \"card\",\n \"divider\",\n \"record-line\",\n \"record-line-list\",\n \"chip\",\n \"heading\",\n \"text\",\n \"stat\",\n \"key-value\",\n \"button\",\n \"icon-button\",\n \"copy-button\",\n \"select\",\n \"empty-state\",\n \"error-state\",\n \"skeleton\",\n // SRP v0.2 — interactive containers + inputs\n \"tabs\",\n \"data-table\",\n \"board\",\n \"text-input\",\n \"form\",\n // SRP v0.3 — choice control\n \"segmented\",\n // SRP v0.4 — visualization + hierarchy\n \"meter\",\n \"gauge\",\n \"avatar\",\n \"progress\",\n \"sparkline\",\n \"chart\",\n \"tree\",\n \"tag-input\",\n] as const;\n\nexport type NodeType = (typeof NODE_TYPES)[number];\n\n// ---------------------------------------------------------------------------\n// Fields every node may carry\n// ---------------------------------------------------------------------------\n\ninterface NodeBase {\n when?: string;\n bind?: Record<string, unknown>;\n actions?: Record<string, ActionDesc>;\n}\n\n// ---------------------------------------------------------------------------\n// Token unions (mirror @syncropel/react token scales)\n// ---------------------------------------------------------------------------\n\nexport type Gap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type Padding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type DividerSpacing = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type Cols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type RowAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type Justify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"between\"\n | \"around\"\n | \"evenly\";\n\nexport type RecordLineVariant =\n | \"feed\"\n | \"compact\"\n | \"detail\"\n | \"search\"\n | \"thread\";\n\nexport type ChipTone = \"default\" | \"info\" | \"warn\" | \"error\";\n\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type TextWeight = \"normal\" | \"medium\" | \"semibold\";\nexport type TextTone =\n | \"primary\"\n | \"secondary\"\n | \"muted\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\";\n\nexport type SkeletonShape = \"rect\" | \"circle\" | \"text\";\n\n// --- SRP v0.2 tokens ---\nexport type TableColumnAlign = \"start\" | \"end\";\nexport type DataTableVariant = \"default\" | \"compact\";\nexport type TextInputKind = \"text\" | \"search\";\n/**\n * How a `data-table` column renders its cell value. `text` (default) is a\n * plain string; `chip` renders the value as a compact metadata chip;\n * `lines` (SRP v0.4) renders a two-line cell — the value at `key` as the\n * primary line and the value at the column's `subKey` as a muted subtitle.\n */\nexport type TableCellKind = \"text\" | \"chip\" | \"lines\";\n\n// --- SRP v0.3 tokens ---\n\n/**\n * A row accent tone — `data-table` `rowTone` paints a left-border (and a\n * subtle tint) keyed off a column value. Wider than `ChipTone`: it adds\n * `accent` and `success` so a row can read as \"in progress\" / \"done\".\n */\nexport type RowTone =\n | \"default\"\n | \"accent\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"info\";\n\n/** Sort direction for a `data-table` column. */\nexport type SortDirection = \"asc\" | \"desc\";\n\n/** Which side of the row a `data-table` `rowActions` cell sits on. */\nexport type RowActionPosition = \"leading\" | \"trailing\";\n\n/**\n * How a `segmented` control presents. `solid` (default) is a light pill\n * group; `underline` is a borderless tab strip (active option underlined).\n * Added in SRP v0.3.1.\n */\nexport type SegmentedVariant = \"solid\" | \"underline\";\n\n// --- SRP v0.4 tokens ---\n\n/**\n * A visualization tone — shared by `meter`, `gauge`, `progress`,\n * `sparkline`, and `chart`. Drives the fill / stroke colour. Added SRP v0.4.\n */\nexport type VizTone =\n | \"neutral\"\n | \"accent\"\n | \"success\"\n | \"warn\"\n | \"error\"\n | \"info\";\n\n/** A visualization size step — shared by the SRP v0.4 viz nodes. */\nexport type VizSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\n/** How a `meter` renders its fill — one bar, or a row of discrete cells. */\nexport type MeterVariant = \"continuous\" | \"segmented\";\n\n/** How a `sparkline` renders its series. */\nexport type SparklineVariant = \"line\" | \"bar\";\n\n/** The plot kind a `chart` draws. */\nexport type ChartKind = \"line\" | \"area\" | \"bar\" | \"pie\";\n\n/**\n * Glyph kinds — the closed enumeration of semantic symbols the palette renders.\n * Covers act types, domain objects, thread states, and the AITL marker.\n */\nexport type GlyphKind =\n // Act types (coordination)\n | \"INTEND\"\n | \"DO\"\n | \"KNOW\"\n | \"LEARN\"\n // Act types (effects)\n | \"GET\"\n | \"PUT\"\n | \"CALL\"\n | \"MAP\"\n // AITL marker\n | \"AITL\"\n // Domain objects\n | \"thread\"\n | \"fork\"\n | \"record-parent\"\n | \"namespace\"\n | \"actor\"\n | \"file\"\n | \"pattern\"\n | \"page\"\n | \"view\"\n // Thread states\n | \"state-open\"\n | \"state-active\"\n | \"state-converged\"\n | \"state-closed\"\n | \"state-abandoned\";\n\n// ---------------------------------------------------------------------------\n// Actions + queries\n// ---------------------------------------------------------------------------\n\nexport interface ActionDesc {\n intent: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * VQL (Value Query Language) — the query shape a Syncropel server resolves\n * against its record store. Used by `record-line-list` nodes that bind to\n * a live query rather than a static list of record ids.\n *\n * The shape is deliberately open (index signature) — additional fields\n * are protocol extensions the server understands.\n */\nexport interface VQLQuery {\n act?: string;\n actor?: string;\n thread?: string;\n kind?: string;\n since?: number;\n limit?: number;\n [k: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Container node definitions (5)\n// ---------------------------------------------------------------------------\n\nexport interface ColumnNode extends NodeBase {\n type: \"column\";\n props?: { gap?: Gap; align?: ColumnAlign; justify?: Justify };\n children?: SRPNode[];\n}\n\nexport interface RowNode extends NodeBase {\n type: \"row\";\n props?: {\n gap?: Gap;\n align?: RowAlign;\n justify?: Justify;\n wrap?: boolean;\n };\n children?: SRPNode[];\n}\n\nexport interface GridNode extends NodeBase {\n type: \"grid\";\n props: { cols: Cols; gap?: Gap; rowGap?: Gap; colGap?: Gap };\n children?: SRPNode[];\n}\n\nexport interface CardNode extends NodeBase {\n type: \"card\";\n props?: { padding?: Padding; interactive?: boolean };\n children?: SRPNode[];\n}\n\nexport interface DividerNode extends NodeBase {\n type: \"divider\";\n props?: { orientation?: \"horizontal\" | \"vertical\"; spacing?: DividerSpacing };\n}\n\n// ---------------------------------------------------------------------------\n// Record-rendering (3)\n// ---------------------------------------------------------------------------\n\nexport interface RecordLineNode extends NodeBase {\n type: \"record-line\";\n props: {\n variant: RecordLineVariant;\n /**\n * SRP v0.3 — an optional dotted body path (`body.priority`). When set,\n * the line renders a small chip carrying that field's value. Lets\n * `board` cards (which render through `record-line`) show a priority\n * or status chip.\n */\n chipField?: string;\n };\n bind: { record: string };\n}\n\nexport interface RecordLineListNode extends NodeBase {\n type: \"record-line-list\";\n props: { variant: RecordLineVariant; max?: number; empty?: string };\n bind: { query: VQLQuery } | { items: string[] };\n}\n\nexport interface ChipNode extends NodeBase {\n type: \"chip\";\n props: { label: string; tone?: ChipTone; glyph?: GlyphKind };\n}\n\n// ---------------------------------------------------------------------------\n// Data display (4)\n// ---------------------------------------------------------------------------\n\nexport interface HeadingNode extends NodeBase {\n type: \"heading\";\n props: { level: 1 | 2 | 3 | 4 | 5 | 6; text: string };\n}\n\nexport interface TextNode extends NodeBase {\n type: \"text\";\n props: {\n text: string;\n size?: TextSize;\n weight?: TextWeight;\n tone?: TextTone;\n inline?: boolean;\n };\n}\n\nexport interface StatNode extends NodeBase {\n type: \"stat\";\n props: {\n label: string;\n value: string | number;\n delta?: string | number;\n deltaTone?: \"auto\" | \"neutral\";\n };\n}\n\nexport interface KeyValueNode extends NodeBase {\n type: \"key-value\";\n props: { label: string; value: string };\n}\n\n// ---------------------------------------------------------------------------\n// Interactive (4)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonNode extends NodeBase {\n type: \"button\";\n props: {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface IconButtonNode extends NodeBase {\n type: \"icon-button\";\n props: {\n glyph: GlyphKind;\n ariaLabel: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface CopyButtonNode extends NodeBase {\n type: \"copy-button\";\n props: { value: string; label?: string };\n}\n\nexport interface SelectNode extends NodeBase {\n type: \"select\";\n props: { options: { label: string; value: string }[] };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n\n// ---------------------------------------------------------------------------\n// Feedback (3)\n// ---------------------------------------------------------------------------\n\nexport interface EmptyStateNode extends NodeBase {\n type: \"empty-state\";\n props: {\n message: string;\n action?: { label: string; intent: string };\n };\n}\n\nexport interface ErrorStateNode extends NodeBase {\n type: \"error-state\";\n props: {\n message: string;\n retry?: { intent: string };\n };\n}\n\nexport interface SkeletonNode extends NodeBase {\n type: \"skeleton\";\n props?: {\n shape?: SkeletonShape;\n width?: string | number | \"full\";\n height?: string | number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 — interactive containers + inputs (5)\n//\n// All five reuse the v0.1 contract: `props` is static config, `bind` is\n// host-supplied state, `actions` declares intents the host dispatches. SRP\n// owns layout + shape; the host owns state + behaviour. See ADR-102 and the\n// SRP v0.2 design spec.\n// ---------------------------------------------------------------------------\n\n/**\n * A container whose children are panels; one panel shows at a time. The host\n * supplies the active tab id via `bind.active` and renders the panel whose\n * index matches it in `props.tabs`.\n */\nexport interface TabsNode extends NodeBase {\n type: \"tabs\";\n props: { tabs: { id: string; label: string; glyph?: GlyphKind }[] };\n bind: { active: string };\n actions?: { onTabChange?: ActionDesc };\n /** Panels, parallel to `props.tabs` by index. */\n children?: SRPNode[];\n}\n\n/** A single `data-table` column definition. */\nexport interface DataTableColumnDef {\n /** Dotted path into each row (`body.goal`, `actor`). */\n key: string;\n label: string;\n align?: TableColumnAlign;\n width?: string;\n /** How the cell value renders. Default `text`. */\n kind?: TableCellKind;\n /**\n * SRP v0.3 — for a `kind: \"chip\"` column, a map from cell value to chip\n * tone. A value with no entry renders a `default`-tone chip.\n */\n tones?: Record<string, ChipTone>;\n /**\n * SRP v0.3 — an explicit value order for sorting this column. When the\n * column is the sort key, rows order by each value's index in this list\n * (so `critical` < `high` < `medium` < `low`, not alphabetical). Values\n * absent from the list sort after the listed ones.\n */\n order?: string[];\n /**\n * SRP v0.4 — for a `kind: \"lines\"` column, the dotted path whose value\n * renders as the muted second line beneath the `key` value.\n */\n subKey?: string;\n}\n\n/** SRP v0.3 — a `data-table` sort descriptor. */\nexport interface TableSort {\n key: string;\n direction: SortDirection;\n}\n\n/**\n * SRP v0.3 — a per-row action affordance on a `data-table`. Rendered as a\n * small button in a leading or trailing cell; a click dispatches `intent`\n * with the row merged into the payload as `row`.\n */\nexport interface TableRowAction {\n intent: string;\n /** A semantic glyph for an icon-only affordance. */\n glyph?: GlyphKind;\n /** A text label — used when no `glyph` is given (or as the aria-label). */\n label?: string;\n /** Which side of the row the action cell sits on. Default `leading`. */\n position?: RowActionPosition;\n}\n\n/**\n * SRP v0.3 — a `data-table` row accent. The row paints a left-border (and\n * a subtle tint) whose tone is looked up from `tones` by the value at\n * `key`. A value with no entry gets no accent.\n */\nexport interface TableRowTone {\n /** Dotted path into the row whose value selects the tone. */\n key: string;\n tones: Record<string, RowTone>;\n}\n\n/**\n * A columnar record list — richer than `record-line-list`: explicit columns,\n * alignment, optional sort. `column.key` is a dotted path into each row.\n *\n * SRP v0.3 adds the polished-data-grid props: column `tones` + `order`,\n * `defaultSort`, `rowActions`, and `rowTone`. SRP v0.4 adds `selectable`\n * (a leading checkbox column with multi-select) — all optional + additive.\n */\nexport interface DataTableNode extends NodeBase {\n type: \"data-table\";\n props: {\n columns: DataTableColumnDef[];\n variant?: DataTableVariant;\n sortable?: boolean;\n empty?: string;\n /** SRP v0.3 — the sort applied before any header interaction. */\n defaultSort?: TableSort;\n /** SRP v0.3 — per-row action affordances. */\n rowActions?: TableRowAction[];\n /** SRP v0.3 — a value-keyed row accent. */\n rowTone?: TableRowTone;\n /**\n * SRP v0.4 — render a leading checkbox column with a select-all\n * header. The table owns selection state and dispatches\n * `onSelectionChange` with the selected rows.\n */\n selectable?: boolean;\n };\n bind: { query: VQLQuery } | { rows: Record<string, unknown>[] };\n actions?: {\n onRowClick?: ActionDesc;\n onSort?: ActionDesc;\n /** SRP v0.4 — fired (with `rows`) when the selection changes. */\n onSelectionChange?: ActionDesc;\n };\n}\n\n/**\n * A kanban board — records bucketed into columns by the `props.groupBy` field.\n * A record lands in the column whose `id` equals its `groupBy` value; records\n * matching no column are dropped. `onCardMove` is advisory — a host MAY\n * support drag; a board without drag is read-only and still valid.\n */\nexport interface BoardNode extends NodeBase {\n type: \"board\";\n props: {\n columns: { id: string; label: string }[];\n groupBy: string;\n cardVariant?: RecordLineVariant;\n /**\n * SRP v0.3 — a dotted body path passed through to each card's\n * `record-line` as its `chipField`, so cards show a metadata chip\n * (e.g. `body.priority`).\n */\n cardChipField?: string;\n };\n bind: { query: VQLQuery };\n actions?: { onCardClick?: ActionDesc; onCardMove?: ActionDesc };\n}\n\n/**\n * An editable text field — the `select` of free text. The host owns\n * `bind.value` and re-renders on change (identical ownership model to\n * `select`).\n */\nexport interface TextInputNode extends NodeBase {\n type: \"text-input\";\n props?: {\n placeholder?: string;\n multiline?: boolean;\n inputKind?: TextInputKind;\n size?: TextSize;\n disabled?: boolean;\n };\n bind: { value: string };\n actions?: { onChange?: ActionDesc; onSubmit?: ActionDesc };\n}\n\n/**\n * A container that groups inputs and declares a submit intent. The host\n * collects child input values (by their `bind`) and dispatches `onSubmit`.\n */\nexport interface FormNode extends NodeBase {\n type: \"form\";\n props?: { submitLabel?: string; busy?: boolean };\n actions?: { onSubmit?: ActionDesc };\n children?: SRPNode[];\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.3 — choice control (1)\n//\n// `segmented` is the third stateful input (alongside `select` + `text-input`)\n// and reuses the same ownership model: `bind.value` is host-supplied, a\n// pick dispatches `onChange`. See ADR-103.\n// ---------------------------------------------------------------------------\n\n/** One option in a `segmented` control. */\nexport interface SegmentedOption {\n value: string;\n label: string;\n /** An optional count/marker rendered as a small badge on the option. */\n badge?: string | number;\n}\n\n/**\n * A row of mutually-exclusive options — a filter/choice control. Distinct\n * from `tabs`: it has no panels, it is purely a bound value. The host owns\n * `bind.value`; picking an option dispatches `onChange` with the new value.\n */\nexport interface SegmentedNode extends NodeBase {\n type: \"segmented\";\n props: {\n options: SegmentedOption[];\n size?: ButtonSize;\n /** Presentation — `solid` (light pill group, default) or `underline`\n * (borderless tab strip). Added in SRP v0.3.1. */\n variant?: SegmentedVariant;\n };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.4 — visualization + hierarchy nodes (8)\n//\n// `meter`, `gauge`, `progress`, `sparkline`, `chart` are read-only data\n// displays — `props` carries the values, there is no `bind`. `avatar` is a\n// read-only identity token. `tree` + `tag-input` are interactive: they\n// reuse the v0.1 ownership model — `bind` is host state, `actions` declares\n// dispatched intents. Music-specific widgets (waveforms, transition tables)\n// are NOT in SRP — a renderer registers those as plug-in node types. See\n// ADR-104.\n// ---------------------------------------------------------------------------\n\n/**\n * A value→tone threshold for a `meter`. The meter's value selects the\n * highest threshold whose `at` it reaches; that tone recolours the fill.\n * List thresholds in ascending `at` order.\n */\nexport interface VizThreshold {\n at: number;\n tone: VizTone;\n}\n\n/**\n * A horizontal bar gauge — renders a `0..1` reading as a proportional\n * fill. `continuous` is a single bar; `segmented` is a row of discrete\n * cells. `thresholds` recolours the meter by value (energy low→high,\n * trust score, match confidence).\n */\nexport interface MeterNode extends NodeBase {\n type: \"meter\";\n props: {\n /** The reading, clamped to `0..1`. */\n value: number;\n tone?: VizTone;\n variant?: MeterVariant;\n /** Cell count when `variant: \"segmented\"`. Default 5. */\n segments?: number;\n /** Value-keyed recolouring; overrides `tone` for the matched band. */\n thresholds?: VizThreshold[];\n size?: VizSize;\n /** Optional caption rendered beside the bar. */\n label?: string;\n };\n}\n\n/** A coloured band on a `gauge` arc — e.g. a Dial zone. */\nexport interface GaugeZone {\n from: number;\n to: number;\n tone: VizTone;\n label?: string;\n}\n\n/**\n * A radial arc gauge — renders a `0..1` reading on a 270° arc. Doubles as\n * the Syncropel Dial (the `d ∈ [0,1]` control surface, F3): `zones` paints\n * the REPLAY / ADAPT / EXPLORE / CREATE bands.\n */\nexport interface GaugeNode extends NodeBase {\n type: \"gauge\";\n props: {\n /** The reading, clamped to `0..1`. */\n value: number;\n label?: string;\n tone?: VizTone;\n /** Coloured arc bands — drawn behind the value sweep. */\n zones?: GaugeZone[];\n size?: VizSize;\n /** Render the numeric value in the arc centre. Default true. */\n showValue?: boolean;\n /** How the centre value reads. Default `decimal`. */\n format?: \"percent\" | \"decimal\";\n };\n}\n\n/**\n * A compact identity token — an image (`src`), or initials derived from\n * `name`, or a semantic `glyph` fallback. Square, rounded.\n */\nexport interface AvatarNode extends NodeBase {\n type: \"avatar\";\n props: {\n /** Display name — the source of initials + the accessible label. */\n name: string;\n src?: string;\n glyph?: GlyphKind;\n size?: VizSize;\n };\n}\n\n/**\n * A progress bar. With `value` it fills proportionally (determinate);\n * with `indeterminate` it animates with no known extent. Distinct from\n * `meter`: `progress` reads as \"advancing toward done\", `meter` as a\n * static measurement.\n */\nexport interface ProgressNode extends NodeBase {\n type: \"progress\";\n props?: {\n /** The fraction complete, `0..1`. Omit when `indeterminate`. */\n value?: number;\n indeterminate?: boolean;\n tone?: VizTone;\n label?: string;\n /** Render the percentage as text. Default false. */\n showValue?: boolean;\n size?: VizSize;\n };\n}\n\n/**\n * A tiny inline chart — a bare series with no axes or legend, for\n * trend-at-a-glance (cost over time, dispatch throughput, energy shape).\n */\nexport interface SparklineNode extends NodeBase {\n type: \"sparkline\";\n props: {\n values: number[];\n variant?: SparklineVariant;\n tone?: VizTone;\n /** Width in px, or `\"full\"` to fill the container. Default 96. */\n width?: number | \"full\";\n /** Height in px. Default 24. */\n height?: number;\n };\n}\n\n/** One point in a `chart` series. */\nexport interface ChartPoint {\n x: string | number;\n y: number;\n}\n\n/** One series in a `chart` — or, for a `pie`, one ring of slices. */\nexport interface ChartSeries {\n label?: string;\n tone?: VizTone;\n points: ChartPoint[];\n}\n\n/**\n * A labelled chart — a `line` / `area` / `bar` plot, or a `pie` whose\n * slices are `series[0].points`. Richer than `sparkline`: axes, a legend,\n * a title.\n */\nexport interface ChartNode extends NodeBase {\n type: \"chart\";\n props: {\n kind: ChartKind;\n series: ChartSeries[];\n title?: string;\n /** Plot height in px. Default 200. */\n height?: number;\n /** Draw axes + gridlines (ignored for `pie`). Default true. */\n showAxis?: boolean;\n /** Draw a series legend. Default false. */\n showLegend?: boolean;\n };\n}\n\n/** One node in a `tree`. Recursive — `children` nest arbitrarily deep. */\nexport interface TreeItem {\n id: string;\n label: string;\n glyph?: GlyphKind;\n /** A small trailing count / marker. */\n badge?: string | number;\n children?: TreeItem[];\n}\n\n/**\n * A hierarchical, collapsible list — playlist folders, namespace trees,\n * thread forks, file browsers. The host owns `bind.selected` /\n * `bind.expanded`; a click dispatches `onSelect` / `onToggle`. When `bind`\n * is omitted the tree manages expand/collapse internally.\n */\nexport interface TreeNode extends NodeBase {\n type: \"tree\";\n props: {\n items: TreeItem[];\n /** Item ids expanded on first render. */\n defaultExpanded?: string[];\n };\n bind?: { selected?: string; expanded?: string[] };\n actions?: { onSelect?: ActionDesc; onToggle?: ActionDesc };\n}\n\n/**\n * An editable set of tags — type-and-enter to add, click ✕ to remove,\n * optional autocomplete `suggestions`. The fourth stateful input\n * (alongside `select`, `text-input`, `segmented`); the host owns\n * `bind.tags` and re-renders on `onChange`.\n */\nexport interface TagInputNode extends NodeBase {\n type: \"tag-input\";\n props?: {\n placeholder?: string;\n suggestions?: string[];\n size?: TextSize;\n disabled?: boolean;\n };\n bind: { tags: string[] };\n actions?: { onChange?: ActionDesc };\n}\n"]}
|
package/dist/validators.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Runtime validators for SRP v0.1 / v0.2 / v0.3 documents.
|
|
2
|
+
* Runtime validators for SRP v0.1 / v0.2 / v0.3 / v0.4 documents.
|
|
3
3
|
*
|
|
4
4
|
* Pure functions — no dependencies. Return a ValidationResult with either a
|
|
5
5
|
* `valid: true` flag or a list of errors keyed by path.
|
package/dist/validators.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,EAAE,mBAAmB,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAahD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,EAAE,mBAAmB,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAahD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CAiC1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAM1E;AA6pCD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAG9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,CAGxD"}
|
package/dist/validators.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Runtime validators for SRP v0.1 / v0.2 / v0.3 documents.
|
|
2
|
+
* Runtime validators for SRP v0.1 / v0.2 / v0.3 / v0.4 documents.
|
|
3
3
|
*
|
|
4
4
|
* Pure functions — no dependencies. Return a ValidationResult with either a
|
|
5
5
|
* `valid: true` flag or a list of errors keyed by path.
|
|
@@ -28,8 +28,11 @@ export function validateSRP(doc) {
|
|
|
28
28
|
return { valid: false, errors: c.errors };
|
|
29
29
|
}
|
|
30
30
|
const d = doc;
|
|
31
|
-
if (d.srp !== "0.1" &&
|
|
32
|
-
|
|
31
|
+
if (d.srp !== "0.1" &&
|
|
32
|
+
d.srp !== "0.2" &&
|
|
33
|
+
d.srp !== "0.3" &&
|
|
34
|
+
d.srp !== "0.4") {
|
|
35
|
+
c.add("/srp", "SRP_VERSION_INVALID", `srp field must be "0.1", "0.2", "0.3", or "0.4", got ${JSON.stringify(d.srp)}`);
|
|
33
36
|
}
|
|
34
37
|
if (!("root" in d)) {
|
|
35
38
|
c.add("/root", "ROOT_MISSING", "SRP document must have a root node");
|
|
@@ -138,6 +141,30 @@ function validateNodeInto(node, path, c) {
|
|
|
138
141
|
case "segmented":
|
|
139
142
|
validateSegmented(n, path, c);
|
|
140
143
|
break;
|
|
144
|
+
case "meter":
|
|
145
|
+
validateMeter(n, path, c);
|
|
146
|
+
break;
|
|
147
|
+
case "gauge":
|
|
148
|
+
validateGauge(n, path, c);
|
|
149
|
+
break;
|
|
150
|
+
case "avatar":
|
|
151
|
+
validateAvatar(n, path, c);
|
|
152
|
+
break;
|
|
153
|
+
case "progress":
|
|
154
|
+
validateProgress(n, path, c);
|
|
155
|
+
break;
|
|
156
|
+
case "sparkline":
|
|
157
|
+
validateSparkline(n, path, c);
|
|
158
|
+
break;
|
|
159
|
+
case "chart":
|
|
160
|
+
validateChart(n, path, c);
|
|
161
|
+
break;
|
|
162
|
+
case "tree":
|
|
163
|
+
validateTree(n, path, c);
|
|
164
|
+
break;
|
|
165
|
+
case "tag-input":
|
|
166
|
+
validateTagInput(n, path, c);
|
|
167
|
+
break;
|
|
141
168
|
}
|
|
142
169
|
}
|
|
143
170
|
// ---------------------------------------------------------------------------
|
|
@@ -351,8 +378,14 @@ function validateDataTable(n, path, c) {
|
|
|
351
378
|
if (typeof o.key !== "string" || typeof o.label !== "string") {
|
|
352
379
|
c.add(`${path}/props/columns/${i}`, "PROPS_INVALID_VALUE", `data-table column must have string "key" and "label"`);
|
|
353
380
|
}
|
|
354
|
-
if (o.kind !== undefined &&
|
|
355
|
-
|
|
381
|
+
if (o.kind !== undefined &&
|
|
382
|
+
o.kind !== "text" &&
|
|
383
|
+
o.kind !== "chip" &&
|
|
384
|
+
o.kind !== "lines") {
|
|
385
|
+
c.add(`${path}/props/columns/${i}/kind`, "PROPS_INVALID_VALUE", `data-table column "kind" must be "text", "chip", or "lines"`);
|
|
386
|
+
}
|
|
387
|
+
if (o.subKey !== undefined && typeof o.subKey !== "string") {
|
|
388
|
+
c.add(`${path}/props/columns/${i}/subKey`, "PROPS_INVALID_VALUE", `data-table column "subKey" must be a string`);
|
|
356
389
|
}
|
|
357
390
|
// SRP v0.3 — optional column props.
|
|
358
391
|
if (o.tones !== undefined &&
|
|
@@ -505,12 +538,133 @@ function validateSegmented(n, path, c) {
|
|
|
505
538
|
}
|
|
506
539
|
});
|
|
507
540
|
}
|
|
541
|
+
if (props.variant !== undefined &&
|
|
542
|
+
props.variant !== "solid" &&
|
|
543
|
+
props.variant !== "underline") {
|
|
544
|
+
c.add(`${path}/props/variant`, "PROPS_INVALID_VALUE", `segmented "props.variant" must be "solid" or "underline"`);
|
|
545
|
+
}
|
|
508
546
|
const bind = n.bind;
|
|
509
547
|
if (!bind || typeof bind.value !== "string") {
|
|
510
548
|
c.add(`${path}/bind/value`, "BIND_MISSING_REQUIRED", `segmented requires "bind.value" (a string)`);
|
|
511
549
|
}
|
|
512
550
|
}
|
|
513
551
|
// ---------------------------------------------------------------------------
|
|
552
|
+
// SRP v0.4 node validators
|
|
553
|
+
// ---------------------------------------------------------------------------
|
|
554
|
+
const VIZ_TONES = ["neutral", "accent", "success", "warn", "error", "info"];
|
|
555
|
+
function validateMeter(n, path, c) {
|
|
556
|
+
const props = (n.props ?? {});
|
|
557
|
+
if (typeof props.value !== "number") {
|
|
558
|
+
c.add(`${path}/props/value`, "PROPS_MISSING_REQUIRED", `meter requires "props.value" (a number 0..1)`);
|
|
559
|
+
}
|
|
560
|
+
if (props.variant !== undefined &&
|
|
561
|
+
props.variant !== "continuous" &&
|
|
562
|
+
props.variant !== "segmented") {
|
|
563
|
+
c.add(`${path}/props/variant`, "PROPS_INVALID_VALUE", `meter "props.variant" must be "continuous" or "segmented"`);
|
|
564
|
+
}
|
|
565
|
+
if (props.thresholds !== undefined && !Array.isArray(props.thresholds)) {
|
|
566
|
+
c.add(`${path}/props/thresholds`, "PROPS_INVALID_VALUE", `meter "props.thresholds" must be an array of {at, tone}`);
|
|
567
|
+
}
|
|
568
|
+
if (props.tone !== undefined &&
|
|
569
|
+
(typeof props.tone !== "string" || !VIZ_TONES.includes(props.tone))) {
|
|
570
|
+
c.add(`${path}/props/tone`, "PROPS_INVALID_VALUE", `meter "props.tone" must be one of ${VIZ_TONES.join(" | ")}`);
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
function validateGauge(n, path, c) {
|
|
574
|
+
const props = (n.props ?? {});
|
|
575
|
+
if (typeof props.value !== "number") {
|
|
576
|
+
c.add(`${path}/props/value`, "PROPS_MISSING_REQUIRED", `gauge requires "props.value" (a number 0..1)`);
|
|
577
|
+
}
|
|
578
|
+
if (props.zones !== undefined && !Array.isArray(props.zones)) {
|
|
579
|
+
c.add(`${path}/props/zones`, "PROPS_INVALID_VALUE", `gauge "props.zones" must be an array of {from, to, tone}`);
|
|
580
|
+
}
|
|
581
|
+
if (props.format !== undefined &&
|
|
582
|
+
props.format !== "percent" &&
|
|
583
|
+
props.format !== "decimal") {
|
|
584
|
+
c.add(`${path}/props/format`, "PROPS_INVALID_VALUE", `gauge "props.format" must be "percent" or "decimal"`);
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
function validateAvatar(n, path, c) {
|
|
588
|
+
const props = (n.props ?? {});
|
|
589
|
+
if (typeof props.name !== "string" || props.name.length === 0) {
|
|
590
|
+
c.add(`${path}/props/name`, "PROPS_MISSING_REQUIRED", `avatar requires a non-empty "props.name"`);
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
function validateProgress(n, path, c) {
|
|
594
|
+
const props = n.props;
|
|
595
|
+
if (props && props.value !== undefined && typeof props.value !== "number") {
|
|
596
|
+
c.add(`${path}/props/value`, "PROPS_INVALID_VALUE", `progress "props.value" must be a number 0..1`);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
function validateSparkline(n, path, c) {
|
|
600
|
+
const props = (n.props ?? {});
|
|
601
|
+
if (!Array.isArray(props.values) ||
|
|
602
|
+
!props.values.every((v) => typeof v === "number")) {
|
|
603
|
+
c.add(`${path}/props/values`, "PROPS_MISSING_REQUIRED", `sparkline requires "props.values" (an array of numbers)`);
|
|
604
|
+
}
|
|
605
|
+
if (props.variant !== undefined &&
|
|
606
|
+
props.variant !== "line" &&
|
|
607
|
+
props.variant !== "bar") {
|
|
608
|
+
c.add(`${path}/props/variant`, "PROPS_INVALID_VALUE", `sparkline "props.variant" must be "line" or "bar"`);
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
function validateChart(n, path, c) {
|
|
612
|
+
const props = (n.props ?? {});
|
|
613
|
+
const kinds = ["line", "area", "bar", "pie"];
|
|
614
|
+
if (typeof props.kind !== "string" || !kinds.includes(props.kind)) {
|
|
615
|
+
c.add(`${path}/props/kind`, "PROPS_MISSING_REQUIRED", `chart requires "props.kind" — one of ${kinds.join(" | ")}`);
|
|
616
|
+
}
|
|
617
|
+
if (!Array.isArray(props.series) || props.series.length === 0) {
|
|
618
|
+
c.add(`${path}/props/series`, "PROPS_MISSING_REQUIRED", `chart requires a non-empty "props.series" array`);
|
|
619
|
+
return;
|
|
620
|
+
}
|
|
621
|
+
props.series.forEach((s, i) => {
|
|
622
|
+
if (typeof s !== "object" || s === null) {
|
|
623
|
+
c.add(`${path}/props/series/${i}`, "PROPS_INVALID_VALUE", `chart series must be an object`);
|
|
624
|
+
return;
|
|
625
|
+
}
|
|
626
|
+
if (!Array.isArray(s.points)) {
|
|
627
|
+
c.add(`${path}/props/series/${i}/points`, "PROPS_INVALID_VALUE", `chart series requires a "points" array`);
|
|
628
|
+
}
|
|
629
|
+
});
|
|
630
|
+
}
|
|
631
|
+
function validateTreeItems(items, path, c) {
|
|
632
|
+
items.forEach((item, i) => {
|
|
633
|
+
if (typeof item !== "object" || item === null) {
|
|
634
|
+
c.add(`${path}/${i}`, "PROPS_INVALID_VALUE", `tree item must be an object`);
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
const it = item;
|
|
638
|
+
if (typeof it.id !== "string" || typeof it.label !== "string") {
|
|
639
|
+
c.add(`${path}/${i}`, "PROPS_INVALID_VALUE", `tree item must have string "id" and "label"`);
|
|
640
|
+
}
|
|
641
|
+
if (it.children !== undefined) {
|
|
642
|
+
if (!Array.isArray(it.children)) {
|
|
643
|
+
c.add(`${path}/${i}/children`, "PROPS_INVALID_VALUE", `tree item "children" must be an array`);
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
validateTreeItems(it.children, `${path}/${i}/children`, c);
|
|
647
|
+
}
|
|
648
|
+
}
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
function validateTree(n, path, c) {
|
|
652
|
+
const props = (n.props ?? {});
|
|
653
|
+
if (!Array.isArray(props.items)) {
|
|
654
|
+
c.add(`${path}/props/items`, "PROPS_MISSING_REQUIRED", `tree requires "props.items" (an array of tree items)`);
|
|
655
|
+
return;
|
|
656
|
+
}
|
|
657
|
+
validateTreeItems(props.items, `${path}/props/items`, c);
|
|
658
|
+
}
|
|
659
|
+
function validateTagInput(n, path, c) {
|
|
660
|
+
const bind = n.bind;
|
|
661
|
+
if (!bind ||
|
|
662
|
+
!Array.isArray(bind.tags) ||
|
|
663
|
+
!bind.tags.every((t) => typeof t === "string")) {
|
|
664
|
+
c.add(`${path}/bind/tags`, "BIND_MISSING_REQUIRED", `tag-input requires "bind.tags" (an array of strings)`);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
// ---------------------------------------------------------------------------
|
|
514
668
|
// Helpers for library consumers
|
|
515
669
|
// ---------------------------------------------------------------------------
|
|
516
670
|
/**
|
package/dist/validators.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime validators for SRP v0.1 / v0.2 / v0.3 documents.\n *\n * Pure functions — no dependencies. Return a ValidationResult with either a\n * `valid: true` flag or a list of errors keyed by path.\n */\n\nimport type { SRPDocument, SRPNode } from \"./schema.js\";\nimport { NODE_TYPES } from \"./schema.js\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface ValidationError {\n /** JSON-pointer-style path to the offending node, e.g. \"/root/children/0\". */\n path: string;\n /** Human-readable message. */\n message: string;\n /** Machine-readable code for programmatic handling. */\n code: ValidationErrorCode;\n}\n\nexport type ValidationErrorCode =\n | \"SRP_VERSION_INVALID\"\n | \"ROOT_MISSING\"\n | \"NODE_NOT_OBJECT\"\n | \"NODE_TYPE_MISSING\"\n | \"NODE_TYPE_UNKNOWN\"\n | \"PROPS_MISSING_REQUIRED\"\n | \"PROPS_INVALID_VALUE\"\n | \"CHILDREN_NOT_ARRAY\"\n | \"CHILDREN_NOT_ALLOWED\"\n | \"BIND_MISSING_REQUIRED\"\n | \"BIND_INVALID_SHAPE\";\n\nexport type ValidationResult =\n | { valid: true }\n | { valid: false; errors: ValidationError[] };\n\nclass Collector {\n errors: ValidationError[] = [];\n add(path: string, code: ValidationErrorCode, message: string): void {\n this.errors.push({ path, code, message });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a full SRP document.\n *\n * Returns `{ valid: true }` when the document conforms to SRP v0.1.\n * Returns `{ valid: false, errors }` with every violation keyed by a\n * JSON-pointer-style path when it doesn't.\n */\nexport function validateSRP(doc: unknown): ValidationResult {\n const c = new Collector();\n\n if (typeof doc !== \"object\" || doc === null) {\n c.add(\"\", \"NODE_NOT_OBJECT\", \"SRP document must be an object\");\n return { valid: false, errors: c.errors };\n }\n\n const d = doc as Record<string, unknown>;\n\n if (d.srp !== \"0.1\" && d.srp !== \"0.2\" && d.srp !== \"0.3\") {\n c.add(\n \"/srp\",\n \"SRP_VERSION_INVALID\",\n `srp field must be \"0.1\", \"0.2\", or \"0.3\", got ${JSON.stringify(d.srp)}`,\n );\n }\n\n if (!(\"root\" in d)) {\n c.add(\"/root\", \"ROOT_MISSING\", \"SRP document must have a root node\");\n return { valid: false, errors: c.errors };\n }\n\n validateNodeInto(d.root, \"/root\", c);\n\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\n/**\n * Validate a single node (used internally and useful standalone for\n * incremental SRP authoring).\n */\nexport function validateNode(node: unknown, path: string): ValidationResult {\n const c = new Collector();\n validateNodeInto(node, path, c);\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\nfunction validateNodeInto(\n node: unknown,\n path: string,\n c: Collector,\n): void {\n if (typeof node !== \"object\" || node === null) {\n c.add(path, \"NODE_NOT_OBJECT\", `Node at ${path} must be an object`);\n return;\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.type !== \"string\") {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_MISSING\",\n `Node at ${path} must have a string \"type\" field`,\n );\n return;\n }\n\n if (!(NODE_TYPES as readonly string[]).includes(n.type)) {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_UNKNOWN\",\n `Unknown node type \"${n.type}\" at ${path}. Allowed: ${NODE_TYPES.join(\", \")}`,\n );\n return;\n }\n\n // Per-type validation dispatched below\n switch (n.type) {\n case \"column\":\n case \"row\":\n case \"card\":\n validateContainer(n, path, c);\n break;\n case \"grid\":\n validateGrid(n, path, c);\n break;\n case \"divider\":\n validateDivider(n, path, c);\n break;\n case \"record-line\":\n validateRecordLine(n, path, c);\n break;\n case \"record-line-list\":\n validateRecordLineList(n, path, c);\n break;\n case \"chip\":\n validateChip(n, path, c);\n break;\n case \"heading\":\n validateHeading(n, path, c);\n break;\n case \"text\":\n validateText(n, path, c);\n break;\n case \"stat\":\n validateStat(n, path, c);\n break;\n case \"key-value\":\n validateKeyValue(n, path, c);\n break;\n case \"button\":\n validateButton(n, path, c);\n break;\n case \"icon-button\":\n validateIconButton(n, path, c);\n break;\n case \"copy-button\":\n validateCopyButton(n, path, c);\n break;\n case \"select\":\n validateSelect(n, path, c);\n break;\n case \"empty-state\":\n validateEmptyState(n, path, c);\n break;\n case \"error-state\":\n validateErrorState(n, path, c);\n break;\n case \"skeleton\":\n validateSkeleton(n, path, c);\n break;\n case \"tabs\":\n validateTabs(n, path, c);\n break;\n case \"data-table\":\n validateDataTable(n, path, c);\n break;\n case \"board\":\n validateBoard(n, path, c);\n break;\n case \"text-input\":\n validateTextInput(n, path, c);\n break;\n case \"form\":\n validateForm(n, path, c);\n break;\n case \"segmented\":\n validateSegmented(n, path, c);\n break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Per-node validators\n// ---------------------------------------------------------------------------\n\nfunction validateContainer(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n && n.children !== undefined) {\n if (!Array.isArray(n.children)) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ARRAY\",\n `${n.type} \"children\" must be an array`,\n );\n } else {\n n.children.forEach((child, i) => {\n validateNodeInto(child, `${path}/children/${i}`, c);\n });\n }\n }\n}\n\nfunction validateGrid(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.cols !== \"number\" || !Number.isInteger(props.cols)) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_MISSING_REQUIRED\",\n `grid requires \"props.cols\" to be an integer`,\n );\n } else if (props.cols < 1 || props.cols > 12) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_INVALID_VALUE\",\n `grid \"props.cols\" must be between 1 and 12, got ${props.cols}`,\n );\n }\n validateContainer(n, path, c);\n}\n\nfunction validateDivider(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ALLOWED\",\n `divider cannot have children`,\n );\n }\n}\n\nfunction validateRecordLine(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.record !== \"string\") {\n c.add(\n `${path}/bind/record`,\n \"BIND_MISSING_REQUIRED\",\n `record-line requires \"bind.record\" (a record id string)`,\n );\n }\n}\n\nfunction validateRecordLineList(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line-list requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `record-line-list requires \"bind.query\" or \"bind.items\"`,\n );\n return;\n }\n\n const hasQuery = \"query\" in bind;\n const hasItems = \"items\" in bind;\n if (!hasQuery && !hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" must contain either \"query\" or \"items\"`,\n );\n } else if (hasQuery && hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" cannot contain both \"query\" and \"items\"`,\n );\n } else if (hasItems && !Array.isArray(bind.items)) {\n c.add(\n `${path}/bind/items`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind.items\" must be an array of record ids`,\n );\n }\n}\n\nfunction validateChip(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `chip requires \"props.label\"`,\n );\n }\n}\n\nfunction validateHeading(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.level !== \"number\" || !Number.isInteger(props.level)) {\n c.add(\n `${path}/props/level`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.level\" to be an integer`,\n );\n } else if (props.level < 1 || props.level > 6) {\n c.add(\n `${path}/props/level`,\n \"PROPS_INVALID_VALUE\",\n `heading \"props.level\" must be 1-6, got ${props.level}`,\n );\n }\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.text\"`,\n );\n }\n}\n\nfunction validateText(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `text requires \"props.text\"`,\n );\n }\n}\n\nfunction validateStat(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\" && typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.value\" (string or number)`,\n );\n }\n}\n\nfunction validateKeyValue(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.value\"`,\n );\n }\n}\n\nfunction validateButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `button requires \"props.label\"`,\n );\n }\n}\n\nfunction validateIconButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.glyph !== \"string\") {\n c.add(\n `${path}/props/glyph`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires \"props.glyph\" (Glyph kind string)`,\n );\n }\n if (typeof props.ariaLabel !== \"string\" || props.ariaLabel.length === 0) {\n c.add(\n `${path}/props/ariaLabel`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires a non-empty \"props.ariaLabel\" (WCAG 2.1 AA)`,\n );\n }\n}\n\nfunction validateCopyButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `copy-button requires \"props.value\"`,\n );\n }\n}\n\nfunction validateSelect(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options)) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `select requires \"props.options\" (array of {label, value})`,\n );\n return;\n }\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.label !== \"string\" || typeof o.value !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must have string \"label\" and \"value\"`,\n );\n }\n });\n}\n\nfunction validateEmptyState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `empty-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateErrorState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `error-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateSkeleton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown> | undefined;\n if (props && typeof props.shape === \"string\") {\n const allowed = [\"rect\", \"circle\", \"text\"];\n if (!allowed.includes(props.shape)) {\n c.add(\n `${path}/props/shape`,\n \"PROPS_INVALID_VALUE\",\n `skeleton \"props.shape\" must be one of ${allowed.join(\" | \")}, got ${props.shape}`,\n );\n }\n if (\n props.shape === \"rect\" &&\n props.height === undefined\n ) {\n c.add(\n `${path}/props/height`,\n \"PROPS_MISSING_REQUIRED\",\n `skeleton shape='rect' requires \"props.height\"`,\n );\n }\n }\n\n // Returned silently — suppress unused-param warning\n void n;\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 node validators\n// ---------------------------------------------------------------------------\n\nfunction validateTabs(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.tabs) || props.tabs.length === 0) {\n c.add(\n `${path}/props/tabs`,\n \"PROPS_MISSING_REQUIRED\",\n `tabs requires a non-empty \"props.tabs\" array`,\n );\n } else {\n props.tabs.forEach((tab, i) => {\n if (typeof tab !== \"object\" || tab === null) {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must be an object`,\n );\n return;\n }\n const t = tab as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.label !== \"string\") {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.active !== \"string\") {\n c.add(\n `${path}/bind/active`,\n \"BIND_MISSING_REQUIRED\",\n `tabs requires \"bind.active\" (a tab id string)`,\n );\n }\n\n // Children are the panels — validated recursively.\n validateContainer(n, path, c);\n}\n\nfunction validateDataTable(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `data-table requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.key !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must have string \"key\" and \"label\"`,\n );\n }\n if (o.kind !== undefined && o.kind !== \"text\" && o.kind !== \"chip\") {\n c.add(\n `${path}/props/columns/${i}/kind`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"kind\" must be \"text\" or \"chip\"`,\n );\n }\n // SRP v0.3 — optional column props.\n if (\n o.tones !== undefined &&\n (typeof o.tones !== \"object\" ||\n o.tones === null ||\n Array.isArray(o.tones))\n ) {\n c.add(\n `${path}/props/columns/${i}/tones`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"tones\" must be an object mapping value → tone`,\n );\n }\n if (\n o.order !== undefined &&\n (!Array.isArray(o.order) ||\n !o.order.every((v) => typeof v === \"string\"))\n ) {\n c.add(\n `${path}/props/columns/${i}/order`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"order\" must be an array of strings`,\n );\n }\n });\n }\n\n // SRP v0.3 — optional data-grid props.\n validateDataTableV3Props(props, path, c);\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `data-table requires \"bind.query\" or \"bind.rows\"`,\n );\n return;\n }\n const hasQuery = \"query\" in bind;\n const hasRows = \"rows\" in bind;\n if (!hasQuery && !hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" must contain either \"query\" or \"rows\"`,\n );\n } else if (hasQuery && hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" cannot contain both \"query\" and \"rows\"`,\n );\n } else if (hasRows && !Array.isArray(bind.rows)) {\n c.add(\n `${path}/bind/rows`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind.rows\" must be an array of row objects`,\n );\n }\n}\n\nfunction validateBoard(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.id !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n if (typeof props.groupBy !== \"string\") {\n c.add(\n `${path}/props/groupBy`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires \"props.groupBy\" (a record field name)`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.query !== \"object\" || bind.query === null) {\n c.add(\n `${path}/bind/query`,\n \"BIND_MISSING_REQUIRED\",\n `board requires \"bind.query\" (a VQL query object)`,\n );\n }\n}\n\nfunction validateTextInput(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `text-input requires \"bind.value\" (a string)`,\n );\n }\n\n const props = n.props as Record<string, unknown> | undefined;\n if (props && props.inputKind !== undefined) {\n const allowed = [\"text\", \"search\"];\n if (\n typeof props.inputKind !== \"string\" ||\n !allowed.includes(props.inputKind)\n ) {\n c.add(\n `${path}/props/inputKind`,\n \"PROPS_INVALID_VALUE\",\n `text-input \"props.inputKind\" must be one of ${allowed.join(\" | \")}`,\n );\n }\n }\n}\n\nfunction validateForm(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n // A form is a pure container — its inputs are validated recursively.\n validateContainer(n, path, c);\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.3 node validators\n// ---------------------------------------------------------------------------\n\n/** Validate the optional SRP v0.3 props on a `data-table`. */\nfunction validateDataTableV3Props(\n props: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (props.defaultSort !== undefined) {\n const ds = props.defaultSort as Record<string, unknown>;\n if (typeof ds !== \"object\" || ds === null) {\n c.add(\n `${path}/props/defaultSort`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort\" must be an object {key, direction}`,\n );\n } else {\n if (typeof ds.key !== \"string\") {\n c.add(\n `${path}/props/defaultSort/key`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort.key\" must be a string`,\n );\n }\n if (ds.direction !== \"asc\" && ds.direction !== \"desc\") {\n c.add(\n `${path}/props/defaultSort/direction`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort.direction\" must be \"asc\" or \"desc\"`,\n );\n }\n }\n }\n\n if (props.rowActions !== undefined) {\n if (!Array.isArray(props.rowActions)) {\n c.add(\n `${path}/props/rowActions`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowActions\" must be an array`,\n );\n } else {\n props.rowActions.forEach((action, i) => {\n if (typeof action !== \"object\" || action === null) {\n c.add(\n `${path}/props/rowActions/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction must be an object`,\n );\n return;\n }\n const a = action as Record<string, unknown>;\n if (typeof a.intent !== \"string\") {\n c.add(\n `${path}/props/rowActions/${i}/intent`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction requires a string \"intent\"`,\n );\n }\n if (\n a.position !== undefined &&\n a.position !== \"leading\" &&\n a.position !== \"trailing\"\n ) {\n c.add(\n `${path}/props/rowActions/${i}/position`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction \"position\" must be \"leading\" or \"trailing\"`,\n );\n }\n });\n }\n }\n\n if (props.rowTone !== undefined) {\n const rt = props.rowTone as Record<string, unknown>;\n if (typeof rt !== \"object\" || rt === null) {\n c.add(\n `${path}/props/rowTone`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone\" must be an object {key, tones}`,\n );\n } else {\n if (typeof rt.key !== \"string\") {\n c.add(\n `${path}/props/rowTone/key`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone.key\" must be a string`,\n );\n }\n if (\n typeof rt.tones !== \"object\" ||\n rt.tones === null ||\n Array.isArray(rt.tones)\n ) {\n c.add(\n `${path}/props/rowTone/tones`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone.tones\" must be an object mapping value → tone`,\n );\n }\n }\n }\n}\n\nfunction validateSegmented(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options) || props.options.length === 0) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `segmented requires a non-empty \"props.options\" array`,\n );\n } else {\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `segmented option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.value !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `segmented option must have string \"value\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `segmented requires \"bind.value\" (a string)`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for library consumers\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard: true when `doc` is a well-formed SRP document.\n * Useful in adapter code that receives untrusted JSON.\n */\nexport function isSRPDocument(doc: unknown): doc is SRPDocument {\n const result = validateSRP(doc);\n return result.valid;\n}\n\n/**\n * Type guard: true when `node` is a well-formed SRP node.\n */\nexport function isSRPNode(node: unknown): node is SRPNode {\n const result = validateNode(node, \"\");\n return result.valid;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime validators for SRP v0.1 / v0.2 / v0.3 / v0.4 documents.\n *\n * Pure functions — no dependencies. Return a ValidationResult with either a\n * `valid: true` flag or a list of errors keyed by path.\n */\n\nimport type { SRPDocument, SRPNode } from \"./schema.js\";\nimport { NODE_TYPES } from \"./schema.js\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface ValidationError {\n /** JSON-pointer-style path to the offending node, e.g. \"/root/children/0\". */\n path: string;\n /** Human-readable message. */\n message: string;\n /** Machine-readable code for programmatic handling. */\n code: ValidationErrorCode;\n}\n\nexport type ValidationErrorCode =\n | \"SRP_VERSION_INVALID\"\n | \"ROOT_MISSING\"\n | \"NODE_NOT_OBJECT\"\n | \"NODE_TYPE_MISSING\"\n | \"NODE_TYPE_UNKNOWN\"\n | \"PROPS_MISSING_REQUIRED\"\n | \"PROPS_INVALID_VALUE\"\n | \"CHILDREN_NOT_ARRAY\"\n | \"CHILDREN_NOT_ALLOWED\"\n | \"BIND_MISSING_REQUIRED\"\n | \"BIND_INVALID_SHAPE\";\n\nexport type ValidationResult =\n | { valid: true }\n | { valid: false; errors: ValidationError[] };\n\nclass Collector {\n errors: ValidationError[] = [];\n add(path: string, code: ValidationErrorCode, message: string): void {\n this.errors.push({ path, code, message });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a full SRP document.\n *\n * Returns `{ valid: true }` when the document conforms to SRP v0.1.\n * Returns `{ valid: false, errors }` with every violation keyed by a\n * JSON-pointer-style path when it doesn't.\n */\nexport function validateSRP(doc: unknown): ValidationResult {\n const c = new Collector();\n\n if (typeof doc !== \"object\" || doc === null) {\n c.add(\"\", \"NODE_NOT_OBJECT\", \"SRP document must be an object\");\n return { valid: false, errors: c.errors };\n }\n\n const d = doc as Record<string, unknown>;\n\n if (\n d.srp !== \"0.1\" &&\n d.srp !== \"0.2\" &&\n d.srp !== \"0.3\" &&\n d.srp !== \"0.4\"\n ) {\n c.add(\n \"/srp\",\n \"SRP_VERSION_INVALID\",\n `srp field must be \"0.1\", \"0.2\", \"0.3\", or \"0.4\", got ${JSON.stringify(d.srp)}`,\n );\n }\n\n if (!(\"root\" in d)) {\n c.add(\"/root\", \"ROOT_MISSING\", \"SRP document must have a root node\");\n return { valid: false, errors: c.errors };\n }\n\n validateNodeInto(d.root, \"/root\", c);\n\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\n/**\n * Validate a single node (used internally and useful standalone for\n * incremental SRP authoring).\n */\nexport function validateNode(node: unknown, path: string): ValidationResult {\n const c = new Collector();\n validateNodeInto(node, path, c);\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\nfunction validateNodeInto(\n node: unknown,\n path: string,\n c: Collector,\n): void {\n if (typeof node !== \"object\" || node === null) {\n c.add(path, \"NODE_NOT_OBJECT\", `Node at ${path} must be an object`);\n return;\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.type !== \"string\") {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_MISSING\",\n `Node at ${path} must have a string \"type\" field`,\n );\n return;\n }\n\n if (!(NODE_TYPES as readonly string[]).includes(n.type)) {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_UNKNOWN\",\n `Unknown node type \"${n.type}\" at ${path}. Allowed: ${NODE_TYPES.join(\", \")}`,\n );\n return;\n }\n\n // Per-type validation dispatched below\n switch (n.type) {\n case \"column\":\n case \"row\":\n case \"card\":\n validateContainer(n, path, c);\n break;\n case \"grid\":\n validateGrid(n, path, c);\n break;\n case \"divider\":\n validateDivider(n, path, c);\n break;\n case \"record-line\":\n validateRecordLine(n, path, c);\n break;\n case \"record-line-list\":\n validateRecordLineList(n, path, c);\n break;\n case \"chip\":\n validateChip(n, path, c);\n break;\n case \"heading\":\n validateHeading(n, path, c);\n break;\n case \"text\":\n validateText(n, path, c);\n break;\n case \"stat\":\n validateStat(n, path, c);\n break;\n case \"key-value\":\n validateKeyValue(n, path, c);\n break;\n case \"button\":\n validateButton(n, path, c);\n break;\n case \"icon-button\":\n validateIconButton(n, path, c);\n break;\n case \"copy-button\":\n validateCopyButton(n, path, c);\n break;\n case \"select\":\n validateSelect(n, path, c);\n break;\n case \"empty-state\":\n validateEmptyState(n, path, c);\n break;\n case \"error-state\":\n validateErrorState(n, path, c);\n break;\n case \"skeleton\":\n validateSkeleton(n, path, c);\n break;\n case \"tabs\":\n validateTabs(n, path, c);\n break;\n case \"data-table\":\n validateDataTable(n, path, c);\n break;\n case \"board\":\n validateBoard(n, path, c);\n break;\n case \"text-input\":\n validateTextInput(n, path, c);\n break;\n case \"form\":\n validateForm(n, path, c);\n break;\n case \"segmented\":\n validateSegmented(n, path, c);\n break;\n case \"meter\":\n validateMeter(n, path, c);\n break;\n case \"gauge\":\n validateGauge(n, path, c);\n break;\n case \"avatar\":\n validateAvatar(n, path, c);\n break;\n case \"progress\":\n validateProgress(n, path, c);\n break;\n case \"sparkline\":\n validateSparkline(n, path, c);\n break;\n case \"chart\":\n validateChart(n, path, c);\n break;\n case \"tree\":\n validateTree(n, path, c);\n break;\n case \"tag-input\":\n validateTagInput(n, path, c);\n break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Per-node validators\n// ---------------------------------------------------------------------------\n\nfunction validateContainer(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n && n.children !== undefined) {\n if (!Array.isArray(n.children)) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ARRAY\",\n `${n.type} \"children\" must be an array`,\n );\n } else {\n n.children.forEach((child, i) => {\n validateNodeInto(child, `${path}/children/${i}`, c);\n });\n }\n }\n}\n\nfunction validateGrid(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.cols !== \"number\" || !Number.isInteger(props.cols)) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_MISSING_REQUIRED\",\n `grid requires \"props.cols\" to be an integer`,\n );\n } else if (props.cols < 1 || props.cols > 12) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_INVALID_VALUE\",\n `grid \"props.cols\" must be between 1 and 12, got ${props.cols}`,\n );\n }\n validateContainer(n, path, c);\n}\n\nfunction validateDivider(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ALLOWED\",\n `divider cannot have children`,\n );\n }\n}\n\nfunction validateRecordLine(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.record !== \"string\") {\n c.add(\n `${path}/bind/record`,\n \"BIND_MISSING_REQUIRED\",\n `record-line requires \"bind.record\" (a record id string)`,\n );\n }\n}\n\nfunction validateRecordLineList(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line-list requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `record-line-list requires \"bind.query\" or \"bind.items\"`,\n );\n return;\n }\n\n const hasQuery = \"query\" in bind;\n const hasItems = \"items\" in bind;\n if (!hasQuery && !hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" must contain either \"query\" or \"items\"`,\n );\n } else if (hasQuery && hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" cannot contain both \"query\" and \"items\"`,\n );\n } else if (hasItems && !Array.isArray(bind.items)) {\n c.add(\n `${path}/bind/items`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind.items\" must be an array of record ids`,\n );\n }\n}\n\nfunction validateChip(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `chip requires \"props.label\"`,\n );\n }\n}\n\nfunction validateHeading(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.level !== \"number\" || !Number.isInteger(props.level)) {\n c.add(\n `${path}/props/level`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.level\" to be an integer`,\n );\n } else if (props.level < 1 || props.level > 6) {\n c.add(\n `${path}/props/level`,\n \"PROPS_INVALID_VALUE\",\n `heading \"props.level\" must be 1-6, got ${props.level}`,\n );\n }\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.text\"`,\n );\n }\n}\n\nfunction validateText(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `text requires \"props.text\"`,\n );\n }\n}\n\nfunction validateStat(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\" && typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.value\" (string or number)`,\n );\n }\n}\n\nfunction validateKeyValue(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.value\"`,\n );\n }\n}\n\nfunction validateButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `button requires \"props.label\"`,\n );\n }\n}\n\nfunction validateIconButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.glyph !== \"string\") {\n c.add(\n `${path}/props/glyph`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires \"props.glyph\" (Glyph kind string)`,\n );\n }\n if (typeof props.ariaLabel !== \"string\" || props.ariaLabel.length === 0) {\n c.add(\n `${path}/props/ariaLabel`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires a non-empty \"props.ariaLabel\" (WCAG 2.1 AA)`,\n );\n }\n}\n\nfunction validateCopyButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `copy-button requires \"props.value\"`,\n );\n }\n}\n\nfunction validateSelect(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options)) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `select requires \"props.options\" (array of {label, value})`,\n );\n return;\n }\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.label !== \"string\" || typeof o.value !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must have string \"label\" and \"value\"`,\n );\n }\n });\n}\n\nfunction validateEmptyState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `empty-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateErrorState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `error-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateSkeleton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown> | undefined;\n if (props && typeof props.shape === \"string\") {\n const allowed = [\"rect\", \"circle\", \"text\"];\n if (!allowed.includes(props.shape)) {\n c.add(\n `${path}/props/shape`,\n \"PROPS_INVALID_VALUE\",\n `skeleton \"props.shape\" must be one of ${allowed.join(\" | \")}, got ${props.shape}`,\n );\n }\n if (\n props.shape === \"rect\" &&\n props.height === undefined\n ) {\n c.add(\n `${path}/props/height`,\n \"PROPS_MISSING_REQUIRED\",\n `skeleton shape='rect' requires \"props.height\"`,\n );\n }\n }\n\n // Returned silently — suppress unused-param warning\n void n;\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 node validators\n// ---------------------------------------------------------------------------\n\nfunction validateTabs(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.tabs) || props.tabs.length === 0) {\n c.add(\n `${path}/props/tabs`,\n \"PROPS_MISSING_REQUIRED\",\n `tabs requires a non-empty \"props.tabs\" array`,\n );\n } else {\n props.tabs.forEach((tab, i) => {\n if (typeof tab !== \"object\" || tab === null) {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must be an object`,\n );\n return;\n }\n const t = tab as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.label !== \"string\") {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.active !== \"string\") {\n c.add(\n `${path}/bind/active`,\n \"BIND_MISSING_REQUIRED\",\n `tabs requires \"bind.active\" (a tab id string)`,\n );\n }\n\n // Children are the panels — validated recursively.\n validateContainer(n, path, c);\n}\n\nfunction validateDataTable(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `data-table requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.key !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must have string \"key\" and \"label\"`,\n );\n }\n if (\n o.kind !== undefined &&\n o.kind !== \"text\" &&\n o.kind !== \"chip\" &&\n o.kind !== \"lines\"\n ) {\n c.add(\n `${path}/props/columns/${i}/kind`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"kind\" must be \"text\", \"chip\", or \"lines\"`,\n );\n }\n if (o.subKey !== undefined && typeof o.subKey !== \"string\") {\n c.add(\n `${path}/props/columns/${i}/subKey`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"subKey\" must be a string`,\n );\n }\n // SRP v0.3 — optional column props.\n if (\n o.tones !== undefined &&\n (typeof o.tones !== \"object\" ||\n o.tones === null ||\n Array.isArray(o.tones))\n ) {\n c.add(\n `${path}/props/columns/${i}/tones`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"tones\" must be an object mapping value → tone`,\n );\n }\n if (\n o.order !== undefined &&\n (!Array.isArray(o.order) ||\n !o.order.every((v) => typeof v === \"string\"))\n ) {\n c.add(\n `${path}/props/columns/${i}/order`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"order\" must be an array of strings`,\n );\n }\n });\n }\n\n // SRP v0.3 — optional data-grid props.\n validateDataTableV3Props(props, path, c);\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `data-table requires \"bind.query\" or \"bind.rows\"`,\n );\n return;\n }\n const hasQuery = \"query\" in bind;\n const hasRows = \"rows\" in bind;\n if (!hasQuery && !hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" must contain either \"query\" or \"rows\"`,\n );\n } else if (hasQuery && hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" cannot contain both \"query\" and \"rows\"`,\n );\n } else if (hasRows && !Array.isArray(bind.rows)) {\n c.add(\n `${path}/bind/rows`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind.rows\" must be an array of row objects`,\n );\n }\n}\n\nfunction validateBoard(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.id !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n if (typeof props.groupBy !== \"string\") {\n c.add(\n `${path}/props/groupBy`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires \"props.groupBy\" (a record field name)`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.query !== \"object\" || bind.query === null) {\n c.add(\n `${path}/bind/query`,\n \"BIND_MISSING_REQUIRED\",\n `board requires \"bind.query\" (a VQL query object)`,\n );\n }\n}\n\nfunction validateTextInput(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `text-input requires \"bind.value\" (a string)`,\n );\n }\n\n const props = n.props as Record<string, unknown> | undefined;\n if (props && props.inputKind !== undefined) {\n const allowed = [\"text\", \"search\"];\n if (\n typeof props.inputKind !== \"string\" ||\n !allowed.includes(props.inputKind)\n ) {\n c.add(\n `${path}/props/inputKind`,\n \"PROPS_INVALID_VALUE\",\n `text-input \"props.inputKind\" must be one of ${allowed.join(\" | \")}`,\n );\n }\n }\n}\n\nfunction validateForm(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n // A form is a pure container — its inputs are validated recursively.\n validateContainer(n, path, c);\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.3 node validators\n// ---------------------------------------------------------------------------\n\n/** Validate the optional SRP v0.3 props on a `data-table`. */\nfunction validateDataTableV3Props(\n props: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (props.defaultSort !== undefined) {\n const ds = props.defaultSort as Record<string, unknown>;\n if (typeof ds !== \"object\" || ds === null) {\n c.add(\n `${path}/props/defaultSort`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort\" must be an object {key, direction}`,\n );\n } else {\n if (typeof ds.key !== \"string\") {\n c.add(\n `${path}/props/defaultSort/key`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort.key\" must be a string`,\n );\n }\n if (ds.direction !== \"asc\" && ds.direction !== \"desc\") {\n c.add(\n `${path}/props/defaultSort/direction`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"defaultSort.direction\" must be \"asc\" or \"desc\"`,\n );\n }\n }\n }\n\n if (props.rowActions !== undefined) {\n if (!Array.isArray(props.rowActions)) {\n c.add(\n `${path}/props/rowActions`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowActions\" must be an array`,\n );\n } else {\n props.rowActions.forEach((action, i) => {\n if (typeof action !== \"object\" || action === null) {\n c.add(\n `${path}/props/rowActions/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction must be an object`,\n );\n return;\n }\n const a = action as Record<string, unknown>;\n if (typeof a.intent !== \"string\") {\n c.add(\n `${path}/props/rowActions/${i}/intent`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction requires a string \"intent\"`,\n );\n }\n if (\n a.position !== undefined &&\n a.position !== \"leading\" &&\n a.position !== \"trailing\"\n ) {\n c.add(\n `${path}/props/rowActions/${i}/position`,\n \"PROPS_INVALID_VALUE\",\n `data-table rowAction \"position\" must be \"leading\" or \"trailing\"`,\n );\n }\n });\n }\n }\n\n if (props.rowTone !== undefined) {\n const rt = props.rowTone as Record<string, unknown>;\n if (typeof rt !== \"object\" || rt === null) {\n c.add(\n `${path}/props/rowTone`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone\" must be an object {key, tones}`,\n );\n } else {\n if (typeof rt.key !== \"string\") {\n c.add(\n `${path}/props/rowTone/key`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone.key\" must be a string`,\n );\n }\n if (\n typeof rt.tones !== \"object\" ||\n rt.tones === null ||\n Array.isArray(rt.tones)\n ) {\n c.add(\n `${path}/props/rowTone/tones`,\n \"PROPS_INVALID_VALUE\",\n `data-table \"rowTone.tones\" must be an object mapping value → tone`,\n );\n }\n }\n }\n}\n\nfunction validateSegmented(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options) || props.options.length === 0) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `segmented requires a non-empty \"props.options\" array`,\n );\n } else {\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `segmented option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.value !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `segmented option must have string \"value\" and \"label\"`,\n );\n }\n });\n }\n\n if (props.variant !== undefined &&\n props.variant !== \"solid\" &&\n props.variant !== \"underline\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_INVALID_VALUE\",\n `segmented \"props.variant\" must be \"solid\" or \"underline\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `segmented requires \"bind.value\" (a string)`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.4 node validators\n// ---------------------------------------------------------------------------\n\nconst VIZ_TONES = [\"neutral\", \"accent\", \"success\", \"warn\", \"error\", \"info\"];\n\nfunction validateMeter(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `meter requires \"props.value\" (a number 0..1)`,\n );\n }\n if (\n props.variant !== undefined &&\n props.variant !== \"continuous\" &&\n props.variant !== \"segmented\"\n ) {\n c.add(\n `${path}/props/variant`,\n \"PROPS_INVALID_VALUE\",\n `meter \"props.variant\" must be \"continuous\" or \"segmented\"`,\n );\n }\n if (props.thresholds !== undefined && !Array.isArray(props.thresholds)) {\n c.add(\n `${path}/props/thresholds`,\n \"PROPS_INVALID_VALUE\",\n `meter \"props.thresholds\" must be an array of {at, tone}`,\n );\n }\n if (\n props.tone !== undefined &&\n (typeof props.tone !== \"string\" || !VIZ_TONES.includes(props.tone))\n ) {\n c.add(\n `${path}/props/tone`,\n \"PROPS_INVALID_VALUE\",\n `meter \"props.tone\" must be one of ${VIZ_TONES.join(\" | \")}`,\n );\n }\n}\n\nfunction validateGauge(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `gauge requires \"props.value\" (a number 0..1)`,\n );\n }\n if (props.zones !== undefined && !Array.isArray(props.zones)) {\n c.add(\n `${path}/props/zones`,\n \"PROPS_INVALID_VALUE\",\n `gauge \"props.zones\" must be an array of {from, to, tone}`,\n );\n }\n if (\n props.format !== undefined &&\n props.format !== \"percent\" &&\n props.format !== \"decimal\"\n ) {\n c.add(\n `${path}/props/format`,\n \"PROPS_INVALID_VALUE\",\n `gauge \"props.format\" must be \"percent\" or \"decimal\"`,\n );\n }\n}\n\nfunction validateAvatar(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.name !== \"string\" || props.name.length === 0) {\n c.add(\n `${path}/props/name`,\n \"PROPS_MISSING_REQUIRED\",\n `avatar requires a non-empty \"props.name\"`,\n );\n }\n}\n\nfunction validateProgress(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = n.props as Record<string, unknown> | undefined;\n if (props && props.value !== undefined && typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_INVALID_VALUE\",\n `progress \"props.value\" must be a number 0..1`,\n );\n }\n}\n\nfunction validateSparkline(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (\n !Array.isArray(props.values) ||\n !props.values.every((v) => typeof v === \"number\")\n ) {\n c.add(\n `${path}/props/values`,\n \"PROPS_MISSING_REQUIRED\",\n `sparkline requires \"props.values\" (an array of numbers)`,\n );\n }\n if (\n props.variant !== undefined &&\n props.variant !== \"line\" &&\n props.variant !== \"bar\"\n ) {\n c.add(\n `${path}/props/variant`,\n \"PROPS_INVALID_VALUE\",\n `sparkline \"props.variant\" must be \"line\" or \"bar\"`,\n );\n }\n}\n\nfunction validateChart(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n const kinds = [\"line\", \"area\", \"bar\", \"pie\"];\n if (typeof props.kind !== \"string\" || !kinds.includes(props.kind)) {\n c.add(\n `${path}/props/kind`,\n \"PROPS_MISSING_REQUIRED\",\n `chart requires \"props.kind\" — one of ${kinds.join(\" | \")}`,\n );\n }\n if (!Array.isArray(props.series) || props.series.length === 0) {\n c.add(\n `${path}/props/series`,\n \"PROPS_MISSING_REQUIRED\",\n `chart requires a non-empty \"props.series\" array`,\n );\n return;\n }\n props.series.forEach((s, i) => {\n if (typeof s !== \"object\" || s === null) {\n c.add(\n `${path}/props/series/${i}`,\n \"PROPS_INVALID_VALUE\",\n `chart series must be an object`,\n );\n return;\n }\n if (!Array.isArray((s as Record<string, unknown>).points)) {\n c.add(\n `${path}/props/series/${i}/points`,\n \"PROPS_INVALID_VALUE\",\n `chart series requires a \"points\" array`,\n );\n }\n });\n}\n\nfunction validateTreeItems(\n items: unknown[],\n path: string,\n c: Collector,\n): void {\n items.forEach((item, i) => {\n if (typeof item !== \"object\" || item === null) {\n c.add(\n `${path}/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tree item must be an object`,\n );\n return;\n }\n const it = item as Record<string, unknown>;\n if (typeof it.id !== \"string\" || typeof it.label !== \"string\") {\n c.add(\n `${path}/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tree item must have string \"id\" and \"label\"`,\n );\n }\n if (it.children !== undefined) {\n if (!Array.isArray(it.children)) {\n c.add(\n `${path}/${i}/children`,\n \"PROPS_INVALID_VALUE\",\n `tree item \"children\" must be an array`,\n );\n } else {\n validateTreeItems(it.children, `${path}/${i}/children`, c);\n }\n }\n });\n}\n\nfunction validateTree(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.items)) {\n c.add(\n `${path}/props/items`,\n \"PROPS_MISSING_REQUIRED\",\n `tree requires \"props.items\" (an array of tree items)`,\n );\n return;\n }\n validateTreeItems(props.items, `${path}/props/items`, c);\n}\n\nfunction validateTagInput(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const bind = n.bind as Record<string, unknown> | undefined;\n if (\n !bind ||\n !Array.isArray(bind.tags) ||\n !bind.tags.every((t) => typeof t === \"string\")\n ) {\n c.add(\n `${path}/bind/tags`,\n \"BIND_MISSING_REQUIRED\",\n `tag-input requires \"bind.tags\" (an array of strings)`,\n );\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for library consumers\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard: true when `doc` is a well-formed SRP document.\n * Useful in adapter code that receives untrusted JSON.\n */\nexport function isSRPDocument(doc: unknown): doc is SRPDocument {\n const result = validateSRP(doc);\n return result.valid;\n}\n\n/**\n * Type guard: true when `node` is a well-formed SRP node.\n */\nexport function isSRPNode(node: unknown): node is SRPNode {\n const result = validateNode(node, \"\");\n return result.valid;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncropel/projections",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "TypeScript schema + validators for the Syncropel Rendering Protocol (SRP v0.2) — declarative UI documents for query-driven and AI-generated interfaces.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|