@dxos/react-ui-form 0.8.2-main.5885341 → 0.8.2-main.600d381

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.
Files changed (80) hide show
  1. package/dist/lib/browser/index.mjs +720 -557
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +734 -579
  5. package/dist/lib/node/index.cjs.map +4 -4
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/lib/node-esm/index.mjs +720 -557
  8. package/dist/lib/node-esm/index.mjs.map +4 -4
  9. package/dist/lib/node-esm/meta.json +1 -1
  10. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +1 -1
  11. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  12. package/dist/types/src/components/Form/ArrayField.d.ts.map +1 -1
  13. package/dist/types/src/components/Form/Defaults.d.ts.map +1 -1
  14. package/dist/types/src/components/Form/Form.d.ts +4 -4
  15. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  16. package/dist/types/src/components/Form/Form.stories.d.ts +33 -32
  17. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  18. package/dist/types/src/components/Form/FormActions.d.ts.map +1 -1
  19. package/dist/types/src/components/Form/FormContent.d.ts +3 -3
  20. package/dist/types/src/components/Form/FormContent.d.ts.map +1 -1
  21. package/dist/types/src/components/Form/FormContext.d.ts.map +1 -1
  22. package/dist/types/src/components/Form/Input.d.ts.map +1 -1
  23. package/dist/types/src/components/Form/RefField.d.ts +7 -18
  24. package/dist/types/src/components/Form/RefField.d.ts.map +1 -1
  25. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +1 -1
  26. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +1 -1
  27. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +1 -1
  29. package/dist/types/src/components/Form/factory.d.ts +1 -1
  30. package/dist/types/src/components/Form/factory.d.ts.map +1 -1
  31. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  32. package/dist/types/src/components/ViewEditor/Test.stories.d.ts.map +1 -1
  33. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  34. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  35. package/dist/types/src/components/deprecated/Form.d.ts +2 -2
  36. package/dist/types/src/components/deprecated/Form.d.ts.map +1 -1
  37. package/dist/types/src/components/deprecated/Form.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/deprecated/FormInput.d.ts.map +1 -1
  39. package/dist/types/src/components/testing.d.ts.map +1 -1
  40. package/dist/types/src/hooks/index.d.ts +2 -0
  41. package/dist/types/src/hooks/index.d.ts.map +1 -1
  42. package/dist/types/src/hooks/useForm.d.ts +2 -2
  43. package/dist/types/src/hooks/useForm.d.ts.map +1 -1
  44. package/dist/types/src/hooks/useQueryRefOptions.d.ts +23 -0
  45. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +1 -0
  46. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +8 -0
  47. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +1 -0
  48. package/dist/types/src/util/field.d.ts.map +1 -1
  49. package/dist/types/src/util/formatting.d.ts.map +1 -1
  50. package/dist/types/src/util/index.d.ts +2 -0
  51. package/dist/types/src/util/index.d.ts.map +1 -1
  52. package/dist/types/src/util/refs.d.ts +9 -0
  53. package/dist/types/src/util/refs.d.ts.map +1 -0
  54. package/dist/types/src/util/schema.d.ts +3 -0
  55. package/dist/types/src/util/schema.d.ts.map +1 -0
  56. package/dist/types/tsconfig.tsbuildinfo +1 -1
  57. package/package.json +25 -24
  58. package/src/components/ControlSection/ControlSection.stories.tsx +1 -1
  59. package/src/components/FieldEditor/FieldEditor.stories.tsx +1 -1
  60. package/src/components/Form/ArrayField.tsx +5 -6
  61. package/src/components/Form/Defaults.tsx +4 -1
  62. package/src/components/Form/Form.stories.tsx +48 -42
  63. package/src/components/Form/Form.tsx +4 -4
  64. package/src/components/Form/FormContent.tsx +49 -22
  65. package/src/components/Form/FormContext.tsx +3 -1
  66. package/src/components/Form/Input.tsx +3 -9
  67. package/src/components/Form/RefField.tsx +145 -100
  68. package/src/components/Form/custom/SelectOptionsInput.stories.tsx +6 -5
  69. package/src/components/Form/factory.tsx +1 -1
  70. package/src/components/Form/index.ts +0 -1
  71. package/src/components/ViewEditor/ViewEditor.stories.tsx +4 -3
  72. package/src/components/ViewEditor/ViewEditor.tsx +9 -8
  73. package/src/components/deprecated/Form.tsx +6 -6
  74. package/src/hooks/index.ts +3 -1
  75. package/src/hooks/useForm.ts +3 -3
  76. package/src/hooks/useQueryRefOptions.ts +53 -0
  77. package/src/hooks/useRefQueryLookupHandler.ts +41 -0
  78. package/src/util/index.ts +3 -1
  79. package/src/util/refs.ts +38 -0
  80. package/src/util/schema.ts +14 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/translations.ts", "../../../src/components/deprecated/FormInput.tsx", "../../../src/components/ControlSection/ControlSection.tsx", "../../../src/components/FieldEditor/FieldEditor.tsx", "../../../src/components/Form/custom/GeoPointInput.tsx", "../../../src/components/Form/Input.tsx", "../../../src/components/Form/custom/SelectOptionsInput.tsx", "../../../src/components/Form/custom/TupleInput.tsx", "../../../src/components/Form/Defaults.tsx", "../../../src/components/Form/Form.tsx", "../../../src/components/Form/FormActions.tsx", "../../../src/components/Form/FormContext.tsx", "../../../src/hooks/useForm.ts", "../../../src/components/Form/FormContent.tsx", "../../../src/components/Form/ArrayField.tsx", "../../../src/components/Form/RefField.tsx", "../../../src/components/Form/factory.tsx", "../../../src/components/ViewEditor/ViewEditor.tsx", "../../../src/util/field.ts", "../../../src/util/formatting.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'react-ui-form';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'fields label': 'Fields',\n 'hidden fields label': 'Hidden Fields',\n\n // TODO(burdon): Standardize field/property.\n 'button add property': 'Add property',\n 'field property label': 'Property',\n 'field property placeholder': 'Property name',\n 'field format label': 'Type',\n 'field path label': 'Field path',\n 'add field': 'Add field',\n 'delete field': 'Delete field',\n 'field limit reached': 'Maximum number of fields reached',\n\n // TODO(burdon): Factor out?\n 'button cancel': 'Cancel',\n 'button save': 'Save',\n\n // FormatEnum\n 'format boolean': 'Boolean',\n 'format currency': 'Currency',\n 'format date': 'Date',\n 'format date-time': 'DateTime',\n 'format did': 'DID',\n 'format duration': 'Duration',\n 'format email': 'Email',\n 'format formula': 'Formula',\n 'format hostname': 'Hostname',\n 'format integer': 'Integer',\n 'format json': 'JSON',\n 'format latlng': 'Geopoint',\n 'format markdown': 'Markdown',\n 'format percent': 'Percent',\n 'format ref': 'Reference',\n 'format regex': 'RegExp',\n 'format string': 'String',\n 'format single-select': 'Select',\n 'format text': 'Long text',\n 'format time': 'Time',\n 'format timestamp': 'Timestamp',\n 'format user': 'User',\n 'format number': 'Number',\n 'format uri': 'URI',\n 'format uuid': 'UUID',\n\n // Placeholders\n 'placeholder latitude': 'Latitude',\n 'placeholder longitude': 'Longitude',\n\n // SelectOptionsInput\n 'select option label': 'Label',\n 'select option label placeholder': 'Option label',\n 'select option color': 'Color',\n 'select option delete': 'Delete',\n 'select option add': 'Add option',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input, type ThemedClassName } from '@dxos/react-ui';\nimport { mx, textBlockWidth } from '@dxos/react-ui-theme';\n\n/**\n * @deprecated\n */\nexport const DeprecatedFormContainer = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => {\n return (\n <div role='none' className='container-max-width p-4 justify-center overflow-x-hidden overflow-y-auto'>\n <div role='form' className={mx('flex flex-col', textBlockWidth, classNames)}>\n {children}\n </div>\n </div>\n );\n};\n\nexport type DeprecatedFormInputProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\n/**\n * @deprecated\n */\nexport const DeprecatedFormInput = ({\n label,\n description,\n secondary,\n children,\n}: PropsWithChildren<DeprecatedFormInputProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n <Input.Label classNames='flex min-bs-[--rail-action] items-center' style={{ fontSize: 'unset' }}>\n {label}\n </Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-bs-[--rail-action] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n return (\n <div role='none'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentPropsWithoutRef, type PropsWithChildren } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n type Label,\n Input,\n type ThemedClassName,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nexport type ControlPageProps = ThemedClassName<ComponentPropsWithoutRef<'div'>>;\n\nexport const ControlPage = ({ children, classNames, ...props }: ControlPageProps) => {\n return (\n <div role='none' className={mx('pli-2', classNames)} {...props}>\n {children}\n </div>\n );\n};\n\nexport type ControlSectionProps = PropsWithChildren<{\n title: Label;\n description?: Label;\n}>;\n\nexport const ControlSection = ({ title, description, children }: ControlSectionProps) => {\n return (\n <>\n <ControlSectionHeading title={title} description={description} />\n {children}\n </>\n );\n};\n\nexport const ControlSectionHeading = ({ title, description }: Omit<ControlSectionProps, 'children'>) => {\n const { t } = useTranslation(translationKey);\n return (\n <>\n <h2 className='pli-4 container-max-width text-xl mbs-6 mbe-4'>{toLocalizedString(title, t)}</h2>\n {description && (\n <p className='pli-4 mlb-4 container-max-width text-description'>{toLocalizedString(description, t)}</p>\n )}\n </>\n );\n};\n\nexport const ControlGroupButton = ({ classNames, ...props }: ButtonProps) => {\n return <Button {...props} classNames={['md:col-span-2', classNames]} />;\n};\n\nexport type ControlGroupProps = ThemedClassName<PropsWithChildren<{}>>;\n\nexport const ControlGroup = ({ children, classNames }: ControlGroupProps) => (\n <div\n role='none'\n className={mx('group container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4', classNames)}\n >\n {children}\n </div>\n);\n\nexport const ControlFrame = ({ children }: ControlGroupProps) => (\n <div\n role='none'\n className='p-4 border border-separator rounded-lg container-max-width grid grid-cols-1 md:grid-cols-[1fr_1fr] gap-2 md:gap-8'\n >\n {children}\n </div>\n);\n\nexport type ControlItemProps = PropsWithChildren<{\n title: Label;\n description?: Label;\n}>;\n\nexport const controlItemClasses =\n 'p-4 border border-separator rounded-lg container-max-width grid md:col-span-2 grid-cols-subgrid items-center';\n\nconst controlItemTitleClasses = 'text-lg font-normal mbe-2';\nconst controlItemDescriptionClasses = 'text-base mlb-2 md:mbe-0 text-description';\n\nexport const ControlItem = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <div className={controlItemClasses}>\n <div role='none'>\n <h3 className={controlItemTitleClasses}>{toLocalizedString(title, t)}</h3>\n {description && <p className={controlItemDescriptionClasses}>{toLocalizedString(description, t)}</p>}\n </div>\n {children}\n </div>\n );\n};\n\nexport const ControlItemInput = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <Input.Root>\n <div className={controlItemClasses}>\n <div role='none'>\n <Input.Label classNames={controlItemTitleClasses}>{toLocalizedString(title, t)}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation>\n <Input.Description classNames={controlItemDescriptionClasses}>\n {toLocalizedString(description, t)}\n </Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n {children}\n </div>\n </Input.Root>\n );\n};\n\nexport const ControlFrameItem = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <div role='group' className='min-is-0'>\n <h3 className='text-lg mbe-2'>{toLocalizedString(title, t)}</h3>\n {description && <p className='mlb-2 md:mbe-0 text-description'>{toLocalizedString(description, t)}</p>}\n {children}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type SchemaRegistry } from '@dxos/echo-db';\nimport { FormatEnum, FormatEnums, formatToType, type EchoSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { useTranslation } from '@dxos/react-ui';\nimport {\n getFormatSchema,\n getSchemaProperties,\n sortProperties,\n type FieldType,\n type PropertyType,\n type ViewType,\n type ViewProjection,\n type SchemaProperty,\n} from '@dxos/schema';\n\nimport { translationKey } from '../../translations';\nimport { Form, type FormProps, type InputComponent, SelectInput, SelectOptionInput } from '../Form';\n\nexport type FieldEditorProps = {\n view: ViewType;\n projection: ViewProjection;\n field: FieldType;\n registry?: SchemaRegistry;\n onSave: () => void;\n onCancel?: () => void;\n};\n\n/**\n * Displays a Form representing the metadata for a given `Field` and `View`.\n */\nexport const FieldEditor = ({ view, projection, field, registry, onSave, onCancel }: FieldEditorProps) => {\n const { t } = useTranslation(translationKey);\n const [props, setProps] = useState<PropertyType>(projection.getFieldProjection(field.id).props);\n useEffect(() => setProps(projection.getFieldProjection(field.id).props), [field, projection]);\n\n const [schemas, setSchemas] = useState<EchoSchema[]>([]);\n useEffect(() => {\n if (!registry) {\n return;\n }\n\n const subscription = registry.query().subscribe((query) => setSchemas(query.results), { fire: true });\n\n // TODO(dmaretskyi): This shouldn't be needed.\n const t = setTimeout(async () => {\n const schemas = await registry.query().run();\n setSchemas(schemas);\n });\n return () => {\n clearTimeout(t);\n subscription?.();\n };\n }, [registry]);\n\n const [referenceSchema, setReferenceSchema] = useState<EchoSchema>();\n useEffect(() => {\n setReferenceSchema(schemas.find((schema) => schema.typename === props?.referenceSchema));\n }, [schemas, props?.referenceSchema]);\n\n // TODO(burdon): Need to wrap otherwise throws error:\n // Class constructor SchemaClass cannot be invoked without 'new'.\n const [{ fieldSchema }, setFieldSchema] = useState({ fieldSchema: getFormatSchema(props?.format) });\n\n const handleValuesChanged = useCallback<NonNullable<FormProps<PropertyType>['onValuesChanged']>>(\n (_props) => {\n // TODO(burdon): Callback should pass `changed` to indicate which fields have changed.\n // TODO(Zaymon): Workout why old and new format values are the same sometimes even when\n // selecting novel format values.\n setFieldSchema((prev) => {\n const fieldSchema = getFormatSchema(_props.format);\n if (prev.fieldSchema === fieldSchema) {\n return prev;\n }\n return { fieldSchema };\n });\n setReferenceSchema((prev) => {\n if (_props.referenceSchema !== prev?.typename) {\n const newSchema = schemas.find((schema) => schema.typename === _props.referenceSchema);\n if (newSchema) {\n return newSchema;\n }\n }\n return prev;\n });\n\n setProps((props) => {\n const type = formatToType[_props.format as keyof typeof formatToType];\n if (props.type !== type) {\n return { ...props, ..._props, type };\n }\n\n return _props as PropertyType;\n });\n },\n [schemas, props.format, props.referenceSchema],\n );\n\n const handleValidate = useCallback<NonNullable<FormProps<PropertyType>['onValidate']>>(\n ({ property }) => {\n if (property && view.fields.find((f) => f.path === property && f.path !== field.path)) {\n return [\n {\n path: 'property',\n message: `property is not unique: '${property}'`,\n },\n ];\n }\n },\n [view.fields, field],\n );\n\n const handleSave = useCallback<NonNullable<FormProps<PropertyType>['onSave']>>(\n (props) => {\n projection.setFieldProjection({ field, props });\n onSave();\n },\n [projection, field, onSave],\n );\n\n const handleCancel = useCallback<NonNullable<FormProps<PropertyType>['onCancel']>>(() => {\n // Need to defer to allow form to close.\n requestAnimationFrame(() => onCancel?.());\n onSave();\n }, [onSave]);\n\n const Custom: Partial<Record<string, InputComponent>> = useMemo(\n () => ({\n ['format' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={FormatEnums.filter((value) => value !== FormatEnum.None).map((value) => ({\n value,\n label: t(`format ${value}`),\n }))}\n />\n ),\n ['referenceSchema' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={schemas.map((schema) => ({\n value: schema.typename,\n }))}\n />\n ),\n ['referencePath' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={\n referenceSchema\n ? getSchemaProperties(referenceSchema.ast)\n .sort(sortProperties)\n .map((p) => ({ value: p.name }))\n : []\n }\n />\n ),\n ['options' satisfies keyof PropertyType]: (props) => <SelectOptionInput {...props} />,\n }),\n [t, schemas, referenceSchema],\n );\n\n const propIsNotType = useCallback(\n (props: SchemaProperty<PropertyType>[]) => props.filter((p) => p.name !== 'type'),\n [],\n );\n\n if (!fieldSchema) {\n log.warn('invalid format', { props });\n return null;\n }\n\n return (\n <Form<PropertyType>\n key={field.id}\n autoFocus\n values={props}\n schema={fieldSchema}\n filter={propIsNotType}\n sort={['property', 'format']}\n onValuesChanged={handleValuesChanged}\n onValidate={handleValidate}\n onSave={handleSave}\n onCancel={handleCancel}\n Custom={Custom}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useState, useEffect, useMemo, type ChangeEvent } from 'react';\n\nimport { type GeoPoint, GeoLocation } from '@dxos/echo-schema';\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { safeParseFloat } from '@dxos/util';\n\nimport { translationKey } from '../../../translations';\nimport { InputHeader, type InputProps } from '../Input';\n\nexport const GeoPointInput = ({ type, label, disabled, getStatus, getValue, onValueChange, onBlur }: InputProps) => {\n const { t } = useTranslation(translationKey);\n const { status, error } = getStatus();\n const geoPoint = useMemo<GeoPoint>(() => getValue<GeoPoint>() ?? [0, 0], [getValue]);\n const geoLocation = useMemo(() => GeoLocation.fromGeoPoint(geoPoint), [geoPoint]);\n\n const [longitudeText, setLongitudeText] = useState(geoLocation.longitude?.toString());\n const [latitudeText, setLatitudeText] = useState(geoLocation.latitude?.toString());\n\n useEffect(() => {\n const location = GeoLocation.fromGeoPoint(geoPoint);\n setLongitudeText(location.longitude.toString());\n setLatitudeText(location.latitude.toString());\n }, [geoPoint]);\n\n const handleCoordinateChange = useCallback(\n (coordinateType: keyof Pick<GeoLocation, 'longitude' | 'latitude'>, setText: (text: string) => void) =>\n (event: ChangeEvent<HTMLInputElement>) => {\n const inputText = event.target.value;\n setText(inputText);\n if (inputText !== '' && inputText !== '-') {\n const coord = safeParseFloat(inputText);\n if (coord !== undefined && !isNaN(coord)) {\n const currentLocation = GeoLocation.fromGeoPoint(getValue<GeoPoint>() ?? [0, 0]);\n const newLocation = { ...currentLocation, [coordinateType]: coord };\n const newValue = GeoLocation.toGeoPoint(newLocation);\n onValueChange(type, newValue);\n }\n }\n },\n [getValue, onValueChange, type],\n );\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div role='none' className='grid grid-cols-2 gap-2'>\n <Input.TextInput\n type='text'\n pattern='^-?[0-9]*\\.?[0-9]*$'\n disabled={disabled}\n placeholder={t('placeholder latitude')}\n value={latitudeText}\n onChange={handleCoordinateChange('latitude', setLatitudeText)}\n onBlur={onBlur}\n />\n <Input.TextInput\n type='text'\n pattern='^-?[0-9]*\\.?[0-9]*$'\n disabled={disabled}\n placeholder={t('placeholder longitude')}\n value={longitudeText}\n onChange={handleCoordinateChange('longitude', setLongitudeText)}\n onBlur={onBlur}\n />\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { type FormatEnum } from '@dxos/echo-schema';\nimport { type SimpleType } from '@dxos/effect';\nimport { Icon, Tooltip } from '@dxos/react-ui';\nimport { errorText } from '@dxos/react-ui-theme';\n\nimport { type FormInputStateProps } from './FormContext';\n\n/**\n * Props passed to input components.\n */\nexport type InputProps = {\n type: SimpleType;\n format?: FormatEnum;\n label: string;\n disabled?: boolean;\n placeholder?: string;\n inputOnly?: boolean;\n} & FormInputStateProps;\n\n/**\n * Form input component.\n */\nexport type InputComponent = FC<InputProps>;\n\nexport type InputHeaderProps = PropsWithChildren<{\n error?: string;\n}>;\n\nexport const InputHeader = ({ children, error }: InputHeaderProps) => {\n return (\n <div role='none' className='flex justify-between items-center mb-1'>\n {children}\n {error && (\n <Tooltip.Root>\n <Tooltip.Trigger asChild>\n <Icon icon='ph--warning--regular' size={4} classNames={errorText} />\n </Tooltip.Trigger>\n <Tooltip.Content side='bottom'>\n <Tooltip.Arrow />\n {error}\n </Tooltip.Content>\n </Tooltip.Root>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ChangeEvent, type KeyboardEvent, useCallback, useEffect, useState, useRef } from 'react';\n\nimport { type SelectOption } from '@dxos/echo-schema';\nimport { PublicKey } from '@dxos/keys';\nimport { type ChromaticPalette, Icon, IconButton, Input, Tag, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { HuePicker } from '@dxos/react-ui-pickers';\nimport { hues, mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../../translations';\nimport { InputHeader, type InputProps } from '../Input';\n\n// TODO(ZaymonFC): Handle disabled.\nexport const SelectOptionInput = ({ type, label, disabled, getStatus, getValue, onValueChange }: InputProps) => {\n const [selected, setSelectedId] = useState<string | null>(null);\n const [isNewOption, setIsNewOption] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslation(translationKey);\n const { status, error } = getStatus();\n const options = getValue<SelectOption[] | undefined>();\n\n // Initialization.\n useEffect(() => {\n if (options === undefined) {\n onValueChange(type, []);\n }\n }, [options, onValueChange, type]);\n\n const randomHue = () => {\n const usedHues = new Set(options?.map((option) => option.color) ?? []);\n // Pick a random unused option from hueTokenThemes.\n const unusedHues = hues.filter((hue) => !usedHues.has(hue));\n if (unusedHues.length > 0) {\n return unusedHues[Math.floor(Math.random() * unusedHues.length)];\n }\n\n // Pick a random one that hasn't been used in the last three options\n const lastThree = new Set(options?.slice(-3).map((option) => option.color) ?? []);\n const availableHues = hues.filter((hue) => !lastThree.has(hue));\n return (\n availableHues[Math.floor(Math.random() * availableHues.length)] ?? hues[Math.floor(Math.random() * hues.length)]\n );\n };\n\n const handleAdd = useCallback(() => {\n const newId = PublicKey.random().truncate();\n const newOption = { id: newId, title: '', color: randomHue() };\n onValueChange(type, [...(options ?? []), newOption]);\n setSelectedId(newId);\n setIsNewOption(true);\n }, [options, type, onValueChange]);\n\n const handleDelete = useCallback(\n (id: string) => {\n const newOptions = options?.filter((option) => option.id !== id) ?? [];\n onValueChange(type, newOptions);\n setSelectedId(null);\n },\n [options, type, onValueChange],\n );\n\n const handleMove = useCallback(\n (from: number, to: number) => {\n if (!options) {\n return;\n }\n\n const newOptions = [...options];\n const [removed] = newOptions.splice(from, 1);\n newOptions.splice(to, 0, removed);\n onValueChange(type, newOptions);\n },\n [options, type, onValueChange],\n );\n\n const handleClick = useCallback((id: string) => {\n setSelectedId((current) => (current === id ? null : id));\n }, []);\n\n const handleTitleChange = useCallback(\n (id: string) => (e: ChangeEvent<HTMLInputElement>) => {\n const newOptions = options?.map((o) => (o.id === id ? { ...o, title: e.target.value } : o));\n onValueChange(type, newOptions ?? []);\n },\n [options, type, onValueChange],\n );\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n setSelectedId(null);\n }\n }, []);\n\n const handleColorChange = useCallback(\n (id: string) => (hue: string) => {\n const newOptions = options?.map((o) => (o.id === id ? { ...o, color: hue } : o));\n onValueChange(type, newOptions ?? []);\n },\n [options, type, onValueChange],\n );\n\n useEffect(() => {\n if (selected && isNewOption && inputRef.current) {\n inputRef.current.focus();\n setIsNewOption(false);\n }\n }, [selected, isNewOption]);\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div role='none'>\n {options && (\n <List.Root items={options} isItem={(item) => true} onMove={handleMove}>\n {({ items }) => (\n <div role='list' className='w-full overflow-auto'>\n {items?.map((item) => (\n <div key={item.id}>\n <List.Item\n role='button'\n item={item}\n classNames={mx('p-1 plb-2', 'flex flex-col', 'cursor-pointer', 'hover:bg-hoverOverlay')}\n aria-expanded={selected === item.id}\n >\n <div className='flex items-center'>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleClick(item.id)} classNames='flex-1'>\n {/* TODO(ZaymonFC): Move spacer into Tag component. */}\n <Tag palette={item.color as ChromaticPalette}>{item.title || '\\u200b'}</Tag>\n </List.ItemTitle>\n <Icon\n icon={selected === item.id ? 'ph--caret-down--regular' : 'ph--caret-right--regular'}\n onClick={() => handleClick(item.id)}\n />\n </div>\n {selected === item.id && (\n <div className='mis-4 mbs-2 flex flex-col gap-1'>\n {/* 16px to match drag handle width. */}\n <Input.Label classNames='text-xs'>{t('select option label')}</Input.Label>\n <div className='flex flex-row items-center gap-1'>\n <Input.TextInput\n placeholder={t('select option label placeholder')}\n ref={selected === item.id ? inputRef : undefined}\n value={item.title}\n onChange={handleTitleChange(item.id)}\n onKeyDown={handleKeyDown}\n classNames='flex-1'\n data-no-submit\n />\n <Toolbar.Root classNames='p-0 m-0 !is-auto'>\n <HuePicker\n value={item.color}\n onChange={handleColorChange(item.id)}\n rootVariant='toolbar-button'\n />\n </Toolbar.Root>\n <IconButton\n icon='ph--trash--fill'\n iconOnly\n label={t('select option delete')}\n onClick={() => handleDelete(item.id)}\n />\n </div>\n </div>\n )}\n </List.Item>\n </div>\n ))}\n <div role='listitem'>\n <div\n role='button'\n className={mx('p-1 plb-2', 'flex flex-col', 'cursor-pointer', 'hover:bg-hoverOverlay')}\n onClick={handleAdd}\n >\n <div className='flex items-center gap-1'>\n <Icon icon='ph--plus--regular' />\n <span className='text-sm'>{t('select option add')}</span>\n </div>\n </div>\n </div>\n </div>\n )}\n </List.Root>\n )}\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { safeParseFloat } from '@dxos/util';\n\nimport { InputHeader, type InputProps } from '../Input';\n\nconst gridCols = ['grid-cols-1', 'grid-cols-2', 'grid-cols-3', 'grid-cols-4'];\n\nexport const TupleInput = ({\n binding,\n type,\n label,\n disabled,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps & { binding: string[] }) => {\n const { status, error } = getStatus();\n\n // TODO(burdon): Generalize number/float/string, etc.\n const values: Record<string, number> = getValue<Record<string, number>>() ?? {};\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div className={mx('grid gap-2', gridCols[binding.length - 1])}>\n {binding.map((prop) => (\n <Input.TextInput\n key={prop}\n type='number'\n disabled={disabled}\n value={values[prop]}\n onChange={(event) => onValueChange(type, { ...values, [prop]: safeParseFloat(event.target.value, 0) })}\n onBlur={onBlur}\n />\n ))}\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { Input, Select } from '@dxos/react-ui';\n\nimport { type InputProps, InputHeader } from './Input';\n\nexport const TextInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextInput\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? ''}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n />\n {inputOnly && <Input.Validation>{error}</Input.Validation>}\n </Input.Root>\n );\n};\n\nexport const NumberInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextInput\n type='number'\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? 0}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n />\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport const BooleanInput = ({ type, label, inputOnly, getStatus, getValue, onValueChange }: InputProps) => {\n const { status, error } = getStatus();\n const checked = Boolean(getValue());\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.Switch checked={checked} onCheckedChange={(value) => onValueChange(type, value)} />\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport type SelectInputOptions = InputProps & {\n options?: Array<{ value: string | number; label?: string }>;\n};\n\nexport const SelectInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n options,\n getStatus,\n getValue,\n onValueChange,\n}: SelectInputOptions) => {\n const { status, error } = getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Select.Root value={getValue()} onValueChange={(value) => onValueChange(type, value)}>\n {/* TODO(burdon): Placeholder not working? */}\n <Select.TriggerButton classNames='is-full' disabled={disabled} placeholder={placeholder} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {options?.map(({ value, label }) => (\n // NOTE: Numeric values are converted to and from strings.\n <Select.Option key={String(value)} value={String(value)}>\n {label ?? String(value)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport const MarkdownInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // TODO(ZaymonFC): If we start using `Enter` for form submission, we should prevent default behavior here\n // since we're using a textarea element and the user needs to be able to enter new lines.\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.blockSize = 'auto'; // For measurement.\n textarea.style.blockSize = `${textarea.scrollHeight + 2}px`;\n }\n }, []);\n\n // Adjust height on initial render.\n useEffect(() => {\n adjustHeight();\n }, [adjustHeight]);\n\n // Adjust height when the content changes.\n useEffect(() => {\n adjustHeight();\n }, [getValue(), adjustHeight]);\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextArea\n ref={textareaRef}\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? ''}\n classNames={'min-bs-auto max-h-40 overflow-auto'}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n style={{ resize: 'none' }}\n spellCheck={false}\n />\n {inputOnly && <Input.Validation>{error}</Input.Validation>}\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type ReactElement, useEffect, useMemo, useRef } from 'react';\n\nimport { type BaseObject, type S, type PropertyKey } from '@dxos/echo-schema';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type SchemaProperty } from '@dxos/schema';\n\nimport { FormActions } from './FormActions';\nimport { FormFields } from './FormContent';\nimport { FormProvider } from './FormContext';\nimport { type InputProps, type InputComponent } from './Input';\nimport { type QueryRefOptions } from './RefField';\nimport { type FormOptions } from '../../hooks';\n\nexport type PropsFilter<T extends BaseObject> = (props: SchemaProperty<T>[]) => SchemaProperty<T>[];\n\nexport type ComponentLookup = (args: {\n prop: string;\n schema: S.Schema<any>;\n inputProps: InputProps;\n}) => ReactElement | undefined;\n\nexport type CustomInputMap = Partial<Record<string, InputComponent>>;\n\nexport type FormProps<T extends BaseObject> = ThemedClassName<\n {\n values: Partial<T>;\n\n /** Path to the current object from the root. Used with nested forms. */\n path?: string[];\n\n // TODO(burdon): Autofocus first input.\n autoFocus?: boolean;\n readonly?: boolean;\n // TODO(burdon): Change to JsonPath includes/excludes.\n filter?: PropsFilter<T>;\n sort?: PropertyKey<T>[];\n autoSave?: boolean;\n testId?: string;\n onCancel?: () => void;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n /**\n * Map of custom renderers for specific properties.\n * Prefer lookupComponent for plugin specific input surfaces.\n */\n Custom?: CustomInputMap;\n } & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | 'onSave'>\n>;\n\nexport const Form = <T extends BaseObject>({\n classNames,\n schema,\n values: initialValues,\n path = [],\n autoFocus,\n readonly,\n filter,\n sort,\n autoSave,\n testId,\n onValuesChanged,\n onValidate,\n onSave,\n onCancel,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormProps<T>) => {\n const formRef = useRef<HTMLDivElement>(null);\n const onValid = useMemo(() => (autoSave ? onSave : undefined), [autoSave, onSave]);\n\n // Focus the first input element within this form.\n useEffect(() => {\n if (autoFocus && formRef.current) {\n const input = formRef.current.querySelector('input');\n if (input) {\n input.focus();\n }\n }\n }, [autoFocus]);\n\n return (\n <FormProvider\n formRef={formRef}\n schema={schema}\n autoSave={autoSave}\n initialValues={initialValues}\n onValuesChanged={onValuesChanged}\n onValidate={onValidate}\n onValid={onValid}\n onSave={onSave}\n >\n {/* TODO(burdon): Remove padding. */}\n <div ref={formRef} role='none' className={mx('p-2', classNames)} data-testid={testId}>\n <FormFields\n schema={schema}\n path={path}\n readonly={readonly}\n filter={filter}\n sort={sort}\n onQueryRefOptions={onQueryRefOptions}\n lookupComponent={lookupComponent}\n Custom={Custom}\n />\n {(onCancel || onSave) && !autoSave && <FormActions onCancel={onCancel} readonly={readonly} />}\n </div>\n </FormProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useFormContext } from './FormContext';\nimport { translationKey } from '../../translations';\n\nexport type FormActionsProps = {\n readonly?: boolean;\n onCancel?: () => void;\n};\n\nexport const FormActions = ({ onCancel, readonly }: FormActionsProps) => {\n const { t } = useTranslation(translationKey);\n const { canSave, handleSave } = useFormContext();\n\n return (\n <div role='none' className='mt-2 flex justify-center'>\n <div role='none' className={mx(onCancel && !readonly && 'grid grid-cols-2 gap-2')}>\n {onCancel && !readonly && (\n <IconButton data-testid='cancel-button' icon='ph--x--regular' label={t('button cancel')} onClick={onCancel} />\n )}\n {handleSave && (\n <IconButton\n type='submit'\n data-testid='save-button'\n disabled={!canSave}\n icon='ph--check--regular'\n label={t('button save')}\n onClick={handleSave}\n />\n )}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, {\n createContext,\n type RefObject,\n useContext,\n useEffect,\n useMemo,\n type FocusEvent,\n type PropsWithChildren,\n} from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { type BaseObject, getValue } from '@dxos/echo-schema';\nimport { createJsonPath, type SimpleType } from '@dxos/effect';\n\nimport { type FormHandler, type FormOptions, useForm } from '../../hooks';\n\ntype FormContextValue<T extends BaseObject> = FormHandler<T>;\n\nconst FormContext = createContext<FormContextValue<any> | undefined>(undefined);\n\nexport const useFormContext = <T extends BaseObject>(): FormContextValue<T> => {\n return useContext(FormContext) ?? raise(new Error('Missing FormContext'));\n};\n\nexport const useFormValues = (path: (string | number)[] = []): any => {\n const { values: formValues } = useFormContext();\n const jsonPath = createJsonPath(path);\n return getValue(formValues, jsonPath) as BaseObject;\n};\n\nexport type FormInputStateProps = {\n getStatus: () => { status?: 'error'; error?: string };\n getValue: <V>() => V | undefined;\n onValueChange: (type: SimpleType, value: any) => void;\n onBlur: (event: FocusEvent<HTMLElement>) => void;\n};\n\nexport const useInputProps = (path: (string | number)[] = []): FormInputStateProps => {\n const { getStatus, getValue: getFormValue, onValueChange, onTouched } = useFormContext();\n\n const stablePath = useMemo(() => path, [Array.isArray(path) ? path.join('.') : path]);\n return useMemo(\n () => ({\n getStatus: () => getStatus(stablePath),\n getValue: () => getFormValue(stablePath),\n onValueChange: (type: SimpleType, value: any) => onValueChange(stablePath, type, value),\n onBlur: () => onTouched(stablePath),\n }),\n [getStatus, getFormValue, onValueChange, onTouched, stablePath],\n );\n};\n\nexport const FormProvider = ({\n children,\n formRef,\n autoSave,\n ...formOptions\n}: PropsWithChildren<\n FormOptions<any> & {\n formRef?: RefObject<HTMLDivElement>;\n autoSave?: boolean;\n }\n>) => {\n const form = useForm(formOptions);\n\n useEffect(() => {\n if (!formRef?.current) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const keyIsEnter = event.key === 'Enter';\n const modifierUsed = event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;\n const inputIsTextarea = (event.target as HTMLElement).tagName.toLowerCase() === 'textarea';\n const inputOptOut = (event.target as HTMLElement).hasAttribute('data-no-submit');\n\n // Regular inputs: Submit on Enter (no modifiers).\n const shouldSubmitRegularInput = !inputIsTextarea && keyIsEnter && !modifierUsed;\n\n // Textareas: Submit only on Meta+Enter.\n const shouldSubmitTextarea = inputIsTextarea && keyIsEnter && event.metaKey;\n\n if ((shouldSubmitRegularInput || shouldSubmitTextarea) && !inputOptOut) {\n if (!autoSave && form.canSave) {\n form.handleSave();\n }\n if (autoSave && form.formIsValid) {\n (event.target as HTMLElement).blur();\n }\n }\n };\n\n const formElement = formRef.current;\n\n formElement.addEventListener('keydown', handleKeyDown);\n return () => formElement.removeEventListener('keydown', handleKeyDown);\n }, [formRef, form.canSave, form.formIsValid, form.handleSave, autoSave]);\n\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SchemaAST as AST, type Schema as S } from 'effect';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type BaseObject, getValue, setValue } from '@dxos/echo-schema';\nimport { type SimpleType, type JsonPath, createJsonPath, fromEffectValidationPath } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { validateSchema, type ValidationError } from '@dxos/schema';\nimport { type MaybePromise } from '@dxos/util';\n\n/**\n * Return type from `useForm` hook.\n */\nexport type FormHandler<T extends BaseObject> = {\n //\n // Form state management.\n //\n\n values: Partial<T>;\n errors: Record<JsonPath, string>;\n touched: Record<JsonPath, boolean>;\n changed: Record<JsonPath, boolean>;\n canSave: boolean;\n formIsValid: boolean;\n handleSave: () => void;\n\n //\n // Form input component helpers.\n //\n\n getStatus: (path: string | (string | number)[]) => { status?: 'error'; error?: string };\n getValue: <V>(path: (string | number)[]) => V | undefined;\n onValueChange: <V>(path: (string | number)[], type: SimpleType, value: V) => void;\n onTouched: (path: (string | number)[]) => void;\n};\n\n/**\n * Hook options.\n */\nexport interface FormOptions<T extends BaseObject> {\n /**\n * Effect schema (Type literal).\n */\n schema: S.Schema<T>;\n\n /**\n * Initial values (which may not pass validation).\n */\n initialValues: Partial<T>;\n\n /**\n * Callback for value changes. Note: This is called even when values are invalid.\n * Sometimes the parent component may want to know about changes even if the form is\n * in an invalid state.\n */\n onValuesChanged?: (values: Partial<T>) => void;\n\n /**\n * Custom validation function that runs only after schema validation passes.\n * Use this for complex validation logic that can't be expressed in the schema.\n * @returns Array of validation errors, or undefined if validation passes\n */\n // TODO(burdon): Change to key x value?\n onValidate?: (values: T) => ValidationError[] | undefined;\n\n /**\n * Called when the form is valid.\n */\n onValid?: (values: T, meta: { changed: FormHandler<T>['changed'] }) => void;\n\n /**\n * Called when the form is submitted and passes validation.\n */\n onSave?: (values: T, meta: { changed: FormHandler<T>['changed'] }) => MaybePromise<void>;\n}\n\n/**\n * Creates a hook for managing form state, including values, validation, and submission.\n * Deeply integrated with `@dxos/schema` for schema-based validation.\n */\nexport const useForm = <T extends BaseObject>({\n schema,\n initialValues,\n onValuesChanged,\n onValidate,\n onValid,\n onSave,\n}: FormOptions<T>): FormHandler<T> => {\n invariant(AST.isTypeLiteral(schema.ast));\n\n const [values, setValues] = useState<Partial<T>>(initialValues);\n useEffect(() => {\n setValues(initialValues);\n }, [initialValues]);\n\n const [touched, setTouched] = useState<Record<JsonPath, boolean>>(createKeySet(initialValues, false));\n const [changed, setChanged] = useState<Record<JsonPath, boolean>>(createKeySet(initialValues, false));\n const [errors, setErrors] = useState<Record<JsonPath, string>>({});\n const [saving, setSaving] = useState(false);\n\n //\n // Validation.\n //\n\n const validate = useCallback(\n (values: Partial<T>): values is T => {\n let errors: ValidationError[] = validateSchema(schema, values) ?? [];\n if (errors.length === 0 && onValidate) {\n const validatedValues = values as T;\n errors = onValidate(validatedValues) ?? [];\n }\n\n setErrors(flatMap(errors));\n const valid = errors.length === 0;\n return valid;\n },\n [schema, onValidate],\n );\n\n // Validate on schema change.\n const [schemaDirty, setSchemaDirty] = useState(false);\n useEffect(() => setSchemaDirty(true), [schema]);\n useEffect(() => {\n if (schemaDirty) {\n validate(values);\n setSchemaDirty(false);\n }\n }, [values, schemaDirty]);\n\n const formIsValid = useMemo(() => {\n return Object.keys(errors).length === 0;\n }, [errors]);\n\n /**\n * NOTE: We can submit if there is no touched field that has an error.\n * Basically, if there's a validation message visible in the form, submit should be disabled.\n */\n const canSave = useMemo(\n () =>\n !saving &&\n // Check if any error paths that are touched have errors.\n !Object.entries(touched).some(\n ([path, isTouched]) =>\n isTouched &&\n Object.keys(errors).some(\n (errorPath) => errorPath === path || errorPath.startsWith(`${path}.`) || errorPath.startsWith(`${path}[`),\n ),\n ),\n [touched, errors, saving],\n );\n\n const handleSave = useCallback(async () => {\n if (validate(values)) {\n setSaving(true);\n try {\n await onSave?.(values, { changed });\n } finally {\n setSaving(false);\n }\n }\n }, [values, validate, onSave, changed]);\n\n //\n // Fields.\n //\n\n const getStatus = useCallback<FormHandler<T>['getStatus']>(\n (path) => {\n const jsonPath = Array.isArray(path) ? createJsonPath(path) : path;\n const matchingError = Object.entries(errors).find(\n ([errorPath]) =>\n errorPath === jsonPath || errorPath.startsWith(`${jsonPath}.`) || errorPath.startsWith(`${jsonPath}[`),\n );\n\n // Only show errors for touched fields.\n const isTouched = touched[jsonPath as JsonPath];\n if (!isTouched) {\n return {\n status: undefined,\n error: undefined,\n };\n }\n\n return {\n status: matchingError ? 'error' : undefined,\n error: matchingError ? matchingError[1] : undefined,\n };\n },\n [errors, touched],\n );\n\n const getFormValue = useCallback<FormHandler<T>['getValue']>(\n <V>(path: (string | number)[]): V | undefined => {\n return getValue(values, createJsonPath(path));\n },\n [values],\n );\n\n const onValueChange = useCallback<FormHandler<T>['onValueChange']>(\n (path: (string | number)[], type: SimpleType, value: any) => {\n const jsonPath = createJsonPath(path);\n let parsedValue = value;\n try {\n if (type === 'number') {\n parsedValue = parseFloat(value as string) || 0;\n }\n } catch (err) {\n log.catch(err);\n parsedValue = undefined;\n }\n\n const newValues = { ...setValue(values, jsonPath, parsedValue) };\n setValues(newValues);\n setChanged((prev) => ({ ...prev, [jsonPath]: true }));\n onValuesChanged?.(newValues);\n\n const isValid = validate(newValues);\n if (isValid && onValid) {\n onValid(newValues, { changed });\n }\n },\n [values, onValuesChanged, validate, onValid, changed],\n );\n\n const onTouched = useCallback(\n (path: (string | number)[]) => {\n const jsonPath = createJsonPath(path);\n setTouched((touched) => ({ ...touched, [jsonPath]: true }));\n validate(values);\n },\n [validate, values],\n );\n\n return useMemo(\n () => ({\n // State.\n values,\n errors,\n touched,\n changed,\n canSave,\n formIsValid,\n\n // Actions.\n handleSave,\n\n // Field utils.\n getStatus,\n getValue: getFormValue,\n onValueChange,\n onTouched,\n }),\n [\n values,\n errors,\n touched,\n changed,\n canSave,\n formIsValid,\n handleSave,\n getStatus,\n getFormValue,\n onValueChange,\n onTouched,\n ],\n );\n};\n\nconst createKeySet = <T extends BaseObject, V>(obj: T, value: V): Record<JsonPath, V> => {\n invariant(obj);\n return Object.keys(obj).reduce((acc, key) => ({ ...acc, [key]: value }), {} as Record<JsonPath, V>);\n};\n\nconst flatMap = (errors: ValidationError[]) => {\n return errors.reduce(\n (result, { path, message }) => {\n // Convert the validation error path format to our JsonPath format.\n const jsonPath = fromEffectValidationPath(path);\n if (!(jsonPath in result)) {\n result[jsonPath] = message;\n }\n return result;\n },\n {} as Record<JsonPath, string>,\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { pipe } from 'effect';\nimport { capitalize } from 'effect/String';\nimport React, { useMemo } from 'react';\n\nimport { AST, S } from '@dxos/echo-schema';\nimport { createJsonPath, findNode, getDiscriminatedType, isDiscriminatedUnion } from '@dxos/effect';\nimport { mx } from '@dxos/react-ui-theme';\nimport { getSchemaProperties, type SchemaProperty } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { ArrayField } from './ArrayField';\nimport { SelectInput } from './Defaults';\nimport { type ComponentLookup } from './Form';\nimport { useInputProps, useFormValues } from './FormContext';\nimport { type InputComponent } from './Input';\nimport { RefField, type QueryRefOptions } from './RefField';\nimport { getInputComponent } from './factory';\n\nexport type FormFieldProps = {\n property: SchemaProperty<any>;\n path?: (string | number)[];\n readonly?: boolean;\n /** Used to indicate if input should be presented inline (e.g. for array items). */\n inline?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n Custom?: Partial<Record<string, InputComponent>>;\n};\n\nexport const FormField = ({\n property,\n path,\n readonly,\n inline,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormFieldProps) => {\n const inputProps = useInputProps(path);\n const { ast, name, type, format, title, description, options, examples, array } = property;\n\n const label = useMemo(() => title ?? pipe(name, capitalize), [title, name]);\n const placeholder = useMemo(\n () => (examples?.length ? `Example: \"${examples[0]}\"` : description),\n [examples, description],\n );\n\n const FoundComponent = lookupComponent?.({\n prop: name,\n schema: S.make(ast),\n inputProps: {\n type,\n format,\n label,\n disabled: readonly,\n placeholder,\n ...inputProps,\n },\n });\n\n if (FoundComponent) {\n return <div role='none'>{FoundComponent}</div>;\n }\n\n const jsonPath = createJsonPath(path ?? []);\n const CustomComponent = Custom?.[jsonPath];\n if (CustomComponent) {\n return (\n <CustomComponent\n type={type}\n format={format}\n label={label}\n inputOnly={inline}\n placeholder={placeholder}\n disabled={readonly}\n {...inputProps}\n />\n );\n }\n\n if (array) {\n return <ArrayField property={property} path={path} inputProps={inputProps} readonly={readonly} Custom={Custom} />;\n }\n\n const InputComponent = getInputComponent(type, format);\n if (InputComponent) {\n return (\n <div role='none'>\n <InputComponent\n type={type}\n format={format}\n label={label}\n inputOnly={inline}\n placeholder={placeholder}\n disabled={readonly}\n {...inputProps}\n />\n </div>\n );\n }\n\n if (options) {\n return (\n <div role='none'>\n <SelectInput\n type={type}\n format={format}\n disabled={readonly}\n inputOnly={inline}\n label={label}\n options={options.map((option) => ({ value: option, label: String(option) }))}\n placeholder={placeholder}\n {...inputProps}\n />\n </div>\n );\n }\n\n // TODO(ZaymonFC): Extract this to it's own component.\n if (format === 'ref') {\n return (\n <RefField\n ast={ast}\n type={type}\n label={label}\n readonly={readonly}\n placeholder={placeholder}\n inline={inline}\n onQueryRefOptions={onQueryRefOptions}\n inputProps={inputProps}\n />\n );\n }\n\n if (type === 'object') {\n const baseNode = findNode(ast, isDiscriminatedUnion);\n const typeLiteral = baseNode\n ? getDiscriminatedType(baseNode, inputProps.getValue() as any)\n : findNode(ast, AST.isTypeLiteral);\n\n if (typeLiteral) {\n return (\n <div role='none'>\n {!inline && <h3 className='text-lg mbs-2 mbe-1'>{label}</h3>}\n <FormFields\n schema={S.make(typeLiteral)}\n path={path}\n readonly={readonly}\n onQueryRefOptions={onQueryRefOptions}\n Custom={Custom}\n lookupComponent={lookupComponent}\n />\n </div>\n );\n }\n }\n\n return null;\n};\n\nexport type FormContentProps = {\n schema: S.Schema.All;\n path?: (string | number)[];\n filter?: (props: SchemaProperty<any>[]) => SchemaProperty<any>[];\n sort?: string[];\n readonly?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n Custom?: Partial<Record<string, InputComponent>>;\n};\n\nexport const FormFields = ({\n schema,\n path,\n filter,\n sort,\n readonly,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormContentProps) => {\n const values = useFormValues(path);\n\n const properties = useMemo(() => {\n const props = getSchemaProperties(schema.ast, values);\n const filtered = filter ? filter(props) : props;\n\n return sort ? filtered.sort((a, b) => sort.indexOf(a.name) - sort.indexOf(b.name)) : filtered;\n }, [schema, values, filter, sort]);\n\n return (\n <div role='form' className={mx('flex flex-col w-full gap-2')}>\n {properties\n .map((property) => {\n return (\n <FormField\n key={property.name}\n property={property}\n path={[...(path ?? []), property.name]}\n readonly={readonly}\n onQueryRefOptions={onQueryRefOptions}\n lookupComponent={lookupComponent}\n Custom={Custom}\n />\n );\n })\n .filter(isNotFalsy)}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { pipe } from 'effect';\nimport { capitalize } from 'effect/String';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { AST } from '@dxos/echo-schema';\nimport { findNode, getDiscriminatedType, isDiscriminatedUnion, SimpleType } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { getSchemaProperties, type SchemaProperty } from '@dxos/schema';\n\nimport { type ComponentLookup } from './Form';\nimport { FormField } from './FormContent';\nimport { useFormValues, type FormInputStateProps } from './FormContext';\nimport { InputHeader, type InputComponent } from './Input';\nimport { translationKey } from '../../translations';\n\nconst padding = 'px-2';\n\ntype ArrayFieldProps = {\n property: SchemaProperty<any>;\n readonly?: boolean;\n inputProps: FormInputStateProps;\n path?: (string | number)[];\n Custom?: Partial<Record<string, InputComponent>>;\n lookupComponent?: ComponentLookup;\n};\n\nexport const ArrayField = ({ property, readonly, path, inputProps, Custom, lookupComponent }: ArrayFieldProps) => {\n const { t } = useTranslation(translationKey);\n const { ast, name, type, title } = property;\n // TODO(wittjosiah): The fallback to an empty array stops the form from crashing but isn't immediately live.\n // It doesn't become live until another field is touched, but that's better than the whole form crashing.\n const values = (useFormValues(path ?? []) ?? []) as any[];\n invariant(Array.isArray(values), `Values at path ${path?.join('.')} must be an array.`);\n const label = title ?? pipe(name, capitalize);\n\n const tupleType = findNode(ast, AST.isTupleType);\n const elementType = (tupleType as AST.TupleType | undefined)?.rest[0]?.type;\n\n const getDefaultObjectValue = (typeNode: AST.AST): any => {\n const baseNode = findNode(typeNode, isDiscriminatedUnion);\n const typeLiteral = baseNode ? getDiscriminatedType(baseNode, {}) : findNode(typeNode, AST.isTypeLiteral);\n if (!typeLiteral) {\n return {};\n }\n\n return Object.fromEntries(getSchemaProperties(typeLiteral, {}).map((prop) => [prop.name, prop.defaultValue]));\n };\n\n const newValue = useMemo(() => {\n if (type === 'object' && elementType) {\n return getDefaultObjectValue(elementType);\n } else {\n return SimpleType.getDefaultValue(type);\n }\n }, [type, elementType]);\n\n const handleAdd = useCallback(() => {\n inputProps.onValueChange(type, [...values, newValue]);\n }, [type, elementType, inputProps, newValue, values]);\n\n const handleRemove = useCallback(\n (index: number) => {\n const newValues = values.filter((_, i) => i !== index);\n inputProps.onValueChange(type, newValues);\n },\n [type, inputProps, values],\n );\n\n if (!elementType) {\n return null;\n }\n\n return (\n <div role='none' className={mx(padding)}>\n <InputHeader>{label}</InputHeader>\n <div role='none' className='flex flex-col gap-1'>\n {values.map((_value, index) => (\n <div key={index} role='none' className='flex items-center gap-1'>\n <div role='none' className='flex-1'>\n <FormField\n property={{\n ...property,\n array: false, // NOTE(ZaymonFC): This breaks arrays of arrays but ¯\\_(ツ)_/¯. Ping me if you need that.\n ast: elementType,\n }}\n path={[...(path ?? []), index]}\n readonly={readonly}\n inline\n Custom={Custom}\n lookupComponent={lookupComponent}\n />\n </div>\n <IconButton\n icon='ph--trash--regular'\n iconOnly\n label={t('button remove')}\n onClick={() => handleRemove(index)}\n />\n </div>\n ))}\n </div>\n <div role='none' className='flex justify-between items-center plb-1'>\n <IconButton icon='ph--plus--regular' iconOnly label={t('button add')} onClick={handleAdd} />\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { useEffect, useState } from 'react';\n\nimport {\n type AST,\n Expando,\n getTypeAnnotation,\n Ref,\n ReferenceAnnotationId,\n type ReferenceAnnotationValue,\n type TypeAnnotation,\n} from '@dxos/echo-schema';\nimport { findAnnotation, type SimpleType } from '@dxos/effect';\nimport { DXN } from '@dxos/keys';\nimport { refFromDXN } from '@dxos/live-object';\nimport { log } from '@dxos/log';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { SelectInput, TextInput } from './Defaults';\nimport { type FormInputStateProps } from './FormContext';\n\nexport type QueryRefOptions = (type: TypeAnnotation) => MaybePromise<{ dxn: DXN; label?: string }[]>;\n\ntype RefFieldProps = {\n ast: AST.AST;\n type: SimpleType;\n label: string;\n readonly?: boolean;\n placeholder?: string;\n inline?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n inputProps: FormInputStateProps;\n};\n\nexport const RefField = ({\n ast,\n type,\n label,\n readonly,\n placeholder,\n inline,\n onQueryRefOptions,\n inputProps,\n}: RefFieldProps) => {\n const { getValue, onValueChange, ...restInputProps } = inputProps;\n const refTypeInfo = findAnnotation<ReferenceAnnotationValue>(ast, ReferenceAnnotationId);\n const [refOptions, setRefOptions] = useState<Array<{ value: string; label?: string }>>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!refTypeInfo || !onQueryRefOptions) {\n return;\n }\n\n const fetchOptions = async () => {\n setLoading(true);\n try {\n const options = await onQueryRefOptions(refTypeInfo);\n setRefOptions(\n options.map((option) => ({\n label: option.label,\n value: option.dxn.toString(),\n })),\n );\n } catch (error) {\n log.error('Failed to fetch ref options:', error);\n setRefOptions([]);\n } finally {\n setLoading(false);\n }\n };\n\n void fetchOptions();\n }, [refTypeInfo, onQueryRefOptions]);\n\n if (!refTypeInfo) {\n return null;\n }\n\n // If ref type is expando, fall back to taking a DXN in string format.\n if (refTypeInfo.typename === getTypeAnnotation(Expando)?.typename || !onQueryRefOptions) {\n const handleOnValueChange = (_type: any, dxnString: string) => {\n const dxn = DXN.tryParse(dxnString);\n if (dxn) {\n onValueChange?.('object', refFromDXN(dxn));\n } else if (dxnString === '') {\n onValueChange?.('object', undefined);\n } else {\n onValueChange?.('string', dxnString);\n }\n };\n\n const handleGetValue = () => {\n const formValue = getValue();\n if (typeof formValue === 'string') {\n return formValue;\n }\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString();\n }\n\n return undefined;\n };\n\n return (\n <TextInput\n type={type}\n label={label}\n disabled={readonly}\n placeholder={placeholder}\n inputOnly={inline}\n getValue={handleGetValue as <V>() => V | undefined}\n onValueChange={handleOnValueChange}\n {...restInputProps}\n />\n );\n }\n\n const handleGetValue = () => {\n const formValue = getValue();\n\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString();\n }\n\n return undefined;\n };\n\n const handleValueChanged = (_type: any, dxnString: string) => {\n const dxn = DXN.parse(dxnString);\n const ref = refFromDXN(dxn);\n\n onValueChange('object', ref);\n };\n\n return (\n <SelectInput\n type={type}\n label={label}\n disabled={readonly || loading}\n placeholder={loading ? 'Loading options...' : placeholder}\n inputOnly={inline}\n getValue={handleGetValue as <V>() => V | undefined}\n onValueChange={handleValueChanged}\n options={refOptions}\n {...restInputProps}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FormatEnum } from '@dxos/echo-schema';\nimport { type SimpleType } from '@dxos/effect';\n\nimport { BooleanInput, MarkdownInput, NumberInput, TextInput } from './Defaults';\nimport { type InputComponent } from './Input';\nimport { GeoPointInput } from './custom';\n\n/**\n * Get property input component.\n */\nexport const getInputComponent = (type: SimpleType, format?: FormatEnum): InputComponent | undefined => {\n switch (format) {\n case FormatEnum.GeoPoint:\n return GeoPointInput;\n case FormatEnum.Markdown:\n return MarkdownInput;\n }\n\n switch (type) {\n case 'string':\n return TextInput;\n case 'number':\n return NumberInput;\n case 'boolean':\n return BooleanInput;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { type SchemaRegistry } from '@dxos/echo-db';\nimport { AST, Format, type BaseSchema, S, type JsonProp } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, inputTextLabel, mx } from '@dxos/react-ui-theme';\nimport { FieldSchema, type FieldType, type ViewType, ViewProjection, VIEW_FIELD_LIMIT } from '@dxos/schema';\n\nimport { translationKey } from '../../translations';\nimport { FieldEditor } from '../FieldEditor';\nimport { Form } from '../Form';\n\nconst grid = 'grid grid-cols-[32px_1fr_32px] min-bs-[2.5rem]';\n\nconst ViewMetaSchema = S.Struct({\n name: S.String.annotations({\n [AST.TitleAnnotationId]: 'View',\n }),\n typename: Format.URL.annotations({\n [AST.TitleAnnotationId]: 'Typename',\n }),\n}).pipe(S.mutable);\n\ntype ViewMetaType = S.Schema.Type<typeof ViewMetaSchema>;\n\nexport type ViewEditorProps = ThemedClassName<{\n schema: BaseSchema;\n view: ViewType;\n registry?: SchemaRegistry;\n readonly?: boolean;\n showHeading?: boolean;\n onTypenameChanged?: (typename: string) => void;\n onDelete?: (fieldId: string) => void;\n}>;\n\n/**\n * Schema-based object form.\n */\nexport const ViewEditor = ({\n classNames,\n schema,\n view,\n registry,\n readonly,\n showHeading = false,\n onTypenameChanged,\n onDelete,\n}: ViewEditorProps) => {\n const { t } = useTranslation(translationKey);\n const projection = useMemo(() => new ViewProjection(schema.jsonSchema, view), [schema, view]);\n const [field, setField] = useState<FieldType>();\n\n // TODO(burdon): Should be reactive.\n const viewValues = useMemo(() => {\n return {\n name: view.name,\n // TODO(burdon): Need to warn user of possible consequences of editing.\n // TODO(burdon): Settings should have domain name owned by user.\n typename: view.query.typename,\n };\n }, [view]);\n\n const handleSelect = useCallback((field: FieldType) => {\n setField((f) => (f === field ? undefined : field));\n }, []);\n\n // TODO(burdon): Check if mutable; variant of useCallback that return undefined if readonly?\n\n const handleAdd = useCallback(() => {\n invariant(!schema.readonly);\n const field = projection.createFieldProjection();\n setField(field);\n }, [schema, view]);\n\n const handleUpdate = useCallback(\n ({ name, typename }: ViewMetaType) => {\n invariant(!schema.readonly);\n requestAnimationFrame(() => {\n if (view.name !== name) {\n view.name = name;\n }\n\n if (view.query.typename !== typename) {\n onTypenameChanged?.(typename);\n }\n });\n },\n [schema, view, onTypenameChanged],\n );\n\n const handleDelete = useCallback(\n (fieldId: string) => {\n invariant(!schema.readonly);\n if (fieldId === field?.id) {\n setField(undefined);\n }\n\n onDelete?.(fieldId);\n },\n [schema, field, onDelete],\n );\n\n const handleMove = useCallback(\n (fromIndex: number, toIndex: number) => {\n invariant(!schema.readonly);\n // NOTE(ZaymonFC): Using arrayMove here causes a race condition with the kanban model.\n const fields = [...view.fields];\n const [moved] = fields.splice(fromIndex, 1);\n fields.splice(toIndex, 0, moved);\n view.fields = fields;\n },\n [schema, view.fields],\n );\n\n const handleClose = useCallback(() => setField(undefined), []);\n\n const hiddenProperties = projection.getHiddenProperties();\n\n const handleHide = useCallback(\n (fieldId: string) => {\n setField(undefined);\n projection.hideFieldProjection(fieldId);\n },\n [projection],\n );\n\n const handleShow = useCallback(\n (property: string) => {\n setField(undefined);\n projection.showFieldProjection(property as JsonProp);\n },\n [projection],\n );\n\n return (\n <div role='none' className={mx('grid grid-rows-[1fr_1fr] min-bs-0', classNames)}>\n <Form<ViewMetaType>\n autoSave\n schema={ViewMetaSchema}\n values={viewValues}\n onSave={schema.readonly ? undefined : handleUpdate}\n classNames='min-bs-0 overflow-y-auto'\n />\n\n <div role='none' className='border-bs border-separator min-bs-0 overflow-y-auto'>\n {/* TODO(burdon): Clean up common form ux. */}\n <div role='none' className='p-2'>\n <label className={mx(inputTextLabel)}>{t('fields label')}</label>\n </div>\n\n <List.Root<FieldType>\n items={view.fields}\n isItem={S.is(FieldSchema)}\n getId={(field) => field.id}\n onMove={schema.readonly ? undefined : handleMove}\n >\n {({ items: fields }) => (\n <>\n {showHeading && (\n <div role='heading' className={grid}>\n <div />\n <div className='flex items-center text-sm'>{t('field path label')}</div>\n </div>\n )}\n\n <div role='list' className='flex flex-col w-full'>\n {fields?.map((field) => (\n <List.Item<FieldType> key={field.id} item={field} classNames={mx(grid, ghostHover, 'cursor-pointer')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelect(field)}>{field.path}</List.ItemTitle>\n <div className='flex items-center gap-2 -ml-4'>\n <List.ItemButton\n icon='ph--eye-slash--regular'\n disabled={view.fields.length <= 1}\n onClick={() => handleHide(field.id)}\n />\n {!schema.readonly && (\n <List.ItemDeleteButton\n icon='ph--trash--regular'\n disabled={view.fields.length <= 1}\n onClick={() => handleDelete(field.id)}\n />\n )}\n </div>\n </List.Item>\n ))}\n </div>\n </>\n )}\n </List.Root>\n\n {hiddenProperties.length > 0 && (\n <div>\n <div role='none' className='p-2'>\n <label className={mx(inputTextLabel)}>{t('hidden fields label')}</label>\n </div>\n\n <List.Root<string>\n items={hiddenProperties}\n isItem={(item): item is string => typeof item === 'string'}\n getId={(property) => property}\n >\n {({ items: properties }) => (\n <div role='list' className='flex flex-col w-full'>\n {properties?.map((property) => (\n <List.Item<string>\n key={property}\n item={property}\n classNames={mx(grid, ghostHover, 'cursor-pointer')}\n >\n <div />\n <List.ItemTitle>{property}</List.ItemTitle>\n <List.ItemButton icon='ph--eye--regular' onClick={() => handleShow(property)} />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n </div>\n )}\n </div>\n\n {field && (\n <FieldEditor\n key={field.id}\n view={view}\n projection={projection}\n field={field}\n registry={registry}\n onSave={handleClose}\n />\n )}\n\n {!readonly && !field && (\n <div className='flex p-2 justify-center'>\n <IconButton\n icon='ph--plus--regular'\n label={t('button add property')}\n onClick={schema.readonly ? undefined : handleAdd}\n // TODO(burdon): Show field limit in ux (not tooltip).\n disabled={view.fields.length >= VIEW_FIELD_LIMIT}\n />\n </div>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FormatEnum, GeoLocation, TypeEnum } from '@dxos/echo-schema';\nimport { type ValidationError } from '@dxos/schema';\n\n/**\n * Parse value by field value type.\n * Used by Table, Sheet, etc.\n * Handles various data types including booleans, numbers, dates, and strings.\n * Returns undefined for empty or null inputs.\n */\nexport type ParseProps = {\n type?: TypeEnum;\n format?: FormatEnum;\n value: any;\n};\n\nexport const parseValue = ({ type, format, value }: ParseProps) => {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n\n const parseScalar = (type?: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean: {\n if (typeof value === 'string') {\n const lowercaseValue = value.toLowerCase();\n if (lowercaseValue === '0' || lowercaseValue === 'false') {\n return false;\n } else if (lowercaseValue === '1' || lowercaseValue === 'true') {\n return true;\n }\n }\n return Boolean(value);\n }\n\n case TypeEnum.Number: {\n const cleaned = typeof value === 'string' ? value.replace(/[^0-9.-]+/g, '') : value;\n const num = Number(cleaned);\n return Number.isNaN(num) ? null : num;\n }\n\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default: {\n return value;\n }\n }\n };\n\n if (!format) {\n return parseScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean:\n return parseScalar(TypeEnum.Boolean);\n\n case FormatEnum.Number:\n case FormatEnum.Percent:\n case FormatEnum.Currency:\n return parseScalar(TypeEnum.Number);\n\n case FormatEnum.String:\n case FormatEnum.Markdown: {\n return parseScalar(TypeEnum.String);\n }\n\n case FormatEnum.Ref:\n throw new Error(`unexpected format: ${FormatEnum.Ref}`);\n\n case FormatEnum.DateTime:\n case FormatEnum.Date:\n case FormatEnum.Time:\n case FormatEnum.Timestamp: {\n const date = new Date(value as string | number);\n return isNaN(date.getTime()) ? null : date;\n }\n\n case FormatEnum.GeoPoint: {\n // Parse string in format \"lat,long\" to GeoPoint [longitude, latitude].\n if (typeof value === 'string') {\n // Only keep digits, decimal points, minus signs, and commas.\n const cleaned = value.replace(/[^0-9.,-]+/g, '');\n const parts = cleaned.split(',');\n if (parts.length === 2) {\n const lat = parseFloat(parts[0]);\n const long = parseFloat(parts[1]);\n if (!isNaN(lat) && !isNaN(long)) {\n return GeoLocation.toGeoPoint({ latitude: lat, longitude: long });\n }\n }\n }\n\n return [0, 0];\n }\n\n default: {\n return value;\n }\n }\n};\n\n// TODO(burdon): Type and format.\nexport type CellClassesForFieldTypeProps = {\n type?: TypeEnum;\n format?: FormatEnum;\n};\n\nexport const cellClassesForFieldType = ({ type, format }: CellClassesForFieldTypeProps): string[] | undefined => {\n if (!format) {\n switch (type) {\n case TypeEnum.Number:\n return ['text-right', 'font-mono'];\n case TypeEnum.Boolean:\n return ['text-right', 'font-mono'];\n case TypeEnum.String:\n return undefined;\n case TypeEnum.Ref:\n return undefined;\n\n default: {\n return undefined;\n }\n }\n }\n\n switch (format) {\n case FormatEnum.Markdown:\n return undefined;\n case FormatEnum.Time:\n case FormatEnum.Timestamp:\n case FormatEnum.DateTime:\n case FormatEnum.Date:\n case FormatEnum.Duration:\n return ['font-mono', 'text-right'];\n case FormatEnum.Currency:\n return ['text-right'];\n case FormatEnum.JSON:\n case FormatEnum.DID:\n return ['font-mono'];\n default:\n return undefined;\n }\n};\n\n// TODO(ZaymonFC): How to do this with translations?\nexport const pathNotUniqueError = (path: string): ValidationError => ({\n path: 'path',\n message: `'${path}' is already present`,\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { format as formatDate } from 'date-fns/format';\n\nimport { FormatEnum, GeoLocation, TypeEnum } from '@dxos/echo-schema';\n\ntype ValueFormatProps = {\n type: TypeEnum;\n format?: FormatEnum | undefined;\n value: any;\n locale?: string | undefined;\n};\n\n/**\n * Format value by type.\n * Used by Table, Sheet, etc.\n */\n// TODO(burdon): Move to react-ui-form.\n// TODO(burdon): Formatting is different from kind format (e.g., percent is not a data format).\nexport const formatForDisplay = ({ type, format, value, locale = undefined }: ValueFormatProps): string => {\n const formatScalar = (type: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean:\n return (value as boolean).toLocaleString().toUpperCase();\n case TypeEnum.Number:\n return value.toLocaleString(locale);\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default: {\n return String(value);\n }\n }\n };\n\n if (!format) {\n return formatScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean: {\n return formatScalar(TypeEnum.Boolean);\n }\n case FormatEnum.Number: {\n return formatScalar(TypeEnum.Number);\n }\n case FormatEnum.String:\n case FormatEnum.Ref: {\n return formatScalar(TypeEnum.String);\n }\n case FormatEnum.Percent: {\n return `${(value as number) * 100}%`;\n }\n case FormatEnum.Currency: {\n // TODO(burdon): Get from property annotation.\n return (value as number).toLocaleString(locale, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n }\n case FormatEnum.Date: {\n try {\n return formatDate(new Date(value as number), 'yyyy-MM-dd');\n } catch (error) {\n return 'Invalid Date';\n }\n }\n case FormatEnum.Time: {\n try {\n return formatDate(new Date(value as number), 'HH:mm:ss');\n } catch (error) {\n return 'Invalid Time';\n }\n }\n case FormatEnum.DateTime: {\n try {\n return formatDate(new Date(value as number), 'yyyy-MM-dd HH:mm:ss');\n } catch (error) {\n return 'Invalid DateTime';\n }\n }\n case FormatEnum.GeoPoint: {\n if (value === null || value === undefined) {\n return '';\n }\n\n // For GeoPoint format [longitude, latitude].\n if (Array.isArray(value) && value.length >= 2 && value.every(Number.isFinite)) {\n const { latitude, longitude } = GeoLocation.fromGeoPoint(value as [number, number]);\n return `${latitude},${longitude}`;\n }\n\n return String(value);\n }\n default: {\n if (value === null || value === 'undefined') {\n return '';\n }\n return String(value);\n }\n }\n};\n\nexport const formatForEditing = ({ type, format, value, locale = undefined }: ValueFormatProps): string => {\n const formatScalar = (type: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean:\n case TypeEnum.Number:\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default:\n return String(value);\n }\n };\n\n if (!format) {\n return formatScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean:\n case FormatEnum.Number:\n case FormatEnum.String:\n case FormatEnum.Ref: {\n return formatScalar(type);\n }\n case FormatEnum.Percent: {\n return String(value * 100);\n }\n case FormatEnum.Currency: {\n return String(value);\n }\n case FormatEnum.DateTime: {\n const date = new Date(value as number);\n return date.toISOString();\n }\n case FormatEnum.Date: {\n const date = new Date(value as number);\n return date.toISOString().split('T')[0];\n }\n case FormatEnum.Time: {\n const date = new Date(value as number);\n return date.toISOString().split('T')[1].split('.')[0];\n }\n case FormatEnum.GeoPoint: {\n // Handle null or undefined\n if (value === null || value === undefined) {\n return '';\n }\n\n // For GeoPoint format [longitude, latitude].\n if (Array.isArray(value) && value.length >= 2 && value.every(Number.isFinite)) {\n const { latitude, longitude } = GeoLocation.fromGeoPoint(value as [number, number]);\n return `${latitude},${longitude}`;\n }\n\n return String(value);\n }\n\n default: {\n return String(value);\n }\n }\n};\n"],
5
- "mappings": "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",
6
- "names": ["translationKey", "React", "Input", "mx", "textBlockWidth", "DeprecatedFormContainer", "children", "classNames", "div", "role", "className", "mx", "textBlockWidth", "DeprecatedFormInput", "label", "description", "secondary", "primary", "Input", "Root", "Label", "style", "fontSize", "DescriptionAndValidation", "Description", "React", "Button", "Input", "toLocalizedString", "useTranslation", "mx", "ControlPage", "children", "classNames", "props", "React", "div", "role", "className", "mx", "ControlSection", "title", "description", "ControlSectionHeading", "t", "useTranslation", "translationKey", "h2", "toLocalizedString", "p", "ControlGroupButton", "Button", "ControlGroup", "ControlFrame", "controlItemClasses", "controlItemTitleClasses", "controlItemDescriptionClasses", "ControlItem", "h3", "ControlItemInput", "Input", "Root", "Label", "DescriptionAndValidation", "Description", "ControlFrameItem", "React", "useCallback", "useEffect", "useMemo", "useState", "FormatEnum", "FormatEnums", "formatToType", "log", "useTranslation", "getFormatSchema", "getSchemaProperties", "sortProperties", "React", "useCallback", "useState", "useEffect", "useMemo", "GeoLocation", "Input", "useTranslation", "safeParseFloat", "React", "Icon", "Tooltip", "errorText", "InputHeader", "children", "error", "React", "div", "role", "className", "Tooltip", "Root", "Trigger", "asChild", "Icon", "icon", "size", "classNames", "errorText", "Content", "side", "Arrow", "GeoPointInput", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "onBlur", "t", "useTranslation", "translationKey", "status", "error", "geoPoint", "useMemo", "geoLocation", "GeoLocation", "fromGeoPoint", "longitudeText", "setLongitudeText", "useState", "longitude", "toString", "latitudeText", "setLatitudeText", "latitude", "useEffect", "location", "handleCoordinateChange", "useCallback", "coordinateType", "setText", "event", "inputText", "target", "value", "coord", "safeParseFloat", "undefined", "isNaN", "currentLocation", "newLocation", "newValue", "toGeoPoint", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "role", "className", "TextInput", "pattern", "placeholder", "onChange", "React", "useCallback", "useEffect", "useState", "useRef", "PublicKey", "Icon", "IconButton", "Input", "Tag", "Toolbar", "useTranslation", "List", "HuePicker", "hues", "mx", "SelectOptionInput", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "selected", "setSelectedId", "useState", "isNewOption", "setIsNewOption", "inputRef", "useRef", "t", "useTranslation", "translationKey", "status", "error", "options", "useEffect", "undefined", "randomHue", "usedHues", "Set", "map", "option", "color", "unusedHues", "hues", "filter", "hue", "has", "length", "Math", "floor", "random", "lastThree", "slice", "availableHues", "handleAdd", "useCallback", "newId", "PublicKey", "truncate", "newOption", "id", "title", "handleDelete", "newOptions", "handleMove", "from", "to", "removed", "splice", "handleClick", "current", "handleTitleChange", "e", "o", "target", "value", "handleKeyDown", "key", "handleColorChange", "focus", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "role", "List", "items", "isItem", "item", "onMove", "className", "Item", "classNames", "mx", "aria-expanded", "ItemDragHandle", "ItemTitle", "onClick", "Tag", "palette", "Icon", "icon", "TextInput", "placeholder", "ref", "onChange", "onKeyDown", "data-no-submit", "Toolbar", "HuePicker", "rootVariant", "IconButton", "iconOnly", "span", "React", "Input", "mx", "safeParseFloat", "gridCols", "TupleInput", "binding", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "onBlur", "status", "error", "values", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "className", "mx", "length", "map", "prop", "TextInput", "key", "value", "onChange", "event", "safeParseFloat", "target", "React", "useCallback", "useEffect", "useRef", "Input", "Select", "TextInput", "type", "label", "inputOnly", "disabled", "placeholder", "getStatus", "getValue", "onValueChange", "onBlur", "status", "error", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "value", "onChange", "event", "target", "Validation", "NumberInput", "DescriptionAndValidation", "BooleanInput", "checked", "Boolean", "Switch", "onCheckedChange", "SelectInput", "options", "Select", "TriggerButton", "classNames", "Portal", "Content", "Viewport", "map", "Option", "key", "String", "MarkdownInput", "textareaRef", "useRef", "adjustHeight", "useCallback", "textarea", "current", "style", "blockSize", "scrollHeight", "useEffect", "TextArea", "ref", "resize", "spellCheck", "React", "useEffect", "useMemo", "useRef", "mx", "React", "IconButton", "useTranslation", "mx", "React", "createContext", "useContext", "useEffect", "useMemo", "raise", "getValue", "createJsonPath", "SchemaAST", "AST", "useCallback", "useEffect", "useMemo", "useState", "getValue", "setValue", "createJsonPath", "fromEffectValidationPath", "invariant", "log", "validateSchema", "useForm", "schema", "initialValues", "onValuesChanged", "onValidate", "onValid", "onSave", "isTypeLiteral", "ast", "values", "setValues", "touched", "setTouched", "createKeySet", "changed", "setChanged", "errors", "setErrors", "saving", "setSaving", "validate", "length", "validatedValues", "flatMap", "valid", "schemaDirty", "setSchemaDirty", "formIsValid", "Object", "keys", "canSave", "entries", "some", "path", "isTouched", "errorPath", "startsWith", "handleSave", "getStatus", "jsonPath", "Array", "isArray", "matchingError", "find", "status", "undefined", "error", "getFormValue", "onValueChange", "type", "value", "parsedValue", "parseFloat", "err", "catch", "newValues", "prev", "isValid", "onTouched", "obj", "reduce", "acc", "key", "result", "message", "FormContext", "createContext", "undefined", "useFormContext", "useContext", "raise", "Error", "useFormValues", "path", "values", "formValues", "jsonPath", "createJsonPath", "getValue", "useInputProps", "getStatus", "getFormValue", "onValueChange", "onTouched", "stablePath", "useMemo", "Array", "isArray", "join", "type", "value", "onBlur", "FormProvider", "children", "formRef", "autoSave", "formOptions", "form", "useForm", "useEffect", "current", "handleKeyDown", "event", "keyIsEnter", "key", "modifierUsed", "ctrlKey", "altKey", "metaKey", "shiftKey", "inputIsTextarea", "target", "tagName", "toLowerCase", "inputOptOut", "hasAttribute", "shouldSubmitRegularInput", "shouldSubmitTextarea", "canSave", "handleSave", "formIsValid", "blur", "formElement", "addEventListener", "removeEventListener", "React", "Provider", "FormActions", "onCancel", "readonly", "t", "useTranslation", "translationKey", "canSave", "handleSave", "useFormContext", "React", "div", "role", "className", "mx", "IconButton", "data-testid", "icon", "label", "onClick", "type", "disabled", "pipe", "capitalize", "React", "useMemo", "AST", "S", "createJsonPath", "findNode", "getDiscriminatedType", "isDiscriminatedUnion", "mx", "getSchemaProperties", "isNotFalsy", "pipe", "capitalize", "React", "useCallback", "useMemo", "AST", "findNode", "getDiscriminatedType", "isDiscriminatedUnion", "SimpleType", "invariant", "IconButton", "useTranslation", "mx", "getSchemaProperties", "padding", "ArrayField", "property", "readonly", "path", "inputProps", "Custom", "lookupComponent", "t", "useTranslation", "translationKey", "ast", "name", "type", "title", "values", "useFormValues", "invariant", "Array", "isArray", "join", "label", "pipe", "capitalize", "tupleType", "findNode", "AST", "isTupleType", "elementType", "rest", "getDefaultObjectValue", "typeNode", "baseNode", "isDiscriminatedUnion", "typeLiteral", "getDiscriminatedType", "isTypeLiteral", "Object", "fromEntries", "getSchemaProperties", "map", "prop", "defaultValue", "newValue", "useMemo", "SimpleType", "getDefaultValue", "handleAdd", "useCallback", "onValueChange", "handleRemove", "index", "newValues", "filter", "_", "i", "React", "div", "role", "className", "mx", "InputHeader", "_value", "key", "FormField", "array", "inline", "IconButton", "icon", "iconOnly", "onClick", "React", "useEffect", "useState", "Expando", "getTypeAnnotation", "Ref", "ReferenceAnnotationId", "findAnnotation", "DXN", "refFromDXN", "log", "RefField", "ast", "type", "label", "readonly", "placeholder", "inline", "onQueryRefOptions", "inputProps", "getValue", "onValueChange", "restInputProps", "refTypeInfo", "findAnnotation", "ReferenceAnnotationId", "refOptions", "setRefOptions", "useState", "loading", "setLoading", "useEffect", "fetchOptions", "options", "map", "option", "value", "dxn", "toString", "error", "log", "typename", "getTypeAnnotation", "Expando", "handleOnValueChange", "_type", "dxnString", "DXN", "tryParse", "refFromDXN", "undefined", "handleGetValue", "formValue", "Ref", "isRef", "React", "TextInput", "disabled", "inputOnly", "handleValueChanged", "parse", "ref", "SelectInput", "FormatEnum", "getInputComponent", "type", "format", "FormatEnum", "GeoPoint", "GeoPointInput", "Markdown", "MarkdownInput", "TextInput", "NumberInput", "BooleanInput", "FormField", "property", "path", "readonly", "inline", "onQueryRefOptions", "lookupComponent", "Custom", "inputProps", "useInputProps", "ast", "name", "type", "format", "title", "description", "options", "examples", "array", "label", "useMemo", "pipe", "capitalize", "placeholder", "length", "FoundComponent", "prop", "schema", "S", "make", "disabled", "React", "div", "role", "jsonPath", "createJsonPath", "CustomComponent", "inputOnly", "ArrayField", "InputComponent", "getInputComponent", "SelectInput", "map", "option", "value", "String", "RefField", "baseNode", "findNode", "isDiscriminatedUnion", "typeLiteral", "getDiscriminatedType", "getValue", "AST", "isTypeLiteral", "h3", "className", "FormFields", "filter", "sort", "values", "useFormValues", "properties", "props", "getSchemaProperties", "filtered", "a", "b", "indexOf", "mx", "key", "isNotFalsy", "Form", "classNames", "schema", "values", "initialValues", "path", "autoFocus", "readonly", "filter", "sort", "autoSave", "testId", "onValuesChanged", "onValidate", "onSave", "onCancel", "onQueryRefOptions", "lookupComponent", "Custom", "formRef", "useRef", "onValid", "useMemo", "undefined", "useEffect", "current", "input", "querySelector", "focus", "React", "FormProvider", "div", "ref", "role", "className", "mx", "data-testid", "FormFields", "FormActions", "FieldEditor", "view", "projection", "field", "registry", "onSave", "onCancel", "t", "useTranslation", "translationKey", "props", "setProps", "useState", "getFieldProjection", "id", "useEffect", "schemas", "setSchemas", "subscription", "query", "subscribe", "results", "fire", "setTimeout", "run", "clearTimeout", "referenceSchema", "setReferenceSchema", "find", "schema", "typename", "fieldSchema", "setFieldSchema", "getFormatSchema", "format", "handleValuesChanged", "useCallback", "_props", "prev", "newSchema", "type", "formatToType", "handleValidate", "property", "fields", "f", "path", "message", "handleSave", "setFieldProjection", "handleCancel", "requestAnimationFrame", "Custom", "useMemo", "React", "SelectInput", "options", "FormatEnums", "filter", "value", "FormatEnum", "None", "map", "label", "getSchemaProperties", "ast", "sort", "sortProperties", "p", "name", "SelectOptionInput", "propIsNotType", "log", "warn", "Form", "key", "autoFocus", "values", "onValuesChanged", "onValidate", "React", "useCallback", "useMemo", "useState", "AST", "Format", "S", "invariant", "IconButton", "useTranslation", "List", "ghostHover", "inputTextLabel", "mx", "FieldSchema", "ViewProjection", "VIEW_FIELD_LIMIT", "grid", "ViewMetaSchema", "S", "Struct", "name", "String", "annotations", "AST", "TitleAnnotationId", "typename", "Format", "URL", "pipe", "mutable", "ViewEditor", "classNames", "schema", "view", "registry", "readonly", "showHeading", "onTypenameChanged", "onDelete", "t", "useTranslation", "translationKey", "projection", "useMemo", "ViewProjection", "jsonSchema", "field", "setField", "useState", "viewValues", "query", "handleSelect", "useCallback", "f", "undefined", "handleAdd", "invariant", "createFieldProjection", "handleUpdate", "requestAnimationFrame", "handleDelete", "fieldId", "id", "handleMove", "fromIndex", "toIndex", "fields", "moved", "splice", "handleClose", "hiddenProperties", "getHiddenProperties", "handleHide", "hideFieldProjection", "handleShow", "property", "showFieldProjection", "React", "div", "role", "className", "mx", "Form", "autoSave", "values", "onSave", "label", "inputTextLabel", "List", "Root", "items", "isItem", "is", "FieldSchema", "getId", "onMove", "map", "Item", "key", "item", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "path", "ItemButton", "icon", "disabled", "length", "ItemDeleteButton", "properties", "FieldEditor", "IconButton", "VIEW_FIELD_LIMIT", "FormatEnum", "GeoLocation", "TypeEnum", "parseValue", "type", "format", "value", "undefined", "parseScalar", "TypeEnum", "Boolean", "lowercaseValue", "toLowerCase", "Number", "cleaned", "replace", "num", "isNaN", "String", "Ref", "FormatEnum", "Percent", "Currency", "Markdown", "Error", "DateTime", "Date", "Time", "Timestamp", "date", "getTime", "GeoPoint", "parts", "split", "length", "lat", "parseFloat", "long", "GeoLocation", "toGeoPoint", "latitude", "longitude", "cellClassesForFieldType", "Duration", "JSON", "DID", "pathNotUniqueError", "path", "message", "format", "formatDate", "FormatEnum", "GeoLocation", "TypeEnum", "formatForDisplay", "type", "format", "value", "locale", "undefined", "formatScalar", "TypeEnum", "Boolean", "toLocaleString", "toUpperCase", "Number", "String", "Ref", "FormatEnum", "Percent", "Currency", "style", "currency", "minimumFractionDigits", "maximumFractionDigits", "Date", "formatDate", "error", "Time", "DateTime", "GeoPoint", "Array", "isArray", "length", "every", "isFinite", "latitude", "longitude", "GeoLocation", "fromGeoPoint", "formatForEditing", "date", "toISOString", "split"]
3
+ "sources": ["../../../src/translations.ts", "../../../src/components/deprecated/FormInput.tsx", "../../../src/components/ControlSection/ControlSection.tsx", "../../../src/components/FieldEditor/FieldEditor.tsx", "../../../src/components/Form/custom/GeoPointInput.tsx", "../../../src/components/Form/Input.tsx", "../../../src/components/Form/custom/SelectOptionsInput.tsx", "../../../src/components/Form/custom/TupleInput.tsx", "../../../src/components/Form/Defaults.tsx", "../../../src/components/Form/Form.tsx", "../../../src/components/Form/FormActions.tsx", "../../../src/components/Form/FormContext.tsx", "../../../src/hooks/useForm.ts", "../../../src/hooks/useRefQueryLookupHandler.ts", "../../../src/hooks/useQueryRefOptions.ts", "../../../src/components/Form/FormContent.tsx", "../../../src/components/Form/ArrayField.tsx", "../../../src/util/field.ts", "../../../src/util/formatting.ts", "../../../src/util/refs.ts", "../../../src/util/schema.ts", "../../../src/components/Form/RefField.tsx", "../../../src/components/Form/factory.tsx", "../../../src/components/ViewEditor/ViewEditor.tsx"],
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nexport const translationKey = 'react-ui-form';\n\nexport default [\n {\n 'en-US': {\n [translationKey]: {\n 'fields label': 'Fields',\n 'hidden fields label': 'Hidden Fields',\n\n // TODO(burdon): Standardize field/property.\n 'button add property': 'Add property',\n 'field property label': 'Property',\n 'field property placeholder': 'Property name',\n 'field format label': 'Type',\n 'field path label': 'Field path',\n 'add field': 'Add field',\n 'delete field': 'Delete field',\n 'field limit reached': 'Maximum number of fields reached',\n\n // TODO(burdon): Factor out?\n 'button cancel': 'Cancel',\n 'button save': 'Save',\n\n // FormatEnum\n 'format boolean': 'Boolean',\n 'format currency': 'Currency',\n 'format date': 'Date',\n 'format date-time': 'DateTime',\n 'format did': 'DID',\n 'format duration': 'Duration',\n 'format email': 'Email',\n 'format formula': 'Formula',\n 'format hostname': 'Hostname',\n 'format integer': 'Integer',\n 'format json': 'JSON',\n 'format latlng': 'Geopoint',\n 'format markdown': 'Markdown',\n 'format percent': 'Percent',\n 'format ref': 'Reference',\n 'format regex': 'RegExp',\n 'format string': 'String',\n 'format single-select': 'Select',\n 'format text': 'Long text',\n 'format time': 'Time',\n 'format timestamp': 'Timestamp',\n 'format user': 'User',\n 'format number': 'Number',\n 'format uri': 'URI',\n 'format uuid': 'UUID',\n\n // Placeholders\n 'placeholder latitude': 'Latitude',\n 'placeholder longitude': 'Longitude',\n\n // SelectOptionsInput\n 'select option label': 'Label',\n 'select option label placeholder': 'Option label',\n 'select option color': 'Color',\n 'select option delete': 'Delete',\n 'select option add': 'Add option',\n },\n },\n },\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport React, { type JSX, type PropsWithChildren } from 'react';\n\nimport { Input, type ThemedClassName } from '@dxos/react-ui';\nimport { mx, textBlockWidth } from '@dxos/react-ui-theme';\n\n/**\n * @deprecated\n */\nexport const DeprecatedFormContainer = ({ children, classNames }: ThemedClassName<PropsWithChildren>) => {\n return (\n <div role='none' className='container-max-width p-4 justify-center overflow-x-hidden overflow-y-auto'>\n <div role='form' className={mx('flex flex-col', textBlockWidth, classNames)}>\n {children}\n </div>\n </div>\n );\n};\n\nexport type DeprecatedFormInputProps = {\n label: string;\n description?: JSX.Element;\n secondary?: JSX.Element;\n};\n\n/**\n * @deprecated\n */\nexport const DeprecatedFormInput = ({\n label,\n description,\n secondary,\n children,\n}: PropsWithChildren<DeprecatedFormInputProps>) => {\n const primary = (\n <div role='none' className='flex w-full gap-4 py-1'>\n <Input.Root>\n <div role='none' className='flex flex-col w-full'>\n <Input.Label classNames='flex min-bs-[--rail-action] items-center' style={{ fontSize: 'unset' }}>\n {label}\n </Input.Label>\n {description && (\n <Input.DescriptionAndValidation classNames='mbs-0.5'>\n <Input.Description>{description}</Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n\n <div role='none'>\n <div role='none' className='flex min-bs-[--rail-action] items-center'>\n {children}\n </div>\n </div>\n </Input.Root>\n </div>\n );\n\n if (secondary) {\n return (\n <div role='none'>\n {primary}\n {secondary}\n </div>\n );\n }\n\n return primary;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ComponentPropsWithoutRef, type PropsWithChildren } from 'react';\n\nimport {\n Button,\n type ButtonProps,\n type Label,\n Input,\n type ThemedClassName,\n toLocalizedString,\n useTranslation,\n} from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../translations';\n\nexport type ControlPageProps = ThemedClassName<ComponentPropsWithoutRef<'div'>>;\n\nexport const ControlPage = ({ children, classNames, ...props }: ControlPageProps) => {\n return (\n <div role='none' className={mx('pli-2', classNames)} {...props}>\n {children}\n </div>\n );\n};\n\nexport type ControlSectionProps = PropsWithChildren<{\n title: Label;\n description?: Label;\n}>;\n\nexport const ControlSection = ({ title, description, children }: ControlSectionProps) => {\n return (\n <>\n <ControlSectionHeading title={title} description={description} />\n {children}\n </>\n );\n};\n\nexport const ControlSectionHeading = ({ title, description }: Omit<ControlSectionProps, 'children'>) => {\n const { t } = useTranslation(translationKey);\n return (\n <>\n <h2 className='pli-4 container-max-width text-xl mbs-6 mbe-4'>{toLocalizedString(title, t)}</h2>\n {description && (\n <p className='pli-4 mlb-4 container-max-width text-description'>{toLocalizedString(description, t)}</p>\n )}\n </>\n );\n};\n\nexport const ControlGroupButton = ({ classNames, ...props }: ButtonProps) => {\n return <Button {...props} classNames={['md:col-span-2', classNames]} />;\n};\n\nexport type ControlGroupProps = ThemedClassName<PropsWithChildren<{}>>;\n\nexport const ControlGroup = ({ children, classNames }: ControlGroupProps) => (\n <div\n role='none'\n className={mx('group container-max-width grid grid-cols-1 md:grid-cols-[1fr_min-content] gap-4', classNames)}\n >\n {children}\n </div>\n);\n\nexport const ControlFrame = ({ children }: ControlGroupProps) => (\n <div\n role='none'\n className='p-4 border border-separator rounded-lg container-max-width grid grid-cols-1 md:grid-cols-[1fr_1fr] gap-2 md:gap-8'\n >\n {children}\n </div>\n);\n\nexport type ControlItemProps = PropsWithChildren<{\n title: Label;\n description?: Label;\n}>;\n\nexport const controlItemClasses =\n 'p-4 border border-separator rounded-lg container-max-width grid md:col-span-2 grid-cols-subgrid items-center';\n\nconst controlItemTitleClasses = 'text-lg font-normal mbe-2';\nconst controlItemDescriptionClasses = 'text-base mlb-2 md:mbe-0 text-description';\n\nexport const ControlItem = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <div className={controlItemClasses}>\n <div role='none'>\n <h3 className={controlItemTitleClasses}>{toLocalizedString(title, t)}</h3>\n {description && <p className={controlItemDescriptionClasses}>{toLocalizedString(description, t)}</p>}\n </div>\n {children}\n </div>\n );\n};\n\nexport const ControlItemInput = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <Input.Root>\n <div className={controlItemClasses}>\n <div role='none'>\n <Input.Label classNames={controlItemTitleClasses}>{toLocalizedString(title, t)}</Input.Label>\n {description && (\n <Input.DescriptionAndValidation>\n <Input.Description classNames={controlItemDescriptionClasses}>\n {toLocalizedString(description, t)}\n </Input.Description>\n </Input.DescriptionAndValidation>\n )}\n </div>\n {children}\n </div>\n </Input.Root>\n );\n};\n\nexport const ControlFrameItem = ({ title, description, children }: ControlItemProps) => {\n const { t } = useTranslation(translationKey);\n\n return (\n <div role='group' className='min-is-0'>\n <h3 className='text-lg mbe-2'>{toLocalizedString(title, t)}</h3>\n {description && <p className='mlb-2 md:mbe-0 text-description'>{toLocalizedString(description, t)}</p>}\n {children}\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type SchemaRegistry } from '@dxos/echo-db';\nimport { FormatEnum, FormatEnums, formatToType, type EchoSchema } from '@dxos/echo-schema';\nimport { log } from '@dxos/log';\nimport { useTranslation } from '@dxos/react-ui';\nimport {\n getFormatSchema,\n getSchemaProperties,\n sortProperties,\n type FieldType,\n type PropertyType,\n type ViewType,\n type ViewProjection,\n type SchemaProperty,\n} from '@dxos/schema';\n\nimport { translationKey } from '../../translations';\nimport { Form, type FormProps, type InputComponent, SelectInput, SelectOptionInput } from '../Form';\n\nexport type FieldEditorProps = {\n view: ViewType;\n projection: ViewProjection;\n field: FieldType;\n registry?: SchemaRegistry;\n onSave: () => void;\n onCancel?: () => void;\n};\n\n/**\n * Displays a Form representing the metadata for a given `Field` and `View`.\n */\nexport const FieldEditor = ({ view, projection, field, registry, onSave, onCancel }: FieldEditorProps) => {\n const { t } = useTranslation(translationKey);\n const [props, setProps] = useState<PropertyType>(projection.getFieldProjection(field.id).props);\n useEffect(() => setProps(projection.getFieldProjection(field.id).props), [field, projection]);\n\n const [schemas, setSchemas] = useState<EchoSchema[]>([]);\n useEffect(() => {\n if (!registry) {\n return;\n }\n\n const subscription = registry.query().subscribe((query) => setSchemas(query.results), { fire: true });\n\n // TODO(dmaretskyi): This shouldn't be needed.\n const t = setTimeout(async () => {\n const schemas = await registry.query().run();\n setSchemas(schemas);\n });\n return () => {\n clearTimeout(t);\n subscription?.();\n };\n }, [registry]);\n\n const [referenceSchema, setReferenceSchema] = useState<EchoSchema>();\n useEffect(() => {\n setReferenceSchema(schemas.find((schema) => schema.typename === props?.referenceSchema));\n }, [schemas, props?.referenceSchema]);\n\n // TODO(burdon): Need to wrap otherwise throws error:\n // Class constructor SchemaClass cannot be invoked without 'new'.\n const [{ fieldSchema }, setFieldSchema] = useState({ fieldSchema: getFormatSchema(props?.format) });\n\n const handleValuesChanged = useCallback<NonNullable<FormProps<PropertyType>['onValuesChanged']>>(\n (_props) => {\n // TODO(burdon): Callback should pass `changed` to indicate which fields have changed.\n // TODO(Zaymon): Workout why old and new format values are the same sometimes even when\n // selecting novel format values.\n setFieldSchema((prev) => {\n const fieldSchema = getFormatSchema(_props.format);\n if (prev.fieldSchema === fieldSchema) {\n return prev;\n }\n return { fieldSchema };\n });\n setReferenceSchema((prev) => {\n if (_props.referenceSchema !== prev?.typename) {\n const newSchema = schemas.find((schema) => schema.typename === _props.referenceSchema);\n if (newSchema) {\n return newSchema;\n }\n }\n return prev;\n });\n\n setProps((props) => {\n const type = formatToType[_props.format as keyof typeof formatToType];\n if (props.type !== type) {\n return { ...props, ..._props, type };\n }\n\n return _props as PropertyType;\n });\n },\n [schemas, props.format, props.referenceSchema],\n );\n\n const handleValidate = useCallback<NonNullable<FormProps<PropertyType>['onValidate']>>(\n ({ property }) => {\n if (property && view.fields.find((f) => f.path === property && f.path !== field.path)) {\n return [\n {\n path: 'property',\n message: `property is not unique: '${property}'`,\n },\n ];\n }\n },\n [view.fields, field],\n );\n\n const handleSave = useCallback<NonNullable<FormProps<PropertyType>['onSave']>>(\n (props) => {\n projection.setFieldProjection({ field, props });\n onSave();\n },\n [projection, field, onSave],\n );\n\n const handleCancel = useCallback<NonNullable<FormProps<PropertyType>['onCancel']>>(() => {\n // Need to defer to allow form to close.\n requestAnimationFrame(() => onCancel?.());\n onSave();\n }, [onSave]);\n\n const Custom: Partial<Record<string, InputComponent>> = useMemo(\n () => ({\n ['format' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={FormatEnums.filter((value) => value !== FormatEnum.None).map((value) => ({\n value,\n label: t(`format ${value}`),\n }))}\n />\n ),\n ['referenceSchema' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={schemas.map((schema) => ({\n value: schema.typename,\n }))}\n />\n ),\n ['referencePath' satisfies keyof PropertyType]: (props) => (\n <SelectInput\n {...props}\n options={\n referenceSchema\n ? getSchemaProperties(referenceSchema.ast)\n .sort(sortProperties)\n .map((p) => ({ value: p.name }))\n : []\n }\n />\n ),\n ['options' satisfies keyof PropertyType]: (props) => <SelectOptionInput {...props} />,\n }),\n [t, schemas, referenceSchema],\n );\n\n const propIsNotType = useCallback(\n (props: SchemaProperty<PropertyType>[]) => props.filter((p) => p.name !== 'type'),\n [],\n );\n\n if (!fieldSchema) {\n log.warn('invalid format', { props });\n return null;\n }\n\n return (\n <Form<PropertyType>\n key={field.id}\n autoFocus\n values={props}\n schema={fieldSchema}\n filter={propIsNotType}\n sort={['property', 'format']}\n onValuesChanged={handleValuesChanged}\n onValidate={handleValidate}\n onSave={handleSave}\n onCancel={handleCancel}\n Custom={Custom}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useState, useEffect, useMemo, type ChangeEvent } from 'react';\n\nimport { type GeoPoint, GeoLocation } from '@dxos/echo-schema';\nimport { Input, useTranslation } from '@dxos/react-ui';\nimport { safeParseFloat } from '@dxos/util';\n\nimport { translationKey } from '../../../translations';\nimport { InputHeader, type InputProps } from '../Input';\n\nexport const GeoPointInput = ({ type, label, disabled, getStatus, getValue, onValueChange, onBlur }: InputProps) => {\n const { t } = useTranslation(translationKey);\n const { status, error } = getStatus();\n const geoPoint = useMemo<GeoPoint>(() => getValue<GeoPoint>() ?? [0, 0], [getValue]);\n const geoLocation = useMemo(() => GeoLocation.fromGeoPoint(geoPoint), [geoPoint]);\n\n const [longitudeText, setLongitudeText] = useState(geoLocation.longitude?.toString());\n const [latitudeText, setLatitudeText] = useState(geoLocation.latitude?.toString());\n\n useEffect(() => {\n const location = GeoLocation.fromGeoPoint(geoPoint);\n setLongitudeText(location.longitude.toString());\n setLatitudeText(location.latitude.toString());\n }, [geoPoint]);\n\n const handleCoordinateChange = useCallback(\n (coordinateType: keyof Pick<GeoLocation, 'longitude' | 'latitude'>, setText: (text: string) => void) =>\n (event: ChangeEvent<HTMLInputElement>) => {\n const inputText = event.target.value;\n setText(inputText);\n if (inputText !== '' && inputText !== '-') {\n const coord = safeParseFloat(inputText);\n if (coord !== undefined && !isNaN(coord)) {\n const currentLocation = GeoLocation.fromGeoPoint(getValue<GeoPoint>() ?? [0, 0]);\n const newLocation = { ...currentLocation, [coordinateType]: coord };\n const newValue = GeoLocation.toGeoPoint(newLocation);\n onValueChange(type, newValue);\n }\n }\n },\n [getValue, onValueChange, type],\n );\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div role='none' className='grid grid-cols-2 gap-2'>\n <Input.TextInput\n type='text'\n pattern='^-?[0-9]*\\.?[0-9]*$'\n disabled={disabled}\n placeholder={t('placeholder latitude')}\n value={latitudeText}\n onChange={handleCoordinateChange('latitude', setLatitudeText)}\n onBlur={onBlur}\n />\n <Input.TextInput\n type='text'\n pattern='^-?[0-9]*\\.?[0-9]*$'\n disabled={disabled}\n placeholder={t('placeholder longitude')}\n value={longitudeText}\n onChange={handleCoordinateChange('longitude', setLongitudeText)}\n onBlur={onBlur}\n />\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { type FC, type PropsWithChildren } from 'react';\n\nimport { type FormatEnum } from '@dxos/echo-schema';\nimport { type SimpleType } from '@dxos/effect';\nimport { Icon, Tooltip } from '@dxos/react-ui';\nimport { errorText } from '@dxos/react-ui-theme';\n\nimport { type FormInputStateProps } from './FormContext';\n\n/**\n * Props passed to input components.\n */\nexport type InputProps = {\n type: SimpleType;\n format?: FormatEnum;\n label: string;\n disabled?: boolean;\n placeholder?: string;\n inputOnly?: boolean;\n} & FormInputStateProps;\n\n/**\n * Form input component.\n */\nexport type InputComponent = FC<InputProps>;\n\nexport type InputHeaderProps = PropsWithChildren<{\n error?: string;\n}>;\n\nexport const InputHeader = ({ children, error }: InputHeaderProps) => {\n return (\n <div role='none' className='flex justify-between items-center mb-1'>\n {children}\n {error && (\n <Tooltip.Trigger asChild content={error} side='bottom'>\n <Icon icon='ph--warning--regular' size={4} classNames={errorText} />\n </Tooltip.Trigger>\n )}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, { type ChangeEvent, type KeyboardEvent, useCallback, useEffect, useState, useRef } from 'react';\n\nimport { type SelectOption } from '@dxos/echo-schema';\nimport { PublicKey } from '@dxos/keys';\nimport { type ChromaticPalette, Icon, IconButton, Input, Tag, Toolbar, useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { HuePicker } from '@dxos/react-ui-pickers';\nimport { hues, mx } from '@dxos/react-ui-theme';\n\nimport { translationKey } from '../../../translations';\nimport { InputHeader, type InputProps } from '../Input';\n\n// TODO(ZaymonFC): Handle disabled.\nexport const SelectOptionInput = ({ type, label, disabled, getStatus, getValue, onValueChange }: InputProps) => {\n const [selected, setSelectedId] = useState<string | null>(null);\n const [isNewOption, setIsNewOption] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const { t } = useTranslation(translationKey);\n const { status, error } = getStatus();\n const options = getValue<SelectOption[] | undefined>();\n\n // Initialization.\n useEffect(() => {\n if (options === undefined) {\n onValueChange(type, []);\n }\n }, [options, onValueChange, type]);\n\n const randomHue = () => {\n const usedHues = new Set(options?.map((option) => option.color) ?? []);\n // Pick a random unused option from hueTokenThemes.\n const unusedHues = hues.filter((hue) => !usedHues.has(hue));\n if (unusedHues.length > 0) {\n return unusedHues[Math.floor(Math.random() * unusedHues.length)];\n }\n\n // Pick a random one that hasn't been used in the last three options\n const lastThree = new Set(options?.slice(-3).map((option) => option.color) ?? []);\n const availableHues = hues.filter((hue) => !lastThree.has(hue));\n return (\n availableHues[Math.floor(Math.random() * availableHues.length)] ?? hues[Math.floor(Math.random() * hues.length)]\n );\n };\n\n const handleAdd = useCallback(() => {\n const newId = PublicKey.random().truncate();\n const newOption = { id: newId, title: '', color: randomHue() };\n onValueChange(type, [...(options ?? []), newOption]);\n setSelectedId(newId);\n setIsNewOption(true);\n }, [options, type, onValueChange]);\n\n const handleDelete = useCallback(\n (id: string) => {\n const newOptions = options?.filter((option) => option.id !== id) ?? [];\n onValueChange(type, newOptions);\n setSelectedId(null);\n },\n [options, type, onValueChange],\n );\n\n const handleMove = useCallback(\n (from: number, to: number) => {\n if (!options) {\n return;\n }\n\n const newOptions = [...options];\n const [removed] = newOptions.splice(from, 1);\n newOptions.splice(to, 0, removed);\n onValueChange(type, newOptions);\n },\n [options, type, onValueChange],\n );\n\n const handleClick = useCallback((id: string) => {\n setSelectedId((current) => (current === id ? null : id));\n }, []);\n\n const handleTitleChange = useCallback(\n (id: string) => (e: ChangeEvent<HTMLInputElement>) => {\n const newOptions = options?.map((o) => (o.id === id ? { ...o, title: e.target.value } : o));\n onValueChange(type, newOptions ?? []);\n },\n [options, type, onValueChange],\n );\n\n const handleKeyDown = useCallback((e: KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n setSelectedId(null);\n }\n }, []);\n\n const handleColorChange = useCallback(\n (id: string) => (hue: string) => {\n const newOptions = options?.map((o) => (o.id === id ? { ...o, color: hue } : o));\n onValueChange(type, newOptions ?? []);\n },\n [options, type, onValueChange],\n );\n\n useEffect(() => {\n if (selected && isNewOption && inputRef.current) {\n inputRef.current.focus();\n setIsNewOption(false);\n }\n }, [selected, isNewOption]);\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div role='none'>\n {options && (\n <List.Root items={options} isItem={(item) => true} onMove={handleMove}>\n {({ items }) => (\n <div role='list' className='w-full overflow-auto'>\n {items?.map((item) => (\n <div key={item.id}>\n <List.Item\n role='button'\n item={item}\n classNames={mx('p-1 plb-2', 'flex flex-col', 'cursor-pointer', 'hover:bg-hoverOverlay')}\n aria-expanded={selected === item.id}\n >\n <div className='flex items-center'>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleClick(item.id)} classNames='flex-1'>\n {/* TODO(ZaymonFC): Move spacer into Tag component. */}\n <Tag palette={item.color as ChromaticPalette}>{item.title || '\\u200b'}</Tag>\n </List.ItemTitle>\n <Icon\n icon={selected === item.id ? 'ph--caret-down--regular' : 'ph--caret-right--regular'}\n onClick={() => handleClick(item.id)}\n />\n </div>\n {selected === item.id && (\n <div className='mis-4 mbs-2 flex flex-col gap-1'>\n {/* 16px to match drag handle width. */}\n <Input.Label classNames='text-xs'>{t('select option label')}</Input.Label>\n <div className='flex flex-row items-center gap-1'>\n <Input.TextInput\n placeholder={t('select option label placeholder')}\n ref={selected === item.id ? inputRef : undefined}\n value={item.title}\n onChange={handleTitleChange(item.id)}\n onKeyDown={handleKeyDown}\n classNames='flex-1'\n data-no-submit\n />\n <Toolbar.Root classNames='p-0 m-0 !is-auto'>\n <HuePicker\n value={item.color}\n onChange={handleColorChange(item.id)}\n rootVariant='toolbar-button'\n />\n </Toolbar.Root>\n <IconButton\n icon='ph--trash--fill'\n iconOnly\n label={t('select option delete')}\n onClick={() => handleDelete(item.id)}\n />\n </div>\n </div>\n )}\n </List.Item>\n </div>\n ))}\n <div role='listitem'>\n <div\n role='button'\n className={mx('p-1 plb-2', 'flex flex-col', 'cursor-pointer', 'hover:bg-hoverOverlay')}\n onClick={handleAdd}\n >\n <div className='flex items-center gap-1'>\n <Icon icon='ph--plus--regular' />\n <span className='text-sm'>{t('select option add')}</span>\n </div>\n </div>\n </div>\n </div>\n )}\n </List.Root>\n )}\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React from 'react';\n\nimport { Input } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { safeParseFloat } from '@dxos/util';\n\nimport { InputHeader, type InputProps } from '../Input';\n\nconst gridCols = ['grid-cols-1', 'grid-cols-2', 'grid-cols-3', 'grid-cols-4'];\n\nexport const TupleInput = ({\n binding,\n type,\n label,\n disabled,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps & { binding: string[] }) => {\n const { status, error } = getStatus();\n\n // TODO(burdon): Generalize number/float/string, etc.\n const values: Record<string, number> = getValue<Record<string, number>>() ?? {};\n\n return (\n <Input.Root validationValence={status}>\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n <div className={mx('grid gap-2', gridCols[binding.length - 1])}>\n {binding.map((prop) => (\n <Input.TextInput\n key={prop}\n type='number'\n disabled={disabled}\n value={values[prop]}\n onChange={(event) => onValueChange(type, { ...values, [prop]: safeParseFloat(event.target.value, 0) })}\n onBlur={onBlur}\n />\n ))}\n </div>\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport React, { useCallback, useEffect, useRef } from 'react';\n\nimport { Input, Select } from '@dxos/react-ui';\n\nimport { type InputProps, InputHeader } from './Input';\n\nexport const TextInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextInput\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? ''}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n />\n {inputOnly && <Input.Validation>{error}</Input.Validation>}\n </Input.Root>\n );\n};\n\nexport const NumberInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextInput\n type='number'\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? 0}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n />\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport const BooleanInput = ({ type, label, inputOnly, getStatus, getValue, onValueChange }: InputProps) => {\n const { status, error } = getStatus();\n const checked = Boolean(getValue());\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.Switch checked={checked} onCheckedChange={(value) => onValueChange(type, value)} />\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport type SelectInputOptions = InputProps & {\n options?: Array<{ value: string | number; label?: string }>;\n};\n\nexport const SelectInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n options,\n getStatus,\n getValue,\n onValueChange,\n}: SelectInputOptions) => {\n const { status, error } = getStatus();\n\n const value = getValue() as string | undefined;\n const handleValueChange = useCallback((value: string | number) => onValueChange(type, value), [type, onValueChange]);\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Select.Root value={value} onValueChange={handleValueChange}>\n {/* TODO(burdon): Placeholder not working? */}\n <Select.TriggerButton classNames='is-full' disabled={disabled} placeholder={placeholder} />\n <Select.Portal>\n <Select.Content>\n <Select.Viewport>\n {options?.map(({ value, label }) => (\n // NOTE: Numeric values are converted to and from strings.\n <Select.Option key={String(value)} value={String(value)}>\n {label ?? String(value)}\n </Select.Option>\n ))}\n </Select.Viewport>\n </Select.Content>\n </Select.Portal>\n </Select.Root>\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nexport const MarkdownInput = ({\n type,\n label,\n inputOnly,\n disabled,\n placeholder,\n getStatus,\n getValue,\n onValueChange,\n onBlur,\n}: InputProps) => {\n const { status, error } = getStatus();\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n\n // TODO(ZaymonFC): If we start using `Enter` for form submission, we should prevent default behavior here\n // since we're using a textarea element and the user needs to be able to enter new lines.\n\n const adjustHeight = useCallback(() => {\n const textarea = textareaRef.current;\n if (textarea) {\n textarea.style.blockSize = 'auto'; // For measurement.\n textarea.style.blockSize = `${textarea.scrollHeight + 2}px`;\n }\n }, []);\n\n // Adjust height on initial render.\n useEffect(() => {\n adjustHeight();\n }, [adjustHeight]);\n\n // Adjust height when the content changes.\n useEffect(() => {\n adjustHeight();\n }, [getValue(), adjustHeight]);\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <Input.TextArea\n ref={textareaRef}\n disabled={disabled}\n placeholder={placeholder}\n value={getValue() ?? ''}\n classNames={'min-bs-auto max-h-40 overflow-auto'}\n onChange={(event) => onValueChange(type, event.target.value)}\n onBlur={onBlur}\n style={{ resize: 'none' }}\n spellCheck={false}\n />\n {inputOnly && <Input.Validation>{error}</Input.Validation>}\n </Input.Root>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Schema } from 'effect';\nimport React, { type ReactElement, useEffect, useMemo, useRef } from 'react';\n\nimport { type BaseObject, type PropertyKey } from '@dxos/echo-schema';\nimport { type ThemedClassName } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { type SchemaProperty } from '@dxos/schema';\n\nimport { FormActions } from './FormActions';\nimport { FormFields } from './FormContent';\nimport { FormProvider } from './FormContext';\nimport { type InputProps, type InputComponent } from './Input';\nimport { type FormOptions, type QueryRefOptions } from '../../hooks';\n\nexport type PropsFilter<T extends BaseObject> = (props: SchemaProperty<T>[]) => SchemaProperty<T>[];\n\nexport type ComponentLookup = (args: {\n prop: string;\n schema: Schema.Schema<any>;\n inputProps: InputProps;\n}) => ReactElement | undefined;\n\nexport type CustomInputMap = Partial<Record<string, InputComponent>>;\n\nexport type FormProps<T extends BaseObject> = ThemedClassName<\n {\n values: Partial<T>;\n\n /** Path to the current object from the root. Used with nested forms. */\n path?: string[];\n\n // TODO(burdon): Autofocus first input.\n autoFocus?: boolean;\n readonly?: boolean;\n // TODO(burdon): Change to JsonPath includes/excludes.\n filter?: PropsFilter<T>;\n sort?: PropertyKey<T>[];\n autoSave?: boolean;\n testId?: string;\n onCancel?: () => void;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n /**\n * Map of custom renderers for specific properties.\n * Prefer lookupComponent for plugin specific input surfaces.\n */\n Custom?: CustomInputMap;\n } & Pick<FormOptions<T>, 'schema' | 'onValuesChanged' | 'onValidate' | 'onSave'>\n>;\n\nexport const Form = <T extends BaseObject>({\n classNames,\n schema,\n values: initialValues,\n path = [],\n autoFocus,\n readonly,\n filter,\n sort,\n autoSave,\n testId,\n onValuesChanged,\n onValidate,\n onSave,\n onCancel,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormProps<T>) => {\n const formRef = useRef<HTMLDivElement>(null);\n const onValid = useMemo(() => (autoSave ? onSave : undefined), [autoSave, onSave]);\n\n // Focus the first input element within this form.\n useEffect(() => {\n if (autoFocus && formRef.current) {\n const input = formRef.current.querySelector('input');\n if (input) {\n input.focus();\n }\n }\n }, [autoFocus]);\n\n return (\n <FormProvider\n formRef={formRef}\n schema={schema}\n autoSave={autoSave}\n initialValues={initialValues}\n onValuesChanged={onValuesChanged}\n onValidate={onValidate}\n onValid={onValid}\n onSave={onSave}\n >\n {/* TODO(burdon): Remove padding. */}\n <div ref={formRef} role='none' className={mx('p-2', classNames)} data-testid={testId}>\n <FormFields\n schema={schema}\n path={path}\n readonly={readonly}\n filter={filter}\n sort={sort}\n onQueryRefOptions={onQueryRefOptions}\n lookupComponent={lookupComponent}\n Custom={Custom}\n />\n {(onCancel || onSave) && !autoSave && <FormActions onCancel={onCancel} readonly={readonly} />}\n </div>\n </FormProvider>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React from 'react';\n\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\n\nimport { useFormContext } from './FormContext';\nimport { translationKey } from '../../translations';\n\nexport type FormActionsProps = {\n readonly?: boolean;\n onCancel?: () => void;\n};\n\nexport const FormActions = ({ onCancel, readonly }: FormActionsProps) => {\n const { t } = useTranslation(translationKey);\n const { canSave, handleSave } = useFormContext();\n\n return (\n <div role='none' className='mt-2 flex justify-center'>\n <div role='none' className={mx(onCancel && !readonly && 'grid grid-cols-2 gap-2')}>\n {onCancel && !readonly && (\n <IconButton data-testid='cancel-button' icon='ph--x--regular' label={t('button cancel')} onClick={onCancel} />\n )}\n {handleSave && (\n <IconButton\n type='submit'\n data-testid='save-button'\n disabled={!canSave}\n icon='ph--check--regular'\n label={t('button save')}\n onClick={handleSave}\n />\n )}\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport React, {\n createContext,\n type RefObject,\n useContext,\n useEffect,\n useMemo,\n type FocusEvent,\n type PropsWithChildren,\n} from 'react';\n\nimport { raise } from '@dxos/debug';\nimport { type BaseObject, getValue } from '@dxos/echo-schema';\nimport { createJsonPath, type SimpleType } from '@dxos/effect';\n\nimport { type FormHandler, type FormOptions, useForm } from '../../hooks';\n\ntype FormContextValue<T extends BaseObject> = FormHandler<T>;\n\nconst FormContext = createContext<FormContextValue<any> | undefined>(undefined);\n\nexport const useFormContext = <T extends BaseObject>(): FormContextValue<T> => {\n return useContext(FormContext) ?? raise(new Error('Missing FormContext'));\n};\n\nexport const useFormValues = (path: (string | number)[] = []): any => {\n const { values: formValues } = useFormContext();\n const jsonPath = createJsonPath(path);\n return getValue(formValues, jsonPath) as BaseObject;\n};\n\nexport type FormInputStateProps = {\n getStatus: () => { status?: 'error'; error?: string };\n getValue: <V>() => V | undefined;\n onValueChange: (type: SimpleType, value: any) => void;\n onBlur: (event: FocusEvent<HTMLElement>) => void;\n};\n\nexport const useInputProps = (path: (string | number)[] = []): FormInputStateProps => {\n const { getStatus, getValue: getFormValue, onValueChange, onTouched } = useFormContext();\n\n const stablePath = useMemo(() => path, [Array.isArray(path) ? path.join('.') : path]);\n return useMemo(\n () => ({\n getStatus: () => getStatus(stablePath),\n getValue: () => getFormValue(stablePath),\n onValueChange: (type: SimpleType, value: any) => onValueChange(stablePath, type, value),\n onBlur: () => onTouched(stablePath),\n }),\n [getStatus, getFormValue, onValueChange, onTouched, stablePath],\n );\n};\n\nexport const FormProvider = ({\n children,\n formRef,\n autoSave,\n ...formOptions\n}: PropsWithChildren<\n FormOptions<any> & {\n formRef?: RefObject<HTMLDivElement>;\n autoSave?: boolean;\n }\n>) => {\n const form = useForm(formOptions);\n\n useEffect(() => {\n if (!formRef?.current) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n const keyIsEnter = event.key === 'Enter';\n const modifierUsed = event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;\n const inputIsTextarea = (event.target as HTMLElement).tagName.toLowerCase() === 'textarea';\n const inputOptOut =\n (event.target as HTMLElement).hasAttribute('data-no-submit') ||\n (event.target as HTMLElement).closest('[data-no-submit]') !== null;\n\n // Regular inputs: Submit on Enter (no modifiers).\n const shouldSubmitRegularInput = !inputIsTextarea && keyIsEnter && !modifierUsed;\n\n // Textareas: Submit only on Meta+Enter.\n const shouldSubmitTextarea = inputIsTextarea && keyIsEnter && event.metaKey;\n\n if ((shouldSubmitRegularInput || shouldSubmitTextarea) && !inputOptOut) {\n if (!autoSave && form.canSave) {\n form.handleSave();\n }\n if (autoSave && form.formIsValid) {\n (event.target as HTMLElement).blur();\n }\n }\n };\n\n const formElement = formRef.current;\n\n formElement.addEventListener('keydown', handleKeyDown);\n return () => formElement.removeEventListener('keydown', handleKeyDown);\n }, [formRef, form.canSave, form.formIsValid, form.handleSave, autoSave]);\n\n return <FormContext.Provider value={form}>{children}</FormContext.Provider>;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SchemaAST, type Schema } from 'effect';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { type BaseObject, getValue, setValue } from '@dxos/echo-schema';\nimport { type SimpleType, type JsonPath, createJsonPath, fromEffectValidationPath } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { validateSchema, type ValidationError } from '@dxos/schema';\nimport { type MaybePromise } from '@dxos/util';\n\n/**\n * Return type from `useForm` hook.\n */\nexport type FormHandler<T extends BaseObject> = {\n //\n // Form state management.\n //\n\n values: Partial<T>;\n errors: Record<JsonPath, string>;\n touched: Record<JsonPath, boolean>;\n changed: Record<JsonPath, boolean>;\n canSave: boolean;\n formIsValid: boolean;\n handleSave: () => void;\n\n //\n // Form input component helpers.\n //\n\n getStatus: (path: string | (string | number)[]) => { status?: 'error'; error?: string };\n getValue: <V>(path: (string | number)[]) => V | undefined;\n onValueChange: <V>(path: (string | number)[], type: SimpleType, value: V) => void;\n onTouched: (path: (string | number)[]) => void;\n};\n\n/**\n * Hook options.\n */\nexport interface FormOptions<T extends BaseObject> {\n /**\n * Effect schema (Type literal).\n */\n schema: Schema.Schema<T, any>;\n\n /**\n * Initial values (which may not pass validation).\n */\n initialValues: Partial<T>;\n\n /**\n * Callback for value changes. Note: This is called even when values are invalid.\n * Sometimes the parent component may want to know about changes even if the form is\n * in an invalid state.\n */\n onValuesChanged?: (values: Partial<T>) => void;\n\n /**\n * Custom validation function that runs only after schema validation passes.\n * Use this for complex validation logic that can't be expressed in the schema.\n * @returns Array of validation errors, or undefined if validation passes\n */\n // TODO(burdon): Change to key x value?\n onValidate?: (values: T) => ValidationError[] | undefined;\n\n /**\n * Called when the form is valid.\n */\n onValid?: (values: T, meta: { changed: FormHandler<T>['changed'] }) => void;\n\n /**\n * Called when the form is submitted and passes validation.\n */\n onSave?: (values: T, meta: { changed: FormHandler<T>['changed'] }) => MaybePromise<void>;\n}\n\n/**\n * Creates a hook for managing form state, including values, validation, and submission.\n * Deeply integrated with `@dxos/schema` for schema-based validation.\n */\nexport const useForm = <T extends BaseObject>({\n schema,\n initialValues,\n onValuesChanged,\n onValidate,\n onValid,\n onSave,\n}: FormOptions<T>): FormHandler<T> => {\n invariant(SchemaAST.isTypeLiteral(schema.ast));\n\n const [values, setValues] = useState<Partial<T>>(initialValues);\n useEffect(() => {\n setValues(initialValues);\n }, [initialValues]);\n\n const [touched, setTouched] = useState<Record<JsonPath, boolean>>(createKeySet(initialValues, false));\n const [changed, setChanged] = useState<Record<JsonPath, boolean>>(createKeySet(initialValues, false));\n const [errors, setErrors] = useState<Record<JsonPath, string>>({});\n const [saving, setSaving] = useState(false);\n\n //\n // Validation.\n //\n\n const validate = useCallback(\n (values: Partial<T>): values is T => {\n let errors: ValidationError[] = validateSchema(schema, values) ?? [];\n if (errors.length === 0 && onValidate) {\n const validatedValues = values as T;\n errors = onValidate(validatedValues) ?? [];\n }\n\n setErrors(flatMap(errors));\n const valid = errors.length === 0;\n return valid;\n },\n [schema, onValidate],\n );\n\n // Validate on schema change.\n const [schemaDirty, setSchemaDirty] = useState(false);\n useEffect(() => setSchemaDirty(true), [schema]);\n useEffect(() => {\n if (schemaDirty) {\n validate(values);\n setSchemaDirty(false);\n }\n }, [values, schemaDirty]);\n\n const formIsValid = useMemo(() => {\n return Object.keys(errors).length === 0;\n }, [errors]);\n\n /**\n * NOTE: We can submit if there is no touched field that has an error.\n * Basically, if there's a validation message visible in the form, submit should be disabled.\n */\n const canSave = useMemo(\n () =>\n !saving &&\n // Check if any error paths that are touched have errors.\n !Object.entries(touched).some(\n ([path, isTouched]) =>\n isTouched &&\n Object.keys(errors).some(\n (errorPath) => errorPath === path || errorPath.startsWith(`${path}.`) || errorPath.startsWith(`${path}[`),\n ),\n ),\n [touched, errors, saving],\n );\n\n const handleSave = useCallback(async () => {\n if (validate(values)) {\n setSaving(true);\n try {\n await onSave?.(values, { changed });\n } finally {\n setSaving(false);\n }\n }\n }, [values, validate, onSave, changed]);\n\n //\n // Fields.\n //\n\n const getStatus = useCallback<FormHandler<T>['getStatus']>(\n (path) => {\n const jsonPath = Array.isArray(path) ? createJsonPath(path) : path;\n const matchingError = Object.entries(errors).find(\n ([errorPath]) =>\n errorPath === jsonPath || errorPath.startsWith(`${jsonPath}.`) || errorPath.startsWith(`${jsonPath}[`),\n );\n\n // Only show errors for touched fields.\n const isTouched = touched[jsonPath as JsonPath];\n if (!isTouched) {\n return {\n status: undefined,\n error: undefined,\n };\n }\n\n return {\n status: matchingError ? 'error' : undefined,\n error: matchingError ? matchingError[1] : undefined,\n };\n },\n [errors, touched],\n );\n\n const getFormValue = useCallback<FormHandler<T>['getValue']>(\n <V>(path: (string | number)[]): V | undefined => {\n return getValue(values, createJsonPath(path));\n },\n [values],\n );\n\n const onValueChange = useCallback<FormHandler<T>['onValueChange']>(\n (path: (string | number)[], type: SimpleType, value: any) => {\n const jsonPath = createJsonPath(path);\n let parsedValue = value;\n try {\n if (type === 'number') {\n parsedValue = parseFloat(value as string) || 0;\n }\n } catch (err) {\n log.catch(err);\n parsedValue = undefined;\n }\n\n const newValues = { ...setValue(values, jsonPath, parsedValue) };\n setValues(newValues);\n setChanged((prev) => ({ ...prev, [jsonPath]: true }));\n onValuesChanged?.(newValues);\n\n const isValid = validate(newValues);\n if (isValid && onValid) {\n onValid(newValues, { changed });\n }\n },\n [values, onValuesChanged, validate, onValid, changed],\n );\n\n const onTouched = useCallback(\n (path: (string | number)[]) => {\n const jsonPath = createJsonPath(path);\n setTouched((touched) => ({ ...touched, [jsonPath]: true }));\n validate(values);\n },\n [validate, values],\n );\n\n return useMemo(\n () => ({\n // State.\n values,\n errors,\n touched,\n changed,\n canSave,\n formIsValid,\n\n // Actions.\n handleSave,\n\n // Field utils.\n getStatus,\n getValue: getFormValue,\n onValueChange,\n onTouched,\n }),\n [\n values,\n errors,\n touched,\n changed,\n canSave,\n formIsValid,\n handleSave,\n getStatus,\n getFormValue,\n onValueChange,\n onTouched,\n ],\n );\n};\n\nconst createKeySet = <T extends BaseObject, V>(obj: T, value: V): Record<JsonPath, V> => {\n invariant(obj);\n return Object.keys(obj).reduce((acc, key) => ({ ...acc, [key]: value }), {} as Record<JsonPath, V>);\n};\n\nconst flatMap = (errors: ValidationError[]) => {\n return errors.reduce(\n (result, { path, message }) => {\n // Convert the validation error path format to our JsonPath format.\n const jsonPath = fromEffectValidationPath(path);\n if (!(jsonPath in result)) {\n result[jsonPath] = message;\n }\n return result;\n },\n {} as Record<JsonPath, string>,\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useCallback } from 'react';\n\nimport { getDXN, type TypeAnnotation } from '@dxos/echo-schema';\nimport { Filter, type Space } from '@dxos/react-client/echo';\nimport { isNonNullable } from '@dxos/util';\n\nimport { type QueryRefOptions } from './useQueryRefOptions';\n\ntype UseRefQueryLookupProps = { space?: Space };\n\nexport const useRefQueryLookupHandler = ({ space }: UseRefQueryLookupProps): QueryRefOptions => {\n const handleRefQueryLookup = useCallback(\n async (typeInfo: TypeAnnotation) => {\n if (!space) {\n return [];\n }\n const query = space.db.query(Filter.typename(typeInfo.typename));\n const { objects } = await query.run();\n\n return objects\n .map((object) => {\n const dxn = getDXN(object);\n if (!dxn) {\n return undefined;\n }\n\n // TODO(Zaymon): Better fallback object names?\n const item = { dxn, label: object?.name ?? object?.id ?? '' };\n return item;\n })\n .filter(isNonNullable);\n },\n [space],\n );\n\n return handleRefQueryLookup;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { useEffect, useState } from 'react';\n\nimport { type TypeAnnotation } from '@dxos/echo-schema';\nimport { type DXN } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { type TagPickerItemData } from '@dxos/react-ui-tag-picker';\nimport { type MaybePromise } from '@dxos/util';\n\nexport type RefOption = { dxn: DXN; label?: string };\nexport type QueryRefOptions = (type: TypeAnnotation) => MaybePromise<RefOption[]>;\n\ntype UseQueryRefOptionsProps = { refTypeInfo: TypeAnnotation | undefined; onQueryRefOptions?: QueryRefOptions };\n\n/**\n * Hook to query reference options based on type information.\n * Used internally within forms to fetch and format reference options for reference fields.\n */\nexport const useQueryRefOptions = ({ refTypeInfo, onQueryRefOptions }: UseQueryRefOptionsProps) => {\n const [options, setOptions] = useState<TagPickerItemData[]>([]);\n const [loading, setLoading] = useState(false);\n\n useEffect(() => {\n if (!refTypeInfo || !onQueryRefOptions) {\n return;\n }\n\n const fetchOptions = async () => {\n setLoading(true);\n try {\n const fetchedOptions = await onQueryRefOptions(refTypeInfo);\n setOptions(\n fetchedOptions.map((option) => {\n const dxn = option.dxn.toString() as string;\n return { id: dxn, label: option.label ?? dxn, hue: 'neutral' as any };\n }),\n );\n } catch (error) {\n log.error('Failed to fetch ref options:', error);\n setOptions([]);\n } finally {\n setLoading(false);\n }\n };\n\n void fetchOptions();\n }, [refTypeInfo, onQueryRefOptions]);\n\n return { options, loading };\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { Schema, SchemaAST, pipe } from 'effect';\nimport { capitalize } from 'effect/String';\nimport React, { useMemo } from 'react';\n\nimport { createJsonPath, findNode, getDiscriminatedType, isDiscriminatedUnion } from '@dxos/effect';\nimport { mx } from '@dxos/react-ui-theme';\nimport { getSchemaProperties, type SchemaProperty } from '@dxos/schema';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { ArrayField } from './ArrayField';\nimport { SelectInput } from './Defaults';\nimport { type ComponentLookup } from './Form';\nimport { useInputProps, useFormValues } from './FormContext';\nimport { type InputComponent } from './Input';\nimport { RefField } from './RefField';\nimport { getInputComponent } from './factory';\nimport { type QueryRefOptions } from '../../hooks';\nimport { getRefProps } from '../../util';\n\nexport type FormFieldProps = {\n property: SchemaProperty<any>;\n path?: (string | number)[];\n readonly?: boolean;\n /** Used to indicate if input should be presented inline (e.g. for array items). */\n inline?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n Custom?: Partial<Record<string, InputComponent>>;\n};\n\nexport const FormField = ({\n property,\n path,\n readonly,\n inline,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormFieldProps) => {\n const inputProps = useInputProps(path);\n const { ast, name, type, format, title, description, options, examples, array } = property;\n\n const label = useMemo(() => title ?? pipe(name, capitalize), [title, name]);\n const placeholder = useMemo(\n () => (examples?.length ? `Example: \"${examples[0]}\"` : description),\n [examples, description],\n );\n\n //\n // Registry and Custom.\n //\n\n const FoundComponent = lookupComponent?.({\n prop: name,\n schema: Schema.make(ast),\n inputProps: {\n type,\n format,\n label,\n disabled: readonly,\n placeholder,\n ...inputProps,\n },\n });\n\n if (FoundComponent) {\n return <div role='none'>{FoundComponent}</div>;\n }\n\n const jsonPath = createJsonPath(path ?? []);\n const CustomComponent = Custom?.[jsonPath];\n if (CustomComponent) {\n return (\n <CustomComponent\n type={type}\n format={format}\n label={label}\n inputOnly={inline}\n placeholder={placeholder}\n disabled={readonly}\n {...inputProps}\n />\n );\n }\n\n //\n // Refs.\n //\n\n const refProps = getRefProps(property);\n if (refProps) {\n return (\n <RefField\n ast={refProps.ast}\n array={refProps.isArray}\n type={type}\n format={format}\n label={label}\n placeholder={placeholder}\n disabled={readonly}\n inputOnly={inline}\n onQueryRefOptions={onQueryRefOptions}\n {...inputProps}\n />\n );\n }\n\n //\n // Arrays.\n //\n\n if (array) {\n return <ArrayField property={property} path={path} inputProps={inputProps} readonly={readonly} Custom={Custom} />;\n }\n\n //\n // Standard Inputs.\n //\n\n const InputComponent = getInputComponent(type, format);\n if (InputComponent) {\n return (\n <div role='none'>\n <InputComponent\n type={type}\n format={format}\n label={label}\n inputOnly={inline}\n placeholder={placeholder}\n disabled={readonly}\n {...inputProps}\n />\n </div>\n );\n }\n\n //\n // Select.\n //\n\n if (options) {\n return (\n <div role='none'>\n <SelectInput\n type={type}\n format={format}\n disabled={readonly}\n inputOnly={inline}\n label={label}\n options={options.map((option) => ({ value: option, label: String(option) }))}\n placeholder={placeholder}\n {...inputProps}\n />\n </div>\n );\n }\n\n //\n // Nested Objects.\n //\n\n if (type === 'object') {\n const baseNode = findNode(ast, isDiscriminatedUnion);\n const typeLiteral = baseNode\n ? getDiscriminatedType(baseNode, inputProps.getValue() as any)\n : findNode(ast, SchemaAST.isTypeLiteral);\n\n if (typeLiteral) {\n return (\n <div role='none'>\n {!inline && <h3 className='text-lg mbs-2 mbe-1'>{label}</h3>}\n <FormFields\n schema={Schema.make(typeLiteral)}\n path={path}\n readonly={readonly}\n onQueryRefOptions={onQueryRefOptions}\n Custom={Custom}\n lookupComponent={lookupComponent}\n />\n </div>\n );\n }\n }\n\n return null;\n};\n\nexport type FormContentProps = {\n schema: Schema.Schema.All;\n path?: (string | number)[];\n filter?: (props: SchemaProperty<any>[]) => SchemaProperty<any>[];\n sort?: string[];\n readonly?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n lookupComponent?: ComponentLookup;\n Custom?: Partial<Record<string, InputComponent>>;\n};\n\nexport const FormFields = ({\n schema,\n path,\n filter,\n sort,\n readonly,\n onQueryRefOptions,\n lookupComponent,\n Custom,\n}: FormContentProps) => {\n const values = useFormValues(path);\n\n const properties = useMemo(() => {\n const props = getSchemaProperties(schema.ast, values);\n const filtered = filter ? filter(props) : props;\n\n return sort ? filtered.sort((a, b) => sort.indexOf(a.name) - sort.indexOf(b.name)) : filtered;\n }, [schema, values, filter, sort]);\n\n return (\n <div role='form' className={mx('flex flex-col w-full gap-2')}>\n {properties\n .map((property) => {\n return (\n <FormField\n key={property.name}\n property={property}\n path={[...(path ?? []), property.name]}\n readonly={readonly}\n onQueryRefOptions={onQueryRefOptions}\n lookupComponent={lookupComponent}\n Custom={Custom}\n />\n );\n })\n .filter(isNotFalsy)}\n </div>\n );\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SchemaAST, pipe } from 'effect';\nimport { capitalize } from 'effect/String';\nimport React, { useCallback, useMemo } from 'react';\n\nimport { findNode, getDiscriminatedType, isDiscriminatedUnion, SimpleType } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { IconButton, useTranslation } from '@dxos/react-ui';\nimport { mx } from '@dxos/react-ui-theme';\nimport { getSchemaProperties, type SchemaProperty } from '@dxos/schema';\n\nimport { type ComponentLookup } from './Form';\nimport { FormField } from './FormContent';\nimport { useFormValues, type FormInputStateProps } from './FormContext';\nimport { InputHeader, type InputComponent } from './Input';\nimport { translationKey } from '../../translations';\nimport { findArrayElementType } from '../../util';\n\nconst padding = 'px-2';\n\ntype ArrayFieldProps = {\n property: SchemaProperty<any>;\n readonly?: boolean;\n inputProps: FormInputStateProps;\n path?: (string | number)[];\n Custom?: Partial<Record<string, InputComponent>>;\n lookupComponent?: ComponentLookup;\n};\n\nexport const ArrayField = ({ property, readonly, path, inputProps, Custom, lookupComponent }: ArrayFieldProps) => {\n const { t } = useTranslation(translationKey);\n const { ast, name, type, title } = property;\n // TODO(wittjosiah): The fallback to an empty array stops the form from crashing but isn't immediately live.\n // It doesn't become live until another field is touched, but that's better than the whole form crashing.\n const values = (useFormValues(path ?? []) ?? []) as any[];\n invariant(Array.isArray(values), `Values at path ${path?.join('.')} must be an array.`);\n const label = title ?? pipe(name, capitalize);\n\n const elementType = findArrayElementType(ast);\n\n const getDefaultObjectValue = (typeNode: SchemaAST.AST): any => {\n const baseNode = findNode(typeNode, isDiscriminatedUnion);\n const typeLiteral = baseNode ? getDiscriminatedType(baseNode, {}) : findNode(typeNode, SchemaAST.isTypeLiteral);\n if (!typeLiteral) {\n return {};\n }\n\n return Object.fromEntries(getSchemaProperties(typeLiteral, {}).map((prop) => [prop.name, prop.defaultValue]));\n };\n\n const newValue = useMemo(() => {\n if (type === 'object' && elementType) {\n return getDefaultObjectValue(elementType);\n } else {\n return SimpleType.getDefaultValue(type);\n }\n }, [type, elementType]);\n\n const handleAdd = useCallback(() => {\n inputProps.onValueChange(type, [...values, newValue]);\n }, [type, elementType, inputProps, newValue, values]);\n\n const handleRemove = useCallback(\n (index: number) => {\n const newValues = values.filter((_, i) => i !== index);\n inputProps.onValueChange(type, newValues);\n },\n [type, inputProps, values],\n );\n\n if (!elementType) {\n return null;\n }\n\n return (\n <div role='none' className={mx(padding)}>\n <InputHeader>{label}</InputHeader>\n <div role='none' className='flex flex-col gap-1'>\n {values.map((_value, index) => (\n <div key={index} role='none' className='flex items-center gap-1'>\n <div role='none' className='flex-1'>\n <FormField\n property={{\n ...property,\n array: false, // NOTE(ZaymonFC): This breaks arrays of arrays but ¯\\_(ツ)_/¯. Ping me if you need that.\n ast: elementType,\n }}\n path={[...(path ?? []), index]}\n readonly={readonly}\n inline\n Custom={Custom}\n lookupComponent={lookupComponent}\n />\n </div>\n <IconButton\n icon='ph--trash--regular'\n iconOnly\n label={t('button remove')}\n onClick={() => handleRemove(index)}\n />\n </div>\n ))}\n </div>\n <div role='none' className='flex justify-between items-center plb-1'>\n <IconButton icon='ph--plus--regular' iconOnly label={t('button add')} onClick={handleAdd} />\n </div>\n </div>\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FormatEnum, GeoLocation, TypeEnum } from '@dxos/echo-schema';\nimport { type ValidationError } from '@dxos/schema';\n\n/**\n * Parse value by field value type.\n * Used by Table, Sheet, etc.\n * Handles various data types including booleans, numbers, dates, and strings.\n * Returns undefined for empty or null inputs.\n */\nexport type ParseProps = {\n type?: TypeEnum;\n format?: FormatEnum;\n value: any;\n};\n\nexport const parseValue = ({ type, format, value }: ParseProps) => {\n if (value === undefined || value === null || value === '') {\n return undefined;\n }\n\n const parseScalar = (type?: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean: {\n if (typeof value === 'string') {\n const lowercaseValue = value.toLowerCase();\n if (lowercaseValue === '0' || lowercaseValue === 'false') {\n return false;\n } else if (lowercaseValue === '1' || lowercaseValue === 'true') {\n return true;\n }\n }\n return Boolean(value);\n }\n\n case TypeEnum.Number: {\n const cleaned = typeof value === 'string' ? value.replace(/[^0-9.-]+/g, '') : value;\n const num = Number(cleaned);\n return Number.isNaN(num) ? null : num;\n }\n\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default: {\n return value;\n }\n }\n };\n\n if (!format) {\n return parseScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean:\n return parseScalar(TypeEnum.Boolean);\n\n case FormatEnum.Number:\n case FormatEnum.Percent:\n case FormatEnum.Currency:\n return parseScalar(TypeEnum.Number);\n\n case FormatEnum.String:\n case FormatEnum.Markdown: {\n return parseScalar(TypeEnum.String);\n }\n\n case FormatEnum.Ref:\n throw new Error(`unexpected format: ${FormatEnum.Ref}`);\n\n case FormatEnum.DateTime:\n case FormatEnum.Date:\n case FormatEnum.Time:\n case FormatEnum.Timestamp: {\n const date = new Date(value as string | number);\n return isNaN(date.getTime()) ? null : date;\n }\n\n case FormatEnum.GeoPoint: {\n // Parse string in format \"lat,long\" to GeoPoint [longitude, latitude].\n if (typeof value === 'string') {\n // Only keep digits, decimal points, minus signs, and commas.\n const cleaned = value.replace(/[^0-9.,-]+/g, '');\n const parts = cleaned.split(',');\n if (parts.length === 2) {\n const lat = parseFloat(parts[0]);\n const long = parseFloat(parts[1]);\n if (!isNaN(lat) && !isNaN(long)) {\n return GeoLocation.toGeoPoint({ latitude: lat, longitude: long });\n }\n }\n }\n\n return [0, 0];\n }\n\n default: {\n return value;\n }\n }\n};\n\n// TODO(burdon): Type and format.\nexport type CellClassesForFieldTypeProps = {\n type?: TypeEnum;\n format?: FormatEnum;\n};\n\nexport const cellClassesForFieldType = ({ type, format }: CellClassesForFieldTypeProps): string[] | undefined => {\n if (!format) {\n switch (type) {\n case TypeEnum.Number:\n return ['text-right', 'font-mono'];\n case TypeEnum.Boolean:\n return ['text-right', 'font-mono'];\n case TypeEnum.String:\n return undefined;\n case TypeEnum.Ref:\n return undefined;\n\n default: {\n return undefined;\n }\n }\n }\n\n switch (format) {\n case FormatEnum.Markdown:\n return undefined;\n case FormatEnum.Time:\n case FormatEnum.Timestamp:\n case FormatEnum.DateTime:\n case FormatEnum.Date:\n case FormatEnum.Duration:\n return ['font-mono', 'text-right'];\n case FormatEnum.Currency:\n return ['text-right'];\n case FormatEnum.JSON:\n case FormatEnum.DID:\n return ['font-mono'];\n default:\n return undefined;\n }\n};\n\n// TODO(ZaymonFC): How to do this with translations?\nexport const pathNotUniqueError = (path: string): ValidationError => ({\n path: 'path',\n message: `'${path}' is already present`,\n});\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { format as formatDate } from 'date-fns/format';\n\nimport { FormatEnum, GeoLocation, TypeEnum } from '@dxos/echo-schema';\n\ntype ValueFormatProps = {\n type: TypeEnum;\n format?: FormatEnum | undefined;\n value: any;\n locale?: string | undefined;\n};\n\n/**\n * Format value by type.\n * Used by Table, Sheet, etc.\n */\n// TODO(burdon): Move to react-ui-form.\n// TODO(burdon): Formatting is different from kind format (e.g., percent is not a data format).\nexport const formatForDisplay = ({ type, format, value, locale = undefined }: ValueFormatProps): string => {\n const formatScalar = (type: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean:\n return (value as boolean).toLocaleString().toUpperCase();\n case TypeEnum.Number:\n return value.toLocaleString(locale);\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default: {\n return String(value);\n }\n }\n };\n\n if (!format) {\n return formatScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean: {\n return formatScalar(TypeEnum.Boolean);\n }\n case FormatEnum.Number: {\n return formatScalar(TypeEnum.Number);\n }\n case FormatEnum.String:\n case FormatEnum.Ref: {\n return formatScalar(TypeEnum.String);\n }\n case FormatEnum.Percent: {\n return `${(value as number) * 100}%`;\n }\n case FormatEnum.Currency: {\n // TODO(burdon): Get from property annotation.\n return (value as number).toLocaleString(locale, {\n style: 'currency',\n currency: 'USD',\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n });\n }\n case FormatEnum.Date: {\n try {\n return formatDate(new Date(value as number), 'yyyy-MM-dd');\n } catch (error) {\n return 'Invalid Date';\n }\n }\n case FormatEnum.Time: {\n try {\n return formatDate(new Date(value as number), 'HH:mm:ss');\n } catch (error) {\n return 'Invalid Time';\n }\n }\n case FormatEnum.DateTime: {\n try {\n return formatDate(new Date(value as number), 'yyyy-MM-dd HH:mm:ss');\n } catch (error) {\n return 'Invalid DateTime';\n }\n }\n case FormatEnum.GeoPoint: {\n if (value === null || value === undefined) {\n return '';\n }\n\n // For GeoPoint format [longitude, latitude].\n if (Array.isArray(value) && value.length >= 2 && value.every(Number.isFinite)) {\n const { latitude, longitude } = GeoLocation.fromGeoPoint(value as [number, number]);\n return `${latitude},${longitude}`;\n }\n\n return String(value);\n }\n default: {\n if (value === null || value === 'undefined') {\n return '';\n }\n return String(value);\n }\n }\n};\n\nexport const formatForEditing = ({ type, format, value, locale = undefined }: ValueFormatProps): string => {\n const formatScalar = (type: TypeEnum) => {\n switch (type) {\n case TypeEnum.Boolean:\n case TypeEnum.Number:\n case TypeEnum.String:\n case TypeEnum.Ref:\n return String(value);\n\n default:\n return String(value);\n }\n };\n\n if (!format) {\n return formatScalar(type);\n }\n\n switch (format) {\n case FormatEnum.Boolean:\n case FormatEnum.Number:\n case FormatEnum.String:\n case FormatEnum.Ref: {\n return formatScalar(type);\n }\n case FormatEnum.Percent: {\n return String(value * 100);\n }\n case FormatEnum.Currency: {\n return String(value);\n }\n case FormatEnum.DateTime: {\n const date = new Date(value as number);\n return date.toISOString();\n }\n case FormatEnum.Date: {\n const date = new Date(value as number);\n return date.toISOString().split('T')[0];\n }\n case FormatEnum.Time: {\n const date = new Date(value as number);\n return date.toISOString().split('T')[1].split('.')[0];\n }\n case FormatEnum.GeoPoint: {\n // Handle null or undefined\n if (value === null || value === undefined) {\n return '';\n }\n\n // For GeoPoint format [longitude, latitude].\n if (Array.isArray(value) && value.length >= 2 && value.every(Number.isFinite)) {\n const { latitude, longitude } = GeoLocation.fromGeoPoint(value as [number, number]);\n return `${latitude},${longitude}`;\n }\n\n return String(value);\n }\n\n default: {\n return String(value);\n }\n }\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type SchemaAST } from 'effect';\n\nimport { FormatEnum, ReferenceAnnotationId } from '@dxos/echo-schema';\nimport { findAnnotation } from '@dxos/effect';\nimport { type SchemaProperty } from '@dxos/schema';\n\nimport { findArrayElementType } from './schema';\n\ntype RefProps = {\n ast: SchemaAST.AST;\n isArray: boolean;\n};\n\nexport const getRefProps = (property: SchemaProperty<any>): RefProps | undefined => {\n const { ast, format, array } = property;\n\n // Direct reference.\n if (format === FormatEnum.Ref) {\n return { ast, isArray: false };\n }\n\n // Array of references.\n if (array) {\n const elementType = findArrayElementType(ast);\n if (elementType) {\n const annotation = findAnnotation(elementType, ReferenceAnnotationId);\n if (annotation) {\n return { ast: elementType, isArray: true };\n }\n }\n }\n\n return undefined;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { SchemaAST } from 'effect';\n\nimport { findNode } from '@dxos/effect';\n\nexport const findArrayElementType = (ast: SchemaAST.AST) => {\n const tupleType = findNode(ast, SchemaAST.isTupleType);\n const elementType = (tupleType as SchemaAST.TupleType | undefined)?.rest[0]?.type;\n\n return elementType;\n};\n", "//\n// Copyright 2025 DXOS.org\n//\n\nimport { type SchemaAST } from 'effect';\nimport React, { useCallback, useMemo, type FocusEvent } from 'react';\n\nimport {\n Expando,\n getTypeAnnotation,\n Ref,\n ReferenceAnnotationId,\n type ReferenceAnnotationValue,\n} from '@dxos/echo-schema';\nimport { findAnnotation } from '@dxos/effect';\nimport { DXN } from '@dxos/keys';\nimport { Input } from '@dxos/react-ui';\nimport { TagPicker, type TagPickerMode, type TagPickerItemData } from '@dxos/react-ui-tag-picker';\nimport { isNonNullable } from '@dxos/util';\n\nimport { TextInput } from './Defaults';\nimport { InputHeader, type InputProps } from './Input';\nimport { type QueryRefOptions, useQueryRefOptions } from '../../hooks';\n\ntype RefFieldProps = InputProps & {\n ast?: SchemaAST.AST;\n array?: boolean;\n onQueryRefOptions?: QueryRefOptions;\n};\n\nexport const RefField = ({\n type,\n label,\n disabled,\n placeholder,\n inputOnly,\n array,\n ast,\n getValue,\n onBlur,\n onQueryRefOptions,\n onValueChange,\n ...restInputProps\n}: RefFieldProps) => {\n const refTypeInfo = useMemo(\n () => (ast ? findAnnotation<ReferenceAnnotationValue>(ast, ReferenceAnnotationId) : undefined),\n [ast],\n );\n const { options: availableOptions, loading: _loading } = useQueryRefOptions({ refTypeInfo, onQueryRefOptions });\n\n if ((refTypeInfo && refTypeInfo?.typename === getTypeAnnotation(Expando)?.typename) || !onQueryRefOptions) {\n // If ref type is expando, fall back to taking a DXN in string format.\n return (\n <RefFieldFallback\n {...{ type, label, placeholder, disabled, inputOnly, getValue, onBlur, onValueChange, ...restInputProps }}\n />\n );\n }\n\n const handleGetValue = useCallback((): TagPickerItemData[] => {\n const formValue = getValue();\n\n const unknownToRefOption = (val: unknown) => {\n if (Ref.isRef(val)) {\n const dxnString = val.dxn.toString();\n const matchingOption = availableOptions.find((option) => option.id === dxnString);\n if (matchingOption) {\n return matchingOption;\n }\n }\n return undefined;\n };\n\n if (array && Array.isArray(formValue)) {\n return formValue.map(unknownToRefOption).filter(isNonNullable) ?? [];\n }\n\n const option = unknownToRefOption(formValue);\n if (option) {\n return [option];\n }\n\n return [];\n }, [getValue, availableOptions, array]);\n\n const handleSearch = useCallback(\n (text: string, ids: string[]): TagPickerItemData[] =>\n availableOptions\n .filter((option) => !ids.includes(option.id))\n .filter((option) => option.label.toLowerCase().includes(text.toLowerCase()))\n .map((option) => ({ id: option.id, label: option.label, hue: option.hue as any })),\n [availableOptions],\n );\n\n const handleUpdate = useCallback(\n (ids: string[]) => {\n if (ids.length === 0) {\n onValueChange('object', undefined);\n return;\n }\n\n const refs = ids\n .map((id) => {\n const item = availableOptions.find((option) => option.id === id);\n if (item) {\n const dxn = DXN.parse(item.id);\n return Ref.fromDXN(dxn);\n }\n return null;\n })\n .filter(isNonNullable);\n\n if (array) {\n onValueChange('object', refs);\n } else {\n onValueChange('object', refs[0]);\n }\n },\n [availableOptions, array, onValueChange],\n );\n\n const tagPickerMode: TagPickerMode = useMemo(() => (array ? 'multi-select' : 'single-select'), [array]);\n\n if (!refTypeInfo) {\n return null;\n }\n\n const { status, error } = restInputProps.getStatus();\n\n return (\n <Input.Root validationValence={status}>\n {!inputOnly && (\n <InputHeader error={error}>\n <Input.Label>{label}</Input.Label>\n </InputHeader>\n )}\n <div data-no-submit>\n <TagPicker\n items={handleGetValue()}\n mode={tagPickerMode}\n onBlur={(event) => onBlur(event as unknown as FocusEvent<HTMLElement>)}\n onUpdate={handleUpdate}\n onSearch={handleSearch}\n classNames='rounded-sm bg-input p-1.5'\n />\n </div>\n {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}\n </Input.Root>\n );\n};\n\nconst RefFieldFallback = ({\n type,\n label,\n disabled,\n placeholder,\n inputOnly,\n getValue,\n onValueChange,\n ...restInputProps\n}: InputProps) => {\n const handleOnValueChange = (_type: any, dxnString: string) => {\n const dxn = DXN.tryParse(dxnString);\n if (dxn) {\n onValueChange?.('object', Ref.fromDXN(dxn));\n } else if (dxnString === '') {\n onValueChange?.('object', undefined);\n } else {\n onValueChange?.('string', dxnString);\n }\n };\n\n const handleGetValue = () => {\n const formValue = getValue();\n if (typeof formValue === 'string') {\n return formValue;\n }\n if (Ref.isRef(formValue)) {\n return formValue.dxn.toString();\n }\n\n return undefined;\n };\n\n return (\n <TextInput\n type={type}\n label={label}\n disabled={disabled}\n placeholder={placeholder}\n inputOnly={inputOnly}\n getValue={handleGetValue as <V>() => V | undefined}\n onValueChange={handleOnValueChange}\n {...restInputProps}\n />\n );\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { FormatEnum } from '@dxos/echo-schema';\nimport { type SimpleType } from '@dxos/effect';\n\nimport { BooleanInput, MarkdownInput, NumberInput, TextInput } from './Defaults';\nimport { type InputComponent } from './Input';\nimport { GeoPointInput } from './custom';\n\n/**\n * Get property input component.\n */\nexport const getInputComponent = (type: SimpleType, format?: FormatEnum | string): InputComponent | undefined => {\n switch (format) {\n case FormatEnum.GeoPoint:\n return GeoPointInput;\n case FormatEnum.Markdown:\n return MarkdownInput;\n }\n\n switch (type) {\n case 'string':\n return TextInput;\n case 'number':\n return NumberInput;\n case 'boolean':\n return BooleanInput;\n }\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Schema, SchemaAST } from 'effect';\nimport React, { useCallback, useMemo, useState } from 'react';\n\nimport { type SchemaRegistry } from '@dxos/echo-db';\nimport { Format, type BaseSchema, type JsonProp } from '@dxos/echo-schema';\nimport { invariant } from '@dxos/invariant';\nimport { IconButton, type ThemedClassName, useTranslation } from '@dxos/react-ui';\nimport { List } from '@dxos/react-ui-list';\nimport { ghostHover, inputTextLabel, mx } from '@dxos/react-ui-theme';\nimport { FieldSchema, type FieldType, type ViewType, ViewProjection, VIEW_FIELD_LIMIT } from '@dxos/schema';\n\nimport { translationKey } from '../../translations';\nimport { FieldEditor } from '../FieldEditor';\nimport { Form } from '../Form';\n\nconst grid = 'grid grid-cols-[32px_1fr_32px] min-bs-[2.5rem]';\n\nconst ViewMetaSchema = Schema.Struct({\n name: Schema.String.annotations({\n [SchemaAST.TitleAnnotationId]: 'View',\n }),\n typename: Format.URL.annotations({\n [SchemaAST.TitleAnnotationId]: 'Typename',\n }),\n}).pipe(Schema.mutable);\n\ntype ViewMetaType = Schema.Schema.Type<typeof ViewMetaSchema>;\n\nexport type ViewEditorProps = ThemedClassName<{\n schema: BaseSchema;\n view: ViewType;\n registry?: SchemaRegistry;\n readonly?: boolean;\n showHeading?: boolean;\n onTypenameChanged?: (typename: string) => void;\n onDelete?: (fieldId: string) => void;\n}>;\n\n/**\n * Schema-based object form.\n */\nexport const ViewEditor = ({\n classNames,\n schema,\n view,\n registry,\n readonly,\n showHeading = false,\n onTypenameChanged,\n onDelete,\n}: ViewEditorProps) => {\n const { t } = useTranslation(translationKey);\n const projection = useMemo(() => new ViewProjection(schema.jsonSchema, view), [schema, view]);\n const [field, setField] = useState<FieldType>();\n\n // TODO(burdon): Should be reactive.\n const viewValues = useMemo(() => {\n return {\n name: view.name,\n // TODO(burdon): Need to warn user of possible consequences of editing.\n // TODO(burdon): Settings should have domain name owned by user.\n typename: view.query.typename,\n };\n }, [view]);\n\n const handleSelect = useCallback((field: FieldType) => {\n setField((f) => (f === field ? undefined : field));\n }, []);\n\n // TODO(burdon): Check if mutable; variant of useCallback that return undefined if readonly?\n\n const handleAdd = useCallback(() => {\n invariant(!schema.readonly);\n const field = projection.createFieldProjection();\n setField(field);\n }, [schema, view]);\n\n const handleUpdate = useCallback(\n ({ name, typename }: ViewMetaType) => {\n invariant(!schema.readonly);\n requestAnimationFrame(() => {\n if (view.name !== name) {\n view.name = name;\n }\n\n if (view.query.typename !== typename) {\n onTypenameChanged?.(typename);\n }\n });\n },\n [schema, view, onTypenameChanged],\n );\n\n const handleDelete = useCallback(\n (fieldId: string) => {\n invariant(!schema.readonly);\n if (fieldId === field?.id) {\n setField(undefined);\n }\n\n onDelete?.(fieldId);\n },\n [schema, field, onDelete],\n );\n\n const handleMove = useCallback(\n (fromIndex: number, toIndex: number) => {\n invariant(!schema.readonly);\n // NOTE(ZaymonFC): Using arrayMove here causes a race condition with the kanban model.\n const fields = [...view.fields];\n const [moved] = fields.splice(fromIndex, 1);\n fields.splice(toIndex, 0, moved);\n view.fields = fields;\n },\n [schema, view.fields],\n );\n\n const handleClose = useCallback(() => setField(undefined), []);\n\n const hiddenProperties = projection.getHiddenProperties();\n\n const handleHide = useCallback(\n (fieldId: string) => {\n setField(undefined);\n projection.hideFieldProjection(fieldId);\n },\n [projection],\n );\n\n const handleShow = useCallback(\n (property: string) => {\n setField(undefined);\n projection.showFieldProjection(property as JsonProp);\n },\n [projection],\n );\n\n return (\n <div role='none' className={mx('grid grid-rows-[1fr_1fr] min-bs-0', classNames)}>\n <Form<ViewMetaType>\n autoSave\n schema={ViewMetaSchema}\n values={viewValues}\n onSave={schema.readonly ? undefined : handleUpdate}\n classNames='min-bs-0 overflow-y-auto'\n />\n\n <div role='none' className='border-bs border-separator min-bs-0 overflow-y-auto'>\n {/* TODO(burdon): Clean up common form ux. */}\n <div role='none' className='p-2'>\n <label className={mx(inputTextLabel)}>{t('fields label')}</label>\n </div>\n\n <List.Root<FieldType>\n items={view.fields}\n isItem={Schema.is(FieldSchema)}\n getId={(field) => field.id}\n onMove={schema.readonly ? undefined : handleMove}\n >\n {({ items: fields }) => (\n <>\n {showHeading && (\n <div role='heading' className={grid}>\n <div />\n <div className='flex items-center text-sm'>{t('field path label')}</div>\n </div>\n )}\n\n <div role='list' className='flex flex-col w-full'>\n {fields?.map((field) => (\n <List.Item<FieldType> key={field.id} item={field} classNames={mx(grid, ghostHover, 'cursor-pointer')}>\n <List.ItemDragHandle />\n <List.ItemTitle onClick={() => handleSelect(field)}>{field.path}</List.ItemTitle>\n <div className='flex items-center gap-2 -ml-4'>\n <List.ItemButton\n icon='ph--eye-slash--regular'\n disabled={view.fields.length <= 1}\n onClick={() => handleHide(field.id)}\n />\n {!schema.readonly && (\n <List.ItemDeleteButton\n icon='ph--trash--regular'\n disabled={view.fields.length <= 1}\n onClick={() => handleDelete(field.id)}\n />\n )}\n </div>\n </List.Item>\n ))}\n </div>\n </>\n )}\n </List.Root>\n\n {hiddenProperties.length > 0 && (\n <div>\n <div role='none' className='p-2'>\n <label className={mx(inputTextLabel)}>{t('hidden fields label')}</label>\n </div>\n\n <List.Root<string>\n items={hiddenProperties}\n isItem={(item): item is string => typeof item === 'string'}\n getId={(property) => property}\n >\n {({ items: properties }) => (\n <div role='list' className='flex flex-col w-full'>\n {properties?.map((property) => (\n <List.Item<string>\n key={property}\n item={property}\n classNames={mx(grid, ghostHover, 'cursor-pointer')}\n >\n <div />\n <List.ItemTitle>{property}</List.ItemTitle>\n <List.ItemButton icon='ph--eye--regular' onClick={() => handleShow(property)} />\n </List.Item>\n ))}\n </div>\n )}\n </List.Root>\n </div>\n )}\n </div>\n\n {field && (\n <FieldEditor\n key={field.id}\n view={view}\n projection={projection}\n field={field}\n registry={registry}\n onSave={handleClose}\n />\n )}\n\n {!readonly && !field && (\n <div className='flex p-2 justify-center'>\n <IconButton\n icon='ph--plus--regular'\n label={t('button add property')}\n onClick={schema.readonly ? undefined : handleAdd}\n // TODO(burdon): Show field limit in ux (not tooltip).\n disabled={view.fields.length >= VIEW_FIELD_LIMIT}\n />\n </div>\n )}\n </div>\n );\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["translationKey", "React", "Input", "mx", "textBlockWidth", "DeprecatedFormContainer", "children", "classNames", "div", "role", "className", "mx", "textBlockWidth", "DeprecatedFormInput", "label", "description", "secondary", "primary", "Input", "Root", "Label", "style", "fontSize", "DescriptionAndValidation", "Description", "React", "Button", "Input", "toLocalizedString", "useTranslation", "mx", "ControlPage", "children", "classNames", "props", "React", "div", "role", "className", "mx", "ControlSection", "title", "description", "ControlSectionHeading", "t", "useTranslation", "translationKey", "h2", "toLocalizedString", "p", "ControlGroupButton", "Button", "ControlGroup", "ControlFrame", "controlItemClasses", "controlItemTitleClasses", "controlItemDescriptionClasses", "ControlItem", "h3", "ControlItemInput", "Input", "Root", "Label", "DescriptionAndValidation", "Description", "ControlFrameItem", "React", "useCallback", "useEffect", "useMemo", "useState", "FormatEnum", "FormatEnums", "formatToType", "log", "useTranslation", "getFormatSchema", "getSchemaProperties", "sortProperties", "React", "useCallback", "useState", "useEffect", "useMemo", "GeoLocation", "Input", "useTranslation", "safeParseFloat", "React", "Icon", "Tooltip", "errorText", "InputHeader", "children", "error", "React", "div", "role", "className", "Tooltip", "Trigger", "asChild", "content", "side", "Icon", "icon", "size", "classNames", "errorText", "GeoPointInput", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "onBlur", "t", "useTranslation", "translationKey", "status", "error", "geoPoint", "useMemo", "geoLocation", "GeoLocation", "fromGeoPoint", "longitudeText", "setLongitudeText", "useState", "longitude", "toString", "latitudeText", "setLatitudeText", "latitude", "useEffect", "location", "handleCoordinateChange", "useCallback", "coordinateType", "setText", "event", "inputText", "target", "value", "coord", "safeParseFloat", "undefined", "isNaN", "currentLocation", "newLocation", "newValue", "toGeoPoint", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "role", "className", "TextInput", "pattern", "placeholder", "onChange", "React", "useCallback", "useEffect", "useState", "useRef", "PublicKey", "Icon", "IconButton", "Input", "Tag", "Toolbar", "useTranslation", "List", "HuePicker", "hues", "mx", "SelectOptionInput", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "selected", "setSelectedId", "useState", "isNewOption", "setIsNewOption", "inputRef", "useRef", "t", "useTranslation", "translationKey", "status", "error", "options", "useEffect", "undefined", "randomHue", "usedHues", "Set", "map", "option", "color", "unusedHues", "hues", "filter", "hue", "has", "length", "Math", "floor", "random", "lastThree", "slice", "availableHues", "handleAdd", "useCallback", "newId", "PublicKey", "truncate", "newOption", "id", "title", "handleDelete", "newOptions", "handleMove", "from", "to", "removed", "splice", "handleClick", "current", "handleTitleChange", "e", "o", "target", "value", "handleKeyDown", "key", "handleColorChange", "focus", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "role", "List", "items", "isItem", "item", "onMove", "className", "Item", "classNames", "mx", "aria-expanded", "ItemDragHandle", "ItemTitle", "onClick", "Tag", "palette", "Icon", "icon", "TextInput", "placeholder", "ref", "onChange", "onKeyDown", "data-no-submit", "Toolbar", "HuePicker", "rootVariant", "IconButton", "iconOnly", "span", "React", "Input", "mx", "safeParseFloat", "gridCols", "TupleInput", "binding", "type", "label", "disabled", "getStatus", "getValue", "onValueChange", "onBlur", "status", "error", "values", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "className", "mx", "length", "map", "prop", "TextInput", "key", "value", "onChange", "event", "safeParseFloat", "target", "React", "useCallback", "useEffect", "useRef", "Input", "Select", "TextInput", "type", "label", "inputOnly", "disabled", "placeholder", "getStatus", "getValue", "onValueChange", "onBlur", "status", "error", "React", "Input", "Root", "validationValence", "InputHeader", "Label", "value", "onChange", "event", "target", "Validation", "NumberInput", "DescriptionAndValidation", "BooleanInput", "checked", "Boolean", "Switch", "onCheckedChange", "SelectInput", "options", "handleValueChange", "useCallback", "Select", "TriggerButton", "classNames", "Portal", "Content", "Viewport", "map", "Option", "key", "String", "MarkdownInput", "textareaRef", "useRef", "adjustHeight", "textarea", "current", "style", "blockSize", "scrollHeight", "useEffect", "TextArea", "ref", "resize", "spellCheck", "React", "useEffect", "useMemo", "useRef", "mx", "React", "IconButton", "useTranslation", "mx", "React", "createContext", "useContext", "useEffect", "useMemo", "raise", "getValue", "createJsonPath", "SchemaAST", "useCallback", "useEffect", "useMemo", "useState", "getValue", "setValue", "createJsonPath", "fromEffectValidationPath", "invariant", "log", "validateSchema", "useForm", "schema", "initialValues", "onValuesChanged", "onValidate", "onValid", "onSave", "isTypeLiteral", "ast", "values", "setValues", "touched", "setTouched", "createKeySet", "changed", "setChanged", "errors", "setErrors", "saving", "setSaving", "validate", "length", "validatedValues", "flatMap", "valid", "schemaDirty", "setSchemaDirty", "formIsValid", "Object", "keys", "canSave", "entries", "some", "path", "isTouched", "errorPath", "startsWith", "handleSave", "getStatus", "jsonPath", "Array", "isArray", "matchingError", "find", "status", "undefined", "error", "getFormValue", "onValueChange", "type", "value", "parsedValue", "parseFloat", "err", "catch", "newValues", "prev", "isValid", "onTouched", "obj", "reduce", "acc", "key", "result", "message", "useCallback", "getDXN", "Filter", "isNonNullable", "useRefQueryLookupHandler", "space", "handleRefQueryLookup", "useCallback", "typeInfo", "query", "db", "Filter", "typename", "objects", "run", "map", "object", "dxn", "getDXN", "undefined", "item", "label", "name", "id", "filter", "isNonNullable", "useEffect", "useState", "log", "useQueryRefOptions", "refTypeInfo", "onQueryRefOptions", "options", "setOptions", "loading", "setLoading", "fetchOptions", "fetchedOptions", "map", "option", "dxn", "toString", "id", "label", "hue", "error", "FormContext", "createContext", "undefined", "useFormContext", "useContext", "raise", "Error", "useFormValues", "path", "values", "formValues", "jsonPath", "createJsonPath", "getValue", "useInputProps", "getStatus", "getFormValue", "onValueChange", "onTouched", "stablePath", "useMemo", "Array", "isArray", "join", "type", "value", "onBlur", "FormProvider", "children", "formRef", "autoSave", "formOptions", "form", "useForm", "useEffect", "current", "handleKeyDown", "event", "keyIsEnter", "key", "modifierUsed", "ctrlKey", "altKey", "metaKey", "shiftKey", "inputIsTextarea", "target", "tagName", "toLowerCase", "inputOptOut", "hasAttribute", "closest", "shouldSubmitRegularInput", "shouldSubmitTextarea", "canSave", "handleSave", "formIsValid", "blur", "formElement", "addEventListener", "removeEventListener", "React", "Provider", "FormActions", "onCancel", "readonly", "t", "useTranslation", "translationKey", "canSave", "handleSave", "useFormContext", "React", "div", "role", "className", "mx", "IconButton", "data-testid", "icon", "label", "onClick", "type", "disabled", "Schema", "SchemaAST", "pipe", "capitalize", "React", "useMemo", "createJsonPath", "findNode", "getDiscriminatedType", "isDiscriminatedUnion", "mx", "getSchemaProperties", "isNotFalsy", "SchemaAST", "pipe", "capitalize", "React", "useCallback", "useMemo", "findNode", "getDiscriminatedType", "isDiscriminatedUnion", "SimpleType", "invariant", "IconButton", "useTranslation", "mx", "getSchemaProperties", "FormatEnum", "GeoLocation", "TypeEnum", "parseValue", "type", "format", "value", "undefined", "parseScalar", "TypeEnum", "Boolean", "lowercaseValue", "toLowerCase", "Number", "cleaned", "replace", "num", "isNaN", "String", "Ref", "FormatEnum", "Percent", "Currency", "Markdown", "Error", "DateTime", "Date", "Time", "Timestamp", "date", "getTime", "GeoPoint", "parts", "split", "length", "lat", "parseFloat", "long", "GeoLocation", "toGeoPoint", "latitude", "longitude", "cellClassesForFieldType", "Duration", "JSON", "DID", "pathNotUniqueError", "path", "message", "format", "formatDate", "FormatEnum", "GeoLocation", "TypeEnum", "formatForDisplay", "type", "format", "value", "locale", "undefined", "formatScalar", "TypeEnum", "Boolean", "toLocaleString", "toUpperCase", "Number", "String", "Ref", "FormatEnum", "Percent", "Currency", "style", "currency", "minimumFractionDigits", "maximumFractionDigits", "Date", "formatDate", "error", "Time", "DateTime", "GeoPoint", "Array", "isArray", "length", "every", "isFinite", "latitude", "longitude", "GeoLocation", "fromGeoPoint", "formatForEditing", "date", "toISOString", "split", "FormatEnum", "ReferenceAnnotationId", "findAnnotation", "SchemaAST", "findNode", "findArrayElementType", "ast", "tupleType", "findNode", "SchemaAST", "isTupleType", "elementType", "rest", "type", "getRefProps", "property", "ast", "format", "array", "FormatEnum", "Ref", "isArray", "elementType", "findArrayElementType", "annotation", "findAnnotation", "ReferenceAnnotationId", "undefined", "padding", "ArrayField", "property", "readonly", "path", "inputProps", "Custom", "lookupComponent", "t", "useTranslation", "translationKey", "ast", "name", "type", "title", "values", "useFormValues", "invariant", "Array", "isArray", "join", "label", "pipe", "capitalize", "elementType", "findArrayElementType", "getDefaultObjectValue", "typeNode", "baseNode", "findNode", "isDiscriminatedUnion", "typeLiteral", "getDiscriminatedType", "SchemaAST", "isTypeLiteral", "Object", "fromEntries", "getSchemaProperties", "map", "prop", "defaultValue", "newValue", "useMemo", "SimpleType", "getDefaultValue", "handleAdd", "useCallback", "onValueChange", "handleRemove", "index", "newValues", "filter", "_", "i", "React", "div", "role", "className", "mx", "InputHeader", "_value", "key", "FormField", "array", "inline", "IconButton", "icon", "iconOnly", "onClick", "React", "useCallback", "useMemo", "Expando", "getTypeAnnotation", "Ref", "ReferenceAnnotationId", "findAnnotation", "DXN", "Input", "TagPicker", "isNonNullable", "RefField", "type", "label", "disabled", "placeholder", "inputOnly", "array", "ast", "getValue", "onBlur", "onQueryRefOptions", "onValueChange", "restInputProps", "refTypeInfo", "useMemo", "findAnnotation", "ReferenceAnnotationId", "undefined", "options", "availableOptions", "loading", "_loading", "useQueryRefOptions", "typename", "getTypeAnnotation", "Expando", "React", "RefFieldFallback", "handleGetValue", "useCallback", "formValue", "unknownToRefOption", "val", "Ref", "isRef", "dxnString", "dxn", "toString", "matchingOption", "find", "option", "id", "Array", "isArray", "map", "filter", "isNonNullable", "handleSearch", "text", "ids", "includes", "toLowerCase", "hue", "handleUpdate", "length", "refs", "item", "DXN", "parse", "fromDXN", "tagPickerMode", "status", "error", "getStatus", "Input", "Root", "validationValence", "InputHeader", "Label", "div", "data-no-submit", "TagPicker", "items", "mode", "event", "onUpdate", "onSearch", "classNames", "DescriptionAndValidation", "handleOnValueChange", "_type", "tryParse", "TextInput", "FormatEnum", "getInputComponent", "type", "format", "FormatEnum", "GeoPoint", "GeoPointInput", "Markdown", "MarkdownInput", "TextInput", "NumberInput", "BooleanInput", "FormField", "property", "path", "readonly", "inline", "onQueryRefOptions", "lookupComponent", "Custom", "inputProps", "useInputProps", "ast", "name", "type", "format", "title", "description", "options", "examples", "array", "label", "useMemo", "pipe", "capitalize", "placeholder", "length", "FoundComponent", "prop", "schema", "Schema", "make", "disabled", "React", "div", "role", "jsonPath", "createJsonPath", "CustomComponent", "inputOnly", "refProps", "getRefProps", "RefField", "isArray", "ArrayField", "InputComponent", "getInputComponent", "SelectInput", "map", "option", "value", "String", "baseNode", "findNode", "isDiscriminatedUnion", "typeLiteral", "getDiscriminatedType", "getValue", "SchemaAST", "isTypeLiteral", "h3", "className", "FormFields", "filter", "sort", "values", "useFormValues", "properties", "props", "getSchemaProperties", "filtered", "a", "b", "indexOf", "mx", "key", "isNotFalsy", "Form", "classNames", "schema", "values", "initialValues", "path", "autoFocus", "readonly", "filter", "sort", "autoSave", "testId", "onValuesChanged", "onValidate", "onSave", "onCancel", "onQueryRefOptions", "lookupComponent", "Custom", "formRef", "useRef", "onValid", "useMemo", "undefined", "useEffect", "current", "input", "querySelector", "focus", "React", "FormProvider", "div", "ref", "role", "className", "mx", "data-testid", "FormFields", "FormActions", "FieldEditor", "view", "projection", "field", "registry", "onSave", "onCancel", "t", "useTranslation", "translationKey", "props", "setProps", "useState", "getFieldProjection", "id", "useEffect", "schemas", "setSchemas", "subscription", "query", "subscribe", "results", "fire", "setTimeout", "run", "clearTimeout", "referenceSchema", "setReferenceSchema", "find", "schema", "typename", "fieldSchema", "setFieldSchema", "getFormatSchema", "format", "handleValuesChanged", "useCallback", "_props", "prev", "newSchema", "type", "formatToType", "handleValidate", "property", "fields", "f", "path", "message", "handleSave", "setFieldProjection", "handleCancel", "requestAnimationFrame", "Custom", "useMemo", "React", "SelectInput", "options", "FormatEnums", "filter", "value", "FormatEnum", "None", "map", "label", "getSchemaProperties", "ast", "sort", "sortProperties", "p", "name", "SelectOptionInput", "propIsNotType", "log", "warn", "Form", "key", "autoFocus", "values", "onValuesChanged", "onValidate", "Schema", "SchemaAST", "React", "useCallback", "useMemo", "useState", "Format", "invariant", "IconButton", "useTranslation", "List", "ghostHover", "inputTextLabel", "mx", "FieldSchema", "ViewProjection", "VIEW_FIELD_LIMIT", "grid", "ViewMetaSchema", "Schema", "Struct", "name", "String", "annotations", "SchemaAST", "TitleAnnotationId", "typename", "Format", "URL", "pipe", "mutable", "ViewEditor", "classNames", "schema", "view", "registry", "readonly", "showHeading", "onTypenameChanged", "onDelete", "t", "useTranslation", "translationKey", "projection", "useMemo", "ViewProjection", "jsonSchema", "field", "setField", "useState", "viewValues", "query", "handleSelect", "useCallback", "f", "undefined", "handleAdd", "invariant", "createFieldProjection", "handleUpdate", "requestAnimationFrame", "handleDelete", "fieldId", "id", "handleMove", "fromIndex", "toIndex", "fields", "moved", "splice", "handleClose", "hiddenProperties", "getHiddenProperties", "handleHide", "hideFieldProjection", "handleShow", "property", "showFieldProjection", "React", "div", "role", "className", "mx", "Form", "autoSave", "values", "onSave", "label", "inputTextLabel", "List", "Root", "items", "isItem", "is", "FieldSchema", "getId", "onMove", "map", "Item", "key", "item", "ghostHover", "ItemDragHandle", "ItemTitle", "onClick", "path", "ItemButton", "icon", "disabled", "length", "ItemDeleteButton", "properties", "FieldEditor", "IconButton", "VIEW_FIELD_LIMIT"]
7
7
  }