@panneau/fields 4.1.1 → 5.0.0-alpha.1

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 +74 -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 +48 -0
  83. package/dist/relation/RelationField.d.ts.map +1 -0
  84. package/dist/relation/RelationField.js +328 -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 +73 -0
  139. package/dist/shared/relation.d.ts.map +1 -0
  140. package/dist/shared/relation.js +156 -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,179 @@
1
+ import { getFieldProps, getRuleNumber, getSetting, isString } from "../shared/entry.js";
2
+ import { messages } from "../shared/messages.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { TextInput, usePanneauIntl } from "@panneau/ui";
5
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ //#region src/text/TextField.tsx
7
+ /** The description of a text field, with its character count. */
8
+ function useCountedDescription(description, value, maxLength) {
9
+ const $ = c(9);
10
+ const intl = usePanneauIntl();
11
+ if (maxLength === void 0) return description;
12
+ let t0;
13
+ if ($[0] !== intl || $[1] !== maxLength || $[2] !== value) {
14
+ t0 = intl.formatMessage(messages.characterCount, {
15
+ count: (value ?? "").length,
16
+ max: maxLength
17
+ });
18
+ $[0] = intl;
19
+ $[1] = maxLength;
20
+ $[2] = value;
21
+ $[3] = t0;
22
+ } else t0 = $[3];
23
+ const count = t0;
24
+ if (description === void 0 || description === null) return count;
25
+ let t1;
26
+ if ($[4] !== count) {
27
+ t1 = /* @__PURE__ */ jsx("span", { children: count });
28
+ $[4] = count;
29
+ $[5] = t1;
30
+ } else t1 = $[5];
31
+ let t2;
32
+ if ($[6] !== description || $[7] !== t1) {
33
+ t2 = /* @__PURE__ */ jsxs(Fragment, { children: [
34
+ description,
35
+ " ",
36
+ t1
37
+ ] });
38
+ $[6] = description;
39
+ $[7] = t1;
40
+ $[8] = t2;
41
+ } else t2 = $[8];
42
+ return t2;
43
+ }
44
+ /** A single-line text. An empty text is `null`. */
45
+ function TextField(t0) {
46
+ const $ = c(19);
47
+ let description;
48
+ let disabled;
49
+ let maxLength;
50
+ let onChange;
51
+ let props;
52
+ let readOnly;
53
+ let required;
54
+ let value;
55
+ if ($[0] !== t0) {
56
+ ({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
57
+ $[0] = t0;
58
+ $[1] = description;
59
+ $[2] = disabled;
60
+ $[3] = maxLength;
61
+ $[4] = onChange;
62
+ $[5] = props;
63
+ $[6] = readOnly;
64
+ $[7] = required;
65
+ $[8] = value;
66
+ } else {
67
+ description = $[1];
68
+ disabled = $[2];
69
+ maxLength = $[3];
70
+ onChange = $[4];
71
+ props = $[5];
72
+ readOnly = $[6];
73
+ required = $[7];
74
+ value = $[8];
75
+ }
76
+ const shownDescription = useCountedDescription(description, value, maxLength);
77
+ const t1 = value ?? "";
78
+ let t2;
79
+ if ($[9] !== onChange) {
80
+ t2 = (next) => onChange?.(next === "" ? null : next);
81
+ $[9] = onChange;
82
+ $[10] = t2;
83
+ } else t2 = $[10];
84
+ let t3;
85
+ if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
86
+ t3 = /* @__PURE__ */ jsx(TextInput, {
87
+ ...props,
88
+ value: t1,
89
+ onChange: t2,
90
+ description: shownDescription,
91
+ isDisabled: disabled,
92
+ isReadOnly: readOnly,
93
+ isRequired: required
94
+ });
95
+ $[11] = disabled;
96
+ $[12] = props;
97
+ $[13] = readOnly;
98
+ $[14] = required;
99
+ $[15] = shownDescription;
100
+ $[16] = t1;
101
+ $[17] = t2;
102
+ $[18] = t3;
103
+ } else t3 = $[18];
104
+ return t3;
105
+ }
106
+ /** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
107
+ function TextFieldEntry(props) {
108
+ const $ = c(21);
109
+ const { field } = props;
110
+ let t0;
111
+ if ($[0] !== field) {
112
+ t0 = getSetting(field, "prefix", isString);
113
+ $[0] = field;
114
+ $[1] = t0;
115
+ } else t0 = $[1];
116
+ const prefix = t0;
117
+ let t1;
118
+ if ($[2] !== field) {
119
+ t1 = getSetting(field, "suffix", isString);
120
+ $[2] = field;
121
+ $[3] = t1;
122
+ } else t1 = $[3];
123
+ const suffix = t1;
124
+ let t2;
125
+ if ($[4] !== field) {
126
+ t2 = getRuleNumber(field, "max");
127
+ $[4] = field;
128
+ $[5] = t2;
129
+ } else t2 = $[5];
130
+ const max = t2;
131
+ let t3;
132
+ if ($[6] !== props) {
133
+ t3 = getFieldProps(props);
134
+ $[6] = props;
135
+ $[7] = t3;
136
+ } else t3 = $[7];
137
+ const t4 = isString(props.value) ? props.value : null;
138
+ let t5;
139
+ if ($[8] !== max) {
140
+ t5 = max !== void 0 ? { maxLength: max } : {};
141
+ $[8] = max;
142
+ $[9] = t5;
143
+ } else t5 = $[9];
144
+ let t6;
145
+ if ($[10] !== prefix) {
146
+ t6 = prefix !== void 0 ? { prefix } : {};
147
+ $[10] = prefix;
148
+ $[11] = t6;
149
+ } else t6 = $[11];
150
+ let t7;
151
+ if ($[12] !== suffix) {
152
+ t7 = suffix !== void 0 ? { suffix } : {};
153
+ $[12] = suffix;
154
+ $[13] = t7;
155
+ } else t7 = $[13];
156
+ let t8;
157
+ if ($[14] !== props.onChange || $[15] !== t3 || $[16] !== t4 || $[17] !== t5 || $[18] !== t6 || $[19] !== t7) {
158
+ t8 = /* @__PURE__ */ jsx(TextField, {
159
+ ...t3,
160
+ value: t4,
161
+ onChange: props.onChange,
162
+ ...t5,
163
+ ...t6,
164
+ ...t7
165
+ });
166
+ $[14] = props.onChange;
167
+ $[15] = t3;
168
+ $[16] = t4;
169
+ $[17] = t5;
170
+ $[18] = t6;
171
+ $[19] = t7;
172
+ $[20] = t8;
173
+ } else t8 = $[20];
174
+ return t8;
175
+ }
176
+ //#endregion
177
+ export { TextField, TextFieldEntry, useCountedDescription };
178
+
179
+ //# sourceMappingURL=TextField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextField.js","names":["count","description","shownDescription","disabled","readOnly","required","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextInput\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n />\n );\n}\n"],"mappings":";;;;;;;AAyBA,SAAO,sBAAA,aAAA,OAAA,WAAA;CAAA,MAAA,IAAAM,EAAA,CAAA;CAKH,MAAA,OAAa,eAAe;CAC5B,IAAI,cAAc,KAAA,GAAS,OAChB;CACV,IAAA;CAAA,IAAA,EAAA,OAAA,QAAA,EAAA,OAAA,aAAA,EAAA,OAAA,OAAA;EACa,KAAA,KAAI,cAAe,SAAQ,gBAAiB;GAAA,QAC9C,SAAA,GAAA,CAAW;GAAQ,KACtB;EACT,CAAC;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAHF,MAAA,QAAc;CAId,IAAI,gBAAgB,KAAA,KAAa,gBAAgB,MAAI,OAC1C;CACV,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGqB,KAAA,oBAAA,QAAA,EAAA,UAAO,MAAa,CAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,eAAA,EAAA,OAAA,IAAA;EADtC,KAAA,qBAAAC,UAAA,EAAA,UAAA;GACK;GAAY;GAAC;EAAoB,EAAA,CAAA;EACnC,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAFH;AAEG;;AAKX,SAAO,UAAA,IAAA;CAAA,MAAA,IAAAD,EAAA,EAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,IAAA;EAAmB,CAAA,CAAA,OAAA,UAAA,aAAA,WAAA,UAAA,UAAA,UAAA,GAAA,SAAA;EAST,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA;EAAA,cAAA,EAAA;EAAA,WAAA,EAAA;EAAA,YAAA,EAAA;EAAA,WAAA,EAAA;EAAA,QAAA,EAAA;EAAA,WAAA,EAAA;EAAA,WAAA,EAAA;EAAA,QAAA,EAAA;CAAA;CACb,MAAA,mBAAyB,sBAAsB,aAAa,OAAO,SAAS;CAI7D,MAAA,KAAA,SAAA;CAAW,IAAA;CAAA,IAAA,EAAA,OAAA,UAAA;EACR,MAAA,SAAU,WAAW,SAAS,KAAT,OAAA,IAAyB;EAAC,EAAA,KAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,YAAA,EAAA,QAAA,SAAA,EAAA,QAAA,YAAA,EAAA,QAAA,YAAA,EAAA,QAAA,oBAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAH7D,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA;GACGJ,aAAA;GACDC,YAAA;GACAC,YAAA;GACAC,YAAA;EAAQ,CAAA;EACtB,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OARF;AAQE;;AAKV,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAC,EAAA,EAAA;CACH,MAAA,EAAA,UAAkB;CAAM,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACT,KAAA,WAAW,OAAO,UAAU,QAAQ;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAApD,MAAA,SAAe;CAAsC,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACtC,KAAA,WAAW,OAAO,UAAU,QAAQ;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAApD,MAAA,SAAe;CAAsC,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EACzC,KAAA,cAAc,OAAO,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAvC,MAAA,MAAY;CAA4B,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAG5B,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,KAAA;EAE5C,KAAA,QAAQ,KAAA,IAAR,EAAA,WAAiC,IAAS,IAA1C,CAA0C;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA;EAC3C,KAAA,WAAW,KAAA,IAAX,EAAA,OAAqC,IAArC,CAAqC;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,QAAA;EACtC,KAAA,WAAW,KAAA,IAAX,EAAA,OAAqC,IAArC,CAAqC;EAAC,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,IAAA;CAAA,IAAA,EAAA,QAAA,MAAA,YAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,MAAA,EAAA,QAAA,IAAA;EAN/C,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GAAS,GACnB;GAA2C,GAC3C;GAAsC,GACtC;EAAsC,CAAA;EAC7C,EAAA,MAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;EAAA,EAAA,MAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OAPF;AAOE"}
@@ -0,0 +1,2 @@
1
+ export { TextField, TextFieldEntry, type TextFieldProps } from './TextField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/text/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export { TextField, TextFieldEntry } from "./TextField.js";
@@ -0,0 +1,14 @@
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
2
+ export interface TextAreaFieldProps extends FieldProps<string> {
3
+ placeholder?: string;
4
+ /** Shows a count of characters against this maximum. It doesn't stop typing. */
5
+ maxLength?: number;
6
+ /** Visible lines. Defaults to 4. */
7
+ rows?: number;
8
+ textAreaClassName?: string;
9
+ }
10
+ /** A text of several lines. An empty text is `null`. */
11
+ export declare function TextAreaField({ value, onChange, description, maxLength, disabled, readOnly, required, ...props }: TextAreaFieldProps): import("react").JSX.Element;
12
+ /** The `textarea` type: setting `rows`, and a character count from the `max` rule. */
13
+ export declare function TextAreaFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=TextAreaField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextAreaField.d.ts","sourceRoot":"","sources":["../../src/textarea/TextAreaField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,MAAM,CAAC;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,kBAAkB,+BAapB;AAED,sFAAsF;AACtF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAYxD"}
@@ -0,0 +1,126 @@
1
+ import { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from "../shared/entry.js";
2
+ import { useCountedDescription } from "../text/TextField.js";
3
+ import { c } from "react/compiler-runtime";
4
+ import { TextArea } from "@panneau/ui";
5
+ import { jsx } from "react/jsx-runtime";
6
+ //#region src/textarea/TextAreaField.tsx
7
+ /** A text of several lines. An empty text is `null`. */
8
+ function TextAreaField(t0) {
9
+ const $ = c(19);
10
+ let description;
11
+ let disabled;
12
+ let maxLength;
13
+ let onChange;
14
+ let props;
15
+ let readOnly;
16
+ let required;
17
+ let value;
18
+ if ($[0] !== t0) {
19
+ ({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
20
+ $[0] = t0;
21
+ $[1] = description;
22
+ $[2] = disabled;
23
+ $[3] = maxLength;
24
+ $[4] = onChange;
25
+ $[5] = props;
26
+ $[6] = readOnly;
27
+ $[7] = required;
28
+ $[8] = value;
29
+ } else {
30
+ description = $[1];
31
+ disabled = $[2];
32
+ maxLength = $[3];
33
+ onChange = $[4];
34
+ props = $[5];
35
+ readOnly = $[6];
36
+ required = $[7];
37
+ value = $[8];
38
+ }
39
+ const shownDescription = useCountedDescription(description, value, maxLength);
40
+ const t1 = value ?? "";
41
+ let t2;
42
+ if ($[9] !== onChange) {
43
+ t2 = (next) => onChange?.(next === "" ? null : next);
44
+ $[9] = onChange;
45
+ $[10] = t2;
46
+ } else t2 = $[10];
47
+ let t3;
48
+ if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
49
+ t3 = /* @__PURE__ */ jsx(TextArea, {
50
+ ...props,
51
+ value: t1,
52
+ onChange: t2,
53
+ description: shownDescription,
54
+ isDisabled: disabled,
55
+ isReadOnly: readOnly,
56
+ isRequired: required
57
+ });
58
+ $[11] = disabled;
59
+ $[12] = props;
60
+ $[13] = readOnly;
61
+ $[14] = required;
62
+ $[15] = shownDescription;
63
+ $[16] = t1;
64
+ $[17] = t2;
65
+ $[18] = t3;
66
+ } else t3 = $[18];
67
+ return t3;
68
+ }
69
+ /** The `textarea` type: setting `rows`, and a character count from the `max` rule. */
70
+ function TextAreaFieldEntry(props) {
71
+ const $ = c(16);
72
+ let t0;
73
+ if ($[0] !== props.field) {
74
+ t0 = getRuleNumber(props.field, "max");
75
+ $[0] = props.field;
76
+ $[1] = t0;
77
+ } else t0 = $[1];
78
+ const max = t0;
79
+ let t1;
80
+ if ($[2] !== props.field) {
81
+ t1 = getSetting(props.field, "rows", isNumber);
82
+ $[2] = props.field;
83
+ $[3] = t1;
84
+ } else t1 = $[3];
85
+ const rows = t1;
86
+ let t2;
87
+ if ($[4] !== props) {
88
+ t2 = getFieldProps(props);
89
+ $[4] = props;
90
+ $[5] = t2;
91
+ } else t2 = $[5];
92
+ const t3 = isString(props.value) ? props.value : null;
93
+ let t4;
94
+ if ($[6] !== max) {
95
+ t4 = max !== void 0 ? { maxLength: max } : {};
96
+ $[6] = max;
97
+ $[7] = t4;
98
+ } else t4 = $[7];
99
+ let t5;
100
+ if ($[8] !== rows) {
101
+ t5 = rows !== void 0 ? { rows } : {};
102
+ $[8] = rows;
103
+ $[9] = t5;
104
+ } else t5 = $[9];
105
+ let t6;
106
+ if ($[10] !== props.onChange || $[11] !== t2 || $[12] !== t3 || $[13] !== t4 || $[14] !== t5) {
107
+ t6 = /* @__PURE__ */ jsx(TextAreaField, {
108
+ ...t2,
109
+ value: t3,
110
+ onChange: props.onChange,
111
+ ...t4,
112
+ ...t5
113
+ });
114
+ $[10] = props.onChange;
115
+ $[11] = t2;
116
+ $[12] = t3;
117
+ $[13] = t4;
118
+ $[14] = t5;
119
+ $[15] = t6;
120
+ } else t6 = $[15];
121
+ return t6;
122
+ }
123
+ //#endregion
124
+ export { TextAreaField, TextAreaFieldEntry };
125
+
126
+ //# sourceMappingURL=TextAreaField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextAreaField.js","names":["shownDescription","disabled","readOnly","required","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -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";