@sth87/shadcn-design-system 0.1.9 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AI_README.md +114 -51
- package/README.md +83 -27
- package/dist/AI_CONTEXT.md +53 -52
- package/dist/cjs/_virtual/_commonjsHelpers.cjs +0 -1
- package/dist/cjs/_virtual/index.cjs +0 -1
- package/dist/cjs/_virtual/index2.cjs +0 -1
- package/dist/cjs/components/Accordion/Accordion.cjs +0 -1
- package/dist/cjs/components/Accordion/index.cjs +1 -0
- package/dist/cjs/components/Avatar/Avatar.cjs +1 -2
- package/dist/cjs/components/Avatar/index.cjs +1 -0
- package/dist/cjs/components/Badge/Badge.cjs +0 -1
- package/dist/cjs/components/Badge/index.cjs +1 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +0 -1
- package/dist/cjs/components/Breadcrumb/index.cjs +1 -0
- package/dist/cjs/components/Button/Button.cjs +0 -1
- package/dist/cjs/components/Button/ButtonGroup.cjs +0 -1
- package/dist/cjs/components/Button/index.cjs +1 -0
- package/dist/cjs/components/Calendar/Calendar.cjs +1 -2
- package/dist/cjs/components/Calendar/index.cjs +1 -0
- package/dist/cjs/components/Carousel/Carousel.cjs +0 -1
- package/dist/cjs/components/Carousel/index.cjs +1 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -2
- package/dist/cjs/components/Checkbox/index.cjs +1 -0
- package/dist/cjs/components/Collapsible/Collapsible.cjs +0 -1
- package/dist/cjs/components/Collapsible/index.cjs +1 -0
- package/dist/cjs/components/Command/Command.cjs +0 -1
- package/dist/cjs/components/Command/index.cjs +0 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +0 -1
- package/dist/cjs/components/ContextMenu/index.cjs +0 -1
- package/dist/cjs/components/Cropper/Cropper.cjs +1 -2
- package/dist/cjs/components/Cropper/CropperTool.cjs +0 -1
- package/dist/cjs/components/Cropper/index.cjs +1 -0
- package/dist/cjs/components/Cropper/utils.cjs +0 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -2
- package/dist/cjs/components/DatePicker/index.cjs +1 -0
- package/dist/cjs/components/Dialog/Dialog.cjs +0 -1
- package/dist/cjs/components/Dialog/index.cjs +1 -0
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +0 -1
- package/dist/cjs/components/DropdownMenu/index.cjs +0 -1
- package/dist/cjs/components/FloatLabel.cjs +0 -1
- package/dist/cjs/components/Glass/Glass.cjs +1 -2
- package/dist/cjs/components/Glass/index.cjs +1 -0
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -2
- package/dist/cjs/components/ImageViewer/index.cjs +1 -0
- package/dist/cjs/components/Input/Input.cjs +1 -2
- package/dist/cjs/components/Input/index.cjs +1 -0
- package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -2
- package/dist/cjs/components/InputOTP/index.cjs +1 -0
- package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -2
- package/dist/cjs/components/Interactive/index.cjs +1 -0
- package/dist/cjs/components/Label/index.cjs +1 -0
- package/dist/cjs/components/Marquee/Marquee.cjs +1 -2
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs +0 -1
- package/dist/cjs/components/Marquee/index.cjs +0 -1
- package/dist/cjs/components/Masonry/Masonry.cjs +1 -2
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs +0 -1
- package/dist/cjs/components/Masonry/index.cjs +1 -0
- package/dist/cjs/components/Pagination/Pagination.cjs +0 -1
- package/dist/cjs/components/Pagination/index.cjs +0 -1
- package/dist/cjs/components/Popover/Popover.cjs +0 -1
- package/dist/cjs/components/Popover/index.cjs +1 -2
- package/dist/cjs/components/QrCode/QrCode.cjs +1 -2
- package/dist/cjs/components/QrCode/index.cjs +0 -1
- package/dist/cjs/components/Radio/Radio.cjs +1 -2
- package/dist/cjs/components/Radio/index.cjs +1 -0
- package/dist/cjs/components/Rate/Rate.cjs +0 -1
- package/dist/cjs/components/Rate/index.cjs +1 -0
- package/dist/cjs/components/Resizable/Resizable.cjs +0 -1
- package/dist/cjs/components/Resizable/index.cjs +1 -0
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +0 -1
- package/dist/cjs/components/ScrollArea/index.cjs +1 -0
- package/dist/cjs/components/Select/Select.cjs +1 -2
- package/dist/cjs/components/Select/index.cjs +1 -0
- package/dist/cjs/components/Separator/Separator.cjs +0 -1
- package/dist/cjs/components/Separator/index.cjs +1 -0
- package/dist/cjs/components/Sheet/Sheet.cjs +0 -1
- package/dist/cjs/components/Sheet/index.cjs +1 -0
- package/dist/cjs/components/Sidebar/Sidebar.cjs +0 -1
- package/dist/cjs/components/Sidebar/index.cjs +1 -0
- package/dist/cjs/components/Skeleton/Skeleton.cjs +0 -1
- package/dist/cjs/components/Skeleton/index.cjs +1 -0
- package/dist/cjs/components/Slider/Slider.cjs +0 -1
- package/dist/cjs/components/Slider/index.cjs +1 -0
- package/dist/cjs/components/Stepper/Stepper.cjs +1 -2
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -2
- package/dist/cjs/components/Stepper/index.cjs +0 -1
- package/dist/cjs/components/Switch/Switch.cjs +0 -1
- package/dist/cjs/components/Switch/index.cjs +1 -0
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -2
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -2
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -2
- package/dist/cjs/components/Table/data-table-column-header.cjs +1 -2
- package/dist/cjs/components/Table/data-table-pagination.cjs +1 -2
- package/dist/cjs/components/Table/data-table-toolbar.cjs +1 -2
- package/dist/cjs/components/Table/data-table-view-options.cjs +1 -2
- package/dist/cjs/components/Table/data-table.cjs +1 -2
- package/dist/cjs/components/Table/index.cjs +1 -0
- package/dist/cjs/components/Table/select-column.cjs +0 -1
- package/dist/cjs/components/Tabs/Tabs.cjs +1 -2
- package/dist/cjs/components/Tabs/classes.cjs +1 -2
- package/dist/cjs/components/Tabs/index.cjs +1 -0
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -2
- package/dist/cjs/components/Textarea/index.cjs +1 -0
- package/dist/cjs/components/TimeGridView.cjs +1 -2
- package/dist/cjs/components/Toast/Toast.cjs +1 -2
- package/dist/cjs/components/Toast/index.cjs +1 -0
- package/dist/cjs/components/Toggle/Toggle.cjs +0 -1
- package/dist/cjs/components/Toggle/index.cjs +1 -0
- package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -2
- package/dist/cjs/components/Tooltip/index.cjs +1 -0
- package/dist/cjs/components/Tour/Tour.cjs +1 -2
- package/dist/cjs/components/Tour/TourWrapper.cjs +0 -1
- package/dist/cjs/components/Tour/index.cjs +0 -1
- package/dist/cjs/components/TreeSelect/TreeSelect.cjs +0 -1
- package/dist/cjs/components/TreeSelect/index.cjs +1 -0
- package/dist/cjs/components/Upload/Upload.cjs +0 -1
- package/dist/cjs/components/Upload/index.cjs +1 -0
- package/dist/cjs/components/WheelColumn.cjs +1 -2
- package/dist/cjs/config/data-table.cjs +0 -1
- package/dist/cjs/constants/common.cjs +0 -1
- package/dist/cjs/hooks/index.cjs +1 -0
- package/dist/cjs/hooks/use-callback-ref.cjs +0 -1
- package/dist/cjs/hooks/use-data-table.cjs +1 -2
- package/dist/cjs/hooks/use-debounced-callback.cjs +1 -2
- package/dist/cjs/hooks/use-debounced-value.cjs +1 -2
- package/dist/cjs/hooks/use-event-listener.cjs +1 -2
- package/dist/cjs/hooks/use-intersection-observer.cjs +0 -1
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs +0 -1
- package/dist/cjs/hooks/use-media-query.cjs +1 -2
- package/dist/cjs/hooks/use-mouse-position.cjs +1 -0
- package/dist/cjs/hooks/use-on-click-outside.cjs +1 -2
- package/dist/cjs/hooks/use-script.cjs +0 -1
- package/dist/cjs/hooks/use-scroll-lock.cjs +1 -2
- package/dist/cjs/index.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -2
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +0 -1
- package/dist/cjs/lib/TextAnimation/index.cjs +1 -0
- package/dist/cjs/lib/utils.cjs +1 -0
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs +0 -1
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/button.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/collapsible.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -2
- package/dist/cjs/packages/ui/src/components/command.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/input.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/label.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/select.cjs +1 -2
- package/dist/cjs/packages/ui/src/components/separator.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/table.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs +0 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs +0 -1
- package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs +0 -1
- package/dist/cjs/packages/ui/src/lib/compose-refs.cjs +0 -1
- package/dist/cjs/packages/ui/src/lib/utils.cjs +0 -1
- package/dist/cjs/utils/animations.cjs +1 -2
- package/dist/cjs/utils/css.cjs +0 -1
- package/dist/cjs/utils/data-table.cjs +0 -1
- package/dist/cjs/utils/datetime.cjs +0 -1
- package/dist/cjs/utils/parsers.cjs +0 -1
- package/dist/esm/_virtual/_commonjsHelpers.js +0 -1
- package/dist/esm/_virtual/index.js +0 -1
- package/dist/esm/_virtual/index2.js +0 -1
- package/dist/esm/components/Accordion/Accordion.js +0 -1
- package/dist/esm/components/Accordion/index.js +9 -0
- package/dist/esm/components/Avatar/Avatar.js +32 -63
- package/dist/esm/components/Avatar/index.js +4 -0
- package/dist/esm/components/Badge/Badge.js +0 -1
- package/dist/esm/components/Badge/index.js +5 -0
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +0 -1
- package/dist/esm/components/Breadcrumb/index.js +5 -0
- package/dist/esm/components/Button/Button.js +0 -1
- package/dist/esm/components/Button/ButtonGroup.js +0 -1
- package/dist/esm/components/Button/index.js +10 -0
- package/dist/esm/components/Calendar/Calendar.js +25 -57
- package/dist/esm/components/Calendar/index.js +5 -0
- package/dist/esm/components/Carousel/Carousel.js +0 -1
- package/dist/esm/components/Carousel/index.js +6 -0
- package/dist/esm/components/Checkbox/Checkbox.js +29 -58
- package/dist/esm/components/Checkbox/index.js +5 -0
- package/dist/esm/components/Collapsible/Collapsible.js +0 -1
- package/dist/esm/components/Collapsible/index.js +5 -0
- package/dist/esm/components/Command/Command.js +0 -1
- package/dist/esm/components/Command/index.js +0 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js +0 -1
- package/dist/esm/components/ContextMenu/index.js +0 -1
- package/dist/esm/components/Cropper/Cropper.js +261 -292
- package/dist/esm/components/Cropper/CropperTool.js +0 -1
- package/dist/esm/components/Cropper/index.js +17 -0
- package/dist/esm/components/Cropper/utils.js +0 -1
- package/dist/esm/components/DatePicker/DatePicker.js +94 -122
- package/dist/esm/components/DatePicker/RangePicker.js +202 -230
- package/dist/esm/components/DatePicker/TimePicker.js +63 -92
- package/dist/esm/components/DatePicker/index.js +8 -0
- package/dist/esm/components/Dialog/Dialog.js +0 -1
- package/dist/esm/components/Dialog/index.js +5 -0
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +0 -1
- package/dist/esm/components/DropdownMenu/index.js +0 -1
- package/dist/esm/components/FloatLabel.js +0 -1
- package/dist/esm/components/Glass/Glass.js +7 -39
- package/dist/esm/components/Glass/index.js +5 -0
- package/dist/esm/components/ImageViewer/ImageViewer.js +95 -126
- package/dist/esm/components/ImageViewer/index.js +7 -0
- package/dist/esm/components/Input/Input.js +0 -1
- package/dist/esm/components/Input/index.js +5 -0
- package/dist/esm/components/InputOTP/InputOTP.js +28 -58
- package/dist/esm/components/InputOTP/index.js +5 -0
- package/dist/esm/components/Interactive/CursorFollow.js +90 -122
- package/dist/esm/components/Interactive/index.js +9 -0
- package/dist/esm/components/Label/index.js +4 -0
- package/dist/esm/components/Marquee/Marquee.js +78 -109
- package/dist/esm/components/Marquee/MarqueeWrapper.js +0 -1
- package/dist/esm/components/Marquee/index.js +0 -1
- package/dist/esm/components/Masonry/Masonry.js +67 -100
- package/dist/esm/components/Masonry/MasonryWrapper.js +0 -1
- package/dist/esm/components/Masonry/index.js +10 -0
- package/dist/esm/components/Pagination/Pagination.js +0 -1
- package/dist/esm/components/Pagination/index.js +0 -1
- package/dist/esm/components/Popover/Popover.js +0 -1
- package/dist/esm/components/Popover/index.js +3 -3
- package/dist/esm/components/QrCode/QrCode.js +126 -157
- package/dist/esm/components/QrCode/index.js +0 -1
- package/dist/esm/components/Radio/Radio.js +36 -67
- package/dist/esm/components/Radio/index.js +5 -0
- package/dist/esm/components/Rate/Rate.js +0 -1
- package/dist/esm/components/Rate/index.js +5 -0
- package/dist/esm/components/Resizable/Resizable.js +0 -1
- package/dist/esm/components/Resizable/index.js +13 -0
- package/dist/esm/components/ScrollArea/ScrollArea.js +0 -1
- package/dist/esm/components/ScrollArea/index.js +5 -0
- package/dist/esm/components/Select/Select.js +115 -99
- package/dist/esm/components/Select/index.js +5 -0
- package/dist/esm/components/Separator/Separator.js +0 -1
- package/dist/esm/components/Separator/index.js +5 -0
- package/dist/esm/components/Sheet/Sheet.js +0 -1
- package/dist/esm/components/Sheet/index.js +5 -0
- package/dist/esm/components/Sidebar/Sidebar.js +0 -1
- package/dist/esm/components/Sidebar/index.js +29 -0
- package/dist/esm/components/Skeleton/Skeleton.js +0 -1
- package/dist/esm/components/Skeleton/index.js +5 -0
- package/dist/esm/components/Slider/Slider.js +0 -1
- package/dist/esm/components/Slider/index.js +5 -0
- package/dist/esm/components/Stepper/Stepper.js +72 -102
- package/dist/esm/components/Stepper/StepperWrapper.js +42 -74
- package/dist/esm/components/Stepper/index.js +0 -1
- package/dist/esm/components/Switch/Switch.js +0 -1
- package/dist/esm/components/Switch/index.js +5 -0
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +2 -3
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +12 -13
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +66 -97
- package/dist/esm/components/Table/data-table-column-header.js +41 -73
- package/dist/esm/components/Table/data-table-pagination.js +30 -63
- package/dist/esm/components/Table/data-table-toolbar.js +43 -74
- package/dist/esm/components/Table/data-table-view-options.js +85 -116
- package/dist/esm/components/Table/data-table.js +52 -85
- package/dist/esm/components/Table/index.js +20 -0
- package/dist/esm/components/Table/select-column.js +0 -1
- package/dist/esm/components/Tabs/Tabs.js +0 -1
- package/dist/esm/components/Tabs/classes.js +23 -57
- package/dist/esm/components/Tabs/index.js +5 -0
- package/dist/esm/components/Textarea/Textarea.js +0 -1
- package/dist/esm/components/Textarea/index.js +5 -0
- package/dist/esm/components/TimeGridView.js +33 -65
- package/dist/esm/components/Toast/Toast.js +39 -71
- package/dist/esm/components/Toast/index.js +6 -0
- package/dist/esm/components/Toggle/Toggle.js +0 -1
- package/dist/esm/components/Toggle/index.js +5 -0
- package/dist/esm/components/Tooltip/Tooltip.js +34 -65
- package/dist/esm/components/Tooltip/index.js +4 -0
- package/dist/esm/components/Tour/Tour.js +331 -361
- package/dist/esm/components/Tour/TourWrapper.js +0 -1
- package/dist/esm/components/Tour/index.js +0 -1
- package/dist/esm/components/TreeSelect/TreeSelect.js +0 -1
- package/dist/esm/components/TreeSelect/index.js +5 -0
- package/dist/esm/components/Upload/Upload.js +0 -1
- package/dist/esm/components/Upload/index.js +4 -0
- package/dist/esm/components/WheelColumn.js +37 -69
- package/dist/esm/config/data-table.js +0 -1
- package/dist/esm/constants/common.js +0 -1
- package/dist/esm/hooks/index.js +26 -0
- package/dist/esm/hooks/use-callback-ref.js +0 -1
- package/dist/esm/hooks/use-data-table.js +0 -1
- package/dist/esm/hooks/use-debounced-callback.js +0 -1
- package/dist/esm/hooks/use-debounced-value.js +0 -1
- package/dist/esm/hooks/use-event-listener.js +0 -1
- package/dist/esm/hooks/use-intersection-observer.js +0 -1
- package/dist/esm/hooks/use-isomorphic-layout-effect.js +0 -1
- package/dist/esm/hooks/use-media-query.js +0 -1
- package/dist/esm/hooks/use-mouse-position.js +27 -0
- package/dist/esm/hooks/use-on-click-outside.js +0 -1
- package/dist/esm/hooks/use-script.js +0 -1
- package/dist/esm/hooks/use-scroll-lock.js +0 -1
- package/dist/esm/index.js +241 -268
- package/dist/esm/lib/TextAnimation/BlurText.js +0 -1
- package/dist/esm/lib/TextAnimation/CircularText.js +0 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js +28 -60
- package/dist/esm/lib/TextAnimation/GradientText.js +26 -58
- package/dist/esm/lib/TextAnimation/RollingText.js +0 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js +27 -59
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +26 -58
- package/dist/esm/lib/TextAnimation/SplittingText.js +0 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +29 -61
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +0 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +0 -1
- package/dist/esm/lib/TextAnimation/TypingText.js +0 -1
- package/dist/esm/lib/TextAnimation/WritingText.js +0 -1
- package/dist/esm/lib/TextAnimation/index.js +28 -0
- package/dist/esm/lib/utils.js +12 -0
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js +0 -1
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js +0 -1
- package/dist/esm/packages/ui/src/components/accordion.js +0 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js +0 -1
- package/dist/esm/packages/ui/src/components/avatar.js +0 -1
- package/dist/esm/packages/ui/src/components/badge.js +0 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js +0 -1
- package/dist/esm/packages/ui/src/components/button-group.js +0 -1
- package/dist/esm/packages/ui/src/components/button.js +0 -1
- package/dist/esm/packages/ui/src/components/calendar.js +0 -1
- package/dist/esm/packages/ui/src/components/checkbox.js +0 -1
- package/dist/esm/packages/ui/src/components/collapsible.js +0 -1
- package/dist/esm/packages/ui/src/components/combobox.js +105 -81
- package/dist/esm/packages/ui/src/components/command.js +0 -1
- package/dist/esm/packages/ui/src/components/context-menu.js +0 -1
- package/dist/esm/packages/ui/src/components/dialog.js +0 -1
- package/dist/esm/packages/ui/src/components/drawer.js +0 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js +0 -1
- package/dist/esm/packages/ui/src/components/input-otp.js +0 -1
- package/dist/esm/packages/ui/src/components/input.js +0 -1
- package/dist/esm/packages/ui/src/components/label.js +0 -1
- package/dist/esm/packages/ui/src/components/pagination.js +0 -1
- package/dist/esm/packages/ui/src/components/popover.js +0 -1
- package/dist/esm/packages/ui/src/components/radio-group.js +0 -1
- package/dist/esm/packages/ui/src/components/resizable.js +0 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js +0 -1
- package/dist/esm/packages/ui/src/components/select.js +142 -126
- package/dist/esm/packages/ui/src/components/separator.js +0 -1
- package/dist/esm/packages/ui/src/components/sheet.js +0 -1
- package/dist/esm/packages/ui/src/components/sidebar.js +0 -1
- package/dist/esm/packages/ui/src/components/skeleton.js +0 -1
- package/dist/esm/packages/ui/src/components/switch.js +0 -1
- package/dist/esm/packages/ui/src/components/table.js +0 -1
- package/dist/esm/packages/ui/src/components/tabs.js +0 -1
- package/dist/esm/packages/ui/src/components/textarea.js +0 -1
- package/dist/esm/packages/ui/src/components/toggle.js +0 -1
- package/dist/esm/packages/ui/src/components/tooltip.js +0 -1
- package/dist/esm/packages/ui/src/components/tree-view.js +1 -2
- package/dist/esm/packages/ui/src/hooks/use-mobile.js +0 -1
- package/dist/esm/packages/ui/src/lib/compose-refs.js +0 -1
- package/dist/esm/packages/ui/src/lib/utils.js +0 -1
- package/dist/esm/utils/animations.js +40 -73
- package/dist/esm/utils/css.js +0 -1
- package/dist/esm/utils/data-table.js +0 -1
- package/dist/esm/utils/datetime.js +0 -1
- package/dist/esm/utils/parsers.js +0 -1
- package/dist/types/components/Accordion/index.d.ts +1 -1
- package/dist/types/components/Accordion/index.d.ts.map +1 -1
- package/dist/types/components/Badge/index.d.ts +1 -1
- package/dist/types/components/Badge/index.d.ts.map +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts +1 -1
- package/dist/types/components/Breadcrumb/index.d.ts.map +1 -1
- package/dist/types/components/Button/index.d.ts +1 -1
- package/dist/types/components/Button/index.d.ts.map +1 -1
- package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
- package/dist/types/components/Checkbox/index.d.ts +1 -1
- package/dist/types/components/Checkbox/index.d.ts.map +1 -1
- package/dist/types/components/Collapsible/index.d.ts +1 -1
- package/dist/types/components/Collapsible/index.d.ts.map +1 -1
- package/dist/types/components/Cropper/Cropper.d.ts.map +1 -1
- package/dist/types/components/Dialog/index.d.ts +1 -1
- package/dist/types/components/Dialog/index.d.ts.map +1 -1
- package/dist/types/components/Glass/index.d.ts +1 -1
- package/dist/types/components/Glass/index.d.ts.map +1 -1
- package/dist/types/components/Input/index.d.ts +1 -1
- package/dist/types/components/Input/index.d.ts.map +1 -1
- package/dist/types/components/InputOTP/index.d.ts +1 -1
- package/dist/types/components/InputOTP/index.d.ts.map +1 -1
- package/dist/types/components/Label/Label.d.ts +1 -1
- package/dist/types/components/Label/Label.d.ts.map +1 -1
- package/dist/types/components/Marquee/Marquee.d.ts +1 -1
- package/dist/types/components/Marquee/Marquee.d.ts.map +1 -1
- package/dist/types/components/Masonry/Masonry.d.ts.map +1 -1
- package/dist/types/components/Popover/index.d.ts +1 -0
- package/dist/types/components/Popover/index.d.ts.map +1 -1
- package/dist/types/components/QrCode/QrCode.d.ts.map +1 -1
- package/dist/types/components/Radio/index.d.ts +1 -1
- package/dist/types/components/Radio/index.d.ts.map +1 -1
- package/dist/types/components/ScrollArea/index.d.ts +1 -1
- package/dist/types/components/ScrollArea/index.d.ts.map +1 -1
- package/dist/types/components/Select/Select.d.ts +4 -0
- package/dist/types/components/Select/Select.d.ts.map +1 -1
- package/dist/types/components/Select/index.d.ts +1 -1
- package/dist/types/components/Select/index.d.ts.map +1 -1
- package/dist/types/components/Sheet/index.d.ts +1 -1
- package/dist/types/components/Sheet/index.d.ts.map +1 -1
- package/dist/types/components/Skeleton/index.d.ts +1 -1
- package/dist/types/components/Skeleton/index.d.ts.map +1 -1
- package/dist/types/components/Slider/Slider.d.ts +1 -1
- package/dist/types/components/Slider/index.d.ts +1 -1
- package/dist/types/components/Slider/index.d.ts.map +1 -1
- package/dist/types/components/Stepper/Stepper.d.ts.map +1 -1
- package/dist/types/components/Switch/Switch.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts +1 -1
- package/dist/types/components/Switch/index.d.ts.map +1 -1
- package/dist/types/components/Tabs/index.d.ts +1 -1
- package/dist/types/components/Tabs/index.d.ts.map +1 -1
- package/dist/types/components/Textarea/index.d.ts +1 -1
- package/dist/types/components/Textarea/index.d.ts.map +1 -1
- package/dist/types/components/Toggle/Toggle.d.ts +1 -1
- package/dist/types/components/Toggle/index.d.ts +1 -1
- package/dist/types/components/Toggle/index.d.ts.map +1 -1
- package/dist/types/components/Tour/Tour.d.ts.map +1 -1
- package/dist/types/hooks/index.d.ts +3 -0
- package/dist/types/hooks/index.d.ts.map +1 -1
- package/dist/types/index.d.ts +23 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/lib/utils.d.ts +1 -1
- package/dist/types/lib/utils.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/badge.d.ts +3 -3
- package/dist/types/packages/ui/src/components/button.d.ts +2 -2
- package/dist/types/packages/ui/src/components/checkbox.d.ts +1 -1
- package/dist/types/packages/ui/src/components/combobox.d.ts +4 -2
- package/dist/types/packages/ui/src/components/combobox.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/input-otp.d.ts +1 -1
- package/dist/types/packages/ui/src/components/input.d.ts +1 -1
- package/dist/types/packages/ui/src/components/radio-group.d.ts +1 -1
- package/dist/types/packages/ui/src/components/select.d.ts +4 -3
- package/dist/types/packages/ui/src/components/select.d.ts.map +1 -1
- package/dist/types/packages/ui/src/components/switch.d.ts +1 -1
- package/dist/types/packages/ui/src/components/textarea.d.ts +1 -1
- package/dist/types/packages/ui/src/components/toggle.d.ts +1 -1
- package/dist/types/utils/parsers.d.ts +1 -1
- package/package.json +258 -258
- package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +0 -1
- package/dist/cjs/_virtual/index.cjs.map +0 -1
- package/dist/cjs/_virtual/index2.cjs.map +0 -1
- package/dist/cjs/components/Accordion/Accordion.cjs.map +0 -1
- package/dist/cjs/components/Avatar/Avatar.cjs.map +0 -1
- package/dist/cjs/components/Badge/Badge.cjs.map +0 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +0 -1
- package/dist/cjs/components/Button/Button.cjs.map +0 -1
- package/dist/cjs/components/Button/ButtonGroup.cjs.map +0 -1
- package/dist/cjs/components/Calendar/Calendar.cjs.map +0 -1
- package/dist/cjs/components/Carousel/Carousel.cjs.map +0 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +0 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +0 -1
- package/dist/cjs/components/Command/Command.cjs.map +0 -1
- package/dist/cjs/components/Command/index.cjs.map +0 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +0 -1
- package/dist/cjs/components/ContextMenu/index.cjs.map +0 -1
- package/dist/cjs/components/Cropper/Cropper.cjs.map +0 -1
- package/dist/cjs/components/Cropper/CropperTool.cjs.map +0 -1
- package/dist/cjs/components/Cropper/utils.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +0 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +0 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +0 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +0 -1
- package/dist/cjs/components/DropdownMenu/index.cjs.map +0 -1
- package/dist/cjs/components/FloatLabel.cjs.map +0 -1
- package/dist/cjs/components/Glass/Glass.cjs.map +0 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +0 -1
- package/dist/cjs/components/Input/Input.cjs.map +0 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +0 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +0 -1
- package/dist/cjs/components/Marquee/Marquee.cjs.map +0 -1
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs.map +0 -1
- package/dist/cjs/components/Marquee/index.cjs.map +0 -1
- package/dist/cjs/components/Masonry/Masonry.cjs.map +0 -1
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs.map +0 -1
- package/dist/cjs/components/Pagination/Pagination.cjs.map +0 -1
- package/dist/cjs/components/Pagination/index.cjs.map +0 -1
- package/dist/cjs/components/Popover/Popover.cjs.map +0 -1
- package/dist/cjs/components/Popover/index.cjs.map +0 -1
- package/dist/cjs/components/QrCode/QrCode.cjs.map +0 -1
- package/dist/cjs/components/QrCode/index.cjs.map +0 -1
- package/dist/cjs/components/Radio/Radio.cjs.map +0 -1
- package/dist/cjs/components/Rate/Rate.cjs.map +0 -1
- package/dist/cjs/components/Resizable/Resizable.cjs.map +0 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +0 -1
- package/dist/cjs/components/Select/Select.cjs.map +0 -1
- package/dist/cjs/components/Separator/Separator.cjs.map +0 -1
- package/dist/cjs/components/Sheet/Sheet.cjs.map +0 -1
- package/dist/cjs/components/Sidebar/Sidebar.cjs.map +0 -1
- package/dist/cjs/components/Skeleton/Skeleton.cjs.map +0 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +0 -1
- package/dist/cjs/components/Stepper/Stepper.cjs.map +0 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +0 -1
- package/dist/cjs/components/Stepper/index.cjs.map +0 -1
- package/dist/cjs/components/Switch/Switch.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +0 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-toolbar.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table-view-options.cjs.map +0 -1
- package/dist/cjs/components/Table/data-table.cjs.map +0 -1
- package/dist/cjs/components/Table/select-column.cjs.map +0 -1
- package/dist/cjs/components/Tabs/Tabs.cjs.map +0 -1
- package/dist/cjs/components/Tabs/classes.cjs.map +0 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +0 -1
- package/dist/cjs/components/TimeGridView.cjs.map +0 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +0 -1
- package/dist/cjs/components/Toggle/Toggle.cjs.map +0 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +0 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +0 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +0 -1
- package/dist/cjs/components/Tour/index.cjs.map +0 -1
- package/dist/cjs/components/TreeSelect/TreeSelect.cjs.map +0 -1
- package/dist/cjs/components/Upload/Upload.cjs.map +0 -1
- package/dist/cjs/components/WheelColumn.cjs.map +0 -1
- package/dist/cjs/config/data-table.cjs.map +0 -1
- package/dist/cjs/constants/common.cjs.map +0 -1
- package/dist/cjs/hooks/use-callback-ref.cjs.map +0 -1
- package/dist/cjs/hooks/use-data-table.cjs.map +0 -1
- package/dist/cjs/hooks/use-debounced-callback.cjs.map +0 -1
- package/dist/cjs/hooks/use-debounced-value.cjs.map +0 -1
- package/dist/cjs/hooks/use-event-listener.cjs.map +0 -1
- package/dist/cjs/hooks/use-intersection-observer.cjs.map +0 -1
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs.map +0 -1
- package/dist/cjs/hooks/use-media-query.cjs.map +0 -1
- package/dist/cjs/hooks/use-on-click-outside.cjs.map +0 -1
- package/dist/cjs/hooks/use-script.cjs.map +0 -1
- package/dist/cjs/hooks/use-scroll-lock.cjs.map +0 -1
- package/dist/cjs/index.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +0 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +0 -1
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/button.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/collapsible.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/command.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/input.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/label.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/select.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/table.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/lib/compose-refs.cjs.map +0 -1
- package/dist/cjs/packages/ui/src/lib/utils.cjs.map +0 -1
- package/dist/cjs/utils/animations.cjs.map +0 -1
- package/dist/cjs/utils/css.cjs.map +0 -1
- package/dist/cjs/utils/data-table.cjs.map +0 -1
- package/dist/cjs/utils/datetime.cjs.map +0 -1
- package/dist/cjs/utils/parsers.cjs.map +0 -1
- package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
- package/dist/esm/_virtual/index.js.map +0 -1
- package/dist/esm/_virtual/index2.js.map +0 -1
- package/dist/esm/components/Accordion/Accordion.js.map +0 -1
- package/dist/esm/components/Avatar/Avatar.js.map +0 -1
- package/dist/esm/components/Badge/Badge.js.map +0 -1
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +0 -1
- package/dist/esm/components/Button/Button.js.map +0 -1
- package/dist/esm/components/Button/ButtonGroup.js.map +0 -1
- package/dist/esm/components/Calendar/Calendar.js.map +0 -1
- package/dist/esm/components/Carousel/Carousel.js.map +0 -1
- package/dist/esm/components/Checkbox/Checkbox.js.map +0 -1
- package/dist/esm/components/Collapsible/Collapsible.js.map +0 -1
- package/dist/esm/components/Command/Command.js.map +0 -1
- package/dist/esm/components/Command/index.js.map +0 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +0 -1
- package/dist/esm/components/ContextMenu/index.js.map +0 -1
- package/dist/esm/components/Cropper/Cropper.js.map +0 -1
- package/dist/esm/components/Cropper/CropperTool.js.map +0 -1
- package/dist/esm/components/Cropper/utils.js.map +0 -1
- package/dist/esm/components/DatePicker/DatePicker.js.map +0 -1
- package/dist/esm/components/DatePicker/RangePicker.js.map +0 -1
- package/dist/esm/components/DatePicker/TimePicker.js.map +0 -1
- package/dist/esm/components/Dialog/Dialog.js.map +0 -1
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +0 -1
- package/dist/esm/components/DropdownMenu/index.js.map +0 -1
- package/dist/esm/components/FloatLabel.js.map +0 -1
- package/dist/esm/components/Glass/Glass.js.map +0 -1
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +0 -1
- package/dist/esm/components/Input/Input.js.map +0 -1
- package/dist/esm/components/InputOTP/InputOTP.js.map +0 -1
- package/dist/esm/components/Interactive/CursorFollow.js.map +0 -1
- package/dist/esm/components/Marquee/Marquee.js.map +0 -1
- package/dist/esm/components/Marquee/MarqueeWrapper.js.map +0 -1
- package/dist/esm/components/Marquee/index.js.map +0 -1
- package/dist/esm/components/Masonry/Masonry.js.map +0 -1
- package/dist/esm/components/Masonry/MasonryWrapper.js.map +0 -1
- package/dist/esm/components/Pagination/Pagination.js.map +0 -1
- package/dist/esm/components/Pagination/index.js.map +0 -1
- package/dist/esm/components/Popover/Popover.js.map +0 -1
- package/dist/esm/components/Popover/index.js.map +0 -1
- package/dist/esm/components/QrCode/QrCode.js.map +0 -1
- package/dist/esm/components/QrCode/index.js.map +0 -1
- package/dist/esm/components/Radio/Radio.js.map +0 -1
- package/dist/esm/components/Rate/Rate.js.map +0 -1
- package/dist/esm/components/Resizable/Resizable.js.map +0 -1
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +0 -1
- package/dist/esm/components/Select/Select.js.map +0 -1
- package/dist/esm/components/Separator/Separator.js.map +0 -1
- package/dist/esm/components/Sheet/Sheet.js.map +0 -1
- package/dist/esm/components/Sidebar/Sidebar.js.map +0 -1
- package/dist/esm/components/Skeleton/Skeleton.js.map +0 -1
- package/dist/esm/components/Slider/Slider.js.map +0 -1
- package/dist/esm/components/Stepper/Stepper.js.map +0 -1
- package/dist/esm/components/Stepper/StepperWrapper.js.map +0 -1
- package/dist/esm/components/Stepper/index.js.map +0 -1
- package/dist/esm/components/Switch/Switch.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +0 -1
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +0 -1
- package/dist/esm/components/Table/data-table-column-header.js.map +0 -1
- package/dist/esm/components/Table/data-table-pagination.js.map +0 -1
- package/dist/esm/components/Table/data-table-toolbar.js.map +0 -1
- package/dist/esm/components/Table/data-table-view-options.js.map +0 -1
- package/dist/esm/components/Table/data-table.js.map +0 -1
- package/dist/esm/components/Table/select-column.js.map +0 -1
- package/dist/esm/components/Tabs/Tabs.js.map +0 -1
- package/dist/esm/components/Tabs/classes.js.map +0 -1
- package/dist/esm/components/Textarea/Textarea.js.map +0 -1
- package/dist/esm/components/TimeGridView.js.map +0 -1
- package/dist/esm/components/Toast/Toast.js.map +0 -1
- package/dist/esm/components/Toggle/Toggle.js.map +0 -1
- package/dist/esm/components/Tooltip/Tooltip.js.map +0 -1
- package/dist/esm/components/Tour/Tour.js.map +0 -1
- package/dist/esm/components/Tour/TourWrapper.js.map +0 -1
- package/dist/esm/components/Tour/index.js.map +0 -1
- package/dist/esm/components/TreeSelect/TreeSelect.js.map +0 -1
- package/dist/esm/components/Upload/Upload.js.map +0 -1
- package/dist/esm/components/WheelColumn.js.map +0 -1
- package/dist/esm/config/data-table.js.map +0 -1
- package/dist/esm/constants/common.js.map +0 -1
- package/dist/esm/hooks/use-callback-ref.js.map +0 -1
- package/dist/esm/hooks/use-data-table.js.map +0 -1
- package/dist/esm/hooks/use-debounced-callback.js.map +0 -1
- package/dist/esm/hooks/use-debounced-value.js.map +0 -1
- package/dist/esm/hooks/use-event-listener.js.map +0 -1
- package/dist/esm/hooks/use-intersection-observer.js.map +0 -1
- package/dist/esm/hooks/use-isomorphic-layout-effect.js.map +0 -1
- package/dist/esm/hooks/use-media-query.js.map +0 -1
- package/dist/esm/hooks/use-on-click-outside.js.map +0 -1
- package/dist/esm/hooks/use-script.js.map +0 -1
- package/dist/esm/hooks/use-scroll-lock.js.map +0 -1
- package/dist/esm/index.js.map +0 -1
- package/dist/esm/lib/TextAnimation/BlurText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/CircularText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +0 -1
- package/dist/esm/lib/TextAnimation/GradientText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/RollingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/SplittingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +0 -1
- package/dist/esm/lib/TextAnimation/TypingText.js.map +0 -1
- package/dist/esm/lib/TextAnimation/WritingText.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +0 -1
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js.map +0 -1
- package/dist/esm/packages/ui/src/components/accordion.js.map +0 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js.map +0 -1
- package/dist/esm/packages/ui/src/components/avatar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/badge.js.map +0 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js.map +0 -1
- package/dist/esm/packages/ui/src/components/button-group.js.map +0 -1
- package/dist/esm/packages/ui/src/components/button.js.map +0 -1
- package/dist/esm/packages/ui/src/components/calendar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/checkbox.js.map +0 -1
- package/dist/esm/packages/ui/src/components/collapsible.js.map +0 -1
- package/dist/esm/packages/ui/src/components/combobox.js.map +0 -1
- package/dist/esm/packages/ui/src/components/command.js.map +0 -1
- package/dist/esm/packages/ui/src/components/context-menu.js.map +0 -1
- package/dist/esm/packages/ui/src/components/dialog.js.map +0 -1
- package/dist/esm/packages/ui/src/components/drawer.js.map +0 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +0 -1
- package/dist/esm/packages/ui/src/components/input-otp.js.map +0 -1
- package/dist/esm/packages/ui/src/components/input.js.map +0 -1
- package/dist/esm/packages/ui/src/components/label.js.map +0 -1
- package/dist/esm/packages/ui/src/components/pagination.js.map +0 -1
- package/dist/esm/packages/ui/src/components/popover.js.map +0 -1
- package/dist/esm/packages/ui/src/components/radio-group.js.map +0 -1
- package/dist/esm/packages/ui/src/components/resizable.js.map +0 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js.map +0 -1
- package/dist/esm/packages/ui/src/components/select.js.map +0 -1
- package/dist/esm/packages/ui/src/components/separator.js.map +0 -1
- package/dist/esm/packages/ui/src/components/sheet.js.map +0 -1
- package/dist/esm/packages/ui/src/components/sidebar.js.map +0 -1
- package/dist/esm/packages/ui/src/components/skeleton.js.map +0 -1
- package/dist/esm/packages/ui/src/components/switch.js.map +0 -1
- package/dist/esm/packages/ui/src/components/table.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tabs.js.map +0 -1
- package/dist/esm/packages/ui/src/components/textarea.js.map +0 -1
- package/dist/esm/packages/ui/src/components/toggle.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tooltip.js.map +0 -1
- package/dist/esm/packages/ui/src/components/tree-view.js.map +0 -1
- package/dist/esm/packages/ui/src/hooks/use-mobile.js.map +0 -1
- package/dist/esm/packages/ui/src/lib/compose-refs.js.map +0 -1
- package/dist/esm/packages/ui/src/lib/utils.js.map +0 -1
- package/dist/esm/utils/animations.js.map +0 -1
- package/dist/esm/utils/css.js.map +0 -1
- package/dist/esm/utils/data-table.js.map +0 -1
- package/dist/esm/utils/datetime.js.map +0 -1
- package/dist/esm/utils/parsers.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CropperTool.cjs","sources":["../../../../src/components/Cropper/CropperTool.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Cropper,\n CropperImage,\n CropperArea,\n type CropperProps,\n type CropperPoint,\n type CropperAreaData,\n} from \"./Cropper\";\nimport { getCroppedImg, type CroppedImageOptions } from \"./utils\";\n\nexport interface CropperToolProps extends Omit<CropperProps, \"onCropComplete\"> {\n /**\n * Image source URL\n */\n src: string;\n /**\n * Alt text for the image\n */\n alt?: string;\n /**\n * Callback when crop is completed with the cropped image as base64 or Blob\n */\n onCropComplete?: (croppedImage: string | Blob) => void;\n /**\n * Callback when crop area changes (for real-time updates)\n */\n onCropAreaChange?: (\n croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => void;\n /**\n * Options for the cropped image output\n */\n cropOptions?: Pick<\n CroppedImageOptions,\n \"format\" | \"quality\" | \"flip\" | \"type\"\n >;\n /**\n * Cross-origin setting for the image\n */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\n/**\n * A higher-level Cropper component that handles image cropping automatically\n * and returns the cropped image as base64 data URL or Blob.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * onCropComplete={(base64) => {\n * console.log('Cropped image:', base64);\n * }}\n * />\n *\n * // Get Blob output\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * cropOptions={{ type: 'blob' }}\n * onCropComplete={(blob) => {\n * console.log('Cropped image blob:', blob);\n * }}\n * />\n * ```\n */\nexport const CropperTool = React.forwardRef<HTMLDivElement, CropperToolProps>(\n (props, ref) => {\n const {\n src,\n alt = \"Crop image\",\n onCropComplete,\n onCropAreaChange,\n cropOptions = {},\n crossOrigin = \"anonymous\",\n rotation = 0,\n shape = \"rectangle\",\n ...cropperProps\n } = props;\n\n // State to manage crop position\n const [crop, setCrop] = React.useState<CropperPoint>({ x: 0, y: 0 });\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => {\n // Call the user's onCropAreaChange if provided\n onCropAreaChange?.(_croppedArea, croppedAreaPixels);\n\n if (!onCropComplete) return;\n\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n const outputType = cropOptions.type || \"base64\";\n\n if (outputType === \"blob\") {\n const croppedBlob = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"blob\",\n });\n onCropComplete(croppedBlob);\n } else {\n const croppedImageBase64 = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"base64\",\n });\n onCropComplete(croppedImageBase64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [src, rotation, shape, cropOptions, onCropComplete, onCropAreaChange]\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n return (\n <Cropper\n ref={ref}\n {...cropperProps}\n crop={crop}\n rotation={rotation}\n shape={shape}\n onCropChange={setCrop}\n onCropAreaChange={handleCropAreaChange}\n >\n <CropperImage src={src} alt={alt} crossOrigin={crossOrigin} />\n <CropperArea />\n </Cropper>\n );\n }\n);\n\nCropperTool.displayName = \"CropperTool\";\n\nexport interface UseCropperToolOptions {\n /**\n * Image source URL\n */\n imageSrc: string;\n /**\n * Initial crop position\n */\n initialCrop?: CropperPoint;\n /**\n * Initial zoom level\n */\n initialZoom?: number;\n /**\n * Initial rotation angle\n */\n initialRotation?: number;\n /**\n * Crop options (shape, format, quality, type, etc.)\n */\n cropOptions?: Omit<CroppedImageOptions, \"imageSrc\" | \"pixelCrop\">;\n /**\n * Output type: 'base64' for data URL (default) or 'blob' for Blob object\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Hook to easily handle cropping logic in your components.\n * Automatically handles crop area changes and generates cropped images.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * const {\n * crop,\n * zoom,\n * rotation,\n * setCrop,\n * setZoom,\n * setRotation,\n * croppedImage,\n * handleCropAreaChange,\n * reset\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * // Get Blob output\n * const {\n * croppedImage, // This will be a Blob\n * ...rest\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * type: \"blob\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * return (\n * <div>\n * <Cropper\n * crop={crop}\n * zoom={zoom}\n * rotation={rotation}\n * onCropChange={setCrop}\n * onZoomChange={setZoom}\n * onCropAreaChange={handleCropAreaChange}\n * >\n * <CropperImage src={imageSrc} />\n * <CropperArea />\n * </Cropper>\n * {croppedImage && typeof croppedImage === 'string' && (\n * <img src={croppedImage} alt=\"Cropped\" />\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCropperTool(options: UseCropperToolOptions) {\n const {\n imageSrc,\n initialCrop,\n initialZoom = 1,\n initialRotation = 0,\n cropOptions,\n type = \"base64\",\n } = options;\n\n const [crop, setCrop] = React.useState<CropperPoint>(\n initialCrop || { x: 0, y: 0 }\n );\n const [zoom, setZoom] = React.useState(initialZoom);\n const [rotation, setRotation] = React.useState(initialRotation);\n const [croppedImage, setCroppedImage] = React.useState<string | Blob | null>(\n null\n );\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => {\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer to debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n if (type === \"blob\") {\n const blob = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"blob\",\n });\n setCroppedImage(blob);\n } else {\n const base64 = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"base64\",\n });\n setCroppedImage(base64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [imageSrc, rotation, cropOptions, type]\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n const reset = React.useCallback(() => {\n setCrop(initialCrop || { x: 0, y: 0 });\n setZoom(initialZoom);\n setRotation(initialRotation);\n setCroppedImage(null);\n }, [initialCrop, initialZoom, initialRotation]);\n\n return {\n crop,\n zoom,\n rotation,\n croppedImage,\n setCrop,\n setZoom,\n setRotation,\n setCroppedImage,\n handleCropAreaChange,\n reset,\n };\n}\n"],"names":["CropperTool","React","props","ref","src","alt","onCropComplete","onCropAreaChange","cropOptions","crossOrigin","rotation","shape","cropperProps","crop","setCrop","debounceTimerRef","prevCropAreaRef","handleCropAreaChange","_croppedArea","croppedAreaPixels","prev","croppedBlob","getCroppedImg","croppedImageBase64","error","jsxs","Cropper","jsx","CropperImage","CropperArea","useCropperTool","options","imageSrc","initialCrop","initialZoom","initialRotation","type","zoom","setZoom","setRotation","croppedImage","setCroppedImage","blob","base64","reset"],"mappings":"4LAwEaA,EAAcC,EAAM,WAC/B,CAACC,EAAOC,IAAQ,CACd,KAAM,CACJ,IAAAC,EACA,IAAAC,EAAM,aACN,eAAAC,EACA,iBAAAC,EACA,YAAAC,EAAc,CAAA,EACd,YAAAC,EAAc,YACd,SAAAC,EAAW,EACX,MAAAC,EAAQ,YACR,GAAGC,CAAA,EACDV,EAGE,CAACW,EAAMC,CAAO,EAAIb,EAAM,SAAuB,CAAE,EAAG,EAAG,EAAG,EAAG,EAG7Dc,EAAmBd,EAAM,OAAsB,IAAI,EAEnDe,EAAkBf,EAAM,OAA+B,IAAI,EAE3DgB,EAAuBhB,EAAM,YACjC,MACEiB,EACAC,IACG,CAIH,GAFAZ,IAAmBW,EAAcC,CAAiB,EAE9C,EAACb,EAGL,IAAIU,EAAgB,QAAS,CAC3B,MAAMI,EAAOJ,EAAgB,QAO7B,GALEI,EAAK,IAAMD,EAAkB,GAC7BC,EAAK,IAAMD,EAAkB,GAC7BC,EAAK,QAAUD,EAAkB,OACjCC,EAAK,SAAWD,EAAkB,OAGlC,MAEJ,CAGAH,EAAgB,QAAUG,EAGtBJ,EAAiB,SACnB,OAAO,aAAaA,EAAiB,OAAO,EAI9CA,EAAiB,QAAU,OAAO,WAAW,SAAY,CACvD,GAAI,CAGF,IAFmBP,EAAY,MAAQ,YAEpB,OAAQ,CACzB,MAAMa,EAAc,MAAMC,gBAAc,CACtC,SAAUlB,EACV,UAAWe,EACX,SAAAT,EACA,MAAAC,EACA,OAAQH,EAAY,QAAU,aAC9B,QAASA,EAAY,SAAW,IAChC,KAAMA,EAAY,KAClB,KAAM,MAAA,CACP,EACDF,EAAee,CAAW,CAC5B,KAAO,CACL,MAAME,EAAqB,MAAMD,gBAAc,CAC7C,SAAUlB,EACV,UAAWe,EACX,SAAAT,EACA,MAAAC,EACA,OAAQH,EAAY,QAAU,aAC9B,QAASA,EAAY,SAAW,IAChC,KAAMA,EAAY,KAClB,KAAM,QAAA,CACP,EACDF,EAAeiB,CAAkB,CACnC,CACF,OAASC,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CACF,EAAG,GAAG,EACR,EACA,CAACpB,EAAKM,EAAUC,EAAOH,EAAaF,EAAgBC,CAAgB,CAAA,EAItE,OAAAN,EAAM,UAAU,IACP,IAAM,CACPc,EAAiB,SACnB,OAAO,aAAaA,EAAiB,OAAO,CAEhD,EACC,CAAA,CAAE,EAGHU,EAAAA,KAACC,EAAAA,KAAA,CACC,IAAAvB,EACC,GAAGS,EACJ,KAAAC,EACA,SAAAH,EACA,MAAAC,EACA,aAAcG,EACd,iBAAkBG,EAElB,SAAA,CAAAU,EAAAA,IAACC,EAAAA,MAAA,CAAa,IAAAxB,EAAU,IAAAC,EAAU,YAAAI,CAAA,CAA0B,QAC3DoB,EAAAA,KAAA,CAAA,CAAY,CAAA,CAAA,CAAA,CAGnB,CACF,EAEA7B,EAAY,YAAc,cAiFnB,SAAS8B,EAAeC,EAAgC,CAC7D,KAAM,CACJ,SAAAC,EACA,YAAAC,EACA,YAAAC,EAAc,EACd,gBAAAC,EAAkB,EAClB,YAAA3B,EACA,KAAA4B,EAAO,QAAA,EACLL,EAEE,CAAClB,EAAMC,CAAO,EAAIb,EAAM,SAC5BgC,GAAe,CAAE,EAAG,EAAG,EAAG,CAAA,CAAE,EAExB,CAACI,EAAMC,CAAO,EAAIrC,EAAM,SAASiC,CAAW,EAC5C,CAACxB,EAAU6B,CAAW,EAAItC,EAAM,SAASkC,CAAe,EACxD,CAACK,EAAcC,CAAe,EAAIxC,EAAM,SAC5C,IAAA,EAIIc,EAAmBd,EAAM,OAAsB,IAAI,EAGnDe,EAAkBf,EAAM,OAA+B,IAAI,EAE3DgB,EAAuBhB,EAAM,YACjC,MACEiB,EACAC,IACG,CAEH,GAAIH,EAAgB,QAAS,CAC3B,MAAMI,EAAOJ,EAAgB,QAO7B,GALEI,EAAK,IAAMD,EAAkB,GAC7BC,EAAK,IAAMD,EAAkB,GAC7BC,EAAK,QAAUD,EAAkB,OACjCC,EAAK,SAAWD,EAAkB,OAGlC,MAEJ,CAGAH,EAAgB,QAAUG,EAGtBJ,EAAiB,SACnB,OAAO,aAAaA,EAAiB,OAAO,EAI9CA,EAAiB,QAAU,OAAO,WAAW,SAAY,CACvD,GAAI,CACF,GAAIqB,IAAS,OAAQ,CACnB,MAAMM,EAAO,MAAMpB,gBAAc,CAC/B,SAAAU,EACA,UAAWb,EACX,SAAAT,EACA,MAAOF,GAAa,MACpB,OAAQA,GAAa,OACrB,QAASA,GAAa,QACtB,KAAMA,GAAa,KACnB,KAAM,MAAA,CACP,EACDiC,EAAgBC,CAAI,CACtB,KAAO,CACL,MAAMC,EAAS,MAAMrB,gBAAc,CACjC,SAAAU,EACA,UAAWb,EACX,SAAAT,EACA,MAAOF,GAAa,MACpB,OAAQA,GAAa,OACrB,QAASA,GAAa,QACtB,KAAMA,GAAa,KACnB,KAAM,QAAA,CACP,EACDiC,EAAgBE,CAAM,CACxB,CACF,OAASnB,EAAO,CACd,QAAQ,MAAM,gCAAiCA,CAAK,CACtD,CACF,EAAG,GAAG,CACR,EACA,CAACQ,EAAUtB,EAAUF,EAAa4B,CAAI,CAAA,EAIxCnC,EAAM,UAAU,IACP,IAAM,CACPc,EAAiB,SACnB,OAAO,aAAaA,EAAiB,OAAO,CAEhD,EACC,CAAA,CAAE,EAEL,MAAM6B,EAAQ3C,EAAM,YAAY,IAAM,CACpCa,EAAQmB,GAAe,CAAE,EAAG,EAAG,EAAG,EAAG,EACrCK,EAAQJ,CAAW,EACnBK,EAAYJ,CAAe,EAC3BM,EAAgB,IAAI,CACtB,EAAG,CAACR,EAAaC,EAAaC,CAAe,CAAC,EAE9C,MAAO,CACL,KAAAtB,EACA,KAAAwB,EACA,SAAA3B,EACA,aAAA8B,EACA,QAAA1B,EACA,QAAAwB,EACA,YAAAC,EACA,gBAAAE,EACA,qBAAAxB,EACA,MAAA2B,CAAA,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.cjs","sources":["../../../../src/components/Cropper/utils.ts"],"sourcesContent":["/**\n * Utility functions for Cropper component\n */\n\nexport interface CroppedImageOptions {\n /**\n * The source image URL or HTMLImageElement\n */\n imageSrc: string | HTMLImageElement;\n /**\n * Pixel coordinates of the cropped area\n */\n pixelCrop: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /**\n * Rotation angle in degrees\n */\n rotation?: number;\n /**\n * Shape of the crop area\n */\n shape?: \"rectangle\" | \"circle\";\n /**\n * Output image format (default: 'image/png')\n */\n format?: \"image/jpeg\" | \"image/png\" | \"image/webp\";\n /**\n * Quality of the output image (0-1, default: 0.92)\n */\n quality?: number;\n /**\n * Flip the image horizontally\n */\n flip?: {\n horizontal?: boolean;\n vertical?: boolean;\n };\n /**\n * Output type: 'base64' (data URL) or 'blob' (Blob object)\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Creates a cropped image from the given parameters and returns it as a base64 data URL or Blob\n *\n * @param options - Options for creating the cropped image\n * @returns Promise that resolves to a base64 data URL string or Blob based on the type option\n *\n * @example\n * ```tsx\n * // Get base64 data URL (default)\n * const croppedImageBase64 = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * rotation: 45,\n * shape: 'circle',\n * format: 'image/png',\n * quality: 0.95\n * });\n *\n * // Get Blob\n * const croppedImageBlob = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * type: 'blob'\n * });\n * ```\n */\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type: \"blob\" }\n): Promise<Blob>;\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type?: \"base64\" }\n): Promise<string>;\nexport async function getCroppedImg(\n options: CroppedImageOptions\n): Promise<string | Blob> {\n const {\n imageSrc,\n pixelCrop,\n rotation = 0,\n shape = \"rectangle\",\n format = \"image/png\",\n quality = 0.92,\n flip = {},\n type = \"base64\",\n } = options;\n\n // Load image if URL is provided\n let image: HTMLImageElement;\n if (typeof imageSrc === \"string\") {\n image = await loadImage(imageSrc);\n } else {\n image = imageSrc;\n }\n\n const rotRad = getRadianAngle(rotation);\n const sin = Math.abs(Math.sin(rotRad));\n const cos = Math.abs(Math.cos(rotRad));\n\n // Calculate bounding box of rotated image\n const bBoxWidth = image.width * cos + image.height * sin;\n const bBoxHeight = image.width * sin + image.height * cos;\n\n // Step 1: Create a canvas for the rotated full image\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\");\n\n if (!tempCtx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n // Set temp canvas to bounding box size\n tempCanvas.width = bBoxWidth;\n tempCanvas.height = bBoxHeight;\n\n // Translate to center\n tempCtx.translate(bBoxWidth / 2, bBoxHeight / 2);\n\n // Rotate\n tempCtx.rotate(rotRad);\n\n // Apply flip if needed\n if (flip.horizontal || flip.vertical) {\n const scaleX = flip.horizontal ? -1 : 1;\n const scaleY = flip.vertical ? -1 : 1;\n tempCtx.scale(scaleX, scaleY);\n }\n\n // Draw image centered\n tempCtx.drawImage(\n image,\n -image.width / 2,\n -image.height / 2,\n image.width,\n image.height\n );\n\n // Step 2: Create output canvas and crop from temp canvas\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: true });\n\n if (!ctx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n\n // Clear canvas to ensure transparency (important for PNG output)\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Handle overflow: calculate the valid area to draw\n // When pixelCrop.x or y is negative, it means the crop area extends beyond the image\n const sourceX = Math.max(0, pixelCrop.x);\n const sourceY = Math.max(0, pixelCrop.y);\n\n // Calculate how much of the crop area is actually within the image bounds\n const sourceWidth = Math.min(\n pixelCrop.width - Math.max(0, -pixelCrop.x), // Reduce width if crop starts before image\n bBoxWidth - sourceX // Don't exceed image right edge\n );\n const sourceHeight = Math.min(\n pixelCrop.height - Math.max(0, -pixelCrop.y), // Reduce height if crop starts before image\n bBoxHeight - sourceY // Don't exceed image bottom edge\n );\n\n // Calculate where to place the cropped portion on the output canvas\n // If crop area extends beyond image (negative x/y), offset the destination\n const destX = Math.max(0, -pixelCrop.x);\n const destY = Math.max(0, -pixelCrop.y);\n\n // Only draw if there's a valid area to draw\n if (sourceWidth > 0 && sourceHeight > 0) {\n ctx.drawImage(\n tempCanvas,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n destX,\n destY,\n sourceWidth,\n sourceHeight\n );\n }\n\n // Apply circular mask if shape is circle\n if (shape === \"circle\") {\n ctx.globalCompositeOperation = \"destination-in\";\n ctx.beginPath();\n ctx.arc(\n canvas.width / 2,\n canvas.height / 2,\n Math.min(canvas.width, canvas.height) / 2,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n\n // Return as blob or base64 based on type\n if (type === \"blob\") {\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n format,\n quality\n );\n });\n }\n\n // Convert to base64\n return canvas.toDataURL(format, quality);\n}\n\n/**\n * Load an image from URL\n */\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n\n image.onload = () => resolve(image);\n image.onerror = (error) =>\n reject(new Error(`Failed to load image: ${error}`));\n\n image.src = url;\n });\n}\n\n/**\n * Convert degrees to radians\n */\nfunction getRadianAngle(degreeValue: number): number {\n return (degreeValue * Math.PI) / 180;\n}\n\n/**\n * Calculate the rotated size of a rectangle\n *\n * @param width - Original width\n * @param height - Original height\n * @param rotation - Rotation angle in degrees\n * @returns Rotated size dimensions\n */\nexport function rotateSize(\n width: number,\n height: number,\n rotation: number\n): { width: number; height: number } {\n const rotRad = getRadianAngle(rotation);\n const cosRot = Math.cos(rotRad);\n const sinRot = Math.sin(rotRad);\n\n return {\n width: Math.abs(cosRot * width) + Math.abs(sinRot * height),\n height: Math.abs(sinRot * width) + Math.abs(cosRot * height),\n };\n}\n\n/**\n * Download a base64 image\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename (default: 'cropped-image.jpg')\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * downloadImage(croppedImage, 'my-cropped-image.png');\n * ```\n */\nexport function downloadImage(\n base64Data: string,\n filename: string = \"cropped-image.jpg\"\n): void {\n const link = document.createElement(\"a\");\n link.href = base64Data;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\n/**\n * Convert base64 data URL to Blob\n *\n * @param base64Data - Base64 data URL\n * @returns Blob object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const blob = base64ToBlob(croppedImage);\n * ```\n */\nexport function base64ToBlob(base64Data: string): Blob {\n const arr = base64Data.split(\",\");\n const mimeMatch = arr[0]?.match(/:(.*?);/);\n const mime = mimeMatch ? mimeMatch[1] : \"image/jpeg\";\n const bstr = atob(arr[1] ?? \"\");\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\n/**\n * Convert base64 data URL to File\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename\n * @returns File object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const file = base64ToFile(croppedImage, 'cropped-image.jpg');\n * ```\n */\nexport function base64ToFile(base64Data: string, filename: string): File {\n const blob = base64ToBlob(base64Data);\n return new File([blob], filename, { type: blob.type });\n}\n"],"names":["getCroppedImg","options","imageSrc","pixelCrop","rotation","shape","format","quality","flip","type","image","loadImage","rotRad","getRadianAngle","sin","cos","bBoxWidth","bBoxHeight","tempCanvas","tempCtx","scaleX","scaleY","canvas","ctx","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","resolve","reject","blob","url","error","degreeValue","rotateSize","width","height","cosRot","sinRot","downloadImage","base64Data","filename","link","base64ToBlob","arr","mimeMatch","mime","bstr","n","u8arr","base64ToFile"],"mappings":"gFA+EA,eAAsBA,EACpBC,EACwB,CACxB,KAAM,CACJ,SAAAC,EACA,UAAAC,EACA,SAAAC,EAAW,EACX,MAAAC,EAAQ,YACR,OAAAC,EAAS,YACT,QAAAC,EAAU,IACV,KAAAC,EAAO,CAAA,EACP,KAAAC,EAAO,QAAA,EACLR,EAGJ,IAAIS,EACA,OAAOR,GAAa,SACtBQ,EAAQ,MAAMC,EAAUT,CAAQ,EAEhCQ,EAAQR,EAGV,MAAMU,EAASC,EAAeT,CAAQ,EAChCU,EAAM,KAAK,IAAI,KAAK,IAAIF,CAAM,CAAC,EAC/BG,EAAM,KAAK,IAAI,KAAK,IAAIH,CAAM,CAAC,EAG/BI,EAAYN,EAAM,MAAQK,EAAML,EAAM,OAASI,EAC/CG,EAAaP,EAAM,MAAQI,EAAMJ,EAAM,OAASK,EAGhDG,EAAa,SAAS,cAAc,QAAQ,EAC5CC,EAAUD,EAAW,WAAW,IAAI,EAE1C,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iCAAiC,EAcnD,GAVAD,EAAW,MAAQF,EACnBE,EAAW,OAASD,EAGpBE,EAAQ,UAAUH,EAAY,EAAGC,EAAa,CAAC,EAG/CE,EAAQ,OAAOP,CAAM,EAGjBJ,EAAK,YAAcA,EAAK,SAAU,CACpC,MAAMY,EAASZ,EAAK,WAAa,GAAK,EAChCa,EAASb,EAAK,SAAW,GAAK,EACpCW,EAAQ,MAAMC,EAAQC,CAAM,CAC9B,CAGAF,EAAQ,UACNT,EACA,CAACA,EAAM,MAAQ,EACf,CAACA,EAAM,OAAS,EAChBA,EAAM,MACNA,EAAM,MAAA,EAIR,MAAMY,EAAS,SAAS,cAAc,QAAQ,EACxCC,EAAMD,EAAO,WAAW,KAAM,CAAE,MAAO,GAAM,EAEnD,GAAI,CAACC,EACH,MAAM,IAAI,MAAM,iCAAiC,EAGnDD,EAAO,MAAQnB,EAAU,MACzBmB,EAAO,OAASnB,EAAU,OAG1BoB,EAAI,UAAU,EAAG,EAAGD,EAAO,MAAOA,EAAO,MAAM,EAI/C,MAAME,EAAU,KAAK,IAAI,EAAGrB,EAAU,CAAC,EACjCsB,EAAU,KAAK,IAAI,EAAGtB,EAAU,CAAC,EAGjCuB,EAAc,KAAK,IACvBvB,EAAU,MAAQ,KAAK,IAAI,EAAG,CAACA,EAAU,CAAC,EAC1Ca,EAAYQ,CAAA,EAERG,EAAe,KAAK,IACxBxB,EAAU,OAAS,KAAK,IAAI,EAAG,CAACA,EAAU,CAAC,EAC3Cc,EAAaQ,CAAA,EAKTG,EAAQ,KAAK,IAAI,EAAG,CAACzB,EAAU,CAAC,EAChC0B,EAAQ,KAAK,IAAI,EAAG,CAAC1B,EAAU,CAAC,EAgCtC,OA7BIuB,EAAc,GAAKC,EAAe,GACpCJ,EAAI,UACFL,EACAM,EACAC,EACAC,EACAC,EACAC,EACAC,EACAH,EACAC,CAAA,EAKAtB,IAAU,WACZkB,EAAI,yBAA2B,iBAC/BA,EAAI,UAAA,EACJA,EAAI,IACFD,EAAO,MAAQ,EACfA,EAAO,OAAS,EAChB,KAAK,IAAIA,EAAO,MAAOA,EAAO,MAAM,EAAI,EACxC,EACA,KAAK,GAAK,CAAA,EAEZC,EAAI,KAAA,GAIFd,IAAS,OACJ,IAAI,QAAc,CAACqB,EAASC,IAAW,CAC5CT,EAAO,OACJU,GAAS,CACJA,EACFF,EAAQE,CAAI,EAEZD,EAAO,IAAI,MAAM,mCAAmC,CAAC,CAEzD,EACAzB,EACAC,CAAA,CAEJ,CAAC,EAIIe,EAAO,UAAUhB,EAAQC,CAAO,CACzC,CAKA,SAASI,EAAUsB,EAAwC,CACzD,OAAO,IAAI,QAAQ,CAACH,EAASC,IAAW,CACtC,MAAMrB,EAAQ,IAAI,MAClBA,EAAM,YAAc,YAEpBA,EAAM,OAAS,IAAMoB,EAAQpB,CAAK,EAClCA,EAAM,QAAWwB,GACfH,EAAO,IAAI,MAAM,yBAAyBG,CAAK,EAAE,CAAC,EAEpDxB,EAAM,IAAMuB,CACd,CAAC,CACH,CAKA,SAASpB,EAAesB,EAA6B,CACnD,OAAQA,EAAc,KAAK,GAAM,GACnC,CAUO,SAASC,EACdC,EACAC,EACAlC,EACmC,CACnC,MAAMQ,EAASC,EAAeT,CAAQ,EAChCmC,EAAS,KAAK,IAAI3B,CAAM,EACxB4B,EAAS,KAAK,IAAI5B,CAAM,EAE9B,MAAO,CACL,MAAO,KAAK,IAAI2B,EAASF,CAAK,EAAI,KAAK,IAAIG,EAASF,CAAM,EAC1D,OAAQ,KAAK,IAAIE,EAASH,CAAK,EAAI,KAAK,IAAIE,EAASD,CAAM,CAAA,CAE/D,CAcO,SAASG,EACdC,EACAC,EAAmB,oBACb,CACN,MAAMC,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOF,EACZE,EAAK,SAAWD,EAChB,SAAS,KAAK,YAAYC,CAAI,EAC9BA,EAAK,MAAA,EACL,SAAS,KAAK,YAAYA,CAAI,CAChC,CAcO,SAASC,EAAaH,EAA0B,CACrD,MAAMI,EAAMJ,EAAW,MAAM,GAAG,EAC1BK,EAAYD,EAAI,CAAC,GAAG,MAAM,SAAS,EACnCE,EAAOD,EAAYA,EAAU,CAAC,EAAI,aAClCE,EAAO,KAAKH,EAAI,CAAC,GAAK,EAAE,EAC9B,IAAII,EAAID,EAAK,OACb,MAAME,EAAQ,IAAI,WAAWD,CAAC,EAE9B,KAAOA,KACLC,EAAMD,CAAC,EAAID,EAAK,WAAWC,CAAC,EAG9B,OAAO,IAAI,KAAK,CAACC,CAAK,EAAG,CAAE,KAAMH,EAAM,CACzC,CAeO,SAASI,EAAaV,EAAoBC,EAAwB,CACvE,MAAMX,EAAOa,EAAaH,CAAU,EACpC,OAAO,IAAI,KAAK,CAACV,CAAI,EAAGW,EAAU,CAAE,KAAMX,EAAK,KAAM,CACvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DatePicker.cjs","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n CalendarDayButton as SCalendarDayButton,\n type CalendarDayButtonProps as SCalendarDayButtonProps,\n Calendar,\n type CalendarProps,\n type CalendarColor,\n} from \"@dsui/ui/components/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Input, type InputProps } from \"../Input\";\nimport { Button } from \"../Button\";\nimport {\n TimePicker,\n type TimePickerMode,\n type DisabledTimeRange,\n} from \"./TimePicker\";\nimport { CalendarIcon } from \"lucide-react\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { isMobile } from \"react-device-detect\";\nimport { format as dfFormat, parse, isValid, type Locale } from \"date-fns\";\nimport { vi, enUS } from \"date-fns/locale\";\nimport { DATE_FORMAT } from \"@/constants/common\";\n\nfunction formatDate(\n date: Date | undefined,\n outputFormat: string = DATE_FORMAT,\n locale?: Locale\n) {\n if (!date) return \"\";\n\n return dfFormat(date, outputFormat, locale ? { locale } : undefined);\n}\n\nconst parseDate = (\n str: string,\n inputFormat: string = DATE_FORMAT\n): Date | undefined => {\n const date = parse(str, inputFormat, new Date());\n return isValid(date) ? date : undefined;\n};\n\nfunction generateMaskFromFormat(format: string): string {\n return format\n .replace(/dd|MM|yyyy/g, (match) => {\n switch (match) {\n case \"dd\":\n case \"MM\":\n return \"99\";\n case \"yyyy\":\n return \"9999\";\n default:\n return match;\n }\n })\n .replace(/d|M|y/g, (match) => {\n switch (match) {\n case \"d\":\n case \"M\":\n return \"9\";\n case \"y\":\n return \"9\";\n default:\n return match;\n }\n });\n}\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type DatePickerRenderProps = {\n value: string;\n date?: Date;\n onSelect: (date?: Date) => void;\n onChange: (text?: string) => void;\n};\n\nexport type DatePickerProps = Omit<\n InputProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"mask\" | \"children\"\n> & {\n value?: string;\n onChange?: (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n date?: Date\n ) => void;\n onSelect?: (date?: Date, value?: string) => void;\n calendarClassName?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n size?: VariantProps<typeof Input>[\"size\"];\n format?: FormatType;\n language?: \"vi\" | \"en\";\n mask?: boolean | string;\n closeOnSelect?: boolean;\n calendarConfig?: CalendarProps;\n desktopMode?: \"popover\" | \"drawer\";\n mobileMode?: \"popover\" | \"drawer\";\n showOutsideDays?: boolean;\n children?: (props: DatePickerRenderProps) => React.ReactNode;\n showTime?: boolean;\n timeFormat?: \"HH:mm\" | \"HH:mm:ss\";\n hideDate?: boolean;\n numberOfMonths?: number;\n variant?: \"default\" | \"rounded\";\n color?: CalendarColor;\n\n // TimePicker configuration options\n timePickerMode?: TimePickerMode; // Display mode: 'wheel' (default), 'select', 'compact'\n hourInterval?: number; // Hour interval (e.g., 1, 2, 3) - defaults to 1\n minuteInterval?: number; // Minute interval (e.g., 5, 10, 15, 30) - defaults to 1\n secondInterval?: number; // Second interval (e.g., 5, 10, 15, 30) - defaults to 1\n disabledTimes?: string[]; // Array of disabled times in \"HH:mm\" or \"HH:mm:ss\" format\n disabledTimeRanges?: DisabledTimeRange[]; // Array of disabled time ranges\n showNowButton?: boolean; // Show \"Now\" button to select current time\n nowButtonLabel?: string; // Label for \"Now\" button (defaults to \"Now\")\n timePickerLabel?:\n | boolean\n | { hours?: string; minutes?: string; seconds?: string };\n openOnFocus?: boolean; // Auto open datepicker when input is focused (default: true)\n};\n\nexport function DatePicker({\n value,\n onChange,\n onSelect,\n calendarClassName,\n side = \"bottom\",\n align = \"end\",\n format = \"dd/MM/yyyy\",\n language = \"vi\",\n mask,\n closeOnSelect = false,\n calendarConfig,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n showOutsideDays = true,\n children,\n showTime = false,\n timeFormat = \"HH:mm\",\n hideDate = false,\n numberOfMonths = 1,\n variant = \"default\",\n color = \"primary\",\n // TimePicker props\n timePickerMode = \"wheel\",\n hourInterval = 1,\n minuteInterval = 1,\n secondInterval = 1,\n disabledTimes,\n disabledTimeRanges,\n showNowButton = false,\n nowButtonLabel = \"Now\",\n timePickerLabel,\n openOnFocus = true,\n ...props\n}: DatePickerProps) {\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else {\n inputFormat = format.input;\n outputFormat = format.output;\n }\n\n // Determine the mask to use\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n // If mask is false or undefined, maskToUse remains undefined\n\n // Parse initial value with correct format\n // - hideDate + showTime: time only (e.g., \"HH:mm\")\n // - showTime: date + time (e.g., \"dd/MM/yyyy HH:mm\")\n // - default: date only (e.g., \"dd/MM/yyyy\")\n const fullFormat =\n hideDate && showTime\n ? timeFormat\n : showTime\n ? `${inputFormat} ${timeFormat}`\n : inputFormat;\n\n const initialDate = value ? parseDate(value, fullFormat) : undefined;\n\n const [open, setOpen] = React.useState(false);\n const [date, setDate] = React.useState<Date | undefined>(initialDate);\n const [month, setMonth] = React.useState<Date | undefined>(initialDate);\n const [inputValue, setInputValue] = React.useState(value || \"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const isUserTyping = React.useRef(false);\n\n const _locale: Locale = calendarConfig?.locale\n ? (calendarConfig?.locale as Locale)\n : language === \"en\"\n ? enUS\n : vi;\n\n const mode = isMobile ? mobileMode : desktopMode;\n\n // Sync inputValue when value prop changes from outside\n React.useEffect(() => {\n if (value !== inputValue && !isUserTyping.current) {\n setInputValue(value || \"\");\n const parsedDate = value ? parseDate(value, fullFormat) : undefined;\n if (parsedDate) {\n setDate(parsedDate);\n setMonth(parsedDate);\n } else if (!value) {\n // Clear states if value is empty\n setDate(undefined);\n setMonth(undefined);\n }\n }\n }, [value, inputValue, fullFormat]);\n\n // Helper to format date-time based on showTime and timeFormat\n const formatDateTimeValue = (d: Date | undefined): string => {\n if (!d) return \"\";\n let result = formatDate(d, outputFormat, _locale);\n if (showTime) {\n result += ` ${dfFormat(d, timeFormat)}`;\n }\n return result;\n };\n\n // Helper functions for render props\n const handleSelectForRenderProp = (date?: Date) => {\n setDate(date);\n setInputValue(formatDateTimeValue(date));\n onSelect?.(date, formatDateTimeValue(date));\n };\n\n const handleChangeForRenderProp = (text?: string) => {\n if (!text) {\n setInputValue(\"\");\n setDate(undefined);\n onSelect?.(undefined, undefined);\n return;\n }\n setInputValue(text);\n const parsedDate = parseDate(text, inputFormat);\n if (parsedDate) {\n setDate(parsedDate);\n setMonth(parsedDate);\n onSelect?.(parsedDate, formatDateTimeValue(parsedDate));\n } else {\n setDate(undefined);\n onSelect?.(undefined, undefined);\n }\n };\n\n const handleTimeChange = (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n newDate?: Date\n ) => {\n if (!newDate) {\n // Handle clear/invalid time\n onChange?.(event, value, undefined);\n return;\n }\n\n // Merge: keep date (year, month, day) from Calendar, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(date || new Date());\n mergedDate.setHours(\n newDate.getHours(),\n newDate.getMinutes(),\n newDate.getSeconds(),\n 0\n );\n\n setDate(mergedDate);\n setInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(mergedDate, formatDateTimeValue(mergedDate));\n onChange?.(event, formatDateTimeValue(mergedDate), mergedDate);\n };\n\n // Determine trigger component\n const triggerComponent = children ? (\n children({\n value: inputValue,\n date,\n onSelect: handleSelectForRenderProp,\n onChange: handleChangeForRenderProp,\n })\n ) : (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n size={props.size}\n >\n <CalendarIcon\n className={cn({\n \"ds:size-3\": props.size === \"xs\" || props.size === \"sm\",\n \"ds:size-3.5\": !props.size || props.size === \"normal\",\n \"ds:size-4\": props.size === \"lg\" || props.size === \"xl\",\n })}\n />\n <span className=\"ds:sr-only\">Select date</span>\n </Button>\n );\n\n const calendarSelection = (\n <div\n className={cn(\n \"ds:flex ds:items-stretch ds:mx-auto ds:w-full\",\n showTime && !hideDate ? \"ds:gap-0 ds:md:max-w-lg\" : \"\",\n // mode === \"drawer\" ? \"mb-6\" : \"\",\n isMobile ? \"ds:max-w-md ds:md:max-w-md ds:lg:max-w-lg\" : \"\"\n )}\n >\n {!hideDate && (\n <Calendar\n {...calendarConfig}\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={isMobile ? 1 : numberOfMonths || 1}\n variant={variant}\n color={color}\n onSelect={(selectedDate) => {\n // Preserve time from current date when selecting new date\n let newDate = selectedDate;\n if (selectedDate && date && showTime) {\n newDate = new Date(selectedDate);\n newDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds()\n );\n }\n setDate(newDate);\n setInputValue(formatDateTimeValue(newDate));\n onSelect?.(newDate, formatDateTimeValue(newDate));\n if (closeOnSelect && !showTime) setOpen(false);\n }}\n locale={_locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(_locale.code, { month: \"short\" }),\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n \"ds:my-auto ds:bg-transparent ds:mx-auto\",\n {\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),52px)] ds:mb-8 ds:bg-transparent\":\n (isMobile && !showTime) || desktopMode === \"drawer\",\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),34px)]\":\n !isMobile && desktopMode !== \"drawer\",\n \"ds:w-full\": mode === \"drawer\" && showTime,\n },\n calendarClassName\n )}\n />\n )}\n {showTime && (\n <div className=\"ds:border-l ds:border-border\">\n <TimePicker\n value={date ? dfFormat(date, timeFormat) : undefined}\n format={timeFormat}\n onChange={handleTimeChange}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n mode={timePickerMode}\n hourInterval={hourInterval}\n minuteInterval={minuteInterval}\n secondInterval={secondInterval}\n disabledTimes={disabledTimes}\n disabledTimeRanges={disabledTimeRanges}\n showNowButton={showNowButton}\n nowButtonLabel={nowButtonLabel}\n timeLabel={timePickerLabel}\n standalone={false}\n color={color}\n isOpen={open}\n />\n </div>\n )}\n </div>\n );\n\n const popPicker = (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild disabled={props.disabled}>\n {triggerComponent}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n side={side}\n align={align}\n >\n {calendarSelection}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{triggerComponent}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select date</DrawerTitle>\n <DrawerDescription>Set date</DrawerDescription>\n </DrawerHeader>\n {calendarSelection}\n </DrawerContent>\n </Drawer>\n );\n\n // If children is provided, use render prop pattern with picker\n if (children) {\n return mode === \"drawer\" ? drawPicker : popPicker;\n }\n\n // Default input rendering\n return (\n <Input\n {...props}\n ref={inputRef}\n type=\"text\"\n clearable\n value={inputValue}\n mask={maskToUse}\n onChange={(e) => {\n isUserTyping.current = true;\n setInputValue(e.target.value);\n const date = parseDate(e.target.value, inputFormat);\n if (date) {\n setDate(date);\n setMonth(date);\n onSelect?.(date, formatDateTimeValue(date));\n onChange?.(e, formatDateTimeValue(date), date);\n } else {\n onSelect?.(undefined, undefined);\n onChange?.(e, undefined, undefined);\n }\n }}\n onFocus={(e) => {\n // Don't auto-open if mask is enabled - user wants to type directly\n if (openOnFocus && !open && !maskToUse) {\n setOpen(true);\n }\n props.onFocus?.(e);\n }}\n onBlur={(e) => {\n // Don't clear value when picker is open - user might be interacting with it\n // The onBlur fires when focus moves to the picker\n setTimeout(() => {\n isUserTyping.current = false;\n // Only validate and clear if picker is closed\n if (!open) {\n const parsedDate = parseDate(inputValue, inputFormat);\n if (!parsedDate && inputValue) {\n setInputValue(\"\");\n setDate(undefined);\n setMonth(undefined);\n onSelect?.(undefined, undefined);\n }\n }\n }, 150);\n props.onBlur?.(e);\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n props.onKeyDown?.(e);\n }}\n suffixIcon={mode === \"drawer\" ? drawPicker : popPicker}\n />\n );\n}\n"],"names":["formatDate","date","outputFormat","DATE_FORMAT","locale","dfFormat","parseDate","str","inputFormat","parse","isValid","generateMaskFromFormat","format","match","DatePicker","value","onChange","onSelect","calendarClassName","side","align","language","mask","closeOnSelect","calendarConfig","desktopMode","mobileMode","showOutsideDays","children","showTime","timeFormat","hideDate","numberOfMonths","variant","color","timePickerMode","hourInterval","minuteInterval","secondInterval","disabledTimes","disabledTimeRanges","showNowButton","nowButtonLabel","timePickerLabel","openOnFocus","props","maskToUse","fullFormat","initialDate","open","setOpen","React","setDate","month","setMonth","inputValue","setInputValue","inputRef","isUserTyping","_locale","enUS","vi","mode","isMobile","parsedDate","formatDateTimeValue","d","result","handleSelectForRenderProp","handleChangeForRenderProp","text","handleTimeChange","event","newDate","mergedDate","triggerComponent","jsxs","Button","jsx","CalendarIcon","cn","calendarSelection","Calendar","selectedDate","TimePicker","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","Input"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RangePicker.cjs","sources":["../../../../src/components/DatePicker/RangePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n CalendarDayButton as SCalendarDayButton,\n type CalendarDayButtonProps as SCalendarDayButtonProps,\n Calendar,\n type CalendarColor,\n} from \"@dsui/ui/components/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Input, type InputProps } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { TimePicker } from \"./TimePicker\";\nimport { type DatePickerProps } from \"./DatePicker\";\nimport { CalendarIcon, MoveRight } from \"lucide-react\";\nimport { isMobile } from \"react-device-detect\";\nimport { format as dfFormat, parse, isValid, type Locale } from \"date-fns\";\nimport { vi, enUS } from \"date-fns/locale\";\nimport { DATE_FORMAT } from \"@/constants/common\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\n\nexport type DateRange = {\n from?: Date | undefined;\n to?: Date | undefined;\n};\n\nexport type DateRangeText = { from?: string; to?: string } | null;\n\nfunction formatDate(\n date: Date | undefined,\n outputFormat: string = DATE_FORMAT,\n locale?: Locale\n) {\n if (!date) return \"\";\n\n return dfFormat(date, outputFormat, locale ? { locale } : undefined);\n}\n\nconst parseDate = (\n str: string,\n inputFormat: string = DATE_FORMAT\n): Date | undefined => {\n const date = parse(str, inputFormat, new Date());\n return isValid(date) ? date : undefined;\n};\n\nfunction generateMaskFromFormat(format: string): string {\n return format\n .replace(/dd|MM|yyyy/g, (match) => {\n switch (match) {\n case \"dd\":\n case \"MM\":\n return \"99\";\n case \"yyyy\":\n return \"9999\";\n default:\n return match;\n }\n })\n .replace(/d|M|y/g, (match) => {\n switch (match) {\n case \"d\":\n case \"M\":\n return \"9\";\n case \"y\":\n return \"9\";\n default:\n return match;\n }\n });\n}\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type RangePickerRenderProps = {\n fromValue: string;\n toValue: string;\n range?: DateRange;\n onSelect: (range?: DateRange) => void;\n onFromChange: (text: string) => void;\n onToChange: (text: string) => void;\n};\n\nexport type TimeConfig = Omit<\n React.ComponentProps<typeof TimePicker>,\n \"value\" | \"onSelect\" | \"format\"\n>;\n\nexport type RangePickerProps = Omit<\n DatePickerProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"children\" | \"label\" | \"placeholder\"\n> & {\n label?: string | DateRangeText;\n placeholder?: string | DateRangeText;\n value?: DateRangeText;\n onChange?: (value?: DateRange, text?: DateRangeText) => void;\n onSelect?: (value?: DateRange, text?: DateRangeText) => void;\n children?: (props: RangePickerRenderProps) => React.ReactNode;\n separator?: React.ReactNode;\n timeConfig?: [TimeConfig, TimeConfig];\n numberOfMonths?: number;\n variant?: \"default\" | \"rounded\";\n color?: CalendarColor;\n};\n\nexport function RangePicker({\n label,\n value,\n placeholder,\n onChange,\n onSelect,\n calendarClassName,\n side = \"bottom\",\n align = \"end\",\n format = \"dd/MM/yyyy\",\n language = \"vi\",\n mask,\n closeOnSelect = false,\n showOutsideDays = true,\n calendarConfig,\n timeConfig,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n children,\n separator = <MoveRight className=\"ds:size-5\" />,\n showTime = false,\n timeFormat = \"HH:mm\",\n hideDate = false,\n numberOfMonths = 1,\n variant = \"default\",\n color = \"primary\",\n ...props\n}: RangePickerProps) {\n const inputId = React.useId();\n\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else {\n inputFormat = format.input;\n outputFormat = format.output;\n }\n\n // Determine the mask to use\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n\n const initialFromDate = value?.from\n ? parseDate(value.from, inputFormat)\n : undefined;\n const initialToDate = value?.to\n ? parseDate(value.to, inputFormat)\n : undefined;\n const initialRange: DateRange = {\n from: initialFromDate,\n to: initialToDate,\n };\n\n const [open, setOpen] = React.useState(false);\n const [range, setRange] = React.useState<DateRange | undefined>(initialRange);\n const [month, setMonth] = React.useState<Date | undefined>(\n initialFromDate || new Date()\n );\n const [fromInputValue, setFromInputValue] = React.useState(value?.from || \"\");\n const [toInputValue, setToInputValue] = React.useState(value?.to || \"\");\n const [fromTime, setFromTime] = React.useState<Date | undefined>(undefined);\n const [toTime, setToTime] = React.useState<Date | undefined>(undefined);\n const fromInputRef = React.useRef<HTMLInputElement>(null);\n const toInputRef = React.useRef<HTMLInputElement>(null);\n\n const shouldFloat = !!(fromInputValue.trim() || toInputValue.trim());\n\n const _locale: Locale = calendarConfig?.locale\n ? (calendarConfig?.locale as Locale)\n : language === \"en\"\n ? enUS\n : vi;\n\n // Helper to format date-time based on showTime and timeFormat\n const formatDateTimeValue = (d: Date | undefined): string => {\n if (!d) return \"\";\n let result = formatDate(d, outputFormat, _locale);\n if (showTime) {\n result += ` ${dfFormat(d, timeFormat)}`;\n }\n return result;\n };\n\n // Helper functions for render props\n const handleSelectForRenderProp = (range?: DateRange) => {\n setRange(range);\n const fromFormatted = formatDateTimeValue(range?.from);\n const toFormatted = formatDateTimeValue(range?.to);\n setFromInputValue(fromFormatted);\n setToInputValue(toFormatted);\n onSelect?.(range, { from: fromFormatted, to: toFormatted });\n };\n\n const handleFromChangeForRenderProp = (text: string) => {\n setFromInputValue(text);\n\n // If the input is cleared (empty), clear both fields\n if (text.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let parsedDate: Date | undefined;\n if (showTime) {\n parsedDate = parseDate(text, `${inputFormat} ${timeFormat}`);\n } else {\n parsedDate = parseDate(text, inputFormat);\n }\n const newRange: DateRange = { from: parsedDate, to: range?.to };\n if (parsedDate) {\n setRange(newRange);\n setMonth(parsedDate);\n setFromTime(parsedDate);\n onSelect?.(newRange, {\n from: formatDateTimeValue(parsedDate),\n to: formatDateTimeValue(range?.to),\n });\n } else {\n setRange(newRange);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(range?.to),\n });\n }\n };\n\n const handleToChangeForRenderProp = (text: string) => {\n setToInputValue(text);\n\n // If the input is cleared (empty), clear both fields\n if (text.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let parsedDate: Date | undefined;\n if (showTime) {\n parsedDate = parseDate(text, `${inputFormat} ${timeFormat}`);\n } else {\n parsedDate = parseDate(text, inputFormat);\n }\n const newRange: DateRange = {\n from: range?.from,\n to: parsedDate,\n };\n if (parsedDate) {\n setRange(newRange);\n setToTime(parsedDate);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(parsedDate),\n });\n } else {\n setRange(newRange);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: undefined,\n });\n }\n };\n\n const handleTimeChangeFrom = (date?: Date) => {\n if (date) {\n setFromTime(date);\n // Merge: keep date (year, month, day) from existing range.from, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(range?.from || new Date());\n mergedDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n 0\n );\n\n const newRange: DateRange = {\n from: mergedDate,\n to: range?.to,\n };\n setRange(newRange);\n setFromInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(newRange, {\n from: formatDateTimeValue(mergedDate),\n to: formatDateTimeValue(range?.to),\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(mergedDate),\n to: formatDateTimeValue(range?.to),\n });\n }\n };\n\n const handleTimeChangeTo = (date?: Date) => {\n if (date) {\n setToTime(date);\n // Merge: keep date (year, month, day) from existing range.to, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(range?.to || new Date());\n mergedDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n 0\n );\n\n const newRange: DateRange = {\n from: range?.from,\n to: mergedDate,\n };\n setRange(newRange);\n setToInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(mergedDate),\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(mergedDate),\n });\n }\n };\n\n // Determine trigger component\n const triggerComponent = children ? (\n children({\n fromValue: fromInputValue,\n toValue: toInputValue,\n range,\n onSelect: handleSelectForRenderProp,\n onFromChange: handleFromChangeForRenderProp,\n onToChange: handleToChangeForRenderProp,\n })\n ) : (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n size={props?.size}\n >\n <CalendarIcon\n className={cn({\n \"ds:size-3\": props.size === \"xs\" || props.size === \"sm\",\n \"ds:size-3.5\": !props.size || props.size === \"normal\",\n \"ds:size-4\": props.size === \"lg\" || props.size === \"xl\",\n })}\n />\n <span className=\"ds:sr-only\">Select date range</span>\n </Button>\n );\n\n const calendarSelection = (\n <div\n className={cn(\"ds:flex ds:items-stretch\", showTime && !hideDate ? \"ds:gap-0\" : \"\")}\n >\n {!hideDate && (\n <Calendar\n {...calendarConfig}\n mode=\"range\"\n selected={range as any}\n captionLayout=\"dropdown\"\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={isMobile ? 1 : numberOfMonths || 1}\n variant={variant}\n color={color}\n onSelect={(selectedRange) => {\n // Preserve time from TimePicker values if showTime is enabled\n let preservedRange = selectedRange;\n if (showTime) {\n // Get current time from TimePicker state\n const fromTimeObj = fromTime;\n const toTimeObj = toTime;\n\n preservedRange = {\n from: selectedRange?.from\n ? new Date(\n selectedRange.from.getFullYear(),\n selectedRange.from.getMonth(),\n selectedRange.from.getDate(),\n fromTimeObj?.getHours() || 0,\n fromTimeObj?.getMinutes() || 0,\n fromTimeObj?.getSeconds() || 0\n )\n : undefined,\n to: selectedRange?.to\n ? new Date(\n selectedRange.to.getFullYear(),\n selectedRange.to.getMonth(),\n selectedRange.to.getDate(),\n toTimeObj?.getHours() || 0,\n toTimeObj?.getMinutes() || 0,\n toTimeObj?.getSeconds() || 0\n )\n : undefined,\n };\n }\n setRange(preservedRange);\n const fromFormatted = formatDateTimeValue(preservedRange?.from);\n const toFormatted = formatDateTimeValue(preservedRange?.to);\n setFromInputValue(fromFormatted);\n setToInputValue(toFormatted);\n onSelect?.(preservedRange, {\n from: fromFormatted,\n to: toFormatted,\n });\n onChange?.(preservedRange, {\n from: fromFormatted,\n to: toFormatted,\n });\n if (\n closeOnSelect &&\n preservedRange?.from &&\n preservedRange?.to &&\n !showTime\n ) {\n setOpen(false);\n }\n }}\n locale={_locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(_locale.code, { month: \"short\" }),\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n \"ds:mx-auto\",\n {\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),52px)] ds:mb-8 ds:bg-transparent\":\n isMobile || desktopMode === \"drawer\",\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),34px)]\":\n !isMobile && desktopMode !== \"drawer\",\n },\n calendarClassName\n )}\n />\n )}\n {showTime && (\n <div className=\"ds:flex ds:gap-0 ds:border-l ds:border-border\">\n <TimePicker\n {...timeConfig?.[0]}\n value={fromTime ? dfFormat(fromTime, timeFormat) : undefined}\n onSelect={handleTimeChangeFrom}\n format={timeFormat}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n standalone={false}\n />\n <div className=\"ds:border-l ds:border-border\" />\n <TimePicker\n {...timeConfig?.[1]}\n value={toTime ? dfFormat(toTime, timeFormat) : undefined}\n onSelect={handleTimeChangeTo}\n format={timeFormat}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n standalone={false}\n />\n </div>\n )}\n </div>\n );\n\n const popPicker = (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild disabled={props.disabled}>\n {triggerComponent}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n side={side}\n align={align}\n >\n {calendarSelection}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{triggerComponent}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select date range</DrawerTitle>\n <DrawerDescription>Set your date range</DrawerDescription>\n </DrawerHeader>\n {calendarSelection}\n </DrawerContent>\n </Drawer>\n );\n\n // If children is provided, use render prop pattern with picker\n if (children) {\n const mode = isMobile ? mobileMode : desktopMode;\n return mode === \"drawer\" ? drawPicker : popPicker;\n }\n\n // Helper function to render range input\n const renderRangeInput = (\n type: \"from\" | \"to\",\n inputValue: string,\n setInputValue: (value: string) => void,\n additionalProps?: Partial<InputProps>\n ) => {\n const isFrom = type === \"from\";\n\n return (\n <Input\n {...props}\n {...additionalProps}\n ref={isFrom ? fromInputRef : toInputRef}\n id={inputId}\n size={\n props.isFloatLabel ? (props.size ? props.size : \"xl\") : props.size\n }\n className={props.className}\n inputClassName={cn(\n \"ds:border-0 ds:focus:ring-0 ds:rounded-none ds:hover:bg-transparent ds:active:bg-transparent ds:focus-visible:ring-0 ds:focus-visible:border-0 ds:shadow-none\",\n isFrom ? \"ds:pr-0\" : \"\"\n )}\n label={\n props.isFloatLabel && typeof label === \"object\"\n ? isFrom\n ? label?.from || \"\"\n : label?.to || \"\"\n : \"\"\n }\n placeholder={\n typeof placeholder === \"object\"\n ? isFrom\n ? placeholder?.from || \"\"\n : placeholder?.to || \"\"\n : placeholder\n }\n clearable={!isFrom}\n value={inputValue}\n mask={maskToUse}\n onChange={(e) => {\n const inputValue = e.target.value;\n setInputValue(inputValue);\n\n // If the input is cleared (empty), clear both fields\n if (inputValue.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let date: Date | undefined;\n if (showTime) {\n date = parseDate(inputValue, `${inputFormat} ${timeFormat}`);\n } else {\n date = parseDate(inputValue, inputFormat);\n }\n const newRange: DateRange = isFrom\n ? { from: date, to: range?.to }\n : { from: range?.from, to: date };\n\n if (date) {\n setRange(newRange);\n if (isFrom) setMonth(date);\n // Update time state if time was parsed\n if (isFrom) {\n setFromTime(date);\n // setFromInputValue(formatDateTimeValue(date)); // Sync input value\n } else {\n setToTime(date);\n // setToInputValue(formatDateTimeValue(date)); // Sync input value\n }\n const fromFormatted = formatDateTimeValue(\n isFrom ? date : range?.from\n );\n const toFormatted = formatDateTimeValue(isFrom ? range?.to : date);\n onSelect?.(newRange, { from: fromFormatted, to: toFormatted });\n onChange?.(newRange, {\n from: isFrom ? inputValue : fromInputValue,\n to: isFrom ? toInputValue : inputValue,\n });\n\n // If from input and date is valid, auto-focus to to input if to is empty\n // if (isFrom && toInputRef.current && !toInputValue.trim()) {\n // requestAnimationFrame(() => toInputRef.current?.focus());\n // }\n } else {\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: isFrom ? formatDateTimeValue(range?.to) : undefined,\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: isFrom ? formatDateTimeValue(range?.to) : undefined,\n });\n }\n }}\n onClear={\n !isFrom\n ? () => {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n }\n : undefined\n }\n onBlur={() => {\n // Check if blurring out of the entire range picker group\n const activeElement = document.activeElement;\n if (\n activeElement !== fromInputRef.current &&\n activeElement !== toInputRef.current\n ) {\n // Delay validation by 100ms\n setTimeout(() => {\n // Check again if still blurred out of the group\n const currentActiveElement = document.activeElement;\n if (\n currentActiveElement !== fromInputRef.current &&\n currentActiveElement !== toInputRef.current\n ) {\n // Blurred out of the group, validate both inputs\n const validateInput = (val: string) => {\n if (val.trim() === \"\") return true; // empty is valid (will clear)\n let parsed: Date | undefined;\n if (showTime) {\n parsed = parseDate(val, `${inputFormat} ${timeFormat}`);\n } else {\n parsed = parseDate(val, inputFormat);\n }\n return !!parsed;\n };\n\n const fromValid = validateInput(fromInputValue);\n const toValid = validateInput(toInputValue);\n\n // Clear if either is invalid, or if only one has value\n const shouldClear =\n !fromValid ||\n !toValid ||\n (fromInputValue.trim() && !toInputValue.trim()) ||\n (!fromInputValue.trim() && toInputValue.trim());\n\n if (shouldClear) {\n // If either is invalid, clear both\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = {\n from: undefined,\n to: undefined,\n };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n }\n }\n }, 100);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n }}\n />\n );\n };\n\n // Default input rendering with two inputs\n return (\n <div\n className={cn(\n \"ds:group ds:relative ds:flex ds:items-center ds:border ds:rounded-md ds:focus-within:ring-2 ds:focus-within:ring-offset-2 ds:bg-background ds:transition-[color,box-shadow]\",\n {\n \"ds:border-input ds:focus-within:ring-ring\": !props.state,\n \"ds:border-success ds:focus-within:ring-success\": props.state === \"success\",\n \"ds:border-warning ds:focus-within:ring-warning\": props.state === \"warning\",\n \"ds:border-error ds:focus-within:ring-error\": props.state === \"error\",\n }\n )}\n >\n {renderRangeInput(\"from\", fromInputValue, setFromInputValue)}\n <span\n className={cn(\"ds:text-muted-foreground ds:select-none ds:pl-2\", {\n \"ds:opacity-30\": props.disabled,\n })}\n >\n {separator}\n </span>\n {renderRangeInput(\"to\", toInputValue, setToInputValue, {\n suffixIcon: isMobile\n ? mobileMode === \"drawer\"\n ? drawPicker\n : popPicker\n : desktopMode === \"drawer\"\n ? drawPicker\n : popPicker,\n })}\n {props.isFloatLabel && typeof label === \"string\" && (\n <FloatingLabel\n htmlFor={inputId}\n size={props.size}\n infoTooltip={props.infoTooltip}\n className=\"ds:z-10\"\n shouldFloat={shouldFloat}\n >\n {label}\n </FloatingLabel>\n )}\n </div>\n );\n}\n"],"names":["formatDate","date","outputFormat","DATE_FORMAT","locale","dfFormat","parseDate","str","inputFormat","parse","isValid","generateMaskFromFormat","format","match","RangePicker","label","value","placeholder","onChange","onSelect","calendarClassName","side","align","language","mask","closeOnSelect","showOutsideDays","calendarConfig","timeConfig","desktopMode","mobileMode","children","separator","jsx","MoveRight","showTime","timeFormat","hideDate","numberOfMonths","variant","color","props","inputId","React","maskToUse","initialFromDate","initialToDate","initialRange","open","setOpen","range","setRange","month","setMonth","fromInputValue","setFromInputValue","toInputValue","setToInputValue","fromTime","setFromTime","toTime","setToTime","fromInputRef","toInputRef","shouldFloat","_locale","enUS","vi","formatDateTimeValue","d","result","handleSelectForRenderProp","fromFormatted","toFormatted","handleFromChangeForRenderProp","text","newRange","parsedDate","handleToChangeForRenderProp","handleTimeChangeFrom","mergedDate","handleTimeChangeTo","triggerComponent","jsxs","Button","CalendarIcon","cn","calendarSelection","Calendar","isMobile","selectedRange","preservedRange","fromTimeObj","toTimeObj","TimePicker","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","renderRangeInput","type","inputValue","setInputValue","additionalProps","isFrom","Input","e","activeElement","currentActiveElement","validateInput","val","parsed","fromValid","toValid","FloatingLabel"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TimePicker.cjs","sources":["../../../../src/components/DatePicker/TimePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Button } from \"../Button\";\nimport { Select } from \"../Select\";\nimport { Input, type InputProps } from \"../Input\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { isMobile } from \"react-device-detect\";\nimport { Clock } from \"lucide-react\";\nimport { TimeColumnwheel } from \"../../components/WheelColumn\";\nimport { TimeGridView } from \"../../components/TimeGridView\";\nimport { format as dfFormat, parse, isValid } from \"date-fns\";\nimport type { CalendarColor } from \"../Calendar/Calendar\";\n\nexport type TimePickerMode = \"wheel\" | \"select\" | \"compact\";\n\nexport type DisabledTimeRange = {\n from: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\n to: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\n};\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type TimePickerProps = Omit<\n InputProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"mask\" | \"children\"\n> & {\n value?: string; // Time string in specified format\n onChange?: (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n date?: Date\n ) => void;\n onSelect?: (date?: Date, value?: string) => void;\n showHours?: boolean;\n showMinutes?: boolean;\n showSeconds?: boolean;\n disabled?: boolean;\n className?: string;\n timeLabel?:\n | boolean\n | string\n | { hours?: string; minutes?: string; seconds?: string };\n mask?: boolean | string; // Enable mask for time input: true (auto-generate), string (custom mask), false/undefined (no mask)\n format?: FormatType; // Time format using date-fns format tokens (default: auto from showSeconds)\n\n // New configuration options\n mode?: TimePickerMode; // Display mode: 'wheel' (default), 'select', 'compact'\n hourInterval?: number; // Hour interval (e.g., 1, 2, 3) - defaults to 1\n minuteInterval?: number; // Minute interval (e.g., 5, 10, 15, 30) - defaults to 1\n secondInterval?: number; // Second interval (e.g., 5, 10, 15, 30) - defaults to 1\n disabledTimes?: string[]; // Array of disabled times in \"HH:mm\" or \"HH:mm:ss\" format\n disabledTimeRanges?: DisabledTimeRange[]; // Array of disabled time ranges\n showNowButton?: boolean; // Show \"Now\" button to select current time\n nowButtonLabel?: string; // Label for \"Now\" button (defaults to \"Now\")\n\n // Standalone mode configuration\n standalone?: boolean; // When true (default), TimePicker shows as a drawer/popover with trigger. When false, it's used as an integrated component (e.g., inside DatePicker)\n desktopMode?: \"popover\" | \"drawer\"; // Desktop display mode for standalone: 'popover' or 'drawer'\n mobileMode?: \"popover\" | \"drawer\"; // Mobile display mode for standalone: 'popover' or 'drawer'\n color?: CalendarColor; // Color variant for selected time (defaults to \"primary\")\n isOpen?: boolean; // External control for when picker is visible (used in non-standalone mode)\n};\n\nconst generateIntervalArray = (max: number, interval: number = 1): number[] => {\n const result: number[] = [];\n for (let i = 0; i < max; i += interval) {\n result.push(i);\n }\n return result;\n};\n\nconst pad = (num: number): string => String(num).padStart(2, \"0\");\n\n// Format time Date to string using date-fns\nconst formatTime = (\n date: Date | undefined,\n format: string = \"HH:mm\"\n): string => {\n if (!date || !isValid(date)) return \"\";\n return dfFormat(date, format);\n};\n\n// Parse time string to Date using date-fns\nconst parseTimeString = (\n timeStr: string,\n format: string = \"HH:mm\"\n): Date | undefined => {\n if (!timeStr) return undefined;\n\n const referenceDate = new Date();\n const parsedDate = parse(timeStr, format, referenceDate);\n\n if (!isValid(parsedDate)) return undefined;\n\n return parsedDate;\n};\n\nfunction generateMaskFromTimeFormat(format: string): string {\n return format\n .replace(/HH|mm|ss/g, (match) => {\n switch (match) {\n case \"HH\":\n case \"mm\":\n case \"ss\":\n return \"99\";\n default:\n return match;\n }\n })\n .replace(/H|m|s/g, () => \"9\");\n}\n\nexport function TimePicker({\n value,\n onChange,\n onSelect,\n showHours = true,\n showMinutes = true,\n showSeconds = false,\n disabled = false,\n className,\n timeLabel,\n mask,\n format,\n mode = \"wheel\",\n hourInterval = 1,\n minuteInterval = 1,\n secondInterval = 1,\n disabledTimes = [],\n disabledTimeRanges = [],\n showNowButton = false,\n nowButtonLabel = \"Now\",\n standalone = true,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n color = \"primary\",\n isOpen,\n ...props\n}: TimePickerProps) {\n // Determine input and output formats (like DatePicker)\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else if (format) {\n inputFormat = format.input;\n outputFormat = format.output;\n } else {\n // Auto-determine from showSeconds if not provided\n inputFormat = showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n outputFormat = showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n }\n\n const [hours, setHours] = useState<number | undefined>(undefined);\n const [minutes, setMinutes] = useState<number | undefined>(undefined);\n const [seconds, setSeconds] = useState<number | undefined>(undefined);\n const [standaloneOpen, setStandaloneOpen] = useState(false);\n\n useEffect(() => {\n if (value) {\n const parsed = parseTimeString(value, inputFormat);\n if (parsed) {\n setHours(parsed.getHours());\n setMinutes(parsed.getMinutes());\n setSeconds(parsed.getSeconds());\n }\n } else {\n setHours(undefined);\n setMinutes(undefined);\n setSeconds(undefined);\n }\n }, [value, inputFormat]);\n\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n const secondsRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n // Generate time arrays based on intervals\n const HOURS = useMemo(\n () => generateIntervalArray(24, hourInterval),\n [hourInterval]\n );\n const MINUTES = useMemo(\n () => generateIntervalArray(60, minuteInterval),\n [minuteInterval]\n );\n const SECONDS = useMemo(\n () => generateIntervalArray(60, secondInterval),\n [secondInterval]\n );\n\n // Helper function to check if a time is disabled\n const isTimeDisabled = useCallback(\n (\n h: number | undefined,\n m: number | undefined,\n s: number | undefined = 0\n ): boolean => {\n const timeStr = `${pad(h ?? 0)}:${pad(m ?? 0)}${showSeconds ? `:${pad(s ?? 0)}` : \"\"}`;\n\n // Check if specific time is disabled\n if (disabledTimes.includes(timeStr)) {\n return true;\n }\n\n // Check if time is in a disabled range\n for (const range of disabledTimeRanges) {\n const [fromH, fromM, fromS = 0] = range.from.split(\":\").map(Number);\n const [toH, toM, toS = 0] = range.to.split(\":\").map(Number);\n\n const currentTime = (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0);\n const fromTime = fromH * 3600 + fromM * 60 + fromS;\n const toTime = toH * 3600 + toM * 60 + toS;\n\n if (currentTime >= fromTime && currentTime <= toTime) {\n return true;\n }\n }\n\n return false;\n },\n [disabledTimes, disabledTimeRanges, showSeconds]\n );\n\n // Helper function to get time label based on type and timeLabel prop\n const getTimeLabel = useCallback(\n (type: \"hours\" | \"minutes\" | \"seconds\"): string | undefined => {\n if (!timeLabel) return undefined;\n\n if (typeof timeLabel === \"boolean\") {\n return timeLabel\n ? type === \"hours\"\n ? \"Hour\"\n : type === \"minutes\"\n ? \"Minute\"\n : \"Second\"\n : undefined;\n }\n\n if (typeof timeLabel === \"string\") {\n return timeLabel;\n }\n\n // Object case\n if (type === \"hours\") return timeLabel.hours || \"Hour\";\n if (type === \"minutes\") return timeLabel.minutes || \"Minute\";\n return timeLabel.seconds || \"Second\";\n },\n [timeLabel]\n );\n\n // If timeLabel is a string, show it as a common label above all columns\n const shareLabel = typeof timeLabel === \"string\" && (\n <div\n key=\"common-label\"\n 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\"\n >\n {timeLabel}\n </div>\n );\n\n // Find nearest valid time\n const findNearestValidTime = useCallback(\n (\n targetH: number,\n targetM: number,\n targetS: number = 0\n ): { h: number; m: number; s: number } => {\n // Find nearest hour\n const nearestH = HOURS.reduce((prev, curr) =>\n Math.abs(curr - targetH) < Math.abs(prev - targetH) ? curr : prev\n );\n\n // Find nearest minute\n const nearestM = MINUTES.reduce((prev, curr) =>\n Math.abs(curr - targetM) < Math.abs(prev - targetM) ? curr : prev\n );\n\n // Find nearest second\n const nearestS = SECONDS.reduce((prev, curr) =>\n Math.abs(curr - targetS) < Math.abs(prev - targetS) ? curr : prev\n );\n\n // If the nearest time is disabled, find the next available time\n if (isTimeDisabled(nearestH, nearestM, nearestS)) {\n // Try to find next available time\n for (const h of HOURS) {\n for (const m of MINUTES) {\n for (const s of SECONDS) {\n if (!isTimeDisabled(h, m, s)) {\n return { h, m, s };\n }\n }\n }\n }\n }\n\n return { h: nearestH, m: nearestM, s: nearestS };\n },\n [HOURS, MINUTES, SECONDS, isTimeDisabled]\n );\n\n const updateDateTime = useCallback(\n (h: number, m: number, s: number) => {\n const newDate = new Date();\n newDate.setHours(h, m, s, 0);\n const formattedValue = formatTime(newDate, outputFormat);\n onChange?.(undefined, formattedValue, newDate);\n onSelect?.(newDate, formattedValue);\n },\n [outputFormat, onChange, onSelect]\n );\n\n const handleHourChange = (h: number) => {\n if (!isTimeDisabled(h, minutes, seconds)) {\n setHours(h);\n updateDateTime(h, minutes ?? 0, seconds ?? 0);\n }\n };\n\n const handleMinuteChange = (m: number) => {\n if (!isTimeDisabled(hours, m, seconds)) {\n setMinutes(m);\n updateDateTime(hours ?? 0, m, seconds ?? 0);\n }\n };\n\n const handleSecondChange = (s: number) => {\n if (!isTimeDisabled(hours, minutes, s)) {\n setSeconds(s);\n updateDateTime(hours ?? 0, minutes ?? 0, s);\n }\n };\n\n // Scroll to center item when selected\n const scrollToSelected = useCallback(\n (ref: RefObject<HTMLDivElement | null>) => {\n if (ref.current) {\n const selected = ref.current.querySelector(\n \"[data-selected]\"\n ) as HTMLElement;\n if (selected) {\n const container = ref.current;\n const containerHeight = container.clientHeight;\n const selectedTop = selected.offsetTop;\n const selectedHeight = selected.clientHeight;\n\n const scrollPosition =\n selectedTop - containerHeight / 2 + selectedHeight / 2;\n\n container.scrollTo({\n top: scrollPosition,\n behavior: \"smooth\",\n });\n }\n }\n },\n []\n );\n\n const scrollHandler = useCallback(() => {\n if (mode === \"wheel\") {\n // Scroll to selected item when picker opens (only for initial load)\n scrollToSelected(hoursRef);\n scrollToSelected(minutesRef);\n scrollToSelected(secondsRef);\n } else if (mode === \"compact\") {\n // Scroll to selected item in grid mode\n scrollToSelected(gridRef);\n }\n }, [hoursRef, minutesRef, secondsRef, gridRef, mode, scrollToSelected]);\n\n const handleNowClick = () => {\n const now = new Date();\n const { h, m, s } = findNearestValidTime(\n now.getHours(),\n now.getMinutes(),\n now.getSeconds()\n );\n setHours(h);\n setMinutes(m);\n setSeconds(s);\n updateDateTime(h, m, s);\n setTimeout(() => scrollHandler(), 100);\n };\n\n useEffect(() => {\n // Trigger scroll when picker opens (standalone or integrated) or when values change\n const shouldScroll = standalone ? standaloneOpen : isOpen;\n\n // Also trigger scroll if we have values (for initial load and value changes)\n const hasValues =\n hours !== undefined || minutes !== undefined || seconds !== undefined;\n\n if (shouldScroll || hasValues) {\n const timer = setTimeout(() => scrollHandler(), 100);\n return () => clearTimeout(timer);\n }\n }, [\n standaloneOpen,\n isOpen,\n standalone,\n mode,\n scrollHandler,\n hours,\n minutes,\n seconds,\n ]);\n\n // Normal Mode - Dropdown/Input style\n const TimeColumnNormal = memo(\n ({\n items,\n value: selectedValue,\n onChange: onChangeCol,\n timeLabel,\n type,\n }: {\n items: number[];\n value: number | undefined;\n onChange: (val: number) => void;\n timeLabel?: string;\n type: \"hours\" | \"minutes\" | \"seconds\";\n }) => (\n <div className=\"ds:flex ds:flex-col ds:gap-2\">\n {timeLabel && (\n <div className=\"ds:text-xs ds:font-semibold ds:text-muted-foreground ds:uppercase ds:p-2 ds:border-b ds:w-full ds:text-center\">\n {timeLabel}\n </div>\n )}\n <div className=\"ds:p-2\">\n <Select\n value={selectedValue?.toString() || \"\"}\n onValueChange={(value) => onChangeCol(Number(value))}\n disabled={disabled}\n clearable={false}\n search={false}\n options={items.map((item) => {\n const itemDisabled =\n (type === \"hours\" && isTimeDisabled(item, minutes, seconds)) ||\n (type === \"minutes\" && isTimeDisabled(hours, item, seconds)) ||\n (type === \"seconds\" && isTimeDisabled(hours, minutes, item));\n\n return {\n label: pad(item),\n value: item.toString(),\n disabled: itemDisabled,\n };\n })}\n />\n </div>\n </div>\n )\n );\n\n // Grid Mode - Combined time selection (HH:mm format only, vertical layout)\n const handleTimeSelect = (h: number, m: number) => {\n // Always set seconds to 0 in grid mode\n if (!isTimeDisabled(h, m, 0)) {\n setHours(h);\n setMinutes(m);\n setSeconds(0);\n updateDateTime(h, m, 0);\n }\n };\n\n const renderColumns = () => {\n const columns = [];\n\n // Grid mode shows combined time options\n if (mode === \"compact\") {\n return (\n <TimeGridView\n HOURS={HOURS}\n MINUTES={MINUTES}\n hours={hours}\n minutes={minutes}\n disabled={disabled}\n isTimeDisabled={isTimeDisabled}\n onTimeSelect={handleTimeSelect}\n ref={gridRef}\n color={color}\n />\n );\n }\n\n if (showHours) {\n const hourLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"hours\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"hours\"\n ref={hoursRef}\n items={HOURS}\n value={hours}\n onChange={handleHourChange}\n timeLabel={hourLabel}\n isItemDisabled={(item) => isTimeDisabled(item, minutes, seconds)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"hours\"\n items={HOURS}\n value={hours}\n onChange={handleHourChange}\n timeLabel={hourLabel}\n type=\"hours\"\n />\n );\n }\n }\n\n if (showMinutes) {\n const minuteLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"minutes\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"minutes\"\n ref={minutesRef}\n items={MINUTES}\n value={minutes}\n onChange={handleMinuteChange}\n timeLabel={minuteLabel}\n itemClassName={showHours ? \"ds:border-l\" : undefined}\n isItemDisabled={(item) => isTimeDisabled(hours, item, seconds)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"minutes\"\n items={MINUTES}\n value={minutes}\n onChange={handleMinuteChange}\n timeLabel={minuteLabel}\n type=\"minutes\"\n />\n );\n }\n }\n\n if (showSeconds) {\n const secondLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"seconds\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"seconds\"\n ref={secondsRef}\n items={SECONDS}\n value={seconds}\n onChange={handleSecondChange}\n timeLabel={secondLabel}\n itemClassName={showMinutes || showHours ? \"ds:border-l\" : undefined}\n isItemDisabled={(item) => isTimeDisabled(hours, minutes, item)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"seconds\"\n items={SECONDS}\n value={seconds}\n onChange={handleSecondChange}\n timeLabel={secondLabel}\n type=\"seconds\"\n />\n );\n }\n }\n\n return columns;\n };\n\n // If standalone mode is disabled, return the content directly (for integration with DatePicker)\n if (!standalone) {\n return (\n <div\n className={cn(\"ds:flex ds:flex-col ds:gap-2 ds:h-full ds:justify-between\", className)}\n >\n {shareLabel}\n\n <div\n className={cn(\n \"ds:flex ds:rounded ds:overflow-clip ds:mb-auto\",\n mode === \"wheel\"\n ? \"ds:items-end ds:justify-center ds:p-0 ds:h-72\"\n : \"ds:items-start ds:justify-center\"\n )}\n >\n {renderColumns()}\n </div>\n\n {showNowButton && (\n <Button\n type=\"button\"\n variant=\"solid\"\n size=\"xs\"\n onClick={handleNowClick}\n disabled={disabled}\n className={cn(\"ds:rounded-none\")}\n >\n {nowButtonLabel}\n </Button>\n )}\n </div>\n );\n }\n\n // Render the time picker content\n const timePickerContent = (\n <div className={cn(\"ds:flex ds:flex-col ds:gap-4 ds:h-full\", className)}>\n {shareLabel}\n\n <div\n className={cn(\n \"ds:flex ds:rounded ds:overflow-clip ds:my-auto ds:mx-auto ds:max-w-sm ds:md:max-w-md ds:lg:max-w-lg ds:relative\",\n mode === \"wheel\"\n ? \"ds:items-end ds:justify-center ds:p-0\"\n : \"ds:items-start ds:justify-center\",\n {\n \"ds:h-72\": mode === \"wheel\",\n \"ds:w-xs\": standalone && (isMobile || desktopMode === \"drawer\"),\n }\n )}\n >\n {renderColumns()}\n </div>\n\n {showNowButton && (\n <Button\n type=\"button\"\n variant=\"solid\"\n size=\"xs\"\n onClick={handleNowClick}\n disabled={disabled}\n className={cn(\"ds:rounded-none\")}\n >\n {nowButtonLabel}\n </Button>\n )}\n </div>\n );\n\n // Standalone mode: show as drawer or popover with Input\n const iconTrigger = (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n disabled={disabled}\n >\n <Clock className=\"ds:size-4\" />\n <span className=\"ds:sr-only\">Select time</span>\n </Button>\n );\n\n const popPicker = (\n <Popover open={standaloneOpen} onOpenChange={setStandaloneOpen}>\n <PopoverTrigger asChild disabled={disabled}>\n {iconTrigger}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n >\n {timePickerContent}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={standaloneOpen} onOpenChange={setStandaloneOpen}>\n <DrawerTrigger asChild>{iconTrigger}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select time</DrawerTitle>\n <DrawerDescription>Choose a time</DrawerDescription>\n </DrawerHeader>\n {timePickerContent}\n </DrawerContent>\n </Drawer>\n );\n\n // Determine the mask to use\n const timeFormat = outputFormat; // Use outputFormat for placeholder\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromTimeFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n // If mask is false or undefined, maskToUse remains undefined\n\n // Handle Input change (when user types)\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const parsedDate = parseTimeString(inputValue, inputFormat);\n\n if (parsedDate) {\n setHours(parsedDate.getHours());\n setMinutes(parsedDate.getMinutes());\n setSeconds(parsedDate.getSeconds());\n const formattedValue = formatTime(parsedDate, outputFormat);\n onChange?.(e, formattedValue, parsedDate);\n onSelect?.(parsedDate, formattedValue);\n } else {\n // Reset state when input is cleared\n setHours(0);\n setMinutes(0);\n setSeconds(0);\n onChange?.(e, inputValue, undefined);\n onSelect?.(undefined, inputValue);\n }\n };\n\n // Return Input with picker as suffix icon (standalone mode)\n return (\n <Input\n {...props}\n clearable\n value={value || \"\"}\n placeholder={timeFormat}\n mask={maskToUse}\n disabled={disabled}\n className=\"ds:cursor-pointer\"\n onChange={handleInputChange}\n suffixIcon={\n isMobile\n ? mobileMode === \"drawer\"\n ? drawPicker\n : popPicker\n : desktopMode === \"drawer\"\n ? drawPicker\n : popPicker\n }\n />\n );\n}\n"],"names":["generateIntervalArray","max","interval","result","i","pad","num","formatTime","date","format","isValid","dfFormat","parseTimeString","timeStr","referenceDate","parsedDate","parse","generateMaskFromTimeFormat","match","TimePicker","value","onChange","onSelect","showHours","showMinutes","showSeconds","disabled","className","timeLabel","mask","mode","hourInterval","minuteInterval","secondInterval","disabledTimes","disabledTimeRanges","showNowButton","nowButtonLabel","standalone","desktopMode","mobileMode","color","isOpen","props","inputFormat","outputFormat","hours","setHours","useState","minutes","setMinutes","seconds","setSeconds","standaloneOpen","setStandaloneOpen","useEffect","parsed","hoursRef","useRef","minutesRef","secondsRef","gridRef","HOURS","useMemo","MINUTES","SECONDS","isTimeDisabled","useCallback","h","m","s","range","fromH","fromM","fromS","toH","toM","toS","currentTime","fromTime","toTime","getTimeLabel","type","shareLabel","jsx","findNearestValidTime","targetH","targetM","targetS","nearestH","prev","curr","nearestM","nearestS","updateDateTime","newDate","formattedValue","handleHourChange","handleMinuteChange","handleSecondChange","scrollToSelected","ref","selected","container","containerHeight","selectedTop","selectedHeight","scrollPosition","scrollHandler","handleNowClick","now","timer","TimeColumnNormal","memo","items","selectedValue","onChangeCol","jsxs","Select","item","itemDisabled","handleTimeSelect","renderColumns","columns","TimeGridView","hourLabel","TimeColumnwheel","minuteLabel","secondLabel","cn","Button","timePickerContent","isMobile","iconTrigger","Clock","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","timeFormat","maskToUse","handleInputChange","inputValue","Input"],"mappings":"40DAoFMA,EAAwB,CAACC,EAAaC,EAAmB,IAAgB,CAC7E,MAAMC,EAAmB,CAAA,EACzB,QAASC,EAAI,EAAGA,EAAIH,EAAKG,GAAKF,EAC5BC,EAAO,KAAKC,CAAC,EAEf,OAAOD,CACT,EAEME,EAAOC,GAAwB,OAAOA,CAAG,EAAE,SAAS,EAAG,GAAG,EAG1DC,GAAa,CACjBC,EACAC,EAAiB,UAEb,CAACD,GAAQ,CAACE,EAAAA,QAAQF,CAAI,EAAU,GAC7BG,EAAAA,OAASH,EAAMC,CAAM,EAIxBG,GAAkB,CACtBC,EACAJ,EAAiB,UACI,CACrB,GAAI,CAACI,EAAS,OAEd,MAAMC,MAAoB,KACpBC,EAAaC,EAAAA,MAAMH,EAASJ,EAAQK,CAAa,EAEvD,GAAKJ,EAAAA,QAAQK,CAAU,EAEvB,OAAOA,CACT,EAEA,SAASE,GAA2BR,EAAwB,CAC1D,OAAOA,EACJ,QAAQ,YAAcS,GAAU,CAC/B,OAAQA,EAAA,CACN,IAAK,KACL,IAAK,KACL,IAAK,KACH,MAAO,KACT,QACE,OAAOA,CAAA,CAEb,CAAC,EACA,QAAQ,SAAU,IAAM,GAAG,CAChC,CAEO,SAASC,GAAW,CACzB,MAAAC,EACA,SAAAC,EACA,SAAAC,EACA,UAAAC,EAAY,GACZ,YAAAC,GAAc,GACd,YAAAC,EAAc,GACd,SAAAC,EAAW,GACX,UAAAC,GACA,UAAAC,EACA,KAAAC,EACA,OAAApB,EACA,KAAAqB,EAAO,QACP,aAAAC,GAAe,EACf,eAAAC,GAAiB,EACjB,eAAAC,GAAiB,EACjB,cAAAC,GAAgB,CAAA,EAChB,mBAAAC,GAAqB,CAAA,EACrB,cAAAC,GAAgB,GAChB,eAAAC,GAAiB,MACjB,WAAAC,EAAa,GACb,YAAAC,GAAc,UACd,WAAAC,GAAa,SACb,MAAAC,EAAQ,UACR,OAAAC,GACA,GAAGC,EACL,EAAoB,CAElB,IAAIC,EACAC,EACA,OAAOpC,GAAW,UACpBmC,EAAcnC,EACdoC,EAAepC,GACNA,GACTmC,EAAcnC,EAAO,MACrBoC,EAAepC,EAAO,SAGtBmC,EAAcnB,EAAc,WAAa,QACzCoB,EAAepB,EAAc,WAAa,SAG5C,KAAM,CAACqB,EAAOC,CAAQ,EAAIC,EAAAA,SAA6B,MAAS,EAC1D,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAA6B,MAAS,EAC9D,CAACG,EAASC,CAAU,EAAIJ,EAAAA,SAA6B,MAAS,EAC9D,CAACK,EAAgBC,EAAiB,EAAIN,EAAAA,SAAS,EAAK,EAE1DO,EAAAA,UAAU,IAAM,CACd,GAAInC,EAAO,CACT,MAAMoC,EAAS5C,GAAgBQ,EAAOwB,CAAW,EAC7CY,IACFT,EAASS,EAAO,UAAU,EAC1BN,EAAWM,EAAO,YAAY,EAC9BJ,EAAWI,EAAO,YAAY,EAElC,MACET,EAAS,MAAS,EAClBG,EAAW,MAAS,EACpBE,EAAW,MAAS,CAExB,EAAG,CAAChC,EAAOwB,CAAW,CAAC,EAEvB,MAAMa,EAAWC,EAAAA,OAAuB,IAAI,EACtCC,EAAaD,EAAAA,OAAuB,IAAI,EACxCE,EAAaF,EAAAA,OAAuB,IAAI,EACxCG,EAAUH,EAAAA,OAAuB,IAAI,EAGrCI,EAAQC,EAAAA,QACZ,IAAM/D,EAAsB,GAAI+B,EAAY,EAC5C,CAACA,EAAY,CAAA,EAETiC,EAAUD,EAAAA,QACd,IAAM/D,EAAsB,GAAIgC,EAAc,EAC9C,CAACA,EAAc,CAAA,EAEXiC,EAAUF,EAAAA,QACd,IAAM/D,EAAsB,GAAIiC,EAAc,EAC9C,CAACA,EAAc,CAAA,EAIXiC,EAAiBC,EAAAA,YACrB,CACEC,EACAC,EACAC,EAAwB,IACZ,CACZ,MAAMzD,EAAU,GAAGR,EAAI+D,GAAK,CAAC,CAAC,IAAI/D,EAAIgE,GAAK,CAAC,CAAC,GAAG5C,EAAc,IAAIpB,EAAIiE,GAAK,CAAC,CAAC,GAAK,EAAE,GAGpF,GAAIpC,GAAc,SAASrB,CAAO,EAChC,MAAO,GAIT,UAAW0D,KAASpC,GAAoB,CACtC,KAAM,CAACqC,EAAOC,EAAOC,EAAQ,CAAC,EAAIH,EAAM,KAAK,MAAM,GAAG,EAAE,IAAI,MAAM,EAC5D,CAACI,EAAKC,GAAKC,GAAM,CAAC,EAAIN,EAAM,GAAG,MAAM,GAAG,EAAE,IAAI,MAAM,EAEpDO,IAAeV,GAAK,GAAK,MAAQC,GAAK,GAAK,IAAMC,GAAK,GACtDS,GAAWP,EAAQ,KAAOC,EAAQ,GAAKC,EACvCM,GAASL,EAAM,KAAOC,GAAM,GAAKC,GAEvC,GAAIC,IAAeC,IAAYD,IAAeE,GAC5C,MAAO,EAEX,CAEA,MAAO,EACT,EACA,CAAC9C,GAAeC,GAAoBV,CAAW,CAAA,EAI3CwD,EAAed,EAAAA,YAClBe,GAA8D,CAC7D,GAAKtD,EAEL,OAAI,OAAOA,GAAc,UAChBA,EACHsD,IAAS,QACP,OACAA,IAAS,UACP,SACA,SACJ,OAGF,OAAOtD,GAAc,SAChBA,EAILsD,IAAS,QAAgBtD,EAAU,OAAS,OAC5CsD,IAAS,UAAkBtD,EAAU,SAAW,SAC7CA,EAAU,SAAW,QAC9B,EACA,CAACA,CAAS,CAAA,EAINuD,GAAa,OAAOvD,GAAc,UACtCwD,EAAAA,IAAC,MAAA,CAEC,UAAU,gHAET,SAAAxD,CAAA,EAHG,cAAA,EAQFyD,GAAuBlB,EAAAA,YAC3B,CACEmB,EACAC,EACAC,EAAkB,IACsB,CAExC,MAAMC,EAAW3B,EAAM,OAAO,CAAC4B,EAAMC,IACnC,KAAK,IAAIA,EAAOL,CAAO,EAAI,KAAK,IAAII,EAAOJ,CAAO,EAAIK,EAAOD,CAAA,EAIzDE,EAAW5B,EAAQ,OAAO,CAAC0B,EAAMC,IACrC,KAAK,IAAIA,EAAOJ,CAAO,EAAI,KAAK,IAAIG,EAAOH,CAAO,EAAII,EAAOD,CAAA,EAIzDG,EAAW5B,EAAQ,OAAO,CAACyB,EAAMC,IACrC,KAAK,IAAIA,EAAOH,CAAO,EAAI,KAAK,IAAIE,EAAOF,CAAO,EAAIG,EAAOD,CAAA,EAI/D,GAAIxB,EAAeuB,EAAUG,EAAUC,CAAQ,GAE7C,UAAWzB,KAAKN,EACd,UAAWO,KAAKL,EACd,UAAWM,KAAKL,EACd,GAAI,CAACC,EAAeE,EAAGC,EAAGC,CAAC,EACzB,MAAO,CAAE,EAAAF,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAOzB,MAAO,CAAE,EAAGmB,EAAU,EAAGG,EAAU,EAAGC,CAAA,CACxC,EACA,CAAC/B,EAAOE,EAASC,EAASC,CAAc,CAAA,EAGpC4B,EAAiB3B,EAAAA,YACrB,CAACC,EAAWC,EAAWC,IAAc,CACnC,MAAMyB,MAAc,KACpBA,EAAQ,SAAS3B,EAAGC,EAAGC,EAAG,CAAC,EAC3B,MAAM0B,EAAiBzF,GAAWwF,EAASlD,CAAY,EACvDxB,IAAW,OAAW2E,EAAgBD,CAAO,EAC7CzE,IAAWyE,EAASC,CAAc,CACpC,EACA,CAACnD,EAAcxB,EAAUC,CAAQ,CAAA,EAG7B2E,GAAoB7B,GAAc,CACjCF,EAAeE,EAAGnB,EAASE,CAAO,IACrCJ,EAASqB,CAAC,EACV0B,EAAe1B,EAAGnB,GAAW,EAAGE,GAAW,CAAC,EAEhD,EAEM+C,GAAsB7B,GAAc,CACnCH,EAAepB,EAAOuB,EAAGlB,CAAO,IACnCD,EAAWmB,CAAC,EACZyB,EAAehD,GAAS,EAAGuB,EAAGlB,GAAW,CAAC,EAE9C,EAEMgD,GAAsB7B,GAAc,CACnCJ,EAAepB,EAAOG,EAASqB,CAAC,IACnClB,EAAWkB,CAAC,EACZwB,EAAehD,GAAS,EAAGG,GAAW,EAAGqB,CAAC,EAE9C,EAGM8B,EAAmBjC,EAAAA,YACtBkC,GAA0C,CACzC,GAAIA,EAAI,QAAS,CACf,MAAMC,EAAWD,EAAI,QAAQ,cAC3B,iBAAA,EAEF,GAAIC,EAAU,CACZ,MAAMC,EAAYF,EAAI,QAChBG,EAAkBD,EAAU,aAC5BE,EAAcH,EAAS,UACvBI,EAAiBJ,EAAS,aAE1BK,EACJF,EAAcD,EAAkB,EAAIE,EAAiB,EAEvDH,EAAU,SAAS,CACjB,IAAKI,EACL,SAAU,QAAA,CACX,CACH,CACF,CACF,EACA,CAAA,CAAC,EAGGC,EAAgBzC,EAAAA,YAAY,IAAM,CAClCrC,IAAS,SAEXsE,EAAiB3C,CAAQ,EACzB2C,EAAiBzC,CAAU,EAC3ByC,EAAiBxC,CAAU,GAClB9B,IAAS,WAElBsE,EAAiBvC,CAAO,CAE5B,EAAG,CAACJ,EAAUE,EAAYC,EAAYC,EAAS/B,EAAMsE,CAAgB,CAAC,EAEhES,GAAiB,IAAM,CAC3B,MAAMC,MAAU,KACV,CAAE,EAAA1C,EAAG,EAAAC,EAAG,EAAAC,CAAA,EAAMe,GAClByB,EAAI,SAAA,EACJA,EAAI,WAAA,EACJA,EAAI,WAAA,CAAW,EAEjB/D,EAASqB,CAAC,EACVlB,EAAWmB,CAAC,EACZjB,EAAWkB,CAAC,EACZwB,EAAe1B,EAAGC,EAAGC,CAAC,EACtB,WAAW,IAAMsC,EAAA,EAAiB,GAAG,CACvC,EAEArD,EAAAA,UAAU,IAAM,CAQd,IANqBjB,EAAae,EAAiBX,MAIjDI,IAAU,QAAaG,IAAY,QAAaE,IAAY,QAE/B,CAC7B,MAAM4D,EAAQ,WAAW,IAAMH,EAAA,EAAiB,GAAG,EACnD,MAAO,IAAM,aAAaG,CAAK,CACjC,CACF,EAAG,CACD1D,EACAX,GACAJ,EACAR,EACA8E,EACA9D,EACAG,EACAE,CAAA,CACD,EAGD,MAAM6D,EAAmBC,EAAAA,KACvB,CAAC,CACC,MAAAC,EACA,MAAOC,EACP,SAAUC,EACV,UAAAxF,EACA,KAAAsD,CAAA,IAQAmC,EAAAA,KAAC,MAAA,CAAI,UAAU,+BACZ,SAAA,CAAAzF,GACCwD,EAAAA,IAAC,MAAA,CAAI,UAAU,gHACZ,SAAAxD,EACH,EAEFwD,EAAAA,IAAC,MAAA,CAAI,UAAU,SACb,SAAAA,EAAAA,IAACkC,GAAAA,QAAA,CACC,MAAOH,GAAe,SAAA,GAAc,GACpC,cAAgB/F,GAAUgG,EAAY,OAAOhG,CAAK,CAAC,EACnD,SAAAM,EACA,UAAW,GACX,OAAQ,GACR,QAASwF,EAAM,IAAKK,GAAS,CAC3B,MAAMC,EACHtC,IAAS,SAAWhB,EAAeqD,EAAMtE,EAASE,CAAO,GACzD+B,IAAS,WAAahB,EAAepB,EAAOyE,EAAMpE,CAAO,GACzD+B,IAAS,WAAahB,EAAepB,EAAOG,EAASsE,CAAI,EAE5D,MAAO,CACL,MAAOlH,EAAIkH,CAAI,EACf,MAAOA,EAAK,SAAA,EACZ,SAAUC,CAAA,CAEd,CAAC,CAAA,CAAA,CACH,CACF,CAAA,CAAA,CACF,CAAA,EAKEC,GAAmB,CAACrD,EAAWC,IAAc,CAE5CH,EAAeE,EAAGC,EAAG,CAAC,IACzBtB,EAASqB,CAAC,EACVlB,EAAWmB,CAAC,EACZjB,EAAW,CAAC,EACZ0C,EAAe1B,EAAGC,EAAG,CAAC,EAE1B,EAEMqD,GAAgB,IAAM,CAC1B,MAAMC,EAAU,CAAA,EAGhB,GAAI7F,IAAS,UACX,OACEsD,EAAAA,IAACwC,GAAAA,aAAA,CACC,MAAA9D,EACA,QAAAE,EACA,MAAAlB,EACA,QAAAG,EACA,SAAAvB,EACA,eAAAwC,EACA,aAAcuD,GACd,IAAK5D,EACL,MAAApB,CAAA,CAAA,EAKN,GAAIlB,EAAW,CACb,MAAMsG,EACJ,OAAOjG,GAAc,SAAW,OAAYqD,EAAa,OAAO,EAE9DnD,IAAS,QACX6F,EAAQ,KACNvC,EAAAA,IAAC0C,EAAAA,gBAAA,CAEC,IAAKrE,EACL,MAAOK,EACP,MAAOhB,EACP,SAAUmD,GACV,UAAW4B,EACX,eAAiBN,GAASrD,EAAeqD,EAAMtE,EAASE,CAAO,EAC/D,SAAAzB,EACA,MAAAe,CAAA,EARI,OAAA,CASN,EAEOX,IAAS,UAClB6F,EAAQ,KACNvC,EAAAA,IAAC4B,EAAA,CAEC,MAAOlD,EACP,MAAOhB,EACP,SAAUmD,GACV,UAAW4B,EACX,KAAK,OAAA,EALD,OAAA,CAMN,CAGN,CAEA,GAAIrG,GAAa,CACf,MAAMuG,EACJ,OAAOnG,GAAc,SAAW,OAAYqD,EAAa,SAAS,EAEhEnD,IAAS,QACX6F,EAAQ,KACNvC,EAAAA,IAAC0C,EAAAA,gBAAA,CAEC,IAAKnE,EACL,MAAOK,EACP,MAAOf,EACP,SAAUiD,GACV,UAAW6B,EACX,cAAexG,EAAY,cAAgB,OAC3C,eAAiBgG,GAASrD,EAAepB,EAAOyE,EAAMpE,CAAO,EAC7D,SAAAzB,EACA,MAAAe,CAAA,EATI,SAAA,CAUN,EAEOX,IAAS,UAClB6F,EAAQ,KACNvC,EAAAA,IAAC4B,EAAA,CAEC,MAAOhD,EACP,MAAOf,EACP,SAAUiD,GACV,UAAW6B,EACX,KAAK,SAAA,EALD,SAAA,CAMN,CAGN,CAEA,GAAItG,EAAa,CACf,MAAMuG,EACJ,OAAOpG,GAAc,SAAW,OAAYqD,EAAa,SAAS,EAEhEnD,IAAS,QACX6F,EAAQ,KACNvC,EAAAA,IAAC0C,EAAAA,gBAAA,CAEC,IAAKlE,EACL,MAAOK,EACP,MAAOd,EACP,SAAUgD,GACV,UAAW6B,EACX,cAAexG,IAAeD,EAAY,cAAgB,OAC1D,eAAiBgG,GAASrD,EAAepB,EAAOG,EAASsE,CAAI,EAC7D,SAAA7F,EACA,MAAAe,CAAA,EATI,SAAA,CAUN,EAEOX,IAAS,UAClB6F,EAAQ,KACNvC,EAAAA,IAAC4B,EAAA,CAEC,MAAO/C,EACP,MAAOd,EACP,SAAUgD,GACV,UAAW6B,EACX,KAAK,SAAA,EALD,SAAA,CAMN,CAGN,CAEA,OAAOL,CACT,EAGA,GAAI,CAACrF,EACH,OACE+E,EAAAA,KAAC,MAAA,CACC,UAAWY,EAAAA,GAAG,4DAA6DtG,EAAS,EAEnF,SAAA,CAAAwD,GAEDC,EAAAA,IAAC,MAAA,CACC,UAAW6C,EAAAA,GACT,iDACAnG,IAAS,QACL,gDACA,kCAAA,EAGL,SAAA4F,GAAA,CAAc,CAAA,EAGhBtF,IACCgD,EAAAA,IAAC8C,EAAAA,QAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,KACL,QAASrB,GACT,SAAAnF,EACA,UAAWuG,EAAAA,GAAG,iBAAiB,EAE9B,SAAA5F,EAAA,CAAA,CACH,CAAA,CAAA,EAOR,MAAM8F,GACJd,OAAC,MAAA,CAAI,UAAWY,EAAAA,GAAG,yCAA0CtG,EAAS,EACnE,SAAA,CAAAwD,GAEDC,EAAAA,IAAC,MAAA,CACC,UAAW6C,EAAAA,GACT,kHACAnG,IAAS,QACL,wCACA,mCACJ,CACE,UAAWA,IAAS,QACpB,UAAWQ,IAAe8F,aAAY7F,KAAgB,SAAA,CACxD,EAGD,SAAAmF,GAAA,CAAc,CAAA,EAGhBtF,IACCgD,EAAAA,IAAC8C,EAAAA,QAAA,CACC,KAAK,SACL,QAAQ,QACR,KAAK,KACL,QAASrB,GACT,SAAAnF,EACA,UAAWuG,EAAAA,GAAG,iBAAiB,EAE9B,SAAA5F,EAAA,CAAA,CACH,EAEJ,EAIIgG,GACJhB,EAAAA,KAACa,EAAAA,QAAA,CACC,QAAQ,QACR,UAAU,qFACV,SAAAxG,EAEA,SAAA,CAAA0D,EAAAA,IAACkD,GAAAA,MAAA,CAAM,UAAU,WAAA,CAAY,EAC7BlD,EAAAA,IAAC,OAAA,CAAK,UAAU,aAAa,SAAA,aAAA,CAAW,CAAA,CAAA,CAAA,EAItCmD,GACJlB,EAAAA,KAACmB,UAAA,CAAQ,KAAMnF,EAAgB,aAAcC,GAC3C,SAAA,CAAA8B,EAAAA,IAACqD,EAAAA,eAAA,CAAe,QAAO,GAAC,SAAA/G,EACrB,SAAA2G,GACH,EACAjD,EAAAA,IAACsD,EAAAA,eAAA,CACC,UAAWT,EAAAA,GACT,sCACA,sCAAA,EAGD,SAAAE,EAAA,CAAA,CACH,EACF,EAGIQ,GACJtB,EAAAA,KAACuB,SAAA,CAAO,KAAMvF,EAAgB,aAAcC,GAC1C,SAAA,CAAA8B,EAAAA,IAACyD,EAAAA,cAAA,CAAc,QAAO,GAAE,SAAAR,GAAY,EACpChB,EAAAA,KAACyB,EAAAA,cAAA,CACC,UAAWb,EAAAA,GACT,sCACA,mCAAA,EAGF,SAAA,CAAAZ,EAAAA,KAAC0B,EAAAA,aAAA,CAAa,UAAU,aACtB,SAAA,CAAA3D,EAAAA,IAAC4D,EAAAA,aAAY,SAAA,aAAA,CAAW,EACxB5D,EAAAA,IAAC6D,EAAAA,mBAAkB,SAAA,eAAA,CAAa,CAAA,EAClC,EACCd,EAAA,CAAA,CAAA,CACH,EACF,EAIIe,GAAarG,EACnB,IAAIsG,EACAtH,IAAS,GACXsH,EAAYlI,GAA2B2B,CAAW,EACzC,OAAOf,GAAS,WACzBsH,EAAYtH,GAKd,MAAMuH,GAAqB,GAA2C,CACpE,MAAMC,EAAa,EAAE,OAAO,MACtBtI,EAAaH,GAAgByI,EAAYzG,CAAW,EAE1D,GAAI7B,EAAY,CACdgC,EAAShC,EAAW,UAAU,EAC9BmC,EAAWnC,EAAW,YAAY,EAClCqC,EAAWrC,EAAW,YAAY,EAClC,MAAMiF,EAAiBzF,GAAWQ,EAAY8B,CAAY,EAC1DxB,IAAW,EAAG2E,EAAgBjF,CAAU,EACxCO,IAAWP,EAAYiF,CAAc,CACvC,MAEEjD,EAAS,CAAC,EACVG,EAAW,CAAC,EACZE,EAAW,CAAC,EACZ/B,IAAW,EAAGgI,EAAY,MAAS,EACnC/H,IAAW,OAAW+H,CAAU,CAEpC,EAGA,OACEjE,EAAAA,IAACkE,GAAAA,QAAA,CACE,GAAG3G,GACJ,UAAS,GACT,MAAOvB,GAAS,GAChB,YAAa8H,GACb,KAAMC,EACN,SAAAzH,EACA,UAAU,oBACV,SAAU0H,GACV,WACEhB,GAAAA,SACI5F,KAAe,SACbmG,GACAJ,GACFhG,KAAgB,SACdoG,GACAJ,EAAA,CAAA,CAId"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dialog.cjs","sources":["../../../../src/components/Dialog/Dialog.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport {\n Dialog as SDialog,\n DialogContent as SDialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n DialogTrigger,\n} from \"@dsui/ui/components/dialog\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"@dsui/ui/components/alert-dialog\";\nimport { ScrollArea } from \"@dsui/ui/components/scroll-area\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { BasicAnimation } from \"@/types/variables\";\nimport { animationClass } from \"@/utils/animations\";\nimport { AlertTriangle, Info, CheckCircle2, AlertCircle } from \"lucide-react\";\nimport Button, { type ButtonProps } from \"../Button/Button\";\n\nexport type DialogVariant = \"dialog\" | \"confirm\" | \"alert\" | \"info\" | \"warning\";\nexport type DialogSize =\n | \"sm\"\n | \"md\"\n | \"lg\"\n | \"xl\"\n | \"2xl\"\n | \"3xl\"\n | \"4xl\"\n | \"full\";\nexport type DialogPosition =\n | \"center\"\n | \"top\"\n | \"bottom\"\n | \"left\"\n | \"right\"\n | \"top-left\"\n | \"top-right\"\n | \"bottom-left\"\n | \"bottom-right\";\n\nexport interface DialogButtonConfig extends Omit<ButtonProps, \"children\"> {\n text?: React.ReactNode;\n onClick?: () => void;\n}\n\nexport interface DialogProps {\n // Core props\n variant?: DialogVariant;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n\n // Content\n title?: React.ReactNode;\n description?: React.ReactNode;\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n footer?: React.ReactNode;\n\n // Behavior\n closeOnEsc?: boolean;\n closeOnOutside?: boolean;\n showCloseButton?: boolean;\n\n // Layout\n position?: DialogPosition;\n size?: DialogSize;\n fullscreen?: boolean;\n scrollable?: boolean;\n stickyHeader?: boolean;\n stickyFooter?: boolean;\n\n // Animation\n animation?: BasicAnimation;\n\n // Styling\n className?: string;\n contentClassName?: string;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n footerClassName?: string;\n overlayClassName?: string;\n\n // Overlay\n backdropFilter?: number;\n overlay?: \"dark\" | \"light\";\n\n // Alert/Confirm buttons\n confirmButton?: DialogButtonConfig;\n cancelButton?: DialogButtonConfig;\n\n // Alert/Confirm specific\n showIcon?: boolean;\n}\n\nconst variantIcons = {\n dialog: null,\n confirm: (\n <div className=\"ds:size-12 ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-success/10 ds:mx-auto ds:mb-4\">\n <CheckCircle2 className=\"ds:size-6 ds:text-success\" />\n </div>\n ),\n alert: (\n <div className=\"ds:size-12 ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-error/10 ds:mx-auto ds:mb-4\">\n <AlertCircle className=\"ds:size-5 ds:text-error\" />\n </div>\n ),\n info: (\n <div className=\"ds:size-12 ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-blue-500/10 ds:mx-auto ds:mb-4\">\n <Info className=\"ds:size-5 ds:text-blue-500\" />\n </div>\n ),\n warning: (\n <div className=\"ds:size-12 ds:flex ds:items-center ds:justify-center ds:rounded-full ds:bg-warning/10 ds:mx-auto ds:mb-4\">\n <AlertTriangle className=\"ds:size-5 ds:text-warning\" />\n </div>\n ),\n};\n\nconst variantColors = {\n dialog: \"\",\n confirm: \"border-blue-500/20\",\n alert: \"border-red-500/20\",\n info: \"border-blue-500/20\",\n warning: \"border-yellow-500/20\",\n};\n\nconst sizeClasses: Record<DialogSize, string> = {\n sm: \"ds:sm:max-w-sm\",\n md: \"ds:sm:max-w-md\",\n lg: \"ds:sm:max-w-lg\",\n xl: \"ds:sm:max-w-xl\",\n \"2xl\": \"ds:sm:max-w-2xl ds:max-h-[90vh]\",\n \"3xl\": \"ds:sm:max-w-3xl ds:max-h-[90vh]\",\n \"4xl\": \"ds:sm:max-w-4xl ds:max-h-[90vh]\",\n full: \"ds:sm:max-w-[95vw] ds:h-[98vh]\",\n};\n\nconst positionClasses: Record<DialogPosition, string> = {\n center: \"ds:!top-[50%] ds:!left-[50%] ds:!translate-x-[-50%] ds:!translate-y-[-50%]\",\n top: \"ds:!top-4 ds:!left-[50%] ds:!translate-x-[-50%] ds:!translate-y-0\",\n bottom: \"ds:!top-auto ds:!bottom-4 ds:!left-[50%] ds:!translate-x-[-50%] ds:!translate-y-0\",\n left: \"ds:!left-4 ds:!top-[50%] ds:!translate-x-0 ds:!translate-y-[-50%]\",\n right: \"ds:!left-auto ds:!right-4 ds:!top-[50%] ds:!translate-x-0 ds:!translate-y-[-50%]\",\n \"top-left\": \"ds:!top-4 ds:!left-4 ds:!translate-x-0 ds:!translate-y-0\",\n \"top-right\": \"ds:!top-4 ds:!left-auto ds:!right-4 ds:!translate-x-0 ds:!translate-y-0\",\n \"bottom-left\": \"ds:!top-auto ds:!bottom-4 ds:!left-4 ds:!translate-x-0 ds:!translate-y-0\",\n \"bottom-right\":\n \"ds:!top-auto ds:!bottom-4 ds:!left-auto ds:!right-4 ds:!translate-x-0 ds:!translate-y-0\",\n};\n\nconst Dialog = React.forwardRef<HTMLDivElement, DialogProps>((props, ref) => {\n const {\n variant = \"dialog\",\n open,\n onOpenChange,\n title,\n description,\n children,\n trigger,\n footer,\n closeOnEsc = true,\n closeOnOutside = true,\n showCloseButton = true,\n position = \"center\",\n size = \"md\",\n fullscreen = false,\n scrollable = true,\n stickyHeader = false,\n stickyFooter = false,\n animation,\n className,\n contentClassName,\n headerClassName,\n titleClassName,\n descriptionClassName,\n footerClassName,\n // overlayClassName, // Not used in current implementation\n confirmButton,\n cancelButton,\n showIcon = true,\n backdropFilter = 2,\n overlay = \"dark\",\n } = props;\n\n const animationResult = useMemo(() => {\n return animation ? animationClass(animation) : { className: \"\" };\n }, [animation]);\n\n const contentClasses = cn(\n // Remove default padding and gap to allow custom header/footer\n \"ds:!p-0 ds:!gap-0 ds:flex ds:flex-col\",\n sizeClasses[fullscreen ? \"full\" : size],\n positionClasses[position],\n variantColors[variant],\n animationResult.className,\n fullscreen ? \"ds:h-[98vh]\" : \"ds:max-h-[90vh]\"\n );\n\n const headerClasses = cn(\n \"ds:px-6 ds:pt-6 ds:text-left\",\n !scrollable && \"ds:contents ds:space-y-0\",\n headerClassName\n );\n\n const footerClasses = cn(\n \"ds:px-6 ds:pb-6 ds:sm:justify-end\",\n !scrollable && \"ds:border-t ds:py-4\",\n footerClassName\n );\n\n const icon = showIcon ? variantIcons[variant] : null;\n\n const headerComponents = useMemo(() => {\n return title || icon || description ? (\n <AlertDialogHeader\n className={cn(\n \"ds:flex ds:items-center ds:gap-2 ds:py-4\",\n { \"ds:border-b\": stickyHeader },\n headerClasses\n )}\n >\n {(title || icon) && (\n <AlertDialogTitle className={cn(titleClassName)}>\n {icon}\n {title}\n </AlertDialogTitle>\n )}\n {description && (\n <AlertDialogDescription className={descriptionClassName}>\n {description}\n </AlertDialogDescription>\n )}\n </AlertDialogHeader>\n ) : null;\n }, [\n title,\n icon,\n description,\n headerClasses,\n titleClassName,\n descriptionClassName,\n stickyHeader,\n ]);\n\n const footerComponents = useMemo(() => {\n // Merge configs with defaults\n const mergedConfirmButton: DialogButtonConfig = {\n variant: \"solid\",\n color: \"primary\",\n ...confirmButton,\n text: confirmButton?.text ?? \"Confirm\",\n };\n\n const mergedCancelButton: DialogButtonConfig = {\n variant: \"outline\",\n ...cancelButton,\n text: cancelButton?.text ?? \"Cancel\",\n };\n\n return footer || confirmButton || cancelButton ? (\n <AlertDialogFooter\n className={cn(\"ds:py-4\", { \"ds:border-t\": stickyFooter }, footerClasses)}\n >\n {footer || (\n <>\n {cancelButton && (\n <Button\n {...mergedCancelButton}\n onClick={() => {\n mergedCancelButton.onClick?.();\n }}\n >\n {mergedCancelButton.text}\n </Button>\n )}\n {confirmButton && (\n <Button\n {...mergedConfirmButton}\n onClick={() => {\n mergedConfirmButton.onClick?.();\n }}\n >\n {mergedConfirmButton.text}\n </Button>\n )}\n </>\n )}\n </AlertDialogFooter>\n ) : null;\n }, [footer, footerClasses, confirmButton, cancelButton, stickyFooter]);\n\n // For alert-style dialogs (confirm, alert, info, warning)\n if (variant !== \"dialog\") {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && headerComponents}\n\n <ScrollArea className=\"ds:flex ds:max-h-full ds:flex-col ds:overflow-hidden\">\n {!stickyHeader && headerComponents}\n {children && (\n <div className={cn(\"ds:px-6 ds:py-4\", contentClassName)}>\n {children}\n </div>\n )}\n {!stickyFooter && footerComponents}\n </ScrollArea>\n\n {stickyFooter && footerComponents}\n </AlertDialogContent>\n </AlertDialog>\n );\n }\n\n // Regular dialog\n return (\n <SDialog open={open} onOpenChange={onOpenChange}>\n {trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}\n <SDialogContent\n ref={ref}\n className={cn(className, contentClasses)}\n showCloseButton={showCloseButton}\n onEscapeKeyDown={(e) => !closeOnEsc && e.preventDefault()}\n onInteractOutside={(e) => !closeOnOutside && e.preventDefault()}\n noDefaultAnimation={!!animation}\n backdropFilter={backdropFilter}\n overlay={overlay}\n >\n {stickyHeader && (title || description) && (\n <DialogHeader\n className={cn({ \"ds:py-4 ds:border-b\": stickyHeader }, headerClasses)}\n >\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n <ScrollArea className=\"ds:flex ds:max-h-full ds:flex-col ds:overflow-hidden\">\n {!stickyHeader && (title || description) && (\n <DialogHeader className={cn(\"ds:py-4\", headerClasses)}>\n {title && (\n <DialogTitle className={titleClassName}>{title}</DialogTitle>\n )}\n {description && (\n <DialogDescription className={descriptionClassName}>\n {description}\n </DialogDescription>\n )}\n </DialogHeader>\n )}\n {children && (\n <div className={cn(\"ds:px-6 ds:py-4\", contentClassName)}>{children}</div>\n )}\n {!stickyFooter && footer && (\n <DialogFooter className={cn(\"ds:py-4\", footerClasses)}>\n {footer}\n </DialogFooter>\n )}\n </ScrollArea>\n {stickyFooter && footer && (\n <DialogFooter\n className={cn({ \"ds:py-4 ds:border-t\": stickyFooter }, footerClasses)}\n >\n {footer}\n </DialogFooter>\n )}\n </SDialogContent>\n </SDialog>\n );\n});\n\nDialog.displayName = \"Dialog\";\n\nexport default Dialog;\n"],"names":["variantIcons","jsx","CheckCircle2","AlertCircle","Info","AlertTriangle","variantColors","sizeClasses","positionClasses","Dialog","React","props","ref","variant","open","onOpenChange","title","description","children","trigger","footer","closeOnEsc","closeOnOutside","showCloseButton","position","size","fullscreen","scrollable","stickyHeader","stickyFooter","animation","className","contentClassName","headerClassName","titleClassName","descriptionClassName","footerClassName","confirmButton","cancelButton","showIcon","backdropFilter","overlay","animationResult","useMemo","animationClass","contentClasses","cn","headerClasses","footerClasses","icon","headerComponents","jsxs","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","footerComponents","mergedConfirmButton","mergedCancelButton","AlertDialogFooter","Fragment","Button","AlertDialog","AlertDialogTrigger","AlertDialogContent","e","ScrollArea","SDialog","DialogTrigger","SDialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenu.cjs","sources":["../../../../src/components/DropdownMenu/DropdownMenu.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport {\n DropdownMenu as SDropdownMenu,\n DropdownMenuTrigger as SDropdownMenuTrigger,\n DropdownMenuContent as SDropdownMenuContent,\n DropdownMenuPortal as SDropdownMenuPortal,\n DropdownMenuItem as SDropdownMenuItem,\n DropdownMenuCheckboxItem as SDropdownMenuCheckboxItem,\n DropdownMenuRadioItem as SDropdownMenuRadioItem,\n DropdownMenuRadioGroup as SDropdownMenuRadioGroup,\n DropdownMenuLabel as SDropdownMenuLabel,\n DropdownMenuSeparator as SDropdownMenuSeparator,\n DropdownMenuGroup as SDropdownMenuGroup,\n DropdownMenuSub as SDropdownMenuSub,\n DropdownMenuSubTrigger as SDropdownMenuSubTrigger,\n DropdownMenuSubContent as SDropdownMenuSubContent,\n} from \"@dsui/ui/components/dropdown-menu\";\nimport { cn } from \"@dsui/ui/lib/utils\";\n\nexport type DropdownMenuSide = \"top\" | \"right\" | \"bottom\" | \"left\";\nexport type DropdownMenuAlign = \"start\" | \"center\" | \"end\";\n\nexport type DropdownMenuItem =\n | {\n key: string;\n label?: string;\n icon?: React.ReactNode;\n children?: DropdownMenuItem[];\n type?: \"item\";\n checked?: boolean;\n disabled?: boolean;\n variant?: \"default\" | \"destructive\";\n onClick?: () => void;\n className?: string;\n }\n | {\n key: string;\n type: \"checkbox\";\n label?: string;\n icon?: React.ReactNode;\n checked?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n className?: string;\n }\n | {\n key: string;\n type: \"radio\";\n label?: string;\n icon?: React.ReactNode;\n group: string;\n checked?: boolean;\n disabled?: boolean;\n onClick?: () => void;\n className?: string;\n }\n | {\n key: string;\n type: \"separator\";\n }\n | {\n key: string;\n type: \"group\";\n label?: string;\n children: DropdownMenuItem[];\n disabled?: boolean;\n };\n\nexport interface DropdownMenuProps {\n // Core props\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n modal?: boolean;\n\n // Content\n children?: React.ReactNode;\n trigger?: React.ReactNode;\n content?: React.ReactNode;\n items?: DropdownMenuItem[];\n\n // Layout\n side?: DropdownMenuSide;\n align?: DropdownMenuAlign;\n sideOffset?: number;\n alignOffset?: number;\n\n // Portal\n portal?: boolean;\n\n // Context menu\n contextMenu?: boolean;\n\n // Styling\n className?: string;\n contentClassName?: string;\n triggerClassName?: string;\n}\n\nconst DropdownMenu = React.forwardRef<HTMLDivElement, DropdownMenuProps>(\n (props, ref) => {\n const {\n open,\n defaultOpen,\n onOpenChange,\n modal = false,\n children,\n trigger,\n content,\n items,\n side = \"bottom\",\n align = \"start\",\n sideOffset,\n alignOffset,\n portal = true,\n contextMenu = false,\n className,\n contentClassName,\n triggerClassName,\n } = props;\n\n // Context menu state\n const [contextMenuOpen, setContextMenuOpen] = useState(false);\n const [contextMenuPosition, setContextMenuPosition] = useState({\n x: 0,\n y: 0,\n });\n\n // Handle context menu trigger\n const handleContextMenu = (e: React.MouseEvent) => {\n if (contextMenu) {\n e.preventDefault();\n setContextMenuPosition({ x: e.clientX, y: e.clientY });\n setContextMenuOpen(true);\n }\n };\n\n // If children are provided (compound pattern), render them directly\n if (children) {\n return (\n <SDropdownMenu\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n modal={modal}\n >\n {children}\n </SDropdownMenu>\n );\n }\n\n // Render items if provided\n const renderItems = (menuItems: DropdownMenuItem[]): React.ReactNode => {\n return menuItems.map((item) => {\n switch (item.type) {\n case \"separator\":\n return <SDropdownMenuSeparator key={item.key} />;\n case \"group\":\n return (\n <SDropdownMenuGroup key={item.key}>\n {item.label && (\n <SDropdownMenuLabel>{item.label}</SDropdownMenuLabel>\n )}\n {renderItems(item.children)}\n </SDropdownMenuGroup>\n );\n case \"checkbox\":\n return (\n <SDropdownMenuCheckboxItem\n key={item.key}\n checked={item.checked}\n disabled={item.disabled}\n className={item.className}\n onCheckedChange={(checked: boolean) => {\n if (checked && item.onClick) {\n item.onClick();\n }\n }}\n >\n {item.icon && <span className=\"ds:mr-2\">{item.icon}</span>}\n {item.label}\n </SDropdownMenuCheckboxItem>\n );\n case \"radio\":\n return (\n <SDropdownMenuRadioGroup key={item.key} value={item.group}>\n <SDropdownMenuRadioItem\n value={item.key}\n disabled={item.disabled}\n onClick={item.onClick}\n className={item.className}\n >\n {item.icon && <span className=\"ds:mr-2\">{item.icon}</span>}\n {item.label}\n </SDropdownMenuRadioItem>\n </SDropdownMenuRadioGroup>\n );\n default: {\n // item or undefined type\n if (item.children && item.children.length > 0) {\n // Submenu\n return (\n <SDropdownMenuSub key={item.key}>\n <SDropdownMenuSubTrigger\n disabled={item.disabled}\n className={cn(\n item.disabled ? \"ds:opacity-50 ds:cursor-not-allowed\" : \"\",\n item.className\n )}\n >\n {item.icon && <span className=\"ds:mr-2\">{item.icon}</span>}\n {item.label}\n </SDropdownMenuSubTrigger>\n <SDropdownMenuSubContent>\n {renderItems(item.children)}\n </SDropdownMenuSubContent>\n </SDropdownMenuSub>\n );\n } else {\n // Regular item\n return (\n <SDropdownMenuItem\n key={item.key}\n disabled={item.disabled}\n variant={item.variant}\n onClick={item.onClick}\n className={item.className}\n >\n {item.icon && <span className=\"ds:mr-2\">{item.icon}</span>}\n {item.label}\n </SDropdownMenuItem>\n );\n }\n }\n }\n });\n };\n\n // If context menu is enabled, render differently\n if (contextMenu) {\n return (\n <>\n {/* Trigger area for context menu */}\n <div\n onContextMenu={handleContextMenu}\n className={cn(triggerClassName)}\n >\n {trigger}\n </div>\n <SDropdownMenu\n open={contextMenuOpen}\n onOpenChange={setContextMenuOpen}\n modal={modal}\n >\n <SDropdownMenuTrigger asChild>\n <div\n className=\"ds:fixed\"\n style={{\n left: contextMenuPosition.x,\n top: contextMenuPosition.y,\n width: 1,\n height: 1,\n }}\n />\n </SDropdownMenuTrigger>\n <SDropdownMenuPortal>\n <SDropdownMenuContent\n ref={ref}\n className={cn(className, contentClassName)}\n side=\"bottom\"\n align=\"start\"\n sideOffset={4}\n >\n {content}\n {items && renderItems(items)}\n </SDropdownMenuContent>\n </SDropdownMenuPortal>\n </SDropdownMenu>\n </>\n );\n }\n\n // Fallback to props-based pattern\n const triggerElement = trigger ? (\n <div onContextMenu={handleContextMenu} className={cn(triggerClassName)}>\n {trigger}\n </div>\n ) : null;\n\n const contentElement =\n content || items ? (\n <SDropdownMenuContent\n ref={ref}\n side={side}\n align={align}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n className={cn(className, contentClassName)}\n >\n {content}\n {items && renderItems(items)}\n </SDropdownMenuContent>\n ) : null;\n\n return (\n <SDropdownMenu\n open={open}\n defaultOpen={defaultOpen}\n onOpenChange={onOpenChange}\n modal={modal}\n >\n {triggerElement && (\n <SDropdownMenuTrigger asChild>{triggerElement}</SDropdownMenuTrigger>\n )}\n {portal ? (\n <SDropdownMenuPortal>{contentElement}</SDropdownMenuPortal>\n ) : (\n contentElement\n )}\n </SDropdownMenu>\n );\n }\n);\n\nDropdownMenu.displayName = \"DropdownMenu\";\n\nexport default DropdownMenu;\n"],"names":["DropdownMenu","React","props","ref","open","defaultOpen","onOpenChange","modal","children","trigger","content","items","side","align","sideOffset","alignOffset","portal","contextMenu","className","contentClassName","triggerClassName","contextMenuOpen","setContextMenuOpen","useState","contextMenuPosition","setContextMenuPosition","handleContextMenu","e","jsx","SDropdownMenu","renderItems","menuItems","item","SDropdownMenuSeparator","SDropdownMenuGroup","SDropdownMenuLabel","jsxs","SDropdownMenuCheckboxItem","checked","SDropdownMenuRadioGroup","SDropdownMenuRadioItem","SDropdownMenuSub","SDropdownMenuSubTrigger","cn","SDropdownMenuSubContent","SDropdownMenuItem","Fragment","SDropdownMenuTrigger","SDropdownMenuPortal","SDropdownMenuContent","triggerElement","contentElement"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../../src/components/DropdownMenu/index.tsx"],"sourcesContent":["import DropdownMenuWrapper, { type DropdownMenuProps } from \"./DropdownMenu\";\nimport {\n DropdownMenu as DropdownMenuPrimitive,\n DropdownMenuPortal,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuLabel,\n DropdownMenuItem,\n DropdownMenuCheckboxItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubTrigger,\n DropdownMenuSubContent,\n} from \"@dsui/ui/components/dropdown-menu\";\n\nconst DropdownMenu = Object.assign(DropdownMenuWrapper, {\n // Primitives\n Root: DropdownMenuPrimitive,\n Portal: DropdownMenuPortal,\n Trigger: DropdownMenuTrigger,\n Content: DropdownMenuContent,\n Group: DropdownMenuGroup,\n Label: DropdownMenuLabel,\n Item: DropdownMenuItem,\n CheckboxItem: DropdownMenuCheckboxItem,\n RadioGroup: DropdownMenuRadioGroup,\n RadioItem: DropdownMenuRadioItem,\n Separator: DropdownMenuSeparator,\n Shortcut: DropdownMenuShortcut,\n Sub: DropdownMenuSub,\n SubTrigger: DropdownMenuSubTrigger,\n SubContent: DropdownMenuSubContent,\n});\n\nexport { DropdownMenu };\nexport type { DropdownMenuProps, DropdownMenuItem };\n"],"names":["DropdownMenu","DropdownMenuWrapper","DropdownMenuPrimitive","DropdownMenuPortal","DropdownMenuTrigger","DropdownMenuContent","DropdownMenuGroup","DropdownMenuLabel","DropdownMenuItem","DropdownMenuCheckboxItem","DropdownMenuRadioGroup","DropdownMenuRadioItem","DropdownMenuSeparator","DropdownMenuShortcut","DropdownMenuSub","DropdownMenuSubTrigger","DropdownMenuSubContent"],"mappings":"sLAmBMA,EAAe,OAAO,OAAOC,UAAqB,CAEtD,KAAMC,EAAAA,aACN,OAAQC,EAAAA,mBACR,QAASC,EAAAA,oBACT,QAASC,EAAAA,oBACT,MAAOC,EAAAA,kBACP,MAAOC,EAAAA,kBACP,KAAMC,EAAAA,iBACN,aAAcC,EAAAA,yBACd,WAAYC,EAAAA,uBACZ,UAAWC,EAAAA,sBACX,UAAWC,EAAAA,sBACX,SAAUC,EAAAA,qBACV,IAAKC,EAAAA,gBACL,WAAYC,EAAAA,uBACZ,WAAYC,EAAAA,sBACd,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FloatLabel.cjs","sources":["../../../src/components/FloatLabel.tsx"],"sourcesContent":["import * as React from \"react\";\n\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { Label } from \"@dsui/ui/components/label\";\nimport { Tooltip } from \"./Tooltip/Tooltip\";\nimport { Info } from \"lucide-react\";\n\nconst FloatingLabel = React.forwardRef<\n React.ElementRef<typeof Label>,\n React.ComponentPropsWithoutRef<typeof Label> & {\n infoTooltip?: React.ReactNode;\n size?: string;\n shouldFloat?: boolean;\n required?: boolean;\n }\n>(\n (\n {\n className,\n infoTooltip,\n size = \"xl\",\n shouldFloat,\n required,\n children,\n ...props\n },\n ref\n ) => {\n const lagerSize = size === \"lg\" || false;\n\n return (\n <Label\n className={cn(\n \"ds:absolute ds:start-2 ds:select-none ds:pointer-events-none\",\n \"ds:bg-background ds:px-3 ds:translate-y-2\",\n \"ds:flex\",\n {\n \"ds:top-0.5 ds:origin-left ds:scale-75 ds:translate-x-1 ds:max-w-full ds:h-3 ds:py-0 ds:bg-transparent\":\n !lagerSize,\n // State empty (placeholder shown) - ở giữa input\n \"ds:peer-placeholder-shown:top-0 ds:peer-placeholder-shown:scale-100 ds:peer-placeholder-shown:translate-x-0 ds:peer-placeholder-shown:w-[calc(100%-(--spacing(4)))] ds:peer-placeholder-shown:h-[calc(100%-(--spacing(4)))] ds:peer-placeholder-shown:py-3 ds:peer-placeholder-shown:bg-background\":\n !lagerSize,\n // // State focus - nằm trên input\n \"ds:peer-focus:top-0.5 ds:peer-focus:origin-left ds:peer-focus:scale-75 ds:peer-focus:translate-x-1 ds:peer-focus:text-primary ds:peer-focus:max-w-full ds:peer-focus:h-3 ds:peer-focus:py-0 ds:peer-focus:bg-transparent\":\n !lagerSize,\n \"ds:group-focus-within:top-0.5 ds:group-focus-within:origin-left ds:group-focus-within:scale-75 ds:group-focus-within:translate-x-1 ds:group-focus-within:text-primary ds:group-focus-within:max-w-full ds:group-focus-within:h-3 ds:group-focus-within:py-0 ds:group-focus-within:bg-transparent\":\n !lagerSize,\n },\n {\n \"ds:-top-3.5 ds:origin-left ds:scale-75 ds:translate-x-0 ds:max-w-full ds:w-auto ds:h-3 ds:py-0\":\n lagerSize,\n // State empty (placeholder shown) - ở giữa input\n \"ds:peer-placeholder-shown:-top-0.5 ds:peer-placeholder-shown:scale-100 ds:peer-placeholder-shown:w-[calc(100%-(--spacing(4)))] ds:peer-placeholder-shown:h-[calc(100%-(--spacing(3)))] ds:peer-placeholder-shown:py-2 ds:peer-placeholder-shown:bg-background\":\n lagerSize,\n // // State focus - nằm trên input\n \"ds:peer-focus:-top-3.5 ds:peer-focus:origin-left ds:peer-focus:scale-75 ds:peer-focus:text-primary ds:peer-focus:max-w-full ds:peer-focus:w-auto ds:peer-focus:h-3 ds:peer-focus:py-0\":\n lagerSize,\n \"ds:group-focus-within:-top-3.5 ds:group-focus-within:origin-left ds:group-focus-within:scale-75 ds:group-focus-within:text-primary ds:group-focus-within:max-w-full ds:group-focus-within:w-auto ds:group-focus-within:h-3 ds:group-focus-within:py-0\":\n lagerSize,\n },\n\n // State when shouldFloat prop is set\n {\n \"ds:top-0.5 ds:origin-left ds:scale-75 ds:translate-x-1 ds:max-w-full ds:h-3 ds:py-0\":\n typeof shouldFloat === \"boolean\" && shouldFloat && !lagerSize,\n \"ds:top-0 ds:scale-100 ds:translate-x-0 ds:w-[calc(100%-(--spacing(4)))] ds:h-[calc(100%-(--spacing(4)))] ds:py-3 ds:bg-background\":\n typeof shouldFloat === \"boolean\" && !shouldFloat && !lagerSize,\n },\n {\n \"ds:-top-3.5 ds:origin-left ds:scale-75 ds:translate-x-0 ds:max-w-full ds:h-3 ds:py-0\":\n typeof shouldFloat === \"boolean\" && shouldFloat && lagerSize,\n \"ds:top-0 ds:scale-100 ds:translate-x-0 ds:w-[calc(100%-(--spacing(4)))] ds:h-[calc(100%-(--spacing(4)))] ds:py-3 ds:bg-background\":\n typeof shouldFloat === \"boolean\" && !shouldFloat && lagerSize,\n },\n \"ds:will-change-transform ds:transition-all ds:duration-300 ds:ease-in-out\",\n className\n )}\n ref={ref}\n {...props}\n >\n <span className=\"ds:truncate ds:whitespace-nowrap ds:max-w-full ds:pointer-events-none\">\n {children}\n {required && <span className=\"ds:text-error ds:ml-0.5\">*</span>}\n </span>\n\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"ds:size-3.5 ds:min-w-3.5 ds:z-10 ds:pointer-events-auto\" />\n </Tooltip>\n )}\n </Label>\n );\n }\n);\n\nFloatingLabel.displayName = \"FloatingLabel\";\n\nexport { FloatingLabel };\n"],"names":["FloatingLabel","React","className","infoTooltip","size","shouldFloat","required","children","props","ref","lagerSize","jsxs","Label","cn","jsx","Tooltip","Info"],"mappings":"kkBAOMA,EAAgBC,EAAM,WAS1B,CACE,CACE,UAAAC,EACA,YAAAC,EACA,KAAAC,EAAO,KACP,YAAAC,EACA,SAAAC,EACA,SAAAC,EACA,GAAGC,CAAA,EAELC,IACG,CACH,MAAMC,EAAYN,IAAS,MAAQ,GAEnC,OACEO,EAAAA,KAACC,EAAAA,MAAA,CACC,UAAWC,EAAAA,GACT,+DACA,4CACA,UACA,CACE,wGACE,CAACH,EAEH,qSACE,CAACA,EAEH,2NACE,CAACA,EACH,mSACE,CAACA,CAAA,EAEL,CACE,iGACEA,EAEF,gQACEA,EAEF,wLACEA,EACF,wPACEA,CAAA,EAIJ,CACE,sFACE,OAAOL,GAAgB,WAAaA,GAAe,CAACK,EACtD,oIACE,OAAOL,GAAgB,WAAa,CAACA,GAAe,CAACK,CAAA,EAEzD,CACE,uFACE,OAAOL,GAAgB,WAAaA,GAAeK,EACrD,oIACE,OAAOL,GAAgB,WAAa,CAACA,GAAeK,CAAA,EAExD,4EACAR,CAAA,EAEF,IAAAO,EACC,GAAGD,EAEJ,SAAA,CAAAG,EAAAA,KAAC,OAAA,CAAK,UAAU,wEACb,SAAA,CAAAJ,EACAD,GAAYQ,EAAAA,IAAC,OAAA,CAAK,UAAU,0BAA0B,SAAA,GAAA,CAAC,CAAA,EAC1D,EAECX,SACEY,UAAA,CAAQ,QAASZ,EAChB,SAAAW,EAAAA,IAACE,EAAAA,KAAA,CAAK,UAAU,yDAAA,CAA0D,CAAA,CAC5E,CAAA,CAAA,CAAA,CAIR,CACF,EAEAhB,EAAc,YAAc"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Glass.cjs","sources":["../../../../src/components/Glass/Glass.tsx"],"sourcesContent":["import { cn } from \"@dsui/ui/index\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport React from \"react\";\n\nconst glassVariants = cva(\n \"ds:inline-flex ds:items-center ds:justify-center ds:gap-2 ds:whitespace-nowrap ds:text-sm ds:font-medium ds:transition-all ds:disabled:pointer-events-none ds:disabled:opacity-50 ds:[&_svg]:pointer-events-none ds:[&_svg:not([class*='size-'])]:size-4 ds:shrink-0 ds:[&_svg]:shrink-0 ds:outline-none ds:focus-visible:border-ring ds:focus-visible:ring-ring/50 ds:focus-visible:ring-[3px] ds:aria-invalid:ring-destructive/20 ds:dark:aria-invalid:ring-destructive/40 ds:aria-invalid:border-destructive\",\n {\n variants: {},\n defaultVariants: {},\n }\n);\n\nexport type GlassProps = {\n className?: string;\n children?: React.ReactNode;\n} & VariantProps<typeof glassVariants>;\n\nconst Glass: React.FC<GlassProps> = ({ className, children }) => {\n return (\n <div\n className={cn(\n \"ds:relative ds:inline-flex ds:overflow-hidden ds:cursor-pointer ds:shadow-[0_6px_6px_rgba(0,0,0,0.2),0_0_20px_rgba(0,0,0,0.1)] ds:transition-all ds:duration-400 ds:ease-[cubic-bezier(0.175,0.885,0.32,2.2)] ds:p-0 ds:rounded-md\",\n className\n )}\n >\n <div className=\"ds:absolute ds:z-0 ds:inset-0 ds:backdrop-blur-[2.5px] ds:overflow-hidden ds:isolate ds:[filter:url(#glass-distortion)] ds:rounded-[inherit]\"></div>\n <div className=\"ds:z-1 ds:absolute ds:inset-0 ds:bg-white/25 ds:rounded-[inherit]\"></div>\n <div className=\"ds:absolute ds:inset-0 ds:z-2 ds:overflow-hidden ds:shadow-[inset_2px_2px_1px_0_rgba(255,255,255,0.5),inset_-1px_-1px_1px_1px_rgba(255,255,255,0.5)] ds:rounded-[inherit]\"></div>\n <div className=\"ds:z-3 ds:relative\">\n <div className=\"ds:text-foreground ds:[text-shadow:0px_1px_3px_rgba(255, ds:255, ds:255, ds:0.3)] ds:transition-all ds:duration-100 ds:ease-in ds:inline-flex ds:gap-2\">\n {children}\n </div>\n </div>\n <svg className=\"ds:hidden\">\n <filter\n id=\"glass-distortion\"\n x=\"0%\"\n y=\"0%\"\n width=\"100%\"\n height=\"100%\"\n filterUnits=\"objectBoundingBox\"\n >\n <feTurbulence\n type=\"fractalNoise\"\n baseFrequency=\"0.01 0.01\"\n numOctaves=\"1\"\n seed=\"5\"\n result=\"turbulence\"\n />\n\n <feComponentTransfer in=\"turbulence\" result=\"mapped\">\n <feFuncR type=\"gamma\" amplitude=\"1\" exponent=\"10\" offset=\"0.5\" />\n <feFuncG type=\"gamma\" amplitude=\"0\" exponent=\"1\" offset=\"0\" />\n <feFuncB type=\"gamma\" amplitude=\"0\" exponent=\"1\" offset=\"0.5\" />\n </feComponentTransfer>\n\n <feGaussianBlur in=\"turbulence\" stdDeviation=\"3\" result=\"softMap\" />\n\n <feSpecularLighting\n in=\"softMap\"\n surfaceScale=\"5\"\n specularConstant=\"1\"\n specularExponent=\"100\"\n lighting-color=\"white\"\n result=\"specLight\"\n >\n <fePointLight x=\"-200\" y=\"-200\" z=\"300\" />\n </feSpecularLighting>\n\n <feComposite\n in=\"specLight\"\n operator=\"arithmetic\"\n k1=\"0\"\n k2=\"1\"\n k3=\"1\"\n k4=\"0\"\n result=\"litImage\"\n />\n\n <feDisplacementMap\n in=\"SourceGraphic\"\n in2=\"softMap\"\n scale=\"120\"\n xChannelSelector=\"R\"\n yChannelSelector=\"G\"\n />\n </filter>\n </svg>\n </div>\n );\n};\n\nexport default Glass;\n"],"names":["cva","Glass","className","children","jsxs","cn","jsx"],"mappings":"4mDAIsBA,EAAAA,IACpB,kfACA,CACE,SAAU,CAAA,EACV,gBAAiB,CAAA,CAAC,CAEtB,EAOA,MAAMC,EAA8B,CAAC,CAAE,UAAAC,EAAW,SAAAC,KAE9CC,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAAA,GACT,qOACAH,CAAA,EAGF,SAAA,CAAAI,EAAAA,IAAC,MAAA,CAAI,UAAU,8IAAA,CAA+I,EAC9JA,EAAAA,IAAC,MAAA,CAAI,UAAU,mEAAA,CAAoE,EACnFA,EAAAA,IAAC,MAAA,CAAI,UAAU,2KAAA,CAA4K,EAC3LA,EAAAA,IAAC,OAAI,UAAU,qBACb,eAAC,MAAA,CAAI,UAAU,yJACZ,SAAAH,CAAA,CACH,CAAA,CACF,EACAG,EAAAA,IAAC,MAAA,CAAI,UAAU,YACb,SAAAF,EAAAA,KAAC,SAAA,CACC,GAAG,mBACH,EAAE,KACF,EAAE,KACF,MAAM,OACN,OAAO,OACP,YAAY,oBAEZ,SAAA,CAAAE,EAAAA,IAAC,eAAA,CACC,KAAK,eACL,cAAc,YACd,WAAW,IACX,KAAK,IACL,OAAO,YAAA,CAAA,EAGTF,EAAAA,KAAC,sBAAA,CAAoB,GAAG,aAAa,OAAO,SAC1C,SAAA,CAAAE,EAAAA,IAAC,UAAA,CAAQ,KAAK,QAAQ,UAAU,IAAI,SAAS,KAAK,OAAO,KAAA,CAAM,EAC/DA,EAAAA,IAAC,WAAQ,KAAK,QAAQ,UAAU,IAAI,SAAS,IAAI,OAAO,GAAA,CAAI,EAC5DA,EAAAA,IAAC,WAAQ,KAAK,QAAQ,UAAU,IAAI,SAAS,IAAI,OAAO,KAAA,CAAM,CAAA,EAChE,QAEC,iBAAA,CAAe,GAAG,aAAa,aAAa,IAAI,OAAO,UAAU,EAElEA,EAAAA,IAAC,qBAAA,CACC,GAAG,UACH,aAAa,IACb,iBAAiB,IACjB,iBAAiB,MACjB,iBAAe,QACf,OAAO,YAEP,eAAC,eAAA,CAAa,EAAE,OAAO,EAAE,OAAO,EAAE,KAAA,CAAM,CAAA,CAAA,EAG1CA,EAAAA,IAAC,cAAA,CACC,GAAG,YACH,SAAS,aACT,GAAG,IACH,GAAG,IACH,GAAG,IACH,GAAG,IACH,OAAO,UAAA,CAAA,EAGTA,EAAAA,IAAC,oBAAA,CACC,GAAG,gBACH,IAAI,UACJ,MAAM,MACN,iBAAiB,IACjB,iBAAiB,GAAA,CAAA,CACnB,CAAA,CAAA,CACF,CACF,CAAA,CAAA,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ImageViewer.cjs","sources":["../../../../src/components/ImageViewer/ImageViewer.tsx"],"sourcesContent":["import React, { useState, useCallback, useEffect } from \"react\";\nimport { ZoomIn } from \"lucide-react\";\nimport { cn } from \"@dsui/ui/index\";\n\n// Dynamic import for react-viewer to avoid SSR issues\nlet Viewer: any = null;\nif (typeof window !== \"undefined\") {\n import(\"react-viewer\").then((module) => {\n Viewer = module.default;\n });\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface ImageInfo {\n src: string;\n alt?: string;\n downloadUrl?: string;\n}\n\nexport interface ImageViewerProps {\n images: ImageInfo[];\n visible?: boolean;\n onClose?: () => void;\n activeIndex?: number;\n onIndexChange?: (_index: number) => void;\n zoomSpeed?: number;\n disableKeyboardSupport?: boolean;\n noNavbar?: boolean;\n noToolbar?: boolean;\n rotatable?: boolean;\n scalable?: boolean;\n changeable?: boolean;\n noClose?: boolean;\n minScale?: number;\n maxScale?: number;\n defaultScale?: number;\n className?: string;\n downloadable?: boolean;\n noImgDetails?: boolean;\n noResetZoomAfterChange?: boolean;\n drag?: boolean;\n}\n\nexport interface ImageViewerImageProps\n extends React.ImgHTMLAttributes<HTMLImageElement> {\n src: string;\n alt?: string;\n width?: string | number;\n height?: string | number;\n preview?: boolean;\n previewSrc?: string;\n fallback?: string;\n placeholder?: React.ReactNode | boolean;\n className?: string;\n wrapperClassName?: string;\n onPreviewClick?: () => void;\n}\n\n// ============================================================================\n// ImageViewer Component\n// ============================================================================\n\nexport const ImageViewer: React.FC<ImageViewerProps> = ({\n images,\n visible = false,\n onClose,\n activeIndex = 0,\n onIndexChange,\n zoomSpeed = 0.1,\n disableKeyboardSupport = false,\n noNavbar = false,\n noToolbar = false,\n rotatable = true,\n scalable = true,\n changeable = true,\n noClose = false,\n minScale = 0.1,\n maxScale = 50,\n defaultScale = 1,\n className,\n downloadable = false,\n noImgDetails = false,\n noResetZoomAfterChange = false,\n drag = false,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(activeIndex);\n const [ViewerComponent, setViewerComponent] = useState<any>(null);\n\n // Load Viewer dynamically on client-side only\n useEffect(() => {\n if (typeof window !== \"undefined\" && !ViewerComponent) {\n import(\"react-viewer\").then((module) => {\n setViewerComponent(() => module.default);\n });\n }\n }, [ViewerComponent]);\n\n useEffect(() => {\n setCurrentIndex(activeIndex);\n }, [activeIndex]);\n\n const handleClose = useCallback(() => {\n onClose?.();\n }, [onClose]);\n\n const handleIndexChange = useCallback(\n (_activeImage: any, index: number) => {\n setCurrentIndex(index);\n onIndexChange?.(index);\n },\n [onIndexChange]\n );\n\n // Handle download to save file locally\n const handleDownload = useCallback(() => {\n const currentImage = images[currentIndex];\n const downloadUrl = currentImage.downloadUrl || currentImage.src;\n\n // Create a temporary anchor element to trigger download\n const link = document.createElement(\"a\");\n link.href = downloadUrl;\n link.download = currentImage.alt || `image-${currentIndex + 1}`;\n\n // For cross-origin images, try to download via fetch\n fetch(downloadUrl)\n .then((response) => response.blob())\n .then((blob) => {\n const url = window.URL.createObjectURL(blob);\n link.href = url;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n window.URL.revokeObjectURL(url);\n })\n .catch(() => {\n // Fallback: do nothing if fetch fails\n });\n }, [images, currentIndex]);\n\n // Transform images to include downloadUrl\n const viewerImages = images.map((img) => ({\n src: img.src,\n alt: img.alt || \"\",\n downloadUrl: img.downloadUrl || img.src,\n }));\n\n // Don't render until Viewer is loaded\n if (!ViewerComponent) {\n return null;\n }\n\n return (\n <ViewerComponent\n visible={visible}\n onClose={handleClose}\n onMaskClick={handleClose}\n images={viewerImages}\n activeIndex={currentIndex}\n onChange={handleIndexChange}\n zoomSpeed={zoomSpeed}\n disableKeyboardSupport={disableKeyboardSupport}\n noNavbar={noNavbar}\n noToolbar={noToolbar}\n rotatable={rotatable}\n scalable={scalable}\n changeable={changeable}\n noClose={noClose}\n minScale={minScale}\n maxScale={maxScale}\n defaultScale={defaultScale}\n className={cn(\"ds:image-viewer-antd-style\", className)}\n downloadable={downloadable}\n noImgDetails={noImgDetails}\n noResetZoomAfterChange={noResetZoomAfterChange}\n showTotal={true}\n drag={drag}\n customToolbar={(toolbars: any) => {\n // Replace download button with a custom-rendered button to prevent viewer state change\n return toolbars.map((toolbar: any) => {\n if (toolbar.key === \"download\") {\n return {\n ...toolbar,\n actionType: undefined, // Remove default action\n onClick: undefined,\n render: (\n <button\n type=\"button\"\n className=\"ds:react-viewer-icon ds:react-viewer-download\"\n title=\"Download\"\n style={{\n background: \"none\",\n border: \"none\",\n cursor: \"pointer\",\n padding: 0,\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n handleDownload();\n }}\n >\n {/* SVG icon for download (Ant Design style) */}\n <svg\n width=\"20\"\n height=\"20\"\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 3v10m0 0l-4-4m4 4l4-4\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <rect\n x=\"4\"\n y=\"17\"\n width=\"12\"\n height=\"2\"\n rx=\"1\"\n fill=\"currentColor\"\n />\n </svg>\n </button>\n ),\n };\n }\n return toolbar;\n });\n }}\n />\n );\n};\n\nImageViewer.displayName = \"ImageViewer\";\n\n// ============================================================================\n// ImageViewerImage Component (Wrapper for single image with preview)\n// ============================================================================\n\nexport const ImageViewerImage: React.FC<ImageViewerImageProps> = ({\n src,\n alt = \"\",\n width,\n height,\n preview = true,\n previewSrc,\n fallback,\n placeholder,\n className,\n wrapperClassName,\n onPreviewClick,\n onError,\n ...props\n}) => {\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState(false);\n const [viewerVisible, setViewerVisible] = useState(false);\n\n const handleLoad = () => {\n setLoading(false);\n setError(false);\n };\n\n const handleError = (e: React.SyntheticEvent<HTMLImageElement, Event>) => {\n setLoading(false);\n setError(true);\n onError?.(e);\n };\n\n const handlePreview = () => {\n if (!preview) return;\n setViewerVisible(true);\n onPreviewClick?.();\n };\n\n const handleCloseViewer = () => {\n setViewerVisible(false);\n };\n\n const showPlaceholder = loading && placeholder;\n const showFallback = error && fallback;\n const showPreviewMask = preview && !loading && !error;\n\n return (\n <>\n <div\n className={cn(\n \"ds:image-viewer-root ds:relative ds:inline-block\",\n wrapperClassName\n )}\n >\n <div className=\"ds:relative ds:inline-block\">\n {showPlaceholder && (\n <div\n className=\"ds:absolute ds:inset-0 ds:flex ds:items-center ds:justify-center ds:bg-muted ds:animate-pulse\"\n style={{ width, height }}\n >\n {placeholder === true ? (\n <div className=\"ds:w-8 ds:h-8 ds:border-2 ds:border-primary ds:border-t-transparent ds:rounded-full ds:animate-spin\" />\n ) : (\n placeholder\n )}\n </div>\n )}\n\n <img\n src={showFallback ? fallback : src}\n alt={alt}\n width={width}\n height={height}\n className={cn(\n \"ds:image-viewer-img ds:max-w-full ds:h-auto ds:align-middle\",\n loading && \"ds:opacity-0\",\n className\n )}\n onLoad={handleLoad}\n onError={handleError}\n {...props}\n />\n\n {showPreviewMask && (\n <div\n onClick={handlePreview}\n className={cn(\n \"ds:image-viewer-mask ds:absolute ds:inset-0 ds:flex ds:items-center ds:justify-center ds:opacity-0 ds:hover:opacity-100 ds:transition-opacity ds:cursor-pointer\",\n \"ds:bg-black/50 ds:backdrop-blur-sm\"\n )}\n >\n <div className=\"ds:text-white ds:text-sm ds:flex ds:items-center ds:gap-2\">\n <ZoomIn className=\"ds:w-5 ds:h-5\" />\n <span>Preview</span>\n </div>\n </div>\n )}\n </div>\n </div>\n\n {/* Viewer Modal */}\n <ImageViewer\n images={[{ src: previewSrc || src, alt }]}\n visible={viewerVisible}\n onClose={handleCloseViewer}\n rotatable\n scalable\n downloadable\n />\n </>\n );\n};\n\nImageViewerImage.displayName = \"ImageViewer.Image\";\n\n// ============================================================================\n// ImageViewerGroup Component\n// ============================================================================\n\ninterface ImageViewerGroupProps {\n children: React.ReactNode;\n images: ImageInfo[];\n preview?: boolean;\n}\n\nexport const ImageViewerGroup: React.FC<ImageViewerGroupProps> = ({\n children,\n images,\n preview = true,\n}) => {\n const [viewerVisible, setViewerVisible] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n\n const handlePreview = useCallback((index: number) => {\n setCurrentIndex(index);\n setViewerVisible(true);\n }, []);\n\n const handleClose = useCallback(() => {\n setViewerVisible(false);\n }, []);\n\n const contextValue = React.useMemo(\n () => ({\n handlePreview,\n preview,\n }),\n [handlePreview, preview]\n );\n\n return (\n <>\n <ImageViewerGroupContext.Provider value={contextValue}>\n {children}\n </ImageViewerGroupContext.Provider>\n\n <ImageViewer\n images={images}\n visible={viewerVisible}\n onClose={handleClose}\n activeIndex={currentIndex}\n onIndexChange={setCurrentIndex}\n rotatable\n scalable\n downloadable\n />\n </>\n );\n};\n\nImageViewerGroup.displayName = \"ImageViewer.Group\";\n\n// Context for Group\nconst ImageViewerGroupContext = React.createContext<{\n handlePreview?: (_index: number) => void;\n preview?: boolean;\n} | null>(null);\n\n// Export with namespace\nconst ImageViewerNamespace = Object.assign(ImageViewer, {\n Image: ImageViewerImage,\n Group: ImageViewerGroup,\n});\n\nexport default ImageViewerNamespace;\n"],"names":["n","module","ImageViewer","images","visible","onClose","activeIndex","onIndexChange","zoomSpeed","disableKeyboardSupport","noNavbar","noToolbar","rotatable","scalable","changeable","noClose","minScale","maxScale","defaultScale","className","downloadable","noImgDetails","noResetZoomAfterChange","drag","currentIndex","setCurrentIndex","useState","ViewerComponent","setViewerComponent","useEffect","handleClose","useCallback","handleIndexChange","_activeImage","index","handleDownload","currentImage","downloadUrl","link","response","blob","url","viewerImages","img","jsx","cn","toolbars","toolbar","e","jsxs","ImageViewerImage","src","alt","width","height","preview","previewSrc","fallback","placeholder","wrapperClassName","onPreviewClick","onError","props","loading","setLoading","error","setError","viewerVisible","setViewerVisible","handleLoad","handleError","handlePreview","handleCloseViewer","showPlaceholder","showFallback","showPreviewMask","Fragment","ZoomIn","ImageViewerGroup","children","contextValue","React","ImageViewerGroupContext"],"mappings":"wiDAMI,OAAO,OAAW,KACpB,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAc,CAAA,EAAA,KAAAA,GAAAA,EAAA,KAAA,EAAE,KAAMC,GAAW,CAC7BA,EAAO,OAClB,CAAC,EAwDI,MAAMC,EAA0C,CAAC,CACtD,OAAAC,EACA,QAAAC,EAAU,GACV,QAAAC,EACA,YAAAC,EAAc,EACd,cAAAC,EACA,UAAAC,EAAY,GACZ,uBAAAC,EAAyB,GACzB,SAAAC,EAAW,GACX,UAAAC,EAAY,GACZ,UAAAC,EAAY,GACZ,SAAAC,EAAW,GACX,WAAAC,EAAa,GACb,QAAAC,EAAU,GACV,SAAAC,EAAW,GACX,SAAAC,EAAW,GACX,aAAAC,EAAe,EACf,UAAAC,EACA,aAAAC,EAAe,GACf,aAAAC,EAAe,GACf,uBAAAC,EAAyB,GACzB,KAAAC,EAAO,EACT,IAAM,CACJ,KAAM,CAACC,EAAcC,CAAe,EAAIC,EAAAA,SAASpB,CAAW,EACtD,CAACqB,EAAiBC,CAAkB,EAAIF,EAAAA,SAAc,IAAI,EAGhEG,EAAAA,UAAU,IAAM,CACV,OAAO,OAAW,KAAe,CAACF,GACpC,QAAA,QAAA,EAAA,KAAA,IAAA,QAAO,0BAAc,CAAA,EAAA,KAAA3B,GAAAA,EAAA,KAAA,EAAE,KAAMC,GAAW,CACtC2B,EAAmB,IAAM3B,EAAO,OAAO,CACzC,CAAC,CAEL,EAAG,CAAC0B,CAAe,CAAC,EAEpBE,EAAAA,UAAU,IAAM,CACdJ,EAAgBnB,CAAW,CAC7B,EAAG,CAACA,CAAW,CAAC,EAEhB,MAAMwB,EAAcC,EAAAA,YAAY,IAAM,CACpC1B,IAAA,CACF,EAAG,CAACA,CAAO,CAAC,EAEN2B,EAAoBD,EAAAA,YACxB,CAACE,EAAmBC,IAAkB,CACpCT,EAAgBS,CAAK,EACrB3B,IAAgB2B,CAAK,CACvB,EACA,CAAC3B,CAAa,CAAA,EAIV4B,EAAiBJ,EAAAA,YAAY,IAAM,CACvC,MAAMK,EAAejC,EAAOqB,CAAY,EAClCa,EAAcD,EAAa,aAAeA,EAAa,IAGvDE,EAAO,SAAS,cAAc,GAAG,EACvCA,EAAK,KAAOD,EACZC,EAAK,SAAWF,EAAa,KAAO,SAASZ,EAAe,CAAC,GAG7D,MAAMa,CAAW,EACd,KAAME,GAAaA,EAAS,MAAM,EAClC,KAAMC,GAAS,CACd,MAAMC,EAAM,OAAO,IAAI,gBAAgBD,CAAI,EAC3CF,EAAK,KAAOG,EACZ,SAAS,KAAK,YAAYH,CAAI,EAC9BA,EAAK,MAAA,EACL,SAAS,KAAK,YAAYA,CAAI,EAC9B,OAAO,IAAI,gBAAgBG,CAAG,CAChC,CAAC,EACA,MAAM,IAAM,CAEb,CAAC,CACL,EAAG,CAACtC,EAAQqB,CAAY,CAAC,EAGnBkB,EAAevC,EAAO,IAAKwC,IAAS,CACxC,IAAKA,EAAI,IACT,IAAKA,EAAI,KAAO,GAChB,YAAaA,EAAI,aAAeA,EAAI,GAAA,EACpC,EAGF,OAAKhB,EAKHiB,EAAAA,IAACjB,EAAA,CACC,QAAAvB,EACA,QAAS0B,EACT,YAAaA,EACb,OAAQY,EACR,YAAalB,EACb,SAAUQ,EACV,UAAAxB,EACA,uBAAAC,EACA,SAAAC,EACA,UAAAC,EACA,UAAAC,EACA,SAAAC,EACA,WAAAC,EACA,QAAAC,EACA,SAAAC,EACA,SAAAC,EACA,aAAAC,EACA,UAAW2B,EAAAA,GAAG,6BAA8B1B,CAAS,EACrD,aAAAC,EACA,aAAAC,EACA,uBAAAC,EACA,UAAW,GACX,KAAAC,EACA,cAAgBuB,GAEPA,EAAS,IAAKC,GACfA,EAAQ,MAAQ,WACX,CACL,GAAGA,EACH,WAAY,OACZ,QAAS,OACT,OACEH,EAAAA,IAAC,SAAA,CACC,KAAK,SACL,UAAU,gDACV,MAAM,WACN,MAAO,CACL,WAAY,OACZ,OAAQ,OACR,OAAQ,UACR,QAAS,CAAA,EAEX,QAAUI,GAAM,CACdA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFb,EAAA,CACF,EAGA,SAAAc,EAAAA,KAAC,MAAA,CACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAA,CAAAL,EAAAA,IAAC,OAAA,CACC,EAAE,4BACF,OAAO,eACP,YAAY,MACZ,cAAc,QACd,eAAe,OAAA,CAAA,EAEjBA,EAAAA,IAAC,OAAA,CACC,EAAE,IACF,EAAE,KACF,MAAM,KACN,OAAO,IACP,GAAG,IACH,KAAK,cAAA,CAAA,CACP,CAAA,CAAA,CACF,CAAA,CACF,EAICG,CACR,CACH,CAAA,EAnFK,IAsFX,EAEA7C,EAAY,YAAc,cAMnB,MAAMgD,EAAoD,CAAC,CAChE,IAAAC,EACA,IAAAC,EAAM,GACN,MAAAC,EACA,OAAAC,EACA,QAAAC,EAAU,GACV,WAAAC,EACA,SAAAC,EACA,YAAAC,EACA,UAAAvC,EACA,iBAAAwC,EACA,eAAAC,EACA,QAAAC,EACA,GAAGC,CACL,IAAM,CACJ,KAAM,CAACC,EAASC,CAAU,EAAItC,EAAAA,SAAS,EAAI,EACrC,CAACuC,EAAOC,CAAQ,EAAIxC,EAAAA,SAAS,EAAK,EAClC,CAACyC,EAAeC,CAAgB,EAAI1C,EAAAA,SAAS,EAAK,EAElD2C,EAAa,IAAM,CACvBL,EAAW,EAAK,EAChBE,EAAS,EAAK,CAChB,EAEMI,EAAetB,GAAqD,CACxEgB,EAAW,EAAK,EAChBE,EAAS,EAAI,EACbL,IAAUb,CAAC,CACb,EAEMuB,EAAgB,IAAM,CACrBhB,IACLa,EAAiB,EAAI,EACrBR,IAAA,EACF,EAEMY,EAAoB,IAAM,CAC9BJ,EAAiB,EAAK,CACxB,EAEMK,EAAkBV,GAAWL,EAC7BgB,EAAeT,GAASR,EACxBkB,EAAkBpB,GAAW,CAACQ,GAAW,CAACE,EAEhD,OACEhB,EAAAA,KAAA2B,WAAA,CACE,SAAA,CAAAhC,EAAAA,IAAC,MAAA,CACC,UAAWC,EAAAA,GACT,mDACAc,CAAA,EAGF,SAAAV,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACZ,SAAA,CAAAwB,GACC7B,EAAAA,IAAC,MAAA,CACC,UAAU,gGACV,MAAO,CAAE,MAAAS,EAAO,OAAAC,CAAA,EAEf,aAAgB,GACfV,EAAAA,IAAC,MAAA,CAAI,UAAU,sGAAsG,EAErHc,CAAA,CAAA,EAKNd,EAAAA,IAAC,MAAA,CACC,IAAK8B,EAAejB,EAAWN,EAC/B,IAAAC,EACA,MAAAC,EACA,OAAAC,EACA,UAAWT,EAAAA,GACT,8DACAkB,GAAW,eACX5C,CAAA,EAEF,OAAQkD,EACR,QAASC,EACR,GAAGR,CAAA,CAAA,EAGLa,GACC/B,EAAAA,IAAC,MAAA,CACC,QAAS2B,EACT,UAAW1B,EAAAA,GACT,kKACA,oCAAA,EAGF,SAAAI,EAAAA,KAAC,MAAA,CAAI,UAAU,4DACb,SAAA,CAAAL,EAAAA,IAACiC,EAAAA,OAAA,CAAO,UAAU,eAAA,CAAgB,EAClCjC,EAAAA,IAAC,QAAK,SAAA,SAAA,CAAO,CAAA,CAAA,CACf,CAAA,CAAA,CACF,CAAA,CAEJ,CAAA,CAAA,EAIFA,EAAAA,IAAC1C,EAAA,CACC,OAAQ,CAAC,CAAE,IAAKsD,GAAcL,EAAK,IAAAC,EAAK,EACxC,QAASe,EACT,QAASK,EACT,UAAS,GACT,SAAQ,GACR,aAAY,EAAA,CAAA,CACd,EACF,CAEJ,EAEAtB,EAAiB,YAAc,oBAYxB,MAAM4B,EAAoD,CAAC,CAChE,SAAAC,EACA,OAAA5E,EACA,QAAAoD,EAAU,EACZ,IAAM,CACJ,KAAM,CAACY,EAAeC,CAAgB,EAAI1C,EAAAA,SAAS,EAAK,EAClD,CAACF,EAAcC,CAAe,EAAIC,EAAAA,SAAS,CAAC,EAE5C6C,EAAgBxC,cAAaG,GAAkB,CACnDT,EAAgBS,CAAK,EACrBkC,EAAiB,EAAI,CACvB,EAAG,CAAA,CAAE,EAECtC,EAAcC,EAAAA,YAAY,IAAM,CACpCqC,EAAiB,EAAK,CACxB,EAAG,CAAA,CAAE,EAECY,EAAeC,EAAM,QACzB,KAAO,CACL,cAAAV,EACA,QAAAhB,CAAA,GAEF,CAACgB,EAAehB,CAAO,CAAA,EAGzB,OACEN,EAAAA,KAAA2B,WAAA,CACE,SAAA,CAAAhC,EAAAA,IAACsC,EAAwB,SAAxB,CAAiC,MAAOF,EACtC,SAAAD,EACH,EAEAnC,EAAAA,IAAC1C,EAAA,CACC,OAAAC,EACA,QAASgE,EACT,QAASrC,EACT,YAAaN,EACb,cAAeC,EACf,UAAS,GACT,SAAQ,GACR,aAAY,EAAA,CAAA,CACd,EACF,CAEJ,EAEAqD,EAAiB,YAAc,oBAG/B,MAAMI,EAA0BD,EAAM,cAG5B,IAAI,EAGe,OAAO,OAAO/E,EAAa,CACtD,MAAOgD,EACP,MAAO4B,CACT,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Input.cjs","sources":["../../../../src/components/Input/Input.tsx"],"sourcesContent":["import React, { type ChangeEvent } from \"react\";\nimport {\n Input as SInput,\n type InputProps as SInputProps,\n} from \"@dsui/ui/components/input\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\nimport { Eye, EyeOff, ChevronDown, ChevronUp, Info, X } from \"lucide-react\";\nimport { withMask, type Options } from \"use-mask-input\";\nimport { Tooltip } from \"../Tooltip/Tooltip\";\nimport { Label } from \"../Label\";\n\n// Re-export base input props to avoid external dependency issues\nexport type BaseInputProps = Omit<React.ComponentProps<\"input\">, \"size\"> & {\n size?: \"normal\" | \"sm\" | \"xs\" | \"lg\" | \"xl\";\n state?: \"default\" | \"success\" | \"error\" | \"warning\";\n};\n\nexport type InputProps = BaseInputProps & {\n label?: string;\n helperText?: React.ReactNode;\n isFloatLabel?: boolean;\n mask?: string;\n maskOptions?: {\n placeholder?: string;\n inputFormat?: string;\n outputFormat?: string;\n showMaskOnHover?: boolean;\n showMaskOnFocus?: boolean;\n separate?: boolean;\n } & Options;\n maxLength?: number;\n showCharCount?: boolean;\n infoTooltip?: React.ReactNode;\n clearable?: boolean;\n onClear?: () => void;\n prefixIcon?: React.ReactNode;\n suffixIcon?: React.ReactNode;\n required?: boolean;\n inputClassName?: string;\n};\n\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n label,\n helperText,\n state,\n size,\n isFloatLabel,\n type,\n mask,\n maskOptions,\n maxLength,\n showCharCount,\n infoTooltip,\n clearable,\n onClear,\n prefixIcon,\n suffixIcon,\n placeholder = \" \",\n required,\n inputClassName,\n ...props\n },\n ref\n ) => {\n // Character count state\n const [charCount, setCharCount] = React.useState(() => {\n if (typeof props.value === \"string\") return props.value.length;\n if (typeof props.defaultValue === \"string\")\n return props.defaultValue.length;\n return 0;\n });\n\n const handleInput = (e: React.ChangeEvent<HTMLInputElement>) => {\n setCharCount(e.target.value.length);\n if (props.onChange) props.onChange(e);\n };\n\n const handleClear = () => {\n if (innerRef.current) {\n innerRef.current.value = \"\";\n setCharCount(0);\n const event = {\n target: innerRef.current,\n currentTarget: innerRef.current,\n } as React.ChangeEvent<HTMLInputElement>;\n props.onChange?.(event);\n if (onClear) onClear();\n }\n };\n\n const inputId = React.useId();\n const innerRef = React.useRef<HTMLInputElement>(null);\n\n // Combine refs\n const combinedRef = React.useCallback(\n (element: HTMLInputElement | null) => {\n // Set innerRef\n if (innerRef) {\n (\n innerRef as React.MutableRefObject<HTMLInputElement | null>\n ).current = element;\n }\n\n // Apply mask if provided\n if (mask && element) {\n const maskRefCallback = withMask(mask, maskOptions);\n if (typeof maskRefCallback === \"function\") {\n maskRefCallback(element);\n }\n }\n },\n [mask, maskOptions]\n );\n\n // Expose ref to parent\n React.useImperativeHandle(ref, () => innerRef.current!);\n\n const [showPassword, setShowPassword] = React.useState(false);\n\n // State\n const helperTextStyles = {\n default: \"ds:text-muted-foreground\",\n success: \"ds:text-success\",\n warning: \"ds:text-warning\",\n error: \"ds:text-error\",\n };\n\n // Calculate current size\n const currentSize = isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size || \"normal\";\n\n // Calculate padding based on size and icons\n const getPadding = () => {\n const sizeMap = {\n xs: { prefix: \"ds:pl-8\", suffix: \"ds:pr-8\" },\n sm: { prefix: \"ds:pl-9\", suffix: \"ds:pr-9\" },\n normal: { prefix: \"ds:pl-10\", suffix: \"ds:pr-10\" },\n lg: { prefix: \"ds:pl-11\", suffix: \"ds:pr-11\" },\n xl: { prefix: \"ds:pl-12\", suffix: \"ds:pr-12\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const padding = getPadding();\n\n // Get icon size class based on current size\n const getIconSizeClass = () => {\n const sizeMap = {\n xs: \"ds:size-3\",\n sm: \"ds:size-3.5\",\n normal: \"ds:size-4\",\n lg: \"ds:size-4\",\n xl: \"ds:size-4\",\n };\n return sizeMap[currentSize as keyof typeof sizeMap] || \"ds:size-4\";\n };\n\n const iconSizeClass = getIconSizeClass();\n\n // Calculate right padding considering built-in icons\n const getRightPadding = () => {\n const hasBuiltInSuffix =\n type === \"number\" ||\n type === \"password\" ||\n type === \"datetime\" ||\n (clearable && (charCount > 0 || props?.value));\n\n if (hasBuiltInSuffix && suffixIcon) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"ds:pr-20\" // password + clear + custom icon\n : \"ds:pr-16\"; // one built-in + custom icon\n }\n\n if (hasBuiltInSuffix) {\n return type === \"password\" &&\n clearable &&\n (charCount > 0 || props?.value)\n ? \"ds:pr-16\" // password + clear\n : \"ds:pr-10\"; // single built-in icon\n }\n\n if (suffixIcon) {\n return padding.suffix;\n }\n\n return \"\";\n };\n\n // Icon position calculations\n const getIconPosition = () => {\n const sizeMap = {\n xs: { left: \"ds:left-2.5\", right: \"ds:right-2.5\" },\n sm: { left: \"ds:left-3\", right: \"ds:right-3\" },\n normal: { left: \"ds:left-3\", right: \"ds:right-3\" },\n lg: { left: \"ds:left-3.5\", right: \"ds:right-3.5\" },\n xl: { left: \"ds:left-4\", right: \"ds:right-4\" },\n };\n\n return sizeMap[currentSize as keyof typeof sizeMap] || sizeMap.normal;\n };\n\n const iconPosition = getIconPosition();\n\n /* Spinner Button Handlers */\n const handleIncrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const max = props.max ? Number(props.max) : Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.min(currentValue + step, max);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n\n const handleDecrement = () => {\n if (innerRef.current) {\n const step = Number(props.step || 1);\n const min = props.min ? Number(props.min) : -Infinity;\n const currentValue = Number(innerRef.current.value || 0);\n const newValue = Math.max(currentValue - step, min);\n\n innerRef.current.value = String(newValue);\n const event = new Event(\"input\", { bubbles: true });\n innerRef.current.dispatchEvent(event);\n props.onChange?.(event as unknown as ChangeEvent<HTMLInputElement>);\n }\n };\n /* End Spinner Button Handlers */\n\n return (\n <div className={className}>\n <div\n className={cn(\"ds:flex ds:flex-col ds:gap-1.5 ds:relative ds:flex-auto\", {\n \"ds:floating-label ds:relative\": isFloatLabel,\n })}\n >\n {!isFloatLabel && label && (\n <Label\n htmlFor={inputId}\n className=\"ds:flex ds:gap-2 ds:text-sm ds:font-medium ds:leading-none ds:peer-disabled:cursor-not-allowed ds:peer-disabled:opacity-70\"\n >\n <span>\n {label}\n {required && <span className=\"ds:text-error ds:ml-0.5\">*</span>}\n </span>\n {infoTooltip && (\n <Tooltip content={infoTooltip}>\n <Info className=\"ds:size-3.5 ds:min-w-3.5\" />\n </Tooltip>\n )}\n </Label>\n )}\n\n <div className=\"ds:relative\">\n {/* Prefix Icon */}\n {prefixIcon && (\n <div\n className={cn(\n \"ds:absolute ds:top-1/2 ds:-translate-y-1/2 ds:text-muted-foreground ds:leading-0\",\n iconPosition.left\n )}\n >\n {React.isValidElement(prefixIcon)\n ? React.cloneElement(prefixIcon, {\n className: cn(\n iconSizeClass,\n (prefixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : prefixIcon}\n </div>\n )}\n\n <SInput\n ref={combinedRef}\n id={inputId}\n className={cn(\n \"ds:peer\",\n {\n \"ds:pt-5 ds:pb-1\": isFloatLabel && size !== \"lg\",\n \"ds:[&::-webkit-outer-spin-button]:appearance-none ds:[&::-webkit-inner-spin-button]:appearance-none ds:[-moz-appearance:textfield] ds:pr-8\":\n type === \"number\",\n // \"[-webkit-text-fill-color:var(--foreground)]\": mask,\n },\n prefixIcon && padding.prefix,\n mask && \"ds:placeholder:text-slate-400 ds:placeholder:opacity-100\",\n getRightPadding(),\n inputClassName,\n )}\n state={state}\n size={\n isFloatLabel\n ? size === \"xl\" || size === \"lg\"\n ? size\n : \"xl\"\n : size\n }\n type={\n type === \"password\"\n ? showPassword\n ? \"text\"\n : \"password\"\n : type\n }\n placeholder={placeholder}\n maxLength={maxLength}\n onChange={handleInput}\n required={required}\n {...props}\n />\n {isFloatLabel && (\n <FloatingLabel\n htmlFor={inputId}\n size={size}\n infoTooltip={infoTooltip}\n required={required}\n >\n {label}\n </FloatingLabel>\n )}\n\n {/* Spinner Buttons */}\n {type === \"number\" && (\n <div className=\"ds:absolute ds:right-1 ds:top-0 ds:h-full ds:flex ds:flex-col ds:gap-0.5\">\n <button\n type=\"button\"\n onClick={handleIncrement}\n disabled={props.disabled}\n className={cn(\n \"ds:h-1/2 ds:w-6 ds:flex ds:items-center ds:justify-center ds:rounded ds:cursor-pointer ds:hover:scale-150 ds:transition-transform\",\n \"ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronUp className=\"ds:size-3\" />\n </button>\n <button\n type=\"button\"\n onClick={handleDecrement}\n disabled={props.disabled}\n className={cn(\n \"ds:h-1/2 ds:w-6 ds:flex ds:items-center ds:justify-center ds:rounded ds:cursor-pointer ds:hover:scale-150 ds:transition-transform\",\n \"ds:disabled:opacity-50 ds:disabled:cursor-not-allowed ds:disabled:hover:bg-transparent\"\n )}\n tabIndex={-1}\n >\n <ChevronDown className=\"ds:size-3\" />\n </button>\n </div>\n )}\n\n {/* Clear Button */}\n {clearable &&\n (charCount > 0 || props?.value) &&\n !props.disabled &&\n type !== \"number\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"ds:absolute ds:top-1/2 ds:-translate-y-1/2 ds:p-1 ds:rounded ds:hover:bg-accent ds:transition-colors ds:cursor-pointer\",\n type === \"password\"\n ? suffixIcon\n ? \"ds:right-14\"\n : \"ds:right-10\"\n : suffixIcon\n ? \"ds:right-10\"\n : \"ds:right-2\"\n )}\n onClick={handleClear}\n disabled={props.disabled}\n >\n <X className=\"ds:size-4\" />\n </button>\n )}\n\n {/* Show/Hide Password Button */}\n {type === \"password\" && (\n <button\n type=\"button\"\n tabIndex={-1}\n className={cn(\n \"ds:absolute ds:top-1/2 ds:-translate-y-1/2 ds:p-1 ds:rounded ds:hover:bg-accent ds:transition-colors\",\n suffixIcon ? \"ds:right-10\" : \"ds:right-2\"\n )}\n onClick={() => setShowPassword((prev) => !prev)}\n disabled={props.disabled}\n >\n {showPassword ? (\n <EyeOff className=\"ds:size-4\" />\n ) : (\n <Eye className=\"ds:size-4\" />\n )}\n </button>\n )}\n\n {/* Suffix Icon */}\n {suffixIcon && (\n <div\n className={cn(\n \"ds:absolute ds:top-1/2 ds:-translate-y-1/2 ds:text-muted-foreground ds:leading-0\",\n iconPosition.right\n )}\n >\n {React.isValidElement(suffixIcon)\n ? React.cloneElement(suffixIcon, {\n className: cn(\n iconSizeClass,\n (suffixIcon.props as any)?.className\n ),\n } as Partial<unknown>)\n : suffixIcon}\n </div>\n )}\n </div>\n\n {(helperText || (showCharCount && typeof maxLength === \"number\")) && (\n <div className=\"ds:flex ds:items-center ds:justify-between ds:text-xs ds:gap-2\">\n {helperText && (\n <p\n className={cn(\n \"ds:text-xs\",\n state ? helperTextStyles?.[state] : \"\"\n )}\n >\n {helperText}\n </p>\n )}\n {showCharCount && typeof maxLength === \"number\" && (\n <span className=\"ds:ml-auto ds:text-muted-foreground\">\n {charCount} / {maxLength}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nInput.displayName = \"Input\";\nexport default Input;\n"],"names":["Input","React","className","label","helperText","state","size","isFloatLabel","type","mask","maskOptions","maxLength","showCharCount","infoTooltip","clearable","onClear","prefixIcon","suffixIcon","placeholder","required","inputClassName","props","ref","charCount","setCharCount","handleInput","e","handleClear","innerRef","event","inputId","combinedRef","element","maskRefCallback","withMask","showPassword","setShowPassword","helperTextStyles","currentSize","padding","sizeMap","iconSizeClass","getRightPadding","hasBuiltInSuffix","iconPosition","handleIncrement","step","max","currentValue","newValue","handleDecrement","min","jsx","jsxs","cn","Label","Tooltip","Info","SInput","FloatingLabel","ChevronUp","ChevronDown","X","prev","EyeOff","Eye"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InputOTP.cjs","sources":["../../../../src/components/InputOTP/InputOTP.tsx"],"sourcesContent":["import React, { useId } from \"react\";\n\nimport {\n InputOTP as SInputOTP,\n InputOTPGroup,\n InputOTPSlot,\n type InputOTPProps as SInputOTPProps,\n REGEXP_ONLY_DIGITS,\n REGEXP_ONLY_CHARS,\n REGEXP_ONLY_DIGITS_AND_CHARS,\n inputOTPSlotVariants,\n} from \"@dsui/ui/components/input-otp\";\nimport { Label } from \"@dsui/ui/components/label\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@dsui/ui/index\";\n\nexport type InputOTPProps = Omit<\n SInputOTPProps,\n \"size\" | \"render\" | \"maxLength\"\n> & {\n label?: React.ReactNode;\n length?: number;\n inputType?: \"digits\" | \"chars\" | \"digits-and-chars\";\n size?: VariantProps<typeof inputOTPSlotVariants>[\"size\"];\n state?: VariantProps<typeof inputOTPSlotVariants>[\"state\"];\n variant?: VariantProps<typeof inputOTPSlotVariants>[\"variant\"];\n regexPattern?: string;\n helperText?: React.ReactNode;\n gapSize?: number;\n className?: string;\n rootClassName?: string;\n childClassName?: string;\n};\n\nconst InputOTP = React.forwardRef<\n React.ElementRef<typeof SInputOTP>,\n InputOTPProps\n>(\n (\n {\n label,\n inputType = \"digits\",\n regexPattern,\n length,\n size = \"normal\",\n state = \"default\",\n helperText,\n gapSize = 4,\n variant = \"outlined\",\n className,\n rootClassName,\n childClassName,\n ...rest\n },\n ref\n ) => {\n const id = useId();\n\n const pattern =\n inputType === \"digits\"\n ? REGEXP_ONLY_DIGITS\n : inputType === \"chars\"\n ? REGEXP_ONLY_CHARS\n : inputType === \"digits-and-chars\"\n ? REGEXP_ONLY_DIGITS_AND_CHARS\n : undefined;\n\n const helperTextStyles = {\n default: \"ds:text-muted-foreground\",\n success: \"ds:text-success\",\n warning: \"ds:text-warning\",\n error: \"ds:text-error\",\n };\n\n return (\n <div className={cn(\"ds:flex ds:flex-col ds:gap-1.5 ds:relative\", rootClassName)}>\n <Label htmlFor={id}>{label}</Label>\n <SInputOTP\n id={id}\n maxLength={length ?? 4}\n pattern={regexPattern ?? pattern}\n ref={ref}\n {...rest}\n >\n <InputOTPGroup\n className={cn(\n {\n \"ds:gap-2 ds:*:data-[slot=input-otp-slot]:rounded-md ds:*:data-[slot=input-otp-slot]:border\":\n variant === \"outlined\" && gapSize > 0,\n },\n className\n )}\n style={gapSize > 0 ? { gap: `${gapSize}px` } : undefined}\n >\n {Array.from({ length: length ?? 4 }).map((_, index) => (\n <InputOTPSlot\n key={index}\n index={index}\n size={size}\n state={state ?? undefined}\n variant={variant}\n className={childClassName}\n />\n ))}\n </InputOTPGroup>\n </SInputOTP>\n {helperText && (\n <p className={cn(\"ds:text-xs\", state ? helperTextStyles?.[state] : \"\")}>\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nexport default InputOTP;\n"],"names":["InputOTP","React","label","inputType","regexPattern","length","size","state","helperText","gapSize","variant","className","rootClassName","childClassName","rest","ref","id","useId","pattern","REGEXP_ONLY_DIGITS","REGEXP_ONLY_CHARS","REGEXP_ONLY_DIGITS_AND_CHARS","helperTextStyles","cn","jsx","Label","SInputOTP","InputOTPGroup","_","index","InputOTPSlot"],"mappings":"wnDAkCMA,EAAWC,EAAM,WAIrB,CACE,CAAA,MACEC,EACA,UAAAC,EAAY,SACZ,aAAAC,EACA,OAAAC,EACA,KAAAC,EAAO,SACP,MAAAC,EAAQ,UACR,WAAAC,EACA,QAAAC,EAAU,EACV,QAAAC,EAAU,WACV,UAAAC,EACA,cAAAC,EACA,eAAAC,EACA,GAAGC,CAAA,EAELC,IACG,CACH,MAAMC,EAAKC,EAAAA,MAAA,EAELC,EACJf,IAAc,SACVgB,qBACAhB,IAAc,QACZiB,oBACAjB,IAAc,mBACZkB,EAAAA,6BACA,OAEJC,EAAmB,CACvB,QAAS,2BACT,QAAS,kBACT,QAAS,kBACT,MAAO,eAAA,EAGT,cACG,MAAA,CAAI,UAAWC,EAAAA,GAAG,6CAA8CX,CAAa,EAC5E,SAAA,CAAAY,EAAAA,IAACC,EAAAA,MAAA,CAAM,QAAST,EAAK,SAAAd,EAAM,EAC3BsB,EAAAA,IAACE,EAAAA,SAAA,CACC,GAAAV,EACA,UAAWX,GAAU,EACrB,QAASD,GAAgBc,EACzB,IAAAH,EACC,GAAGD,EAEJ,SAAAU,EAAAA,IAACG,EAAAA,cAAA,CACC,UAAWJ,EAAAA,GACT,CACE,6FACEb,IAAY,YAAcD,EAAU,CAAA,EAExCE,CAAA,EAEF,MAAOF,EAAU,EAAI,CAAE,IAAK,GAAGA,CAAO,MAAS,OAE9C,SAAA,MAAM,KAAK,CAAE,OAAQJ,GAAU,CAAA,CAAG,EAAE,IAAI,CAACuB,EAAGC,IAC3CL,EAAAA,IAACM,EAAAA,aAAA,CAEC,MAAAD,EACA,KAAAvB,EACA,MAAOC,GAAS,OAChB,QAAAG,EACA,UAAWG,CAAA,EALNgB,CAAA,CAOR,CAAA,CAAA,CACH,CAAA,EAEDrB,GACCgB,EAAAA,IAAC,IAAA,CAAE,UAAWD,EAAAA,GAAG,aAAchB,EAAQe,IAAmBf,CAAK,EAAI,EAAE,EAClE,SAAAC,CAAA,CACH,CAAA,EAEJ,CAEJ,CACF"}
|