@tai42/studio-sdk 0.2.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/LICENSE +202 -0
- package/NOTICE +15 -0
- package/README.md +318 -0
- package/SECURITY.md +51 -0
- package/dist/components/badge.d.ts +13 -0
- package/dist/components/badge.d.ts.map +1 -0
- package/dist/components/badge.js +14 -0
- package/dist/components/badge.js.map +1 -0
- package/dist/components/checkbox.d.ts +24 -0
- package/dist/components/checkbox.d.ts.map +1 -0
- package/dist/components/checkbox.js +31 -0
- package/dist/components/checkbox.js.map +1 -0
- package/dist/components/code-block.d.ts +7 -0
- package/dist/components/code-block.d.ts.map +1 -0
- package/dist/components/code-block.js +23 -0
- package/dist/components/code-block.js.map +1 -0
- package/dist/components/completion-input.d.ts +31 -0
- package/dist/components/completion-input.d.ts.map +1 -0
- package/dist/components/completion-input.js +61 -0
- package/dist/components/completion-input.js.map +1 -0
- package/dist/components/components.css +2212 -0
- package/dist/components/confirm-dialog.d.ts +40 -0
- package/dist/components/confirm-dialog.d.ts.map +1 -0
- package/dist/components/confirm-dialog.js +11 -0
- package/dist/components/confirm-dialog.js.map +1 -0
- package/dist/components/control-styles.d.ts +12 -0
- package/dist/components/control-styles.d.ts.map +1 -0
- package/dist/components/control-styles.js +14 -0
- package/dist/components/control-styles.js.map +1 -0
- package/dist/components/copy-field.d.ts +8 -0
- package/dist/components/copy-field.d.ts.map +1 -0
- package/dist/components/copy-field.js +106 -0
- package/dist/components/copy-field.js.map +1 -0
- package/dist/components/dialog.d.ts +21 -0
- package/dist/components/dialog.d.ts.map +1 -0
- package/dist/components/dialog.js +25 -0
- package/dist/components/dialog.js.map +1 -0
- package/dist/components/drawer.d.ts +22 -0
- package/dist/components/drawer.d.ts.map +1 -0
- package/dist/components/drawer.js +32 -0
- package/dist/components/drawer.js.map +1 -0
- package/dist/components/error-boundary.d.ts +33 -0
- package/dist/components/error-boundary.d.ts.map +1 -0
- package/dist/components/error-boundary.js +36 -0
- package/dist/components/error-boundary.js.map +1 -0
- package/dist/components/extension-combo-builder.d.ts +70 -0
- package/dist/components/extension-combo-builder.d.ts.map +1 -0
- package/dist/components/extension-combo-builder.js +154 -0
- package/dist/components/extension-combo-builder.js.map +1 -0
- package/dist/components/extension-grouping.d.ts +65 -0
- package/dist/components/extension-grouping.d.ts.map +1 -0
- package/dist/components/extension-grouping.js +78 -0
- package/dist/components/extension-grouping.js.map +1 -0
- package/dist/components/extension-picker.d.ts +35 -0
- package/dist/components/extension-picker.d.ts.map +1 -0
- package/dist/components/extension-picker.js +31 -0
- package/dist/components/extension-picker.js.map +1 -0
- package/dist/components/external-link.d.ts +19 -0
- package/dist/components/external-link.d.ts.map +1 -0
- package/dist/components/external-link.js +12 -0
- package/dist/components/external-link.js.map +1 -0
- package/dist/components/field.d.ts +64 -0
- package/dist/components/field.d.ts.map +1 -0
- package/dist/components/field.js +56 -0
- package/dist/components/field.js.map +1 -0
- package/dist/components/fleet-report.d.ts +39 -0
- package/dist/components/fleet-report.d.ts.map +1 -0
- package/dist/components/fleet-report.js +50 -0
- package/dist/components/fleet-report.js.map +1 -0
- package/dist/components/fonts.css +22 -0
- package/dist/components/icons.d.ts +142 -0
- package/dist/components/icons.d.ts.map +1 -0
- package/dist/components/icons.js +139 -0
- package/dist/components/icons.js.map +1 -0
- package/dist/components/inputs.d.ts +52 -0
- package/dist/components/inputs.d.ts.map +1 -0
- package/dist/components/inputs.js +35 -0
- package/dist/components/inputs.js.map +1 -0
- package/dist/components/json-diff.d.ts +40 -0
- package/dist/components/json-diff.d.ts.map +1 -0
- package/dist/components/json-diff.js +119 -0
- package/dist/components/json-diff.js.map +1 -0
- package/dist/components/json-tree.d.ts +8 -0
- package/dist/components/json-tree.d.ts.map +1 -0
- package/dist/components/json-tree.js +70 -0
- package/dist/components/json-tree.js.map +1 -0
- package/dist/components/modal-focus.d.ts +15 -0
- package/dist/components/modal-focus.d.ts.map +1 -0
- package/dist/components/modal-focus.js +136 -0
- package/dist/components/modal-focus.js.map +1 -0
- package/dist/components/page-header.d.ts +56 -0
- package/dist/components/page-header.d.ts.map +1 -0
- package/dist/components/page-header.js +24 -0
- package/dist/components/page-header.js.map +1 -0
- package/dist/components/primitives.d.ts +186 -0
- package/dist/components/primitives.d.ts.map +1 -0
- package/dist/components/primitives.js +204 -0
- package/dist/components/primitives.js.map +1 -0
- package/dist/components/progress-bar.d.ts +29 -0
- package/dist/components/progress-bar.d.ts.map +1 -0
- package/dist/components/progress-bar.js +48 -0
- package/dist/components/progress-bar.js.map +1 -0
- package/dist/components/radio-group.d.ts +37 -0
- package/dist/components/radio-group.d.ts.map +1 -0
- package/dist/components/radio-group.js +56 -0
- package/dist/components/radio-group.js.map +1 -0
- package/dist/components/reveal-input.d.ts +13 -0
- package/dist/components/reveal-input.d.ts.map +1 -0
- package/dist/components/reveal-input.js +31 -0
- package/dist/components/reveal-input.js.map +1 -0
- package/dist/components/scroll-region.d.ts +85 -0
- package/dist/components/scroll-region.d.ts.map +1 -0
- package/dist/components/scroll-region.js +574 -0
- package/dist/components/scroll-region.js.map +1 -0
- package/dist/components/select.d.ts +53 -0
- package/dist/components/select.d.ts.map +1 -0
- package/dist/components/select.js +33 -0
- package/dist/components/select.js.map +1 -0
- package/dist/components/table.d.ts +59 -0
- package/dist/components/table.d.ts.map +1 -0
- package/dist/components/table.js +20 -0
- package/dist/components/table.js.map +1 -0
- package/dist/components/tabs.d.ts +15 -0
- package/dist/components/tabs.d.ts.map +1 -0
- package/dist/components/tabs.js +13 -0
- package/dist/components/tabs.js.map +1 -0
- package/dist/components/tags.d.ts +46 -0
- package/dist/components/tags.d.ts.map +1 -0
- package/dist/components/tags.js +68 -0
- package/dist/components/tags.js.map +1 -0
- package/dist/components/tokens.css +392 -0
- package/dist/components/tokens.d.ts +15 -0
- package/dist/components/tokens.d.ts.map +1 -0
- package/dist/components/tokens.js +101 -0
- package/dist/components/tokens.js.map +1 -0
- package/dist/components/tool-picker.d.ts +24 -0
- package/dist/components/tool-picker.d.ts.map +1 -0
- package/dist/components/tool-picker.js +97 -0
- package/dist/components/tool-picker.js.map +1 -0
- package/dist/components/tooltip.d.ts +17 -0
- package/dist/components/tooltip.d.ts.map +1 -0
- package/dist/components/tooltip.js +18 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/version-history-panel.d.ts +71 -0
- package/dist/components/version-history-panel.d.ts.map +1 -0
- package/dist/components/version-history-panel.js +148 -0
- package/dist/components/version-history-panel.js.map +1 -0
- package/dist/download.d.ts +7 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +18 -0
- package/dist/download.js.map +1 -0
- package/dist/element-slot.d.ts +4 -0
- package/dist/element-slot.d.ts.map +1 -0
- package/dist/element-slot.js +20 -0
- package/dist/element-slot.js.map +1 -0
- package/dist/elicitation/ElicitationForm.d.ts +34 -0
- package/dist/elicitation/ElicitationForm.d.ts.map +1 -0
- package/dist/elicitation/ElicitationForm.js +24 -0
- package/dist/elicitation/ElicitationForm.js.map +1 -0
- package/dist/errors.d.ts +9 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/extension-combos.d.ts +13 -0
- package/dist/extension-combos.d.ts.map +1 -0
- package/dist/extension-combos.js +9 -0
- package/dist/extension-combos.js.map +1 -0
- package/dist/hooks/useApi.d.ts +1222 -0
- package/dist/hooks/useApi.d.ts.map +1 -0
- package/dist/hooks/useApi.js +22 -0
- package/dist/hooks/useApi.js.map +1 -0
- package/dist/hooks/useAuth.d.ts +13 -0
- package/dist/hooks/useAuth.d.ts.map +1 -0
- package/dist/hooks/useAuth.js +53 -0
- package/dist/hooks/useAuth.js.map +1 -0
- package/dist/hooks/useBreakpoint.d.ts +10 -0
- package/dist/hooks/useBreakpoint.d.ts.map +1 -0
- package/dist/hooks/useBreakpoint.js +66 -0
- package/dist/hooks/useBreakpoint.js.map +1 -0
- package/dist/hooks/useCapabilities.d.ts +88 -0
- package/dist/hooks/useCapabilities.d.ts.map +1 -0
- package/dist/hooks/useCapabilities.js +203 -0
- package/dist/hooks/useCapabilities.js.map +1 -0
- package/dist/hooks/useSse.d.ts +13 -0
- package/dist/hooks/useSse.d.ts.map +1 -0
- package/dist/hooks/useSse.js +298 -0
- package/dist/hooks/useSse.js.map +1 -0
- package/dist/hooks/useTheme.d.ts +20 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +97 -0
- package/dist/hooks/useTheme.js.map +1 -0
- package/dist/hooks/useUnauthorized.d.ts +3 -0
- package/dist/hooks/useUnauthorized.d.ts.map +1 -0
- package/dist/hooks/useUnauthorized.js +18 -0
- package/dist/hooks/useUnauthorized.js.map +1 -0
- package/dist/host.d.ts +11 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +10 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +118 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +91 -0
- package/dist/index.js.map +1 -0
- package/dist/navigation/context.d.ts +25 -0
- package/dist/navigation/context.d.ts.map +1 -0
- package/dist/navigation/context.js +45 -0
- package/dist/navigation/context.js.map +1 -0
- package/dist/navigation/index.d.ts +4 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +2 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/types.d.ts +97 -0
- package/dist/navigation/types.d.ts.map +1 -0
- package/dist/navigation/types.js +16 -0
- package/dist/navigation/types.js.map +1 -0
- package/dist/plugin/host-state.d.ts +45 -0
- package/dist/plugin/host-state.d.ts.map +1 -0
- package/dist/plugin/host-state.js +62 -0
- package/dist/plugin/host-state.js.map +1 -0
- package/dist/plugin/registry.d.ts +35 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/registry.js +129 -0
- package/dist/plugin/registry.js.map +1 -0
- package/dist/plugin/types.d.ts +165 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin/types.js +2 -0
- package/dist/plugin/types.js.map +1 -0
- package/dist/plugin/version.d.ts +34 -0
- package/dist/plugin/version.d.ts.map +1 -0
- package/dist/plugin/version.js +37 -0
- package/dist/plugin/version.js.map +1 -0
- package/dist/query-keys.d.ts +31 -0
- package/dist/query-keys.d.ts.map +1 -0
- package/dist/query-keys.js +31 -0
- package/dist/query-keys.js.map +1 -0
- package/dist/schema-editor/SchemaEditor.d.ts +43 -0
- package/dist/schema-editor/SchemaEditor.d.ts.map +1 -0
- package/dist/schema-editor/SchemaEditor.js +106 -0
- package/dist/schema-editor/SchemaEditor.js.map +1 -0
- package/dist/schema-editor/index.d.ts +10 -0
- package/dist/schema-editor/index.d.ts.map +1 -0
- package/dist/schema-editor/index.js +8 -0
- package/dist/schema-editor/index.js.map +1 -0
- package/dist/schema-editor/lint.d.ts +37 -0
- package/dist/schema-editor/lint.d.ts.map +1 -0
- package/dist/schema-editor/lint.js +49 -0
- package/dist/schema-editor/lint.js.map +1 -0
- package/dist/schema-form/SchemaForm.d.ts +70 -0
- package/dist/schema-form/SchemaForm.d.ts.map +1 -0
- package/dist/schema-form/SchemaForm.js +13 -0
- package/dist/schema-form/SchemaForm.js.map +1 -0
- package/dist/schema-form/array-field.d.ts +20 -0
- package/dist/schema-form/array-field.d.ts.map +1 -0
- package/dist/schema-form/array-field.js +39 -0
- package/dist/schema-form/array-field.js.map +1 -0
- package/dist/schema-form/classify.d.ts +87 -0
- package/dist/schema-form/classify.d.ts.map +1 -0
- package/dist/schema-form/classify.js +199 -0
- package/dist/schema-form/classify.js.map +1 -0
- package/dist/schema-form/context.d.ts +4 -0
- package/dist/schema-form/context.d.ts.map +1 -0
- package/dist/schema-form/context.js +14 -0
- package/dist/schema-form/context.js.map +1 -0
- package/dist/schema-form/default-value.d.ts +8 -0
- package/dist/schema-form/default-value.d.ts.map +1 -0
- package/dist/schema-form/default-value.js +64 -0
- package/dist/schema-form/default-value.js.map +1 -0
- package/dist/schema-form/enum-field.d.ts +19 -0
- package/dist/schema-form/enum-field.d.ts.map +1 -0
- package/dist/schema-form/enum-field.js +26 -0
- package/dist/schema-form/enum-field.js.map +1 -0
- package/dist/schema-form/field-group.d.ts +9 -0
- package/dist/schema-form/field-group.d.ts.map +1 -0
- package/dist/schema-form/field-group.js +32 -0
- package/dist/schema-form/field-group.js.map +1 -0
- package/dist/schema-form/field-node.d.ts +24 -0
- package/dist/schema-form/field-node.d.ts.map +1 -0
- package/dist/schema-form/field-node.js +51 -0
- package/dist/schema-form/field-node.js.map +1 -0
- package/dist/schema-form/index.d.ts +13 -0
- package/dist/schema-form/index.d.ts.map +1 -0
- package/dist/schema-form/index.js +11 -0
- package/dist/schema-form/index.js.map +1 -0
- package/dist/schema-form/media-field.d.ts +24 -0
- package/dist/schema-form/media-field.d.ts.map +1 -0
- package/dist/schema-form/media-field.js +169 -0
- package/dist/schema-form/media-field.js.map +1 -0
- package/dist/schema-form/media.d.ts +40 -0
- package/dist/schema-form/media.d.ts.map +1 -0
- package/dist/schema-form/media.js +65 -0
- package/dist/schema-form/media.js.map +1 -0
- package/dist/schema-form/object-fields.d.ts +20 -0
- package/dist/schema-form/object-fields.d.ts.map +1 -0
- package/dist/schema-form/object-fields.js +24 -0
- package/dist/schema-form/object-fields.js.map +1 -0
- package/dist/schema-form/resolve.d.ts +41 -0
- package/dist/schema-form/resolve.d.ts.map +1 -0
- package/dist/schema-form/resolve.js +102 -0
- package/dist/schema-form/resolve.js.map +1 -0
- package/dist/schema-form/string-field.d.ts +20 -0
- package/dist/schema-form/string-field.d.ts.map +1 -0
- package/dist/schema-form/string-field.js +68 -0
- package/dist/schema-form/string-field.js.map +1 -0
- package/dist/schema-form/styles.d.ts +18 -0
- package/dist/schema-form/styles.d.ts.map +1 -0
- package/dist/schema-form/styles.js +18 -0
- package/dist/schema-form/styles.js.map +1 -0
- package/dist/schema-form/types.d.ts +67 -0
- package/dist/schema-form/types.d.ts.map +1 -0
- package/dist/schema-form/types.js +10 -0
- package/dist/schema-form/types.js.map +1 -0
- package/dist/schema-form/union-field.d.ts +24 -0
- package/dist/schema-form/union-field.d.ts.map +1 -0
- package/dist/schema-form/union-field.js +55 -0
- package/dist/schema-form/union-field.js.map +1 -0
- package/dist/schema-form/union.d.ts +4 -0
- package/dist/schema-form/union.d.ts.map +1 -0
- package/dist/schema-form/union.js +68 -0
- package/dist/schema-form/union.js.map +1 -0
- package/dist/schema-form/unsupported-notice.d.ts +18 -0
- package/dist/schema-form/unsupported-notice.d.ts.map +1 -0
- package/dist/schema-form/unsupported-notice.js +8 -0
- package/dist/schema-form/unsupported-notice.js.map +1 -0
- package/dist/schema-form/validate.d.ts +18 -0
- package/dist/schema-form/validate.d.ts.map +1 -0
- package/dist/schema-form/validate.js +162 -0
- package/dist/schema-form/validate.js.map +1 -0
- package/dist/structured-output/StructuredOutput.d.ts +27 -0
- package/dist/structured-output/StructuredOutput.d.ts.map +1 -0
- package/dist/structured-output/StructuredOutput.js +41 -0
- package/dist/structured-output/StructuredOutput.js.map +1 -0
- package/dist/testing.d.ts +80 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +207 -0
- package/dist/testing.js.map +1 -0
- package/package.json +101 -0
- package/src/components/badge.tsx +31 -0
- package/src/components/checkbox.tsx +93 -0
- package/src/components/code-block.tsx +37 -0
- package/src/components/completion-input.tsx +137 -0
- package/src/components/components.css +2212 -0
- package/src/components/confirm-dialog.tsx +77 -0
- package/src/components/control-styles.ts +14 -0
- package/src/components/copy-field.tsx +178 -0
- package/src/components/dialog.tsx +76 -0
- package/src/components/drawer.tsx +83 -0
- package/src/components/error-boundary.tsx +56 -0
- package/src/components/extension-combo-builder.tsx +305 -0
- package/src/components/extension-grouping.ts +116 -0
- package/src/components/extension-picker.tsx +97 -0
- package/src/components/external-link.tsx +40 -0
- package/src/components/field.tsx +169 -0
- package/src/components/fleet-report.tsx +136 -0
- package/src/components/fonts.css +22 -0
- package/src/components/icons.tsx +504 -0
- package/src/components/inputs.tsx +125 -0
- package/src/components/json-diff.tsx +192 -0
- package/src/components/json-tree.tsx +129 -0
- package/src/components/modal-focus.ts +150 -0
- package/src/components/page-header.tsx +107 -0
- package/src/components/primitives.tsx +489 -0
- package/src/components/progress-bar.tsx +100 -0
- package/src/components/radio-group.tsx +160 -0
- package/src/components/reveal-input.tsx +87 -0
- package/src/components/scroll-region.tsx +703 -0
- package/src/components/select.tsx +149 -0
- package/src/components/table.tsx +94 -0
- package/src/components/tabs.tsx +51 -0
- package/src/components/tags.tsx +137 -0
- package/src/components/tokens.css +392 -0
- package/src/components/tokens.ts +102 -0
- package/src/components/tool-picker.tsx +175 -0
- package/src/components/tooltip.tsx +46 -0
- package/src/components/version-history-panel.tsx +407 -0
- package/src/css.d.ts +2 -0
- package/src/download.ts +17 -0
- package/src/element-slot.ts +22 -0
- package/src/elicitation/ElicitationForm.tsx +87 -0
- package/src/errors.ts +12 -0
- package/src/extension-combos.ts +18 -0
- package/src/hooks/useApi.ts +27 -0
- package/src/hooks/useAuth.ts +67 -0
- package/src/hooks/useBreakpoint.ts +78 -0
- package/src/hooks/useCapabilities.ts +242 -0
- package/src/hooks/useSse.ts +314 -0
- package/src/hooks/useTheme.ts +133 -0
- package/src/hooks/useUnauthorized.ts +20 -0
- package/src/host.ts +15 -0
- package/src/index.ts +267 -0
- package/src/navigation/context.tsx +90 -0
- package/src/navigation/index.ts +9 -0
- package/src/navigation/types.ts +90 -0
- package/src/plugin/host-state.ts +93 -0
- package/src/plugin/registry.ts +174 -0
- package/src/plugin/types.ts +178 -0
- package/src/plugin/version.ts +44 -0
- package/src/query-keys.ts +34 -0
- package/src/schema-editor/SchemaEditor.tsx +186 -0
- package/src/schema-editor/index.ts +9 -0
- package/src/schema-editor/lint.ts +70 -0
- package/src/schema-form/SchemaForm.tsx +107 -0
- package/src/schema-form/array-field.tsx +110 -0
- package/src/schema-form/classify.ts +302 -0
- package/src/schema-form/context.ts +17 -0
- package/src/schema-form/default-value.ts +65 -0
- package/src/schema-form/enum-field.tsx +65 -0
- package/src/schema-form/field-group.tsx +71 -0
- package/src/schema-form/field-node.tsx +161 -0
- package/src/schema-form/index.ts +12 -0
- package/src/schema-form/media-field.tsx +281 -0
- package/src/schema-form/media.ts +69 -0
- package/src/schema-form/object-fields.tsx +74 -0
- package/src/schema-form/resolve.ts +114 -0
- package/src/schema-form/string-field.tsx +161 -0
- package/src/schema-form/styles.ts +20 -0
- package/src/schema-form/types.ts +71 -0
- package/src/schema-form/union-field.tsx +122 -0
- package/src/schema-form/union.ts +78 -0
- package/src/schema-form/unsupported-notice.tsx +39 -0
- package/src/schema-form/validate.ts +183 -0
- package/src/structured-output/StructuredOutput.tsx +81 -0
- package/src/testing.ts +235 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum-field.js","sourceRoot":"","sources":["../../src/schema-form/enum-field.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,SAAS,CAAC,EACxB,OAAO,EACP,WAAW,EACX,KAAK,EACL,KAAK,EACL,KAAK,EACL,QAAQ,GAQT;IACC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QACpD,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC;QAClB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;KACpB,CAAC,CAAC,CAAC;IACJ,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IAClE,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;IACxC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAQ,EAAE;QACjC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS;YAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,IAAI,iBAAiB,EAAE,CAAC;QACxC,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,kBAClE,KAAC,UAAU,IACT,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAC9E,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,IAAI,GACnB,GACI,CACT,CAAC;IACJ,CAAC;IACD,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,YAC3D,KAAC,MAAM,IACL,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAC9E,KAAK,EAAE,WAAW,EAClB,aAAa,EAAE,IAAI,GACnB,GACI,CACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
export declare function FieldGroup({ heading, description, error, atRoot, children, }: {
|
|
3
|
+
heading: string;
|
|
4
|
+
description: string | undefined;
|
|
5
|
+
error: string | undefined;
|
|
6
|
+
atRoot: boolean;
|
|
7
|
+
children: ReactNode;
|
|
8
|
+
}): ReactNode;
|
|
9
|
+
//# sourceMappingURL=field-group.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-group.d.ts","sourceRoot":"","sources":["../../src/schema-form/field-group.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,SAAS,CAAC;CACrB,GAAG,SAAS,CA8CZ"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* The wrapper around a nested group of fields (object, array, or union). At the
|
|
4
|
+
* form root it lays children out in a plain stack; below the root it renders a
|
|
5
|
+
* heading, an optional description, an optional error — the ERROR mark beside
|
|
6
|
+
* the message, never a hue on its own — and the nested group surface.
|
|
7
|
+
*/
|
|
8
|
+
import { useId } from 'react';
|
|
9
|
+
import { XCircleIcon } from '../components/icons';
|
|
10
|
+
import { groupClass, groupHeaderClass, stackClass } from './styles';
|
|
11
|
+
export function FieldGroup({ heading, description, error, atRoot, children, }) {
|
|
12
|
+
const baseId = useId();
|
|
13
|
+
const headingId = `${baseId}-heading`;
|
|
14
|
+
const descriptionId = `${baseId}-desc`;
|
|
15
|
+
const errorId = `${baseId}-err`;
|
|
16
|
+
if (atRoot) {
|
|
17
|
+
return _jsx("div", { className: stackClass, children: children });
|
|
18
|
+
}
|
|
19
|
+
// The group container carries the ROLE, the name and the description. Without
|
|
20
|
+
// them the heading was a `<span>` — not a heading either — and the description
|
|
21
|
+
// and the validation error were orphaned text: entering a nested object in a
|
|
22
|
+
// schema form announced the controls with no indication of which group they
|
|
23
|
+
// belonged to. It is the same "named by construction" shape `Field group`
|
|
24
|
+
// uses, for the same reason.
|
|
25
|
+
const describedByIds = [];
|
|
26
|
+
if (description !== undefined)
|
|
27
|
+
describedByIds.push(descriptionId);
|
|
28
|
+
if (error !== undefined)
|
|
29
|
+
describedByIds.push(errorId);
|
|
30
|
+
return (_jsxs("div", { className: groupHeaderClass, children: [_jsx("span", { id: headingId, className: "tai-field-label", children: heading }), description !== undefined ? (_jsx("span", { id: descriptionId, className: "tai-field-hint", children: description })) : null, error !== undefined ? (_jsxs("span", { id: errorId, role: "alert", className: "tai-field-error", children: [_jsx(XCircleIcon, {}), error] })) : null, _jsx("div", { role: "group", "aria-labelledby": headingId, "aria-describedby": describedByIds.length > 0 ? describedByIds.join(' ') : undefined, className: groupClass, children: children })] }));
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=field-group.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-group.js","sourceRoot":"","sources":["../../src/schema-form/field-group.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAG9B,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEpE,MAAM,UAAU,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,EACL,MAAM,EACN,QAAQ,GAOT;IACC,MAAM,MAAM,GAAG,KAAK,EAAE,CAAC;IACvB,MAAM,SAAS,GAAG,GAAG,MAAM,UAAU,CAAC;IACtC,MAAM,aAAa,GAAG,GAAG,MAAM,OAAO,CAAC;IACvC,MAAM,OAAO,GAAG,GAAG,MAAM,MAAM,CAAC;IAEhC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,cAAK,SAAS,EAAE,UAAU,YAAG,QAAQ,GAAO,CAAC;IACtD,CAAC;IAED,8EAA8E;IAC9E,+EAA+E;IAC/E,6EAA6E;IAC7E,4EAA4E;IAC5E,0EAA0E;IAC1E,6BAA6B;IAC7B,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,IAAI,WAAW,KAAK,SAAS;QAAE,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClE,IAAI,KAAK,KAAK,SAAS;QAAE,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEtD,OAAO,CACL,eAAK,SAAS,EAAE,gBAAgB,aAC9B,eAAM,EAAE,EAAE,SAAS,EAAE,SAAS,EAAC,iBAAiB,YAC7C,OAAO,GACH,EACN,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAC3B,eAAM,EAAE,EAAE,aAAa,EAAE,SAAS,EAAC,gBAAgB,YAChD,WAAW,GACP,CACR,CAAC,CAAC,CAAC,IAAI,EACP,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,gBAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAC,OAAO,EAAC,SAAS,EAAC,iBAAiB,aACzD,KAAC,WAAW,KAAG,EACd,KAAK,IACD,CACR,CAAC,CAAC,CAAC,IAAI,EACR,cACE,IAAI,EAAC,OAAO,qBACK,SAAS,sBACR,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,EAClF,SAAS,EAAE,UAAU,YAEpB,QAAQ,GACL,IACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The recursive dispatcher: classifies a single schema node and renders the
|
|
3
|
+
* matching field component for its model kind (const/number/boolean render
|
|
4
|
+
* inline; every other kind delegates to a dedicated field component). Object,
|
|
5
|
+
* array, and union renderers recurse back through here for their children.
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react';
|
|
8
|
+
import type { JsonSchema, SchemaFormErrors } from './types';
|
|
9
|
+
interface FieldNodeProps {
|
|
10
|
+
readonly schema: JsonSchema;
|
|
11
|
+
readonly root: JsonSchema;
|
|
12
|
+
readonly value: unknown;
|
|
13
|
+
readonly onChange: (value: unknown) => void;
|
|
14
|
+
readonly path: string;
|
|
15
|
+
/** The label to show — a property key, array-item caption, or `undefined` at root. */
|
|
16
|
+
readonly label: string | undefined;
|
|
17
|
+
readonly required: boolean;
|
|
18
|
+
readonly errors: SchemaFormErrors | undefined;
|
|
19
|
+
readonly idPrefix: string;
|
|
20
|
+
}
|
|
21
|
+
/** A single schema node, dispatched on its classified model kind. */
|
|
22
|
+
export declare function FieldNode(props: FieldNodeProps): ReactNode;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=field-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-node.d.ts","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAcvC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE5D,UAAU,cAAc;IACtB,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAMD,qEAAqE;AACrE,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,GAAG,SAAS,CAwH1D"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Checkbox } from '../components/checkbox';
|
|
3
|
+
import { Field } from '../components/field';
|
|
4
|
+
import { NumberInput, TextInput } from '../components/inputs';
|
|
5
|
+
import { ArrayField } from './array-field';
|
|
6
|
+
import { classifySchema } from './classify';
|
|
7
|
+
import { EnumField } from './enum-field';
|
|
8
|
+
import { FieldGroup } from './field-group';
|
|
9
|
+
import { ObjectFields } from './object-fields';
|
|
10
|
+
import { scalarLabel } from './resolve';
|
|
11
|
+
import { StringField } from './string-field';
|
|
12
|
+
import { UnionField } from './union-field';
|
|
13
|
+
import { UnsupportedNotice } from './unsupported-notice';
|
|
14
|
+
function labelText(explicit, label) {
|
|
15
|
+
return explicit ?? label ?? 'Value';
|
|
16
|
+
}
|
|
17
|
+
/** A single schema node, dispatched on its classified model kind. */
|
|
18
|
+
export function FieldNode(props) {
|
|
19
|
+
const { schema, root, value, onChange, path, label, required, errors, idPrefix } = props;
|
|
20
|
+
const classified = classifySchema(schema, root);
|
|
21
|
+
const heading = labelText(classified.title, label);
|
|
22
|
+
const description = classified.description;
|
|
23
|
+
const error = errors?.[path];
|
|
24
|
+
const model = classified.model;
|
|
25
|
+
switch (model.kind) {
|
|
26
|
+
case 'unsupported':
|
|
27
|
+
return (_jsx(UnsupportedNotice, { heading: heading, reason: model.reason, description: description, error: error }));
|
|
28
|
+
case 'const':
|
|
29
|
+
return (_jsx(Field, { label: heading, description: description, error: error, children: _jsx(TextInput, { value: scalarLabel(model.value), readOnly: true, disabled: true }) }));
|
|
30
|
+
case 'enum':
|
|
31
|
+
return (_jsx(EnumField, { heading: heading, description: description, error: error, model: model, value: value, onChange: onChange }));
|
|
32
|
+
case 'string':
|
|
33
|
+
return (_jsx(StringField, { heading: heading, description: description, error: error, format: model.format, media: model.media, argName: path, value: value, required: required, onChange: onChange }));
|
|
34
|
+
case 'number':
|
|
35
|
+
return (_jsx(Field, { label: heading, description: description, error: error, children: _jsx(NumberInput, { step: model.integer ? '1' : 'any', value: typeof value === 'number' ? value : '', onChange: (event) => {
|
|
36
|
+
const raw = event.target.value;
|
|
37
|
+
onChange(raw === '' ? undefined : Number(raw));
|
|
38
|
+
} }) }));
|
|
39
|
+
case 'boolean':
|
|
40
|
+
return (_jsx(Field, { label: heading, description: description, error: error, children: _jsx(Checkbox, { checked: value === true, onCheckedChange: (checked) => {
|
|
41
|
+
onChange(checked);
|
|
42
|
+
} }) }));
|
|
43
|
+
case 'array':
|
|
44
|
+
return (_jsx(ArrayField, { heading: heading, description: description, error: error, items: model.items, root: root, value: value, onChange: onChange, path: path, errors: errors, idPrefix: idPrefix }));
|
|
45
|
+
case 'object':
|
|
46
|
+
return (_jsx(FieldGroup, { heading: heading, description: description, error: error, atRoot: path === '', children: _jsx(ObjectFields, { properties: model.properties, requiredKeys: model.required, root: root, value: value, onChange: onChange, path: path, errors: errors, idPrefix: idPrefix, skip: undefined }) }));
|
|
47
|
+
case 'union':
|
|
48
|
+
return (_jsx(UnionField, { heading: heading, description: description, error: error, model: model, root: root, value: value, onChange: onChange, path: path, errors: errors, idPrefix: idPrefix }));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=field-node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-node.js","sourceRoot":"","sources":["../../src/schema-form/field-node.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-driven forms — the load-bearing auto-form renderer, reused by
|
|
3
|
+
* the tools and interactions features. Public surface: the `SchemaForm`
|
|
4
|
+
* component plus the value/validation helpers a caller needs to seed, validate,
|
|
5
|
+
* and submit.
|
|
6
|
+
*/
|
|
7
|
+
export { SchemaForm } from './SchemaForm';
|
|
8
|
+
export type { SchemaFormProps, CompletionProvider } from './SchemaForm';
|
|
9
|
+
export { defaultValueForSchema } from './default-value';
|
|
10
|
+
export { validateAgainstSchema } from './validate';
|
|
11
|
+
export { resolveRef } from './resolve';
|
|
12
|
+
export type { JsonSchema, JsonSchemaType, Discriminator, SchemaFormErrors } from './types';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema-form/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Schema-driven forms — the load-bearing auto-form renderer, reused by
|
|
3
|
+
* the tools and interactions features. Public surface: the `SchemaForm`
|
|
4
|
+
* component plus the value/validation helpers a caller needs to seed, validate,
|
|
5
|
+
* and submit.
|
|
6
|
+
*/
|
|
7
|
+
export { SchemaForm } from './SchemaForm';
|
|
8
|
+
export { defaultValueForSchema } from './default-value';
|
|
9
|
+
export { validateAgainstSchema } from './validate';
|
|
10
|
+
export { resolveRef } from './resolve';
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema-form/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The media-upload string field: a drag-drop surface plus a paste fallback that
|
|
3
|
+
* reads the chosen file client-side and emits the encoded string the schema
|
|
4
|
+
* expects (a base64 body or a full `data:` URL). Every input path enforces the
|
|
5
|
+
* effective byte cap and the declared MIME, rejecting an over-cap value or a
|
|
6
|
+
* mismatched type LOUDLY — never silently truncated or accepted.
|
|
7
|
+
*/
|
|
8
|
+
import type { ReactNode } from 'react';
|
|
9
|
+
import type { MediaUpload } from './classify';
|
|
10
|
+
/**
|
|
11
|
+
* A string field whose schema opts into a file upload. Reads the chosen file
|
|
12
|
+
* client-side and emits the encoded string the schema expects (a base64 body or
|
|
13
|
+
* a full `data:` URL) — bounded by a size cap and the declared MIME, both
|
|
14
|
+
* rejected LOUDLY. A text fallback (paste a URL/base64) stays available.
|
|
15
|
+
*/
|
|
16
|
+
export declare function MediaField({ heading, description, error, media, value, onChange, }: {
|
|
17
|
+
heading: string;
|
|
18
|
+
description: string | undefined;
|
|
19
|
+
error: string | undefined;
|
|
20
|
+
media: MediaUpload;
|
|
21
|
+
value: string;
|
|
22
|
+
onChange: (value: string) => void;
|
|
23
|
+
}): ReactNode;
|
|
24
|
+
//# sourceMappingURL=media-field.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-field.d.ts","sourceRoot":"","sources":["../../src/schema-form/media-field.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AA2E9C;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,EACL,KAAK,EACL,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,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,GAAG,SAAS,CAgHZ"}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useContext, useId, useState } from 'react';
|
|
3
|
+
import { Badge } from '../components/badge';
|
|
4
|
+
import { XCircleIcon } from '../components/icons';
|
|
5
|
+
import { Button } from '../components/primitives';
|
|
6
|
+
import { Field, useFieldControl } from '../components/field';
|
|
7
|
+
import { TextInput } from '../components/inputs';
|
|
8
|
+
import { MaxUploadBytesContext } from './context';
|
|
9
|
+
import { decodedByteSize, effectiveMaxBytes, overCapMessage } from './media';
|
|
10
|
+
/**
|
|
11
|
+
* Add the upload error this module owns to the enclosing `Field`'s wiring.
|
|
12
|
+
*
|
|
13
|
+
* The upload error is raised by the input surfaces themselves rather than by the
|
|
14
|
+
* schema, so `Field` cannot see it: without this the message was announced by
|
|
15
|
+
* nothing and neither surface reported itself invalid. Used only where the
|
|
16
|
+
* element is a bare `<input>`; the SDK's `TextInput` composes the field wiring
|
|
17
|
+
* with the caller's own attributes itself, so the paste fallback states only the
|
|
18
|
+
* error's id and lets it do the joining.
|
|
19
|
+
*/
|
|
20
|
+
function withUploadError(field, uploadErrorId) {
|
|
21
|
+
if (uploadErrorId === undefined)
|
|
22
|
+
return field;
|
|
23
|
+
const describedBy = field['aria-describedby'];
|
|
24
|
+
return {
|
|
25
|
+
...field,
|
|
26
|
+
'aria-describedby': describedBy === undefined ? uploadErrorId : `${describedBy} ${uploadErrorId}`,
|
|
27
|
+
'aria-invalid': true,
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The drag-drop surface + file input. Split out so its `useFieldControl` call
|
|
32
|
+
* runs INSIDE the enclosing {@link Field}, wiring the input's id/aria to the
|
|
33
|
+
* field label (a hook at {@link MediaField}'s top level would read the outer,
|
|
34
|
+
* label-less context instead).
|
|
35
|
+
*/
|
|
36
|
+
function UploadDropZone({ accept, uploadErrorId, onFile, }) {
|
|
37
|
+
const field = withUploadError(useFieldControl(), uploadErrorId);
|
|
38
|
+
return (_jsxs("div", { className: "tai-card tai-stack tai-stack-2",
|
|
39
|
+
// The dashed edge is the drop target's ONLY boundary, so it takes the
|
|
40
|
+
// contrast-safe control border rather than the card's decorative one; the
|
|
41
|
+
// card class still owns the ground, the radius and the padding.
|
|
42
|
+
style: { borderStyle: 'dashed', borderColor: 'var(--tai-color-control-border)' }, onDragOver: (event) => {
|
|
43
|
+
event.preventDefault();
|
|
44
|
+
}, onDrop: (event) => {
|
|
45
|
+
event.preventDefault();
|
|
46
|
+
onFile(event.dataTransfer.files[0]);
|
|
47
|
+
}, children: [_jsx("input", { ...field, type: "file", accept: accept, onChange: (event) => {
|
|
48
|
+
onFile(event.target.files?.[0]);
|
|
49
|
+
// Reset so re-picking the same file fires `change` again.
|
|
50
|
+
event.target.value = '';
|
|
51
|
+
} }), _jsx("span", { className: "tai-field-hint", children: "Drag & drop a file here, or choose one above." })] }));
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A string field whose schema opts into a file upload. Reads the chosen file
|
|
55
|
+
* client-side and emits the encoded string the schema expects (a base64 body or
|
|
56
|
+
* a full `data:` URL) — bounded by a size cap and the declared MIME, both
|
|
57
|
+
* rejected LOUDLY. A text fallback (paste a URL/base64) stays available.
|
|
58
|
+
*/
|
|
59
|
+
export function MediaField({ heading, description, error, media, value, onChange, }) {
|
|
60
|
+
const pasteId = useId();
|
|
61
|
+
const uploadErrorId = useId();
|
|
62
|
+
const defaultMax = useContext(MaxUploadBytesContext);
|
|
63
|
+
const maxBytes = effectiveMaxBytes(media.maxBytes, defaultMax);
|
|
64
|
+
const [uploadError, setUploadError] = useState(undefined);
|
|
65
|
+
const [attached, setAttached] = useState(undefined);
|
|
66
|
+
const accept = (file) => {
|
|
67
|
+
if (file === undefined)
|
|
68
|
+
return;
|
|
69
|
+
void readMediaFile(file, media, maxBytes).then(({ value: encoded, previewUrl }) => {
|
|
70
|
+
setUploadError(undefined);
|
|
71
|
+
setAttached({ name: file.name, previewUrl, value: encoded });
|
|
72
|
+
onChange(encoded);
|
|
73
|
+
}, (reason) => {
|
|
74
|
+
// Reject loudly; keep any previously accepted value untouched.
|
|
75
|
+
setUploadError(reason instanceof Error ? reason.message : String(reason));
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
const clear = () => {
|
|
79
|
+
setUploadError(undefined);
|
|
80
|
+
setAttached(undefined);
|
|
81
|
+
onChange('');
|
|
82
|
+
};
|
|
83
|
+
// The just-picked file's chip/preview applies ONLY while it still matches the
|
|
84
|
+
// current field value; if the value is reset or replaced externally (an edit
|
|
85
|
+
// loads a different record, or the form resets after submit), fall back to a
|
|
86
|
+
// value-derived display so a stale filename/thumbnail can never linger.
|
|
87
|
+
const activeAttached = attached?.value === value ? attached : undefined;
|
|
88
|
+
// Prefer the just-read preview; on an edit with a pre-existing data-url value,
|
|
89
|
+
// reconstruct the preview from the value itself.
|
|
90
|
+
const previewUrl = activeAttached?.previewUrl ??
|
|
91
|
+
(media.encoding === 'data-url' && value.startsWith('data:') ? value : undefined);
|
|
92
|
+
const isImage = media.mediaType?.startsWith('image/') === true || previewUrl?.startsWith('data:image') === true;
|
|
93
|
+
const fileName = activeAttached?.name ?? (value !== '' ? 'Attached file' : undefined);
|
|
94
|
+
return (_jsxs(Field, { label: heading, description: description, error: error, children: [_jsx(UploadDropZone, { accept: media.mediaType, uploadErrorId: uploadError === undefined ? undefined : uploadErrorId, onFile: accept }), fileName !== undefined ? (_jsxs("div", { className: "tai-row", children: [isImage && previewUrl !== undefined ? (_jsx("img", { src: previewUrl, alt: fileName,
|
|
95
|
+
// A thumbnail is per-instance geometry: it is capped to a fixed
|
|
96
|
+
// height and can never exceed the width it is given.
|
|
97
|
+
style: {
|
|
98
|
+
maxWidth: '100%',
|
|
99
|
+
maxHeight: '6rem',
|
|
100
|
+
borderRadius: 'var(--tai-radius-md)',
|
|
101
|
+
border: '1px solid var(--tai-color-control-border)',
|
|
102
|
+
} })) : (_jsx(Badge, { children: fileName })), _jsx(Button, { type: "button", variant: "secondary", onClick: clear, children: "Remove" })] })) : null, uploadError !== undefined ? (_jsxs("span", { id: uploadErrorId, role: "alert", className: "tai-field-error", children: [_jsx(XCircleIcon, {}), uploadError] })) : null, _jsxs("label", { htmlFor: pasteId, className: "tai-field", children: [_jsx("span", { className: "tai-field-hint", children: "Or paste a value" }), _jsx(TextInput, { id: pasteId, type: "text", "aria-describedby": uploadError === undefined ? undefined : uploadErrorId, "aria-invalid": uploadError === undefined ? undefined : true, value: value, onChange: (event) => {
|
|
103
|
+
const next = event.target.value;
|
|
104
|
+
// The same effective cap the picker enforces, measured on the pasted
|
|
105
|
+
// string's DECODED byte size. Reject over-cap LOUDLY; never accept or
|
|
106
|
+
// truncate — the field keeps its prior value.
|
|
107
|
+
const size = decodedByteSize(next);
|
|
108
|
+
if (size > maxBytes) {
|
|
109
|
+
setUploadError(overCapMessage('The pasted value', size, maxBytes));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
setUploadError(undefined);
|
|
113
|
+
setAttached(undefined);
|
|
114
|
+
onChange(next);
|
|
115
|
+
} })] })] }));
|
|
116
|
+
}
|
|
117
|
+
/** Compare a file's MIME against a `contentMediaType` pattern (`image/*` etc.). */
|
|
118
|
+
function matchesMediaType(fileType, pattern) {
|
|
119
|
+
// An empty file type is genuinely unknown (jsdom / OS gaps) — the server still
|
|
120
|
+
// validates, so we do not fabricate a mismatch here; only a KNOWN wrong type
|
|
121
|
+
// is rejected.
|
|
122
|
+
if (fileType === '')
|
|
123
|
+
return true;
|
|
124
|
+
const [patType, patSub] = pattern.toLowerCase().split('/');
|
|
125
|
+
const [fileMain, fileSub] = fileType.toLowerCase().split('/');
|
|
126
|
+
if (patType !== fileMain)
|
|
127
|
+
return false;
|
|
128
|
+
return patSub === '*' || patSub === fileSub;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Validate a chosen file against the media contract and read it into the encoded
|
|
132
|
+
* string the schema expects. Rejects an over-cap file or a MIME that does not
|
|
133
|
+
* match `contentMediaType` — never truncates, never silently accepts.
|
|
134
|
+
*/
|
|
135
|
+
async function readMediaFile(file, media, maxBytes) {
|
|
136
|
+
if (file.size > maxBytes) {
|
|
137
|
+
throw new Error(overCapMessage(`"${file.name}"`, file.size, maxBytes));
|
|
138
|
+
}
|
|
139
|
+
if (media.mediaType !== undefined && !matchesMediaType(file.type, media.mediaType)) {
|
|
140
|
+
throw new Error(`"${file.name}" is ${file.type === '' ? 'an unknown type' : file.type}, which does not match the required ${media.mediaType}.`);
|
|
141
|
+
}
|
|
142
|
+
const dataUrl = await readAsDataUrl(file);
|
|
143
|
+
const comma = dataUrl.indexOf(',');
|
|
144
|
+
if (comma < 0) {
|
|
145
|
+
throw new Error(`Could not read "${file.name}" as an encoded value.`);
|
|
146
|
+
}
|
|
147
|
+
const body = dataUrl.slice(comma + 1);
|
|
148
|
+
return { value: media.encoding === 'data-url' ? dataUrl : body, previewUrl: dataUrl };
|
|
149
|
+
}
|
|
150
|
+
function readAsDataUrl(file) {
|
|
151
|
+
return new Promise((resolve, reject) => {
|
|
152
|
+
const reader = new FileReader();
|
|
153
|
+
reader.onload = () => {
|
|
154
|
+
// A successful read must yield the data-url string; anything else is a real
|
|
155
|
+
// read anomaly and rejects loudly rather than emitting an empty value.
|
|
156
|
+
if (typeof reader.result === 'string') {
|
|
157
|
+
resolve(reader.result);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
reject(new Error(`Failed to read "${file.name}" as a data URL.`));
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
reader.onerror = () => {
|
|
164
|
+
reject(reader.error ?? new Error(`Failed to read "${file.name}".`));
|
|
165
|
+
};
|
|
166
|
+
reader.readAsDataURL(file);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
//# sourceMappingURL=media-field.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-field.js","sourceRoot":"","sources":["../../src/schema-form/media-field.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared byte-cap logic for media-upload string fields, used by EVERY path that
|
|
3
|
+
* can set a media field's value: the file picker, the "paste a value" fallback,
|
|
4
|
+
* and the pre-submit validation pass. Centralised here so the effective cap and
|
|
5
|
+
* the decoded byte size are computed IDENTICALLY on all three paths.
|
|
6
|
+
*
|
|
7
|
+
* `contentMaxBytes` is a NONSTANDARD JSON-Schema extension keyword — a standard
|
|
8
|
+
* JSON-Schema validator ignores it. These client-side caps are UX guards that
|
|
9
|
+
* fail LOUDLY and early on the obvious over-cap input; they are NOT a security
|
|
10
|
+
* boundary. The SERVER MUST independently validate the decoded size of any
|
|
11
|
+
* uploaded content.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Default cap for a media-upload field when neither the schema's `contentMaxBytes`
|
|
15
|
+
* nor the host's `maxUploadBytes` prop pins one. 10 MiB comfortably fits a typical
|
|
16
|
+
* image or PDF while still rejecting a runaway upload loudly.
|
|
17
|
+
*/
|
|
18
|
+
export declare const DEFAULT_MAX_UPLOAD_BYTES: number;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the effective byte cap for a media field. Precedence: the schema's
|
|
21
|
+
* per-field `contentMaxBytes` wins (the only channel by which the schema-authoring
|
|
22
|
+
* party states a per-field cap), else the host's `maxUploadBytes` default, else
|
|
23
|
+
* {@link DEFAULT_MAX_UPLOAD_BYTES}.
|
|
24
|
+
*/
|
|
25
|
+
export declare function effectiveMaxBytes(fieldCap: number | undefined, propCap: number | undefined): number;
|
|
26
|
+
/**
|
|
27
|
+
* The DECODED byte size of a media field's string value. The value is either a
|
|
28
|
+
* raw base64 body or a full `data:<mime>;base64,<body>` URL; the cap applies to
|
|
29
|
+
* the decoded bytes, never the character length. Computed arithmetically from the
|
|
30
|
+
* base64 length and its `=` padding, so an over-cap value is caught without
|
|
31
|
+
* allocating the decoded buffer and without throwing on a malformed input.
|
|
32
|
+
*/
|
|
33
|
+
export declare function decodedByteSize(value: string): number;
|
|
34
|
+
/**
|
|
35
|
+
* The loud, user-visible over-cap message, identical across the picker, the paste
|
|
36
|
+
* fallback, and validation. `subject` names the rejected input (e.g. a quoted
|
|
37
|
+
* filename, or `"The pasted value"`).
|
|
38
|
+
*/
|
|
39
|
+
export declare function overCapMessage(subject: string, actualBytes: number, maxBytes: number): string;
|
|
40
|
+
//# sourceMappingURL=media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.d.ts","sourceRoot":"","sources":["../../src/schema-form/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,QAAmB,CAAC;AAEzD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWrD;AAUD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE7F"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared byte-cap logic for media-upload string fields, used by EVERY path that
|
|
3
|
+
* can set a media field's value: the file picker, the "paste a value" fallback,
|
|
4
|
+
* and the pre-submit validation pass. Centralised here so the effective cap and
|
|
5
|
+
* the decoded byte size are computed IDENTICALLY on all three paths.
|
|
6
|
+
*
|
|
7
|
+
* `contentMaxBytes` is a NONSTANDARD JSON-Schema extension keyword — a standard
|
|
8
|
+
* JSON-Schema validator ignores it. These client-side caps are UX guards that
|
|
9
|
+
* fail LOUDLY and early on the obvious over-cap input; they are NOT a security
|
|
10
|
+
* boundary. The SERVER MUST independently validate the decoded size of any
|
|
11
|
+
* uploaded content.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Default cap for a media-upload field when neither the schema's `contentMaxBytes`
|
|
15
|
+
* nor the host's `maxUploadBytes` prop pins one. 10 MiB comfortably fits a typical
|
|
16
|
+
* image or PDF while still rejecting a runaway upload loudly.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_MAX_UPLOAD_BYTES = 10 * 1024 * 1024;
|
|
19
|
+
/**
|
|
20
|
+
* Resolve the effective byte cap for a media field. Precedence: the schema's
|
|
21
|
+
* per-field `contentMaxBytes` wins (the only channel by which the schema-authoring
|
|
22
|
+
* party states a per-field cap), else the host's `maxUploadBytes` default, else
|
|
23
|
+
* {@link DEFAULT_MAX_UPLOAD_BYTES}.
|
|
24
|
+
*/
|
|
25
|
+
export function effectiveMaxBytes(fieldCap, propCap) {
|
|
26
|
+
return fieldCap ?? propCap ?? DEFAULT_MAX_UPLOAD_BYTES;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The DECODED byte size of a media field's string value. The value is either a
|
|
30
|
+
* raw base64 body or a full `data:<mime>;base64,<body>` URL; the cap applies to
|
|
31
|
+
* the decoded bytes, never the character length. Computed arithmetically from the
|
|
32
|
+
* base64 length and its `=` padding, so an over-cap value is caught without
|
|
33
|
+
* allocating the decoded buffer and without throwing on a malformed input.
|
|
34
|
+
*/
|
|
35
|
+
export function decodedByteSize(value) {
|
|
36
|
+
// A data-url carries the base64 body after the first comma; a bare base64 value
|
|
37
|
+
// is the body itself.
|
|
38
|
+
const comma = value.indexOf(',');
|
|
39
|
+
const body = value.startsWith('data:') && comma >= 0 ? value.slice(comma + 1) : value;
|
|
40
|
+
// base64 decodes 4 chars → 3 bytes; drop whitespace and subtract the trailing
|
|
41
|
+
// `=` padding the encoder added.
|
|
42
|
+
const compact = body.replace(/\s/g, '');
|
|
43
|
+
if (compact === '')
|
|
44
|
+
return 0;
|
|
45
|
+
const padding = compact.endsWith('==') ? 2 : compact.endsWith('=') ? 1 : 0;
|
|
46
|
+
return Math.floor((compact.length * 3) / 4) - padding;
|
|
47
|
+
}
|
|
48
|
+
/** Human-readable byte size for a cap/overage message (`5 B`, `1.5 KB`, `2.0 MB`). */
|
|
49
|
+
function formatBytes(bytes) {
|
|
50
|
+
if (bytes < 1024)
|
|
51
|
+
return `${String(bytes)} B`;
|
|
52
|
+
const kb = bytes / 1024;
|
|
53
|
+
if (kb < 1024)
|
|
54
|
+
return `${kb.toFixed(1)} KB`;
|
|
55
|
+
return `${(kb / 1024).toFixed(1)} MB`;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The loud, user-visible over-cap message, identical across the picker, the paste
|
|
59
|
+
* fallback, and validation. `subject` names the rejected input (e.g. a quoted
|
|
60
|
+
* filename, or `"The pasted value"`).
|
|
61
|
+
*/
|
|
62
|
+
export function overCapMessage(subject, actualBytes, maxBytes) {
|
|
63
|
+
return `${subject} is ${formatBytes(actualBytes)}, over the ${formatBytes(maxBytes)} limit.`;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=media.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media.js","sourceRoot":"","sources":["../../src/schema-form/media.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA4B,EAC5B,OAA2B;IAE3B,OAAO,QAAQ,IAAI,OAAO,IAAI,wBAAwB,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,gFAAgF;IAChF,sBAAsB;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACtF,8EAA8E;IAC9E,iCAAiC;IACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,OAAO,KAAK,EAAE;QAAE,OAAO,CAAC,CAAC;IAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC;AACxD,CAAC;AAED,sFAAsF;AACtF,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9C,MAAM,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC;IACxB,IAAI,EAAE,GAAG,IAAI;QAAE,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC5C,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,WAAmB,EAAE,QAAgB;IACnF,OAAO,GAAG,OAAO,OAAO,WAAW,CAAC,WAAW,CAAC,cAAc,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC/F,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renders the property fields of an object schema, one {@link FieldNode} per
|
|
3
|
+
* property. Each child's edits are folded back into an immutable copy of the
|
|
4
|
+
* object value; an optional `skip` omits a property (used for a union's
|
|
5
|
+
* discriminator tag, which the variant picker owns).
|
|
6
|
+
*/
|
|
7
|
+
import type { ReactNode } from 'react';
|
|
8
|
+
import type { JsonSchema, SchemaFormErrors } from './types';
|
|
9
|
+
export declare function ObjectFields({ properties, requiredKeys, root, value, onChange, path, errors, idPrefix, skip, }: {
|
|
10
|
+
properties: readonly (readonly [string, JsonSchema])[];
|
|
11
|
+
requiredKeys: ReadonlySet<string>;
|
|
12
|
+
root: JsonSchema;
|
|
13
|
+
value: unknown;
|
|
14
|
+
onChange: (value: unknown) => void;
|
|
15
|
+
path: string;
|
|
16
|
+
errors: SchemaFormErrors | undefined;
|
|
17
|
+
idPrefix: string;
|
|
18
|
+
skip: string | undefined;
|
|
19
|
+
}): ReactNode;
|
|
20
|
+
//# sourceMappingURL=object-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-fields.d.ts","sourceRoot":"","sources":["../../src/schema-form/object-fields.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAM5D,wBAAgB,YAAY,CAAC,EAC3B,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,IAAI,GACL,EAAE;IACD,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC;IACvD,YAAY,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B,GAAG,SAAS,CA0BZ"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { FieldNode } from './field-node';
|
|
3
|
+
function isPlainObject(value) {
|
|
4
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
export function ObjectFields({ properties, requiredKeys, root, value, onChange, path, errors, idPrefix, skip, }) {
|
|
7
|
+
const obj = isPlainObject(value) ? value : {};
|
|
8
|
+
return (_jsx(_Fragment, { children: properties.map(([name, propSchema]) => {
|
|
9
|
+
if (skip !== undefined && name === skip)
|
|
10
|
+
return null;
|
|
11
|
+
const childPath = path === '' ? name : `${path}.${name}`;
|
|
12
|
+
return (_jsx(FieldNode, { schema: propSchema, root: root, value: obj[name], onChange: (next) => {
|
|
13
|
+
onChange(setKey(obj, name, next));
|
|
14
|
+
}, path: childPath, label: name, required: requiredKeys.has(name), errors: errors, idPrefix: idPrefix }, name));
|
|
15
|
+
}) }));
|
|
16
|
+
}
|
|
17
|
+
function setKey(obj, name, next) {
|
|
18
|
+
if (next === undefined) {
|
|
19
|
+
const { [name]: _removed, ...rest } = obj;
|
|
20
|
+
return rest;
|
|
21
|
+
}
|
|
22
|
+
return { ...obj, [name]: next };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=object-fields.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"object-fields.js","sourceRoot":"","sources":["../../src/schema-form/object-fields.tsx"],"names":[],"mappings":";AAQA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,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,MAAM,UAAU,YAAY,CAAC,EAC3B,UAAU,EACV,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,MAAM,EACN,QAAQ,EACR,IAAI,GAWL;IACC,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,OAAO,CACL,4BACG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,EAAE;YACrC,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;YACzD,OAAO,CACL,KAAC,SAAS,IAER,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,EAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;oBACjB,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;gBACpC,CAAC,EACD,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,QAAQ,IAXb,IAAI,CAYT,CACH,CAAC;QACJ,CAAC,CAAC,GACD,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,GAA4B,EAC5B,IAAY,EACZ,IAAa;IAEb,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QAC1C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure helpers over the JSON-Schema subset: `$ref`/`$defs` resolution and the
|
|
3
|
+
* small predicates the renderer, defaulting, and validation all share. Kept
|
|
4
|
+
* side-effect-free so they can be unit-tested and reused across the module.
|
|
5
|
+
*/
|
|
6
|
+
import type { JsonSchema, JsonSchemaType } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Resolve an internal `$ref` against the document root, following chained refs
|
|
9
|
+
* (a `$ref` whose target is itself a `$ref`). Only same-document pointers are
|
|
10
|
+
* supported (`#/$defs/Name`, `#/definitions/Name`, `#`); an external or
|
|
11
|
+
* unresolvable ref throws LOUDLY rather than yielding a silent empty schema.
|
|
12
|
+
* A schema with no `$ref` is returned unchanged. A pointer cycle throws.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveRef(schema: JsonSchema, root: JsonSchema): JsonSchema;
|
|
15
|
+
/** Does this schema describe the JSON `null` type (and nothing else)? */
|
|
16
|
+
export declare function isNullSchema(schema: JsonSchema): boolean;
|
|
17
|
+
/** The list of type tokens a schema declares, normalized to an array. */
|
|
18
|
+
export declare function typeList(schema: JsonSchema): readonly JsonSchemaType[];
|
|
19
|
+
/**
|
|
20
|
+
* The union member list from a schema, if it is a union. Pydantic emits
|
|
21
|
+
* discriminated unions under `oneOf` and plain/null unions under `anyOf`; both
|
|
22
|
+
* are treated as a union here. `allOf` is NOT a union (it is an intersection)
|
|
23
|
+
* and is not returned.
|
|
24
|
+
*/
|
|
25
|
+
export declare function unionMembers(schema: JsonSchema): readonly JsonSchema[] | undefined;
|
|
26
|
+
/** An option row derived from an `enum` or a discriminated variant tag. */
|
|
27
|
+
export interface EnumOption {
|
|
28
|
+
readonly value: unknown;
|
|
29
|
+
readonly label: string;
|
|
30
|
+
}
|
|
31
|
+
/** Render-facing label for an arbitrary JSON scalar used as an enum/const value. */
|
|
32
|
+
export declare function scalarLabel(value: unknown): string;
|
|
33
|
+
/**
|
|
34
|
+
* The single tag value a discriminated-union variant pins on the discriminator
|
|
35
|
+
* property (Pydantic emits it as `const`, or a single-entry `enum`), or
|
|
36
|
+
* `undefined` if the variant does not constrain that property to one value.
|
|
37
|
+
*/
|
|
38
|
+
export declare function variantTag(variant: JsonSchema, propertyName: string, root: JsonSchema): unknown;
|
|
39
|
+
/** A human label for a union variant: its title, its tag, or a positional fallback. */
|
|
40
|
+
export declare function variantLabel(variant: JsonSchema, index: number, discriminatorTag: unknown, root: JsonSchema): string;
|
|
41
|
+
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/schema-form/resolve.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAO1D;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CA0B3E;AAED,yEAAyE;AACzE,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAExD;AAED,yEAAyE;AACzE,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,cAAc,EAAE,CAKtE;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE,GAAG,SAAS,CAIlF;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKlD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAS/F;AAED,uFAAuF;AACvF,wBAAgB,YAAY,CAC1B,OAAO,EAAE,UAAU,EACnB,KAAK,EAAE,MAAM,EACb,gBAAgB,EAAE,OAAO,EACzB,IAAI,EAAE,UAAU,GACf,MAAM,CAKR"}
|