@beautinique/frontend-components 1.0.8 → 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 (380) hide show
  1. package/README.md +225 -16
  2. package/dist/auth/SocialAuth.d.cts +33 -0
  3. package/dist/auth/SocialAuth.d.cts.map +1 -0
  4. package/dist/auth/SocialAuth.d.ts +33 -0
  5. package/dist/auth/SocialAuth.d.ts.map +1 -0
  6. package/dist/auth/index.cjs +34 -26
  7. package/dist/auth/index.cjs.map +1 -1
  8. package/dist/auth/index.d.cts +1 -0
  9. package/dist/auth/index.d.cts.map +1 -1
  10. package/dist/auth/index.d.ts +1 -0
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/auth/index.js +32 -25
  13. package/dist/auth/index.js.map +1 -1
  14. package/dist/breadcrumb/Breadcrumb.d.cts +34 -0
  15. package/dist/breadcrumb/Breadcrumb.d.cts.map +1 -0
  16. package/dist/breadcrumb/Breadcrumb.d.ts +34 -0
  17. package/dist/breadcrumb/Breadcrumb.d.ts.map +1 -0
  18. package/dist/breadcrumb/breadcrumb-icons.d.cts +6 -0
  19. package/dist/breadcrumb/breadcrumb-icons.d.cts.map +1 -0
  20. package/dist/breadcrumb/breadcrumb-icons.d.ts +6 -0
  21. package/dist/breadcrumb/breadcrumb-icons.d.ts.map +1 -0
  22. package/dist/breadcrumb/getBreadcrumbItems.d.cts +16 -0
  23. package/dist/breadcrumb/getBreadcrumbItems.d.cts.map +1 -0
  24. package/dist/breadcrumb/getBreadcrumbItems.d.ts +16 -0
  25. package/dist/breadcrumb/getBreadcrumbItems.d.ts.map +1 -0
  26. package/dist/breadcrumb/index.cjs +110 -0
  27. package/dist/breadcrumb/index.cjs.map +1 -0
  28. package/dist/breadcrumb/index.d.cts +3 -0
  29. package/dist/breadcrumb/index.d.cts.map +1 -0
  30. package/dist/breadcrumb/index.d.ts +3 -0
  31. package/dist/breadcrumb/index.d.ts.map +1 -0
  32. package/dist/breadcrumb/index.js +107 -0
  33. package/dist/breadcrumb/index.js.map +1 -0
  34. package/dist/color-input/ColorInput.d.cts +33 -0
  35. package/dist/color-input/ColorInput.d.cts.map +1 -0
  36. package/dist/color-input/ColorInput.d.ts +33 -0
  37. package/dist/color-input/ColorInput.d.ts.map +1 -0
  38. package/dist/color-input/color-input-icons.d.cts +6 -0
  39. package/dist/color-input/color-input-icons.d.cts.map +1 -0
  40. package/dist/color-input/color-input-icons.d.ts +6 -0
  41. package/dist/color-input/color-input-icons.d.ts.map +1 -0
  42. package/dist/color-input/color.d.cts +10 -0
  43. package/dist/color-input/color.d.cts.map +1 -0
  44. package/dist/color-input/color.d.ts +10 -0
  45. package/dist/color-input/color.d.ts.map +1 -0
  46. package/dist/color-input/index.cjs +375 -0
  47. package/dist/color-input/index.cjs.map +1 -0
  48. package/dist/color-input/index.d.cts +2 -0
  49. package/dist/color-input/index.d.cts.map +1 -0
  50. package/dist/color-input/index.d.ts +2 -0
  51. package/dist/color-input/index.d.ts.map +1 -0
  52. package/dist/color-input/index.js +373 -0
  53. package/dist/color-input/index.js.map +1 -0
  54. package/dist/file-input/FileInput.d.cts +53 -0
  55. package/dist/file-input/FileInput.d.cts.map +1 -0
  56. package/dist/file-input/FileInput.d.ts +53 -0
  57. package/dist/file-input/FileInput.d.ts.map +1 -0
  58. package/dist/file-input/file-input-icons.d.cts +6 -0
  59. package/dist/file-input/file-input-icons.d.cts.map +1 -0
  60. package/dist/file-input/file-input-icons.d.ts +6 -0
  61. package/dist/file-input/file-input-icons.d.ts.map +1 -0
  62. package/dist/file-input/index.cjs +259 -0
  63. package/dist/file-input/index.cjs.map +1 -0
  64. package/dist/file-input/index.d.cts +3 -0
  65. package/dist/file-input/index.d.cts.map +1 -0
  66. package/dist/file-input/index.d.ts +3 -0
  67. package/dist/file-input/index.d.ts.map +1 -0
  68. package/dist/file-input/index.js +256 -0
  69. package/dist/file-input/index.js.map +1 -0
  70. package/dist/file-input/media-type.d.cts +8 -0
  71. package/dist/file-input/media-type.d.cts.map +1 -0
  72. package/dist/file-input/media-type.d.ts +8 -0
  73. package/dist/file-input/media-type.d.ts.map +1 -0
  74. package/dist/file-input/useObjectUrls.d.cts +10 -0
  75. package/dist/file-input/useObjectUrls.d.cts.map +1 -0
  76. package/dist/file-input/useObjectUrls.d.ts +10 -0
  77. package/dist/file-input/useObjectUrls.d.ts.map +1 -0
  78. package/dist/hierarchy-select/HierarchySelect.d.cts +58 -0
  79. package/dist/hierarchy-select/HierarchySelect.d.cts.map +1 -0
  80. package/dist/hierarchy-select/HierarchySelect.d.ts +58 -0
  81. package/dist/hierarchy-select/HierarchySelect.d.ts.map +1 -0
  82. package/dist/hierarchy-select/hierarchy-select-icons.d.cts +6 -0
  83. package/dist/hierarchy-select/hierarchy-select-icons.d.cts.map +1 -0
  84. package/dist/hierarchy-select/hierarchy-select-icons.d.ts +6 -0
  85. package/dist/hierarchy-select/hierarchy-select-icons.d.ts.map +1 -0
  86. package/dist/hierarchy-select/index.cjs +596 -0
  87. package/dist/hierarchy-select/index.cjs.map +1 -0
  88. package/dist/hierarchy-select/index.d.cts +2 -0
  89. package/dist/hierarchy-select/index.d.cts.map +1 -0
  90. package/dist/hierarchy-select/index.d.ts +2 -0
  91. package/dist/hierarchy-select/index.d.ts.map +1 -0
  92. package/dist/hierarchy-select/index.js +594 -0
  93. package/dist/hierarchy-select/index.js.map +1 -0
  94. package/dist/hierarchy-select/tree.d.cts +38 -0
  95. package/dist/hierarchy-select/tree.d.cts.map +1 -0
  96. package/dist/hierarchy-select/tree.d.ts +38 -0
  97. package/dist/hierarchy-select/tree.d.ts.map +1 -0
  98. package/dist/index.cjs +7 -0
  99. package/dist/index.d.cts +1 -0
  100. package/dist/index.d.cts.map +1 -1
  101. package/dist/index.d.ts +1 -0
  102. package/dist/index.d.ts.map +1 -1
  103. package/dist/index.js +1 -0
  104. package/dist/inputs/Checkbox.d.cts +21 -0
  105. package/dist/inputs/Checkbox.d.cts.map +1 -0
  106. package/dist/inputs/Checkbox.d.ts +21 -0
  107. package/dist/inputs/Checkbox.d.ts.map +1 -0
  108. package/dist/inputs/Input.d.cts +26 -0
  109. package/dist/inputs/Input.d.cts.map +1 -0
  110. package/dist/inputs/Input.d.ts +26 -0
  111. package/dist/inputs/Input.d.ts.map +1 -0
  112. package/dist/inputs/InputError.d.cts +11 -0
  113. package/dist/inputs/InputError.d.cts.map +1 -0
  114. package/dist/inputs/InputError.d.ts +11 -0
  115. package/dist/inputs/InputError.d.ts.map +1 -0
  116. package/dist/inputs/InputIcon.d.cts +9 -0
  117. package/dist/inputs/InputIcon.d.cts.map +1 -0
  118. package/dist/inputs/InputIcon.d.ts +9 -0
  119. package/dist/inputs/InputIcon.d.ts.map +1 -0
  120. package/dist/inputs/InputLabel.d.cts +8 -0
  121. package/dist/inputs/InputLabel.d.cts.map +1 -0
  122. package/dist/inputs/InputLabel.d.ts +8 -0
  123. package/dist/inputs/InputLabel.d.ts.map +1 -0
  124. package/dist/inputs/Radio.d.cts +25 -0
  125. package/dist/inputs/Radio.d.cts.map +1 -0
  126. package/dist/inputs/Radio.d.ts +25 -0
  127. package/dist/inputs/Radio.d.ts.map +1 -0
  128. package/dist/inputs/Select.d.cts +53 -0
  129. package/dist/inputs/Select.d.cts.map +1 -0
  130. package/dist/inputs/Select.d.ts +53 -0
  131. package/dist/inputs/Select.d.ts.map +1 -0
  132. package/dist/inputs/Textarea.d.cts +19 -0
  133. package/dist/inputs/Textarea.d.cts.map +1 -0
  134. package/dist/inputs/Textarea.d.ts +19 -0
  135. package/dist/inputs/Textarea.d.ts.map +1 -0
  136. package/dist/inputs/index.cjs +746 -0
  137. package/dist/inputs/index.cjs.map +1 -0
  138. package/dist/inputs/index.d.cts +10 -0
  139. package/dist/inputs/index.d.cts.map +1 -0
  140. package/dist/inputs/index.d.ts +10 -0
  141. package/dist/inputs/index.d.ts.map +1 -0
  142. package/dist/inputs/index.js +737 -0
  143. package/dist/inputs/index.js.map +1 -0
  144. package/dist/inputs/inputs-icons.d.cts +6 -0
  145. package/dist/inputs/inputs-icons.d.cts.map +1 -0
  146. package/dist/inputs/inputs-icons.d.ts +6 -0
  147. package/dist/inputs/inputs-icons.d.ts.map +1 -0
  148. package/dist/inputs/types.d.cts +48 -0
  149. package/dist/inputs/types.d.cts.map +1 -0
  150. package/dist/inputs/types.d.ts +48 -0
  151. package/dist/inputs/types.d.ts.map +1 -0
  152. package/dist/inputs/useFieldIds.d.cts +24 -0
  153. package/dist/inputs/useFieldIds.d.cts.map +1 -0
  154. package/dist/inputs/useFieldIds.d.ts +24 -0
  155. package/dist/inputs/useFieldIds.d.ts.map +1 -0
  156. package/dist/layout/ApiStatus.d.cts +20 -0
  157. package/dist/layout/ApiStatus.d.cts.map +1 -0
  158. package/dist/layout/ApiStatus.d.ts +20 -0
  159. package/dist/layout/ApiStatus.d.ts.map +1 -0
  160. package/dist/layout/BorderGradient.d.cts +11 -0
  161. package/dist/layout/BorderGradient.d.cts.map +1 -0
  162. package/dist/layout/BorderGradient.d.ts +11 -0
  163. package/dist/layout/BorderGradient.d.ts.map +1 -0
  164. package/dist/layout/ConfirmModal.d.cts +44 -0
  165. package/dist/layout/ConfirmModal.d.cts.map +1 -0
  166. package/dist/layout/ConfirmModal.d.ts +44 -0
  167. package/dist/layout/ConfirmModal.d.ts.map +1 -0
  168. package/dist/layout/Dropdown.d.cts +33 -0
  169. package/dist/layout/Dropdown.d.cts.map +1 -0
  170. package/dist/layout/Dropdown.d.ts +33 -0
  171. package/dist/layout/Dropdown.d.ts.map +1 -0
  172. package/dist/layout/LoadingPage.d.cts +11 -0
  173. package/dist/layout/LoadingPage.d.cts.map +1 -0
  174. package/dist/layout/LoadingPage.d.ts +11 -0
  175. package/dist/layout/LoadingPage.d.ts.map +1 -0
  176. package/dist/layout/LoadingRings.d.cts +12 -0
  177. package/dist/layout/LoadingRings.d.cts.map +1 -0
  178. package/dist/layout/LoadingRings.d.ts +12 -0
  179. package/dist/layout/LoadingRings.d.ts.map +1 -0
  180. package/dist/layout/LoadingText.d.cts +13 -0
  181. package/dist/layout/LoadingText.d.cts.map +1 -0
  182. package/dist/layout/LoadingText.d.ts +13 -0
  183. package/dist/layout/LoadingText.d.ts.map +1 -0
  184. package/dist/layout/ModalWrapper.d.cts +48 -0
  185. package/dist/layout/ModalWrapper.d.cts.map +1 -0
  186. package/dist/layout/ModalWrapper.d.ts +48 -0
  187. package/dist/layout/ModalWrapper.d.ts.map +1 -0
  188. package/dist/layout/NetworkStatusToaster.d.cts +39 -0
  189. package/dist/layout/NetworkStatusToaster.d.cts.map +1 -0
  190. package/dist/layout/NetworkStatusToaster.d.ts +39 -0
  191. package/dist/layout/NetworkStatusToaster.d.ts.map +1 -0
  192. package/dist/layout/ScrollableGradientContainer.d.cts +28 -0
  193. package/dist/layout/ScrollableGradientContainer.d.cts.map +1 -0
  194. package/dist/layout/ScrollableGradientContainer.d.ts +28 -0
  195. package/dist/layout/ScrollableGradientContainer.d.ts.map +1 -0
  196. package/dist/layout/Skeleton.d.cts +9 -0
  197. package/dist/layout/Skeleton.d.cts.map +1 -0
  198. package/dist/layout/Skeleton.d.ts +9 -0
  199. package/dist/layout/Skeleton.d.ts.map +1 -0
  200. package/dist/layout/Table.d.cts +9 -0
  201. package/dist/layout/Table.d.cts.map +1 -0
  202. package/dist/layout/Table.d.ts +9 -0
  203. package/dist/layout/Table.d.ts.map +1 -0
  204. package/dist/layout/index.cjs +743 -3
  205. package/dist/layout/index.cjs.map +1 -1
  206. package/dist/layout/index.d.cts +12 -0
  207. package/dist/layout/index.d.cts.map +1 -1
  208. package/dist/layout/index.d.ts +12 -0
  209. package/dist/layout/index.d.ts.map +1 -1
  210. package/dist/layout/index.js +724 -2
  211. package/dist/layout/index.js.map +1 -1
  212. package/dist/layout/layout-icons.d.cts +6 -0
  213. package/dist/layout/layout-icons.d.cts.map +1 -0
  214. package/dist/layout/layout-icons.d.ts +6 -0
  215. package/dist/layout/layout-icons.d.ts.map +1 -0
  216. package/dist/lib/dropdown-position.d.cts +33 -0
  217. package/dist/lib/dropdown-position.d.cts.map +1 -0
  218. package/dist/lib/dropdown-position.d.ts +33 -0
  219. package/dist/lib/dropdown-position.d.ts.map +1 -0
  220. package/dist/lib/focus.d.cts +3 -0
  221. package/dist/lib/focus.d.cts.map +1 -0
  222. package/dist/lib/focus.d.ts +3 -0
  223. package/dist/lib/focus.d.ts.map +1 -0
  224. package/dist/lib/icon-registry.d.cts +14 -0
  225. package/dist/lib/icon-registry.d.cts.map +1 -0
  226. package/dist/lib/icon-registry.d.ts +14 -0
  227. package/dist/lib/icon-registry.d.ts.map +1 -0
  228. package/dist/lib/mergeRefs.d.cts +10 -0
  229. package/dist/lib/mergeRefs.d.cts.map +1 -0
  230. package/dist/lib/mergeRefs.d.ts +10 -0
  231. package/dist/lib/mergeRefs.d.ts.map +1 -0
  232. package/dist/lib/scrollRowIntoView.d.cts +7 -0
  233. package/dist/lib/scrollRowIntoView.d.cts.map +1 -0
  234. package/dist/lib/scrollRowIntoView.d.ts +7 -0
  235. package/dist/lib/scrollRowIntoView.d.ts.map +1 -0
  236. package/dist/lib/typeahead.d.cts +21 -0
  237. package/dist/lib/typeahead.d.cts.map +1 -0
  238. package/dist/lib/typeahead.d.ts +21 -0
  239. package/dist/lib/typeahead.d.ts.map +1 -0
  240. package/dist/lib/useAnchoredBox.d.cts +26 -0
  241. package/dist/lib/useAnchoredBox.d.cts.map +1 -0
  242. package/dist/lib/useAnchoredBox.d.ts +26 -0
  243. package/dist/lib/useAnchoredBox.d.ts.map +1 -0
  244. package/dist/lib/useDismiss.d.cts +34 -0
  245. package/dist/lib/useDismiss.d.cts.map +1 -0
  246. package/dist/lib/useDismiss.d.ts +34 -0
  247. package/dist/lib/useDismiss.d.ts.map +1 -0
  248. package/dist/lib/useFocusTrap.d.cts +24 -0
  249. package/dist/lib/useFocusTrap.d.cts.map +1 -0
  250. package/dist/lib/useFocusTrap.d.ts +24 -0
  251. package/dist/lib/useFocusTrap.d.ts.map +1 -0
  252. package/dist/lib/useIsClient.d.cts +7 -0
  253. package/dist/lib/useIsClient.d.cts.map +1 -0
  254. package/dist/lib/useIsClient.d.ts +7 -0
  255. package/dist/lib/useIsClient.d.ts.map +1 -0
  256. package/dist/lib/usePrefersReducedMotion.d.cts +7 -0
  257. package/dist/lib/usePrefersReducedMotion.d.cts.map +1 -0
  258. package/dist/lib/usePrefersReducedMotion.d.ts +7 -0
  259. package/dist/lib/usePrefersReducedMotion.d.ts.map +1 -0
  260. package/dist/lib/useScrollLock.d.cts +7 -0
  261. package/dist/lib/useScrollLock.d.cts.map +1 -0
  262. package/dist/lib/useScrollLock.d.ts +7 -0
  263. package/dist/lib/useScrollLock.d.ts.map +1 -0
  264. package/dist/lib/useScrollable.d.cts +17 -0
  265. package/dist/lib/useScrollable.d.cts.map +1 -0
  266. package/dist/lib/useScrollable.d.ts +17 -0
  267. package/dist/lib/useScrollable.d.ts.map +1 -0
  268. package/dist/loading-screen/LoadingScreen.d.cts +21 -0
  269. package/dist/loading-screen/LoadingScreen.d.cts.map +1 -0
  270. package/dist/loading-screen/LoadingScreen.d.ts +21 -0
  271. package/dist/loading-screen/LoadingScreen.d.ts.map +1 -0
  272. package/dist/loading-screen/Teddy.d.cts +10 -0
  273. package/dist/loading-screen/Teddy.d.cts.map +1 -0
  274. package/dist/loading-screen/Teddy.d.ts +10 -0
  275. package/dist/loading-screen/Teddy.d.ts.map +1 -0
  276. package/dist/loading-screen/WakeUpProgress.d.cts +16 -0
  277. package/dist/loading-screen/WakeUpProgress.d.cts.map +1 -0
  278. package/dist/loading-screen/WakeUpProgress.d.ts +16 -0
  279. package/dist/loading-screen/WakeUpProgress.d.ts.map +1 -0
  280. package/dist/loading-screen/beauty-facts.d.cts +4 -0
  281. package/dist/loading-screen/beauty-facts.d.cts.map +1 -0
  282. package/dist/loading-screen/beauty-facts.d.ts +4 -0
  283. package/dist/loading-screen/beauty-facts.d.ts.map +1 -0
  284. package/dist/loading-screen/index.cjs +405 -0
  285. package/dist/loading-screen/index.cjs.map +1 -0
  286. package/dist/loading-screen/index.d.cts +5 -0
  287. package/dist/loading-screen/index.d.cts.map +1 -0
  288. package/dist/loading-screen/index.d.ts +5 -0
  289. package/dist/loading-screen/index.d.ts.map +1 -0
  290. package/dist/loading-screen/index.js +400 -0
  291. package/dist/loading-screen/index.js.map +1 -0
  292. package/dist/loading-screen/loading-screen-icons.d.cts +6 -0
  293. package/dist/loading-screen/loading-screen-icons.d.cts.map +1 -0
  294. package/dist/loading-screen/loading-screen-icons.d.ts +6 -0
  295. package/dist/loading-screen/loading-screen-icons.d.ts.map +1 -0
  296. package/dist/media/MediaCarousel.d.cts +30 -0
  297. package/dist/media/MediaCarousel.d.cts.map +1 -0
  298. package/dist/media/MediaCarousel.d.ts +30 -0
  299. package/dist/media/MediaCarousel.d.ts.map +1 -0
  300. package/dist/media/MediaCarouselWithModal.d.cts +17 -0
  301. package/dist/media/MediaCarouselWithModal.d.cts.map +1 -0
  302. package/dist/media/MediaCarouselWithModal.d.ts +17 -0
  303. package/dist/media/MediaCarouselWithModal.d.ts.map +1 -0
  304. package/dist/media/MediaCarouselWithParentMedia.d.cts +30 -0
  305. package/dist/media/MediaCarouselWithParentMedia.d.cts.map +1 -0
  306. package/dist/media/MediaCarouselWithParentMedia.d.ts +30 -0
  307. package/dist/media/MediaCarouselWithParentMedia.d.ts.map +1 -0
  308. package/dist/media/MediaModal.d.cts +27 -0
  309. package/dist/media/MediaModal.d.cts.map +1 -0
  310. package/dist/media/MediaModal.d.ts +27 -0
  311. package/dist/media/MediaModal.d.ts.map +1 -0
  312. package/dist/media/VideoPlayer.d.cts +37 -0
  313. package/dist/media/VideoPlayer.d.cts.map +1 -0
  314. package/dist/media/VideoPlayer.d.ts +37 -0
  315. package/dist/media/VideoPlayer.d.ts.map +1 -0
  316. package/dist/media/captureVideoPoster.d.cts +20 -0
  317. package/dist/media/captureVideoPoster.d.cts.map +1 -0
  318. package/dist/media/captureVideoPoster.d.ts +20 -0
  319. package/dist/media/captureVideoPoster.d.ts.map +1 -0
  320. package/dist/media/index.cjs +613 -0
  321. package/dist/media/index.cjs.map +1 -0
  322. package/dist/media/index.d.cts +8 -0
  323. package/dist/media/index.d.cts.map +1 -0
  324. package/dist/media/index.d.ts +8 -0
  325. package/dist/media/index.d.ts.map +1 -0
  326. package/dist/media/index.js +605 -0
  327. package/dist/media/index.js.map +1 -0
  328. package/dist/media/labels.d.cts +33 -0
  329. package/dist/media/labels.d.cts.map +1 -0
  330. package/dist/media/labels.d.ts +33 -0
  331. package/dist/media/labels.d.ts.map +1 -0
  332. package/dist/media/media-icons.d.cts +6 -0
  333. package/dist/media/media-icons.d.cts.map +1 -0
  334. package/dist/media/media-icons.d.ts +6 -0
  335. package/dist/media/media-icons.d.ts.map +1 -0
  336. package/dist/media/streaming.d.cts +18 -0
  337. package/dist/media/streaming.d.cts.map +1 -0
  338. package/dist/media/streaming.d.ts +18 -0
  339. package/dist/media/streaming.d.ts.map +1 -0
  340. package/dist/resend/index.cjs +5 -28
  341. package/dist/resend/index.cjs.map +1 -1
  342. package/dist/resend/index.js +1 -24
  343. package/dist/resend/index.js.map +1 -1
  344. package/dist/static-page/StaticPage.d.cts +91 -0
  345. package/dist/static-page/StaticPage.d.cts.map +1 -0
  346. package/dist/static-page/StaticPage.d.ts +91 -0
  347. package/dist/static-page/StaticPage.d.ts.map +1 -0
  348. package/dist/static-page/index.cjs +247 -0
  349. package/dist/static-page/index.cjs.map +1 -0
  350. package/dist/static-page/index.d.cts +2 -0
  351. package/dist/static-page/index.d.cts.map +1 -0
  352. package/dist/static-page/index.d.ts +2 -0
  353. package/dist/static-page/index.d.ts.map +1 -0
  354. package/dist/static-page/index.js +235 -0
  355. package/dist/static-page/index.js.map +1 -0
  356. package/dist/static-page/static-page-icons.d.cts +6 -0
  357. package/dist/static-page/static-page-icons.d.cts.map +1 -0
  358. package/dist/static-page/static-page-icons.d.ts +6 -0
  359. package/dist/static-page/static-page-icons.d.ts.map +1 -0
  360. package/dist/testimonials/TestimonialCarousel.d.cts +40 -0
  361. package/dist/testimonials/TestimonialCarousel.d.cts.map +1 -0
  362. package/dist/testimonials/TestimonialCarousel.d.ts +40 -0
  363. package/dist/testimonials/TestimonialCarousel.d.ts.map +1 -0
  364. package/dist/testimonials/index.cjs +246 -0
  365. package/dist/testimonials/index.cjs.map +1 -0
  366. package/dist/testimonials/index.d.cts +2 -0
  367. package/dist/testimonials/index.d.cts.map +1 -0
  368. package/dist/testimonials/index.d.ts +2 -0
  369. package/dist/testimonials/index.d.ts.map +1 -0
  370. package/dist/testimonials/index.js +244 -0
  371. package/dist/testimonials/index.js.map +1 -0
  372. package/dist/testimonials/testimonials-icons.d.cts +6 -0
  373. package/dist/testimonials/testimonials-icons.d.cts.map +1 -0
  374. package/dist/testimonials/testimonials-icons.d.ts +6 -0
  375. package/dist/testimonials/testimonials-icons.d.ts.map +1 -0
  376. package/dist/toast/index.cjs +2 -38
  377. package/dist/toast/index.cjs.map +1 -1
  378. package/dist/toast/index.js +1 -37
  379. package/dist/toast/index.js.map +1 -1
  380. package/package.json +67 -1
@@ -0,0 +1,235 @@
1
+ import { addCollection, Icon } from '@iconify/react';
2
+ import { useId } from 'react';
3
+ import { GradientText } from '@beautinique/frontend-components/ui';
4
+ import { jsx, jsxs } from 'react/jsx-runtime';
5
+
6
+ var __defProp = Object.defineProperty;
7
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
+ var createIconRegistry = /* @__PURE__ */ __name((sets) => {
9
+ let registered = false;
10
+ return {
11
+ register: /* @__PURE__ */ __name(() => {
12
+ if (registered) return;
13
+ for (const set of sets) addCollection(set);
14
+ registered = true;
15
+ }, "register"),
16
+ names: sets.flatMap(
17
+ ({ prefix, icons, aliases }) => [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`)
18
+ )
19
+ };
20
+ }, "createIconRegistry");
21
+
22
+ // src/static-page/static-page-icons.ts
23
+ var ICON_SETS = [
24
+ {
25
+ prefix: "solar",
26
+ width: 24,
27
+ height: 24,
28
+ icons: {
29
+ "calendar-mark-linear": {
30
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M2 12C2 8.22876 2 6.34315 3.17157 5.17157C4.34315 4 6.22876 4 10 4H14C17.7712 4 19.6569 4 20.8284 5.17157C22 6.34315 22 8.22876 22 12V14C22 17.7712 22 19.6569 20.8284 20.8284C19.6569 22 17.7712 22 14 22H10C6.22876 22 4.34315 22 3.17157 20.8284C2 19.6569 2 17.7712 2 14V12Z"/><path d="M7 4V2.5"/><path d="M17 4V2.5"/><circle cx="16.5" cy="16.5" r="1.5"/><path d="M2.5 9H21.5"/></g>'
31
+ },
32
+ "check-circle-linear": {
33
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><circle cx="12" cy="12" r="10"/><path stroke-linejoin="round" d="M8.5 12.5L10.5 14.5L15.5 9.5"/></g>'
34
+ },
35
+ "danger-triangle-linear": {
36
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M5.31171 10.7615C8.23007 5.58716 9.68925 3 12 3C14.3107 3 15.7699 5.58716 18.6883 10.7615L19.0519 11.4063C21.4771 15.7061 22.6897 17.856 21.5937 19.428C20.4978 21 17.7864 21 12.3637 21H11.6363C6.21356 21 3.50217 21 2.40626 19.428C1.31034 17.856 2.52291 15.7061 4.94805 11.4063L5.31171 10.7615Z"/><path d="M12 8V13"/><path stroke-linejoin="round" d="M12 16H12.0001"/></g>'
37
+ },
38
+ "letter-linear": {
39
+ body: '<g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="1.5"><path d="M2 12C2 8.22876 2 6.34315 3.17157 5.17157C4.34315 4 6.22876 4 10 4H14C17.7712 4 19.6569 4 20.8284 5.17157C22 6.34315 22 8.22876 22 12C22 15.7712 22 17.6569 20.8284 18.8284C19.6569 20 17.7712 20 14 20H10C6.22876 20 4.34315 20 3.17157 18.8284C2 17.6569 2 15.7712 2 12Z"/><path d="M6 8L8.1589 9.79908C9.99553 11.3296 10.9139 12.0949 12 12.0949C13.0861 12.0949 14.0045 11.3296 15.8411 9.79908L18 8"/></g>'
40
+ }
41
+ }
42
+ }
43
+ ];
44
+ var { register: registerStaticPageIcons, names: STATIC_PAGE_ICON_NAMES } = createIconRegistry(ICON_SETS);
45
+ var StaticPageLayout = /* @__PURE__ */ __name(({ children }) => /* @__PURE__ */ jsx("div", { className: "mx-auto flex w-full max-w-4xl flex-col gap-10 px-4 py-10 sm:px-6 sm:py-14", children }), "StaticPageLayout");
46
+ var StaticPageHeader = /* @__PURE__ */ __name(({ icon, title, description, meta }) => /* @__PURE__ */ jsxs("header", { className: "flex flex-col items-center gap-4 text-center", children: [
47
+ /* @__PURE__ */ jsx(
48
+ "span",
49
+ {
50
+ "aria-hidden": "true",
51
+ className: "bg-accent-duo flex size-16 items-center justify-center rounded-full shadow-lg sm:size-20",
52
+ children: /* @__PURE__ */ jsx(Icon, { icon, className: "size-8 text-white sm:size-10" })
53
+ }
54
+ ),
55
+ /* @__PURE__ */ jsx(
56
+ GradientText,
57
+ {
58
+ as: "h1",
59
+ type: "accent",
60
+ text: title,
61
+ className: "text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl"
62
+ }
63
+ ),
64
+ /* @__PURE__ */ jsx("p", { className: "text-secondary max-w-2xl text-sm sm:text-base", children: description }),
65
+ meta
66
+ ] }), "StaticPageHeader");
67
+ var LastUpdatedBadge = /* @__PURE__ */ __name(({
68
+ date,
69
+ label = "Last updated",
70
+ locale = "en-US"
71
+ }) => {
72
+ registerStaticPageIcons();
73
+ const value = new Date(date);
74
+ if (Number.isNaN(value.getTime())) return null;
75
+ return /* @__PURE__ */ jsxs("span", { className: "text-primary/50 flex items-center gap-1 text-xs sm:text-sm", children: [
76
+ /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", icon: "solar:calendar-mark-linear", className: "size-3.5" }),
77
+ label,
78
+ " ",
79
+ /* @__PURE__ */ jsx("time", { dateTime: value.toISOString().slice(0, 10), children: new Intl.DateTimeFormat(locale, { dateStyle: "medium", timeZone: "UTC" }).format(value) })
80
+ ] });
81
+ }, "LastUpdatedBadge");
82
+ var StaticPageSection = /* @__PURE__ */ __name(({ title, children, className = "gap-4" }) => {
83
+ const titleId = useId();
84
+ return /* @__PURE__ */ jsxs("section", { "aria-labelledby": title ? titleId : void 0, className: `flex flex-col ${className}`, children: [
85
+ title && /* @__PURE__ */ jsx(
86
+ GradientText,
87
+ {
88
+ as: "h2",
89
+ id: titleId,
90
+ type: "accent",
91
+ text: title,
92
+ className: "text-xl font-semibold sm:text-2xl"
93
+ }
94
+ ),
95
+ children
96
+ ] });
97
+ }, "StaticPageSection");
98
+ var InfoCard = /* @__PURE__ */ __name(({ icon, title, description }) => /* @__PURE__ */ jsxs("div", { className: "border-primary/10 bg-secondary-invert hover:border-primary/20 flex items-start gap-3 rounded-xl border p-4 transition-colors motion-reduce:transition-none", children: [
99
+ /* @__PURE__ */ jsx(
100
+ "span",
101
+ {
102
+ "aria-hidden": "true",
103
+ className: "bg-accent-duo flex size-9 shrink-0 items-center justify-center rounded-lg",
104
+ children: /* @__PURE__ */ jsx(Icon, { icon, className: "size-5 text-white" })
105
+ }
106
+ ),
107
+ /* @__PURE__ */ jsxs("div", { children: [
108
+ /* @__PURE__ */ jsx("h3", { className: "text-primary text-sm font-semibold sm:text-base", children: title }),
109
+ /* @__PURE__ */ jsx("p", { className: "text-secondary text-xs sm:text-sm", children: description })
110
+ ] })
111
+ ] }), "InfoCard");
112
+ var InfoCardGrid = /* @__PURE__ */ __name(({ items, columns = 2 }) => /* @__PURE__ */ jsx("div", { className: `grid grid-cols-1 gap-4 ${columns === 3 ? "sm:grid-cols-3" : "sm:grid-cols-2"}`, children: items.map((item) => /* @__PURE__ */ jsx(InfoCard, { ...item }, item.title)) }), "InfoCardGrid");
113
+ var Checklist = /* @__PURE__ */ __name(({
114
+ items,
115
+ icon = "solar:check-circle-linear",
116
+ iconClassName = "text-primary-green"
117
+ }) => {
118
+ registerStaticPageIcons();
119
+ return /* @__PURE__ */ jsx("ul", { className: "flex flex-col gap-3", children: items.map((item) => /* @__PURE__ */ jsxs(
120
+ "li",
121
+ {
122
+ className: "border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-3 sm:p-4",
123
+ children: [
124
+ /* @__PURE__ */ jsx(
125
+ Icon,
126
+ {
127
+ "aria-hidden": "true",
128
+ icon,
129
+ className: `mt-0.5 size-4.5 shrink-0 ${iconClassName}`
130
+ }
131
+ ),
132
+ /* @__PURE__ */ jsx("span", { className: "text-secondary text-xs sm:text-sm", children: item })
133
+ ]
134
+ },
135
+ item
136
+ )) });
137
+ }, "Checklist");
138
+ var HighlightNote = /* @__PURE__ */ __name(({
139
+ icon = "solar:danger-triangle-linear",
140
+ title,
141
+ children
142
+ }) => {
143
+ registerStaticPageIcons();
144
+ const titleId = useId();
145
+ return /* @__PURE__ */ jsxs(
146
+ "div",
147
+ {
148
+ role: "note",
149
+ "aria-labelledby": titleId,
150
+ className: "border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-4 sm:p-5",
151
+ children: [
152
+ /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", icon, className: "text-primary/60 mt-0.5 size-5 shrink-0" }),
153
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
154
+ /* @__PURE__ */ jsx("p", { id: titleId, className: "text-primary text-sm font-semibold sm:text-base", children: title }),
155
+ /* @__PURE__ */ jsx("p", { className: "text-secondary text-xs leading-relaxed sm:text-sm", children })
156
+ ] })
157
+ ]
158
+ }
159
+ );
160
+ }, "HighlightNote");
161
+ var NumberedSteps = /* @__PURE__ */ __name(({ steps }) => (
162
+ // `list-none` takes the list away for some screen readers; `role="list"` gives it back
163
+ /* @__PURE__ */ jsx("ol", { role: "list", className: "flex list-none flex-col gap-3", children: steps.map((step, index) => /* @__PURE__ */ jsxs(
164
+ "li",
165
+ {
166
+ className: "border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-4",
167
+ children: [
168
+ /* @__PURE__ */ jsx(
169
+ "span",
170
+ {
171
+ "aria-hidden": "true",
172
+ className: "bg-accent-duo flex size-7 shrink-0 items-center justify-center rounded-full text-xs font-semibold text-white",
173
+ children: index + 1
174
+ }
175
+ ),
176
+ /* @__PURE__ */ jsxs("div", { children: [
177
+ /* @__PURE__ */ jsx("p", { className: "text-primary text-sm font-semibold sm:text-base", children: step.title }),
178
+ /* @__PURE__ */ jsx("p", { className: "text-secondary text-xs sm:text-sm", children: step.description })
179
+ ] })
180
+ ]
181
+ },
182
+ step.title
183
+ )) })
184
+ ), "NumberedSteps");
185
+ var StaticPageCTA = /* @__PURE__ */ __name(({
186
+ title,
187
+ description,
188
+ actions,
189
+ footer,
190
+ layout = "row",
191
+ className = ""
192
+ }) => {
193
+ const titleId = useId();
194
+ return /* @__PURE__ */ jsxs(
195
+ "section",
196
+ {
197
+ "aria-labelledby": titleId,
198
+ className: `border-primary/10 bg-secondary-invert flex flex-col gap-4 rounded-2xl border p-4 sm:p-6 ${className}`,
199
+ children: [
200
+ /* @__PURE__ */ jsxs(
201
+ "div",
202
+ {
203
+ className: `flex flex-col gap-4 ${layout === "row" ? "items-start justify-between sm:flex-row sm:items-center" : ""}`,
204
+ children: [
205
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
206
+ /* @__PURE__ */ jsx("h2", { id: titleId, className: "text-primary text-base font-semibold sm:text-lg", children: title }),
207
+ /* @__PURE__ */ jsx("p", { className: "text-secondary text-xs sm:text-sm", children: description })
208
+ ] }),
209
+ actions
210
+ ]
211
+ }
212
+ ),
213
+ footer
214
+ ]
215
+ }
216
+ );
217
+ }, "StaticPageCTA");
218
+ var EmailUsAction = /* @__PURE__ */ __name(({ email, children }) => {
219
+ registerStaticPageIcons();
220
+ return /* @__PURE__ */ jsxs(
221
+ "a",
222
+ {
223
+ href: `mailto:${email}`,
224
+ className: "border-primary/20 hover:bg-primary-invert/60 text-primary flex shrink-0 items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c motion-reduce:transition-none",
225
+ children: [
226
+ /* @__PURE__ */ jsx(Icon, { "aria-hidden": "true", icon: "solar:letter-linear", className: "size-4.5" }),
227
+ children ?? email
228
+ ]
229
+ }
230
+ );
231
+ }, "EmailUsAction");
232
+
233
+ export { Checklist, EmailUsAction, HighlightNote, InfoCard, InfoCardGrid, LastUpdatedBadge, NumberedSteps, StaticPageCTA, StaticPageHeader, StaticPageLayout, StaticPageSection };
234
+ //# sourceMappingURL=index.js.map
235
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/icon-registry.ts","../../src/static-page/static-page-icons.ts","../../src/static-page/StaticPage.tsx"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { addCollection, type IconifyJSON } from '@iconify/react';\n\n/**\n * Makes the registration of a bundled icon set: `register` puts the sets in Iconify (once, calling it\n * again does nothing) and `names` lists every icon, e.g. `solar:info-circle-linear`.\n *\n * A component calls `register` when it renders, not when its file is imported: an app that never\n * renders the component never runs it, and nothing depends on the bundler keeping an import that is\n * only there for its effect (the build says \"ignored-bare-import\" for those).\n */\nexport const createIconRegistry = (sets: readonly IconifyJSON[]) => {\n let registered = false;\n\n return {\n register: () => {\n if (registered) return;\n\n for (const set of sets) addCollection(set);\n registered = true;\n },\n names: sets.flatMap(({ prefix, icons, aliases }) =>\n [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`),\n ),\n };\n};\n","import type { IconifyJSON } from '@iconify/react';\n\nimport { createIconRegistry } from '../lib/icon-registry.js';\n\n/*\n * The icons of the parts of a static page, 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 'calendar-mark-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M2 12C2 8.22876 2 6.34315 3.17157 5.17157C4.34315 4 6.22876 4 10 4H14C17.7712 4 19.6569 4 20.8284 5.17157C22 6.34315 22 8.22876 22 12V14C22 17.7712 22 19.6569 20.8284 20.8284C19.6569 22 17.7712 22 14 22H10C6.22876 22 4.34315 22 3.17157 20.8284C2 19.6569 2 17.7712 2 14V12Z\"/><path d=\"M7 4V2.5\"/><path d=\"M17 4V2.5\"/><circle cx=\"16.5\" cy=\"16.5\" r=\"1.5\"/><path d=\"M2.5 9H21.5\"/></g>',\n },\n 'check-circle-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path stroke-linejoin=\"round\" d=\"M8.5 12.5L10.5 14.5L15.5 9.5\"/></g>',\n },\n 'danger-triangle-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M5.31171 10.7615C8.23007 5.58716 9.68925 3 12 3C14.3107 3 15.7699 5.58716 18.6883 10.7615L19.0519 11.4063C21.4771 15.7061 22.6897 17.856 21.5937 19.428C20.4978 21 17.7864 21 12.3637 21H11.6363C6.21356 21 3.50217 21 2.40626 19.428C1.31034 17.856 2.52291 15.7061 4.94805 11.4063L5.31171 10.7615Z\"/><path d=\"M12 8V13\"/><path stroke-linejoin=\"round\" d=\"M12 16H12.0001\"/></g>',\n },\n 'letter-linear': {\n body: '<g fill=\"none\" stroke=\"currentColor\" stroke-linecap=\"round\" stroke-width=\"1.5\"><path d=\"M2 12C2 8.22876 2 6.34315 3.17157 5.17157C4.34315 4 6.22876 4 10 4H14C17.7712 4 19.6569 4 20.8284 5.17157C22 6.34315 22 8.22876 22 12C22 15.7712 22 17.6569 20.8284 18.8284C19.6569 20 17.7712 20 14 20H10C6.22876 20 4.34315 20 3.17157 18.8284C2 17.6569 2 15.7712 2 12Z\"/><path d=\"M6 8L8.1589 9.79908C9.99553 11.3296 10.9139 12.0949 12 12.0949C13.0861 12.0949 14.0045 11.3296 15.8411 9.79908L18 8\"/></g>',\n },\n },\n },\n];\n\n/**\n * Registers the icons above with Iconify; the components of this entry call it when they render\n * (calling it again is harmless).\n */\nexport const { register: registerStaticPageIcons, names: STATIC_PAGE_ICON_NAMES } =\n createIconRegistry(ICON_SETS);\n","import { Icon } from '@iconify/react';\nimport { type ReactNode, useId } from 'react';\n\nimport type { IChildren, IClassName } from '../types/component.js';\nimport { GradientText } from '../ui/index.js';\nimport { registerStaticPageIcons } from './static-page-icons.js';\n\n/*\n * The parts of a page that is only content (company, legal and information pages): a header, some\n * sections, and a closing call to action, in the same column. The headings are real headings\n * (the page `h1`, each section `h2`, each card `h3`), the lists are lists, and the icons are decoration\n * that assistive technology skips. The icons are given by name: they come from the Iconify API unless\n * the app has them registered.\n */\n\n/** The column all the parts sit in. */\nexport const StaticPageLayout = ({ children }: IChildren) => (\n <div className=\"mx-auto flex w-full max-w-4xl flex-col gap-10 px-4 py-10 sm:px-6 sm:py-14\">\n {children}\n </div>\n);\n\nexport interface IStaticPageHeader {\n /** An icon of Iconify, in a circle above the title. */\n icon: string;\n /** The title of the page: it is the `h1`. */\n title: string;\n description: ReactNode;\n /** Something under the description, e.g. `LastUpdatedBadge`. */\n meta?: ReactNode;\n}\n\nexport const StaticPageHeader = ({ icon, title, description, meta }: IStaticPageHeader) => (\n <header className=\"flex flex-col items-center gap-4 text-center\">\n <span\n aria-hidden=\"true\"\n className=\"bg-accent-duo flex size-16 items-center justify-center rounded-full shadow-lg sm:size-20\"\n >\n <Icon icon={icon} className=\"size-8 text-white sm:size-10\" />\n </span>\n <GradientText\n as=\"h1\"\n type=\"accent\"\n text={title}\n className=\"text-3xl font-bold tracking-tight sm:text-4xl md:text-5xl\"\n />\n <p className=\"text-secondary max-w-2xl text-sm sm:text-base\">{description}</p>\n {meta}\n </header>\n);\n\nexport interface ILastUpdatedBadge {\n /** When the page was changed. */\n date: Date | string | number;\n /** @default 'Last updated' */\n label?: string;\n /** The language of the date. It is fixed (not the one of the machine) so a server and a browser write the same. @default 'en-US' */\n locale?: string;\n}\n\n/**\n * \"Last updated 15 Oct 2026\", with the date in a `<time>`. The day is the day of the date in UTC, so\n * it does not depend on where the page is drawn.\n */\nexport const LastUpdatedBadge = ({\n date,\n label = 'Last updated',\n locale = 'en-US',\n}: ILastUpdatedBadge) => {\n registerStaticPageIcons();\n\n const value = new Date(date);\n\n if (Number.isNaN(value.getTime())) return null;\n\n return (\n <span className=\"text-primary/50 flex items-center gap-1 text-xs sm:text-sm\">\n <Icon aria-hidden=\"true\" icon=\"solar:calendar-mark-linear\" className=\"size-3.5\" />\n {label}{' '}\n <time dateTime={value.toISOString().slice(0, 10)}>\n {new Intl.DateTimeFormat(locale, { dateStyle: 'medium', timeZone: 'UTC' }).format(value)}\n </time>\n </span>\n );\n};\n\nexport interface IStaticPageSection extends IClassName {\n /** The heading of the section: an `h2`. Without it the section has none. */\n title?: string;\n children: ReactNode;\n}\n\nexport const StaticPageSection = ({ title, children, className = 'gap-4' }: IStaticPageSection) => {\n const titleId = useId();\n\n return (\n <section aria-labelledby={title ? titleId : undefined} className={`flex flex-col ${className}`}>\n {title && (\n <GradientText\n as=\"h2\"\n id={titleId}\n type=\"accent\"\n text={title}\n className=\"text-xl font-semibold sm:text-2xl\"\n />\n )}\n {children}\n </section>\n );\n};\n\nexport interface IInfoCard {\n icon: string;\n /** A heading (an `h3`). */\n title: string;\n description: string;\n}\n\nexport const InfoCard = ({ icon, title, description }: IInfoCard) => (\n <div className=\"border-primary/10 bg-secondary-invert hover:border-primary/20 flex items-start gap-3 rounded-xl border p-4 transition-colors motion-reduce:transition-none\">\n <span\n aria-hidden=\"true\"\n className=\"bg-accent-duo flex size-9 shrink-0 items-center justify-center rounded-lg\"\n >\n <Icon icon={icon} className=\"size-5 text-white\" />\n </span>\n <div>\n <h3 className=\"text-primary text-sm font-semibold sm:text-base\">{title}</h3>\n <p className=\"text-secondary text-xs sm:text-sm\">{description}</p>\n </div>\n </div>\n);\n\nexport interface IInfoCardGrid {\n items: readonly IInfoCard[];\n /** How many cards in a row from `sm:` up. @default 2 */\n columns?: 2 | 3;\n}\n\nexport const InfoCardGrid = ({ items, columns = 2 }: IInfoCardGrid) => (\n <div className={`grid grid-cols-1 gap-4 ${columns === 3 ? 'sm:grid-cols-3' : 'sm:grid-cols-2'}`}>\n {items.map((item) => (\n <InfoCard key={item.title} {...item} />\n ))}\n </div>\n);\n\nexport interface IChecklist {\n items: readonly string[];\n /** @default 'solar:check-circle-linear' */\n icon?: string;\n iconClassName?: string;\n}\n\n/** Short statements in a list, each in its own bordered row with an icon. */\nexport const Checklist = ({\n items,\n icon = 'solar:check-circle-linear',\n iconClassName = 'text-primary-green',\n}: IChecklist) => {\n registerStaticPageIcons();\n\n return (\n <ul className=\"flex flex-col gap-3\">\n {items.map((item) => (\n <li\n key={item}\n className=\"border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-3 sm:p-4\"\n >\n <Icon\n aria-hidden=\"true\"\n icon={icon}\n className={`mt-0.5 size-4.5 shrink-0 ${iconClassName}`}\n />\n <span className=\"text-secondary text-xs sm:text-sm\">{item}</span>\n </li>\n ))}\n </ul>\n );\n};\n\nexport interface IHighlightNote {\n /** @default 'solar:danger-triangle-linear' */\n icon?: string;\n title: string;\n children: ReactNode;\n}\n\n/** A note that stands out: an icon beside a title and a text. It is a `note`, named by its title. */\nexport const HighlightNote = ({\n icon = 'solar:danger-triangle-linear',\n title,\n children,\n}: IHighlightNote) => {\n registerStaticPageIcons();\n\n const titleId = useId();\n\n return (\n <div\n role=\"note\"\n aria-labelledby={titleId}\n className=\"border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-4 sm:p-5\"\n >\n <Icon aria-hidden=\"true\" icon={icon} className=\"text-primary/60 mt-0.5 size-5 shrink-0\" />\n <div className=\"flex flex-col gap-1.5\">\n <p id={titleId} className=\"text-primary text-sm font-semibold sm:text-base\">\n {title}\n </p>\n <p className=\"text-secondary text-xs leading-relaxed sm:text-sm\">{children}</p>\n </div>\n </div>\n );\n};\n\nexport interface INumberedStep {\n title: string;\n description: string;\n}\n\nexport interface INumberedSteps {\n steps: readonly INumberedStep[];\n}\n\n/** The steps of a process in an ordered list, each with its number. */\nexport const NumberedSteps = ({ steps }: INumberedSteps) => (\n // `list-none` takes the list away for some screen readers; `role=\"list\"` gives it back\n <ol role=\"list\" className=\"flex list-none flex-col gap-3\">\n {steps.map((step, index) => (\n <li\n key={step.title}\n className=\"border-primary/10 bg-secondary-invert flex items-start gap-3 rounded-xl border p-4\"\n >\n <span\n aria-hidden=\"true\"\n className=\"bg-accent-duo flex size-7 shrink-0 items-center justify-center rounded-full text-xs font-semibold text-white\"\n >\n {index + 1}\n </span>\n <div>\n <p className=\"text-primary text-sm font-semibold sm:text-base\">{step.title}</p>\n <p className=\"text-secondary text-xs sm:text-sm\">{step.description}</p>\n </div>\n </li>\n ))}\n </ol>\n);\n\nexport interface IStaticPageCTA extends IClassName {\n /** The heading of the block: an `h2`. */\n title: string;\n description: ReactNode;\n /** The buttons or links. */\n actions: ReactNode;\n footer?: ReactNode;\n /** `'row'` puts the text and the actions side by side from `sm:` up; `'stack'` keeps them stacked. @default 'row' */\n layout?: 'row' | 'stack';\n}\n\n/** The closing block of a page (\"Get in touch\"): a heading, a text and the actions. */\nexport const StaticPageCTA = ({\n title,\n description,\n actions,\n footer,\n layout = 'row',\n className = '',\n}: IStaticPageCTA) => {\n const titleId = useId();\n\n return (\n <section\n aria-labelledby={titleId}\n className={`border-primary/10 bg-secondary-invert flex flex-col gap-4 rounded-2xl border p-4 sm:p-6 ${className}`}\n >\n <div\n className={`flex flex-col gap-4 ${\n layout === 'row' ? 'items-start justify-between sm:flex-row sm:items-center' : ''\n }`}\n >\n <div className=\"flex flex-col gap-1\">\n <h2 id={titleId} className=\"text-primary text-base font-semibold sm:text-lg\">\n {title}\n </h2>\n <p className=\"text-secondary text-xs sm:text-sm\">{description}</p>\n </div>\n {actions}\n </div>\n {footer}\n </section>\n );\n};\n\nexport interface IEmailUsAction {\n /** The address; it is also the text, unless `children` says another. */\n email: string;\n children?: ReactNode;\n}\n\n/** A pill that writes an e-mail to an address: the usual action of `StaticPageCTA`. */\nexport const EmailUsAction = ({ email, children }: IEmailUsAction) => {\n registerStaticPageIcons();\n\n return (\n <a\n href={`mailto:${email}`}\n className=\"border-primary/20 hover:bg-primary-invert/60 text-primary flex shrink-0 items-center gap-2 rounded-lg border px-4 py-2.5 text-sm font-medium transition-colors focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-blue-crayola-c motion-reduce:transition-none\"\n >\n <Icon aria-hidden=\"true\" icon=\"solar:letter-linear\" className=\"size-4.5\" />\n {children ?? email}\n </a>\n );\n};\n"]}
@@ -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 registerStaticPageIcons: () => void, STATIC_PAGE_ICON_NAMES: string[];
6
+ //# sourceMappingURL=static-page-icons.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-page-icons.d.cts","sourceRoot":"","sources":["../../src/static-page/static-page-icons.ts"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,eAAO,MAAkB,uBAAuB,cAAS,sBAAsB,UAChD,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 registerStaticPageIcons: () => void, STATIC_PAGE_ICON_NAMES: string[];
6
+ //# sourceMappingURL=static-page-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-page-icons.d.ts","sourceRoot":"","sources":["../../src/static-page/static-page-icons.ts"],"names":[],"mappings":"AA+BA;;;GAGG;AACH,eAAO,MAAkB,uBAAuB,cAAS,sBAAsB,UAChD,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