@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,11 +1,16 @@
1
- import { useFieldsContext } from "../shared/context.js";
2
1
  import { cx } from "../shared/cx.js";
3
2
  import { getFieldProps } from "../shared/entry.js";
3
+ import { useFieldsContext } from "../shared/context.js";
4
+ import { messages } from "../shared/messages.js";
5
+ import { useRevealer } from "../shared/reveal.js";
4
6
  import LocalizedField_module_default from "./LocalizedField.module.js";
5
7
  import { NestedField } from "../shared/DefinitionField.js";
6
8
  import { c } from "react/compiler-runtime";
7
- import { Fieldset, usePanneauIntl } from "@panneau/ui";
8
- import { jsx } from "react/jsx-runtime";
9
+ import { isFilled } from "@panneau/protocol/runtime";
10
+ import { Fieldset, Icon, SegmentedControl, usePanneauIntl } from "@panneau/ui";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { Plus } from "lucide-react";
13
+ import { useState } from "react";
9
14
  //#region src/localized/LocalizedField.tsx
10
15
  /** The name of a locale in the UI's language, capitalized (`Français`, `English`). */
11
16
  function useLocaleName() {
@@ -29,27 +34,114 @@ function useLocaleName() {
29
34
  return t0;
30
35
  }
31
36
  /**
32
- * A value per locale, with an input for each locale under one legend. A value without any locale
33
- * filled is `null`.
37
+ * A value per locale: one locale at a time, under the field's label, with a switch at the end of
38
+ * the label's line for the others. The switch marks the locales in error, and the empty ones: to
39
+ * fill in when the field is required, to add otherwise. A value without any locale filled is
40
+ * `null`.
34
41
  */
35
42
  function LocalizedField(t0) {
36
- const $ = c(33);
37
- const { locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, className, labelClassName, descriptionClassName, errorsClassName, localeClassName } = t0;
43
+ const $ = c(58);
44
+ const { locales, children, value, onChange, onBlur, label, description, errors, disabled, readOnly, required, locale, onLocaleChange, invalidLocales: t1, className, labelClassName, descriptionClassName, errorsClassName, localeClassName } = t0;
45
+ let t2;
46
+ if ($[0] !== t1) {
47
+ t2 = t1 === void 0 ? [] : t1;
48
+ $[0] = t1;
49
+ $[1] = t2;
50
+ } else t2 = $[1];
51
+ const invalidLocales = t2;
52
+ const intl = usePanneauIntl();
38
53
  const localeName = useLocaleName();
39
- let t1;
40
- if ($[0] !== children || $[1] !== disabled || $[2] !== localeClassName || $[3] !== localeName || $[4] !== locales || $[5] !== onBlur || $[6] !== onChange || $[7] !== readOnly || $[8] !== required || $[9] !== value) {
41
- let t2;
42
- if ($[11] !== children || $[12] !== disabled || $[13] !== localeClassName || $[14] !== localeName || $[15] !== onBlur || $[16] !== onChange || $[17] !== readOnly || $[18] !== required || $[19] !== value) {
43
- t2 = (locale) => /* @__PURE__ */ jsx("div", {
54
+ const [uncontrolled, setUncontrolled] = useState(locales[0]);
55
+ const wanted = locale ?? uncontrolled;
56
+ let t3;
57
+ if ($[2] !== locales || $[3] !== wanted) {
58
+ t3 = wanted !== void 0 && locales.includes(wanted) ? wanted : locales[0];
59
+ $[2] = locales;
60
+ $[3] = wanted;
61
+ $[4] = t3;
62
+ } else t3 = $[4];
63
+ const current = t3;
64
+ let t4;
65
+ if ($[5] !== intl || $[6] !== invalidLocales || $[7] !== localeName || $[8] !== locales || $[9] !== required || $[10] !== value) {
66
+ let t5;
67
+ if ($[12] !== intl || $[13] !== invalidLocales || $[14] !== localeName || $[15] !== required || $[16] !== value) {
68
+ t5 = (option, index) => {
69
+ const name = localeName(option);
70
+ const invalid = invalidLocales.includes(option);
71
+ const empty = !isFilled(value?.[option]);
72
+ const addable = !invalid && empty && required !== true && index > 0;
73
+ let textValue = name;
74
+ if (invalid) textValue = intl.formatMessage(messages.localeInvalid, { locale: name });
75
+ else if (addable) textValue = intl.formatMessage(messages.addLocale, { locale: name });
76
+ else if (empty) textValue = intl.formatMessage(messages.localeEmpty, { locale: name });
77
+ return {
78
+ value: option,
79
+ textValue,
80
+ label: /* @__PURE__ */ jsxs("span", {
81
+ className: LocalizedField_module_default.option,
82
+ children: [
83
+ addable ? /* @__PURE__ */ jsx(Icon, {
84
+ icon: Plus,
85
+ size: "sm"
86
+ }) : null,
87
+ option.toUpperCase(),
88
+ invalid ? /* @__PURE__ */ jsx("span", { className: cx(LocalizedField_module_default.marker, LocalizedField_module_default.invalid) }) : null,
89
+ !invalid && empty && required === true ? /* @__PURE__ */ jsx("span", { className: cx(LocalizedField_module_default.marker, LocalizedField_module_default.empty) }) : null
90
+ ]
91
+ })
92
+ };
93
+ };
94
+ $[12] = intl;
95
+ $[13] = invalidLocales;
96
+ $[14] = localeName;
97
+ $[15] = required;
98
+ $[16] = value;
99
+ $[17] = t5;
100
+ } else t5 = $[17];
101
+ t4 = locales.map(t5);
102
+ $[5] = intl;
103
+ $[6] = invalidLocales;
104
+ $[7] = localeName;
105
+ $[8] = locales;
106
+ $[9] = required;
107
+ $[10] = value;
108
+ $[11] = t4;
109
+ } else t4 = $[11];
110
+ const options = t4;
111
+ let t5;
112
+ if ($[18] !== current || $[19] !== intl || $[20] !== locales.length || $[21] !== onLocaleChange || $[22] !== options) {
113
+ t5 = locales.length > 1 ? /* @__PURE__ */ jsx(SegmentedControl, {
114
+ size: "sm",
115
+ "aria-label": intl.formatMessage(messages.locales),
116
+ options,
117
+ ...current !== void 0 ? { value: current } : {},
118
+ onChange: (next) => {
119
+ setUncontrolled(next);
120
+ onLocaleChange?.(next);
121
+ }
122
+ }) : void 0;
123
+ $[18] = current;
124
+ $[19] = intl;
125
+ $[20] = locales.length;
126
+ $[21] = onLocaleChange;
127
+ $[22] = options;
128
+ $[23] = t5;
129
+ } else t5 = $[23];
130
+ let t6;
131
+ if ($[24] !== children || $[25] !== current || $[26] !== disabled || $[27] !== localeClassName || $[28] !== localeName || $[29] !== locales || $[30] !== onBlur || $[31] !== onChange || $[32] !== readOnly || $[33] !== required || $[34] !== value) {
132
+ let t7;
133
+ if ($[36] !== children || $[37] !== current || $[38] !== disabled || $[39] !== localeClassName || $[40] !== localeName || $[41] !== onBlur || $[42] !== onChange || $[43] !== readOnly || $[44] !== required || $[45] !== value) {
134
+ t7 = (option_0) => /* @__PURE__ */ jsx("div", {
44
135
  className: cx(LocalizedField_module_default.locale, localeClassName),
136
+ hidden: option_0 !== current,
45
137
  children: children({
46
- locale,
47
- label: localeName(locale),
48
- value: value?.[locale] ?? null,
49
- onChange: (next) => {
138
+ locale: option_0,
139
+ label: localeName(option_0),
140
+ value: value?.[option_0] ?? null,
141
+ onChange: (next_0) => {
50
142
  const updated = {
51
143
  ...value,
52
- [locale]: next
144
+ [option_0]: next_0
53
145
  };
54
146
  const filled = Object.values(updated).some(_temp);
55
147
  onChange?.(filled ? updated : null);
@@ -59,44 +151,38 @@ function LocalizedField(t0) {
59
151
  ...readOnly !== void 0 ? { readOnly } : {},
60
152
  ...required !== void 0 ? { required } : {}
61
153
  })
62
- }, locale);
63
- $[11] = children;
64
- $[12] = disabled;
65
- $[13] = localeClassName;
66
- $[14] = localeName;
67
- $[15] = onBlur;
68
- $[16] = onChange;
69
- $[17] = readOnly;
70
- $[18] = required;
71
- $[19] = value;
72
- $[20] = t2;
73
- } else t2 = $[20];
74
- t1 = locales.map(t2);
75
- $[0] = children;
76
- $[1] = disabled;
77
- $[2] = localeClassName;
78
- $[3] = localeName;
79
- $[4] = locales;
80
- $[5] = onBlur;
81
- $[6] = onChange;
82
- $[7] = readOnly;
83
- $[8] = required;
84
- $[9] = value;
85
- $[10] = t1;
86
- } else t1 = $[10];
87
- let t2;
88
- if ($[21] !== t1) {
89
- t2 = /* @__PURE__ */ jsx("div", {
90
- className: LocalizedField_module_default.locales,
91
- children: t1
92
- });
93
- $[21] = t1;
94
- $[22] = t2;
95
- } else t2 = $[22];
96
- let t3;
97
- if ($[23] !== className || $[24] !== description || $[25] !== descriptionClassName || $[26] !== errors || $[27] !== errorsClassName || $[28] !== label || $[29] !== labelClassName || $[30] !== required || $[31] !== t2) {
98
- t3 = /* @__PURE__ */ jsx(Fieldset, {
154
+ }, option_0);
155
+ $[36] = children;
156
+ $[37] = current;
157
+ $[38] = disabled;
158
+ $[39] = localeClassName;
159
+ $[40] = localeName;
160
+ $[41] = onBlur;
161
+ $[42] = onChange;
162
+ $[43] = readOnly;
163
+ $[44] = required;
164
+ $[45] = value;
165
+ $[46] = t7;
166
+ } else t7 = $[46];
167
+ t6 = locales.map(t7);
168
+ $[24] = children;
169
+ $[25] = current;
170
+ $[26] = disabled;
171
+ $[27] = localeClassName;
172
+ $[28] = localeName;
173
+ $[29] = locales;
174
+ $[30] = onBlur;
175
+ $[31] = onChange;
176
+ $[32] = readOnly;
177
+ $[33] = required;
178
+ $[34] = value;
179
+ $[35] = t6;
180
+ } else t6 = $[35];
181
+ let t7;
182
+ if ($[47] !== className || $[48] !== description || $[49] !== descriptionClassName || $[50] !== errors || $[51] !== errorsClassName || $[52] !== label || $[53] !== labelClassName || $[54] !== required || $[55] !== t5 || $[56] !== t6) {
183
+ t7 = /* @__PURE__ */ jsx(Fieldset, {
99
184
  legend: label,
185
+ legendEnd: t5,
100
186
  description,
101
187
  errors,
102
188
  isRequired: required,
@@ -104,30 +190,36 @@ function LocalizedField(t0) {
104
190
  legendClassName: labelClassName,
105
191
  descriptionClassName,
106
192
  errorsClassName,
107
- children: t2
193
+ children: t6
108
194
  });
109
- $[23] = className;
110
- $[24] = description;
111
- $[25] = descriptionClassName;
112
- $[26] = errors;
113
- $[27] = errorsClassName;
114
- $[28] = label;
115
- $[29] = labelClassName;
116
- $[30] = required;
117
- $[31] = t2;
118
- $[32] = t3;
119
- } else t3 = $[32];
120
- return t3;
195
+ $[47] = className;
196
+ $[48] = description;
197
+ $[49] = descriptionClassName;
198
+ $[50] = errors;
199
+ $[51] = errorsClassName;
200
+ $[52] = label;
201
+ $[53] = labelClassName;
202
+ $[54] = required;
203
+ $[55] = t5;
204
+ $[56] = t6;
205
+ $[57] = t7;
206
+ } else t7 = $[57];
207
+ return t7;
121
208
  }
122
- /**
123
- * A field of the definition with `localized: true`: the field of its type for each locale of the
124
- * fields context, each at its own path (`title.fr`).
125
- */
209
+ /** The locale of a path inside a localized field (`title.en`, `body.en.0` in `title`), if any. */
126
210
  function _temp(entry) {
127
211
  return entry !== null && entry !== void 0 && entry !== "";
128
212
  }
213
+ function localeOf(path, fieldPath, locales) {
214
+ return locales.find((locale) => path === `${fieldPath}.${locale}` || path.startsWith(`${fieldPath}.${locale}.`));
215
+ }
216
+ /**
217
+ * A field of the definition with `localized: true`: the field of its type for each locale of the
218
+ * fields context, each at its own path (`title.fr`). It shows the locale of a path the form
219
+ * reveals, such as the first error on submit.
220
+ */
129
221
  function LocalizedFieldEntry(props) {
130
- const $ = c(22);
222
+ const $ = c(36);
131
223
  const { locales: contextLocales } = useFieldsContext();
132
224
  const { field, path, value } = props;
133
225
  let t0;
@@ -145,22 +237,56 @@ function LocalizedFieldEntry(props) {
145
237
  $[4] = t1;
146
238
  } else t1 = $[4];
147
239
  const locales = t1;
240
+ const [locale, setLocale] = useState(locales[0]);
148
241
  let t2;
149
- if ($[5] !== props) {
150
- t2 = getFieldProps(props);
151
- $[5] = props;
152
- $[6] = t2;
153
- } else t2 = $[6];
154
- let chrome;
155
- if ($[7] !== t2) {
156
- const { name: _name, onBlur: _onBlur, ...t3 } = t2;
157
- chrome = t3;
242
+ if ($[5] !== locales || $[6] !== path) {
243
+ t2 = (revealed) => {
244
+ const found = localeOf(revealed, path, locales);
245
+ if (found !== void 0) setLocale(found);
246
+ };
247
+ $[5] = locales;
248
+ $[6] = path;
158
249
  $[7] = t2;
159
- $[8] = chrome;
160
- } else chrome = $[8];
250
+ } else t2 = $[7];
251
+ useRevealer(t2);
161
252
  let t3;
162
- if ($[9] !== field || $[10] !== path || $[11] !== props.disabled || $[12] !== props.onBlur || $[13] !== props.parentValue || $[14] !== props.readOnly) {
163
- t3 = (input) => /* @__PURE__ */ jsx(NestedField, {
253
+ if ($[8] !== locales || $[9] !== path || $[10] !== props.invalidPaths) {
254
+ let t4;
255
+ if ($[12] !== path || $[13] !== props.invalidPaths) {
256
+ t4 = (candidate) => (props.invalidPaths ?? []).some((invalid) => localeOf(invalid, path, [candidate]) !== void 0);
257
+ $[12] = path;
258
+ $[13] = props.invalidPaths;
259
+ $[14] = t4;
260
+ } else t4 = $[14];
261
+ t3 = locales.filter(t4);
262
+ $[8] = locales;
263
+ $[9] = path;
264
+ $[10] = props.invalidPaths;
265
+ $[11] = t3;
266
+ } else t3 = $[11];
267
+ const invalidLocales = t3;
268
+ let t4;
269
+ if ($[15] !== props) {
270
+ t4 = getFieldProps(props);
271
+ $[15] = props;
272
+ $[16] = t4;
273
+ } else t4 = $[16];
274
+ let chrome;
275
+ if ($[17] !== t4) {
276
+ const { name: _name, onBlur: _onBlur, ...t5 } = t4;
277
+ chrome = t5;
278
+ $[17] = t4;
279
+ $[18] = chrome;
280
+ } else chrome = $[18];
281
+ let t5;
282
+ if ($[19] !== locale) {
283
+ t5 = locale !== void 0 ? { locale } : {};
284
+ $[19] = locale;
285
+ $[20] = t5;
286
+ } else t5 = $[20];
287
+ let t6;
288
+ if ($[21] !== field || $[22] !== path || $[23] !== props.disabled || $[24] !== props.onBlur || $[25] !== props.parentValue || $[26] !== props.readOnly) {
289
+ t6 = (input) => /* @__PURE__ */ jsx(NestedField, {
164
290
  field: {
165
291
  ...field,
166
292
  localized: false,
@@ -172,34 +298,41 @@ function LocalizedFieldEntry(props) {
172
298
  onChange: input.onChange,
173
299
  ...props.onBlur !== void 0 ? { onBlur: props.onBlur } : {},
174
300
  parentValue: props.parentValue,
301
+ locale: input.locale,
302
+ hideLabel: true,
175
303
  ...props.disabled !== void 0 ? { disabled: props.disabled } : {},
176
304
  ...props.readOnly !== void 0 ? { readOnly: props.readOnly } : {}
177
305
  });
178
- $[9] = field;
179
- $[10] = path;
180
- $[11] = props.disabled;
181
- $[12] = props.onBlur;
182
- $[13] = props.parentValue;
183
- $[14] = props.readOnly;
184
- $[15] = t3;
185
- } else t3 = $[15];
186
- let t4;
187
- if ($[16] !== chrome || $[17] !== locales || $[18] !== props.onChange || $[19] !== record || $[20] !== t3) {
188
- t4 = /* @__PURE__ */ jsx(LocalizedField, {
306
+ $[21] = field;
307
+ $[22] = path;
308
+ $[23] = props.disabled;
309
+ $[24] = props.onBlur;
310
+ $[25] = props.parentValue;
311
+ $[26] = props.readOnly;
312
+ $[27] = t6;
313
+ } else t6 = $[27];
314
+ let t7;
315
+ if ($[28] !== chrome || $[29] !== invalidLocales || $[30] !== locales || $[31] !== props.onChange || $[32] !== record || $[33] !== t5 || $[34] !== t6) {
316
+ t7 = /* @__PURE__ */ jsx(LocalizedField, {
189
317
  ...chrome,
190
318
  locales,
191
319
  value: record,
192
320
  onChange: props.onChange,
193
- children: t3
321
+ ...t5,
322
+ onLocaleChange: setLocale,
323
+ invalidLocales,
324
+ children: t6
194
325
  });
195
- $[16] = chrome;
196
- $[17] = locales;
197
- $[18] = props.onChange;
198
- $[19] = record;
199
- $[20] = t3;
200
- $[21] = t4;
201
- } else t4 = $[21];
202
- return t4;
326
+ $[28] = chrome;
327
+ $[29] = invalidLocales;
328
+ $[30] = locales;
329
+ $[31] = props.onChange;
330
+ $[32] = record;
331
+ $[33] = t5;
332
+ $[34] = t6;
333
+ $[35] = t7;
334
+ } else t7 = $[35];
335
+ return t7;
203
336
  }
204
337
  //#endregion
205
338
  export { LocalizedField, LocalizedFieldEntry, useLocaleName };
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedField.js","names":["name","locale","label","description","errors","required","className","labelClassName","descriptionClassName","errorsClassName","locales","record","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Fieldset, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /** Name of the locale in the UI's language, as the input's label. */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale, with an input for each locale under one legend. A value without any locale\n * filled is `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const localeName = useLocaleName();\n return (\n <Fieldset\n legend={label}\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n <div className={styles.locales}>\n {locales.map((locale) => (\n <div key={locale} className={cx(styles.locale, localeClassName)}>\n {children({\n locale,\n label: localeName(locale),\n value: value?.[locale] ?? null,\n onChange: (next) => {\n const updated = { ...value, [locale]: next };\n const filled = Object.values(updated).some(\n (entry) =>\n entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </div>\n </Fieldset>\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`).\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"LocalizedField.js","names":["Plus","ReactNode","useState","isFilled","Fieldset","Icon","SegmentedControl","usePanneauIntl","NestedField","useFieldsContext","cx","getFieldProps","messages","useRevealer","FieldEntryProps","FieldProps","styles","LocalizedValue","Partial","Record","V","LocalizedInputProps","locale","label","value","onChange","onBlur","disabled","readOnly","required","LocalizedFieldProps","locales","children","props","onLocaleChange","invalidLocales","localeClassName","useLocaleName","$","_c","intl","t0","name","formatDisplayName","type","undefined","text","toUpperCase","charAt","toLocaleUpperCase","slice","LocalizedField","description","errors","t1","className","labelClassName","descriptionClassName","errorsClassName","t2","localeName","uncontrolled","setUncontrolled","wanted","t3","includes","current","t4","t5","option","index","invalid","empty","addable","textValue","formatMessage","localeInvalid","addLocale","localeEmpty","marker","map","options","length","next","t6","t7","option_0","next_0","updated","filled","Object","values","some","_temp","entry","localeOf","path","fieldPath","find","startsWith","LocalizedFieldEntry","contextLocales","field","Array","isArray","record","keys","setLocale","revealed","found","invalidPaths","candidate","filter","chrome","_name","_onBlur","parentValue","input","localized","help","_c","styles"],"sources":["../../src/localized/LocalizedField.tsx"],"sourcesContent":["import { Plus } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport { isFilled } from '@panneau/protocol/runtime';\nimport { Fieldset, Icon, SegmentedControl, usePanneauIntl } from '@panneau/ui';\n\nimport { NestedField } from '../shared/DefinitionField';\nimport { useFieldsContext } from '../shared/context';\nimport { cx } from '../shared/cx';\nimport { getFieldProps } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport { useRevealer } from '../shared/reveal';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport styles from './LocalizedField.module.css';\n\n/** A localized value: a value per locale (`{ fr: 'Été', en: 'Summer' }`). */\nexport type LocalizedValue<V> = Partial<Record<string, V | null>>;\n\n/** What `LocalizedField` gives the input of each locale. */\nexport interface LocalizedInputProps<V> {\n locale: string;\n /**\n * Name of the locale in the UI's language. The field shows the locales: give it to the input\n * as its `aria-label`, not as a visible label.\n */\n label: string;\n value: V | null;\n onChange: (value: V | null) => void;\n onBlur?: () => void;\n disabled?: boolean;\n readOnly?: boolean;\n required?: boolean;\n}\n\nexport interface LocalizedFieldProps<V> extends FieldProps<LocalizedValue<V>> {\n /** Locales, in order. The first one shows first. */\n locales: readonly string[];\n /** Renders the input of a locale. */\n children: (props: LocalizedInputProps<V>) => ReactNode;\n /** The locale shown. Controlled with `onLocaleChange`. */\n locale?: string;\n onLocaleChange?: (locale: string) => void;\n /** Locales whose value has errors: their switch shows it. */\n invalidLocales?: readonly string[];\n localeClassName?: string;\n}\n\n/** The name of a locale in the UI's language, capitalized (`Français`, `English`). */\nexport function useLocaleName(): (locale: string) => string {\n const intl = usePanneauIntl();\n return (locale) => {\n let name: string | undefined;\n try {\n name = intl.formatDisplayName(locale, { type: 'language' });\n } catch {\n name = undefined;\n }\n const text = name ?? locale.toUpperCase();\n return text.charAt(0).toLocaleUpperCase(intl.locale) + text.slice(1);\n };\n}\n\n/**\n * A value per locale: one locale at a time, under the field's label, with a switch at the end of\n * the label's line for the others. The switch marks the locales in error, and the empty ones: to\n * fill in when the field is required, to add otherwise. A value without any locale filled is\n * `null`.\n */\nexport function LocalizedField<V>({\n locales,\n children,\n value,\n onChange,\n onBlur,\n label,\n description,\n errors,\n disabled,\n readOnly,\n required,\n locale,\n onLocaleChange,\n invalidLocales = [],\n className,\n labelClassName,\n descriptionClassName,\n errorsClassName,\n localeClassName,\n}: LocalizedFieldProps<V>) {\n const intl = usePanneauIntl();\n const localeName = useLocaleName();\n const [uncontrolled, setUncontrolled] = useState(locales[0]);\n const wanted = locale ?? uncontrolled;\n const current = wanted !== undefined && locales.includes(wanted) ? wanted : locales[0];\n\n const options = locales.map((option, index) => {\n const name = localeName(option);\n const invalid = invalidLocales.includes(option);\n const empty = !isFilled(value?.[option]);\n // An empty locale after the first is a translation to add, unless every locale is required.\n const addable = !invalid && empty && required !== true && index > 0;\n let textValue = name;\n if (invalid) {\n textValue = intl.formatMessage(messages.localeInvalid, { locale: name });\n } else if (addable) {\n textValue = intl.formatMessage(messages.addLocale, { locale: name });\n } else if (empty) {\n textValue = intl.formatMessage(messages.localeEmpty, { locale: name });\n }\n return {\n value: option,\n textValue,\n label: (\n <span className={styles.option}>\n {addable ? <Icon icon={Plus} size=\"sm\" /> : null}\n {option.toUpperCase()}\n {invalid ? <span className={cx(styles.marker, styles.invalid)} /> : null}\n {!invalid && empty && required === true ? (\n <span className={cx(styles.marker, styles.empty)} />\n ) : null}\n </span>\n ),\n };\n });\n\n return (\n <Fieldset\n legend={label}\n legendEnd={\n locales.length > 1 ? (\n <SegmentedControl\n size=\"sm\"\n aria-label={intl.formatMessage(messages.locales)}\n options={options}\n {...(current !== undefined ? { value: current } : {})}\n onChange={(next) => {\n setUncontrolled(next);\n onLocaleChange?.(next);\n }}\n />\n ) : undefined\n }\n description={description}\n errors={errors}\n isRequired={required}\n className={className}\n legendClassName={labelClassName}\n descriptionClassName={descriptionClassName}\n errorsClassName={errorsClassName}\n >\n {locales.map((option) => (\n // Every locale stays mounted: inputs keep their state, and errors can be revealed.\n <div\n key={option}\n className={cx(styles.locale, localeClassName)}\n hidden={option !== current}\n >\n {children({\n locale: option,\n label: localeName(option),\n value: value?.[option] ?? null,\n onChange: (next) => {\n const updated = { ...value, [option]: next };\n const filled = Object.values(updated).some(\n (entry) => entry !== null && entry !== undefined && entry !== '',\n );\n onChange?.(filled ? updated : null);\n },\n ...(onBlur !== undefined ? { onBlur } : {}),\n ...(disabled !== undefined ? { disabled } : {}),\n ...(readOnly !== undefined ? { readOnly } : {}),\n ...(required !== undefined ? { required } : {}),\n })}\n </div>\n ))}\n </Fieldset>\n );\n}\n\n/** The locale of a path inside a localized field (`title.en`, `body.en.0` in `title`), if any. */\nfunction localeOf(path: string, fieldPath: string, locales: readonly string[]) {\n return locales.find(\n (locale) => path === `${fieldPath}.${locale}` || path.startsWith(`${fieldPath}.${locale}.`),\n );\n}\n\n/**\n * A field of the definition with `localized: true`: the field of its type for each locale of the\n * fields context, each at its own path (`title.fr`). It shows the locale of a path the form\n * reveals, such as the first error on submit.\n */\nexport function LocalizedFieldEntry(props: FieldEntryProps) {\n const { locales: contextLocales } = useFieldsContext();\n const { field, path, value } = props;\n const record =\n value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : {};\n const locales = contextLocales.length > 0 ? contextLocales : Object.keys(record);\n const [locale, setLocale] = useState(locales[0]);\n useRevealer((revealed) => {\n const found = localeOf(revealed, path, locales);\n if (found !== undefined) {\n setLocale(found);\n }\n });\n const invalidLocales = locales.filter((candidate) =>\n (props.invalidPaths ?? []).some(\n (invalid) => localeOf(invalid, path, [candidate]) !== undefined,\n ),\n );\n const { name: _name, onBlur: _onBlur, ...chrome } = getFieldProps(props);\n return (\n <LocalizedField<unknown>\n {...chrome}\n locales={locales}\n value={record}\n onChange={props.onChange}\n {...(locale !== undefined ? { locale } : {})}\n onLocaleChange={setLocale}\n invalidLocales={invalidLocales}\n >\n {(input) => (\n <NestedField\n field={{ ...field, localized: false, label: input.label, help: undefined }}\n path={`${path}.${input.locale}`}\n value={input.value}\n onChange={input.onChange}\n {...(props.onBlur !== undefined ? { onBlur: props.onBlur } : {})}\n parentValue={props.parentValue}\n locale={input.locale}\n hideLabel\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n {...(props.readOnly !== undefined ? { readOnly: props.readOnly } : {})}\n />\n )}\n </LocalizedField>\n );\n}\n"],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import "./LocalizedField.css";
2
2
  //#region src/localized/LocalizedField.module.css
3
- var locales = "panneau-localized-field-locales";
4
3
  var locale = "panneau-localized-field-locale";
4
+ var option = "panneau-localized-field-option";
5
+ var marker = "panneau-localized-field-marker";
6
+ var invalid = "panneau-localized-field-invalid";
7
+ var empty = "panneau-localized-field-empty";
5
8
  var LocalizedField_module_default = {
6
- locales,
7
- locale
9
+ locale,
10
+ option,
11
+ marker,
12
+ invalid,
13
+ empty
8
14
  };
9
15
  //#endregion
10
- export { LocalizedField_module_default as default, locale, locales };
16
+ export { LocalizedField_module_default as default, empty, invalid, locale, marker, option };
11
17
 
12
18
  //# sourceMappingURL=LocalizedField.module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalizedField.module.js","names":[],"sources":["../../src/localized/LocalizedField.module.css"],"sourcesContent":[".locales {\n display: flex;\n flex-direction: column;\n gap: var(--panneau-space-3);\n}\n\n.locale {\n min-width: 0;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"LocalizedField.module.js","names":[],"sources":["../../src/localized/LocalizedField.module.css"],"sourcesContent":[".locale {\n min-width: 0;\n}\n\n.locale[hidden] {\n display: none;\n}\n\n.option {\n display: inline-flex;\n align-items: center;\n gap: var(--panneau-space-1);\n letter-spacing: 0.02em;\n}\n\n.marker {\n flex: 0 0 auto;\n width: 0.45em;\n height: 0.45em;\n background-color: currentcolor;\n border-radius: 50%;\n}\n\n.invalid {\n color: var(--panneau-color-danger);\n}\n\n.empty {\n color: var(--panneau-color-warning);\n}\n"],"mappings":""}
@@ -1,2 +1,2 @@
1
- export { LocalizedField, LocalizedFieldEntry, type LocalizedFieldProps, type LocalizedInputProps, type LocalizedValue, useLocaleName, } from './LocalizedField';
1
+ export { LocalizedField, LocalizedFieldEntry, type LocalizedFieldProps, type LocalizedInputProps, type LocalizedValue, useLocaleName, } from './LocalizedField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,54 @@
1
+ /* The search, the map, then the coordinates and the address. */
2
+ .panneau-location-field-location {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: var(--panneau-space-2);
6
+ }
7
+
8
+ .panneau-location-field-map {
9
+ position: relative;
10
+ z-index: 0;
11
+ height: 16rem;
12
+ overflow: hidden;
13
+ background-color: var(--panneau-color-surface-sunken);
14
+ border: var(--panneau-border-width) solid var(--panneau-color-border-control);
15
+ border-radius: var(--panneau-radius-md);
16
+ }
17
+
18
+ .panneau-location-field-map:focus-visible {
19
+ outline: var(--panneau-focus-width) solid var(--panneau-color-focus);
20
+ outline-offset: 1px;
21
+ }
22
+
23
+ /* A pin: a round head pointing down at the point. */
24
+ .panneau-location-field-marker {
25
+ background: none;
26
+ border: 0;
27
+ }
28
+
29
+ .panneau-location-field-pin {
30
+ display: block;
31
+ width: 100%;
32
+ height: 100%;
33
+ box-sizing: border-box;
34
+ background-color: var(--panneau-color-accent);
35
+ border: 2px solid var(--panneau-color-surface);
36
+ border-radius: 50% 50% 50% 0;
37
+ box-shadow: var(--panneau-shadow-sm);
38
+ rotate: -45deg;
39
+ }
40
+
41
+ .panneau-location-field-coordinates {
42
+ display: flex;
43
+ flex-wrap: wrap;
44
+ align-items: flex-end;
45
+ gap: var(--panneau-space-2);
46
+ }
47
+
48
+ .panneau-location-field-coordinate {
49
+ flex: 1 1 8rem;
50
+ }
51
+
52
+ .panneau-location-field-remove {
53
+ flex: none;
54
+ }
@@ -0,0 +1,31 @@
1
+ import type { LocationValue } from '@panneau/protocol';
2
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
+ import { type Point } from './LocationMap.js';
4
+ import type { GeocodingSource, MapTiles } from './types.js';
5
+ export type { LocationValue };
6
+ /** OpenStreetMap's standard tiles: fine for an admin panel, with their credit. */
7
+ export declare const OPEN_STREET_MAP_TILES: MapTiles;
8
+ export interface LocationFieldProps extends FieldProps<LocationValue> {
9
+ /** The address search. Defaults to that of the `FieldsProvider`; without one, there is none. */
10
+ geocoding?: GeocodingSource | null;
11
+ /** The tiles of the map. Defaults to those of the `FieldsProvider`, or OpenStreetMap's. */
12
+ tiles?: MapTiles;
13
+ /** Where the map opens without a point. Defaults to the whole world. */
14
+ center?: Point;
15
+ /** Zoom of the map on a point. Defaults to 15. */
16
+ zoom?: number;
17
+ }
18
+ /** Whether a value is a point. */
19
+ export declare function isLocation(value: unknown): value is LocationValue;
20
+ /**
21
+ * A point on a map, and its address. Clicking the map or dragging the marker places the point,
22
+ * and its latitude and longitude can be typed. With an address search, a place found sets the
23
+ * point and the address; with a reverse search, placing a point fills an empty address.
24
+ */
25
+ export declare function LocationField({ value, onChange, onBlur, geocoding: geocodingProp, tiles: tilesProp, center, zoom, label, description, errors, disabled, readOnly, required, className, }: LocationFieldProps): import("react").JSX.Element;
26
+ /**
27
+ * The `location` type: settings `zoom`, `center` (`{ "lat", "lng" }`, where the map opens without
28
+ * a point) and `tiles` (`{ "url", "attribution" }`), over the maps of the `FieldsProvider`.
29
+ */
30
+ export declare function LocationFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
31
+ //# sourceMappingURL=LocationField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocationField.d.ts","sourceRoot":"","sources":["../../src/location/LocationField.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAavD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAExD,OAAO,KAAK,EAAmB,eAAe,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,kFAAkF;AAClF,eAAO,MAAM,qBAAqB,EAAE,QAKnC,CAAC;AAIF,MAAM,WAAW,kBAAmB,SAAQ,UAAU,CAAC,aAAa,CAAC;IACjE,gGAAgG;IAChG,SAAS,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;IACnC,2FAA2F;IAC3F,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,wEAAwE;IACxE,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,aAAa,CAOjE;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,EAC1B,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EAAE,aAAa,EACxB,KAAK,EAAE,SAAS,EAChB,MAAuB,EACvB,IAAS,EACT,KAAK,EACL,WAAW,EACX,MAAM,EACN,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,SAAS,GACZ,EAAE,kBAAkB,+BA0KpB;AAMD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,eAAe,+BAwBxD"}