@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,147 @@
1
+ import { Icon, addCollection } from '@iconify/react';
2
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
+
4
+ var __defProp = Object.defineProperty;
5
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
+
7
+ // src/lib/content.ts
8
+ var hasContent = /* @__PURE__ */ __name((content) => content !== null && content !== void 0 && content !== false && content !== true && content !== "", "hasContent");
9
+
10
+ // src/lib/stepper.ts
11
+ var getCurrentStep = /* @__PURE__ */ __name((activeStep, count) => Number.isNaN(activeStep) ? 0 : Math.min(Math.max(Math.trunc(activeStep), 0), Math.max(count - 1, 0)), "getCurrentStep");
12
+ var getStepState = /* @__PURE__ */ __name((index, currentStep) => {
13
+ if (index < currentStep) return "completed";
14
+ return index === currentStep ? "active" : "upcoming";
15
+ }, "getStepState");
16
+ var STEPPER_ICON_SETS = [
17
+ {
18
+ prefix: "solar",
19
+ width: 24,
20
+ height: 24,
21
+ icons: {
22
+ "check-read-linear": {
23
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5"><path d="M4 12.9L7.14286 16.5L15 7.5"/><path d="M20 7.5625L11.4283 16.5625L11 16"/></g>'
24
+ }
25
+ }
26
+ }
27
+ ];
28
+ var registered = false;
29
+ var registerStepperIcons = /* @__PURE__ */ __name(() => {
30
+ if (registered) return;
31
+ for (const iconSet of STEPPER_ICON_SETS) addCollection(iconSet);
32
+ registered = true;
33
+ }, "registerStepperIcons");
34
+ STEPPER_ICON_SETS.flatMap(
35
+ ({ prefix, icons }) => Object.keys(icons).map((name) => `${prefix}:${name}`)
36
+ );
37
+ var ITEM_CSS = "group relative flex min-w-0 items-start gap-3 text-left md:flex-col md:items-center md:gap-3 md:px-2";
38
+ var CLICKABLE_CSS = "cursor-pointer rounded-lg focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-blue-crayola-c disabled:cursor-not-allowed disabled:opacity-50";
39
+ var CIRCLE_CSS = "relative z-1 flex size-10 shrink-0 items-center justify-center rounded-full border text-sm font-semibold transition-all duration-300 motion-reduce:transition-none md:size-11";
40
+ var CIRCLE_STATE_CSS = {
41
+ completed: "border-blue-crayola-c bg-accent-duo text-white shadow-[0_8px_24px_rgba(var(--blue-crayola-c-rgb),0.28)] forced-colors:border-[Highlight] forced-colors:bg-[Highlight] forced-colors:bg-none forced-colors:text-[HighlightText]",
42
+ active: "border-blue-crayola-c bg-primary-invert text-primary shadow-[0_0_0_5px_rgba(var(--blue-crayola-c-rgb),0.12)] forced-colors:border-[Highlight] forced-colors:border-4",
43
+ upcoming: "border-primary/20 bg-primary-invert text-primary/60 forced-colors:border-[GrayText] forced-colors:text-[GrayText]"
44
+ };
45
+ var TITLE_STATE_CSS = {
46
+ completed: "text-primary/80",
47
+ active: "text-primary",
48
+ upcoming: "text-primary/45 forced-colors:text-[GrayText]"
49
+ };
50
+ var DESCRIPTION_STATE_CSS = {
51
+ completed: "text-primary/35",
52
+ active: "text-secondary",
53
+ upcoming: "text-primary/35 forced-colors:text-[GrayText]"
54
+ };
55
+ var CONNECTOR_BASE_CSS = "absolute top-10 left-5 h-4 w-0.5 -translate-x-1/2 md:top-5 md:left-[calc(50%+1.375rem)] md:h-0.5 md:w-[calc(100%-2.75rem)] md:translate-x-0";
56
+ var Stepper = /* @__PURE__ */ __name(({
57
+ steps,
58
+ activeStep,
59
+ onStepClick,
60
+ label,
61
+ completedLabel = "Completed",
62
+ className = "",
63
+ children,
64
+ ...divProps
65
+ }) => {
66
+ registerStepperIcons();
67
+ const currentStep = getCurrentStep(activeStep, steps.length);
68
+ return /* @__PURE__ */ jsxs(
69
+ "div",
70
+ {
71
+ ...divProps,
72
+ className: `flex w-full flex-col gap-6 p-4 shadow-sm sm:p-5 lg:p-6 ${className}`,
73
+ children: [
74
+ steps.length > 0 && /* @__PURE__ */ jsx(
75
+ "ol",
76
+ {
77
+ "aria-label": label,
78
+ style: { "--steps-count": steps.length },
79
+ className: "m-0 flex list-none flex-col gap-4 p-0 md:grid md:grid-cols-[repeat(var(--steps-count),minmax(0,1fr))] md:gap-0",
80
+ children: steps.map((step, index) => {
81
+ const state = getStepState(index, currentStep);
82
+ const hasNextStep = index < steps.length - 1;
83
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
84
+ hasNextStep && /* @__PURE__ */ jsx(
85
+ "span",
86
+ {
87
+ "aria-hidden": "true",
88
+ className: `${CONNECTOR_BASE_CSS} ${state === "completed" ? "bg-accent-duo forced-colors:bg-[Highlight] forced-colors:bg-none" : "bg-primary/20 forced-colors:bg-[GrayText]"}`
89
+ }
90
+ ),
91
+ /* @__PURE__ */ jsx("span", { "aria-hidden": "true", className: `${CIRCLE_CSS} ${CIRCLE_STATE_CSS[state]}`, children: state === "completed" ? /* @__PURE__ */ jsx(Icon, { icon: "solar:check-read-linear", className: "size-5" }) : step.icon ? /* @__PURE__ */ jsx(Icon, { icon: step.icon, className: "size-5" }) : index + 1 }),
92
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-1 pt-0.5 md:items-center md:pt-0 md:text-center", children: [
93
+ /* @__PURE__ */ jsxs(
94
+ "span",
95
+ {
96
+ className: `line-clamp-1 text-sm font-semibold md:text-[13px] lg:text-sm ${TITLE_STATE_CSS[state]}`,
97
+ children: [
98
+ state === "completed" && /* @__PURE__ */ jsx("span", { className: "sr-only", children: `${completedLabel}: ` }),
99
+ step.title
100
+ ]
101
+ }
102
+ ),
103
+ hasContent(step.description) && /* @__PURE__ */ jsx(
104
+ "span",
105
+ {
106
+ className: `line-clamp-1 text-xs leading-4 md:line-clamp-2 ${DESCRIPTION_STATE_CSS[state]}`,
107
+ children: step.description
108
+ }
109
+ )
110
+ ] })
111
+ ] });
112
+ return (
113
+ // The steps are a fixed order that is never sorted or filtered, and two can have the
114
+ // same title: the place is what tells them apart.
115
+ /* @__PURE__ */ jsx(
116
+ "li",
117
+ {
118
+ "data-state": state,
119
+ "aria-current": state === "active" ? "step" : void 0,
120
+ children: onStepClick ? /* @__PURE__ */ jsx(
121
+ "button",
122
+ {
123
+ type: "button",
124
+ disabled: step.disabled,
125
+ onClick: () => {
126
+ onStepClick(index);
127
+ },
128
+ className: `${ITEM_CSS} ${CLICKABLE_CSS} w-full`,
129
+ children: content
130
+ }
131
+ ) : /* @__PURE__ */ jsx("div", { className: `${ITEM_CSS} cursor-default`, children: content })
132
+ },
133
+ index
134
+ )
135
+ );
136
+ })
137
+ }
138
+ ),
139
+ hasContent(children) && /* @__PURE__ */ jsx("div", { className: "border-primary/10 border-t pt-5", children })
140
+ ]
141
+ }
142
+ );
143
+ }, "Stepper");
144
+
145
+ export { Stepper };
146
+ //# sourceMappingURL=index.js.map
147
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/content.ts","../../src/lib/stepper.ts","../../src/stepper/stepper-icons.ts","../../src/stepper/Stepper.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react';\n\n/**\n * Whether React would show something for `content`. `null`, `undefined`, booleans and an empty string\n * show nothing; `0` does show (the text \"0\"), which is why this is not a plain truthiness check.\n */\nexport const hasContent = (content: ReactNode) =>\n content !== null &&\n content !== undefined &&\n content !== false &&\n content !== true &&\n content !== '';\n","export type TStepState = 'completed' | 'active' | 'upcoming';\n\n/**\n * The step that is the current one: `activeStep` kept inside the steps. A number past the ends (or\n * with a fraction) is put on the nearest step, and `NaN` is the first, so a wrong value never makes\n * every step look completed or none look current.\n */\nexport const getCurrentStep = (activeStep: number, count: number) =>\n Number.isNaN(activeStep)\n ? 0\n : Math.min(Math.max(Math.trunc(activeStep), 0), Math.max(count - 1, 0));\n\nexport const getStepState = (index: number, currentStep: number): TStepState => {\n if (index < currentStep) return 'completed';\n\n return index === currentStep ? 'active' : 'upcoming';\n};\n","import { addCollection, type IconifyJSON } from '@iconify/react';\n\n/*\n * The tick of a completed step. Iconify downloads an icon from its API the first time it is shown,\n * which cannot work offline and leaves an empty circle until it arrives, so the icon is bundled here\n * and registered with Iconify (the same way as the toast icons, see `toast-icons.ts`).\n *\n * An icon a step asks for with `icon: 'solar:...'` is the app's and is downloaded as usual; add it to\n * the app with `addCollection` when it has to show without a network.\n *\n * The data is what `https://api.iconify.design/<prefix>.json?icons=<name>` answers.\n */\nconst STEPPER_ICON_SETS: IconifyJSON[] = [\n {\n prefix: 'solar',\n width: 24,\n height: 24,\n icons: {\n 'check-read-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\"><path d=\"M4 12.9L7.14286 16.5L15 7.5\"/><path d=\"M20 7.5625L11.4283 16.5625L11 16\"/></g>',\n },\n },\n },\n];\n\nlet registered = false;\n\n/**\n * Registers the icons above with Iconify. `Stepper` calls it when it renders, not when this file is\n * imported: an app that never renders a stepper never runs it, and nothing depends on the bundler\n * keeping an import that is only there for its effect (see `toast-icons.ts`). Calling it again is\n * harmless.\n */\nexport const registerStepperIcons = () => {\n if (registered) return;\n\n for (const iconSet of STEPPER_ICON_SETS) addCollection(iconSet);\n registered = true;\n};\n\n/** Every icon name registered above, e.g. `solar:check-read-linear`. */\nexport const STEPPER_ICON_NAMES = STEPPER_ICON_SETS.flatMap(({ prefix, icons }) =>\n Object.keys(icons).map((name) => `${prefix}:${name}`),\n);\n","import { Icon } from '@iconify/react';\nimport type { ComponentProps, CSSProperties } from 'react';\n\nimport { hasContent } from '../lib/content.js';\nimport { getCurrentStep, getStepState, type TStepState } from '../lib/stepper.js';\nimport { registerStepperIcons } from './stepper-icons.js';\n\nexport interface IStepperStep {\n title: string;\n description?: string;\n /**\n * An Iconify name (`'solar:user-linear'`) shown in the circle while the step is not completed; the\n * step's number if left out. Iconify downloads it the first time it is shown and draws it in the\n * browser, not on a server: to have it without a network, bundle it in the app (`addCollection`).\n */\n icon?: string;\n /** Cannot be clicked. Only matters when `onStepClick` is given. */\n disabled?: boolean;\n}\n\nexport interface IStepper extends ComponentProps<'div'> {\n steps: readonly IStepperStep[];\n /** The index of the current step: the ones before it are completed, the ones after it are upcoming. */\n activeStep: number;\n /** Makes the steps buttons. It gets the index of the step that was clicked. */\n onStepClick?: (step: number) => void;\n /** Names the list of steps for assistive technology, e.g. `\"Checkout progress\"`. */\n label?: string;\n /**\n * What assistive technology reads before the title of a completed step, which otherwise only shows\n * a tick.\n * @default 'Completed'\n */\n completedLabel?: string;\n}\n\nconst ITEM_CSS =\n 'group relative flex min-w-0 items-start gap-3 text-left md:flex-col md:items-center md:gap-3 md:px-2';\n// No `outline-hidden`: 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 CLICKABLE_CSS =\n 'cursor-pointer rounded-lg focus-visible:outline-2 focus-visible:outline-offset-4 focus-visible:outline-blue-crayola-c disabled:cursor-not-allowed disabled:opacity-50';\n\nconst CIRCLE_CSS =\n 'relative z-1 flex size-10 shrink-0 items-center justify-center rounded-full border text-sm font-semibold transition-all duration-300 motion-reduce:transition-none md:size-11';\n\n// `Record`s: a new state is a type error here until it has a look. Every state also looks different\n// in forced-colors mode (Windows high contrast), where backgrounds and shadows are not drawn.\nconst CIRCLE_STATE_CSS: Record<TStepState, string> = {\n completed:\n 'border-blue-crayola-c bg-accent-duo text-white shadow-[0_8px_24px_rgba(var(--blue-crayola-c-rgb),0.28)] forced-colors:border-[Highlight] forced-colors:bg-[Highlight] forced-colors:bg-none forced-colors:text-[HighlightText]',\n active:\n 'border-blue-crayola-c bg-primary-invert text-primary shadow-[0_0_0_5px_rgba(var(--blue-crayola-c-rgb),0.12)] forced-colors:border-[Highlight] forced-colors:border-4',\n upcoming:\n 'border-primary/20 bg-primary-invert text-primary/60 forced-colors:border-[GrayText] forced-colors:text-[GrayText]',\n};\n\nconst TITLE_STATE_CSS: Record<TStepState, string> = {\n completed: 'text-primary/80',\n active: 'text-primary',\n upcoming: 'text-primary/45 forced-colors:text-[GrayText]',\n};\n\nconst DESCRIPTION_STATE_CSS: Record<TStepState, string> = {\n completed: 'text-primary/35',\n active: 'text-secondary',\n upcoming: 'text-primary/35 forced-colors:text-[GrayText]',\n};\n\nconst CONNECTOR_BASE_CSS =\n 'absolute top-10 left-5 h-4 w-0.5 -translate-x-1/2 md:top-5 md:left-[calc(50%+1.375rem)] md:h-0.5 md:w-[calc(100%-2.75rem)] md:translate-x-0';\n\n/**\n * A row of steps with the current one marked, for a checkout, a sign-up or any other wizard. The\n * steps are an ordered list; the current one has `aria-current=\"step\"`. With `onStepClick` the steps\n * are buttons, and the content in `children` is shown under them.\n */\nexport const Stepper = ({\n steps,\n activeStep,\n onStepClick,\n label,\n completedLabel = 'Completed',\n className = '',\n children,\n ...divProps\n}: IStepper) => {\n registerStepperIcons();\n\n const currentStep = getCurrentStep(activeStep, steps.length);\n\n return (\n <div\n {...divProps}\n className={`flex w-full flex-col gap-6 p-4 shadow-sm sm:p-5 lg:p-6 ${className}`}\n >\n {steps.length > 0 && (\n <ol\n aria-label={label}\n style={{ '--steps-count': steps.length } as CSSProperties}\n className=\"m-0 flex list-none flex-col gap-4 p-0 md:grid md:grid-cols-[repeat(var(--steps-count),minmax(0,1fr))] md:gap-0\"\n >\n {steps.map((step, index) => {\n const state = getStepState(index, currentStep);\n const hasNextStep = index < steps.length - 1;\n\n const content = (\n <>\n {hasNextStep && (\n <span\n aria-hidden=\"true\"\n className={`${CONNECTOR_BASE_CSS} ${\n state === 'completed'\n ? 'bg-accent-duo forced-colors:bg-[Highlight] forced-colors:bg-none'\n : 'bg-primary/20 forced-colors:bg-[GrayText]'\n }`}\n />\n )}\n\n <span aria-hidden=\"true\" className={`${CIRCLE_CSS} ${CIRCLE_STATE_CSS[state]}`}>\n {state === 'completed' ? (\n <Icon icon=\"solar:check-read-linear\" className=\"size-5\" />\n ) : step.icon ? (\n <Icon icon={step.icon} className=\"size-5\" />\n ) : (\n index + 1\n )}\n </span>\n\n <span className=\"flex min-w-0 flex-1 flex-col gap-1 pt-0.5 md:items-center md:pt-0 md:text-center\">\n <span\n className={`line-clamp-1 text-sm font-semibold md:text-[13px] lg:text-sm ${TITLE_STATE_CSS[state]}`}\n >\n {state === 'completed' && (\n <span className=\"sr-only\">{`${completedLabel}: `}</span>\n )}\n {step.title}\n </span>\n {hasContent(step.description) && (\n <span\n className={`line-clamp-1 text-xs leading-4 md:line-clamp-2 ${DESCRIPTION_STATE_CSS[state]}`}\n >\n {step.description}\n </span>\n )}\n </span>\n </>\n );\n\n return (\n // The steps are a fixed order that is never sorted or filtered, and two can have the\n // same title: the place is what tells them apart.\n <li\n key={index}\n data-state={state}\n aria-current={state === 'active' ? 'step' : undefined}\n >\n {onStepClick ? (\n <button\n type=\"button\"\n disabled={step.disabled}\n onClick={() => {\n onStepClick(index);\n }}\n className={`${ITEM_CSS} ${CLICKABLE_CSS} w-full`}\n >\n {content}\n </button>\n ) : (\n <div className={`${ITEM_CSS} cursor-default`}>{content}</div>\n )}\n </li>\n );\n })}\n </ol>\n )}\n\n {hasContent(children) && <div className=\"border-primary/10 border-t pt-5\">{children}</div>}\n </div>\n );\n};\n"]}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Registers the icons above with Iconify. `Stepper` calls it when it renders, not when this file is
3
+ * imported: an app that never renders a stepper never runs it, and nothing depends on the bundler
4
+ * keeping an import that is only there for its effect (see `toast-icons.ts`). Calling it again is
5
+ * harmless.
6
+ */
7
+ export declare const registerStepperIcons: () => void;
8
+ /** Every icon name registered above, e.g. `solar:check-read-linear`. */
9
+ export declare const STEPPER_ICON_NAMES: string[];
10
+ //# sourceMappingURL=stepper-icons.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-icons.d.cts","sourceRoot":"","sources":["../../src/stepper/stepper-icons.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,YAKhC,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,UAE9B,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Registers the icons above with Iconify. `Stepper` calls it when it renders, not when this file is
3
+ * imported: an app that never renders a stepper never runs it, and nothing depends on the bundler
4
+ * keeping an import that is only there for its effect (see `toast-icons.ts`). Calling it again is
5
+ * harmless.
6
+ */
7
+ export declare const registerStepperIcons: () => void;
8
+ /** Every icon name registered above, e.g. `solar:check-read-linear`. */
9
+ export declare const STEPPER_ICON_NAMES: string[];
10
+ //# sourceMappingURL=stepper-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stepper-icons.d.ts","sourceRoot":"","sources":["../../src/stepper/stepper-icons.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,YAKhC,CAAC;AAEF,wEAAwE;AACxE,eAAO,MAAM,kBAAkB,UAE9B,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { IClassName } from '../types/component.js';
2
+ export interface ITestimonial {
3
+ /** What the person said. */
4
+ content: string;
5
+ name: string;
6
+ role?: string;
7
+ /** The address of a photo of the person. Without it their initials are shown. */
8
+ image?: string;
9
+ /** Stars, from 0 to 5. @default 5 */
10
+ rating?: number;
11
+ }
12
+ /** The words said to assistive technology. English by default. */
13
+ export interface ITestimonialLabels {
14
+ /** The name of the carousel. */
15
+ carousel: string;
16
+ previous: string;
17
+ next: string;
18
+ /** The button that stops the carousel turning by itself. */
19
+ pause: string;
20
+ /** The button that makes it turn by itself again. */
21
+ play: string;
22
+ /** What the stars say ("Rated 5 out of 5"). */
23
+ rating: (rating: number) => string;
24
+ /** The name of a slide ("2 of 3"). */
25
+ slide: (index: number, total: number) => string;
26
+ }
27
+ export interface ITestimonialCarousel extends IClassName {
28
+ testimonials: readonly ITestimonial[];
29
+ /** How long each testimonial stays, in milliseconds. `0` never turns by itself. @default 5000 */
30
+ interval?: number;
31
+ labels?: Partial<ITestimonialLabels>;
32
+ }
33
+ /**
34
+ * Testimonials, one at a time, that turn by themselves. It follows what a carousel that moves has to
35
+ * do: it stops while the pointer is over it or the focus is in it, and a button stops it (and starts
36
+ * it again); with a system setting for less motion it does not turn at all. Previous and next buttons
37
+ * go round, and what is announced is the slide that is current, but only while it is not turning.
38
+ */
39
+ export declare const TestimonialCarousel: ({ testimonials, interval, className, labels, }: ITestimonialCarousel) => import("react").JSX.Element | null;
40
+ //# sourceMappingURL=TestimonialCarousel.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestimonialCarousel.d.cts","sourceRoot":"","sources":["../../src/testimonials/TestimonialCarousel.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,sCAAsC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IACtC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtC;AA0CD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,gDAKjC,oBAAoB,uCA6JtB,CAAC"}
@@ -0,0 +1,40 @@
1
+ import type { IClassName } from '../types/component.js';
2
+ export interface ITestimonial {
3
+ /** What the person said. */
4
+ content: string;
5
+ name: string;
6
+ role?: string;
7
+ /** The address of a photo of the person. Without it their initials are shown. */
8
+ image?: string;
9
+ /** Stars, from 0 to 5. @default 5 */
10
+ rating?: number;
11
+ }
12
+ /** The words said to assistive technology. English by default. */
13
+ export interface ITestimonialLabels {
14
+ /** The name of the carousel. */
15
+ carousel: string;
16
+ previous: string;
17
+ next: string;
18
+ /** The button that stops the carousel turning by itself. */
19
+ pause: string;
20
+ /** The button that makes it turn by itself again. */
21
+ play: string;
22
+ /** What the stars say ("Rated 5 out of 5"). */
23
+ rating: (rating: number) => string;
24
+ /** The name of a slide ("2 of 3"). */
25
+ slide: (index: number, total: number) => string;
26
+ }
27
+ export interface ITestimonialCarousel extends IClassName {
28
+ testimonials: readonly ITestimonial[];
29
+ /** How long each testimonial stays, in milliseconds. `0` never turns by itself. @default 5000 */
30
+ interval?: number;
31
+ labels?: Partial<ITestimonialLabels>;
32
+ }
33
+ /**
34
+ * Testimonials, one at a time, that turn by themselves. It follows what a carousel that moves has to
35
+ * do: it stops while the pointer is over it or the focus is in it, and a button stops it (and starts
36
+ * it again); with a system setting for less motion it does not turn at all. Previous and next buttons
37
+ * go round, and what is announced is the slide that is current, but only while it is not turning.
38
+ */
39
+ export declare const TestimonialCarousel: ({ testimonials, interval, className, labels, }: ITestimonialCarousel) => import("react").JSX.Element | null;
40
+ //# sourceMappingURL=TestimonialCarousel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestimonialCarousel.d.ts","sourceRoot":"","sources":["../../src/testimonials/TestimonialCarousel.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGxD,MAAM,WAAW,YAAY;IAC3B,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qCAAqC;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kEAAkE;AAClE,MAAM,WAAW,kBAAkB;IACjC,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IACnC,sCAAsC;IACtC,KAAK,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACjD;AAED,MAAM,WAAW,oBAAqB,SAAQ,UAAU;IACtD,YAAY,EAAE,SAAS,YAAY,EAAE,CAAC;IACtC,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACtC;AA0CD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,GAAI,gDAKjC,oBAAoB,uCA6JtB,CAAC"}
@@ -0,0 +1,246 @@
1
+ 'use strict';
2
+
3
+ var react = require('@iconify/react');
4
+ var react$1 = require('react');
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
+ var QUERY = "(prefers-reduced-motion: reduce)";
10
+ var query = /* @__PURE__ */ __name(() => window.matchMedia?.(QUERY), "query");
11
+ var subscribe = /* @__PURE__ */ __name((onChange) => {
12
+ const list = query();
13
+ list?.addEventListener("change", onChange);
14
+ return () => {
15
+ list?.removeEventListener("change", onChange);
16
+ };
17
+ }, "subscribe");
18
+ var getSnapshot = /* @__PURE__ */ __name(() => query()?.matches ?? false, "getSnapshot");
19
+ var getServerSnapshot = /* @__PURE__ */ __name(() => false, "getServerSnapshot");
20
+ var usePrefersReducedMotion = /* @__PURE__ */ __name(() => react$1.useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot), "usePrefersReducedMotion");
21
+ var createIconRegistry = /* @__PURE__ */ __name((sets) => {
22
+ let registered = false;
23
+ return {
24
+ register: /* @__PURE__ */ __name(() => {
25
+ if (registered) return;
26
+ for (const set of sets) react.addCollection(set);
27
+ registered = true;
28
+ }, "register"),
29
+ names: sets.flatMap(
30
+ ({ prefix, icons, aliases }) => [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`)
31
+ )
32
+ };
33
+ }, "createIconRegistry");
34
+
35
+ // src/testimonials/testimonials-icons.ts
36
+ var ICON_SETS = [
37
+ {
38
+ prefix: "streamline-ultimate-color",
39
+ width: 24,
40
+ height: 24,
41
+ icons: {
42
+ "rating-star": {
43
+ body: '<g fill="none"><path fill="#ffef5e" d="M11.523 1.332a.511.511 0 0 1 .957 0l2.59 7.343h7.315a.512.512 0 0 1 .332.9l-6.112 5.067l2.558 7.685a.512.512 0 0 1-.788.574L12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316z"/><path fill="#fff9bf" d="M12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316l2.59-7.343a.51.51 0 0 1 .48-.332z"/><path stroke="#191919" stroke-linecap="round" stroke-linejoin="round" d="M11.523 1.332a.511.511 0 0 1 .957 0l2.59 7.343h7.315a.512.512 0 0 1 .332.9l-6.112 5.067l2.558 7.685a.512.512 0 0 1-.788.574L12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316z"/></g>'
44
+ }
45
+ }
46
+ },
47
+ {
48
+ prefix: "solar",
49
+ width: 24,
50
+ height: 24,
51
+ icons: {
52
+ "arrow-left-linear": {
53
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M20 12H4M10 18L4 12L10 6"/>'
54
+ },
55
+ "arrow-right-linear": {
56
+ body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 12H20M14 18L20 12L14 6"/>'
57
+ },
58
+ "pause-linear": {
59
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M2 6C2 4.11438 2 3.17157 2.58579 2.58579C3.17157 2 4.11438 2 6 2C7.88562 2 8.82843 2 9.41421 2.58579C10 3.17157 10 4.11438 10 6V18C10 19.8856 10 20.8284 9.41421 21.4142C8.82843 22 7.88562 22 6 22C4.11438 22 3.17157 22 2.58579 21.4142C2 20.8284 2 19.8856 2 18V6Z"/><path d="M14 6C14 4.11438 14 3.17157 14.5858 2.58579C15.1716 2 16.1144 2 18 2C19.8856 2 20.8284 2 21.4142 2.58579C22 3.17157 22 4.11438 22 6V18C22 19.8856 22 20.8284 21.4142 21.4142C20.8284 22 19.8856 22 18 22C16.1144 22 15.1716 22 14.5858 21.4142C14 20.8284 14 19.8856 14 18V6Z"/></g>'
60
+ },
61
+ "play-linear": {
62
+ 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"/>'
63
+ }
64
+ }
65
+ }
66
+ ];
67
+ var { register: registerTestimonialIcons, names: TESTIMONIAL_ICON_NAMES } = createIconRegistry(ICON_SETS);
68
+ var LABELS = {
69
+ carousel: "Testimonials",
70
+ previous: "Previous testimonial",
71
+ next: "Next testimonial",
72
+ pause: "Pause the testimonials",
73
+ play: "Play the testimonials",
74
+ rating: /* @__PURE__ */ __name((rating) => `Rated ${String(rating)} out of 5`, "rating"),
75
+ slide: /* @__PURE__ */ __name((index, total) => `${String(index + 1)} of ${String(total)}`, "slide")
76
+ };
77
+ var MAX_STARS = 5;
78
+ var initialsOf = /* @__PURE__ */ __name((name) => name.split(/\s+/).filter(Boolean).slice(0, 2).map((word) => Array.from(word).at(0) ?? "").join("").toUpperCase(), "initialsOf");
79
+ var IconButton = /* @__PURE__ */ __name(({
80
+ icon,
81
+ label,
82
+ onClick
83
+ }) => /* @__PURE__ */ jsxRuntime.jsx(
84
+ "button",
85
+ {
86
+ type: "button",
87
+ "aria-label": label,
88
+ onClick,
89
+ className: "text-tertiary hover:text-primary cursor-pointer rounded-sm p-0.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c",
90
+ children: /* @__PURE__ */ jsxRuntime.jsx(react.Icon, { icon, className: "size-5" })
91
+ }
92
+ ), "IconButton");
93
+ var TestimonialCarousel = /* @__PURE__ */ __name(({
94
+ testimonials,
95
+ interval = 5e3,
96
+ className = "",
97
+ labels
98
+ }) => {
99
+ registerTestimonialIcons();
100
+ const text = {
101
+ carousel: labels?.carousel ?? LABELS.carousel,
102
+ previous: labels?.previous ?? LABELS.previous,
103
+ next: labels?.next ?? LABELS.next,
104
+ pause: labels?.pause ?? LABELS.pause,
105
+ play: labels?.play ?? LABELS.play,
106
+ rating: labels?.rating ?? LABELS.rating,
107
+ slide: labels?.slide ?? LABELS.slide
108
+ };
109
+ const prefersReducedMotion = usePrefersReducedMotion();
110
+ const [index, setIndex] = react$1.useState(0);
111
+ const [isHovered, setIsHovered] = react$1.useState(false);
112
+ const [isFocused, setIsFocused] = react$1.useState(false);
113
+ const [choice, setChoice] = react$1.useState(null);
114
+ const count = testimonials.length;
115
+ const shown = Math.min(index, count - 1);
116
+ const canTurn = count > 1 && interval > 0 && !prefersReducedMotion;
117
+ const isTurning = canTurn && (choice === "playing" || choice === null && !isHovered && !isFocused);
118
+ react$1.useEffect(() => {
119
+ if (!isTurning) return;
120
+ const timer = window.setTimeout(() => {
121
+ setIndex((current) => (Math.min(current, count - 1) + 1) % count);
122
+ }, interval);
123
+ return () => {
124
+ window.clearTimeout(timer);
125
+ };
126
+ }, [isTurning, shown, count, interval]);
127
+ if (count === 0) return null;
128
+ const go = /* @__PURE__ */ __name((step) => {
129
+ setIndex((current) => (Math.min(current, count - 1) + step + count) % count);
130
+ }, "go");
131
+ return /* @__PURE__ */ jsxRuntime.jsxs(
132
+ "div",
133
+ {
134
+ role: "group",
135
+ "aria-roledescription": "carousel",
136
+ "aria-label": text.carousel,
137
+ onPointerEnter: (event) => {
138
+ if (event.pointerType === "mouse") setIsHovered(true);
139
+ },
140
+ onPointerLeave: () => {
141
+ setIsHovered(false);
142
+ },
143
+ onFocus: () => {
144
+ setIsFocused(true);
145
+ },
146
+ onBlur: (event) => {
147
+ if (!event.currentTarget.contains(event.relatedTarget)) setIsFocused(false);
148
+ },
149
+ className: `bg-tertiary-invert relative rounded-lg p-4 ${className}`,
150
+ children: [
151
+ /* @__PURE__ */ jsxRuntime.jsx("div", { "aria-live": isTurning ? "off" : "polite", children: testimonials.map((testimonial, position) => {
152
+ const stars = Math.max(
153
+ 0,
154
+ Math.min(MAX_STARS, Math.round(testimonial.rating ?? MAX_STARS))
155
+ );
156
+ return /* @__PURE__ */ jsxRuntime.jsxs(
157
+ "figure",
158
+ {
159
+ role: "group",
160
+ "aria-roledescription": "slide",
161
+ "aria-label": text.slide(position, count),
162
+ hidden: position !== shown,
163
+ className: "group m-0 flex w-full flex-col gap-4",
164
+ children: [
165
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4 leading-6", children: [
166
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex gap-1", children: [
167
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: text.rating(stars) }),
168
+ Array.from({ length: stars }, (_, star) => /* @__PURE__ */ jsxRuntime.jsx(
169
+ react.Icon,
170
+ {
171
+ "aria-hidden": "true",
172
+ icon: "streamline-ultimate-color:rating-star",
173
+ className: "size-5"
174
+ },
175
+ star
176
+ ))
177
+ ] }),
178
+ /* @__PURE__ */ jsxRuntime.jsx("blockquote", { children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-tertiary group-hover:text-primary text-xs break-words italic before:content-['\u201C'] after:content-['\u201D']", children: testimonial.content }) })
179
+ ] }),
180
+ /* @__PURE__ */ jsxRuntime.jsxs("figcaption", { className: "flex items-center gap-2 pr-24", children: [
181
+ testimonial.image ? /* @__PURE__ */ jsxRuntime.jsx(
182
+ "img",
183
+ {
184
+ src: testimonial.image,
185
+ alt: "",
186
+ loading: "lazy",
187
+ className: "bg-secondary-invert/50 border-primary/50 size-8 shrink-0 rounded-full border object-cover"
188
+ }
189
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
190
+ "span",
191
+ {
192
+ "aria-hidden": "true",
193
+ className: "bg-secondary-invert/50 border-primary/50 text-secondary grid size-8 shrink-0 place-items-center rounded-full border text-[10px] font-semibold",
194
+ children: initialsOf(testimonial.name)
195
+ }
196
+ ),
197
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex flex-col", children: [
198
+ /* @__PURE__ */ jsxRuntime.jsx("cite", { className: "text-secondary text-[10px] font-semibold not-italic", children: testimonial.name }),
199
+ testimonial.role && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-tertiary text-[9px] leading-4", children: testimonial.role })
200
+ ] })
201
+ ] })
202
+ ]
203
+ },
204
+ `${testimonial.name}#${String(position)}`
205
+ );
206
+ }) }),
207
+ count > 1 && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "absolute right-4 bottom-4 flex items-center gap-1", children: [
208
+ canTurn && /* @__PURE__ */ jsxRuntime.jsx(
209
+ IconButton,
210
+ {
211
+ icon: choice === "paused" ? "solar:play-linear" : "solar:pause-linear",
212
+ label: choice === "paused" ? text.play : text.pause,
213
+ onClick: () => {
214
+ setChoice(choice === "paused" ? "playing" : "paused");
215
+ }
216
+ }
217
+ ),
218
+ /* @__PURE__ */ jsxRuntime.jsx(
219
+ IconButton,
220
+ {
221
+ icon: "solar:arrow-left-linear",
222
+ label: text.previous,
223
+ onClick: () => {
224
+ go(-1);
225
+ }
226
+ }
227
+ ),
228
+ /* @__PURE__ */ jsxRuntime.jsx(
229
+ IconButton,
230
+ {
231
+ icon: "solar:arrow-right-linear",
232
+ label: text.next,
233
+ onClick: () => {
234
+ go(1);
235
+ }
236
+ }
237
+ )
238
+ ] })
239
+ ]
240
+ }
241
+ );
242
+ }, "TestimonialCarousel");
243
+
244
+ exports.TestimonialCarousel = TestimonialCarousel;
245
+ //# sourceMappingURL=index.cjs.map
246
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/usePrefersReducedMotion.ts","../../src/lib/icon-registry.ts","../../src/testimonials/testimonials-icons.ts","../../src/testimonials/TestimonialCarousel.tsx"],"names":["useSyncExternalStore","addCollection","jsx","Icon","useState","useEffect","jsxs"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useSyncExternalStore } from 'react';\n\nconst QUERY = '(prefers-reduced-motion: reduce)';\n\n// `matchMedia` is in every browser; a test environment such as jsdom may not have it, and then the\n// answer is \"no preference\" instead of an error.\nconst query = () => (window as Partial<Window>).matchMedia?.(QUERY);\n\nconst subscribe = (onChange: () => void) => {\n const list = query();\n\n list?.addEventListener('change', onChange);\n\n return () => {\n list?.removeEventListener('change', onChange);\n };\n};\n\nconst getSnapshot = () => query()?.matches ?? false;\nconst getServerSnapshot = () => false;\n\n/**\n * Whether the person asked their system for less motion. It follows the setting while the page is\n * open, and is `false` on a server (a page that moves by itself starts still there and stops once the\n * browser says so).\n */\nexport const usePrefersReducedMotion = () =>\n useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);\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 testimonial carousel, 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: 'streamline-ultimate-color',\n width: 24,\n height: 24,\n icons: {\n 'rating-star': {\n body: '<g fill=\"none\"><path fill=\"#ffef5e\" d=\"M11.523 1.332a.511.511 0 0 1 .957 0l2.59 7.343h7.315a.512.512 0 0 1 .332.9l-6.112 5.067l2.558 7.685a.512.512 0 0 1-.788.574L12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316z\"/><path fill=\"#fff9bf\" d=\"M12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316l2.59-7.343a.51.51 0 0 1 .48-.332z\"/><path stroke=\"#191919\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M11.523 1.332a.511.511 0 0 1 .957 0l2.59 7.343h7.315a.512.512 0 0 1 .332.9l-6.112 5.067l2.558 7.685a.512.512 0 0 1-.788.574L12 18.224L5.622 22.9a.511.511 0 0 1-.785-.574l2.559-7.685l-6.113-5.067a.512.512 0 0 1 .332-.9h7.316z\"/></g>',\n },\n },\n },\n {\n prefix: 'solar',\n width: 24,\n height: 24,\n icons: {\n 'arrow-left-linear': {\n body: '<path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M20 12H4M10 18L4 12L10 6\"/>',\n },\n 'arrow-right-linear': {\n body: '<path fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"1.5\" d=\"M4 12H20M14 18L20 12L14 6\"/>',\n },\n 'pause-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M2 6C2 4.11438 2 3.17157 2.58579 2.58579C3.17157 2 4.11438 2 6 2C7.88562 2 8.82843 2 9.41421 2.58579C10 3.17157 10 4.11438 10 6V18C10 19.8856 10 20.8284 9.41421 21.4142C8.82843 22 7.88562 22 6 22C4.11438 22 3.17157 22 2.58579 21.4142C2 20.8284 2 19.8856 2 18V6Z\"/><path d=\"M14 6C14 4.11438 14 3.17157 14.5858 2.58579C15.1716 2 16.1144 2 18 2C19.8856 2 20.8284 2 21.4142 2.58579C22 3.17157 22 4.11438 22 6V18C22 19.8856 22 20.8284 21.4142 21.4142C20.8284 22 19.8856 22 18 22C16.1144 22 15.1716 22 14.5858 21.4142C14 20.8284 14 19.8856 14 18V6Z\"/></g>',\n },\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 },\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: registerTestimonialIcons, names: TESTIMONIAL_ICON_NAMES } =\n createIconRegistry(ICON_SETS);\n","import { Icon } from '@iconify/react';\nimport { type FocusEvent, type PointerEvent, useEffect, useState } from 'react';\n\nimport { usePrefersReducedMotion } from '../lib/usePrefersReducedMotion.js';\nimport type { IClassName } from '../types/component.js';\nimport { registerTestimonialIcons } from './testimonials-icons.js';\n\nexport interface ITestimonial {\n /** What the person said. */\n content: string;\n name: string;\n role?: string;\n /** The address of a photo of the person. Without it their initials are shown. */\n image?: string;\n /** Stars, from 0 to 5. @default 5 */\n rating?: number;\n}\n\n/** The words said to assistive technology. English by default. */\nexport interface ITestimonialLabels {\n /** The name of the carousel. */\n carousel: string;\n previous: string;\n next: string;\n /** The button that stops the carousel turning by itself. */\n pause: string;\n /** The button that makes it turn by itself again. */\n play: string;\n /** What the stars say (\"Rated 5 out of 5\"). */\n rating: (rating: number) => string;\n /** The name of a slide (\"2 of 3\"). */\n slide: (index: number, total: number) => string;\n}\n\nexport interface ITestimonialCarousel extends IClassName {\n testimonials: readonly ITestimonial[];\n /** How long each testimonial stays, in milliseconds. `0` never turns by itself. @default 5000 */\n interval?: number;\n labels?: Partial<ITestimonialLabels>;\n}\n\nconst LABELS: ITestimonialLabels = {\n carousel: 'Testimonials',\n previous: 'Previous testimonial',\n next: 'Next testimonial',\n pause: 'Pause the testimonials',\n play: 'Play the testimonials',\n rating: (rating) => `Rated ${String(rating)} out of 5`,\n slide: (index, total) => `${String(index + 1)} of ${String(total)}`,\n};\n\nconst MAX_STARS = 5;\n\nconst initialsOf = (name: string) =>\n name\n .split(/\\s+/)\n .filter(Boolean)\n .slice(0, 2)\n .map((word) => Array.from(word).at(0) ?? '')\n .join('')\n .toUpperCase();\n\nconst IconButton = ({\n icon,\n label,\n onClick,\n}: {\n icon: string;\n label: string;\n onClick: () => void;\n}) => (\n <button\n type=\"button\"\n aria-label={label}\n onClick={onClick}\n className=\"text-tertiary hover:text-primary cursor-pointer rounded-sm p-0.5 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c\"\n >\n <Icon icon={icon} className=\"size-5\" />\n </button>\n);\n\n/**\n * Testimonials, one at a time, that turn by themselves. It follows what a carousel that moves has to\n * do: it stops while the pointer is over it or the focus is in it, and a button stops it (and starts\n * it again); with a system setting for less motion it does not turn at all. Previous and next buttons\n * go round, and what is announced is the slide that is current, but only while it is not turning.\n */\nexport const TestimonialCarousel = ({\n testimonials,\n interval = 5000,\n className = '',\n labels,\n}: ITestimonialCarousel) => {\n registerTestimonialIcons();\n\n const text = {\n carousel: labels?.carousel ?? LABELS.carousel,\n previous: labels?.previous ?? LABELS.previous,\n next: labels?.next ?? LABELS.next,\n pause: labels?.pause ?? LABELS.pause,\n play: labels?.play ?? LABELS.play,\n rating: labels?.rating ?? LABELS.rating,\n slide: labels?.slide ?? LABELS.slide,\n };\n const prefersReducedMotion = usePrefersReducedMotion();\n const [index, setIndex] = useState(0);\n const [isHovered, setIsHovered] = useState(false);\n const [isFocused, setIsFocused] = useState(false);\n // what the person chose with the button; `null` while they have not\n const [choice, setChoice] = useState<'paused' | 'playing' | null>(null);\n\n const count = testimonials.length;\n const shown = Math.min(index, count - 1);\n const canTurn = count > 1 && interval > 0 && !prefersReducedMotion;\n // the button wins over the pointer and the focus: a person who pressed \"play\" wants it to turn\n const isTurning =\n canTurn && (choice === 'playing' || (choice === null && !isHovered && !isFocused));\n\n useEffect(() => {\n if (!isTurning) return;\n\n const timer = window.setTimeout(() => {\n setIndex((current) => (Math.min(current, count - 1) + 1) % count);\n }, interval);\n\n return () => {\n window.clearTimeout(timer);\n };\n }, [isTurning, shown, count, interval]);\n\n if (count === 0) return null;\n\n const go = (step: 1 | -1) => {\n setIndex((current) => (Math.min(current, count - 1) + step + count) % count);\n };\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"carousel\"\n aria-label={text.carousel}\n onPointerEnter={(event: PointerEvent<HTMLDivElement>) => {\n // a touch is not \"the pointer is over it\": there is no leaving a finger\n if (event.pointerType === 'mouse') setIsHovered(true);\n }}\n onPointerLeave={() => {\n setIsHovered(false);\n }}\n onFocus={() => {\n setIsFocused(true);\n }}\n onBlur={(event: FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) setIsFocused(false);\n }}\n className={`bg-tertiary-invert relative rounded-lg p-4 ${className}`}\n >\n <div aria-live={isTurning ? 'off' : 'polite'}>\n {testimonials.map((testimonial, position) => {\n const stars = Math.max(\n 0,\n Math.min(MAX_STARS, Math.round(testimonial.rating ?? MAX_STARS)),\n );\n\n return (\n <figure\n key={`${testimonial.name}#${String(position)}`}\n role=\"group\"\n aria-roledescription=\"slide\"\n aria-label={text.slide(position, count)}\n hidden={position !== shown}\n className=\"group m-0 flex w-full flex-col gap-4\"\n >\n <div className=\"flex flex-col gap-4 leading-6\">\n <div className=\"flex gap-1\">\n <span className=\"sr-only\">{text.rating(stars)}</span>\n {Array.from({ length: stars }, (_, star) => (\n <Icon\n key={star}\n aria-hidden=\"true\"\n icon=\"streamline-ultimate-color:rating-star\"\n className=\"size-5\"\n />\n ))}\n </div>\n <blockquote>\n <p className=\"text-tertiary group-hover:text-primary text-xs break-words italic before:content-['“'] after:content-['”']\">\n {testimonial.content}\n </p>\n </blockquote>\n </div>\n <figcaption className=\"flex items-center gap-2 pr-24\">\n {testimonial.image ? (\n <img\n src={testimonial.image}\n alt=\"\"\n loading=\"lazy\"\n className=\"bg-secondary-invert/50 border-primary/50 size-8 shrink-0 rounded-full border object-cover\"\n />\n ) : (\n <span\n aria-hidden=\"true\"\n className=\"bg-secondary-invert/50 border-primary/50 text-secondary grid size-8 shrink-0 place-items-center rounded-full border text-[10px] font-semibold\"\n >\n {initialsOf(testimonial.name)}\n </span>\n )}\n <span className=\"flex flex-col\">\n <cite className=\"text-secondary text-[10px] font-semibold not-italic\">\n {testimonial.name}\n </cite>\n {testimonial.role && (\n <span className=\"text-tertiary text-[9px] leading-4\">{testimonial.role}</span>\n )}\n </span>\n </figcaption>\n </figure>\n );\n })}\n </div>\n\n {count > 1 && (\n <div className=\"absolute right-4 bottom-4 flex items-center gap-1\">\n {canTurn && (\n <IconButton\n icon={choice === 'paused' ? 'solar:play-linear' : 'solar:pause-linear'}\n label={choice === 'paused' ? text.play : text.pause}\n onClick={() => {\n setChoice(choice === 'paused' ? 'playing' : 'paused');\n }}\n />\n )}\n <IconButton\n icon=\"solar:arrow-left-linear\"\n label={text.previous}\n onClick={() => {\n go(-1);\n }}\n />\n <IconButton\n icon=\"solar:arrow-right-linear\"\n label={text.next}\n onClick={() => {\n go(1);\n }}\n />\n </div>\n )}\n </div>\n );\n};\n"]}
@@ -0,0 +1,2 @@
1
+ export { type ITestimonial, type ITestimonialCarousel, type ITestimonialLabels, TestimonialCarousel, } from './TestimonialCarousel.js';
2
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../../src/testimonials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { type ITestimonial, type ITestimonialCarousel, type ITestimonialLabels, TestimonialCarousel, } from './TestimonialCarousel.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testimonials/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC"}