@panneau/fields 5.0.0-alpha.6 → 5.0.0-alpha.7

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 (67) hide show
  1. package/dist/boolean/BooleanField.js +78 -17
  2. package/dist/boolean/BooleanField.js.map +1 -1
  3. package/dist/color/ColorField.js.map +1 -1
  4. package/dist/date/DateField.js.map +1 -1
  5. package/dist/datetime/DateTimeField.js +107 -20
  6. package/dist/datetime/DateTimeField.js.map +1 -1
  7. package/dist/duration/DurationField.js +126 -41
  8. package/dist/duration/DurationField.js.map +1 -1
  9. package/dist/email/EmailField.js.map +1 -1
  10. package/dist/embed/EmbedField.js +185 -69
  11. package/dist/embed/EmbedField.js.map +1 -1
  12. package/dist/file/FileField.d.ts.map +1 -1
  13. package/dist/file/FileField.js +167 -77
  14. package/dist/file/FileField.js.map +1 -1
  15. package/dist/group/GroupField.js.map +1 -1
  16. package/dist/json/JsonField.js +104 -22
  17. package/dist/json/JsonField.js.map +1 -1
  18. package/dist/locales/index.js.map +1 -1
  19. package/dist/localized/LocalizedField.js.map +1 -1
  20. package/dist/location/LocationField.d.ts.map +1 -1
  21. package/dist/location/LocationField.js +351 -138
  22. package/dist/location/LocationField.js.map +1 -1
  23. package/dist/location/LocationMap.d.ts.map +1 -1
  24. package/dist/location/LocationMap.js +155 -65
  25. package/dist/location/LocationMap.js.map +1 -1
  26. package/dist/location/leafletCss.js.map +1 -1
  27. package/dist/location/nominatim.js.map +1 -1
  28. package/dist/missing/MissingField.d.ts +3 -2
  29. package/dist/missing/MissingField.d.ts.map +1 -1
  30. package/dist/missing/MissingField.js +3 -2
  31. package/dist/missing/MissingField.js.map +1 -1
  32. package/dist/number/NumberField.js.map +1 -1
  33. package/dist/range/RangeField.js +82 -11
  34. package/dist/range/RangeField.js.map +1 -1
  35. package/dist/relation/RelationField.js +485 -145
  36. package/dist/relation/RelationField.js.map +1 -1
  37. package/dist/repeater/RepeaterField.js +118 -34
  38. package/dist/repeater/RepeaterField.js.map +1 -1
  39. package/dist/select/SelectField.js.map +1 -1
  40. package/dist/shared/DefinitionField.js.map +1 -1
  41. package/dist/shared/builtIn.js.map +1 -1
  42. package/dist/shared/check.js.map +1 -1
  43. package/dist/shared/context.js.map +1 -1
  44. package/dist/shared/cx.js.map +1 -1
  45. package/dist/shared/dates.js.map +1 -1
  46. package/dist/shared/embed.js.map +1 -1
  47. package/dist/shared/entry.js.map +1 -1
  48. package/dist/shared/relation.js.map +1 -1
  49. package/dist/slug/SlugField.d.ts.map +1 -1
  50. package/dist/slug/SlugField.js +184 -36
  51. package/dist/slug/SlugField.js.map +1 -1
  52. package/dist/tags/TagsField.js.map +1 -1
  53. package/dist/tel/TelField.js.map +1 -1
  54. package/dist/text/TextField.js.map +1 -1
  55. package/dist/textarea/TextAreaField.js.map +1 -1
  56. package/dist/time/TimeField.js +64 -10
  57. package/dist/time/TimeField.js.map +1 -1
  58. package/dist/upload/FilePicker.js +107 -24
  59. package/dist/upload/FilePicker.js.map +1 -1
  60. package/dist/upload/UploadList.js.map +1 -1
  61. package/dist/upload/files.js.map +1 -1
  62. package/dist/upload/useRejectionMessage.js.map +1 -1
  63. package/dist/upload/useUploads.js.map +1 -1
  64. package/dist/uppy/uploader.js.map +1 -1
  65. package/dist/url/UrlField.js +69 -14
  66. package/dist/url/UrlField.js.map +1 -1
  67. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"FileField.js","names":["file","onChange","styles","_c"],"sources":["../../src/file/FileField.tsx"],"sourcesContent":["import { FileText, X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { StoredFile } from '@panneau/protocol';\nimport { Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getAccept, getFieldProps, getMaxSize } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { FilePicker } from '../upload/FilePicker';\nimport { UploadList } from '../upload/UploadList';\nimport { formatSize } from '../upload/files';\nimport type { UploadSource, UploadedFile } from '../upload/types';\nimport { useRejectionMessage } from '../upload/useRejectionMessage';\nimport { useUploads } from '../upload/useUploads';\nimport styles from './FileField.module.css';\n\n/**\n * A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the\n * file to storage; or the file itself, sent in a multipart request without direct uploads.\n */\nexport type FileValue = StoredFile | UploadedFile | File;\n\nexport interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */\n accept?: readonly string[] | null;\n /** Largest file, in bytes. Larger ones are refused before they are sent. */\n maxSize?: number | null;\n /**\n * Where files are uploaded directly to storage. Defaults to the one of the fields context.\n * Without one, the value holds the files themselves, which the adapter sends in\n * `multipart/form-data`.\n */\n uploadSource?: UploadSource | null;\n}\n\nexport interface SingleFileFieldProps extends FileFieldBaseProps {\n multiple?: false;\n value?: FileValue | null;\n onChange?: (value: FileValue | null) => void;\n}\n\nexport interface MultipleFileFieldProps extends FileFieldBaseProps {\n multiple: true;\n value?: readonly FileValue[] | null;\n /** Called with the files. An empty list is `null`. */\n onChange?: (value: FileValue[] | null) => void;\n}\n\nexport type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;\n\nfunction fileSize(file: FileValue): number | null {\n return typeof file.size === 'number' ? file.size : null;\n}\n\nfunction fileUrl(file: FileValue): string | null {\n return !(file instanceof Blob) && 'url' in file && typeof file.url === 'string'\n ? file.url\n : null;\n}\n\n/** Whether a value is a file of a `file` value. */\nexport function isFileValue(value: unknown): value is FileValue {\n if (typeof File !== 'undefined' && value instanceof File) {\n return true;\n }\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { name?: unknown }).name === 'string'\n );\n}\n\n/** The files of a value, single or multiple. */\nexport function toFiles(value: unknown): FileValue[] {\n if (Array.isArray(value)) {\n return value.filter(isFileValue);\n }\n return isFileValue(value) ? [value] : [];\n}\n\n/**\n * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the\n * `file` type). With an upload source, files go directly to storage, and the value references\n * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items\n * give stored files, which the field shows with a link. A new file replaces the file of a single\n * value, and is added to a multiple one.\n */\nexport function FileField(props: FileFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const {\n accept = null,\n maxSize = null,\n uploadSource = context.uploadSource,\n label,\n description,\n errors = [],\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n } = props;\n const multiple = props.multiple === true;\n const files = toFiles(props.value);\n const editable = disabled !== true && readOnly !== true;\n const [rejections, setRejections] = useState<string[]>([]);\n const rejectionMessage = useRejectionMessage(maxSize);\n\n // The files as last set, so that uploads that end together all add theirs.\n const latest = useRef(files);\n useEffect(() => {\n latest.current = files;\n });\n const set = (next: FileValue[]) => {\n latest.current = next;\n if (props.multiple === true) {\n props.onChange?.(next.length > 0 ? next : null);\n } else {\n props.onChange?.(next[0] ?? null);\n }\n };\n\n const upload = useUploads({\n source: uploadSource,\n accept,\n maxSize,\n onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),\n onRejected: (file, reason) =>\n setRejections((current) => [...current, rejectionMessage(file, reason)]),\n });\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={[...errors, ...rejections]}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.field}>\n {files.length > 0 ? (\n <ul className={styles.files}>\n {files.map((file, index) => {\n const { name } = file;\n const url = fileUrl(file);\n const size = fileSize(file);\n return (\n <li key={`${String(index)}-${name}`} className={styles.file}>\n <FileText aria-hidden className={styles.icon} />\n {url !== null ? (\n <a\n href={url}\n className={styles.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className={styles.name}>{name}</span>\n )}\n {size !== null ? (\n <span className={styles.size}>\n {formatSize(size, intl.locale)}\n </span>\n ) : null}\n {editable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.removeFile, {\n name,\n })}\n onPress={() =>\n set(latest.current.filter((_, at) => at !== index))\n }\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : upload.items.length === 0 ? (\n <span className={styles.none}>{intl.formatMessage(messages.noFile)}</span>\n ) : null}\n <UploadList\n items={upload.items}\n onPause={upload.pause}\n onResume={upload.resume}\n onCancel={upload.cancel}\n onRetry={upload.retry}\n />\n {editable ? (\n <FilePicker\n accept={accept}\n multiple={multiple}\n {...(!multiple && files.length > 0\n ? { label: intl.formatMessage(messages.replaceFile) }\n : {})}\n onSelect={(selected) => {\n setRejections([]);\n upload.add(selected);\n }}\n />\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)\n * and `maxSize` rule, with the upload source of the fields context.\n */\nexport function FileFieldEntry(props: FieldEntryProps) {\n const { field, value, onChange } = props;\n const common = {\n ...getFieldProps(props),\n accept: getAccept(field),\n maxSize: getMaxSize(field),\n };\n return field.multiple === true ? (\n <FileField {...common} multiple value={toFiles(value)} onChange={onChange} />\n ) : (\n <FileField {...common} value={toFiles(value)[0] ?? null} onChange={onChange} />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"FileField.js","names":["FileText","X","useEffect","useRef","useState","StoredFile","Fieldset","IconButton","usePanneauIntl","useFieldsContext","getAccept","getFieldProps","getMaxSize","messages","FieldEntryProps","FieldProps","FilePicker","UploadList","formatSize","UploadSource","UploadedFile","useRejectionMessage","useUploads","styles","FileValue","File","FileFieldBaseProps","Omit","accept","maxSize","uploadSource","SingleFileFieldProps","multiple","value","onChange","MultipleFileFieldProps","FileFieldProps","fileSize","file","size","fileUrl","Blob","url","isFileValue","name","toFiles","Array","isArray","filter","FileField","props","$","_c","intl","context","t0","t1","label","description","errors","t2","disabled","readOnly","required","className","labelClassName","descriptionClassName","errorsClassName","undefined","t3","t4","files","editable","t5","Symbol","for","rejections","setRejections","rejectionMessage","latest","t6","current","set","next","length","t7","file_0","reason","upload","source","onUploaded","onRejected","T0","t8","t10","map","file_1","index","String","icon","locale","formatMessage","removeFile","_","at","items","none","noFile","t11","cancel","pause","resume","retry","t12","replaceFile","selected","add","t13","t9","field","t14","FileFieldEntry","common","_c","styles"],"sources":["../../src/file/FileField.tsx"],"sourcesContent":["import { FileText, X } from 'lucide-react';\nimport { useEffect, useRef, useState } from 'react';\n\nimport type { StoredFile } from '@panneau/protocol';\nimport { Fieldset, IconButton, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport { getAccept, getFieldProps, getMaxSize } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { FilePicker } from '../upload/FilePicker';\nimport { UploadList } from '../upload/UploadList';\nimport { formatSize } from '../upload/files';\nimport type { UploadSource, UploadedFile } from '../upload/types';\nimport { useRejectionMessage } from '../upload/useRejectionMessage';\nimport { useUploads } from '../upload/useUploads';\nimport styles from './FileField.module.css';\n\n/**\n * A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the\n * file to storage; or the file itself, sent in a multipart request without direct uploads.\n */\nexport type FileValue = StoredFile | UploadedFile | File;\n\nexport interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {\n /** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */\n accept?: readonly string[] | null;\n /** Largest file, in bytes. Larger ones are refused before they are sent. */\n maxSize?: number | null;\n /**\n * Where files are uploaded directly to storage. Defaults to the one of the fields context.\n * Without one, the value holds the files themselves, which the adapter sends in\n * `multipart/form-data`.\n */\n uploadSource?: UploadSource | null;\n}\n\nexport interface SingleFileFieldProps extends FileFieldBaseProps {\n multiple?: false;\n value?: FileValue | null;\n onChange?: (value: FileValue | null) => void;\n}\n\nexport interface MultipleFileFieldProps extends FileFieldBaseProps {\n multiple: true;\n value?: readonly FileValue[] | null;\n /** Called with the files. An empty list is `null`. */\n onChange?: (value: FileValue[] | null) => void;\n}\n\nexport type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;\n\nfunction fileSize(file: FileValue): number | null {\n return typeof file.size === 'number' ? file.size : null;\n}\n\nfunction fileUrl(file: FileValue): string | null {\n return !(file instanceof Blob) && 'url' in file && typeof file.url === 'string'\n ? file.url\n : null;\n}\n\n/** Whether a value is a file of a `file` value. */\nexport function isFileValue(value: unknown): value is FileValue {\n if (typeof File !== 'undefined' && value instanceof File) {\n return true;\n }\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { name?: unknown }).name === 'string'\n );\n}\n\n/** The files of a value, single or multiple. */\nexport function toFiles(value: unknown): FileValue[] {\n if (Array.isArray(value)) {\n return value.filter(isFileValue);\n }\n return isFileValue(value) ? [value] : [];\n}\n\n/**\n * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the\n * `file` type). With an upload source, files go directly to storage, and the value references\n * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items\n * give stored files, which the field shows with a link. A new file replaces the file of a single\n * value, and is added to a multiple one.\n */\nexport function FileField(props: FileFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const {\n accept = null,\n maxSize = null,\n label,\n description,\n errors = [],\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n } = props;\n const uploadSource =\n props.uploadSource === undefined ? context.uploadSource : props.uploadSource;\n const multiple = props.multiple === true;\n const files = toFiles(props.value);\n const editable = disabled !== true && readOnly !== true;\n const [rejections, setRejections] = useState<string[]>([]);\n const rejectionMessage = useRejectionMessage(maxSize);\n\n // The files as last set, so that uploads that end together all add theirs.\n const latest = useRef(files);\n useEffect(() => {\n latest.current = files;\n });\n const set = (next: FileValue[]) => {\n latest.current = next;\n if (props.multiple === true) {\n props.onChange?.(next.length > 0 ? next : null);\n } else {\n props.onChange?.(next[0] ?? null);\n }\n };\n\n const upload = useUploads({\n source: uploadSource,\n accept,\n maxSize,\n onUploaded: (file) => set(multiple ? [...latest.current, file] : [file]),\n onRejected: (file, reason) =>\n setRejections((current) => [...current, rejectionMessage(file, reason)]),\n });\n\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={[...errors, ...rejections]}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.field}>\n {files.length > 0 ? (\n <ul className={styles.files}>\n {files.map((file, index) => {\n const { name } = file;\n const url = fileUrl(file);\n const size = fileSize(file);\n return (\n <li key={`${String(index)}-${name}`} className={styles.file}>\n <FileText aria-hidden className={styles.icon} />\n {url !== null ? (\n <a\n href={url}\n className={styles.name}\n target=\"_blank\"\n rel=\"noreferrer\"\n >\n {name}\n </a>\n ) : (\n <span className={styles.name}>{name}</span>\n )}\n {size !== null ? (\n <span className={styles.size}>\n {formatSize(size, intl.locale)}\n </span>\n ) : null}\n {editable ? (\n <IconButton\n icon={X}\n size=\"sm\"\n label={intl.formatMessage(messages.removeFile, {\n name,\n })}\n onPress={() =>\n set(latest.current.filter((_, at) => at !== index))\n }\n />\n ) : null}\n </li>\n );\n })}\n </ul>\n ) : upload.items.length === 0 ? (\n <span className={styles.none}>{intl.formatMessage(messages.noFile)}</span>\n ) : null}\n <UploadList\n items={upload.items}\n onPause={upload.pause}\n onResume={upload.resume}\n onCancel={upload.cancel}\n onRetry={upload.retry}\n />\n {editable ? (\n <FilePicker\n accept={accept}\n multiple={multiple}\n {...(!multiple && files.length > 0\n ? { label: intl.formatMessage(messages.replaceFile) }\n : {})}\n onSelect={(selected) => {\n setRejections([]);\n upload.add(selected);\n }}\n />\n ) : null}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)\n * and `maxSize` rule, with the upload source of the fields context.\n */\nexport function FileFieldEntry(props: FieldEntryProps) {\n const { field, value, onChange } = props;\n const common = {\n ...getFieldProps(props),\n accept: getAccept(field),\n maxSize: getMaxSize(field),\n };\n return field.multiple === true ? (\n <FileField {...common} multiple value={toFiles(value)} onChange={onChange} />\n ) : (\n <FileField {...common} value={toFiles(value)[0] ?? null} onChange={onChange} />\n );\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GroupField.js","names":["field","object","label","description","errors","required","className","labelClassName","descriptionClassName","errorsClassName","_c","styles"],"sources":["../../src/group/GroupField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { Fieldset } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './GroupField.module.css';\n\nexport type GroupValue = Record<string, unknown>;\n\nexport interface GroupFieldProps extends FieldProps<GroupValue> {\n /** The nested fields, rendered with the entries of the fields context. */\n fields: readonly Field[];\n /** Dot path of the group's value, the prefix of its fields' paths. Defaults to `name`. */\n path?: string;\n fieldsClassName?: string;\n}\n\n/**\n * A nested object: its fields under a legend. Each field renders with the entry of its type, at\n * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole\n * object through `onChange`.\n */\nexport function GroupField({\n fields,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n fieldsClassName,\n}: GroupFieldProps) {\n const base = path ?? name ?? '';\n const object = value ?? {};\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={cx(styles.fields, fieldsClassName)}>\n {fields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={base !== '' ? `${base}.${field.name}` : field.name}\n value={object[field.name]}\n onChange={(next) => onChange?.({ ...object, [field.name]: next })}\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={object}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/** The `group` type: its `fields`, as a nested object. */\nexport function GroupFieldEntry(props: FieldEntryProps) {\n const { value } = props;\n return (\n <GroupField\n {...getFieldProps(props)}\n fields={props.field.fields ?? []}\n path={props.path}\n value={\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as GroupValue)\n : null\n }\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"GroupField.js","names":["Field","Fieldset","NestedField","cx","getFieldProps","FieldEntryProps","FieldProps","styles","GroupValue","Record","GroupFieldProps","fields","path","fieldsClassName","GroupField","t0","$","_c","name","value","onChange","onBlur","label","description","errors","disabled","readOnly","required","className","labelClassName","descriptionClassName","errorsClassName","base","t1","object","t2","t3","t4","field","next","undefined","map","t5","GroupFieldEntry","props","Array","isArray","_c","styles"],"sources":["../../src/group/GroupField.tsx"],"sourcesContent":["import type { Field } from '@panneau/protocol';\nimport { Fieldset } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './GroupField.module.css';\n\nexport type GroupValue = Record<string, unknown>;\n\nexport interface GroupFieldProps extends FieldProps<GroupValue> {\n /** The nested fields, rendered with the entries of the fields context. */\n fields: readonly Field[];\n /** Dot path of the group's value, the prefix of its fields' paths. Defaults to `name`. */\n path?: string;\n fieldsClassName?: string;\n}\n\n/**\n * A nested object: its fields under a legend. Each field renders with the entry of its type, at\n * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole\n * object through `onChange`.\n */\nexport function GroupField({\n fields,\n path,\n name,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n fieldsClassName,\n}: GroupFieldProps) {\n const base = path ?? name ?? '';\n const object = value ?? {};\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={cx(styles.fields, fieldsClassName)}>\n {fields.map((field) => (\n <NestedField\n key={field.name}\n field={field}\n path={base !== '' ? `${base}.${field.name}` : field.name}\n value={object[field.name]}\n onChange={(next) => onChange?.({ ...object, [field.name]: next })}\n {...(onBlur !== undefined ? { onBlur } : {})}\n parentValue={object}\n {...(disabled !== undefined ? { disabled } : {})}\n {...(readOnly !== undefined ? { readOnly } : {})}\n />\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/** The `group` type: its `fields`, as a nested object. */\nexport function GroupFieldEntry(props: FieldEntryProps) {\n const { value } = props;\n return (\n <GroupField\n {...getFieldProps(props)}\n fields={props.field.fields ?? []}\n path={props.path}\n value={\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as GroupValue)\n : null\n }\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
@@ -39,45 +39,127 @@ function parseJson(text) {
39
39
  * is the text itself, which the `json` rule refuses, so the form can't be saved with it. The text
40
40
  * is indented again on blur once it parses.
41
41
  */
42
- function JsonField({ value, onChange, onBlur, errors = [], rows = 8, disabled, readOnly, required, ...props }) {
42
+ function JsonField(t0) {
43
+ const $ = c(33);
44
+ let disabled;
45
+ let onBlur;
46
+ let onChange;
47
+ let props;
48
+ let readOnly;
49
+ let required;
50
+ let t1;
51
+ let t2;
52
+ let value;
53
+ if ($[0] !== t0) {
54
+ ({value, onChange, onBlur, errors: t1, rows: t2, disabled, readOnly, required, ...props} = t0);
55
+ $[0] = t0;
56
+ $[1] = disabled;
57
+ $[2] = onBlur;
58
+ $[3] = onChange;
59
+ $[4] = props;
60
+ $[5] = readOnly;
61
+ $[6] = required;
62
+ $[7] = t1;
63
+ $[8] = t2;
64
+ $[9] = value;
65
+ } else {
66
+ disabled = $[1];
67
+ onBlur = $[2];
68
+ onChange = $[3];
69
+ props = $[4];
70
+ readOnly = $[5];
71
+ required = $[6];
72
+ t1 = $[7];
73
+ t2 = $[8];
74
+ value = $[9];
75
+ }
76
+ let t3;
77
+ if ($[10] !== t1) {
78
+ t3 = t1 === void 0 ? [] : t1;
79
+ $[10] = t1;
80
+ $[11] = t3;
81
+ } else t3 = $[11];
82
+ const errors = t3;
83
+ const rows = t2 === void 0 ? 8 : t2;
43
84
  const intl = usePanneauIntl();
44
- const [state, setState] = useState(() => ({
45
- value,
46
- text: toText(value)
47
- }));
85
+ let t4;
86
+ if ($[12] !== value) {
87
+ t4 = () => ({
88
+ value,
89
+ text: toText(value)
90
+ });
91
+ $[12] = value;
92
+ $[13] = t4;
93
+ } else t4 = $[13];
94
+ const [state, setState] = useState(t4);
48
95
  if (state.value !== value) setState({
49
96
  value,
50
97
  text: toText(value)
51
98
  });
52
99
  const { text } = state;
53
- const { error } = parseJson(text);
54
- const shown = error !== null && errors.length === 0 ? [intl.formatMessage(messages.jsonInvalid, { error })] : errors;
55
- return /* @__PURE__ */ jsx(TextArea, {
56
- ...props,
57
- value: text,
58
- onChange: (next) => {
100
+ let t5;
101
+ if ($[14] !== errors || $[15] !== intl || $[16] !== text) {
102
+ const { error } = parseJson(text);
103
+ t5 = error !== null && errors.length === 0 ? [intl.formatMessage(messages.jsonInvalid, { error })] : errors;
104
+ $[14] = errors;
105
+ $[15] = intl;
106
+ $[16] = text;
107
+ $[17] = t5;
108
+ } else t5 = $[17];
109
+ const shown = t5;
110
+ let t6;
111
+ if ($[18] !== onChange) {
112
+ t6 = (next) => {
59
113
  const parsed = parseJson(next).value;
60
114
  setState({
61
115
  value: parsed,
62
116
  text: next
63
117
  });
64
118
  onChange?.(parsed);
65
- },
66
- onBlur: () => {
119
+ };
120
+ $[18] = onChange;
121
+ $[19] = t6;
122
+ } else t6 = $[19];
123
+ let t7;
124
+ if ($[20] !== onBlur || $[21] !== value) {
125
+ t7 = () => {
67
126
  if (value !== null && value !== void 0 && typeof value !== "string") setState({
68
127
  value,
69
128
  text: toText(value)
70
129
  });
71
130
  onBlur?.();
72
- },
73
- errors: shown,
74
- rows,
75
- spellCheck: "false",
76
- textAreaClassName: JsonField_module_default.code,
77
- isDisabled: disabled,
78
- isReadOnly: readOnly,
79
- isRequired: required
80
- });
131
+ };
132
+ $[20] = onBlur;
133
+ $[21] = value;
134
+ $[22] = t7;
135
+ } else t7 = $[22];
136
+ let t8;
137
+ if ($[23] !== disabled || $[24] !== props || $[25] !== readOnly || $[26] !== required || $[27] !== rows || $[28] !== shown || $[29] !== t6 || $[30] !== t7 || $[31] !== text) {
138
+ t8 = /* @__PURE__ */ jsx(TextArea, {
139
+ ...props,
140
+ value: text,
141
+ onChange: t6,
142
+ onBlur: t7,
143
+ errors: shown,
144
+ rows,
145
+ spellCheck: "false",
146
+ textAreaClassName: JsonField_module_default.code,
147
+ isDisabled: disabled,
148
+ isReadOnly: readOnly,
149
+ isRequired: required
150
+ });
151
+ $[23] = disabled;
152
+ $[24] = props;
153
+ $[25] = readOnly;
154
+ $[26] = required;
155
+ $[27] = rows;
156
+ $[28] = shown;
157
+ $[29] = t6;
158
+ $[30] = t7;
159
+ $[31] = text;
160
+ $[32] = t8;
161
+ } else t8 = $[32];
162
+ return t8;
81
163
  }
82
164
  /** The `json` type: an object or an array, with setting `rows`. */
83
165
  function JsonFieldEntry(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"JsonField.js","names":["styles","_c"],"sources":["../../src/json/JsonField.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { TextArea, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './JsonField.module.css';\n\n/** The value of a `json` field: an object or an array, or the text while it doesn't parse. */\nexport type JsonValue = Record<string, unknown> | unknown[] | string;\n\nexport interface JsonFieldProps extends FieldProps<JsonValue> {\n placeholder?: string;\n /** Visible lines. Defaults to 8. */\n rows?: number;\n}\n\n/** The text of a value: indented JSON, or the text that doesn't parse as it is. */\nfunction toText(value: JsonValue | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n return typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n}\n\n/** The value of a text: what it parses to when it is an object or an array, or the text itself. */\nexport function parseJson(text: string): { value: JsonValue | null; error: string | null } {\n if (text.trim() === '') {\n return { value: null, error: null };\n }\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed !== null && typeof parsed === 'object') {\n return { value: parsed as JsonValue, error: null };\n }\n return { value: text, error: 'an object or an array' };\n } catch (error) {\n return { value: text, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\n/**\n * Structured data edited as JSON: an object or an array. While the text doesn't parse, the value\n * is the text itself, which the `json` rule refuses, so the form can't be saved with it. The text\n * is indented again on blur once it parses.\n */\nexport function JsonField({\n value,\n onChange,\n onBlur,\n errors = [],\n rows = 8,\n disabled,\n readOnly,\n required,\n ...props\n}: JsonFieldProps) {\n const intl = usePanneauIntl();\n // The text as typed: a value that comes back from the form keeps its text, and a value set\n // from outside (a reset, a reload) shows its JSON\n const [state, setState] = useState(() => ({ value, text: toText(value) }));\n if (state.value !== value) {\n setState({ value, text: toText(value) });\n }\n const { text } = state;\n const { error } = parseJson(text);\n // The parser's message, until the form shows the rule's\n const shown =\n error !== null && errors.length === 0\n ? [intl.formatMessage(messages.jsonInvalid, { error })]\n : errors;\n return (\n <TextArea\n {...props}\n value={text}\n onChange={(next) => {\n const parsed = parseJson(next).value;\n setState({ value: parsed, text: next });\n onChange?.(parsed);\n }}\n onBlur={() => {\n // Indent the text once it parses\n if (value !== null && value !== undefined && typeof value !== 'string') {\n setState({ value, text: toText(value) });\n }\n onBlur?.();\n }}\n errors={shown}\n rows={rows}\n spellCheck=\"false\"\n textAreaClassName={styles.code}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `json` type: an object or an array, with setting `rows`. */\nexport function JsonFieldEntry(props: FieldEntryProps) {\n const rows = getSetting(props.field, 'rows', isNumber);\n const { value } = props;\n return (\n <JsonField\n {...getFieldProps(props)}\n value={\n typeof value === 'string' || (value !== null && typeof value === 'object')\n ? (value as JsonValue)\n : null\n }\n onChange={props.onChange}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"JsonField.js","names":["useState","TextArea","usePanneauIntl","getFieldProps","getSetting","isNumber","messages","FieldEntryProps","FieldProps","styles","JsonValue","Record","JsonFieldProps","placeholder","rows","toText","value","undefined","JSON","stringify","parseJson","text","error","trim","parsed","parse","Error","message","String","JsonField","t0","$","_c","disabled","onBlur","onChange","props","readOnly","required","t1","t2","errors","t3","intl","t4","state","setState","t5","length","formatMessage","jsonInvalid","shown","t6","next","t7","t8","code","JsonFieldEntry","field","_c","styles"],"sources":["../../src/json/JsonField.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { TextArea, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isNumber } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './JsonField.module.css';\n\n/** The value of a `json` field: an object or an array, or the text while it doesn't parse. */\nexport type JsonValue = Record<string, unknown> | unknown[] | string;\n\nexport interface JsonFieldProps extends FieldProps<JsonValue> {\n placeholder?: string;\n /** Visible lines. Defaults to 8. */\n rows?: number;\n}\n\n/** The text of a value: indented JSON, or the text that doesn't parse as it is. */\nfunction toText(value: JsonValue | null | undefined): string {\n if (value === null || value === undefined) {\n return '';\n }\n return typeof value === 'string' ? value : JSON.stringify(value, null, 2);\n}\n\n/** The value of a text: what it parses to when it is an object or an array, or the text itself. */\nexport function parseJson(text: string): { value: JsonValue | null; error: string | null } {\n if (text.trim() === '') {\n return { value: null, error: null };\n }\n try {\n const parsed: unknown = JSON.parse(text);\n if (parsed !== null && typeof parsed === 'object') {\n return { value: parsed as JsonValue, error: null };\n }\n return { value: text, error: 'an object or an array' };\n } catch (error) {\n return { value: text, error: error instanceof Error ? error.message : String(error) };\n }\n}\n\n/**\n * Structured data edited as JSON: an object or an array. While the text doesn't parse, the value\n * is the text itself, which the `json` rule refuses, so the form can't be saved with it. The text\n * is indented again on blur once it parses.\n */\nexport function JsonField({\n value,\n onChange,\n onBlur,\n errors = [],\n rows = 8,\n disabled,\n readOnly,\n required,\n ...props\n}: JsonFieldProps) {\n const intl = usePanneauIntl();\n // The text as typed: a value that comes back from the form keeps its text, and a value set\n // from outside (a reset, a reload) shows its JSON\n const [state, setState] = useState(() => ({ value, text: toText(value) }));\n if (state.value !== value) {\n setState({ value, text: toText(value) });\n }\n const { text } = state;\n const { error } = parseJson(text);\n // The parser's message, until the form shows the rule's\n const shown =\n error !== null && errors.length === 0\n ? [intl.formatMessage(messages.jsonInvalid, { error })]\n : errors;\n return (\n <TextArea\n {...props}\n value={text}\n onChange={(next) => {\n const parsed = parseJson(next).value;\n setState({ value: parsed, text: next });\n onChange?.(parsed);\n }}\n onBlur={() => {\n // Indent the text once it parses\n if (value !== null && value !== undefined && typeof value !== 'string') {\n setState({ value, text: toText(value) });\n }\n onBlur?.();\n }}\n errors={shown}\n rows={rows}\n spellCheck=\"false\"\n textAreaClassName={styles.code}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `json` type: an object or an array, with setting `rows`. */\nexport function JsonFieldEntry(props: FieldEntryProps) {\n const rows = getSetting(props.field, 'rows', isNumber);\n const { value } = props;\n return (\n <JsonField\n {...getFieldProps(props)}\n value={\n typeof value === 'string' || (value !== null && typeof value === 'object')\n ? (value as JsonValue)\n : null\n }\n onChange={props.onChange}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAmBA,SAASe,OAAOC,OAA6C;CACzD,IAAIA,UAAU,QAAQA,UAAUC,KAAAA,GAC5B,OAAO;CAEX,OAAO,OAAOD,UAAU,WAAWA,QAAQE,KAAKC,UAAUH,OAAO,MAAM,CAAC;AAC5E;;AAGA,SAAgBI,UAAUC,MAAiE;CACvF,IAAIA,KAAKE,KAAK,MAAM,IAChB,OAAO;EAAEP,OAAO;EAAMM,OAAO;CAAK;CAEtC,IAAI;EACA,MAAME,SAAkBN,KAAKO,MAAMJ,IAAI;EACvC,IAAIG,WAAW,QAAQ,OAAOA,WAAW,UACrC,OAAO;GAAER,OAAOQ;GAAqBF,OAAO;EAAK;EAErD,OAAO;GAAEN,OAAOK;GAAMC,OAAO;EAAwB;CACzD,SAASA,OAAO;EACZ,OAAO;GAAEN,OAAOK;GAAMC,OAAOA,iBAAiBI,QAAQJ,MAAMK,UAAUC,OAAON,KAAK;EAAE;CACxF;AACJ;;;;;;AAOA,SAAOO,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAxB;CAAA,IAAAe,EAAA,OAAAD,IAAA;EAAmB,CAAA,CAAAd,OAAAmB,UAAAD,QAAAO,QAAAF,IAAAzB,MAAA0B,IAAAP,UAAAI,UAAAC,UAAA,GAAAF,SAAAN;EAUTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAf;CAAA,OAAA;EAAAiB,WAAAF,EAAA;EAAAG,SAAAH,EAAA;EAAAI,WAAAJ,EAAA;EAAAK,QAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,WAAAP,EAAA;EAAAQ,KAAAR,EAAA;EAAAS,KAAAT,EAAA;EAAAf,QAAAe,EAAA;CAAA;CAAA,IAAAW;CAAA,IAAAX,EAAA,QAAAQ,IAAA;EANbG,KAAAH,OAAAtB,KAAAA,IAAA,CAAA,IAAAsB;EAAWR,EAAA,MAAAQ;EAAAR,EAAA,MAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAX,MAAAU,SAAAC;CACA,MAAA5B,OAAA0B,OAAAvB,KAAAA,IAAA,IAAAuB;CAMA,MAAAG,OAAazC,eAAe;CAAE,IAAA0C;CAAA,IAAAb,EAAA,QAAAf,OAAA;EAGK4B,YAAO;GAAA5B;GAAAK,MAAeN,OAAOC,KAAK;EAAE;EAAEe,EAAA,MAAAf;EAAAe,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAzE,MAAA,CAAAc,OAAAC,YAA0B9C,SAAS4C,EAAsC;CACzE,IAAIC,MAAK7B,UAAWA,OAChB8B,SAAS;EAAA9B;EAAAK,MAAeN,OAAOC,KAAK;CAAE,CAAC;CAE3C,MAAA,EAAAK,SAAiBwB;CAAM,IAAAE;CAAA,IAAAhB,EAAA,QAAAU,UAAAV,EAAA,QAAAY,QAAAZ,EAAA,QAAAV,MAAA;EACvB,MAAA,EAAAC,UAAkBF,UAAUC,IAAI;EAG5B0B,KAAAzB,UAAU,QAAQmB,OAAMO,WAAY,IAApC,CACOL,KAAIM,cAAe3C,SAAQ4C,aAAc,EAAA5B,MAAQ,CAAC,CAAC,IAD1DmB;EAEYV,EAAA,MAAAU;EAAAV,EAAA,MAAAY;EAAAZ,EAAA,MAAAV;EAAAU,EAAA,MAAAgB;CAAA,OAAAA,KAAAhB,EAAA;CAHhB,MAAAoB,QACIJ;CAEa,IAAAK;CAAA,IAAArB,EAAA,QAAAI,UAAA;EAKCiB,MAAAC,SAAA;GACN,MAAA7B,SAAeJ,UAAUiC,IAAI,CAAC,CAAArC;GAC9B8B,SAAS;IAAA9B,OAASQ;IAAMH,MAAQgC;GAAK,CAAC;GACtClB,WAAWX,MAAM;EAAC;EACrBO,EAAA,MAAAI;EAAAJ,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,IAAAuB;CAAA,IAAAvB,EAAA,QAAAG,UAAAH,EAAA,QAAAf,OAAA;EACOsC,WAAA;GAEJ,IAAItC,UAAU,QAAQA,UAAUC,KAAAA,KAAa,OAAOD,UAAU,UAC1D8B,SAAS;IAAA9B;IAAAK,MAAeN,OAAOC,KAAK;GAAE,CAAC;GAE3CkB,SAAS;EAAC;EACbH,EAAA,MAAAG;EAAAH,EAAA,MAAAf;EAAAe,EAAA,MAAAuB;CAAA,OAAAA,KAAAvB,EAAA;CAAA,IAAAwB;CAAA,IAAAxB,EAAA,QAAAE,YAAAF,EAAA,QAAAK,SAAAL,EAAA,QAAAM,YAAAN,EAAA,QAAAO,YAAAP,EAAA,QAAAjB,QAAAiB,EAAA,QAAAoB,SAAApB,EAAA,QAAAqB,MAAArB,EAAA,QAAAuB,MAAAvB,EAAA,QAAAV,MAAA;EAdLkC,KAAA,oBAAC,UAAD;GAAS,GACDnB;GACGf,OAAAA;GACG,UAAA+B;GAKF,QAAAE;GAOAH,QAAAA;GACFrC;GACK,YAAA;GACQ,mBAAAL,yBAAM+C;GACbvB,YAAAA;GACAI,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBP,EAAA,MAAAE;EAAAF,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAO;EAAAP,EAAA,MAAAjB;EAAAiB,EAAA,MAAAoB;EAAApB,EAAA,MAAAqB;EAAArB,EAAA,MAAAuB;EAAAvB,EAAA,MAAAV;EAAAU,EAAA,MAAAwB;CAAA,OAAAA,KAAAxB,EAAA;CAAA,OAtBFwB;AAsBE;;AAKV,SAAOE,eAAArB,OAAA;CAAA,MAAAL,IAAAC,EAAA,EAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAK,MAAAsB,OAAA;EACU5B,KAAA1B,WAAWgC,MAAKsB,OAAQ,QAAQrD,QAAQ;EAAC0B,EAAA,KAAAK,MAAAsB;EAAA3B,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CAAtD,MAAAjB,OAAagB;CACb,MAAA,EAAAd,UAAkBoB;CAAM,IAAAG;CAAA,IAAAR,EAAA,OAAAK,OAAA;EAGZG,KAAApC,cAAciC,KAAK;EAACL,EAAA,KAAAK;EAAAL,EAAA,KAAAQ;CAAA,OAAAA,KAAAR,EAAA;CAEpB,MAAAS,KAAA,OAAOxB,UAAU,YAAaA,UAAU,QAAQ,OAAOA,UAAU,WAC1DA,QADP;CAEU,IAAA0B;CAAA,IAAAX,EAAA,OAAAjB,MAAA;EAGT4B,KAAA5B,SAASG,KAAAA,IAAT,EAAAH,KAAiC,IAAjC,CAAiC;EAACiB,EAAA,KAAAjB;EAAAiB,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAa;CAAA,IAAAb,EAAA,OAAAK,MAAAD,YAAAJ,EAAA,OAAAQ,MAAAR,EAAA,OAAAS,MAAAT,EAAA,OAAAW,IAAA;EAR3CE,KAAA,oBAAC,WAAD;GAAU,GACFL;GAEA,OAAAC;GAIM,UAAAJ,MAAKD;GAAS,GACnBO;EAAkC,CAAA;EACzCX,EAAA,KAAAK,MAAAD;EAAAJ,EAAA,KAAAQ;EAAAR,EAAA,KAAAS;EAAAT,EAAA,KAAAW;EAAAX,EAAA,MAAAa;CAAA,OAAAA,KAAAb,EAAA;CAAA,OATFa;AASE"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["allFr"],"sources":["../../src/locales/index.ts"],"sourcesContent":["import { fr as allFr, getDefaultMessages } from '@panneau/intl';\n\nimport { messages } from '../shared/messages';\n\n/**\n * The English messages of `@panneau/fields`, by id. They are also the default messages.\n *\n * @deprecated Use `en`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages\n * of every package.\n */\nexport const en: Record<string, string> = getDefaultMessages(messages);\n\n/**\n * The French messages of `@panneau/fields`, by id.\n *\n * @deprecated Use `fr`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages\n * of every package.\n */\nexport const fr: Record<string, string> = Object.fromEntries(\n Object.entries(allFr).filter(([id]) => id in en),\n);\n"],"mappings":";;;;;;;;;AAUA,IAAa,KAA6B,mBAAmB,QAAQ;;;;;;;AAQrE,IAAa,KAA6B,OAAO,YAC7C,OAAO,QAAQA,IAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,MAAM,EAAE,CACnD"}
1
+ {"version":3,"file":"index.js","names":["fr","allFr","getDefaultMessages","messages","en","Record","Object","fromEntries","entries","filter","id","allFr"],"sources":["../../src/locales/index.ts"],"sourcesContent":["import { fr as allFr, getDefaultMessages } from '@panneau/intl';\n\nimport { messages } from '../shared/messages';\n\n/**\n * The English messages of `@panneau/fields`, by id. They are also the default messages.\n *\n * @deprecated Use `en`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages\n * of every package.\n */\nexport const en: Record<string, string> = getDefaultMessages(messages);\n\n/**\n * The French messages of `@panneau/fields`, by id.\n *\n * @deprecated Use `fr`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages\n * of every package.\n */\nexport const fr: Record<string, string> = Object.fromEntries(\n Object.entries(allFr).filter(([id]) => id in en),\n);\n"],"mappings":";;;;;;;;;AAUA,IAAaI,KAA6BF,mBAAmBC,QAAQ;;;;;;;AAQrE,IAAaH,KAA6BM,OAAOC,YAC7CD,OAAOE,QAAQP,IAAK,CAAC,CAACQ,QAAQ,CAACC,QAAQA,MAAMN,EAAE,CACnD"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedField.js","names":["name","locale","label","description","errors","required","className","labelClassName","descriptionClassName","errorsClassName","locales","record","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Fieldset, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /** Name of the locale in the UI's language, as the input's label. */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale, with an input for each locale under one legend. A value without any locale\n * filled is `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const localeName = useLocaleName();\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.locales}>\n {locales.map((locale) => (\n <div key={locale} className={cx(styles.locale, localeClassName)}>\n {children({\n locale,\n label: localeName(locale),\n value: value?.[locale] ?? null,\n onChange: (next) => {\n const updated = { ...value, [locale]: next };\n const filled = Object.values(updated).some(\n (entry) =>\n entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`).\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n locale={input.locale}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LocalizedField.js","names":["ReactNode","Fieldset","usePanneauIntl","NestedField","useFieldsContext","cx","getFieldProps","FieldEntryProps","FieldProps","styles","LocalizedValue","Partial","Record","V","LocalizedInputProps","locale","label","value","onChange","onBlur","disabled","readOnly","required","LocalizedFieldProps","locales","children","props","localeClassName","useLocaleName","$","_c","intl","t0","name","formatDisplayName","type","undefined","text","toUpperCase","charAt","toLocaleUpperCase","slice","LocalizedField","description","errors","className","labelClassName","descriptionClassName","errorsClassName","localeName","t1","t2","next","updated","filled","Object","values","some","_temp","map","t3","entry","LocalizedFieldEntry","contextLocales","field","path","Array","isArray","record","length","keys","chrome","_name","_onBlur","parentValue","input","localized","help","t4","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Fieldset, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /** Name of the locale in the UI's language, as the input's label. */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale, with an input for each locale under one legend. A value without any locale\n * filled is `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const localeName = useLocaleName();\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.locales}>\n {locales.map((locale) => (\n <div key={locale} className={cx(styles.locale, localeClassName)}>\n {children({\n locale,\n label: localeName(locale),\n value: value?.[locale] ?? null,\n onChange: (next) => {\n const updated = { ...value, [locale]: next };\n const filled = Object.values(updated).some(\n (entry) =>\n entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`).\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n locale={input.locale}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":";;;;;;;;;;AAoCA,SAAO4B,gBAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CACH,MAAAC,OAAa7B,eAAe;CAAE,IAAA8B;CAAA,IAAAH,EAAA,OAAAE,MAAA;EACvBC,MAAAjB,WAAA;GACCkB,IAAAA;GACJ,IAAA;IACIA,OAAOF,KAAIG,kBAAmBnB,QAAQ,EAAAoB,MAAQ,WAAW,CAAC;GAAtD,QAAA;IAEJF,OAAOG,KAAAA;GAAH;GAER,MAAAC,OAAaJ,QAAQlB,OAAMuB,YAAa;GAAE,OACnCD,KAAIE,OAAQ,CAAC,CAAC,CAAAC,kBAAmBT,KAAIhB,MAAO,IAAIsB,KAAII,MAAO,CAAC;EAAC;EACvEZ,EAAA,KAAAE;EAAAF,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAAA,OATMG;AASN;;;;;AAOL,SAAOU,eAAAV,IAAA;CAAA,MAAAH,IAAAC,EAAA,EAAA;CAA2B,MAAA,EAAAN,SAAAC,UAAAR,OAAAC,UAAAC,QAAAH,OAAA2B,aAAAC,QAAAxB,UAAAC,UAAAC,UAAAuB,WAAAC,gBAAAC,sBAAAC,iBAAArB,oBAAAK;CAkB9B,MAAAiB,aAAmBrB,cAAc;CAAE,IAAAsB;CAAA,IAAArB,EAAA,OAAAJ,YAAAI,EAAA,OAAAT,YAAAS,EAAA,OAAAF,mBAAAE,EAAA,OAAAoB,cAAApB,EAAA,OAAAL,WAAAK,EAAA,OAAAV,UAAAU,EAAA,OAAAX,YAAAW,EAAA,OAAAR,YAAAQ,EAAA,OAAAP,YAAAO,EAAA,OAAAZ,OAAA;EAAA,IAAAkC;EAAA,IAAAtB,EAAA,QAAAJ,YAAAI,EAAA,QAAAT,YAAAS,EAAA,QAAAF,mBAAAE,EAAA,QAAAoB,cAAApB,EAAA,QAAAV,UAAAU,EAAA,QAAAX,YAAAW,EAAA,QAAAR,YAAAQ,EAAA,QAAAP,YAAAO,EAAA,QAAAZ,OAAA;GAaVkC,MAAApC,WACT,oBAAA,OAAA;IAA6B,WAAAV,GAAGI,8BAAMM,QAASY,eAAe;IACzDF,UAAAA,SAAS;KAAAV;KAAAC,OAECiC,WAAWlC,MAAM;KAACE,OAClBA,QAAQF,WAAR;KAAuBG,WACpBkC,SAAA;MACN,MAAAC,UAAgB;OAAA,GAAKpC;QAAQF,SAASqC;MAAK;MAC3C,MAAAE,SAAeC,OAAMC,OAAQH,OAAO,CAAC,CAAAI,KACjCC,KAEJ;MACAxC,WAAWoC,SAAAD,UAAA,IAAuB;KAAC;KACtC,GACGlC,WAAWiB,KAAAA,IAAX,EAAAjB,OAAqC,IAArC,CAAqC;KAAC,GACtCC,aAAagB,KAAAA,IAAb,EAAAhB,SAAyC,IAAzC,CAAyC;KAAC,GAC1CC,aAAae,KAAAA,IAAb,EAAAf,SAAyC,IAAzC,CAAyC;KAAC,GAC1CC,aAAac,KAAAA,IAAb,EAAAd,SAAyC,IAAzC,CAAyC;IACjD,CAAC;GACC,GAlBIP,MAkBJ;GACTc,EAAA,MAAAJ;GAAAI,EAAA,MAAAT;GAAAS,EAAA,MAAAF;GAAAE,EAAA,MAAAoB;GAAApB,EAAA,MAAAV;GAAAU,EAAA,MAAAX;GAAAW,EAAA,MAAAR;GAAAQ,EAAA,MAAAP;GAAAO,EAAA,MAAAZ;GAAAY,EAAA,MAAAsB;EAAA,OAAAA,KAAAtB,EAAA;EApBAqB,KAAA1B,QAAOmC,IAAKR,EAoBZ;EAACtB,EAAA,KAAAJ;EAAAI,EAAA,KAAAT;EAAAS,EAAA,KAAAF;EAAAE,EAAA,KAAAoB;EAAApB,EAAA,KAAAL;EAAAK,EAAA,KAAAV;EAAAU,EAAA,KAAAX;EAAAW,EAAA,KAAAR;EAAAQ,EAAA,KAAAP;EAAAO,EAAA,KAAAZ;EAAAY,EAAA,MAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAA,IAAAsB;CAAA,IAAAtB,EAAA,QAAAqB,IAAA;EArBNC,KAAA,oBAAA,OAAA;GAAgB,WAAA1C,8BAAMe;GACjB0B,UAAAA;EAqBC,CAAA;EAAArB,EAAA,MAAAqB;EAAArB,EAAA,MAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAAA,IAAA+B;CAAA,IAAA/B,EAAA,QAAAgB,aAAAhB,EAAA,QAAAc,eAAAd,EAAA,QAAAkB,wBAAAlB,EAAA,QAAAe,UAAAf,EAAA,QAAAmB,mBAAAnB,EAAA,QAAAb,SAAAa,EAAA,QAAAiB,kBAAAjB,EAAA,QAAAP,YAAAO,EAAA,QAAAsB,IAAA;EAhCVS,KAAA,oBAAC,UAAD;GACY5C,QAAAA;GACK2B;GACLC;GACItB,YAAAA;GACDuB;GACMC,iBAAAA;GACKC;GACLC;GAEjBG,UAAAA;EAVK,CAAA;EAiCEtB,EAAA,MAAAgB;EAAAhB,EAAA,MAAAc;EAAAd,EAAA,MAAAkB;EAAAlB,EAAA,MAAAe;EAAAf,EAAA,MAAAmB;EAAAnB,EAAA,MAAAb;EAAAa,EAAA,MAAAiB;EAAAjB,EAAA,MAAAP;EAAAO,EAAA,MAAAsB;EAAAtB,EAAA,MAAA+B;CAAA,OAAAA,KAAA/B,EAAA;CAAA,OAjCX+B;AAiCW;;;;;AArDZ,SAAAF,MAAAG,OAAA;CAAA,OAyCiCA,UAAU,QAAQA,UAAUzB,KAAAA,KAAayB,UAAU;AAAE;AAoB7F,SAAOC,oBAAApC,OAAA;CAAA,MAAAG,IAAAC,EAAA,EAAA;CACH,MAAA,EAAAN,SAAAuC,mBAAoC3D,iBAAiB;CACrD,MAAA,EAAA4D,OAAAC,MAAAhD,UAA+BS;CAAM,IAAAM;CAAA,IAAAH,EAAA,OAAAZ,OAAA;EAEjCe,KAAAf,UAAU,QAAQ,OAAOA,UAAU,YAAnC,CAAgDiD,MAAKC,QAASlD,KAAK,IAC5DA,QADP,CAEO;EAACY,EAAA,KAAAZ;EAAAY,EAAA,KAAAG;CAAA,OAAAA,KAAAH,EAAA;CAHZ,MAAAuC,SACIpC;CAES,IAAAkB;CAAA,IAAArB,EAAA,OAAAkC,kBAAAlC,EAAA,OAAAuC,QAAA;EACGlB,KAAAa,eAAcM,SAAU,IAAxBN,iBAA6CR,OAAMe,KAAMF,MAAM;EAACvC,EAAA,KAAAkC;EAAAlC,EAAA,KAAAuC;EAAAvC,EAAA,KAAAqB;CAAA,OAAAA,KAAArB,EAAA;CAAhF,MAAAL,UAAgB0B;CAAiE,IAAAC;CAAA,IAAAtB,EAAA,OAAAH,OAAA;EAC7ByB,KAAA7C,cAAcoB,KAAK;EAACG,EAAA,KAAAH;EAAAG,EAAA,KAAAsB;CAAA,OAAAA,KAAAtB,EAAA;CAAA,IAAA0C;CAAA,IAAA1C,EAAA,OAAAsB,IAAA;EAAxE,MAAA,EAAAlB,MAAAuC,OAAArD,QAAAsD,SAAA,GAAAb,OAAoDT;EAApDoB,SAAAX;EAAyE/B,EAAA,KAAAsB;EAAAtB,EAAA,KAAA0C;CAAA,OAAAA,SAAA1C,EAAA;CAAA,IAAA+B;CAAA,IAAA/B,EAAA,OAAAmC,SAAAnC,EAAA,QAAAoC,QAAApC,EAAA,QAAAH,MAAAN,YAAAS,EAAA,QAAAH,MAAAP,UAAAU,EAAA,QAAAH,MAAAgD,eAAA7C,EAAA,QAAAH,MAAAL,UAAA;EAQhEuC,MAAAe,UACG,oBAAC,aAAD;GACW,OAAA;IAAA,GAAKX;IAAKY,WAAa;IAAK5D,OAAS2D,MAAK3D;IAAM6D,MAAQzC,KAAAA;GAAU;GACnE,MAAA,GAAG6B,KAAI,GAAIU,MAAK5D;GACf,OAAA4D,MAAK1D;GACF,UAAA0D,MAAKzD;GAAS,GACnBQ,MAAKP,WAAYiB,KAAAA,IAAjB,EAAAjB,QAAuCO,MAAKP,OAAa,IAAzD,CAAyD;GACjD,aAAAO,MAAKgD;GACV,QAAAC,MAAK5D;GAAO,GACfW,MAAKN,aAAcgB,KAAAA,IAAnB,EAAAhB,UAA2CM,MAAKN,SAAe,IAA/D,CAA+D;GAAC,GAChEM,MAAKL,aAAce,KAAAA,IAAnB,EAAAf,UAA2CK,MAAKL,SAAe,IAA/D,CAA+D;EAAC,CAAA;EAE5EQ,EAAA,KAAAmC;EAAAnC,EAAA,MAAAoC;EAAApC,EAAA,MAAAH,MAAAN;EAAAS,EAAA,MAAAH,MAAAP;EAAAU,EAAA,MAAAH,MAAAgD;EAAA7C,EAAA,MAAAH,MAAAL;EAAAQ,EAAA,MAAA+B;CAAA,OAAAA,KAAA/B,EAAA;CAAA,IAAAiD;CAAA,IAAAjD,EAAA,QAAA0C,UAAA1C,EAAA,QAAAL,WAAAK,EAAA,QAAAH,MAAAR,YAAAW,EAAA,QAAAuC,UAAAvC,EAAA,QAAA+B,IAAA;EAlBLkB,KAAA,oBAAC,gBAAD;GAAe,GACPP;GACK/C;GACF4C,OAAAA;GACG,UAAA1C,MAAKR;GAEd0C,UAAAA;EANU,CAAA;EAmBE/B,EAAA,MAAA0C;EAAA1C,EAAA,MAAAL;EAAAK,EAAA,MAAAH,MAAAR;EAAAW,EAAA,MAAAuC;EAAAvC,EAAA,MAAA+B;EAAA/B,EAAA,MAAAiD;CAAA,OAAAA,KAAAjD,EAAA;CAAA,OAnBjBiD;AAmBiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAKF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAkCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAA4B,EAC5B,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BAyKpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}
1
+ {"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAMF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAkCD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}