@sth87/shadcn-design-system 0.1.8 → 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 +45 -44
- 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/hooks/use-data-table.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.js","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.js","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.js","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":"AAEO,MAAMA,IAAkB;AAAA,EAoD7B,gBAAgB;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAAA,EAEF,WAAW;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAGJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","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":"AAAO,MAAMA,IAAc;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-callback-ref.js","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":";AAUA,SAASA,EACPC,GACG;AACH,QAAMC,IAAcC,EAAM,OAAOF,CAAQ;AAEzC,SAAAE,EAAM,UAAU,MAAM;AACpB,IAAAD,EAAY,UAAUD;AAAA,EACxB,CAAC,GAGME,EAAM;AAAA,IACX,OAAO,IAAIC,MAASF,EAAY,UAAU,GAAGE,CAAI;AAAA,IACjD,CAAA;AAAA,EAAC;AAEL;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-data-table.js","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 ...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 },\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","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.js","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":";;AAIO,SAASA,EACdC,GACAC,GACA;AACA,QAAMC,IAAiBC,EAAeH,CAAQ,GACxCI,IAAmBC,EAAM,OAAO,CAAC;AACvC,SAAAA,EAAM;AAAA,IACJ,MAAM,MAAM,OAAO,aAAaD,EAAiB,OAAO;AAAA,IACxD,CAAA;AAAA,EAAC,GAGcC,EAAM;AAAA,IACrB,IAAIC,MAAwB;AAC1B,aAAO,aAAaF,EAAiB,OAAO,GAC5CA,EAAiB,UAAU,OAAO;AAAA,QAChC,MAAMF,EAAe,GAAGI,CAAI;AAAA,QAC5BL;AAAA,MAAA;AAAA,IAEJ;AAAA,IACA,CAACC,GAAgBD,CAAK;AAAA,EAAA;AAI1B;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-debounced-value.js","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":";;AAWO,SAASA,EACdC,GACAC,GACyB;AACzB,QAAMC,IACJF,aAAwB,WAAWA,EAAA,IAAiBA,GAChD,CAACG,GAAgBC,CAAiB,IAAIC;AAAA,IAC1CH;AAAA,EAAA,GAEII,IAAmBC,EAAsBL,CAAqB,GAC9DM,IAAuBC,EAAqBL,GAAmBH,CAAK;AAE1E,SAAIK,EAAiB,YAAYJ,MAC/BM,EAAqBN,CAAqB,GAC1CI,EAAiB,UAAUJ,IAEtB,CAACC,GAAgBK,CAAoB;AAC9C;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-event-listener.js","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":";;AA4CA,SAASA,EAMPC,GACAC,GAQAC,GACAC,GACA;AAEA,QAAMC,IAAeC,EAAOJ,CAAO;AAEnC,EAAAK,EAA0B,MAAM;AAC9B,IAAAF,EAAa,UAAUH;AAAA,EACzB,GAAG,CAACA,CAAO,CAAC,GAEZM,EAAU,MAAM;AAEd,UAAMC,IAA4BN,GAAS,WAAW;AACtD,QAAI,EAAEM,KAAiBA,EAAc,kBAAmB;AAExD,UAAMC,IAA2B,CAACC,MAAU;AAC1C,MAAAN,EAAa,QAAQM,CAAK;AAAA,IAC5B;AACA,WAAAF,EAAc,iBAAiBR,GAAWS,GAAUN,CAAO,GAEpD,MAAM;AACX,MAAAK,EAAc,oBAAoBR,GAAWS,GAAUN,CAAO;AAAA,IAChE;AAAA,EACF,GAAG,CAACH,GAAWE,GAASC,CAAO,CAAC;AAClC;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-intersection-observer.js","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":";AA0BO,SAASA,EAAwB;AAAA,EACtC,WAAAC,IAAY;AAAA,EACZ,MAAAC,IAAO;AAAA,EACP,YAAAC,IAAa;AAAA,EACb,mBAAAC,IAAoB;AAAA,EACpB,uBAAAC,IAAwB;AAAA,EACxB,UAAAC;AACF,IAAoC,IAAwB;AAC1D,QAAM,CAACC,GAAKC,CAAM,IAAIC,EAAyB,IAAI,GAC7C,CAACC,GAAOC,CAAQ,IAAIF,EAAgB,OAAO;AAAA,IAC/C,gBAAgBJ;AAAA,IAChB,OAAO;AAAA,EAAA,EACP,GACIO,IACJC,EAAmD,MAAS;AAC9D,EAAAD,EAAY,UAAUN;AACtB,QAAMQ,IAASJ,EAAM,OAAO,kBAAkBN;AAC9C,EAAAW,EAAU,MAAM;AAMd,QAJI,CAACR,KAED,EAAE,0BAA0B,WAE5BO,EAAQ;AAEZ,UAAME,IAAW,IAAI;AAAA,MACnB,CAACC,MAA+C;AAC9C,cAAMC,IAAa,MAAM,QAAQF,EAAS,UAAU,IAChDA,EAAS,aACT,CAACA,EAAS,UAAU;AACxB,QAAAC,EAAQ,QAAQ,CAACE,MAAU;AACzB,gBAAMC,IACJD,EAAM,kBACND,EAAW;AAAA,YACT,CAACjB,MAAckB,EAAM,qBAAqBlB;AAAAA,UAAA;AAE9C,UAAAU,EAAS,EAAE,gBAAAS,GAAgB,OAAAD,GAAO,GAC9BP,EAAY,WACdA,EAAY,QAAQQ,GAAgBD,CAAK;AAAA,QAM7C,CAAC;AAAA,MACH;AAAA,MACA,EAAE,WAAAlB,GAAW,MAAAC,GAAM,YAAAC,EAAA;AAAA,IAAW;AAEhC,WAAAa,EAAS,QAAQT,CAAG,GACb,MAAM;AACX,MAAAS,EAAS,WAAA;AAAA,IACX;AAAA,EAEF,GAAG;AAAA,IACDT;AAAA;AAAA,IAEA,KAAK,UAAUN,CAAS;AAAA,IACxBC;AAAA,IACAC;AAAA,IACAW;AAAA,IACAV;AAAA,EAAA,CACD;AAED,QAAMiB,IAAUR,EAAuB,IAAI;AAC3C,EAAAE,EAAU,MAAM;AACd,IACE,CAACR,KACDG,EAAM,OAAO,UACb,CAACN,KACD,CAACU,KACDO,EAAQ,YAAYX,EAAM,MAAM,WAEhCW,EAAQ,UAAUX,EAAM,MAAM,QAC9BC,EAAS,EAAE,gBAAgBN,GAAuB,OAAO,QAAW;AAAA,EAExE,GAAG,CAACE,GAAKG,EAAM,OAAON,GAAmBU,GAAQT,CAAqB,CAAC;AACvE,QAAMiB,IAAS;AAAA,IACbd;AAAA,IACA,CAAC,CAACE,EAAM;AAAA,IACRA,EAAM;AAAA,EAAA;AAGR,SAAAY,EAAO,MAAMA,EAAO,CAAC,GACrBA,EAAO,iBAAiBA,EAAO,CAAC,GAChCA,EAAO,QAAQA,EAAO,CAAC,GAChBA;AACT;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-isomorphic-layout-effect.js","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":";AAGO,MAAMA,IACX,OAAO,SAAW,MAAcC,EAAM,kBAAkBA,EAAM;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-media-query.js","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":";;AAUA,MAAMA,IAAY,OAAO,SAAW;AAE7B,SAASC,EACdC,GACA;AAAA,EACE,cAAAC,IAAe;AAAA,EACf,qBAAAC,IAAsB;AACxB,IAA0B,IACjB;AACT,QAAMC,IAAa,CAACH,MACdF,IACKG,IAEF,OAAO,WAAWD,CAAK,EAAE,SAG5B,CAACI,GAASC,CAAU,IAAIC,EAAkB,MAC1CJ,IACKC,EAAWH,CAAK,IAElBC,CACR;AAGD,WAASM,IAAe;AACtB,IAAAF,EAAWF,EAAWH,CAAK,CAAC;AAAA,EAC9B;AAEA,SAAAQ,EAA0B,MAAM;AAC9B,UAAMC,IAAa,OAAO,WAAWT,CAAK;AAE1C,WAAAO,EAAA,GAEIE,EAAW,cACbA,EAAW,YAAYF,CAAY,IAEnCE,EAAW,iBAAiB,UAAUF,CAAY,GAE7C,MAAM;AACX,MAAIE,EAAW,iBACbA,EAAW,eAAeF,CAAY,IAEtCE,EAAW,oBAAoB,UAAUF,CAAY;AAAA,IAEzD;AAAA,EACF,GAAG,CAACP,CAAK,CAAC,GAEHI;AACT;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-on-click-outside.js","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"],"mappings":";AAYO,SAASA,EACdC,GACAC,GACAC,IAAuB,aACvBC,IAAgD,IAC1C;AACN,EAAAC;AAAA,IACEF;AAAA,IACA,CAACG,MAAU;AACT,YAAMC,IAASD,EAAM;AAErB,UAAI,CAACC,KAAU,CAACA,EAAO;AACrB;AAOF,OALkB,MAAM,QAAQN,CAAG,IAC/BA,EACG,OAAO,CAAC,MAAM,EAAQ,EAAE,OAAQ,EAChC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,SAASM,CAAM,CAAC,IACxDN,GAAK,WAAW,CAACA,GAAK,QAAQ,SAASM,CAAM,MAE/CL,EAAQI,CAAK;AAAA,IAEjB;AAAA,IACA;AAAA,IACAF;AAAA,EAAA;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-script.js","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":";AAUA,MAAMA,wBAA2B,IAAA;AAEjC,SAASC,EAAcC,GAAa;AAClC,QAAMC,IAAiC,SAAS;AAAA,IAC9C,eAAeD,CAAG;AAAA,EAAA,GAEdE,IAASD,GAAM,aAAa,aAAa;AAG/C,SAAO;AAAA,IACL,MAAAA;AAAA,IACA,QAAAC;AAAA,EAAA;AAEJ;AAEO,SAASC,EACdH,GACAI,GACiB;AACjB,QAAM,CAACF,GAAQG,CAAS,IAAIC,EAA0B,MAChD,CAACN,KAAOI,GAAS,oBACZ,SAEL,OAAO,SAAW,MACb,YAEFN,EAAqB,IAAIE,CAAG,KAAK,SACzC;AAED,SAAAO,EAAU,MAAM;AACd,QAAI,CAACP,KAAOI,GAAS;AACnB;AAEF,UAAMI,IAAqBV,EAAqB,IAAIE,CAAG;AACvD,QAAIQ,MAAuB,WAAWA,MAAuB,SAAS;AACpE,MAAAH,EAAUG,CAAkB;AAC5B;AAAA,IACF;AACA,UAAMC,IAASV,EAAcC,CAAG;AAChC,QAAIU,IAAaD,EAAO;AACxB,QAAKC;AAiBH,MAAAL,EAAUI,EAAO,UAAUD,KAAsB,SAAS;AAAA,SAjB3C;AACf,MAAAE,IAAa,SAAS,cAAc,QAAQ,GAC5CA,EAAW,MAAMV,GACjBU,EAAW,QAAQ,IACfN,GAAS,OACXM,EAAW,KAAKN,EAAQ,KAE1BM,EAAW,aAAa,eAAe,SAAS,GAChD,SAAS,KAAK,YAAYA,CAAU;AACpC,YAAMC,IAAwB,CAACC,MAAiB;AAC9C,cAAMC,IACJD,EAAM,SAAS,SAAS,UAAU;AACpC,QAAAF,GAAY,aAAa,eAAeG,CAAY;AAAA,MACtD;AACA,MAAAH,EAAW,iBAAiB,QAAQC,CAAqB,GACzDD,EAAW,iBAAiB,SAASC,CAAqB;AAAA,IAC5D;AAGA,UAAMG,IAAoB,CAACF,MAAiB;AAC1C,YAAMG,IAAYH,EAAM,SAAS,SAAS,UAAU;AACpD,MAAAP,EAAUU,CAAS,GACnBjB,EAAqB,IAAIE,GAAKe,CAAS;AAAA,IACzC;AACA,WAAAL,EAAW,iBAAiB,QAAQI,CAAiB,GACrDJ,EAAW,iBAAiB,SAASI,CAAiB,GAE/C,MAAM;AACX,MAAIJ,MACFA,EAAW,oBAAoB,QAAQI,CAAiB,GACxDJ,EAAW,oBAAoB,SAASI,CAAiB,IAEvDJ,KAAcN,GAAS,oBACzBM,EAAW,OAAA,GACXZ,EAAqB,OAAOE,CAAG;AAAA,IAEnC;AAAA,EACF,GAAG,CAACA,GAAKI,GAAS,mBAAmBA,GAAS,iBAAiBA,GAAS,EAAE,CAAC,GAEpEF;AACT;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-scroll-lock.js","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":";;AAqBA,MAAMA,IAAY,OAAO,SAAW;AAE7B,SAASC,EACdC,IAAgC,IACX;AACrB,QAAM,EAAE,UAAAC,IAAW,IAAM,YAAAC,GAAY,aAAAC,IAAc,OAASH,GACtD,CAACI,GAAUC,CAAW,IAAIC,EAAS,EAAK,GACxCC,IAASC,EAA2B,IAAI,GACxCC,IAAgBD,EAA6B,IAAI,GAEjDE,IAAOC,EAAY,MAAM;AAC7B,QAAIJ,EAAO,SAAS;AAClB,YAAM,EAAE,UAAAK,GAAU,cAAAC,EAAA,IAAiBN,EAAO,QAAQ;AAIlD,UAFAE,EAAc,UAAU,EAAE,UAAAG,GAAU,cAAAC,EAAA,GAEhCV,GAAa;AAEf,cAAMW,IACJP,EAAO,YAAY,SAAS,OACxB,OAAO,aACPA,EAAO,QAAQ,aAEfQ,IACJ,SAAS,OAAO,iBAAiBR,EAAO,OAAO,EAAE,cAAc,EAAE,KACjE,GACIS,IAAiBF,IAAcP,EAAO,QAAQ;AACpD,QAAAA,EAAO,QAAQ,MAAM,eAAe,GAAGS,IAAiBD,CAAmB;AAAA,MAC7E;AAEA,MAAAR,EAAO,QAAQ,MAAM,WAAW,UAChCF,EAAY,EAAI;AAAA,IAClB;AAAA,EACF,GAAG,CAACF,CAAW,CAAC,GAEVc,IAASN,EAAY,MAAM;AAC/B,IAAIJ,EAAO,WAAWE,EAAc,YAClCF,EAAO,QAAQ,MAAM,WAAWE,EAAc,QAAQ,UAElDN,MACFI,EAAO,QAAQ,MAAM,eAAeE,EAAc,QAAQ,gBAG9DJ,EAAY,EAAK;AAAA,EACnB,GAAG,CAACF,CAAW,CAAC;AAEhB,SAAAe,EAA0B,MAAM;AAC9B,QAAI,CAAApB;AAEJ,aAAII,MACFK,EAAO,UACL,OAAOL,KAAe,WAClB,SAAS,cAAcA,CAAU,IACjCA,IAEHK,EAAO,YACVA,EAAO,UAAU,SAAS,OAExBN,KACFS,EAAA,GAEK,MAAM;AACX,QAAAO,EAAA;AAAA,MACF;AAAA,EACF,GAAG,CAAChB,GAAUC,GAAYC,GAAaO,GAAMO,CAAM,CAAC,GAE7C,EAAE,UAAAb,GAAU,MAAAM,GAAM,QAAAO,EAAA;AAC3B;"}
|
package/dist/esm/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BlurText.js","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":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CircularText.js","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","y","transform"],"mappings":";;;AAiBA,MAAMA,IAAwB,CAC5BC,GACAC,GACAC,IAAgB,QACZ;AAAA,EACJ,MAAAD;AAAA,EACA,IAAIA,IAAO;AAAA,EACX,MAAM;AAAA,EACN,UAAAD;AAAA,EACA,MAAM;AAAA,EACN,QAAQE,IAAO,QAAW;AAC5B,IAEMC,IAAgB,CAACH,GAAkBC,OAAkB;AAAA,EACzD,QAAQF,EAAsBC,GAAUC,CAAI;AAAA,EAC5C,OAAO;AAAA,IACL,MAAM;AAAA,IACN,SAAS;AAAA,IACT,WAAW;AAAA,EAAA;AAEf,IAEMG,IAA4C,CAAC;AAAA,EACjD,MAAAC;AAAA,EACA,cAAAC,IAAe;AAAA,EACf,SAAAC,IAAU;AAAA,EACV,WAAAC,IAAY;AACd,MAAM;AACJ,QAAMC,IAAU,MAAM,KAAKJ,CAAI,GACzBK,IAAWC,EAAA,GACXC,IAAgCC,EAAe,CAAC;AACtD,EAAAC,EAAU,MAAM;AACd,UAAMC,IAAQH,EAAS,IAAA;AACvB,IAAAF,EAAS,MAAM;AAAA,MACb,QAAQK,IAAQ;AAAA,MAChB,OAAO;AAAA,MACP,YAAYZ,EAAcG,GAAcS,CAAK;AAAA,IAAA,CAC9C;AAAA,EACH,GAAG,CAACT,GAAcD,GAAME,GAASG,GAAUE,CAAQ,CAAC;AACpD,QAAMI,IAAmB,MAAM;AAC7B,UAAMD,IAAQH,EAAS,IAAA;AACvB,QAAI,CAACL,EAAS;AACd,QAAIU,GACAC,IAAW;AACf,YAAQX,GAAA;AAAA,MACN,KAAK;AACH,QAAAU,IAAmBd,EAAcG,IAAe,GAAGS,CAAK;AACxD;AAAA,MACF,KAAK;AACH,QAAAE,IAAmBd,EAAcG,IAAe,GAAGS,CAAK;AACxD;AAAA,MACF,KAAK;AACH,QAAAE,IAAmB;AAAA,UACjB,QAAQ,EAAE,MAAM,UAAU,SAAS,IAAI,WAAW,IAAA;AAAA,UAClD,OAAO,EAAE,MAAM,UAAU,SAAS,IAAI,WAAW,IAAA;AAAA,QAAI;AAEvD;AAAA,MACF,KAAK;AACH,QAAAA,IAAmBd,EAAcG,IAAe,IAAIS,CAAK,GACzDG,IAAW;AACX;AAAA,MACF;AACE,QAAAD,IAAmBd,EAAcG,GAAcS,CAAK;AAAA,IAAA;AAExD,IAAAL,EAAS,MAAM;AAAA,MACb,QAAQK,IAAQ;AAAA,MAChB,OAAOG;AAAA,MACP,YAAYD;AAAA,IAAA,CACb;AAAA,EACH,GACME,IAAiB,MAAM;AAC3B,UAAMJ,IAAQH,EAAS,IAAA;AACvB,IAAAF,EAAS,MAAM;AAAA,MACb,QAAQK,IAAQ;AAAA,MAChB,OAAO;AAAA,MACP,YAAYZ,EAAcG,GAAcS,CAAK;AAAA,IAAA,CAC9C;AAAA,EACH;AACA,SACE,gBAAAK;AAAA,IAACC,EAAO;AAAA,IAAP;AAAA,MACC,WAAW,8JAA8Jb,CAAS;AAAA,MAClL,OAAO,EAAE,QAAQI,EAAA;AAAA,MACjB,SAAS,EAAE,QAAQ,EAAA;AAAA,MACnB,SAASF;AAAA,MACT,cAAcM;AAAA,MACd,cAAcG;AAAA,MAEb,UAAAV,EAAQ,IAAI,CAACa,GAAQC,MAAM;AAC1B,cAAMC,IAAe,MAAMf,EAAQ,SAAUc,GACvCE,IAAS,KAAK,KAAKhB,EAAQ,QAC3B,IAAIgB,IAASF,GACbG,IAAID,IAASF,GACbI,IAAY,WAAWH,CAAW,oBAAoB,CAAC,OAAOE,CAAC;AACrE,eACE,gBAAAN;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YACV,OAAO,EAAE,WAAAO,GAAW,iBAAiBA,EAAA;AAAA,YAEpC,UAAAL;AAAA,UAAA;AAAA,UAJIC;AAAA,QAAA;AAAA,MAOX,CAAC;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FlipWords.js","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":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"GradientText.js","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAaA,SAASA,EAAa;AAAA,EACpB,MAAAC;AAAA,EACA,WAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,MAAAC,IAAO;AAAA,EACP,YAAAC,IAAa,EAAE,UAAU,GAAG,QAAQ,OAAU,MAAM,SAAA;AAAA,EACpD,GAAGC;AACL,GAAsB;AACpB,QAAMC,IAAiC;AAAA,IACrC,iBAAiBJ;AAAA,IACjB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,gBAAgB;AAAA,IAChB,OAAO;AAAA,EAAA;AAGT,SACE,gBAAAK;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAWC,EAAG,+BAA+BP,CAAS;AAAA,MACrD,GAAII;AAAA,MAEL,UAAA;AAAA,QAAA,gBAAAI;AAAA,UAACC,EAAO;AAAA,UAAP;AAAA,YACC,WAAU;AAAA,YACV,OAAOJ;AAAA,YACP,SAAS,EAAE,oBAAoB,CAAC,SAAS,SAAS,EAAA;AAAA,YAClD,YAAAF;AAAA,YAEC,UAAAJ;AAAA,UAAA;AAAA,QAAA;AAAA,QAGFG,KACC,gBAAAM;AAAA,UAACC,EAAO;AAAA,UAAP;AAAA,YACC,WAAU;AAAA,YACV,OAAOJ;AAAA,YACP,SAAS,EAAE,oBAAoB,CAAC,SAAS,SAAS,EAAA;AAAA,YAClD,YAAAF;AAAA,YAEC,UAAAJ;AAAA,UAAA;AAAA,QAAA;AAAA,MACH;AAAA,IAAA;AAAA,EAAA;AAIR;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RollingText.js","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":";;;AAUA,MAAMA,IAAkB;AAAA,EACtB,SAAS,EAAE,SAAS,EAAA;AAAA,EACpB,SAAS,EAAE,SAAS,GAAA;AACtB,GAEMC,IAAiB;AAAA,EACrB,SAAS,EAAE,SAAS,GAAA;AAAA,EACpB,SAAS,EAAE,SAAS,EAAA;AACtB,GAEMC,IAAkB,CAACC,MAAkBA,MAAS,MAAM,MAAWA;AAUrE,SAASC,EAAY;AAAA,EACnB,KAAAC;AAAA,EACA,YAAAC,IAAa,EAAE,UAAU,KAAK,OAAO,KAAK,MAAM,UAAA;AAAA,EAChD,QAAAC,IAAS;AAAA,EACT,cAAAC,IAAe;AAAA,EACf,YAAAC,IAAa;AAAA,EACb,MAAAC;AAAA,EACA,GAAGC;AACL,GAAqB;AACnB,QAAMC,IAAWC,EAAM,OAAwB,IAAI;AACnD,EAAAA,EAAM,oBAAoBR,GAAY,MAAMO,EAAS,OAAQ;AAE7D,QAAME,IAAeC,EAAUH,GAAU;AAAA,IACvC,MAAMH;AAAA,IACN,QAAQD;AAAA,EAAA,CACT,GACKQ,IAAW,CAACT,KAAUO,GAEtBG,IAAaJ,EAAM,QAAQ,MAAMH,EAAK,MAAM,EAAE,GAAG,CAACA,CAAI,CAAC;AAE7D,2BACG,QAAA,EAAK,aAAU,gBAAgB,GAAIC,GAAe,KAAAN,GAChD,UAAA;AAAA,IAAAY,EAAW,IAAI,CAACd,GAAMe,MACrB,gBAAAC;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,WAAU;AAAA,QACV,eAAY;AAAA,QAEZ,UAAA;AAAA,UAAA,gBAAAC;AAAA,YAACC,EAAO;AAAA,YAAP;AAAA,cACC,WAAU;AAAA,cACV,SAASrB,EAAgB;AAAA,cACzB,SAASgB,IAAWhB,EAAgB,UAAU;AAAA,cAC9C,YAAY;AAAA,gBACV,GAAGM;AAAA,gBACH,OAAOY,KAAOZ,GAAY,SAAS;AAAA,cAAA;AAAA,cAGpC,YAAgBH,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,UAEvB,gBAAAiB;AAAA,YAACC,EAAO;AAAA,YAAP;AAAA,cACC,WAAU;AAAA,cACV,SAASpB,EAAe;AAAA,cACxB,SAASe,IAAWf,EAAe,UAAU;AAAA,cAC7C,YAAY;AAAA,gBACV,GAAGK;AAAA,gBACH,OAAOY,KAAOZ,GAAY,SAAS,KAAK;AAAA,cAAA;AAAA,cAGzC,YAAgBH,CAAI;AAAA,YAAA;AAAA,UAAA;AAAA,4BAEtB,QAAA,EAAK,WAAU,gBAAgB,UAAAD,EAAgBC,CAAI,EAAA,CAAE;AAAA,QAAA;AAAA,MAAA;AAAA,MA1BjDe;AAAA,IAAA,CA4BR;AAAA,IAED,gBAAAE,EAAC,QAAA,EAAK,WAAU,cAAc,UAAAV,EAAA,CAAK;AAAA,EAAA,GACrC;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RotatingText.js","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,SAASA,EAAa;AAAA,EACpB,MAAAC;AAAA,EACA,GAAAC,IAAI;AAAA,EACJ,UAAAC,IAAW;AAAA,EACX,YAAAC,IAAa,EAAE,UAAU,KAAK,MAAM,UAAA;AAAA,EACpC,oBAAAC;AAAA,EACA,GAAGC;AACL,GAAsB;AACpB,QAAM,CAACC,GAAOC,CAAQ,IAAIC,EAAM,SAAS,CAAC;AAE1C,EAAAA,EAAM,UAAU,MAAM;AACpB,QAAI,CAAC,MAAM,QAAQR,CAAI,EAAG;AAC1B,UAAMS,IAAW,YAAY,MAAM;AACjC,MAAAF,EAAS,CAACG,OAAeA,IAAY,KAAKV,EAAK,MAAM;AAAA,IACvD,GAAGE,CAAQ;AACX,WAAO,MAAM,cAAcO,CAAQ;AAAA,EACrC,GAAG,CAACT,GAAME,CAAQ,CAAC;AAEnB,QAAMS,IAAc,MAAM,QAAQX,CAAI,IAAIA,EAAKM,CAAK,IAAIN;AAExD,SACE,gBAAAY,EAAC,OAAA,EAAI,WAAWC,EAAG,8BAA8BT,CAAkB,GACjE,UAAA,gBAAAQ,EAACE,GAAA,EAAgB,MAAK,QACpB,UAAA,gBAAAF;AAAA,IAACG,EAAO;AAAA,IAAP;AAAA,MAEC,YAAAZ;AAAA,MACA,SAAS,EAAE,SAAS,GAAG,GAAG,CAACF,EAAA;AAAA,MAC3B,SAAS,EAAE,SAAS,GAAG,GAAG,EAAA;AAAA,MAC1B,MAAM,EAAE,SAAS,GAAG,GAAAA,EAAA;AAAA,MACnB,GAAII;AAAA,MAEJ,UAAAM;AAAA,IAAA;AAAA,IAPIA;AAAA,EAAA,GAST,EAAA,CACF;AAEJ;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ShimmeringText.js","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,SAASA,EAAe;AAAA,EACtB,MAAAC;AAAA,EACA,UAAAC,IAAW;AAAA,EACX,YAAAC;AAAA,EACA,MAAAC,IAAO;AAAA,EACP,WAAAC;AAAA,EACA,OAAAC,IAAQ;AAAA,EACR,iBAAAC,IAAkB;AAAA,EAClB,GAAGC;AACL,GAAwB;AACtB,SACE,gBAAAC;AAAA,IAACC,EAAO;AAAA,IAAP;AAAA,MACC,WAAWC,EAAG,sDAAsDN,CAAS;AAAA,MAC7E,OACE;AAAA,QACE,sBAAsBE;AAAA,QACtB,WAAWD;AAAA,QACX,OAAO;AAAA,MAAA;AAAA,MAGV,GAAIE;AAAA,MAEJ,aAAM,MAAM,EAAE,GAAG,IAAI,CAACI,GAAMC,MAC3B,gBAAAJ;AAAA,QAACC,EAAO;AAAA,QAAP;AAAA,UAEC,WAAU;AAAA,UACV,SAAS;AAAA,YACP,GAAIN,IACA;AAAA,cACE,OAAO;AAAA,cACP,SAAS;AAAA,YAAA,IAEX,CAAA;AAAA,YACJ,OAAO;AAAA,UAAA;AAAA,UAET,SAAS;AAAA,YACP,GAAIA,IACA;AAAA,cACE,GAAG,CAAC,GAAG,GAAG,CAAC;AAAA,cACX,GAAG,CAAC,GAAG,IAAI,CAAC;AAAA,cACZ,OAAO,CAAC,GAAG,KAAK,CAAC;AAAA,cACjB,SAAS,CAAC,GAAG,IAAI,CAAC;AAAA,YAAA,IAEpB,CAAA;AAAA,YACJ,OAAO,CAAC,gBAAgB,2BAA2B,cAAc;AAAA,UAAA;AAAA,UAEnE,YAAY;AAAA,YACV,UAAAF;AAAA,YACA,QAAQ;AAAA,YACR,YAAY;AAAA,YACZ,aAAaD,EAAK,SAAS;AAAA,YAC3B,OAAQY,IAAIX,IAAYD,EAAK;AAAA,YAC7B,MAAM;AAAA,YACN,GAAGE;AAAA,UAAA;AAAA,UAGJ,UAAAS;AAAA,QAAA;AAAA,QAhCIC;AAAA,MAAA,CAkCR;AAAA,IAAA;AAAA,EAAA;AAGP;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"SplittingText.js","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":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextGenerateEffect.js","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,SAASA,GAAmB;AAAA,EAC1B,KAAAC;AAAA,EACA,OAAAC;AAAA,EACA,WAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC,IAAW;AAAA,EACX,cAAAC,IAAe;AAAA,EACf,GAAGC;AACL,GAA4B;AAC1B,QAAMC,IAAWC,EAAM,OAAuB,IAAI;AAClD,EAAAA,EAAM;AAAA,IACJR;AAAA,IACA,MAAMO,EAAS;AAAA,EAAA;AAGjB,QAAM,CAACE,GAAOC,CAAO,IAAIC,EAAA,GACnBC,IAAaJ,EAAM,QAAQ,MAAMP,EAAM,MAAM,GAAG,GAAG,CAACA,CAAK,CAAC;AAEhE,SAAAO,EAAM,UAAU,MAAM;AACpB,IAAIC,EAAM,WACRC;AAAA,MACE;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,QAAQP,IAAS,cAAc;AAAA,MAAA;AAAA,MAEjC;AAAA,QACE,UAAAC;AAAA,QACA,OAAOS,EAAQR,CAAY;AAAA,MAAA;AAAA,IAC7B;AAAA,EAGN,GAAG,CAACK,GAASN,GAAUD,GAAQM,GAAOJ,CAAY,CAAC,GAGjD,gBAAAS;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKP;AAAA,MACL,WAAWQ,EAAG,gBAAgBb,CAAS;AAAA,MACvC,aAAU;AAAA,MACT,GAAII;AAAA,MAEL,UAAA,gBAAAQ,EAACE,EAAO,KAAP,EAAW,KAAKP,GACd,UAAAG,EAAW,IAAI,CAACK,GAAMC,MACrB,gBAAAC;AAAA,QAACH,EAAO;AAAA,QAAP;AAAA,UAEC,WAAU;AAAA,UACV,OAAO;AAAA,YACL,QAAQb,IAAS,eAAe;AAAA,UAAA;AAAA,UAGjC,UAAA;AAAA,YAAAc;AAAA,YAAM;AAAA,UAAA;AAAA,QAAA;AAAA,QANF,GAAGA,CAAI,IAAIC,CAAG;AAAA,MAAA,CAQtB,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TextHoverEffect.js","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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"}
|