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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/README.md +34 -0
  2. package/dist/boolean/BooleanField.js +78 -17
  3. package/dist/boolean/BooleanField.js.map +1 -1
  4. package/dist/color/ColorField.js.map +1 -1
  5. package/dist/date/DateField.js.map +1 -1
  6. package/dist/datetime/DateTimeField.js +107 -20
  7. package/dist/datetime/DateTimeField.js.map +1 -1
  8. package/dist/duration/DurationField.css +11 -0
  9. package/dist/duration/DurationField.d.ts +26 -0
  10. package/dist/duration/DurationField.d.ts.map +1 -0
  11. package/dist/duration/DurationField.js +214 -0
  12. package/dist/duration/DurationField.js.map +1 -0
  13. package/dist/duration/DurationField.module.js +12 -0
  14. package/dist/duration/DurationField.module.js.map +1 -0
  15. package/dist/duration/index.d.ts +2 -0
  16. package/dist/duration/index.d.ts.map +1 -0
  17. package/dist/duration/index.js +1 -0
  18. package/dist/email/EmailField.js.map +1 -1
  19. package/dist/embed/EmbedField.css +60 -0
  20. package/dist/embed/EmbedField.d.ts +20 -0
  21. package/dist/embed/EmbedField.d.ts.map +1 -0
  22. package/dist/embed/EmbedField.js +246 -0
  23. package/dist/embed/EmbedField.js.map +1 -0
  24. package/dist/embed/EmbedField.module.js +22 -0
  25. package/dist/embed/EmbedField.module.js.map +1 -0
  26. package/dist/embed/index.d.ts +3 -0
  27. package/dist/embed/index.d.ts.map +1 -0
  28. package/dist/embed/index.js +3 -0
  29. package/dist/file/FileField.d.ts.map +1 -1
  30. package/dist/file/FileField.js +167 -77
  31. package/dist/file/FileField.js.map +1 -1
  32. package/dist/group/GroupField.js.map +1 -1
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -1
  36. package/dist/json/JsonField.css +7 -0
  37. package/dist/json/JsonField.d.ts +22 -0
  38. package/dist/json/JsonField.d.ts.map +1 -0
  39. package/dist/json/JsonField.js +207 -0
  40. package/dist/json/JsonField.js.map +1 -0
  41. package/dist/json/JsonField.module.js +8 -0
  42. package/dist/json/JsonField.module.js.map +1 -0
  43. package/dist/json/index.d.ts +2 -0
  44. package/dist/json/index.d.ts.map +1 -0
  45. package/dist/json/index.js +1 -0
  46. package/dist/locales/index.js.map +1 -1
  47. package/dist/localized/LocalizedField.js.map +1 -1
  48. package/dist/location/LocationField.css +54 -0
  49. package/dist/location/LocationField.d.ts +31 -0
  50. package/dist/location/LocationField.d.ts.map +1 -0
  51. package/dist/location/LocationField.js +563 -0
  52. package/dist/location/LocationField.js.map +1 -0
  53. package/dist/location/LocationField.module.js +22 -0
  54. package/dist/location/LocationField.module.js.map +1 -0
  55. package/dist/location/LocationMap.d.ts +25 -0
  56. package/dist/location/LocationMap.d.ts.map +1 -0
  57. package/dist/location/LocationMap.js +205 -0
  58. package/dist/location/LocationMap.js.map +1 -0
  59. package/dist/location/index.d.ts +5 -0
  60. package/dist/location/index.d.ts.map +1 -0
  61. package/dist/location/index.js +4 -0
  62. package/dist/location/leafletCss.d.ts +2 -0
  63. package/dist/location/leafletCss.d.ts.map +1 -0
  64. package/dist/location/leafletCss.js +6 -0
  65. package/dist/location/leafletCss.js.map +1 -0
  66. package/dist/location/nominatim.d.ts +17 -0
  67. package/dist/location/nominatim.d.ts.map +1 -0
  68. package/dist/location/nominatim.js +50 -0
  69. package/dist/location/nominatim.js.map +1 -0
  70. package/dist/location/types.d.ts +40 -0
  71. package/dist/location/types.d.ts.map +1 -0
  72. package/dist/missing/MissingField.d.ts +3 -2
  73. package/dist/missing/MissingField.d.ts.map +1 -1
  74. package/dist/missing/MissingField.js +3 -2
  75. package/dist/missing/MissingField.js.map +1 -1
  76. package/dist/number/NumberField.js.map +1 -1
  77. package/dist/range/RangeField.d.ts +22 -0
  78. package/dist/range/RangeField.d.ts.map +1 -0
  79. package/dist/range/RangeField.js +203 -0
  80. package/dist/range/RangeField.js.map +1 -0
  81. package/dist/range/index.d.ts +2 -0
  82. package/dist/range/index.d.ts.map +1 -0
  83. package/dist/range/index.js +1 -0
  84. package/dist/relation/RelationField.js +485 -145
  85. package/dist/relation/RelationField.js.map +1 -1
  86. package/dist/repeater/RepeaterField.js +118 -34
  87. package/dist/repeater/RepeaterField.js.map +1 -1
  88. package/dist/select/SelectField.js.map +1 -1
  89. package/dist/shared/DefinitionField.js.map +1 -1
  90. package/dist/shared/builtIn.d.ts +1 -0
  91. package/dist/shared/builtIn.d.ts.map +1 -1
  92. package/dist/shared/builtIn.js +16 -1
  93. package/dist/shared/builtIn.js.map +1 -1
  94. package/dist/shared/check.js.map +1 -1
  95. package/dist/shared/context.d.ts +13 -3
  96. package/dist/shared/context.d.ts.map +1 -1
  97. package/dist/shared/context.js +27 -19
  98. package/dist/shared/context.js.map +1 -1
  99. package/dist/shared/cx.js.map +1 -1
  100. package/dist/shared/dates.js.map +1 -1
  101. package/dist/shared/embed.d.ts +19 -0
  102. package/dist/shared/embed.d.ts.map +1 -0
  103. package/dist/shared/embed.js +14 -0
  104. package/dist/shared/embed.js.map +1 -0
  105. package/dist/shared/entry.js.map +1 -1
  106. package/dist/shared/relation.js.map +1 -1
  107. package/dist/slug/SlugField.d.ts.map +1 -1
  108. package/dist/slug/SlugField.js +184 -36
  109. package/dist/slug/SlugField.js.map +1 -1
  110. package/dist/tags/TagsField.d.ts +17 -0
  111. package/dist/tags/TagsField.d.ts.map +1 -0
  112. package/dist/tags/TagsField.js +120 -0
  113. package/dist/tags/TagsField.js.map +1 -0
  114. package/dist/tags/index.d.ts +2 -0
  115. package/dist/tags/index.d.ts.map +1 -0
  116. package/dist/tags/index.js +1 -0
  117. package/dist/tel/TelField.d.ts +11 -0
  118. package/dist/tel/TelField.d.ts.map +1 -0
  119. package/dist/tel/TelField.js +87 -0
  120. package/dist/tel/TelField.js.map +1 -0
  121. package/dist/tel/index.d.ts +2 -0
  122. package/dist/tel/index.d.ts.map +1 -0
  123. package/dist/tel/index.js +1 -0
  124. package/dist/text/TextField.js.map +1 -1
  125. package/dist/textarea/TextAreaField.js.map +1 -1
  126. package/dist/time/TimeField.js +64 -10
  127. package/dist/time/TimeField.js.map +1 -1
  128. package/dist/upload/FilePicker.js +107 -24
  129. package/dist/upload/FilePicker.js.map +1 -1
  130. package/dist/upload/UploadList.js.map +1 -1
  131. package/dist/upload/files.js.map +1 -1
  132. package/dist/upload/useRejectionMessage.js.map +1 -1
  133. package/dist/upload/useUploads.js.map +1 -1
  134. package/dist/uppy/uploader.js.map +1 -1
  135. package/dist/url/UrlField.js +69 -14
  136. package/dist/url/UrlField.js.map +1 -1
  137. package/package.json +41 -4
@@ -0,0 +1,214 @@
1
+ import { getFieldProps, getSetting, isNumber, isString } from "../shared/entry.js";
2
+ import { messages } from "../shared/messages.js";
3
+ import DurationField_module_default from "./DurationField.module.js";
4
+ import { c } from "react/compiler-runtime";
5
+ import { Fieldset, NumberInput, usePanneauIntl } from "@panneau/ui";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/duration/DurationField.tsx
8
+ /** Hours, minutes and seconds of a number of seconds. */
9
+ function splitDuration(seconds) {
10
+ const total = Math.max(0, Math.round(seconds));
11
+ return {
12
+ hours: Math.floor(total / 3600),
13
+ minutes: Math.floor(total % 3600 / 60),
14
+ seconds: total % 60
15
+ };
16
+ }
17
+ /**
18
+ * A duration with its units, without the empty ones: `1 h 5 min 30 s`, `3 min`. With a precision
19
+ * of minutes, the seconds are rounded away.
20
+ */
21
+ function formatDuration(seconds, { precision = "seconds" } = {}) {
22
+ const parts = splitDuration(precision === "minutes" ? Math.round(seconds / 60) * 60 : seconds);
23
+ const shown = [
24
+ parts.hours > 0 ? `${parts.hours} h` : null,
25
+ parts.minutes > 0 ? `${parts.minutes} min` : null,
26
+ precision === "seconds" && parts.seconds > 0 ? `${parts.seconds} s` : null
27
+ ].filter((part) => part !== null);
28
+ return shown.length > 0 ? shown.join(" ") : precision === "minutes" ? "0 min" : "0 s";
29
+ }
30
+ /**
31
+ * A duration, in seconds, typed in hours, minutes and seconds. It is `null` while every part is
32
+ * empty.
33
+ */
34
+ function DurationField(t0) {
35
+ const $ = c(38);
36
+ const { value, onChange, onBlur, precision: t1, label, description, errors, disabled, readOnly, required, name, className } = t0;
37
+ const precision = t1 === void 0 ? "seconds" : t1;
38
+ const intl = usePanneauIntl();
39
+ let T0;
40
+ let t10;
41
+ let t11;
42
+ let t2;
43
+ let t3;
44
+ let t4;
45
+ let t5;
46
+ let t6;
47
+ let t7;
48
+ let t8;
49
+ let t9;
50
+ if ($[0] !== className || $[1] !== description || $[2] !== disabled || $[3] !== errors || $[4] !== intl || $[5] !== label || $[6] !== name || $[7] !== onBlur || $[8] !== onChange || $[9] !== precision || $[10] !== readOnly || $[11] !== required || $[12] !== value) {
51
+ const parts = value !== null && value !== void 0 ? splitDuration(value) : null;
52
+ const change = (part, next) => {
53
+ const updated = {
54
+ ...parts ?? {
55
+ hours: 0,
56
+ minutes: 0,
57
+ seconds: 0
58
+ },
59
+ [part]: next ?? 0
60
+ };
61
+ const total = updated.hours * 3600 + updated.minutes * 60 + updated.seconds;
62
+ onChange?.(total === 0 && next === null ? null : total);
63
+ };
64
+ const input = (part_0) => /* @__PURE__ */ jsx(NumberInput, {
65
+ "aria-label": intl.formatMessage(messages[part_0]),
66
+ value: parts?.[part_0] ?? null,
67
+ onChange: (next_0) => change(part_0, next_0),
68
+ onBlur: () => onBlur?.(),
69
+ minValue: 0,
70
+ ...part_0 !== "hours" ? { maxValue: 59 } : {},
71
+ formatOptions: { maximumFractionDigits: 0 },
72
+ suffix: intl.formatMessage(messages[`${part_0}Unit`]),
73
+ isDisabled: disabled,
74
+ isReadOnly: readOnly,
75
+ ...name !== void 0 ? { name: `${name}[${part_0}]` } : {},
76
+ className: DurationField_module_default.part
77
+ });
78
+ T0 = Fieldset;
79
+ t6 = label;
80
+ t7 = description;
81
+ t8 = errors;
82
+ t9 = required;
83
+ t10 = disabled;
84
+ t11 = className;
85
+ t2 = DurationField_module_default.parts;
86
+ t3 = input("hours");
87
+ t4 = input("minutes");
88
+ t5 = precision === "seconds" ? input("seconds") : null;
89
+ $[0] = className;
90
+ $[1] = description;
91
+ $[2] = disabled;
92
+ $[3] = errors;
93
+ $[4] = intl;
94
+ $[5] = label;
95
+ $[6] = name;
96
+ $[7] = onBlur;
97
+ $[8] = onChange;
98
+ $[9] = precision;
99
+ $[10] = readOnly;
100
+ $[11] = required;
101
+ $[12] = value;
102
+ $[13] = T0;
103
+ $[14] = t10;
104
+ $[15] = t11;
105
+ $[16] = t2;
106
+ $[17] = t3;
107
+ $[18] = t4;
108
+ $[19] = t5;
109
+ $[20] = t6;
110
+ $[21] = t7;
111
+ $[22] = t8;
112
+ $[23] = t9;
113
+ } else {
114
+ T0 = $[13];
115
+ t10 = $[14];
116
+ t11 = $[15];
117
+ t2 = $[16];
118
+ t3 = $[17];
119
+ t4 = $[18];
120
+ t5 = $[19];
121
+ t6 = $[20];
122
+ t7 = $[21];
123
+ t8 = $[22];
124
+ t9 = $[23];
125
+ }
126
+ let t12;
127
+ if ($[24] !== t2 || $[25] !== t3 || $[26] !== t4 || $[27] !== t5) {
128
+ t12 = /* @__PURE__ */ jsxs("div", {
129
+ className: t2,
130
+ children: [
131
+ t3,
132
+ t4,
133
+ t5
134
+ ]
135
+ });
136
+ $[24] = t2;
137
+ $[25] = t3;
138
+ $[26] = t4;
139
+ $[27] = t5;
140
+ $[28] = t12;
141
+ } else t12 = $[28];
142
+ let t13;
143
+ if ($[29] !== T0 || $[30] !== t10 || $[31] !== t11 || $[32] !== t12 || $[33] !== t6 || $[34] !== t7 || $[35] !== t8 || $[36] !== t9) {
144
+ t13 = /* @__PURE__ */ jsx(T0, {
145
+ legend: t6,
146
+ description: t7,
147
+ errors: t8,
148
+ isRequired: t9,
149
+ isDisabled: t10,
150
+ className: t11,
151
+ children: t12
152
+ });
153
+ $[29] = T0;
154
+ $[30] = t10;
155
+ $[31] = t11;
156
+ $[32] = t12;
157
+ $[33] = t6;
158
+ $[34] = t7;
159
+ $[35] = t8;
160
+ $[36] = t9;
161
+ $[37] = t13;
162
+ } else t13 = $[37];
163
+ return t13;
164
+ }
165
+ /** The `duration` type: a number of seconds, with setting `precision` (`seconds` or `minutes`). */
166
+ function DurationFieldEntry(props) {
167
+ const $ = c(13);
168
+ let t0;
169
+ if ($[0] !== props.field) {
170
+ t0 = getSetting(props.field, "precision", isString);
171
+ $[0] = props.field;
172
+ $[1] = t0;
173
+ } else t0 = $[1];
174
+ const precision = t0;
175
+ let t1;
176
+ if ($[2] !== props) {
177
+ t1 = getFieldProps(props);
178
+ $[2] = props;
179
+ $[3] = t1;
180
+ } else t1 = $[3];
181
+ let fieldProps;
182
+ if ($[4] !== t1) {
183
+ const { placeholder: _placeholder, ...t2 } = t1;
184
+ fieldProps = t2;
185
+ $[4] = t1;
186
+ $[5] = fieldProps;
187
+ } else fieldProps = $[5];
188
+ const t2 = isNumber(props.value) ? props.value : null;
189
+ let t3;
190
+ if ($[6] !== precision) {
191
+ t3 = precision === "minutes" || precision === "seconds" ? { precision } : {};
192
+ $[6] = precision;
193
+ $[7] = t3;
194
+ } else t3 = $[7];
195
+ let t4;
196
+ if ($[8] !== fieldProps || $[9] !== props.onChange || $[10] !== t2 || $[11] !== t3) {
197
+ t4 = /* @__PURE__ */ jsx(DurationField, {
198
+ ...fieldProps,
199
+ value: t2,
200
+ onChange: props.onChange,
201
+ ...t3
202
+ });
203
+ $[8] = fieldProps;
204
+ $[9] = props.onChange;
205
+ $[10] = t2;
206
+ $[11] = t3;
207
+ $[12] = t4;
208
+ } else t4 = $[12];
209
+ return t4;
210
+ }
211
+ //#endregion
212
+ export { DurationField, DurationFieldEntry, formatDuration, splitDuration };
213
+
214
+ //# sourceMappingURL=DurationField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurationField.js","names":["Fieldset","NumberInput","usePanneauIntl","getFieldProps","getSetting","isNumber","isString","messages","FieldEntryProps","FieldProps","styles","DurationFieldProps","precision","splitDuration","seconds","hours","minutes","total","Math","max","round","floor","formatDuration","parts","shown","filter","part","length","join","DurationField","t0","$","_c","value","onChange","onBlur","t1","label","description","errors","disabled","readOnly","required","name","className","undefined","intl","T0","t10","t11","t2","t3","t4","t5","t6","t7","t8","t9","change","next","updated","input","part_0","formatMessage","next_0","maxValue","maximumFractionDigits","t12","t13","DurationFieldEntry","props","field","fieldProps","placeholder","_placeholder","_c","styles"],"sources":["../../src/duration/DurationField.tsx"],"sourcesContent":["import { Fieldset, NumberInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getSetting, isNumber, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './DurationField.module.css';\n\nexport interface DurationFieldProps extends FieldProps<number> {\n /** `seconds` (the default) shows hours, minutes and seconds; `minutes` hides the seconds. */\n precision?: 'seconds' | 'minutes';\n}\n\n/** Hours, minutes and seconds of a number of seconds. */\nexport function splitDuration(seconds: number): {\n hours: number;\n minutes: number;\n seconds: number;\n} {\n const total = Math.max(0, Math.round(seconds));\n return {\n hours: Math.floor(total / 3600),\n minutes: Math.floor((total % 3600) / 60),\n seconds: total % 60,\n };\n}\n\n/**\n * A duration with its units, without the empty ones: `1 h 5 min 30 s`, `3 min`. With a precision\n * of minutes, the seconds are rounded away.\n */\nexport function formatDuration(\n seconds: number,\n { precision = 'seconds' }: { precision?: 'seconds' | 'minutes' } = {},\n): string {\n const parts = splitDuration(precision === 'minutes' ? Math.round(seconds / 60) * 60 : seconds);\n const shown = [\n parts.hours > 0 ? `${parts.hours} h` : null,\n parts.minutes > 0 ? `${parts.minutes} min` : null,\n precision === 'seconds' && parts.seconds > 0 ? `${parts.seconds} s` : null,\n ].filter((part) => part !== null);\n return shown.length > 0 ? shown.join(' ') : precision === 'minutes' ? '0 min' : '0 s';\n}\n\n/**\n * A duration, in seconds, typed in hours, minutes and seconds. It is `null` while every part is\n * empty.\n */\nexport function DurationField({\n value,\n onChange,\n onBlur,\n precision = 'seconds',\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n name,\n className,\n}: DurationFieldProps) {\n const intl = usePanneauIntl();\n const parts = value !== null && value !== undefined ? splitDuration(value) : null;\n const change = (part: 'hours' | 'minutes' | 'seconds', next: number | null) => {\n const updated = { ...(parts ?? { hours: 0, minutes: 0, seconds: 0 }), [part]: next ?? 0 };\n const total = updated.hours * 3600 + updated.minutes * 60 + updated.seconds;\n // Clearing the last part that had a value empties the field\n onChange?.(total === 0 && next === null ? null : total);\n };\n const input = (part: 'hours' | 'minutes' | 'seconds') => (\n <NumberInput\n aria-label={intl.formatMessage(messages[part])}\n value={parts?.[part] ?? null}\n onChange={(next) => change(part, next)}\n onBlur={() => onBlur?.()}\n minValue={0}\n {...(part !== 'hours' ? { maxValue: 59 } : {})}\n formatOptions={{ maximumFractionDigits: 0 }}\n suffix={intl.formatMessage(messages[`${part}Unit`])}\n isDisabled={disabled}\n isReadOnly={readOnly}\n {...(name !== undefined ? { name: `${name}[${part}]` } : {})}\n className={styles.part}\n />\n );\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n isDisabled={disabled}\n className={className}\n >\n <div className={styles.parts}>\n {input('hours')}\n {input('minutes')}\n {precision === 'seconds' ? input('seconds') : null}\n </div>\n </Fieldset>\n );\n}\n\n/** The `duration` type: a number of seconds, with setting `precision` (`seconds` or `minutes`). */\nexport function DurationFieldEntry(props: FieldEntryProps) {\n const precision = getSetting(props.field, 'precision', isString);\n const { placeholder: _placeholder, ...fieldProps } = getFieldProps(props);\n return (\n <DurationField\n {...fieldProps}\n value={isNumber(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(precision === 'minutes' || precision === 'seconds' ? { precision } : {})}\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import "./DurationField.css";
2
+ //#region src/duration/DurationField.module.css
3
+ var parts = "panneau-duration-field-parts";
4
+ var part = "panneau-duration-field-part";
5
+ var DurationField_module_default = {
6
+ parts,
7
+ part
8
+ };
9
+ //#endregion
10
+ export { DurationField_module_default as default, part, parts };
11
+
12
+ //# sourceMappingURL=DurationField.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DurationField.module.js","names":[],"sources":["../../src/duration/DurationField.module.css"],"sourcesContent":["/* Hours, minutes and seconds side by side. */\n.parts {\n display: flex;\n flex-wrap: wrap;\n gap: var(--panneau-space-2);\n}\n\n.part {\n flex: 0 1 7rem;\n min-width: 5rem;\n}\n"],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export { DurationField, DurationFieldEntry, type DurationFieldProps, formatDuration, splitDuration, } from './DurationField';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/duration/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,cAAc,EACd,aAAa,GAChB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1 @@
1
+ export { DurationField, DurationFieldEntry, formatDuration, splitDuration } from "./DurationField.js";
@@ -1 +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"}
1
+ {"version":3,"file":"EmailField.js","names":["getFieldProps","isString","FieldEntryProps","TextField","TextFieldProps","EmailFieldProps","Omit","EmailField","t0","$","_c","onBlur","onChange","props","value","t1","trimmed","trim","t2","EmailFieldEntry","_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,SAAOO,WAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAL,EAAA,OAAAD,IAAA;EAAoB,CAAA,CAAAM,OAAAF,UAAAD,QAAA,GAAAE,SAAAL;EAAsDC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;CAAA,OAAA;EAAAH,SAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,QAAAL,EAAA;CAAA;CAAA,IAAAM;CAAA,IAAAN,EAAA,OAAAE,UAAAF,EAAA,OAAAG,YAAAH,EAAA,OAAAK,OAAA;EAS7DC,WAAA;GACJ,MAAAC,UAAgBF,OAAKG,KAAe,KAApB;GAChB,IAAID,YAAYF,OACZF,WAAWI,YAAY,KAAZ,OAAAA,OAA+B;GAE9CL,SAAS;EAAC;EACbF,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAK;EAAAL,EAAA,KAAAM;CAAA,OAAAA,KAAAN,EAAA;CAAA,IAAAS;CAAA,IAAAT,EAAA,OAAAG,YAAAH,EAAA,QAAAI,SAAAJ,EAAA,QAAAM,MAAAN,EAAA,QAAAK,OAAA;EAbLI,KAAA,oBAAC,WAAD;GACiB,cAAA;GAAK,GACdL;GACC,MAAA;GACK,WAAA;GACHC;GACGF;GACF,QAAAG;EAMP,CAAA;EACHN,EAAA,KAAAG;EAAAH,EAAA,MAAAI;EAAAJ,EAAA,MAAAM;EAAAN,EAAA,MAAAK;EAAAL,EAAA,MAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAdFS;AAcE;;AAKV,SAAOC,gBAAAN,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAR,cAAca,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAM,KAAAd,SAASY,MAAKC,KAA2B,IAAjBD,MAAKC,QAA7B;CAA0C,IAAAI;CAAA,IAAAT,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAM,IAAA;EAFrDG,KAAA,oBAAC,YAAD;GAAW,GACHV;GACG,OAAAO;GACG,UAAAF,MAAKD;EAAS,CAAA;EAC1BH,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAM;EAAAN,EAAA,KAAAS;CAAA,OAAAA,KAAAT,EAAA;CAAA,OAJFS;AAIE"}
@@ -0,0 +1,60 @@
1
+ /* The URL, then the preview of what it embeds. */
2
+ .panneau-embed-field-embed {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--panneau-space-2);
6
+ }
7
+
8
+ .panneau-embed-field-status {
9
+ display: flex;
10
+ align-items: center;
11
+ gap: var(--panneau-space-2);
12
+ font-size: var(--panneau-font-size-sm);
13
+ color: var(--panneau-color-text-muted);
14
+ }
15
+
16
+ .panneau-embed-field-preview {
17
+ display: flex;
18
+ align-items: center;
19
+ gap: var(--panneau-space-3);
20
+ padding: var(--panneau-space-2);
21
+ color: var(--panneau-color-text);
22
+ text-decoration: none;
23
+ background-color: var(--panneau-color-surface-sunken);
24
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
25
+ border-radius: var(--panneau-radius-md);
26
+ }
27
+
28
+ .panneau-embed-field-preview:hover {
29
+ border-color: var(--panneau-color-border-control);
30
+ }
31
+
32
+ .panneau-embed-field-preview:focus-visible {
33
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
34
+ outline-offset: 1px;
35
+ }
36
+
37
+ .panneau-embed-field-thumbnail {
38
+ flex: none;
39
+ width: 7rem;
40
+ aspect-ratio: 16 / 9;
41
+ object-fit: cover;
42
+ border-radius: var(--panneau-radius-sm);
43
+ }
44
+
45
+ .panneau-embed-field-text {
46
+ display: flex;
47
+ flex-direction: column;
48
+ gap: 0.125rem;
49
+ min-width: 0;
50
+ }
51
+
52
+ .panneau-embed-field-title {
53
+ font-weight: var(--panneau-font-weight-medium);
54
+ overflow-wrap: anywhere;
55
+ }
56
+
57
+ .panneau-embed-field-provider {
58
+ font-size: var(--panneau-font-size-sm);
59
+ color: var(--panneau-color-text-muted);
60
+ }
@@ -0,0 +1,20 @@
1
+ import type { EmbedValue } from '@panneau/protocol';
2
+ import type { EmbedSource } from '../shared/embed';
3
+ import type { FieldEntryProps, FieldProps } from '../shared/types';
4
+ export type { EmbedValue };
5
+ export interface EmbedFieldProps extends FieldProps<EmbedValue> {
6
+ placeholder?: string;
7
+ /** Where the preview comes from. Defaults to that of the `FieldsProvider`. */
8
+ embedSource?: EmbedSource | null;
9
+ }
10
+ /** Whether a value is an embed: an object with a `url`. */
11
+ export declare function isEmbed(value: unknown): value is EmbedValue;
12
+ /**
13
+ * A URL of a video, a sound or a post, with the preview the backend gets from its provider's
14
+ * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
15
+ * preview follows. Without an embed source, the value is the URL alone.
16
+ */
17
+ export declare function EmbedField({ value, onChange, onBlur, embedSource: embedSourceProp, errors, disabled, readOnly, required, ...props }: EmbedFieldProps): import("react").JSX.Element;
18
+ /** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */
19
+ export declare function EmbedFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
20
+ //# sourceMappingURL=EmbedField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.d.ts","sourceRoot":"","sources":["../../src/embed/EmbedField.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,UAAU,EAAE,CAAC;AAI3B,MAAM,WAAW,eAAgB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CACpC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAM3D;AAOD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,MAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,eAAe,+BA6EjB;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAQrD"}
@@ -0,0 +1,246 @@
1
+ import { useFieldsContext } from "../shared/context.js";
2
+ import { getFieldProps, isString } from "../shared/entry.js";
3
+ import { messages } from "../shared/messages.js";
4
+ import EmbedField_module_default from "./EmbedField.module.js";
5
+ import { c } from "react/compiler-runtime";
6
+ import { Spinner, TextInput, usePanneauIntl } from "@panneau/ui";
7
+ import { useEffect, useEffectEvent, useState } from "react";
8
+ import { jsx, jsxs } from "react/jsx-runtime";
9
+ //#region src/embed/EmbedField.tsx
10
+ var RESOLVE_DELAY = 500;
11
+ /** Whether a value is an embed: an object with a `url`. */
12
+ function isEmbed(value) {
13
+ return value !== null && typeof value === "object" && isString(value.url);
14
+ }
15
+ /** Whether a value has been resolved: it has more than its URL. */
16
+ function isResolved(value) {
17
+ return Object.keys(value).some((key) => key !== "url");
18
+ }
19
+ /**
20
+ * A URL of a video, a sound or a post, with the preview the backend gets from its provider's
21
+ * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
22
+ * preview follows. Without an embed source, the value is the URL alone.
23
+ */
24
+ function EmbedField(t0) {
25
+ const $ = c(47);
26
+ let disabled;
27
+ let embedSourceProp;
28
+ let onBlur;
29
+ let onChange;
30
+ let props;
31
+ let readOnly;
32
+ let required;
33
+ let t1;
34
+ let value;
35
+ if ($[0] !== t0) {
36
+ ({value, onChange, onBlur, embedSource: embedSourceProp, errors: t1, disabled, readOnly, required, ...props} = t0);
37
+ $[0] = t0;
38
+ $[1] = disabled;
39
+ $[2] = embedSourceProp;
40
+ $[3] = onBlur;
41
+ $[4] = onChange;
42
+ $[5] = props;
43
+ $[6] = readOnly;
44
+ $[7] = required;
45
+ $[8] = t1;
46
+ $[9] = value;
47
+ } else {
48
+ disabled = $[1];
49
+ embedSourceProp = $[2];
50
+ onBlur = $[3];
51
+ onChange = $[4];
52
+ props = $[5];
53
+ readOnly = $[6];
54
+ required = $[7];
55
+ t1 = $[8];
56
+ value = $[9];
57
+ }
58
+ let t2;
59
+ if ($[10] !== t1) {
60
+ t2 = t1 === void 0 ? [] : t1;
61
+ $[10] = t1;
62
+ $[11] = t2;
63
+ } else t2 = $[11];
64
+ const errors = t2;
65
+ const intl = usePanneauIntl();
66
+ const context = useFieldsContext();
67
+ const embedSource = embedSourceProp === void 0 ? context.embedSource : embedSourceProp;
68
+ const url = value?.url ?? "";
69
+ const [status, setStatus] = useState(null);
70
+ const pending = value !== null && value !== void 0 && !isResolved(value) ? value.url : null;
71
+ let t3;
72
+ if ($[12] !== onChange) {
73
+ t3 = (embed) => onChange?.(embed);
74
+ $[12] = onChange;
75
+ $[13] = t3;
76
+ } else t3 = $[13];
77
+ const resolved = useEffectEvent(t3);
78
+ let t4;
79
+ if ($[14] !== embedSource || $[15] !== pending || $[16] !== resolved) {
80
+ t4 = () => {
81
+ if (embedSource === null || pending === null || !URL.canParse(pending)) return;
82
+ const controller = new AbortController();
83
+ const timeout = window.setTimeout(() => {
84
+ setStatus({
85
+ url: pending,
86
+ state: "loading"
87
+ });
88
+ embedSource.resolve(pending, { signal: controller.signal }).then((embed_0) => {
89
+ setStatus(null);
90
+ resolved({
91
+ ...embed_0,
92
+ url: pending
93
+ });
94
+ }).catch(() => {
95
+ if (!controller.signal.aborted) setStatus({
96
+ url: pending,
97
+ state: "failed"
98
+ });
99
+ });
100
+ }, RESOLVE_DELAY);
101
+ return () => {
102
+ window.clearTimeout(timeout);
103
+ controller.abort();
104
+ };
105
+ };
106
+ $[14] = embedSource;
107
+ $[15] = pending;
108
+ $[16] = resolved;
109
+ $[17] = t4;
110
+ } else t4 = $[17];
111
+ let t5;
112
+ if ($[18] !== embedSource || $[19] !== pending) {
113
+ t5 = [embedSource, pending];
114
+ $[18] = embedSource;
115
+ $[19] = pending;
116
+ $[20] = t5;
117
+ } else t5 = $[20];
118
+ useEffect(t4, t5);
119
+ const current = status !== null && status.url === url ? status.state : null;
120
+ let t6;
121
+ if ($[21] !== current || $[22] !== errors || $[23] !== intl) {
122
+ t6 = current === "failed" && errors.length === 0 ? [intl.formatMessage(messages.embedFailed)] : errors;
123
+ $[21] = current;
124
+ $[22] = errors;
125
+ $[23] = intl;
126
+ $[24] = t6;
127
+ } else t6 = $[24];
128
+ const shownErrors = t6;
129
+ let t7;
130
+ if ($[25] !== onChange) {
131
+ t7 = (next) => onChange?.(next.trim() === "" ? null : { url: next.trim() });
132
+ $[25] = onChange;
133
+ $[26] = t7;
134
+ } else t7 = $[26];
135
+ let t8;
136
+ if ($[27] !== onBlur) {
137
+ t8 = () => onBlur?.();
138
+ $[27] = onBlur;
139
+ $[28] = t8;
140
+ } else t8 = $[28];
141
+ let t9;
142
+ if ($[29] !== disabled || $[30] !== props || $[31] !== readOnly || $[32] !== required || $[33] !== shownErrors || $[34] !== t7 || $[35] !== t8 || $[36] !== url) {
143
+ t9 = /* @__PURE__ */ jsx(TextInput, {
144
+ ...props,
145
+ type: "url",
146
+ inputMode: "url",
147
+ autoComplete: "off",
148
+ value: url,
149
+ onChange: t7,
150
+ onBlur: t8,
151
+ errors: shownErrors,
152
+ isDisabled: disabled,
153
+ isReadOnly: readOnly,
154
+ isRequired: required
155
+ });
156
+ $[29] = disabled;
157
+ $[30] = props;
158
+ $[31] = readOnly;
159
+ $[32] = required;
160
+ $[33] = shownErrors;
161
+ $[34] = t7;
162
+ $[35] = t8;
163
+ $[36] = url;
164
+ $[37] = t9;
165
+ } else t9 = $[37];
166
+ let t10;
167
+ if ($[38] !== current || $[39] !== intl) {
168
+ t10 = current === "loading" ? /* @__PURE__ */ jsxs("div", {
169
+ className: EmbedField_module_default.status,
170
+ role: "status",
171
+ children: [/* @__PURE__ */ jsx(Spinner, { size: "sm" }), intl.formatMessage(messages.embedLoading)]
172
+ }) : null;
173
+ $[38] = current;
174
+ $[39] = intl;
175
+ $[40] = t10;
176
+ } else t10 = $[40];
177
+ let t11;
178
+ if ($[41] !== value) {
179
+ t11 = value !== null && value !== void 0 && isResolved(value) ? /* @__PURE__ */ jsxs("a", {
180
+ className: EmbedField_module_default.preview,
181
+ href: value.url,
182
+ target: "_blank",
183
+ rel: "noreferrer",
184
+ children: [value.thumbnailUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
185
+ className: EmbedField_module_default.thumbnail,
186
+ src: value.thumbnailUrl,
187
+ alt: ""
188
+ }) : null, /* @__PURE__ */ jsxs("span", {
189
+ className: EmbedField_module_default.text,
190
+ children: [/* @__PURE__ */ jsx("span", {
191
+ className: EmbedField_module_default.title,
192
+ children: value.title ?? value.url
193
+ }), value.provider !== void 0 ? /* @__PURE__ */ jsx("span", {
194
+ className: EmbedField_module_default.provider,
195
+ children: value.provider
196
+ }) : null]
197
+ })]
198
+ }) : null;
199
+ $[41] = value;
200
+ $[42] = t11;
201
+ } else t11 = $[42];
202
+ let t12;
203
+ if ($[43] !== t10 || $[44] !== t11 || $[45] !== t9) {
204
+ t12 = /* @__PURE__ */ jsxs("div", {
205
+ className: EmbedField_module_default.embed,
206
+ children: [
207
+ t9,
208
+ t10,
209
+ t11
210
+ ]
211
+ });
212
+ $[43] = t10;
213
+ $[44] = t11;
214
+ $[45] = t9;
215
+ $[46] = t12;
216
+ } else t12 = $[46];
217
+ return t12;
218
+ }
219
+ /** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */
220
+ function EmbedFieldEntry(props) {
221
+ const $ = c(6);
222
+ let t0;
223
+ if ($[0] !== props) {
224
+ t0 = getFieldProps(props);
225
+ $[0] = props;
226
+ $[1] = t0;
227
+ } else t0 = $[1];
228
+ const t1 = isEmbed(props.value) ? props.value : null;
229
+ let t2;
230
+ if ($[2] !== props.onChange || $[3] !== t0 || $[4] !== t1) {
231
+ t2 = /* @__PURE__ */ jsx(EmbedField, {
232
+ ...t0,
233
+ value: t1,
234
+ onChange: props.onChange
235
+ });
236
+ $[2] = props.onChange;
237
+ $[3] = t0;
238
+ $[4] = t1;
239
+ $[5] = t2;
240
+ } else t2 = $[5];
241
+ return t2;
242
+ }
243
+ //#endregion
244
+ export { EmbedField, EmbedFieldEntry, isEmbed };
245
+
246
+ //# sourceMappingURL=EmbedField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.js","names":["useEffect","useEffectEvent","useState","EmbedValue","Spinner","TextInput","usePanneauIntl","useFieldsContext","EmbedSource","getFieldProps","isString","messages","FieldEntryProps","FieldProps","styles","RESOLVE_DELAY","EmbedFieldProps","placeholder","embedSource","isEmbed","value","Record","url","isResolved","Object","keys","some","key","EmbedField","t0","$","_c","disabled","embedSourceProp","onBlur","onChange","props","readOnly","required","t1","errors","t2","undefined","intl","context","status","setStatus","pending","t3","embed","resolved","t4","URL","canParse","controller","AbortController","timeout","window","setTimeout","state","resolve","signal","then","embed_0","catch","aborted","clearTimeout","abort","t5","current","t6","length","formatMessage","embedFailed","shownErrors","t7","next","trim","t8","t9","t10","embedLoading","t11","preview","thumbnailUrl","thumbnail","text","title","provider","t12","EmbedFieldEntry","_c","styles"],"sources":["../../src/embed/EmbedField.tsx"],"sourcesContent":["import { useEffect, useEffectEvent, useState } from 'react';\n\nimport type { EmbedValue } from '@panneau/protocol';\nimport { Spinner, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { useFieldsContext } from '../shared/context';\nimport type { EmbedSource } from '../shared/embed';\nimport { getFieldProps, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './EmbedField.module.css';\n\nexport type { EmbedValue };\n\nconst RESOLVE_DELAY = 500;\n\nexport interface EmbedFieldProps extends FieldProps<EmbedValue> {\n placeholder?: string;\n /** Where the preview comes from. Defaults to that of the `FieldsProvider`. */\n embedSource?: EmbedSource | null;\n}\n\n/** Whether a value is an embed: an object with a `url`. */\nexport function isEmbed(value: unknown): value is EmbedValue {\n return (\n value !== null &&\n typeof value === 'object' &&\n isString((value as Record<string, unknown>).url)\n );\n}\n\n/** Whether a value has been resolved: it has more than its URL. */\nfunction isResolved(value: EmbedValue): boolean {\n return Object.keys(value).some((key) => key !== 'url');\n}\n\n/**\n * A URL of a video, a sound or a post, with the preview the backend gets from its provider's\n * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its\n * preview follows. Without an embed source, the value is the URL alone.\n */\nexport function EmbedField({\n value,\n onChange,\n onBlur,\n embedSource: embedSourceProp,\n errors = [],\n disabled,\n readOnly,\n required,\n ...props\n}: EmbedFieldProps) {\n const intl = usePanneauIntl();\n const context = useFieldsContext();\n const embedSource = embedSourceProp === undefined ? context.embedSource : embedSourceProp;\n const url = value?.url ?? '';\n const [status, setStatus] = useState<{ url: string; state: 'loading' | 'failed' } | null>(null);\n\n // Resolves a URL that hasn't been, after a pause in typing\n const pending = value !== null && value !== undefined && !isResolved(value) ? value.url : null;\n // `onChange` changes on every render of a form: the latest one gets the preview\n const resolved = useEffectEvent((embed: EmbedValue) => onChange?.(embed));\n useEffect(() => {\n if (embedSource === null || pending === null || !URL.canParse(pending)) {\n return undefined;\n }\n const controller = new AbortController();\n const timeout = window.setTimeout(() => {\n setStatus({ url: pending, state: 'loading' });\n embedSource\n .resolve(pending, { signal: controller.signal })\n .then((embed) => {\n setStatus(null);\n resolved({ ...embed, url: pending });\n })\n .catch(() => {\n if (!controller.signal.aborted) {\n setStatus({ url: pending, state: 'failed' });\n }\n });\n }, RESOLVE_DELAY);\n return () => {\n window.clearTimeout(timeout);\n controller.abort();\n };\n }, [embedSource, pending]);\n\n const current = status !== null && status.url === url ? status.state : null;\n const shownErrors =\n current === 'failed' && errors.length === 0\n ? [intl.formatMessage(messages.embedFailed)]\n : errors;\n return (\n <div className={styles.embed}>\n <TextInput\n {...props}\n type=\"url\"\n inputMode=\"url\"\n autoComplete=\"off\"\n value={url}\n onChange={(next) => onChange?.(next.trim() === '' ? null : { url: next.trim() })}\n onBlur={() => onBlur?.()}\n errors={shownErrors}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n {current === 'loading' ? (\n <div className={styles.status} role=\"status\">\n <Spinner size=\"sm\" />\n {intl.formatMessage(messages.embedLoading)}\n </div>\n ) : null}\n {value !== null && value !== undefined && isResolved(value) ? (\n <a className={styles.preview} href={value.url} target=\"_blank\" rel=\"noreferrer\">\n {value.thumbnailUrl !== undefined ? (\n <img className={styles.thumbnail} src={value.thumbnailUrl} alt=\"\" />\n ) : null}\n <span className={styles.text}>\n <span className={styles.title}>{value.title ?? value.url}</span>\n {value.provider !== undefined ? (\n <span className={styles.provider}>{value.provider}</span>\n ) : null}\n </span>\n </a>\n ) : null}\n </div>\n );\n}\n\n/** The `embed` type: its preview comes from the embed source of the `FieldsProvider`. */\nexport function EmbedFieldEntry(props: FieldEntryProps) {\n return (\n <EmbedField\n {...getFieldProps(props)}\n value={isEmbed(props.value) ? props.value : null}\n onChange={props.onChange}\n />\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import "./EmbedField.css";
2
+ //#region src/embed/EmbedField.module.css
3
+ var embed = "panneau-embed-field-embed";
4
+ var status = "panneau-embed-field-status";
5
+ var preview = "panneau-embed-field-preview";
6
+ var thumbnail = "panneau-embed-field-thumbnail";
7
+ var text = "panneau-embed-field-text";
8
+ var title = "panneau-embed-field-title";
9
+ var provider = "panneau-embed-field-provider";
10
+ var EmbedField_module_default = {
11
+ embed,
12
+ status,
13
+ preview,
14
+ thumbnail,
15
+ text,
16
+ title,
17
+ provider
18
+ };
19
+ //#endregion
20
+ export { EmbedField_module_default as default, embed, preview, provider, status, text, thumbnail, title };
21
+
22
+ //# sourceMappingURL=EmbedField.module.js.map