@tai42/studio-sdk 6.2.0 → 7.0.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/dist/components/field.d.ts +14 -1
- package/dist/components/field.d.ts.map +1 -1
- package/dist/components/field.js +5 -2
- package/dist/components/field.js.map +1 -1
- package/dist/expression/ExpressionField.d.ts +140 -0
- package/dist/expression/ExpressionField.d.ts.map +1 -0
- package/dist/expression/ExpressionField.js +88 -0
- package/dist/expression/ExpressionField.js.map +1 -0
- package/dist/expression/context.d.ts +50 -0
- package/dist/expression/context.d.ts.map +1 -0
- package/dist/expression/context.js +53 -0
- package/dist/expression/context.js.map +1 -0
- package/dist/expression/types.d.ts +157 -0
- package/dist/expression/types.d.ts.map +1 -0
- package/dist/expression/types.js +11 -0
- package/dist/expression/types.js.map +1 -0
- package/dist/hooks/useApi.d.ts +8 -0
- package/dist/hooks/useApi.d.ts.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/plugin/registry.d.ts.map +1 -1
- package/dist/plugin/registry.js +39 -1
- package/dist/plugin/registry.js.map +1 -1
- package/dist/plugin/types.d.ts +31 -0
- package/dist/plugin/types.d.ts.map +1 -1
- package/dist/schema-editor/SchemaEditor.d.ts.map +1 -1
- package/dist/schema-editor/SchemaEditor.js +8 -4
- package/dist/schema-editor/SchemaEditor.js.map +1 -1
- package/dist/schema-form/classify.d.ts +5 -3
- package/dist/schema-form/classify.d.ts.map +1 -1
- package/dist/schema-form/classify.js +42 -16
- package/dist/schema-form/classify.js.map +1 -1
- package/dist/schema-form/default-value.d.ts.map +1 -1
- package/dist/schema-form/default-value.js +4 -1
- package/dist/schema-form/default-value.js.map +1 -1
- package/dist/schema-form/field-node.d.ts.map +1 -1
- package/dist/schema-form/field-node.js +3 -3
- package/dist/schema-form/field-node.js.map +1 -1
- package/dist/schema-form/json-field.d.ts +14 -0
- package/dist/schema-form/json-field.d.ts.map +1 -0
- package/dist/schema-form/json-field.js +104 -0
- package/dist/schema-form/json-field.js.map +1 -0
- package/dist/schema-form/types.d.ts +2 -2
- package/dist/schema-form/types.js +2 -2
- package/dist/schema-form/validate.d.ts.map +1 -1
- package/dist/schema-form/validate.js +11 -4
- package/dist/schema-form/validate.js.map +1 -1
- package/package.json +2 -2
- package/src/components/field.tsx +20 -2
- package/src/expression/ExpressionField.tsx +330 -0
- package/src/expression/context.tsx +83 -0
- package/src/expression/types.ts +164 -0
- package/src/index.ts +22 -0
- package/src/plugin/registry.ts +50 -1
- package/src/plugin/types.ts +32 -0
- package/src/schema-editor/SchemaEditor.tsx +8 -4
- package/src/schema-form/classify.ts +103 -18
- package/src/schema-form/default-value.ts +4 -1
- package/src/schema-form/field-node.tsx +7 -4
- package/src/schema-form/json-field.tsx +143 -0
- package/src/schema-form/types.ts +2 -2
- package/src/schema-form/validate.ts +10 -4
- package/dist/schema-form/unsupported-notice.d.ts +0 -18
- package/dist/schema-form/unsupported-notice.d.ts.map +0 -1
- package/dist/schema-form/unsupported-notice.js +0 -8
- package/dist/schema-form/unsupported-notice.js.map +0 -1
- package/src/schema-form/unsupported-notice.tsx +0 -39
|
@@ -6,12 +6,12 @@ import { ArrayField } from './array-field';
|
|
|
6
6
|
import { classifySchema } from './classify';
|
|
7
7
|
import { EnumField } from './enum-field';
|
|
8
8
|
import { FieldGroup } from './field-group';
|
|
9
|
+
import { JsonField } from './json-field';
|
|
9
10
|
import { ObjectFields } from './object-fields';
|
|
10
11
|
import { RecordField } from './record-field';
|
|
11
12
|
import { scalarLabel } from './resolve';
|
|
12
13
|
import { StringField } from './string-field';
|
|
13
14
|
import { UnionField } from './union-field';
|
|
14
|
-
import { UnsupportedNotice } from './unsupported-notice';
|
|
15
15
|
function labelText(explicit, label) {
|
|
16
16
|
return explicit ?? label ?? 'Value';
|
|
17
17
|
}
|
|
@@ -24,8 +24,8 @@ export function FieldNode(props) {
|
|
|
24
24
|
const error = errors?.[path];
|
|
25
25
|
const model = classified.model;
|
|
26
26
|
switch (model.kind) {
|
|
27
|
-
case '
|
|
28
|
-
return (_jsx(
|
|
27
|
+
case 'json':
|
|
28
|
+
return (_jsx(JsonField, { heading: heading, description: description, error: error, jsonType: model.jsonType, nullable: classified.nullable, value: value, onChange: onChange }));
|
|
29
29
|
case 'const':
|
|
30
30
|
return (_jsx(Field, { label: heading, description: description, error: error, children: _jsx(TextInput, { value: scalarLabel(model.value), readOnly: true, disabled: true }) }));
|
|
31
31
|
case 'enum':
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-node.js","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"field-node.js","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/** The JSON container a `json` field commits to (see `classify`). */
|
|
3
|
+
type JsonType = 'object' | 'array' | 'any';
|
|
4
|
+
export declare function JsonField({ heading, description, error, jsonType, nullable, value, onChange, }: {
|
|
5
|
+
heading: string;
|
|
6
|
+
description: string | undefined;
|
|
7
|
+
error: string | undefined;
|
|
8
|
+
jsonType: JsonType;
|
|
9
|
+
nullable: boolean;
|
|
10
|
+
value: unknown;
|
|
11
|
+
onChange: (value: unknown) => void;
|
|
12
|
+
}): ReactNode;
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=json-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-field.d.ts","sourceRoot":"","sources":["../../src/schema-form/json-field.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,qEAAqE;AACrE,KAAK,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,KAAK,CAAC;AAmC3C,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,WAAW,EACX,KAAK,EACL,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC,GAAG,SAAS,CAgEZ"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The free-form JSON field: the honest editor for a schema node the form has no
|
|
4
|
+
* STRUCTURED control for — a property-less object, a bare `additionalProperties`-
|
|
5
|
+
* open object, an items-less array, an empty/multi-type/`allOf` shape. Rather than
|
|
6
|
+
* dead-end on an "Unsupported" badge (a value the user can see but not set), it
|
|
7
|
+
* offers a mono textarea seeded with the current value pretty-printed and commits
|
|
8
|
+
* the PARSED value through the same `onChange` a structured field uses.
|
|
9
|
+
*
|
|
10
|
+
* Validation is LOUD and local: the buffer must parse as JSON, and — when the
|
|
11
|
+
* schema commits to a container (`jsonType` `'object'`/`'array'`) — the parsed
|
|
12
|
+
* value must be that container. An invalid buffer shows an inline error and does
|
|
13
|
+
* NOT commit, so a half-typed edit never writes a broken value through; the last
|
|
14
|
+
* committed value stands until the buffer is valid again.
|
|
15
|
+
*
|
|
16
|
+
* The buffer is LOCAL state (an invalid buffer has no committed value to derive
|
|
17
|
+
* from), resynced only when a DIFFERENT value arrives from the parent — the same
|
|
18
|
+
* `lastEmitted` guard `record-field` uses, so a parent echoing our own commit back
|
|
19
|
+
* does not clobber what is being typed.
|
|
20
|
+
*/
|
|
21
|
+
import { useRef, useState } from 'react';
|
|
22
|
+
import { Field } from '../components/field';
|
|
23
|
+
import { Textarea } from '../components/inputs';
|
|
24
|
+
import { errorMessage } from '../errors';
|
|
25
|
+
function isPlainObject(value) {
|
|
26
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
27
|
+
}
|
|
28
|
+
/** The current value as textarea text: pretty-printed JSON, or empty for absent. */
|
|
29
|
+
function serialize(value) {
|
|
30
|
+
return value === undefined ? '' : JSON.stringify(value, null, 2);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* The container constraint on a PARSED buffer, or `null` when it satisfies the
|
|
34
|
+
* schema. `null` (the JSON literal) is rejected only when the schema is not
|
|
35
|
+
* nullable — matching `validateAgainstSchema`, so the inline check and the
|
|
36
|
+
* pre-submit check agree.
|
|
37
|
+
*/
|
|
38
|
+
function containerError(value, jsonType, nullable) {
|
|
39
|
+
if (value === null)
|
|
40
|
+
return nullable ? null : 'Must not be null.';
|
|
41
|
+
if (jsonType === 'object' && !isPlainObject(value)) {
|
|
42
|
+
return 'Must be a JSON object (e.g. {"key": "value"}).';
|
|
43
|
+
}
|
|
44
|
+
if (jsonType === 'array' && !Array.isArray(value)) {
|
|
45
|
+
return 'Must be a JSON array (e.g. [1, 2, 3]).';
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
/** The muted hint's leading noun, so the user knows what a valid buffer must be. */
|
|
50
|
+
function hintNoun(jsonType) {
|
|
51
|
+
if (jsonType === 'object')
|
|
52
|
+
return 'JSON object';
|
|
53
|
+
if (jsonType === 'array')
|
|
54
|
+
return 'JSON array';
|
|
55
|
+
return 'JSON';
|
|
56
|
+
}
|
|
57
|
+
export function JsonField({ heading, description, error, jsonType, nullable, value, onChange, }) {
|
|
58
|
+
// The last value THIS field emitted. A parent echoing our own commit back
|
|
59
|
+
// passes it identity-equal, so the buffer (which may hold an invalid, un-
|
|
60
|
+
// committed edit) survives; a parent that swaps in a different value resyncs it.
|
|
61
|
+
const lastEmitted = useRef(value);
|
|
62
|
+
const [buffer, setBuffer] = useState(() => serialize(value));
|
|
63
|
+
const [parseError, setParseError] = useState(null);
|
|
64
|
+
if (value !== lastEmitted.current) {
|
|
65
|
+
lastEmitted.current = value;
|
|
66
|
+
setBuffer(serialize(value));
|
|
67
|
+
setParseError(null);
|
|
68
|
+
}
|
|
69
|
+
const commit = (next) => {
|
|
70
|
+
lastEmitted.current = next;
|
|
71
|
+
onChange(next);
|
|
72
|
+
};
|
|
73
|
+
const handleChange = (text) => {
|
|
74
|
+
setBuffer(text);
|
|
75
|
+
// An empty buffer drops the value (emits `undefined`) — the same "absent
|
|
76
|
+
// optional" affordance a cleared text field gives; a required field's
|
|
77
|
+
// absence is then flagged by the pre-submit validator, not invented here.
|
|
78
|
+
if (text.trim() === '') {
|
|
79
|
+
setParseError(null);
|
|
80
|
+
commit(undefined);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
let parsed;
|
|
84
|
+
try {
|
|
85
|
+
parsed = JSON.parse(text);
|
|
86
|
+
}
|
|
87
|
+
catch (thrown) {
|
|
88
|
+
// Invalid JSON: surface it, and DO NOT commit — the last valid value stands.
|
|
89
|
+
setParseError(`Invalid JSON: ${errorMessage(thrown)}`);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const container = containerError(parsed, jsonType, nullable);
|
|
93
|
+
if (container !== null) {
|
|
94
|
+
setParseError(container);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
setParseError(null);
|
|
98
|
+
commit(parsed);
|
|
99
|
+
};
|
|
100
|
+
return (_jsxs(Field, { label: heading, description: description, error: parseError ?? error, children: [_jsx(Textarea, { value: buffer, onChange: (event) => {
|
|
101
|
+
handleChange(event.target.value);
|
|
102
|
+
}, rows: 6, "aria-label": `${heading} JSON`, className: "tai-textarea-mono", spellCheck: false }), _jsx("p", { className: "tai-field-hint", style: { margin: 0 }, children: `free-form ${hintNoun(jsonType)} — this field has no structured schema` })] }));
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=json-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-field.js","sourceRoot":"","sources":["../../src/schema-form/json-field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* is deliberately PERMISSIVE — every field is optional and an open index
|
|
4
4
|
* signature admits unknown keywords — because the schemas come from Pydantic v2
|
|
5
5
|
* and may carry constructs the renderer does not consume. Unknown keys never
|
|
6
|
-
* break typing; the renderer classifies a node and
|
|
7
|
-
*
|
|
6
|
+
* break typing; the renderer classifies a node and, for a shape it has no
|
|
7
|
+
* structured control for, offers a free-form JSON editor rather than dropping it.
|
|
8
8
|
*/
|
|
9
9
|
/** The JSON-Schema `type` keyword values Pydantic emits. */
|
|
10
10
|
export type JsonSchemaType = 'string' | 'number' | 'integer' | 'boolean' | 'object' | 'array' | 'null';
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* is deliberately PERMISSIVE — every field is optional and an open index
|
|
4
4
|
* signature admits unknown keywords — because the schemas come from Pydantic v2
|
|
5
5
|
* and may carry constructs the renderer does not consume. Unknown keys never
|
|
6
|
-
* break typing; the renderer classifies a node and
|
|
7
|
-
*
|
|
6
|
+
* break typing; the renderer classifies a node and, for a shape it has no
|
|
7
|
+
* structured control for, offers a free-form JSON editor rather than dropping it.
|
|
8
8
|
*/
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/schema-form/validate.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5D,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/schema-form/validate.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5D,iDAAiD;AACjD,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CAClC;AAmKD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,OAAO,EACd,OAAO,CAAC,EAAE,eAAe,GACxB,gBAAgB,CAIlB"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `validateAgainstSchema` — a loud, structured pre-submit check. It walks the
|
|
3
3
|
* schema against a value and returns a path-keyed `SchemaFormErrors` bag:
|
|
4
|
-
* required-presence, type/format mismatches, enum/const violations, and
|
|
5
|
-
*
|
|
4
|
+
* required-presence, type/format mismatches, enum/const violations, and the
|
|
5
|
+
* container constraint on a free-form `json` field. It never throws on a
|
|
6
6
|
* malformed value — a malformed value IS the error it reports.
|
|
7
7
|
*/
|
|
8
8
|
import { classifySchema } from './classify';
|
|
@@ -52,8 +52,15 @@ function walk(schema, value, path, root, errors, maxUploadBytes) {
|
|
|
52
52
|
}
|
|
53
53
|
const { model } = classified;
|
|
54
54
|
switch (model.kind) {
|
|
55
|
-
case '
|
|
56
|
-
|
|
55
|
+
case 'json':
|
|
56
|
+
// A free-form JSON field: any JSON is accepted, subject only to the
|
|
57
|
+
// container the schema commits to (mirrors the renderer's inline check).
|
|
58
|
+
if (model.jsonType === 'object' && !isPlainObject(value)) {
|
|
59
|
+
errors[path] = 'must be a JSON object';
|
|
60
|
+
}
|
|
61
|
+
else if (model.jsonType === 'array' && !Array.isArray(value)) {
|
|
62
|
+
errors[path] = 'must be a JSON array';
|
|
63
|
+
}
|
|
57
64
|
return;
|
|
58
65
|
case 'const':
|
|
59
66
|
if (value !== model.value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/schema-form/validate.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAa7C,MAAM,QAAQ,GAAG,4BAA4B,CAAC;AAC9C,MAAM,OAAO,GAAG,qBAAqB,CAAC;AACtC,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,GAAW;IACzC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC;AAC9C,CAAC;AAED,SAAS,WAAW,CAAC,MAAc,EAAE,KAAa;IAChD,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,+BAA+B,CAAC;QAC5E,KAAK,KAAK,CAAC;QACX,KAAK,eAAe;YAClB,IAAI,CAAC;gBACH,IAAI,GAAG,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;gBACvC,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,qBAAqB,CAAC;YAC/B,CAAC;QACH,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC;QAClE,KAAK,MAAM;YACT,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC5D,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,mCAAmC,CAAC;QAC1C,KAAK,WAAW;YACd,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,SAAS,CAAC;QACnF;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,IAAI,CACX,MAAkB,EAClB,KAAc,EACd,IAAY,EACZ,IAAgB,EAChB,MAA8B,EAC9B,cAAkC;IAElC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEhD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC;IAC7B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,aAAa;
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/schema-form/validate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tai42/studio-sdk",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "7.0.0",
|
|
4
4
|
"description": "The Studio plugin contract, shared UI components, and hooks that every feature builds on.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "tai42 <oss@tai42.ai>",
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
"@radix-ui/react-select": "^2.3.2",
|
|
91
91
|
"@radix-ui/react-tabs": "^1.1.16",
|
|
92
92
|
"@radix-ui/react-tooltip": "^1.2.11",
|
|
93
|
-
"@tai42/api-client": "
|
|
93
|
+
"@tai42/api-client": "7.0.0"
|
|
94
94
|
},
|
|
95
95
|
"scripts": {
|
|
96
96
|
"build": "tsc -b tsconfig.build.json && node scripts/copy-assets.mjs",
|
package/src/components/field.tsx
CHANGED
|
@@ -91,6 +91,19 @@ export interface FieldProps {
|
|
|
91
91
|
* `group`.
|
|
92
92
|
*/
|
|
93
93
|
readonly group?: boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Render the label for ASSISTIVE TECH ONLY — visually hidden, but still the
|
|
96
|
+
* control's accessible name through the very same `<label for>` (or, in a group,
|
|
97
|
+
* the same `aria-labelledby`). The label element stays in the DOM behind
|
|
98
|
+
* `tai-visually-hidden`, so nothing about the accessible name changes; only its
|
|
99
|
+
* paint is dropped. It is the standard idiom for a dense grid of otherwise
|
|
100
|
+
* identical fields, where each row needs a UNIQUE, addressable name (a
|
|
101
|
+
* voice-control user can only say a name that exists) but there is no room for a
|
|
102
|
+
* visible label on every row — the same trade `RadioGroup`'s `visuallyHiddenLabel`
|
|
103
|
+
* and `ViewToggle` make. The label text still governs WCAG 2.5.3 (Label in Name),
|
|
104
|
+
* so a caller passes the real per-row name as `label`, not a decoration.
|
|
105
|
+
*/
|
|
106
|
+
readonly hideLabel?: boolean;
|
|
94
107
|
}
|
|
95
108
|
|
|
96
109
|
export function Field({
|
|
@@ -101,6 +114,7 @@ export function Field({
|
|
|
101
114
|
style,
|
|
102
115
|
className,
|
|
103
116
|
group = false,
|
|
117
|
+
hideLabel = false,
|
|
104
118
|
}: FieldProps) {
|
|
105
119
|
const controlId = useId();
|
|
106
120
|
const labelId = `${controlId}-label`;
|
|
@@ -122,6 +136,10 @@ export function Field({
|
|
|
122
136
|
? { controlId: undefined, describedBy: undefined, invalid: error !== undefined }
|
|
123
137
|
: { controlId, describedBy, invalid: error !== undefined };
|
|
124
138
|
|
|
139
|
+
// The label keeps its `htmlFor`/`id` wiring either way — `hideLabel` only drops
|
|
140
|
+
// its PAINT, so the accessible name it gives the control is unchanged.
|
|
141
|
+
const labelClassName = hideLabel ? 'tai-field-label tai-visually-hidden' : 'tai-field-label';
|
|
142
|
+
|
|
125
143
|
return (
|
|
126
144
|
<FieldContext.Provider value={value}>
|
|
127
145
|
<div
|
|
@@ -129,11 +147,11 @@ export function Field({
|
|
|
129
147
|
style={style}
|
|
130
148
|
>
|
|
131
149
|
{group ? (
|
|
132
|
-
<span id={labelId} className=
|
|
150
|
+
<span id={labelId} className={labelClassName}>
|
|
133
151
|
{label}
|
|
134
152
|
</span>
|
|
135
153
|
) : (
|
|
136
|
-
<label id={labelId} htmlFor={controlId} className=
|
|
154
|
+
<label id={labelId} htmlFor={controlId} className={labelClassName}>
|
|
137
155
|
{label}
|
|
138
156
|
</label>
|
|
139
157
|
)}
|