@panneau/fields 4.1.0 → 5.0.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (183) hide show
  1. package/README.md +72 -0
  2. package/dist/boolean/BooleanField.d.ts +11 -0
  3. package/dist/boolean/BooleanField.d.ts.map +1 -0
  4. package/dist/boolean/BooleanField.js +67 -0
  5. package/dist/boolean/BooleanField.js.map +1 -0
  6. package/dist/boolean/index.d.ts +2 -0
  7. package/dist/boolean/index.d.ts.map +1 -0
  8. package/dist/boolean/index.js +1 -0
  9. package/dist/color/ColorField.css +33 -0
  10. package/dist/color/ColorField.d.ts +16 -0
  11. package/dist/color/ColorField.d.ts.map +1 -0
  12. package/dist/color/ColorField.js +187 -0
  13. package/dist/color/ColorField.js.map +1 -0
  14. package/dist/color/ColorField.module.js +14 -0
  15. package/dist/color/ColorField.module.js.map +1 -0
  16. package/dist/color/index.d.ts +2 -0
  17. package/dist/color/index.d.ts.map +1 -0
  18. package/dist/color/index.js +1 -0
  19. package/dist/date/DateField.d.ts +16 -0
  20. package/dist/date/DateField.d.ts.map +1 -0
  21. package/dist/date/DateField.js +132 -0
  22. package/dist/date/DateField.js.map +1 -0
  23. package/dist/date/index.d.ts +2 -0
  24. package/dist/date/index.d.ts.map +1 -0
  25. package/dist/date/index.js +1 -0
  26. package/dist/datetime/DateTimeField.d.ts +22 -0
  27. package/dist/datetime/DateTimeField.d.ts.map +1 -0
  28. package/dist/datetime/DateTimeField.js +78 -0
  29. package/dist/datetime/DateTimeField.js.map +1 -0
  30. package/dist/datetime/index.d.ts +2 -0
  31. package/dist/datetime/index.d.ts.map +1 -0
  32. package/dist/datetime/index.js +1 -0
  33. package/dist/email/EmailField.d.ts +8 -0
  34. package/dist/email/EmailField.d.ts.map +1 -0
  35. package/dist/email/EmailField.js +84 -0
  36. package/dist/email/EmailField.js.map +1 -0
  37. package/dist/email/index.d.ts +2 -0
  38. package/dist/email/index.d.ts.map +1 -0
  39. package/dist/email/index.js +1 -0
  40. package/dist/group/GroupField.css +14 -0
  41. package/dist/group/GroupField.d.ts +19 -0
  42. package/dist/group/GroupField.d.ts.map +1 -0
  43. package/dist/group/GroupField.js +140 -0
  44. package/dist/group/GroupField.js.map +1 -0
  45. package/dist/group/GroupField.module.js +8 -0
  46. package/dist/group/GroupField.module.js.map +1 -0
  47. package/dist/group/index.d.ts +2 -0
  48. package/dist/group/index.d.ts.map +1 -0
  49. package/dist/group/index.js +1 -0
  50. package/dist/index.d.ts +8 -12
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +7 -134
  53. package/dist/locales/index.d.ts +15 -0
  54. package/dist/locales/index.d.ts.map +1 -0
  55. package/dist/locales/index.js +21 -0
  56. package/dist/locales/index.js.map +1 -0
  57. package/dist/localized/LocalizedField.css +9 -0
  58. package/dist/localized/LocalizedField.d.ts +36 -0
  59. package/dist/localized/LocalizedField.d.ts.map +1 -0
  60. package/dist/localized/LocalizedField.js +207 -0
  61. package/dist/localized/LocalizedField.js.map +1 -0
  62. package/dist/localized/LocalizedField.module.js +12 -0
  63. package/dist/localized/LocalizedField.module.js.map +1 -0
  64. package/dist/localized/index.d.ts +2 -0
  65. package/dist/localized/index.d.ts.map +1 -0
  66. package/dist/localized/index.js +1 -0
  67. package/dist/missing/MissingField.css +18 -0
  68. package/dist/missing/MissingField.d.ts +7 -0
  69. package/dist/missing/MissingField.d.ts.map +1 -0
  70. package/dist/missing/MissingField.js +68 -0
  71. package/dist/missing/MissingField.js.map +1 -0
  72. package/dist/missing/MissingField.module.js +14 -0
  73. package/dist/missing/MissingField.module.js.map +1 -0
  74. package/dist/number/NumberField.d.ts +23 -0
  75. package/dist/number/NumberField.d.ts.map +1 -0
  76. package/dist/number/NumberField.js +175 -0
  77. package/dist/number/NumberField.js.map +1 -0
  78. package/dist/number/index.d.ts +2 -0
  79. package/dist/number/index.d.ts.map +1 -0
  80. package/dist/number/index.js +1 -0
  81. package/dist/relation/RelationField.css +43 -0
  82. package/dist/relation/RelationField.d.ts +40 -0
  83. package/dist/relation/RelationField.d.ts.map +1 -0
  84. package/dist/relation/RelationField.js +293 -0
  85. package/dist/relation/RelationField.js.map +1 -0
  86. package/dist/relation/RelationField.module.js +20 -0
  87. package/dist/relation/RelationField.module.js.map +1 -0
  88. package/dist/relation/index.d.ts +3 -0
  89. package/dist/relation/index.d.ts.map +1 -0
  90. package/dist/relation/index.js +3 -0
  91. package/dist/repeater/RepeaterField.css +80 -0
  92. package/dist/repeater/RepeaterField.d.ts +29 -0
  93. package/dist/repeater/RepeaterField.d.ts.map +1 -0
  94. package/dist/repeater/RepeaterField.js +220 -0
  95. package/dist/repeater/RepeaterField.js.map +1 -0
  96. package/dist/repeater/RepeaterField.module.js +26 -0
  97. package/dist/repeater/RepeaterField.module.js.map +1 -0
  98. package/dist/repeater/index.d.ts +2 -0
  99. package/dist/repeater/index.d.ts.map +1 -0
  100. package/dist/repeater/index.js +1 -0
  101. package/dist/select/SelectField.css +5 -0
  102. package/dist/select/SelectField.d.ts +38 -0
  103. package/dist/select/SelectField.d.ts.map +1 -0
  104. package/dist/select/SelectField.js +434 -0
  105. package/dist/select/SelectField.js.map +1 -0
  106. package/dist/select/SelectField.module.js +8 -0
  107. package/dist/select/SelectField.module.js.map +1 -0
  108. package/dist/select/index.d.ts +2 -0
  109. package/dist/select/index.d.ts.map +1 -0
  110. package/dist/select/index.js +1 -0
  111. package/dist/shared/DefinitionField.d.ts +32 -0
  112. package/dist/shared/DefinitionField.d.ts.map +1 -0
  113. package/dist/shared/DefinitionField.js +153 -0
  114. package/dist/shared/DefinitionField.js.map +1 -0
  115. package/dist/shared/builtIn.d.ts +17 -0
  116. package/dist/shared/builtIn.d.ts.map +1 -0
  117. package/dist/shared/builtIn.js +52 -0
  118. package/dist/shared/builtIn.js.map +1 -0
  119. package/dist/shared/context.d.ts +55 -0
  120. package/dist/shared/context.d.ts.map +1 -0
  121. package/dist/shared/context.js +72 -0
  122. package/dist/shared/context.js.map +1 -0
  123. package/dist/shared/cx.d.ts +3 -0
  124. package/dist/shared/cx.d.ts.map +1 -0
  125. package/dist/shared/cx.js +9 -0
  126. package/dist/shared/cx.js.map +1 -0
  127. package/dist/shared/dates.d.ts +15 -0
  128. package/dist/shared/dates.d.ts.map +1 -0
  129. package/dist/shared/dates.js +49 -0
  130. package/dist/shared/dates.js.map +1 -0
  131. package/dist/shared/entry.d.ts +23 -0
  132. package/dist/shared/entry.d.ts.map +1 -0
  133. package/dist/shared/entry.js +45 -0
  134. package/dist/shared/entry.js.map +1 -0
  135. package/dist/shared/messages.d.ts +2 -0
  136. package/dist/shared/messages.d.ts.map +1 -0
  137. package/dist/shared/messages.js +1 -0
  138. package/dist/shared/relation.d.ts +37 -0
  139. package/dist/shared/relation.d.ts.map +1 -0
  140. package/dist/shared/relation.js +49 -0
  141. package/dist/shared/relation.js.map +1 -0
  142. package/dist/shared/types.d.ts +50 -0
  143. package/dist/shared/types.d.ts.map +1 -0
  144. package/dist/slug/SlugField.d.ts +24 -0
  145. package/dist/slug/SlugField.d.ts.map +1 -0
  146. package/dist/slug/SlugField.js +216 -0
  147. package/dist/slug/SlugField.js.map +1 -0
  148. package/dist/slug/index.d.ts +2 -0
  149. package/dist/slug/index.d.ts.map +1 -0
  150. package/dist/slug/index.js +1 -0
  151. package/dist/text/TextField.d.ts +24 -0
  152. package/dist/text/TextField.d.ts.map +1 -0
  153. package/dist/text/TextField.js +179 -0
  154. package/dist/text/TextField.js.map +1 -0
  155. package/dist/text/index.d.ts +2 -0
  156. package/dist/text/index.d.ts.map +1 -0
  157. package/dist/text/index.js +1 -0
  158. package/dist/textarea/TextAreaField.d.ts +14 -0
  159. package/dist/textarea/TextAreaField.d.ts.map +1 -0
  160. package/dist/textarea/TextAreaField.js +126 -0
  161. package/dist/textarea/TextAreaField.js.map +1 -0
  162. package/dist/textarea/index.d.ts +2 -0
  163. package/dist/textarea/index.d.ts.map +1 -0
  164. package/dist/textarea/index.js +1 -0
  165. package/dist/time/TimeField.d.ts +13 -0
  166. package/dist/time/TimeField.d.ts.map +1 -0
  167. package/dist/time/TimeField.js +49 -0
  168. package/dist/time/TimeField.js.map +1 -0
  169. package/dist/time/index.d.ts +2 -0
  170. package/dist/time/index.d.ts.map +1 -0
  171. package/dist/time/index.js +1 -0
  172. package/dist/url/UrlField.css +11 -0
  173. package/dist/url/UrlField.d.ts +16 -0
  174. package/dist/url/UrlField.d.ts.map +1 -0
  175. package/dist/url/UrlField.js +94 -0
  176. package/dist/url/UrlField.js.map +1 -0
  177. package/dist/url/UrlField.module.js +8 -0
  178. package/dist/url/UrlField.module.js.map +1 -0
  179. package/dist/url/index.d.ts +2 -0
  180. package/dist/url/index.d.ts.map +1 -0
  181. package/dist/url/index.js +1 -0
  182. package/package.json +108 -79
  183. package/assets/css/styles.css +0 -14
@@ -0,0 +1,22 @@
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
2
+ export interface DateTimeFieldProps extends FieldProps<string> {
3
+ /**
4
+ * Time zone the date and time are shown and typed in, for values with an offset. Defaults to
5
+ * the browser's.
6
+ */
7
+ timeZone?: string;
8
+ /** Shows seconds. */
9
+ withSeconds?: boolean;
10
+ /** Defaults to the locale's. */
11
+ hourCycle?: 12 | 24;
12
+ controlClassName?: string;
13
+ }
14
+ /**
15
+ * A date and a time as an ISO string. Values with an offset (`2026-10-15T13:30:00Z`) are shown in
16
+ * the time zone of the browser and written back in UTC. Values without one
17
+ * (`2026-10-15T09:30:00`) are kept without one.
18
+ */
19
+ export declare function DateTimeField({ value, onChange, timeZone, withSeconds, disabled, readOnly, required, ...props }: DateTimeFieldProps): import("react").JSX.Element;
20
+ /** The `datetime` type: setting `timeZone`. */
21
+ export declare function DateTimeFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
22
+ //# sourceMappingURL=DateTimeField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateTimeField.d.ts","sourceRoot":"","sources":["../../src/datetime/DateTimeField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC1D;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,QAA6B,EAC7B,WAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,kBAAkB,+BAwBpB;AAED,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAUxD"}
@@ -0,0 +1,78 @@
1
+ import { getFieldProps, getSetting, isString } from "../shared/entry.js";
2
+ import { fromDateTime, toDateTime } from "../shared/dates.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { DatePicker } from "@panneau/ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ import { getLocalTimeZone, now } from "@internationalized/date";
7
+ //#region src/datetime/DateTimeField.tsx
8
+ /**
9
+ * A date and a time as an ISO string. Values with an offset (`2026-10-15T13:30:00Z`) are shown in
10
+ * the time zone of the browser and written back in UTC. Values without one
11
+ * (`2026-10-15T09:30:00`) are kept without one.
12
+ */
13
+ function DateTimeField({ value, onChange, timeZone = getLocalTimeZone(), withSeconds = false, disabled, readOnly, required, ...props }) {
14
+ const current = toDateTime(value, timeZone);
15
+ return /* @__PURE__ */ jsx(DatePicker, {
16
+ ...props,
17
+ granularity: withSeconds ? "second" : "minute",
18
+ hideTimeZone: true,
19
+ value: current,
20
+ onChange: (next) => {
21
+ if (next === null) {
22
+ onChange?.(null);
23
+ return;
24
+ }
25
+ if ("hour" in next) onChange?.(fromDateTime(next));
26
+ },
27
+ placeholderValue: current ?? now(timeZone).set({
28
+ second: 0,
29
+ millisecond: 0
30
+ }),
31
+ isDisabled: disabled,
32
+ isReadOnly: readOnly,
33
+ isRequired: required
34
+ });
35
+ }
36
+ /** The `datetime` type: setting `timeZone`. */
37
+ function DateTimeFieldEntry(props) {
38
+ const $ = c(11);
39
+ let t0;
40
+ if ($[0] !== props.field) {
41
+ t0 = getSetting(props.field, "timeZone", isString);
42
+ $[0] = props.field;
43
+ $[1] = t0;
44
+ } else t0 = $[1];
45
+ const timeZone = t0;
46
+ let t1;
47
+ if ($[2] !== props) {
48
+ t1 = getFieldProps(props);
49
+ $[2] = props;
50
+ $[3] = t1;
51
+ } else t1 = $[3];
52
+ const t2 = isString(props.value) ? props.value : null;
53
+ let t3;
54
+ if ($[4] !== timeZone) {
55
+ t3 = timeZone !== void 0 ? { timeZone } : {};
56
+ $[4] = timeZone;
57
+ $[5] = t3;
58
+ } else t3 = $[5];
59
+ let t4;
60
+ if ($[6] !== props.onChange || $[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
61
+ t4 = /* @__PURE__ */ jsx(DateTimeField, {
62
+ ...t1,
63
+ value: t2,
64
+ onChange: props.onChange,
65
+ ...t3
66
+ });
67
+ $[6] = props.onChange;
68
+ $[7] = t1;
69
+ $[8] = t2;
70
+ $[9] = t3;
71
+ $[10] = t4;
72
+ } else t4 = $[10];
73
+ return t4;
74
+ }
75
+ //#endregion
76
+ export { DateTimeField, DateTimeFieldEntry };
77
+
78
+ //# sourceMappingURL=DateTimeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DateTimeField.js","names":["_c"],"sources":["../../src/datetime/DateTimeField.tsx"],"sourcesContent":["import { getLocalTimeZone, now } from '@internationalized/date';\n\nimport { DatePicker } from '@panneau/ui';\n\nimport { fromDateTime, toDateTime } from '../shared/dates';\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface DateTimeFieldProps extends FieldProps<string> {\n /**\n * Time zone the date and time are shown and typed in, for values with an offset. Defaults to\n * the browser's.\n */\n timeZone?: string;\n /** Shows seconds. */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/**\n * A date and a time as an ISO string. Values with an offset (`2026-10-15T13:30:00Z`) are shown in\n * the time zone of the browser and written back in UTC. Values without one\n * (`2026-10-15T09:30:00`) are kept without one.\n */\nexport function DateTimeField({\n value,\n onChange,\n timeZone = getLocalTimeZone(),\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: DateTimeFieldProps) {\n const current = toDateTime(value, timeZone);\n return (\n <DatePicker\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n hideTimeZone\n value={current}\n onChange={(next) => {\n if (next === null) {\n onChange?.(null);\n return;\n }\n if ('hour' in next) {\n onChange?.(fromDateTime(next));\n }\n }}\n // Typed from empty, a value is in the field's time zone, and written in UTC.\n placeholderValue={current ?? now(timeZone).set({ second: 0, millisecond: 0 })}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `datetime` type: setting `timeZone`. */\nexport function DateTimeFieldEntry(props: FieldEntryProps) {\n const timeZone = getSetting(props.field, 'timeZone', isString);\n return (\n <DateTimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(timeZone !== undefined ? { timeZone } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;;AA0BA,SAAgB,cAAc,EAC1B,OACA,UACA,WAAW,iBAAiB,GAC5B,cAAc,OACd,UACA,UACA,UACA,GAAG,SACgB;CACnB,MAAM,UAAU,WAAW,OAAO,QAAQ;CAC1C,OACI,oBAAC,YAAD;EACI,GAAI;EACJ,aAAa,cAAc,WAAW;EACtC,cAAA;EACA,OAAO;EACP,WAAW,SAAS;GAChB,IAAI,SAAS,MAAM;IACf,WAAW,IAAI;IACf;GACJ;GACA,IAAI,UAAU,MACV,WAAW,aAAa,IAAI,CAAC;EAErC;EAEA,kBAAkB,WAAW,IAAI,QAAQ,CAAC,CAAC,IAAI;GAAE,QAAQ;GAAG,aAAa;EAAE,CAAC;EAC5E,YAAY;EACZ,YAAY;EACZ,YAAY;CAAS,CAAA;AAGjC;;AAGA,SAAO,mBAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,OAAA;EACc,KAAA,WAAW,MAAK,OAAQ,YAAY,QAAQ;EAAC,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAA9D,MAAA,WAAiB;CAA8C,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGnD,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAA0C,IAAA;CAAA,IAAA,EAAA,OAAA,UAAA;EAE5C,KAAA,aAAa,KAAA,IAAb,EAAA,SAAyC,IAAzC,CAAyC;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJnD,KAAA,oBAAC,eAAD;GAAc,GACN;GACG,OAAA;GACG,UAAA,MAAK;GAAS,GACnB;EAA0C,CAAA;EACjD,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
@@ -0,0 +1,2 @@
1
+ export { DateTimeField, DateTimeFieldEntry, type DateTimeFieldProps } from './DateTimeField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/datetime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export { DateTimeField, DateTimeFieldEntry } from "./DateTimeField.js";
@@ -0,0 +1,8 @@
1
+ import type { FieldEntryProps } from '../shared/types';
2
+ import { type TextFieldProps } from '../text/TextField';
3
+ export type EmailFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;
4
+ /** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */
5
+ export declare function EmailField({ value, onChange, onBlur, ...props }: EmailFieldProps): import("react").JSX.Element;
6
+ /** The `email` type. */
7
+ export declare function EmailFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
8
+ //# sourceMappingURL=EmailField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailField.d.ts","sourceRoot":"","sources":["../../src/email/EmailField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;AAEzE,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,EAAE,eAAe,+BAkBhF;AAED,wBAAwB;AACxB,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAQrD"}
@@ -0,0 +1,84 @@
1
+ import { getFieldProps, isString } from "../shared/entry.js";
2
+ import { TextField } from "../text/TextField.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { jsx } from "react/jsx-runtime";
5
+ //#region src/email/EmailField.tsx
6
+ /** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */
7
+ function EmailField(t0) {
8
+ const $ = c(14);
9
+ let onBlur;
10
+ let onChange;
11
+ let props;
12
+ let value;
13
+ if ($[0] !== t0) {
14
+ ({value, onChange, onBlur, ...props} = t0);
15
+ $[0] = t0;
16
+ $[1] = onBlur;
17
+ $[2] = onChange;
18
+ $[3] = props;
19
+ $[4] = value;
20
+ } else {
21
+ onBlur = $[1];
22
+ onChange = $[2];
23
+ props = $[3];
24
+ value = $[4];
25
+ }
26
+ let t1;
27
+ if ($[5] !== onBlur || $[6] !== onChange || $[7] !== value) {
28
+ t1 = () => {
29
+ const trimmed = value?.trim() ?? null;
30
+ if (trimmed !== value) onChange?.(trimmed === "" ? null : trimmed);
31
+ onBlur?.();
32
+ };
33
+ $[5] = onBlur;
34
+ $[6] = onChange;
35
+ $[7] = value;
36
+ $[8] = t1;
37
+ } else t1 = $[8];
38
+ let t2;
39
+ if ($[9] !== onChange || $[10] !== props || $[11] !== t1 || $[12] !== value) {
40
+ t2 = /* @__PURE__ */ jsx(TextField, {
41
+ autoComplete: "off",
42
+ ...props,
43
+ type: "email",
44
+ inputMode: "email",
45
+ value,
46
+ onChange,
47
+ onBlur: t1
48
+ });
49
+ $[9] = onChange;
50
+ $[10] = props;
51
+ $[11] = t1;
52
+ $[12] = value;
53
+ $[13] = t2;
54
+ } else t2 = $[13];
55
+ return t2;
56
+ }
57
+ /** The `email` type. */
58
+ function EmailFieldEntry(props) {
59
+ const $ = c(6);
60
+ let t0;
61
+ if ($[0] !== props) {
62
+ t0 = getFieldProps(props);
63
+ $[0] = props;
64
+ $[1] = t0;
65
+ } else t0 = $[1];
66
+ const t1 = isString(props.value) ? props.value : null;
67
+ let t2;
68
+ if ($[2] !== props.onChange || $[3] !== t0 || $[4] !== t1) {
69
+ t2 = /* @__PURE__ */ jsx(EmailField, {
70
+ ...t0,
71
+ value: t1,
72
+ onChange: props.onChange
73
+ });
74
+ $[2] = props.onChange;
75
+ $[3] = t0;
76
+ $[4] = t1;
77
+ $[5] = t2;
78
+ } else t2 = $[5];
79
+ return t2;
80
+ }
81
+ //#endregion
82
+ export { EmailField, EmailFieldEntry };
83
+
84
+ //# sourceMappingURL=EmailField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailField.js","names":["value","onChange","_c"],"sources":["../../src/email/EmailField.tsx"],"sourcesContent":["import { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\n\nexport type EmailFieldProps = Omit<TextFieldProps, 'type' | 'inputMode'>;\n\n/** An email address, with the email keyboard on phones. Spaces around it are removed on blur. */\nexport function EmailField({ value, onChange, onBlur, ...props }: EmailFieldProps) {\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"email\"\n inputMode=\"email\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n const trimmed = value?.trim() ?? null;\n if (trimmed !== value) {\n onChange?.(trimmed === '' ? null : trimmed);\n }\n onBlur?.();\n }}\n />\n );\n}\n\n/** The `email` type. */\nexport function EmailFieldEntry(props: FieldEntryProps) {\n return (\n <EmailField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":";;;;;;AAOA,SAAO,WAAA,IAAA;CAAA,MAAA,IAAAE,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAoB,CAAA,CAAA,OAAA,UAAA,QAAA,GAAA,SAAA;EAAsD,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,SAAA,EAAA;EAAA,WAAA,EAAA;EAAA,QAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,UAAA,EAAA,OAAA,YAAA,EAAA,OAAA,OAAA;EAS7D,WAAA;GACJ,MAAA,UAAgB,OAAK,KAAe,KAApB;GAChB,IAAI,YAAY,OACZ,WAAW,YAAY,KAAZ,OAAA,OAA+B;GAE9C,SAAS;EAAC;EACb,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,YAAA,EAAA,QAAA,SAAA,EAAA,QAAA,MAAA,EAAA,QAAA,OAAA;EAbL,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACd;GACC,MAAA;GACK,WAAA;GACH;GACG;GACF,QAAA;EAMP,CAAA;EACH,EAAA,KAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAdF;AAcE;;AAKV,SAAO,gBAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGS,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAA0C,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAFrD,KAAA,oBAAC,YAAD;GAAW,GACH;GACG,OAAA;GACG,UAAA,MAAK;EAAS,CAAA;EAC1B,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAJF;AAIE"}
@@ -0,0 +1,2 @@
1
+ export { EmailField, EmailFieldEntry, type EmailFieldProps } from './EmailField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/email/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ export { EmailField, EmailFieldEntry } from "./EmailField.js";
@@ -0,0 +1,14 @@
1
+ .panneau-fields-YVfYCM {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: var(--panneau-space-4);
5
+ padding: var(--panneau-space-4);
6
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
7
+ border-radius: var(--panneau-radius-md);
8
+ }
9
+
10
+ @media (max-width: 30rem) {
11
+ .panneau-fields-YVfYCM {
12
+ padding: var(--panneau-space-3);
13
+ }
14
+ }
@@ -0,0 +1,19 @@
1
+ import type { Field } from '@panneau/protocol';
2
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
3
+ export type GroupValue = Record<string, unknown>;
4
+ export interface GroupFieldProps extends FieldProps<GroupValue> {
5
+ /** The nested fields, rendered with the entries of the fields context. */
6
+ fields: readonly Field[];
7
+ /** Dot path of the group's value, the prefix of its fields' paths. Defaults to `name`. */
8
+ path?: string;
9
+ fieldsClassName?: string;
10
+ }
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
14
+ * object through `onChange`.
15
+ */
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;
17
+ /** The `group` type: its `fields`, as a nested object. */
18
+ export declare function GroupFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
19
+ //# sourceMappingURL=GroupField.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,140 @@
1
+ import { cx } from "../shared/cx.js";
2
+ import { getFieldProps } from "../shared/entry.js";
3
+ import GroupField_module_default from "./GroupField.module.js";
4
+ import { NestedField } from "../shared/DefinitionField.js";
5
+ import { c } from "react/compiler-runtime";
6
+ import { Fieldset } from "@panneau/ui";
7
+ import { jsx } from "react/jsx-runtime";
8
+ //#region src/group/GroupField.tsx
9
+ /**
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
12
+ * object through `onChange`.
13
+ */
14
+ function GroupField(t0) {
15
+ const $ = c(32);
16
+ const { fields, path, name, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, fieldsClassName } = t0;
17
+ const base = path ?? name ?? "";
18
+ let t1;
19
+ if ($[0] !== value) {
20
+ t1 = value ?? {};
21
+ $[0] = value;
22
+ $[1] = t1;
23
+ } else t1 = $[1];
24
+ const object = t1;
25
+ let t2;
26
+ if ($[2] !== fieldsClassName) {
27
+ t2 = cx(GroupField_module_default.fields, fieldsClassName);
28
+ $[2] = fieldsClassName;
29
+ $[3] = t2;
30
+ } else t2 = $[3];
31
+ let t3;
32
+ if ($[4] !== base || $[5] !== disabled || $[6] !== fields || $[7] !== object || $[8] !== onBlur || $[9] !== onChange || $[10] !== readOnly) {
33
+ let t4;
34
+ 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 } : {}
47
+ }, field.name);
48
+ $[12] = base;
49
+ $[13] = disabled;
50
+ $[14] = object;
51
+ $[15] = onBlur;
52
+ $[16] = onChange;
53
+ $[17] = readOnly;
54
+ $[18] = t4;
55
+ } else t4 = $[18];
56
+ t3 = fields.map(t4);
57
+ $[4] = base;
58
+ $[5] = disabled;
59
+ $[6] = fields;
60
+ $[7] = object;
61
+ $[8] = onBlur;
62
+ $[9] = onChange;
63
+ $[10] = readOnly;
64
+ $[11] = t3;
65
+ } else t3 = $[11];
66
+ let t4;
67
+ if ($[19] !== t2 || $[20] !== t3) {
68
+ t4 = /* @__PURE__ */ jsx("div", {
69
+ className: t2,
70
+ children: t3
71
+ });
72
+ $[19] = t2;
73
+ $[20] = t3;
74
+ $[21] = t4;
75
+ } else t4 = $[21];
76
+ 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, {
79
+ legend: label,
80
+ description,
81
+ errors,
82
+ isRequired: required,
83
+ className,
84
+ legendClassName: labelClassName,
85
+ descriptionClassName,
86
+ errorsClassName,
87
+ children: t4
88
+ });
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;
101
+ }
102
+ /** The `group` type: its `fields`, as a nested object. */
103
+ function GroupFieldEntry(props) {
104
+ const $ = c(10);
105
+ const { value } = props;
106
+ let t0;
107
+ if ($[0] !== props) {
108
+ t0 = getFieldProps(props);
109
+ $[0] = props;
110
+ $[1] = t0;
111
+ } else t0 = $[1];
112
+ let t1;
113
+ if ($[2] !== props.field.fields) {
114
+ t1 = props.field.fields ?? [];
115
+ $[2] = props.field.fields;
116
+ $[3] = t1;
117
+ } else t1 = $[3];
118
+ const t2 = value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
119
+ let t3;
120
+ if ($[4] !== props.onChange || $[5] !== props.path || $[6] !== t0 || $[7] !== t1 || $[8] !== t2) {
121
+ t3 = /* @__PURE__ */ jsx(GroupField, {
122
+ ...t0,
123
+ fields: t1,
124
+ path: props.path,
125
+ value: t2,
126
+ onChange: props.onChange
127
+ });
128
+ $[4] = props.onChange;
129
+ $[5] = props.path;
130
+ $[6] = t0;
131
+ $[7] = t1;
132
+ $[8] = t2;
133
+ $[9] = t3;
134
+ } else t3 = $[9];
135
+ return t3;
136
+ }
137
+ //#endregion
138
+ export { GroupField, GroupFieldEntry };
139
+
140
+ //# sourceMappingURL=GroupField.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,8 @@
1
+ import "./GroupField.css";
2
+ //#region src/group/GroupField.module.css
3
+ var fields = "panneau-fields-YVfYCM";
4
+ var GroupField_module_default = { fields };
5
+ //#endregion
6
+ export { GroupField_module_default as default, fields };
7
+
8
+ //# sourceMappingURL=GroupField.module.js.map
@@ -0,0 +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":""}
@@ -0,0 +1,2 @@
1
+ export { GroupField, GroupFieldEntry, type GroupFieldProps, type GroupValue } from './GroupField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/group/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1 @@
1
+ export { GroupField, GroupFieldEntry } from "./GroupField.js";
package/dist/index.d.ts CHANGED
@@ -1,12 +1,8 @@
1
- import * as react from 'react';
2
- import { ElementType, ReactNode } from 'react';
3
- import { FieldDefinition } from '@panneau/core';
4
-
5
- interface FieldsProviderProps {
6
- definitions?: FieldDefinition[];
7
- components?: Record<string, ElementType>;
8
- children: ReactNode;
9
- }
10
- declare function FieldsProvider({ definitions: injectedDefinitions, components: injectedComponents, children, }: FieldsProviderProps): react.JSX.Element;
11
-
12
- export { FieldsProvider as default };
1
+ export { DefinitionField, NestedField, type NestedFieldProps } from './shared/DefinitionField';
2
+ export { builtInFields, fieldsPlugin } from './shared/builtIn';
3
+ export { type BoundFieldProps, type FieldBinding, type FieldBindingProps, FieldsProvider, type FieldsContextValue, type FieldsProviderProps, getParentPath, useFieldsContext, } from './shared/context';
4
+ export { findRule, getFieldProps, getRuleNumber, isRequired } from './shared/entry';
5
+ export { type RelationListAdapter, type RelationReference, type RelationSource, type RelationSourceOptions, createRelationSource, toReferences, } from './shared/relation';
6
+ export type { FieldEntry, FieldEntryProps, FieldProps } from './shared/types';
7
+ export { MissingFieldEntry } from './missing/MissingField';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +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,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EACH,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC1B,oBAAoB,EACpB,YAAY,GACf,MAAM,mBAAmB,CAAC;AAC3B,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC"}
package/dist/index.js CHANGED
@@ -1,134 +1,7 @@
1
- import { c } from 'react/compiler-runtime';
2
- import { ComponentsProvider, FIELDS_NAMESPACE, FieldsProvider as FieldsProvider$1 } from '@panneau/core/contexts';
3
- import fieldAutocomplete, { definition } from '@panneau/field-autocomplete';
4
- import fieldCheckboxes, { definition as definition$1 } from '@panneau/field-checkboxes';
5
- import fieldColor, { definition as definition$2 } from '@panneau/field-color';
6
- import { Date, DateTime, Time, definition as definition$3 } from '@panneau/field-date';
7
- import fieldDisplay, { definition as definition$4 } from '@panneau/field-display';
8
- import fieldEmbed, { definition as definition$5 } from '@panneau/field-embed';
9
- import fieldFields, { definition as definition$6 } from '@panneau/field-fields';
10
- import fieldHtml, { definition as definition$7 } from '@panneau/field-html';
11
- import fieldInputGroup, { definition as definition$9 } from '@panneau/field-input-group';
12
- import fieldItem, { definition as definition$a } from '@panneau/field-item';
13
- import fieldImport, { definition as definition$8 } from '@panneau/field-import';
14
- import fieldItems, { definition as definition$b } from '@panneau/field-items';
15
- import fieldLocalized, { definition as definition$c } from '@panneau/field-localized';
16
- import fieldNumber, { definition as definition$e } from '@panneau/field-number';
17
- import fieldRadios, { definition as definition$f } from '@panneau/field-radios';
18
- import fieldSelect, { definition as definition$h } from '@panneau/field-select';
19
- import fieldText, { Email, Password, Telephone, Textarea, definition as definition$i } from '@panneau/field-text';
20
- import fieldToggle, { definition as definition$j } from '@panneau/field-toggle';
21
- import fieldToggles, { definition as definition$k } from '@panneau/field-toggles';
22
- import fieldUpload, { AudioField as AudioField$1, DocumentField as DocumentField$1, FontField as FontField$1, ImageField as ImageField$1, ImagesField as ImagesField$1, VideoField as VideoField$1, definition as definition$l } from '@panneau/field-upload';
23
- import fieldMedia, { AudioField, DocumentField, FontField, ImageField, ImagesField, VideoField, definition as definition$d } from '@panneau/field-media';
24
- import fieldUrl, { definition as definition$m } from '@panneau/field-url';
25
- import fieldResourceItem, { definition as definition$g } from '@panneau/field-resource-item';
26
- import isArray from 'lodash-es/isArray';
27
- import { jsx } from 'react/jsx-runtime';
28
-
29
- var components = /*#__PURE__*/Object.freeze({
30
- __proto__: null,
31
- Audio: AudioField,
32
- AudioUpload: AudioField$1,
33
- Autocomplete: fieldAutocomplete,
34
- Checkboxes: fieldCheckboxes,
35
- Color: fieldColor,
36
- Date: Date,
37
- DateTime: DateTime,
38
- Display: fieldDisplay,
39
- Document: DocumentField,
40
- DocumentUpload: DocumentField$1,
41
- Email: Email,
42
- Embed: fieldEmbed,
43
- Fields: fieldFields,
44
- Font: FontField,
45
- FontUpload: FontField$1,
46
- Html: fieldHtml,
47
- Image: ImageField,
48
- ImageUpload: ImageField$1,
49
- Images: ImagesField,
50
- ImagesUpload: ImagesField$1,
51
- Import: fieldImport,
52
- InputGroup: fieldInputGroup,
53
- Item: fieldItem,
54
- Items: fieldItems,
55
- Localized: fieldLocalized,
56
- Media: fieldMedia,
57
- Number: fieldNumber,
58
- Password: Password,
59
- Radios: fieldRadios,
60
- ResourceItem: fieldResourceItem,
61
- Select: fieldSelect,
62
- Telephone: Telephone,
63
- Text: fieldText,
64
- Textarea: Textarea,
65
- Time: Time,
66
- Toggle: fieldToggle,
67
- Toggles: fieldToggles,
68
- Upload: fieldUpload,
69
- Url: fieldUrl,
70
- Video: VideoField,
71
- VideoUpload: VideoField$1
72
- });
73
-
74
- var definitions = [definition, definition$1, definition$2, definition$3, definition$4, definition$5, definition$6, definition$7, definition$8, definition$9, definition$a, definition$b, definition$c, definition$d, definition$e, definition$f, definition$g, definition$h, definition$i, definition$j, definition$k, definition$l, definition$m].reduce((allDefinitions, definition) => [...allDefinitions, ...(isArray(definition) ? definition : [definition])], []);
75
-
76
- const DEFAULT_DEFINITIONS = [];
77
- const DEFAULT_COMPONENTS = {};
78
- function FieldsProvider(t0) {
79
- const $ = c(10);
80
- const {
81
- definitions: t1,
82
- components: t2,
83
- children
84
- } = t0;
85
- const injectedDefinitions = t1 === undefined ? DEFAULT_DEFINITIONS : t1;
86
- const injectedComponents = t2 === undefined ? DEFAULT_COMPONENTS : t2;
87
- let t3;
88
- if ($[0] !== injectedDefinitions) {
89
- t3 = [...definitions, ...injectedDefinitions];
90
- $[0] = injectedDefinitions;
91
- $[1] = t3;
92
- } else {
93
- t3 = $[1];
94
- }
95
- let t4;
96
- if ($[2] !== injectedComponents) {
97
- t4 = {
98
- ...components,
99
- ...injectedComponents
100
- };
101
- $[2] = injectedComponents;
102
- $[3] = t4;
103
- } else {
104
- t4 = $[3];
105
- }
106
- let t5;
107
- if ($[4] !== children || $[5] !== t4) {
108
- t5 = /*#__PURE__*/jsx(ComponentsProvider, {
109
- namespace: FIELDS_NAMESPACE,
110
- components: t4,
111
- children: children
112
- });
113
- $[4] = children;
114
- $[5] = t4;
115
- $[6] = t5;
116
- } else {
117
- t5 = $[6];
118
- }
119
- let t6;
120
- if ($[7] !== t3 || $[8] !== t5) {
121
- t6 = /*#__PURE__*/jsx(FieldsProvider$1, {
122
- fields: t3,
123
- children: t5
124
- });
125
- $[7] = t3;
126
- $[8] = t5;
127
- $[9] = t6;
128
- } else {
129
- t6 = $[9];
130
- }
131
- return t6;
132
- }
133
-
134
- export { FieldsProvider as default };
1
+ import { FieldsProvider, getParentPath, useFieldsContext } from "./shared/context.js";
2
+ import { findRule, getFieldProps, getRuleNumber, isRequired } from "./shared/entry.js";
3
+ import { MissingFieldEntry } from "./missing/MissingField.js";
4
+ import { createRelationSource, toReferences } from "./shared/relation.js";
5
+ import { builtInFields, fieldsPlugin } from "./shared/builtIn.js";
6
+ import { DefinitionField, NestedField } from "./shared/DefinitionField.js";
7
+ export { DefinitionField, FieldsProvider, MissingFieldEntry, NestedField, builtInFields, createRelationSource, fieldsPlugin, findRule, getFieldProps, getParentPath, getRuleNumber, isRequired, toReferences, useFieldsContext };
@@ -0,0 +1,15 @@
1
+ /**
2
+ * The English messages of `@panneau/fields`, by id. They are also the default messages.
3
+ *
4
+ * @deprecated Use `en`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages
5
+ * of every package.
6
+ */
7
+ export declare const en: Record<string, string>;
8
+ /**
9
+ * The French messages of `@panneau/fields`, by id.
10
+ *
11
+ * @deprecated Use `fr`, or `withPanneauMessages()`, from `@panneau/intl`: they have the messages
12
+ * of every package.
13
+ */
14
+ export declare const fr: Record<string, string>;
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/locales/index.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAgC,CAAC;AAEvE;;;;;GAKG;AACH,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAErC,CAAC"}