@dxos/react-ui-form 0.8.4-main.fffef41 → 0.9.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 +102 -5
- package/README.md +0 -1
- package/dist/lib/browser/index.mjs +4005 -2402
- package/dist/lib/browser/index.mjs.map +4 -4
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/translations.mjs +87 -0
- package/dist/lib/browser/translations.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +4005 -2402
- package/dist/lib/node-esm/index.mjs.map +4 -4
- package/dist/lib/node-esm/meta.json +1 -1
- package/dist/lib/node-esm/translations.mjs +89 -0
- package/dist/lib/node-esm/translations.mjs.map +7 -0
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +8 -7
- package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
- package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +73 -59
- package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.d.ts +135 -27
- package/dist/types/src/components/Form/Form.d.ts.map +1 -1
- package/dist/types/src/components/Form/Form.stories.d.ts +192 -137
- package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
- package/dist/types/src/components/Form/FormField.d.ts +52 -0
- package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldComponent.d.ts +98 -0
- package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts +9 -0
- package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormFieldSet.d.ts +26 -0
- package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
- package/dist/types/src/components/Form/FormTooltipsContext.d.ts +19 -0
- package/dist/types/src/components/Form/FormTooltipsContext.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/FormLayout.d.ts +50 -0
- package/dist/types/src/components/Form/Layout/FormLayout.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts +123 -0
- package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts +2 -0
- package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts +2 -0
- package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/annotation.d.ts +30 -0
- package/dist/types/src/components/Form/Layout/annotation.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/index.d.ts +4 -0
- package/dist/types/src/components/Form/Layout/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/parser.d.ts +31 -0
- package/dist/types/src/components/Form/Layout/parser.d.ts.map +1 -0
- package/dist/types/src/components/Form/Layout/parser.test.d.ts +2 -0
- package/dist/types/src/components/Form/Layout/parser.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
- package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
- package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/DateField.d.ts +4 -0
- package/dist/types/src/components/Form/fields/DateField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
- package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/InlineRefField.d.ts +13 -0
- package/dist/types/src/components/Form/fields/InlineRefField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/MarkdownField.d.ts +11 -0
- package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts +89 -0
- package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
- package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/RefField.d.ts +34 -0
- package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/RefField.test.d.ts +2 -0
- package/dist/types/src/components/Form/fields/RefField.test.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/SelectField.d.ts +13 -0
- package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
- package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts +89 -0
- package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
- package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
- package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
- package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
- package/dist/types/src/components/Form/fields/index.d.ts +14 -0
- package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
- package/dist/types/src/components/Form/index.d.ts +5 -4
- package/dist/types/src/components/Form/index.d.ts.map +1 -1
- package/dist/types/src/components/Form/meta-tags.d.ts +30 -0
- package/dist/types/src/components/Form/meta-tags.d.ts.map +1 -0
- package/dist/types/src/components/Form/meta-tags.test.d.ts +2 -0
- package/dist/types/src/components/Form/meta-tags.test.d.ts.map +1 -0
- package/dist/types/src/components/ObjectForm/ObjectForm.d.ts +8 -0
- package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -0
- package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts +87 -0
- package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts.map +1 -0
- package/dist/types/src/components/ObjectForm/index.d.ts +2 -0
- package/dist/types/src/components/ObjectForm/index.d.ts.map +1 -0
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +39 -12
- package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -1
- package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +69 -58
- package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -1
- package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +9 -0
- package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -0
- package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts +132 -0
- package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts.map +1 -0
- package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts +2 -0
- package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts.map +1 -0
- package/dist/types/src/components/ObjectProperties/index.d.ts +2 -0
- package/dist/types/src/components/ObjectProperties/index.d.ts.map +1 -0
- package/dist/types/src/components/ObjectTree/ObjectTree.d.ts +9 -0
- package/dist/types/src/components/ObjectTree/ObjectTree.d.ts.map +1 -0
- package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts +91 -0
- package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts.map +1 -0
- package/dist/types/src/components/ObjectTree/index.d.ts +2 -0
- package/dist/types/src/components/ObjectTree/index.d.ts.map +1 -0
- package/dist/types/src/components/RefEditor/RefEditor.d.ts +73 -0
- package/dist/types/src/components/RefEditor/RefEditor.d.ts.map +1 -0
- package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts +92 -0
- package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts.map +1 -0
- package/dist/types/src/components/RefEditor/index.d.ts +3 -0
- package/dist/types/src/components/RefEditor/index.d.ts.map +1 -0
- package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts +47 -0
- package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts.map +1 -0
- package/dist/types/src/components/Settings/Settings.d.ts +51 -0
- package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
- package/dist/types/src/components/Settings/Settings.stories.d.ts +89 -0
- package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
- package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +43 -0
- package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +1 -0
- package/dist/types/src/components/Settings/SettingsItem.d.ts +16 -0
- package/dist/types/src/components/Settings/SettingsItem.d.ts.map +1 -0
- package/dist/types/src/components/Settings/SettingsSelectField.d.ts +18 -0
- package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +1 -0
- package/dist/types/src/components/Settings/index.d.ts +4 -0
- package/dist/types/src/components/Settings/index.d.ts.map +1 -0
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +15 -19
- package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +75 -64
- package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
- package/dist/types/src/components/index.d.ts +5 -1
- package/dist/types/src/components/index.d.ts.map +1 -1
- package/dist/types/src/components/testing.d.ts +13 -6
- package/dist/types/src/components/testing.d.ts.map +1 -1
- package/dist/types/src/hooks/index.d.ts +2 -3
- package/dist/types/src/hooks/index.d.ts.map +1 -1
- package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
- package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
- package/dist/types/src/hooks/useKeyHandler.d.ts +7 -0
- package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
- package/dist/types/src/index.d.ts +0 -2
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/translations.d.ts +70 -59
- package/dist/types/src/translations.d.ts.map +1 -1
- package/dist/types/src/util/field-type.d.ts +19 -0
- package/dist/types/src/util/field-type.d.ts.map +1 -0
- package/dist/types/src/util/field.d.ts +3 -3
- package/dist/types/src/util/field.d.ts.map +1 -1
- package/dist/types/src/util/formatting.d.ts +2 -2
- package/dist/types/src/util/formatting.d.ts.map +1 -1
- package/dist/types/src/util/index.d.ts +2 -1
- package/dist/types/src/util/index.d.ts.map +1 -1
- package/dist/types/src/util/properties.d.ts +35 -0
- package/dist/types/src/util/properties.d.ts.map +1 -0
- package/dist/types/src/util/properties.test.d.ts +2 -0
- package/dist/types/src/util/properties.test.d.ts.map +1 -0
- package/dist/types/src/util/refs.d.ts +2 -2
- package/dist/types/src/util/refs.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +64 -52
- package/src/components/FieldEditor/FieldEditor.stories.tsx +44 -25
- package/src/components/FieldEditor/FieldEditor.test.tsx +4 -2
- package/src/components/FieldEditor/FieldEditor.tsx +91 -86
- package/src/components/Form/AUDIT.md +17 -0
- package/src/components/Form/Form.stories.tsx +147 -252
- package/src/components/Form/Form.tsx +461 -108
- package/src/components/Form/FormField.tsx +345 -0
- package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
- package/src/components/Form/FormFieldComponent.tsx +253 -0
- package/src/components/Form/FormFieldSet.tsx +213 -0
- package/src/components/Form/FormTooltipsContext.ts +25 -0
- package/src/components/Form/Layout/FormLayout.stories.test.tsx +51 -0
- package/src/components/Form/Layout/FormLayout.stories.tsx +422 -0
- package/src/components/Form/Layout/FormLayout.test.ts +59 -0
- package/src/components/Form/Layout/FormLayout.tsx +251 -0
- package/src/components/Form/Layout/annotation.ts +38 -0
- package/src/components/Form/Layout/index.ts +7 -0
- package/src/components/Form/Layout/parser.test.ts +120 -0
- package/src/components/Form/Layout/parser.ts +167 -0
- package/src/components/Form/README.md +3 -0
- package/src/components/Form/fields/ArrayField.tsx +173 -0
- package/src/components/Form/fields/BooleanField.tsx +22 -0
- package/src/components/Form/fields/DateField.tsx +101 -0
- package/src/components/Form/fields/GeoPointField.tsx +124 -0
- package/src/components/Form/fields/InlineRefField.tsx +138 -0
- package/src/components/Form/fields/MarkdownField.stories.tsx +206 -0
- package/src/components/Form/fields/MarkdownField.tsx +167 -0
- package/src/components/Form/fields/NumberField.tsx +76 -0
- package/src/components/Form/fields/RefField.test.ts +45 -0
- package/src/components/Form/fields/RefField.tsx +266 -0
- package/src/components/Form/fields/SelectField.tsx +77 -0
- package/src/components/Form/{custom/SelectOptionsInput.stories.tsx → fields/SelectOptionField.stories.tsx} +23 -18
- package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +33 -26
- package/src/components/Form/fields/TextAreaField.tsx +38 -0
- package/src/components/Form/fields/TextField.tsx +38 -0
- package/src/components/Form/{custom/TupleInput.tsx → fields/TupleField.tsx} +17 -9
- package/src/components/Form/fields/index.ts +17 -0
- package/src/components/Form/index.ts +6 -4
- package/src/components/Form/meta-tags.test.ts +47 -0
- package/src/components/Form/meta-tags.ts +33 -0
- package/src/components/ObjectForm/ObjectForm.stories.tsx +62 -0
- package/src/components/ObjectForm/ObjectForm.tsx +111 -0
- package/src/components/{ControlSection → ObjectForm}/index.ts +1 -1
- package/src/components/ObjectPicker/ObjectPicker.stories.tsx +26 -21
- package/src/components/ObjectPicker/ObjectPicker.tsx +123 -82
- package/src/components/ObjectProperties/ObjectProperties.stories.tsx +350 -0
- package/src/components/ObjectProperties/ObjectProperties.test.tsx +111 -0
- package/src/components/ObjectProperties/ObjectProperties.tsx +146 -0
- package/src/components/ObjectProperties/index.ts +5 -0
- package/src/components/ObjectTree/ObjectTree.stories.tsx +134 -0
- package/src/components/ObjectTree/ObjectTree.tsx +190 -0
- package/src/components/ObjectTree/index.ts +5 -0
- package/src/components/RefEditor/RefEditor.stories.tsx +148 -0
- package/src/components/RefEditor/RefEditor.tsx +275 -0
- package/src/components/RefEditor/index.ts +6 -0
- package/src/components/RefEditor/ref-editor-extension.ts +254 -0
- package/src/components/Settings/AUDIT.md +51 -0
- package/src/components/Settings/Settings.stories.tsx +104 -0
- package/src/components/Settings/Settings.tsx +81 -0
- package/src/components/Settings/SettingsFieldSet.tsx +257 -0
- package/src/components/Settings/SettingsItem.tsx +58 -0
- package/src/components/Settings/SettingsSelectField.tsx +59 -0
- package/src/components/Settings/index.ts +7 -0
- package/src/components/ViewEditor/ViewEditor.stories.tsx +70 -76
- package/src/components/ViewEditor/ViewEditor.test.tsx +17 -13
- package/src/components/ViewEditor/ViewEditor.tsx +340 -226
- package/src/components/index.ts +5 -1
- package/src/components/testing.tsx +24 -11
- package/src/hooks/index.ts +2 -3
- package/src/hooks/useFormHandler.ts +380 -0
- package/src/hooks/useKeyHandler.tsx +37 -0
- package/src/index.ts +0 -4
- package/src/translations.ts +76 -64
- package/src/util/field-type.ts +60 -0
- package/src/util/field.ts +25 -25
- package/src/util/formatting.ts +22 -22
- package/src/util/index.ts +2 -1
- package/src/util/properties.test.ts +153 -0
- package/src/util/properties.ts +100 -0
- package/src/util/refs.ts +16 -15
- package/src/vite-env.d.ts +10 -0
- package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
- package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
- package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +0 -83
- package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
- package/dist/types/src/components/ControlSection/index.d.ts +0 -2
- package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
- package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
- package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
- package/dist/types/src/components/Form/Defaults.d.ts +0 -14
- package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormActions.d.ts +0 -9
- package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormContent.d.ts +0 -63
- package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
- package/dist/types/src/components/Form/FormContext.d.ts +0 -23
- package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
- package/dist/types/src/components/Form/Input.d.ts +0 -29
- package/dist/types/src/components/Form/Input.d.ts.map +0 -1
- package/dist/types/src/components/Form/RefField.d.ts +0 -22
- package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
- package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
- package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
- package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
- package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
- package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +0 -78
- package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
- package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
- package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
- package/dist/types/src/components/Form/custom/index.d.ts +0 -4
- package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
- package/dist/types/src/components/Form/factory.d.ts +0 -8
- package/dist/types/src/components/Form/factory.d.ts.map +0 -1
- package/dist/types/src/hooks/useForm.d.ts +0 -67
- package/dist/types/src/hooks/useForm.d.ts.map +0 -1
- package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -29
- package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
- package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
- package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
- package/dist/types/src/util/schema.d.ts +0 -3
- package/dist/types/src/util/schema.d.ts.map +0 -1
- package/src/components/ControlSection/ControlSection.stories.tsx +0 -38
- package/src/components/ControlSection/ControlSection.tsx +0 -153
- package/src/components/Form/ArrayField.tsx +0 -125
- package/src/components/Form/Defaults.tsx +0 -205
- package/src/components/Form/FormActions.tsx +0 -54
- package/src/components/Form/FormContent.tsx +0 -362
- package/src/components/Form/FormContext.tsx +0 -110
- package/src/components/Form/Input.tsx +0 -54
- package/src/components/Form/RefField.tsx +0 -283
- package/src/components/Form/custom/GeoPointInput.tsx +0 -80
- package/src/components/Form/custom/index.ts +0 -7
- package/src/components/Form/factory.tsx +0 -31
- package/src/hooks/useForm.ts +0 -296
- package/src/hooks/useQueryRefOptions.ts +0 -62
- package/src/hooks/useRefQueryLookupHandler.ts +0 -39
- package/src/util/schema.ts +0 -12
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as Schema from 'effect/Schema';
|
|
2
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { type AnyProperties } from '@dxos/echo/internal';
|
|
5
|
+
import { type FormFieldProps } from '../FormField';
|
|
6
|
+
export type FormLayoutProps = {
|
|
7
|
+
/**
|
|
8
|
+
* Template string in the FormLayout DSL (`<grid cols=…><field name=…/></grid>`).
|
|
9
|
+
* If omitted, the layout is read from the schema's `FormLayoutAnnotation` —
|
|
10
|
+
* the entry named by `name` (default: `'default'`).
|
|
11
|
+
*/
|
|
12
|
+
template?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Picks a named layout out of `FormLayoutAnnotation`'s map when no
|
|
15
|
+
* explicit `template` is supplied. Defaults to `'default'`.
|
|
16
|
+
*/
|
|
17
|
+
name?: string;
|
|
18
|
+
} & Pick<FormFieldSetSubset, 'schema' | 'path' | 'readonly' | 'layout' | 'projection' | 'fieldMap' | 'fieldProvider'>;
|
|
19
|
+
type FormFieldSetSubset = Pick<FormFieldProps, 'path' | 'readonly' | 'layout' | 'projection' | 'fieldMap' | 'fieldProvider'> & {
|
|
20
|
+
schema: Schema.Schema<AnyProperties>;
|
|
21
|
+
};
|
|
22
|
+
export declare function FormLayout({ schema, template, name, path, readonly, layout, projection, ...props }: FormLayoutProps): React.JSX.Element;
|
|
23
|
+
export declare namespace FormLayout {
|
|
24
|
+
var displayName: string;
|
|
25
|
+
}
|
|
26
|
+
export type ResolvedLayoutField = {
|
|
27
|
+
/** Resolved leaf AST node for the field. */
|
|
28
|
+
type: SchemaAST.AST;
|
|
29
|
+
/** Path segments (dotted names split on `.`). */
|
|
30
|
+
segments: string[];
|
|
31
|
+
/** Last path segment; used to derive the field label when there is no `title` annotation. */
|
|
32
|
+
leafName: string;
|
|
33
|
+
/** Resolved `title` annotation for the field, if any. */
|
|
34
|
+
title?: string;
|
|
35
|
+
/**
|
|
36
|
+
* Set when the field resolves to a nested struct carrying a `LabelAnnotation` —
|
|
37
|
+
* the type literal whose computed label should render in place of the struct's
|
|
38
|
+
* sub-fields. Undefined for ordinary (non-auto-labelled) fields.
|
|
39
|
+
*/
|
|
40
|
+
labelType?: SchemaAST.AST;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Resolves a (possibly dotted) layout field name against a schema.
|
|
44
|
+
* - `origin.code` drills through nested structs to the leaf field.
|
|
45
|
+
* - A name resolving to a nested struct with a `LabelAnnotation` is flagged via
|
|
46
|
+
* `labelType` so the layout can auto-convert it to a single read-only label.
|
|
47
|
+
* Returns `undefined` when the name does not resolve to a property.
|
|
48
|
+
*/
|
|
49
|
+
export declare const resolveLayoutField: (schema: Schema.Schema<any>, name: string) => ResolvedLayoutField | undefined;
|
|
50
|
+
//# sourceMappingURL=FormLayout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormLayout.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/FormLayout.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAA4B,MAAM,OAAO,CAAC;AAGjD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAKzD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9D,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,CAAC,CAAC;AAEtH,KAAK,kBAAkB,GAAG,IAAI,CAC5B,cAAc,EACd,MAAM,GAAG,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,GAAG,eAAe,CAC7E,GAAG;IACF,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;CACtC,CAAC;mCAcyB,EACzB,MAAM,EACN,QAAQ,EACR,IAA0B,EAC1B,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,UAAU,EACV,GAAG,KAAK,EACT,EAAE,eAAe;;;;AAyElB,MAAM,MAAM,mBAAmB,GAAG;IAChC,4CAA4C;IAC5C,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC;IACpB,iDAAiD;IACjD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,6FAA6F;IAC7F,QAAQ,EAAE,MAAM,CAAC;IACjB,yDAAyD;IACzD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC;CAC3B,CAAC;AA4BF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,WAAY,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,MAAM,KAAG,mBAAmB,GAAG,SA8BnG,CAAC"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type StoryObj } from '@storybook/react-vite';
|
|
2
|
+
import * as Schema from 'effect/Schema';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
import { Type } from '@dxos/echo';
|
|
5
|
+
/**
|
|
6
|
+
* Sample schema: a Flight booking carries airline, flight number, route, dates,
|
|
7
|
+
* cabin class. Without an annotation `<Form.FieldSet/>` renders one field per
|
|
8
|
+
* row (see the `Linear` story). The `FormLayoutAnnotation` on this schema
|
|
9
|
+
* arranges the same fields in a 2-column grid with selective spans.
|
|
10
|
+
*/
|
|
11
|
+
declare const Flight: Type.Obj<{
|
|
12
|
+
readonly airline?: string | undefined;
|
|
13
|
+
readonly flightNumber?: string | undefined;
|
|
14
|
+
readonly origin?: string | undefined;
|
|
15
|
+
readonly destination?: string | undefined;
|
|
16
|
+
readonly departAt?: string | undefined;
|
|
17
|
+
readonly arriveAt?: string | undefined;
|
|
18
|
+
readonly cabin?: "business" | "economy" | "first" | "premium" | undefined;
|
|
19
|
+
readonly notes?: string | undefined;
|
|
20
|
+
}, Schema.Struct.Fields>;
|
|
21
|
+
export type Flight = Type.InstanceType<typeof Flight>;
|
|
22
|
+
type StoryProps = {
|
|
23
|
+
schema: Schema.Schema<any>;
|
|
24
|
+
template?: string;
|
|
25
|
+
};
|
|
26
|
+
declare const meta: {
|
|
27
|
+
title: string;
|
|
28
|
+
render: ({ schema, template }: StoryProps) => React.JSX.Element;
|
|
29
|
+
decorators: import("@storybook/react").Decorator[];
|
|
30
|
+
parameters: {
|
|
31
|
+
layout: string;
|
|
32
|
+
translations: [{
|
|
33
|
+
readonly 'en-US': {
|
|
34
|
+
readonly "@dxos/react-ui-form": {
|
|
35
|
+
readonly 'ref-editor.placeholder': "Type '@' to add a reference, or enter a value";
|
|
36
|
+
readonly 'ref-editor-auto.placeholder': 'Search by name, or enter a value';
|
|
37
|
+
readonly 'fields.label': 'Fields';
|
|
38
|
+
readonly 'hidden-fields.label': 'Hidden Fields';
|
|
39
|
+
readonly 'empty-readonly-ref-field.label': '(none)';
|
|
40
|
+
readonly 'field-property.label': 'Property';
|
|
41
|
+
readonly 'field-property.placeholder': 'Property name';
|
|
42
|
+
readonly 'field-format.label': 'Type';
|
|
43
|
+
readonly 'field-path.label': 'Field path';
|
|
44
|
+
readonly 'remove-item.button': 'Delete item';
|
|
45
|
+
readonly 'add-item.button': 'Add item';
|
|
46
|
+
readonly 'add-property-button.label': 'Add property';
|
|
47
|
+
readonly 'boolean-input-true.value': 'Yes';
|
|
48
|
+
readonly 'boolean-input-false.value': 'No';
|
|
49
|
+
readonly 'show-field.label': 'Show field';
|
|
50
|
+
readonly 'hide-field.label': 'Hide field';
|
|
51
|
+
readonly 'expand-fields.label': 'Expand';
|
|
52
|
+
readonly 'collapse-fields.label': 'Collapse';
|
|
53
|
+
readonly 'delete-field.label': 'Delete field';
|
|
54
|
+
readonly 'create-option.label': 'Create';
|
|
55
|
+
readonly 'add-tag.label': 'Add tag';
|
|
56
|
+
readonly 'ref-field-combobox-input.placeholder': 'Search\u2026';
|
|
57
|
+
readonly 'ref-field.placeholder': 'Select\u2026';
|
|
58
|
+
readonly 'ref-field.placeholder_one': 'Select\u2026';
|
|
59
|
+
readonly 'ref-field.placeholder_other': 'Select items\u2026';
|
|
60
|
+
readonly 'example.placeholder': 'Example';
|
|
61
|
+
readonly 'latitude.placeholder': 'Latitude (e.g., 40.7128)';
|
|
62
|
+
readonly 'longitude.placeholder': 'Longitude (e.g., -74.0060)';
|
|
63
|
+
readonly 'cancel-button.label': 'Cancel';
|
|
64
|
+
readonly 'save-button.label': 'Save';
|
|
65
|
+
readonly 'create-text.label': 'Create text';
|
|
66
|
+
readonly 'format.boolean.label': 'Boolean';
|
|
67
|
+
readonly 'format.currency.label': 'Currency';
|
|
68
|
+
readonly 'format.date.label': 'Date';
|
|
69
|
+
readonly 'format.date-time.label': 'DateTime';
|
|
70
|
+
readonly 'format.did.label': 'DID';
|
|
71
|
+
readonly 'format.duration.label': 'Duration';
|
|
72
|
+
readonly 'format.dxn.label': 'DXN';
|
|
73
|
+
readonly 'format.email.label': 'Email';
|
|
74
|
+
readonly 'format.formula.label': 'Formula';
|
|
75
|
+
readonly 'format.hostname.label': 'Hostname';
|
|
76
|
+
readonly 'format.integer.label': 'Integer';
|
|
77
|
+
readonly 'format.json.label': 'JSON';
|
|
78
|
+
readonly 'format.lnglat.label': 'Geopoint';
|
|
79
|
+
readonly 'format.markdown.label': 'Markdown';
|
|
80
|
+
readonly 'format.percent.label': 'Percent';
|
|
81
|
+
readonly 'format.ref.label': 'Reference';
|
|
82
|
+
readonly 'format.regex.label': 'RegExp';
|
|
83
|
+
readonly 'format.string.label': 'String';
|
|
84
|
+
readonly 'format.single-select.label': 'Select';
|
|
85
|
+
readonly 'format.multi-select.label': 'Multi-select';
|
|
86
|
+
readonly 'format.text.label': 'Long text';
|
|
87
|
+
readonly 'format.time.label': 'Time';
|
|
88
|
+
readonly 'format.timestamp.label': 'Timestamp';
|
|
89
|
+
readonly 'format.user.label': 'User';
|
|
90
|
+
readonly 'format.number.label': 'Number';
|
|
91
|
+
readonly 'format.uri.label': 'URI';
|
|
92
|
+
readonly 'format.url.label': 'URL';
|
|
93
|
+
readonly 'format.uuid.label': 'UUID';
|
|
94
|
+
readonly 'latitude.label': 'Latitude';
|
|
95
|
+
readonly 'longitude.label': 'Longitude';
|
|
96
|
+
readonly 'select-option.label': 'Label';
|
|
97
|
+
readonly 'select-option-label.placeholder': 'Option label';
|
|
98
|
+
readonly 'select-option-delete.button': 'Delete';
|
|
99
|
+
readonly 'select-option-add.button': 'Add option';
|
|
100
|
+
readonly 'system-schema.title': 'System type';
|
|
101
|
+
readonly 'system-schema.description': 'System type: cannot add or remove fields.';
|
|
102
|
+
readonly 'remove.button': 'Delete';
|
|
103
|
+
};
|
|
104
|
+
};
|
|
105
|
+
}];
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
export default meta;
|
|
109
|
+
type Story = StoryObj<StoryProps>;
|
|
110
|
+
/** Baseline: no annotation, no override — `Form.FieldSet` renders linearly (one field per row). */
|
|
111
|
+
export declare const Linear: Story;
|
|
112
|
+
/** `Form.Layout` invoked directly with a `template` prop, bypassing any annotation. */
|
|
113
|
+
export declare const TemplateProp: Story;
|
|
114
|
+
/** Schema carries `FormLayoutAnnotation`; `Form.FieldSet` auto-detects and delegates. */
|
|
115
|
+
export declare const SchemaAnnotation: Story;
|
|
116
|
+
export declare const NamedAnnotation: Story;
|
|
117
|
+
export declare const NestedLabel: Story;
|
|
118
|
+
/** Read-only static presentation: dates render human-readable; nested structs as labels. */
|
|
119
|
+
export declare const NestedLabelStatic: Story;
|
|
120
|
+
export declare const FormPlayground: Story;
|
|
121
|
+
/** Same playground, but the form is rendered inside a `Card.Root` / `Card.Body`. */
|
|
122
|
+
export declare const CardPlayground: Story;
|
|
123
|
+
//# sourceMappingURL=FormLayout.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormLayout.stories.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/FormLayout.stories.tsx"],"names":[],"mappings":"AAKA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAoD,MAAM,OAAO,CAAC;AAEzE,OAAO,EAA2B,IAAI,EAAE,MAAM,YAAY,CAAC;AAiB3D;;;;;GAKG;AACH,QAAA,MAAM,MAAM;;;;;;;;;wBAS0D,CAAC;AAEvE,MAAM,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,MAAM,CAAC,CAAC;AAoFtD,KAAK,UAAU,GAAG;IAChB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAwBF,QAAA,MAAM,IAAI;;mCAtBkC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkC1B,CAAC;eAEd,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;AAElC,mGAAmG;AACnG,eAAO,MAAM,MAAM,EAAE,KAIpB,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,YAAY,EAAE,KAK1B,CAAC;AAEF,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,EAAE,KAI9B,CAAC;AAwCF,eAAO,MAAM,eAAe,EAAE,KAE7B,CAAC;AAqCF,eAAO,MAAM,WAAW,EAAE,KAEzB,CAAC;AAEF,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,EAAE,KAE/B,CAAC;AAwIF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC;AAEF,oFAAoF;AACpF,eAAO,MAAM,cAAc,EAAE,KAE5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormLayout.stories.test.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/FormLayout.stories.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FormLayout.test.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/FormLayout.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Annotation carrying one or more named `FormLayout` DSL templates that
|
|
3
|
+
* control how `Form.FieldSet` / `Form.Layout` arrange a schema's fields.
|
|
4
|
+
* Callers select a variant via the `name` prop; the implicit name is
|
|
5
|
+
* `DEFAULT_LAYOUT_NAME` (`'default'`).
|
|
6
|
+
*
|
|
7
|
+
* Templates use a minimal XML grammar — see `parser.ts`. Example:
|
|
8
|
+
*
|
|
9
|
+
* FormLayoutAnnotation.set({
|
|
10
|
+
* default: `
|
|
11
|
+
* <grid cols="2">
|
|
12
|
+
* <field name="origin"/>
|
|
13
|
+
* <field name="destination"/>
|
|
14
|
+
* <field name="provider" span="2"/>
|
|
15
|
+
* </grid>
|
|
16
|
+
* `,
|
|
17
|
+
* card: `
|
|
18
|
+
* <grid cols="1">
|
|
19
|
+
* <field name="provider"/>
|
|
20
|
+
* <field name="number"/>
|
|
21
|
+
* </grid>
|
|
22
|
+
* `,
|
|
23
|
+
* })
|
|
24
|
+
*/
|
|
25
|
+
export declare const FormLayoutAnnotationId: unique symbol;
|
|
26
|
+
export type FormLayoutMap = Record<string, string>;
|
|
27
|
+
export declare const FormLayoutAnnotation: import("@dxos/echo/internal").AnnotationHelper<FormLayoutMap>;
|
|
28
|
+
/** Name used when no explicit variant is requested. */
|
|
29
|
+
export declare const DEFAULT_LAYOUT_NAME = "default";
|
|
30
|
+
//# sourceMappingURL=annotation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"annotation.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/annotation.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,sBAAsB,eAAsD,CAAC;AAE1F,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEnD,eAAO,MAAM,oBAAoB,+DAAgE,CAAC;AAElG,uDAAuD;AACvD,eAAO,MAAM,mBAAmB,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/index.ts"],"names":[],"mappings":"AAIA,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal XML-style DSL for laying out schema fields in a grid.
|
|
3
|
+
*
|
|
4
|
+
* Grammar:
|
|
5
|
+
* <grid cols="N"> ...children... </grid>
|
|
6
|
+
* <field name="x" span="N"/>
|
|
7
|
+
*
|
|
8
|
+
* - Attributes accept `"…"`, `'…'`, or unquoted integers.
|
|
9
|
+
* - Whitespace between tags is ignored. Text content (between tags) is forbidden.
|
|
10
|
+
* - Self-closing form (`<field … />`) is required for `field`; `grid` must use a closing tag.
|
|
11
|
+
*
|
|
12
|
+
* The parser is hand-rolled (no HTML parser) because the grammar is tiny.
|
|
13
|
+
*/
|
|
14
|
+
/** Node type for the parsed layout tree. */
|
|
15
|
+
export type LayoutNode = {
|
|
16
|
+
readonly kind: 'grid';
|
|
17
|
+
readonly cols: number;
|
|
18
|
+
readonly children: readonly LayoutNode[];
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'field';
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly span?: number;
|
|
23
|
+
};
|
|
24
|
+
export declare class LayoutParseError extends Error {
|
|
25
|
+
readonly position?: number | undefined;
|
|
26
|
+
readonly _tag = "LayoutParseError";
|
|
27
|
+
constructor(message: string, position?: number | undefined);
|
|
28
|
+
}
|
|
29
|
+
/** Parses a layout template string into a single root node. The root must be `<grid>`. */
|
|
30
|
+
export declare const parseLayout: (template: string) => LayoutNode;
|
|
31
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/parser.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AAEH,4CAA4C;AAC5C,MAAM,MAAM,UAAU,GAClB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAA;CAAE,GAC1F;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9E,qBAAa,gBAAiB,SAAQ,KAAK;IAIvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM;IAH5B,QAAQ,CAAC,IAAI,sBAAsB;IACnC,YACE,OAAO,EAAE,MAAM,EACN,QAAQ,CAAC,EAAE,MAAM,YAAA,EAG3B;CACF;AAuED,0FAA0F;AAC1F,eAAO,MAAM,WAAW,aAAc,MAAM,KAAG,UA+D9C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.test.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/Layout/parser.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import * as SchemaAST from 'effect/SchemaAST';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { type FormFieldProps } from '../FormField';
|
|
4
|
+
import { type FormFieldStateProps } from '../FormFieldComponent';
|
|
5
|
+
export type ArrayFieldProps = {
|
|
6
|
+
label: string;
|
|
7
|
+
fieldProps: FormFieldStateProps;
|
|
8
|
+
} & FormFieldProps;
|
|
9
|
+
export declare function ArrayField({ type, path, label, readonly, layout, fieldProps: inputProps, ...props }: ArrayFieldProps): React.JSX.Element | null;
|
|
10
|
+
export declare namespace ArrayField {
|
|
11
|
+
var displayName: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Returns the default empty value for a given AST.
|
|
15
|
+
* Used for initializing new array values etc.
|
|
16
|
+
*/
|
|
17
|
+
export declare const getDefaultValue: (ast?: SchemaAST.AST) => any;
|
|
18
|
+
//# sourceMappingURL=ArrayField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ArrayField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/ArrayField.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,SAAS,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAsB,MAAM,OAAO,CAAC;AAU3C,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAkB,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,mBAAmB,CAAC;CACjC,GAAG,cAAc,CAAC;mCAEQ,EACzB,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,UAAU,EAAE,UAAU,EACtB,GAAG,KAAK,EACT,EAAE,eAAe;;;;AAiHlB;;;GAGG;AAEH,eAAO,MAAM,eAAe,SAAU,SAAS,CAAC,GAAG,KAAG,GAsBrD,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
3
|
+
export declare const BooleanField: ({ type, readonly, onValueChange, ...props }: FormFieldComponentProps<boolean>) => React.JSX.Element;
|
|
4
|
+
//# sourceMappingURL=BooleanField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BooleanField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/BooleanField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAI3C,OAAO,EAAE,KAAK,uBAAuB,EAAoB,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,YAAY,gDAAiD,uBAAuB,CAAC,OAAO,CAAC,sBAWzG,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
3
|
+
export declare const DateField: ({ type, format, readonly, placeholder: _placeholder, onValueChange, onBlur: _onBlur, ...props }: FormFieldComponentProps<string>) => React.JSX.Element;
|
|
4
|
+
//# sourceMappingURL=DateField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DateField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/DateField.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,OAAO,EAAE,KAAK,uBAAuB,EAAoB,MAAM,uBAAuB,CAAC;AAoCvF,eAAO,MAAM,SAAS,oGAQnB,uBAAuB,CAAC,MAAM,CAAC,sBA8CjC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type GeoPoint } from '@dxos/echo/Format';
|
|
3
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
4
|
+
export declare const GeoPointField: ({ type, label, jsonPath, readonly, layout, getStatus, getValue, onValueChange, onBlur, }: FormFieldComponentProps<GeoPoint>) => React.JSX.Element | null;
|
|
5
|
+
//# sourceMappingURL=GeoPointField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GeoPointField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/GeoPointField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsE,MAAM,OAAO,CAAC;AAE3F,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAM/D,OAAO,EAAE,KAAK,uBAAuB,EAAkB,MAAM,uBAAuB,CAAC;AAErF,eAAO,MAAM,aAAa,6FAUvB,uBAAuB,CAAC,QAAQ,CAAC,6BAiFnC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type RefFieldProps } from './RefField';
|
|
3
|
+
/**
|
|
4
|
+
* Renders a referenced object's own fields inline (a nested form bound to the
|
|
5
|
+
* target) rather than the {@link RefField} picker. Activated by
|
|
6
|
+
* `FormInlineAnnotation.set(true)` on the `Ref` property.
|
|
7
|
+
*
|
|
8
|
+
* The nested form edits the target object directly: each changed path is
|
|
9
|
+
* written back via `Obj.setValue` within an `Obj.update`, mirroring
|
|
10
|
+
* `ObjectProperties` (without the synthetic meta-tags row).
|
|
11
|
+
*/
|
|
12
|
+
export declare const InlineRefField: (props: RefFieldProps) => React.JSX.Element | null;
|
|
13
|
+
//# sourceMappingURL=InlineRefField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InlineRefField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/InlineRefField.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAapD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,UAAW,aAAa,6BAqDlD,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
3
|
+
/**
|
|
4
|
+
* Form field that edits a markdown value in a CodeMirror editor.
|
|
5
|
+
* Supports two backings:
|
|
6
|
+
* - `Schema.String` annotated with `Format.TypeFormat.Markdown`: edited as plain text via `getValue`/`onValueChange`.
|
|
7
|
+
* - `Ref<Text>` annotated with `Format.TypeFormat.Markdown`: edited in-place via an Automerge doc accessor.
|
|
8
|
+
* When the ref is empty and a database is available, a create button is shown to allocate a new Text.
|
|
9
|
+
*/
|
|
10
|
+
export declare const MarkdownField: ({ type, readonly, label, jsonPath, placeholder, layout, db, getStatus, getValue, onValueChange, }: FormFieldComponentProps) => React.JSX.Element | null;
|
|
11
|
+
//# sourceMappingURL=MarkdownField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/MarkdownField.tsx"],"names":[],"mappings":"AAKA,OAAO,KAA+B,MAAM,OAAO,CAAC;AAWpD,OAAO,EAAE,KAAK,uBAAuB,EAAkB,MAAM,uBAAuB,CAAC;AAKrF;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,sGAWvB,uBAAuB,6BAgDzB,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { type StoryObj } from '@storybook/react-vite';
|
|
2
|
+
declare const meta: {
|
|
3
|
+
title: string;
|
|
4
|
+
decorators: import("@storybook/react").Decorator[];
|
|
5
|
+
parameters: {
|
|
6
|
+
layout: string;
|
|
7
|
+
translations: [{
|
|
8
|
+
readonly 'en-US': {
|
|
9
|
+
readonly "@dxos/react-ui-form": {
|
|
10
|
+
readonly 'ref-editor.placeholder': "Type '@' to add a reference, or enter a value";
|
|
11
|
+
readonly 'ref-editor-auto.placeholder': 'Search by name, or enter a value';
|
|
12
|
+
readonly 'fields.label': 'Fields';
|
|
13
|
+
readonly 'hidden-fields.label': 'Hidden Fields';
|
|
14
|
+
readonly 'empty-readonly-ref-field.label': '(none)';
|
|
15
|
+
readonly 'field-property.label': 'Property';
|
|
16
|
+
readonly 'field-property.placeholder': 'Property name';
|
|
17
|
+
readonly 'field-format.label': 'Type';
|
|
18
|
+
readonly 'field-path.label': 'Field path';
|
|
19
|
+
readonly 'remove-item.button': 'Delete item';
|
|
20
|
+
readonly 'add-item.button': 'Add item';
|
|
21
|
+
readonly 'add-property-button.label': 'Add property';
|
|
22
|
+
readonly 'boolean-input-true.value': 'Yes';
|
|
23
|
+
readonly 'boolean-input-false.value': 'No';
|
|
24
|
+
readonly 'show-field.label': 'Show field';
|
|
25
|
+
readonly 'hide-field.label': 'Hide field';
|
|
26
|
+
readonly 'expand-fields.label': 'Expand';
|
|
27
|
+
readonly 'collapse-fields.label': 'Collapse';
|
|
28
|
+
readonly 'delete-field.label': 'Delete field';
|
|
29
|
+
readonly 'create-option.label': 'Create';
|
|
30
|
+
readonly 'add-tag.label': 'Add tag';
|
|
31
|
+
readonly 'ref-field-combobox-input.placeholder': 'Search\u2026';
|
|
32
|
+
readonly 'ref-field.placeholder': 'Select\u2026';
|
|
33
|
+
readonly 'ref-field.placeholder_one': 'Select\u2026';
|
|
34
|
+
readonly 'ref-field.placeholder_other': 'Select items\u2026';
|
|
35
|
+
readonly 'example.placeholder': 'Example';
|
|
36
|
+
readonly 'latitude.placeholder': 'Latitude (e.g., 40.7128)';
|
|
37
|
+
readonly 'longitude.placeholder': 'Longitude (e.g., -74.0060)';
|
|
38
|
+
readonly 'cancel-button.label': 'Cancel';
|
|
39
|
+
readonly 'save-button.label': 'Save';
|
|
40
|
+
readonly 'create-text.label': 'Create text';
|
|
41
|
+
readonly 'format.boolean.label': 'Boolean';
|
|
42
|
+
readonly 'format.currency.label': 'Currency';
|
|
43
|
+
readonly 'format.date.label': 'Date';
|
|
44
|
+
readonly 'format.date-time.label': 'DateTime';
|
|
45
|
+
readonly 'format.did.label': 'DID';
|
|
46
|
+
readonly 'format.duration.label': 'Duration';
|
|
47
|
+
readonly 'format.dxn.label': 'DXN';
|
|
48
|
+
readonly 'format.email.label': 'Email';
|
|
49
|
+
readonly 'format.formula.label': 'Formula';
|
|
50
|
+
readonly 'format.hostname.label': 'Hostname';
|
|
51
|
+
readonly 'format.integer.label': 'Integer';
|
|
52
|
+
readonly 'format.json.label': 'JSON';
|
|
53
|
+
readonly 'format.lnglat.label': 'Geopoint';
|
|
54
|
+
readonly 'format.markdown.label': 'Markdown';
|
|
55
|
+
readonly 'format.percent.label': 'Percent';
|
|
56
|
+
readonly 'format.ref.label': 'Reference';
|
|
57
|
+
readonly 'format.regex.label': 'RegExp';
|
|
58
|
+
readonly 'format.string.label': 'String';
|
|
59
|
+
readonly 'format.single-select.label': 'Select';
|
|
60
|
+
readonly 'format.multi-select.label': 'Multi-select';
|
|
61
|
+
readonly 'format.text.label': 'Long text';
|
|
62
|
+
readonly 'format.time.label': 'Time';
|
|
63
|
+
readonly 'format.timestamp.label': 'Timestamp';
|
|
64
|
+
readonly 'format.user.label': 'User';
|
|
65
|
+
readonly 'format.number.label': 'Number';
|
|
66
|
+
readonly 'format.uri.label': 'URI';
|
|
67
|
+
readonly 'format.url.label': 'URL';
|
|
68
|
+
readonly 'format.uuid.label': 'UUID';
|
|
69
|
+
readonly 'latitude.label': 'Latitude';
|
|
70
|
+
readonly 'longitude.label': 'Longitude';
|
|
71
|
+
readonly 'select-option.label': 'Label';
|
|
72
|
+
readonly 'select-option-label.placeholder': 'Option label';
|
|
73
|
+
readonly 'select-option-delete.button': 'Delete';
|
|
74
|
+
readonly 'select-option-add.button': 'Add option';
|
|
75
|
+
readonly 'system-schema.title': 'System type';
|
|
76
|
+
readonly 'system-schema.description': 'System type: cannot add or remove fields.';
|
|
77
|
+
readonly 'remove.button': 'Delete';
|
|
78
|
+
};
|
|
79
|
+
};
|
|
80
|
+
}];
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
export default meta;
|
|
84
|
+
type Story = StoryObj<typeof meta>;
|
|
85
|
+
export declare const StringBacked: Story;
|
|
86
|
+
export declare const StringBackedKeepsFocus: Story;
|
|
87
|
+
export declare const RefPopulated: Story;
|
|
88
|
+
export declare const RefEmpty: Story;
|
|
89
|
+
//# sourceMappingURL=MarkdownField.stories.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownField.stories.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/MarkdownField.stories.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAa,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AA4GjE,QAAA,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOM,CAAC;eAEF,IAAI;AAEnB,KAAK,KAAK,GAAG,QAAQ,CAAC,OAAO,IAAI,CAAC,CAAC;AAEnC,eAAO,MAAM,YAAY,EAAE,KAE1B,CAAC;AAMF,eAAO,MAAM,sBAAsB,EAAE,KA+CpC,CAAC;AAEF,eAAO,MAAM,YAAY,EAAE,KAY1B,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,KAStB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
3
|
+
export declare const NumberField: ({ type, readonly, placeholder, getValue, onValueChange, onBlur, ...props }: FormFieldComponentProps<number>) => React.JSX.Element;
|
|
4
|
+
//# sourceMappingURL=NumberField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NumberField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/NumberField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA2C,MAAM,OAAO,CAAC;AAKhE,OAAO,EAAE,KAAK,uBAAuB,EAAoB,MAAM,uBAAuB,CAAC;AAEvF,eAAO,MAAM,WAAW,+EAQrB,uBAAuB,CAAC,MAAM,CAAC,sBAwDjC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import '@dxos/lit-ui/dx-tag-picker.pcss';
|
|
3
|
+
import { type Database, Entity, Obj, Type } from '@dxos/echo';
|
|
4
|
+
import { URI } from '@dxos/keys';
|
|
5
|
+
import { type ObjectPickerContentProps, type RefOption } from '../../ObjectPicker';
|
|
6
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
7
|
+
/**
|
|
8
|
+
* Find the option a ref-like form value points at. Matches on the local (entity-id) form so a bare local EID
|
|
9
|
+
* (`echo:/<id>`, produced by `Ref.make`) still resolves against an option keyed by the entity's qualified
|
|
10
|
+
* self URI (`echo://<space>/<id>`). Returns `undefined` when the value is not a ref or no option matches.
|
|
11
|
+
*
|
|
12
|
+
* Comparing by entity id is only sound within one space (ids are unique there, not globally). Two EIDs that
|
|
13
|
+
* both carry a space authority must therefore agree on it: a qualified value and a qualified option from
|
|
14
|
+
* different spaces never match, even when their entity ids coincide.
|
|
15
|
+
*/
|
|
16
|
+
export declare const findRefOption: (value: unknown, options: RefOption[]) => RefOption | undefined;
|
|
17
|
+
export type RefFieldProps = FormFieldComponentProps & Pick<ObjectPickerContentProps, 'createOptionLabel' | 'createOptionIcon' | 'createInitialValuePath' | 'createFieldMap'> & {
|
|
18
|
+
db?: Database.Database;
|
|
19
|
+
useType?: (db?: Database.Database, typeUri?: URI.URI) => Type.AnyEntity;
|
|
20
|
+
useResults?: (db?: Database.Database, typename?: string) => Entity.Any[];
|
|
21
|
+
getOptions?: (objects: Entity.Any[], options?: {
|
|
22
|
+
parentLabel?: boolean;
|
|
23
|
+
getTypePlaceholder?: (typename: string) => string;
|
|
24
|
+
}) => RefOption[];
|
|
25
|
+
/**
|
|
26
|
+
* Persist a newly-created object. Called after the user fills out the
|
|
27
|
+
* inline create form and clicks Save. Should add the object to the
|
|
28
|
+
* database and return it (sync or async). The returned object is then
|
|
29
|
+
* wired into this slot's form value as a Ref.
|
|
30
|
+
*/
|
|
31
|
+
onCreate?: (schema: Type.AnyEntity, values: any) => Obj.Unknown | Promise<Obj.Unknown> | undefined | void;
|
|
32
|
+
};
|
|
33
|
+
export declare const RefField: (props: RefFieldProps) => React.JSX.Element | null;
|
|
34
|
+
//# sourceMappingURL=RefField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/RefField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyC,MAAM,OAAO,CAAC;AAE9D,OAAO,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAU,GAAG,EAAqB,IAAI,EAAE,MAAM,YAAY,CAAC;AAIzF,OAAO,EAAY,GAAG,EAAE,MAAM,YAAY,CAAC;AAO3C,OAAO,EAAgB,KAAK,wBAAwB,EAAE,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjG,OAAO,EAAE,KAAK,uBAAuB,EAAkB,MAAM,uBAAuB,CAAC;AAOrF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,UAAW,OAAO,WAAW,SAAS,EAAE,KAAG,SAAS,GAAG,SAsBhF,CAAC;AAiCF,MAAM,MAAM,aAAa,GAAG,uBAAuB,GACjD,IAAI,CACF,wBAAwB,EACxB,mBAAmB,GAAG,kBAAkB,GAAG,wBAAwB,GAAG,gBAAgB,CACvF,GAAG;IACF,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC;IAEvB,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC;IACxE,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,EAAE,CAAC;IACzE,UAAU,CAAC,EAAE,CACX,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,EACrB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,OAAO,CAAC;QAAC,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;KAAE,KACnF,SAAS,EAAE,CAAC;IACjB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,KAAK,GAAG,CAAC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,CAAC;CAC3G,CAAC;AAEJ,eAAO,MAAM,QAAQ,UAAW,aAAa,6BAwJ5C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RefField.test.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/RefField.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
3
|
+
export type SelectFieldOptions = FormFieldComponentProps & {
|
|
4
|
+
options?: Array<{
|
|
5
|
+
value: string | number;
|
|
6
|
+
label?: string;
|
|
7
|
+
secondaryLabel?: string;
|
|
8
|
+
icon?: string;
|
|
9
|
+
iconHue?: string;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
export declare const SelectField: ({ type, readonly, label, jsonPath, layout, placeholder, options, getStatus, getValue, onValueChange, }: SelectFieldOptions) => React.JSX.Element | null;
|
|
13
|
+
//# sourceMappingURL=SelectField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/SelectField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsB,MAAM,OAAO,CAAC;AAK3C,OAAO,EAAE,KAAK,uBAAuB,EAAkB,MAAM,uBAAuB,CAAC;AAErF,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG;IACzD,OAAO,CAAC,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvH,CAAC;AAEF,eAAO,MAAM,WAAW,2GAWrB,kBAAkB,6BA4CpB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { type SelectOption } from '@dxos/echo/Format';
|
|
3
|
+
import { type FormFieldComponentProps } from '../FormFieldComponent';
|
|
4
|
+
export declare const SelectOptionField: ({ type, readonly, label, jsonPath, getStatus, getValue, onValueChange, }: FormFieldComponentProps<SelectOption[] | undefined>) => React.JSX.Element;
|
|
5
|
+
//# sourceMappingURL=SelectOptionField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectOptionField.d.ts","sourceRoot":"","sources":["../../../../../../src/components/Form/fields/SelectOptionField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAyF,MAAM,OAAO,CAAC;AAE9G,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAStD,OAAO,EAAE,KAAK,uBAAuB,EAAkB,MAAM,uBAAuB,CAAC;AAErF,eAAO,MAAM,iBAAiB,6EAQ3B,uBAAuB,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,sBA4KrD,CAAC"}
|