@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,5 +1,5 @@
1
- import type { ReactNode } from 'react';
2
- import type { FieldEntryProps, FieldProps } from '../shared/types';
1
+ import { type ReactNode } from 'react';
2
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
3
3
  export interface TextFieldProps extends FieldProps<string> {
4
4
  placeholder?: string;
5
5
  /** Shows a count of characters against this maximum. It doesn't stop typing. */
@@ -12,13 +12,21 @@ export interface TextFieldProps extends FieldProps<string> {
12
12
  type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';
13
13
  inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';
14
14
  autoComplete?: string;
15
+ /**
16
+ * A secret, such as an access key: typed in a password input, hidden until a button shows it,
17
+ * and never filled in by the browser.
18
+ */
19
+ secret?: boolean;
15
20
  controlClassName?: string;
16
21
  inputClassName?: string;
17
22
  }
18
23
  /** The description of a text field, with its character count. */
19
24
  export declare function useCountedDescription(description: ReactNode, value: string | null | undefined, maxLength: number | undefined): ReactNode;
20
25
  /** A single-line text. An empty text is `null`. */
21
- export declare function TextField({ value, onChange, description, maxLength, disabled, readOnly, required, ...props }: TextFieldProps): import("react").JSX.Element;
22
- /** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
26
+ export declare function TextField({ value, onChange, description, maxLength, disabled, readOnly, required, secret, ...props }: TextFieldProps): import("react").JSX.Element;
27
+ /**
28
+ * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`
29
+ * rule.
30
+ */
23
31
  export declare function TextFieldEntry(props: FieldEntryProps): import("react").JSX.Element;
24
32
  //# sourceMappingURL=TextField.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/text/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAMvC,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,SAAS,EACtB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAiBX;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,GAAG,KAAK,EACX,EAAE,cAAc,+BAahB;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAepD"}
1
+ {"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../../src/text/TextField.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAMjD,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,WAAW,cAAe,SAAQ,UAAU,CAAC,MAAM,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,kDAAkD;IAClD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,GAAG,QAAQ,CAAC;IAChE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACzF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,iEAAiE;AACjE,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,SAAS,EACtB,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAChC,SAAS,EAAE,MAAM,GAAG,SAAS,GAC9B,SAAS,CAiBX;AAED,mDAAmD;AACnD,wBAAgB,SAAS,CAAC,EACtB,KAAK,EACL,QAAQ,EACR,WAAW,EACX,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,QAAQ,EACR,MAAc,EACd,GAAG,KAAK,EACX,EAAE,cAAc,+BAkChB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,eAAe,+BAiBpD"}
@@ -1,8 +1,10 @@
1
- import { getFieldProps, getRuleNumber, getSetting, isString } from "../shared/entry.js";
1
+ import { getFieldProps, getRuleNumber, getSetting, isBoolean, isString } from "../shared/entry.js";
2
2
  import { messages } from "../shared/messages.js";
3
3
  import { c } from "react/compiler-runtime";
4
- import { TextInput, usePanneauIntl } from "@panneau/ui";
4
+ import { IconButton, TextInput, usePanneauIntl } from "@panneau/ui";
5
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
6
+ import { Eye, EyeOff } from "lucide-react";
7
+ import { useState } from "react";
6
8
  //#region src/text/TextField.tsx
7
9
  /** The description of a text field, with its character count. */
8
10
  function useCountedDescription(description, value, maxLength) {
@@ -43,7 +45,7 @@ function useCountedDescription(description, value, maxLength) {
43
45
  }
44
46
  /** A single-line text. An empty text is `null`. */
45
47
  function TextField(t0) {
46
- const $ = c(19);
48
+ const $ = c(26);
47
49
  let description;
48
50
  let disabled;
49
51
  let maxLength;
@@ -51,9 +53,10 @@ function TextField(t0) {
51
53
  let props;
52
54
  let readOnly;
53
55
  let required;
56
+ let t1;
54
57
  let value;
55
58
  if ($[0] !== t0) {
56
- ({value, onChange, description, maxLength, disabled, readOnly, required, ...props} = t0);
59
+ ({value, onChange, description, maxLength, disabled, readOnly, required, secret: t1, ...props} = t0);
57
60
  $[0] = t0;
58
61
  $[1] = description;
59
62
  $[2] = disabled;
@@ -62,7 +65,8 @@ function TextField(t0) {
62
65
  $[5] = props;
63
66
  $[6] = readOnly;
64
67
  $[7] = required;
65
- $[8] = value;
68
+ $[8] = t1;
69
+ $[9] = value;
66
70
  } else {
67
71
  description = $[1];
68
72
  disabled = $[2];
@@ -71,41 +75,72 @@ function TextField(t0) {
71
75
  props = $[5];
72
76
  readOnly = $[6];
73
77
  required = $[7];
74
- value = $[8];
78
+ t1 = $[8];
79
+ value = $[9];
75
80
  }
81
+ const secret = t1 === void 0 ? false : t1;
82
+ const intl = usePanneauIntl();
76
83
  const shownDescription = useCountedDescription(description, value, maxLength);
77
- const t1 = value ?? "";
84
+ const [shown, setShown] = useState(false);
78
85
  let t2;
79
- if ($[9] !== onChange) {
80
- t2 = (next) => onChange?.(next === "" ? null : next);
81
- $[9] = onChange;
82
- $[10] = t2;
83
- } else t2 = $[10];
84
- let t3;
85
- if ($[11] !== disabled || $[12] !== props || $[13] !== readOnly || $[14] !== required || $[15] !== shownDescription || $[16] !== t1 || $[17] !== t2) {
86
- t3 = /* @__PURE__ */ jsx(TextInput, {
86
+ if ($[10] !== disabled || $[11] !== intl || $[12] !== secret || $[13] !== shown) {
87
+ t2 = secret ? {
88
+ type: shown ? "text" : "password",
89
+ autoComplete: "new-password",
90
+ spellCheck: "false",
91
+ suffix: /* @__PURE__ */ jsx(IconButton, {
92
+ icon: shown ? EyeOff : Eye,
93
+ label: intl.formatMessage(shown ? messages.hideSecret : messages.showSecret),
94
+ size: "sm",
95
+ "aria-pressed": shown,
96
+ isDisabled: disabled,
97
+ onPress: () => setShown(!shown)
98
+ })
99
+ } : {};
100
+ $[10] = disabled;
101
+ $[11] = intl;
102
+ $[12] = secret;
103
+ $[13] = shown;
104
+ $[14] = t2;
105
+ } else t2 = $[14];
106
+ const secretProps = t2;
107
+ const t3 = value ?? "";
108
+ let t4;
109
+ if ($[15] !== onChange) {
110
+ t4 = (next) => onChange?.(next === "" ? null : next);
111
+ $[15] = onChange;
112
+ $[16] = t4;
113
+ } else t4 = $[16];
114
+ let t5;
115
+ if ($[17] !== disabled || $[18] !== props || $[19] !== readOnly || $[20] !== required || $[21] !== secretProps || $[22] !== shownDescription || $[23] !== t3 || $[24] !== t4) {
116
+ t5 = /* @__PURE__ */ jsx(TextInput, {
87
117
  ...props,
88
- value: t1,
89
- onChange: t2,
118
+ ...secretProps,
119
+ value: t3,
120
+ onChange: t4,
90
121
  description: shownDescription,
91
122
  isDisabled: disabled,
92
123
  isReadOnly: readOnly,
93
124
  isRequired: required
94
125
  });
95
- $[11] = disabled;
96
- $[12] = props;
97
- $[13] = readOnly;
98
- $[14] = required;
99
- $[15] = shownDescription;
100
- $[16] = t1;
101
- $[17] = t2;
102
- $[18] = t3;
103
- } else t3 = $[18];
104
- return t3;
126
+ $[17] = disabled;
127
+ $[18] = props;
128
+ $[19] = readOnly;
129
+ $[20] = required;
130
+ $[21] = secretProps;
131
+ $[22] = shownDescription;
132
+ $[23] = t3;
133
+ $[24] = t4;
134
+ $[25] = t5;
135
+ } else t5 = $[25];
136
+ return t5;
105
137
  }
106
- /** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */
138
+ /**
139
+ * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`
140
+ * rule.
141
+ */
107
142
  function TextFieldEntry(props) {
108
- const $ = c(21);
143
+ const $ = c(24);
109
144
  const { field } = props;
110
145
  let t0;
111
146
  if ($[0] !== field) {
@@ -129,49 +164,58 @@ function TextFieldEntry(props) {
129
164
  } else t2 = $[5];
130
165
  const max = t2;
131
166
  let t3;
132
- if ($[6] !== props) {
133
- t3 = getFieldProps(props);
134
- $[6] = props;
167
+ if ($[6] !== field) {
168
+ t3 = getSetting(field, "secret", isBoolean) ?? false;
169
+ $[6] = field;
135
170
  $[7] = t3;
136
171
  } else t3 = $[7];
137
- const t4 = isString(props.value) ? props.value : null;
138
- let t5;
139
- if ($[8] !== max) {
140
- t5 = max !== void 0 ? { maxLength: max } : {};
141
- $[8] = max;
142
- $[9] = t5;
143
- } else t5 = $[9];
172
+ const secret = t3;
173
+ let t4;
174
+ if ($[8] !== props) {
175
+ t4 = getFieldProps(props);
176
+ $[8] = props;
177
+ $[9] = t4;
178
+ } else t4 = $[9];
179
+ const t5 = isString(props.value) ? props.value : null;
144
180
  let t6;
145
- if ($[10] !== prefix) {
146
- t6 = prefix !== void 0 ? { prefix } : {};
147
- $[10] = prefix;
181
+ if ($[10] !== max) {
182
+ t6 = max !== void 0 ? { maxLength: max } : {};
183
+ $[10] = max;
148
184
  $[11] = t6;
149
185
  } else t6 = $[11];
150
186
  let t7;
151
- if ($[12] !== suffix) {
152
- t7 = suffix !== void 0 ? { suffix } : {};
153
- $[12] = suffix;
187
+ if ($[12] !== prefix) {
188
+ t7 = prefix !== void 0 ? { prefix } : {};
189
+ $[12] = prefix;
154
190
  $[13] = t7;
155
191
  } else t7 = $[13];
156
192
  let t8;
157
- if ($[14] !== props.onChange || $[15] !== t3 || $[16] !== t4 || $[17] !== t5 || $[18] !== t6 || $[19] !== t7) {
158
- t8 = /* @__PURE__ */ jsx(TextField, {
159
- ...t3,
160
- value: t4,
193
+ if ($[14] !== suffix) {
194
+ t8 = suffix !== void 0 ? { suffix } : {};
195
+ $[14] = suffix;
196
+ $[15] = t8;
197
+ } else t8 = $[15];
198
+ let t9;
199
+ if ($[16] !== props.onChange || $[17] !== secret || $[18] !== t4 || $[19] !== t5 || $[20] !== t6 || $[21] !== t7 || $[22] !== t8) {
200
+ t9 = /* @__PURE__ */ jsx(TextField, {
201
+ ...t4,
202
+ value: t5,
161
203
  onChange: props.onChange,
162
- ...t5,
163
204
  ...t6,
164
- ...t7
205
+ ...t7,
206
+ ...t8,
207
+ secret
165
208
  });
166
- $[14] = props.onChange;
167
- $[15] = t3;
168
- $[16] = t4;
169
- $[17] = t5;
170
- $[18] = t6;
171
- $[19] = t7;
172
- $[20] = t8;
173
- } else t8 = $[20];
174
- return t8;
209
+ $[16] = props.onChange;
210
+ $[17] = secret;
211
+ $[18] = t4;
212
+ $[19] = t5;
213
+ $[20] = t6;
214
+ $[21] = t7;
215
+ $[22] = t8;
216
+ $[23] = t9;
217
+ } else t9 = $[23];
218
+ return t9;
175
219
  }
176
220
  //#endregion
177
221
  export { TextField, TextFieldEntry, useCountedDescription };
@@ -1 +1 @@
1
- {"version":3,"file":"TextField.js","names":["count","description","shownDescription","disabled","readOnly","required","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextInput\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `text` type: settings `prefix` and `suffix`, and a character count from the `max` rule. */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextField.js","names":["Eye","EyeOff","ReactNode","useState","IconButton","TextInput","usePanneauIntl","getFieldProps","getRuleNumber","getSetting","isBoolean","isString","messages","FieldEntryProps","FieldProps","TextFieldProps","placeholder","maxLength","prefix","suffix","type","inputMode","autoComplete","secret","controlClassName","inputClassName","useCountedDescription","description","value","$","_c","intl","undefined","t0","formatMessage","characterCount","count","length","max","t1","t2","TextField","disabled","onChange","props","readOnly","required","shownDescription","shown","setShown","const","spellCheck","hideSecret","showSecret","secretProps","t3","t4","next","t5","TextFieldEntry","field","t6","t7","t8","t9","_c","_Fragment"],"sources":["../../src/text/TextField.tsx"],"sourcesContent":["import { Eye, EyeOff } from 'lucide-react';\nimport { type ReactNode, useState } from 'react';\n\nimport { IconButton, TextInput, usePanneauIntl } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isBoolean, isString } from '../shared/entry';\nimport { messages } from '../shared/messages';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TextFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Content before the text, inside the control. */\n prefix?: ReactNode;\n /** Content after the text, inside the control. */\n suffix?: ReactNode;\n /** Type of the input. Defaults to `text`. */\n type?: 'text' | 'email' | 'url' | 'tel' | 'password' | 'search';\n inputMode?: 'text' | 'email' | 'url' | 'tel' | 'search' | 'numeric' | 'decimal' | 'none';\n autoComplete?: string;\n /**\n * A secret, such as an access key: typed in a password input, hidden until a button shows it,\n * and never filled in by the browser.\n */\n secret?: boolean;\n controlClassName?: string;\n inputClassName?: string;\n}\n\n/** The description of a text field, with its character count. */\nexport function useCountedDescription(\n description: ReactNode,\n value: string | null | undefined,\n maxLength: number | undefined,\n): ReactNode {\n const intl = usePanneauIntl();\n if (maxLength === undefined) {\n return description;\n }\n const count = intl.formatMessage(messages.characterCount, {\n count: (value ?? '').length,\n max: maxLength,\n });\n if (description === undefined || description === null) {\n return count;\n }\n return (\n <>\n {description} <span>{count}</span>\n </>\n );\n}\n\n/** A single-line text. An empty text is `null`. */\nexport function TextField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n secret = false,\n ...props\n}: TextFieldProps) {\n const intl = usePanneauIntl();\n const shownDescription = useCountedDescription(description, value, maxLength);\n const [shown, setShown] = useState(false);\n const secretProps = secret\n ? {\n type: shown ? ('text' as const) : ('password' as const),\n // Keeps password managers from filling in the user's own password\n autoComplete: 'new-password',\n spellCheck: 'false',\n suffix: (\n <IconButton\n icon={shown ? EyeOff : Eye}\n label={intl.formatMessage(shown ? messages.hideSecret : messages.showSecret)}\n size=\"sm\"\n aria-pressed={shown}\n isDisabled={disabled}\n onPress={() => setShown(!shown)}\n />\n ),\n }\n : {};\n return (\n <TextInput\n {...props}\n {...secretProps}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/**\n * The `text` type: settings `prefix`, `suffix` and `secret`, and a character count from the `max`\n * rule.\n */\nexport function TextFieldEntry(props: FieldEntryProps) {\n const { field } = props;\n const prefix = getSetting(field, 'prefix', isString);\n const suffix = getSetting(field, 'suffix', isString);\n const max = getRuleNumber(field, 'max');\n const secret = getSetting(field, 'secret', isBoolean) ?? false;\n return (\n <TextField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(prefix !== undefined ? { prefix } : {})}\n {...(suffix !== undefined ? { suffix } : {})}\n secret={secret}\n />\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { TextField, TextFieldEntry, type TextFieldProps } from './TextField';
1
+ export { TextField, TextFieldEntry, type TextFieldProps } from './TextField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { FieldEntryProps, FieldProps } from '../shared/types';
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
2
2
  export interface TextAreaFieldProps extends FieldProps<string> {
3
3
  placeholder?: string;
4
4
  /** Shows a count of characters against this maximum. It doesn't stop typing. */
@@ -1 +1 @@
1
- {"version":3,"file":"TextAreaField.js","names":["shownDescription","disabled","readOnly","required","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"TextAreaField.js","names":["TextArea","getFieldProps","getRuleNumber","getSetting","isNumber","isString","FieldEntryProps","FieldProps","useCountedDescription","TextAreaFieldProps","placeholder","maxLength","rows","textAreaClassName","TextAreaField","t0","$","_c","description","disabled","onChange","props","readOnly","required","value","shownDescription","t1","t2","next","t3","TextAreaFieldEntry","field","max","t4","undefined","t5","t6","_c"],"sources":["../../src/textarea/TextAreaField.tsx"],"sourcesContent":["import { TextArea } from '@panneau/ui';\n\nimport { getFieldProps, getRuleNumber, getSetting, isNumber, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\nimport { useCountedDescription } from '../text/TextField';\n\nexport interface TextAreaFieldProps extends FieldProps<string> {\n placeholder?: string;\n /** Shows a count of characters against this maximum. It doesn't stop typing. */\n maxLength?: number;\n /** Visible lines. Defaults to 4. */\n rows?: number;\n textAreaClassName?: string;\n}\n\n/** A text of several lines. An empty text is `null`. */\nexport function TextAreaField({\n value,\n onChange,\n description,\n maxLength,\n disabled,\n readOnly,\n required,\n ...props\n}: TextAreaFieldProps) {\n const shownDescription = useCountedDescription(description, value, maxLength);\n return (\n <TextArea\n {...props}\n value={value ?? ''}\n onChange={(next) => onChange?.(next === '' ? null : next)}\n description={shownDescription}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `textarea` type: setting `rows`, and a character count from the `max` rule. */\nexport function TextAreaFieldEntry(props: FieldEntryProps) {\n const max = getRuleNumber(props.field, 'max');\n const rows = getSetting(props.field, 'rows', isNumber);\n return (\n <TextAreaField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n {...(max !== undefined ? { maxLength: max } : {})}\n {...(rows !== undefined ? { rows } : {})}\n />\n );\n}\n"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField';
1
+ export { TextAreaField, TextAreaFieldEntry, type TextAreaFieldProps } from './TextAreaField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import type { FieldEntryProps, FieldProps } from '../shared/types';
1
+ import type { FieldEntryProps, FieldProps } from '../shared/types.js';
2
2
  export interface TimeFieldProps extends FieldProps<string> {
3
3
  /** Shows and writes seconds (`09:30:15`). */
4
4
  withSeconds?: boolean;
@@ -5,16 +5,70 @@ import { TimeInput } from "@panneau/ui";
5
5
  import { jsx } from "react/jsx-runtime";
6
6
  //#region src/time/TimeField.tsx
7
7
  /** A time of day as a string, `09:30` (or `09:30:15` with seconds). */
8
- function TimeField({ value, onChange, withSeconds = false, disabled, readOnly, required, ...props }) {
9
- return /* @__PURE__ */ jsx(TimeInput, {
10
- ...props,
11
- granularity: withSeconds ? "second" : "minute",
12
- value: toTime(value),
13
- onChange: (next) => onChange?.(next === null ? null : fromTime(next, withSeconds)),
14
- isDisabled: disabled,
15
- isReadOnly: readOnly,
16
- isRequired: required
17
- });
8
+ function TimeField(t0) {
9
+ const $ = c(21);
10
+ let disabled;
11
+ let onChange;
12
+ let props;
13
+ let readOnly;
14
+ let required;
15
+ let t1;
16
+ let value;
17
+ if ($[0] !== t0) {
18
+ ({value, onChange, withSeconds: t1, disabled, readOnly, required, ...props} = t0);
19
+ $[0] = t0;
20
+ $[1] = disabled;
21
+ $[2] = onChange;
22
+ $[3] = props;
23
+ $[4] = readOnly;
24
+ $[5] = required;
25
+ $[6] = t1;
26
+ $[7] = value;
27
+ } else {
28
+ disabled = $[1];
29
+ onChange = $[2];
30
+ props = $[3];
31
+ readOnly = $[4];
32
+ required = $[5];
33
+ t1 = $[6];
34
+ value = $[7];
35
+ }
36
+ const withSeconds = t1 === void 0 ? false : t1;
37
+ const t2 = withSeconds ? "second" : "minute";
38
+ let t3;
39
+ if ($[8] !== value) {
40
+ t3 = toTime(value);
41
+ $[8] = value;
42
+ $[9] = t3;
43
+ } else t3 = $[9];
44
+ let t4;
45
+ if ($[10] !== onChange || $[11] !== withSeconds) {
46
+ t4 = (next) => onChange?.(next === null ? null : fromTime(next, withSeconds));
47
+ $[10] = onChange;
48
+ $[11] = withSeconds;
49
+ $[12] = t4;
50
+ } else t4 = $[12];
51
+ let t5;
52
+ if ($[13] !== disabled || $[14] !== props || $[15] !== readOnly || $[16] !== required || $[17] !== t2 || $[18] !== t3 || $[19] !== t4) {
53
+ t5 = /* @__PURE__ */ jsx(TimeInput, {
54
+ ...props,
55
+ granularity: t2,
56
+ value: t3,
57
+ onChange: t4,
58
+ isDisabled: disabled,
59
+ isReadOnly: readOnly,
60
+ isRequired: required
61
+ });
62
+ $[13] = disabled;
63
+ $[14] = props;
64
+ $[15] = readOnly;
65
+ $[16] = required;
66
+ $[17] = t2;
67
+ $[18] = t3;
68
+ $[19] = t4;
69
+ $[20] = t5;
70
+ } else t5 = $[20];
71
+ return t5;
18
72
  }
19
73
  /** The `time` type: setting `withSeconds`. */
20
74
  function TimeFieldEntry(props) {
@@ -1 +1 @@
1
- {"version":3,"file":"TimeField.js","names":["_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAgB,UAAU,EACtB,OACA,UACA,cAAc,OACd,UACA,UACA,UACA,GAAG,SACY;CACf,OACI,oBAAC,WAAD;EACI,GAAI;EACJ,aAAa,cAAc,WAAW;EACtC,OAAO,OAAO,KAAK;EACnB,WAAW,SAAS,WAAW,SAAS,OAAO,OAAO,SAAS,MAAM,WAAW,CAAC;EACjF,YAAY;EACZ,YAAY;EACZ,YAAY;CAAS,CAAA;AAGjC;;AAGA,SAAO,eAAA,OAAA;CAAA,MAAA,IAAAA,EAAA,CAAA;CAAA,IAAA;CAAA,IAAA,EAAA,OAAA,OAAA;EAGS,KAAA,cAAc,KAAK;EAAC,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CACjB,MAAA,KAAA,SAAS,MAAK,KAA2B,IAAjB,MAAK,QAA7B;CAEM,MAAA,KAAA,MAAK,MAAM,UAAsB,gBAAK;CAAI,IAAA;CAAA,IAAA,EAAA,OAAA,MAAA,YAAA,EAAA,OAAA,MAAA,EAAA,OAAA,MAAA,EAAA,OAAA,IAAA;EAJ3D,KAAA,oBAAC,WAAD;GAAU,GACF;GACG,OAAA;GACG,UAAA,MAAK;GACF,aAAA;EAA0C,CAAA;EACzD,EAAA,KAAA,MAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;EAAA,EAAA,KAAA;CAAA,OAAA,KAAA,EAAA;CAAA,OALF;AAKE"}
1
+ {"version":3,"file":"TimeField.js","names":["TimeInput","fromTime","toTime","getFieldProps","isString","FieldEntryProps","FieldProps","TimeFieldProps","withSeconds","hourCycle","controlClassName","TimeField","t0","$","_c","disabled","onChange","props","readOnly","required","t1","value","undefined","t2","t3","t4","next","t5","TimeFieldEntry","field","settings","_c"],"sources":["../../src/time/TimeField.tsx"],"sourcesContent":["import { TimeInput } from '@panneau/ui';\n\nimport { fromTime, toTime } from '../shared/dates';\nimport { getFieldProps, isString } from '../shared/entry';\nimport type { FieldEntryProps, FieldProps } from '../shared/types';\n\nexport interface TimeFieldProps extends FieldProps<string> {\n /** Shows and writes seconds (`09:30:15`). */\n withSeconds?: boolean;\n /** Defaults to the locale's. */\n hourCycle?: 12 | 24;\n controlClassName?: string;\n}\n\n/** A time of day as a string, `09:30` (or `09:30:15` with seconds). */\nexport function TimeField({\n value,\n onChange,\n withSeconds = false,\n disabled,\n readOnly,\n required,\n ...props\n}: TimeFieldProps) {\n return (\n <TimeInput\n {...props}\n granularity={withSeconds ? 'second' : 'minute'}\n value={toTime(value)}\n onChange={(next) => onChange?.(next === null ? null : fromTime(next, withSeconds))}\n isDisabled={disabled}\n isReadOnly={readOnly}\n isRequired={required}\n />\n );\n}\n\n/** The `time` type: setting `withSeconds`. */\nexport function TimeFieldEntry(props: FieldEntryProps) {\n return (\n <TimeField\n {...getFieldProps(props)}\n value={isString(props.value) ? props.value : null}\n onChange={props.onChange}\n withSeconds={props.field.settings?.withSeconds === true}\n />\n );\n}\n"],"mappings":";;;;;;;AAeA,SAAOW,UAAAC,IAAA;CAAA,MAAAC,IAAAC,EAAA,EAAA;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAC;CAAA,IAAAR,EAAA,OAAAD,IAAA;EAAmB,CAAA,CAAAS,OAAAL,UAAAR,aAAAY,IAAAL,UAAAG,UAAAC,UAAA,GAAAF,SAAAL;EAQTC,EAAA,KAAAD;EAAAC,EAAA,KAAAE;EAAAF,EAAA,KAAAG;EAAAH,EAAA,KAAAI;EAAAJ,EAAA,KAAAK;EAAAL,EAAA,KAAAM;EAAAN,EAAA,KAAAO;EAAAP,EAAA,KAAAQ;CAAA,OAAA;EAAAN,WAAAF,EAAA;EAAAG,WAAAH,EAAA;EAAAI,QAAAJ,EAAA;EAAAK,WAAAL,EAAA;EAAAM,WAAAN,EAAA;EAAAO,KAAAP,EAAA;EAAAQ,QAAAR,EAAA;CAAA;CALb,MAAAL,cAAAY,OAAAE,KAAAA,IAAA,QAAAF;CASqB,MAAAG,KAAAf,cAAA,WAAA;CAAiC,IAAAgB;CAAA,IAAAX,EAAA,OAAAQ,OAAA;EACvCG,KAAAtB,OAAOmB,KAAK;EAACR,EAAA,KAAAQ;EAAAR,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,IAAAY;CAAA,IAAAZ,EAAA,QAAAG,YAAAH,EAAA,QAAAL,aAAA;EACViB,MAAAC,SAAUV,WAAWU,SAAS,OAAT,OAAuBzB,SAASyB,MAAMlB,WAAW,CAAC;EAACK,EAAA,MAAAG;EAAAH,EAAA,MAAAL;EAAAK,EAAA,MAAAY;CAAA,OAAAA,KAAAZ,EAAA;CAAA,IAAAc;CAAA,IAAAd,EAAA,QAAAE,YAAAF,EAAA,QAAAI,SAAAJ,EAAA,QAAAK,YAAAL,EAAA,QAAAM,YAAAN,EAAA,QAAAU,MAAAV,EAAA,QAAAW,MAAAX,EAAA,QAAAY,IAAA;EAJtFE,KAAA,oBAAC,WAAD;GAAU,GACFV;GACS,aAAAM;GACN,OAAAC;GACG,UAAAC;GACEV,YAAAA;GACAG,YAAAA;GACAC,YAAAA;EAAQ,CAAA;EACtBN,EAAA,MAAAE;EAAAF,EAAA,MAAAI;EAAAJ,EAAA,MAAAK;EAAAL,EAAA,MAAAM;EAAAN,EAAA,MAAAU;EAAAV,EAAA,MAAAW;EAAAX,EAAA,MAAAY;EAAAZ,EAAA,MAAAc;CAAA,OAAAA,KAAAd,EAAA;CAAA,OARFc;AAQE;;AAKV,SAAOC,eAAAX,OAAA;CAAA,MAAAJ,IAAAC,EAAA,CAAA;CAAA,IAAAF;CAAA,IAAAC,EAAA,OAAAI,OAAA;EAGSL,KAAAT,cAAcc,KAAK;EAACJ,EAAA,KAAAI;EAAAJ,EAAA,KAAAD;CAAA,OAAAA,KAAAC,EAAA;CACjB,MAAAO,KAAAhB,SAASa,MAAKI,KAA2B,IAAjBJ,MAAKI,QAA7B;CAEM,MAAAE,KAAAN,MAAKY,MAAMC,UAAsBtB,gBAAK;CAAI,IAAAgB;CAAA,IAAAX,EAAA,OAAAI,MAAAD,YAAAH,EAAA,OAAAD,MAAAC,EAAA,OAAAO,MAAAP,EAAA,OAAAU,IAAA;EAJ3DC,KAAA,oBAAC,WAAD;GAAU,GACFZ;GACG,OAAAQ;GACG,UAAAH,MAAKD;GACF,aAAAO;EAA0C,CAAA;EACzDV,EAAA,KAAAI,MAAAD;EAAAH,EAAA,KAAAD;EAAAC,EAAA,KAAAO;EAAAP,EAAA,KAAAU;EAAAV,EAAA,KAAAW;CAAA,OAAAA,KAAAX,EAAA;CAAA,OALFW;AAKE"}
@@ -1,2 +1,2 @@
1
- export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField';
1
+ export { TimeField, TimeFieldEntry, type TimeFieldProps } from './TimeField.js';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,24 @@
1
+ .panneau-file-picker-zone {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ align-items: center;
5
+ gap: var(--panneau-space-2);
6
+ padding: var(--panneau-space-3);
7
+ border: var(--panneau-border-width) dashed var(--panneau-color-border-control);
8
+ border-radius: var(--panneau-radius-md);
9
+ }
10
+
11
+ .panneau-file-picker-zone[data-drop-target] {
12
+ background-color: var(--panneau-color-accent-subtle);
13
+ border-color: var(--panneau-color-accent);
14
+ }
15
+
16
+ .panneau-file-picker-zone[data-focus-visible] {
17
+ outline: 2px solid var(--panneau-color-focus);
18
+ outline-offset: 2px;
19
+ }
20
+
21
+ .panneau-file-picker-hint {
22
+ font-size: var(--panneau-font-size-sm);
23
+ color: var(--panneau-color-text-muted);
24
+ }
@@ -0,0 +1,14 @@
1
+ export interface FilePickerProps {
2
+ /** Called with the files chosen or dropped. */
3
+ onSelect: (files: File[]) => void;
4
+ /** Accepted MIME types, which the file dialog offers. */
5
+ accept?: readonly string[] | null;
6
+ multiple?: boolean;
7
+ isDisabled?: boolean;
8
+ /** Text of the button. Defaults to "Choose a file", or "Choose files" with `multiple`. */
9
+ label?: string;
10
+ className?: string;
11
+ }
12
+ /** A button that opens the file dialog, in a zone where files can be dropped. */
13
+ export declare function FilePicker({ onSelect, accept, multiple, isDisabled, label, className, }: FilePickerProps): import("react").JSX.Element;
14
+ //# sourceMappingURL=FilePicker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilePicker.d.ts","sourceRoot":"","sources":["../../src/upload/FilePicker.tsx"],"names":[],"mappings":"AASA,MAAM,WAAW,eAAe;IAC5B,+CAA+C;IAC/C,QAAQ,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IAClC,yDAAyD;IACzD,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0FAA0F;IAC1F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AASD,iFAAiF;AACjF,wBAAgB,UAAU,CAAC,EACvB,QAAQ,EACR,MAAM,EACN,QAAgB,EAChB,UAAkB,EAClB,KAAK,EACL,SAAS,GACZ,EAAE,eAAe,+BAmCjB"}