@sth87/shadcn-design-system 0.1.9 → 0.2.0
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/AI_README.md +114 -51
- package/README.md +83 -27
- package/dist/AI_CONTEXT.md +51 -52
- package/dist/cjs/_virtual/_commonjsHelpers.cjs +0 -1
- package/dist/cjs/_virtual/index.cjs +0 -1
- package/dist/cjs/_virtual/index2.cjs +0 -1
- package/dist/cjs/components/Accordion/Accordion.cjs +0 -1
- package/dist/cjs/components/Accordion/index.cjs +1 -0
- package/dist/cjs/components/Avatar/Avatar.cjs +1 -2
- package/dist/cjs/components/Avatar/index.cjs +1 -0
- package/dist/cjs/components/Badge/Badge.cjs +0 -1
- package/dist/cjs/components/Badge/index.cjs +1 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +0 -1
- package/dist/cjs/components/Breadcrumb/index.cjs +1 -0
- package/dist/cjs/components/Button/Button.cjs +0 -1
- package/dist/cjs/components/Button/ButtonGroup.cjs +0 -1
- package/dist/cjs/components/Button/index.cjs +1 -0
- package/dist/cjs/components/Calendar/Calendar.cjs +1 -2
- package/dist/cjs/components/Calendar/index.cjs +1 -0
- package/dist/cjs/components/Carousel/Carousel.cjs +0 -1
- package/dist/cjs/components/Carousel/index.cjs +1 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -2
- package/dist/cjs/components/Checkbox/index.cjs +1 -0
- package/dist/cjs/components/Collapsible/Collapsible.cjs +0 -1
- package/dist/cjs/components/Collapsible/index.cjs +1 -0
- package/dist/cjs/components/Command/Command.cjs +0 -1
- package/dist/cjs/components/Command/index.cjs +0 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +0 -1
- package/dist/cjs/components/ContextMenu/index.cjs +0 -1
- package/dist/cjs/components/Cropper/Cropper.cjs +1 -2
- package/dist/cjs/components/Cropper/CropperTool.cjs +0 -1
- package/dist/cjs/components/Cropper/index.cjs +1 -0
- package/dist/cjs/components/Cropper/utils.cjs +0 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/index.cjs +1 -0
- package/dist/cjs/components/Dialog/Dialog.cjs +0 -1
- package/dist/cjs/components/Dialog/index.cjs +1 -0
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +0 -1
- package/dist/cjs/components/DropdownMenu/index.cjs +0 -1
- package/dist/cjs/components/FloatLabel.cjs +0 -1
- package/dist/cjs/components/Glass/Glass.cjs +1 -2
- package/dist/cjs/components/Glass/index.cjs +1 -0
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -2
- package/dist/cjs/components/ImageViewer/index.cjs +1 -0
- package/dist/cjs/components/Input/Input.cjs +1 -2
- package/dist/cjs/components/Input/index.cjs +1 -0
- package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -2
- package/dist/cjs/components/InputOTP/index.cjs +1 -0
- package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -2
- package/dist/cjs/components/Interactive/index.cjs +1 -0
- package/dist/cjs/components/Label/index.cjs +1 -0
- package/dist/cjs/components/Marquee/Marquee.cjs +1 -2
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs +0 -1
- package/dist/cjs/components/Marquee/index.cjs +0 -1
- package/dist/cjs/components/Masonry/Masonry.cjs +1 -2
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs +0 -1
- package/dist/cjs/components/Masonry/index.cjs +1 -0
- package/dist/cjs/components/Pagination/Pagination.cjs +0 -1
- package/dist/cjs/components/Pagination/index.cjs +0 -1
- package/dist/cjs/components/Popover/Popover.cjs +0 -1
- package/dist/cjs/components/Popover/index.cjs +1 -2
- package/dist/cjs/components/QrCode/QrCode.cjs +1 -2
- package/dist/cjs/components/QrCode/index.cjs +0 -1
- package/dist/cjs/components/Radio/Radio.cjs +1 -2
- package/dist/cjs/components/Radio/index.cjs +1 -0
- package/dist/cjs/components/Rate/Rate.cjs +0 -1
- package/dist/cjs/components/Rate/index.cjs +1 -0
- package/dist/cjs/components/Resizable/Resizable.cjs +0 -1
- package/dist/cjs/components/Resizable/index.cjs +1 -0
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +0 -1
- package/dist/cjs/components/ScrollArea/index.cjs +1 -0
- package/dist/cjs/components/Select/Select.cjs +1 -2
- package/dist/cjs/components/Select/index.cjs +1 -0
- package/dist/cjs/components/Separator/Separator.cjs +0 -1
- package/dist/cjs/components/Separator/index.cjs +1 -0
- package/dist/cjs/components/Sheet/Sheet.cjs +0 -1
- package/dist/cjs/components/Sheet/index.cjs +1 -0
- package/dist/cjs/components/Sidebar/Sidebar.cjs +0 -1
- package/dist/cjs/components/Sidebar/index.cjs +1 -0
- package/dist/cjs/components/Skeleton/Skeleton.cjs +0 -1
- package/dist/cjs/components/Skeleton/index.cjs +1 -0
- package/dist/cjs/components/Slider/Slider.cjs +0 -1
- package/dist/cjs/components/Slider/index.cjs +1 -0
- package/dist/cjs/components/Stepper/Stepper.cjs +1 -2
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -2
- package/dist/cjs/components/Stepper/index.cjs +0 -1
- package/dist/cjs/components/Switch/Switch.cjs +0 -1
- package/dist/cjs/components/Switch/index.cjs +1 -0
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -2
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -2
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -2
- package/dist/cjs/components/Table/data-table-column-header.cjs +1 -2
- package/dist/cjs/components/Table/data-table-pagination.cjs +1 -2
- package/dist/cjs/components/Table/data-table-toolbar.cjs +1 -2
- package/dist/cjs/components/Table/data-table-view-options.cjs +1 -2
- package/dist/cjs/components/Table/data-table.cjs +1 -2
- package/dist/cjs/components/Table/index.cjs +1 -0
- package/dist/cjs/components/Table/select-column.cjs +0 -1
- package/dist/cjs/components/Tabs/Tabs.cjs +1 -2
- package/dist/cjs/components/Tabs/classes.cjs +1 -2
- package/dist/cjs/components/Tabs/index.cjs +1 -0
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -2
- package/dist/cjs/components/Textarea/index.cjs +1 -0
- package/dist/cjs/components/TimeGridView.cjs +1 -2
- package/dist/cjs/components/Toast/Toast.cjs +1 -2
- package/dist/cjs/components/Toast/index.cjs +1 -0
- package/dist/cjs/components/Toggle/Toggle.cjs +0 -1
- package/dist/cjs/components/Toggle/index.cjs +1 -0
- package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -2
- package/dist/cjs/components/Tooltip/index.cjs +1 -0
- package/dist/cjs/components/Tour/Tour.cjs +1 -2
- package/dist/cjs/components/Tour/TourWrapper.cjs +0 -1
- package/dist/cjs/components/Tour/index.cjs +0 -1
- package/dist/cjs/components/TreeSelect/TreeSelect.cjs +0 -1
- package/dist/cjs/components/TreeSelect/index.cjs +1 -0
- package/dist/cjs/components/Upload/Upload.cjs +0 -1
- package/dist/cjs/components/Upload/index.cjs +1 -0
- package/dist/cjs/components/WheelColumn.cjs +1 -2
- package/dist/cjs/config/data-table.cjs +0 -1
- package/dist/cjs/constants/common.cjs +0 -1
- package/dist/cjs/hooks/index.cjs +1 -0
- package/dist/cjs/hooks/use-callback-ref.cjs +0 -1
- package/dist/cjs/hooks/use-data-table.cjs +1 -2
- package/dist/cjs/hooks/use-debounced-callback.cjs +1 -2
- package/dist/cjs/hooks/use-debounced-value.cjs +1 -2
- package/dist/cjs/hooks/use-event-listener.cjs +1 -2
- package/dist/cjs/hooks/use-intersection-observer.cjs +0 -1
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs +0 -1
- package/dist/cjs/hooks/use-media-query.cjs +1 -2
- package/dist/cjs/hooks/use-mouse-position.cjs +1 -0
- package/dist/cjs/hooks/use-on-click-outside.cjs +1 -2
- package/dist/cjs/hooks/use-script.cjs +0 -1
- package/dist/cjs/hooks/use-scroll-lock.cjs +1 -2
- package/dist/cjs/index.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/index.cjs +1 -0
- package/dist/cjs/lib/utils.cjs +1 -0
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/button.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/collapsible.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -2
- package/dist/cjs/packages/ui/src/components/command.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/input.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/label.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/select.cjs +1 -2
- package/dist/cjs/packages/ui/src/components/separator.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/table.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs +0 -1
- package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs +0 -1
- package/dist/cjs/packages/ui/src/lib/compose-refs.cjs +0 -1
- package/dist/cjs/packages/ui/src/lib/utils.cjs +0 -1
- package/dist/cjs/utils/animations.cjs +1 -2
- package/dist/cjs/utils/css.cjs +0 -1
- package/dist/cjs/utils/data-table.cjs +0 -1
- package/dist/cjs/utils/datetime.cjs +0 -1
- package/dist/cjs/utils/parsers.cjs +0 -1
- package/dist/esm/_virtual/_commonjsHelpers.js +0 -1
- package/dist/esm/_virtual/index.js +0 -1
- package/dist/esm/_virtual/index2.js +0 -1
- package/dist/esm/components/Accordion/Accordion.js +0 -1
- package/dist/esm/components/Accordion/index.js +9 -0
- package/dist/esm/components/Avatar/Avatar.js +32 -63
- package/dist/esm/components/Avatar/index.js +4 -0
- package/dist/esm/components/Badge/Badge.js +0 -1
- package/dist/esm/components/Badge/index.js +5 -0
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +0 -1
- package/dist/esm/components/Breadcrumb/index.js +5 -0
- package/dist/esm/components/Button/Button.js +0 -1
- package/dist/esm/components/Button/ButtonGroup.js +0 -1
- package/dist/esm/components/Button/index.js +10 -0
- package/dist/esm/components/Calendar/Calendar.js +25 -57
- package/dist/esm/components/Calendar/index.js +5 -0
- package/dist/esm/components/Carousel/Carousel.js +0 -1
- package/dist/esm/components/Carousel/index.js +6 -0
- package/dist/esm/components/Checkbox/Checkbox.js +29 -58
- package/dist/esm/components/Checkbox/index.js +5 -0
- package/dist/esm/components/Collapsible/Collapsible.js +0 -1
- package/dist/esm/components/Collapsible/index.js +5 -0
- package/dist/esm/components/Command/Command.js +0 -1
- package/dist/esm/components/Command/index.js +0 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js +0 -1
- package/dist/esm/components/ContextMenu/index.js +0 -1
- package/dist/esm/components/Cropper/Cropper.js +261 -292
- package/dist/esm/components/Cropper/CropperTool.js +0 -1
- package/dist/esm/components/Cropper/index.js +17 -0
- package/dist/esm/components/Cropper/utils.js +0 -1
- package/dist/esm/components/DatePicker/DatePicker.js +94 -122
- package/dist/esm/components/DatePicker/RangePicker.js +202 -230
- package/dist/esm/components/DatePicker/TimePicker.js +63 -92
- package/dist/esm/components/DatePicker/index.js +8 -0
- package/dist/esm/components/Dialog/Dialog.js +0 -1
- package/dist/esm/components/Dialog/index.js +5 -0
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +0 -1
- package/dist/esm/components/DropdownMenu/index.js +0 -1
- package/dist/esm/components/FloatLabel.js +0 -1
- package/dist/esm/components/Glass/Glass.js +7 -39
- package/dist/esm/components/Glass/index.js +5 -0
- package/dist/esm/components/ImageViewer/ImageViewer.js +95 -126
- package/dist/esm/components/ImageViewer/index.js +7 -0
- package/dist/esm/components/Input/Input.js +0 -1
- package/dist/esm/components/Input/index.js +5 -0
- package/dist/esm/components/InputOTP/InputOTP.js +28 -58
- package/dist/esm/components/InputOTP/index.js +5 -0
- package/dist/esm/components/Interactive/CursorFollow.js +90 -122
- package/dist/esm/components/Interactive/index.js +9 -0
- package/dist/esm/components/Label/index.js +4 -0
- package/dist/esm/components/Marquee/Marquee.js +78 -109
- package/dist/esm/components/Marquee/MarqueeWrapper.js +0 -1
- package/dist/esm/components/Marquee/index.js +0 -1
- package/dist/esm/components/Masonry/Masonry.js +67 -100
- package/dist/esm/components/Masonry/MasonryWrapper.js +0 -1
- package/dist/esm/components/Masonry/index.js +10 -0
- package/dist/esm/components/Pagination/Pagination.js +0 -1
- package/dist/esm/components/Pagination/index.js +0 -1
- package/dist/esm/components/Popover/Popover.js +0 -1
- package/dist/esm/components/Popover/index.js +3 -3
- package/dist/esm/components/QrCode/QrCode.js +126 -157
- package/dist/esm/components/QrCode/index.js +0 -1
- package/dist/esm/components/Radio/Radio.js +36 -67
- package/dist/esm/components/Radio/index.js +5 -0
- package/dist/esm/components/Rate/Rate.js +0 -1
- package/dist/esm/components/Rate/index.js +5 -0
- package/dist/esm/components/Resizable/Resizable.js +0 -1
- package/dist/esm/components/Resizable/index.js +13 -0
- package/dist/esm/components/ScrollArea/ScrollArea.js +0 -1
- package/dist/esm/components/ScrollArea/index.js +5 -0
- package/dist/esm/components/Select/Select.js +0 -1
- package/dist/esm/components/Select/index.js +5 -0
- package/dist/esm/components/Separator/Separator.js +0 -1
- package/dist/esm/components/Separator/index.js +5 -0
- package/dist/esm/components/Sheet/Sheet.js +0 -1
- package/dist/esm/components/Sheet/index.js +5 -0
- package/dist/esm/components/Sidebar/Sidebar.js +0 -1
- package/dist/esm/components/Sidebar/index.js +29 -0
- package/dist/esm/components/Skeleton/Skeleton.js +0 -1
- package/dist/esm/components/Skeleton/index.js +5 -0
- package/dist/esm/components/Slider/Slider.js +0 -1
- package/dist/esm/components/Slider/index.js +5 -0
- package/dist/esm/components/Stepper/Stepper.js +72 -102
- package/dist/esm/components/Stepper/StepperWrapper.js +42 -74
- package/dist/esm/components/Stepper/index.js +0 -1
- package/dist/esm/components/Switch/Switch.js +0 -1
- package/dist/esm/components/Switch/index.js +5 -0
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +2 -3
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +12 -13
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +66 -97
- package/dist/esm/components/Table/data-table-column-header.js +41 -73
- package/dist/esm/components/Table/data-table-pagination.js +30 -63
- package/dist/esm/components/Table/data-table-toolbar.js +43 -74
- package/dist/esm/components/Table/data-table-view-options.js +85 -116
- package/dist/esm/components/Table/data-table.js +52 -85
- package/dist/esm/components/Table/index.js +20 -0
- package/dist/esm/components/Table/select-column.js +0 -1
- package/dist/esm/components/Tabs/Tabs.js +0 -1
- package/dist/esm/components/Tabs/classes.js +23 -57
- package/dist/esm/components/Tabs/index.js +5 -0
- package/dist/esm/components/Textarea/Textarea.js +0 -1
- package/dist/esm/components/Textarea/index.js +5 -0
- package/dist/esm/components/TimeGridView.js +33 -65
- package/dist/esm/components/Toast/Toast.js +39 -71
- package/dist/esm/components/Toast/index.js +6 -0
- package/dist/esm/components/Toggle/Toggle.js +0 -1
- package/dist/esm/components/Toggle/index.js +5 -0
- package/dist/esm/components/Tooltip/Tooltip.js +34 -65
- package/dist/esm/components/Tooltip/index.js +4 -0
- package/dist/esm/components/Tour/Tour.js +331 -361
- package/dist/esm/components/Tour/TourWrapper.js +0 -1
- package/dist/esm/components/Tour/index.js +0 -1
- package/dist/esm/components/TreeSelect/TreeSelect.js +0 -1
- package/dist/esm/components/TreeSelect/index.js +5 -0
- package/dist/esm/components/Upload/Upload.js +0 -1
- package/dist/esm/components/Upload/index.js +4 -0
- package/dist/esm/components/WheelColumn.js +37 -69
- package/dist/esm/config/data-table.js +0 -1
- package/dist/esm/constants/common.js +0 -1
- package/dist/esm/hooks/index.js +26 -0
- package/dist/esm/hooks/use-callback-ref.js +0 -1
- package/dist/esm/hooks/use-data-table.js +0 -1
- package/dist/esm/hooks/use-debounced-callback.js +0 -1
- package/dist/esm/hooks/use-debounced-value.js +0 -1
- package/dist/esm/hooks/use-event-listener.js +0 -1
- package/dist/esm/hooks/use-intersection-observer.js +0 -1
- package/dist/esm/hooks/use-isomorphic-layout-effect.js +0 -1
- package/dist/esm/hooks/use-media-query.js +0 -1
- package/dist/esm/hooks/use-mouse-position.js +27 -0
- package/dist/esm/hooks/use-on-click-outside.js +0 -1
- package/dist/esm/hooks/use-script.js +0 -1
- package/dist/esm/hooks/use-scroll-lock.js +0 -1
- package/dist/esm/index.js +241 -268
- package/dist/esm/lib/TextAnimation/BlurText.js +0 -1
- package/dist/esm/lib/TextAnimation/CircularText.js +0 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js +28 -60
- package/dist/esm/lib/TextAnimation/GradientText.js +26 -58
- package/dist/esm/lib/TextAnimation/RollingText.js +0 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js +27 -59
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +26 -58
- package/dist/esm/lib/TextAnimation/SplittingText.js +0 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +29 -61
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +0 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +0 -1
- package/dist/esm/lib/TextAnimation/TypingText.js +0 -1
- package/dist/esm/lib/TextAnimation/WritingText.js +0 -1
- package/dist/esm/lib/TextAnimation/index.js +28 -0
- package/dist/esm/lib/utils.js +12 -0
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js +0 -1
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js +0 -1
- package/dist/esm/packages/ui/src/components/accordion.js +0 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js +0 -1
- package/dist/esm/packages/ui/src/components/avatar.js +0 -1
- package/dist/esm/packages/ui/src/components/badge.js +0 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js +0 -1
- package/dist/esm/packages/ui/src/components/button-group.js +0 -1
- package/dist/esm/packages/ui/src/components/button.js +0 -1
- package/dist/esm/packages/ui/src/components/calendar.js +0 -1
- package/dist/esm/packages/ui/src/components/checkbox.js +0 -1
- package/dist/esm/packages/ui/src/components/collapsible.js +0 -1
- package/dist/esm/packages/ui/src/components/combobox.js +96 -81
- package/dist/esm/packages/ui/src/components/command.js +0 -1
- package/dist/esm/packages/ui/src/components/context-menu.js +0 -1
- package/dist/esm/packages/ui/src/components/dialog.js +0 -1
- package/dist/esm/packages/ui/src/components/drawer.js +0 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js +0 -1
- package/dist/esm/packages/ui/src/components/input-otp.js +0 -1
- package/dist/esm/packages/ui/src/components/input.js +0 -1
- package/dist/esm/packages/ui/src/components/label.js +0 -1
- package/dist/esm/packages/ui/src/components/pagination.js +0 -1
- package/dist/esm/packages/ui/src/components/popover.js +0 -1
- package/dist/esm/packages/ui/src/components/radio-group.js +0 -1
- package/dist/esm/packages/ui/src/components/resizable.js +0 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js +0 -1
- package/dist/esm/packages/ui/src/components/select.js +89 -83
- package/dist/esm/packages/ui/src/components/separator.js +0 -1
- package/dist/esm/packages/ui/src/components/sheet.js +0 -1
- package/dist/esm/packages/ui/src/components/sidebar.js +0 -1
- package/dist/esm/packages/ui/src/components/skeleton.js +0 -1
- package/dist/esm/packages/ui/src/components/switch.js +0 -1
- package/dist/esm/packages/ui/src/components/table.js +0 -1
- package/dist/esm/packages/ui/src/components/tabs.js +0 -1
- package/dist/esm/packages/ui/src/components/textarea.js +0 -1
- package/dist/esm/packages/ui/src/components/toggle.js +0 -1
- package/dist/esm/packages/ui/src/components/tooltip.js +0 -1
- package/dist/esm/packages/ui/src/components/tree-view.js +1 -2
- package/dist/esm/packages/ui/src/hooks/use-mobile.js +0 -1
- package/dist/esm/packages/ui/src/lib/compose-refs.js +0 -1
- package/dist/esm/packages/ui/src/lib/utils.js +0 -1
- package/dist/esm/utils/animations.js +40 -73
- package/dist/esm/utils/css.js +0 -1
- package/dist/esm/utils/data-table.js +0 -1
- package/dist/esm/utils/datetime.js +0 -1
- package/dist/esm/utils/parsers.js +0 -1
- package/dist/types/components/Accordion/index.d.ts +1 -1
- package/dist/types/components/Accordion/index.d.ts.map +1 -1
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Badge/index.d.ts.map +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts.map +1 -1
- package/dist/types/components/Button/index.d.ts +1 -1
- package/dist/types/components/Button/index.d.ts.map +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/Checkbox/index.d.ts.map +1 -1
- package/dist/types/components/Collapsible/index.d.ts +1 -1
- package/dist/types/components/Collapsible/index.d.ts.map +1 -1
- package/dist/types/components/Cropper/Cropper.d.ts.map +1 -1
- package/dist/types/components/Dialog/index.d.ts +1 -1
- package/dist/types/components/Dialog/index.d.ts.map +1 -1
- package/dist/types/components/Glass/index.d.ts +1 -1
- package/dist/types/components/Glass/index.d.ts.map +1 -1
- package/dist/types/components/Input/index.d.ts +1 -1
- package/dist/types/components/Input/index.d.ts.map +1 -1
- package/dist/types/components/InputOTP/index.d.ts +1 -1
- package/dist/types/components/InputOTP/index.d.ts.map +1 -1
- package/dist/types/components/Label/Label.d.ts +1 -1
- package/dist/types/components/Label/Label.d.ts.map +1 -1
- package/dist/types/components/Marquee/Marquee.d.ts +1 -1
- package/dist/types/components/Marquee/Marquee.d.ts.map +1 -1
- package/dist/types/components/Masonry/Masonry.d.ts.map +1 -1
- package/dist/types/components/Popover/index.d.ts +1 -0
- package/dist/types/components/Popover/index.d.ts.map +1 -1
- package/dist/types/components/QrCode/QrCode.d.ts.map +1 -1
- package/dist/types/components/Radio/index.d.ts +1 -1
- package/dist/types/components/Radio/index.d.ts.map +1 -1
- package/dist/types/components/ScrollArea/index.d.ts +1 -1
- package/dist/types/components/ScrollArea/index.d.ts.map +1 -1
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/Select/index.d.ts.map +1 -1
- package/dist/types/components/Sheet/index.d.ts +1 -1
- package/dist/types/components/Sheet/index.d.ts.map +1 -1
- package/dist/types/components/Skeleton/index.d.ts +1 -1
- package/dist/types/components/Skeleton/index.d.ts.map +1 -1
- package/dist/types/components/Slider/Slider.d.ts +1 -1
- package/dist/types/components/Slider/index.d.ts +1 -1
- package/dist/types/components/Slider/index.d.ts.map +1 -1
- package/dist/types/components/Stepper/Stepper.d.ts.map +1 -1
- package/dist/types/components/Switch/Switch.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts.map +1 -1
- package/dist/types/components/Tabs/index.d.ts +1 -1
- package/dist/types/components/Tabs/index.d.ts.map +1 -1
- package/dist/types/components/Textarea/index.d.ts +1 -1
- package/dist/types/components/Textarea/index.d.ts.map +1 -1
- package/dist/types/components/Toggle/Toggle.d.ts +1 -1
- package/dist/types/components/Toggle/index.d.ts +1 -1
- package/dist/types/components/Toggle/index.d.ts.map +1 -1
- package/dist/types/components/Tour/Tour.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +3 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +23 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/lib/utils.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/badge.d.ts +3 -3
- package/dist/types/packages/ui/src/components/button.d.ts +2 -2
- package/dist/types/packages/ui/src/components/checkbox.d.ts +1 -1
- package/dist/types/packages/ui/src/components/combobox.d.ts +2 -2
- package/dist/types/packages/ui/src/components/combobox.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/input-otp.d.ts +1 -1
- package/dist/types/packages/ui/src/components/input.d.ts +1 -1
- package/dist/types/packages/ui/src/components/radio-group.d.ts +1 -1
- package/dist/types/packages/ui/src/components/select.d.ts +2 -2
- package/dist/types/packages/ui/src/components/select.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/switch.d.ts +1 -1
- package/dist/types/packages/ui/src/components/textarea.d.ts +1 -1
- package/dist/types/packages/ui/src/components/toggle.d.ts +1 -1
- package/dist/types/utils/parsers.d.ts +1 -1
- package/package.json +258 -258
- package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +0 -1
- package/dist/cjs/_virtual/index.cjs.map +0 -1
- package/dist/cjs/_virtual/index2.cjs.map +0 -1
- package/dist/cjs/components/Accordion/Accordion.cjs.map +0 -1
- package/dist/cjs/components/Avatar/Avatar.cjs.map +0 -1
- package/dist/cjs/components/Badge/Badge.cjs.map +0 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +0 -1
- package/dist/cjs/components/Button/Button.cjs.map +0 -1
- package/dist/cjs/components/Button/ButtonGroup.cjs.map +0 -1
- package/dist/cjs/components/Calendar/Calendar.cjs.map +0 -1
- package/dist/cjs/components/Carousel/Carousel.cjs.map +0 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +0 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +0 -1
- package/dist/cjs/components/Command/Command.cjs.map +0 -1
- package/dist/cjs/components/Command/index.cjs.map +0 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +0 -1
- package/dist/cjs/components/ContextMenu/index.cjs.map +0 -1
- package/dist/cjs/components/Cropper/Cropper.cjs.map +0 -1
- package/dist/cjs/components/Cropper/CropperTool.cjs.map +0 -1
- package/dist/cjs/components/Cropper/utils.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +0 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +0 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +0 -1
- package/dist/cjs/components/DropdownMenu/index.cjs.map +0 -1
- package/dist/cjs/components/FloatLabel.cjs.map +0 -1
- package/dist/cjs/components/Glass/Glass.cjs.map +0 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +0 -1
- package/dist/cjs/components/Input/Input.cjs.map +0 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +0 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +0 -1
- package/dist/cjs/components/Marquee/Marquee.cjs.map +0 -1
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs.map +0 -1
- package/dist/cjs/components/Marquee/index.cjs.map +0 -1
- package/dist/cjs/components/Masonry/Masonry.cjs.map +0 -1
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs.map +0 -1
- package/dist/cjs/components/Pagination/Pagination.cjs.map +0 -1
- package/dist/cjs/components/Pagination/index.cjs.map +0 -1
- package/dist/cjs/components/Popover/Popover.cjs.map +0 -1
- package/dist/cjs/components/Popover/index.cjs.map +0 -1
- package/dist/cjs/components/QrCode/QrCode.cjs.map +0 -1
- package/dist/cjs/components/QrCode/index.cjs.map +0 -1
- package/dist/cjs/components/Radio/Radio.cjs.map +0 -1
- package/dist/cjs/components/Rate/Rate.cjs.map +0 -1
- package/dist/cjs/components/Resizable/Resizable.cjs.map +0 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +0 -1
- package/dist/cjs/components/Select/Select.cjs.map +0 -1
- package/dist/cjs/components/Separator/Separator.cjs.map +0 -1
- package/dist/cjs/components/Sheet/Sheet.cjs.map +0 -1
- package/dist/cjs/components/Sidebar/Sidebar.cjs.map +0 -1
- package/dist/cjs/components/Skeleton/Skeleton.cjs.map +0 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +0 -1
- package/dist/cjs/components/Stepper/Stepper.cjs.map +0 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +0 -1
- package/dist/cjs/components/Stepper/index.cjs.map +0 -1
- package/dist/cjs/components/Switch/Switch.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-toolbar.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-view-options.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table.cjs.map +0 -1
- package/dist/cjs/components/Table/select-column.cjs.map +0 -1
- package/dist/cjs/components/Tabs/Tabs.cjs.map +0 -1
- package/dist/cjs/components/Tabs/classes.cjs.map +0 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +0 -1
- package/dist/cjs/components/TimeGridView.cjs.map +0 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +0 -1
- package/dist/cjs/components/Toggle/Toggle.cjs.map +0 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +0 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +0 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +0 -1
- package/dist/cjs/components/Tour/index.cjs.map +0 -1
- package/dist/cjs/components/TreeSelect/TreeSelect.cjs.map +0 -1
- package/dist/cjs/components/Upload/Upload.cjs.map +0 -1
- package/dist/cjs/components/WheelColumn.cjs.map +0 -1
- package/dist/cjs/config/data-table.cjs.map +0 -1
- package/dist/cjs/constants/common.cjs.map +0 -1
- package/dist/cjs/hooks/use-callback-ref.cjs.map +0 -1
- package/dist/cjs/hooks/use-data-table.cjs.map +0 -1
- package/dist/cjs/hooks/use-debounced-callback.cjs.map +0 -1
- package/dist/cjs/hooks/use-debounced-value.cjs.map +0 -1
- package/dist/cjs/hooks/use-event-listener.cjs.map +0 -1
- package/dist/cjs/hooks/use-intersection-observer.cjs.map +0 -1
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs.map +0 -1
- package/dist/cjs/hooks/use-media-query.cjs.map +0 -1
- package/dist/cjs/hooks/use-on-click-outside.cjs.map +0 -1
- package/dist/cjs/hooks/use-script.cjs.map +0 -1
- package/dist/cjs/hooks/use-scroll-lock.cjs.map +0 -1
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/button.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/collapsible.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/command.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/input.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/label.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/select.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/table.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/lib/compose-refs.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/lib/utils.cjs.map +0 -1
- package/dist/cjs/utils/animations.cjs.map +0 -1
- package/dist/cjs/utils/css.cjs.map +0 -1
- package/dist/cjs/utils/data-table.cjs.map +0 -1
- package/dist/cjs/utils/datetime.cjs.map +0 -1
- package/dist/cjs/utils/parsers.cjs.map +0 -1
- package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/esm/_virtual/index.js.map +0 -1
- package/dist/esm/_virtual/index2.js.map +0 -1
- package/dist/esm/components/Accordion/Accordion.js.map +0 -1
- package/dist/esm/components/Avatar/Avatar.js.map +0 -1
- package/dist/esm/components/Badge/Badge.js.map +0 -1
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +0 -1
- package/dist/esm/components/Button/Button.js.map +0 -1
- package/dist/esm/components/Button/ButtonGroup.js.map +0 -1
- package/dist/esm/components/Calendar/Calendar.js.map +0 -1
- package/dist/esm/components/Carousel/Carousel.js.map +0 -1
- package/dist/esm/components/Checkbox/Checkbox.js.map +0 -1
- package/dist/esm/components/Collapsible/Collapsible.js.map +0 -1
- package/dist/esm/components/Command/Command.js.map +0 -1
- package/dist/esm/components/Command/index.js.map +0 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +0 -1
- package/dist/esm/components/ContextMenu/index.js.map +0 -1
- package/dist/esm/components/Cropper/Cropper.js.map +0 -1
- package/dist/esm/components/Cropper/CropperTool.js.map +0 -1
- package/dist/esm/components/Cropper/utils.js.map +0 -1
- package/dist/esm/components/DatePicker/DatePicker.js.map +0 -1
- package/dist/esm/components/DatePicker/RangePicker.js.map +0 -1
- package/dist/esm/components/DatePicker/TimePicker.js.map +0 -1
- package/dist/esm/components/Dialog/Dialog.js.map +0 -1
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +0 -1
- package/dist/esm/components/DropdownMenu/index.js.map +0 -1
- package/dist/esm/components/FloatLabel.js.map +0 -1
- package/dist/esm/components/Glass/Glass.js.map +0 -1
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +0 -1
- package/dist/esm/components/Input/Input.js.map +0 -1
- package/dist/esm/components/InputOTP/InputOTP.js.map +0 -1
- package/dist/esm/components/Interactive/CursorFollow.js.map +0 -1
- package/dist/esm/components/Marquee/Marquee.js.map +0 -1
- package/dist/esm/components/Marquee/MarqueeWrapper.js.map +0 -1
- package/dist/esm/components/Marquee/index.js.map +0 -1
- package/dist/esm/components/Masonry/Masonry.js.map +0 -1
- package/dist/esm/components/Masonry/MasonryWrapper.js.map +0 -1
- package/dist/esm/components/Pagination/Pagination.js.map +0 -1
- package/dist/esm/components/Pagination/index.js.map +0 -1
- package/dist/esm/components/Popover/Popover.js.map +0 -1
- package/dist/esm/components/Popover/index.js.map +0 -1
- package/dist/esm/components/QrCode/QrCode.js.map +0 -1
- package/dist/esm/components/QrCode/index.js.map +0 -1
- package/dist/esm/components/Radio/Radio.js.map +0 -1
- package/dist/esm/components/Rate/Rate.js.map +0 -1
- package/dist/esm/components/Resizable/Resizable.js.map +0 -1
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +0 -1
- package/dist/esm/components/Select/Select.js.map +0 -1
- package/dist/esm/components/Separator/Separator.js.map +0 -1
- package/dist/esm/components/Sheet/Sheet.js.map +0 -1
- package/dist/esm/components/Sidebar/Sidebar.js.map +0 -1
- package/dist/esm/components/Skeleton/Skeleton.js.map +0 -1
- package/dist/esm/components/Slider/Slider.js.map +0 -1
- package/dist/esm/components/Stepper/Stepper.js.map +0 -1
- package/dist/esm/components/Stepper/StepperWrapper.js.map +0 -1
- package/dist/esm/components/Stepper/index.js.map +0 -1
- package/dist/esm/components/Switch/Switch.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +0 -1
- package/dist/esm/components/Table/data-table-column-header.js.map +0 -1
- package/dist/esm/components/Table/data-table-pagination.js.map +0 -1
- package/dist/esm/components/Table/data-table-toolbar.js.map +0 -1
- package/dist/esm/components/Table/data-table-view-options.js.map +0 -1
- package/dist/esm/components/Table/data-table.js.map +0 -1
- package/dist/esm/components/Table/select-column.js.map +0 -1
- package/dist/esm/components/Tabs/Tabs.js.map +0 -1
- package/dist/esm/components/Tabs/classes.js.map +0 -1
- package/dist/esm/components/Textarea/Textarea.js.map +0 -1
- package/dist/esm/components/TimeGridView.js.map +0 -1
- package/dist/esm/components/Toast/Toast.js.map +0 -1
- package/dist/esm/components/Toggle/Toggle.js.map +0 -1
- package/dist/esm/components/Tooltip/Tooltip.js.map +0 -1
- package/dist/esm/components/Tour/Tour.js.map +0 -1
- package/dist/esm/components/Tour/TourWrapper.js.map +0 -1
- package/dist/esm/components/Tour/index.js.map +0 -1
- package/dist/esm/components/TreeSelect/TreeSelect.js.map +0 -1
- package/dist/esm/components/Upload/Upload.js.map +0 -1
- package/dist/esm/components/WheelColumn.js.map +0 -1
- package/dist/esm/config/data-table.js.map +0 -1
- package/dist/esm/constants/common.js.map +0 -1
- package/dist/esm/hooks/use-callback-ref.js.map +0 -1
- package/dist/esm/hooks/use-data-table.js.map +0 -1
- package/dist/esm/hooks/use-debounced-callback.js.map +0 -1
- package/dist/esm/hooks/use-debounced-value.js.map +0 -1
- package/dist/esm/hooks/use-event-listener.js.map +0 -1
- package/dist/esm/hooks/use-intersection-observer.js.map +0 -1
- package/dist/esm/hooks/use-isomorphic-layout-effect.js.map +0 -1
- package/dist/esm/hooks/use-media-query.js.map +0 -1
- package/dist/esm/hooks/use-on-click-outside.js.map +0 -1
- package/dist/esm/hooks/use-script.js.map +0 -1
- package/dist/esm/hooks/use-scroll-lock.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/lib/TextAnimation/BlurText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/CircularText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +0 -1
- package/dist/esm/lib/TextAnimation/GradientText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/RollingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/SplittingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TypingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/WritingText.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js.map +0 -1
- package/dist/esm/packages/ui/src/components/accordion.js.map +0 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js.map +0 -1
- package/dist/esm/packages/ui/src/components/avatar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/badge.js.map +0 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js.map +0 -1
- package/dist/esm/packages/ui/src/components/button-group.js.map +0 -1
- package/dist/esm/packages/ui/src/components/button.js.map +0 -1
- package/dist/esm/packages/ui/src/components/calendar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/checkbox.js.map +0 -1
- package/dist/esm/packages/ui/src/components/collapsible.js.map +0 -1
- package/dist/esm/packages/ui/src/components/combobox.js.map +0 -1
- package/dist/esm/packages/ui/src/components/command.js.map +0 -1
- package/dist/esm/packages/ui/src/components/context-menu.js.map +0 -1
- package/dist/esm/packages/ui/src/components/dialog.js.map +0 -1
- package/dist/esm/packages/ui/src/components/drawer.js.map +0 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +0 -1
- package/dist/esm/packages/ui/src/components/input-otp.js.map +0 -1
- package/dist/esm/packages/ui/src/components/input.js.map +0 -1
- package/dist/esm/packages/ui/src/components/label.js.map +0 -1
- package/dist/esm/packages/ui/src/components/pagination.js.map +0 -1
- package/dist/esm/packages/ui/src/components/popover.js.map +0 -1
- package/dist/esm/packages/ui/src/components/radio-group.js.map +0 -1
- package/dist/esm/packages/ui/src/components/resizable.js.map +0 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js.map +0 -1
- package/dist/esm/packages/ui/src/components/select.js.map +0 -1
- package/dist/esm/packages/ui/src/components/separator.js.map +0 -1
- package/dist/esm/packages/ui/src/components/sheet.js.map +0 -1
- package/dist/esm/packages/ui/src/components/sidebar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/skeleton.js.map +0 -1
- package/dist/esm/packages/ui/src/components/switch.js.map +0 -1
- package/dist/esm/packages/ui/src/components/table.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tabs.js.map +0 -1
- package/dist/esm/packages/ui/src/components/textarea.js.map +0 -1
- package/dist/esm/packages/ui/src/components/toggle.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tooltip.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tree-view.js.map +0 -1
- package/dist/esm/packages/ui/src/hooks/use-mobile.js.map +0 -1
- package/dist/esm/packages/ui/src/lib/compose-refs.js.map +0 -1
- package/dist/esm/packages/ui/src/lib/utils.js.map +0 -1
- package/dist/esm/utils/animations.js.map +0 -1
- package/dist/esm/utils/css.js.map +0 -1
- package/dist/esm/utils/data-table.js.map +0 -1
- package/dist/esm/utils/datetime.js.map +0 -1
- package/dist/esm/utils/parsers.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Upload.cjs","sources":["../../../../src/components/Upload/Upload.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport {\n Upload as UploadIcon,\n X,\n File,\n FileText,\n Image as ImageIcon,\n Film,\n Music,\n Archive,\n FileCode,\n CheckCircle2,\n AlertCircle,\n Loader2,\n Eye,\n Download,\n Trash2,\n CloudUploadIcon,\n} from \"lucide-react\";\nimport { toast } from \"../Toast/Toast\";\nimport { Dialog } from \"../Dialog\";\n\n// Variants for upload container\nconst uploadVariants = cva(\n \"ds:relative ds:flex ds:justify-center ds:items-center ds:rounded-lg ds:transition-all ds:duration-200 ds:cursor-pointer ds:select-none\",\n {\n variants: {\n variant: {\n outline: \"ds:border ds:border-foreground/10 ds:bg-background ds:text-foreground\",\n primaryOutline: \"ds:border ds:border-primary ds:bg-background ds:text-primary\",\n icon: \"ds:border ds:border-primary ds:text-primary ds:bg-background ds:rounded-xl ds:p-2\",\n avatar:\n \"ds:border-2 ds:border-dashed ds:border-foreground/20 ds:bg-background ds:!w-full ds:!h-full ds:flex-col ds:text-center ds:hover:border-foreground/40 ds:!p-1\",\n avatarCircle:\n \"ds:border-2 ds:border-dashed ds:border-foreground/20 ds:bg-background ds:!w-full ds:!h-full ds:rounded-full ds:flex-col ds:text-center ds:hover:border-foreground/40 ds:!p-1\",\n dropzone:\n \"ds:border ds:border-foreground/10 ds:bg-background ds:flex-col ds:text-center ds:py-10\",\n primaryDropzone:\n \"ds:border ds:border-primary ds:bg-primary/10 ds:flex-col ds:text-center ds:py-10\",\n secondaryDropzone:\n \"ds:border ds:border-foreground/10 ds:bg-foreground/10 ds:flex-col ds:text-center ds:py-10\",\n },\n\n size: {\n small: \"ds:h-8 ds:p-[6px] ds:text-sm\",\n medium: \"ds:h-10 ds:p-2 ds:text-base\",\n large: \"ds:h-12 ds:p-3 ds:text-base\",\n },\n\n status: {\n idle: \"\",\n dragover: \"ds:border-primary ds:bg-primary/5 ds:scale-[1.02]\",\n disabled: \"ds:opacity-50 ds:cursor-not-allowed\",\n },\n },\n\n defaultVariants: {\n variant: \"outline\",\n size: \"medium\",\n status: \"idle\",\n },\n }\n);\n\n// File status type\nexport type FileStatus = \"uploading\" | \"done\" | \"error\" | \"removed\";\n\n// Upload file item interface\nexport interface UploadFile {\n uid: string;\n name: string;\n status?: FileStatus;\n url?: string;\n thumbUrl?: string;\n size?: number;\n type?: string;\n percent?: number;\n error?: Error;\n response?: any;\n originFileObj?: File;\n}\n\n// Upload props interface\nexport interface UploadProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"size\">,\n VariantProps<typeof uploadVariants> {\n // Core props\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n fileList?: UploadFile[];\n defaultFileList?: UploadFile[];\n\n // Upload behavior\n action?: string | ((file: File) => string);\n customRequest?: (options: {\n file: File;\n onProgress: (percent: number) => void;\n onSuccess: (response: any) => void;\n onError: (error: Error) => void;\n }) => void;\n beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>;\n onChange?: (info: { file: UploadFile; fileList: UploadFile[] }) => void;\n onRemove?: (file: UploadFile) => boolean | Promise<boolean> | void;\n onPreview?: (file: UploadFile) => void;\n onDownload?: (file: UploadFile) => void;\n\n // Validation\n maxCount?: number;\n maxSize?: number; // in bytes\n\n // Display\n listType?: \"text\" | \"picture\" | \"picture-card\" | \"picture-circle\";\n showUploadList?:\n | boolean\n | {\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n };\n pictureCardSize?: number; // Size in pixels for picture-card (default: auto based on cols)\n pictureCardCols?: number; // Number of columns for picture-card grid (default: 3)\n compact?: boolean; // Compact mode - shows as small button\n iconOnly?: boolean; // Show only icon without text in compact mode\n showBorder?: boolean; // Show border around upload area (default: true)\n uploadText?: string; // Custom text for upload area (default: \"Click to upload or drag and drop\")\n uploadDescription?: string; // Custom description text for upload area\n uploadIcon?: React.ReactNode; // Custom icon for upload area\n // Content\n children?: React.ReactNode;\n\n // Headers for upload request\n headers?: Record<string, string>;\n withCredentials?: boolean;\n\n // Drag and drop\n directory?: boolean;\n}\n\n// Helper function to get file icon based on type\nconst getFileIcon = (file: UploadFile) => {\n const type = file.type || \"\";\n const name = file.name.toLowerCase();\n\n if (type.startsWith(\"image/\")) return <ImageIcon className=\"ds:h-4 ds:w-4\" />;\n if (type.startsWith(\"video/\")) return <Film className=\"ds:h-4 ds:w-4\" />;\n if (type.startsWith(\"audio/\")) return <Music className=\"ds:h-4 ds:w-4\" />;\n if (name.endsWith(\".zip\") || name.endsWith(\".rar\") || name.endsWith(\".7z\"))\n return <Archive className=\"ds:h-4 ds:w-4\" />;\n if (\n name.endsWith(\".js\") ||\n name.endsWith(\".ts\") ||\n name.endsWith(\".jsx\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".css\") ||\n name.endsWith(\".html\")\n )\n return <FileCode className=\"ds:h-4 ds:w-4\" />;\n if (name.endsWith(\".txt\") || name.endsWith(\".md\"))\n return <FileText className=\"ds:h-4 ds:w-4\" />;\n return <File className=\"ds:h-4 ds:w-4\" />;\n};\n\n// Helper function to format file size\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + \" \" + sizes[i];\n};\n\n// Generate unique ID\nconst generateUID = () => {\n return `upload-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n};\n\nconst UploadBase = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n className,\n variant,\n accept,\n multiple = false,\n disabled = false,\n fileList: controlledFileList,\n defaultFileList = [],\n action,\n customRequest,\n beforeUpload,\n onChange,\n onRemove,\n onPreview,\n onDownload,\n maxCount,\n maxSize,\n listType = \"text\",\n showUploadList = true,\n pictureCardSize,\n pictureCardCols = 3,\n iconOnly = false,\n showBorder = true,\n uploadText = \"Click to upload\",\n uploadDescription,\n uploadIcon,\n size = \"medium\",\n children,\n headers,\n withCredentials,\n directory = false,\n ...props\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalFileList, setInternalFileList] =\n useState<UploadFile[]>(defaultFileList);\n const [isDragOver, setIsDragOver] = useState(false);\n\n // Built-in preview dialog state\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewImage, setPreviewImage] = useState(\"\");\n const [previewTitle, setPreviewTitle] = useState(\"\");\n\n // Use controlled or uncontrolled fileList\n const fileList = controlledFileList ?? internalFileList;\n const setFileList = controlledFileList ? undefined : setInternalFileList;\n\n // Check if dropzone variant\n const isDropzoneVariant = [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant || \"\");\n\n // Auto set listType to 'text' when directory mode is enabled or when uploading with dropzone variants\n const effectiveListType = directory\n ? \"text\"\n : isDropzoneVariant && fileList.length > 0\n ? \"text\"\n : listType;\n\n // Track the latest fileList for controlled mode\n const fileListRef = useRef<UploadFile[]>(fileList);\n fileListRef.current = fileList;\n\n // Check if can upload more files\n const canUploadMore = maxCount\n ? fileList.length < maxCount\n : directory || multiple\n ? true\n : fileList.length === 0;\n\n // Update file list\n const updateFileList = useCallback(\n (updater: (prev: UploadFile[]) => UploadFile[], file?: UploadFile) => {\n const newList = updater(fileListRef.current);\n\n if (setFileList) {\n setFileList(updater);\n }\n\n // Trigger onChange for controlled mode\n if (onChange) {\n // Always trigger onChange with the new list\n const dummyFile = file || ({} as UploadFile);\n onChange({ file: dummyFile, fileList: newList });\n }\n },\n [setFileList, onChange]\n );\n\n // Upload file\n const uploadFile = useCallback(\n (file: File) => {\n // Generate preview URL immediately for images\n const previewUrl = file.type.startsWith(\"image/\")\n ? URL.createObjectURL(file)\n : undefined;\n\n const uploadFileObj: UploadFile = {\n uid: generateUID(),\n name: file.name,\n size: file.size,\n type: file.type,\n status: \"uploading\",\n percent: 0,\n originFileObj: file,\n url: previewUrl,\n thumbUrl: previewUrl,\n };\n\n // Add to file list immediately\n updateFileList((prev) => [...prev, uploadFileObj], uploadFileObj);\n\n // Custom request\n if (customRequest) {\n customRequest({\n file,\n onProgress: (percent) => {\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f\n ),\n updatedFile\n );\n },\n onSuccess: (response) => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n ),\n successFile\n );\n },\n onError: (error) => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f\n ),\n errorFile\n );\n },\n });\n } else if (action) {\n // Default upload using fetch\n const url = typeof action === \"function\" ? action(file) : action;\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f\n ),\n updatedFile\n );\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const response = JSON.parse(xhr.responseText);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n url: response.url || response.data?.url,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n ),\n successFile\n );\n } else {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(`Upload failed with status ${xhr.status}`),\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f\n ),\n errorFile\n );\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(\"Network error\"),\n };\n updateFileList(\n (prev) =>\n prev.map((f) => (f.uid === uploadFileObj.uid ? errorFile : f)),\n errorFile\n );\n });\n\n xhr.open(\"POST\", url);\n\n // Set headers\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n if (withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n } else {\n // No action or customRequest, just mark as done (for preview only)\n setTimeout(() => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n ),\n successFile\n );\n }, 100);\n }\n },\n [action, customRequest, updateFileList, headers, withCredentials]\n );\n\n // Handle file selection\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n console.log(\"=== handleFileChange DEBUG ===\");\n console.log(\"Files from browser:\", files.length);\n console.log(\"Directory mode:\", directory);\n console.log(\"Multiple mode:\", multiple);\n console.log(\"Current fileList length:\", fileList.length);\n console.log(\n \"File names:\",\n files.map((f) => f.name)\n );\n\n if (files.length === 0) return;\n\n // Check multiple - if multiple is false and there's already a file, reject (except for directory upload)\n if (!directory && !multiple && fileList.length > 0) {\n toast.error(\n \"You can only upload one file. Please remove the existing file first.\"\n );\n return;\n }\n\n // Check max count\n if (maxCount && fileList.length + files.length > maxCount) {\n toast.error(`You can only upload up to ${maxCount} file(s)`);\n return;\n }\n\n // Process each file - collect valid files first\n let uploadedCount = 0;\n const validFiles: File[] = [];\n\n for (const file of files) {\n console.log(`\\n📁 Processing: ${file.name}`);\n\n // Check max size\n if (maxSize && file.size > maxSize) {\n console.log(\n `❌ REJECTED: File size ${file.size} exceeds maxSize ${maxSize}`\n );\n toast.error(\n `${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`\n );\n continue;\n }\n\n // Before upload hook\n if (beforeUpload) {\n console.log(`🔍 Calling beforeUpload for ${file.name}...`);\n const result = await beforeUpload(file, files);\n if (result === false) {\n console.log(`❌ REJECTED by beforeUpload: ${file.name}`);\n continue;\n }\n console.log(`✅ beforeUpload passed for ${file.name}`);\n }\n\n console.log(`✅ Valid file: ${file.name}`);\n validFiles.push(file);\n uploadedCount++;\n }\n\n console.log(\n `\\n📊 Summary: ${uploadedCount} / ${files.length} files will be uploaded`\n );\n\n // Create upload file objects for all valid files at once\n const uploadFileObjects: UploadFile[] = validFiles.map((file) => {\n const previewUrl = file.type.startsWith(\"image/\")\n ? URL.createObjectURL(file)\n : undefined;\n\n return {\n uid: generateUID(),\n name: file.name,\n size: file.size,\n type: file.type,\n status: \"uploading\" as FileStatus,\n percent: 0,\n originFileObj: file,\n url: previewUrl,\n thumbUrl: previewUrl,\n };\n });\n\n // Add all files to list at once\n updateFileList((prev) => [...prev, ...uploadFileObjects]);\n\n // Then trigger upload for each file\n uploadFileObjects.forEach((uploadFileObj, index) => {\n const file = validFiles[index];\n\n // Start upload process\n if (customRequest) {\n customRequest({\n file,\n onProgress: (percent) => {\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f\n ),\n updatedFile\n );\n },\n onSuccess: (response) => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n ),\n successFile\n );\n },\n onError: (error) => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f\n ),\n errorFile\n );\n },\n });\n } else if (action) {\n // Default upload using XHR - similar implementation\n const url = typeof action === \"function\" ? action(file) : action;\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f\n ),\n updatedFile\n );\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const response = JSON.parse(xhr.responseText);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n url: response.url || response.data?.url,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n ),\n successFile\n );\n } else {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(`Upload failed with status ${xhr.status}`),\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f\n ),\n errorFile\n );\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(\"Network error\"),\n };\n updateFileList(\n (prev) =>\n prev.map((f) => (f.uid === uploadFileObj.uid ? errorFile : f)),\n errorFile\n );\n });\n\n xhr.open(\"POST\", url);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n if (withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n } else {\n // No action or customRequest, just mark as done (mock upload)\n console.log(\n `⏱️ Mock upload starting for ${file.name} (delay: ${100 + index * 50}ms)`\n );\n setTimeout(\n () => {\n console.log(`✅ Mock upload complete for ${file.name}`);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n };\n updateFileList((prev) => {\n console.log(\n `📝 Updating status for ${file.name}, current list:`,\n prev.length\n );\n return prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f\n );\n }, successFile);\n },\n 100 + index * 50\n ); // Stagger completion times\n }\n });\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n };\n\n // Handle remove\n const handleRemove = async (file: UploadFile) => {\n if (onRemove) {\n const result = await onRemove(file);\n if (result === false) return;\n }\n\n updateFileList((prev) => prev.filter((f) => f.uid !== file.uid), {\n ...file,\n status: \"removed\" as FileStatus,\n });\n\n // Revoke object URL if exists\n if (file.url && file.url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(file.url);\n }\n };\n\n // Handle drag and drop\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && canUploadMore) {\n setIsDragOver(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (disabled || !canUploadMore) return;\n\n let files = Array.from(e.dataTransfer.files);\n\n if (files.length === 0) return;\n\n // Check multiple - if multiple is false and there's already a file, reject\n if (!multiple && fileList.length > 0) {\n toast.error(\n \"You can only upload one file. Please remove the existing file first.\"\n );\n return;\n }\n\n // Check multiple - only allow 1 file if multiple is false\n if (!multiple && files.length > 1) {\n toast.error(\"You can only upload one file at a time\");\n files = [files[0]]; // Take only the first file\n }\n\n // Check max count\n if (maxCount && fileList.length + files.length > maxCount) {\n toast.error(`You can only upload up to ${maxCount} file(s)`);\n return;\n }\n\n // Process each file\n for (const file of files) {\n // Check accept\n if (accept && !file.type.match(new RegExp(accept.replace(/,/g, \"|\")))) {\n continue;\n }\n\n // Check max size\n if (maxSize && file.size > maxSize) {\n toast.error(\n `${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`\n );\n continue;\n }\n\n // Before upload hook\n if (beforeUpload) {\n const result = await beforeUpload(file, files);\n if (result === false) continue;\n }\n\n uploadFile(file);\n }\n };\n\n // Click to upload\n const handleClick = () => {\n if (!disabled && canUploadMore) {\n inputRef.current?.click();\n }\n };\n\n // Handle preview - use built-in dialog if no onPreview provided\n const handlePreview = (file: UploadFile) => {\n if (onPreview) {\n onPreview(file);\n } else {\n // Built-in preview for images\n if (file.url || file.thumbUrl) {\n setPreviewImage(file.url || file.thumbUrl || \"\");\n setPreviewTitle(file.name);\n setPreviewOpen(true);\n }\n }\n };\n\n // Handle download - use built-in download if no onDownload provided\n const handleDownload = async (file: UploadFile) => {\n if (onDownload) {\n onDownload(file);\n } else {\n // Built-in download - handle cross-origin URLs\n if (file.url) {\n // Don't allow download for uploading or error status\n if (file.status === \"uploading\") {\n toast.error(\"Please wait until the file finishes uploading\");\n return;\n }\n if (file.status === \"error\") {\n toast.error(\"Cannot download file with error status\");\n return;\n }\n\n try {\n // For cross-origin URLs (like Unsplash), we need to fetch and create a blob\n const response = await fetch(file.url);\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = file.name;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up blob URL after download\n setTimeout(() => URL.revokeObjectURL(blobUrl), 100);\n } catch {\n // Fallback to direct link if fetch fails (e.g., CORS issues)\n const link = document.createElement(\"a\");\n link.href = file.url;\n link.download = file.name;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n }\n };\n\n // Show upload list config\n const uploadListConfig =\n typeof showUploadList === \"boolean\"\n ? {\n showPreviewIcon: true,\n showRemoveIcon: true,\n showDownloadIcon: true,\n }\n : {\n showPreviewIcon: showUploadList.showPreviewIcon ?? true,\n showRemoveIcon: showUploadList.showRemoveIcon ?? true,\n showDownloadIcon: showUploadList.showDownloadIcon ?? true,\n };\n\n return (\n <>\n <div ref={ref} className={cn(className)} {...props}>\n {/* Upload Area - Always show, just disable when needed */}\n <div\n className={cn(\n uploadVariants({\n variant,\n status:\n disabled || !canUploadMore\n ? \"disabled\"\n : isDragOver\n ? \"dragover\"\n : \"idle\",\n size: [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? undefined\n : size,\n }),\n [\"dropzone\", \"primaryDropzone\", \"secondaryDropzone\"].includes(\n variant as any\n ) && \"ds:min-h-[180px] ds:min-w-[300px]\",\n !showBorder && \"ds:border-0\",\n !iconOnly &&\n variant !== \"avatar\" &&\n variant !== \"avatarCircle\" &&\n \"ds:px-4\",\n // Remove disabled opacity for avatar variants when image is shown\n (variant === \"avatar\" || variant === \"avatarCircle\") &&\n fileList.length > 0 &&\n fileList[0].url &&\n \"ds:opacity-100!\"\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileChange}\n className=\"ds:hidden\"\n {...(directory\n ? ({ webkitdirectory: \"\", directory: \"\" } as any)\n : {})}\n />\n\n {/* Avatar variant - show image if exists and not disabled, otherwise show children */}\n {variant === \"avatar\" || variant === \"avatarCircle\" ? (\n <>\n {fileList.length > 0 && fileList[0].url && !disabled ? (\n <div className=\"ds:relative ds:w-full ds:h-full ds:group\">\n <img\n draggable={false}\n src={fileList[0].url || fileList[0].thumbUrl}\n alt={fileList[0].name}\n className={cn(\n \"ds:w-full ds:h-full ds:object-cover\",\n variant === \"avatarCircle\" && \"ds:rounded-full\",\n variant === \"avatar\" && \"ds:rounded-lg\"\n )}\n />\n {/* Delete button overlay */}\n <div\n className={cn(\n \"ds:absolute ds:inset-0 ds:bg-black/50 ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity ds:flex ds:items-center ds:justify-center\",\n variant === \"avatarCircle\" && \"ds:rounded-full\",\n variant === \"avatar\" && \"ds:rounded-lg\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(fileList[0]);\n }}\n >\n <Trash2 className=\"ds:h-6 ds:w-6 ds:text-white ds:cursor-pointer ds:hover:scale-110 ds:transition-transform\" />\n </div>\n </div>\n ) : (\n children\n )}\n </>\n ) : (\n <div\n className={cn(\n \"ds:flex ds:items-center ds:justify-center ds:gap-2\",\n [\"secondaryDropzone\", \"dropzone\", \"primaryDropzone\"].includes(\n variant as any\n ) && \"ds:flex-col\"\n )}\n >\n {uploadIcon ? (\n <div\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"ds:h-10 ds:w-10\"\n : size === \"small\"\n ? \"ds:h-5 ds:w-5\"\n : \"ds:h-6 ds:w-6\",\n variant === \"outline\" && \"ds:text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"ds:text-primary\"\n )}\n >\n {uploadIcon}\n </div>\n ) : (\n <>\n {iconOnly ? (\n <UploadIcon\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"ds:h-10 ds:w-10\"\n : size === \"small\"\n ? \"ds:h-5 ds:w-5\"\n : \"ds:h-6 ds:w-6\",\n variant === \"outline\" && \"ds:text-gray-500\",\n [\n \"secondaryDropzone\",\n \"primaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"ds:text-primary\"\n )}\n />\n ) : (\n <CloudUploadIcon\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"ds:h-10 ds:w-10\"\n : size === \"small\"\n ? \"ds:h-5 ds:w-5\"\n : \"ds:h-6 ds:w-6\",\n variant === \"outline\" && \"ds:text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"ds:text-primary\"\n )}\n />\n )}\n </>\n )}\n {!iconOnly && (\n <>\n <span className=\"ds:font-medium ds:whitespace-nowrap ds:text-sm\">\n {uploadText}\n </span>\n {uploadDescription &&\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any) && (\n <span className=\"ds:text-xs ds:text-gray-500\">\n {uploadDescription}\n </span>\n )}\n </>\n )}\n </div>\n )}\n </div>\n\n {/* File List */}\n {showUploadList && fileList.length > 0 && (\n <div\n className={cn(\n \"ds:mt-4\",\n (effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\") &&\n \"ds:grid ds:gap-2\",\n effectiveListType === \"picture\" && \"ds:space-y-2\"\n )}\n style={{\n gridTemplateColumns:\n effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\"\n ? `repeat(${pictureCardCols}, 1fr)`\n : undefined,\n minWidth:\n effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\"\n ? \"100px\"\n : undefined,\n }}\n >\n {fileList\n .filter((file) => file.response !== Upload.LIST_IGNORE)\n .map((file) => (\n <FileItem\n key={file.uid}\n file={file}\n listType={effectiveListType}\n onRemove={() => handleRemove(file)}\n onPreview={handlePreview}\n onDownload={handleDownload}\n showPreviewIcon={uploadListConfig.showPreviewIcon}\n showRemoveIcon={uploadListConfig.showRemoveIcon}\n showDownloadIcon={uploadListConfig.showDownloadIcon}\n pictureCardSize={pictureCardSize}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Built-in preview dialog */}\n <Dialog\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n title={previewTitle}\n size=\"lg\"\n >\n <img\n src={previewImage}\n alt={previewTitle}\n className=\"ds:w-full ds:h-auto ds:max-h-[70vh] ds:object-contain\"\n />\n </Dialog>\n </>\n );\n }\n);\n\nUploadBase.displayName = \"Upload\";\n\n// Add static property for LIST_IGNORE\ninterface UploadComponent\n extends React.ForwardRefExoticComponent<\n UploadProps & React.RefAttributes<HTMLDivElement>\n > {\n LIST_IGNORE: string;\n}\n\nexport const Upload = UploadBase as UploadComponent;\nUpload.LIST_IGNORE = \"LIST_IGNORE\";\n\n// File Item Component\ninterface FileItemProps {\n file: UploadFile;\n listType: \"text\" | \"picture\" | \"picture-card\" | \"picture-circle\";\n onRemove: () => void;\n onPreview?: (file: UploadFile) => void;\n onDownload?: (file: UploadFile) => void;\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n pictureCardSize?: number;\n}\n\nconst FileItem: React.FC<FileItemProps> = ({\n file,\n listType,\n onRemove,\n onPreview,\n onDownload,\n showPreviewIcon,\n showRemoveIcon,\n showDownloadIcon,\n // pictureCardSize, // Unused currently\n}) => {\n const isImage = file.type?.startsWith(\"image/\");\n const canPreview = isImage || file.url;\n\n if (listType === \"picture-card\") {\n return (\n <div\n className=\"ds:relative ds:aspect-square ds:rounded-lg ds:border ds:bg-muted/50 ds:overflow-hidden ds:group\"\n style={{\n width: \"100px\",\n height: \"100px\",\n minWidth: \"100px\",\n minHeight: \"100px\",\n padding: \"4px\",\n }}\n >\n {/* Image or Icon */}\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"ds:h-full ds:w-full ds:object-cover ds:rounded-lg\"\n />\n ) : (\n <div className=\"ds:flex ds:items-center ds:justify-center ds:h-full\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"ds:absolute ds:inset-0 ds:bg-background/80 ds:flex ds:items-center ds:justify-center\">\n <div className=\"ds:w-full ds:px-4\">\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:mb-2\">\n <Loader2 className=\"ds:h-4 ds:w-4 ds:animate-spin\" />\n <span className=\"ds:text-xs\">{file.percent}%</span>\n </div>\n <div className=\"ds:h-1 ds:bg-muted ds:rounded-full ds:overflow-hidden\">\n <div\n className=\"ds:h-full ds:bg-primary ds:transition-all ds:duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Status Icon */}\n {file.status === \"done\" && (\n <div className=\"ds:absolute ds:top-2 ds:right-2 ds:bg-green-500 ds:rounded-full ds:p-1\">\n <CheckCircle2 className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </div>\n )}\n {file.status === \"error\" && (\n <div className=\"ds:absolute ds:top-2 ds:right-2 ds:bg-red-500 ds:rounded-full ds:p-1\">\n <AlertCircle className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"ds:absolute ds:inset-0 ds:bg-black/60 ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity ds:flex ds:items-center ds:justify-center ds:gap-2\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Download\"\n >\n <Download className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n </div>\n\n {/* File name tooltip */}\n <div className=\"ds:absolute ds:bottom-0 ds:left-0 ds:right-0 ds:bg-black/60 ds:p-2 ds:text-white ds:text-xs ds:truncate ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity\">\n {file.name}\n </div>\n </div>\n );\n }\n\n if (listType === \"picture-circle\") {\n return (\n <div\n className={cn(\n \"ds:relative ds:aspect-square ds:rounded-full ds:border ds:bg-muted/50 ds:overflow-hidden ds:group\",\n file.status === \"done\" && \"ds:border-2 ds:border-green-500\",\n file.status === \"error\" && \"ds:border-2 ds:border-red-500\"\n )}\n style={{\n width: \"100px\",\n height: \"100px\",\n minWidth: \"100px\",\n minHeight: \"100px\",\n padding: \"4px\",\n }}\n >\n {/* Image or Icon */}\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"ds:h-full ds:w-full ds:object-cover ds:rounded-full\"\n />\n ) : (\n <div className=\"ds:flex ds:items-center ds:justify-center ds:h-full ds:rounded-full ds:bg-muted\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"ds:absolute ds:inset-0 ds:bg-background/80 ds:flex ds:items-center ds:justify-center ds:rounded-full\">\n <div className=\"ds:w-full ds:px-4\">\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:mb-2 ds:justify-center\">\n <Loader2 className=\"ds:h-4 ds:w-4 ds:animate-spin\" />\n <span className=\"ds:text-xs\">{file.percent}%</span>\n </div>\n <div className=\"ds:h-1 ds:bg-muted ds:rounded-full ds:overflow-hidden\">\n <div\n className=\"ds:h-full ds:bg-primary ds:transition-all ds:duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"ds:absolute ds:inset-0 ds:bg-black/60 ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity ds:flex ds:items-center ds:justify-center ds:gap-2 ds:rounded-full\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Download\"\n >\n <Download className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ds:p-1 ds:rounded-full ds:bg-background/20 ds:hover:bg-background/30 ds:transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"ds:h-4 ds:w-4 ds:text-white\" />\n </button>\n )}\n {/* File name tooltip */}\n <div className=\"ds:absolute ds:bottom-0 ds:left-0 ds:right-0 ds:bg-black/60 ds:p-2 ds:text-white ds:text-xs ds:truncate ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity\">\n {file.name}\n </div>\n </div>\n </div>\n );\n }\n\n if (listType === \"picture\") {\n return (\n <div className=\"ds:flex ds:items-center ds:gap-3 ds:p-2 ds:rounded-lg ds:border ds:bg-background ds:hover:bg-muted/50 ds:transition-colors ds:group\">\n {/* Thumbnail */}\n <div className=\"ds:shrink-0 ds:h-10 ds:w-10 ds:rounded ds:overflow-hidden ds:bg-muted ds:flex ds:items-center ds:justify-center\">\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"ds:h-full ds:w-full ds:object-cover\"\n />\n ) : (\n getFileIcon(file)\n )}\n </div>\n\n {/* Info */}\n <div className=\"ds:flex-1 ds:min-w-0\">\n <p className=\"ds:text-sm ds:font-medium ds:truncate\">{file.name}</p>\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:mt-1\">\n {file.size && (\n <span className=\"ds:text-xs ds:text-muted-foreground\">\n {formatFileSize(file.size)}\n </span>\n )}\n {file.status === \"uploading\" && (\n <span className=\"ds:text-xs ds:text-primary\">{file.percent}%</span>\n )}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"ds:h-4 ds:w-4 ds:text-green-500\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"ds:h-4 ds:w-4 ds:text-red-500\" />\n )}\n </div>\n {file.status === \"uploading\" && (\n <div className=\"ds:h-1 ds:bg-muted ds:rounded-full ds:overflow-hidden ds:mt-2\">\n <div\n className=\"ds:h-full ds:bg-primary ds:transition-all ds:duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"ds:flex ds:items-center ds:gap-1 ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"ds:p-1.5 ds:rounded ds:hover:bg-muted ds:transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"ds:p-1.5 ds:rounded ds:hover:bg-muted ds:transition-colors\"\n title=\"Download\"\n >\n <Download className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ds:p-1.5 ds:rounded ds:hover:bg-destructive/10 ds:transition-colors ds:text-destructive\"\n title=\"Remove\"\n >\n <X className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n }\n\n // Text list\n return (\n <div className=\"ds:flex ds:items-center ds:gap-2 ds:p-2 ds:rounded ds:hover:bg-muted/50 ds:transition-colors ds:group\">\n {/* Icon */}\n <div className=\"ds:shrink-0\">{getFileIcon(file)}</div>\n\n {/* Info */}\n <div className=\"ds:flex-1 ds:min-w-0\">\n <div className=\"ds:flex ds:items-center ds:gap-2\">\n <p className=\"ds:text-sm ds:truncate\">{file.name}</p>\n {/* Status */}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"ds:h-4 ds:w-4 ds:text-green-500 ds:shrink-0\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"ds:h-4 ds:w-4 ds:text-red-500 ds:shrink-0\" />\n )}\n {file.status === \"uploading\" && (\n <Loader2 className=\"ds:h-4 ds:w-4 ds:animate-spin ds:shrink-0\" />\n )}\n </div>\n\n {file.status === \"uploading\" && (\n <div className=\"ds:flex ds:items-center ds:gap-2\">\n <div className=\"ds:flex-1 ds:h-1 ds:bg-muted ds:rounded-full ds:overflow-hidden\">\n <div\n className=\"ds:h-full ds:bg-primary ds:transition-all ds:duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n <span className=\"ds:text-xs ds:text-muted-foreground\">\n {file.percent}%\n </span>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"ds:flex ds:items-center ds:gap-1 ds:opacity-0 ds:group-hover:opacity-100 ds:transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"ds:p-1 ds:rounded ds:hover:bg-muted ds:transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"ds:p-1 ds:rounded ds:hover:bg-muted ds:transition-colors\"\n title=\"Download\"\n >\n <Download className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"ds:p-1 ds:rounded ds:hover:bg-destructive/10 ds:transition-colors ds:text-destructive\"\n title=\"Remove\"\n >\n <Trash2 className=\"ds:h-4 ds:w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default Upload;\n"],"names":["uploadVariants","cva","getFileIcon","file","type","name","jsx","ImageIcon","Film","Music","Archive","FileCode","FileText","File","formatFileSize","bytes","k","sizes","i","generateUID","UploadBase","React","className","variant","accept","multiple","disabled","controlledFileList","defaultFileList","action","customRequest","beforeUpload","onChange","onRemove","onPreview","onDownload","maxCount","maxSize","listType","showUploadList","pictureCardSize","pictureCardCols","iconOnly","showBorder","uploadText","uploadDescription","uploadIcon","size","children","headers","withCredentials","directory","props","ref","inputRef","useRef","internalFileList","setInternalFileList","useState","isDragOver","setIsDragOver","previewOpen","setPreviewOpen","previewImage","setPreviewImage","previewTitle","setPreviewTitle","fileList","setFileList","isDropzoneVariant","effectiveListType","fileListRef","canUploadMore","updateFileList","useCallback","updater","newList","uploadFile","previewUrl","uploadFileObj","prev","percent","updatedFile","f","response","successFile","error","errorFile","url","formData","xhr","e","key","value","handleFileChange","files","toast","uploadedCount","validFiles","uploadFileObjects","index","handleRemove","handleDragOver","handleDragLeave","handleDrop","handleClick","handlePreview","handleDownload","blob","blobUrl","link","uploadListConfig","jsxs","Fragment","cn","Trash2","UploadIcon","CloudUploadIcon","Upload","FileItem","Dialog","showPreviewIcon","showRemoveIcon","showDownloadIcon","isImage","canPreview","Loader2","CheckCircle2","AlertCircle","Eye","Download","X"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"WheelColumn.cjs","sources":["../../../src/components/WheelColumn.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@dsui/ui/index\";\nimport type { CalendarColor } from \"./Calendar/Calendar\";\n\nconst pad = (num: number): string => String(num).padStart(2, \"0\");\n\n// Color variants for time picker items\nconst getColorClass = (color: CalendarColor = \"primary\"): string => {\n const colorMap = {\n primary: \"ds:text-primary\",\n secondary: \"ds:text-secondary\",\n accent: \"ds:text-accent\",\n destructive: \"ds:text-destructive\",\n muted: \"ds:text-muted-foreground\",\n success: \"ds:text-success\",\n error: \"ds:text-error\",\n warning: \"ds:text-warning\",\n foreground: \"ds:text-foreground\",\n };\n return colorMap[color];\n};\n\ntype TimeColumnwheelProps = {\n items: number[];\n value: number | undefined;\n onChange: (val: number) => void;\n timeLabel?: string;\n itemClassName?: string;\n isItemDisabled: (item: number) => boolean;\n disabled: boolean;\n color?: CalendarColor;\n};\n\nexport const TimeColumnwheel = memo(\n React.forwardRef<HTMLDivElement, TimeColumnwheelProps>(\n (\n {\n items,\n value: selectedValue,\n onChange: onChangeCol,\n timeLabel,\n itemClassName,\n isItemDisabled,\n disabled,\n color = \"primary\",\n },\n ref\n ) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n\n // Debounced scroll handler\n const handleScroll = useCallback(() => {\n if (!containerRef.current || disabled) return;\n\n const container = containerRef.current;\n const currentScrollTop = container.scrollTop;\n setScrollTop(currentScrollTop);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer\n debounceTimerRef.current = setTimeout(() => {\n const scrollTop = container.scrollTop;\n const itemHeight = 40; // h-10 = 40px\n const containerHeight = container.clientHeight;\n const dividerCenter = containerHeight / 2; // Divider lines ở giữa container\n\n // Calculate which item is at the divider center\n // Account for top spacer (h-30 = 120px)\n const adjustedScrollTop = scrollTop - 120;\n const dividerPosition = adjustedScrollTop + dividerCenter;\n\n // Find the item whose center is closest to divider center\n let closestItem = items[0];\n let minDistance = Infinity;\n\n items.forEach((item, index) => {\n const itemTop = index * itemHeight;\n const itemCenter = itemTop + itemHeight / 2;\n const distance = Math.abs(itemCenter - dividerPosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestItem = item;\n }\n });\n\n // Only trigger change if different from current value and not disabled\n if (!isItemDisabled(closestItem)) {\n // Always update if item is different, or snap to correct position\n if (closestItem !== selectedValue) {\n onChangeCol(closestItem);\n } else {\n // Re-trigger to ensure input reflects the snapped value\n // This handles cases where user scrolled slightly but ended on same value\n const itemIndex = items.indexOf(closestItem);\n const targetScrollTop =\n 120 +\n itemIndex * itemHeight -\n containerHeight / 2 +\n itemHeight / 2;\n\n if (Math.abs(container.scrollTop - targetScrollTop) > 5) {\n container.scrollTo({\n top: targetScrollTop,\n behavior: \"smooth\",\n });\n }\n }\n }\n }, 100); // 100ms debounce for faster response\n }, [items, selectedValue, onChangeCol, isItemDisabled, disabled]);\n\n // Set up scroll listener\n useEffect(() => {\n const container = containerRef.current;\n if (container) {\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n container.removeEventListener(\"scroll\", handleScroll);\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }\n }, [handleScroll]);\n\n // Scroll to selected value when it changes or on mount\n useEffect(() => {\n if (containerRef.current && selectedValue !== undefined) {\n const itemIndex = items.indexOf(selectedValue);\n if (itemIndex !== -1) {\n const itemHeight = 40;\n const containerHeight = containerRef.current.clientHeight;\n const targetScrollTop =\n 120 +\n itemIndex * itemHeight -\n containerHeight / 2 +\n itemHeight / 2;\n\n containerRef.current.scrollTo({\n top: targetScrollTop,\n behavior: \"smooth\",\n });\n }\n }\n }, [selectedValue, items]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n const getItemStyle = (index: number, isSelected: boolean) => {\n const itemHeight = 40;\n const containerHeight = 256; // h-64 = 256px\n const centerY = containerHeight / 2;\n const itemCenterY = 120 + index * itemHeight + itemHeight / 2; // 120px spacer + item position\n const distanceFromCenter = Math.abs(\n itemCenterY - (scrollTop + centerY)\n );\n const maxDistance = containerHeight / 2;\n\n // Calculate opacity and scale based on distance\n const opacity = Math.max(\n 0.3,\n 1 - (distanceFromCenter / maxDistance) * 0.7\n );\n const fontSize = isSelected ? \"1.3rem\" : \"1rem\";\n\n return {\n opacity,\n fontSize,\n transition: \"opacity 0.2s ease, transform 0.2s ease\",\n };\n };\n\n return (\n <div className=\"ds:flex ds:flex-col ds:items-center ds:gap-2 ds:w-full ds:h-full ds:max-h-72\">\n {timeLabel && (\n <div className=\"ds:text-xs ds:font-semibold ds:text-muted-foreground ds:uppercase ds:p-2 ds:border-b ds:w-full ds:text-center ds:h-8\">\n {timeLabel}\n </div>\n )}\n <div\n className={cn(\n \"ds:relative ds:w-full\",\n timeLabel ? \"ds:h-[calc(100%_-_2rem)]\" : \" ds:h-full\"\n )}\n >\n {/* wheel style divider lines */}\n <div className=\"ds:absolute ds:top-1/2 ds:left-0 ds:right-0 ds:h-10 ds:-translate-y-1/2 ds:border-t ds:border-b ds:border-border ds:pointer-events-none ds:z-10\" />\n\n <div\n ref={(el) => {\n containerRef.current = el;\n if (typeof ref === \"function\") {\n ref(el);\n } else if (ref) {\n ref.current = el;\n }\n }}\n className={cn(\n \"ds:relative ds:h-full ds:w-full ds:min-w-20 ds:min-h-60 ds:overflow-y-scroll ds:scroll-smooth\",\n \"ds:[&::-webkit-scrollbar]:w-1 ds:[&::-webkit-scrollbar-track]:bg-transparent\",\n \"ds:[&::-webkit-scrollbar-thumb]:bg-border ds:[&::-webkit-scrollbar-thumb]:rounded\",\n \"ds:flex ds:flex-col ds:snap-y ds:snap-mandatory\",\n itemClassName\n )}\n style={{\n maskImage: `linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)`,\n WebkitMaskImage: `linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)`,\n }}\n >\n {/* Spacer Top */}\n <div className=\"ds:h-[calc(50%-1.25rem)] ds:flex-shrink-0\" />\n\n {items.map((item, index) => {\n const itemDisabled = isItemDisabled(item);\n const isSelected =\n selectedValue !== undefined && item === selectedValue;\n const itemStyle = getItemStyle(index, isSelected);\n\n return (\n <div\n key={item}\n onClick={\n disabled || itemDisabled\n ? undefined\n : () => onChangeCol(item)\n }\n data-selected={isSelected || undefined}\n className={cn(\n \"ds:h-10 ds:flex-shrink-0 ds:flex ds:items-center ds:justify-center ds:transition-all ds:snap-center\",\n \"ds:cursor-pointer ds:text-lg ds:font-medium ds:select-none\",\n \"ds:disabled:opacity-30 ds:disabled:cursor-not-allowed ds:disabled:line-through\",\n isSelected\n ? `${getColorClass(color)} ds:font-bold`\n : \"ds:text-muted-foreground\"\n )}\n style={itemStyle}\n >\n {pad(item)}\n </div>\n );\n })}\n\n {/* Spacer Bottom */}\n <div className=\"ds:h-[calc(50%-1.25rem)] ds:flex-shrink-0\" />\n </div>\n </div>\n </div>\n );\n }\n )\n);\n\nTimeColumnwheel.displayName = \"TimeColumnwheel\";\n"],"names":["pad","num","getColorClass","color","TimeColumnwheel","memo","React","items","selectedValue","onChangeCol","timeLabel","itemClassName","isItemDisabled","disabled","ref","debounceTimerRef","useRef","containerRef","scrollTop","setScrollTop","useState","handleScroll","useCallback","container","currentScrollTop","itemHeight","containerHeight","dividerCenter","dividerPosition","closestItem","minDistance","item","index","itemCenter","distance","targetScrollTop","useEffect","itemIndex","getItemStyle","isSelected","itemCenterY","distanceFromCenter","maxDistance","jsxs","jsx","cn","el","itemDisabled","itemStyle"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"data-table.cjs","sources":["../../../src/config/data-table.ts"],"sourcesContent":["export type DataTableConfig = typeof dataTableConfig;\n\nexport const dataTableConfig = {\n textOperators: [\n { label: \"Contains\", value: \"iLike\" as const },\n { label: \"Does not contain\", value: \"notILike\" as const },\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n numericOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is less than\", value: \"lt\" as const },\n { label: \"Is less than or equal to\", value: \"lte\" as const },\n { label: \"Is greater than\", value: \"gt\" as const },\n { label: \"Is greater than or equal to\", value: \"gte\" as const },\n { label: \"Is between\", value: \"isBetween\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n dateOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is before\", value: \"lt\" as const },\n { label: \"Is after\", value: \"gt\" as const },\n { label: \"Is on or before\", value: \"lte\" as const },\n { label: \"Is on or after\", value: \"gte\" as const },\n { label: \"Is between\", value: \"isBetween\" as const },\n { label: \"Is relative to today\", value: \"isRelativeToToday\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n selectOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n multiSelectOperators: [\n { label: \"Has any of\", value: \"inArray\" as const },\n { label: \"Has none of\", value: \"notInArray\" as const },\n { label: \"Is empty\", value: \"isEmpty\" as const },\n { label: \"Is not empty\", value: \"isNotEmpty\" as const },\n ],\n booleanOperators: [\n { label: \"Is\", value: \"eq\" as const },\n { label: \"Is not\", value: \"ne\" as const },\n ],\n sortOrders: [\n { label: \"Asc\", value: \"asc\" as const },\n { label: \"Desc\", value: \"desc\" as const },\n ],\n filterVariants: [\n \"text\",\n \"number\",\n \"range\",\n \"date\",\n \"dateRange\",\n \"boolean\",\n \"select\",\n \"multiSelect\",\n ] as const,\n operators: [\n \"iLike\",\n \"notILike\",\n \"eq\",\n \"ne\",\n \"inArray\",\n \"notInArray\",\n \"isEmpty\",\n \"isNotEmpty\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"isBetween\",\n \"isRelativeToToday\",\n ] as const,\n joinOperators: [\"and\", \"or\"] as const,\n};\n"],"names":["dataTableConfig"],"mappings":"gFAEO,MAAMA,EAAkB,CAoD7B,eAAgB,CACd,OACA,SACA,QACA,OACA,YACA,UACA,SACA,aAAA,EAEF,UAAW,CACT,QACA,WACA,KACA,KACA,UACA,aACA,UACA,aACA,KACA,MACA,KACA,MACA,YACA,mBAAA,CAGJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.cjs","sources":["../../../src/constants/common.ts"],"sourcesContent":["export const DATE_FORMAT = \"dd/MM/yyyy\";\nexport const TIME_FORMAT = \"HH:mm\";\nexport const DATE_TIME_FORMAT = `${DATE_FORMAT} ${TIME_FORMAT}`;\n"],"names":["DATE_FORMAT"],"mappings":"gFAAO,MAAMA,EAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-callback-ref.cjs","sources":["../../../src/hooks/use-callback-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n []\n );\n}\n\nexport { useCallbackRef };\n"],"names":["useCallbackRef","callback","callbackRef","React","args"],"mappings":"mYAUA,SAASA,EACPC,EACG,CACH,MAAMC,EAAcC,EAAM,OAAOF,CAAQ,EAEzCE,OAAAA,EAAM,UAAU,IAAM,CACpBD,EAAY,QAAUD,CACxB,CAAC,EAGME,EAAM,QACX,KAAO,IAAIC,IAASF,EAAY,UAAU,GAAGE,CAAI,GACjD,CAAA,CAAC,CAEL"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-data-table.cjs","sources":["../../../src/hooks/use-data-table.ts"],"sourcesContent":["\"use client\";\n\n/* eslint-disable react-hooks/rules-of-hooks */\n\nimport {\n type ColumnFiltersState,\n type ColumnOrderState,\n getCoreRowModel,\n getFacetedMinMaxValues,\n getFacetedRowModel,\n getFacetedUniqueValues,\n getFilteredRowModel,\n getPaginationRowModel,\n getSortedRowModel,\n type PaginationState,\n type RowSelectionState,\n type SortingState,\n type TableOptions,\n type TableState,\n type Updater,\n useReactTable,\n type VisibilityState,\n} from \"@tanstack/react-table\";\nimport {\n parseAsArrayOf,\n parseAsInteger,\n parseAsString,\n type SingleParser,\n type UseQueryStateOptions,\n useQueryState,\n useQueryStates,\n} from \"nuqs\";\nimport * as React from \"react\";\n\nimport { useDebouncedCallback } from \"@/hooks/use-debounced-callback\";\nimport { getSortingStateParser } from \"@/utils/parsers\";\nimport type { ExtendedColumnSort, QueryKeys } from \"@/types/data-table\";\n\nconst PAGE_KEY = \"page\";\nconst PER_PAGE_KEY = \"perPage\";\nconst SORT_KEY = \"sort\";\nconst FILTERS_KEY = \"filters\";\nconst JOIN_OPERATOR_KEY = \"joinOperator\";\nconst ARRAY_SEPARATOR = \",\";\nconst DEBOUNCE_MS = 300;\nconst THROTTLE_MS = 50;\n\ninterface UseDataTableProps<TData>\n extends Omit<\n TableOptions<TData>,\n // | \"state\"\n // | \"pageCount\"\n \"getCoreRowModel\"\n > {\n initialState?: Omit<Partial<TableState>, \"sorting\"> & {\n sorting?: ExtendedColumnSort<TData>[];\n };\n queryKeys?: Partial<QueryKeys>;\n history?: \"push\" | \"replace\";\n debounceMs?: number;\n throttleMs?: number;\n clearOnDefault?: boolean;\n enableAdvancedFilter?: boolean;\n scroll?: boolean;\n shallow?: boolean;\n startTransition?: React.TransitionStartFunction;\n enableNuqs?: boolean;\n}\n\nexport function useDataTable<TData>(props: UseDataTableProps<TData>) {\n const {\n columns,\n pageCount,\n initialState,\n queryKeys,\n history = \"replace\",\n debounceMs = DEBOUNCE_MS,\n throttleMs = THROTTLE_MS,\n clearOnDefault = false,\n enableAdvancedFilter = false,\n scroll = false,\n shallow = true,\n startTransition,\n enableNuqs = false,\n state: controlledState,\n ...tableProps\n } = props;\n const pageKey = queryKeys?.page ?? PAGE_KEY;\n const perPageKey = queryKeys?.perPage ?? PER_PAGE_KEY;\n const sortKey = queryKeys?.sort ?? SORT_KEY;\n const filtersKey = queryKeys?.filters ?? FILTERS_KEY;\n const joinOperatorKey = queryKeys?.joinOperator ?? JOIN_OPERATOR_KEY;\n\n const queryStateOptions = React.useMemo<\n Omit<UseQueryStateOptions<string>, \"parse\">\n >(\n () => ({\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition: startTransition as any,\n }),\n [\n history,\n scroll,\n shallow,\n throttleMs,\n debounceMs,\n clearOnDefault,\n startTransition,\n ]\n );\n\n const [rowSelection, setRowSelection] = React.useState<RowSelectionState>(\n initialState?.rowSelection ?? {}\n );\n const [columnVisibility, setColumnVisibility] =\n React.useState<VisibilityState>(initialState?.columnVisibility ?? {});\n const [columnOrder, setColumnOrder] = React.useState<ColumnOrderState>(\n initialState?.columnOrder ?? []\n );\n\n const [page, setPage] = enableNuqs\n ? useQueryState(\n pageKey,\n parseAsInteger.withOptions(queryStateOptions).withDefault(1)\n )\n : React.useState(initialState?.pagination?.pageIndex ?? 0);\n\n const [perPage, setPerPage] = enableNuqs\n ? useQueryState(\n perPageKey,\n parseAsInteger\n .withOptions(queryStateOptions)\n .withDefault(initialState?.pagination?.pageSize ?? 10)\n )\n : React.useState(initialState?.pagination?.pageSize ?? 10);\n\n const pagination: PaginationState = React.useMemo(() => {\n return {\n pageIndex: enableNuqs ? page - 1 : page, // zero-based index\n pageSize: perPage,\n };\n }, [page, perPage, enableNuqs]);\n\n const onPaginationChange = React.useCallback(\n (updaterOrValue: Updater<PaginationState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newPagination = updaterOrValue(pagination);\n void setPage(\n enableNuqs ? newPagination.pageIndex + 1 : newPagination.pageIndex\n );\n void setPerPage(newPagination.pageSize);\n } else {\n void setPage(\n enableNuqs ? updaterOrValue.pageIndex + 1 : updaterOrValue.pageIndex\n );\n void setPerPage(updaterOrValue.pageSize);\n }\n },\n [pagination, setPage, setPerPage, enableNuqs]\n );\n\n const columnIds = React.useMemo(() => {\n return new Set(\n columns.map((column) => column.id).filter(Boolean) as string[]\n );\n }, [columns]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n // to avoid violating React hooks rules. If it changes, it may cause issues.\n const [sorting, setSorting] = enableNuqs\n ? useQueryState(\n sortKey,\n getSortingStateParser<TData>(columnIds)\n .withOptions(queryStateOptions)\n .withDefault(initialState?.sorting ?? [])\n )\n : React.useState(initialState?.sorting ?? []);\n\n const onSortingChange = React.useCallback(\n (updaterOrValue: Updater<SortingState>) => {\n if (typeof updaterOrValue === \"function\") {\n const newSorting = updaterOrValue(sorting);\n setSorting(newSorting as ExtendedColumnSort<TData>[]);\n } else {\n setSorting(updaterOrValue as ExtendedColumnSort<TData>[]);\n }\n },\n [sorting, setSorting]\n );\n\n const filterableColumns = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return columns.filter((column) => column.enableColumnFilter);\n }, [columns, enableAdvancedFilter]);\n\n const filterParsers = React.useMemo(() => {\n if (enableAdvancedFilter) return {};\n\n return filterableColumns.reduce<\n Record<string, SingleParser<string> | SingleParser<string[]>>\n >((acc, column) => {\n if (column.meta?.variant === \"multiSelect\") {\n acc[column.id ?? \"\"] = parseAsArrayOf(\n parseAsString,\n ARRAY_SEPARATOR\n ).withOptions(queryStateOptions);\n } else {\n acc[column.id ?? \"\"] = parseAsString.withOptions(queryStateOptions);\n }\n return acc;\n }, {});\n }, [filterableColumns, queryStateOptions, enableAdvancedFilter]);\n\n // Note: enableNuqs should be stable (not change during component lifecycle)\n const [filterValues, setFilterValues] = enableNuqs\n ? useQueryStates(filterParsers)\n : React.useState<Record<string, string | string[] | null>>({});\n\n const debouncedSetFilterValues = useDebouncedCallback(\n (values: typeof filterValues) => {\n void setPage(1);\n void setFilterValues(values);\n },\n debounceMs\n );\n\n const initialColumnFilters: ColumnFiltersState = React.useMemo(() => {\n if (enableAdvancedFilter) return [];\n\n return Object.entries(filterValues).reduce<ColumnFiltersState>(\n (filters, [key, value]) => {\n if (value !== null) {\n const column = filterableColumns.find((col) => col.id === key);\n const isMultiSelect = column?.meta?.variant === \"multiSelect\";\n\n const processedValue = Array.isArray(value)\n ? value\n : isMultiSelect &&\n typeof value === \"string\" &&\n /[^a-zA-Z0-9]/.test(value)\n ? value.split(/[^a-zA-Z0-9]+/).filter(Boolean)\n : isMultiSelect\n ? [value]\n : value;\n\n filters.push({\n id: key,\n value: processedValue,\n });\n }\n return filters;\n },\n []\n );\n }, [filterValues, enableAdvancedFilter, filterableColumns]);\n\n const [columnFilters, setColumnFilters] =\n React.useState<ColumnFiltersState>(initialColumnFilters);\n\n const onColumnFiltersChange = React.useCallback(\n (updaterOrValue: Updater<ColumnFiltersState>) => {\n if (enableAdvancedFilter) return;\n\n setColumnFilters((prev) => {\n const next =\n typeof updaterOrValue === \"function\"\n ? updaterOrValue(prev)\n : updaterOrValue;\n\n const filterUpdates = next.reduce<\n Record<string, string | string[] | null>\n >((acc, filter) => {\n const column = filterableColumns.find((col) => col.id === filter.id);\n if (column) {\n const isMultiSelect = column.meta?.variant === \"multiSelect\";\n acc[filter.id] = isMultiSelect\n ? (filter.value as string[])\n : (filter.value as string);\n }\n console.log(\"filterParsers\", column, acc);\n return acc;\n }, {});\n\n for (const prevFilter of prev) {\n if (!next.some((filter) => filter.id === prevFilter.id)) {\n filterUpdates[prevFilter.id] = null;\n }\n }\n\n if (enableNuqs) {\n debouncedSetFilterValues(filterUpdates);\n }\n return next;\n });\n },\n [\n debouncedSetFilterValues,\n filterableColumns,\n enableAdvancedFilter,\n enableNuqs,\n ]\n );\n\n const table = useReactTable({\n initialState,\n pageCount,\n state: {\n pagination,\n sorting,\n columnVisibility,\n columnOrder,\n rowSelection,\n columnFilters,\n ...controlledState,\n },\n defaultColumn: {\n ...tableProps.defaultColumn,\n enableColumnFilter: true,\n enableSorting: false,\n enableHiding: true,\n enablePinning: true,\n },\n enableRowSelection: true,\n onRowSelectionChange: setRowSelection,\n onPaginationChange,\n onSortingChange,\n onColumnFiltersChange,\n onColumnVisibilityChange: setColumnVisibility,\n onColumnOrderChange: setColumnOrder,\n getCoreRowModel: getCoreRowModel(),\n getFilteredRowModel: getFilteredRowModel(),\n getPaginationRowModel: getPaginationRowModel(),\n getSortedRowModel: getSortedRowModel(),\n getFacetedRowModel: getFacetedRowModel(),\n getFacetedUniqueValues: getFacetedUniqueValues(),\n getFacetedMinMaxValues: getFacetedMinMaxValues(),\n meta: {\n ...tableProps.meta,\n queryKeys: {\n page: pageKey,\n perPage: perPageKey,\n sort: sortKey,\n filters: filtersKey,\n joinOperator: joinOperatorKey,\n },\n },\n ...tableProps,\n columns,\n });\n\n return { table, shallow, debounceMs, throttleMs };\n}\n"],"names":["PAGE_KEY","PER_PAGE_KEY","SORT_KEY","FILTERS_KEY","JOIN_OPERATOR_KEY","ARRAY_SEPARATOR","DEBOUNCE_MS","THROTTLE_MS","useDataTable","props","columns","pageCount","initialState","queryKeys","history","debounceMs","throttleMs","clearOnDefault","enableAdvancedFilter","scroll","shallow","startTransition","enableNuqs","controlledState","tableProps","pageKey","perPageKey","sortKey","filtersKey","joinOperatorKey","queryStateOptions","React","rowSelection","setRowSelection","columnVisibility","setColumnVisibility","columnOrder","setColumnOrder","page","setPage","useQueryState","parseAsInteger","perPage","setPerPage","pagination","onPaginationChange","updaterOrValue","newPagination","columnIds","column","sorting","setSorting","getSortingStateParser","onSortingChange","newSorting","filterableColumns","filterParsers","acc","parseAsArrayOf","parseAsString","filterValues","setFilterValues","useQueryStates","debouncedSetFilterValues","useDebouncedCallback","values","initialColumnFilters","filters","key","value","isMultiSelect","col","processedValue","columnFilters","setColumnFilters","onColumnFiltersChange","prev","next","filterUpdates","filter","prevFilter","useReactTable","getCoreRowModel","getFilteredRowModel","getPaginationRowModel","getSortedRowModel","getFacetedRowModel","getFacetedUniqueValues","getFacetedMinMaxValues"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-callback.cjs","sources":["../../../src/hooks/use-debounced-callback.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { useCallbackRef } from \"@/hooks/use-callback-ref\";\n\nexport function useDebouncedCallback<T extends (...args: never[]) => unknown>(\n callback: T,\n delay: number\n) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React.useRef(0);\n React.useEffect(\n () => () => window.clearTimeout(debounceTimerRef.current),\n []\n );\n\n const setValue = React.useCallback(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(\n () => handleCallback(...args),\n delay\n );\n },\n [handleCallback, delay]\n );\n\n return setValue;\n}\n"],"names":["useDebouncedCallback","callback","delay","handleCallback","useCallbackRef","debounceTimerRef","React","args"],"mappings":"uaAIO,SAASA,EACdC,EACAC,EACA,CACA,MAAMC,EAAiBC,EAAAA,eAAeH,CAAQ,EACxCI,EAAmBC,EAAM,OAAO,CAAC,EACvCA,OAAAA,EAAM,UACJ,IAAM,IAAM,OAAO,aAAaD,EAAiB,OAAO,EACxD,CAAA,CAAC,EAGcC,EAAM,YACrB,IAAIC,IAAwB,CAC1B,OAAO,aAAaF,EAAiB,OAAO,EAC5CA,EAAiB,QAAU,OAAO,WAChC,IAAMF,EAAe,GAAGI,CAAI,EAC5BL,CAAA,CAEJ,EACA,CAACC,EAAgBD,CAAK,CAAA,CAI1B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-value.cjs","sources":["../../../src/hooks/use-debounced-value.ts"],"sourcesContent":["\"use client\";\nimport { useRef, useState } from \"react\";\nimport { useDebouncedCallback } from \"./use-debounced-callback\";\n\n/**\n * Custom hook that returns a debounced version of the provided value, along with a function to update it.\n * @param initialValue The value to be debounced\n * @param delay The delay in milliseconds before the value is updated (default is 500ms)\n * @param options Optional configurations for the debouncing behavior\n * @returns An array containing the debounced value and the function to update it\n */\nexport function useDebounceValue<T>(\n initialValue: T | (() => T),\n delay: number\n): [T, (value: T) => void] {\n const unwrappedInitialValue =\n initialValue instanceof Function ? initialValue() : initialValue;\n const [debouncedValue, setDebouncedValue] = useState<T>(\n unwrappedInitialValue\n );\n const previousValueRef = useRef<T | undefined>(unwrappedInitialValue);\n const updateDebouncedValue = useDebouncedCallback(setDebouncedValue, delay);\n // Update the debounced value if the initial value changes\n if (previousValueRef.current !== unwrappedInitialValue) {\n updateDebouncedValue(unwrappedInitialValue);\n previousValueRef.current = unwrappedInitialValue;\n }\n return [debouncedValue, updateDebouncedValue];\n}\n"],"names":["useDebounceValue","initialValue","delay","unwrappedInitialValue","debouncedValue","setDebouncedValue","useState","previousValueRef","useRef","updateDebouncedValue","useDebouncedCallback"],"mappings":"mJAWO,SAASA,EACdC,EACAC,EACyB,CACzB,MAAMC,EACJF,aAAwB,SAAWA,EAAA,EAAiBA,EAChD,CAACG,EAAgBC,CAAiB,EAAIC,EAAAA,SAC1CH,CAAA,EAEII,EAAmBC,EAAAA,OAAsBL,CAAqB,EAC9DM,EAAuBC,EAAAA,qBAAqBL,EAAmBH,CAAK,EAE1E,OAAIK,EAAiB,UAAYJ,IAC/BM,EAAqBN,CAAqB,EAC1CI,EAAiB,QAAUJ,GAEtB,CAACC,EAAgBK,CAAoB,CAC9C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-event-listener.cjs","sources":["../../../src/hooks/use-event-listener.ts"],"sourcesContent":["\"use client\";\nimport { useEffect, useRef } from \"react\";\nimport type { RefObject } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\n// MediaQueryList Event based useEventListener interface\nfunction useEventListener<K extends keyof MediaQueryListEventMap>(\n eventName: K,\n handler: (event: MediaQueryListEventMap[K]) => void,\n element: RefObject<MediaQueryList>,\n options?: boolean | AddEventListenerOptions\n): void;\n\n// Window Event based useEventListener interface\nfunction useEventListener<K extends keyof WindowEventMap>(\n eventName: K,\n handler: (event: WindowEventMap[K]) => void,\n element?: undefined,\n options?: boolean | AddEventListenerOptions\n): void;\n\n// Element Event based useEventListener interface\nfunction useEventListener<\n K extends keyof HTMLElementEventMap & keyof SVGElementEventMap,\n T extends Element = K extends keyof HTMLElementEventMap\n ? HTMLDivElement\n : SVGElement,\n>(\n eventName: K,\n handler:\n | ((event: HTMLElementEventMap[K]) => void)\n | ((event: SVGElementEventMap[K]) => void),\n element: RefObject<T>,\n options?: boolean | AddEventListenerOptions\n): void;\n\n// Document Event based useEventListener interface\nfunction useEventListener<K extends keyof DocumentEventMap>(\n eventName: K,\n handler: (event: DocumentEventMap[K]) => void,\n element: RefObject<Document>,\n options?: boolean | AddEventListenerOptions\n): void;\n\nfunction useEventListener<\n KW extends keyof WindowEventMap,\n KH extends keyof HTMLElementEventMap & keyof SVGElementEventMap,\n KM extends keyof MediaQueryListEventMap,\n T extends HTMLElement | SVGAElement | MediaQueryList = HTMLElement,\n>(\n eventName: KW | KH | KM,\n handler: (\n event:\n | WindowEventMap[KW]\n | HTMLElementEventMap[KH]\n | SVGElementEventMap[KH]\n | MediaQueryListEventMap[KM]\n | Event\n ) => void,\n element?: RefObject<T>,\n options?: boolean | AddEventListenerOptions\n) {\n // Create a ref that stores handler\n const savedHandler = useRef(handler);\n\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n useEffect(() => {\n // Define the listening target\n const targetElement: T | Window = element?.current ?? window;\n if (!(targetElement && targetElement.addEventListener)) return;\n // Create event listener that calls handler function stored in ref\n const listener: typeof handler = (event) => {\n savedHandler.current(event);\n };\n targetElement.addEventListener(eventName, listener, options);\n // Remove event listener on cleanup\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\nexport { useEventListener };\n"],"names":["useEventListener","eventName","handler","element","options","savedHandler","useRef","useIsomorphicLayoutEffect","useEffect","targetElement","listener","event"],"mappings":"yJA4CA,SAASA,EAMPC,EACAC,EAQAC,EACAC,EACA,CAEA,MAAMC,EAAeC,EAAAA,OAAOJ,CAAO,EAEnCK,EAAAA,0BAA0B,IAAM,CAC9BF,EAAa,QAAUH,CACzB,EAAG,CAACA,CAAO,CAAC,EAEZM,EAAAA,UAAU,IAAM,CAEd,MAAMC,EAA4BN,GAAS,SAAW,OACtD,GAAI,EAAEM,GAAiBA,EAAc,kBAAmB,OAExD,MAAMC,EAA4BC,GAAU,CAC1CN,EAAa,QAAQM,CAAK,CAC5B,EACA,OAAAF,EAAc,iBAAiBR,EAAWS,EAAUN,CAAO,EAEpD,IAAM,CACXK,EAAc,oBAAoBR,EAAWS,EAAUN,CAAO,CAChE,CACF,EAAG,CAACH,EAAWE,EAASC,CAAO,CAAC,CAClC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-intersection-observer.cjs","sources":["../../../src/hooks/use-intersection-observer.ts"],"sourcesContent":["\"use client\";\nimport { useEffect, useRef, useState } from \"react\";\ntype State = {\n isIntersecting: boolean;\n entry?: IntersectionObserverEntry;\n};\ntype UseIntersectionObserverOptions = {\n root?: Element | Document | null;\n rootMargin?: string;\n threshold?: number | number[];\n freezeOnceVisible?: boolean;\n onChange?: (\n isIntersecting: boolean,\n entry: IntersectionObserverEntry\n ) => void;\n initialIsIntersecting?: boolean;\n};\ntype IntersectionReturn = [\n (node?: Element | null) => void,\n boolean,\n IntersectionObserverEntry | undefined,\n] & {\n ref: (node?: Element | null) => void;\n isIntersecting: boolean;\n entry?: IntersectionObserverEntry;\n};\nexport function useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange,\n}: UseIntersectionObserverOptions = {}): IntersectionReturn {\n const [ref, setRef] = useState<Element | null>(null);\n const [state, setState] = useState<State>(() => ({\n isIntersecting: initialIsIntersecting,\n entry: undefined,\n }));\n const callbackRef =\n useRef<UseIntersectionObserverOptions[\"onChange\"]>(undefined);\n callbackRef.current = onChange;\n const frozen = state.entry?.isIntersecting && freezeOnceVisible;\n useEffect(() => {\n // Ensure we have a ref to observe\n if (!ref) return;\n // Ensure the browser supports the Intersection Observer API\n if (!(\"IntersectionObserver\" in window)) return;\n // Skip if frozen\n if (frozen) return;\n let unobserve: (() => void) | undefined;\n const observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]): void => {\n const thresholds = Array.isArray(observer.thresholds)\n ? observer.thresholds\n : [observer.thresholds];\n entries.forEach((entry) => {\n const isIntersecting =\n entry.isIntersecting &&\n thresholds.some(\n (threshold) => entry.intersectionRatio >= threshold\n );\n setState({ isIntersecting, entry });\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = undefined;\n }\n });\n },\n { threshold, root, rootMargin }\n );\n observer.observe(ref);\n return () => {\n observer.disconnect();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible,\n ]);\n // ensures that if the observed element changes, the intersection observer is reinitialized\n const prevRef = useRef<Element | null>(null);\n useEffect(() => {\n if (\n !ref &&\n state.entry?.target &&\n !freezeOnceVisible &&\n !frozen &&\n prevRef.current !== state.entry.target\n ) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: undefined });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry,\n ] as IntersectionReturn;\n // Support object destructuring, by adding the specific values.\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n return result;\n}\n// Export types\nexport type { UseIntersectionObserverOptions, IntersectionReturn };\n"],"names":["useIntersectionObserver","threshold","root","rootMargin","freezeOnceVisible","initialIsIntersecting","onChange","ref","setRef","useState","state","setState","callbackRef","useRef","frozen","useEffect","observer","entries","thresholds","entry","isIntersecting","prevRef","result"],"mappings":"yGA0BO,SAASA,EAAwB,CACtC,UAAAC,EAAY,EACZ,KAAAC,EAAO,KACP,WAAAC,EAAa,KACb,kBAAAC,EAAoB,GACpB,sBAAAC,EAAwB,GACxB,SAAAC,CACF,EAAoC,GAAwB,CAC1D,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAyB,IAAI,EAC7C,CAACC,EAAOC,CAAQ,EAAIF,EAAAA,SAAgB,KAAO,CAC/C,eAAgBJ,EAChB,MAAO,MAAA,EACP,EACIO,EACJC,EAAAA,OAAmD,MAAS,EAC9DD,EAAY,QAAUN,EACtB,MAAMQ,EAASJ,EAAM,OAAO,gBAAkBN,EAC9CW,EAAAA,UAAU,IAAM,CAMd,GAJI,CAACR,GAED,EAAE,yBAA0B,SAE5BO,EAAQ,OAEZ,MAAME,EAAW,IAAI,qBAClBC,GAA+C,CAC9C,MAAMC,EAAa,MAAM,QAAQF,EAAS,UAAU,EAChDA,EAAS,WACT,CAACA,EAAS,UAAU,EACxBC,EAAQ,QAASE,GAAU,CACzB,MAAMC,EACJD,EAAM,gBACND,EAAW,KACRjB,GAAckB,EAAM,mBAAqBlB,CAAA,EAE9CU,EAAS,CAAE,eAAAS,EAAgB,MAAAD,EAAO,EAC9BP,EAAY,SACdA,EAAY,QAAQQ,EAAgBD,CAAK,CAM7C,CAAC,CACH,EACA,CAAE,UAAAlB,EAAW,KAAAC,EAAM,WAAAC,CAAA,CAAW,EAEhC,OAAAa,EAAS,QAAQT,CAAG,EACb,IAAM,CACXS,EAAS,WAAA,CACX,CAEF,EAAG,CACDT,EAEA,KAAK,UAAUN,CAAS,EACxBC,EACAC,EACAW,EACAV,CAAA,CACD,EAED,MAAMiB,EAAUR,EAAAA,OAAuB,IAAI,EAC3CE,EAAAA,UAAU,IAAM,CAEZ,CAACR,GACDG,EAAM,OAAO,QACb,CAACN,GACD,CAACU,GACDO,EAAQ,UAAYX,EAAM,MAAM,SAEhCW,EAAQ,QAAUX,EAAM,MAAM,OAC9BC,EAAS,CAAE,eAAgBN,EAAuB,MAAO,OAAW,EAExE,EAAG,CAACE,EAAKG,EAAM,MAAON,EAAmBU,EAAQT,CAAqB,CAAC,EACvE,MAAMiB,EAAS,CACbd,EACA,CAAC,CAACE,EAAM,eACRA,EAAM,KAAA,EAGR,OAAAY,EAAO,IAAMA,EAAO,CAAC,EACrBA,EAAO,eAAiBA,EAAO,CAAC,EAChCA,EAAO,MAAQA,EAAO,CAAC,EAChBA,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-isomorphic-layout-effect.cjs","sources":["../../../src/hooks/use-isomorphic-layout-effect.ts"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\n\nexport const useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n"],"names":["useIsomorphicLayoutEffect","React"],"mappings":"mYAGaA,EACX,OAAO,OAAW,IAAcC,EAAM,gBAAkBA,EAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-media-query.cjs","sources":["../../../src/hooks/use-media-query.ts"],"sourcesContent":["\"use client\";\n\nimport { useState } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\ntype UseMediaQueryOptions = {\n defaultValue?: boolean;\n initializeWithValue?: boolean;\n};\n\nconst IS_SERVER = typeof window === \"undefined\";\n\nexport function useMediaQuery(\n query: string,\n {\n defaultValue = false,\n initializeWithValue = true,\n }: UseMediaQueryOptions = {}\n): boolean {\n const getMatches = (query: string): boolean => {\n if (IS_SERVER) {\n return defaultValue;\n }\n return window.matchMedia(query).matches;\n };\n\n const [matches, setMatches] = useState<boolean>(() => {\n if (initializeWithValue) {\n return getMatches(query);\n }\n return defaultValue;\n });\n\n // Handles the change event of the media query.\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n useIsomorphicLayoutEffect(() => {\n const matchMedia = window.matchMedia(query);\n // Triggered at the first client-side load and if query changes\n handleChange();\n // Use deprecated `addListener` and `removeListener` to support Safari < 14 (#135)\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener(\"change\", handleChange);\n }\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener(\"change\", handleChange);\n }\n };\n }, [query]);\n\n return matches;\n}\n\nexport type { UseMediaQueryOptions };\n"],"names":["IS_SERVER","useMediaQuery","query","defaultValue","initializeWithValue","getMatches","matches","setMatches","useState","handleChange","useIsomorphicLayoutEffect","matchMedia"],"mappings":"yJAUMA,EAAY,OAAO,OAAW,IAE7B,SAASC,EACdC,EACA,CACE,aAAAC,EAAe,GACf,oBAAAC,EAAsB,EACxB,EAA0B,GACjB,CACT,MAAMC,EAAcH,GACdF,EACKG,EAEF,OAAO,WAAWD,CAAK,EAAE,QAG5B,CAACI,EAASC,CAAU,EAAIC,EAAAA,SAAkB,IAC1CJ,EACKC,EAAWH,CAAK,EAElBC,CACR,EAGD,SAASM,GAAe,CACtBF,EAAWF,EAAWH,CAAK,CAAC,CAC9B,CAEAQ,OAAAA,EAAAA,0BAA0B,IAAM,CAC9B,MAAMC,EAAa,OAAO,WAAWT,CAAK,EAE1C,OAAAO,EAAA,EAEIE,EAAW,YACbA,EAAW,YAAYF,CAAY,EAEnCE,EAAW,iBAAiB,SAAUF,CAAY,EAE7C,IAAM,CACPE,EAAW,eACbA,EAAW,eAAeF,CAAY,EAEtCE,EAAW,oBAAoB,SAAUF,CAAY,CAEzD,CACF,EAAG,CAACP,CAAK,CAAC,EAEHI,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-click-outside.cjs","sources":["../../../src/hooks/use-on-click-outside.ts"],"sourcesContent":["\"use client\";\nimport type { RefObject } from \"react\";\nimport { useEventListener } from \"./use-event-listener\";\n\ntype EventType =\n | \"mousedown\"\n | \"mouseup\"\n | \"touchstart\"\n | \"touchend\"\n | \"focusin\"\n | \"focusout\";\n\nexport function useOnClickOutside<T extends HTMLElement = HTMLElement>(\n ref: RefObject<T | null> | RefObject<T | null>[],\n handler: (event: MouseEvent | TouchEvent | FocusEvent) => void,\n eventType: EventType = \"mousedown\",\n eventListenerOptions: AddEventListenerOptions = {}\n): void {\n useEventListener(\n eventType,\n (event) => {\n const target = event.target as Node;\n // Do nothing if the target is not connected element with document\n if (!target || !target.isConnected) {\n return;\n }\n const isOutside = Array.isArray(ref)\n ? ref\n .filter((r) => Boolean(r.current))\n .every((r) => r.current && !r.current.contains(target))\n : ref?.current && !ref?.current.contains(target);\n if (isOutside) {\n handler(event);\n }\n },\n undefined,\n eventListenerOptions\n );\n}\n\n// Export types\nexport type { EventType };\n"],"names":["useOnClickOutside","ref","handler","eventType","eventListenerOptions","useEventListener","event","target","r"],"mappings":"4HAYO,SAASA,EACdC,EACAC,EACAC,EAAuB,YACvBC,EAAgD,GAC1C,CACNC,EAAAA,iBACEF,EACCG,GAAU,CACT,MAAMC,EAASD,EAAM,OAErB,GAAI,CAACC,GAAU,CAACA,EAAO,YACrB,QAEgB,MAAM,QAAQN,CAAG,EAC/BA,EACG,OAAQO,GAAM,EAAQA,EAAE,OAAQ,EAChC,MAAOA,GAAMA,EAAE,SAAW,CAACA,EAAE,QAAQ,SAASD,CAAM,CAAC,EACxDN,GAAK,SAAW,CAACA,GAAK,QAAQ,SAASM,CAAM,IAE/CL,EAAQI,CAAK,CAEjB,EACA,OACAF,CAAA,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-script.cjs","sources":["../../../src/hooks/use-script.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\n\ntype UseScriptStatus = \"idle\" | \"loading\" | \"ready\" | \"error\";\n\ntype UseScriptOptions = {\n shouldPreventLoad?: boolean;\n removeOnUnmount?: boolean;\n id?: string;\n};\n\nconst cachedScriptStatuses = new Map<string, UseScriptStatus | undefined>();\n\nfunction getScriptNode(src: string) {\n const node: HTMLScriptElement | null = document.querySelector(\n `script[src=\"${src}\"]`\n );\n const status = node?.getAttribute(\"data-status\") as\n | UseScriptStatus\n | undefined;\n return {\n node,\n status,\n };\n}\n\nexport function useScript(\n src: string | null,\n options?: UseScriptOptions\n): UseScriptStatus {\n const [status, setStatus] = useState<UseScriptStatus>(() => {\n if (!src || options?.shouldPreventLoad) {\n return \"idle\";\n }\n if (typeof window === \"undefined\") {\n return \"loading\";\n }\n return cachedScriptStatuses.get(src) ?? \"loading\";\n });\n\n useEffect(() => {\n if (!src || options?.shouldPreventLoad) {\n return;\n }\n const cachedScriptStatus = cachedScriptStatuses.get(src);\n if (cachedScriptStatus === \"ready\" || cachedScriptStatus === \"error\") {\n setStatus(cachedScriptStatus);\n return;\n }\n const script = getScriptNode(src);\n let scriptNode = script.node;\n if (!scriptNode) {\n scriptNode = document.createElement(\"script\");\n scriptNode.src = src;\n scriptNode.async = true;\n if (options?.id) {\n scriptNode.id = options.id;\n }\n scriptNode.setAttribute(\"data-status\", \"loading\");\n document.body.appendChild(scriptNode);\n const setAttributeFromEvent = (event: Event) => {\n const scriptStatus: UseScriptStatus =\n event.type === \"load\" ? \"ready\" : \"error\";\n scriptNode?.setAttribute(\"data-status\", scriptStatus);\n };\n scriptNode.addEventListener(\"load\", setAttributeFromEvent);\n scriptNode.addEventListener(\"error\", setAttributeFromEvent);\n } else {\n setStatus(script.status ?? cachedScriptStatus ?? \"loading\");\n }\n const setStateFromEvent = (event: Event) => {\n const newStatus = event.type === \"load\" ? \"ready\" : \"error\";\n setStatus(newStatus);\n cachedScriptStatuses.set(src, newStatus);\n };\n scriptNode.addEventListener(\"load\", setStateFromEvent);\n scriptNode.addEventListener(\"error\", setStateFromEvent);\n\n return () => {\n if (scriptNode) {\n scriptNode.removeEventListener(\"load\", setStateFromEvent);\n scriptNode.removeEventListener(\"error\", setStateFromEvent);\n }\n if (scriptNode && options?.removeOnUnmount) {\n scriptNode.remove();\n cachedScriptStatuses.delete(src);\n }\n };\n }, [src, options?.shouldPreventLoad, options?.removeOnUnmount, options?.id]);\n\n return status;\n}\nexport type { UseScriptStatus, UseScriptOptions };\n"],"names":["cachedScriptStatuses","getScriptNode","src","node","status","useScript","options","setStatus","useState","useEffect","cachedScriptStatus","script","scriptNode","setAttributeFromEvent","event","scriptStatus","setStateFromEvent","newStatus"],"mappings":"yGAUMA,MAA2B,IAEjC,SAASC,EAAcC,EAAa,CAClC,MAAMC,EAAiC,SAAS,cAC9C,eAAeD,CAAG,IAAA,EAEdE,EAASD,GAAM,aAAa,aAAa,EAG/C,MAAO,CACL,KAAAA,EACA,OAAAC,CAAA,CAEJ,CAEO,SAASC,EACdH,EACAI,EACiB,CACjB,KAAM,CAACF,EAAQG,CAAS,EAAIC,EAAAA,SAA0B,IAChD,CAACN,GAAOI,GAAS,kBACZ,OAEL,OAAO,OAAW,IACb,UAEFN,EAAqB,IAAIE,CAAG,GAAK,SACzC,EAEDO,OAAAA,EAAAA,UAAU,IAAM,CACd,GAAI,CAACP,GAAOI,GAAS,kBACnB,OAEF,MAAMI,EAAqBV,EAAqB,IAAIE,CAAG,EACvD,GAAIQ,IAAuB,SAAWA,IAAuB,QAAS,CACpEH,EAAUG,CAAkB,EAC5B,MACF,CACA,MAAMC,EAASV,EAAcC,CAAG,EAChC,IAAIU,EAAaD,EAAO,KACxB,GAAKC,EAiBHL,EAAUI,EAAO,QAAUD,GAAsB,SAAS,MAjB3C,CACfE,EAAa,SAAS,cAAc,QAAQ,EAC5CA,EAAW,IAAMV,EACjBU,EAAW,MAAQ,GACfN,GAAS,KACXM,EAAW,GAAKN,EAAQ,IAE1BM,EAAW,aAAa,cAAe,SAAS,EAChD,SAAS,KAAK,YAAYA,CAAU,EACpC,MAAMC,EAAyBC,GAAiB,CAC9C,MAAMC,EACJD,EAAM,OAAS,OAAS,QAAU,QACpCF,GAAY,aAAa,cAAeG,CAAY,CACtD,EACAH,EAAW,iBAAiB,OAAQC,CAAqB,EACzDD,EAAW,iBAAiB,QAASC,CAAqB,CAC5D,CAGA,MAAMG,EAAqBF,GAAiB,CAC1C,MAAMG,EAAYH,EAAM,OAAS,OAAS,QAAU,QACpDP,EAAUU,CAAS,EACnBjB,EAAqB,IAAIE,EAAKe,CAAS,CACzC,EACA,OAAAL,EAAW,iBAAiB,OAAQI,CAAiB,EACrDJ,EAAW,iBAAiB,QAASI,CAAiB,EAE/C,IAAM,CACPJ,IACFA,EAAW,oBAAoB,OAAQI,CAAiB,EACxDJ,EAAW,oBAAoB,QAASI,CAAiB,GAEvDJ,GAAcN,GAAS,kBACzBM,EAAW,OAAA,EACXZ,EAAqB,OAAOE,CAAG,EAEnC,CACF,EAAG,CAACA,EAAKI,GAAS,kBAAmBA,GAAS,gBAAiBA,GAAS,EAAE,CAAC,EAEpEF,CACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-scroll-lock.cjs","sources":["../../../src/hooks/use-scroll-lock.ts"],"sourcesContent":["\"use client\";\nimport { useRef, useState, useCallback } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./use-isomorphic-layout-effect\";\n\ntype UseScrollLockOptions = {\n autoLock?: boolean;\n lockTarget?: HTMLElement | string | null;\n widthReflow?: boolean;\n};\n\ntype UseScrollLockReturn = {\n isLocked: boolean;\n lock: () => void;\n unlock: () => void;\n};\n\ntype OriginalStyle = {\n overflow: CSSStyleDeclaration[\"overflow\"];\n paddingRight: CSSStyleDeclaration[\"paddingRight\"];\n};\n\nconst IS_SERVER = typeof window === \"undefined\";\n\nexport function useScrollLock(\n options: UseScrollLockOptions = {}\n): UseScrollLockReturn {\n const { autoLock = true, lockTarget, widthReflow = true } = options;\n const [isLocked, setIsLocked] = useState(false);\n const target = useRef<HTMLElement | null>(null);\n const originalStyle = useRef<OriginalStyle | null>(null);\n\n const lock = useCallback(() => {\n if (target.current) {\n const { overflow, paddingRight } = target.current.style;\n // Save the original styles\n originalStyle.current = { overflow, paddingRight };\n // Prevent width reflow\n if (widthReflow) {\n // Use window inner width if body is the target as global scrollbar isn't part of the document\n const offsetWidth =\n target.current === document.body\n ? window.innerWidth\n : target.current.offsetWidth;\n // Get current computed padding right in pixels\n const currentPaddingRight =\n parseInt(window.getComputedStyle(target.current).paddingRight, 10) ||\n 0;\n const scrollbarWidth = offsetWidth - target.current.scrollWidth;\n target.current.style.paddingRight = `${scrollbarWidth + currentPaddingRight}px`;\n }\n // Lock the scroll\n target.current.style.overflow = \"hidden\";\n setIsLocked(true);\n }\n }, [widthReflow]);\n\n const unlock = useCallback(() => {\n if (target.current && originalStyle.current) {\n target.current.style.overflow = originalStyle.current.overflow;\n // Only reset padding right if we changed it\n if (widthReflow) {\n target.current.style.paddingRight = originalStyle.current.paddingRight;\n }\n }\n setIsLocked(false);\n }, [widthReflow]);\n\n useIsomorphicLayoutEffect(() => {\n if (IS_SERVER) return;\n // Re-find the target element each time\n if (lockTarget) {\n target.current =\n typeof lockTarget === \"string\"\n ? document.querySelector(lockTarget)\n : lockTarget;\n }\n if (!target.current) {\n target.current = document.body;\n }\n if (autoLock) {\n lock();\n }\n return () => {\n unlock();\n };\n }, [autoLock, lockTarget, widthReflow, lock, unlock]);\n\n return { isLocked, lock, unlock };\n}\nexport type { UseScrollLockOptions, UseScrollLockReturn };\n"],"names":["IS_SERVER","useScrollLock","options","autoLock","lockTarget","widthReflow","isLocked","setIsLocked","useState","target","useRef","originalStyle","lock","useCallback","overflow","paddingRight","offsetWidth","currentPaddingRight","scrollbarWidth","unlock","useIsomorphicLayoutEffect"],"mappings":"yJAqBMA,EAAY,OAAO,OAAW,IAE7B,SAASC,EACdC,EAAgC,GACX,CACrB,KAAM,CAAE,SAAAC,EAAW,GAAM,WAAAC,EAAY,YAAAC,EAAc,IAASH,EACtD,CAACI,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAASC,EAAAA,OAA2B,IAAI,EACxCC,EAAgBD,EAAAA,OAA6B,IAAI,EAEjDE,EAAOC,EAAAA,YAAY,IAAM,CAC7B,GAAIJ,EAAO,QAAS,CAClB,KAAM,CAAE,SAAAK,EAAU,aAAAC,CAAA,EAAiBN,EAAO,QAAQ,MAIlD,GAFAE,EAAc,QAAU,CAAE,SAAAG,EAAU,aAAAC,CAAA,EAEhCV,EAAa,CAEf,MAAMW,EACJP,EAAO,UAAY,SAAS,KACxB,OAAO,WACPA,EAAO,QAAQ,YAEfQ,EACJ,SAAS,OAAO,iBAAiBR,EAAO,OAAO,EAAE,aAAc,EAAE,GACjE,EACIS,EAAiBF,EAAcP,EAAO,QAAQ,YACpDA,EAAO,QAAQ,MAAM,aAAe,GAAGS,EAAiBD,CAAmB,IAC7E,CAEAR,EAAO,QAAQ,MAAM,SAAW,SAChCF,EAAY,EAAI,CAClB,CACF,EAAG,CAACF,CAAW,CAAC,EAEVc,EAASN,EAAAA,YAAY,IAAM,CAC3BJ,EAAO,SAAWE,EAAc,UAClCF,EAAO,QAAQ,MAAM,SAAWE,EAAc,QAAQ,SAElDN,IACFI,EAAO,QAAQ,MAAM,aAAeE,EAAc,QAAQ,eAG9DJ,EAAY,EAAK,CACnB,EAAG,CAACF,CAAW,CAAC,EAEhBe,OAAAA,EAAAA,0BAA0B,IAAM,CAC9B,GAAI,CAAApB,EAEJ,OAAII,IACFK,EAAO,QACL,OAAOL,GAAe,SAClB,SAAS,cAAcA,CAAU,EACjCA,GAEHK,EAAO,UACVA,EAAO,QAAU,SAAS,MAExBN,GACFS,EAAA,EAEK,IAAM,CACXO,EAAA,CACF,CACF,EAAG,CAAChB,EAAUC,EAAYC,EAAaO,EAAMO,CAAM,CAAC,EAE7C,CAAE,SAAAb,EAAU,KAAAM,EAAM,OAAAO,CAAA,CAC3B"}
|
package/dist/cjs/index.cjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlurText.cjs","sources":["../../../../src/lib/TextAnimation/BlurText.tsx"],"sourcesContent":["\"use client\";\nimport { motion, type Transition, type Easing } from \"motion/react\";\nimport { useEffect, useRef, useState, useMemo } from \"react\";\ntype BlurTextProps = {\n text?: string;\n delay?: number;\n className?: string;\n animateBy?: \"words\" | \"letters\";\n direction?: \"top\" | \"bottom\";\n threshold?: number;\n rootMargin?: string;\n animationFrom?: Record<string, string | number>;\n animationTo?: Array<Record<string, string | number>>;\n easing?: Easing | Easing[];\n onAnimationComplete?: () => void;\n stepDuration?: number;\n};\nconst buildKeyframes = (\n from: Record<string, string | number>,\n steps: Array<Record<string, string | number>>\n): Record<string, Array<string | number>> => {\n const keys = new Set<string>([\n ...Object.keys(from),\n ...steps.flatMap((s) => Object.keys(s)),\n ]);\n const keyframes: Record<string, Array<string | number>> = {};\n keys.forEach((k) => {\n keyframes[k] = [from[k], ...steps.map((s) => s[k])];\n });\n return keyframes;\n};\nconst BlurText: React.FC<BlurTextProps> = ({\n text = \"\",\n delay = 200,\n className = \"\",\n animateBy = \"words\",\n direction = \"top\",\n threshold = 0.1,\n rootMargin = \"0px\",\n animationFrom,\n animationTo,\n easing = (t: number) => t,\n onAnimationComplete,\n stepDuration = 0.35,\n}) => {\n const elements = animateBy === \"words\" ? text.split(\" \") : text.split(\"\");\n const [inView, setInView] = useState(false);\n const ref = useRef<HTMLParagraphElement>(null);\n useEffect(() => {\n if (!ref.current) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setInView(true);\n observer.unobserve(ref.current as Element);\n }\n },\n { threshold, rootMargin }\n );\n observer.observe(ref.current);\n return () => observer.disconnect();\n }, [threshold, rootMargin]);\n const defaultFrom = useMemo(\n () =>\n direction === \"top\"\n ? { filter: \"blur(10px)\", opacity: 0, y: -50 }\n : { filter: \"blur(10px)\", opacity: 0, y: 50 },\n [direction]\n );\n const defaultTo = useMemo(\n () => [\n {\n filter: \"blur(5px)\",\n opacity: 0.5,\n y: direction === \"top\" ? 5 : -5,\n },\n { filter: \"blur(0px)\", opacity: 1, y: 0 },\n ],\n [direction]\n );\n const fromSnapshot = animationFrom ?? defaultFrom;\n const toSnapshots = animationTo ?? defaultTo;\n const stepCount = toSnapshots.length + 1;\n const totalDuration = stepDuration * (stepCount - 1);\n const times = Array.from({ length: stepCount }, (_, i) =>\n stepCount === 1 ? 0 : i / (stepCount - 1)\n );\n return (\n <p ref={ref} className={`ds:blur-text ${className} ds:flex ds:flex-wrap`}>\n {elements.map((segment, index) => {\n const animateKeyframes = buildKeyframes(fromSnapshot, toSnapshots);\n const spanTransition: Transition = {\n duration: totalDuration,\n times,\n delay: (index * delay) / 1000,\n ease: easing,\n };\n return (\n <motion.span\n key={index}\n initial={fromSnapshot}\n animate={inView ? animateKeyframes : fromSnapshot}\n transition={spanTransition}\n onAnimationComplete={\n index === elements.length - 1 ? onAnimationComplete : undefined\n }\n style={{\n display: \"inline-block\",\n willChange: \"transform, filter, opacity\",\n }}\n >\n {segment === \" \" ? \"\\u00A0\" : segment}\n {animateBy === \"words\" && index < elements.length - 1 && \"\\u00A0\"}\n </motion.span>\n );\n })}\n </p>\n );\n};\nexport default BlurText;\n"],"names":["buildKeyframes","from","steps","keys","s","keyframes","k","BlurText","text","delay","className","animateBy","direction","threshold","rootMargin","animationFrom","animationTo","easing","t","onAnimationComplete","stepDuration","elements","inView","setInView","useState","ref","useRef","useEffect","observer","entry","defaultFrom","useMemo","defaultTo","fromSnapshot","toSnapshots","stepCount","totalDuration","times","_","i","jsx","segment","index","animateKeyframes","spanTransition","jsxs","motion"],"mappings":"8LAiBMA,EAAiB,CACrBC,EACAC,IAC2C,CAC3C,MAAMC,MAAW,IAAY,CAC3B,GAAG,OAAO,KAAKF,CAAI,EACnB,GAAGC,EAAM,QAASE,GAAM,OAAO,KAAKA,CAAC,CAAC,CAAA,CACvC,EACKC,EAAoD,CAAA,EAC1D,OAAAF,EAAK,QAASG,GAAM,CAClBD,EAAUC,CAAC,EAAI,CAACL,EAAKK,CAAC,EAAG,GAAGJ,EAAM,IAAKE,GAAMA,EAAEE,CAAC,CAAC,CAAC,CACpD,CAAC,EACMD,CACT,EACME,EAAoC,CAAC,CACzC,KAAAC,EAAO,GACP,MAAAC,EAAQ,IACR,UAAAC,EAAY,GACZ,UAAAC,EAAY,QACZ,UAAAC,EAAY,MACZ,UAAAC,EAAY,GACZ,WAAAC,EAAa,MACb,cAAAC,EACA,YAAAC,EACA,OAAAC,EAAUC,GAAcA,EACxB,oBAAAC,EACA,aAAAC,EAAe,GACjB,IAAM,CACJ,MAAMC,EAAWV,IAAc,QAAUH,EAAK,MAAM,GAAG,EAAIA,EAAK,MAAM,EAAE,EAClE,CAACc,EAAQC,CAAS,EAAIC,EAAAA,SAAS,EAAK,EACpCC,EAAMC,EAAAA,OAA6B,IAAI,EAC7CC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACF,EAAI,QAAS,OAClB,MAAMG,EAAW,IAAI,qBACnB,CAAC,CAACC,CAAK,IAAM,CACPA,EAAM,iBACRN,EAAU,EAAI,EACdK,EAAS,UAAUH,EAAI,OAAkB,EAE7C,EACA,CAAE,UAAAZ,EAAW,WAAAC,CAAA,CAAW,EAE1B,OAAAc,EAAS,QAAQH,EAAI,OAAO,EACrB,IAAMG,EAAS,WAAA,CACxB,EAAG,CAACf,EAAWC,CAAU,CAAC,EAC1B,MAAMgB,EAAcC,EAAAA,QAClB,IACEnB,IAAc,MACV,CAAE,OAAQ,aAAc,QAAS,EAAG,EAAG,GAAA,EACvC,CAAE,OAAQ,aAAc,QAAS,EAAG,EAAG,EAAA,EAC7C,CAACA,CAAS,CAAA,EAENoB,EAAYD,EAAAA,QAChB,IAAM,CACJ,CACE,OAAQ,YACR,QAAS,GACT,EAAGnB,IAAc,MAAQ,EAAI,EAAA,EAE/B,CAAE,OAAQ,YAAa,QAAS,EAAG,EAAG,CAAA,CAAE,EAE1C,CAACA,CAAS,CAAA,EAENqB,EAAelB,GAAiBe,EAChCI,EAAclB,GAAegB,EAC7BG,EAAYD,EAAY,OAAS,EACjCE,EAAgBhB,GAAgBe,EAAY,GAC5CE,EAAQ,MAAM,KAAK,CAAE,OAAQF,CAAA,EAAa,CAACG,EAAGC,IAClDJ,IAAc,EAAI,EAAII,GAAKJ,EAAY,EAAA,EAEzC,OACEK,EAAAA,IAAC,IAAA,CAAE,IAAAf,EAAU,UAAW,gBAAgBf,CAAS,wBAC9C,SAAAW,EAAS,IAAI,CAACoB,EAASC,IAAU,CAChC,MAAMC,EAAmB3C,EAAeiC,EAAcC,CAAW,EAC3DU,EAA6B,CACjC,SAAUR,EACV,MAAAC,EACA,MAAQK,EAAQjC,EAAS,IACzB,KAAMQ,CAAA,EAER,OACE4B,EAAAA,KAACC,EAAAA,OAAO,KAAP,CAEC,QAASb,EACT,QAASX,EAASqB,EAAmBV,EACrC,WAAYW,EACZ,oBACEF,IAAUrB,EAAS,OAAS,EAAIF,EAAsB,OAExD,MAAO,CACL,QAAS,eACT,WAAY,4BAAA,EAGb,SAAA,CAAAsB,IAAY,IAAM,IAAWA,EAC7B9B,IAAc,SAAW+B,EAAQrB,EAAS,OAAS,GAAK,GAAA,CAAA,EAbpDqB,CAAA,CAgBX,CAAC,CAAA,CACH,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CircularText.cjs","sources":["../../../../src/lib/TextAnimation/CircularText.tsx"],"sourcesContent":["\"use client\";\nimport React, { useEffect } from \"react\";\nimport {\n motion,\n useAnimation,\n useMotionValue,\n MotionValue,\n type Transition,\n} from \"motion/react\";\n\ninterface CircularTextProps {\n text: string;\n spinDuration?: number;\n onHover?: \"slowDown\" | \"speedUp\" | \"pause\" | \"goBonkers\";\n className?: string;\n}\n\nconst getRotationTransition = (\n duration: number,\n from: number,\n loop: boolean = true\n) => ({\n from,\n to: from + 360,\n ease: \"linear\" as const,\n duration,\n type: \"tween\" as const,\n repeat: loop ? Infinity : 0,\n});\n\nconst getTransition = (duration: number, from: number) => ({\n rotate: getRotationTransition(duration, from),\n scale: {\n type: \"spring\" as const,\n damping: 20,\n stiffness: 300,\n },\n});\n\nconst CircularText: React.FC<CircularTextProps> = ({\n text,\n spinDuration = 20,\n onHover = \"speedUp\",\n className = \"\",\n}) => {\n const letters = Array.from(text);\n const controls = useAnimation();\n const rotation: MotionValue<number> = useMotionValue(0);\n useEffect(() => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start),\n });\n }, [spinDuration, text, onHover, controls, rotation]);\n const handleHoverStart = () => {\n const start = rotation.get();\n if (!onHover) return;\n let transitionConfig: ReturnType<typeof getTransition> | Transition;\n let scaleVal = 1;\n switch (onHover) {\n case \"slowDown\":\n transitionConfig = getTransition(spinDuration * 2, start);\n break;\n case \"speedUp\":\n transitionConfig = getTransition(spinDuration / 4, start);\n break;\n case \"pause\":\n transitionConfig = {\n rotate: { type: \"spring\", damping: 20, stiffness: 300 },\n scale: { type: \"spring\", damping: 20, stiffness: 300 },\n };\n break;\n case \"goBonkers\":\n transitionConfig = getTransition(spinDuration / 20, start);\n scaleVal = 0.8;\n break;\n default:\n transitionConfig = getTransition(spinDuration, start);\n }\n controls.start({\n rotate: start + 360,\n scale: scaleVal,\n transition: transitionConfig,\n });\n };\n const handleHoverEnd = () => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start),\n });\n };\n return (\n <motion.div\n className={`ds:m-0 ds:mx-auto ds:rounded-full ds:w-[200px] ds:h-[200px] ds:relative ds:font-black ds:text-foreground ds:text-center ds:cursor-pointer ds:origin-center ${className}`}\n style={{ rotate: rotation }}\n initial={{ rotate: 0 }}\n animate={controls}\n onMouseEnter={handleHoverStart}\n onMouseLeave={handleHoverEnd}\n >\n {letters.map((letter, i) => {\n const rotationDeg = (360 / letters.length) * i;\n const factor = Math.PI / letters.length;\n const x = factor * i;\n const y = factor * i;\n const transform = `rotateZ(${rotationDeg}deg) translate3d(${x}px, ${y}px, 0)`;\n return (\n <span\n key={i}\n className=\"ds:absolute ds:inline-block ds:inset-0 ds:text-2xl ds:transition-all ds:duration-500 ds:ease-[cubic-bezier(0,0,0,1)]\"\n style={{ transform, WebkitTransform: transform }}\n >\n {letter}\n </span>\n );\n })}\n </motion.div>\n );\n};\n\nexport default CircularText;\n"],"names":["getRotationTransition","duration","from","loop","getTransition","CircularText","text","spinDuration","onHover","className","letters","controls","useAnimation","rotation","useMotionValue","useEffect","start","handleHoverStart","transitionConfig","scaleVal","handleHoverEnd","jsx","motion","letter","i","rotationDeg","factor","x","transform"],"mappings":"8LAiBMA,EAAwB,CAC5BC,EACAC,EACAC,EAAgB,MACZ,CACJ,KAAAD,EACA,GAAIA,EAAO,IACX,KAAM,SACN,SAAAD,EACA,KAAM,QACN,OAAQE,EAAO,IAAW,CAC5B,GAEMC,EAAgB,CAACH,EAAkBC,KAAkB,CACzD,OAAQF,EAAsBC,EAAUC,CAAI,EAC5C,MAAO,CACL,KAAM,SACN,QAAS,GACT,UAAW,GAAA,CAEf,GAEMG,EAA4C,CAAC,CACjD,KAAAC,EACA,aAAAC,EAAe,GACf,QAAAC,EAAU,UACV,UAAAC,EAAY,EACd,IAAM,CACJ,MAAMC,EAAU,MAAM,KAAKJ,CAAI,EACzBK,EAAWC,EAAAA,aAAA,EACXC,EAAgCC,EAAAA,eAAe,CAAC,EACtDC,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAQH,EAAS,IAAA,EACvBF,EAAS,MAAM,CACb,OAAQK,EAAQ,IAChB,MAAO,EACP,WAAYZ,EAAcG,EAAcS,CAAK,CAAA,CAC9C,CACH,EAAG,CAACT,EAAcD,EAAME,EAASG,EAAUE,CAAQ,CAAC,EACpD,MAAMI,EAAmB,IAAM,CAC7B,MAAMD,EAAQH,EAAS,IAAA,EACvB,GAAI,CAACL,EAAS,OACd,IAAIU,EACAC,EAAW,EACf,OAAQX,EAAA,CACN,IAAK,WACHU,EAAmBd,EAAcG,EAAe,EAAGS,CAAK,EACxD,MACF,IAAK,UACHE,EAAmBd,EAAcG,EAAe,EAAGS,CAAK,EACxD,MACF,IAAK,QACHE,EAAmB,CACjB,OAAQ,CAAE,KAAM,SAAU,QAAS,GAAI,UAAW,GAAA,EAClD,MAAO,CAAE,KAAM,SAAU,QAAS,GAAI,UAAW,GAAA,CAAI,EAEvD,MACF,IAAK,YACHA,EAAmBd,EAAcG,EAAe,GAAIS,CAAK,EACzDG,EAAW,GACX,MACF,QACED,EAAmBd,EAAcG,EAAcS,CAAK,CAAA,CAExDL,EAAS,MAAM,CACb,OAAQK,EAAQ,IAChB,MAAOG,EACP,WAAYD,CAAA,CACb,CACH,EACME,EAAiB,IAAM,CAC3B,MAAMJ,EAAQH,EAAS,IAAA,EACvBF,EAAS,MAAM,CACb,OAAQK,EAAQ,IAChB,MAAO,EACP,WAAYZ,EAAcG,EAAcS,CAAK,CAAA,CAC9C,CACH,EACA,OACEK,EAAAA,IAACC,EAAAA,OAAO,IAAP,CACC,UAAW,8JAA8Jb,CAAS,GAClL,MAAO,CAAE,OAAQI,CAAA,EACjB,QAAS,CAAE,OAAQ,CAAA,EACnB,QAASF,EACT,aAAcM,EACd,aAAcG,EAEb,SAAAV,EAAQ,IAAI,CAACa,EAAQC,IAAM,CAC1B,MAAMC,EAAe,IAAMf,EAAQ,OAAUc,EACvCE,EAAS,KAAK,GAAKhB,EAAQ,OAC3BiB,EAAID,EAASF,EACb,EAAIE,EAASF,EACbI,EAAY,WAAWH,CAAW,oBAAoBE,CAAC,OAAO,CAAC,SACrE,OACEN,EAAAA,IAAC,OAAA,CAEC,UAAU,uHACV,MAAO,CAAE,UAAAO,EAAW,gBAAiBA,CAAA,EAEpC,SAAAL,CAAA,EAJIC,CAAA,CAOX,CAAC,CAAA,CAAA,CAGP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlipWords.cjs","sources":["../../../../src/lib/TextAnimation/FlipWords.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\nimport { AnimatePresence, motion } from \"motion/react\";\nimport { cn } from \"@dsui/ui/index\";\n\ntype FlipWordsProps = Omit<React.ComponentProps<\"span\">, \"children\"> & {\n words: string[];\n duration?: number;\n letterDelay?: number;\n wordDelay?: number;\n};\n\nfunction FlipWords({\n ref,\n words,\n duration = 3000,\n letterDelay = 0.05,\n wordDelay = 0.3,\n className,\n ...props\n}: FlipWordsProps) {\n const localRef = React.useRef<HTMLSpanElement>(null);\n React.useImperativeHandle(\n ref as any,\n () => localRef.current as HTMLSpanElement\n );\n const [currentWord, setCurrentWord] = React.useState(words[0]);\n const [isAnimating, setIsAnimating] = React.useState<boolean>(false);\n\n const startAnimation = React.useCallback(() => {\n const word = words[words.indexOf(currentWord) + 1] || words[0];\n setCurrentWord(word);\n setIsAnimating(true);\n }, [currentWord, words]);\n\n React.useEffect(() => {\n if (!isAnimating) {\n const timeoutId = setTimeout(() => {\n startAnimation();\n }, duration);\n return () => clearTimeout(timeoutId);\n }\n }, [isAnimating, duration, startAnimation]);\n\n return (\n <span ref={localRef} data-slot=\"flip-words\" {...(props as any)}>\n <AnimatePresence\n onExitComplete={() => {\n setIsAnimating(false);\n }}\n >\n <motion.span\n initial={{\n opacity: 0,\n y: 10,\n }}\n animate={{\n opacity: 1,\n y: 0,\n }}\n transition={{\n type: \"spring\",\n stiffness: 100,\n damping: 10,\n }}\n exit={{\n opacity: 0,\n y: -40,\n x: 40,\n filter: \"blur(8px)\",\n scale: 2,\n position: \"absolute\",\n }}\n className={cn(\n \"ds:inline-block ds:relative ds:text-left ds:px-2 ds:will-change-transform ds:will-change-opacity ds:will-change-filter\",\n className\n )}\n key={currentWord}\n >\n {currentWord.split(\" \").map((word, wordIndex) => (\n <motion.span\n key={`${word}-${wordIndex}`}\n initial={{ opacity: 0, y: 10, filter: \"blur(8px)\" }}\n animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n transition={{\n delay: wordIndex * wordDelay,\n duration: 0.3,\n }}\n className=\"ds:inline-block ds:whitespace-nowrap\"\n >\n {word.split(\"\").map((letter, letterIndex) => (\n <motion.span\n key={`${word}-${letterIndex}`}\n initial={{ opacity: 0, y: 10, filter: \"blur(8px)\" }}\n animate={{ opacity: 1, y: 0, filter: \"blur(0px)\" }}\n transition={{\n delay: wordIndex * wordDelay + letterIndex * letterDelay,\n duration: 0.2,\n }}\n className=\"ds:inline-block ds:will-change-transform ds:will-change-opacity ds:will-change-filter\"\n >\n {letter}\n </motion.span>\n ))}\n <span className=\"ds:inline-block\"> </span>\n </motion.span>\n ))}\n </motion.span>\n </AnimatePresence>\n </span>\n );\n}\n\nexport { FlipWords, type FlipWordsProps };\n"],"names":["FlipWords","ref","words","duration","letterDelay","wordDelay","className","props","localRef","React","currentWord","setCurrentWord","isAnimating","setIsAnimating","startAnimation","word","timeoutId","jsx","AnimatePresence","motion","cn","wordIndex","jsxs","letter","letterIndex"],"mappings":"01DAYA,SAASA,EAAU,CACjB,IAAAC,EACA,MAAAC,EACA,SAAAC,EAAW,IACX,YAAAC,EAAc,IACd,UAAAC,EAAY,GACZ,UAAAC,EACA,GAAGC,CACL,EAAmB,CACjB,MAAMC,EAAWC,EAAM,OAAwB,IAAI,EACnDA,EAAM,oBACJR,EACA,IAAMO,EAAS,OAAA,EAEjB,KAAM,CAACE,EAAaC,CAAc,EAAIF,EAAM,SAASP,EAAM,CAAC,CAAC,EACvD,CAACU,EAAaC,CAAc,EAAIJ,EAAM,SAAkB,EAAK,EAE7DK,EAAiBL,EAAM,YAAY,IAAM,CAC7C,MAAMM,EAAOb,EAAMA,EAAM,QAAQQ,CAAW,EAAI,CAAC,GAAKR,EAAM,CAAC,EAC7DS,EAAeI,CAAI,EACnBF,EAAe,EAAI,CACrB,EAAG,CAACH,EAAaR,CAAK,CAAC,EAEvBO,OAAAA,EAAM,UAAU,IAAM,CACpB,GAAI,CAACG,EAAa,CAChB,MAAMI,EAAY,WAAW,IAAM,CACjCF,EAAA,CACF,EAAGX,CAAQ,EACX,MAAO,IAAM,aAAaa,CAAS,CACrC,CACF,EAAG,CAACJ,EAAaT,EAAUW,CAAc,CAAC,QAGvC,OAAA,CAAK,IAAKN,EAAU,YAAU,aAAc,GAAID,EAC/C,SAAAU,EAAAA,IAACC,EAAAA,gBAAA,CACC,eAAgB,IAAM,CACpBL,EAAe,EAAK,CACtB,EAEA,SAAAI,EAAAA,IAACE,EAAAA,OAAO,KAAP,CACC,QAAS,CACP,QAAS,EACT,EAAG,EAAA,EAEL,QAAS,CACP,QAAS,EACT,EAAG,CAAA,EAEL,WAAY,CACV,KAAM,SACN,UAAW,IACX,QAAS,EAAA,EAEX,KAAM,CACJ,QAAS,EACT,EAAG,IACH,EAAG,GACH,OAAQ,YACR,MAAO,EACP,SAAU,UAAA,EAEZ,UAAWC,EAAAA,GACT,yHACAd,CAAA,EAID,WAAY,MAAM,GAAG,EAAE,IAAI,CAACS,EAAMM,IACjCC,EAAAA,KAACH,EAAAA,OAAO,KAAP,CAEC,QAAS,CAAE,QAAS,EAAG,EAAG,GAAI,OAAQ,WAAA,EACtC,QAAS,CAAE,QAAS,EAAG,EAAG,EAAG,OAAQ,WAAA,EACrC,WAAY,CACV,MAAOE,EAAYhB,EACnB,SAAU,EAAA,EAEZ,UAAU,uCAET,SAAA,CAAAU,EAAK,MAAM,EAAE,EAAE,IAAI,CAACQ,EAAQC,IAC3BP,EAAAA,IAACE,EAAAA,OAAO,KAAP,CAEC,QAAS,CAAE,QAAS,EAAG,EAAG,GAAI,OAAQ,WAAA,EACtC,QAAS,CAAE,QAAS,EAAG,EAAG,EAAG,OAAQ,WAAA,EACrC,WAAY,CACV,MAAOE,EAAYhB,EAAYmB,EAAcpB,EAC7C,SAAU,EAAA,EAEZ,UAAU,wFAET,SAAAmB,CAAA,EATI,GAAGR,CAAI,IAAIS,CAAW,EAAA,CAW9B,EACDP,EAAAA,IAAC,OAAA,CAAK,UAAU,kBAAkB,SAAA,GAAA,CAAM,CAAA,CAAA,EAvBnC,GAAGF,CAAI,IAAIM,CAAS,EAAA,CAyB5B,CAAA,EA7BIX,CAAA,CA8BP,CAAA,EAEJ,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GradientText.cjs","sources":["../../../../src/lib/TextAnimation/GradientText.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { motion, type Transition } from \"motion/react\";\nimport { cn } from \"@dsui/ui/index\";\n\ntype GradientTextProps = React.ComponentProps<\"span\"> & {\n text: string;\n gradient?: string;\n neon?: boolean;\n transition?: Transition;\n};\n\nfunction GradientText({\n text,\n className,\n gradient = \"linear-gradient(90deg, #3b82f6 0%, #a855f7 20%, #ec4899 50%, #a855f7 80%, #3b82f6 100%)\",\n neon = false,\n transition = { duration: 3, repeat: Infinity, ease: \"linear\" },\n ...props\n}: GradientTextProps) {\n const baseStyle: React.CSSProperties = {\n backgroundImage: gradient,\n backgroundClip: \"text\",\n WebkitBackgroundClip: \"text\",\n backgroundSize: \"200% 100%\",\n color: \"transparent\",\n };\n\n return (\n <span\n data-slot=\"gradient-text\"\n className={cn(\"ds:relative ds:inline-block\", className)}\n {...(props as any)}\n >\n <motion.span\n className=\"ds:m-0 ds:text-transparent\"\n style={baseStyle as any}\n animate={{ backgroundPosition: [\"0% 0%\", \"200% 0%\"] }}\n transition={transition}\n >\n {text}\n </motion.span>\n\n {neon && (\n <motion.span\n className=\"ds:m-0 ds:absolute ds:top-0 ds:left-0 ds:text-transparent ds:blur-sm ds:mix-blend-plus-lighter\"\n style={baseStyle as any}\n animate={{ backgroundPosition: [\"0% 0%\", \"200% 0%\"] }}\n transition={transition}\n >\n {text}\n </motion.span>\n )}\n </span>\n );\n}\n\nexport { GradientText, type GradientTextProps };\n"],"names":["GradientText","text","className","gradient","neon","transition","props","baseStyle","jsxs","cn","jsx","motion"],"mappings":"okDAaA,SAASA,EAAa,CACpB,KAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,0FACX,KAAAC,EAAO,GACP,WAAAC,EAAa,CAAE,SAAU,EAAG,OAAQ,IAAU,KAAM,QAAA,EACpD,GAAGC,CACL,EAAsB,CACpB,MAAMC,EAAiC,CACrC,gBAAiBJ,EACjB,eAAgB,OAChB,qBAAsB,OACtB,eAAgB,YAChB,MAAO,aAAA,EAGT,OACEK,EAAAA,KAAC,OAAA,CACC,YAAU,gBACV,UAAWC,EAAAA,GAAG,8BAA+BP,CAAS,EACrD,GAAII,EAEL,SAAA,CAAAI,EAAAA,IAACC,EAAAA,OAAO,KAAP,CACC,UAAU,6BACV,MAAOJ,EACP,QAAS,CAAE,mBAAoB,CAAC,QAAS,SAAS,CAAA,EAClD,WAAAF,EAEC,SAAAJ,CAAA,CAAA,EAGFG,GACCM,EAAAA,IAACC,EAAAA,OAAO,KAAP,CACC,UAAU,iGACV,MAAOJ,EACP,QAAS,CAAE,mBAAoB,CAAC,QAAS,SAAS,CAAA,EAClD,WAAAF,EAEC,SAAAJ,CAAA,CAAA,CACH,CAAA,CAAA,CAIR"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RollingText.cjs","sources":["../../../../src/lib/TextAnimation/RollingText.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n motion,\n useInView,\n type UseInViewOptions,\n type Transition,\n} from \"motion/react\";\n\nconst ENTRY_ANIMATION = {\n initial: { rotateX: 0 },\n animate: { rotateX: 90 },\n};\n\nconst EXIT_ANIMATION = {\n initial: { rotateX: 90 },\n animate: { rotateX: 0 },\n};\n\nconst formatCharacter = (char: string) => (char === \" \" ? \"\\u00A0\" : char);\n\ntype RollingTextProps = Omit<React.ComponentProps<\"span\">, \"children\"> & {\n transition?: Transition;\n inView?: boolean;\n inViewMargin?: UseInViewOptions[\"margin\"];\n inViewOnce?: boolean;\n text: string;\n};\n\nfunction RollingText({\n ref,\n transition = { duration: 0.5, delay: 0.1, ease: \"easeOut\" },\n inView = false,\n inViewMargin = \"0px\",\n inViewOnce = true,\n text,\n ...props\n}: RollingTextProps) {\n const localRef = React.useRef<HTMLSpanElement>(null);\n React.useImperativeHandle(ref as any, () => localRef.current!);\n\n const inViewResult = useInView(localRef, {\n once: inViewOnce,\n margin: inViewMargin,\n });\n const isInView = !inView || inViewResult;\n\n const characters = React.useMemo(() => text.split(\"\"), [text]);\n\n return (\n <span data-slot=\"rolling-text\" {...(props as any)} ref={ref}>\n {characters.map((char, idx) => (\n <span\n key={idx}\n className=\"ds:relative ds:inline-block ds:perspective-[9999999px] ds:transform-3d ds:w-auto\"\n aria-hidden=\"true\"\n >\n <motion.span\n className=\"ds:absolute ds:inline-block ds:backface-hidden ds:origin-[50%_25%]\"\n initial={ENTRY_ANIMATION.initial}\n animate={isInView ? ENTRY_ANIMATION.animate : undefined}\n transition={{\n ...transition,\n delay: idx * (transition?.delay ?? 0),\n }}\n >\n {formatCharacter(char)}\n </motion.span>\n <motion.span\n className=\"ds:absolute ds:inline-block ds:backface-hidden ds:origin-[50%_100%]\"\n initial={EXIT_ANIMATION.initial}\n animate={isInView ? EXIT_ANIMATION.animate : undefined}\n transition={{\n ...transition,\n delay: idx * (transition?.delay ?? 0) + 0.3,\n }}\n >\n {formatCharacter(char)}\n </motion.span>\n <span className=\"ds:invisible\">{formatCharacter(char)}</span>\n </span>\n ))}\n\n <span className=\"ds:sr-only\">{text}</span>\n </span>\n );\n}\n\nexport { RollingText, type RollingTextProps };\n"],"names":["ENTRY_ANIMATION","EXIT_ANIMATION","formatCharacter","char","RollingText","ref","transition","inView","inViewMargin","inViewOnce","text","props","localRef","React","inViewResult","useInView","isInView","characters","idx","jsxs","jsx","motion"],"mappings":"4bAUMA,EAAkB,CACtB,QAAS,CAAE,QAAS,CAAA,EACpB,QAAS,CAAE,QAAS,EAAA,CACtB,EAEMC,EAAiB,CACrB,QAAS,CAAE,QAAS,EAAA,EACpB,QAAS,CAAE,QAAS,CAAA,CACtB,EAEMC,EAAmBC,GAAkBA,IAAS,IAAM,IAAWA,EAUrE,SAASC,EAAY,CACnB,IAAAC,EACA,WAAAC,EAAa,CAAE,SAAU,GAAK,MAAO,GAAK,KAAM,SAAA,EAChD,OAAAC,EAAS,GACT,aAAAC,EAAe,MACf,WAAAC,EAAa,GACb,KAAAC,EACA,GAAGC,CACL,EAAqB,CACnB,MAAMC,EAAWC,EAAM,OAAwB,IAAI,EACnDA,EAAM,oBAAoBR,EAAY,IAAMO,EAAS,OAAQ,EAE7D,MAAME,EAAeC,EAAAA,UAAUH,EAAU,CACvC,KAAMH,EACN,OAAQD,CAAA,CACT,EACKQ,EAAW,CAACT,GAAUO,EAEtBG,EAAaJ,EAAM,QAAQ,IAAMH,EAAK,MAAM,EAAE,EAAG,CAACA,CAAI,CAAC,EAE7D,cACG,OAAA,CAAK,YAAU,eAAgB,GAAIC,EAAe,IAAAN,EAChD,SAAA,CAAAY,EAAW,IAAI,CAACd,EAAMe,IACrBC,EAAAA,KAAC,OAAA,CAEC,UAAU,mFACV,cAAY,OAEZ,SAAA,CAAAC,EAAAA,IAACC,EAAAA,OAAO,KAAP,CACC,UAAU,qEACV,QAASrB,EAAgB,QACzB,QAASgB,EAAWhB,EAAgB,QAAU,OAC9C,WAAY,CACV,GAAGM,EACH,MAAOY,GAAOZ,GAAY,OAAS,EAAA,EAGpC,WAAgBH,CAAI,CAAA,CAAA,EAEvBiB,EAAAA,IAACC,EAAAA,OAAO,KAAP,CACC,UAAU,sEACV,QAASpB,EAAe,QACxB,QAASe,EAAWf,EAAe,QAAU,OAC7C,WAAY,CACV,GAAGK,EACH,MAAOY,GAAOZ,GAAY,OAAS,GAAK,EAAA,EAGzC,WAAgBH,CAAI,CAAA,CAAA,QAEtB,OAAA,CAAK,UAAU,eAAgB,SAAAD,EAAgBC,CAAI,CAAA,CAAE,CAAA,CAAA,EA1BjDe,CAAA,CA4BR,EAEDE,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAc,SAAAV,CAAA,CAAK,CAAA,EACrC,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RotatingText.cjs","sources":["../../../../src/lib/TextAnimation/RotatingText.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n AnimatePresence,\n motion,\n type HTMLMotionProps,\n type Transition,\n} from \"motion/react\";\nimport { cn } from \"@dsui/ui/index\";\n\ntype RotatingTextProps = {\n text: string | string[];\n duration?: number;\n transition?: Transition;\n y?: number;\n containerClassName?: string;\n} & HTMLMotionProps<\"div\">;\n\nfunction RotatingText({\n text,\n y = -50,\n duration = 2000,\n transition = { duration: 0.3, ease: \"easeOut\" },\n containerClassName,\n ...props\n}: RotatingTextProps) {\n const [index, setIndex] = React.useState(0);\n\n React.useEffect(() => {\n if (!Array.isArray(text)) return;\n const interval = setInterval(() => {\n setIndex((prevIndex) => (prevIndex + 1) % text.length);\n }, duration);\n return () => clearInterval(interval);\n }, [text, duration]);\n\n const currentText = Array.isArray(text) ? text[index] : text;\n\n return (\n <div className={cn(\"ds:overflow-hidden ds:py-1\", containerClassName)}>\n <AnimatePresence mode=\"wait\">\n <motion.div\n key={currentText}\n transition={transition}\n initial={{ opacity: 0, y: -y }}\n animate={{ opacity: 1, y: 0 }}\n exit={{ opacity: 0, y }}\n {...(props as any)}\n >\n {currentText}\n </motion.div>\n </AnimatePresence>\n </div>\n );\n}\n\nexport { RotatingText, type RotatingTextProps };\n"],"names":["RotatingText","text","y","duration","transition","containerClassName","props","index","setIndex","React","interval","prevIndex","currentText","jsx","cn","AnimatePresence","motion"],"mappings":"01DAmBA,SAASA,EAAa,CACpB,KAAAC,EACA,EAAAC,EAAI,IACJ,SAAAC,EAAW,IACX,WAAAC,EAAa,CAAE,SAAU,GAAK,KAAM,SAAA,EACpC,mBAAAC,EACA,GAAGC,CACL,EAAsB,CACpB,KAAM,CAACC,EAAOC,CAAQ,EAAIC,EAAM,SAAS,CAAC,EAE1CA,EAAM,UAAU,IAAM,CACpB,GAAI,CAAC,MAAM,QAAQR,CAAI,EAAG,OAC1B,MAAMS,EAAW,YAAY,IAAM,CACjCF,EAAUG,IAAeA,EAAY,GAAKV,EAAK,MAAM,CACvD,EAAGE,CAAQ,EACX,MAAO,IAAM,cAAcO,CAAQ,CACrC,EAAG,CAACT,EAAME,CAAQ,CAAC,EAEnB,MAAMS,EAAc,MAAM,QAAQX,CAAI,EAAIA,EAAKM,CAAK,EAAIN,EAExD,OACEY,EAAAA,IAAC,MAAA,CAAI,UAAWC,EAAAA,GAAG,6BAA8BT,CAAkB,EACjE,SAAAQ,EAAAA,IAACE,EAAAA,gBAAA,CAAgB,KAAK,OACpB,SAAAF,EAAAA,IAACG,EAAAA,OAAO,IAAP,CAEC,WAAAZ,EACA,QAAS,CAAE,QAAS,EAAG,EAAG,CAACF,CAAA,EAC3B,QAAS,CAAE,QAAS,EAAG,EAAG,CAAA,EAC1B,KAAM,CAAE,QAAS,EAAG,EAAAA,CAAA,EACnB,GAAII,EAEJ,SAAAM,CAAA,EAPIA,CAAA,EAST,CAAA,CACF,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShimmeringText.cjs","sources":["../../../../src/lib/TextAnimation/ShimmeringText.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\nimport { type HTMLMotionProps, motion, type Transition } from \"motion/react\";\nimport { cn } from \"@dsui/ui/index\";\n\ntype ShimmeringTextProps = {\n text: string;\n duration?: number;\n transition?: Transition;\n wave?: boolean;\n color?: string;\n shimmeringColor?: string;\n} & Omit<HTMLMotionProps<\"span\">, \"children\">;\n\nfunction ShimmeringText({\n text,\n duration = 1,\n transition,\n wave = false,\n className,\n color = \"var(--color-neutral-500)\",\n shimmeringColor = \"var(--color-neutral-300)\",\n ...props\n}: ShimmeringTextProps) {\n return (\n <motion.span\n className={cn(\"ds:relative ds:inline-block ds:[perspective:500px]\", className)}\n style={\n {\n \"--shimmering-color\": shimmeringColor,\n \"--color\": color,\n color: \"var(--color)\",\n } as React.CSSProperties\n }\n {...(props as any)}\n >\n {text?.split(\"\")?.map((char, i) => (\n <motion.span\n key={i}\n className=\"ds:inline-block ds:whitespace-pre ds:[transform-style:preserve-3d]\"\n initial={{\n ...(wave\n ? {\n scale: 1,\n rotateY: 0,\n }\n : {}),\n color: \"var(--color)\",\n }}\n animate={{\n ...(wave\n ? {\n x: [0, 5, 0],\n y: [0, -5, 0],\n scale: [1, 1.1, 1],\n rotateY: [0, 15, 0],\n }\n : {}),\n color: [\"var(--color)\", \"var(--shimmering-color)\", \"var(--color)\"],\n }}\n transition={{\n duration,\n repeat: Infinity,\n repeatType: \"loop\",\n repeatDelay: text.length * 0.05,\n delay: (i * duration) / text.length,\n ease: \"easeInOut\",\n ...transition,\n }}\n >\n {char}\n </motion.span>\n ))}\n </motion.span>\n );\n}\n\nexport { ShimmeringText, type ShimmeringTextProps };\n"],"names":["ShimmeringText","text","duration","transition","wave","className","color","shimmeringColor","props","jsx","motion","cn","char","i"],"mappings":"okDAcA,SAASA,EAAe,CACtB,KAAAC,EACA,SAAAC,EAAW,EACX,WAAAC,EACA,KAAAC,EAAO,GACP,UAAAC,EACA,MAAAC,EAAQ,2BACR,gBAAAC,EAAkB,2BAClB,GAAGC,CACL,EAAwB,CACtB,OACEC,EAAAA,IAACC,EAAAA,OAAO,KAAP,CACC,UAAWC,EAAAA,GAAG,qDAAsDN,CAAS,EAC7E,MACE,CACE,qBAAsBE,EACtB,UAAWD,EACX,MAAO,cAAA,EAGV,GAAIE,EAEJ,YAAM,MAAM,EAAE,GAAG,IAAI,CAACI,EAAMC,IAC3BJ,EAAAA,IAACC,EAAAA,OAAO,KAAP,CAEC,UAAU,qEACV,QAAS,CACP,GAAIN,EACA,CACE,MAAO,EACP,QAAS,CAAA,EAEX,CAAA,EACJ,MAAO,cAAA,EAET,QAAS,CACP,GAAIA,EACA,CACE,EAAG,CAAC,EAAG,EAAG,CAAC,EACX,EAAG,CAAC,EAAG,GAAI,CAAC,EACZ,MAAO,CAAC,EAAG,IAAK,CAAC,EACjB,QAAS,CAAC,EAAG,GAAI,CAAC,CAAA,EAEpB,CAAA,EACJ,MAAO,CAAC,eAAgB,0BAA2B,cAAc,CAAA,EAEnE,WAAY,CACV,SAAAF,EACA,OAAQ,IACR,WAAY,OACZ,YAAaD,EAAK,OAAS,IAC3B,MAAQY,EAAIX,EAAYD,EAAK,OAC7B,KAAM,YACN,GAAGE,CAAA,EAGJ,SAAAS,CAAA,EAhCIC,CAAA,CAkCR,CAAA,CAAA,CAGP"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SplittingText.cjs","sources":["../../../../src/lib/TextAnimation/SplittingText.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n motion,\n type Variants,\n type TargetAndTransition,\n type HTMLMotionProps,\n useInView,\n type UseInViewOptions,\n} from \"motion/react\";\n\ntype DefaultSplittingTextProps = {\n motionVariants?: {\n initial?: Record<string, any>;\n animate?: Record<string, any>;\n transition?: Record<string, any>;\n stagger?: number;\n };\n inView?: boolean;\n inViewMargin?: UseInViewOptions[\"margin\"];\n inViewOnce?: boolean;\n delay?: number;\n} & HTMLMotionProps<\"div\">;\n\ntype CharsOrWordsSplittingTextProps = DefaultSplittingTextProps & {\n type?: \"chars\" | \"words\";\n text: string;\n};\n\ntype LinesSplittingTextProps = DefaultSplittingTextProps & {\n type: \"lines\";\n text: string[];\n};\n\ntype SplittingTextProps =\n | CharsOrWordsSplittingTextProps\n | LinesSplittingTextProps;\n\nconst defaultItemVariant: Variants = {\n hidden: { x: 150, opacity: 0 },\n visible: {\n x: 0,\n opacity: 1,\n transition: { duration: 0.7, ease: \"easeOut\" },\n },\n};\n\nexport const SplittingText: React.FC<SplittingTextProps> = ({\n ref,\n text,\n type = \"chars\",\n motionVariants = {},\n inView = false,\n inViewMargin = \"0px\",\n inViewOnce = true,\n delay = 0,\n ...props\n}) => {\n const items = React.useMemo<React.ReactNode[]>(() => {\n if (Array.isArray(text)) {\n return text.flatMap((line, i) => [\n <React.Fragment key={`line-${i}`}>{line}</React.Fragment>,\n i < text.length - 1 ? <br key={`br-${i}`} /> : null,\n ]);\n }\n\n if (type === \"words\") {\n const tokens = text.match(/\\S+\\s*/g) || [];\n return tokens.map((token, i) => (\n <React.Fragment key={i}>{token}</React.Fragment>\n ));\n }\n\n return text\n .split(\"\")\n .map((char, i) => <React.Fragment key={i}>{char}</React.Fragment>);\n }, [text, type]);\n\n const containerVariants: Variants = {\n hidden: {},\n visible: {\n transition: {\n delayChildren: delay / 1000,\n staggerChildren:\n motionVariants.stagger ??\n (type === \"chars\" ? 0.05 : type === \"words\" ? 0.2 : 0.3),\n },\n },\n };\n\n const itemVariants: Variants = {\n hidden: {\n ...defaultItemVariant.hidden,\n ...(motionVariants.initial || {}),\n },\n visible: {\n ...defaultItemVariant.visible,\n ...(motionVariants.animate || {}),\n transition: {\n ...((defaultItemVariant.visible as TargetAndTransition).transition ||\n {}),\n ...(motionVariants.transition || {}),\n },\n },\n };\n\n const localRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(\n ref as any,\n () => localRef.current as HTMLDivElement\n );\n\n const inViewResult = useInView(localRef, {\n once: inViewOnce,\n margin: inViewMargin,\n });\n const isInView = !inView || inViewResult;\n\n return (\n <motion.span\n ref={localRef}\n initial=\"hidden\"\n animate={isInView ? \"visible\" : \"hidden\"}\n variants={containerVariants}\n {...(props as any)}\n >\n {items.map(\n (item, index) =>\n item && (\n <React.Fragment key={index}>\n <motion.span\n key={index}\n variants={itemVariants}\n style={{\n display: \"inline-block\",\n whiteSpace:\n type === \"chars\"\n ? \"pre\"\n : Array.isArray(text)\n ? \"normal\"\n : \"normal\",\n }}\n >\n {item}\n </motion.span>\n {type === \"words\" && \" \"}\n </React.Fragment>\n )\n )}\n </motion.span>\n );\n};\n"],"names":["defaultItemVariant","SplittingText","ref","text","type","motionVariants","inView","inViewMargin","inViewOnce","delay","props","items","React","line","token","i","jsx","char","containerVariants","itemVariants","localRef","inViewResult","useInView","isInView","motion","item","index","jsxs"],"mappings":"4bAuCMA,EAA+B,CACnC,OAAQ,CAAE,EAAG,IAAK,QAAS,CAAA,EAC3B,QAAS,CACP,EAAG,EACH,QAAS,EACT,WAAY,CAAE,SAAU,GAAK,KAAM,SAAA,CAAU,CAEjD,EAEaC,EAA8C,CAAC,CAC1D,IAAAC,EACA,KAAAC,EACA,KAAAC,EAAO,QACP,eAAAC,EAAiB,CAAA,EACjB,OAAAC,EAAS,GACT,aAAAC,EAAe,MACf,WAAAC,EAAa,GACb,MAAAC,EAAQ,EACR,GAAGC,CACL,IAAM,CACJ,MAAMC,EAAQC,EAAM,QAA2B,IACzC,MAAM,QAAQT,CAAI,EACbA,EAAK,QAAQ,CAACU,EAAM,IAAM,OAC9BD,EAAM,SAAN,CAAkC,SAAAC,CAAA,EAAd,QAAQ,CAAC,EAAU,EACxC,EAAIV,EAAK,OAAS,QAAK,KAAA,CAAA,EAAQ,MAAM,CAAC,EAAI,EAAK,IAAA,CAChD,EAGCC,IAAS,SACID,EAAK,MAAM,SAAS,GAAK,CAAA,GAC1B,IAAI,CAACW,EAAOC,IACxBC,EAAAA,IAACJ,EAAM,SAAN,CAAwB,SAAAE,CAAA,EAAJC,CAAU,CAChC,EAGIZ,EACJ,MAAM,EAAE,EACR,IAAI,CAACc,EAAM,IAAMD,EAAAA,IAACJ,EAAM,SAAN,CAAwB,SAAAK,CAAA,EAAJ,CAAS,CAAiB,EAClE,CAACd,EAAMC,CAAI,CAAC,EAETc,EAA8B,CAClC,OAAQ,CAAA,EACR,QAAS,CACP,WAAY,CACV,cAAeT,EAAQ,IACvB,gBACEJ,EAAe,UACdD,IAAS,QAAU,IAAOA,IAAS,QAAU,GAAM,GAAA,CACxD,CACF,EAGIe,EAAyB,CAC7B,OAAQ,CACN,GAAGnB,EAAmB,OACtB,GAAIK,EAAe,SAAW,CAAA,CAAC,EAEjC,QAAS,CACP,GAAGL,EAAmB,QACtB,GAAIK,EAAe,SAAW,CAAA,EAC9B,WAAY,CACV,GAAKL,EAAmB,QAAgC,YACtD,CAAA,EACF,GAAIK,EAAe,YAAc,CAAA,CAAC,CACpC,CACF,EAGIe,EAAWR,EAAM,OAAuB,IAAI,EAClDA,EAAM,oBACJV,EACA,IAAMkB,EAAS,OAAA,EAGjB,MAAMC,EAAeC,EAAAA,UAAUF,EAAU,CACvC,KAAMZ,EACN,OAAQD,CAAA,CACT,EACKgB,EAAW,CAACjB,GAAUe,EAE5B,OACEL,EAAAA,IAACQ,EAAAA,OAAO,KAAP,CACC,IAAKJ,EACL,QAAQ,SACR,QAASG,EAAW,UAAY,SAChC,SAAUL,EACT,GAAIR,EAEJ,SAAAC,EAAM,IACL,CAACc,EAAMC,IACLD,GACEE,EAAAA,KAACf,EAAM,SAAN,CACC,SAAA,CAAAI,EAAAA,IAACQ,EAAAA,OAAO,KAAP,CAEC,SAAUL,EACV,MAAO,CACL,QAAS,eACT,WACEf,IAAS,QACL,OACA,MAAM,QAAQD,CAAI,EAChB,SACA,EAGT,SAAAsB,CAAA,EAZIC,CAAA,EAcNtB,IAAS,SAAW,GAAA,CAAA,EAhBFsB,CAiBrB,CAAA,CAEN,CAAA,CAGN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextGenerateEffect.cjs","sources":["../../../../src/lib/TextAnimation/TextGenerateEffect.tsx"],"sourcesContent":["\"use client\";\nimport * as React from \"react\";\nimport { motion, stagger, useAnimate } from \"motion/react\";\nimport { cn } from \"@dsui/ui/index\";\n\ntype TextGenerateEffectProps = Omit<React.ComponentProps<\"div\">, \"children\"> & {\n words: string;\n filter?: boolean;\n duration?: number;\n staggerDelay?: number;\n};\n\nfunction TextGenerateEffect({\n ref,\n words,\n className,\n filter = true,\n duration = 0.5,\n staggerDelay = 0.2,\n ...props\n}: TextGenerateEffectProps) {\n const localRef = React.useRef<HTMLDivElement>(null);\n React.useImperativeHandle(\n ref as any,\n () => localRef.current as HTMLDivElement\n );\n\n const [scope, animate] = useAnimate();\n const wordsArray = React.useMemo(() => words.split(\" \"), [words]);\n\n React.useEffect(() => {\n if (scope.current) {\n animate(\n \"span\",\n {\n opacity: 1,\n filter: filter ? \"blur(0px)\" : \"none\",\n },\n {\n duration: duration,\n delay: stagger(staggerDelay),\n }\n );\n }\n }, [animate, duration, filter, scope, staggerDelay]);\n\n return (\n <div\n ref={localRef}\n className={cn(\"ds:font-bold\", className)}\n data-slot=\"text-generate-effect\"\n {...(props as any)}\n >\n <motion.div ref={scope}>\n {wordsArray.map((word, idx) => (\n <motion.span\n key={`${word}-${idx}`}\n className=\"ds:opacity-0 ds:will-change-transform ds:will-change-opacity ds:will-change-filter\"\n style={{\n filter: filter ? \"blur(10px)\" : \"none\",\n }}\n >\n {word}{\" \"}\n </motion.span>\n ))}\n </motion.div>\n </div>\n );\n}\n\nexport { TextGenerateEffect, type TextGenerateEffectProps };\n"],"names":["TextGenerateEffect","ref","words","className","filter","duration","staggerDelay","props","localRef","React","scope","animate","useAnimate","wordsArray","stagger","jsx","cn","motion","word","idx","jsxs"],"mappings":"01DAYA,SAASA,EAAmB,CAC1B,IAAAC,EACA,MAAAC,EACA,UAAAC,EACA,OAAAC,EAAS,GACT,SAAAC,EAAW,GACX,aAAAC,EAAe,GACf,GAAGC,CACL,EAA4B,CAC1B,MAAMC,EAAWC,EAAM,OAAuB,IAAI,EAClDA,EAAM,oBACJR,EACA,IAAMO,EAAS,OAAA,EAGjB,KAAM,CAACE,EAAOC,CAAO,EAAIC,aAAA,EACnBC,EAAaJ,EAAM,QAAQ,IAAMP,EAAM,MAAM,GAAG,EAAG,CAACA,CAAK,CAAC,EAEhEO,OAAAA,EAAM,UAAU,IAAM,CAChBC,EAAM,SACRC,EACE,OACA,CACE,QAAS,EACT,OAAQP,EAAS,YAAc,MAAA,EAEjC,CACE,SAAAC,EACA,MAAOS,EAAAA,QAAQR,CAAY,CAAA,CAC7B,CAGN,EAAG,CAACK,EAASN,EAAUD,EAAQM,EAAOJ,CAAY,CAAC,EAGjDS,EAAAA,IAAC,MAAA,CACC,IAAKP,EACL,UAAWQ,EAAAA,GAAG,eAAgBb,CAAS,EACvC,YAAU,uBACT,GAAII,EAEL,SAAAQ,EAAAA,IAACE,EAAAA,OAAO,IAAP,CAAW,IAAKP,EACd,SAAAG,EAAW,IAAI,CAACK,EAAMC,IACrBC,EAAAA,KAACH,EAAAA,OAAO,KAAP,CAEC,UAAU,qFACV,MAAO,CACL,OAAQb,EAAS,aAAe,MAAA,EAGjC,SAAA,CAAAc,EAAM,GAAA,CAAA,EANF,GAAGA,CAAI,IAAIC,CAAG,EAAA,CAQtB,CAAA,CACH,CAAA,CAAA,CAGN"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextHoverEffect.cjs","sources":["../../../../src/lib/TextAnimation/TextHoverEffect.tsx"],"sourcesContent":["\"use client\";\nimport React, { useRef, useEffect, useState } from \"react\";\nimport { motion } from \"motion/react\";\n\nexport const TextHoverEffect = ({\n text,\n duration,\n}: {\n text: string;\n duration?: number;\n automatic?: boolean;\n}) => {\n const svgRef = useRef<SVGSVGElement>(null);\n const [cursor, setCursor] = useState({ x: 0, y: 0 });\n const [hovered, setHovered] = useState(false);\n const [maskPosition, setMaskPosition] = useState({ cx: \"50%\", cy: \"50%\" });\n\n useEffect(() => {\n if (svgRef.current && cursor.x !== null && cursor.y !== null) {\n const svgRect = svgRef.current.getBoundingClientRect();\n const cxPercentage = ((cursor.x - svgRect.left) / svgRect.width) * 100;\n const cyPercentage = ((cursor.y - svgRect.top) / svgRect.height) * 100;\n setMaskPosition({\n cx: `${cxPercentage}%`,\n cy: `${cyPercentage}%`,\n });\n }\n }, [cursor]);\n\n return (\n <svg\n ref={svgRef}\n width=\"100%\"\n height=\"100%\"\n viewBox=\"0 0 300 100\"\n xmlns=\"http://www.w3.org/2000/svg\"\n onMouseEnter={() => setHovered(true)}\n onMouseLeave={() => setHovered(false)}\n onMouseMove={(e) => setCursor({ x: e.clientX, y: e.clientY })}\n className=\"ds:select-none\"\n >\n <defs>\n <linearGradient\n id=\"textGradient\"\n gradientUnits=\"userSpaceOnUse\"\n cx=\"50%\"\n cy=\"50%\"\n r=\"25%\"\n >\n {hovered && (\n <>\n <stop offset=\"0%\" stopColor=\"#eab308\" />\n <stop offset=\"25%\" stopColor=\"#ef4444\" />\n <stop offset=\"50%\" stopColor=\"#3b82f6\" />\n <stop offset=\"75%\" stopColor=\"#06b6d4\" />\n <stop offset=\"100%\" stopColor=\"#8b5cf6\" />\n </>\n )}\n </linearGradient>\n <motion.radialGradient\n id=\"revealMask\"\n gradientUnits=\"userSpaceOnUse\"\n r=\"20%\"\n initial={{ cx: \"50%\", cy: \"50%\" }}\n animate={maskPosition}\n transition={{ duration: duration ?? 0, ease: \"easeOut\" }}\n >\n <stop offset=\"0%\" stopColor=\"white\" />\n <stop offset=\"100%\" stopColor=\"black\" />\n </motion.radialGradient>\n <mask id=\"textMask\">\n <rect\n x=\"0\"\n y=\"0\"\n width=\"100%\"\n height=\"100%\"\n fill=\"url(#revealMask)\"\n />\n </mask>\n </defs>\n <text\n x=\"50%\"\n y=\"50%\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n strokeWidth=\"0.3\"\n className={`ds:fill-transparent ds:font-[helvetica] ds:text-7xl ds:font-bold ${hovered ? \"stroke-transparent\" : \"stroke-gray-400`\"}`}\n >\n {text}\n </text>\n <motion.text\n x=\"50%\"\n y=\"50%\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n strokeWidth=\"0.3\"\n className={`ds:fill-transparent ds:font-[helvetica] ds:text-7xl ds:font-bold ${hovered ? \"stroke-transparent\" : \"stroke-gray-400\"}`}\n initial={{ strokeDashoffset: 1000, strokeDasharray: 1000 }}\n animate={{\n strokeDashoffset: 0,\n strokeDasharray: 1000,\n }}\n transition={{\n duration: 4,\n ease: \"easeInOut\",\n }}\n >\n {text}\n </motion.text>\n <text\n x=\"50%\"\n y=\"50%\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n stroke=\"url(#textGradient)\"\n strokeWidth=\"0.3\"\n mask=\"url(#textMask)\"\n className=\"ds:fill-transparent ds:font-[helvetica] ds:text-7xl ds:font-bold\"\n >\n {text}\n </text>\n </svg>\n );\n};\n"],"names":["TextHoverEffect","text","duration","svgRef","useRef","cursor","setCursor","useState","hovered","setHovered","maskPosition","setMaskPosition","useEffect","svgRect","cxPercentage","cyPercentage","jsxs","e","jsx","Fragment","motion"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextPressureEffect.cjs","sources":["../../../../src/lib/TextAnimation/TextPressureEffect.tsx"],"sourcesContent":["// Component ported from https://codepen.io/JuanFuentes/full/rgXKGQ\nimport { useEffect, useRef, useState } from \"react\";\ninterface TextPressureProps {\n text?: string;\n fontFamily?: string;\n fontUrl?: string;\n width?: boolean;\n weight?: boolean;\n italic?: boolean;\n alpha?: boolean;\n flex?: boolean;\n stroke?: boolean;\n scale?: boolean;\n textColor?: string;\n strokeColor?: string;\n strokeWidth?: number;\n className?: string;\n minFontSize?: number;\n}\n\nconst TextPressure: React.FC<TextPressureProps> = ({\n text = \"Compressa\",\n fontFamily = \"Compressa VF\",\n fontUrl = \"https://res.cloudinary.com/dr6lvwubh/raw/upload/v1529908256/CompressaPRO-GX.woff2\",\n width = true,\n weight = true,\n italic = true,\n alpha = false,\n flex = true,\n stroke = false,\n scale = false,\n textColor = \"#FFFFFF\",\n strokeColor = \"#FF0000\",\n strokeWidth = 2,\n className = \"\",\n minFontSize = 24,\n}) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const titleRef = useRef<HTMLHeadingElement | null>(null);\n const spansRef = useRef<(HTMLSpanElement | null)[]>([]);\n const mouseRef = useRef({ x: 0, y: 0 });\n const cursorRef = useRef({ x: 0, y: 0 });\n const [fontSize, setFontSize] = useState(minFontSize);\n const [scaleY, setScaleY] = useState(1);\n const [lineHeight, setLineHeight] = useState(1);\n const chars = text.split(\"\");\n const dist = (a: { x: number; y: number }, b: { x: number; y: number }) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n };\n\n useEffect(() => {\n const handleMouseMove = (e: MouseEvent) => {\n cursorRef.current.x = e.clientX;\n cursorRef.current.y = e.clientY;\n };\n const handleTouchMove = (e: TouchEvent) => {\n const t = e.touches[0];\n cursorRef.current.x = t.clientX;\n cursorRef.current.y = t.clientY;\n };\n window.addEventListener(\"mousemove\", handleMouseMove);\n window.addEventListener(\"touchmove\", handleTouchMove, { passive: false });\n if (containerRef.current) {\n const { left, top, width, height } =\n containerRef.current.getBoundingClientRect();\n mouseRef.current.x = left + width / 2;\n mouseRef.current.y = top + height / 2;\n cursorRef.current.x = mouseRef.current.x;\n cursorRef.current.y = mouseRef.current.y;\n }\n return () => {\n window.removeEventListener(\"mousemove\", handleMouseMove);\n window.removeEventListener(\"touchmove\", handleTouchMove);\n };\n }, []);\n\n const setSize = () => {\n if (!containerRef.current || !titleRef.current) return;\n const { width: containerW, height: containerH } =\n containerRef.current.getBoundingClientRect();\n let newFontSize = containerW / (chars.length / 2);\n newFontSize = Math.max(newFontSize, minFontSize);\n setFontSize(newFontSize);\n setScaleY(1);\n setLineHeight(1);\n requestAnimationFrame(() => {\n if (!titleRef.current) return;\n const textRect = titleRef.current.getBoundingClientRect();\n if (scale && textRect.height > 0) {\n const yRatio = containerH / textRect.height;\n setScaleY(yRatio);\n setLineHeight(yRatio);\n }\n });\n };\n\n useEffect(() => {\n setSize();\n window.addEventListener(\"resize\", setSize);\n return () => window.removeEventListener(\"resize\", setSize);\n }, [scale, text]);\n\n useEffect(() => {\n let rafId: number;\n const animate = () => {\n mouseRef.current.x += (cursorRef.current.x - mouseRef.current.x) / 15;\n mouseRef.current.y += (cursorRef.current.y - mouseRef.current.y) / 15;\n if (titleRef.current) {\n const titleRect = titleRef.current.getBoundingClientRect();\n const maxDist = titleRect.width / 2;\n spansRef.current.forEach((span) => {\n if (!span) return;\n const rect = span.getBoundingClientRect();\n const charCenter = {\n x: rect.x + rect.width / 2,\n y: rect.y + rect.height / 2,\n };\n const d = dist(mouseRef.current, charCenter);\n const getAttr = (\n distance: number,\n minVal: number,\n maxVal: number\n ) => {\n const val = maxVal - Math.abs((maxVal * distance) / maxDist);\n return Math.max(minVal, val + minVal);\n };\n const wdth = width ? Math.floor(getAttr(d, 5, 200)) : 100;\n const wght = weight ? Math.floor(getAttr(d, 100, 900)) : 400;\n const italVal = italic ? getAttr(d, 0, 1).toFixed(2) : \"0\";\n const alphaVal = alpha ? getAttr(d, 0, 1).toFixed(2) : \"1\";\n span.style.opacity = alphaVal;\n span.style.fontVariationSettings = `'wght' ${wght}, 'wdth' ${wdth}, 'ital' ${italVal}`;\n });\n }\n rafId = requestAnimationFrame(animate);\n };\n animate();\n return () => cancelAnimationFrame(rafId);\n }, [width, weight, italic, alpha, chars.length]);\n\n return (\n <div\n ref={containerRef}\n className=\"ds:relative ds:w-full ds:h-full ds:overflow-hidden ds:bg-transparent\"\n >\n <style>{`\n @font-face {\n font-family: '${fontFamily}';\n src: url('${fontUrl}');\n font-style: normal;\n }\n .stroke span {\n position: relative;\n color: ${textColor};\n }\n .stroke span::after {\n content: attr(data-char);\n position: absolute;\n left: 0;\n top: 0;\n color: transparent;\n z-index: -1;\n -webkit-text-stroke-width: ${strokeWidth}px;\n -webkit-text-stroke-color: ${strokeColor};\n }\n `}</style>\n <h1\n ref={titleRef}\n className={`ds:text-pressure-title ${className} ${flex ? \"flex justify-between\" : \"\"} ${stroke ? \"stroke\" : \"\"} ds:uppercase ds:text-center`}\n style={{\n fontFamily,\n fontSize: fontSize,\n lineHeight,\n transform: `scale(1, ${scaleY})`,\n transformOrigin: \"center top\",\n margin: 0,\n fontWeight: 100,\n color: stroke ? undefined : textColor,\n }}\n >\n {chars.map((char, i) => (\n <span\n key={i}\n ref={(el) => {\n spansRef.current[i] = el;\n }}\n data-char={char}\n className=\"ds:inline-block\"\n >\n {char}\n </span>\n ))}\n </h1>\n </div>\n );\n};\n\nexport default TextPressure;\n"],"names":["TextPressure","text","fontFamily","fontUrl","width","weight","italic","alpha","flex","stroke","scale","textColor","strokeColor","strokeWidth","className","minFontSize","containerRef","useRef","titleRef","spansRef","mouseRef","cursorRef","fontSize","setFontSize","useState","scaleY","setScaleY","lineHeight","setLineHeight","chars","dist","a","b","dx","dy","useEffect","handleMouseMove","handleTouchMove","t","left","top","height","setSize","containerW","containerH","newFontSize","textRect","yRatio","rafId","animate","maxDist","span","rect","charCenter","getAttr","distance","minVal","maxVal","val","wdth","wght","italVal","alphaVal","jsxs","jsx","char","i","el"],"mappings":"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"}
|