@sth87/shadcn-design-system 0.0.35 → 0.1.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/README.md +20 -2
- package/dist/AI_CONTEXT.md +212 -214
- package/dist/cjs/components/Accordion/Accordion.cjs +1 -1
- package/dist/cjs/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/cjs/components/Badge/Badge.cjs +1 -1
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +1 -1
- package/dist/cjs/components/Button/Button.cjs +1 -1
- package/dist/cjs/components/Button/Button.cjs.map +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/cjs/components/Command/Command.cjs +1 -1
- package/dist/cjs/components/Command/Command.cjs.map +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/cjs/components/FloatLabel.cjs +1 -1
- package/dist/cjs/components/FloatLabel.cjs.map +1 -1
- package/dist/cjs/components/Glass/Glass.cjs +1 -1
- package/dist/cjs/components/Glass/Glass.cjs.map +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +1 -1
- package/dist/cjs/components/Input/Input.cjs +1 -1
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs.map +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs.map +1 -1
- package/dist/cjs/components/Radio/Radio.cjs +1 -1
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -1
- package/dist/cjs/components/Rate/Rate.cjs +1 -1
- package/dist/cjs/components/Rate/Rate.cjs.map +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/cjs/components/Select/Select.cjs +1 -1
- package/dist/cjs/components/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/Sheet/Sheet.cjs +2 -2
- package/dist/cjs/components/Sheet/Sheet.cjs.map +1 -1
- package/dist/cjs/components/Slider/Slider.cjs +1 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +1 -1
- package/dist/cjs/components/Switch/Switch.cjs +1 -1
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table.cjs +1 -1
- package/dist/cjs/components/Table/data-table.cjs.map +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/cjs/components/Tabs/classes.cjs +1 -1
- package/dist/cjs/components/Tabs/classes.cjs.map +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/cjs/components/TimeGridView.cjs +1 -1
- package/dist/cjs/components/TimeGridView.cjs.map +1 -1
- package/dist/cjs/components/Toast/Toast.cjs +1 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/components/Tour/Tour.cjs +1 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +1 -1
- package/dist/cjs/components/Upload/Upload.cjs +3 -3
- package/dist/cjs/components/Upload/Upload.cjs.map +1 -1
- package/dist/cjs/components/WheelColumn.cjs +1 -1
- package/dist/cjs/components/WheelColumn.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +2 -2
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +1 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +1 -0
- package/dist/cjs/packages/ui/src/components/accordion.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +1 -1
- package/dist/cjs/styles/index.css +1 -1
- package/dist/cjs/utils/animations.cjs +1 -1
- package/dist/cjs/utils/animations.cjs.map +1 -1
- package/dist/cjs/utils/css.cjs +1 -1
- package/dist/cjs/utils/css.cjs.map +1 -1
- package/dist/cjs/utils/parsers.cjs +1 -1
- package/dist/cjs/utils/parsers.cjs.map +1 -1
- package/dist/esm/components/Accordion/Accordion.js +60 -60
- package/dist/esm/components/Accordion/Accordion.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js +40 -40
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Badge/Badge.js +1 -1
- package/dist/esm/components/Badge/Badge.js.map +1 -1
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +36 -36
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/esm/components/Button/Button.js +9 -9
- package/dist/esm/components/Button/Button.js.map +1 -1
- package/dist/esm/components/Calendar/Calendar.js +4 -4
- package/dist/esm/components/Calendar/Calendar.js.map +1 -1
- package/dist/esm/components/Carousel/Carousel.js +165 -165
- package/dist/esm/components/Carousel/Carousel.js.map +1 -1
- package/dist/esm/components/Checkbox/Checkbox.js +26 -26
- package/dist/esm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/Collapsible/Collapsible.js +43 -43
- package/dist/esm/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/esm/components/Command/Command.js +28 -28
- package/dist/esm/components/Command/Command.js.map +1 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js +11 -11
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/esm/components/Cropper/Cropper.js +132 -132
- package/dist/esm/components/Cropper/Cropper.js.map +1 -1
- package/dist/esm/components/DatePicker/DatePicker.js +75 -75
- package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/RangePicker.js +136 -136
- package/dist/esm/components/DatePicker/RangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/TimePicker.js +150 -150
- package/dist/esm/components/DatePicker/TimePicker.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +114 -114
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +13 -13
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/esm/components/FloatLabel.js +44 -44
- package/dist/esm/components/FloatLabel.js.map +1 -1
- package/dist/esm/components/Glass/Glass.js +15 -15
- package/dist/esm/components/Glass/Glass.js.map +1 -1
- package/dist/esm/components/ImageViewer/ImageViewer.js +53 -53
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +1 -1
- package/dist/esm/components/Input/Input.js +104 -104
- package/dist/esm/components/Input/Input.js.map +1 -1
- package/dist/esm/components/InputOTP/InputOTP.js +16 -16
- package/dist/esm/components/InputOTP/InputOTP.js.map +1 -1
- package/dist/esm/components/Interactive/CursorFollow.js +49 -49
- package/dist/esm/components/Interactive/CursorFollow.js.map +1 -1
- package/dist/esm/components/Marquee/Marquee.js +130 -130
- package/dist/esm/components/Marquee/Marquee.js.map +1 -1
- package/dist/esm/components/Pagination/Pagination.js +68 -68
- package/dist/esm/components/Pagination/Pagination.js.map +1 -1
- package/dist/esm/components/QrCode/QrCode.js +37 -37
- package/dist/esm/components/QrCode/QrCode.js.map +1 -1
- package/dist/esm/components/Radio/Radio.js +16 -16
- package/dist/esm/components/Radio/Radio.js.map +1 -1
- package/dist/esm/components/Rate/Rate.js +62 -62
- package/dist/esm/components/Rate/Rate.js.map +1 -1
- package/dist/esm/components/Resizable/Resizable.js +6 -6
- package/dist/esm/components/Resizable/Resizable.js.map +1 -1
- package/dist/esm/components/ScrollArea/ScrollArea.js +10 -10
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/esm/components/Select/Select.js +64 -64
- package/dist/esm/components/Select/Select.js.map +1 -1
- package/dist/esm/components/Sheet/Sheet.js +21 -21
- package/dist/esm/components/Sheet/Sheet.js.map +1 -1
- package/dist/esm/components/Slider/Slider.js +54 -54
- package/dist/esm/components/Slider/Slider.js.map +1 -1
- package/dist/esm/components/Stepper/Stepper.js +198 -198
- package/dist/esm/components/Stepper/Stepper.js.map +1 -1
- package/dist/esm/components/Stepper/StepperWrapper.js +15 -15
- package/dist/esm/components/Stepper/StepperWrapper.js.map +1 -1
- package/dist/esm/components/Switch/Switch.js +38 -38
- package/dist/esm/components/Switch/Switch.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +37 -37
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +25 -25
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +64 -64
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -1
- package/dist/esm/components/Table/data-table-column-header.js +18 -18
- package/dist/esm/components/Table/data-table-column-header.js.map +1 -1
- package/dist/esm/components/Table/data-table-pagination.js +21 -21
- package/dist/esm/components/Table/data-table-pagination.js.map +1 -1
- package/dist/esm/components/Table/data-table.js +18 -18
- package/dist/esm/components/Table/data-table.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.js +242 -242
- package/dist/esm/components/Tabs/Tabs.js.map +1 -1
- package/dist/esm/components/Tabs/classes.js +51 -51
- package/dist/esm/components/Tabs/classes.js.map +1 -1
- package/dist/esm/components/Textarea/Textarea.js +49 -49
- package/dist/esm/components/Textarea/Textarea.js.map +1 -1
- package/dist/esm/components/TimeGridView.js +12 -12
- package/dist/esm/components/TimeGridView.js.map +1 -1
- package/dist/esm/components/Toast/Toast.js +45 -45
- package/dist/esm/components/Toast/Toast.js.map +1 -1
- package/dist/esm/components/Tooltip/Tooltip.js +19 -19
- package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/Tour/Tour.js +11 -11
- package/dist/esm/components/Tour/Tour.js.map +1 -1
- package/dist/esm/components/Tour/TourWrapper.js +15 -15
- package/dist/esm/components/Tour/TourWrapper.js.map +1 -1
- package/dist/esm/components/Upload/Upload.js +405 -405
- package/dist/esm/components/Upload/Upload.js.map +1 -1
- package/dist/esm/components/WheelColumn.js +47 -47
- package/dist/esm/components/WheelColumn.js.map +1 -1
- package/dist/esm/lib/TextAnimation/BlurText.js +18 -18
- package/dist/esm/lib/TextAnimation/BlurText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/CircularText.js +7 -7
- package/dist/esm/lib/TextAnimation/CircularText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js +21 -21
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +1 -1
- package/dist/esm/lib/TextAnimation/GradientText.js +4 -4
- package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RollingText.js +24 -24
- package/dist/esm/lib/TextAnimation/RollingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js +6 -6
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +9 -9
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +14 -14
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +9 -9
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +3 -3
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TypingText.js +17 -17
- package/dist/esm/lib/TextAnimation/TypingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/WritingText.js +10 -10
- package/dist/esm/lib/TextAnimation/WritingText.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +1 -0
- package/dist/esm/packages/ui/src/components/accordion.js +31 -31
- package/dist/esm/packages/ui/src/components/accordion.js.map +1 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js +33 -33
- package/dist/esm/packages/ui/src/components/alert-dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/avatar.js +20 -20
- package/dist/esm/packages/ui/src/components/avatar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/badge.js +53 -53
- package/dist/esm/packages/ui/src/components/badge.js.map +1 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js +20 -20
- package/dist/esm/packages/ui/src/components/breadcrumb.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button-group.js +31 -31
- package/dist/esm/packages/ui/src/components/button-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button.js +90 -90
- package/dist/esm/packages/ui/src/components/button.js.map +1 -1
- package/dist/esm/packages/ui/src/components/calendar.js +94 -94
- package/dist/esm/packages/ui/src/components/calendar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/checkbox.js +47 -47
- package/dist/esm/packages/ui/src/components/checkbox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/combobox.js +64 -64
- package/dist/esm/packages/ui/src/components/combobox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/command.js +77 -77
- package/dist/esm/packages/ui/src/components/command.js.map +1 -1
- package/dist/esm/packages/ui/src/components/context-menu.js +76 -76
- package/dist/esm/packages/ui/src/components/context-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dialog.js +54 -54
- package/dist/esm/packages/ui/src/components/dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/drawer.js +39 -39
- package/dist/esm/packages/ui/src/components/drawer.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js +109 -109
- package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input-otp.js +30 -30
- package/dist/esm/packages/ui/src/components/input-otp.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input.js +19 -19
- package/dist/esm/packages/ui/src/components/input.js.map +1 -1
- package/dist/esm/packages/ui/src/components/label.js +9 -9
- package/dist/esm/packages/ui/src/components/label.js.map +1 -1
- package/dist/esm/packages/ui/src/components/pagination.js +26 -26
- package/dist/esm/packages/ui/src/components/pagination.js.map +1 -1
- package/dist/esm/packages/ui/src/components/popover.js +13 -13
- package/dist/esm/packages/ui/src/components/popover.js.map +1 -1
- package/dist/esm/packages/ui/src/components/radio-group.js +45 -45
- package/dist/esm/packages/ui/src/components/radio-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/resizable.js +18 -18
- package/dist/esm/packages/ui/src/components/resizable.js.map +1 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js +31 -31
- package/dist/esm/packages/ui/src/components/scroll-area.js.map +1 -1
- package/dist/esm/packages/ui/src/components/select.js +119 -119
- package/dist/esm/packages/ui/src/components/select.js.map +1 -1
- package/dist/esm/packages/ui/src/components/separator.js +86 -86
- package/dist/esm/packages/ui/src/components/separator.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sheet.js +50 -50
- package/dist/esm/packages/ui/src/components/sheet.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sidebar.js +198 -198
- package/dist/esm/packages/ui/src/components/sidebar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/skeleton.js +3 -3
- package/dist/esm/packages/ui/src/components/skeleton.js.map +1 -1
- package/dist/esm/packages/ui/src/components/switch.js +57 -57
- package/dist/esm/packages/ui/src/components/switch.js.map +1 -1
- package/dist/esm/packages/ui/src/components/table.js +17 -17
- package/dist/esm/packages/ui/src/components/table.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tabs.js +33 -33
- package/dist/esm/packages/ui/src/components/tabs.js.map +1 -1
- package/dist/esm/packages/ui/src/components/textarea.js +17 -17
- package/dist/esm/packages/ui/src/components/textarea.js.map +1 -1
- package/dist/esm/packages/ui/src/components/toggle.js +36 -36
- package/dist/esm/packages/ui/src/components/toggle.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tooltip.js +20 -20
- package/dist/esm/packages/ui/src/components/tooltip.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tree-view.js +218 -218
- package/dist/esm/packages/ui/src/components/tree-view.js.map +1 -1
- package/dist/esm/styles/index.css +1 -1
- package/dist/esm/utils/animations.js +55 -55
- package/dist/esm/utils/animations.js.map +1 -1
- package/dist/esm/utils/css.js +7 -7
- package/dist/esm/utils/css.js.map +1 -1
- package/dist/esm/utils/parsers.js +1 -1
- package/dist/types/components/DatePicker/RangePicker.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TypingText.d.ts.map +1 -1
- package/package.json +1 -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/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/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 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.cjs +0 -0
- /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 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.js +0 -0
|
@@ -1 +1 @@
|
|
|
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 \"relative flex justify-center items-center rounded-lg transition-all duration-200 cursor-pointer select-none\",\n {\n variants: {\n variant: {\n outline: \"border border-foreground/10 bg-background text-foreground\",\n primaryOutline: \"border border-primary bg-background text-primary\",\n icon: \"border border-primary text-primary bg-background rounded-xl p-2\",\n avatar:\n \"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full flex-col text-center hover:border-foreground/40 !p-1\",\n avatarCircle:\n \"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full rounded-full flex-col text-center hover:border-foreground/40 !p-1\",\n dropzone:\n \"border border-foreground/10 bg-background flex-col text-center py-10\",\n primaryDropzone:\n \"border border-primary bg-primary/10 flex-col text-center py-10\",\n secondaryDropzone:\n \"border border-foreground/10 bg-foreground/10 flex-col text-center py-10\",\n },\n\n size: {\n small: \"h-8 p-[6px] text-sm\",\n medium: \"h-10 p-2 text-base\",\n large: \"h-12 p-3 text-base\",\n },\n\n status: {\n idle: \"\",\n dragover: \"border-primary bg-primary/5 scale-[1.02]\",\n disabled: \"opacity-50 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=\"h-4 w-4\" />;\n if (type.startsWith(\"video/\")) return <Film className=\"h-4 w-4\" />;\n if (type.startsWith(\"audio/\")) return <Music className=\"h-4 w-4\" />;\n if (name.endsWith(\".zip\") || name.endsWith(\".rar\") || name.endsWith(\".7z\"))\n return <Archive className=\"h-4 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=\"h-4 w-4\" />;\n if (name.endsWith(\".txt\") || name.endsWith(\".md\"))\n return <FileText className=\"h-4 w-4\" />;\n return <File className=\"h-4 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 ) && \"min-h-[180px] min-w-[300px]\",\n !showBorder && \"border-0\",\n !iconOnly &&\n variant !== \"avatar\" &&\n variant !== \"avatarCircle\" &&\n \"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 \"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=\"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=\"relative w-full h-full group\">\n <img\n draggable={false}\n src={fileList[0].url || fileList[0].thumbUrl}\n alt={fileList[0].name}\n className={cn(\n \"w-full h-full object-cover\",\n variant === \"avatarCircle\" && \"rounded-full\",\n variant === \"avatar\" && \"rounded-lg\"\n )}\n />\n {/* Delete button overlay */}\n <div\n className={cn(\n \"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\",\n variant === \"avatarCircle\" && \"rounded-full\",\n variant === \"avatar\" && \"rounded-lg\"\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(fileList[0]);\n }}\n >\n <Trash2 className=\"h-6 w-6 text-white cursor-pointer hover:scale-110 transition-transform\" />\n </div>\n </div>\n ) : (\n children\n )}\n </>\n ) : (\n <div\n className={cn(\n \"flex items-center justify-center gap-2\",\n [\"secondaryDropzone\", \"dropzone\", \"primaryDropzone\"].includes(\n variant as any\n ) && \"flex-col\"\n )}\n >\n {uploadIcon ? (\n <div\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"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 ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"secondaryDropzone\",\n \"primaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"text-primary\"\n )}\n />\n ) : (\n <CloudUploadIcon\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"text-primary\"\n )}\n />\n )}\n </>\n )}\n {!iconOnly && (\n <>\n <span className=\"font-medium whitespace-nowrap text-sm\">\n {uploadText}\n </span>\n {uploadDescription &&\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any) && (\n <span className=\"text-xs 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 \"mt-4\",\n (effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\") &&\n \"grid gap-2\",\n effectiveListType === \"picture\" && \"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=\"w-full h-auto max-h-[70vh] 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=\"relative aspect-square rounded-lg border bg-muted/50 overflow-hidden 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=\"h-full w-full object-cover rounded-lg\"\n />\n ) : (\n <div className=\"flex items-center justify-center h-full\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center\">\n <div className=\"w-full px-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-xs\">{file.percent}%</span>\n </div>\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all 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=\"absolute top-2 right-2 bg-green-500 rounded-full p-1\">\n <CheckCircle2 className=\"h-4 w-4 text-white\" />\n </div>\n )}\n {file.status === \"error\" && (\n <div className=\"absolute top-2 right-2 bg-red-500 rounded-full p-1\">\n <AlertCircle className=\"h-4 w-4 text-white\" />\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4 text-white\" />\n </button>\n )}\n </div>\n\n {/* File name tooltip */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 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 \"relative aspect-square rounded-full border bg-muted/50 overflow-hidden group\",\n file.status === \"done\" && \"border-2 border-green-500\",\n file.status === \"error\" && \"border-2 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=\"h-full w-full object-cover rounded-full\"\n />\n ) : (\n <div className=\"flex items-center justify-center h-full rounded-full bg-muted\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center rounded-full\">\n <div className=\"w-full px-4\">\n <div className=\"flex items-center gap-2 mb-2 justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-xs\">{file.percent}%</span>\n </div>\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2 rounded-full\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {/* File name tooltip */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 transition-opacity\">\n {file.name}\n </div>\n </div>\n </div>\n );\n }\n\n if (listType === \"picture\") {\n return (\n <div className=\"flex items-center gap-3 p-2 rounded-lg border bg-background hover:bg-muted/50 transition-colors group\">\n {/* Thumbnail */}\n <div className=\"shrink-0 h-10 w-10 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n getFileIcon(file)\n )}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n {file.size && (\n <span className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </span>\n )}\n {file.status === \"uploading\" && (\n <span className=\"text-xs text-primary\">{file.percent}%</span>\n )}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"h-4 w-4 text-green-500\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"h-4 w-4 text-red-500\" />\n )}\n </div>\n {file.status === \"uploading\" && (\n <div className=\"h-1 bg-muted rounded-full overflow-hidden mt-2\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1.5 rounded hover:bg-muted transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1.5 rounded hover:bg-muted transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1.5 rounded hover:bg-destructive/10 transition-colors text-destructive\"\n title=\"Remove\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n }\n\n // Text list\n return (\n <div className=\"flex items-center gap-2 p-2 rounded hover:bg-muted/50 transition-colors group\">\n {/* Icon */}\n <div className=\"shrink-0\">{getFileIcon(file)}</div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm truncate\">{file.name}</p>\n {/* Status */}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"h-4 w-4 text-green-500 shrink-0\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"h-4 w-4 text-red-500 shrink-0\" />\n )}\n {file.status === \"uploading\" && (\n <Loader2 className=\"h-4 w-4 animate-spin shrink-0\" />\n )}\n </div>\n\n {file.status === \"uploading\" && (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {file.percent}%\n </span>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded hover:bg-muted transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded hover:bg-muted transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded hover:bg-destructive/10 transition-colors text-destructive\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 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
|
+
{"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,4 +1,4 @@
|
|
|
1
|
-
import { jsxs as T, jsx as
|
|
1
|
+
import { jsxs as T, jsx as l } from "react/jsx-runtime";
|
|
2
2
|
import * as Y from "react";
|
|
3
3
|
import { memo as O, useRef as C, useState as _, useCallback as D, useEffect as k } from "react";
|
|
4
4
|
import "@radix-ui/react-slot";
|
|
@@ -54,51 +54,51 @@ const F = (r) => String(r).padStart(2, "0"), P = (r = "primary") => ({
|
|
|
54
54
|
isItemDisabled: h,
|
|
55
55
|
disabled: b,
|
|
56
56
|
color: I = "primary"
|
|
57
|
-
},
|
|
58
|
-
const
|
|
57
|
+
}, m) => {
|
|
58
|
+
const s = C(
|
|
59
59
|
null
|
|
60
|
-
),
|
|
61
|
-
if (!
|
|
62
|
-
const t =
|
|
63
|
-
R(
|
|
64
|
-
const
|
|
65
|
-
let
|
|
66
|
-
if (r.forEach((H,
|
|
67
|
-
const z =
|
|
68
|
-
N < y && (y = N,
|
|
69
|
-
}), !h(
|
|
70
|
-
if (
|
|
71
|
-
u(
|
|
60
|
+
), n = C(null), [j, R] = _(0), g = D(() => {
|
|
61
|
+
if (!n.current || b) return;
|
|
62
|
+
const t = n.current, i = t.scrollTop;
|
|
63
|
+
R(i), s.current && clearTimeout(s.current), s.current = setTimeout(() => {
|
|
64
|
+
const c = t.scrollTop, e = 40, a = t.clientHeight, x = a / 2, v = c - 120 + x;
|
|
65
|
+
let d = r[0], y = 1 / 0;
|
|
66
|
+
if (r.forEach((H, p) => {
|
|
67
|
+
const z = p * e + e / 2, N = Math.abs(z - v);
|
|
68
|
+
N < y && (y = N, d = H);
|
|
69
|
+
}), !h(d))
|
|
70
|
+
if (d !== o)
|
|
71
|
+
u(d);
|
|
72
72
|
else {
|
|
73
|
-
const
|
|
74
|
-
Math.abs(t.scrollTop -
|
|
75
|
-
top:
|
|
73
|
+
const p = 120 + r.indexOf(d) * e - a / 2 + e / 2;
|
|
74
|
+
Math.abs(t.scrollTop - p) > 5 && t.scrollTo({
|
|
75
|
+
top: p,
|
|
76
76
|
behavior: "smooth"
|
|
77
77
|
});
|
|
78
78
|
}
|
|
79
79
|
}, 100);
|
|
80
80
|
}, [r, o, u, h, b]);
|
|
81
81
|
k(() => {
|
|
82
|
-
const t =
|
|
82
|
+
const t = n.current;
|
|
83
83
|
if (t)
|
|
84
84
|
return t.addEventListener("scroll", g, { passive: !0 }), () => {
|
|
85
|
-
t.removeEventListener("scroll", g),
|
|
85
|
+
t.removeEventListener("scroll", g), s.current && clearTimeout(s.current);
|
|
86
86
|
};
|
|
87
87
|
}, [g]), k(() => {
|
|
88
|
-
if (
|
|
88
|
+
if (n.current && o !== void 0) {
|
|
89
89
|
const t = r.indexOf(o);
|
|
90
90
|
if (t !== -1) {
|
|
91
|
-
const
|
|
92
|
-
|
|
91
|
+
const c = n.current.clientHeight, e = 120 + t * 40 - c / 2 + 40 / 2;
|
|
92
|
+
n.current.scrollTo({
|
|
93
93
|
top: e,
|
|
94
94
|
behavior: "smooth"
|
|
95
95
|
});
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
}, [o, r]), k(() => () => {
|
|
99
|
-
|
|
99
|
+
s.current && clearTimeout(s.current);
|
|
100
100
|
}, []);
|
|
101
|
-
const E = (t,
|
|
101
|
+
const E = (t, i) => {
|
|
102
102
|
const x = 120 + t * 40 + 20, S = Math.abs(
|
|
103
103
|
x - (j + 128)
|
|
104
104
|
), v = 256 / 2;
|
|
@@ -107,32 +107,32 @@ const F = (r) => String(r).padStart(2, "0"), P = (r = "primary") => ({
|
|
|
107
107
|
0.3,
|
|
108
108
|
1 - S / v * 0.7
|
|
109
109
|
),
|
|
110
|
-
fontSize:
|
|
110
|
+
fontSize: i ? "1.3rem" : "1rem",
|
|
111
111
|
transition: "opacity 0.2s ease, transform 0.2s ease"
|
|
112
112
|
};
|
|
113
113
|
};
|
|
114
|
-
return /* @__PURE__ */ T("div", { className: "flex flex-col items-center gap-2 w-full h-full max-h-72", children: [
|
|
115
|
-
f && /* @__PURE__ */
|
|
114
|
+
return /* @__PURE__ */ T("div", { className: "ds:flex ds:flex-col ds:items-center ds:gap-2 ds:w-full ds:h-full ds:max-h-72", children: [
|
|
115
|
+
f && /* @__PURE__ */ l("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", children: f }),
|
|
116
116
|
/* @__PURE__ */ T(
|
|
117
117
|
"div",
|
|
118
118
|
{
|
|
119
119
|
className: w(
|
|
120
|
-
"relative w-full",
|
|
121
|
-
f ? "h-[calc(100%_-_2rem)]" : " h-full"
|
|
120
|
+
"ds:relative ds:w-full",
|
|
121
|
+
f ? "ds:h-[calc(100%_-_2rem)]" : " ds:h-full"
|
|
122
122
|
),
|
|
123
123
|
children: [
|
|
124
|
-
/* @__PURE__ */
|
|
124
|
+
/* @__PURE__ */ l("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" }),
|
|
125
125
|
/* @__PURE__ */ T(
|
|
126
126
|
"div",
|
|
127
127
|
{
|
|
128
128
|
ref: (t) => {
|
|
129
|
-
|
|
129
|
+
n.current = t, typeof m == "function" ? m(t) : m && (m.current = t);
|
|
130
130
|
},
|
|
131
131
|
className: w(
|
|
132
|
-
"relative h-full w-full min-w-20 min-h-60 overflow-y-scroll scroll-smooth",
|
|
133
|
-
"[&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent",
|
|
134
|
-
"[&::-webkit-scrollbar-thumb]:bg-border [&::-webkit-scrollbar-thumb]:rounded",
|
|
135
|
-
"flex flex-col snap-y snap-mandatory",
|
|
132
|
+
"ds:relative ds:h-full ds:w-full ds:min-w-20 ds:min-h-60 ds:overflow-y-scroll ds:scroll-smooth",
|
|
133
|
+
"ds:[&::-webkit-scrollbar]:w-1 ds:[&::-webkit-scrollbar-track]:bg-transparent",
|
|
134
|
+
"ds:[&::-webkit-scrollbar-thumb]:bg-border ds:[&::-webkit-scrollbar-thumb]:rounded",
|
|
135
|
+
"ds:flex ds:flex-col ds:snap-y ds:snap-mandatory",
|
|
136
136
|
M
|
|
137
137
|
),
|
|
138
138
|
style: {
|
|
@@ -140,27 +140,27 @@ const F = (r) => String(r).padStart(2, "0"), P = (r = "primary") => ({
|
|
|
140
140
|
WebkitMaskImage: "linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)"
|
|
141
141
|
},
|
|
142
142
|
children: [
|
|
143
|
-
/* @__PURE__ */
|
|
144
|
-
r.map((t,
|
|
145
|
-
const
|
|
146
|
-
return /* @__PURE__ */
|
|
143
|
+
/* @__PURE__ */ l("div", { className: "ds:h-[calc(50%-1.25rem)] ds:flex-shrink-0" }),
|
|
144
|
+
r.map((t, i) => {
|
|
145
|
+
const c = h(t), e = o !== void 0 && t === o, a = E(i, e);
|
|
146
|
+
return /* @__PURE__ */ l(
|
|
147
147
|
"div",
|
|
148
148
|
{
|
|
149
|
-
onClick: b ||
|
|
149
|
+
onClick: b || c ? void 0 : () => u(t),
|
|
150
150
|
"data-selected": e || void 0,
|
|
151
151
|
className: w(
|
|
152
|
-
"h-10 flex-shrink-0 flex items-center justify-center transition-all snap-center",
|
|
153
|
-
"cursor-pointer text-lg font-medium select-none",
|
|
154
|
-
"disabled:opacity-30 disabled:cursor-not-allowed disabled:line-through",
|
|
155
|
-
e ? `${P(I)} font-bold` : "text-muted-foreground"
|
|
152
|
+
"ds:h-10 ds:flex-shrink-0 ds:flex ds:items-center ds:justify-center ds:transition-all ds:snap-center",
|
|
153
|
+
"ds:cursor-pointer ds:text-lg ds:font-medium ds:select-none",
|
|
154
|
+
"ds:disabled:opacity-30 ds:disabled:cursor-not-allowed ds:disabled:line-through",
|
|
155
|
+
e ? `${P(I)} ds:font-bold` : "ds:text-muted-foreground"
|
|
156
156
|
),
|
|
157
|
-
style:
|
|
157
|
+
style: a,
|
|
158
158
|
children: F(t)
|
|
159
159
|
},
|
|
160
160
|
t
|
|
161
161
|
);
|
|
162
162
|
}),
|
|
163
|
-
/* @__PURE__ */
|
|
163
|
+
/* @__PURE__ */ l("div", { className: "ds:h-[calc(50%-1.25rem)] ds:flex-shrink-0" })
|
|
164
164
|
]
|
|
165
165
|
}
|
|
166
166
|
)
|