@beautinique/frontend-components 1.0.7 → 1.0.9

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 (472) hide show
  1. package/README.md +389 -14
  2. package/dist/auth/AuthBottomInstructions.d.cts +42 -0
  3. package/dist/auth/AuthBottomInstructions.d.cts.map +1 -0
  4. package/dist/auth/AuthBottomInstructions.d.ts +42 -0
  5. package/dist/auth/AuthBottomInstructions.d.ts.map +1 -0
  6. package/dist/auth/SocialAuth.d.cts +33 -0
  7. package/dist/auth/SocialAuth.d.cts.map +1 -0
  8. package/dist/auth/SocialAuth.d.ts +33 -0
  9. package/dist/auth/SocialAuth.d.ts.map +1 -0
  10. package/dist/auth/index.cjs +84 -0
  11. package/dist/auth/index.cjs.map +1 -0
  12. package/dist/auth/index.d.cts +3 -0
  13. package/dist/auth/index.d.cts.map +1 -0
  14. package/dist/auth/index.d.ts +3 -0
  15. package/dist/auth/index.d.ts.map +1 -0
  16. package/dist/auth/index.js +81 -0
  17. package/dist/auth/index.js.map +1 -0
  18. package/dist/breadcrumb/Breadcrumb.d.cts +34 -0
  19. package/dist/breadcrumb/Breadcrumb.d.cts.map +1 -0
  20. package/dist/breadcrumb/Breadcrumb.d.ts +34 -0
  21. package/dist/breadcrumb/Breadcrumb.d.ts.map +1 -0
  22. package/dist/breadcrumb/breadcrumb-icons.d.cts +6 -0
  23. package/dist/breadcrumb/breadcrumb-icons.d.cts.map +1 -0
  24. package/dist/breadcrumb/breadcrumb-icons.d.ts +6 -0
  25. package/dist/breadcrumb/breadcrumb-icons.d.ts.map +1 -0
  26. package/dist/breadcrumb/getBreadcrumbItems.d.cts +16 -0
  27. package/dist/breadcrumb/getBreadcrumbItems.d.cts.map +1 -0
  28. package/dist/breadcrumb/getBreadcrumbItems.d.ts +16 -0
  29. package/dist/breadcrumb/getBreadcrumbItems.d.ts.map +1 -0
  30. package/dist/breadcrumb/index.cjs +110 -0
  31. package/dist/breadcrumb/index.cjs.map +1 -0
  32. package/dist/breadcrumb/index.d.cts +3 -0
  33. package/dist/breadcrumb/index.d.cts.map +1 -0
  34. package/dist/breadcrumb/index.d.ts +3 -0
  35. package/dist/breadcrumb/index.d.ts.map +1 -0
  36. package/dist/breadcrumb/index.js +107 -0
  37. package/dist/breadcrumb/index.js.map +1 -0
  38. package/dist/color-input/ColorInput.d.cts +33 -0
  39. package/dist/color-input/ColorInput.d.cts.map +1 -0
  40. package/dist/color-input/ColorInput.d.ts +33 -0
  41. package/dist/color-input/ColorInput.d.ts.map +1 -0
  42. package/dist/color-input/color-input-icons.d.cts +6 -0
  43. package/dist/color-input/color-input-icons.d.cts.map +1 -0
  44. package/dist/color-input/color-input-icons.d.ts +6 -0
  45. package/dist/color-input/color-input-icons.d.ts.map +1 -0
  46. package/dist/color-input/color.d.cts +10 -0
  47. package/dist/color-input/color.d.cts.map +1 -0
  48. package/dist/color-input/color.d.ts +10 -0
  49. package/dist/color-input/color.d.ts.map +1 -0
  50. package/dist/color-input/index.cjs +375 -0
  51. package/dist/color-input/index.cjs.map +1 -0
  52. package/dist/color-input/index.d.cts +2 -0
  53. package/dist/color-input/index.d.cts.map +1 -0
  54. package/dist/color-input/index.d.ts +2 -0
  55. package/dist/color-input/index.d.ts.map +1 -0
  56. package/dist/color-input/index.js +373 -0
  57. package/dist/color-input/index.js.map +1 -0
  58. package/dist/file-input/FileInput.d.cts +53 -0
  59. package/dist/file-input/FileInput.d.cts.map +1 -0
  60. package/dist/file-input/FileInput.d.ts +53 -0
  61. package/dist/file-input/FileInput.d.ts.map +1 -0
  62. package/dist/file-input/file-input-icons.d.cts +6 -0
  63. package/dist/file-input/file-input-icons.d.cts.map +1 -0
  64. package/dist/file-input/file-input-icons.d.ts +6 -0
  65. package/dist/file-input/file-input-icons.d.ts.map +1 -0
  66. package/dist/file-input/index.cjs +259 -0
  67. package/dist/file-input/index.cjs.map +1 -0
  68. package/dist/file-input/index.d.cts +3 -0
  69. package/dist/file-input/index.d.cts.map +1 -0
  70. package/dist/file-input/index.d.ts +3 -0
  71. package/dist/file-input/index.d.ts.map +1 -0
  72. package/dist/file-input/index.js +256 -0
  73. package/dist/file-input/index.js.map +1 -0
  74. package/dist/file-input/media-type.d.cts +8 -0
  75. package/dist/file-input/media-type.d.cts.map +1 -0
  76. package/dist/file-input/media-type.d.ts +8 -0
  77. package/dist/file-input/media-type.d.ts.map +1 -0
  78. package/dist/file-input/useObjectUrls.d.cts +10 -0
  79. package/dist/file-input/useObjectUrls.d.cts.map +1 -0
  80. package/dist/file-input/useObjectUrls.d.ts +10 -0
  81. package/dist/file-input/useObjectUrls.d.ts.map +1 -0
  82. package/dist/hierarchy-select/HierarchySelect.d.cts +58 -0
  83. package/dist/hierarchy-select/HierarchySelect.d.cts.map +1 -0
  84. package/dist/hierarchy-select/HierarchySelect.d.ts +58 -0
  85. package/dist/hierarchy-select/HierarchySelect.d.ts.map +1 -0
  86. package/dist/hierarchy-select/hierarchy-select-icons.d.cts +6 -0
  87. package/dist/hierarchy-select/hierarchy-select-icons.d.cts.map +1 -0
  88. package/dist/hierarchy-select/hierarchy-select-icons.d.ts +6 -0
  89. package/dist/hierarchy-select/hierarchy-select-icons.d.ts.map +1 -0
  90. package/dist/hierarchy-select/index.cjs +596 -0
  91. package/dist/hierarchy-select/index.cjs.map +1 -0
  92. package/dist/hierarchy-select/index.d.cts +2 -0
  93. package/dist/hierarchy-select/index.d.cts.map +1 -0
  94. package/dist/hierarchy-select/index.d.ts +2 -0
  95. package/dist/hierarchy-select/index.d.ts.map +1 -0
  96. package/dist/hierarchy-select/index.js +594 -0
  97. package/dist/hierarchy-select/index.js.map +1 -0
  98. package/dist/hierarchy-select/tree.d.cts +38 -0
  99. package/dist/hierarchy-select/tree.d.cts.map +1 -0
  100. package/dist/hierarchy-select/tree.d.ts +38 -0
  101. package/dist/hierarchy-select/tree.d.ts.map +1 -0
  102. package/dist/index.cjs +21 -0
  103. package/dist/index.d.cts +3 -0
  104. package/dist/index.d.cts.map +1 -1
  105. package/dist/index.d.ts +3 -0
  106. package/dist/index.d.ts.map +1 -1
  107. package/dist/index.js +3 -0
  108. package/dist/inputs/Checkbox.d.cts +21 -0
  109. package/dist/inputs/Checkbox.d.cts.map +1 -0
  110. package/dist/inputs/Checkbox.d.ts +21 -0
  111. package/dist/inputs/Checkbox.d.ts.map +1 -0
  112. package/dist/inputs/Input.d.cts +26 -0
  113. package/dist/inputs/Input.d.cts.map +1 -0
  114. package/dist/inputs/Input.d.ts +26 -0
  115. package/dist/inputs/Input.d.ts.map +1 -0
  116. package/dist/inputs/InputError.d.cts +11 -0
  117. package/dist/inputs/InputError.d.cts.map +1 -0
  118. package/dist/inputs/InputError.d.ts +11 -0
  119. package/dist/inputs/InputError.d.ts.map +1 -0
  120. package/dist/inputs/InputIcon.d.cts +9 -0
  121. package/dist/inputs/InputIcon.d.cts.map +1 -0
  122. package/dist/inputs/InputIcon.d.ts +9 -0
  123. package/dist/inputs/InputIcon.d.ts.map +1 -0
  124. package/dist/inputs/InputLabel.d.cts +8 -0
  125. package/dist/inputs/InputLabel.d.cts.map +1 -0
  126. package/dist/inputs/InputLabel.d.ts +8 -0
  127. package/dist/inputs/InputLabel.d.ts.map +1 -0
  128. package/dist/inputs/Radio.d.cts +25 -0
  129. package/dist/inputs/Radio.d.cts.map +1 -0
  130. package/dist/inputs/Radio.d.ts +25 -0
  131. package/dist/inputs/Radio.d.ts.map +1 -0
  132. package/dist/inputs/Select.d.cts +53 -0
  133. package/dist/inputs/Select.d.cts.map +1 -0
  134. package/dist/inputs/Select.d.ts +53 -0
  135. package/dist/inputs/Select.d.ts.map +1 -0
  136. package/dist/inputs/Textarea.d.cts +19 -0
  137. package/dist/inputs/Textarea.d.cts.map +1 -0
  138. package/dist/inputs/Textarea.d.ts +19 -0
  139. package/dist/inputs/Textarea.d.ts.map +1 -0
  140. package/dist/inputs/index.cjs +746 -0
  141. package/dist/inputs/index.cjs.map +1 -0
  142. package/dist/inputs/index.d.cts +10 -0
  143. package/dist/inputs/index.d.cts.map +1 -0
  144. package/dist/inputs/index.d.ts +10 -0
  145. package/dist/inputs/index.d.ts.map +1 -0
  146. package/dist/inputs/index.js +737 -0
  147. package/dist/inputs/index.js.map +1 -0
  148. package/dist/inputs/inputs-icons.d.cts +6 -0
  149. package/dist/inputs/inputs-icons.d.cts.map +1 -0
  150. package/dist/inputs/inputs-icons.d.ts +6 -0
  151. package/dist/inputs/inputs-icons.d.ts.map +1 -0
  152. package/dist/inputs/types.d.cts +48 -0
  153. package/dist/inputs/types.d.cts.map +1 -0
  154. package/dist/inputs/types.d.ts +48 -0
  155. package/dist/inputs/types.d.ts.map +1 -0
  156. package/dist/inputs/useFieldIds.d.cts +24 -0
  157. package/dist/inputs/useFieldIds.d.cts.map +1 -0
  158. package/dist/inputs/useFieldIds.d.ts +24 -0
  159. package/dist/inputs/useFieldIds.d.ts.map +1 -0
  160. package/dist/layout/ApiStatus.d.cts +20 -0
  161. package/dist/layout/ApiStatus.d.cts.map +1 -0
  162. package/dist/layout/ApiStatus.d.ts +20 -0
  163. package/dist/layout/ApiStatus.d.ts.map +1 -0
  164. package/dist/layout/BorderGradient.d.cts +11 -0
  165. package/dist/layout/BorderGradient.d.cts.map +1 -0
  166. package/dist/layout/BorderGradient.d.ts +11 -0
  167. package/dist/layout/BorderGradient.d.ts.map +1 -0
  168. package/dist/layout/ConfirmModal.d.cts +44 -0
  169. package/dist/layout/ConfirmModal.d.cts.map +1 -0
  170. package/dist/layout/ConfirmModal.d.ts +44 -0
  171. package/dist/layout/ConfirmModal.d.ts.map +1 -0
  172. package/dist/layout/Dropdown.d.cts +33 -0
  173. package/dist/layout/Dropdown.d.cts.map +1 -0
  174. package/dist/layout/Dropdown.d.ts +33 -0
  175. package/dist/layout/Dropdown.d.ts.map +1 -0
  176. package/dist/layout/LoadingPage.d.cts +11 -0
  177. package/dist/layout/LoadingPage.d.cts.map +1 -0
  178. package/dist/layout/LoadingPage.d.ts +11 -0
  179. package/dist/layout/LoadingPage.d.ts.map +1 -0
  180. package/dist/layout/LoadingRings.d.cts +12 -0
  181. package/dist/layout/LoadingRings.d.cts.map +1 -0
  182. package/dist/layout/LoadingRings.d.ts +12 -0
  183. package/dist/layout/LoadingRings.d.ts.map +1 -0
  184. package/dist/layout/LoadingText.d.cts +13 -0
  185. package/dist/layout/LoadingText.d.cts.map +1 -0
  186. package/dist/layout/LoadingText.d.ts +13 -0
  187. package/dist/layout/LoadingText.d.ts.map +1 -0
  188. package/dist/layout/ModalWrapper.d.cts +48 -0
  189. package/dist/layout/ModalWrapper.d.cts.map +1 -0
  190. package/dist/layout/ModalWrapper.d.ts +48 -0
  191. package/dist/layout/ModalWrapper.d.ts.map +1 -0
  192. package/dist/layout/NetworkStatusToaster.d.cts +39 -0
  193. package/dist/layout/NetworkStatusToaster.d.cts.map +1 -0
  194. package/dist/layout/NetworkStatusToaster.d.ts +39 -0
  195. package/dist/layout/NetworkStatusToaster.d.ts.map +1 -0
  196. package/dist/layout/ScrollToTop.d.cts +36 -0
  197. package/dist/layout/ScrollToTop.d.cts.map +1 -0
  198. package/dist/layout/ScrollToTop.d.ts +36 -0
  199. package/dist/layout/ScrollToTop.d.ts.map +1 -0
  200. package/dist/layout/ScrollableGradientContainer.d.cts +28 -0
  201. package/dist/layout/ScrollableGradientContainer.d.cts.map +1 -0
  202. package/dist/layout/ScrollableGradientContainer.d.ts +28 -0
  203. package/dist/layout/ScrollableGradientContainer.d.ts.map +1 -0
  204. package/dist/layout/Skeleton.d.cts +9 -0
  205. package/dist/layout/Skeleton.d.cts.map +1 -0
  206. package/dist/layout/Skeleton.d.ts +9 -0
  207. package/dist/layout/Skeleton.d.ts.map +1 -0
  208. package/dist/layout/Table.d.cts +9 -0
  209. package/dist/layout/Table.d.cts.map +1 -0
  210. package/dist/layout/Table.d.ts +9 -0
  211. package/dist/layout/Table.d.ts.map +1 -0
  212. package/dist/layout/index.cjs +773 -0
  213. package/dist/layout/index.cjs.map +1 -0
  214. package/dist/layout/index.d.cts +14 -0
  215. package/dist/layout/index.d.cts.map +1 -0
  216. package/dist/layout/index.d.ts +14 -0
  217. package/dist/layout/index.d.ts.map +1 -0
  218. package/dist/layout/index.js +753 -0
  219. package/dist/layout/index.js.map +1 -0
  220. package/dist/layout/layout-icons.d.cts +6 -0
  221. package/dist/layout/layout-icons.d.cts.map +1 -0
  222. package/dist/layout/layout-icons.d.ts +6 -0
  223. package/dist/layout/layout-icons.d.ts.map +1 -0
  224. package/dist/lib/content.d.cts +7 -0
  225. package/dist/lib/content.d.cts.map +1 -0
  226. package/dist/lib/content.d.ts +7 -0
  227. package/dist/lib/content.d.ts.map +1 -0
  228. package/dist/lib/countdown.d.cts +13 -0
  229. package/dist/lib/countdown.d.cts.map +1 -0
  230. package/dist/lib/countdown.d.ts +13 -0
  231. package/dist/lib/countdown.d.ts.map +1 -0
  232. package/dist/lib/dropdown-position.d.cts +33 -0
  233. package/dist/lib/dropdown-position.d.cts.map +1 -0
  234. package/dist/lib/dropdown-position.d.ts +33 -0
  235. package/dist/lib/dropdown-position.d.ts.map +1 -0
  236. package/dist/lib/focus.d.cts +3 -0
  237. package/dist/lib/focus.d.cts.map +1 -0
  238. package/dist/lib/focus.d.ts +3 -0
  239. package/dist/lib/focus.d.ts.map +1 -0
  240. package/dist/lib/icon-registry.d.cts +14 -0
  241. package/dist/lib/icon-registry.d.cts.map +1 -0
  242. package/dist/lib/icon-registry.d.ts +14 -0
  243. package/dist/lib/icon-registry.d.ts.map +1 -0
  244. package/dist/lib/mergeRefs.d.cts +10 -0
  245. package/dist/lib/mergeRefs.d.cts.map +1 -0
  246. package/dist/lib/mergeRefs.d.ts +10 -0
  247. package/dist/lib/mergeRefs.d.ts.map +1 -0
  248. package/dist/lib/scrollRowIntoView.d.cts +7 -0
  249. package/dist/lib/scrollRowIntoView.d.cts.map +1 -0
  250. package/dist/lib/scrollRowIntoView.d.ts +7 -0
  251. package/dist/lib/scrollRowIntoView.d.ts.map +1 -0
  252. package/dist/lib/stepper.d.cts +9 -0
  253. package/dist/lib/stepper.d.cts.map +1 -0
  254. package/dist/lib/stepper.d.ts +9 -0
  255. package/dist/lib/stepper.d.ts.map +1 -0
  256. package/dist/lib/typeahead.d.cts +21 -0
  257. package/dist/lib/typeahead.d.cts.map +1 -0
  258. package/dist/lib/typeahead.d.ts +21 -0
  259. package/dist/lib/typeahead.d.ts.map +1 -0
  260. package/dist/lib/useAnchoredBox.d.cts +26 -0
  261. package/dist/lib/useAnchoredBox.d.cts.map +1 -0
  262. package/dist/lib/useAnchoredBox.d.ts +26 -0
  263. package/dist/lib/useAnchoredBox.d.ts.map +1 -0
  264. package/dist/lib/useDismiss.d.cts +34 -0
  265. package/dist/lib/useDismiss.d.cts.map +1 -0
  266. package/dist/lib/useDismiss.d.ts +34 -0
  267. package/dist/lib/useDismiss.d.ts.map +1 -0
  268. package/dist/lib/useFocusTrap.d.cts +24 -0
  269. package/dist/lib/useFocusTrap.d.cts.map +1 -0
  270. package/dist/lib/useFocusTrap.d.ts +24 -0
  271. package/dist/lib/useFocusTrap.d.ts.map +1 -0
  272. package/dist/lib/useIsClient.d.cts +7 -0
  273. package/dist/lib/useIsClient.d.cts.map +1 -0
  274. package/dist/lib/useIsClient.d.ts +7 -0
  275. package/dist/lib/useIsClient.d.ts.map +1 -0
  276. package/dist/lib/usePrefersReducedMotion.d.cts +7 -0
  277. package/dist/lib/usePrefersReducedMotion.d.cts.map +1 -0
  278. package/dist/lib/usePrefersReducedMotion.d.ts +7 -0
  279. package/dist/lib/usePrefersReducedMotion.d.ts.map +1 -0
  280. package/dist/lib/useScrollLock.d.cts +7 -0
  281. package/dist/lib/useScrollLock.d.cts.map +1 -0
  282. package/dist/lib/useScrollLock.d.ts +7 -0
  283. package/dist/lib/useScrollLock.d.ts.map +1 -0
  284. package/dist/lib/useScrollable.d.cts +17 -0
  285. package/dist/lib/useScrollable.d.cts.map +1 -0
  286. package/dist/lib/useScrollable.d.ts +17 -0
  287. package/dist/lib/useScrollable.d.ts.map +1 -0
  288. package/dist/linear-gradient/LinearGradient.d.cts +13 -0
  289. package/dist/linear-gradient/LinearGradient.d.cts.map +1 -0
  290. package/dist/linear-gradient/LinearGradient.d.ts +13 -0
  291. package/dist/linear-gradient/LinearGradient.d.ts.map +1 -0
  292. package/dist/linear-gradient/index.cjs +25 -0
  293. package/dist/linear-gradient/index.cjs.map +1 -0
  294. package/dist/linear-gradient/index.d.cts +2 -0
  295. package/dist/linear-gradient/index.d.cts.map +1 -0
  296. package/dist/linear-gradient/index.d.ts +2 -0
  297. package/dist/linear-gradient/index.d.ts.map +1 -0
  298. package/dist/linear-gradient/index.js +23 -0
  299. package/dist/linear-gradient/index.js.map +1 -0
  300. package/dist/loading-screen/LoadingScreen.d.cts +21 -0
  301. package/dist/loading-screen/LoadingScreen.d.cts.map +1 -0
  302. package/dist/loading-screen/LoadingScreen.d.ts +21 -0
  303. package/dist/loading-screen/LoadingScreen.d.ts.map +1 -0
  304. package/dist/loading-screen/Teddy.d.cts +10 -0
  305. package/dist/loading-screen/Teddy.d.cts.map +1 -0
  306. package/dist/loading-screen/Teddy.d.ts +10 -0
  307. package/dist/loading-screen/Teddy.d.ts.map +1 -0
  308. package/dist/loading-screen/WakeUpProgress.d.cts +16 -0
  309. package/dist/loading-screen/WakeUpProgress.d.cts.map +1 -0
  310. package/dist/loading-screen/WakeUpProgress.d.ts +16 -0
  311. package/dist/loading-screen/WakeUpProgress.d.ts.map +1 -0
  312. package/dist/loading-screen/beauty-facts.d.cts +4 -0
  313. package/dist/loading-screen/beauty-facts.d.cts.map +1 -0
  314. package/dist/loading-screen/beauty-facts.d.ts +4 -0
  315. package/dist/loading-screen/beauty-facts.d.ts.map +1 -0
  316. package/dist/loading-screen/index.cjs +405 -0
  317. package/dist/loading-screen/index.cjs.map +1 -0
  318. package/dist/loading-screen/index.d.cts +5 -0
  319. package/dist/loading-screen/index.d.cts.map +1 -0
  320. package/dist/loading-screen/index.d.ts +5 -0
  321. package/dist/loading-screen/index.d.ts.map +1 -0
  322. package/dist/loading-screen/index.js +400 -0
  323. package/dist/loading-screen/index.js.map +1 -0
  324. package/dist/loading-screen/loading-screen-icons.d.cts +6 -0
  325. package/dist/loading-screen/loading-screen-icons.d.cts.map +1 -0
  326. package/dist/loading-screen/loading-screen-icons.d.ts +6 -0
  327. package/dist/loading-screen/loading-screen-icons.d.ts.map +1 -0
  328. package/dist/media/MediaCarousel.d.cts +30 -0
  329. package/dist/media/MediaCarousel.d.cts.map +1 -0
  330. package/dist/media/MediaCarousel.d.ts +30 -0
  331. package/dist/media/MediaCarousel.d.ts.map +1 -0
  332. package/dist/media/MediaCarouselWithModal.d.cts +17 -0
  333. package/dist/media/MediaCarouselWithModal.d.cts.map +1 -0
  334. package/dist/media/MediaCarouselWithModal.d.ts +17 -0
  335. package/dist/media/MediaCarouselWithModal.d.ts.map +1 -0
  336. package/dist/media/MediaCarouselWithParentMedia.d.cts +30 -0
  337. package/dist/media/MediaCarouselWithParentMedia.d.cts.map +1 -0
  338. package/dist/media/MediaCarouselWithParentMedia.d.ts +30 -0
  339. package/dist/media/MediaCarouselWithParentMedia.d.ts.map +1 -0
  340. package/dist/media/MediaModal.d.cts +27 -0
  341. package/dist/media/MediaModal.d.cts.map +1 -0
  342. package/dist/media/MediaModal.d.ts +27 -0
  343. package/dist/media/MediaModal.d.ts.map +1 -0
  344. package/dist/media/VideoPlayer.d.cts +37 -0
  345. package/dist/media/VideoPlayer.d.cts.map +1 -0
  346. package/dist/media/VideoPlayer.d.ts +37 -0
  347. package/dist/media/VideoPlayer.d.ts.map +1 -0
  348. package/dist/media/captureVideoPoster.d.cts +20 -0
  349. package/dist/media/captureVideoPoster.d.cts.map +1 -0
  350. package/dist/media/captureVideoPoster.d.ts +20 -0
  351. package/dist/media/captureVideoPoster.d.ts.map +1 -0
  352. package/dist/media/index.cjs +613 -0
  353. package/dist/media/index.cjs.map +1 -0
  354. package/dist/media/index.d.cts +8 -0
  355. package/dist/media/index.d.cts.map +1 -0
  356. package/dist/media/index.d.ts +8 -0
  357. package/dist/media/index.d.ts.map +1 -0
  358. package/dist/media/index.js +605 -0
  359. package/dist/media/index.js.map +1 -0
  360. package/dist/media/labels.d.cts +33 -0
  361. package/dist/media/labels.d.cts.map +1 -0
  362. package/dist/media/labels.d.ts +33 -0
  363. package/dist/media/labels.d.ts.map +1 -0
  364. package/dist/media/media-icons.d.cts +6 -0
  365. package/dist/media/media-icons.d.cts.map +1 -0
  366. package/dist/media/media-icons.d.ts +6 -0
  367. package/dist/media/media-icons.d.ts.map +1 -0
  368. package/dist/media/streaming.d.cts +18 -0
  369. package/dist/media/streaming.d.cts.map +1 -0
  370. package/dist/media/streaming.d.ts +18 -0
  371. package/dist/media/streaming.d.ts.map +1 -0
  372. package/dist/resend/Resend.d.cts +37 -0
  373. package/dist/resend/Resend.d.cts.map +1 -0
  374. package/dist/resend/Resend.d.ts +37 -0
  375. package/dist/resend/Resend.d.ts.map +1 -0
  376. package/dist/resend/index.cjs +115 -0
  377. package/dist/resend/index.cjs.map +1 -0
  378. package/dist/resend/index.d.cts +2 -0
  379. package/dist/resend/index.d.cts.map +1 -0
  380. package/dist/resend/index.d.ts +2 -0
  381. package/dist/resend/index.d.ts.map +1 -0
  382. package/dist/resend/index.js +113 -0
  383. package/dist/resend/index.js.map +1 -0
  384. package/dist/static-page/StaticPage.d.cts +91 -0
  385. package/dist/static-page/StaticPage.d.cts.map +1 -0
  386. package/dist/static-page/StaticPage.d.ts +91 -0
  387. package/dist/static-page/StaticPage.d.ts.map +1 -0
  388. package/dist/static-page/index.cjs +247 -0
  389. package/dist/static-page/index.cjs.map +1 -0
  390. package/dist/static-page/index.d.cts +2 -0
  391. package/dist/static-page/index.d.cts.map +1 -0
  392. package/dist/static-page/index.d.ts +2 -0
  393. package/dist/static-page/index.d.ts.map +1 -0
  394. package/dist/static-page/index.js +235 -0
  395. package/dist/static-page/index.js.map +1 -0
  396. package/dist/static-page/static-page-icons.d.cts +6 -0
  397. package/dist/static-page/static-page-icons.d.cts.map +1 -0
  398. package/dist/static-page/static-page-icons.d.ts +6 -0
  399. package/dist/static-page/static-page-icons.d.ts.map +1 -0
  400. package/dist/stepper/Stepper.d.cts +35 -0
  401. package/dist/stepper/Stepper.d.cts.map +1 -0
  402. package/dist/stepper/Stepper.d.ts +35 -0
  403. package/dist/stepper/Stepper.d.ts.map +1 -0
  404. package/dist/stepper/index.cjs +149 -0
  405. package/dist/stepper/index.cjs.map +1 -0
  406. package/dist/stepper/index.d.cts +2 -0
  407. package/dist/stepper/index.d.cts.map +1 -0
  408. package/dist/stepper/index.d.ts +2 -0
  409. package/dist/stepper/index.d.ts.map +1 -0
  410. package/dist/stepper/index.js +147 -0
  411. package/dist/stepper/index.js.map +1 -0
  412. package/dist/stepper/stepper-icons.d.cts +10 -0
  413. package/dist/stepper/stepper-icons.d.cts.map +1 -0
  414. package/dist/stepper/stepper-icons.d.ts +10 -0
  415. package/dist/stepper/stepper-icons.d.ts.map +1 -0
  416. package/dist/testimonials/TestimonialCarousel.d.cts +40 -0
  417. package/dist/testimonials/TestimonialCarousel.d.cts.map +1 -0
  418. package/dist/testimonials/TestimonialCarousel.d.ts +40 -0
  419. package/dist/testimonials/TestimonialCarousel.d.ts.map +1 -0
  420. package/dist/testimonials/index.cjs +246 -0
  421. package/dist/testimonials/index.cjs.map +1 -0
  422. package/dist/testimonials/index.d.cts +2 -0
  423. package/dist/testimonials/index.d.cts.map +1 -0
  424. package/dist/testimonials/index.d.ts +2 -0
  425. package/dist/testimonials/index.d.ts.map +1 -0
  426. package/dist/testimonials/index.js +244 -0
  427. package/dist/testimonials/index.js.map +1 -0
  428. package/dist/testimonials/testimonials-icons.d.cts +6 -0
  429. package/dist/testimonials/testimonials-icons.d.cts.map +1 -0
  430. package/dist/testimonials/testimonials-icons.d.ts +6 -0
  431. package/dist/testimonials/testimonials-icons.d.ts.map +1 -0
  432. package/dist/theme/Theme.d.cts +23 -0
  433. package/dist/theme/Theme.d.cts.map +1 -0
  434. package/dist/theme/Theme.d.ts +23 -0
  435. package/dist/theme/Theme.d.ts.map +1 -0
  436. package/dist/theme/index.cjs +76 -0
  437. package/dist/theme/index.cjs.map +1 -0
  438. package/dist/theme/index.d.cts +2 -0
  439. package/dist/theme/index.d.cts.map +1 -0
  440. package/dist/theme/index.d.ts +2 -0
  441. package/dist/theme/index.d.ts.map +1 -0
  442. package/dist/theme/index.js +74 -0
  443. package/dist/theme/index.js.map +1 -0
  444. package/dist/theme/theme-icons.d.cts +21 -0
  445. package/dist/theme/theme-icons.d.cts.map +1 -0
  446. package/dist/theme/theme-icons.d.ts +21 -0
  447. package/dist/theme/theme-icons.d.ts.map +1 -0
  448. package/dist/toast/index.cjs +2 -38
  449. package/dist/toast/index.cjs.map +1 -1
  450. package/dist/toast/index.js +1 -37
  451. package/dist/toast/index.js.map +1 -1
  452. package/dist/ui/Badge.d.cts +12 -0
  453. package/dist/ui/Badge.d.cts.map +1 -0
  454. package/dist/ui/Badge.d.ts +12 -0
  455. package/dist/ui/Badge.d.ts.map +1 -0
  456. package/dist/ui/Divider.d.cts +12 -0
  457. package/dist/ui/Divider.d.cts.map +1 -0
  458. package/dist/ui/Divider.d.ts +12 -0
  459. package/dist/ui/Divider.d.ts.map +1 -0
  460. package/dist/ui/GradientText.d.cts +30 -0
  461. package/dist/ui/GradientText.d.cts.map +1 -0
  462. package/dist/ui/GradientText.d.ts +30 -0
  463. package/dist/ui/GradientText.d.ts.map +1 -0
  464. package/dist/ui/index.cjs +37 -3
  465. package/dist/ui/index.cjs.map +1 -1
  466. package/dist/ui/index.d.cts +3 -0
  467. package/dist/ui/index.d.cts.map +1 -1
  468. package/dist/ui/index.d.ts +3 -0
  469. package/dist/ui/index.d.ts.map +1 -1
  470. package/dist/ui/index.js +35 -4
  471. package/dist/ui/index.js.map +1 -1
  472. package/package.json +108 -6
@@ -0,0 +1,259 @@
1
+ 'use strict';
2
+
3
+ var react = require('@iconify/react');
4
+ var react$1 = require('react');
5
+ var inputs = require('@beautinique/frontend-components/inputs');
6
+ var media = require('@beautinique/frontend-components/media');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ var __defProp = Object.defineProperty;
10
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
11
+ var createIconRegistry = /* @__PURE__ */ __name((sets) => {
12
+ let registered = false;
13
+ return {
14
+ register: /* @__PURE__ */ __name(() => {
15
+ if (registered) return;
16
+ for (const set of sets) react.addCollection(set);
17
+ registered = true;
18
+ }, "register"),
19
+ names: sets.flatMap(
20
+ ({ prefix, icons, aliases }) => [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`)
21
+ )
22
+ };
23
+ }, "createIconRegistry");
24
+
25
+ // src/file-input/file-input-icons.ts
26
+ var ICON_SETS = [
27
+ {
28
+ prefix: "solar",
29
+ width: 24,
30
+ height: 24,
31
+ icons: {
32
+ "gallery-add-linear": {
33
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M22 12C22 16.714 22 19.0711 20.5355 20.5355C19.0711 22 16.714 22 12 22C7.28595 22 4.92893 22 3.46447 20.5355C2 19.0711 2 16.714 2 12C2 7.28595 2 4.92893 3.46447 3.46447C4.92893 2 7.28595 2 12 2"/><path d="M2 12.5001L3.75159 10.9675C4.66286 10.1702 6.03628 10.2159 6.89249 11.0721L11.1822 15.3618C11.8694 16.0491 12.9512 16.1428 13.7464 15.5839L14.0446 15.3744C15.1888 14.5702 16.7369 14.6634 17.7765 15.599L21 18.5001"/><path d="M15 5.5H18.5M18.5 5.5H22M18.5 5.5V9M18.5 5.5V2"/></g>'
34
+ }
35
+ }
36
+ }
37
+ ];
38
+ var { register: registerFileInputIcons, names: FILE_INPUT_ICON_NAMES } = createIconRegistry(ICON_SETS);
39
+
40
+ // src/file-input/media-type.ts
41
+ var VIDEO_EXTENSIONS = /* @__PURE__ */ new Set([
42
+ "avi",
43
+ "m3u8",
44
+ "m4v",
45
+ "mkv",
46
+ "mov",
47
+ "mp4",
48
+ "ogg",
49
+ "ogv",
50
+ "webm"
51
+ ]);
52
+ var getMediaType = /* @__PURE__ */ __name((value) => {
53
+ if (typeof value !== "string") return value.type.startsWith("video/") ? "video" : "image";
54
+ const path = value.split(/[?#]/, 1).at(0) ?? "";
55
+ const extension = /\.([a-z0-9]+)$/i.exec(path)?.at(1)?.toLowerCase() ?? "";
56
+ return VIDEO_EXTENSIONS.has(extension) ? "video" : "image";
57
+ }, "getMediaType");
58
+ var useObjectUrls = /* @__PURE__ */ __name((files) => {
59
+ const liveRef = react$1.useRef(/* @__PURE__ */ new Map());
60
+ const [urls, setUrls] = react$1.useState(/* @__PURE__ */ new Map());
61
+ react$1.useEffect(() => {
62
+ const live = liveRef.current;
63
+ const wanted = new Set(files);
64
+ for (const [file, url] of live) {
65
+ if (wanted.has(file)) continue;
66
+ URL.revokeObjectURL(url);
67
+ live.delete(file);
68
+ }
69
+ for (const file of wanted) {
70
+ if (!live.has(file)) live.set(file, URL.createObjectURL(file));
71
+ }
72
+ setUrls(new Map(live));
73
+ }, [files]);
74
+ react$1.useEffect(() => {
75
+ const live = liveRef.current;
76
+ return () => {
77
+ for (const url of live.values()) URL.revokeObjectURL(url);
78
+ live.clear();
79
+ };
80
+ }, []);
81
+ return urls;
82
+ }, "useObjectUrls");
83
+ var asList = /* @__PURE__ */ __name((value) => {
84
+ if (value === void 0) return [];
85
+ return typeof value === "string" || value instanceof File ? [value] : value;
86
+ }, "asList");
87
+ var FileInput = /* @__PURE__ */ __name(({
88
+ label = "",
89
+ className = "",
90
+ containerClassName = "",
91
+ mediaModalClassName = "",
92
+ mediaCarouselClassName = "",
93
+ errors = [],
94
+ handleRemove,
95
+ fileInputProps,
96
+ icons,
97
+ getMediaType: getMediaType2 = getMediaType,
98
+ labels,
99
+ playerProps
100
+ }) => {
101
+ registerFileInputIcons();
102
+ const {
103
+ value,
104
+ onChange,
105
+ placeholder,
106
+ disabled,
107
+ multiple,
108
+ accept,
109
+ id: givenId,
110
+ ...inputProps
111
+ } = fileInputProps;
112
+ const baseId = react$1.useId();
113
+ const id = givenId ?? fileInputProps.name ?? `${baseId}-field`;
114
+ const errorsId = `${id}-errors`;
115
+ const text = {
116
+ choose: labels?.choose ?? "Choose file",
117
+ chooseMany: labels?.chooseMany ?? "Choose files",
118
+ addMore: labels?.addMore ?? "Add more files"
119
+ };
120
+ const [openIndex, setOpenIndex] = react$1.useState(null);
121
+ const values = react$1.useMemo(() => asList(value), [value]);
122
+ const files = react$1.useMemo(() => values.filter((item) => item instanceof File), [values]);
123
+ const urls = useObjectUrls(files);
124
+ const previews = react$1.useMemo(
125
+ () => values.flatMap((item, index) => {
126
+ const url = typeof item === "string" ? item : urls.get(item);
127
+ return url === void 0 ? [] : [{ index, media: { type: getMediaType2(item), url } }];
128
+ }),
129
+ [values, urls, getMediaType2]
130
+ );
131
+ const media$1 = react$1.useMemo(() => previews.map((preview) => preview.media), [previews]);
132
+ const messages = errors.flatMap((error, index) => error ? [{ error, index }] : []);
133
+ const hasErrors = messages.length > 0;
134
+ if (openIndex !== null && openIndex >= previews.length) setOpenIndex(null);
135
+ const handleChange = /* @__PURE__ */ __name((event) => {
136
+ if (disabled) return;
137
+ onChange?.(event);
138
+ event.target.value = "";
139
+ }, "handleChange");
140
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `flex max-w-full min-w-0 flex-col gap-1.5 ${containerClassName}`, children: [
141
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
142
+ /* @__PURE__ */ jsxRuntime.jsx(inputs.InputLabel, { htmlFor: id, children: label }),
143
+ /* @__PURE__ */ jsxRuntime.jsxs(
144
+ "div",
145
+ {
146
+ "data-invalid": hasErrors ? "" : void 0,
147
+ className: `border-primary/10 bg-smoke-eerie focus-within:border-blue-crayola-c has-focus-visible:border-blue-crayola-c data-invalid:border-red-c group flex items-center justify-between gap-3 rounded-lg border px-3 ${className}`,
148
+ children: [
149
+ /* @__PURE__ */ jsxRuntime.jsx(inputs.InputIcon, { icon: icons?.left }),
150
+ /* @__PURE__ */ jsxRuntime.jsxs(
151
+ "label",
152
+ {
153
+ htmlFor: id,
154
+ className: `text-primary/30 min-w-0 flex-1 truncate py-2 text-[13px] xl:py-3 ${disabled ? "cursor-not-allowed" : "cursor-pointer"} ${inputProps.className ?? ""}`,
155
+ children: [
156
+ placeholder ?? (multiple ? text.chooseMany : text.choose),
157
+ /* @__PURE__ */ jsxRuntime.jsx(
158
+ "input",
159
+ {
160
+ ...inputProps,
161
+ id,
162
+ type: "file",
163
+ accept: accept ?? "image/*",
164
+ multiple,
165
+ disabled,
166
+ "aria-invalid": hasErrors ? true : void 0,
167
+ "aria-describedby": [inputProps["aria-describedby"], hasErrors ? errorsId : void 0].filter(Boolean).join(" ") || void 0,
168
+ onChange: handleChange,
169
+ className: "sr-only"
170
+ }
171
+ )
172
+ ]
173
+ }
174
+ ),
175
+ /* @__PURE__ */ jsxRuntime.jsx(inputs.InputIcon, { icon: icons?.right })
176
+ ]
177
+ }
178
+ )
179
+ ] }),
180
+ hasErrors && /* @__PURE__ */ jsxRuntime.jsx("div", { id: errorsId, className: "space-y-1", children: messages.map(({ error, index }) => /* @__PURE__ */ jsxRuntime.jsx(
181
+ inputs.InputError,
182
+ {
183
+ error: messages.length > 1 ? `${String(index + 1)}. ${error}` : error
184
+ },
185
+ index
186
+ )) }),
187
+ previews.length > 0 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "border-primary/10 bg-smoke-eerie relative flex rounded-lg border", children: [
188
+ multiple && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "sticky left-0 mr-1 ml-2 flex items-center justify-start gap-3", children: [
189
+ /* @__PURE__ */ jsxRuntime.jsxs(
190
+ "label",
191
+ {
192
+ htmlFor: id,
193
+ className: `border-primary/50 bg-tertiary-invert hover:border-tertiary flex size-14 shrink-0 items-center justify-center overflow-hidden rounded-md border shadow-xs transition-colors duration-300 md:size-16 lg:size-20 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}`,
194
+ children: [
195
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: text.addMore }),
196
+ /* @__PURE__ */ jsxRuntime.jsx(
197
+ react.Icon,
198
+ {
199
+ "aria-hidden": "true",
200
+ icon: "solar:gallery-add-linear",
201
+ className: "text-primary size-[40%]"
202
+ }
203
+ )
204
+ ]
205
+ }
206
+ ),
207
+ /* @__PURE__ */ jsxRuntime.jsx(
208
+ "div",
209
+ {
210
+ "aria-hidden": "true",
211
+ className: "group bg-hr-line my-2 h-14 w-px shrink-0 md:h-16 lg:h-20"
212
+ }
213
+ )
214
+ ] }),
215
+ /* @__PURE__ */ jsxRuntime.jsx(
216
+ media.MediaCarousel,
217
+ {
218
+ className: mediaCarouselClassName,
219
+ gradientClassNames: {
220
+ left: "from-smoke-eerie rounded-l-[7px] z-2",
221
+ right: "from-smoke-eerie rounded-r-[7px] z-2"
222
+ },
223
+ media: media$1,
224
+ invalid: previews.map((preview) => !!errors.at(preview.index)),
225
+ labels,
226
+ playerProps,
227
+ onClick: setOpenIndex,
228
+ handleRemove: handleRemove && ((position) => {
229
+ const preview = previews.at(position);
230
+ if (preview) handleRemove(preview.index);
231
+ })
232
+ }
233
+ )
234
+ ] }),
235
+ /* @__PURE__ */ jsxRuntime.jsx(
236
+ media.MediaModal,
237
+ {
238
+ className: mediaModalClassName,
239
+ media: media$1,
240
+ isOpen: openIndex !== null,
241
+ selected: openIndex,
242
+ onClose: () => {
243
+ setOpenIndex(null);
244
+ },
245
+ labels,
246
+ playerProps,
247
+ handleRemove: handleRemove && ((position) => {
248
+ const preview = previews.at(position);
249
+ if (preview) handleRemove(preview.index);
250
+ })
251
+ }
252
+ )
253
+ ] });
254
+ }, "FileInput");
255
+
256
+ exports.FileInput = FileInput;
257
+ exports.getMediaType = getMediaType;
258
+ //# sourceMappingURL=index.cjs.map
259
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/icon-registry.ts","../../src/file-input/file-input-icons.ts","../../src/file-input/media-type.ts","../../src/file-input/useObjectUrls.ts","../../src/file-input/FileInput.tsx"],"names":["addCollection","useRef","useState","useEffect","getMediaType","useId","useMemo","media","jsxs","jsx","InputLabel","InputIcon","InputError","Icon","MediaCarousel","MediaModal"],"mappings":"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","file":"index.cjs","sourcesContent":["import { addCollection, type IconifyJSON } from '@iconify/react';\n\n/**\n * Makes the registration of a bundled icon set: `register` puts the sets in Iconify (once, calling it\n * again does nothing) and `names` lists every icon, e.g. `solar:info-circle-linear`.\n *\n * A component calls `register` when it renders, not when its file is imported: an app that never\n * renders the component never runs it, and nothing depends on the bundler keeping an import that is\n * only there for its effect (the build says \"ignored-bare-import\" for those).\n */\nexport const createIconRegistry = (sets: readonly IconifyJSON[]) => {\n let registered = false;\n\n return {\n register: () => {\n if (registered) return;\n\n for (const set of sets) addCollection(set);\n registered = true;\n },\n names: sets.flatMap(({ prefix, icons, aliases }) =>\n [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`),\n ),\n };\n};\n","import type { IconifyJSON } from '@iconify/react';\n\nimport { createIconRegistry } from '../lib/icon-registry.js';\n\n/*\n * The icons of the file input, bundled so they show without a network and without waiting for the\n * Iconify API (see `toast/toast-icons.ts`). The data is what\n * `https://api.iconify.design/<prefix>.json?icons=<name>` answers.\n */\nconst ICON_SETS: IconifyJSON[] = [\n {\n prefix: 'solar',\n width: 24,\n height: 24,\n icons: {\n 'gallery-add-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M22 12C22 16.714 22 19.0711 20.5355 20.5355C19.0711 22 16.714 22 12 22C7.28595 22 4.92893 22 3.46447 20.5355C2 19.0711 2 16.714 2 12C2 7.28595 2 4.92893 3.46447 3.46447C4.92893 2 7.28595 2 12 2\"/><path d=\"M2 12.5001L3.75159 10.9675C4.66286 10.1702 6.03628 10.2159 6.89249 11.0721L11.1822 15.3618C11.8694 16.0491 12.9512 16.1428 13.7464 15.5839L14.0446 15.3744C15.1888 14.5702 16.7369 14.6634 17.7765 15.599L21 18.5001\"/><path d=\"M15 5.5H18.5M18.5 5.5H22M18.5 5.5V9M18.5 5.5V2\"/></g>',\n },\n },\n },\n];\n\n/**\n * Registers the icons above with Iconify; the components of this entry call it when they render\n * (calling it again is harmless).\n */\nexport const { register: registerFileInputIcons, names: FILE_INPUT_ICON_NAMES } =\n createIconRegistry(ICON_SETS);\n","import type { TMediaResource } from '../media/index.js';\n\n// The endings of an address of a video. Anything else is taken for a picture.\nconst VIDEO_EXTENSIONS: ReadonlySet<string> = new Set([\n 'avi',\n 'm3u8',\n 'm4v',\n 'mkv',\n 'mov',\n 'mp4',\n 'ogg',\n 'ogv',\n 'webm',\n]);\n\n/**\n * Whether a file or an address is a picture or a video. A file says it with its type (`video/mp4`);\n * an address says it with its ending (`.mp4`, also before a `?` or a `#`). What is not known is a\n * picture, so a preview is always drawn.\n */\nexport const getMediaType = (value: File | string): TMediaResource => {\n if (typeof value !== 'string') return value.type.startsWith('video/') ? 'video' : 'image';\n\n const path = value.split(/[?#]/, 1).at(0) ?? '';\n const extension = /\\.([a-z0-9]+)$/i.exec(path)?.at(1)?.toLowerCase() ?? '';\n\n return VIDEO_EXTENSIONS.has(extension) ? 'video' : 'image';\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * An address the browser can show for each file (`URL.createObjectURL`), made once for a file, and\n * given back (`URL.revokeObjectURL`) when the file is no longer in the list and when the component\n * goes away, so the memory of a file is not kept after it is not needed.\n *\n * The addresses are made after the render (it is an effect: making them is a change in the browser),\n * so a file that was just added has none for one render; look for it with `urls.get(file)`.\n */\nexport const useObjectUrls = (files: readonly File[]): ReadonlyMap<File, string> => {\n const liveRef = useRef(new Map<File, string>());\n const [urls, setUrls] = useState<ReadonlyMap<File, string>>(new Map());\n\n useEffect(() => {\n const live = liveRef.current;\n const wanted = new Set(files);\n\n for (const [file, url] of live) {\n if (wanted.has(file)) continue;\n\n URL.revokeObjectURL(url);\n live.delete(file);\n }\n\n for (const file of wanted) {\n if (!live.has(file)) live.set(file, URL.createObjectURL(file));\n }\n\n // making an address changes the browser, which is what an effect is for; the render has to be\n // told about it to draw the files\n\n setUrls(new Map(live));\n }, [files]);\n\n useEffect(() => {\n const live = liveRef.current;\n\n return () => {\n for (const url of live.values()) URL.revokeObjectURL(url);\n\n live.clear();\n };\n }, []);\n\n return urls;\n};\n","import { Icon } from '@iconify/react';\nimport { type ChangeEvent, type InputHTMLAttributes, useId, useMemo, useState } from 'react';\n\nimport {\n type IFieldBase,\n InputError,\n InputIcon,\n InputLabel,\n type TInputIcons,\n} from '../inputs/index.js';\nimport {\n type IMediaLabels,\n MediaCarousel,\n MediaModal,\n type TMediaOption,\n type TMediaResource,\n type TPlayerProps,\n} from '../media/index.js';\nimport { registerFileInputIcons } from './file-input-icons.js';\nimport { getMediaType as defaultGetMediaType } from './media-type.js';\nimport { useObjectUrls } from './useObjectUrls.js';\n\n/** A file the person chose, or the address of one that is already saved. */\nexport type TFileInputValue = File | string;\n\n/** The words on the field and the buttons. English by default. */\nexport interface IFileInputLabels extends IMediaLabels {\n /** What the field says for one file. */\n choose: string;\n /** What the field says when it takes several files. */\n chooseMany: string;\n /** The name of the tile that adds more files to the ones chosen. */\n addMore: string;\n}\n\nexport interface IFileInput extends Omit<IFieldBase, 'error'> {\n /** The attributes of the `<input type=\"file\">`; `value` is what is shown under the field. */\n fileInputProps: Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'value'> & {\n /** The file (or its address) or the list of them, to show a thumbnail for each. */\n value?: TFileInputValue | readonly TFileInputValue[];\n };\n /** An icon at each end of the field. One with an `onClick` is a button and needs a `label`. */\n icons?: TInputIcons;\n /**\n * What is wrong with each file, in the order of the files (`undefined` or `''` for one that is\n * fine). Each message is shown under the field, and the thumbnail of the file gets a red border.\n */\n errors?: readonly (string | undefined)[];\n /** Adds a button on each thumbnail that calls this with the index of its file. */\n handleRemove?: (index: number) => void;\n /** The class of the backdrop of the dialog that shows a file big. */\n mediaModalClassName?: string;\n /** The class of the row of thumbnails. */\n mediaCarouselClassName?: string;\n /** Says if a file or an address is a picture or a video. The default looks at the type and at the ending. */\n getMediaType?: (value: TFileInputValue) => TMediaResource;\n labels?: Partial<IFileInputLabels>;\n /** What to give the players of the videos, e.g. `getPoster` to ask a service for their posters. */\n playerProps?: TPlayerProps;\n}\n\ninterface IPreview {\n /** The place of the file in the list the app gave. */\n index: number;\n media: TMediaOption;\n}\n\nconst asList = (value: TFileInputValue | readonly TFileInputValue[] | undefined) => {\n if (value === undefined) return [];\n\n return typeof value === 'string' || value instanceof File ? [value] : value;\n};\n\n/**\n * A field to choose files, with a thumbnail under it for each file that is chosen. A thumbnail opens\n * the file big, in a dialog where the others can be browsed, and can have a button that removes it.\n *\n * - It is a real file input: the keyboard reaches it (it shows the focus on the field), and pressing\n * the label or the field opens the browser's chooser. The same file can be chosen again (the input\n * is emptied after each choice).\n * - The files are `value` (the app keeps them, as with any field); a text in the list is the address\n * of a file that is already saved, shown as it is.\n * - The messages of `errors` are said as they show up, and the thumbnail of a file with a problem has a\n * red border.\n */\nexport const FileInput = ({\n label = '',\n className = '',\n containerClassName = '',\n mediaModalClassName = '',\n mediaCarouselClassName = '',\n errors = [],\n handleRemove,\n fileInputProps,\n icons,\n getMediaType = defaultGetMediaType,\n labels,\n playerProps,\n}: IFileInput) => {\n registerFileInputIcons();\n\n const {\n value,\n onChange,\n placeholder,\n disabled,\n multiple,\n accept,\n id: givenId,\n ...inputProps\n } = fileInputProps;\n const baseId = useId();\n const id = givenId ?? fileInputProps.name ?? `${baseId}-field`;\n const errorsId = `${id}-errors`;\n const text = {\n choose: labels?.choose ?? 'Choose file',\n chooseMany: labels?.chooseMany ?? 'Choose files',\n addMore: labels?.addMore ?? 'Add more files',\n };\n\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n const values = useMemo(() => asList(value), [value]);\n const files = useMemo(() => values.filter((item) => item instanceof File), [values]);\n const urls = useObjectUrls(files);\n\n // A file has its thumbnail once it has an address; its place in the list is kept for the app.\n const previews = useMemo(\n () =>\n values.flatMap<IPreview>((item, index) => {\n const url = typeof item === 'string' ? item : urls.get(item);\n\n return url === undefined ? [] : [{ index, media: { type: getMediaType(item), url } }];\n }),\n [values, urls, getMediaType],\n );\n const media = useMemo(() => previews.map((preview) => preview.media), [previews]);\n const messages = errors.flatMap((error, index) => (error ? [{ error, index }] : []));\n const hasErrors = messages.length > 0;\n\n // The dialog is closed when the file it was opened on is no longer there.\n if (openIndex !== null && openIndex >= previews.length) setOpenIndex(null);\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n onChange?.(event);\n // emptied, so the same file can be chosen again\n event.target.value = '';\n };\n\n return (\n <div className={`flex max-w-full min-w-0 flex-col gap-1.5 ${containerClassName}`}>\n <div className=\"relative\">\n <InputLabel htmlFor={id}>{label}</InputLabel>\n <div\n data-invalid={hasErrors ? '' : undefined}\n className={`border-primary/10 bg-smoke-eerie focus-within:border-blue-crayola-c has-focus-visible:border-blue-crayola-c data-invalid:border-red-c group flex items-center justify-between gap-3 rounded-lg border px-3 ${className}`}\n >\n <InputIcon icon={icons?.left} />\n <label\n htmlFor={id}\n className={`text-primary/30 min-w-0 flex-1 truncate py-2 text-[13px] xl:py-3 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n } ${inputProps.className ?? ''}`}\n >\n {placeholder ?? (multiple ? text.chooseMany : text.choose)}\n <input\n {...inputProps}\n id={id}\n type=\"file\"\n accept={accept ?? 'image/*'}\n multiple={multiple}\n disabled={disabled}\n aria-invalid={hasErrors ? true : undefined}\n aria-describedby={\n [inputProps['aria-describedby'], hasErrors ? errorsId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n }\n onChange={handleChange}\n className=\"sr-only\"\n />\n </label>\n <InputIcon icon={icons?.right} />\n </div>\n </div>\n\n {hasErrors && (\n <div id={errorsId} className=\"space-y-1\">\n {messages.map(({ error, index }) => (\n <InputError\n key={index}\n error={messages.length > 1 ? `${String(index + 1)}. ${error}` : error}\n />\n ))}\n </div>\n )}\n\n {previews.length > 0 && (\n <div className=\"border-primary/10 bg-smoke-eerie relative flex rounded-lg border\">\n {multiple && (\n <div className=\"sticky left-0 mr-1 ml-2 flex items-center justify-start gap-3\">\n <label\n htmlFor={id}\n className={`border-primary/50 bg-tertiary-invert hover:border-tertiary flex size-14 shrink-0 items-center justify-center overflow-hidden rounded-md border shadow-xs transition-colors duration-300 md:size-16 lg:size-20 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n >\n <span className=\"sr-only\">{text.addMore}</span>\n <Icon\n aria-hidden=\"true\"\n icon=\"solar:gallery-add-linear\"\n className=\"text-primary size-[40%]\"\n />\n </label>\n <div\n aria-hidden=\"true\"\n className=\"group bg-hr-line my-2 h-14 w-px shrink-0 md:h-16 lg:h-20\"\n />\n </div>\n )}\n <MediaCarousel\n className={mediaCarouselClassName}\n gradientClassNames={{\n left: 'from-smoke-eerie rounded-l-[7px] z-2',\n right: 'from-smoke-eerie rounded-r-[7px] z-2',\n }}\n media={media}\n invalid={previews.map((preview) => !!errors.at(preview.index))}\n labels={labels}\n playerProps={playerProps}\n onClick={setOpenIndex}\n handleRemove={\n handleRemove &&\n ((position) => {\n const preview = previews.at(position);\n\n if (preview) handleRemove(preview.index);\n })\n }\n />\n </div>\n )}\n\n <MediaModal\n className={mediaModalClassName}\n media={media}\n isOpen={openIndex !== null}\n selected={openIndex}\n onClose={() => {\n setOpenIndex(null);\n }}\n labels={labels}\n playerProps={playerProps}\n handleRemove={\n handleRemove &&\n ((position) => {\n const preview = previews.at(position);\n\n if (preview) handleRemove(preview.index);\n })\n }\n />\n </div>\n );\n};\n"]}
@@ -0,0 +1,3 @@
1
+ export { FileInput, type IFileInput, type IFileInputLabels, type TFileInputValue, } from './FileInput.js';
2
+ export { getMediaType } from './media-type.js';
3
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/file-input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { FileInput, type IFileInput, type IFileInputLabels, type TFileInputValue, } from './FileInput.js';
2
+ export { getMediaType } from './media-type.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/file-input/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,SAAS,EACT,KAAK,UAAU,EACf,KAAK,gBAAgB,EACrB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,256 @@
1
+ import { addCollection, Icon } from '@iconify/react';
2
+ import { useId, useState, useMemo, useRef, useEffect } from 'react';
3
+ import { InputLabel, InputIcon, InputError } from '@beautinique/frontend-components/inputs';
4
+ import { MediaCarousel, MediaModal } from '@beautinique/frontend-components/media';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+ var createIconRegistry = /* @__PURE__ */ __name((sets) => {
10
+ let registered = false;
11
+ return {
12
+ register: /* @__PURE__ */ __name(() => {
13
+ if (registered) return;
14
+ for (const set of sets) addCollection(set);
15
+ registered = true;
16
+ }, "register"),
17
+ names: sets.flatMap(
18
+ ({ prefix, icons, aliases }) => [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`)
19
+ )
20
+ };
21
+ }, "createIconRegistry");
22
+
23
+ // src/file-input/file-input-icons.ts
24
+ var ICON_SETS = [
25
+ {
26
+ prefix: "solar",
27
+ width: 24,
28
+ height: 24,
29
+ icons: {
30
+ "gallery-add-linear": {
31
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M22 12C22 16.714 22 19.0711 20.5355 20.5355C19.0711 22 16.714 22 12 22C7.28595 22 4.92893 22 3.46447 20.5355C2 19.0711 2 16.714 2 12C2 7.28595 2 4.92893 3.46447 3.46447C4.92893 2 7.28595 2 12 2"/><path d="M2 12.5001L3.75159 10.9675C4.66286 10.1702 6.03628 10.2159 6.89249 11.0721L11.1822 15.3618C11.8694 16.0491 12.9512 16.1428 13.7464 15.5839L14.0446 15.3744C15.1888 14.5702 16.7369 14.6634 17.7765 15.599L21 18.5001"/><path d="M15 5.5H18.5M18.5 5.5H22M18.5 5.5V9M18.5 5.5V2"/></g>'
32
+ }
33
+ }
34
+ }
35
+ ];
36
+ var { register: registerFileInputIcons, names: FILE_INPUT_ICON_NAMES } = createIconRegistry(ICON_SETS);
37
+
38
+ // src/file-input/media-type.ts
39
+ var VIDEO_EXTENSIONS = /* @__PURE__ */ new Set([
40
+ "avi",
41
+ "m3u8",
42
+ "m4v",
43
+ "mkv",
44
+ "mov",
45
+ "mp4",
46
+ "ogg",
47
+ "ogv",
48
+ "webm"
49
+ ]);
50
+ var getMediaType = /* @__PURE__ */ __name((value) => {
51
+ if (typeof value !== "string") return value.type.startsWith("video/") ? "video" : "image";
52
+ const path = value.split(/[?#]/, 1).at(0) ?? "";
53
+ const extension = /\.([a-z0-9]+)$/i.exec(path)?.at(1)?.toLowerCase() ?? "";
54
+ return VIDEO_EXTENSIONS.has(extension) ? "video" : "image";
55
+ }, "getMediaType");
56
+ var useObjectUrls = /* @__PURE__ */ __name((files) => {
57
+ const liveRef = useRef(/* @__PURE__ */ new Map());
58
+ const [urls, setUrls] = useState(/* @__PURE__ */ new Map());
59
+ useEffect(() => {
60
+ const live = liveRef.current;
61
+ const wanted = new Set(files);
62
+ for (const [file, url] of live) {
63
+ if (wanted.has(file)) continue;
64
+ URL.revokeObjectURL(url);
65
+ live.delete(file);
66
+ }
67
+ for (const file of wanted) {
68
+ if (!live.has(file)) live.set(file, URL.createObjectURL(file));
69
+ }
70
+ setUrls(new Map(live));
71
+ }, [files]);
72
+ useEffect(() => {
73
+ const live = liveRef.current;
74
+ return () => {
75
+ for (const url of live.values()) URL.revokeObjectURL(url);
76
+ live.clear();
77
+ };
78
+ }, []);
79
+ return urls;
80
+ }, "useObjectUrls");
81
+ var asList = /* @__PURE__ */ __name((value) => {
82
+ if (value === void 0) return [];
83
+ return typeof value === "string" || value instanceof File ? [value] : value;
84
+ }, "asList");
85
+ var FileInput = /* @__PURE__ */ __name(({
86
+ label = "",
87
+ className = "",
88
+ containerClassName = "",
89
+ mediaModalClassName = "",
90
+ mediaCarouselClassName = "",
91
+ errors = [],
92
+ handleRemove,
93
+ fileInputProps,
94
+ icons,
95
+ getMediaType: getMediaType2 = getMediaType,
96
+ labels,
97
+ playerProps
98
+ }) => {
99
+ registerFileInputIcons();
100
+ const {
101
+ value,
102
+ onChange,
103
+ placeholder,
104
+ disabled,
105
+ multiple,
106
+ accept,
107
+ id: givenId,
108
+ ...inputProps
109
+ } = fileInputProps;
110
+ const baseId = useId();
111
+ const id = givenId ?? fileInputProps.name ?? `${baseId}-field`;
112
+ const errorsId = `${id}-errors`;
113
+ const text = {
114
+ choose: labels?.choose ?? "Choose file",
115
+ chooseMany: labels?.chooseMany ?? "Choose files",
116
+ addMore: labels?.addMore ?? "Add more files"
117
+ };
118
+ const [openIndex, setOpenIndex] = useState(null);
119
+ const values = useMemo(() => asList(value), [value]);
120
+ const files = useMemo(() => values.filter((item) => item instanceof File), [values]);
121
+ const urls = useObjectUrls(files);
122
+ const previews = useMemo(
123
+ () => values.flatMap((item, index) => {
124
+ const url = typeof item === "string" ? item : urls.get(item);
125
+ return url === void 0 ? [] : [{ index, media: { type: getMediaType2(item), url } }];
126
+ }),
127
+ [values, urls, getMediaType2]
128
+ );
129
+ const media = useMemo(() => previews.map((preview) => preview.media), [previews]);
130
+ const messages = errors.flatMap((error, index) => error ? [{ error, index }] : []);
131
+ const hasErrors = messages.length > 0;
132
+ if (openIndex !== null && openIndex >= previews.length) setOpenIndex(null);
133
+ const handleChange = /* @__PURE__ */ __name((event) => {
134
+ if (disabled) return;
135
+ onChange?.(event);
136
+ event.target.value = "";
137
+ }, "handleChange");
138
+ return /* @__PURE__ */ jsxs("div", { className: `flex max-w-full min-w-0 flex-col gap-1.5 ${containerClassName}`, children: [
139
+ /* @__PURE__ */ jsxs("div", { className: "relative", children: [
140
+ /* @__PURE__ */ jsx(InputLabel, { htmlFor: id, children: label }),
141
+ /* @__PURE__ */ jsxs(
142
+ "div",
143
+ {
144
+ "data-invalid": hasErrors ? "" : void 0,
145
+ className: `border-primary/10 bg-smoke-eerie focus-within:border-blue-crayola-c has-focus-visible:border-blue-crayola-c data-invalid:border-red-c group flex items-center justify-between gap-3 rounded-lg border px-3 ${className}`,
146
+ children: [
147
+ /* @__PURE__ */ jsx(InputIcon, { icon: icons?.left }),
148
+ /* @__PURE__ */ jsxs(
149
+ "label",
150
+ {
151
+ htmlFor: id,
152
+ className: `text-primary/30 min-w-0 flex-1 truncate py-2 text-[13px] xl:py-3 ${disabled ? "cursor-not-allowed" : "cursor-pointer"} ${inputProps.className ?? ""}`,
153
+ children: [
154
+ placeholder ?? (multiple ? text.chooseMany : text.choose),
155
+ /* @__PURE__ */ jsx(
156
+ "input",
157
+ {
158
+ ...inputProps,
159
+ id,
160
+ type: "file",
161
+ accept: accept ?? "image/*",
162
+ multiple,
163
+ disabled,
164
+ "aria-invalid": hasErrors ? true : void 0,
165
+ "aria-describedby": [inputProps["aria-describedby"], hasErrors ? errorsId : void 0].filter(Boolean).join(" ") || void 0,
166
+ onChange: handleChange,
167
+ className: "sr-only"
168
+ }
169
+ )
170
+ ]
171
+ }
172
+ ),
173
+ /* @__PURE__ */ jsx(InputIcon, { icon: icons?.right })
174
+ ]
175
+ }
176
+ )
177
+ ] }),
178
+ hasErrors && /* @__PURE__ */ jsx("div", { id: errorsId, className: "space-y-1", children: messages.map(({ error, index }) => /* @__PURE__ */ jsx(
179
+ InputError,
180
+ {
181
+ error: messages.length > 1 ? `${String(index + 1)}. ${error}` : error
182
+ },
183
+ index
184
+ )) }),
185
+ previews.length > 0 && /* @__PURE__ */ jsxs("div", { className: "border-primary/10 bg-smoke-eerie relative flex rounded-lg border", children: [
186
+ multiple && /* @__PURE__ */ jsxs("div", { className: "sticky left-0 mr-1 ml-2 flex items-center justify-start gap-3", children: [
187
+ /* @__PURE__ */ jsxs(
188
+ "label",
189
+ {
190
+ htmlFor: id,
191
+ className: `border-primary/50 bg-tertiary-invert hover:border-tertiary flex size-14 shrink-0 items-center justify-center overflow-hidden rounded-md border shadow-xs transition-colors duration-300 md:size-16 lg:size-20 ${disabled ? "cursor-not-allowed" : "cursor-pointer"}`,
192
+ children: [
193
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: text.addMore }),
194
+ /* @__PURE__ */ jsx(
195
+ Icon,
196
+ {
197
+ "aria-hidden": "true",
198
+ icon: "solar:gallery-add-linear",
199
+ className: "text-primary size-[40%]"
200
+ }
201
+ )
202
+ ]
203
+ }
204
+ ),
205
+ /* @__PURE__ */ jsx(
206
+ "div",
207
+ {
208
+ "aria-hidden": "true",
209
+ className: "group bg-hr-line my-2 h-14 w-px shrink-0 md:h-16 lg:h-20"
210
+ }
211
+ )
212
+ ] }),
213
+ /* @__PURE__ */ jsx(
214
+ MediaCarousel,
215
+ {
216
+ className: mediaCarouselClassName,
217
+ gradientClassNames: {
218
+ left: "from-smoke-eerie rounded-l-[7px] z-2",
219
+ right: "from-smoke-eerie rounded-r-[7px] z-2"
220
+ },
221
+ media,
222
+ invalid: previews.map((preview) => !!errors.at(preview.index)),
223
+ labels,
224
+ playerProps,
225
+ onClick: setOpenIndex,
226
+ handleRemove: handleRemove && ((position) => {
227
+ const preview = previews.at(position);
228
+ if (preview) handleRemove(preview.index);
229
+ })
230
+ }
231
+ )
232
+ ] }),
233
+ /* @__PURE__ */ jsx(
234
+ MediaModal,
235
+ {
236
+ className: mediaModalClassName,
237
+ media,
238
+ isOpen: openIndex !== null,
239
+ selected: openIndex,
240
+ onClose: () => {
241
+ setOpenIndex(null);
242
+ },
243
+ labels,
244
+ playerProps,
245
+ handleRemove: handleRemove && ((position) => {
246
+ const preview = previews.at(position);
247
+ if (preview) handleRemove(preview.index);
248
+ })
249
+ }
250
+ )
251
+ ] });
252
+ }, "FileInput");
253
+
254
+ export { FileInput, getMediaType };
255
+ //# sourceMappingURL=index.js.map
256
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/icon-registry.ts","../../src/file-input/file-input-icons.ts","../../src/file-input/media-type.ts","../../src/file-input/useObjectUrls.ts","../../src/file-input/FileInput.tsx"],"names":["getMediaType","useState"],"mappings":";;;;;;;;AAUO,IAAM,kBAAA,2BAAsB,IAAA,KAAiC;AAClE,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,OAAO;AAAA,IACL,0BAAU,MAAA,CAAA,MAAM;AACd,MAAA,IAAI,UAAA,EAAY;AAEhB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,EAAM,aAAA,CAAc,GAAG,CAAA;AACzC,MAAA,UAAA,GAAa,IAAA;AAAA,IACf,CAAA,EALU,UAAA,CAAA;AAAA,IAMV,OAAO,IAAA,CAAK,OAAA;AAAA,MAAQ,CAAC,EAAE,MAAA,EAAQ,KAAA,EAAO,OAAA,EAAQ,KAC5C,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,OAAA,IAAW,EAAE,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAI,CAAA,CAAE;AAAA;AAC1F,GACF;AACF,CAAA,EAdkC,oBAAA,CAAA;;;ACDlC,IAAM,SAAA,GAA2B;AAAA,EAC/B;AAAA,IACE,MAAA,EAAQ,OAAA;AAAA,IACR,KAAA,EAAO,EAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,KAAA,EAAO;AAAA,MACL,oBAAA,EAAsB;AAAA,QACpB,IAAA,EAAM;AAAA;AACR;AACF;AAEJ,CAAA;AAMO,IAAM,EAAE,QAAA,EAAU,sBAAA,EAAwB,OAAO,qBAAA,EAAsB,GAC5E,mBAAmB,SAAS,CAAA;;;ACxB9B,IAAM,gBAAA,uBAA4C,GAAA,CAAI;AAAA,EACpD,KAAA;AAAA,EACA,MAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF,CAAC,CAAA;AAOM,IAAM,YAAA,2BAAgB,KAAA,KAAyC;AACpE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU,OAAO,MAAM,IAAA,CAAK,UAAA,CAAW,QAAQ,CAAA,GAAI,OAAA,GAAU,OAAA;AAElF,EAAA,MAAM,IAAA,GAAO,MAAM,KAAA,CAAM,MAAA,EAAQ,CAAC,CAAA,CAAE,EAAA,CAAG,CAAC,CAAA,IAAK,EAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,kBAAkB,IAAA,CAAK,IAAI,GAAG,EAAA,CAAG,CAAC,CAAA,EAAG,WAAA,EAAY,IAAK,EAAA;AAExE,EAAA,OAAO,gBAAA,CAAiB,GAAA,CAAI,SAAS,CAAA,GAAI,OAAA,GAAU,OAAA;AACrD,CAAA,EAP4B,cAAA;ACVrB,IAAM,aAAA,2BAAiB,KAAA,KAAsD;AAClF,EAAA,MAAM,OAAA,GAAU,MAAA,iBAAO,IAAI,GAAA,EAAmB,CAAA;AAC9C,EAAA,MAAM,CAAC,IAAA,EAAM,OAAO,IAAI,QAAA,iBAAoC,IAAI,KAAK,CAAA;AAErE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AACrB,IAAA,MAAM,MAAA,GAAS,IAAI,GAAA,CAAI,KAAK,CAAA;AAE5B,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,IAAA,EAAM;AAC9B,MAAA,IAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAEtB,MAAA,GAAA,CAAI,gBAAgB,GAAG,CAAA;AACvB,MAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,IAClB;AAEA,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,IAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,IAAA,EAAM,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA;AAAA,IAC/D;AAKA,IAAA,OAAA,CAAQ,IAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EACvB,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,OAAO,OAAA,CAAQ,OAAA;AAErB,IAAA,OAAO,MAAM;AACX,MAAA,KAAA,MAAW,OAAO,IAAA,CAAK,MAAA,EAAO,EAAG,GAAA,CAAI,gBAAgB,GAAG,CAAA;AAExD,MAAA,IAAA,CAAK,KAAA,EAAM;AAAA,IACb,CAAA;AAAA,EACF,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,OAAO,IAAA;AACT,CAAA,EApC6B,eAAA,CAAA;ACyD7B,IAAM,MAAA,2BAAU,KAAA,KAAoE;AAClF,EAAA,IAAI,KAAA,KAAU,MAAA,EAAW,OAAO,EAAC;AAEjC,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,iBAAiB,IAAA,GAAO,CAAC,KAAK,CAAA,GAAI,KAAA;AACxE,CAAA,EAJe,QAAA,CAAA;AAkBR,IAAM,4BAAY,MAAA,CAAA,CAAC;AAAA,EACxB,KAAA,GAAQ,EAAA;AAAA,EACR,SAAA,GAAY,EAAA;AAAA,EACZ,kBAAA,GAAqB,EAAA;AAAA,EACrB,mBAAA,GAAsB,EAAA;AAAA,EACtB,sBAAA,GAAyB,EAAA;AAAA,EACzB,SAAS,EAAC;AAAA,EACV,YAAA;AAAA,EACA,cAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAAA,aAAAA,GAAe,YAAA;AAAA,EACf,MAAA;AAAA,EACA;AACF,CAAA,KAAkB;AAChB,EAAA,sBAAA,EAAuB;AAEvB,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,EAAA,EAAI,OAAA;AAAA,IACJ,GAAG;AAAA,GACL,GAAI,cAAA;AACJ,EAAA,MAAM,SAAS,KAAA,EAAM;AACrB,EAAA,MAAM,EAAA,GAAK,OAAA,IAAW,cAAA,CAAe,IAAA,IAAQ,GAAG,MAAM,CAAA,MAAA,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,GAAG,EAAE,CAAA,OAAA,CAAA;AACtB,EAAA,MAAM,IAAA,GAAO;AAAA,IACX,MAAA,EAAQ,QAAQ,MAAA,IAAU,aAAA;AAAA,IAC1B,UAAA,EAAY,QAAQ,UAAA,IAAc,cAAA;AAAA,IAClC,OAAA,EAAS,QAAQ,OAAA,IAAW;AAAA,GAC9B;AAEA,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIC,SAAwB,IAAI,CAAA;AAE9D,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAM,MAAA,CAAO,KAAK,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AACnD,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,MAAA,CAAO,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,YAAgB,IAAI,CAAA,EAAG,CAAC,MAAM,CAAC,CAAA;AACnF,EAAA,MAAM,IAAA,GAAO,cAAc,KAAK,CAAA;AAGhC,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACf,MACE,MAAA,CAAO,OAAA,CAAkB,CAAC,MAAM,KAAA,KAAU;AACxC,MAAA,MAAM,MAAM,OAAO,IAAA,KAAS,WAAW,IAAA,GAAO,IAAA,CAAK,IAAI,IAAI,CAAA;AAE3D,MAAA,OAAO,GAAA,KAAQ,MAAA,GAAY,EAAC,GAAI,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,EAAE,MAAMD,aAAAA,CAAa,IAAI,CAAA,EAAG,GAAA,IAAO,CAAA;AAAA,IACtF,CAAC,CAAA;AAAA,IACH,CAAC,MAAA,EAAQ,IAAA,EAAMA,aAAY;AAAA,GAC7B;AACA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,OAAA,CAAQ,KAAK,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAChF,EAAA,MAAM,QAAA,GAAW,MAAA,CAAO,OAAA,CAAQ,CAAC,OAAO,KAAA,KAAW,KAAA,GAAQ,CAAC,EAAE,KAAA,EAAO,KAAA,EAAO,CAAA,GAAI,EAAG,CAAA;AACnF,EAAA,MAAM,SAAA,GAAY,SAAS,MAAA,GAAS,CAAA;AAGpC,EAAA,IAAI,cAAc,IAAA,IAAQ,SAAA,IAAa,QAAA,CAAS,MAAA,eAAqB,IAAI,CAAA;AAEzE,EAAA,MAAM,YAAA,2BAAgB,KAAA,KAAyC;AAC7D,IAAA,IAAI,QAAA,EAAU;AAEd,IAAA,QAAA,GAAW,KAAK,CAAA;AAEhB,IAAA,KAAA,CAAM,OAAO,KAAA,GAAQ,EAAA;AAAA,EACvB,CAAA,EANqB,cAAA,CAAA;AAQrB,EAAA,uBACE,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,CAAA,yCAAA,EAA4C,kBAAkB,CAAA,CAAA,EAC5E,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,UAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,EAAA,EAAK,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,sBAChC,IAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,cAAA,EAAc,YAAY,EAAA,GAAK,MAAA;AAAA,UAC/B,SAAA,EAAW,8MAA8M,SAAS,CAAA,CAAA;AAAA,UAElO,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,4BAC9B,IAAA;AAAA,cAAC,OAAA;AAAA,cAAA;AAAA,gBACC,OAAA,EAAS,EAAA;AAAA,gBACT,SAAA,EAAW,oEACT,QAAA,GAAW,oBAAA,GAAuB,gBACpC,CAAA,CAAA,EAAI,UAAA,CAAW,aAAa,EAAE,CAAA,CAAA;AAAA,gBAE7B,QAAA,EAAA;AAAA,kBAAA,WAAA,KAAgB,QAAA,GAAW,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,MAAA,CAAA;AAAA,kCACnD,GAAA;AAAA,oBAAC,OAAA;AAAA,oBAAA;AAAA,sBACE,GAAG,UAAA;AAAA,sBACJ,EAAA;AAAA,sBACA,IAAA,EAAK,MAAA;AAAA,sBACL,QAAQ,MAAA,IAAU,SAAA;AAAA,sBAClB,QAAA;AAAA,sBACA,QAAA;AAAA,sBACA,cAAA,EAAc,YAAY,IAAA,GAAO,MAAA;AAAA,sBACjC,kBAAA,EACE,CAAC,UAAA,CAAW,kBAAkB,GAAG,SAAA,GAAY,QAAA,GAAW,MAAS,CAAA,CAC9D,MAAA,CAAO,OAAO,CAAA,CACd,IAAA,CAAK,GAAG,CAAA,IAAK,MAAA;AAAA,sBAElB,QAAA,EAAU,YAAA;AAAA,sBACV,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,aACF;AAAA,4BACA,GAAA,CAAC,SAAA,EAAA,EAAU,IAAA,EAAM,KAAA,EAAO,KAAA,EAAO;AAAA;AAAA;AAAA;AACjC,KAAA,EACF,CAAA;AAAA,IAEC,SAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,EAAA,EAAI,QAAA,EAAU,SAAA,EAAU,WAAA,EAC1B,QAAA,EAAA,QAAA,CAAS,GAAA,CAAI,CAAC,EAAE,KAAA,EAAO,OAAM,qBAC5B,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QAEC,KAAA,EAAO,QAAA,CAAS,MAAA,GAAS,CAAA,GAAI,CAAA,EAAG,MAAA,CAAO,KAAA,GAAQ,CAAC,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAA,GAAK;AAAA,OAAA;AAAA,MAD3D;AAAA,KAGR,CAAA,EACH,CAAA;AAAA,IAGD,SAAS,MAAA,GAAS,CAAA,oBACjB,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kEAAA,EACZ,QAAA,EAAA;AAAA,MAAA,QAAA,oBACC,IAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,+DAAA,EACb,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,OAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAS,EAAA;AAAA,YACT,SAAA,EAAW,CAAA,8MAAA,EACT,QAAA,GAAW,oBAAA,GAAuB,gBACpC,CAAA,CAAA;AAAA,YAEA,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAU,SAAA,EAAW,QAAA,EAAA,IAAA,CAAK,OAAA,EAAQ,CAAA;AAAA,8BACxC,GAAA;AAAA,gBAAC,IAAA;AAAA,gBAAA;AAAA,kBACC,aAAA,EAAY,MAAA;AAAA,kBACZ,IAAA,EAAK,0BAAA;AAAA,kBACL,SAAA,EAAU;AAAA;AAAA;AACZ;AAAA;AAAA,SACF;AAAA,wBACA,GAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,aAAA,EAAY,MAAA;AAAA,YACZ,SAAA,EAAU;AAAA;AAAA;AACZ,OAAA,EACF,CAAA;AAAA,sBAEF,GAAA;AAAA,QAAC,aAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAW,sBAAA;AAAA,UACX,kBAAA,EAAoB;AAAA,YAClB,IAAA,EAAM,sCAAA;AAAA,YACN,KAAA,EAAO;AAAA,WACT;AAAA,UACA,KAAA;AAAA,UACA,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAC,CAAC,MAAA,CAAO,EAAA,CAAG,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,UAC7D,MAAA;AAAA,UACA,WAAA;AAAA,UACA,OAAA,EAAS,YAAA;AAAA,UACT,YAAA,EACE,YAAA,KACC,CAAC,QAAA,KAAa;AACb,YAAA,MAAM,OAAA,GAAU,QAAA,CAAS,EAAA,CAAG,QAAQ,CAAA;AAEpC,YAAA,IAAI,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,UACzC,CAAA;AAAA;AAAA;AAEJ,KAAA,EACF,CAAA;AAAA,oBAGF,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,mBAAA;AAAA,QACX,KAAA;AAAA,QACA,QAAQ,SAAA,KAAc,IAAA;AAAA,QACtB,QAAA,EAAU,SAAA;AAAA,QACV,SAAS,MAAM;AACb,UAAA,YAAA,CAAa,IAAI,CAAA;AAAA,QACnB,CAAA;AAAA,QACA,MAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA,EACE,YAAA,KACC,CAAC,QAAA,KAAa;AACb,UAAA,MAAM,OAAA,GAAU,QAAA,CAAS,EAAA,CAAG,QAAQ,CAAA;AAEpC,UAAA,IAAI,OAAA,EAAS,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,QACzC,CAAA;AAAA;AAAA;AAEJ,GAAA,EACF,CAAA;AAEJ,CAAA,EArLyB,WAAA","file":"index.js","sourcesContent":["import { addCollection, type IconifyJSON } from '@iconify/react';\n\n/**\n * Makes the registration of a bundled icon set: `register` puts the sets in Iconify (once, calling it\n * again does nothing) and `names` lists every icon, e.g. `solar:info-circle-linear`.\n *\n * A component calls `register` when it renders, not when its file is imported: an app that never\n * renders the component never runs it, and nothing depends on the bundler keeping an import that is\n * only there for its effect (the build says \"ignored-bare-import\" for those).\n */\nexport const createIconRegistry = (sets: readonly IconifyJSON[]) => {\n let registered = false;\n\n return {\n register: () => {\n if (registered) return;\n\n for (const set of sets) addCollection(set);\n registered = true;\n },\n names: sets.flatMap(({ prefix, icons, aliases }) =>\n [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`),\n ),\n };\n};\n","import type { IconifyJSON } from '@iconify/react';\n\nimport { createIconRegistry } from '../lib/icon-registry.js';\n\n/*\n * The icons of the file input, bundled so they show without a network and without waiting for the\n * Iconify API (see `toast/toast-icons.ts`). The data is what\n * `https://api.iconify.design/<prefix>.json?icons=<name>` answers.\n */\nconst ICON_SETS: IconifyJSON[] = [\n {\n prefix: 'solar',\n width: 24,\n height: 24,\n icons: {\n 'gallery-add-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M22 12C22 16.714 22 19.0711 20.5355 20.5355C19.0711 22 16.714 22 12 22C7.28595 22 4.92893 22 3.46447 20.5355C2 19.0711 2 16.714 2 12C2 7.28595 2 4.92893 3.46447 3.46447C4.92893 2 7.28595 2 12 2\"/><path d=\"M2 12.5001L3.75159 10.9675C4.66286 10.1702 6.03628 10.2159 6.89249 11.0721L11.1822 15.3618C11.8694 16.0491 12.9512 16.1428 13.7464 15.5839L14.0446 15.3744C15.1888 14.5702 16.7369 14.6634 17.7765 15.599L21 18.5001\"/><path d=\"M15 5.5H18.5M18.5 5.5H22M18.5 5.5V9M18.5 5.5V2\"/></g>',\n },\n },\n },\n];\n\n/**\n * Registers the icons above with Iconify; the components of this entry call it when they render\n * (calling it again is harmless).\n */\nexport const { register: registerFileInputIcons, names: FILE_INPUT_ICON_NAMES } =\n createIconRegistry(ICON_SETS);\n","import type { TMediaResource } from '../media/index.js';\n\n// The endings of an address of a video. Anything else is taken for a picture.\nconst VIDEO_EXTENSIONS: ReadonlySet<string> = new Set([\n 'avi',\n 'm3u8',\n 'm4v',\n 'mkv',\n 'mov',\n 'mp4',\n 'ogg',\n 'ogv',\n 'webm',\n]);\n\n/**\n * Whether a file or an address is a picture or a video. A file says it with its type (`video/mp4`);\n * an address says it with its ending (`.mp4`, also before a `?` or a `#`). What is not known is a\n * picture, so a preview is always drawn.\n */\nexport const getMediaType = (value: File | string): TMediaResource => {\n if (typeof value !== 'string') return value.type.startsWith('video/') ? 'video' : 'image';\n\n const path = value.split(/[?#]/, 1).at(0) ?? '';\n const extension = /\\.([a-z0-9]+)$/i.exec(path)?.at(1)?.toLowerCase() ?? '';\n\n return VIDEO_EXTENSIONS.has(extension) ? 'video' : 'image';\n};\n","import { useEffect, useRef, useState } from 'react';\n\n/**\n * An address the browser can show for each file (`URL.createObjectURL`), made once for a file, and\n * given back (`URL.revokeObjectURL`) when the file is no longer in the list and when the component\n * goes away, so the memory of a file is not kept after it is not needed.\n *\n * The addresses are made after the render (it is an effect: making them is a change in the browser),\n * so a file that was just added has none for one render; look for it with `urls.get(file)`.\n */\nexport const useObjectUrls = (files: readonly File[]): ReadonlyMap<File, string> => {\n const liveRef = useRef(new Map<File, string>());\n const [urls, setUrls] = useState<ReadonlyMap<File, string>>(new Map());\n\n useEffect(() => {\n const live = liveRef.current;\n const wanted = new Set(files);\n\n for (const [file, url] of live) {\n if (wanted.has(file)) continue;\n\n URL.revokeObjectURL(url);\n live.delete(file);\n }\n\n for (const file of wanted) {\n if (!live.has(file)) live.set(file, URL.createObjectURL(file));\n }\n\n // making an address changes the browser, which is what an effect is for; the render has to be\n // told about it to draw the files\n\n setUrls(new Map(live));\n }, [files]);\n\n useEffect(() => {\n const live = liveRef.current;\n\n return () => {\n for (const url of live.values()) URL.revokeObjectURL(url);\n\n live.clear();\n };\n }, []);\n\n return urls;\n};\n","import { Icon } from '@iconify/react';\nimport { type ChangeEvent, type InputHTMLAttributes, useId, useMemo, useState } from 'react';\n\nimport {\n type IFieldBase,\n InputError,\n InputIcon,\n InputLabel,\n type TInputIcons,\n} from '../inputs/index.js';\nimport {\n type IMediaLabels,\n MediaCarousel,\n MediaModal,\n type TMediaOption,\n type TMediaResource,\n type TPlayerProps,\n} from '../media/index.js';\nimport { registerFileInputIcons } from './file-input-icons.js';\nimport { getMediaType as defaultGetMediaType } from './media-type.js';\nimport { useObjectUrls } from './useObjectUrls.js';\n\n/** A file the person chose, or the address of one that is already saved. */\nexport type TFileInputValue = File | string;\n\n/** The words on the field and the buttons. English by default. */\nexport interface IFileInputLabels extends IMediaLabels {\n /** What the field says for one file. */\n choose: string;\n /** What the field says when it takes several files. */\n chooseMany: string;\n /** The name of the tile that adds more files to the ones chosen. */\n addMore: string;\n}\n\nexport interface IFileInput extends Omit<IFieldBase, 'error'> {\n /** The attributes of the `<input type=\"file\">`; `value` is what is shown under the field. */\n fileInputProps: Omit<InputHTMLAttributes<HTMLInputElement>, 'type' | 'value'> & {\n /** The file (or its address) or the list of them, to show a thumbnail for each. */\n value?: TFileInputValue | readonly TFileInputValue[];\n };\n /** An icon at each end of the field. One with an `onClick` is a button and needs a `label`. */\n icons?: TInputIcons;\n /**\n * What is wrong with each file, in the order of the files (`undefined` or `''` for one that is\n * fine). Each message is shown under the field, and the thumbnail of the file gets a red border.\n */\n errors?: readonly (string | undefined)[];\n /** Adds a button on each thumbnail that calls this with the index of its file. */\n handleRemove?: (index: number) => void;\n /** The class of the backdrop of the dialog that shows a file big. */\n mediaModalClassName?: string;\n /** The class of the row of thumbnails. */\n mediaCarouselClassName?: string;\n /** Says if a file or an address is a picture or a video. The default looks at the type and at the ending. */\n getMediaType?: (value: TFileInputValue) => TMediaResource;\n labels?: Partial<IFileInputLabels>;\n /** What to give the players of the videos, e.g. `getPoster` to ask a service for their posters. */\n playerProps?: TPlayerProps;\n}\n\ninterface IPreview {\n /** The place of the file in the list the app gave. */\n index: number;\n media: TMediaOption;\n}\n\nconst asList = (value: TFileInputValue | readonly TFileInputValue[] | undefined) => {\n if (value === undefined) return [];\n\n return typeof value === 'string' || value instanceof File ? [value] : value;\n};\n\n/**\n * A field to choose files, with a thumbnail under it for each file that is chosen. A thumbnail opens\n * the file big, in a dialog where the others can be browsed, and can have a button that removes it.\n *\n * - It is a real file input: the keyboard reaches it (it shows the focus on the field), and pressing\n * the label or the field opens the browser's chooser. The same file can be chosen again (the input\n * is emptied after each choice).\n * - The files are `value` (the app keeps them, as with any field); a text in the list is the address\n * of a file that is already saved, shown as it is.\n * - The messages of `errors` are said as they show up, and the thumbnail of a file with a problem has a\n * red border.\n */\nexport const FileInput = ({\n label = '',\n className = '',\n containerClassName = '',\n mediaModalClassName = '',\n mediaCarouselClassName = '',\n errors = [],\n handleRemove,\n fileInputProps,\n icons,\n getMediaType = defaultGetMediaType,\n labels,\n playerProps,\n}: IFileInput) => {\n registerFileInputIcons();\n\n const {\n value,\n onChange,\n placeholder,\n disabled,\n multiple,\n accept,\n id: givenId,\n ...inputProps\n } = fileInputProps;\n const baseId = useId();\n const id = givenId ?? fileInputProps.name ?? `${baseId}-field`;\n const errorsId = `${id}-errors`;\n const text = {\n choose: labels?.choose ?? 'Choose file',\n chooseMany: labels?.chooseMany ?? 'Choose files',\n addMore: labels?.addMore ?? 'Add more files',\n };\n\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n const values = useMemo(() => asList(value), [value]);\n const files = useMemo(() => values.filter((item) => item instanceof File), [values]);\n const urls = useObjectUrls(files);\n\n // A file has its thumbnail once it has an address; its place in the list is kept for the app.\n const previews = useMemo(\n () =>\n values.flatMap<IPreview>((item, index) => {\n const url = typeof item === 'string' ? item : urls.get(item);\n\n return url === undefined ? [] : [{ index, media: { type: getMediaType(item), url } }];\n }),\n [values, urls, getMediaType],\n );\n const media = useMemo(() => previews.map((preview) => preview.media), [previews]);\n const messages = errors.flatMap((error, index) => (error ? [{ error, index }] : []));\n const hasErrors = messages.length > 0;\n\n // The dialog is closed when the file it was opened on is no longer there.\n if (openIndex !== null && openIndex >= previews.length) setOpenIndex(null);\n\n const handleChange = (event: ChangeEvent<HTMLInputElement>) => {\n if (disabled) return;\n\n onChange?.(event);\n // emptied, so the same file can be chosen again\n event.target.value = '';\n };\n\n return (\n <div className={`flex max-w-full min-w-0 flex-col gap-1.5 ${containerClassName}`}>\n <div className=\"relative\">\n <InputLabel htmlFor={id}>{label}</InputLabel>\n <div\n data-invalid={hasErrors ? '' : undefined}\n className={`border-primary/10 bg-smoke-eerie focus-within:border-blue-crayola-c has-focus-visible:border-blue-crayola-c data-invalid:border-red-c group flex items-center justify-between gap-3 rounded-lg border px-3 ${className}`}\n >\n <InputIcon icon={icons?.left} />\n <label\n htmlFor={id}\n className={`text-primary/30 min-w-0 flex-1 truncate py-2 text-[13px] xl:py-3 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n } ${inputProps.className ?? ''}`}\n >\n {placeholder ?? (multiple ? text.chooseMany : text.choose)}\n <input\n {...inputProps}\n id={id}\n type=\"file\"\n accept={accept ?? 'image/*'}\n multiple={multiple}\n disabled={disabled}\n aria-invalid={hasErrors ? true : undefined}\n aria-describedby={\n [inputProps['aria-describedby'], hasErrors ? errorsId : undefined]\n .filter(Boolean)\n .join(' ') || undefined\n }\n onChange={handleChange}\n className=\"sr-only\"\n />\n </label>\n <InputIcon icon={icons?.right} />\n </div>\n </div>\n\n {hasErrors && (\n <div id={errorsId} className=\"space-y-1\">\n {messages.map(({ error, index }) => (\n <InputError\n key={index}\n error={messages.length > 1 ? `${String(index + 1)}. ${error}` : error}\n />\n ))}\n </div>\n )}\n\n {previews.length > 0 && (\n <div className=\"border-primary/10 bg-smoke-eerie relative flex rounded-lg border\">\n {multiple && (\n <div className=\"sticky left-0 mr-1 ml-2 flex items-center justify-start gap-3\">\n <label\n htmlFor={id}\n className={`border-primary/50 bg-tertiary-invert hover:border-tertiary flex size-14 shrink-0 items-center justify-center overflow-hidden rounded-md border shadow-xs transition-colors duration-300 md:size-16 lg:size-20 ${\n disabled ? 'cursor-not-allowed' : 'cursor-pointer'\n }`}\n >\n <span className=\"sr-only\">{text.addMore}</span>\n <Icon\n aria-hidden=\"true\"\n icon=\"solar:gallery-add-linear\"\n className=\"text-primary size-[40%]\"\n />\n </label>\n <div\n aria-hidden=\"true\"\n className=\"group bg-hr-line my-2 h-14 w-px shrink-0 md:h-16 lg:h-20\"\n />\n </div>\n )}\n <MediaCarousel\n className={mediaCarouselClassName}\n gradientClassNames={{\n left: 'from-smoke-eerie rounded-l-[7px] z-2',\n right: 'from-smoke-eerie rounded-r-[7px] z-2',\n }}\n media={media}\n invalid={previews.map((preview) => !!errors.at(preview.index))}\n labels={labels}\n playerProps={playerProps}\n onClick={setOpenIndex}\n handleRemove={\n handleRemove &&\n ((position) => {\n const preview = previews.at(position);\n\n if (preview) handleRemove(preview.index);\n })\n }\n />\n </div>\n )}\n\n <MediaModal\n className={mediaModalClassName}\n media={media}\n isOpen={openIndex !== null}\n selected={openIndex}\n onClose={() => {\n setOpenIndex(null);\n }}\n labels={labels}\n playerProps={playerProps}\n handleRemove={\n handleRemove &&\n ((position) => {\n const preview = previews.at(position);\n\n if (preview) handleRemove(preview.index);\n })\n }\n />\n </div>\n );\n};\n"]}
@@ -0,0 +1,8 @@
1
+ import type { TMediaResource } from '../media/index.js';
2
+ /**
3
+ * Whether a file or an address is a picture or a video. A file says it with its type (`video/mp4`);
4
+ * an address says it with its ending (`.mp4`, also before a `?` or a `#`). What is not known is a
5
+ * picture, so a preview is always drawn.
6
+ */
7
+ export declare const getMediaType: (value: File | string) => TMediaResource;
8
+ //# sourceMappingURL=media-type.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-type.d.cts","sourceRoot":"","sources":["../../src/file-input/media-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAexD;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,OAAO,IAAI,GAAG,MAAM,KAAG,cAOnD,CAAC"}