@panneau/fields 5.0.0-alpha.10 → 5.0.0-alpha.12

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 (50) hide show
  1. package/dist/embed/EmbedField.js +1 -1
  2. package/dist/file/FileField.js +2 -2
  3. package/dist/group/GroupField.css +20 -3
  4. package/dist/group/GroupField.d.ts +2 -2
  5. package/dist/group/GroupField.d.ts.map +1 -1
  6. package/dist/group/GroupField.js +49 -36
  7. package/dist/group/GroupField.js.map +1 -1
  8. package/dist/group/GroupField.module.js +10 -2
  9. package/dist/group/GroupField.module.js.map +1 -1
  10. package/dist/index.d.ts +2 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -1
  13. package/dist/json/JsonField.js +1 -1
  14. package/dist/localized/LocalizedField.css +27 -6
  15. package/dist/localized/LocalizedField.d.ts +18 -7
  16. package/dist/localized/LocalizedField.d.ts.map +1 -1
  17. package/dist/localized/LocalizedField.js +236 -104
  18. package/dist/localized/LocalizedField.js.map +1 -1
  19. package/dist/localized/LocalizedField.module.js +10 -4
  20. package/dist/localized/LocalizedField.module.js.map +1 -1
  21. package/dist/location/LocationField.js +2 -2
  22. package/dist/relation/RelationField.js +2 -2
  23. package/dist/repeater/RepeaterField.js +2 -2
  24. package/dist/shared/DefinitionField.d.ts +3 -1
  25. package/dist/shared/DefinitionField.d.ts.map +1 -1
  26. package/dist/shared/DefinitionField.js +81 -73
  27. package/dist/shared/DefinitionField.js.map +1 -1
  28. package/dist/shared/context.d.ts +5 -0
  29. package/dist/shared/context.d.ts.map +1 -1
  30. package/dist/shared/context.js.map +1 -1
  31. package/dist/shared/entry.d.ts +2 -2
  32. package/dist/shared/entry.d.ts.map +1 -1
  33. package/dist/shared/entry.js +4 -3
  34. package/dist/shared/entry.js.map +1 -1
  35. package/dist/shared/flow.d.ts +8 -0
  36. package/dist/shared/flow.d.ts.map +1 -0
  37. package/dist/shared/flow.js +35 -0
  38. package/dist/shared/flow.js.map +1 -0
  39. package/dist/shared/reveal.d.ts +16 -0
  40. package/dist/shared/reveal.d.ts.map +1 -0
  41. package/dist/shared/reveal.js +46 -0
  42. package/dist/shared/reveal.js.map +1 -0
  43. package/dist/shared/types.d.ts +10 -0
  44. package/dist/shared/types.d.ts.map +1 -1
  45. package/dist/slug/SlugField.js +2 -2
  46. package/dist/text/TextField.js +2 -2
  47. package/dist/upload/FilePicker.js +1 -1
  48. package/dist/upload/UploadList.js +1 -1
  49. package/dist/url/UrlField.js +1 -1
  50. package/package.json +4 -4
@@ -3,8 +3,8 @@ import { getFieldProps, isString } from "../shared/entry.js";
3
3
  import { messages } from "../shared/messages.js";
4
4
  import EmbedField_module_default from "./EmbedField.module.js";
5
5
  import { c } from "react/compiler-runtime";
6
- import { Spinner, TextInput, usePanneauIntl } from "@panneau/ui";
7
6
  import { useEffect, useEffectEvent, useState } from "react";
7
+ import { Spinner, TextInput, usePanneauIntl } from "@panneau/ui";
8
8
  import { jsx, jsxs } from "react/jsx-runtime";
9
9
  //#region src/embed/EmbedField.tsx
10
10
  var RESOLVE_DELAY = 500;
@@ -8,10 +8,10 @@ import { useRejectionMessage } from "../upload/useRejectionMessage.js";
8
8
  import { useUploads } from "../upload/useUploads.js";
9
9
  import FileField_module_default from "./FileField.module.js";
10
10
  import { c } from "react/compiler-runtime";
11
- import { Fieldset, IconButton, usePanneauIntl } from "@panneau/ui";
11
+ import { FileText, X } from "lucide-react";
12
12
  import { useEffect, useRef, useState } from "react";
13
+ import { Fieldset, IconButton, usePanneauIntl } from "@panneau/ui";
13
14
  import { jsx, jsxs } from "react/jsx-runtime";
14
- import { FileText, X } from "lucide-react";
15
15
  //#region src/file/FileField.tsx
16
16
  function fileSize(file) {
17
17
  return typeof file.size === "number" ? file.size : null;
@@ -1,12 +1,29 @@
1
1
  .panneau-group-field-fields {
2
- display: flex;
3
- flex-direction: column;
4
- gap: var(--panneau-space-4);
5
2
  padding: var(--panneau-space-4);
6
3
  border: var(--panneau-border-width) solid var(--panneau-color-border);
7
4
  border-radius: var(--panneau-radius-md);
8
5
  }
9
6
 
7
+ /* Short fields share a row, in columns of at least 14rem. */
8
+ .panneau-group-field-flow {
9
+ display: grid;
10
+ grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr));
11
+ gap: var(--panneau-space-4);
12
+ }
13
+
14
+ .panneau-group-field-cell {
15
+ min-width: 0;
16
+ }
17
+
18
+ /* A field hidden by its condition renders nothing: its cell takes no column. */
19
+ .panneau-group-field-cell:empty {
20
+ display: none;
21
+ }
22
+
23
+ .panneau-group-field-wide {
24
+ grid-column: 1 / -1;
25
+ }
26
+
10
27
  @media (max-width: 30rem) {
11
28
  .panneau-group-field-fields {
12
29
  padding: var(--panneau-space-3);
@@ -9,8 +9,8 @@ export interface GroupFieldProps extends FieldProps<GroupValue> {
9
9
  fieldsClassName?: string;
10
10
  }
11
11
  /**
12
- * A nested object: its fields under a legend. Each field renders with the entry of its type, at
13
- * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole
12
+ * A nested object: its fields under a legend, short ones side by side (`isWideField()`). Each
13
+ * field renders with the entry of its type, at the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole
14
14
  * object through `onChange`.
15
15
  */
16
16
  export declare function GroupField({ fields, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, fieldsClassName, }: GroupFieldProps): import("react").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupField.d.ts","sourceRoot":"","sources":["../../src/group/GroupField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAM/C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,eAAgB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAC3D,0EAA0E;IAC1E,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,eAAe,GAClB,EAAE,eAAe,+BA+BjB;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAerD"}
1
+ {"version":3,"file":"GroupField.d.ts","sourceRoot":"","sources":["../../src/group/GroupField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAO/C,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEjD,MAAM,WAAW,eAAgB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAC3D,0EAA0E;IAC1E,MAAM,EAAE,SAAS,KAAK,EAAE,CAAC;IACzB,0FAA0F;IAC1F,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,MAAM,EACN,IAAI,EACJ,IAAI,EACJ,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,eAAe,GAClB,EAAE,eAAe,+BAqCjB;AAED,0DAA0D;AAC1D,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAerD"}
@@ -1,5 +1,6 @@
1
1
  import { cx } from "../shared/cx.js";
2
2
  import { getFieldProps } from "../shared/entry.js";
3
+ import { isWideField } from "../shared/flow.js";
3
4
  import GroupField_module_default from "./GroupField.module.js";
4
5
  import { NestedField } from "../shared/DefinitionField.js";
5
6
  import { c } from "react/compiler-runtime";
@@ -7,12 +8,12 @@ import { Fieldset } from "@panneau/ui";
7
8
  import { jsx } from "react/jsx-runtime";
8
9
  //#region src/group/GroupField.tsx
9
10
  /**
10
- * A nested object: its fields under a legend. Each field renders with the entry of its type, at
11
- * the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole
11
+ * A nested object: its fields under a legend, short ones side by side (`isWideField()`). Each
12
+ * field renders with the entry of its type, at the path `<group>.<field>`. Without a binding in the fields context, the group sets the whole
12
13
  * object through `onChange`.
13
14
  */
14
15
  function GroupField(t0) {
15
- const $ = c(32);
16
+ const $ = c(34);
16
17
  const { fields, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, fieldsClassName } = t0;
17
18
  const base = path ?? name ?? "";
18
19
  let t1;
@@ -32,18 +33,21 @@ function GroupField(t0) {
32
33
  if ($[4] !== base || $[5] !== disabled || $[6] !== fields || $[7] !== object || $[8] !== onBlur || $[9] !== onChange || $[10] !== readOnly) {
33
34
  let t4;
34
35
  if ($[12] !== base || $[13] !== disabled || $[14] !== object || $[15] !== onBlur || $[16] !== onChange || $[17] !== readOnly) {
35
- t4 = (field) => /* @__PURE__ */ jsx(NestedField, {
36
- field,
37
- path: base !== "" ? `${base}.${field.name}` : field.name,
38
- value: object[field.name],
39
- onChange: (next) => onChange?.({
40
- ...object,
41
- [field.name]: next
42
- }),
43
- ...onBlur !== void 0 ? { onBlur } : {},
44
- parentValue: object,
45
- ...disabled !== void 0 ? { disabled } : {},
46
- ...readOnly !== void 0 ? { readOnly } : {}
36
+ t4 = (field) => /* @__PURE__ */ jsx("div", {
37
+ className: cx(GroupField_module_default.cell, isWideField(field) && GroupField_module_default.wide),
38
+ children: /* @__PURE__ */ jsx(NestedField, {
39
+ field,
40
+ path: base !== "" ? `${base}.${field.name}` : field.name,
41
+ value: object[field.name],
42
+ onChange: (next) => onChange?.({
43
+ ...object,
44
+ [field.name]: next
45
+ }),
46
+ ...onBlur !== void 0 ? { onBlur } : {},
47
+ parentValue: object,
48
+ ...disabled !== void 0 ? { disabled } : {},
49
+ ...readOnly !== void 0 ? { readOnly } : {}
50
+ })
47
51
  }, field.name);
48
52
  $[12] = base;
49
53
  $[13] = disabled;
@@ -64,18 +68,27 @@ function GroupField(t0) {
64
68
  $[11] = t3;
65
69
  } else t3 = $[11];
66
70
  let t4;
67
- if ($[19] !== t2 || $[20] !== t3) {
71
+ if ($[19] !== t3) {
68
72
  t4 = /* @__PURE__ */ jsx("div", {
69
- className: t2,
73
+ className: GroupField_module_default.flow,
70
74
  children: t3
71
75
  });
72
- $[19] = t2;
73
- $[20] = t3;
74
- $[21] = t4;
75
- } else t4 = $[21];
76
+ $[19] = t3;
77
+ $[20] = t4;
78
+ } else t4 = $[20];
76
79
  let t5;
77
- if ($[22] !== className || $[23] !== description || $[24] !== descriptionClassName || $[25] !== errors || $[26] !== errorsClassName || $[27] !== label || $[28] !== labelClassName || $[29] !== required || $[30] !== t4) {
78
- t5 = /* @__PURE__ */ jsx(Fieldset, {
80
+ if ($[21] !== t2 || $[22] !== t4) {
81
+ t5 = /* @__PURE__ */ jsx("div", {
82
+ className: t2,
83
+ children: t4
84
+ });
85
+ $[21] = t2;
86
+ $[22] = t4;
87
+ $[23] = t5;
88
+ } else t5 = $[23];
89
+ let t6;
90
+ if ($[24] !== className || $[25] !== description || $[26] !== descriptionClassName || $[27] !== errors || $[28] !== errorsClassName || $[29] !== label || $[30] !== labelClassName || $[31] !== required || $[32] !== t5) {
91
+ t6 = /* @__PURE__ */ jsx(Fieldset, {
79
92
  legend: label,
80
93
  description,
81
94
  errors,
@@ -84,20 +97,20 @@ function GroupField(t0) {
84
97
  legendClassName: labelClassName,
85
98
  descriptionClassName,
86
99
  errorsClassName,
87
- children: t4
100
+ children: t5
88
101
  });
89
- $[22] = className;
90
- $[23] = description;
91
- $[24] = descriptionClassName;
92
- $[25] = errors;
93
- $[26] = errorsClassName;
94
- $[27] = label;
95
- $[28] = labelClassName;
96
- $[29] = required;
97
- $[30] = t4;
98
- $[31] = t5;
99
- } else t5 = $[31];
100
- return t5;
102
+ $[24] = className;
103
+ $[25] = description;
104
+ $[26] = descriptionClassName;
105
+ $[27] = errors;
106
+ $[28] = errorsClassName;
107
+ $[29] = label;
108
+ $[30] = labelClassName;
109
+ $[31] = required;
110
+ $[32] = t5;
111
+ $[33] = t6;
112
+ } else t6 = $[33];
113
+ return t6;
101
114
  }
102
115
  /** The `group` type: its `fields`, as a nested object. */
103
116
  function GroupFieldEntry(props) {
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"GroupField.js","names":["Field","Fieldset","NestedField","cx","getFieldProps","isWideField","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","cell","wide","next","undefined","map","flow","t5","t6","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 { isWideField } from '../shared/flow';\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, short ones side by side (`isWideField()`). Each\n * field renders with the entry of its type, at 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 <div className={styles.flow}>\n {fields.map((field) => (\n <div\n key={field.name}\n className={cx(styles.cell, isWideField(field) && styles.wide)}\n >\n <NestedField\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 </div>\n ))}\n </div>\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,8 +1,16 @@
1
1
  import "./GroupField.css";
2
2
  //#region src/group/GroupField.module.css
3
3
  var fields = "panneau-group-field-fields";
4
- var GroupField_module_default = { fields };
4
+ var flow = "panneau-group-field-flow";
5
+ var cell = "panneau-group-field-cell";
6
+ var wide = "panneau-group-field-wide";
7
+ var GroupField_module_default = {
8
+ fields,
9
+ flow,
10
+ cell,
11
+ wide
12
+ };
5
13
  //#endregion
6
- export { GroupField_module_default as default, fields };
14
+ export { cell, GroupField_module_default as default, fields, flow, wide };
7
15
 
8
16
  //# sourceMappingURL=GroupField.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupField.module.js","names":[],"sources":["../../src/group/GroupField.module.css"],"sourcesContent":[".fields {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-4);\n padding: var(--panneau-space-4);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n@media (max-width: 30rem) {\n .fields {\n padding: var(--panneau-space-3);\n }\n}\n"],"mappings":""}
1
+ {"version":3,"file":"GroupField.module.js","names":[],"sources":["../../src/group/GroupField.module.css"],"sourcesContent":[".fields {\n padding: var(--panneau-space-4);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n/* Short fields share a row, in columns of at least 14rem. */\n.flow {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(min(100%, 14rem), 1fr));\n gap: var(--panneau-space-4);\n}\n\n.cell {\n min-width: 0;\n}\n\n/* A field hidden by its condition renders nothing: its cell takes no column. */\n.cell:empty {\n display: none;\n}\n\n.wide {\n grid-column: 1 / -1;\n}\n\n@media (max-width: 30rem) {\n .fields {\n padding: var(--panneau-space-3);\n }\n}\n"],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -8,7 +8,9 @@ export { type EmbedAdapter, type EmbedSource, createEmbedSource } from './shared
8
8
  export type { GeocodingResult, GeocodingSource, MapTiles, MapsConfig } from './location/types.js';
9
9
  export { type NominatimSourceOptions, createNominatimSource } from './location/nominatim.js';
10
10
  export type { FieldEntry, FieldEntryProps, FieldProps } from './shared/types.js';
11
+ export { isWideField } from './shared/flow.js';
11
12
  export { MissingFieldEntry } from './missing/MissingField.js';
13
+ export { type RevealRegistry, type Revealer, RevealContext, createRevealRegistry, useRevealer, } from './shared/reveal.js';
12
14
  export { type FileFieldBaseProps, FileField, FileFieldEntry, type FileFieldProps, type FileValue, type MultipleFileFieldProps, type SingleFileFieldProps, isFileValue, toFiles, } from './file/FileField.js';
13
15
  export { FilePicker, type FilePickerProps } from './upload/FilePicker.js';
14
16
  export { UploadList, type UploadListProps } from './upload/UploadList.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,aAAa,EACb,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,sBAAsB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,KAAK,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACH,KAAK,kBAAkB,EACvB,SAAS,EACT,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,WAAW,EACX,OAAO,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACH,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACH,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EACxB,aAAa,EACb,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACH,QAAQ,EACR,SAAS,EACT,aAAa,EACb,UAAU,EACV,aAAa,EACb,UAAU,GACb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,EACZ,qBAAqB,GACxB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,sBAAsB,GACzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,KAAK,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EACH,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,aAAa,EACb,oBAAoB,EACpB,WAAW,GACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACH,KAAK,kBAAkB,EACvB,SAAS,EACT,cAAc,EACd,KAAK,cAAc,EACnB,KAAK,SAAS,EACd,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,WAAW,EACX,OAAO,GACV,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EACH,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,QAAQ,GAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,EAAE,KAAK,iBAAiB,EAAE,KAAK,gBAAgB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import { FieldsProvider, getParentPath, useFieldsContext } from "./shared/context.js";
2
2
  import { findRule, getAccept, getFieldProps, getMaxSize, getRuleNumber, isRequired } from "./shared/entry.js";
3
+ import { RevealContext, createRevealRegistry, useRevealer } from "./shared/reveal.js";
3
4
  import { MissingFieldEntry } from "./missing/MissingField.js";
4
5
  import { FilePicker } from "./upload/FilePicker.js";
5
6
  import { formatSize, matchesMime } from "./upload/files.js";
@@ -7,10 +8,11 @@ import { UploadList } from "./upload/UploadList.js";
7
8
  import { useRejectionMessage } from "./upload/useRejectionMessage.js";
8
9
  import { useUploads } from "./upload/useUploads.js";
9
10
  import { FileField, FileFieldEntry, isFileValue, toFiles } from "./file/FileField.js";
11
+ import { isWideField } from "./shared/flow.js";
10
12
  import { createRelationSource, toReferences, useRelationReferences } from "./shared/relation.js";
11
13
  import { builtInFields, fieldsPlugin } from "./shared/builtIn.js";
12
14
  import { DefinitionField, NestedField } from "./shared/DefinitionField.js";
13
15
  import { createFieldCheckSource } from "./shared/check.js";
14
16
  import { createEmbedSource } from "./shared/embed.js";
15
17
  import { createNominatimSource } from "./location/nominatim.js";
16
- export { DefinitionField, FieldsProvider, FileField, FileFieldEntry, FilePicker, MissingFieldEntry, NestedField, UploadList, builtInFields, createEmbedSource, createFieldCheckSource, createNominatimSource, createRelationSource, fieldsPlugin, findRule, formatSize, getAccept, getFieldProps, getMaxSize, getParentPath, getRuleNumber, isFileValue, isRequired, matchesMime, toFiles, toReferences, useFieldsContext, useRejectionMessage, useRelationReferences, useUploads };
18
+ export { DefinitionField, FieldsProvider, FileField, FileFieldEntry, FilePicker, MissingFieldEntry, NestedField, RevealContext, UploadList, builtInFields, createEmbedSource, createFieldCheckSource, createNominatimSource, createRelationSource, createRevealRegistry, fieldsPlugin, findRule, formatSize, getAccept, getFieldProps, getMaxSize, getParentPath, getRuleNumber, isFileValue, isRequired, isWideField, matchesMime, toFiles, toReferences, useFieldsContext, useRejectionMessage, useRelationReferences, useRevealer, useUploads };
@@ -2,8 +2,8 @@ import { getFieldProps, getSetting, isNumber } from "../shared/entry.js";
2
2
  import { messages } from "../shared/messages.js";
3
3
  import JsonField_module_default from "./JsonField.module.js";
4
4
  import { c } from "react/compiler-runtime";
5
- import { TextArea, usePanneauIntl } from "@panneau/ui";
6
5
  import { useState } from "react";
6
+ import { TextArea, usePanneauIntl } from "@panneau/ui";
7
7
  import { jsx } from "react/jsx-runtime";
8
8
  //#region src/json/JsonField.tsx
9
9
  /** The text of a value: indented JSON, or the text that doesn't parse as it is. */
@@ -1,9 +1,30 @@
1
- .panneau-localized-field-locales {
2
- display: flex;
3
- flex-direction: column;
4
- gap: var(--panneau-space-3);
5
- }
6
-
7
1
  .panneau-localized-field-locale {
8
2
  min-width: 0;
9
3
  }
4
+
5
+ .panneau-localized-field-locale[hidden] {
6
+ display: none;
7
+ }
8
+
9
+ .panneau-localized-field-option {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ gap: var(--panneau-space-1);
13
+ letter-spacing: 0.02em;
14
+ }
15
+
16
+ .panneau-localized-field-marker {
17
+ flex: 0 0 auto;
18
+ width: 0.45em;
19
+ height: 0.45em;
20
+ background-color: currentcolor;
21
+ border-radius: 50%;
22
+ }
23
+
24
+ .panneau-localized-field-invalid {
25
+ color: var(--panneau-color-danger);
26
+ }
27
+
28
+ .panneau-localized-field-empty {
29
+ color: var(--panneau-color-warning);
30
+ }
@@ -1,11 +1,14 @@
1
- import type { ReactNode } from 'react';
1
+ import { type ReactNode } from 'react';
2
2
  import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
3
  /** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */
4
4
  export type LocalizedValue<V> = Partial<Record<string, V | null>>;
5
5
  /** What `LocalizedField` gives the input of each locale. */
6
6
  export interface LocalizedInputProps<V> {
7
7
  locale: string;
8
- /** Name of the locale in the UI's language, as the input's label. */
8
+ /**
9
+ * Name of the locale in the UI's language. The field shows the locales: give it to the input
10
+ * as its `aria-label`, not as a visible label.
11
+ */
9
12
  label: string;
10
13
  value: V | null;
11
14
  onChange: (value: V | null) => void;
@@ -15,22 +18,30 @@ export interface LocalizedInputProps<V> {
15
18
  required?: boolean;
16
19
  }
17
20
  export interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {
18
- /** Locales, in order. */
21
+ /** Locales, in order. The first one shows first. */
19
22
  locales: readonly string[];
20
23
  /** Renders the input of a locale. */
21
24
  children: (props: LocalizedInputProps<V>) => ReactNode;
25
+ /** The locale shown. Controlled with `onLocaleChange`. */
26
+ locale?: string;
27
+ onLocaleChange?: (locale: string) => void;
28
+ /** Locales whose value has errors: their switch shows it. */
29
+ invalidLocales?: readonly string[];
22
30
  localeClassName?: string;
23
31
  }
24
32
  /** The name of a locale in the UI's language, capitalized (`Français`, `English`). */
25
33
  export declare function useLocaleName(): (locale: string) => string;
26
34
  /**
27
- * A value per locale, with an input for each locale under one legend. A value without any locale
28
- * filled is `null`.
35
+ * A value per locale: one locale at a time, under the field's label, with a switch at the end of
36
+ * the label's line for the others. The switch marks the locales in error, and the empty ones: to
37
+ * fill in when the field is required, to add otherwise. A value without any locale filled is
38
+ * `null`.
29
39
  */
30
- export declare function LocalizedField<V>({ locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, localeClassName, }: LocalizedFieldProps<V>): import("react").JSX.Element;
40
+ export declare function LocalizedField<V>({ locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, locale, onLocaleChange, invalidLocales, className, labelClassName, descriptionClassName, errorsClassName, localeClassName, }: LocalizedFieldProps<V>): import("react").JSX.Element;
31
41
  /**
32
42
  * A field of the definition with `localized: true`: the field of its type for each locale of the
33
- * fields context, each at its own path (`title.fr`).
43
+ * fields context, each at its own path (`title.fr`). It shows the locale of a path the form
44
+ * reveals, such as the first error on submit.
34
45
  */
35
46
  export declare function LocalizedFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
36
47
  //# sourceMappingURL=LocalizedField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedField.d.ts","sourceRoot":"","sources":["../../src/localized/LocalizedField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAQvC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,6EAA6E;AAC7E,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAElE,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACzE,yBAAyB;IACzB,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sFAAsF;AACtF,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAY1D;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAC9B,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,eAAe,GAClB,EAAE,mBAAmB,CAAC,CAAC,CAAC,+BAsCxB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,+BA+BzD"}
1
+ {"version":3,"file":"LocalizedField.d.ts","sourceRoot":"","sources":["../../src/localized/LocalizedField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAWjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,6EAA6E;AAC7E,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;AAElE,4DAA4D;AAC5D,MAAM,WAAW,mBAAmB,CAAC,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;IAChB,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC,CAAE,SAAQ,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACzE,oDAAoD;IACpD,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,qCAAqC;IACrC,QAAQ,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IACvD,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,6DAA6D;IAC7D,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,sFAAsF;AACtF,wBAAgB,aAAa,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAY1D;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,EAC9B,OAAO,EACP,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,cAAc,EACd,cAAmB,EACnB,SAAS,EACT,cAAc,EACd,oBAAoB,EACpB,eAAe,EACf,eAAe,GAClB,EAAE,mBAAmB,CAAC,CAAC,CAAC,+BAyFxB;AASD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,eAAe,+BA+CzD"}