@zentauri-ui/zentauri-components 1.3.1 → 1.4.1
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 +90 -0
- package/cli/cli.integration.test.ts +79 -0
- package/cli/index.mjs +718 -0
- package/cli/registry.json +63 -0
- package/cli/rewrite-imports.mjs +57 -0
- package/cli/rewrite-imports.test.ts +71 -0
- package/dist/ui/slider.js +21 -25
- package/dist/ui/slider.js.map +1 -1
- package/dist/ui/slider.mjs +21 -25
- package/dist/ui/slider.mjs.map +1 -1
- package/package.json +9 -3
- package/{dist/hooks/index.d.ts → src/hooks/index.ts} +28 -7
- package/{dist/hooks/useBodyScrollLock/index.d.ts → src/hooks/useBodyScrollLock/index.ts} +0 -1
- package/src/hooks/useBodyScrollLock/useBodyScrollLock.test.ts +51 -0
- package/src/hooks/useBodyScrollLock/useBodyScrollLock.ts +48 -0
- package/src/hooks/useClickOutside/index.ts +5 -0
- package/src/hooks/useClickOutside/useClickOutside.test.tsx +60 -0
- package/src/hooks/useClickOutside/useClickOutside.ts +52 -0
- package/{dist/hooks/useClipboard/index.d.ts → src/hooks/useClipboard/index.ts} +0 -1
- package/src/hooks/useClipboard/useClipboard.test.ts +101 -0
- package/src/hooks/useClipboard/useClipboard.ts +69 -0
- package/src/hooks/useControllableState/index.ts +4 -0
- package/src/hooks/useControllableState/useControllableState.test.ts +59 -0
- package/src/hooks/useControllableState/useControllableState.ts +49 -0
- package/{dist/hooks/useDebouncedValue/index.d.ts → src/hooks/useDebouncedValue/index.ts} +0 -1
- package/src/hooks/useDebouncedValue/useDebouncedValue.test.ts +74 -0
- package/{dist/hooks/useDebouncedValue/useDebouncedValue.d.ts → src/hooks/useDebouncedValue/useDebouncedValue.ts} +18 -2
- package/src/hooks/useDisclosure/index.ts +5 -0
- package/src/hooks/useDisclosure/useDisclosure.test.ts +64 -0
- package/src/hooks/useDisclosure/useDisclosure.ts +62 -0
- package/src/hooks/useDocumentTitle/index.ts +4 -0
- package/src/hooks/useDocumentTitle/useDocumentTitle.test.ts +40 -0
- package/src/hooks/useDocumentTitle/useDocumentTitle.ts +58 -0
- package/{dist/hooks/useFocusManagement/index.d.ts → src/hooks/useFocusManagement/index.ts} +0 -1
- package/src/hooks/useFocusManagement/useFocusManagement.test.tsx +45 -0
- package/src/hooks/useFocusManagement/useFocusManagement.ts +77 -0
- package/{dist/hooks/useHover/index.d.ts → src/hooks/useHover/index.ts} +0 -1
- package/src/hooks/useHover/useHover.test.ts +45 -0
- package/src/hooks/useHover/useHover.ts +45 -0
- package/{dist/hooks/useInView/index.d.ts → src/hooks/useInView/index.ts} +0 -1
- package/src/hooks/useInView/useInView.test.ts +43 -0
- package/{dist/hooks/useInView/useInView.d.ts → src/hooks/useInView/useInView.ts} +15 -4
- package/src/hooks/useIntersectionObserver/index.ts +4 -0
- package/src/hooks/useIntersectionObserver/useIntersectionObserver.test.ts +75 -0
- package/src/hooks/useIntersectionObserver/useIntersectionObserver.ts +54 -0
- package/{dist/hooks/useIsMounted/index.d.ts → src/hooks/useIsMounted/index.ts} +0 -1
- package/src/hooks/useIsMounted/useIsMounted.test.ts +25 -0
- package/{dist/hooks/useIsMounted/useIsMounted.d.ts → src/hooks/useIsMounted/useIsMounted.ts} +14 -2
- package/{dist/hooks/useIsomorphicLayoutEffect/index.d.ts → src/hooks/useIsomorphicLayoutEffect/index.ts} +0 -1
- package/src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.test.ts +19 -0
- package/{dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.ts → src/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.ts} +6 -3
- package/src/hooks/useLocalStorage/index.ts +4 -0
- package/src/hooks/useLocalStorage/useLocalStorage.test.ts +99 -0
- package/src/hooks/useLocalStorage/useLocalStorage.ts +109 -0
- package/{dist/hooks/useMediaQuery/index.d.ts → src/hooks/useMediaQuery/index.ts} +0 -1
- package/src/hooks/useMediaQuery/useMediaQuery.test.ts +63 -0
- package/src/hooks/useMediaQuery/useMediaQuery.ts +37 -0
- package/{dist/hooks/useNetworkStatus/index.d.ts → src/hooks/useNetworkStatus/index.ts} +0 -1
- package/src/hooks/useNetworkStatus/useNetworkStatus.test.ts +53 -0
- package/src/hooks/useNetworkStatus/useNetworkStatus.ts +33 -0
- package/{dist/hooks/usePageVisibility/index.d.ts → src/hooks/usePageVisibility/index.ts} +0 -1
- package/src/hooks/usePageVisibility/usePageVisibility.test.ts +21 -0
- package/src/hooks/usePageVisibility/usePageVisibility.ts +31 -0
- package/src/hooks/usePagination/index.ts +6 -0
- package/src/hooks/usePagination/usePagination.test.ts +139 -0
- package/src/hooks/usePagination/usePagination.ts +153 -0
- package/src/hooks/usePrefersColorScheme/index.ts +4 -0
- package/src/hooks/usePrefersColorScheme/usePrefersColorScheme.test.ts +53 -0
- package/{dist/hooks/usePrefersColorScheme/usePrefersColorScheme.d.ts → src/hooks/usePrefersColorScheme/usePrefersColorScheme.ts} +14 -2
- package/{dist/hooks/usePrefersReducedMotion/index.d.ts → src/hooks/usePrefersReducedMotion/index.ts} +0 -1
- package/src/hooks/usePrefersReducedMotion/usePrefersReducedMotion.test.ts +27 -0
- package/{dist/hooks/usePrefersReducedMotion/usePrefersReducedMotion.d.ts → src/hooks/usePrefersReducedMotion/usePrefersReducedMotion.ts} +7 -2
- package/src/hooks/useResizeObserver/index.ts +4 -0
- package/src/hooks/useResizeObserver/useResizeObserver.test.ts +68 -0
- package/src/hooks/useResizeObserver/useResizeObserver.ts +58 -0
- package/src/hooks/useSessionStorage/index.ts +4 -0
- package/src/hooks/useSessionStorage/useSessionStorage.test.ts +54 -0
- package/src/hooks/useSessionStorage/useSessionStorage.ts +84 -0
- package/{dist/hooks/useThrottledCallback/index.d.ts → src/hooks/useThrottledCallback/index.ts} +0 -1
- package/src/hooks/useThrottledCallback/useThrottledCallback.test.ts +75 -0
- package/{dist/hooks/useThrottledCallback/useThrottledCallback.d.ts → src/hooks/useThrottledCallback/useThrottledCallback.ts} +25 -2
- package/{dist/hooks/useToggle/index.d.ts → src/hooks/useToggle/index.ts} +0 -1
- package/src/hooks/useToggle/useToggle.test.ts +40 -0
- package/src/hooks/useToggle/useToggle.ts +22 -0
- package/{dist/hooks/useWindowSize/index.d.ts → src/hooks/useWindowSize/index.ts} +0 -1
- package/src/hooks/useWindowSize/useWindowSize.test.ts +23 -0
- package/src/hooks/useWindowSize/useWindowSize.ts +39 -0
- package/src/lib/utils.ts +25 -0
- package/src/ui/accordion/accordion-base.tsx +223 -0
- package/src/ui/accordion/accordion.test.tsx +146 -0
- package/src/ui/accordion/accordion.tsx +11 -0
- package/src/ui/accordion/animated/accordion-content-animated.tsx +46 -0
- package/src/ui/accordion/animated/accordion-root-animated.tsx +10 -0
- package/src/ui/accordion/animated/animations.ts +16 -0
- package/{dist/ui/accordion/animated/index.d.ts → src/ui/accordion/animated/index.ts} +2 -1
- package/{dist/ui/accordion/animated/types.d.ts → src/ui/accordion/animated/types.ts} +4 -3
- package/src/ui/accordion/index.ts +23 -0
- package/{dist/ui/accordion/types.d.ts → src/ui/accordion/types.ts} +30 -21
- package/src/ui/accordion/variants.ts +115 -0
- package/src/ui/alert/alert-base.tsx +157 -0
- package/src/ui/alert/alert.test.tsx +150 -0
- package/src/ui/alert/alert.tsx +9 -0
- package/src/ui/alert/animated/alert-animated.tsx +20 -0
- package/src/ui/alert/animated/animations.ts +20 -0
- package/src/ui/alert/animated/index.ts +3 -0
- package/src/ui/alert/animated/types.ts +16 -0
- package/src/ui/alert/index.ts +22 -0
- package/{dist/ui/alert/types.d.ts → src/ui/alert/types.ts} +18 -11
- package/src/ui/alert/variants.ts +74 -0
- package/src/ui/avatar/animated/animations.ts +11 -0
- package/src/ui/avatar/animated/avatar-animated.tsx +25 -0
- package/{dist/ui/avatar/animated/index.d.ts → src/ui/avatar/animated/index.ts} +3 -2
- package/{dist/ui/avatar/animated/types.d.ts → src/ui/avatar/animated/types.ts} +11 -3
- package/src/ui/avatar/avatar-base.tsx +184 -0
- package/src/ui/avatar/avatar.test.tsx +51 -0
- package/src/ui/avatar/avatar.tsx +11 -0
- package/src/ui/avatar/index.ts +16 -0
- package/{dist/ui/avatar/types.d.ts → src/ui/avatar/types.ts} +22 -11
- package/src/ui/avatar/variants.ts +52 -0
- package/src/ui/badge/animated/animations.ts +20 -0
- package/src/ui/badge/animated/badge-animated.tsx +28 -0
- package/{dist/ui/badge/animated/index.d.ts → src/ui/badge/animated/index.ts} +3 -2
- package/src/ui/badge/animated/types.ts +18 -0
- package/src/ui/badge/badge-base.tsx +53 -0
- package/src/ui/badge/badge.test.tsx +48 -0
- package/src/ui/badge/badge.tsx +9 -0
- package/{dist/ui/badge/index.d.ts → src/ui/badge/index.ts} +2 -1
- package/src/ui/badge/types.ts +25 -0
- package/src/ui/badge/variants.ts +85 -0
- package/src/ui/breadcrumb/breadcrumb.test.tsx +62 -0
- package/src/ui/breadcrumb/breadcrumb.tsx +135 -0
- package/src/ui/breadcrumb/index.ts +28 -0
- package/{dist/ui/breadcrumb/types.d.ts → src/ui/breadcrumb/types.ts} +18 -15
- package/src/ui/breadcrumb/variants.ts +53 -0
- package/src/ui/buttons/animated/animations.ts +34 -0
- package/src/ui/buttons/animated/button-animated.tsx +70 -0
- package/{dist/ui/buttons/animated/index.d.ts → src/ui/buttons/animated/index.ts} +2 -1
- package/src/ui/buttons/animated/types.ts +29 -0
- package/src/ui/buttons/button-base.tsx +59 -0
- package/src/ui/buttons/button.test.tsx +480 -0
- package/src/ui/buttons/button.tsx +9 -0
- package/{dist/ui/buttons/index.d.ts → src/ui/buttons/index.ts} +2 -1
- package/{dist/ui/buttons/types.d.ts → src/ui/buttons/types.ts} +10 -6
- package/src/ui/buttons/variants.ts +77 -0
- package/src/ui/card/animated/animations.ts +32 -0
- package/src/ui/card/animated/card-animated.tsx +28 -0
- package/{dist/ui/card/animated/index.d.ts → src/ui/card/animated/index.ts} +9 -2
- package/{dist/ui/card/animated/types.d.ts → src/ui/card/animated/types.ts} +4 -2
- package/src/ui/card/card-base.tsx +146 -0
- package/src/ui/card/card.test.tsx +79 -0
- package/src/ui/card/card.tsx +11 -0
- package/src/ui/card/index.ts +21 -0
- package/src/ui/card/types.ts +42 -0
- package/src/ui/card/variants.ts +122 -0
- package/src/ui/divider/animated/animations.ts +27 -0
- package/src/ui/divider/animated/divider-animated.tsx +24 -0
- package/{dist/ui/divider/animated/index.d.ts → src/ui/divider/animated/index.ts} +2 -1
- package/{dist/ui/divider/animated/types.d.ts → src/ui/divider/animated/types.ts} +13 -3
- package/src/ui/divider/divider-base.tsx +80 -0
- package/src/ui/divider/divider.tsx +9 -0
- package/src/ui/divider/index.ts +14 -0
- package/{dist/ui/divider/types.d.ts → src/ui/divider/types.ts} +11 -8
- package/src/ui/divider/variants.ts +98 -0
- package/src/ui/drawer/animated/animations.ts +39 -0
- package/src/ui/drawer/animated/drawer-content-animated.tsx +101 -0
- package/{dist/ui/drawer/animated/index.d.ts → src/ui/drawer/animated/index.ts} +11 -2
- package/src/ui/drawer/animated/types.ts +18 -0
- package/src/ui/drawer/drawer-base.tsx +259 -0
- package/src/ui/drawer/drawer.test.tsx +132 -0
- package/src/ui/drawer/drawer.tsx +11 -0
- package/src/ui/drawer/index.ts +21 -0
- package/src/ui/drawer/types.ts +39 -0
- package/src/ui/drawer/variants.ts +122 -0
- package/src/ui/dropdown/dropdown.test.tsx +114 -0
- package/src/ui/dropdown/dropdown.tsx +179 -0
- package/src/ui/dropdown/index.ts +15 -0
- package/src/ui/dropdown/types.ts +68 -0
- package/src/ui/dropdown/variants.ts +138 -0
- package/src/ui/empty-state/animated/animations.ts +19 -0
- package/src/ui/empty-state/animated/empty-state-animated.tsx +23 -0
- package/src/ui/empty-state/animated/index.ts +7 -0
- package/{dist/ui/empty-state/animated/types.d.ts → src/ui/empty-state/animated/types.ts} +17 -5
- package/src/ui/empty-state/empty-state-base.tsx +114 -0
- package/src/ui/empty-state/empty-state.tsx +9 -0
- package/{dist/ui/empty-state/index.d.ts → src/ui/empty-state/index.ts} +7 -2
- package/{dist/ui/empty-state/types.d.ts → src/ui/empty-state/types.ts} +10 -6
- package/src/ui/empty-state/variants.ts +51 -0
- package/src/ui/file-upload/file-upload.test.tsx +36 -0
- package/src/ui/file-upload/file-upload.tsx +119 -0
- package/{dist/ui/file-upload/index.d.ts → src/ui/file-upload/index.ts} +2 -1
- package/{dist/ui/file-upload/types.d.ts → src/ui/file-upload/types.ts} +6 -3
- package/src/ui/file-upload/variants.ts +29 -0
- package/src/ui/inputs/animated/animations.ts +36 -0
- package/{dist/ui/inputs/animated/index.d.ts → src/ui/inputs/animated/index.ts} +2 -1
- package/src/ui/inputs/animated/input-animated.tsx +124 -0
- package/src/ui/inputs/animated/types.ts +40 -0
- package/{dist/ui/inputs/index.d.ts → src/ui/inputs/index.ts} +2 -1
- package/src/ui/inputs/input-base.tsx +114 -0
- package/src/ui/inputs/input.test.tsx +414 -0
- package/src/ui/inputs/input.tsx +8 -0
- package/src/ui/inputs/types.ts +18 -0
- package/src/ui/inputs/variants.ts +316 -0
- package/src/ui/modal/animated/animations.ts +29 -0
- package/{dist/ui/modal/animated/index.d.ts → src/ui/modal/animated/index.ts} +2 -1
- package/src/ui/modal/animated/modal-content-animated.tsx +96 -0
- package/src/ui/modal/animated/types.ts +23 -0
- package/src/ui/modal/index.ts +21 -0
- package/src/ui/modal/modal-base.tsx +279 -0
- package/src/ui/modal/modal.test.tsx +129 -0
- package/src/ui/modal/modal.tsx +8 -0
- package/src/ui/modal/types.ts +31 -0
- package/src/ui/modal/variants.ts +109 -0
- package/src/ui/pagination/index.ts +13 -0
- package/src/ui/pagination/pagination.test.tsx +165 -0
- package/src/ui/pagination/pagination.tsx +237 -0
- package/{dist/ui/pagination/types.d.ts → src/ui/pagination/types.ts} +37 -27
- package/src/ui/pagination/variants.ts +97 -0
- package/src/ui/progress/animated/animations.ts +9 -0
- package/src/ui/progress/animated/index.ts +17 -0
- package/src/ui/progress/animated/progress-animated.tsx +133 -0
- package/{dist/ui/progress/animated/types.d.ts → src/ui/progress/animated/types.ts} +20 -8
- package/{dist/ui/progress/index.d.ts → src/ui/progress/index.ts} +7 -2
- package/src/ui/progress/progress-base.tsx +151 -0
- package/src/ui/progress/progress.test.tsx +84 -0
- package/src/ui/progress/progress.tsx +12 -0
- package/src/ui/progress/types.ts +33 -0
- package/src/ui/progress/variants.ts +105 -0
- package/src/ui/select/index.ts +25 -0
- package/src/ui/select/select.test.tsx +128 -0
- package/src/ui/select/select.tsx +221 -0
- package/src/ui/select/types.ts +77 -0
- package/src/ui/select/variants.ts +163 -0
- package/src/ui/skeleton/animated/animations.ts +15 -0
- package/src/ui/skeleton/animated/index.ts +20 -0
- package/src/ui/skeleton/animated/skeleton-animated.tsx +119 -0
- package/{dist/ui/skeleton/animated/types.d.ts → src/ui/skeleton/animated/types.ts} +30 -11
- package/src/ui/skeleton/index.ts +24 -0
- package/src/ui/skeleton/skeleton-base.tsx +288 -0
- package/src/ui/skeleton/skeleton.tsx +8 -0
- package/{dist/ui/skeleton/types.d.ts → src/ui/skeleton/types.ts} +15 -7
- package/src/ui/skeleton/variants.ts +254 -0
- package/src/ui/slider/index.ts +22 -0
- package/src/ui/slider/slider.test.tsx +94 -0
- package/src/ui/slider/slider.tsx +728 -0
- package/src/ui/slider/types.ts +66 -0
- package/src/ui/slider/variants.ts +81 -0
- package/{dist/ui/spinner/animated/index.d.ts → src/ui/spinner/animated/index.ts} +2 -1
- package/src/ui/spinner/animated/spinner.test.tsx +41 -0
- package/src/ui/spinner/animated/spinner.tsx +143 -0
- package/{dist/ui/spinner/animated/types.d.ts → src/ui/spinner/animated/types.ts} +6 -4
- package/src/ui/spinner/animated/variants.ts +50 -0
- package/src/ui/stepper/index.ts +22 -0
- package/src/ui/stepper/stepper.test.tsx +183 -0
- package/src/ui/stepper/stepper.tsx +172 -0
- package/{dist/ui/stepper/types.d.ts → src/ui/stepper/types.ts} +18 -11
- package/src/ui/stepper/variants.ts +69 -0
- package/src/ui/table/animated/animations.ts +9 -0
- package/src/ui/table/animated/index.ts +15 -0
- package/src/ui/table/animated/table-animated.tsx +15 -0
- package/src/ui/table/animated/types.ts +16 -0
- package/src/ui/table/index.ts +22 -0
- package/src/ui/table/table-base.tsx +197 -0
- package/src/ui/table/table.tsx +13 -0
- package/src/ui/table/types.ts +47 -0
- package/src/ui/table/variants.ts +105 -0
- package/src/ui/tabs/animated/animations.ts +48 -0
- package/{dist/ui/tabs/animated/index.d.ts → src/ui/tabs/animated/index.ts} +6 -2
- package/src/ui/tabs/animated/tabs-content-animated.tsx +46 -0
- package/src/ui/tabs/animated/types.ts +24 -0
- package/{dist/ui/tabs/index.d.ts → src/ui/tabs/index.ts} +8 -2
- package/src/ui/tabs/tabs-base.tsx +185 -0
- package/src/ui/tabs/tabs.test.tsx +53 -0
- package/{dist/ui/tabs/tabs.d.ts → src/ui/tabs/tabs.tsx} +1 -1
- package/src/ui/tabs/types.ts +88 -0
- package/src/ui/tabs/variants.ts +70 -0
- package/src/ui/toast/animated/animations.ts +17 -0
- package/src/ui/toast/animated/index.ts +9 -0
- package/src/ui/toast/animated/toast-animated.tsx +96 -0
- package/src/ui/toast/animated/types.ts +13 -0
- package/src/ui/toast/index.ts +26 -0
- package/src/ui/toast/toast-base.tsx +231 -0
- package/src/ui/toast/toast.test.tsx +102 -0
- package/src/ui/toast/toast.tsx +13 -0
- package/{dist/ui/toast/types.d.ts → src/ui/toast/types.ts} +35 -23
- package/src/ui/toast/variants.ts +73 -0
- package/src/ui/toggle/animated/animations.ts +9 -0
- package/src/ui/toggle/animated/index.ts +7 -0
- package/src/ui/toggle/animated/toggle-animated.tsx +76 -0
- package/{dist/ui/toggle/animated/types.d.ts → src/ui/toggle/animated/types.ts} +6 -2
- package/{dist/ui/toggle/index.d.ts → src/ui/toggle/index.ts} +2 -1
- package/src/ui/toggle/toggle-base.tsx +70 -0
- package/src/ui/toggle/toggle.test.tsx +44 -0
- package/src/ui/toggle/toggle.tsx +9 -0
- package/{dist/ui/toggle/types.d.ts → src/ui/toggle/types.ts} +7 -3
- package/src/ui/toggle/variants.ts +84 -0
- package/src/ui/tooltip/animated/animations.ts +16 -0
- package/src/ui/tooltip/animated/index.ts +10 -0
- package/src/ui/tooltip/animated/tooltip-content-animated.tsx +47 -0
- package/src/ui/tooltip/animated/types.ts +19 -0
- package/src/ui/tooltip/index.ts +17 -0
- package/src/ui/tooltip/tooltip-base.tsx +152 -0
- package/src/ui/tooltip/tooltip.test.tsx +84 -0
- package/src/ui/tooltip/tooltip.tsx +8 -0
- package/src/ui/tooltip/types.ts +57 -0
- package/src/ui/tooltip/variants.ts +61 -0
- package/dist/hooks/index.d.ts.map +0 -1
- package/dist/hooks/useBodyScrollLock/index.d.ts.map +0 -1
- package/dist/hooks/useBodyScrollLock/useBodyScrollLock.d.ts +0 -13
- package/dist/hooks/useBodyScrollLock/useBodyScrollLock.d.ts.map +0 -1
- package/dist/hooks/useClickOutside/index.d.ts +0 -2
- package/dist/hooks/useClickOutside/index.d.ts.map +0 -1
- package/dist/hooks/useClickOutside/useClickOutside.d.ts +0 -22
- package/dist/hooks/useClickOutside/useClickOutside.d.ts.map +0 -1
- package/dist/hooks/useClipboard/index.d.ts.map +0 -1
- package/dist/hooks/useClipboard/useClipboard.d.ts +0 -21
- package/dist/hooks/useClipboard/useClipboard.d.ts.map +0 -1
- package/dist/hooks/useControllableState/index.d.ts +0 -2
- package/dist/hooks/useControllableState/index.d.ts.map +0 -1
- package/dist/hooks/useControllableState/useControllableState.d.ts +0 -21
- package/dist/hooks/useControllableState/useControllableState.d.ts.map +0 -1
- package/dist/hooks/useDebouncedValue/index.d.ts.map +0 -1
- package/dist/hooks/useDebouncedValue/useDebouncedValue.d.ts.map +0 -1
- package/dist/hooks/useDisclosure/index.d.ts +0 -2
- package/dist/hooks/useDisclosure/index.d.ts.map +0 -1
- package/dist/hooks/useDisclosure/useDisclosure.d.ts +0 -24
- package/dist/hooks/useDisclosure/useDisclosure.d.ts.map +0 -1
- package/dist/hooks/useDocumentTitle/index.d.ts +0 -2
- package/dist/hooks/useDocumentTitle/index.d.ts.map +0 -1
- package/dist/hooks/useDocumentTitle/useDocumentTitle.d.ts +0 -18
- package/dist/hooks/useDocumentTitle/useDocumentTitle.d.ts.map +0 -1
- package/dist/hooks/useFocusManagement/index.d.ts.map +0 -1
- package/dist/hooks/useFocusManagement/useFocusManagement.d.ts +0 -22
- package/dist/hooks/useFocusManagement/useFocusManagement.d.ts.map +0 -1
- package/dist/hooks/useHover/index.d.ts.map +0 -1
- package/dist/hooks/useHover/useHover.d.ts +0 -13
- package/dist/hooks/useHover/useHover.d.ts.map +0 -1
- package/dist/hooks/useInView/index.d.ts.map +0 -1
- package/dist/hooks/useInView/useInView.d.ts.map +0 -1
- package/dist/hooks/useIntersectionObserver/index.d.ts +0 -2
- package/dist/hooks/useIntersectionObserver/index.d.ts.map +0 -1
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.d.ts +0 -17
- package/dist/hooks/useIntersectionObserver/useIntersectionObserver.d.ts.map +0 -1
- package/dist/hooks/useIsMounted/index.d.ts.map +0 -1
- package/dist/hooks/useIsMounted/useIsMounted.d.ts.map +0 -1
- package/dist/hooks/useIsomorphicLayoutEffect/index.d.ts.map +0 -1
- package/dist/hooks/useIsomorphicLayoutEffect/useIsomorphicLayoutEffect.d.ts.map +0 -1
- package/dist/hooks/useLocalStorage/index.d.ts +0 -2
- package/dist/hooks/useLocalStorage/index.d.ts.map +0 -1
- package/dist/hooks/useLocalStorage/useLocalStorage.d.ts +0 -21
- package/dist/hooks/useLocalStorage/useLocalStorage.d.ts.map +0 -1
- package/dist/hooks/useMediaQuery/index.d.ts.map +0 -1
- package/dist/hooks/useMediaQuery/useMediaQuery.d.ts +0 -12
- package/dist/hooks/useMediaQuery/useMediaQuery.d.ts.map +0 -1
- package/dist/hooks/useNetworkStatus/index.d.ts.map +0 -1
- package/dist/hooks/useNetworkStatus/useNetworkStatus.d.ts +0 -9
- package/dist/hooks/useNetworkStatus/useNetworkStatus.d.ts.map +0 -1
- package/dist/hooks/usePageVisibility/index.d.ts.map +0 -1
- package/dist/hooks/usePageVisibility/usePageVisibility.d.ts +0 -9
- package/dist/hooks/usePageVisibility/usePageVisibility.d.ts.map +0 -1
- package/dist/hooks/usePagination/index.d.ts +0 -2
- package/dist/hooks/usePagination/index.d.ts.map +0 -1
- package/dist/hooks/usePagination/usePagination.d.ts +0 -30
- package/dist/hooks/usePagination/usePagination.d.ts.map +0 -1
- package/dist/hooks/usePrefersColorScheme/index.d.ts +0 -2
- package/dist/hooks/usePrefersColorScheme/index.d.ts.map +0 -1
- package/dist/hooks/usePrefersColorScheme/usePrefersColorScheme.d.ts.map +0 -1
- package/dist/hooks/usePrefersReducedMotion/index.d.ts.map +0 -1
- package/dist/hooks/usePrefersReducedMotion/usePrefersReducedMotion.d.ts.map +0 -1
- package/dist/hooks/useResizeObserver/index.d.ts +0 -2
- package/dist/hooks/useResizeObserver/index.d.ts.map +0 -1
- package/dist/hooks/useResizeObserver/useResizeObserver.d.ts +0 -21
- package/dist/hooks/useResizeObserver/useResizeObserver.d.ts.map +0 -1
- package/dist/hooks/useSessionStorage/index.d.ts +0 -2
- package/dist/hooks/useSessionStorage/index.d.ts.map +0 -1
- package/dist/hooks/useSessionStorage/useSessionStorage.d.ts +0 -21
- package/dist/hooks/useSessionStorage/useSessionStorage.d.ts.map +0 -1
- package/dist/hooks/useThrottledCallback/index.d.ts.map +0 -1
- package/dist/hooks/useThrottledCallback/useThrottledCallback.d.ts.map +0 -1
- package/dist/hooks/useToggle/index.d.ts.map +0 -1
- package/dist/hooks/useToggle/useToggle.d.ts +0 -8
- package/dist/hooks/useToggle/useToggle.d.ts.map +0 -1
- package/dist/hooks/useWindowSize/index.d.ts.map +0 -1
- package/dist/hooks/useWindowSize/useWindowSize.d.ts +0 -13
- package/dist/hooks/useWindowSize/useWindowSize.d.ts.map +0 -1
- package/dist/lib/utils.d.ts +0 -6
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/ui/accordion/accordion-base.d.ts +0 -20
- package/dist/ui/accordion/accordion-base.d.ts.map +0 -1
- package/dist/ui/accordion/accordion.d.ts +0 -8
- package/dist/ui/accordion/accordion.d.ts.map +0 -1
- package/dist/ui/accordion/animated/accordion-content-animated.d.ts +0 -6
- package/dist/ui/accordion/animated/accordion-content-animated.d.ts.map +0 -1
- package/dist/ui/accordion/animated/accordion-root-animated.d.ts +0 -6
- package/dist/ui/accordion/animated/accordion-root-animated.d.ts.map +0 -1
- package/dist/ui/accordion/animated/animations.d.ts +0 -6
- package/dist/ui/accordion/animated/animations.d.ts.map +0 -1
- package/dist/ui/accordion/animated/index.d.ts.map +0 -1
- package/dist/ui/accordion/animated/types.d.ts.map +0 -1
- package/dist/ui/accordion/index.d.ts +0 -5
- package/dist/ui/accordion/index.d.ts.map +0 -1
- package/dist/ui/accordion/types.d.ts.map +0 -1
- package/dist/ui/accordion/variants.d.ts +0 -14
- package/dist/ui/accordion/variants.d.ts.map +0 -1
- package/dist/ui/alert/alert-base.d.ts +0 -28
- package/dist/ui/alert/alert-base.d.ts.map +0 -1
- package/dist/ui/alert/alert.d.ts +0 -6
- package/dist/ui/alert/alert.d.ts.map +0 -1
- package/dist/ui/alert/animated/alert-animated.d.ts +0 -3
- package/dist/ui/alert/animated/alert-animated.d.ts.map +0 -1
- package/dist/ui/alert/animated/animations.d.ts +0 -3
- package/dist/ui/alert/animated/animations.d.ts.map +0 -1
- package/dist/ui/alert/animated/index.d.ts +0 -4
- package/dist/ui/alert/animated/index.d.ts.map +0 -1
- package/dist/ui/alert/animated/types.d.ts +0 -8
- package/dist/ui/alert/animated/types.d.ts.map +0 -1
- package/dist/ui/alert/index.d.ts +0 -5
- package/dist/ui/alert/index.d.ts.map +0 -1
- package/dist/ui/alert/types.d.ts.map +0 -1
- package/dist/ui/alert/variants.d.ts +0 -11
- package/dist/ui/alert/variants.d.ts.map +0 -1
- package/dist/ui/avatar/animated/animations.d.ts +0 -3
- package/dist/ui/avatar/animated/animations.d.ts.map +0 -1
- package/dist/ui/avatar/animated/avatar-animated.d.ts +0 -6
- package/dist/ui/avatar/animated/avatar-animated.d.ts.map +0 -1
- package/dist/ui/avatar/animated/index.d.ts.map +0 -1
- package/dist/ui/avatar/animated/types.d.ts.map +0 -1
- package/dist/ui/avatar/avatar-base.d.ts +0 -25
- package/dist/ui/avatar/avatar-base.d.ts.map +0 -1
- package/dist/ui/avatar/avatar.d.ts +0 -8
- package/dist/ui/avatar/avatar.d.ts.map +0 -1
- package/dist/ui/avatar/index.d.ts +0 -5
- package/dist/ui/avatar/index.d.ts.map +0 -1
- package/dist/ui/avatar/types.d.ts.map +0 -1
- package/dist/ui/avatar/variants.d.ts +0 -8
- package/dist/ui/avatar/variants.d.ts.map +0 -1
- package/dist/ui/badge/animated/animations.d.ts +0 -3
- package/dist/ui/badge/animated/animations.d.ts.map +0 -1
- package/dist/ui/badge/animated/badge-animated.d.ts +0 -6
- package/dist/ui/badge/animated/badge-animated.d.ts.map +0 -1
- package/dist/ui/badge/animated/index.d.ts.map +0 -1
- package/dist/ui/badge/animated/types.d.ts +0 -10
- package/dist/ui/badge/animated/types.d.ts.map +0 -1
- package/dist/ui/badge/badge-base.d.ts +0 -6
- package/dist/ui/badge/badge-base.d.ts.map +0 -1
- package/dist/ui/badge/badge.d.ts +0 -6
- package/dist/ui/badge/badge.d.ts.map +0 -1
- package/dist/ui/badge/index.d.ts.map +0 -1
- package/dist/ui/badge/types.d.ts +0 -17
- package/dist/ui/badge/types.d.ts.map +0 -1
- package/dist/ui/badge/variants.d.ts +0 -40
- package/dist/ui/badge/variants.d.ts.map +0 -1
- package/dist/ui/breadcrumb/breadcrumb.d.ts +0 -33
- package/dist/ui/breadcrumb/breadcrumb.d.ts.map +0 -1
- package/dist/ui/breadcrumb/index.d.ts +0 -4
- package/dist/ui/breadcrumb/index.d.ts.map +0 -1
- package/dist/ui/breadcrumb/types.d.ts.map +0 -1
- package/dist/ui/breadcrumb/variants.d.ts +0 -11
- package/dist/ui/breadcrumb/variants.d.ts.map +0 -1
- package/dist/ui/buttons/animated/animations.d.ts +0 -3
- package/dist/ui/buttons/animated/animations.d.ts.map +0 -1
- package/dist/ui/buttons/animated/button-animated.d.ts +0 -6
- package/dist/ui/buttons/animated/button-animated.d.ts.map +0 -1
- package/dist/ui/buttons/animated/index.d.ts.map +0 -1
- package/dist/ui/buttons/animated/types.d.ts +0 -16
- package/dist/ui/buttons/animated/types.d.ts.map +0 -1
- package/dist/ui/buttons/button-base.d.ts +0 -6
- package/dist/ui/buttons/button-base.d.ts.map +0 -1
- package/dist/ui/buttons/button.d.ts +0 -6
- package/dist/ui/buttons/button.d.ts.map +0 -1
- package/dist/ui/buttons/index.d.ts.map +0 -1
- package/dist/ui/buttons/types.d.ts.map +0 -1
- package/dist/ui/buttons/variants.d.ts +0 -5
- package/dist/ui/buttons/variants.d.ts.map +0 -1
- package/dist/ui/card/animated/animations.d.ts +0 -7
- package/dist/ui/card/animated/animations.d.ts.map +0 -1
- package/dist/ui/card/animated/card-animated.d.ts +0 -6
- package/dist/ui/card/animated/card-animated.d.ts.map +0 -1
- package/dist/ui/card/animated/index.d.ts.map +0 -1
- package/dist/ui/card/animated/types.d.ts.map +0 -1
- package/dist/ui/card/card-base.d.ts +0 -26
- package/dist/ui/card/card-base.d.ts.map +0 -1
- package/dist/ui/card/card.d.ts +0 -6
- package/dist/ui/card/card.d.ts.map +0 -1
- package/dist/ui/card/index.d.ts +0 -5
- package/dist/ui/card/index.d.ts.map +0 -1
- package/dist/ui/card/types.d.ts +0 -29
- package/dist/ui/card/types.d.ts.map +0 -1
- package/dist/ui/card/variants.d.ts +0 -18
- package/dist/ui/card/variants.d.ts.map +0 -1
- package/dist/ui/divider/animated/animations.d.ts +0 -6
- package/dist/ui/divider/animated/animations.d.ts.map +0 -1
- package/dist/ui/divider/animated/divider-animated.d.ts +0 -6
- package/dist/ui/divider/animated/divider-animated.d.ts.map +0 -1
- package/dist/ui/divider/animated/index.d.ts.map +0 -1
- package/dist/ui/divider/animated/types.d.ts.map +0 -1
- package/dist/ui/divider/divider-base.d.ts +0 -6
- package/dist/ui/divider/divider-base.d.ts.map +0 -1
- package/dist/ui/divider/divider.d.ts +0 -6
- package/dist/ui/divider/divider.d.ts.map +0 -1
- package/dist/ui/divider/index.d.ts +0 -4
- package/dist/ui/divider/index.d.ts.map +0 -1
- package/dist/ui/divider/types.d.ts.map +0 -1
- package/dist/ui/divider/variants.d.ts +0 -14
- package/dist/ui/divider/variants.d.ts.map +0 -1
- package/dist/ui/drawer/animated/animations.d.ts +0 -3
- package/dist/ui/drawer/animated/animations.d.ts.map +0 -1
- package/dist/ui/drawer/animated/drawer-content-animated.d.ts +0 -6
- package/dist/ui/drawer/animated/drawer-content-animated.d.ts.map +0 -1
- package/dist/ui/drawer/animated/index.d.ts.map +0 -1
- package/dist/ui/drawer/animated/types.d.ts +0 -9
- package/dist/ui/drawer/animated/types.d.ts.map +0 -1
- package/dist/ui/drawer/drawer-base.d.ts +0 -35
- package/dist/ui/drawer/drawer-base.d.ts.map +0 -1
- package/dist/ui/drawer/drawer.d.ts +0 -2
- package/dist/ui/drawer/drawer.d.ts.map +0 -1
- package/dist/ui/drawer/index.d.ts +0 -4
- package/dist/ui/drawer/index.d.ts.map +0 -1
- package/dist/ui/drawer/types.d.ts +0 -33
- package/dist/ui/drawer/types.d.ts.map +0 -1
- package/dist/ui/drawer/variants.d.ts +0 -10
- package/dist/ui/drawer/variants.d.ts.map +0 -1
- package/dist/ui/dropdown/dropdown.d.ts +0 -6
- package/dist/ui/dropdown/dropdown.d.ts.map +0 -1
- package/dist/ui/dropdown/index.d.ts +0 -4
- package/dist/ui/dropdown/index.d.ts.map +0 -1
- package/dist/ui/dropdown/types.d.ts +0 -38
- package/dist/ui/dropdown/types.d.ts.map +0 -1
- package/dist/ui/dropdown/variants.d.ts +0 -12
- package/dist/ui/dropdown/variants.d.ts.map +0 -1
- package/dist/ui/empty-state/animated/animations.d.ts +0 -3
- package/dist/ui/empty-state/animated/animations.d.ts.map +0 -1
- package/dist/ui/empty-state/animated/empty-state-animated.d.ts +0 -6
- package/dist/ui/empty-state/animated/empty-state-animated.d.ts.map +0 -1
- package/dist/ui/empty-state/animated/index.d.ts +0 -4
- package/dist/ui/empty-state/animated/index.d.ts.map +0 -1
- package/dist/ui/empty-state/animated/types.d.ts.map +0 -1
- package/dist/ui/empty-state/empty-state-base.d.ts +0 -23
- package/dist/ui/empty-state/empty-state-base.d.ts.map +0 -1
- package/dist/ui/empty-state/empty-state.d.ts +0 -6
- package/dist/ui/empty-state/empty-state.d.ts.map +0 -1
- package/dist/ui/empty-state/index.d.ts.map +0 -1
- package/dist/ui/empty-state/types.d.ts.map +0 -1
- package/dist/ui/empty-state/variants.d.ts +0 -12
- package/dist/ui/empty-state/variants.d.ts.map +0 -1
- package/dist/ui/file-upload/file-upload.d.ts +0 -8
- package/dist/ui/file-upload/file-upload.d.ts.map +0 -1
- package/dist/ui/file-upload/index.d.ts.map +0 -1
- package/dist/ui/file-upload/types.d.ts.map +0 -1
- package/dist/ui/file-upload/variants.d.ts +0 -4
- package/dist/ui/file-upload/variants.d.ts.map +0 -1
- package/dist/ui/inputs/animated/animations.d.ts +0 -3
- package/dist/ui/inputs/animated/animations.d.ts.map +0 -1
- package/dist/ui/inputs/animated/index.d.ts.map +0 -1
- package/dist/ui/inputs/animated/input-animated.d.ts +0 -6
- package/dist/ui/inputs/animated/input-animated.d.ts.map +0 -1
- package/dist/ui/inputs/animated/types.d.ts +0 -16
- package/dist/ui/inputs/animated/types.d.ts.map +0 -1
- package/dist/ui/inputs/index.d.ts.map +0 -1
- package/dist/ui/inputs/input-base.d.ts +0 -6
- package/dist/ui/inputs/input-base.d.ts.map +0 -1
- package/dist/ui/inputs/input.d.ts +0 -6
- package/dist/ui/inputs/input.d.ts.map +0 -1
- package/dist/ui/inputs/types.d.ts +0 -12
- package/dist/ui/inputs/types.d.ts.map +0 -1
- package/dist/ui/inputs/variants.d.ts +0 -7
- package/dist/ui/inputs/variants.d.ts.map +0 -1
- package/dist/ui/modal/animated/animations.d.ts +0 -3
- package/dist/ui/modal/animated/animations.d.ts.map +0 -1
- package/dist/ui/modal/animated/index.d.ts.map +0 -1
- package/dist/ui/modal/animated/modal-content-animated.d.ts +0 -6
- package/dist/ui/modal/animated/modal-content-animated.d.ts.map +0 -1
- package/dist/ui/modal/animated/types.d.ts +0 -9
- package/dist/ui/modal/animated/types.d.ts.map +0 -1
- package/dist/ui/modal/index.d.ts +0 -5
- package/dist/ui/modal/index.d.ts.map +0 -1
- package/dist/ui/modal/modal-base.d.ts +0 -47
- package/dist/ui/modal/modal-base.d.ts.map +0 -1
- package/dist/ui/modal/modal.d.ts +0 -6
- package/dist/ui/modal/modal.d.ts.map +0 -1
- package/dist/ui/modal/types.d.ts +0 -26
- package/dist/ui/modal/types.d.ts.map +0 -1
- package/dist/ui/modal/variants.d.ts +0 -10
- package/dist/ui/modal/variants.d.ts.map +0 -1
- package/dist/ui/pagination/index.d.ts +0 -5
- package/dist/ui/pagination/index.d.ts.map +0 -1
- package/dist/ui/pagination/pagination.d.ts +0 -17
- package/dist/ui/pagination/pagination.d.ts.map +0 -1
- package/dist/ui/pagination/types.d.ts.map +0 -1
- package/dist/ui/pagination/variants.d.ts +0 -12
- package/dist/ui/pagination/variants.d.ts.map +0 -1
- package/dist/ui/progress/animated/animations.d.ts +0 -3
- package/dist/ui/progress/animated/animations.d.ts.map +0 -1
- package/dist/ui/progress/animated/index.d.ts +0 -4
- package/dist/ui/progress/animated/index.d.ts.map +0 -1
- package/dist/ui/progress/animated/progress-animated.d.ts +0 -16
- package/dist/ui/progress/animated/progress-animated.d.ts.map +0 -1
- package/dist/ui/progress/animated/types.d.ts.map +0 -1
- package/dist/ui/progress/index.d.ts.map +0 -1
- package/dist/ui/progress/progress-base.d.ts +0 -23
- package/dist/ui/progress/progress-base.d.ts.map +0 -1
- package/dist/ui/progress/progress.d.ts +0 -6
- package/dist/ui/progress/progress.d.ts.map +0 -1
- package/dist/ui/progress/types.d.ts +0 -28
- package/dist/ui/progress/types.d.ts.map +0 -1
- package/dist/ui/progress/variants.d.ts +0 -15
- package/dist/ui/progress/variants.d.ts.map +0 -1
- package/dist/ui/select/index.d.ts +0 -4
- package/dist/ui/select/index.d.ts.map +0 -1
- package/dist/ui/select/select.d.ts +0 -10
- package/dist/ui/select/select.d.ts.map +0 -1
- package/dist/ui/select/types.d.ts +0 -48
- package/dist/ui/select/types.d.ts.map +0 -1
- package/dist/ui/select/variants.d.ts +0 -14
- package/dist/ui/select/variants.d.ts.map +0 -1
- package/dist/ui/skeleton/animated/animations.d.ts +0 -3
- package/dist/ui/skeleton/animated/animations.d.ts.map +0 -1
- package/dist/ui/skeleton/animated/index.d.ts +0 -4
- package/dist/ui/skeleton/animated/index.d.ts.map +0 -1
- package/dist/ui/skeleton/animated/skeleton-animated.d.ts +0 -22
- package/dist/ui/skeleton/animated/skeleton-animated.d.ts.map +0 -1
- package/dist/ui/skeleton/animated/types.d.ts.map +0 -1
- package/dist/ui/skeleton/index.d.ts +0 -5
- package/dist/ui/skeleton/index.d.ts.map +0 -1
- package/dist/ui/skeleton/skeleton-base.d.ts +0 -24
- package/dist/ui/skeleton/skeleton-base.d.ts.map +0 -1
- package/dist/ui/skeleton/skeleton.d.ts +0 -2
- package/dist/ui/skeleton/skeleton.d.ts.map +0 -1
- package/dist/ui/skeleton/types.d.ts.map +0 -1
- package/dist/ui/skeleton/variants.d.ts +0 -38
- package/dist/ui/skeleton/variants.d.ts.map +0 -1
- package/dist/ui/slider/index.d.ts +0 -4
- package/dist/ui/slider/index.d.ts.map +0 -1
- package/dist/ui/slider/slider.d.ts +0 -33
- package/dist/ui/slider/slider.d.ts.map +0 -1
- package/dist/ui/slider/types.d.ts +0 -49
- package/dist/ui/slider/types.d.ts.map +0 -1
- package/dist/ui/slider/variants.d.ts +0 -13
- package/dist/ui/slider/variants.d.ts.map +0 -1
- package/dist/ui/spinner/animated/index.d.ts.map +0 -1
- package/dist/ui/spinner/animated/spinner.d.ts +0 -6
- package/dist/ui/spinner/animated/spinner.d.ts.map +0 -1
- package/dist/ui/spinner/animated/types.d.ts.map +0 -1
- package/dist/ui/spinner/animated/variants.d.ts +0 -6
- package/dist/ui/spinner/animated/variants.d.ts.map +0 -1
- package/dist/ui/stepper/index.d.ts +0 -4
- package/dist/ui/stepper/index.d.ts.map +0 -1
- package/dist/ui/stepper/stepper.d.ts +0 -33
- package/dist/ui/stepper/stepper.d.ts.map +0 -1
- package/dist/ui/stepper/types.d.ts.map +0 -1
- package/dist/ui/stepper/variants.d.ts +0 -11
- package/dist/ui/stepper/variants.d.ts.map +0 -1
- package/dist/ui/table/animated/animations.d.ts +0 -3
- package/dist/ui/table/animated/animations.d.ts.map +0 -1
- package/dist/ui/table/animated/index.d.ts +0 -5
- package/dist/ui/table/animated/index.d.ts.map +0 -1
- package/dist/ui/table/animated/table-animated.d.ts +0 -5
- package/dist/ui/table/animated/table-animated.d.ts.map +0 -1
- package/dist/ui/table/animated/types.d.ts +0 -8
- package/dist/ui/table/animated/types.d.ts.map +0 -1
- package/dist/ui/table/index.d.ts +0 -4
- package/dist/ui/table/index.d.ts.map +0 -1
- package/dist/ui/table/table-base.d.ts +0 -38
- package/dist/ui/table/table-base.d.ts.map +0 -1
- package/dist/ui/table/table.d.ts +0 -2
- package/dist/ui/table/table.d.ts.map +0 -1
- package/dist/ui/table/types.d.ts +0 -33
- package/dist/ui/table/types.d.ts.map +0 -1
- package/dist/ui/table/variants.d.ts +0 -14
- package/dist/ui/table/variants.d.ts.map +0 -1
- package/dist/ui/tabs/animated/animations.d.ts +0 -5
- package/dist/ui/tabs/animated/animations.d.ts.map +0 -1
- package/dist/ui/tabs/animated/index.d.ts.map +0 -1
- package/dist/ui/tabs/animated/tabs-content-animated.d.ts +0 -6
- package/dist/ui/tabs/animated/tabs-content-animated.d.ts.map +0 -1
- package/dist/ui/tabs/animated/types.d.ts +0 -14
- package/dist/ui/tabs/animated/types.d.ts.map +0 -1
- package/dist/ui/tabs/index.d.ts.map +0 -1
- package/dist/ui/tabs/tabs-base.d.ts +0 -8
- package/dist/ui/tabs/tabs-base.d.ts.map +0 -1
- package/dist/ui/tabs/tabs.d.ts.map +0 -1
- package/dist/ui/tabs/types.d.ts +0 -40
- package/dist/ui/tabs/types.d.ts.map +0 -1
- package/dist/ui/tabs/variants.d.ts +0 -11
- package/dist/ui/tabs/variants.d.ts.map +0 -1
- package/dist/ui/toast/animated/animations.d.ts +0 -3
- package/dist/ui/toast/animated/animations.d.ts.map +0 -1
- package/dist/ui/toast/animated/index.d.ts +0 -4
- package/dist/ui/toast/animated/index.d.ts.map +0 -1
- package/dist/ui/toast/animated/toast-animated.d.ts +0 -10
- package/dist/ui/toast/animated/toast-animated.d.ts.map +0 -1
- package/dist/ui/toast/animated/types.d.ts +0 -5
- package/dist/ui/toast/animated/types.d.ts.map +0 -1
- package/dist/ui/toast/index.d.ts +0 -4
- package/dist/ui/toast/index.d.ts.map +0 -1
- package/dist/ui/toast/toast-base.d.ts +0 -35
- package/dist/ui/toast/toast-base.d.ts.map +0 -1
- package/dist/ui/toast/toast.d.ts +0 -2
- package/dist/ui/toast/toast.d.ts.map +0 -1
- package/dist/ui/toast/types.d.ts.map +0 -1
- package/dist/ui/toast/variants.d.ts +0 -8
- package/dist/ui/toast/variants.d.ts.map +0 -1
- package/dist/ui/toggle/animated/animations.d.ts +0 -3
- package/dist/ui/toggle/animated/animations.d.ts.map +0 -1
- package/dist/ui/toggle/animated/index.d.ts +0 -4
- package/dist/ui/toggle/animated/index.d.ts.map +0 -1
- package/dist/ui/toggle/animated/toggle-animated.d.ts +0 -6
- package/dist/ui/toggle/animated/toggle-animated.d.ts.map +0 -1
- package/dist/ui/toggle/animated/types.d.ts.map +0 -1
- package/dist/ui/toggle/index.d.ts.map +0 -1
- package/dist/ui/toggle/toggle-base.d.ts +0 -6
- package/dist/ui/toggle/toggle-base.d.ts.map +0 -1
- package/dist/ui/toggle/toggle.d.ts +0 -6
- package/dist/ui/toggle/toggle.d.ts.map +0 -1
- package/dist/ui/toggle/types.d.ts.map +0 -1
- package/dist/ui/toggle/variants.d.ts +0 -8
- package/dist/ui/toggle/variants.d.ts.map +0 -1
- package/dist/ui/tooltip/animated/animations.d.ts +0 -3
- package/dist/ui/tooltip/animated/animations.d.ts.map +0 -1
- package/dist/ui/tooltip/animated/index.d.ts +0 -4
- package/dist/ui/tooltip/animated/index.d.ts.map +0 -1
- package/dist/ui/tooltip/animated/tooltip-content-animated.d.ts +0 -3
- package/dist/ui/tooltip/animated/tooltip-content-animated.d.ts.map +0 -1
- package/dist/ui/tooltip/animated/types.d.ts +0 -9
- package/dist/ui/tooltip/animated/types.d.ts.map +0 -1
- package/dist/ui/tooltip/index.d.ts +0 -4
- package/dist/ui/tooltip/index.d.ts.map +0 -1
- package/dist/ui/tooltip/tooltip-base.d.ts +0 -7
- package/dist/ui/tooltip/tooltip-base.d.ts.map +0 -1
- package/dist/ui/tooltip/tooltip.d.ts +0 -2
- package/dist/ui/tooltip/tooltip.d.ts.map +0 -1
- package/dist/ui/tooltip/types.d.ts +0 -30
- package/dist/ui/tooltip/types.d.ts.map +0 -1
- package/dist/ui/tooltip/variants.d.ts +0 -6
- package/dist/ui/tooltip/variants.d.ts.map +0 -1
- package/dist/vitest-setup.d.ts +0 -2
- package/dist/vitest-setup.d.ts.map +0 -1
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
export type UseClipboardResult = {
|
|
6
|
+
/** `true` after a successful `copy` until the reset delay elapses or `reset` is called. */
|
|
7
|
+
copied: boolean;
|
|
8
|
+
/** Set when the Clipboard API is missing or `writeText` rejects (e.g. permission denied). */
|
|
9
|
+
error: Error | undefined;
|
|
10
|
+
/** Writes `text` via `navigator.clipboard.writeText`; returns whether the write succeeded. */
|
|
11
|
+
copy: (text: string) => Promise<boolean>;
|
|
12
|
+
/** Clears `copied`/`error` and cancels any pending auto-reset timeout. */
|
|
13
|
+
reset: () => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Wraps the async Clipboard API with React state for UX feedback (“Copied!”) and error surfacing.
|
|
18
|
+
*
|
|
19
|
+
* After a successful copy, `copied` flips to `true` for `resetDelay` ms (or stays true if `resetDelay` is 0).
|
|
20
|
+
* SSR-safe: `copy` resolves `false` with an error when `navigator.clipboard` is unavailable.
|
|
21
|
+
*
|
|
22
|
+
* @param resetDelay - Milliseconds before `copied` auto-clears after success; `0` disables auto-clear.
|
|
23
|
+
* @returns `{ copied, error, copy, reset }` for rendering and handlers.
|
|
24
|
+
*/
|
|
25
|
+
export function useClipboard(resetDelay = 2000): UseClipboardResult {
|
|
26
|
+
const [copied, setCopied] = useState(false);
|
|
27
|
+
const [error, setError] = useState<Error | undefined>(undefined);
|
|
28
|
+
const timeoutRef = useRef<ReturnType<typeof setTimeout> | undefined>(
|
|
29
|
+
undefined,
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
const reset = useCallback(() => {
|
|
33
|
+
if (timeoutRef.current) {
|
|
34
|
+
clearTimeout(timeoutRef.current);
|
|
35
|
+
timeoutRef.current = undefined;
|
|
36
|
+
}
|
|
37
|
+
setCopied(false);
|
|
38
|
+
setError(undefined);
|
|
39
|
+
}, []);
|
|
40
|
+
|
|
41
|
+
const copy = useCallback(
|
|
42
|
+
async (text: string) => {
|
|
43
|
+
reset();
|
|
44
|
+
if (typeof navigator === "undefined" || !navigator.clipboard?.writeText) {
|
|
45
|
+
const err = new Error("Clipboard API is not available");
|
|
46
|
+
setError(err);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
await navigator.clipboard.writeText(text);
|
|
51
|
+
setCopied(true);
|
|
52
|
+
if (resetDelay > 0) {
|
|
53
|
+
timeoutRef.current = setTimeout(() => {
|
|
54
|
+
setCopied(false);
|
|
55
|
+
}, resetDelay);
|
|
56
|
+
}
|
|
57
|
+
return true;
|
|
58
|
+
} catch (cause) {
|
|
59
|
+
const err =
|
|
60
|
+
cause instanceof Error ? cause : new Error(String(cause));
|
|
61
|
+
setError(err);
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
[reset, resetDelay],
|
|
66
|
+
);
|
|
67
|
+
|
|
68
|
+
return { copied, error, copy, reset };
|
|
69
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { act, renderHook } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { useControllableState } from "./useControllableState";
|
|
5
|
+
|
|
6
|
+
describe("useControllableState", () => {
|
|
7
|
+
it("should use internal state when uncontrolled", () => {
|
|
8
|
+
const { result } = renderHook(() =>
|
|
9
|
+
useControllableState({ defaultValue: 1 }),
|
|
10
|
+
);
|
|
11
|
+
expect(result.current[0]).toBe(1);
|
|
12
|
+
act(() => {
|
|
13
|
+
result.current[1](2);
|
|
14
|
+
});
|
|
15
|
+
expect(result.current[0]).toBe(2);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("should follow value prop when controlled", () => {
|
|
19
|
+
const onChange = vi.fn();
|
|
20
|
+
const { result, rerender } = renderHook(
|
|
21
|
+
({ value }: { value: number }) =>
|
|
22
|
+
useControllableState({ value, defaultValue: 0, onChange }),
|
|
23
|
+
{ initialProps: { value: 5 } },
|
|
24
|
+
);
|
|
25
|
+
expect(result.current[0]).toBe(5);
|
|
26
|
+
act(() => {
|
|
27
|
+
result.current[1](9);
|
|
28
|
+
});
|
|
29
|
+
expect(result.current[0]).toBe(5);
|
|
30
|
+
expect(onChange).toHaveBeenCalledWith(9);
|
|
31
|
+
rerender({ value: 9 });
|
|
32
|
+
expect(result.current[0]).toBe(9);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should call onChange with functional updater using current controlled value", () => {
|
|
36
|
+
const onChange = vi.fn();
|
|
37
|
+
const { result } = renderHook(() =>
|
|
38
|
+
useControllableState({
|
|
39
|
+
value: 10,
|
|
40
|
+
defaultValue: 0,
|
|
41
|
+
onChange,
|
|
42
|
+
}),
|
|
43
|
+
);
|
|
44
|
+
act(() => {
|
|
45
|
+
result.current[1]((previous) => previous + 1);
|
|
46
|
+
});
|
|
47
|
+
expect(onChange).toHaveBeenCalledWith(11);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("should apply functional updater in uncontrolled mode", () => {
|
|
51
|
+
const { result } = renderHook(() =>
|
|
52
|
+
useControllableState({ defaultValue: 3 }),
|
|
53
|
+
);
|
|
54
|
+
act(() => {
|
|
55
|
+
result.current[1]((previous) => previous * 2);
|
|
56
|
+
});
|
|
57
|
+
expect(result.current[0]).toBe(6);
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
export type UseControllableStateParams<T> = {
|
|
6
|
+
/** When defined, the hook is controlled and this value is returned as state. */
|
|
7
|
+
value?: T;
|
|
8
|
+
/** Initial / fallback value when uncontrolled (`value` is `undefined`). */
|
|
9
|
+
defaultValue: T;
|
|
10
|
+
/** Notified on every `setValue` with the resolved next value (controlled and uncontrolled). */
|
|
11
|
+
onChange?: (next: T) => void;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Implements the React “controlled vs uncontrolled” pattern as a single state tuple.
|
|
16
|
+
*
|
|
17
|
+
* - If `value` is `undefined`, internal state mirrors `defaultValue` and updates on `setValue`.
|
|
18
|
+
* - If `value` is defined, returned state follows `value`; `setValue` still calls `onChange` so the parent can update.
|
|
19
|
+
* - `setValue` accepts either the next value or an updater `(prev) => next` (updater uses the current `value` in controlled mode).
|
|
20
|
+
*
|
|
21
|
+
* @typeParam T - State value type.
|
|
22
|
+
* @param params - `value`, `defaultValue`, and optional `onChange`.
|
|
23
|
+
* @returns `[value, setValue]` compatible with `useState`-style usage.
|
|
24
|
+
*/
|
|
25
|
+
export function useControllableState<T>({
|
|
26
|
+
value: valueProp,
|
|
27
|
+
defaultValue,
|
|
28
|
+
onChange,
|
|
29
|
+
}: UseControllableStateParams<T>): [T, (next: T | ((prev: T) => T)) => void] {
|
|
30
|
+
const [uncontrolled, setUncontrolled] = useState(defaultValue);
|
|
31
|
+
const isControlled = valueProp !== undefined;
|
|
32
|
+
const value = isControlled ? valueProp : uncontrolled;
|
|
33
|
+
const onChangeRef = useRef(onChange);
|
|
34
|
+
onChangeRef.current = onChange;
|
|
35
|
+
|
|
36
|
+
const setValue = useCallback(
|
|
37
|
+
(next: T | ((prev: T) => T)) => {
|
|
38
|
+
const resolved =
|
|
39
|
+
typeof next === "function" ? (next as (prev: T) => T)(value) : next;
|
|
40
|
+
if (!isControlled) {
|
|
41
|
+
setUncontrolled(resolved);
|
|
42
|
+
}
|
|
43
|
+
onChangeRef.current?.(resolved);
|
|
44
|
+
},
|
|
45
|
+
[isControlled, value],
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
return [value, setValue];
|
|
49
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { act, renderHook } from "@testing-library/react";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { useDebouncedValue } from "./useDebouncedValue";
|
|
5
|
+
|
|
6
|
+
describe("useDebouncedValue", () => {
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
vi.useFakeTimers();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
vi.useRealTimers();
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should return initial value immediately", () => {
|
|
16
|
+
const { result } = renderHook(() => useDebouncedValue("a", 300));
|
|
17
|
+
expect(result.current).toBe("a");
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should update after delay when value stabilizes", () => {
|
|
21
|
+
const { result, rerender } = renderHook(
|
|
22
|
+
({ value, delay }: { value: string; delay: number }) =>
|
|
23
|
+
useDebouncedValue(value, delay),
|
|
24
|
+
{ initialProps: { value: "x", delay: 100 } },
|
|
25
|
+
);
|
|
26
|
+
rerender({ value: "y", delay: 100 });
|
|
27
|
+
expect(result.current).toBe("x");
|
|
28
|
+
act(() => {
|
|
29
|
+
vi.advanceTimersByTime(100);
|
|
30
|
+
});
|
|
31
|
+
expect(result.current).toBe("y");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("should reset timer when value changes rapidly", () => {
|
|
35
|
+
const { result, rerender } = renderHook(
|
|
36
|
+
({ value }: { value: number }) => useDebouncedValue(value, 50),
|
|
37
|
+
{ initialProps: { value: 0 } },
|
|
38
|
+
);
|
|
39
|
+
rerender({ value: 1 });
|
|
40
|
+
act(() => {
|
|
41
|
+
vi.advanceTimersByTime(40);
|
|
42
|
+
});
|
|
43
|
+
rerender({ value: 2 });
|
|
44
|
+
act(() => {
|
|
45
|
+
vi.advanceTimersByTime(40);
|
|
46
|
+
});
|
|
47
|
+
expect(result.current).toBe(0);
|
|
48
|
+
act(() => {
|
|
49
|
+
vi.advanceTimersByTime(20);
|
|
50
|
+
});
|
|
51
|
+
expect(result.current).toBe(2);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("should reset debounce when delayMs changes", () => {
|
|
55
|
+
const { result, rerender } = renderHook(
|
|
56
|
+
({ value, delay }: { value: string; delay: number }) =>
|
|
57
|
+
useDebouncedValue(value, delay),
|
|
58
|
+
{ initialProps: { value: "a", delay: 200 } },
|
|
59
|
+
);
|
|
60
|
+
rerender({ value: "b", delay: 200 });
|
|
61
|
+
act(() => {
|
|
62
|
+
vi.advanceTimersByTime(100);
|
|
63
|
+
});
|
|
64
|
+
rerender({ value: "b", delay: 500 });
|
|
65
|
+
act(() => {
|
|
66
|
+
vi.advanceTimersByTime(200);
|
|
67
|
+
});
|
|
68
|
+
expect(result.current).toBe("a");
|
|
69
|
+
act(() => {
|
|
70
|
+
vi.advanceTimersByTime(300);
|
|
71
|
+
});
|
|
72
|
+
expect(result.current).toBe("b");
|
|
73
|
+
});
|
|
74
|
+
});
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
|
|
1
5
|
/**
|
|
2
6
|
* Returns a lagged copy of `value` that only updates after `value` has been stable for `delayMs`.
|
|
3
7
|
* Each change to `value` or `delayMs` resets the timer; rapid updates collapse into one committed update.
|
|
@@ -9,5 +13,17 @@
|
|
|
9
13
|
* @param delayMs - Debounce interval in milliseconds.
|
|
10
14
|
* @returns The last value that survived the full delay without a newer `value` arriving.
|
|
11
15
|
*/
|
|
12
|
-
export
|
|
13
|
-
|
|
16
|
+
export function useDebouncedValue<T>(value: T, delayMs: number): T {
|
|
17
|
+
const [debounced, setDebounced] = useState(value);
|
|
18
|
+
|
|
19
|
+
useEffect(() => {
|
|
20
|
+
const id = setTimeout(() => {
|
|
21
|
+
setDebounced(value);
|
|
22
|
+
}, delayMs);
|
|
23
|
+
return () => {
|
|
24
|
+
clearTimeout(id);
|
|
25
|
+
};
|
|
26
|
+
}, [delayMs, value]);
|
|
27
|
+
|
|
28
|
+
return debounced;
|
|
29
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { act, renderHook } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { useDisclosure } from "./useDisclosure";
|
|
5
|
+
|
|
6
|
+
describe("useDisclosure", () => {
|
|
7
|
+
it("should start closed by default", () => {
|
|
8
|
+
const { result } = renderHook(() => useDisclosure());
|
|
9
|
+
expect(result.current.isOpen).toBe(false);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("should respect defaultOpen when uncontrolled", () => {
|
|
13
|
+
const { result } = renderHook(() => useDisclosure({ defaultOpen: true }));
|
|
14
|
+
expect(result.current.isOpen).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should open close and toggle", () => {
|
|
18
|
+
const { result } = renderHook(() => useDisclosure({ defaultOpen: false }));
|
|
19
|
+
act(() => {
|
|
20
|
+
result.current.open();
|
|
21
|
+
});
|
|
22
|
+
expect(result.current.isOpen).toBe(true);
|
|
23
|
+
act(() => {
|
|
24
|
+
result.current.close();
|
|
25
|
+
});
|
|
26
|
+
expect(result.current.isOpen).toBe(false);
|
|
27
|
+
act(() => {
|
|
28
|
+
result.current.toggle();
|
|
29
|
+
});
|
|
30
|
+
expect(result.current.isOpen).toBe(true);
|
|
31
|
+
act(() => {
|
|
32
|
+
result.current.toggle();
|
|
33
|
+
});
|
|
34
|
+
expect(result.current.isOpen).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
it("should call onOpenChange when state changes", () => {
|
|
38
|
+
const onOpenChange = vi.fn();
|
|
39
|
+
const { result } = renderHook(() =>
|
|
40
|
+
useDisclosure({ defaultOpen: false, onOpenChange }),
|
|
41
|
+
);
|
|
42
|
+
act(() => {
|
|
43
|
+
result.current.setOpen(true);
|
|
44
|
+
});
|
|
45
|
+
expect(onOpenChange).toHaveBeenLastCalledWith(true);
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it("should be controlled when open prop is defined", () => {
|
|
49
|
+
const onOpenChange = vi.fn();
|
|
50
|
+
const { result, rerender } = renderHook(
|
|
51
|
+
({ open }: { open: boolean }) =>
|
|
52
|
+
useDisclosure({ open, onOpenChange }),
|
|
53
|
+
{ initialProps: { open: false } },
|
|
54
|
+
);
|
|
55
|
+
expect(result.current.isOpen).toBe(false);
|
|
56
|
+
act(() => {
|
|
57
|
+
result.current.open();
|
|
58
|
+
});
|
|
59
|
+
expect(result.current.isOpen).toBe(false);
|
|
60
|
+
expect(onOpenChange).toHaveBeenCalledWith(true);
|
|
61
|
+
rerender({ open: true });
|
|
62
|
+
expect(result.current.isOpen).toBe(true);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useCallback } from "react";
|
|
4
|
+
|
|
5
|
+
import { useControllableState } from "../useControllableState";
|
|
6
|
+
|
|
7
|
+
export type UseDisclosureParams = {
|
|
8
|
+
/** Controlled open flag; omit for uncontrolled usage with `defaultOpen`. */
|
|
9
|
+
open?: boolean;
|
|
10
|
+
/** Initial open state when uncontrolled. */
|
|
11
|
+
defaultOpen?: boolean;
|
|
12
|
+
/** Fired whenever open state changes from user-driven `setOpen` / `open` / `close` / `toggle`. */
|
|
13
|
+
onOpenChange?: (open: boolean) => void;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type UseDisclosureResult = {
|
|
17
|
+
isOpen: boolean;
|
|
18
|
+
open: () => void;
|
|
19
|
+
close: () => void;
|
|
20
|
+
toggle: () => void;
|
|
21
|
+
setOpen: (open: boolean) => void;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Boolean open/close state for overlays (dialogs, menus, collapsible regions) with optional control from the parent.
|
|
26
|
+
* Built on {@link useControllableState}; semantics match common headless UI libraries.
|
|
27
|
+
*
|
|
28
|
+
* @param params - Optional `open`, `defaultOpen`, and `onOpenChange`.
|
|
29
|
+
* @returns Helpers `open`, `close`, `toggle`, `setOpen`, and the current `isOpen` flag.
|
|
30
|
+
*/
|
|
31
|
+
export function useDisclosure({
|
|
32
|
+
open: openProp,
|
|
33
|
+
defaultOpen = false,
|
|
34
|
+
onOpenChange,
|
|
35
|
+
}: UseDisclosureParams = {}): UseDisclosureResult {
|
|
36
|
+
const [isOpen, setOpenState] = useControllableState({
|
|
37
|
+
value: openProp,
|
|
38
|
+
defaultValue: defaultOpen,
|
|
39
|
+
onChange: onOpenChange,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const setOpen = useCallback(
|
|
43
|
+
(open: boolean) => {
|
|
44
|
+
setOpenState(open);
|
|
45
|
+
},
|
|
46
|
+
[setOpenState],
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
const open = useCallback(() => {
|
|
50
|
+
setOpenState(true);
|
|
51
|
+
}, [setOpenState]);
|
|
52
|
+
|
|
53
|
+
const close = useCallback(() => {
|
|
54
|
+
setOpenState(false);
|
|
55
|
+
}, [setOpenState]);
|
|
56
|
+
|
|
57
|
+
const toggle = useCallback(() => {
|
|
58
|
+
setOpenState(!isOpen);
|
|
59
|
+
}, [isOpen, setOpenState]);
|
|
60
|
+
|
|
61
|
+
return { isOpen, open, close, toggle, setOpen };
|
|
62
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { renderHook } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { useDocumentTitle } from "./useDocumentTitle";
|
|
5
|
+
|
|
6
|
+
describe("useDocumentTitle", () => {
|
|
7
|
+
it("should set document title from title prop", () => {
|
|
8
|
+
document.title = "Original";
|
|
9
|
+
const { unmount } = renderHook(() =>
|
|
10
|
+
useDocumentTitle({ title: "Page A" }),
|
|
11
|
+
);
|
|
12
|
+
expect(document.title).toBe("Page A");
|
|
13
|
+
unmount();
|
|
14
|
+
expect(document.title).toBe("Original");
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should update title when title prop changes", () => {
|
|
18
|
+
document.title = "Start";
|
|
19
|
+
const { rerender, unmount } = renderHook(
|
|
20
|
+
({ title }: { title: string }) => useDocumentTitle({ title }),
|
|
21
|
+
{ initialProps: { title: "One" } },
|
|
22
|
+
);
|
|
23
|
+
expect(document.title).toBe("One");
|
|
24
|
+
rerender({ title: "Two" });
|
|
25
|
+
expect(document.title).toBe("Two");
|
|
26
|
+
unmount();
|
|
27
|
+
expect(document.title).toBe("Start");
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it("should not restore when restoreOnUnmount is false", () => {
|
|
31
|
+
document.title = "KeepMe";
|
|
32
|
+
const { unmount } = renderHook(() =>
|
|
33
|
+
useDocumentTitle({ title: "Temp", restoreOnUnmount: false }),
|
|
34
|
+
);
|
|
35
|
+
expect(document.title).toBe("Temp");
|
|
36
|
+
unmount();
|
|
37
|
+
expect(document.title).toBe("Temp");
|
|
38
|
+
document.title = "KeepMe";
|
|
39
|
+
});
|
|
40
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useRef } from "react";
|
|
4
|
+
|
|
5
|
+
export type UseDocumentTitleParams = {
|
|
6
|
+
title: string;
|
|
7
|
+
/** When true (default), restores the document title from before this hook mounted when the component unmounts */
|
|
8
|
+
restoreOnUnmount?: boolean;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Keeps `document.title` in sync with `title` for the lifetime of the component.
|
|
13
|
+
*
|
|
14
|
+
* On first mount in the browser, the current title is captured. When `title` changes, the document title updates.
|
|
15
|
+
* If `restoreOnUnmount` is true when the component unmounts, the captured title is restored so nested routes or
|
|
16
|
+
* modals do not leak titles. Changing `restoreOnUnmount` while mounted does not run restore; only unmount does.
|
|
17
|
+
*
|
|
18
|
+
* @param params.title - Desired `document.title` string.
|
|
19
|
+
* @param params.restoreOnUnmount - Whether to restore the pre-mount title on unmount (default `true`). The value
|
|
20
|
+
* read at unmount time determines behavior, not mid-mount prop changes.
|
|
21
|
+
*/
|
|
22
|
+
export function useDocumentTitle({
|
|
23
|
+
title,
|
|
24
|
+
restoreOnUnmount = true,
|
|
25
|
+
}: UseDocumentTitleParams): void {
|
|
26
|
+
const originalTitle = useRef<string | undefined>(undefined);
|
|
27
|
+
const restoreOnUnmountRef = useRef(restoreOnUnmount);
|
|
28
|
+
restoreOnUnmountRef.current = restoreOnUnmount;
|
|
29
|
+
|
|
30
|
+
useEffect(() => {
|
|
31
|
+
if (typeof document === "undefined") {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
if (originalTitle.current === undefined) {
|
|
35
|
+
originalTitle.current = document.title;
|
|
36
|
+
}
|
|
37
|
+
}, []);
|
|
38
|
+
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
if (typeof document === "undefined") {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
document.title = title;
|
|
44
|
+
}, [title]);
|
|
45
|
+
|
|
46
|
+
useEffect(() => {
|
|
47
|
+
return () => {
|
|
48
|
+
if (
|
|
49
|
+
!restoreOnUnmountRef.current ||
|
|
50
|
+
typeof document === "undefined" ||
|
|
51
|
+
originalTitle.current === undefined
|
|
52
|
+
) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
document.title = originalTitle.current;
|
|
56
|
+
};
|
|
57
|
+
}, []);
|
|
58
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { createRef, useState } from "react";
|
|
2
|
+
import { fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import { useFocusManagement } from "./useFocusManagement";
|
|
6
|
+
|
|
7
|
+
function Modal({ initialOpen }: { initialOpen: boolean }) {
|
|
8
|
+
const [open, setOpen] = useState(initialOpen);
|
|
9
|
+
const contentRef = createRef<HTMLDivElement>();
|
|
10
|
+
useFocusManagement({
|
|
11
|
+
open,
|
|
12
|
+
setOpen,
|
|
13
|
+
contentRef,
|
|
14
|
+
});
|
|
15
|
+
return (
|
|
16
|
+
<div>
|
|
17
|
+
<button type="button" data-testid="trigger">
|
|
18
|
+
trigger
|
|
19
|
+
</button>
|
|
20
|
+
{open ? (
|
|
21
|
+
<div ref={contentRef} tabIndex={-1} data-testid="dialog">
|
|
22
|
+
<button type="button">first</button>
|
|
23
|
+
<button type="button">second</button>
|
|
24
|
+
</div>
|
|
25
|
+
) : null}
|
|
26
|
+
<button type="button" data-testid="after">
|
|
27
|
+
after
|
|
28
|
+
</button>
|
|
29
|
+
</div>
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
describe("useFocusManagement", () => {
|
|
34
|
+
it("should call setOpen false when Escape is pressed while open", () => {
|
|
35
|
+
render(<Modal initialOpen />);
|
|
36
|
+
fireEvent.keyDown(window, { key: "Escape" });
|
|
37
|
+
expect(screen.queryByTestId("dialog")).not.toBeInTheDocument();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
it("should not react to Escape when closed", () => {
|
|
41
|
+
render(<Modal initialOpen={false} />);
|
|
42
|
+
fireEvent.keyDown(window, { key: "Escape" });
|
|
43
|
+
expect(screen.queryByTestId("dialog")).not.toBeInTheDocument();
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import type { RefObject } from "react";
|
|
4
|
+
import { useEffect } from "react";
|
|
5
|
+
import { useBodyScrollLock } from "../useBodyScrollLock";
|
|
6
|
+
|
|
7
|
+
const FOCUSABLE_SELECTOR =
|
|
8
|
+
'a[href], button:not([disabled]), textarea, input, select, [tabindex]:not([tabindex="-1"])';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Composes modal-like behavior for an open overlay: body scroll lock, Escape to close, and focus trapping.
|
|
12
|
+
*
|
|
13
|
+
* - Delegates scroll locking to {@link useBodyScrollLock} while `open` is true.
|
|
14
|
+
* - Listens for `Escape` on `window` and calls `setOpen(false)`.
|
|
15
|
+
* - When `open` becomes true, focuses the first visible focusable inside `contentRef`, or the container itself.
|
|
16
|
+
* - Traps focus within `contentRef` via a capturing `focusin` listener on `document` that redirects focus back inside.
|
|
17
|
+
* - On close/unmount of the open effect, restores focus to the element that was focused before the trap ran.
|
|
18
|
+
*
|
|
19
|
+
* @param params.open - Whether the overlay is visible.
|
|
20
|
+
* @param params.setOpen - Setter used for Escape and cleanup paths.
|
|
21
|
+
* @param params.contentRef - Root of the dialog/drawer content (must point at a focusable container or include focusables).
|
|
22
|
+
* @param params.focusableSelector - Query selector for tabbable elements; defaults to a common interactive set.
|
|
23
|
+
*/
|
|
24
|
+
export const useFocusManagement = ({
|
|
25
|
+
open,
|
|
26
|
+
setOpen,
|
|
27
|
+
contentRef,
|
|
28
|
+
focusableSelector = FOCUSABLE_SELECTOR,
|
|
29
|
+
}: {
|
|
30
|
+
open: boolean;
|
|
31
|
+
setOpen: (open: boolean) => void;
|
|
32
|
+
contentRef: RefObject<HTMLDivElement | null>;
|
|
33
|
+
focusableSelector?: string;
|
|
34
|
+
}) => {
|
|
35
|
+
useBodyScrollLock(open);
|
|
36
|
+
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (!open) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const handleKeyDown = (event: KeyboardEvent) => {
|
|
42
|
+
if (event.key === "Escape") {
|
|
43
|
+
setOpen(false);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
window.addEventListener("keydown", handleKeyDown);
|
|
47
|
+
return () => window.removeEventListener("keydown", handleKeyDown);
|
|
48
|
+
}, [open, setOpen]);
|
|
49
|
+
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!open) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const node = contentRef.current;
|
|
55
|
+
if (!node) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const focusables = Array.from(
|
|
59
|
+
node.querySelectorAll<HTMLElement>(focusableSelector),
|
|
60
|
+
).filter((element) => element.offsetParent !== null || element === node);
|
|
61
|
+
const target = focusables[0] ?? node;
|
|
62
|
+
const previouslyFocused = document.activeElement as HTMLElement | null;
|
|
63
|
+
target.focus();
|
|
64
|
+
|
|
65
|
+
const handleFocusIn = (event: FocusEvent) => {
|
|
66
|
+
if (!node.contains(event.target as Node)) {
|
|
67
|
+
event.stopPropagation();
|
|
68
|
+
target.focus();
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
document.addEventListener("focusin", handleFocusIn);
|
|
72
|
+
return () => {
|
|
73
|
+
document.removeEventListener("focusin", handleFocusIn);
|
|
74
|
+
previouslyFocused?.focus?.();
|
|
75
|
+
};
|
|
76
|
+
}, [contentRef, open]);
|
|
77
|
+
};
|