@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.
- package/README.md +225 -16
- package/dist/auth/SocialAuth.d.cts +33 -0
- package/dist/auth/SocialAuth.d.cts.map +1 -0
- package/dist/auth/SocialAuth.d.ts +33 -0
- package/dist/auth/SocialAuth.d.ts.map +1 -0
- package/dist/auth/index.cjs +34 -26
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.d.cts +1 -0
- package/dist/auth/index.d.cts.map +1 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +32 -25
- package/dist/auth/index.js.map +1 -1
- package/dist/breadcrumb/Breadcrumb.d.cts +34 -0
- package/dist/breadcrumb/Breadcrumb.d.cts.map +1 -0
- package/dist/breadcrumb/Breadcrumb.d.ts +34 -0
- package/dist/breadcrumb/Breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb/breadcrumb-icons.d.cts +6 -0
- package/dist/breadcrumb/breadcrumb-icons.d.cts.map +1 -0
- package/dist/breadcrumb/breadcrumb-icons.d.ts +6 -0
- package/dist/breadcrumb/breadcrumb-icons.d.ts.map +1 -0
- package/dist/breadcrumb/getBreadcrumbItems.d.cts +16 -0
- package/dist/breadcrumb/getBreadcrumbItems.d.cts.map +1 -0
- package/dist/breadcrumb/getBreadcrumbItems.d.ts +16 -0
- package/dist/breadcrumb/getBreadcrumbItems.d.ts.map +1 -0
- package/dist/breadcrumb/index.cjs +110 -0
- package/dist/breadcrumb/index.cjs.map +1 -0
- package/dist/breadcrumb/index.d.cts +3 -0
- package/dist/breadcrumb/index.d.cts.map +1 -0
- package/dist/breadcrumb/index.d.ts +3 -0
- package/dist/breadcrumb/index.d.ts.map +1 -0
- package/dist/breadcrumb/index.js +107 -0
- package/dist/breadcrumb/index.js.map +1 -0
- package/dist/color-input/ColorInput.d.cts +33 -0
- package/dist/color-input/ColorInput.d.cts.map +1 -0
- package/dist/color-input/ColorInput.d.ts +33 -0
- package/dist/color-input/ColorInput.d.ts.map +1 -0
- package/dist/color-input/color-input-icons.d.cts +6 -0
- package/dist/color-input/color-input-icons.d.cts.map +1 -0
- package/dist/color-input/color-input-icons.d.ts +6 -0
- package/dist/color-input/color-input-icons.d.ts.map +1 -0
- package/dist/color-input/color.d.cts +10 -0
- package/dist/color-input/color.d.cts.map +1 -0
- package/dist/color-input/color.d.ts +10 -0
- package/dist/color-input/color.d.ts.map +1 -0
- package/dist/color-input/index.cjs +375 -0
- package/dist/color-input/index.cjs.map +1 -0
- package/dist/color-input/index.d.cts +2 -0
- package/dist/color-input/index.d.cts.map +1 -0
- package/dist/color-input/index.d.ts +2 -0
- package/dist/color-input/index.d.ts.map +1 -0
- package/dist/color-input/index.js +373 -0
- package/dist/color-input/index.js.map +1 -0
- package/dist/file-input/FileInput.d.cts +53 -0
- package/dist/file-input/FileInput.d.cts.map +1 -0
- package/dist/file-input/FileInput.d.ts +53 -0
- package/dist/file-input/FileInput.d.ts.map +1 -0
- package/dist/file-input/file-input-icons.d.cts +6 -0
- package/dist/file-input/file-input-icons.d.cts.map +1 -0
- package/dist/file-input/file-input-icons.d.ts +6 -0
- package/dist/file-input/file-input-icons.d.ts.map +1 -0
- package/dist/file-input/index.cjs +259 -0
- package/dist/file-input/index.cjs.map +1 -0
- package/dist/file-input/index.d.cts +3 -0
- package/dist/file-input/index.d.cts.map +1 -0
- package/dist/file-input/index.d.ts +3 -0
- package/dist/file-input/index.d.ts.map +1 -0
- package/dist/file-input/index.js +256 -0
- package/dist/file-input/index.js.map +1 -0
- package/dist/file-input/media-type.d.cts +8 -0
- package/dist/file-input/media-type.d.cts.map +1 -0
- package/dist/file-input/media-type.d.ts +8 -0
- package/dist/file-input/media-type.d.ts.map +1 -0
- package/dist/file-input/useObjectUrls.d.cts +10 -0
- package/dist/file-input/useObjectUrls.d.cts.map +1 -0
- package/dist/file-input/useObjectUrls.d.ts +10 -0
- package/dist/file-input/useObjectUrls.d.ts.map +1 -0
- package/dist/hierarchy-select/HierarchySelect.d.cts +58 -0
- package/dist/hierarchy-select/HierarchySelect.d.cts.map +1 -0
- package/dist/hierarchy-select/HierarchySelect.d.ts +58 -0
- package/dist/hierarchy-select/HierarchySelect.d.ts.map +1 -0
- package/dist/hierarchy-select/hierarchy-select-icons.d.cts +6 -0
- package/dist/hierarchy-select/hierarchy-select-icons.d.cts.map +1 -0
- package/dist/hierarchy-select/hierarchy-select-icons.d.ts +6 -0
- package/dist/hierarchy-select/hierarchy-select-icons.d.ts.map +1 -0
- package/dist/hierarchy-select/index.cjs +596 -0
- package/dist/hierarchy-select/index.cjs.map +1 -0
- package/dist/hierarchy-select/index.d.cts +2 -0
- package/dist/hierarchy-select/index.d.cts.map +1 -0
- package/dist/hierarchy-select/index.d.ts +2 -0
- package/dist/hierarchy-select/index.d.ts.map +1 -0
- package/dist/hierarchy-select/index.js +594 -0
- package/dist/hierarchy-select/index.js.map +1 -0
- package/dist/hierarchy-select/tree.d.cts +38 -0
- package/dist/hierarchy-select/tree.d.cts.map +1 -0
- package/dist/hierarchy-select/tree.d.ts +38 -0
- package/dist/hierarchy-select/tree.d.ts.map +1 -0
- package/dist/index.cjs +7 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/inputs/Checkbox.d.cts +21 -0
- package/dist/inputs/Checkbox.d.cts.map +1 -0
- package/dist/inputs/Checkbox.d.ts +21 -0
- package/dist/inputs/Checkbox.d.ts.map +1 -0
- package/dist/inputs/Input.d.cts +26 -0
- package/dist/inputs/Input.d.cts.map +1 -0
- package/dist/inputs/Input.d.ts +26 -0
- package/dist/inputs/Input.d.ts.map +1 -0
- package/dist/inputs/InputError.d.cts +11 -0
- package/dist/inputs/InputError.d.cts.map +1 -0
- package/dist/inputs/InputError.d.ts +11 -0
- package/dist/inputs/InputError.d.ts.map +1 -0
- package/dist/inputs/InputIcon.d.cts +9 -0
- package/dist/inputs/InputIcon.d.cts.map +1 -0
- package/dist/inputs/InputIcon.d.ts +9 -0
- package/dist/inputs/InputIcon.d.ts.map +1 -0
- package/dist/inputs/InputLabel.d.cts +8 -0
- package/dist/inputs/InputLabel.d.cts.map +1 -0
- package/dist/inputs/InputLabel.d.ts +8 -0
- package/dist/inputs/InputLabel.d.ts.map +1 -0
- package/dist/inputs/Radio.d.cts +25 -0
- package/dist/inputs/Radio.d.cts.map +1 -0
- package/dist/inputs/Radio.d.ts +25 -0
- package/dist/inputs/Radio.d.ts.map +1 -0
- package/dist/inputs/Select.d.cts +53 -0
- package/dist/inputs/Select.d.cts.map +1 -0
- package/dist/inputs/Select.d.ts +53 -0
- package/dist/inputs/Select.d.ts.map +1 -0
- package/dist/inputs/Textarea.d.cts +19 -0
- package/dist/inputs/Textarea.d.cts.map +1 -0
- package/dist/inputs/Textarea.d.ts +19 -0
- package/dist/inputs/Textarea.d.ts.map +1 -0
- package/dist/inputs/index.cjs +746 -0
- package/dist/inputs/index.cjs.map +1 -0
- package/dist/inputs/index.d.cts +10 -0
- package/dist/inputs/index.d.cts.map +1 -0
- package/dist/inputs/index.d.ts +10 -0
- package/dist/inputs/index.d.ts.map +1 -0
- package/dist/inputs/index.js +737 -0
- package/dist/inputs/index.js.map +1 -0
- package/dist/inputs/inputs-icons.d.cts +6 -0
- package/dist/inputs/inputs-icons.d.cts.map +1 -0
- package/dist/inputs/inputs-icons.d.ts +6 -0
- package/dist/inputs/inputs-icons.d.ts.map +1 -0
- package/dist/inputs/types.d.cts +48 -0
- package/dist/inputs/types.d.cts.map +1 -0
- package/dist/inputs/types.d.ts +48 -0
- package/dist/inputs/types.d.ts.map +1 -0
- package/dist/inputs/useFieldIds.d.cts +24 -0
- package/dist/inputs/useFieldIds.d.cts.map +1 -0
- package/dist/inputs/useFieldIds.d.ts +24 -0
- package/dist/inputs/useFieldIds.d.ts.map +1 -0
- package/dist/layout/ApiStatus.d.cts +20 -0
- package/dist/layout/ApiStatus.d.cts.map +1 -0
- package/dist/layout/ApiStatus.d.ts +20 -0
- package/dist/layout/ApiStatus.d.ts.map +1 -0
- package/dist/layout/BorderGradient.d.cts +11 -0
- package/dist/layout/BorderGradient.d.cts.map +1 -0
- package/dist/layout/BorderGradient.d.ts +11 -0
- package/dist/layout/BorderGradient.d.ts.map +1 -0
- package/dist/layout/ConfirmModal.d.cts +44 -0
- package/dist/layout/ConfirmModal.d.cts.map +1 -0
- package/dist/layout/ConfirmModal.d.ts +44 -0
- package/dist/layout/ConfirmModal.d.ts.map +1 -0
- package/dist/layout/Dropdown.d.cts +33 -0
- package/dist/layout/Dropdown.d.cts.map +1 -0
- package/dist/layout/Dropdown.d.ts +33 -0
- package/dist/layout/Dropdown.d.ts.map +1 -0
- package/dist/layout/LoadingPage.d.cts +11 -0
- package/dist/layout/LoadingPage.d.cts.map +1 -0
- package/dist/layout/LoadingPage.d.ts +11 -0
- package/dist/layout/LoadingPage.d.ts.map +1 -0
- package/dist/layout/LoadingRings.d.cts +12 -0
- package/dist/layout/LoadingRings.d.cts.map +1 -0
- package/dist/layout/LoadingRings.d.ts +12 -0
- package/dist/layout/LoadingRings.d.ts.map +1 -0
- package/dist/layout/LoadingText.d.cts +13 -0
- package/dist/layout/LoadingText.d.cts.map +1 -0
- package/dist/layout/LoadingText.d.ts +13 -0
- package/dist/layout/LoadingText.d.ts.map +1 -0
- package/dist/layout/ModalWrapper.d.cts +48 -0
- package/dist/layout/ModalWrapper.d.cts.map +1 -0
- package/dist/layout/ModalWrapper.d.ts +48 -0
- package/dist/layout/ModalWrapper.d.ts.map +1 -0
- package/dist/layout/NetworkStatusToaster.d.cts +39 -0
- package/dist/layout/NetworkStatusToaster.d.cts.map +1 -0
- package/dist/layout/NetworkStatusToaster.d.ts +39 -0
- package/dist/layout/NetworkStatusToaster.d.ts.map +1 -0
- package/dist/layout/ScrollableGradientContainer.d.cts +28 -0
- package/dist/layout/ScrollableGradientContainer.d.cts.map +1 -0
- package/dist/layout/ScrollableGradientContainer.d.ts +28 -0
- package/dist/layout/ScrollableGradientContainer.d.ts.map +1 -0
- package/dist/layout/Skeleton.d.cts +9 -0
- package/dist/layout/Skeleton.d.cts.map +1 -0
- package/dist/layout/Skeleton.d.ts +9 -0
- package/dist/layout/Skeleton.d.ts.map +1 -0
- package/dist/layout/Table.d.cts +9 -0
- package/dist/layout/Table.d.cts.map +1 -0
- package/dist/layout/Table.d.ts +9 -0
- package/dist/layout/Table.d.ts.map +1 -0
- package/dist/layout/index.cjs +743 -3
- package/dist/layout/index.cjs.map +1 -1
- package/dist/layout/index.d.cts +12 -0
- package/dist/layout/index.d.cts.map +1 -1
- package/dist/layout/index.d.ts +12 -0
- package/dist/layout/index.d.ts.map +1 -1
- package/dist/layout/index.js +724 -2
- package/dist/layout/index.js.map +1 -1
- package/dist/layout/layout-icons.d.cts +6 -0
- package/dist/layout/layout-icons.d.cts.map +1 -0
- package/dist/layout/layout-icons.d.ts +6 -0
- package/dist/layout/layout-icons.d.ts.map +1 -0
- package/dist/lib/dropdown-position.d.cts +33 -0
- package/dist/lib/dropdown-position.d.cts.map +1 -0
- package/dist/lib/dropdown-position.d.ts +33 -0
- package/dist/lib/dropdown-position.d.ts.map +1 -0
- package/dist/lib/focus.d.cts +3 -0
- package/dist/lib/focus.d.cts.map +1 -0
- package/dist/lib/focus.d.ts +3 -0
- package/dist/lib/focus.d.ts.map +1 -0
- package/dist/lib/icon-registry.d.cts +14 -0
- package/dist/lib/icon-registry.d.cts.map +1 -0
- package/dist/lib/icon-registry.d.ts +14 -0
- package/dist/lib/icon-registry.d.ts.map +1 -0
- package/dist/lib/mergeRefs.d.cts +10 -0
- package/dist/lib/mergeRefs.d.cts.map +1 -0
- package/dist/lib/mergeRefs.d.ts +10 -0
- package/dist/lib/mergeRefs.d.ts.map +1 -0
- package/dist/lib/scrollRowIntoView.d.cts +7 -0
- package/dist/lib/scrollRowIntoView.d.cts.map +1 -0
- package/dist/lib/scrollRowIntoView.d.ts +7 -0
- package/dist/lib/scrollRowIntoView.d.ts.map +1 -0
- package/dist/lib/typeahead.d.cts +21 -0
- package/dist/lib/typeahead.d.cts.map +1 -0
- package/dist/lib/typeahead.d.ts +21 -0
- package/dist/lib/typeahead.d.ts.map +1 -0
- package/dist/lib/useAnchoredBox.d.cts +26 -0
- package/dist/lib/useAnchoredBox.d.cts.map +1 -0
- package/dist/lib/useAnchoredBox.d.ts +26 -0
- package/dist/lib/useAnchoredBox.d.ts.map +1 -0
- package/dist/lib/useDismiss.d.cts +34 -0
- package/dist/lib/useDismiss.d.cts.map +1 -0
- package/dist/lib/useDismiss.d.ts +34 -0
- package/dist/lib/useDismiss.d.ts.map +1 -0
- package/dist/lib/useFocusTrap.d.cts +24 -0
- package/dist/lib/useFocusTrap.d.cts.map +1 -0
- package/dist/lib/useFocusTrap.d.ts +24 -0
- package/dist/lib/useFocusTrap.d.ts.map +1 -0
- package/dist/lib/useIsClient.d.cts +7 -0
- package/dist/lib/useIsClient.d.cts.map +1 -0
- package/dist/lib/useIsClient.d.ts +7 -0
- package/dist/lib/useIsClient.d.ts.map +1 -0
- package/dist/lib/usePrefersReducedMotion.d.cts +7 -0
- package/dist/lib/usePrefersReducedMotion.d.cts.map +1 -0
- package/dist/lib/usePrefersReducedMotion.d.ts +7 -0
- package/dist/lib/usePrefersReducedMotion.d.ts.map +1 -0
- package/dist/lib/useScrollLock.d.cts +7 -0
- package/dist/lib/useScrollLock.d.cts.map +1 -0
- package/dist/lib/useScrollLock.d.ts +7 -0
- package/dist/lib/useScrollLock.d.ts.map +1 -0
- package/dist/lib/useScrollable.d.cts +17 -0
- package/dist/lib/useScrollable.d.cts.map +1 -0
- package/dist/lib/useScrollable.d.ts +17 -0
- package/dist/lib/useScrollable.d.ts.map +1 -0
- package/dist/loading-screen/LoadingScreen.d.cts +21 -0
- package/dist/loading-screen/LoadingScreen.d.cts.map +1 -0
- package/dist/loading-screen/LoadingScreen.d.ts +21 -0
- package/dist/loading-screen/LoadingScreen.d.ts.map +1 -0
- package/dist/loading-screen/Teddy.d.cts +10 -0
- package/dist/loading-screen/Teddy.d.cts.map +1 -0
- package/dist/loading-screen/Teddy.d.ts +10 -0
- package/dist/loading-screen/Teddy.d.ts.map +1 -0
- package/dist/loading-screen/WakeUpProgress.d.cts +16 -0
- package/dist/loading-screen/WakeUpProgress.d.cts.map +1 -0
- package/dist/loading-screen/WakeUpProgress.d.ts +16 -0
- package/dist/loading-screen/WakeUpProgress.d.ts.map +1 -0
- package/dist/loading-screen/beauty-facts.d.cts +4 -0
- package/dist/loading-screen/beauty-facts.d.cts.map +1 -0
- package/dist/loading-screen/beauty-facts.d.ts +4 -0
- package/dist/loading-screen/beauty-facts.d.ts.map +1 -0
- package/dist/loading-screen/index.cjs +405 -0
- package/dist/loading-screen/index.cjs.map +1 -0
- package/dist/loading-screen/index.d.cts +5 -0
- package/dist/loading-screen/index.d.cts.map +1 -0
- package/dist/loading-screen/index.d.ts +5 -0
- package/dist/loading-screen/index.d.ts.map +1 -0
- package/dist/loading-screen/index.js +400 -0
- package/dist/loading-screen/index.js.map +1 -0
- package/dist/loading-screen/loading-screen-icons.d.cts +6 -0
- package/dist/loading-screen/loading-screen-icons.d.cts.map +1 -0
- package/dist/loading-screen/loading-screen-icons.d.ts +6 -0
- package/dist/loading-screen/loading-screen-icons.d.ts.map +1 -0
- package/dist/media/MediaCarousel.d.cts +30 -0
- package/dist/media/MediaCarousel.d.cts.map +1 -0
- package/dist/media/MediaCarousel.d.ts +30 -0
- package/dist/media/MediaCarousel.d.ts.map +1 -0
- package/dist/media/MediaCarouselWithModal.d.cts +17 -0
- package/dist/media/MediaCarouselWithModal.d.cts.map +1 -0
- package/dist/media/MediaCarouselWithModal.d.ts +17 -0
- package/dist/media/MediaCarouselWithModal.d.ts.map +1 -0
- package/dist/media/MediaCarouselWithParentMedia.d.cts +30 -0
- package/dist/media/MediaCarouselWithParentMedia.d.cts.map +1 -0
- package/dist/media/MediaCarouselWithParentMedia.d.ts +30 -0
- package/dist/media/MediaCarouselWithParentMedia.d.ts.map +1 -0
- package/dist/media/MediaModal.d.cts +27 -0
- package/dist/media/MediaModal.d.cts.map +1 -0
- package/dist/media/MediaModal.d.ts +27 -0
- package/dist/media/MediaModal.d.ts.map +1 -0
- package/dist/media/VideoPlayer.d.cts +37 -0
- package/dist/media/VideoPlayer.d.cts.map +1 -0
- package/dist/media/VideoPlayer.d.ts +37 -0
- package/dist/media/VideoPlayer.d.ts.map +1 -0
- package/dist/media/captureVideoPoster.d.cts +20 -0
- package/dist/media/captureVideoPoster.d.cts.map +1 -0
- package/dist/media/captureVideoPoster.d.ts +20 -0
- package/dist/media/captureVideoPoster.d.ts.map +1 -0
- package/dist/media/index.cjs +613 -0
- package/dist/media/index.cjs.map +1 -0
- package/dist/media/index.d.cts +8 -0
- package/dist/media/index.d.cts.map +1 -0
- package/dist/media/index.d.ts +8 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +605 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/labels.d.cts +33 -0
- package/dist/media/labels.d.cts.map +1 -0
- package/dist/media/labels.d.ts +33 -0
- package/dist/media/labels.d.ts.map +1 -0
- package/dist/media/media-icons.d.cts +6 -0
- package/dist/media/media-icons.d.cts.map +1 -0
- package/dist/media/media-icons.d.ts +6 -0
- package/dist/media/media-icons.d.ts.map +1 -0
- package/dist/media/streaming.d.cts +18 -0
- package/dist/media/streaming.d.cts.map +1 -0
- package/dist/media/streaming.d.ts +18 -0
- package/dist/media/streaming.d.ts.map +1 -0
- package/dist/resend/index.cjs +5 -28
- package/dist/resend/index.cjs.map +1 -1
- package/dist/resend/index.js +1 -24
- package/dist/resend/index.js.map +1 -1
- package/dist/static-page/StaticPage.d.cts +91 -0
- package/dist/static-page/StaticPage.d.cts.map +1 -0
- package/dist/static-page/StaticPage.d.ts +91 -0
- package/dist/static-page/StaticPage.d.ts.map +1 -0
- package/dist/static-page/index.cjs +247 -0
- package/dist/static-page/index.cjs.map +1 -0
- package/dist/static-page/index.d.cts +2 -0
- package/dist/static-page/index.d.cts.map +1 -0
- package/dist/static-page/index.d.ts +2 -0
- package/dist/static-page/index.d.ts.map +1 -0
- package/dist/static-page/index.js +235 -0
- package/dist/static-page/index.js.map +1 -0
- package/dist/static-page/static-page-icons.d.cts +6 -0
- package/dist/static-page/static-page-icons.d.cts.map +1 -0
- package/dist/static-page/static-page-icons.d.ts +6 -0
- package/dist/static-page/static-page-icons.d.ts.map +1 -0
- package/dist/testimonials/TestimonialCarousel.d.cts +40 -0
- package/dist/testimonials/TestimonialCarousel.d.cts.map +1 -0
- package/dist/testimonials/TestimonialCarousel.d.ts +40 -0
- package/dist/testimonials/TestimonialCarousel.d.ts.map +1 -0
- package/dist/testimonials/index.cjs +246 -0
- package/dist/testimonials/index.cjs.map +1 -0
- package/dist/testimonials/index.d.cts +2 -0
- package/dist/testimonials/index.d.cts.map +1 -0
- package/dist/testimonials/index.d.ts +2 -0
- package/dist/testimonials/index.d.ts.map +1 -0
- package/dist/testimonials/index.js +244 -0
- package/dist/testimonials/index.js.map +1 -0
- package/dist/testimonials/testimonials-icons.d.cts +6 -0
- package/dist/testimonials/testimonials-icons.d.cts.map +1 -0
- package/dist/testimonials/testimonials-icons.d.ts +6 -0
- package/dist/testimonials/testimonials-icons.d.ts.map +1 -0
- package/dist/toast/index.cjs +2 -38
- package/dist/toast/index.cjs.map +1 -1
- package/dist/toast/index.js +1 -37
- package/dist/toast/index.js.map +1 -1
- package/package.json +67 -1
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { addCollection, Icon } from '@iconify/react';
|
|
2
|
+
import { useState, useEffect, useSyncExternalStore } from 'react';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
7
|
+
var QUERY = "(prefers-reduced-motion: reduce)";
|
|
8
|
+
var query = /* @__PURE__ */ __name(() => window.matchMedia?.(QUERY), "query");
|
|
9
|
+
var subscribe = /* @__PURE__ */ __name((onChange) => {
|
|
10
|
+
const list = query();
|
|
11
|
+
list?.addEventListener("change", onChange);
|
|
12
|
+
return () => {
|
|
13
|
+
list?.removeEventListener("change", onChange);
|
|
14
|
+
};
|
|
15
|
+
}, "subscribe");
|
|
16
|
+
var getSnapshot = /* @__PURE__ */ __name(() => query()?.matches ?? false, "getSnapshot");
|
|
17
|
+
var getServerSnapshot = /* @__PURE__ */ __name(() => false, "getServerSnapshot");
|
|
18
|
+
var usePrefersReducedMotion = /* @__PURE__ */ __name(() => useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot), "usePrefersReducedMotion");
|
|
19
|
+
var createIconRegistry = /* @__PURE__ */ __name((sets) => {
|
|
20
|
+
let registered = false;
|
|
21
|
+
return {
|
|
22
|
+
register: /* @__PURE__ */ __name(() => {
|
|
23
|
+
if (registered) return;
|
|
24
|
+
for (const set of sets) addCollection(set);
|
|
25
|
+
registered = true;
|
|
26
|
+
}, "register"),
|
|
27
|
+
names: sets.flatMap(
|
|
28
|
+
({ prefix, icons, aliases }) => [...Object.keys(icons), ...Object.keys(aliases ?? {})].map((name) => `${prefix}:${name}`)
|
|
29
|
+
)
|
|
30
|
+
};
|
|
31
|
+
}, "createIconRegistry");
|
|
32
|
+
|
|
33
|
+
// src/testimonials/testimonials-icons.ts
|
|
34
|
+
var ICON_SETS = [
|
|
35
|
+
{
|
|
36
|
+
prefix: "streamline-ultimate-color",
|
|
37
|
+
width: 24,
|
|
38
|
+
height: 24,
|
|
39
|
+
icons: {
|
|
40
|
+
"rating-star": {
|
|
41
|
+
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>'
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
prefix: "solar",
|
|
47
|
+
width: 24,
|
|
48
|
+
height: 24,
|
|
49
|
+
icons: {
|
|
50
|
+
"arrow-left-linear": {
|
|
51
|
+
body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M20 12H4M10 18L4 12L10 6"/>'
|
|
52
|
+
},
|
|
53
|
+
"arrow-right-linear": {
|
|
54
|
+
body: '<path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 12H20M14 18L20 12L14 6"/>'
|
|
55
|
+
},
|
|
56
|
+
"pause-linear": {
|
|
57
|
+
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>'
|
|
58
|
+
},
|
|
59
|
+
"play-linear": {
|
|
60
|
+
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"/>'
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
];
|
|
65
|
+
var { register: registerTestimonialIcons, names: TESTIMONIAL_ICON_NAMES } = createIconRegistry(ICON_SETS);
|
|
66
|
+
var LABELS = {
|
|
67
|
+
carousel: "Testimonials",
|
|
68
|
+
previous: "Previous testimonial",
|
|
69
|
+
next: "Next testimonial",
|
|
70
|
+
pause: "Pause the testimonials",
|
|
71
|
+
play: "Play the testimonials",
|
|
72
|
+
rating: /* @__PURE__ */ __name((rating) => `Rated ${String(rating)} out of 5`, "rating"),
|
|
73
|
+
slide: /* @__PURE__ */ __name((index, total) => `${String(index + 1)} of ${String(total)}`, "slide")
|
|
74
|
+
};
|
|
75
|
+
var MAX_STARS = 5;
|
|
76
|
+
var initialsOf = /* @__PURE__ */ __name((name) => name.split(/\s+/).filter(Boolean).slice(0, 2).map((word) => Array.from(word).at(0) ?? "").join("").toUpperCase(), "initialsOf");
|
|
77
|
+
var IconButton = /* @__PURE__ */ __name(({
|
|
78
|
+
icon,
|
|
79
|
+
label,
|
|
80
|
+
onClick
|
|
81
|
+
}) => /* @__PURE__ */ jsx(
|
|
82
|
+
"button",
|
|
83
|
+
{
|
|
84
|
+
type: "button",
|
|
85
|
+
"aria-label": label,
|
|
86
|
+
onClick,
|
|
87
|
+
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",
|
|
88
|
+
children: /* @__PURE__ */ jsx(Icon, { icon, className: "size-5" })
|
|
89
|
+
}
|
|
90
|
+
), "IconButton");
|
|
91
|
+
var TestimonialCarousel = /* @__PURE__ */ __name(({
|
|
92
|
+
testimonials,
|
|
93
|
+
interval = 5e3,
|
|
94
|
+
className = "",
|
|
95
|
+
labels
|
|
96
|
+
}) => {
|
|
97
|
+
registerTestimonialIcons();
|
|
98
|
+
const text = {
|
|
99
|
+
carousel: labels?.carousel ?? LABELS.carousel,
|
|
100
|
+
previous: labels?.previous ?? LABELS.previous,
|
|
101
|
+
next: labels?.next ?? LABELS.next,
|
|
102
|
+
pause: labels?.pause ?? LABELS.pause,
|
|
103
|
+
play: labels?.play ?? LABELS.play,
|
|
104
|
+
rating: labels?.rating ?? LABELS.rating,
|
|
105
|
+
slide: labels?.slide ?? LABELS.slide
|
|
106
|
+
};
|
|
107
|
+
const prefersReducedMotion = usePrefersReducedMotion();
|
|
108
|
+
const [index, setIndex] = useState(0);
|
|
109
|
+
const [isHovered, setIsHovered] = useState(false);
|
|
110
|
+
const [isFocused, setIsFocused] = useState(false);
|
|
111
|
+
const [choice, setChoice] = useState(null);
|
|
112
|
+
const count = testimonials.length;
|
|
113
|
+
const shown = Math.min(index, count - 1);
|
|
114
|
+
const canTurn = count > 1 && interval > 0 && !prefersReducedMotion;
|
|
115
|
+
const isTurning = canTurn && (choice === "playing" || choice === null && !isHovered && !isFocused);
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (!isTurning) return;
|
|
118
|
+
const timer = window.setTimeout(() => {
|
|
119
|
+
setIndex((current) => (Math.min(current, count - 1) + 1) % count);
|
|
120
|
+
}, interval);
|
|
121
|
+
return () => {
|
|
122
|
+
window.clearTimeout(timer);
|
|
123
|
+
};
|
|
124
|
+
}, [isTurning, shown, count, interval]);
|
|
125
|
+
if (count === 0) return null;
|
|
126
|
+
const go = /* @__PURE__ */ __name((step) => {
|
|
127
|
+
setIndex((current) => (Math.min(current, count - 1) + step + count) % count);
|
|
128
|
+
}, "go");
|
|
129
|
+
return /* @__PURE__ */ jsxs(
|
|
130
|
+
"div",
|
|
131
|
+
{
|
|
132
|
+
role: "group",
|
|
133
|
+
"aria-roledescription": "carousel",
|
|
134
|
+
"aria-label": text.carousel,
|
|
135
|
+
onPointerEnter: (event) => {
|
|
136
|
+
if (event.pointerType === "mouse") setIsHovered(true);
|
|
137
|
+
},
|
|
138
|
+
onPointerLeave: () => {
|
|
139
|
+
setIsHovered(false);
|
|
140
|
+
},
|
|
141
|
+
onFocus: () => {
|
|
142
|
+
setIsFocused(true);
|
|
143
|
+
},
|
|
144
|
+
onBlur: (event) => {
|
|
145
|
+
if (!event.currentTarget.contains(event.relatedTarget)) setIsFocused(false);
|
|
146
|
+
},
|
|
147
|
+
className: `bg-tertiary-invert relative rounded-lg p-4 ${className}`,
|
|
148
|
+
children: [
|
|
149
|
+
/* @__PURE__ */ jsx("div", { "aria-live": isTurning ? "off" : "polite", children: testimonials.map((testimonial, position) => {
|
|
150
|
+
const stars = Math.max(
|
|
151
|
+
0,
|
|
152
|
+
Math.min(MAX_STARS, Math.round(testimonial.rating ?? MAX_STARS))
|
|
153
|
+
);
|
|
154
|
+
return /* @__PURE__ */ jsxs(
|
|
155
|
+
"figure",
|
|
156
|
+
{
|
|
157
|
+
role: "group",
|
|
158
|
+
"aria-roledescription": "slide",
|
|
159
|
+
"aria-label": text.slide(position, count),
|
|
160
|
+
hidden: position !== shown,
|
|
161
|
+
className: "group m-0 flex w-full flex-col gap-4",
|
|
162
|
+
children: [
|
|
163
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4 leading-6", children: [
|
|
164
|
+
/* @__PURE__ */ jsxs("div", { className: "flex gap-1", children: [
|
|
165
|
+
/* @__PURE__ */ jsx("span", { className: "sr-only", children: text.rating(stars) }),
|
|
166
|
+
Array.from({ length: stars }, (_, star) => /* @__PURE__ */ jsx(
|
|
167
|
+
Icon,
|
|
168
|
+
{
|
|
169
|
+
"aria-hidden": "true",
|
|
170
|
+
icon: "streamline-ultimate-color:rating-star",
|
|
171
|
+
className: "size-5"
|
|
172
|
+
},
|
|
173
|
+
star
|
|
174
|
+
))
|
|
175
|
+
] }),
|
|
176
|
+
/* @__PURE__ */ jsx("blockquote", { children: /* @__PURE__ */ jsx("p", { className: "text-tertiary group-hover:text-primary text-xs break-words italic before:content-['\u201C'] after:content-['\u201D']", children: testimonial.content }) })
|
|
177
|
+
] }),
|
|
178
|
+
/* @__PURE__ */ jsxs("figcaption", { className: "flex items-center gap-2 pr-24", children: [
|
|
179
|
+
testimonial.image ? /* @__PURE__ */ jsx(
|
|
180
|
+
"img",
|
|
181
|
+
{
|
|
182
|
+
src: testimonial.image,
|
|
183
|
+
alt: "",
|
|
184
|
+
loading: "lazy",
|
|
185
|
+
className: "bg-secondary-invert/50 border-primary/50 size-8 shrink-0 rounded-full border object-cover"
|
|
186
|
+
}
|
|
187
|
+
) : /* @__PURE__ */ jsx(
|
|
188
|
+
"span",
|
|
189
|
+
{
|
|
190
|
+
"aria-hidden": "true",
|
|
191
|
+
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",
|
|
192
|
+
children: initialsOf(testimonial.name)
|
|
193
|
+
}
|
|
194
|
+
),
|
|
195
|
+
/* @__PURE__ */ jsxs("span", { className: "flex flex-col", children: [
|
|
196
|
+
/* @__PURE__ */ jsx("cite", { className: "text-secondary text-[10px] font-semibold not-italic", children: testimonial.name }),
|
|
197
|
+
testimonial.role && /* @__PURE__ */ jsx("span", { className: "text-tertiary text-[9px] leading-4", children: testimonial.role })
|
|
198
|
+
] })
|
|
199
|
+
] })
|
|
200
|
+
]
|
|
201
|
+
},
|
|
202
|
+
`${testimonial.name}#${String(position)}`
|
|
203
|
+
);
|
|
204
|
+
}) }),
|
|
205
|
+
count > 1 && /* @__PURE__ */ jsxs("div", { className: "absolute right-4 bottom-4 flex items-center gap-1", children: [
|
|
206
|
+
canTurn && /* @__PURE__ */ jsx(
|
|
207
|
+
IconButton,
|
|
208
|
+
{
|
|
209
|
+
icon: choice === "paused" ? "solar:play-linear" : "solar:pause-linear",
|
|
210
|
+
label: choice === "paused" ? text.play : text.pause,
|
|
211
|
+
onClick: () => {
|
|
212
|
+
setChoice(choice === "paused" ? "playing" : "paused");
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
/* @__PURE__ */ jsx(
|
|
217
|
+
IconButton,
|
|
218
|
+
{
|
|
219
|
+
icon: "solar:arrow-left-linear",
|
|
220
|
+
label: text.previous,
|
|
221
|
+
onClick: () => {
|
|
222
|
+
go(-1);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
),
|
|
226
|
+
/* @__PURE__ */ jsx(
|
|
227
|
+
IconButton,
|
|
228
|
+
{
|
|
229
|
+
icon: "solar:arrow-right-linear",
|
|
230
|
+
label: text.next,
|
|
231
|
+
onClick: () => {
|
|
232
|
+
go(1);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
)
|
|
236
|
+
] })
|
|
237
|
+
]
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
}, "TestimonialCarousel");
|
|
241
|
+
|
|
242
|
+
export { TestimonialCarousel };
|
|
243
|
+
//# sourceMappingURL=index.js.map
|
|
244
|
+
//# sourceMappingURL=index.js.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":[],"mappings":"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","file":"index.js","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,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 registerTestimonialIcons: () => void, TESTIMONIAL_ICON_NAMES: string[];
|
|
6
|
+
//# sourceMappingURL=testimonials-icons.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testimonials-icons.d.cts","sourceRoot":"","sources":["../../src/testimonials/testimonials-icons.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAkB,wBAAwB,cAAS,sBAAsB,UACjD,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 registerTestimonialIcons: () => void, TESTIMONIAL_ICON_NAMES: string[];
|
|
6
|
+
//# sourceMappingURL=testimonials-icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testimonials-icons.d.ts","sourceRoot":"","sources":["../../src/testimonials/testimonials-icons.ts"],"names":[],"mappings":"AAyCA;;;GAGG;AACH,eAAO,MAAkB,wBAAwB,cAAS,sBAAsB,UACjD,CAAC"}
|
package/dist/toast/index.cjs
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var react$1 = require('@iconify/react');
|
|
4
4
|
var react = require('react');
|
|
5
|
+
var ui = require('@beautinique/frontend-components/ui');
|
|
5
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
7
|
|
|
7
8
|
var __defProp = Object.defineProperty;
|
|
@@ -80,43 +81,6 @@ var TOAST_TYPES = [
|
|
|
80
81
|
];
|
|
81
82
|
var TOAST_TYPE = Object.fromEntries(TOAST_TYPES.map((type) => [type, type]));
|
|
82
83
|
|
|
83
|
-
// src/lib/button.ts
|
|
84
|
-
var PATTERN_CSS = {
|
|
85
|
-
primary: "text-white bg-sky-blue-burst shadow-primary-btn hover:shadow-primary-btn-hover",
|
|
86
|
-
secondary: "text-secondary-invert bg-secondary shadow-secondary-btn hover:shadow-secondary-btn-hover",
|
|
87
|
-
tertiary: "text-tertiary-invert bg-tertiary shadow-tertiary-btn hover:shadow-tertiary-btn-hover",
|
|
88
|
-
outline: "text-primary border border-primary shadow-outline-btn hover:shadow-outline-btn-hover",
|
|
89
|
-
transparent: "bg-transparent border border-primary/30 text-secondary"
|
|
90
|
-
};
|
|
91
|
-
var getButtonCss = /* @__PURE__ */ __name((pattern) => Object.hasOwn(PATTERN_CSS, pattern) ? PATTERN_CSS[pattern] : PATTERN_CSS.transparent, "getButtonCss");
|
|
92
|
-
var BASE_CSS = "group flex w-full cursor-pointer items-center justify-center gap-1 rounded-lg px-4 py-3 text-sm leading-4 transition-all duration-300 disabled:cursor-not-allowed disabled:opacity-85 lg:px-5 lg:py-4 xl:text-base";
|
|
93
|
-
var Button = /* @__PURE__ */ __name(({
|
|
94
|
-
pattern,
|
|
95
|
-
content,
|
|
96
|
-
className = "",
|
|
97
|
-
leftIcon,
|
|
98
|
-
rightIcon,
|
|
99
|
-
buttonProps,
|
|
100
|
-
ref
|
|
101
|
-
}) => (
|
|
102
|
-
// The classes that are given come last but do not remove the button's own: to win over one of
|
|
103
|
-
// them give it with `!` (`rounded-md!`), the way the toast's button does.
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
105
|
-
"button",
|
|
106
|
-
{
|
|
107
|
-
...buttonProps,
|
|
108
|
-
ref,
|
|
109
|
-
className: `${BASE_CSS} ${getButtonCss(pattern)} ${className} ${buttonProps?.className ?? ""}`,
|
|
110
|
-
type: buttonProps?.type ?? "button",
|
|
111
|
-
children: [
|
|
112
|
-
leftIcon && /* @__PURE__ */ jsxRuntime.jsx(react$1.Icon, { ...leftIcon }),
|
|
113
|
-
typeof content === "object" ? /* @__PURE__ */ jsxRuntime.jsx(react$1.Icon, { ...content }) : content,
|
|
114
|
-
rightIcon && /* @__PURE__ */ jsxRuntime.jsx(react$1.Icon, { ...rightIcon })
|
|
115
|
-
]
|
|
116
|
-
}
|
|
117
|
-
)
|
|
118
|
-
), "Button");
|
|
119
|
-
|
|
120
84
|
// src/toast/uploads.ts
|
|
121
85
|
var sum = /* @__PURE__ */ __name((numbers) => numbers.reduce((total, value) => total + value, 0), "sum");
|
|
122
86
|
var isUploadItemSettled = /* @__PURE__ */ __name(({ status }) => status === "success" || status === "error", "isUploadItemSettled");
|
|
@@ -402,7 +366,7 @@ var ToasterItem = /* @__PURE__ */ __name((props) => {
|
|
|
402
366
|
isCustom && "children" in props && props.children
|
|
403
367
|
] }),
|
|
404
368
|
buttonProps && type !== TOAST_TYPE.loading && type !== TOAST_TYPE.progress && /* @__PURE__ */ jsxRuntime.jsx(
|
|
405
|
-
Button,
|
|
369
|
+
ui.Button,
|
|
406
370
|
{
|
|
407
371
|
...buttonProps,
|
|
408
372
|
content: buttonProps.content ?? "Try Again",
|