@panneau/fields 4.1.1 → 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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/textarea/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export { TextAreaField, TextAreaFieldEntry } from "./TextAreaField.js";
@@ -0,0 +1,13 @@
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
2
+ export interface TimeFieldProps extends FieldProps<string> {
3
+ /** Shows and writes seconds (`09:30:15`). */
4
+ withSeconds?: boolean;
5
+ /** Defaults to the locale's. */
6
+ hourCycle?: 12 | 24;
7
+ controlClassName?: string;
8
+ }
9
+ /** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
10
+ export declare function TimeField({ value, onChange, withSeconds, disabled, readOnly, required, ...props }: TimeFieldProps): import("react").JSX.Element;
11
+ /** The `time` type: setting `withSeconds`. */
12
+ export declare function TimeFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
13
+ //# sourceMappingURL=TimeField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeField.d.ts","sourceRoot":"","sources":["../../src/time/TimeField.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,gCAAgC;IAChC,SAAS,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAmB,EACnB,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAYhB;AAED,8CAA8C;AAC9C,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BASpD"}
@@ -0,0 +1,49 @@
1
+ import { getFieldProps, isString } from "../shared/entry.js";
2
+ import { fromTime, toTime } from "../shared/dates.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { TimeInput } from "@panneau/ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/time/TimeField.tsx
7
+ /** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
8
+ function TimeField({ value, onChange, withSeconds = false, disabled, readOnly, required, ...props }) {
9
+ return /* @__PURE__ */ jsx(TimeInput, {
10
+ ...props,
11
+ granularity: withSeconds ? "second" : "minute",
12
+ value: toTime(value),
13
+ onChange: (next) => onChange?.(next === null ? null : fromTime(next, withSeconds)),
14
+ isDisabled: disabled,
15
+ isReadOnly: readOnly,
16
+ isRequired: required
17
+ });
18
+ }
19
+ /** The `time` type: setting `withSeconds`. */
20
+ function TimeFieldEntry(props) {
21
+ const $ = c(7);
22
+ let t0;
23
+ if ($[0] !== props) {
24
+ t0 = getFieldProps(props);
25
+ $[0] = props;
26
+ $[1] = t0;
27
+ } else t0 = $[1];
28
+ const t1 = isString(props.value) ? props.value : null;
29
+ const t2 = props.field.settings?.withSeconds === true;
30
+ let t3;
31
+ if ($[2] !== props.onChange || $[3] !== t0 || $[4] !== t1 || $[5] !== t2) {
32
+ t3 = /* @__PURE__ */ jsx(TimeField, {
33
+ ...t0,
34
+ value: t1,
35
+ onChange: props.onChange,
36
+ withSeconds: t2
37
+ });
38
+ $[2] = props.onChange;
39
+ $[3] = t0;
40
+ $[4] = t1;
41
+ $[5] = t2;
42
+ $[6] = t3;
43
+ } else t3 = $[6];
44
+ return t3;
45
+ }
46
+ //#endregion
47
+ export { TimeField, TimeFieldEntry };
48
+
49
+ //# sourceMappingURL=TimeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TimeField.js","names":["_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,UAAU,EACtB,OACA,UACA,cAAc,OACd,UACA,UACA,UACA,GAAG,SACY;CACf,OACI,oBAAC,WAAD;EACI,GAAI;EACJ,aAAa,cAAc,WAAW;EACtC,OAAO,OAAO,KAAK;EACnB,WAAW,SAAS,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,WAAW,CAAC;EACjF,YAAY;EACZ,YAAY;EACZ,YAAY;CAAS,CAAA;AAGjC;;AAGA,SAAO,eAAA,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;CAEM,MAAA,KAAA,MAAK,MAAM,UAAsB,gBAAK;CAAI,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJ3D,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GACF,aAAA;EAA0C,CAAA;EACzD,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
@@ -0,0 +1,2 @@
1
+ export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/time/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { TimeField, TimeFieldEntry } from "./TimeField.js";
@@ -0,0 +1,11 @@
1
+ .panneau-open-bOtJNo {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ padding: var(--panneau-space-1);
5
+ color: var(--panneau-color-text-muted);
6
+ border-radius: var(--panneau-radius-sm);
7
+ }
8
+
9
+ .panneau-open-bOtJNo:hover {
10
+ color: var(--panneau-color-text);
11
+ }
@@ -0,0 +1,16 @@
1
+ import type { FieldEntryProps } from '../shared/types';
2
+ import { type TextFieldProps } from '../text/TextField';
3
+ export interface UrlFieldProps extends Omit<TextFieldProps, 'type' | 'inputMode' | 'suffix'> {
4
+ /** Scheme added on blur to a URL without one (`example.com`). Defaults to `https://`. */
5
+ defaultScheme?: string;
6
+ }
7
+ /** Adds a scheme to a URL that has none, and isn't a path or an anchor. */
8
+ export declare function withScheme(url: string, scheme?: string): string;
9
+ /**
10
+ * A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme
11
+ * gets `https://` on blur, as v4 did.
12
+ */
13
+ export declare function UrlField({ value, onChange, onBlur, defaultScheme, ...props }: UrlFieldProps): import("react").JSX.Element;
14
+ /** The `url` type: setting `defaultScheme`. */
15
+ export declare function UrlFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
16
+ //# sourceMappingURL=UrlField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UrlField.d.ts","sourceRoot":"","sources":["../../src/url/UrlField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,EAAa,KAAK,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGnE,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,CAAC;IACxF,yFAAyF;IACzF,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAID,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAa,GAAG,MAAM,CASnE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EACrB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,aAA0B,EAC1B,GAAG,KAAK,EACX,EAAE,aAAa,+BAmCf;AAED,+CAA+C;AAC/C,wBAAgB,aAAa,CAAC,KAAK,EAAE,eAAe,+BAUnD"}
@@ -0,0 +1,94 @@
1
+ import { getFieldProps, getSetting, isString } from "../shared/entry.js";
2
+ import { messages } from "../shared/messages.js";
3
+ import { TextField } from "../text/TextField.js";
4
+ import UrlField_module_default from "./UrlField.module.js";
5
+ import { c } from "react/compiler-runtime";
6
+ import { Icon, usePanneauIntl } from "@panneau/ui";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { ExternalLink } from "lucide-react";
9
+ //#region src/url/UrlField.tsx
10
+ var SCHEME = /^[a-z][a-z0-9+.-]*:/i;
11
+ /** Adds a scheme to a URL that has none, and isn't a path or an anchor. */
12
+ function withScheme(url, scheme = "https://") {
13
+ const trimmed = url.trim();
14
+ if (trimmed.startsWith("//")) return `${scheme}${trimmed.slice(2)}`;
15
+ if (trimmed === "" || SCHEME.test(trimmed) || /^[/#?]/.test(trimmed)) return trimmed;
16
+ return `${scheme}${trimmed}`;
17
+ }
18
+ /**
19
+ * A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme
20
+ * gets `https://` on blur, as v4 did.
21
+ */
22
+ function UrlField({ value, onChange, onBlur, defaultScheme = "https://", ...props }) {
23
+ const intl = usePanneauIntl();
24
+ const openable = value !== null && value !== void 0 && /^https?:\/\//i.test(value);
25
+ return /* @__PURE__ */ jsx(TextField, {
26
+ autoComplete: "off",
27
+ ...props,
28
+ type: "url",
29
+ inputMode: "url",
30
+ value,
31
+ onChange,
32
+ onBlur: () => {
33
+ if (value !== null && value !== void 0) {
34
+ const next = withScheme(value, defaultScheme);
35
+ if (next !== value) onChange?.(next === "" ? null : next);
36
+ }
37
+ onBlur?.();
38
+ },
39
+ suffix: openable ? /* @__PURE__ */ jsx("a", {
40
+ href: value,
41
+ target: "_blank",
42
+ rel: "noopener noreferrer",
43
+ className: UrlField_module_default.open,
44
+ title: intl.formatMessage(messages.openLink),
45
+ children: /* @__PURE__ */ jsx(Icon, {
46
+ icon: ExternalLink,
47
+ label: intl.formatMessage(messages.openLink)
48
+ })
49
+ }) : void 0
50
+ });
51
+ }
52
+ /** The `url` type: setting `defaultScheme`. */
53
+ function UrlFieldEntry(props) {
54
+ const $ = c(11);
55
+ let t0;
56
+ if ($[0] !== props.field) {
57
+ t0 = getSetting(props.field, "defaultScheme", isString);
58
+ $[0] = props.field;
59
+ $[1] = t0;
60
+ } else t0 = $[1];
61
+ const defaultScheme = t0;
62
+ let t1;
63
+ if ($[2] !== props) {
64
+ t1 = getFieldProps(props);
65
+ $[2] = props;
66
+ $[3] = t1;
67
+ } else t1 = $[3];
68
+ const t2 = isString(props.value) ? props.value : null;
69
+ let t3;
70
+ if ($[4] !== defaultScheme) {
71
+ t3 = defaultScheme !== void 0 ? { defaultScheme } : {};
72
+ $[4] = defaultScheme;
73
+ $[5] = t3;
74
+ } else t3 = $[5];
75
+ let t4;
76
+ if ($[6] !== props.onChange || $[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
77
+ t4 = /* @__PURE__ */ jsx(UrlField, {
78
+ ...t1,
79
+ value: t2,
80
+ onChange: props.onChange,
81
+ ...t3
82
+ });
83
+ $[6] = props.onChange;
84
+ $[7] = t1;
85
+ $[8] = t2;
86
+ $[9] = t3;
87
+ $[10] = t4;
88
+ } else t4 = $[10];
89
+ return t4;
90
+ }
91
+ //#endregion
92
+ export { UrlField, UrlFieldEntry, withScheme };
93
+
94
+ //# sourceMappingURL=UrlField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UrlField.js","names":["styles","_c"],"sources":["../../src/url/UrlField.tsx"],"sourcesContent":["import { ExternalLink } from 'lucide-react';\n\nimport { Icon, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps } from '../shared/types';\nimport { TextField, type TextFieldProps } from '../text/TextField';\nimport styles from './UrlField.module.css';\n\nexport interface UrlFieldProps extends Omit<TextFieldProps, 'type' | 'inputMode' | 'suffix'> {\n /** Scheme added on blur to a URL without one (`example.com`). Defaults to `https://`. */\n defaultScheme?: string;\n}\n\nconst SCHEME = /^[a-z][a-z0-9+.-]*:/i;\n\n/** Adds a scheme to a URL that has none, and isn't a path or an anchor. */\nexport function withScheme(url: string, scheme = 'https://'): string {\n const trimmed = url.trim();\n if (trimmed.startsWith('//')) {\n return `${scheme}${trimmed.slice(2)}`;\n }\n if (trimmed === '' || SCHEME.test(trimmed) || /^[/#?]/.test(trimmed)) {\n return trimmed;\n }\n return `${scheme}${trimmed}`;\n}\n\n/**\n * A URL, with the URL keyboard on phones and a link to open it. A URL typed without a scheme\n * gets `https://` on blur, as v4 did.\n */\nexport function UrlField({\n value,\n onChange,\n onBlur,\n defaultScheme = 'https://',\n ...props\n}: UrlFieldProps) {\n const intl = usePanneauIntl();\n const openable = value !== null && value !== undefined && /^https?:\\/\\//i.test(value);\n return (\n <TextField\n autoComplete=\"off\"\n {...props}\n type=\"url\"\n inputMode=\"url\"\n value={value}\n onChange={onChange}\n onBlur={() => {\n if (value !== null && value !== undefined) {\n const next = withScheme(value, defaultScheme);\n if (next !== value) {\n onChange?.(next === '' ? null : next);\n }\n }\n onBlur?.();\n }}\n suffix={\n openable ? (\n <a\n href={value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className={styles.open}\n title={intl.formatMessage(messages.openLink)}\n >\n <Icon icon={ExternalLink} label={intl.formatMessage(messages.openLink)} />\n </a>\n ) : undefined\n }\n />\n );\n}\n\n/** The `url` type: setting `defaultScheme`. */\nexport function UrlFieldEntry(props: FieldEntryProps) {\n const defaultScheme = getSetting(props.field, 'defaultScheme', isString);\n return (\n <UrlField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(defaultScheme !== undefined ? { defaultScheme } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;;;AAeA,IAAM,SAAS;;AAGf,SAAgB,WAAW,KAAa,SAAS,YAAoB;CACjE,MAAM,UAAU,IAAI,KAAK;CACzB,IAAI,QAAQ,WAAW,IAAI,GACvB,OAAO,GAAG,SAAS,QAAQ,MAAM,CAAC;CAEtC,IAAI,YAAY,MAAM,OAAO,KAAK,OAAO,KAAK,SAAS,KAAK,OAAO,GAC/D,OAAO;CAEX,OAAO,GAAG,SAAS;AACvB;;;;;AAMA,SAAgB,SAAS,EACrB,OACA,UACA,QACA,gBAAgB,YAChB,GAAG,SACW;CACd,MAAM,OAAO,eAAe;CAC5B,MAAM,WAAW,UAAU,QAAQ,UAAU,KAAA,KAAa,gBAAgB,KAAK,KAAK;CACpF,OACI,oBAAC,WAAD;EACI,cAAa;EACb,GAAI;EACJ,MAAK;EACL,WAAU;EACH;EACG;EACV,cAAc;GACV,IAAI,UAAU,QAAQ,UAAU,KAAA,GAAW;IACvC,MAAM,OAAO,WAAW,OAAO,aAAa;IAC5C,IAAI,SAAS,OACT,WAAW,SAAS,KAAK,OAAO,IAAI;GAE5C;GACA,SAAS;EACb;EACA,QACI,WACI,oBAAC,KAAD;GACI,MAAM;GACN,QAAO;GACP,KAAI;GACJ,WAAWA,wBAAO;GAClB,OAAO,KAAK,cAAc,SAAS,QAAQ;GAE3C,UAAA,oBAAC,MAAD;IAAM,MAAM;IAAc,OAAO,KAAK,cAAc,SAAS,QAAQ;GAAE,CAAA;EACxE,CAAA,IACH,KAAA;CACP,CAAA;AAGb;;AAGA,SAAO,cAAA,OAAA;CAAA,MAAA,IAAAC,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,OAAA;EACmB,KAAA,WAAW,MAAK,OAAQ,iBAAiB,QAAQ;EAAC,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAxE,MAAA,gBAAsB;CAAmD,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAG7D,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,eAAA;EAE5C,KAAA,kBAAkB,KAAA,IAAlB,EAAA,cAAmD,IAAnD,CAAmD;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;EAJ7D,KAAA,oBAAC,UAAD;GAAS,GACD;GACG,OAAA;GACG,UAAA,MAAK;GAAS,GACnB;EAAoD,CAAA;EAC3D,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,8 @@
1
+ import "./UrlField.css";
2
+ //#region src/url/UrlField.module.css
3
+ var open = "panneau-open-bOtJNo";
4
+ var UrlField_module_default = { open };
5
+ //#endregion
6
+ export { UrlField_module_default as default, open };
7
+
8
+ //# sourceMappingURL=UrlField.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UrlField.module.js","names":[],"sources":["../../src/url/UrlField.module.css"],"sourcesContent":[".open {\n display: inline-flex;\n align-items: center;\n padding: var(--panneau-space-1);\n color: var(--panneau-color-text-muted);\n border-radius: var(--panneau-radius-sm);\n}\n\n.open:hover {\n color: var(--panneau-color-text);\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { UrlField, UrlFieldEntry, type UrlFieldProps, withScheme } from './UrlField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/url/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,KAAK,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { UrlField, UrlFieldEntry, withScheme } from "./UrlField.js";
package/package.json CHANGED
@@ -1,101 +1,130 @@
1
1
  {
2
2
  "name": "@panneau/fields",
3
- "version": "4.1.1",
4
- "description": "",
5
- "keywords": [
6
- "javascript"
7
- ],
8
- "homepage": "https://github.com/folkloreinc/panneau-js",
3
+ "version": "5.0.0-alpha.0",
4
+ "description": "Controlled field components of Panneau for the protocol's built-in field types, one subpath per field.",
5
+ "type": "module",
6
+ "license": "MIT",
9
7
  "repository": {
10
8
  "type": "git",
11
- "url": "git+https://github.com/folkloreinc/panneau-js.git"
9
+ "url": "git+https://github.com/folkloreinc/panneau-js.git",
10
+ "directory": "packages/fields"
12
11
  },
13
- "license": "ISC",
14
- "author": {
15
- "name": "Folklore",
16
- "email": "info@folklore.email"
17
- },
18
- "contributors": [
19
- {
20
- "name": "David Mongeau-Petitpas",
21
- "email": "dmp@folklore.email"
22
- },
23
- {
24
- "name": "Nicolas Roy-Bourdages",
25
- "email": "nrb@folklore.email"
26
- },
27
- {
28
- "name": "Julien Carignan",
29
- "email": "jc@folklore.email"
30
- },
31
- {
32
- "name": "Théo Gjini",
33
- "email": "tg@folklore.email"
34
- }
35
- ],
36
12
  "sideEffects": [
37
- "**/*.css"
13
+ "*.css"
38
14
  ],
39
- "type": "module",
40
15
  "exports": {
41
16
  ".": {
17
+ "@panneau/source": "./src/index.ts",
42
18
  "types": "./dist/index.d.ts",
43
- "style": "./assets/css/styles.css",
44
19
  "default": "./dist/index.js"
45
20
  },
46
- "./assets/css/styles": "./assets/css/styles.css",
47
- "./assets/css/styles.css": "./assets/css/styles.css"
21
+ "./text": {
22
+ "@panneau/source": "./src/text/index.ts",
23
+ "types": "./dist/text/index.d.ts",
24
+ "default": "./dist/text/index.js"
25
+ },
26
+ "./textarea": {
27
+ "@panneau/source": "./src/textarea/index.ts",
28
+ "types": "./dist/textarea/index.d.ts",
29
+ "default": "./dist/textarea/index.js"
30
+ },
31
+ "./number": {
32
+ "@panneau/source": "./src/number/index.ts",
33
+ "types": "./dist/number/index.d.ts",
34
+ "default": "./dist/number/index.js"
35
+ },
36
+ "./boolean": {
37
+ "@panneau/source": "./src/boolean/index.ts",
38
+ "types": "./dist/boolean/index.d.ts",
39
+ "default": "./dist/boolean/index.js"
40
+ },
41
+ "./date": {
42
+ "@panneau/source": "./src/date/index.ts",
43
+ "types": "./dist/date/index.d.ts",
44
+ "default": "./dist/date/index.js"
45
+ },
46
+ "./datetime": {
47
+ "@panneau/source": "./src/datetime/index.ts",
48
+ "types": "./dist/datetime/index.d.ts",
49
+ "default": "./dist/datetime/index.js"
50
+ },
51
+ "./time": {
52
+ "@panneau/source": "./src/time/index.ts",
53
+ "types": "./dist/time/index.d.ts",
54
+ "default": "./dist/time/index.js"
55
+ },
56
+ "./select": {
57
+ "@panneau/source": "./src/select/index.ts",
58
+ "types": "./dist/select/index.d.ts",
59
+ "default": "./dist/select/index.js"
60
+ },
61
+ "./email": {
62
+ "@panneau/source": "./src/email/index.ts",
63
+ "types": "./dist/email/index.d.ts",
64
+ "default": "./dist/email/index.js"
65
+ },
66
+ "./url": {
67
+ "@panneau/source": "./src/url/index.ts",
68
+ "types": "./dist/url/index.d.ts",
69
+ "default": "./dist/url/index.js"
70
+ },
71
+ "./color": {
72
+ "@panneau/source": "./src/color/index.ts",
73
+ "types": "./dist/color/index.d.ts",
74
+ "default": "./dist/color/index.js"
75
+ },
76
+ "./slug": {
77
+ "@panneau/source": "./src/slug/index.ts",
78
+ "types": "./dist/slug/index.d.ts",
79
+ "default": "./dist/slug/index.js"
80
+ },
81
+ "./localized": {
82
+ "@panneau/source": "./src/localized/index.ts",
83
+ "types": "./dist/localized/index.d.ts",
84
+ "default": "./dist/localized/index.js"
85
+ },
86
+ "./group": {
87
+ "@panneau/source": "./src/group/index.ts",
88
+ "types": "./dist/group/index.d.ts",
89
+ "default": "./dist/group/index.js"
90
+ },
91
+ "./repeater": {
92
+ "@panneau/source": "./src/repeater/index.ts",
93
+ "types": "./dist/repeater/index.d.ts",
94
+ "default": "./dist/repeater/index.js"
95
+ },
96
+ "./relation": {
97
+ "@panneau/source": "./src/relation/index.ts",
98
+ "types": "./dist/relation/index.d.ts",
99
+ "default": "./dist/relation/index.js"
100
+ },
101
+ "./locales": {
102
+ "@panneau/source": "./src/locales/index.ts",
103
+ "types": "./dist/locales/index.d.ts",
104
+ "default": "./dist/locales/index.js"
105
+ },
106
+ "./package.json": "./package.json"
48
107
  },
49
- "module": "dist/index.js",
50
- "types": "dist/index.d.ts",
51
- "style": "assets/css/styles.css",
52
108
  "files": [
53
- "dist",
54
- "assets"
109
+ "dist"
55
110
  ],
56
111
  "scripts": {
57
- "build": "../../scripts/prepare-package.sh --types && npm run css",
58
- "css": "../../scripts/build-packages-styles.js --pattern='@panneau/field-*' ./src/styles.css.ejs ./assets/css/styles.css",
59
- "prepublishOnly": "npm run build"
60
- },
61
- "dependencies": {
62
- "@babel/runtime": "^7.28.6",
63
- "@panneau/core": "^4.1.1",
64
- "@panneau/field-autocomplete": "^4.1.1",
65
- "@panneau/field-checkboxes": "^4.1.1",
66
- "@panneau/field-color": "^4.1.1",
67
- "@panneau/field-date": "^4.1.1",
68
- "@panneau/field-display": "^4.1.1",
69
- "@panneau/field-embed": "^4.1.1",
70
- "@panneau/field-fields": "^4.1.1",
71
- "@panneau/field-html": "^4.1.1",
72
- "@panneau/field-import": "^4.1.1",
73
- "@panneau/field-input-group": "^4.1.1",
74
- "@panneau/field-item": "^4.1.1",
75
- "@panneau/field-items": "^4.1.1",
76
- "@panneau/field-localized": "^4.1.1",
77
- "@panneau/field-media": "^4.1.1",
78
- "@panneau/field-number": "^4.1.1",
79
- "@panneau/field-radios": "^4.1.1",
80
- "@panneau/field-resource-item": "^4.1.1",
81
- "@panneau/field-select": "^4.1.1",
82
- "@panneau/field-text": "^4.1.1",
83
- "@panneau/field-toggle": "^4.1.1",
84
- "@panneau/field-toggles": "^4.1.1",
85
- "@panneau/field-upload": "^4.1.1",
86
- "@panneau/field-url": "^4.1.1",
87
- "lodash-es": "^4.17.21"
112
+ "build": "vite build && tsc -p tsconfig.build.json",
113
+ "typecheck": "tsc --noEmit",
114
+ "api": "tsc -p tsconfig.build.json && node ../../scripts/api-report.js"
88
115
  },
89
- "devDependencies": {
90
- "react": "^19.2.0",
91
- "react-dom": "^19.0.0"
116
+ "publishConfig": {
117
+ "access": "public"
92
118
  },
93
119
  "peerDependencies": {
94
120
  "react": "^19.2.0",
95
- "react-dom": "^19.0.0"
121
+ "react-intl": "^12.0.0"
96
122
  },
97
- "publishConfig": {
98
- "access": "public"
99
- },
100
- "gitHead": "28b394278cffa0c927989873dd4b3f184635ceff"
123
+ "dependencies": {
124
+ "@internationalized/date": "^3.12.4",
125
+ "@panneau/intl": "5.0.0-alpha.0",
126
+ "@panneau/protocol": "5.0.0-alpha.0",
127
+ "@panneau/ui": "5.0.0-alpha.0",
128
+ "lucide-react": "^1.57.0"
129
+ }
101
130
  }
@@ -1,14 +0,0 @@
1
- @import url('@panneau/field-autocomplete');
2
- @import url('@panneau/field-checkboxes');
3
- @import url('@panneau/field-color');
4
- @import url('@panneau/field-date');
5
- @import url('@panneau/field-html');
6
- @import url('@panneau/field-import');
7
- @import url('@panneau/field-input-group');
8
- @import url('@panneau/field-media');
9
- @import url('@panneau/field-number');
10
- @import url('@panneau/field-text');
11
- @import url('@panneau/field-toggle');
12
- @import url('@panneau/field-toggles');
13
- @import url('@panneau/field-upload');
14
-