@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 @@
1
+ {"version":3,"sources":["../../src/media/captureVideoPoster.ts","../../src/media/labels.ts","../../src/lib/icon-registry.ts","../../src/media/media-icons.ts","../../src/lib/mergeRefs.ts","../../src/media/streaming.ts","../../src/media/VideoPlayer.tsx","../../src/media/MediaCarousel.tsx","../../src/media/MediaCarouselWithParentMedia.tsx","../../src/media/MediaModal.tsx","../../src/media/MediaCarouselWithModal.tsx"],"names":["poster","useRef","useEffect","jsx","Icon","useState","jsxs","Fragment"],"mappings":"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","file":"index.js","sourcesContent":["export interface ICapturePosterOptions {\n /** The second of the video to take the picture at. @default 0 */\n time?: number;\n /** The widest the picture gets, in pixels: a bigger frame is made smaller. @default 640 */\n maxWidth?: number;\n /** How long to wait for the video, in milliseconds. @default 10000 */\n timeout?: number;\n /** Stops the work (the video is dropped and the answer is `undefined`). */\n signal?: AbortSignal;\n}\n\n// A seek to the second the video is already at does not fire `seeked`, so the first frame is asked\n// for a moment after the start.\nconst MIN_TIME = 0.05;\n\n/**\n * A picture (a `data:` URL) of a frame of a video file, to show where the video would be before it\n * plays. It resolves to `undefined` when there is no picture to give: the video fails to load, is\n * not allowed to be read (a video from another site needs `Access-Control-Allow-Origin`), takes too\n * long, or the work was stopped. It never rejects.\n *\n * It cannot read a stream (`.m3u8`): ask the server for a poster for those.\n */\nexport const captureVideoPoster = (\n src: string,\n { time = 0, maxWidth = 640, timeout = 10_000, signal }: ICapturePosterOptions = {},\n) =>\n new Promise<string | undefined>((resolve) => {\n if (signal?.aborted) {\n resolve(undefined);\n\n return;\n }\n\n const video = document.createElement('video');\n let isDone = false;\n\n const finish = (poster?: string) => {\n if (isDone) return;\n\n isDone = true;\n window.clearTimeout(timer);\n signal?.removeEventListener('abort', abort);\n video.removeAttribute('src');\n video.load();\n resolve(poster);\n };\n const abort = () => {\n finish();\n };\n const timer = window.setTimeout(abort, timeout);\n\n video.muted = true;\n video.playsInline = true;\n video.preload = 'auto';\n video.crossOrigin = 'anonymous';\n\n video.addEventListener(\n 'loadeddata',\n () => {\n video.currentTime = Math.max(time, MIN_TIME);\n },\n { once: true },\n );\n video.addEventListener(\n 'seeked',\n () => {\n if (isDone) return;\n\n try {\n if (video.videoWidth === 0 || video.videoHeight === 0) {\n finish();\n\n return;\n }\n\n const scale = Math.min(1, maxWidth / video.videoWidth);\n const canvas = document.createElement('canvas');\n\n canvas.width = Math.round(video.videoWidth * scale);\n canvas.height = Math.round(video.videoHeight * scale);\n\n const context = canvas.getContext('2d');\n\n if (!context) {\n finish();\n\n return;\n }\n\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\n finish(canvas.toDataURL('image/jpeg', 0.8));\n } catch {\n // a canvas that was touched by a video of another origin refuses to be read\n finish();\n }\n },\n { once: true },\n );\n video.addEventListener('error', abort, { once: true });\n signal?.addEventListener('abort', abort, { once: true });\n\n video.src = src;\n });\n","export type TMediaResource = 'image' | 'video';\n\n/** One picture or video of a gallery. */\nexport interface TMediaOption {\n type: TMediaResource;\n url: string;\n}\n\n/**\n * The words the media components say to assistive technology (and in the counter). They are English\n * by default; give the ones you change in the `labels` prop of any of the components.\n */\nexport interface IMediaLabels {\n /** The name of the whole gallery (and of the dialog that shows it). */\n gallery: string;\n /** The name of the row of thumbnails, once it scrolls. */\n thumbnails: string;\n /** What a thumbnail button says it does. */\n select: (item: TMediaOption, index: number, total: number) => string;\n /** The alternative text of the picture (the name of the video) that is shown big. */\n preview: (item: TMediaOption, index: number, total: number) => string;\n /** What the button that removes an item says. */\n remove: (item: TMediaOption, index: number) => string;\n previous: string;\n next: string;\n /** The close button of the dialog. */\n close: string;\n /** The \"2 of 5\" between the arrows, read out when it changes. */\n counter: (index: number, total: number) => string;\n}\n\nconst position = (index: number, total: number) => `${String(index + 1)} of ${String(total)}`;\n\nconst KIND: Record<TMediaResource, string> = { image: 'Image', video: 'Video' };\n\n/** The words used when the app gives none. */\nexport const MEDIA_LABELS: IMediaLabels = {\n gallery: 'Media gallery',\n thumbnails: 'Thumbnails',\n select: (item, index, total) => `Show ${item.type} ${position(index, total)}`,\n preview: (item, index, total) => `${KIND[item.type]} ${position(index, total)}`,\n remove: (item, index) => `Remove ${item.type} ${String(index + 1)}`,\n previous: 'Previous',\n next: 'Next',\n close: 'Close',\n counter: position,\n};\n\n/** The labels the app gave, with the default for each it left out. */\nexport const resolveLabels = (labels?: Partial<IMediaLabels>): IMediaLabels => ({\n gallery: labels?.gallery ?? MEDIA_LABELS.gallery,\n thumbnails: labels?.thumbnails ?? MEDIA_LABELS.thumbnails,\n select: labels?.select ?? MEDIA_LABELS.select,\n preview: labels?.preview ?? MEDIA_LABELS.preview,\n remove: labels?.remove ?? MEDIA_LABELS.remove,\n previous: labels?.previous ?? MEDIA_LABELS.previous,\n next: labels?.next ?? MEDIA_LABELS.next,\n close: labels?.close ?? MEDIA_LABELS.close,\n counter: labels?.counter ?? MEDIA_LABELS.counter,\n});\n","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 carousels and the media dialog, 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 'play-linear': {\n body: '<path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\" d=\"M20.4086 9.35258C22.5305 10.5065 22.5305 13.4935 20.4086 14.6474L7.59662 21.6145C5.53435 22.736 3 21.2763 3 18.9671L3 5.0329C3 2.72368 5.53435 1.26402 7.59661 2.38548L20.4086 9.35258Z\"/>',\n },\n 'alt-arrow-left-linear': {\n body: '<path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M15 5L9 12L15 19\"/>',\n },\n },\n },\n {\n prefix: 'lucide',\n width: 24,\n height: 24,\n icons: {\n x: {\n body: '<path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M18 6L6 18M6 6l12 12\"/>',\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: registerMediaIcons, names: MEDIA_ICON_NAMES } =\n createIconRegistry(ICON_SETS);\n","import type { Ref } from 'react';\n\nconst assign = <T>(ref: Ref<T> | undefined, node: T | null) => {\n if (typeof ref === 'function') return ref(node);\n\n if (ref) ref.current = node;\n\n return undefined;\n};\n\n/**\n * One ref callback that gives the element to all the refs it is given (a ref of the app, the ref that\n * `register()` of React Hook Form makes, a ref of the component itself). When the element goes away\n * every ref gets `null` again, or, for a ref callback that returns a cleanup function, that cleanup is\n * called. Keep the result stable (`useMemo`): a new function at every render makes React take the\n * element away from the refs and give it again.\n */\nexport const mergeRefs =\n <T>(...refs: (Ref<T> | undefined)[]) =>\n (node: T | null) => {\n const cleanups = refs.map((ref) => assign(ref, node));\n\n return () => {\n refs.forEach((ref, index) => {\n const cleanup = cleanups[index];\n\n if (typeof cleanup === 'function') cleanup();\n else assign(ref, null);\n });\n };\n };\n","import type { ErrorData } from 'hls.js';\n\n// What a browser answers to `canPlayType()` for HLS when it plays it itself (Safari, iOS).\nconst HLS_MIME = 'application/vnd.apple.mpegurl';\n\n// A stream that has a fatal network or media error is tried again this many times before it is given\n// up (the player of hls.js has already retried by itself before it calls a error fatal).\nconst MAX_RECOVERIES = 3;\n\n/** Whether `src` is an HLS playlist (`.m3u8`, also with a query string such as a signed URL). */\nexport const isHlsSource = (src: string) => /\\.m3u8(?:$|[?#])/i.test(src);\n\nexport interface IStreamOptions {\n /** Start playing as soon as the stream is ready. */\n autoPlay: boolean;\n /** Called when the stream cannot be played: the browser cannot do it, `hls.js` could not be loaded, or a fatal error. */\n onError?: (error: unknown) => void;\n}\n\n/**\n * Makes `video` play the HLS playlist `src`, and returns the function that stops it.\n *\n * A browser that plays HLS itself (Safari, iOS) is given the playlist as the `src` of the video.\n * For the others `hls.js` is loaded at this moment (`import()`): a page that never plays a stream\n * does not download it, and an app that never uses a stream does not need to have it installed.\n * Errors are not logged: they go to `onError`.\n */\nexport const attachStream = (\n video: HTMLVideoElement,\n src: string,\n { autoPlay, onError }: IStreamOptions,\n) => {\n let isCancelled = false;\n let destroyPlayer: (() => void) | undefined;\n\n const play = () => {\n // a browser may refuse to start a video by itself: that is not an error of the stream\n if (autoPlay) video.play().catch(() => undefined);\n };\n\n if (video.canPlayType(HLS_MIME) !== '') {\n video.src = src;\n video.addEventListener('loadedmetadata', play, { once: true });\n\n return () => {\n video.removeEventListener('loadedmetadata', play);\n };\n }\n\n import('hls.js')\n .then(({ default: Hls }) => {\n if (isCancelled) return;\n\n if (!Hls.isSupported()) {\n onError?.(new Error('This browser cannot play HLS video.'));\n\n return;\n }\n\n const player = new Hls();\n let recoveries = 0;\n\n destroyPlayer = () => {\n player.destroy();\n };\n\n player.on(Hls.Events.MANIFEST_PARSED, play);\n player.on(Hls.Events.ERROR, (_event: string, data: ErrorData) => {\n if (!data.fatal) return;\n\n if (recoveries < MAX_RECOVERIES && data.type === Hls.ErrorTypes.NETWORK_ERROR) {\n recoveries += 1;\n player.startLoad();\n } else if (recoveries < MAX_RECOVERIES && data.type === Hls.ErrorTypes.MEDIA_ERROR) {\n recoveries += 1;\n player.recoverMediaError();\n } else {\n player.destroy();\n destroyPlayer = undefined;\n onError?.(data);\n }\n });\n player.loadSource(src);\n player.attachMedia(video);\n })\n .catch((error: unknown) => {\n if (!isCancelled) onError?.(error);\n });\n\n return () => {\n isCancelled = true;\n destroyPlayer?.();\n };\n};\n","import { type Ref, useEffect, useMemo, useRef, useState, type VideoHTMLAttributes } from 'react';\n\nimport { mergeRefs } from '../lib/mergeRefs.js';\nimport type { IClassName } from '../types/component.js';\nimport { captureVideoPoster } from './captureVideoPoster.js';\nimport { attachStream, isHlsSource } from './streaming.js';\n\n// A grey picture with a play triangle, for when a video has no poster (yet).\nconst PLACEHOLDER = `data:image/svg+xml,${encodeURIComponent(\n '<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 16 9\"><rect width=\"16\" height=\"9\" fill=\"#9ca3af\"/><path d=\"M6.5 3v3l3-1.5z\" fill=\"#fff\"/></svg>',\n)}`;\n\nexport interface IVideoPlayer extends IClassName {\n /**\n * The attributes of the `<video>`, `src` included. Unless told otherwise the video plays by itself,\n * muted and without controls, does not loop, and plays inline on a phone.\n * The `className` here is the video's; the one of the player is on its box.\n */\n videoProps: VideoHTMLAttributes<HTMLVideoElement>;\n /** The `<video>` itself (not set while only the poster is shown). */\n ref?: Ref<HTMLVideoElement>;\n /** Show the picture of the video instead of playing it, e.g. for a thumbnail. */\n showPosterOnly?: boolean;\n /**\n * Makes the picture for a video that has no `poster`, when only the poster is shown. Give it to\n * ask a service (an image of the first second that a CDN makes); it can answer at once or later.\n * Without it a frame of the file is taken in the browser (`captureVideoPoster`), which does not\n * work for a stream (`.m3u8`).\n */\n getPoster?: (\n src: string,\n signal: AbortSignal,\n ) => Promise<string | undefined> | string | undefined;\n /** The picture shown until a poster is there, or when there can be none. */\n placeholder?: string;\n /** The alternative text of the poster. It is empty because it is usually a thumbnail inside a button that has its own name. @default '' */\n posterAlt?: string;\n /** Called when a stream (`.m3u8`) cannot be played. */\n onStreamError?: (error: unknown) => void;\n}\n\nconst defaultGetPoster = (src: string, signal: AbortSignal) =>\n isHlsSource(src) ? undefined : captureVideoPoster(src, { signal });\n\n/**\n * A video, with what an app needs around the plain `<video>`: it plays an HLS stream (`.m3u8`)\n * in the browsers that cannot do it themselves (`hls.js` is loaded then, and only then; install it\n * if you play streams), and it can show only the poster of a video, made from the file when none\n * is given.\n *\n * The video is taken out and put in again when its `src` changes.\n */\nexport const VideoPlayer = ({\n className = '',\n videoProps,\n ref,\n showPosterOnly = false,\n getPoster,\n placeholder = PLACEHOLDER,\n posterAlt = '',\n onStreamError,\n}: IVideoPlayer) => {\n const { src, poster: givenPoster, autoPlay = true } = videoProps;\n const videoRef = useRef<HTMLVideoElement | null>(null);\n const getPosterRef = useRef(getPoster);\n const onStreamErrorRef = useRef(onStreamError);\n const [made, setMade] = useState<{ src: string; poster: string } | null>(null);\n\n // The newest functions are used by the work below without starting it again.\n useEffect(() => {\n getPosterRef.current = getPoster;\n onStreamErrorRef.current = onStreamError;\n });\n\n const mergedRef = useMemo(() => mergeRefs<HTMLVideoElement>(videoRef, ref), [ref]);\n const needsPoster = showPosterOnly && !!src && !givenPoster;\n const isHls = !!src && isHlsSource(src);\n\n useEffect(() => {\n if (!needsPoster || !src) return;\n\n const controller = new AbortController();\n\n Promise.resolve((getPosterRef.current ?? defaultGetPoster)(src, controller.signal))\n .then((poster) => {\n if (poster && !controller.signal.aborted) setMade({ src, poster });\n })\n .catch(() => undefined);\n\n return () => {\n controller.abort();\n };\n }, [needsPoster, src]);\n\n useEffect(() => {\n const video = videoRef.current;\n\n if (showPosterOnly || !isHls || !video || !src) return;\n\n return attachStream(video, src, {\n autoPlay,\n onError: (error) => {\n onStreamErrorRef.current?.(error);\n },\n });\n }, [showPosterOnly, isHls, src, autoPlay]);\n\n const poster = givenPoster ?? (made !== null && made.src === src ? made.poster : undefined);\n const mediaClassName = `aspect-auto h-full w-full object-cover ${videoProps.className ?? ''}`;\n\n return (\n <div className={`h-full w-full ${className}`}>\n {showPosterOnly ? (\n <img src={poster ?? placeholder} alt={posterAlt} className={mediaClassName} />\n ) : (\n <video\n key={src}\n ref={mergedRef}\n {...videoProps}\n // a stream is given to the video by `attachStream`: the plain attribute would make a\n // browser that cannot play it fail before the player starts\n src={isHls ? undefined : src}\n playsInline={videoProps.playsInline ?? true}\n autoPlay={autoPlay}\n muted={videoProps.muted ?? true}\n loop={videoProps.loop ?? false}\n controls={videoProps.controls ?? false}\n className={mediaClassName}\n />\n )}\n </div>\n );\n};\n","import { Icon } from '@iconify/react';\nimport { useEffect, useRef } from 'react';\n\nimport { type IScrollableGradientContainer, ScrollableGradientContainer } from '../layout/index.js';\nimport type { IClassName } from '../types/component.js';\nimport { type IMediaLabels, resolveLabels, type TMediaOption } from './labels.js';\nimport { registerMediaIcons } from './media-icons.js';\nimport { type IVideoPlayer, VideoPlayer } from './VideoPlayer.js';\n\n/** What the media components give on to the video players they draw. */\nexport type TPlayerProps = Pick<IVideoPlayer, 'getPoster' | 'onStreamError' | 'placeholder'>;\n\nexport interface IMediaCarousel\n extends IClassName, Pick<IScrollableGradientContainer, 'gradientClassNames'> {\n media: readonly TMediaOption[];\n /** The thumbnail that is marked as the current one, and scrolled into view. */\n selected?: number | null;\n onClick: (index: number) => void;\n /** Adds a button on each thumbnail that calls this with its index. */\n handleRemove?: (index: number) => void;\n /**\n * Marks the thumbnails that have a problem (a red border), by place: `[false, true]` marks the\n * second one.\n */\n invalid?: readonly (boolean | undefined)[];\n /** The class of the row of thumbnails (the space around them). @default 'p-2' */\n listClassName?: string;\n labels?: Partial<IMediaLabels>;\n playerProps?: TPlayerProps;\n}\n\n// The same address twice is allowed: the second one is `url#1`. A key made of the position would\n// make every thumbnail after a removed one start again.\nconst keysOf = (media: readonly TMediaOption[]) => {\n const seen = new Map<string, number>();\n\n return media.map(({ url }) => {\n const count = seen.get(url) ?? 0;\n\n seen.set(url, count + 1);\n\n return `${url}#${String(count)}`;\n });\n};\n\n/**\n * A row of thumbnails of pictures and videos to choose from. Each thumbnail is a button (named\n * \"Show image 2 of 5\") and the current one is marked with `aria-current`. When the current one\n * changes the row scrolls to bring it to the middle. A video shows its poster with a play mark.\n */\nexport const MediaCarousel = ({\n className = '',\n media,\n selected,\n onClick,\n handleRemove,\n gradientClassNames,\n invalid,\n listClassName = 'p-2',\n labels,\n playerProps,\n}: IMediaCarousel) => {\n registerMediaIcons();\n\n const text = resolveLabels(labels);\n const scrollerRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const scroller = scrollerRef.current;\n\n if (!scroller || selected === null || selected === undefined) return;\n\n const thumbnail = scroller.querySelector<HTMLElement>(\n `[data-media-index=\"${String(selected)}\"]`,\n );\n\n if (!thumbnail) return;\n\n // Only the row is moved (not the page, as `scrollIntoView` would do), and the row's own\n // `scroll-behavior` decides if it is smooth.\n scroller.scrollLeft = thumbnail.offsetLeft - (scroller.clientWidth - thumbnail.offsetWidth) / 2;\n }, [selected]);\n\n if (media.length === 0) return null;\n\n const keys = keysOf(media);\n\n return (\n <ScrollableGradientContainer\n direction=\"horizontal\"\n label={text.thumbnails}\n scrollerRef={scrollerRef}\n className={`w-full [&>div]:justify-start ${className}`}\n gradientClassNames={gradientClassNames}\n >\n <ul className={`media-carousel flex items-center gap-2 ${listClassName}`}>\n {media.map((item, index) => {\n const isSelected = index === selected;\n\n return (\n <li\n key={keys[index]}\n data-media-index={index}\n data-invalid={invalid?.at(index) ? '' : undefined}\n className={`relative size-14 shrink-0 overflow-hidden rounded-md border shadow-xs transition-colors duration-300 hover:opacity-100 md:size-16 lg:size-20 data-invalid:border-red-c! ${\n isSelected ? 'border-tertiary opacity-100' : 'border-primary/30 opacity-90'\n }`}\n >\n <button\n type=\"button\"\n aria-label={text.select(item, index, media.length)}\n aria-current={isSelected ? 'true' : undefined}\n onClick={() => {\n onClick(index);\n }}\n className=\"group relative block size-full cursor-pointer focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-blue-crayola-c\"\n >\n {item.type === 'video' ? (\n <>\n {!isSelected && (\n <span\n aria-hidden=\"true\"\n className=\"pointer-events-none absolute inset-0 z-1 grid place-items-center bg-black/50\"\n >\n <Icon\n icon=\"solar:play-linear\"\n className=\"text-white opacity-90 group-hover:opacity-100\"\n />\n </span>\n )}\n <VideoPlayer\n showPosterOnly\n videoProps={{ src: item.url, autoPlay: false }}\n className=\"aspect-square\"\n {...playerProps}\n />\n </>\n ) : (\n <img\n src={item.url}\n alt=\"\"\n draggable={false}\n loading=\"lazy\"\n className=\"aspect-square size-full object-cover\"\n />\n )}\n </button>\n\n {handleRemove && (\n <button\n type=\"button\"\n aria-label={text.remove(item, index)}\n className=\"group absolute top-0 right-0 z-2 grid size-6 cursor-pointer place-items-center focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-blue-crayola-c\"\n onClick={() => {\n handleRemove(index);\n }}\n >\n <span className=\"bg-tertiary/80 group-hover:bg-tertiary grid size-4 place-items-center rounded-full\">\n <Icon icon=\"lucide:x\" className=\"text-primary-invert size-full shrink-0\" />\n </span>\n </button>\n )}\n </li>\n );\n })}\n </ul>\n </ScrollableGradientContainer>\n );\n};\n","import { Icon } from '@iconify/react';\nimport { type KeyboardEvent, useState, type VideoHTMLAttributes } from 'react';\n\nimport type { IClassName } from '../types/component.js';\nimport { Divider } from '../ui/index.js';\nimport { type IMediaLabels, resolveLabels, type TMediaOption } from './labels.js';\nimport { MediaCarousel, type TPlayerProps } from './MediaCarousel.js';\nimport { registerMediaIcons } from './media-icons.js';\nimport { VideoPlayer } from './VideoPlayer.js';\n\nexport interface IMediaCarouselWithParent extends IClassName {\n media: readonly TMediaOption[];\n /**\n * The item to show. It is only the first one: the carousel goes on by itself when the person\n * chooses another, and follows this again whenever it changes.\n */\n selected?: number | null;\n /** Previous and next buttons with a counter, when there is more than one item. @default true */\n needButtonControls?: boolean;\n /** The attributes of the video when the item shown is one (`src` is the item's). */\n videoProps?: VideoHTMLAttributes<HTMLVideoElement>;\n /** Adds a button on each thumbnail that calls this with its index. */\n handleRemove?: (index: number) => void;\n labels?: Partial<IMediaLabels>;\n playerProps?: TPlayerProps;\n}\n\nconst ChevronButton = ({\n onClick,\n label,\n className = '',\n}: { onClick: () => void; label: string } & IClassName) => (\n <button\n type=\"button\"\n aria-label={label}\n onClick={onClick}\n className={`border-primary/50 bg-primary-invert/50 cursor-pointer rounded-md border p-1.25 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c ${className}`}\n >\n <Icon icon=\"solar:alt-arrow-left-linear\" className=\"text-primary\" />\n </button>\n);\n\n// The keys that would do something else in these (a video with controls seeks with the arrows).\nconst isTypingTarget = (target: EventTarget) =>\n target instanceof HTMLVideoElement ||\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLElement && target.isContentEditable);\n\n/**\n * The picture (or video) that is chosen, big, with the thumbnails of all of them under it. The\n * previous and next buttons go round (after the last one comes the first). With the focus anywhere in\n * it the left and right arrow keys do the same, and the counter between the buttons is read out\n * when it changes.\n *\n * A removed item that was the last one moves the carousel to the new last one.\n */\nexport const MediaCarouselWithParentMedia = ({\n className = '',\n media,\n selected,\n needButtonControls = true,\n videoProps,\n handleRemove,\n labels,\n playerProps,\n}: IMediaCarouselWithParent) => {\n registerMediaIcons();\n\n const text = resolveLabels(labels);\n const [current, setCurrent] = useState(selected ?? 0);\n const [previousSelected, setPreviousSelected] = useState(selected);\n\n // The parent chose another item: follow it (set while rendering, so there is no frame with the old one).\n if (selected !== previousSelected) {\n setPreviousSelected(selected);\n\n if (selected !== null && selected !== undefined) setCurrent(selected);\n }\n\n const count = media.length;\n const index = Math.min(current, count - 1);\n const item = media.at(index);\n\n if (!item) return null;\n\n const hasControls = needButtonControls && count > 1;\n const go = (step: 1 | -1) => {\n // from the state as it is now, not from the one of the render: two presses in a row both count\n setCurrent((value) => (Math.min(value, count - 1) + step + count) % count);\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!hasControls || event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) return;\n if (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight') return;\n if (isTypingTarget(event.target)) return;\n\n event.preventDefault();\n go(event.key === 'ArrowLeft' ? -1 : 1);\n };\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"carousel\"\n aria-label={text.gallery}\n onKeyDown={handleKeyDown}\n className={`bg-primary-invert flex w-full flex-col gap-4 overflow-hidden rounded-lg ${className}`}\n >\n <div className=\"relative flex h-100 items-center justify-center lg:h-105 xl:h-125\">\n <div className=\"flex h-full w-full items-center justify-center rounded-lg\">\n {item.type === 'video' ? (\n <VideoPlayer\n key={item.url}\n videoProps={{\n 'aria-label': text.preview(item, index, count),\n ...videoProps,\n src: item.url,\n }}\n className=\"mx-auto flex max-h-full items-center justify-center\"\n {...playerProps}\n />\n ) : (\n <img\n src={item.url}\n alt={text.preview(item, index, count)}\n className=\"mx-auto h-full max-h-full w-full object-contain\"\n />\n )}\n </div>\n\n {hasControls && (\n <div className=\"absolute bottom-0 flex w-full items-center justify-center gap-5 py-2 text-center text-sm\">\n <ChevronButton\n label={text.previous}\n onClick={() => {\n go(-1);\n }}\n />\n <span\n aria-live=\"polite\"\n aria-atomic=\"true\"\n className=\"border-primary/50 bg-primary-invert/50 text-primary min-h-full w-24 content-center rounded-md border px-4 py-2 leading-none\"\n >\n {text.counter(index, count)}\n </span>\n <ChevronButton\n label={text.next}\n onClick={() => {\n go(1);\n }}\n className=\"[&>svg]:rotate-180\"\n />\n </div>\n )}\n </div>\n\n {count > 1 && (\n <>\n <Divider />\n <MediaCarousel\n media={media}\n selected={index}\n onClick={setCurrent}\n handleRemove={handleRemove}\n labels={labels}\n playerProps={playerProps}\n />\n </>\n )}\n </div>\n );\n};\n","import type { VideoHTMLAttributes } from 'react';\n\nimport { ModalWrapper } from '../layout/index.js';\nimport type { IClassName } from '../types/component.js';\nimport { type IMediaLabels, resolveLabels, type TMediaOption } from './labels.js';\nimport { MediaCarouselWithParentMedia } from './MediaCarouselWithParentMedia.js';\nimport type { TPlayerProps } from './MediaCarousel.js';\n\nexport interface IMediaModal extends IClassName {\n media: readonly TMediaOption[];\n isOpen: boolean;\n onClose: () => void;\n /** The item that is shown first. */\n selected?: number | null;\n /**\n * The attributes of the video. In the dialog a video plays by itself, muted, in a loop and with\n * controls (to unmute it, stop it and move in it), unless told otherwise.\n */\n videoProps?: VideoHTMLAttributes<HTMLVideoElement>;\n /** Adds a button on each thumbnail that calls this with its index. */\n handleRemove?: (index: number) => void;\n labels?: Partial<IMediaLabels>;\n playerProps?: TPlayerProps;\n}\n\n/**\n * The pictures and videos of a gallery in a dialog (`ModalWrapper`: Escape and the close button close\n * it, the focus is kept inside and goes back). Without any media it shows nothing. The `className`\n * is the one of the backdrop.\n */\nexport const MediaModal = ({\n media,\n isOpen,\n onClose,\n selected,\n className = '',\n videoProps,\n handleRemove,\n labels,\n playerProps,\n}: IMediaModal) => {\n const text = resolveLabels(labels);\n\n return (\n <ModalWrapper\n className=\"max-w-xl\"\n isOpen={isOpen && media.length > 0}\n onClose={onClose}\n containerProps={{ className }}\n header={{ showCloseIcon: true }}\n closeLabel={text.close}\n label={text.gallery}\n >\n <MediaCarouselWithParentMedia\n media={media}\n selected={selected}\n handleRemove={handleRemove}\n labels={labels}\n playerProps={playerProps}\n videoProps={{\n ...videoProps,\n autoPlay: videoProps?.autoPlay ?? true,\n muted: videoProps?.muted ?? true,\n loop: videoProps?.loop ?? true,\n controls: videoProps?.controls ?? true,\n className: `object-contain! bg-primary/10 backdrop-blur-xs rounded-lg ${videoProps?.className ?? ''}`,\n }}\n />\n </ModalWrapper>\n );\n};\n","import { useState, type VideoHTMLAttributes } from 'react';\n\nimport type { IClassName } from '../types/component.js';\nimport type { IMediaLabels, TMediaOption } from './labels.js';\nimport { type IMediaCarousel, MediaCarousel, type TPlayerProps } from './MediaCarousel.js';\nimport { MediaModal } from './MediaModal.js';\n\nexport interface IMediaCarouselWithModal\n extends IClassName, Pick<IMediaCarousel, 'gradientClassNames'> {\n media: readonly TMediaOption[];\n /** The attributes of the videos in the dialog (see `MediaModal`). */\n videoProps?: VideoHTMLAttributes<HTMLVideoElement>;\n labels?: Partial<IMediaLabels>;\n playerProps?: TPlayerProps;\n}\n\n/**\n * A row of thumbnails; choosing one opens it in a dialog (`MediaModal`) where the others can be\n * browsed. The dialog closes by itself when the item it was opened on is no longer there.\n */\nexport const MediaCarouselWithModal = ({\n media,\n videoProps,\n className = '',\n gradientClassNames,\n labels,\n playerProps,\n}: IMediaCarouselWithModal) => {\n const [openIndex, setOpenIndex] = useState<number | null>(null);\n\n // Closed while rendering when its item is gone (the list got shorter), so it cannot come back by\n // itself when the list grows again.\n if (openIndex !== null && openIndex >= media.length) setOpenIndex(null);\n\n if (media.length === 0) return null;\n\n return (\n <div className={`max-w-full min-w-0 overflow-hidden rounded-md ${className}`}>\n <MediaCarousel\n media={media}\n selected={openIndex}\n onClick={setOpenIndex}\n gradientClassNames={gradientClassNames}\n listClassName=\"p-0\"\n labels={labels}\n playerProps={playerProps}\n />\n\n <MediaModal\n media={media}\n selected={openIndex}\n isOpen={openIndex !== null}\n onClose={() => {\n setOpenIndex(null);\n }}\n videoProps={videoProps}\n labels={labels}\n playerProps={playerProps}\n />\n </div>\n );\n};\n"]}
@@ -0,0 +1,33 @@
1
+ export type TMediaResource = 'image' | 'video';
2
+ /** One picture or video of a gallery. */
3
+ export interface TMediaOption {
4
+ type: TMediaResource;
5
+ url: string;
6
+ }
7
+ /**
8
+ * The words the media components say to assistive technology (and in the counter). They are English
9
+ * by default; give the ones you change in the `labels` prop of any of the components.
10
+ */
11
+ export interface IMediaLabels {
12
+ /** The name of the whole gallery (and of the dialog that shows it). */
13
+ gallery: string;
14
+ /** The name of the row of thumbnails, once it scrolls. */
15
+ thumbnails: string;
16
+ /** What a thumbnail button says it does. */
17
+ select: (item: TMediaOption, index: number, total: number) => string;
18
+ /** The alternative text of the picture (the name of the video) that is shown big. */
19
+ preview: (item: TMediaOption, index: number, total: number) => string;
20
+ /** What the button that removes an item says. */
21
+ remove: (item: TMediaOption, index: number) => string;
22
+ previous: string;
23
+ next: string;
24
+ /** The close button of the dialog. */
25
+ close: string;
26
+ /** The "2 of 5" between the arrows, read out when it changes. */
27
+ counter: (index: number, total: number) => string;
28
+ }
29
+ /** The words used when the app gives none. */
30
+ export declare const MEDIA_LABELS: IMediaLabels;
31
+ /** The labels the app gave, with the default for each it left out. */
32
+ export declare const resolveLabels: (labels?: Partial<IMediaLabels>) => IMediaLabels;
33
+ //# sourceMappingURL=labels.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.cts","sourceRoot":"","sources":["../../src/media/labels.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/C,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrE,qFAAqF;IACrF,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtE,iDAAiD;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAMD,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,YAU1B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,CAAC,YAAY,CAAC,KAAG,YAU7D,CAAC"}
@@ -0,0 +1,33 @@
1
+ export type TMediaResource = 'image' | 'video';
2
+ /** One picture or video of a gallery. */
3
+ export interface TMediaOption {
4
+ type: TMediaResource;
5
+ url: string;
6
+ }
7
+ /**
8
+ * The words the media components say to assistive technology (and in the counter). They are English
9
+ * by default; give the ones you change in the `labels` prop of any of the components.
10
+ */
11
+ export interface IMediaLabels {
12
+ /** The name of the whole gallery (and of the dialog that shows it). */
13
+ gallery: string;
14
+ /** The name of the row of thumbnails, once it scrolls. */
15
+ thumbnails: string;
16
+ /** What a thumbnail button says it does. */
17
+ select: (item: TMediaOption, index: number, total: number) => string;
18
+ /** The alternative text of the picture (the name of the video) that is shown big. */
19
+ preview: (item: TMediaOption, index: number, total: number) => string;
20
+ /** What the button that removes an item says. */
21
+ remove: (item: TMediaOption, index: number) => string;
22
+ previous: string;
23
+ next: string;
24
+ /** The close button of the dialog. */
25
+ close: string;
26
+ /** The "2 of 5" between the arrows, read out when it changes. */
27
+ counter: (index: number, total: number) => string;
28
+ }
29
+ /** The words used when the app gives none. */
30
+ export declare const MEDIA_LABELS: IMediaLabels;
31
+ /** The labels the app gave, with the default for each it left out. */
32
+ export declare const resolveLabels: (labels?: Partial<IMediaLabels>) => IMediaLabels;
33
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/media/labels.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/C,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACrE,qFAAqF;IACrF,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtE,iDAAiD;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACtD,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACnD;AAMD,8CAA8C;AAC9C,eAAO,MAAM,YAAY,EAAE,YAU1B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,CAAC,YAAY,CAAC,KAAG,YAU7D,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Registers the icons above with Iconify; the components of this entry call it when they render
3
+ * (calling it again is harmless).
4
+ */
5
+ export declare const registerMediaIcons: () => void, MEDIA_ICON_NAMES: string[];
6
+ //# sourceMappingURL=media-icons.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-icons.d.cts","sourceRoot":"","sources":["../../src/media/media-icons.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,eAAO,MAAkB,kBAAkB,cAAS,gBAAgB,UACrC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Registers the icons above with Iconify; the components of this entry call it when they render
3
+ * (calling it again is harmless).
4
+ */
5
+ export declare const registerMediaIcons: () => void, MEDIA_ICON_NAMES: string[];
6
+ //# sourceMappingURL=media-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-icons.d.ts","sourceRoot":"","sources":["../../src/media/media-icons.ts"],"names":[],"mappings":"AAmCA;;;GAGG;AACH,eAAO,MAAkB,kBAAkB,cAAS,gBAAgB,UACrC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** Whether `src` is an HLS playlist (`.m3u8`, also with a query string such as a signed URL). */
2
+ export declare const isHlsSource: (src: string) => boolean;
3
+ export interface IStreamOptions {
4
+ /** Start playing as soon as the stream is ready. */
5
+ autoPlay: boolean;
6
+ /** Called when the stream cannot be played: the browser cannot do it, `hls.js` could not be loaded, or a fatal error. */
7
+ onError?: (error: unknown) => void;
8
+ }
9
+ /**
10
+ * Makes `video` play the HLS playlist `src`, and returns the function that stops it.
11
+ *
12
+ * A browser that plays HLS itself (Safari, iOS) is given the playlist as the `src` of the video.
13
+ * For the others `hls.js` is loaded at this moment (`import()`): a page that never plays a stream
14
+ * does not download it, and an app that never uses a stream does not need to have it installed.
15
+ * Errors are not logged: they go to `onError`.
16
+ */
17
+ export declare const attachStream: (video: HTMLVideoElement, src: string, { autoPlay, onError }: IStreamOptions) => () => void;
18
+ //# sourceMappingURL=streaming.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.cts","sourceRoot":"","sources":["../../src/media/streaming.ts"],"names":[],"mappings":"AASA,iGAAiG;AACjG,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,YAAkC,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,yHAAyH;IACzH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,gBAAgB,EACvB,KAAK,MAAM,EACX,uBAAuB,cAAc,eA+DtC,CAAC"}
@@ -0,0 +1,18 @@
1
+ /** Whether `src` is an HLS playlist (`.m3u8`, also with a query string such as a signed URL). */
2
+ export declare const isHlsSource: (src: string) => boolean;
3
+ export interface IStreamOptions {
4
+ /** Start playing as soon as the stream is ready. */
5
+ autoPlay: boolean;
6
+ /** Called when the stream cannot be played: the browser cannot do it, `hls.js` could not be loaded, or a fatal error. */
7
+ onError?: (error: unknown) => void;
8
+ }
9
+ /**
10
+ * Makes `video` play the HLS playlist `src`, and returns the function that stops it.
11
+ *
12
+ * A browser that plays HLS itself (Safari, iOS) is given the playlist as the `src` of the video.
13
+ * For the others `hls.js` is loaded at this moment (`import()`): a page that never plays a stream
14
+ * does not download it, and an app that never uses a stream does not need to have it installed.
15
+ * Errors are not logged: they go to `onError`.
16
+ */
17
+ export declare const attachStream: (video: HTMLVideoElement, src: string, { autoPlay, onError }: IStreamOptions) => () => void;
18
+ //# sourceMappingURL=streaming.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/media/streaming.ts"],"names":[],"mappings":"AASA,iGAAiG;AACjG,eAAO,MAAM,WAAW,GAAI,KAAK,MAAM,YAAkC,CAAC;AAE1E,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAClB,yHAAyH;IACzH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,gBAAgB,EACvB,KAAK,MAAM,EACX,uBAAuB,cAAc,eA+DtC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type ComponentProps } from 'react';
2
+ export interface IResend extends Omit<ComponentProps<'p'>, 'children'> {
3
+ /** What is said before the countdown or the button, e.g. `"Didn't get the code?"`. */
4
+ label: string;
5
+ /**
6
+ * How many seconds to wait before it can be asked again. The wait starts when the component is
7
+ * shown (the thing was just sent) and again after each resend, with the `count` of that moment, so
8
+ * an app can stop making people wait after a few tries by passing 0. A change of `count` in the
9
+ * middle of a wait does not change that wait; to start over (a new email address), give the
10
+ * component a new `key`.
11
+ */
12
+ count: number;
13
+ /**
14
+ * Asks again. When it returns a promise, the button waits for it (it cannot be pressed twice, and
15
+ * says it is sending) and the wait starts when it resolves; if it rejects there is no wait, the
16
+ * button can be pressed again and the error is reported to the window like any uncaught error.
17
+ * Handle the errors you can recover from (a toast) inside it.
18
+ */
19
+ onResend: () => unknown;
20
+ /** @default 'Resend' */
21
+ resendLabel?: string;
22
+ /** What comes before the seconds while waiting. @default 'Resend in' */
23
+ countdownLabel?: string;
24
+ /** The button while `onResend` is waiting for its promise. @default 'Sending…' */
25
+ sendingLabel?: string;
26
+ /** Read out by assistive technology when the wait ends. @default 'You can resend now' */
27
+ readyLabel?: string;
28
+ /** How the seconds are written. @default (seconds) => `${seconds}s` */
29
+ formatSeconds?: (seconds: number) => string;
30
+ }
31
+ /**
32
+ * "Didn't get the code? Resend in 30s" and, once the wait is over, a button to ask again. The wait is
33
+ * measured against the clock, not counted tick by tick, so a tab that was in the background or a
34
+ * laptop that slept does not leave people waiting longer than the time that really went by.
35
+ */
36
+ export declare const Resend: ({ label, count, onResend, resendLabel, countdownLabel, sendingLabel, readyLabel, formatSeconds, className, ...pProps }: IResend) => import("react").JSX.Element;
37
+ //# sourceMappingURL=Resend.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resend.d.cts","sourceRoot":"","sources":["../../src/resend/Resend.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+B,MAAM,OAAO,CAAC;AAKzE,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IACpE,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAUD;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,wHAWpB,OAAO,gCAmHT,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type ComponentProps } from 'react';
2
+ export interface IResend extends Omit<ComponentProps<'p'>, 'children'> {
3
+ /** What is said before the countdown or the button, e.g. `"Didn't get the code?"`. */
4
+ label: string;
5
+ /**
6
+ * How many seconds to wait before it can be asked again. The wait starts when the component is
7
+ * shown (the thing was just sent) and again after each resend, with the `count` of that moment, so
8
+ * an app can stop making people wait after a few tries by passing 0. A change of `count` in the
9
+ * middle of a wait does not change that wait; to start over (a new email address), give the
10
+ * component a new `key`.
11
+ */
12
+ count: number;
13
+ /**
14
+ * Asks again. When it returns a promise, the button waits for it (it cannot be pressed twice, and
15
+ * says it is sending) and the wait starts when it resolves; if it rejects there is no wait, the
16
+ * button can be pressed again and the error is reported to the window like any uncaught error.
17
+ * Handle the errors you can recover from (a toast) inside it.
18
+ */
19
+ onResend: () => unknown;
20
+ /** @default 'Resend' */
21
+ resendLabel?: string;
22
+ /** What comes before the seconds while waiting. @default 'Resend in' */
23
+ countdownLabel?: string;
24
+ /** The button while `onResend` is waiting for its promise. @default 'Sending…' */
25
+ sendingLabel?: string;
26
+ /** Read out by assistive technology when the wait ends. @default 'You can resend now' */
27
+ readyLabel?: string;
28
+ /** How the seconds are written. @default (seconds) => `${seconds}s` */
29
+ formatSeconds?: (seconds: number) => string;
30
+ }
31
+ /**
32
+ * "Didn't get the code? Resend in 30s" and, once the wait is over, a button to ask again. The wait is
33
+ * measured against the clock, not counted tick by tick, so a tab that was in the background or a
34
+ * laptop that slept does not leave people waiting longer than the time that really went by.
35
+ */
36
+ export declare const Resend: ({ label, count, onResend, resendLabel, countdownLabel, sendingLabel, readyLabel, formatSeconds, className, ...pProps }: IResend) => import("react").JSX.Element;
37
+ //# sourceMappingURL=Resend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Resend.d.ts","sourceRoot":"","sources":["../../src/resend/Resend.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAA+B,MAAM,OAAO,CAAC;AAKzE,MAAM,WAAW,OAAQ,SAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,UAAU,CAAC;IACpE,sFAAsF;IACtF,KAAK,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,wBAAwB;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yFAAyF;IACzF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uEAAuE;IACvE,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C;AAUD;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,wHAWpB,OAAO,gCAmHT,CAAC"}
@@ -0,0 +1,115 @@
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var ui = require('@beautinique/frontend-components/ui');
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+
7
+ var __defProp = Object.defineProperty;
8
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
9
+
10
+ // src/lib/countdown.ts
11
+ var toSeconds = /* @__PURE__ */ __name((seconds) => Number.isFinite(seconds) ? Math.max(Math.ceil(seconds), 0) : 0, "toSeconds");
12
+ var getSecondsLeft = /* @__PURE__ */ __name((endsAt, now) => Math.max(Math.ceil((endsAt - now) / 1e3), 0), "getSecondsLeft");
13
+ var isPromiseLike = /* @__PURE__ */ __name((value) => typeof value === "object" && value !== null && "then" in value && typeof value.then === "function", "isPromiseLike");
14
+ var defaultFormatSeconds = /* @__PURE__ */ __name((seconds) => `${String(seconds)}s`, "defaultFormatSeconds");
15
+ var BUTTON_CSS = "cursor-pointer rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c disabled:cursor-wait disabled:opacity-60";
16
+ var Resend = /* @__PURE__ */ __name(({
17
+ label,
18
+ count,
19
+ onResend,
20
+ resendLabel = "Resend",
21
+ countdownLabel = "Resend in",
22
+ sendingLabel = "Sending\u2026",
23
+ readyLabel = "You can resend now",
24
+ formatSeconds = defaultFormatSeconds,
25
+ className = "",
26
+ ...pProps
27
+ }) => {
28
+ const [wait, setWait] = react.useState(() => ({ seconds: toSeconds(count) }));
29
+ const [secondsLeft, setSecondsLeft] = react.useState(wait.seconds);
30
+ const [isReady, setIsReady] = react.useState(false);
31
+ const [isSending, setIsSending] = react.useState(false);
32
+ const isSendingRef = react.useRef(false);
33
+ const countRef = react.useRef(count);
34
+ react.useEffect(() => {
35
+ countRef.current = count;
36
+ }, [count]);
37
+ react.useEffect(() => {
38
+ if (wait.seconds <= 0) return;
39
+ const endsAt = Date.now() + wait.seconds * 1e3;
40
+ let shown = wait.seconds;
41
+ const update = /* @__PURE__ */ __name(() => {
42
+ const left = getSecondsLeft(endsAt, Date.now());
43
+ if (left !== shown) {
44
+ shown = left;
45
+ setSecondsLeft(left);
46
+ }
47
+ if (left > 0) return;
48
+ window.clearInterval(timer);
49
+ setIsReady(true);
50
+ }, "update");
51
+ const timer = window.setInterval(update, 250);
52
+ document.addEventListener("visibilitychange", update);
53
+ return () => {
54
+ window.clearInterval(timer);
55
+ document.removeEventListener("visibilitychange", update);
56
+ };
57
+ }, [wait]);
58
+ const startWait = /* @__PURE__ */ __name(() => {
59
+ const seconds = toSeconds(countRef.current);
60
+ setIsReady(false);
61
+ setSecondsLeft(seconds);
62
+ setWait({ seconds });
63
+ }, "startWait");
64
+ const resend = /* @__PURE__ */ __name(async () => {
65
+ if (isSendingRef.current) return;
66
+ const result = onResend();
67
+ if (!isPromiseLike(result)) {
68
+ startWait();
69
+ return;
70
+ }
71
+ isSendingRef.current = true;
72
+ setIsSending(true);
73
+ try {
74
+ await result;
75
+ startWait();
76
+ } finally {
77
+ isSendingRef.current = false;
78
+ setIsSending(false);
79
+ }
80
+ }, "resend");
81
+ return /* @__PURE__ */ jsxRuntime.jsxs("p", { ...pProps, className: `space-x-2 ${className}`, children: [
82
+ /* @__PURE__ */ jsxRuntime.jsx(ui.GradientText, { text: label, type: "silver", className: "text-xs sm:text-sm" }),
83
+ secondsLeft > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("span", { role: "timer", className: "text-muted text-xs sm:text-sm", children: [
84
+ /* @__PURE__ */ jsxRuntime.jsx(ui.GradientText, { text: countdownLabel, type: "silver" }),
85
+ " ",
86
+ /* @__PURE__ */ jsxRuntime.jsx(ui.GradientText, { text: formatSeconds(secondsLeft), type: "accent", className: "font-semibold" })
87
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx(
88
+ "button",
89
+ {
90
+ type: "button",
91
+ disabled: isSending,
92
+ "aria-busy": isSending || void 0,
93
+ onClick: () => {
94
+ resend().catch((error) => {
95
+ reportError(error);
96
+ });
97
+ },
98
+ className: BUTTON_CSS,
99
+ children: /* @__PURE__ */ jsxRuntime.jsx(
100
+ ui.GradientText,
101
+ {
102
+ type: "accent",
103
+ text: isSending ? sendingLabel : resendLabel,
104
+ className: "text-xs font-semibold sm:text-sm"
105
+ }
106
+ )
107
+ }
108
+ ),
109
+ /* @__PURE__ */ jsxRuntime.jsx("span", { role: "status", className: "sr-only", children: isReady ? readyLabel : "" })
110
+ ] });
111
+ }, "Resend");
112
+
113
+ exports.Resend = Resend;
114
+ //# sourceMappingURL=index.cjs.map
115
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/countdown.ts","../../src/resend/Resend.tsx"],"names":["useState","useRef","useEffect","jsx","GradientText","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * A number of seconds to wait as a whole number that is never negative. A value that is not a number\n * of seconds (`NaN`, `Infinity`, a negative one) is no wait at all: a countdown that cannot end would\n * lock the button for good.\n */\nexport const toSeconds = (seconds: number) =>\n Number.isFinite(seconds) ? Math.max(Math.ceil(seconds), 0) : 0;\n\n/**\n * The whole seconds left until `endsAt` (a time in ms, as `Date.now()` gives), counted up: 0.2 s left\n * is shown as 1, so the countdown shows 0 only once it is over.\n */\nexport const getSecondsLeft = (endsAt: number, now: number) =>\n Math.max(Math.ceil((endsAt - now) / 1000), 0);\n\nexport const isPromiseLike = (value: unknown): value is PromiseLike<unknown> =>\n typeof value === 'object' &&\n value !== null &&\n 'then' in value &&\n typeof value.then === 'function';\n","import { type ComponentProps, useEffect, useRef, useState } from 'react';\n\nimport { getSecondsLeft, isPromiseLike, toSeconds } from '../lib/countdown.js';\nimport { GradientText } from '../ui/index.js';\n\nexport interface IResend extends Omit<ComponentProps<'p'>, 'children'> {\n /** What is said before the countdown or the button, e.g. `\"Didn't get the code?\"`. */\n label: string;\n /**\n * How many seconds to wait before it can be asked again. The wait starts when the component is\n * shown (the thing was just sent) and again after each resend, with the `count` of that moment, so\n * an app can stop making people wait after a few tries by passing 0. A change of `count` in the\n * middle of a wait does not change that wait; to start over (a new email address), give the\n * component a new `key`.\n */\n count: number;\n /**\n * Asks again. When it returns a promise, the button waits for it (it cannot be pressed twice, and\n * says it is sending) and the wait starts when it resolves; if it rejects there is no wait, the\n * button can be pressed again and the error is reported to the window like any uncaught error.\n * Handle the errors you can recover from (a toast) inside it.\n */\n onResend: () => unknown;\n /** @default 'Resend' */\n resendLabel?: string;\n /** What comes before the seconds while waiting. @default 'Resend in' */\n countdownLabel?: string;\n /** The button while `onResend` is waiting for its promise. @default 'Sending…' */\n sendingLabel?: string;\n /** Read out by assistive technology when the wait ends. @default 'You can resend now' */\n readyLabel?: string;\n /** How the seconds are written. @default (seconds) => `${seconds}s` */\n formatSeconds?: (seconds: number) => string;\n}\n\nconst defaultFormatSeconds = (seconds: number) => `${String(seconds)}s`;\n\n// No `outline-hidden` here: in Tailwind v4 it sets `--tw-outline-style: none`, which the\n// `focus-visible:outline-2` below uses for its style, so the ring would never be drawn. A button only\n// shows the browser's own ring for the keyboard anyway (`:focus-visible`), never for a click.\nconst BUTTON_CSS =\n 'cursor-pointer rounded-sm focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c disabled:cursor-wait disabled:opacity-60';\n\n/**\n * \"Didn't get the code? Resend in 30s\" and, once the wait is over, a button to ask again. The wait is\n * measured against the clock, not counted tick by tick, so a tab that was in the background or a\n * laptop that slept does not leave people waiting longer than the time that really went by.\n */\nexport const Resend = ({\n label,\n count,\n onResend,\n resendLabel = 'Resend',\n countdownLabel = 'Resend in',\n sendingLabel = 'Sending…',\n readyLabel = 'You can resend now',\n formatSeconds = defaultFormatSeconds,\n className = '',\n ...pProps\n}: IResend) => {\n // What is rendered first is the same on the server and in the browser: the wait starts when the\n // component is on the page (the effect below), never from the time the render happened.\n const [wait, setWait] = useState(() => ({ seconds: toSeconds(count) }));\n const [secondsLeft, setSecondsLeft] = useState(wait.seconds);\n const [isReady, setIsReady] = useState(false);\n const [isSending, setIsSending] = useState(false);\n const isSendingRef = useRef(false);\n const countRef = useRef(count);\n\n useEffect(() => {\n countRef.current = count;\n }, [count]);\n\n useEffect(() => {\n if (wait.seconds <= 0) return;\n\n const endsAt = Date.now() + wait.seconds * 1000;\n let shown = wait.seconds;\n\n const update = () => {\n const left = getSecondsLeft(endsAt, Date.now());\n\n // Several ticks fall in every second; the state is only set (and React only asked to render,\n // which it sometimes does even for a value that is the same) when the second changes.\n if (left !== shown) {\n shown = left;\n setSecondsLeft(left);\n }\n if (left > 0) return;\n\n window.clearInterval(timer);\n setIsReady(true);\n };\n\n // Several times a second, not once: a tick that comes a little late still shows the right second.\n const timer = window.setInterval(update, 250);\n // A background tab runs timers rarely; come back to the right number as soon as it is seen.\n document.addEventListener('visibilitychange', update);\n\n return () => {\n window.clearInterval(timer);\n document.removeEventListener('visibilitychange', update);\n };\n }, [wait]);\n\n const startWait = () => {\n const seconds = toSeconds(countRef.current);\n\n setIsReady(false);\n setSecondsLeft(seconds);\n setWait({ seconds });\n };\n\n const resend = async () => {\n if (isSendingRef.current) return;\n\n const result = onResend();\n\n // `onResend` that does not return a promise (most) starts the wait at once, as the click.\n if (!isPromiseLike(result)) {\n startWait();\n\n return;\n }\n\n isSendingRef.current = true;\n setIsSending(true);\n\n try {\n await result;\n startWait();\n } finally {\n isSendingRef.current = false;\n setIsSending(false);\n }\n };\n\n return (\n <p {...pProps} className={`space-x-2 ${className}`}>\n <GradientText text={label} type=\"silver\" className=\"text-xs sm:text-sm\" />\n\n {secondsLeft > 0 ? (\n <span role=\"timer\" className=\"text-muted text-xs sm:text-sm\">\n <GradientText text={countdownLabel} type=\"silver\" />{' '}\n <GradientText text={formatSeconds(secondsLeft)} type=\"accent\" className=\"font-semibold\" />\n </span>\n ) : (\n <button\n type=\"button\"\n disabled={isSending}\n aria-busy={isSending || undefined}\n onClick={() => {\n // `reportError` is what the browser does for an error nobody caught: it is reported to\n // `window` (and to the error tracker of the app) instead of vanishing in a dropped promise.\n resend().catch((error: unknown) => {\n reportError(error);\n });\n }}\n className={BUTTON_CSS}\n >\n <GradientText\n type=\"accent\"\n text={isSending ? sendingLabel : resendLabel}\n className=\"text-xs font-semibold sm:text-sm\"\n />\n </button>\n )}\n\n {/* Said once, when the wait ends: a person using a screen reader cannot see the button appear. */}\n <span role=\"status\" className=\"sr-only\">\n {isReady ? readyLabel : ''}\n </span>\n </p>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { type IResend, Resend } from './Resend.js';
2
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/resend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { type IResend, Resend } from './Resend.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resend/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC"}