@panneau/fields 5.0.0-alpha.2 → 5.0.0-alpha.20

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 (408) hide show
  1. package/README.md +186 -20
  2. package/dist/address/AddressField.css +44 -0
  3. package/dist/address/AddressField.d.ts +37 -0
  4. package/dist/address/AddressField.d.ts.map +1 -0
  5. package/dist/address/AddressField.js +411 -0
  6. package/dist/address/AddressField.js.map +1 -0
  7. package/dist/address/AddressField.module.js +22 -0
  8. package/dist/address/AddressField.module.js.map +1 -0
  9. package/dist/address/address.d.ts +23 -0
  10. package/dist/address/address.d.ts.map +1 -0
  11. package/dist/address/address.js +58 -0
  12. package/dist/address/address.js.map +1 -0
  13. package/dist/address/index.d.ts +3 -0
  14. package/dist/address/index.d.ts.map +1 -0
  15. package/dist/address/index.js +3 -0
  16. package/dist/boolean/BooleanField.d.ts +1 -1
  17. package/dist/boolean/BooleanField.js +78 -17
  18. package/dist/boolean/BooleanField.js.map +1 -1
  19. package/dist/boolean/index.d.ts +1 -1
  20. package/dist/color/ColorField.css +9 -0
  21. package/dist/color/ColorField.d.ts +12 -5
  22. package/dist/color/ColorField.d.ts.map +1 -1
  23. package/dist/color/ColorField.js +341 -81
  24. package/dist/color/ColorField.js.map +1 -1
  25. package/dist/color/ColorField.module.js +4 -2
  26. package/dist/color/ColorField.module.js.map +1 -1
  27. package/dist/color/index.d.ts +2 -1
  28. package/dist/color/index.d.ts.map +1 -1
  29. package/dist/color/index.js +3 -1
  30. package/dist/color/palette.d.ts +23 -0
  31. package/dist/color/palette.d.ts.map +1 -0
  32. package/dist/color/palette.js +34 -0
  33. package/dist/color/palette.js.map +1 -0
  34. package/dist/compound/Compound.css +26 -0
  35. package/dist/compound/Compound.module.js +16 -0
  36. package/dist/compound/Compound.module.js.map +1 -0
  37. package/dist/compound/compound.d.ts +56 -0
  38. package/dist/compound/compound.d.ts.map +1 -0
  39. package/dist/compound/compound.js +186 -0
  40. package/dist/compound/compound.js.map +1 -0
  41. package/dist/country/CountryField.css +42 -0
  42. package/dist/country/CountryField.d.ts +32 -0
  43. package/dist/country/CountryField.d.ts.map +1 -0
  44. package/dist/country/CountryField.js +424 -0
  45. package/dist/country/CountryField.js.map +1 -0
  46. package/dist/country/CountryField.module.js +20 -0
  47. package/dist/country/CountryField.module.js.map +1 -0
  48. package/dist/country/codes.d.ts +6 -0
  49. package/dist/country/codes.d.ts.map +1 -0
  50. package/dist/country/codes.js +261 -0
  51. package/dist/country/codes.js.map +1 -0
  52. package/dist/country/countries.d.ts +32 -0
  53. package/dist/country/countries.d.ts.map +1 -0
  54. package/dist/country/countries.js +60 -0
  55. package/dist/country/countries.js.map +1 -0
  56. package/dist/country/index.d.ts +3 -0
  57. package/dist/country/index.d.ts.map +1 -0
  58. package/dist/country/index.js +4 -0
  59. package/dist/credits/CreditsField.d.ts +15 -0
  60. package/dist/credits/CreditsField.d.ts.map +1 -0
  61. package/dist/credits/CreditsField.js +58 -0
  62. package/dist/credits/CreditsField.js.map +1 -0
  63. package/dist/credits/credits.d.ts +18 -0
  64. package/dist/credits/credits.d.ts.map +1 -0
  65. package/dist/credits/credits.js +33 -0
  66. package/dist/credits/credits.js.map +1 -0
  67. package/dist/credits/index.d.ts +5 -0
  68. package/dist/credits/index.d.ts.map +1 -0
  69. package/dist/credits/index.js +3 -0
  70. package/dist/date/DateField.d.ts +1 -1
  71. package/dist/date/DateField.js.map +1 -1
  72. package/dist/date/index.d.ts +1 -1
  73. package/dist/daterange/DateRangeField.css +9 -0
  74. package/dist/daterange/DateRangeField.d.ts +31 -0
  75. package/dist/daterange/DateRangeField.d.ts.map +1 -0
  76. package/dist/daterange/DateRangeField.js +372 -0
  77. package/dist/daterange/DateRangeField.js.map +1 -0
  78. package/dist/daterange/DateRangeField.module.js +12 -0
  79. package/dist/daterange/DateRangeField.module.js.map +1 -0
  80. package/dist/daterange/index.d.ts +3 -0
  81. package/dist/daterange/index.d.ts.map +1 -0
  82. package/dist/daterange/index.js +3 -0
  83. package/dist/daterange/range.d.ts +61 -0
  84. package/dist/daterange/range.d.ts.map +1 -0
  85. package/dist/daterange/range.js +119 -0
  86. package/dist/daterange/range.js.map +1 -0
  87. package/dist/datetime/DateTimeField.d.ts +1 -1
  88. package/dist/datetime/DateTimeField.js +107 -20
  89. package/dist/datetime/DateTimeField.js.map +1 -1
  90. package/dist/datetime/index.d.ts +1 -1
  91. package/dist/duration/DurationField.css +11 -0
  92. package/dist/duration/DurationField.d.ts +67 -0
  93. package/dist/duration/DurationField.d.ts.map +1 -0
  94. package/dist/duration/DurationField.js +260 -0
  95. package/dist/duration/DurationField.js.map +1 -0
  96. package/dist/duration/DurationField.module.js +12 -0
  97. package/dist/duration/DurationField.module.js.map +1 -0
  98. package/dist/duration/index.d.ts +2 -0
  99. package/dist/duration/index.d.ts.map +1 -0
  100. package/dist/duration/index.js +1 -0
  101. package/dist/email/EmailField.d.ts +2 -2
  102. package/dist/email/EmailField.js.map +1 -1
  103. package/dist/email/index.d.ts +1 -1
  104. package/dist/embed/EmbedField.css +60 -0
  105. package/dist/embed/EmbedField.d.ts +29 -0
  106. package/dist/embed/EmbedField.d.ts.map +1 -0
  107. package/dist/embed/EmbedField.js +309 -0
  108. package/dist/embed/EmbedField.js.map +1 -0
  109. package/dist/embed/EmbedField.module.js +22 -0
  110. package/dist/embed/EmbedField.module.js.map +1 -0
  111. package/dist/embed/index.d.ts +3 -0
  112. package/dist/embed/index.d.ts.map +1 -0
  113. package/dist/embed/index.js +3 -0
  114. package/dist/file/FileField.css +54 -0
  115. package/dist/file/FileField.d.ts +50 -0
  116. package/dist/file/FileField.d.ts.map +1 -0
  117. package/dist/file/FileField.js +288 -0
  118. package/dist/file/FileField.js.map +1 -0
  119. package/dist/file/FileField.module.js +22 -0
  120. package/dist/file/FileField.module.js.map +1 -0
  121. package/dist/file/index.d.ts +3 -0
  122. package/dist/file/index.d.ts.map +1 -0
  123. package/dist/file/index.js +1 -0
  124. package/dist/group/GroupField.css +20 -3
  125. package/dist/group/GroupField.d.ts +10 -4
  126. package/dist/group/GroupField.d.ts.map +1 -1
  127. package/dist/group/GroupField.js +71 -66
  128. package/dist/group/GroupField.js.map +1 -1
  129. package/dist/group/GroupField.module.js +10 -2
  130. package/dist/group/GroupField.module.js.map +1 -1
  131. package/dist/group/index.d.ts +1 -1
  132. package/dist/index.d.ts +21 -7
  133. package/dist/index.d.ts.map +1 -1
  134. package/dist/index.js +14 -2
  135. package/dist/json/JsonField.css +7 -0
  136. package/dist/json/JsonField.d.ts +22 -0
  137. package/dist/json/JsonField.d.ts.map +1 -0
  138. package/dist/json/JsonField.js +207 -0
  139. package/dist/json/JsonField.js.map +1 -0
  140. package/dist/json/JsonField.module.js +8 -0
  141. package/dist/json/JsonField.module.js.map +1 -0
  142. package/dist/json/index.d.ts +2 -0
  143. package/dist/json/index.d.ts.map +1 -0
  144. package/dist/json/index.js +1 -0
  145. package/dist/link/LinkField.css +12 -0
  146. package/dist/link/LinkField.d.ts +38 -0
  147. package/dist/link/LinkField.d.ts.map +1 -0
  148. package/dist/link/LinkField.js +742 -0
  149. package/dist/link/LinkField.js.map +1 -0
  150. package/dist/link/LinkField.module.js +8 -0
  151. package/dist/link/LinkField.module.js.map +1 -0
  152. package/dist/link/index.d.ts +3 -0
  153. package/dist/link/index.d.ts.map +1 -0
  154. package/dist/link/index.js +3 -0
  155. package/dist/link/link.d.ts +30 -0
  156. package/dist/link/link.d.ts.map +1 -0
  157. package/dist/link/link.js +63 -0
  158. package/dist/link/link.js.map +1 -0
  159. package/dist/link/pages.d.ts +17 -0
  160. package/dist/link/pages.d.ts.map +1 -0
  161. package/dist/link/pages.js +104 -0
  162. package/dist/link/pages.js.map +1 -0
  163. package/dist/locales/index.js.map +1 -1
  164. package/dist/localized/LocalizedField.css +27 -6
  165. package/dist/localized/LocalizedField.d.ts +19 -8
  166. package/dist/localized/LocalizedField.d.ts.map +1 -1
  167. package/dist/localized/LocalizedField.js +238 -105
  168. package/dist/localized/LocalizedField.js.map +1 -1
  169. package/dist/localized/LocalizedField.module.js +10 -4
  170. package/dist/localized/LocalizedField.module.js.map +1 -1
  171. package/dist/localized/index.d.ts +1 -1
  172. package/dist/location/LocationField.css +54 -0
  173. package/dist/location/LocationField.d.ts +31 -0
  174. package/dist/location/LocationField.d.ts.map +1 -0
  175. package/dist/location/LocationField.js +487 -0
  176. package/dist/location/LocationField.js.map +1 -0
  177. package/dist/location/LocationField.module.js +22 -0
  178. package/dist/location/LocationField.module.js.map +1 -0
  179. package/dist/location/LocationMap.d.ts +25 -0
  180. package/dist/location/LocationMap.d.ts.map +1 -0
  181. package/dist/location/LocationMap.js +205 -0
  182. package/dist/location/LocationMap.js.map +1 -0
  183. package/dist/location/index.d.ts +5 -0
  184. package/dist/location/index.d.ts.map +1 -0
  185. package/dist/location/index.js +4 -0
  186. package/dist/location/leafletCss.d.ts +2 -0
  187. package/dist/location/leafletCss.d.ts.map +1 -0
  188. package/dist/location/leafletCss.js +6 -0
  189. package/dist/location/leafletCss.js.map +1 -0
  190. package/dist/location/nominatim.d.ts +23 -0
  191. package/dist/location/nominatim.d.ts.map +1 -0
  192. package/dist/location/nominatim.js +79 -0
  193. package/dist/location/nominatim.js.map +1 -0
  194. package/dist/location/search.d.ts +10 -0
  195. package/dist/location/search.d.ts.map +1 -0
  196. package/dist/location/search.js +83 -0
  197. package/dist/location/search.js.map +1 -0
  198. package/dist/location/types.d.ts +46 -0
  199. package/dist/location/types.d.ts.map +1 -0
  200. package/dist/missing/MissingField.d.ts +4 -3
  201. package/dist/missing/MissingField.d.ts.map +1 -1
  202. package/dist/missing/MissingField.js +3 -2
  203. package/dist/missing/MissingField.js.map +1 -1
  204. package/dist/money/MoneyField.d.ts +28 -0
  205. package/dist/money/MoneyField.d.ts.map +1 -0
  206. package/dist/money/MoneyField.js +269 -0
  207. package/dist/money/MoneyField.js.map +1 -0
  208. package/dist/money/index.d.ts +3 -0
  209. package/dist/money/index.d.ts.map +1 -0
  210. package/dist/money/index.js +3 -0
  211. package/dist/money/money.d.ts +27 -0
  212. package/dist/money/money.d.ts.map +1 -0
  213. package/dist/money/money.js +56 -0
  214. package/dist/money/money.js.map +1 -0
  215. package/dist/number/NumberField.d.ts +1 -1
  216. package/dist/number/NumberField.js.map +1 -1
  217. package/dist/number/index.d.ts +1 -1
  218. package/dist/range/RangeField.d.ts +22 -0
  219. package/dist/range/RangeField.d.ts.map +1 -0
  220. package/dist/range/RangeField.js +203 -0
  221. package/dist/range/RangeField.js.map +1 -0
  222. package/dist/range/index.d.ts +2 -0
  223. package/dist/range/index.d.ts.map +1 -0
  224. package/dist/range/index.js +1 -0
  225. package/dist/region/RegionField.d.ts +23 -0
  226. package/dist/region/RegionField.d.ts.map +1 -0
  227. package/dist/region/RegionField.js +174 -0
  228. package/dist/region/RegionField.js.map +1 -0
  229. package/dist/region/RegionFlag.css +9 -0
  230. package/dist/region/RegionFlag.d.ts +20 -0
  231. package/dist/region/RegionFlag.d.ts.map +1 -0
  232. package/dist/region/RegionFlag.js +61 -0
  233. package/dist/region/RegionFlag.js.map +1 -0
  234. package/dist/region/RegionFlag.module.js +8 -0
  235. package/dist/region/RegionFlag.module.js.map +1 -0
  236. package/dist/region/data.d.ts +5 -0
  237. package/dist/region/data.d.ts.map +1 -0
  238. package/dist/region/data.js +513 -0
  239. package/dist/region/data.js.map +1 -0
  240. package/dist/region/flags/CA.d.ts +4 -0
  241. package/dist/region/flags/CA.d.ts.map +1 -0
  242. package/dist/region/flags/CA.js +21 -0
  243. package/dist/region/flags/CA.js.map +1 -0
  244. package/dist/region/flags/US.d.ts +4 -0
  245. package/dist/region/flags/US.d.ts.map +1 -0
  246. package/dist/region/flags/US.js +65 -0
  247. package/dist/region/flags/US.js.map +1 -0
  248. package/dist/region/flags.d.ts +17 -0
  249. package/dist/region/flags.d.ts.map +1 -0
  250. package/dist/region/flags.js +84 -0
  251. package/dist/region/flags.js.map +1 -0
  252. package/dist/region/index.d.ts +5 -0
  253. package/dist/region/index.d.ts.map +1 -0
  254. package/dist/region/index.js +5 -0
  255. package/dist/region/regions.d.ts +15 -0
  256. package/dist/region/regions.d.ts.map +1 -0
  257. package/dist/region/regions.js +29 -0
  258. package/dist/region/regions.js.map +1 -0
  259. package/dist/relation/RelationField.d.ts +2 -2
  260. package/dist/relation/RelationField.d.ts.map +1 -1
  261. package/dist/relation/RelationField.js +511 -171
  262. package/dist/relation/RelationField.js.map +1 -1
  263. package/dist/relation/index.d.ts +2 -2
  264. package/dist/repeater/RepeaterField.d.ts +13 -2
  265. package/dist/repeater/RepeaterField.d.ts.map +1 -1
  266. package/dist/repeater/RepeaterField.js +138 -50
  267. package/dist/repeater/RepeaterField.js.map +1 -1
  268. package/dist/repeater/index.d.ts +1 -1
  269. package/dist/select/SelectField.d.ts +1 -1
  270. package/dist/select/SelectField.js.map +1 -1
  271. package/dist/select/index.d.ts +1 -1
  272. package/dist/sessions/SessionsField.d.ts +15 -0
  273. package/dist/sessions/SessionsField.d.ts.map +1 -0
  274. package/dist/sessions/SessionsField.js +49 -0
  275. package/dist/sessions/SessionsField.js.map +1 -0
  276. package/dist/sessions/index.d.ts +4 -0
  277. package/dist/sessions/index.d.ts.map +1 -0
  278. package/dist/sessions/index.js +1 -0
  279. package/dist/shared/CodeComboBox.d.ts +21 -0
  280. package/dist/shared/CodeComboBox.d.ts.map +1 -0
  281. package/dist/shared/CodeComboBox.js +238 -0
  282. package/dist/shared/CodeComboBox.js.map +1 -0
  283. package/dist/shared/DefinitionField.d.ts +9 -4
  284. package/dist/shared/DefinitionField.d.ts.map +1 -1
  285. package/dist/shared/DefinitionField.js +98 -78
  286. package/dist/shared/DefinitionField.js.map +1 -1
  287. package/dist/shared/builtIn.d.ts +7 -3
  288. package/dist/shared/builtIn.d.ts.map +1 -1
  289. package/dist/shared/builtIn.js +39 -7
  290. package/dist/shared/builtIn.js.map +1 -1
  291. package/dist/shared/check.d.ts +27 -0
  292. package/dist/shared/check.d.ts.map +1 -0
  293. package/dist/shared/check.js +18 -0
  294. package/dist/shared/check.js.map +1 -0
  295. package/dist/shared/context.d.ts +33 -5
  296. package/dist/shared/context.d.ts.map +1 -1
  297. package/dist/shared/context.js +36 -20
  298. package/dist/shared/context.js.map +1 -1
  299. package/dist/shared/cx.js.map +1 -1
  300. package/dist/shared/dates.js +2 -2
  301. package/dist/shared/dates.js.map +1 -1
  302. package/dist/shared/embed.d.ts +19 -0
  303. package/dist/shared/embed.d.ts.map +1 -0
  304. package/dist/shared/embed.js +14 -0
  305. package/dist/shared/embed.js.map +1 -0
  306. package/dist/shared/entry.d.ts +13 -4
  307. package/dist/shared/entry.d.ts.map +1 -1
  308. package/dist/shared/entry.js +24 -7
  309. package/dist/shared/entry.js.map +1 -1
  310. package/dist/shared/flow.d.ts +8 -0
  311. package/dist/shared/flow.d.ts.map +1 -0
  312. package/dist/shared/flow.js +38 -0
  313. package/dist/shared/flow.js.map +1 -0
  314. package/dist/shared/part.d.ts +26 -0
  315. package/dist/shared/part.d.ts.map +1 -0
  316. package/dist/shared/part.js +64 -0
  317. package/dist/shared/part.js.map +1 -0
  318. package/dist/shared/relation.js.map +1 -1
  319. package/dist/shared/reveal.d.ts +16 -0
  320. package/dist/shared/reveal.d.ts.map +1 -0
  321. package/dist/shared/reveal.js +46 -0
  322. package/dist/shared/reveal.js.map +1 -0
  323. package/dist/shared/types.d.ts +12 -0
  324. package/dist/shared/types.d.ts.map +1 -1
  325. package/dist/slug/SlugField.css +18 -0
  326. package/dist/slug/SlugField.d.ts +33 -5
  327. package/dist/slug/SlugField.d.ts.map +1 -1
  328. package/dist/slug/SlugField.js +346 -126
  329. package/dist/slug/SlugField.js.map +1 -1
  330. package/dist/slug/SlugField.module.js +14 -0
  331. package/dist/slug/SlugField.module.js.map +1 -0
  332. package/dist/slug/index.d.ts +1 -1
  333. package/dist/slug/index.d.ts.map +1 -1
  334. package/dist/slug/index.js +1 -1
  335. package/dist/tags/TagsField.d.ts +17 -0
  336. package/dist/tags/TagsField.d.ts.map +1 -0
  337. package/dist/tags/TagsField.js +120 -0
  338. package/dist/tags/TagsField.js.map +1 -0
  339. package/dist/tags/index.d.ts +2 -0
  340. package/dist/tags/index.d.ts.map +1 -0
  341. package/dist/tags/index.js +1 -0
  342. package/dist/tel/TelField.css +25 -0
  343. package/dist/tel/TelField.d.ts +34 -0
  344. package/dist/tel/TelField.d.ts.map +1 -0
  345. package/dist/tel/TelField.js +390 -0
  346. package/dist/tel/TelField.js.map +1 -0
  347. package/dist/tel/TelField.module.js +12 -0
  348. package/dist/tel/TelField.module.js.map +1 -0
  349. package/dist/tel/index.d.ts +3 -0
  350. package/dist/tel/index.d.ts.map +1 -0
  351. package/dist/tel/index.js +3 -0
  352. package/dist/tel/phone.d.ts +59 -0
  353. package/dist/tel/phone.d.ts.map +1 -0
  354. package/dist/tel/phone.js +107 -0
  355. package/dist/tel/phone.js.map +1 -0
  356. package/dist/text/TextField.d.ts +12 -4
  357. package/dist/text/TextField.d.ts.map +1 -1
  358. package/dist/text/TextField.js +104 -60
  359. package/dist/text/TextField.js.map +1 -1
  360. package/dist/text/index.d.ts +1 -1
  361. package/dist/textarea/TextAreaField.d.ts +1 -1
  362. package/dist/textarea/TextAreaField.js.map +1 -1
  363. package/dist/textarea/index.d.ts +1 -1
  364. package/dist/time/TimeField.d.ts +1 -1
  365. package/dist/time/TimeField.js +64 -10
  366. package/dist/time/TimeField.js.map +1 -1
  367. package/dist/time/index.d.ts +1 -1
  368. package/dist/upload/FilePicker.css +24 -0
  369. package/dist/upload/FilePicker.d.ts +14 -0
  370. package/dist/upload/FilePicker.d.ts.map +1 -0
  371. package/dist/upload/FilePicker.js +130 -0
  372. package/dist/upload/FilePicker.js.map +1 -0
  373. package/dist/upload/FilePicker.module.js +12 -0
  374. package/dist/upload/FilePicker.module.js.map +1 -0
  375. package/dist/upload/UploadList.css +93 -0
  376. package/dist/upload/UploadList.d.ts +18 -0
  377. package/dist/upload/UploadList.d.ts.map +1 -0
  378. package/dist/upload/UploadList.js +144 -0
  379. package/dist/upload/UploadList.js.map +1 -0
  380. package/dist/upload/UploadList.module.js +32 -0
  381. package/dist/upload/UploadList.module.js.map +1 -0
  382. package/dist/upload/files.d.ts +5 -0
  383. package/dist/upload/files.d.ts.map +1 -0
  384. package/dist/upload/files.js +26 -0
  385. package/dist/upload/files.js.map +1 -0
  386. package/dist/upload/types.d.ts +58 -0
  387. package/dist/upload/types.d.ts.map +1 -0
  388. package/dist/upload/useRejectionMessage.d.ts +4 -0
  389. package/dist/upload/useRejectionMessage.d.ts.map +1 -0
  390. package/dist/upload/useRejectionMessage.js +25 -0
  391. package/dist/upload/useRejectionMessage.js.map +1 -0
  392. package/dist/upload/useUploads.d.ts +30 -0
  393. package/dist/upload/useUploads.d.ts.map +1 -0
  394. package/dist/upload/useUploads.js +115 -0
  395. package/dist/upload/useUploads.js.map +1 -0
  396. package/dist/uppy/index.d.ts +3 -0
  397. package/dist/uppy/index.d.ts.map +1 -0
  398. package/dist/uppy/index.js +1 -0
  399. package/dist/uppy/uploader.d.ts +44 -0
  400. package/dist/uppy/uploader.d.ts.map +1 -0
  401. package/dist/uppy/uploader.js +139 -0
  402. package/dist/uppy/uploader.js.map +1 -0
  403. package/dist/url/UrlField.d.ts +2 -2
  404. package/dist/url/UrlField.d.ts.map +1 -1
  405. package/dist/url/UrlField.js +69 -14
  406. package/dist/url/UrlField.js.map +1 -1
  407. package/dist/url/index.d.ts +1 -1
  408. package/package.json +110 -7
@@ -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"}
@@ -1,2 +1,2 @@
1
- export { EmailField, EmailFieldEntry, type EmailFieldProps } from './EmailField';
1
+ export { EmailField, EmailFieldEntry, type EmailFieldProps } from './EmailField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -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,29 @@
1
+ import type { EmbedValue } from '@panneau/protocol';
2
+ import type { EmbedSource } from '../shared/embed.js';
3
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
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
+ * The providers an embed may come from (`YouTube`), compared without case: the `providers`
11
+ * rule (decision 0058). The field names them under its help, and refuses an embed of another
12
+ * provider as soon as its preview comes back. The form's errors, once shown, replace that one.
13
+ */
14
+ providers?: readonly string[];
15
+ }
16
+ /** Whether a value is an embed: an object with a `url`. */
17
+ export declare function isEmbed(value: unknown): value is EmbedValue;
18
+ /**
19
+ * A URL of a video, a sound or a post, with the preview the backend gets from its provider's
20
+ * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
21
+ * preview follows. Without an embed source, the value is the URL alone.
22
+ */
23
+ export declare function EmbedField({ value, onChange, onBlur, embedSource: embedSourceProp, providers, errors, disabled, readOnly, required, description, ...props }: EmbedFieldProps): import("react").JSX.Element;
24
+ /**
25
+ * The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its
26
+ * `providers` rule names the providers it allows.
27
+ */
28
+ export declare function EmbedFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
29
+ //# sourceMappingURL=EmbedField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.d.ts","sourceRoot":"","sources":["../../src/embed/EmbedField.tsx"],"names":[],"mappings":"AAGA,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;IACjC;;;;OAIG;IACH,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,2DAA2D;AAC3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAM3D;AAgBD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,EACvB,KAAK,EACL,QAAQ,EACR,MAAM,EACN,WAAW,EAAE,eAAe,EAC5B,SAAS,EACT,MAAW,EACX,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,GAAG,KAAK,EACX,EAAE,eAAe,+BAmGjB;AAUD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,eAAe,+BAUrD"}
@@ -0,0 +1,309 @@
1
+ import { findRule, getFieldProps, isString } from "../shared/entry.js";
2
+ import { useFieldsContext } from "../shared/context.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 { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
+ import { useEffect, useEffectEvent, useState } from "react";
9
+ import { formsMessages } from "@panneau/intl";
10
+ //#region src/embed/EmbedField.tsx
11
+ var RESOLVE_DELAY = 500;
12
+ /** Whether a value is an embed: an object with a `url`. */
13
+ function isEmbed(value) {
14
+ return value !== null && typeof value === "object" && isString(value.url);
15
+ }
16
+ /** Whether an embed comes from one of the providers. One without a provider is left to the backend. */
17
+ function isAllowed(value, providers) {
18
+ if (providers === void 0 || providers.length === 0 || value.provider === void 0) return true;
19
+ const provider = value.provider.toLowerCase();
20
+ return providers.some((allowed) => allowed.toLowerCase() === provider);
21
+ }
22
+ /** Whether a value has been resolved: it has more than its URL. */
23
+ function isResolved(value) {
24
+ return Object.keys(value).some((key) => key !== "url");
25
+ }
26
+ /**
27
+ * A URL of a video, a sound or a post, with the preview the backend gets from its provider's
28
+ * oEmbed: its thumbnail, title and provider. The URL is kept as soon as it is typed, and its
29
+ * preview follows. Without an embed source, the value is the URL alone.
30
+ */
31
+ function EmbedField(t0) {
32
+ const $ = c(60);
33
+ let description;
34
+ let disabled;
35
+ let embedSourceProp;
36
+ let onBlur;
37
+ let onChange;
38
+ let props;
39
+ let providers;
40
+ let readOnly;
41
+ let required;
42
+ let t1;
43
+ let value;
44
+ if ($[0] !== t0) {
45
+ ({value, onChange, onBlur, embedSource: embedSourceProp, providers, errors: t1, disabled, readOnly, required, description, ...props} = t0);
46
+ $[0] = t0;
47
+ $[1] = description;
48
+ $[2] = disabled;
49
+ $[3] = embedSourceProp;
50
+ $[4] = onBlur;
51
+ $[5] = onChange;
52
+ $[6] = props;
53
+ $[7] = providers;
54
+ $[8] = readOnly;
55
+ $[9] = required;
56
+ $[10] = t1;
57
+ $[11] = value;
58
+ } else {
59
+ description = $[1];
60
+ disabled = $[2];
61
+ embedSourceProp = $[3];
62
+ onBlur = $[4];
63
+ onChange = $[5];
64
+ props = $[6];
65
+ providers = $[7];
66
+ readOnly = $[8];
67
+ required = $[9];
68
+ t1 = $[10];
69
+ value = $[11];
70
+ }
71
+ let t2;
72
+ if ($[12] !== t1) {
73
+ t2 = t1 === void 0 ? [] : t1;
74
+ $[12] = t1;
75
+ $[13] = t2;
76
+ } else t2 = $[13];
77
+ const errors = t2;
78
+ const intl = usePanneauIntl();
79
+ const context = useFieldsContext();
80
+ const embedSource = embedSourceProp === void 0 ? context.embedSource : embedSourceProp;
81
+ const url = value?.url ?? "";
82
+ const [status, setStatus] = useState(null);
83
+ const pending = value !== null && value !== void 0 && !isResolved(value) ? value.url : null;
84
+ let t3;
85
+ if ($[14] !== onChange) {
86
+ t3 = (embed) => onChange?.(embed);
87
+ $[14] = onChange;
88
+ $[15] = t3;
89
+ } else t3 = $[15];
90
+ const resolved = useEffectEvent(t3);
91
+ let t4;
92
+ if ($[16] !== embedSource || $[17] !== pending || $[18] !== resolved) {
93
+ t4 = () => {
94
+ if (embedSource === null || pending === null || !URL.canParse(pending)) return;
95
+ const controller = new AbortController();
96
+ const timeout = window.setTimeout(() => {
97
+ setStatus({
98
+ url: pending,
99
+ state: "loading"
100
+ });
101
+ embedSource.resolve(pending, { signal: controller.signal }).then((embed_0) => {
102
+ setStatus(null);
103
+ resolved({
104
+ ...embed_0,
105
+ url: pending
106
+ });
107
+ }).catch(() => {
108
+ if (!controller.signal.aborted) setStatus({
109
+ url: pending,
110
+ state: "failed"
111
+ });
112
+ });
113
+ }, RESOLVE_DELAY);
114
+ return () => {
115
+ window.clearTimeout(timeout);
116
+ controller.abort();
117
+ };
118
+ };
119
+ $[16] = embedSource;
120
+ $[17] = pending;
121
+ $[18] = resolved;
122
+ $[19] = t4;
123
+ } else t4 = $[19];
124
+ let t5;
125
+ if ($[20] !== embedSource || $[21] !== pending) {
126
+ t5 = [embedSource, pending];
127
+ $[20] = embedSource;
128
+ $[21] = pending;
129
+ $[22] = t5;
130
+ } else t5 = $[22];
131
+ useEffect(t4, t5);
132
+ const current = status !== null && status.url === url ? status.state : null;
133
+ let providerList;
134
+ let t6;
135
+ if ($[23] !== current || $[24] !== intl || $[25] !== providers || $[26] !== value) {
136
+ providerList = providers !== void 0 && providers.length > 0 ? intl.formatList(providers, { type: "disjunction" }) : null;
137
+ t6 = current === "failed" ? intl.formatMessage(messages.embedFailed) : value !== null && value !== void 0 && providerList !== null && !isAllowed(value, providers) ? intl.formatMessage(formsMessages.rule.providers, { providers: providerList }) : null;
138
+ $[23] = current;
139
+ $[24] = intl;
140
+ $[25] = providers;
141
+ $[26] = value;
142
+ $[27] = providerList;
143
+ $[28] = t6;
144
+ } else {
145
+ providerList = $[27];
146
+ t6 = $[28];
147
+ }
148
+ const ownError = t6;
149
+ let t7;
150
+ if ($[29] !== errors || $[30] !== ownError) {
151
+ t7 = ownError !== null && errors.length === 0 ? [ownError] : errors;
152
+ $[29] = errors;
153
+ $[30] = ownError;
154
+ $[31] = t7;
155
+ } else t7 = $[31];
156
+ const shownErrors = t7;
157
+ let t8;
158
+ if ($[32] !== description || $[33] !== intl || $[34] !== providerList || $[35] !== providers) {
159
+ t8 = providerList !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [description !== void 0 && description !== null ? /* @__PURE__ */ jsxs(Fragment, { children: [description, " "] }) : null, intl.formatMessage(messages.embedProviders, { providers: intl.formatList(providers ?? [], { type: "conjunction" }) })] }) : description;
160
+ $[32] = description;
161
+ $[33] = intl;
162
+ $[34] = providerList;
163
+ $[35] = providers;
164
+ $[36] = t8;
165
+ } else t8 = $[36];
166
+ const help = t8;
167
+ let t9;
168
+ if ($[37] !== onChange) {
169
+ t9 = (next) => onChange?.(next.trim() === "" ? null : { url: next.trim() });
170
+ $[37] = onChange;
171
+ $[38] = t9;
172
+ } else t9 = $[38];
173
+ let t10;
174
+ if ($[39] !== onBlur) {
175
+ t10 = () => onBlur?.();
176
+ $[39] = onBlur;
177
+ $[40] = t10;
178
+ } else t10 = $[40];
179
+ let t11;
180
+ if ($[41] !== disabled || $[42] !== help || $[43] !== props || $[44] !== readOnly || $[45] !== required || $[46] !== shownErrors || $[47] !== t10 || $[48] !== t9 || $[49] !== url) {
181
+ t11 = /* @__PURE__ */ jsx(TextInput, {
182
+ ...props,
183
+ type: "url",
184
+ inputMode: "url",
185
+ autoComplete: "off",
186
+ value: url,
187
+ onChange: t9,
188
+ onBlur: t10,
189
+ errors: shownErrors,
190
+ description: help,
191
+ isDisabled: disabled,
192
+ isReadOnly: readOnly,
193
+ isRequired: required
194
+ });
195
+ $[41] = disabled;
196
+ $[42] = help;
197
+ $[43] = props;
198
+ $[44] = readOnly;
199
+ $[45] = required;
200
+ $[46] = shownErrors;
201
+ $[47] = t10;
202
+ $[48] = t9;
203
+ $[49] = url;
204
+ $[50] = t11;
205
+ } else t11 = $[50];
206
+ let t12;
207
+ if ($[51] !== current || $[52] !== intl) {
208
+ t12 = current === "loading" ? /* @__PURE__ */ jsxs("div", {
209
+ className: EmbedField_module_default.status,
210
+ role: "status",
211
+ children: [/* @__PURE__ */ jsx(Spinner, { size: "sm" }), intl.formatMessage(messages.embedLoading)]
212
+ }) : null;
213
+ $[51] = current;
214
+ $[52] = intl;
215
+ $[53] = t12;
216
+ } else t12 = $[53];
217
+ let t13;
218
+ if ($[54] !== value) {
219
+ t13 = value !== null && value !== void 0 && isResolved(value) ? /* @__PURE__ */ jsxs("a", {
220
+ className: EmbedField_module_default.preview,
221
+ href: value.url,
222
+ target: "_blank",
223
+ rel: "noreferrer",
224
+ children: [value.thumbnailUrl !== void 0 ? /* @__PURE__ */ jsx("img", {
225
+ className: EmbedField_module_default.thumbnail,
226
+ src: value.thumbnailUrl,
227
+ alt: ""
228
+ }) : null, /* @__PURE__ */ jsxs("span", {
229
+ className: EmbedField_module_default.text,
230
+ children: [/* @__PURE__ */ jsx("span", {
231
+ className: EmbedField_module_default.title,
232
+ children: value.title ?? value.url
233
+ }), value.provider !== void 0 ? /* @__PURE__ */ jsx("span", {
234
+ className: EmbedField_module_default.provider,
235
+ children: value.provider
236
+ }) : null]
237
+ })]
238
+ }) : null;
239
+ $[54] = value;
240
+ $[55] = t13;
241
+ } else t13 = $[55];
242
+ let t14;
243
+ if ($[56] !== t11 || $[57] !== t12 || $[58] !== t13) {
244
+ t14 = /* @__PURE__ */ jsxs("div", {
245
+ className: EmbedField_module_default.embed,
246
+ children: [
247
+ t11,
248
+ t12,
249
+ t13
250
+ ]
251
+ });
252
+ $[56] = t11;
253
+ $[57] = t12;
254
+ $[58] = t13;
255
+ $[59] = t14;
256
+ } else t14 = $[59];
257
+ return t14;
258
+ }
259
+ /** The providers of a `providers` rule, if the field has one. */
260
+ function getProviders(field) {
261
+ const rule = findRule(field, "providers");
262
+ return rule !== void 0 && "value" in rule && Array.isArray(rule.value) ? rule.value.filter(isString) : void 0;
263
+ }
264
+ /**
265
+ * The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its
266
+ * `providers` rule names the providers it allows.
267
+ */
268
+ function EmbedFieldEntry(props) {
269
+ const $ = c(11);
270
+ let t0;
271
+ if ($[0] !== props.field) {
272
+ t0 = getProviders(props.field);
273
+ $[0] = props.field;
274
+ $[1] = t0;
275
+ } else t0 = $[1];
276
+ const providers = t0;
277
+ let t1;
278
+ if ($[2] !== props) {
279
+ t1 = getFieldProps(props);
280
+ $[2] = props;
281
+ $[3] = t1;
282
+ } else t1 = $[3];
283
+ const t2 = isEmbed(props.value) ? props.value : null;
284
+ let t3;
285
+ if ($[4] !== providers) {
286
+ t3 = providers !== void 0 ? { providers } : {};
287
+ $[4] = providers;
288
+ $[5] = t3;
289
+ } else t3 = $[5];
290
+ let t4;
291
+ if ($[6] !== props.onChange || $[7] !== t1 || $[8] !== t2 || $[9] !== t3) {
292
+ t4 = /* @__PURE__ */ jsx(EmbedField, {
293
+ ...t1,
294
+ value: t2,
295
+ onChange: props.onChange,
296
+ ...t3
297
+ });
298
+ $[6] = props.onChange;
299
+ $[7] = t1;
300
+ $[8] = t2;
301
+ $[9] = t3;
302
+ $[10] = t4;
303
+ } else t4 = $[10];
304
+ return t4;
305
+ }
306
+ //#endregion
307
+ export { EmbedField, EmbedFieldEntry, isEmbed };
308
+
309
+ //# sourceMappingURL=EmbedField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.js","names":["ReactNode","useEffect","useEffectEvent","useState","formsMessages","EmbedValue","Spinner","TextInput","usePanneauIntl","useFieldsContext","EmbedSource","findRule","getFieldProps","isString","messages","FieldEntryProps","FieldProps","styles","RESOLVE_DELAY","EmbedFieldProps","placeholder","embedSource","providers","isEmbed","value","Record","url","isAllowed","undefined","length","provider","toLowerCase","some","allowed","isResolved","Object","keys","key","EmbedField","t0","$","_c","description","disabled","embedSourceProp","onBlur","onChange","props","readOnly","required","t1","errors","t2","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","providerList","t6","formatList","type","formatMessage","embedFailed","rule","ownError","t7","shownErrors","t8","embedProviders","help","t9","next","trim","t10","t11","t12","embedLoading","t13","preview","thumbnailUrl","thumbnail","text","title","t14","getProviders","field","Array","isArray","filter","EmbedFieldEntry","_c","_Fragment","styles"],"sources":["../../src/embed/EmbedField.tsx"],"sourcesContent":["import { type ReactNode, useEffect, useEffectEvent, useState } from 'react';\n\nimport { formsMessages } from '@panneau/intl';\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 { findRule, 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 * The providers an embed may come from (`YouTube`), compared without case: the `providers`\n * rule (decision 0058). The field names them under its help, and refuses an embed of another\n * provider as soon as its preview comes back. The form's errors, once shown, replace that one.\n */\n providers?: readonly string[];\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 an embed comes from one of the providers. One without a provider is left to the backend. */\nfunction isAllowed(value: EmbedValue, providers: readonly string[] | undefined): boolean {\n if (providers === undefined || providers.length === 0 || value.provider === undefined) {\n return true;\n }\n const provider = value.provider.toLowerCase();\n return providers.some((allowed) => allowed.toLowerCase() === provider);\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 providers,\n errors = [],\n disabled,\n readOnly,\n required,\n description,\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 providerList =\n providers !== undefined && providers.length > 0\n ? intl.formatList(providers, { type: 'disjunction' })\n : null;\n const ownError =\n current === 'failed'\n ? intl.formatMessage(messages.embedFailed)\n : value !== null &&\n value !== undefined &&\n providerList !== null &&\n !isAllowed(value, providers)\n ? intl.formatMessage(formsMessages.rule.providers, { providers: providerList })\n : null;\n const shownErrors = ownError !== null && errors.length === 0 ? [ownError] : errors;\n const help: ReactNode =\n providerList !== null ? (\n <>\n {description !== undefined && description !== null ? <>{description} </> : null}\n {intl.formatMessage(messages.embedProviders, {\n providers: intl.formatList(providers ?? [], { type: 'conjunction' }),\n })}\n </>\n ) : (\n description\n );\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 description={help}\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 providers of a `providers` rule, if the field has one. */\nfunction getProviders(field: FieldEntryProps['field']): string[] | undefined {\n const rule = findRule(field, 'providers');\n return rule !== undefined && 'value' in rule && Array.isArray(rule.value)\n ? rule.value.filter(isString)\n : undefined;\n}\n\n/**\n * The `embed` type: its preview comes from the embed source of the `FieldsProvider`, and its\n * `providers` rule names the providers it allows.\n */\nexport function EmbedFieldEntry(props: FieldEntryProps) {\n const providers = getProviders(props.field);\n return (\n <EmbedField\n {...getFieldProps(props)}\n value={isEmbed(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(providers !== undefined ? { providers } : {})}\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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmbedField.module.js","names":[],"sources":["../../src/embed/EmbedField.module.css"],"sourcesContent":["/* The URL, then the preview of what it embeds. */\n.embed {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-2);\n}\n\n.status {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-2);\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n\n.preview {\n display: flex;\n align-items: center;\n gap: var(--panneau-space-3);\n padding: var(--panneau-space-2);\n color: var(--panneau-color-text);\n text-decoration: none;\n background-color: var(--panneau-color-surface-sunken);\n border: var(--panneau-border-width) solid var(--panneau-color-border);\n border-radius: var(--panneau-radius-md);\n}\n\n.preview:hover {\n border-color: var(--panneau-color-border-control);\n}\n\n.preview:focus-visible {\n outline: var(--panneau-focus-width) solid var(--panneau-color-focus);\n outline-offset: 1px;\n}\n\n.thumbnail {\n flex: none;\n width: 7rem;\n aspect-ratio: 16 / 9;\n object-fit: cover;\n border-radius: var(--panneau-radius-sm);\n}\n\n.text {\n display: flex;\n flex-direction: column;\n gap: 0.125rem;\n min-width: 0;\n}\n\n.title {\n font-weight: var(--panneau-font-weight-medium);\n overflow-wrap: anywhere;\n}\n\n.provider {\n font-size: var(--panneau-font-size-sm);\n color: var(--panneau-color-text-muted);\n}\n"],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { EmbedField, EmbedFieldEntry, type EmbedFieldProps, type EmbedValue, isEmbed, } from './EmbedField.js';
2
+ export { type EmbedAdapter, type EmbedSource, createEmbedSource } from '../shared/embed.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/embed/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EACV,eAAe,EACf,KAAK,eAAe,EACpB,KAAK,UAAU,EACf,OAAO,GACV,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { EmbedField, EmbedFieldEntry, isEmbed } from "./EmbedField.js";
2
+ import { createEmbedSource } from "../shared/embed.js";
3
+ export { EmbedField, EmbedFieldEntry, createEmbedSource, isEmbed };
@@ -0,0 +1,54 @@
1
+ .panneau-file-field-field {
2
+ display: grid;
3
+ gap: var(--panneau-space-2);
4
+ }
5
+
6
+ .panneau-file-field-files {
7
+ display: grid;
8
+ gap: var(--panneau-space-1);
9
+ margin: 0;
10
+ padding: 0;
11
+ list-style: none;
12
+ }
13
+
14
+ .panneau-file-field-file {
15
+ display: flex;
16
+ align-items: center;
17
+ gap: var(--panneau-space-2);
18
+ min-height: var(--panneau-control-height-sm);
19
+ padding-inline: var(--panneau-space-2) var(--panneau-space-1);
20
+ background-color: var(--panneau-color-surface-sunken);
21
+ border: var(--panneau-border-width) solid var(--panneau-color-border);
22
+ border-radius: var(--panneau-radius-md);
23
+ }
24
+
25
+ .panneau-file-field-icon {
26
+ flex: none;
27
+ width: 1rem;
28
+ height: 1rem;
29
+ color: var(--panneau-color-text-muted);
30
+ }
31
+
32
+ .panneau-file-field-name {
33
+ flex: 1 1 auto;
34
+ min-width: 0;
35
+ overflow: hidden;
36
+ font-size: var(--panneau-font-size-sm);
37
+ text-overflow: ellipsis;
38
+ white-space: nowrap;
39
+ }
40
+
41
+ a.panneau-file-field-name {
42
+ color: var(--panneau-color-link);
43
+ }
44
+
45
+ .panneau-file-field-size {
46
+ flex: none;
47
+ font-size: var(--panneau-font-size-sm);
48
+ color: var(--panneau-color-text-muted);
49
+ }
50
+
51
+ .panneau-file-field-none {
52
+ font-size: var(--panneau-font-size-md);
53
+ color: var(--panneau-color-text-muted);
54
+ }
@@ -0,0 +1,50 @@
1
+ import type { StoredFile } from '@panneau/protocol';
2
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
+ import type { UploadSource, UploadedFile } from '../upload/types.js';
4
+ /**
5
+ * A file of a `file` value: a stored file, as items give it; an upload, once the browser sent the
6
+ * file to storage; or the file itself, sent in a multipart request without direct uploads.
7
+ */
8
+ export type FileValue = StoredFile | UploadedFile | File;
9
+ export interface FileFieldBaseProps extends Omit<FieldProps<never>, 'value' | 'onChange'> {
10
+ /** Accepted MIME types (`application/pdf`, `image/*`). Others are refused before they are sent. */
11
+ accept?: readonly string[] | null;
12
+ /** Largest file, in bytes. Larger ones are refused before they are sent. */
13
+ maxSize?: number | null;
14
+ /**
15
+ * Where files are uploaded directly to storage. Defaults to the one of the fields context.
16
+ * Without one, the value holds the files themselves, which the adapter sends in
17
+ * `multipart/form-data`.
18
+ */
19
+ uploadSource?: UploadSource | null;
20
+ }
21
+ export interface SingleFileFieldProps extends FileFieldBaseProps {
22
+ multiple?: false;
23
+ value?: FileValue | null;
24
+ onChange?: (value: FileValue | null) => void;
25
+ }
26
+ export interface MultipleFileFieldProps extends FileFieldBaseProps {
27
+ multiple: true;
28
+ value?: readonly FileValue[] | null;
29
+ /** Called with the files. An empty list is `null`. */
30
+ onChange?: (value: FileValue[] | null) => void;
31
+ }
32
+ export type FileFieldProps = SingleFileFieldProps | MultipleFileFieldProps;
33
+ /** Whether a value is a file of a `file` value. */
34
+ export declare function isFileValue(value: unknown): value is FileValue;
35
+ /** The files of a value, single or multiple. */
36
+ export declare function toFiles(value: unknown): FileValue[];
37
+ /**
38
+ * Files that belong to an item, outside the media library: an attachment, a PDF, a CSV (the
39
+ * `file` type). With an upload source, files go directly to storage, and the value references
40
+ * each upload (`{ upload, name, mime, size }`). Without one, the value is the file itself. Items
41
+ * give stored files, which the field shows with a link. A new file replaces the file of a single
42
+ * value, and is added to a multiple one.
43
+ */
44
+ export declare function FileField(props: FileFieldProps): import("react").JSX.Element;
45
+ /**
46
+ * The registry entry of the `file` type: the field's `multiple`, `accept` (or its `accept` rule)
47
+ * and `maxSize` rule, with the upload source of the fields context.
48
+ */
49
+ export declare function FileFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
50
+ //# sourceMappingURL=FileField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FileField.d.ts","sourceRoot":"","sources":["../../src/file/FileField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAMpD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAInE,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;AAEzD,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IACrF,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB;;;;OAIG;IACH,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC5D,QAAQ,CAAC,EAAE,KAAK,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,KAAK,IAAI,CAAC;CAChD;AAED,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAC9D,QAAQ,EAAE,IAAI,CAAC;IACf,KAAK,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,IAAI,CAAC;IACpC,sDAAsD;IACtD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;AAY3E,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAS9D;AAED,gDAAgD;AAChD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,EAAE,CAKnD;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BAiI9C;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAYpD"}