@sth87/shadcn-design-system 0.0.35 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -2
- package/dist/AI_CONTEXT.md +212 -214
- package/dist/cjs/components/Accordion/Accordion.cjs +1 -1
- package/dist/cjs/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/cjs/components/Badge/Badge.cjs +1 -1
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +1 -1
- package/dist/cjs/components/Button/Button.cjs +1 -1
- package/dist/cjs/components/Button/Button.cjs.map +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/cjs/components/Command/Command.cjs +1 -1
- package/dist/cjs/components/Command/Command.cjs.map +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/cjs/components/FloatLabel.cjs +1 -1
- package/dist/cjs/components/FloatLabel.cjs.map +1 -1
- package/dist/cjs/components/Glass/Glass.cjs +1 -1
- package/dist/cjs/components/Glass/Glass.cjs.map +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +1 -1
- package/dist/cjs/components/Input/Input.cjs +1 -1
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs.map +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs.map +1 -1
- package/dist/cjs/components/Radio/Radio.cjs +1 -1
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -1
- package/dist/cjs/components/Rate/Rate.cjs +1 -1
- package/dist/cjs/components/Rate/Rate.cjs.map +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/cjs/components/Select/Select.cjs +1 -1
- package/dist/cjs/components/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/Sheet/Sheet.cjs +2 -2
- package/dist/cjs/components/Sheet/Sheet.cjs.map +1 -1
- package/dist/cjs/components/Slider/Slider.cjs +1 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +1 -1
- package/dist/cjs/components/Switch/Switch.cjs +1 -1
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table.cjs +1 -1
- package/dist/cjs/components/Table/data-table.cjs.map +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/cjs/components/Tabs/classes.cjs +1 -1
- package/dist/cjs/components/Tabs/classes.cjs.map +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/cjs/components/TimeGridView.cjs +1 -1
- package/dist/cjs/components/TimeGridView.cjs.map +1 -1
- package/dist/cjs/components/Toast/Toast.cjs +1 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/components/Tour/Tour.cjs +1 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +1 -1
- package/dist/cjs/components/Upload/Upload.cjs +3 -3
- package/dist/cjs/components/Upload/Upload.cjs.map +1 -1
- package/dist/cjs/components/WheelColumn.cjs +1 -1
- package/dist/cjs/components/WheelColumn.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +2 -2
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +1 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +1 -0
- package/dist/cjs/packages/ui/src/components/accordion.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +1 -1
- package/dist/cjs/styles/index.css +1 -1
- package/dist/cjs/utils/animations.cjs +1 -1
- package/dist/cjs/utils/animations.cjs.map +1 -1
- package/dist/cjs/utils/css.cjs +1 -1
- package/dist/cjs/utils/css.cjs.map +1 -1
- package/dist/cjs/utils/parsers.cjs +1 -1
- package/dist/cjs/utils/parsers.cjs.map +1 -1
- package/dist/esm/components/Accordion/Accordion.js +60 -60
- package/dist/esm/components/Accordion/Accordion.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js +40 -40
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Badge/Badge.js +1 -1
- package/dist/esm/components/Badge/Badge.js.map +1 -1
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +36 -36
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/esm/components/Button/Button.js +9 -9
- package/dist/esm/components/Button/Button.js.map +1 -1
- package/dist/esm/components/Calendar/Calendar.js +4 -4
- package/dist/esm/components/Calendar/Calendar.js.map +1 -1
- package/dist/esm/components/Carousel/Carousel.js +165 -165
- package/dist/esm/components/Carousel/Carousel.js.map +1 -1
- package/dist/esm/components/Checkbox/Checkbox.js +26 -26
- package/dist/esm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/Collapsible/Collapsible.js +43 -43
- package/dist/esm/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/esm/components/Command/Command.js +28 -28
- package/dist/esm/components/Command/Command.js.map +1 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js +11 -11
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/esm/components/Cropper/Cropper.js +132 -132
- package/dist/esm/components/Cropper/Cropper.js.map +1 -1
- package/dist/esm/components/DatePicker/DatePicker.js +75 -75
- package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/RangePicker.js +136 -136
- package/dist/esm/components/DatePicker/RangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/TimePicker.js +150 -150
- package/dist/esm/components/DatePicker/TimePicker.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +114 -114
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +13 -13
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/esm/components/FloatLabel.js +44 -44
- package/dist/esm/components/FloatLabel.js.map +1 -1
- package/dist/esm/components/Glass/Glass.js +15 -15
- package/dist/esm/components/Glass/Glass.js.map +1 -1
- package/dist/esm/components/ImageViewer/ImageViewer.js +53 -53
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +1 -1
- package/dist/esm/components/Input/Input.js +104 -104
- package/dist/esm/components/Input/Input.js.map +1 -1
- package/dist/esm/components/InputOTP/InputOTP.js +16 -16
- package/dist/esm/components/InputOTP/InputOTP.js.map +1 -1
- package/dist/esm/components/Interactive/CursorFollow.js +49 -49
- package/dist/esm/components/Interactive/CursorFollow.js.map +1 -1
- package/dist/esm/components/Marquee/Marquee.js +130 -130
- package/dist/esm/components/Marquee/Marquee.js.map +1 -1
- package/dist/esm/components/Pagination/Pagination.js +68 -68
- package/dist/esm/components/Pagination/Pagination.js.map +1 -1
- package/dist/esm/components/QrCode/QrCode.js +37 -37
- package/dist/esm/components/QrCode/QrCode.js.map +1 -1
- package/dist/esm/components/Radio/Radio.js +16 -16
- package/dist/esm/components/Radio/Radio.js.map +1 -1
- package/dist/esm/components/Rate/Rate.js +62 -62
- package/dist/esm/components/Rate/Rate.js.map +1 -1
- package/dist/esm/components/Resizable/Resizable.js +6 -6
- package/dist/esm/components/Resizable/Resizable.js.map +1 -1
- package/dist/esm/components/ScrollArea/ScrollArea.js +10 -10
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/esm/components/Select/Select.js +64 -64
- package/dist/esm/components/Select/Select.js.map +1 -1
- package/dist/esm/components/Sheet/Sheet.js +21 -21
- package/dist/esm/components/Sheet/Sheet.js.map +1 -1
- package/dist/esm/components/Slider/Slider.js +54 -54
- package/dist/esm/components/Slider/Slider.js.map +1 -1
- package/dist/esm/components/Stepper/Stepper.js +198 -198
- package/dist/esm/components/Stepper/Stepper.js.map +1 -1
- package/dist/esm/components/Stepper/StepperWrapper.js +15 -15
- package/dist/esm/components/Stepper/StepperWrapper.js.map +1 -1
- package/dist/esm/components/Switch/Switch.js +38 -38
- package/dist/esm/components/Switch/Switch.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +37 -37
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +25 -25
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +64 -64
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -1
- package/dist/esm/components/Table/data-table-column-header.js +18 -18
- package/dist/esm/components/Table/data-table-column-header.js.map +1 -1
- package/dist/esm/components/Table/data-table-pagination.js +21 -21
- package/dist/esm/components/Table/data-table-pagination.js.map +1 -1
- package/dist/esm/components/Table/data-table.js +18 -18
- package/dist/esm/components/Table/data-table.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.js +242 -242
- package/dist/esm/components/Tabs/Tabs.js.map +1 -1
- package/dist/esm/components/Tabs/classes.js +51 -51
- package/dist/esm/components/Tabs/classes.js.map +1 -1
- package/dist/esm/components/Textarea/Textarea.js +49 -49
- package/dist/esm/components/Textarea/Textarea.js.map +1 -1
- package/dist/esm/components/TimeGridView.js +12 -12
- package/dist/esm/components/TimeGridView.js.map +1 -1
- package/dist/esm/components/Toast/Toast.js +45 -45
- package/dist/esm/components/Toast/Toast.js.map +1 -1
- package/dist/esm/components/Tooltip/Tooltip.js +19 -19
- package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/Tour/Tour.js +11 -11
- package/dist/esm/components/Tour/Tour.js.map +1 -1
- package/dist/esm/components/Tour/TourWrapper.js +15 -15
- package/dist/esm/components/Tour/TourWrapper.js.map +1 -1
- package/dist/esm/components/Upload/Upload.js +405 -405
- package/dist/esm/components/Upload/Upload.js.map +1 -1
- package/dist/esm/components/WheelColumn.js +47 -47
- package/dist/esm/components/WheelColumn.js.map +1 -1
- package/dist/esm/lib/TextAnimation/BlurText.js +18 -18
- package/dist/esm/lib/TextAnimation/BlurText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/CircularText.js +7 -7
- package/dist/esm/lib/TextAnimation/CircularText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js +21 -21
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +1 -1
- package/dist/esm/lib/TextAnimation/GradientText.js +4 -4
- package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RollingText.js +24 -24
- package/dist/esm/lib/TextAnimation/RollingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js +6 -6
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +9 -9
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +14 -14
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +9 -9
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +3 -3
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TypingText.js +17 -17
- package/dist/esm/lib/TextAnimation/TypingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/WritingText.js +10 -10
- package/dist/esm/lib/TextAnimation/WritingText.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +1 -0
- package/dist/esm/packages/ui/src/components/accordion.js +31 -31
- package/dist/esm/packages/ui/src/components/accordion.js.map +1 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js +33 -33
- package/dist/esm/packages/ui/src/components/alert-dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/avatar.js +20 -20
- package/dist/esm/packages/ui/src/components/avatar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/badge.js +53 -53
- package/dist/esm/packages/ui/src/components/badge.js.map +1 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js +20 -20
- package/dist/esm/packages/ui/src/components/breadcrumb.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button-group.js +31 -31
- package/dist/esm/packages/ui/src/components/button-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button.js +90 -90
- package/dist/esm/packages/ui/src/components/button.js.map +1 -1
- package/dist/esm/packages/ui/src/components/calendar.js +94 -94
- package/dist/esm/packages/ui/src/components/calendar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/checkbox.js +47 -47
- package/dist/esm/packages/ui/src/components/checkbox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/combobox.js +64 -64
- package/dist/esm/packages/ui/src/components/combobox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/command.js +77 -77
- package/dist/esm/packages/ui/src/components/command.js.map +1 -1
- package/dist/esm/packages/ui/src/components/context-menu.js +76 -76
- package/dist/esm/packages/ui/src/components/context-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dialog.js +54 -54
- package/dist/esm/packages/ui/src/components/dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/drawer.js +39 -39
- package/dist/esm/packages/ui/src/components/drawer.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js +109 -109
- package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input-otp.js +30 -30
- package/dist/esm/packages/ui/src/components/input-otp.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input.js +19 -19
- package/dist/esm/packages/ui/src/components/input.js.map +1 -1
- package/dist/esm/packages/ui/src/components/label.js +9 -9
- package/dist/esm/packages/ui/src/components/label.js.map +1 -1
- package/dist/esm/packages/ui/src/components/pagination.js +26 -26
- package/dist/esm/packages/ui/src/components/pagination.js.map +1 -1
- package/dist/esm/packages/ui/src/components/popover.js +13 -13
- package/dist/esm/packages/ui/src/components/popover.js.map +1 -1
- package/dist/esm/packages/ui/src/components/radio-group.js +45 -45
- package/dist/esm/packages/ui/src/components/radio-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/resizable.js +18 -18
- package/dist/esm/packages/ui/src/components/resizable.js.map +1 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js +31 -31
- package/dist/esm/packages/ui/src/components/scroll-area.js.map +1 -1
- package/dist/esm/packages/ui/src/components/select.js +119 -119
- package/dist/esm/packages/ui/src/components/select.js.map +1 -1
- package/dist/esm/packages/ui/src/components/separator.js +86 -86
- package/dist/esm/packages/ui/src/components/separator.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sheet.js +50 -50
- package/dist/esm/packages/ui/src/components/sheet.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sidebar.js +198 -198
- package/dist/esm/packages/ui/src/components/sidebar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/skeleton.js +3 -3
- package/dist/esm/packages/ui/src/components/skeleton.js.map +1 -1
- package/dist/esm/packages/ui/src/components/switch.js +57 -57
- package/dist/esm/packages/ui/src/components/switch.js.map +1 -1
- package/dist/esm/packages/ui/src/components/table.js +17 -17
- package/dist/esm/packages/ui/src/components/table.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tabs.js +33 -33
- package/dist/esm/packages/ui/src/components/tabs.js.map +1 -1
- package/dist/esm/packages/ui/src/components/textarea.js +17 -17
- package/dist/esm/packages/ui/src/components/textarea.js.map +1 -1
- package/dist/esm/packages/ui/src/components/toggle.js +36 -36
- package/dist/esm/packages/ui/src/components/toggle.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tooltip.js +20 -20
- package/dist/esm/packages/ui/src/components/tooltip.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tree-view.js +218 -218
- package/dist/esm/packages/ui/src/components/tree-view.js.map +1 -1
- package/dist/esm/styles/index.css +1 -1
- package/dist/esm/utils/animations.js +55 -55
- package/dist/esm/utils/animations.js.map +1 -1
- package/dist/esm/utils/css.js +7 -7
- package/dist/esm/utils/css.js.map +1 -1
- package/dist/esm/utils/parsers.js +1 -1
- package/dist/types/components/DatePicker/RangePicker.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TypingText.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +0 -1
- /package/dist/cjs/node_modules/.pnpm/{nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.cjs +0 -0
- /package/dist/esm/node_modules/.pnpm/{nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Marquee.cjs","sources":["../../../../src/components/Marquee/Marquee.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst ROOT_NAME = \"Marquee\";\nconst CONTENT_NAME = \"MarqueeContent\";\n\ntype Side = \"left\" | \"right\" | \"top\" | \"bottom\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype Direction = \"ltr\" | \"rtl\";\n\ntype RootElement = React.ComponentRef<typeof MarqueeRoot>;\ntype ContentElement = React.ComponentRef<typeof MarqueeContent>;\n\ninterface Dimensions {\n width: number;\n height: number;\n}\n\ninterface ElementDimensions {\n rootSize: number;\n contentSize: number;\n}\n\nfunction createResizeObserverStore() {\n const listeners = new Set<() => void>();\n let observer: ResizeObserver | null = null;\n const elements = new Map<Element, Dimensions>();\n const refCounts = new Map<Element, number>();\n const isSupported = typeof ResizeObserver !== \"undefined\";\n let notificationScheduled = false;\n\n const snapshotCache = new WeakMap<\n Element,\n WeakMap<\n Element,\n { horizontal: ElementDimensions; vertical: ElementDimensions }\n >\n >();\n\n function notify() {\n if (notificationScheduled) return;\n notificationScheduled = true;\n queueMicrotask(() => {\n notificationScheduled = false;\n for (const callback of listeners) {\n callback();\n }\n });\n }\n\n function cleanup() {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n elements.clear();\n refCounts.clear();\n }\n\n function subscribe(callback: () => void) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) {\n cleanup();\n }\n };\n }\n\n function getSnapshot(\n rootElement: RootElement | null,\n contentElement: ContentElement | null,\n orientation: Orientation\n ): ElementDimensions | null {\n if (!rootElement || !contentElement) return null;\n\n const rootDims = elements.get(rootElement);\n const contentDims = elements.get(contentElement);\n\n if (!rootDims || !contentDims) return null;\n\n const rootSize =\n orientation === \"vertical\" ? rootDims.height : rootDims.width;\n const contentSize =\n orientation === \"vertical\" ? contentDims.height : contentDims.width;\n\n let rootCache = snapshotCache.get(rootElement);\n if (!rootCache) {\n rootCache = new WeakMap();\n snapshotCache.set(rootElement, rootCache);\n }\n\n let contentCache = rootCache.get(contentElement);\n if (!contentCache) {\n contentCache = {\n horizontal: { rootSize: -1, contentSize: -1 },\n vertical: { rootSize: -1, contentSize: -1 },\n };\n rootCache.set(contentElement, contentCache);\n }\n\n const cached = contentCache[orientation];\n if (cached.rootSize === rootSize && cached.contentSize === contentSize) {\n return cached;\n }\n\n const snapshot = { rootSize, contentSize };\n contentCache[orientation] = snapshot;\n return snapshot;\n }\n\n function observe(\n rootElement: RootElement | null,\n contentElement: Element | null\n ) {\n if (!isSupported || !rootElement || !contentElement) return;\n\n if (!observer) {\n observer = new ResizeObserver((entries) => {\n let hasChanged = false;\n\n for (const entry of entries) {\n const element = entry.target;\n const { width, height } = entry.contentRect;\n\n const currentData = elements.get(element);\n\n if (\n !currentData ||\n currentData.width !== width ||\n currentData.height !== height\n ) {\n elements.set(element, { width, height });\n hasChanged = true;\n }\n }\n\n if (hasChanged) {\n notify();\n }\n });\n }\n\n refCounts.set(rootElement, (refCounts.get(rootElement) ?? 0) + 1);\n refCounts.set(contentElement, (refCounts.get(contentElement) ?? 0) + 1);\n\n observer.observe(rootElement);\n observer.observe(contentElement);\n\n const rootRect = rootElement.getBoundingClientRect();\n const contentRect = contentElement.getBoundingClientRect();\n\n const rootData = { width: rootRect.width, height: rootRect.height };\n const contentData = {\n width: contentRect.width,\n height: contentRect.height,\n };\n\n elements.set(rootElement, rootData);\n elements.set(contentElement, contentData);\n\n if (\n rootData.width > 0 &&\n rootData.height > 0 &&\n contentData.width > 0 &&\n contentData.height > 0\n ) {\n notify();\n }\n }\n\n function unobserve(\n rootElement: RootElement | null,\n contentElement: Element | null\n ) {\n if (!observer || !rootElement || !contentElement) return;\n\n const rootCount = (refCounts.get(rootElement) ?? 1) - 1;\n const contentCount = (refCounts.get(contentElement) ?? 1) - 1;\n\n if (rootCount <= 0) {\n observer.unobserve(rootElement);\n elements.delete(rootElement);\n refCounts.delete(rootElement);\n } else {\n refCounts.set(rootElement, rootCount);\n }\n\n if (contentCount <= 0) {\n observer.unobserve(contentElement);\n elements.delete(contentElement);\n refCounts.delete(contentElement);\n } else {\n refCounts.set(contentElement, contentCount);\n }\n }\n\n return {\n subscribe,\n getSnapshot,\n observe,\n unobserve,\n };\n}\n\nconst resizeObserverStore = createResizeObserverStore();\n\nfunction useResizeObserverStore(\n rootRef: React.RefObject<RootElement | null>,\n contentRef: React.RefObject<ContentElement | null>,\n orientation: Orientation\n) {\n const onSubscribe = React.useCallback(\n (callback: () => void) => resizeObserverStore.subscribe(callback),\n []\n );\n\n const getSnapshot = React.useCallback(\n () =>\n resizeObserverStore.getSnapshot(\n rootRef.current,\n contentRef.current,\n orientation\n ),\n [rootRef, contentRef, orientation]\n );\n\n return React.useSyncExternalStore(onSubscribe, getSnapshot, getSnapshot);\n}\n\nconst DirectionContext = React.createContext<Direction | undefined>(undefined);\n\nfunction useDirection(dir?: Direction): Direction {\n const contextDir = React.useContext(DirectionContext);\n return dir ?? contextDir ?? \"ltr\";\n}\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ninterface MarqueeContextValue {\n side: Side;\n orientation: Orientation;\n dir: Direction;\n speed: number;\n loopCount: number;\n contentRef: React.RefObject<ContentElement | null>;\n rootRef: React.RefObject<RootElement | null>;\n autoFill: boolean;\n pauseOnHover: boolean;\n pauseOnKeyboard: boolean;\n reverse: boolean;\n paused: boolean;\n}\n\nconst MarqueeContext = React.createContext<MarqueeContextValue | null>(null);\n\nfunction useMarqueeContext(consumerName: string) {\n const context = React.useContext(MarqueeContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface MarqueeRootProps extends DivProps {\n side?: Side;\n dir?: Direction;\n speed?: number;\n delay?: number;\n loopCount?: number;\n gap?: string | number;\n autoFill?: boolean;\n pauseOnHover?: boolean;\n pauseOnKeyboard?: boolean;\n reverse?: boolean;\n}\n\nfunction MarqueeRoot(props: MarqueeRootProps) {\n const {\n side = \"left\",\n dir: dirProp,\n speed = 50,\n delay = 0,\n loopCount = 0,\n gap = \"1rem\",\n asChild,\n autoFill = false,\n pauseOnHover = false,\n pauseOnKeyboard = false,\n reverse = false,\n className,\n style: styleProp,\n ref,\n ...marqueeProps\n } = props;\n\n const orientation: Orientation =\n side === \"top\" || side === \"bottom\" ? \"vertical\" : \"horizontal\";\n\n const dir = useDirection(dirProp);\n\n const rootRef = React.useRef<RootElement>(null);\n const contentRef = React.useRef<ContentElement>(null);\n const composedRef = useComposedRefs(ref, rootRef);\n\n const [paused, setPaused] = React.useState(false);\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (pauseOnKeyboard && event.key === \" \") {\n event.preventDefault();\n setPaused((prev) => !prev);\n }\n },\n [pauseOnKeyboard]\n );\n\n const dimensions = useResizeObserverStore(rootRef, contentRef, orientation);\n\n const duration = React.useMemo(() => {\n const safeSpeed = Math.max(0.001, speed);\n\n if (!dimensions) {\n const defaultDistance = autoFill ? 1000 : 2000;\n return defaultDistance / safeSpeed;\n }\n\n const { rootSize, contentSize } = dimensions;\n\n if (autoFill) {\n const multiplier =\n contentSize < rootSize ? Math.ceil(rootSize / contentSize) : 1;\n return (contentSize * multiplier) / safeSpeed;\n } else {\n return contentSize < rootSize\n ? rootSize / safeSpeed\n : contentSize / safeSpeed;\n }\n }, [dimensions, speed, autoFill]);\n\n const style = React.useMemo<React.CSSProperties>(\n () => ({\n \"--marquee-duration\": `${duration}s`,\n \"--marquee-gap\": gap,\n \"--marquee-delay\": `${delay}s`,\n \"--marquee-loop-count\":\n loopCount === 0 || loopCount === Infinity\n ? \"infinite\"\n : loopCount.toString(),\n ...styleProp,\n }),\n [duration, gap, delay, loopCount, styleProp]\n );\n\n const contextValue = React.useMemo<MarqueeContextValue>(\n () => ({\n side,\n orientation,\n dir,\n speed,\n loopCount,\n contentRef,\n rootRef,\n autoFill,\n paused,\n pauseOnHover,\n pauseOnKeyboard,\n reverse,\n }),\n [\n side,\n orientation,\n dir,\n speed,\n loopCount,\n autoFill,\n paused,\n pauseOnHover,\n pauseOnKeyboard,\n reverse,\n ]\n );\n\n const MarqueePrimitive = asChild ? Slot : \"div\";\n\n return (\n <MarqueeContext.Provider value={contextValue}>\n <div data-slot=\"marquee-wrapper\" className=\"grid\">\n <MarqueePrimitive\n role=\"marquee\"\n aria-live=\"off\"\n data-orientation={orientation}\n data-slot=\"marquee\"\n dir={dir}\n tabIndex={pauseOnKeyboard ? 0 : undefined}\n {...marqueeProps}\n ref={composedRef}\n className={cn(\n \"relative flex overflow-hidden motion-reduce:animate-none\",\n orientation === \"vertical\" && \"h-full flex-col\",\n orientation === \"horizontal\" && \"w-full\",\n paused && \"[&_*]:[animation-play-state:paused]\",\n pauseOnHover && \"group\",\n pauseOnKeyboard &&\n \"rounded-md focus-visible:border-ring focus-visible:outline-none focus-visible:ring-[3px] focus-visible:ring-ring/50\",\n className\n )}\n style={style}\n onKeyDown={pauseOnKeyboard ? onKeyDown : undefined}\n />\n </div>\n </MarqueeContext.Provider>\n );\n}\n\nconst marqueeContentVariants = cva(\n \"flex min-w-full shrink-0 gap-(--marquee-gap)\",\n {\n variants: {\n side: {\n left: \"animate-marquee-left\",\n right: \"animate-marquee-right\",\n top: \"min-h-full min-w-auto animate-marquee-up flex-col\",\n bottom: \"min-h-full min-w-auto animate-marquee-down flex-col\",\n },\n dir: {\n ltr: \"\",\n rtl: \"\",\n },\n pauseOnHover: {\n true: \"group-hover:[animation-play-state:paused]\",\n false: \"\",\n },\n reverse: {\n true: \"[animation-direction:reverse]\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n side: \"left\",\n dir: \"rtl\",\n className: \"animate-marquee-left-rtl\",\n },\n {\n side: \"right\",\n dir: \"rtl\",\n className: \"animate-marquee-right-rtl\",\n },\n ],\n defaultVariants: {\n side: \"left\",\n dir: \"ltr\",\n pauseOnHover: false,\n reverse: false,\n },\n }\n);\n\nfunction MarqueeContent(props: DivProps) {\n const {\n className,\n asChild,\n ref,\n children,\n style: styleProp,\n ...contentProps\n } = props;\n\n const context = useMarqueeContext(CONTENT_NAME);\n const composedRef = useComposedRefs(ref, context.contentRef);\n\n const isVertical = context.orientation === \"vertical\";\n const isRtl = context.dir === \"rtl\";\n\n const dimensions = useResizeObserverStore(\n context.rootRef,\n context.contentRef,\n context.orientation\n );\n\n React.useEffect(() => {\n if (context.rootRef.current && context.contentRef.current) {\n resizeObserverStore.observe(\n context.rootRef.current,\n context.contentRef.current\n );\n\n return () => {\n resizeObserverStore.unobserve(\n context.rootRef.current,\n context.contentRef.current\n );\n };\n }\n }, [context.rootRef, context.contentRef]);\n\n const multiplier = React.useMemo(() => {\n if (!context.autoFill || !dimensions) return 1;\n\n const { rootSize, contentSize } = dimensions;\n if (contentSize === 0) return 1;\n\n return contentSize < rootSize ? Math.ceil(rootSize / contentSize) : 1;\n }, [context.autoFill, dimensions]);\n\n const onMultipliedChildrenRender = React.useCallback(\n (count: number) => {\n return Array.from({ length: Math.max(0, count) }).map((_, i) => (\n <React.Fragment key={i}>{children}</React.Fragment>\n ));\n },\n [children]\n );\n\n const style = React.useMemo(\n () => ({\n ...styleProp,\n animationDuration: \"var(--marquee-duration)\",\n animationDelay: \"var(--marquee-delay)\",\n animationIterationCount: \"var(--marquee-loop-count)\",\n animationDirection: context.reverse ? \"reverse\" : \"normal\",\n }),\n [styleProp, context.reverse]\n );\n\n const ContentPrimitive = asChild ? Slot : \"div\";\n\n return (\n <>\n <ContentPrimitive\n data-orientation={context.orientation}\n data-slot=\"marquee-content\"\n {...contentProps}\n style={style}\n className={cn(\n marqueeContentVariants({\n side: context.side,\n dir: context.dir,\n pauseOnHover: context.pauseOnHover,\n reverse: context.reverse,\n className,\n }),\n isVertical && \"flex-col\",\n isVertical\n ? \"mb-(--marquee-gap)\"\n : isRtl\n ? \"ml-(--marquee-gap)\"\n : \"mr-(--marquee-gap)\"\n )}\n >\n <div\n ref={composedRef}\n className={cn(\n \"flex shrink-0 gap-(--marquee-gap)\",\n isVertical && \"flex-col\"\n )}\n >\n {children}\n </div>\n {onMultipliedChildrenRender(multiplier - 1)}\n </ContentPrimitive>\n <ContentPrimitive\n role=\"presentation\"\n aria-hidden=\"true\"\n {...contentProps}\n style={style}\n className={cn(\n marqueeContentVariants({\n side: context.side,\n dir: context.dir,\n pauseOnHover: context.pauseOnHover,\n reverse: context.reverse,\n className,\n }),\n isVertical && \"flex-col\"\n )}\n >\n {onMultipliedChildrenRender(multiplier)}\n </ContentPrimitive>\n </>\n );\n}\n\nfunction MarqueeItem(props: DivProps) {\n const { className, asChild, ...itemProps } = props;\n\n const ItemPrimitive = asChild ? Slot : \"div\";\n\n return (\n <ItemPrimitive\n data-slot=\"marquee-item\"\n {...itemProps}\n className={cn(\"shrink-0\", className)}\n />\n );\n}\n\nconst marqueeEdgeVariants = cva(\"pointer-events-none absolute z-10\", {\n variants: {\n side: {\n left: \"top-0 left-0 h-full bg-gradient-to-r from-background to-transparent\",\n right:\n \"top-0 right-0 h-full bg-gradient-to-l from-background to-transparent\",\n top: \"top-0 left-0 w-full bg-gradient-to-b from-background to-transparent\",\n bottom:\n \"bottom-0 left-0 w-full bg-gradient-to-t from-background to-transparent\",\n },\n size: {\n default: \"\",\n sm: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n {\n side: [\"left\", \"right\"],\n size: \"default\",\n className: \"w-1/4\",\n },\n {\n side: [\"left\", \"right\"],\n size: \"sm\",\n className: \"w-1/6\",\n },\n {\n side: [\"left\", \"right\"],\n size: \"lg\",\n className: \"w-1/3\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"default\",\n className: \"h-1/4\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"sm\",\n className: \"h-1/6\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"lg\",\n className: \"h-1/3\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n },\n});\n\ninterface MarqueeEdgeProps\n extends VariantProps<typeof marqueeEdgeVariants>,\n DivProps {}\n\nfunction MarqueeEdge(props: MarqueeEdgeProps) {\n const { side, size, className, asChild, ...edgeProps } = props;\n\n const EdgePrimitive = asChild ? Slot : \"div\";\n\n return (\n <EdgePrimitive\n data-size={size}\n data-slot=\"marquee-edge\"\n {...edgeProps}\n className={cn(marqueeEdgeVariants({ side, size, className }))}\n />\n );\n}\n\nexport {\n MarqueeRoot as Root,\n MarqueeContent as Content,\n MarqueeItem as Item,\n MarqueeEdge as Edge,\n //\n MarqueeRoot as Marquee,\n MarqueeContent,\n MarqueeItem,\n MarqueeEdge,\n // types\n type MarqueeRootProps,\n type MarqueeEdgeProps,\n};\n"],"names":["ROOT_NAME","CONTENT_NAME","createResizeObserverStore","listeners","observer","elements","refCounts","isSupported","notificationScheduled","snapshotCache","notify","callback","cleanup","subscribe","getSnapshot","rootElement","contentElement","orientation","rootDims","contentDims","rootSize","contentSize","rootCache","contentCache","cached","snapshot","observe","entries","hasChanged","entry","element","width","height","currentData","rootRect","contentRect","rootData","contentData","unobserve","rootCount","contentCount","resizeObserverStore","useResizeObserverStore","rootRef","contentRef","onSubscribe","React","DirectionContext","useDirection","dir","contextDir","MarqueeContext","useMarqueeContext","consumerName","context","MarqueeRoot","props","side","dirProp","speed","delay","loopCount","gap","asChild","autoFill","pauseOnHover","pauseOnKeyboard","reverse","className","styleProp","ref","marqueeProps","composedRef","useComposedRefs","paused","setPaused","onKeyDown","event","prev","dimensions","duration","safeSpeed","multiplier","style","contextValue","MarqueePrimitive","Slot","jsx","cn","marqueeContentVariants","cva","MarqueeContent","children","contentProps","isVertical","isRtl","onMultipliedChildrenRender","count","_","i","ContentPrimitive","jsxs","Fragment","MarqueeItem","itemProps","ItemPrimitive","marqueeEdgeVariants","MarqueeEdge","size","edgeProps","EdgePrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Marquee.cjs","sources":["../../../../src/components/Marquee/Marquee.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst ROOT_NAME = \"Marquee\";\nconst CONTENT_NAME = \"MarqueeContent\";\n\ntype Side = \"left\" | \"right\" | \"top\" | \"bottom\";\ntype Orientation = \"horizontal\" | \"vertical\";\ntype Direction = \"ltr\" | \"rtl\";\n\ntype RootElement = React.ComponentRef<typeof MarqueeRoot>;\ntype ContentElement = React.ComponentRef<typeof MarqueeContent>;\n\ninterface Dimensions {\n width: number;\n height: number;\n}\n\ninterface ElementDimensions {\n rootSize: number;\n contentSize: number;\n}\n\nfunction createResizeObserverStore() {\n const listeners = new Set<() => void>();\n let observer: ResizeObserver | null = null;\n const elements = new Map<Element, Dimensions>();\n const refCounts = new Map<Element, number>();\n const isSupported = typeof ResizeObserver !== \"undefined\";\n let notificationScheduled = false;\n\n const snapshotCache = new WeakMap<\n Element,\n WeakMap<\n Element,\n { horizontal: ElementDimensions; vertical: ElementDimensions }\n >\n >();\n\n function notify() {\n if (notificationScheduled) return;\n notificationScheduled = true;\n queueMicrotask(() => {\n notificationScheduled = false;\n for (const callback of listeners) {\n callback();\n }\n });\n }\n\n function cleanup() {\n if (observer) {\n observer.disconnect();\n observer = null;\n }\n elements.clear();\n refCounts.clear();\n }\n\n function subscribe(callback: () => void) {\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n if (listeners.size === 0) {\n cleanup();\n }\n };\n }\n\n function getSnapshot(\n rootElement: RootElement | null,\n contentElement: ContentElement | null,\n orientation: Orientation\n ): ElementDimensions | null {\n if (!rootElement || !contentElement) return null;\n\n const rootDims = elements.get(rootElement);\n const contentDims = elements.get(contentElement);\n\n if (!rootDims || !contentDims) return null;\n\n const rootSize =\n orientation === \"vertical\" ? rootDims.height : rootDims.width;\n const contentSize =\n orientation === \"vertical\" ? contentDims.height : contentDims.width;\n\n let rootCache = snapshotCache.get(rootElement);\n if (!rootCache) {\n rootCache = new WeakMap();\n snapshotCache.set(rootElement, rootCache);\n }\n\n let contentCache = rootCache.get(contentElement);\n if (!contentCache) {\n contentCache = {\n horizontal: { rootSize: -1, contentSize: -1 },\n vertical: { rootSize: -1, contentSize: -1 },\n };\n rootCache.set(contentElement, contentCache);\n }\n\n const cached = contentCache[orientation];\n if (cached.rootSize === rootSize && cached.contentSize === contentSize) {\n return cached;\n }\n\n const snapshot = { rootSize, contentSize };\n contentCache[orientation] = snapshot;\n return snapshot;\n }\n\n function observe(\n rootElement: RootElement | null,\n contentElement: Element | null\n ) {\n if (!isSupported || !rootElement || !contentElement) return;\n\n if (!observer) {\n observer = new ResizeObserver((entries) => {\n let hasChanged = false;\n\n for (const entry of entries) {\n const element = entry.target;\n const { width, height } = entry.contentRect;\n\n const currentData = elements.get(element);\n\n if (\n !currentData ||\n currentData.width !== width ||\n currentData.height !== height\n ) {\n elements.set(element, { width, height });\n hasChanged = true;\n }\n }\n\n if (hasChanged) {\n notify();\n }\n });\n }\n\n refCounts.set(rootElement, (refCounts.get(rootElement) ?? 0) + 1);\n refCounts.set(contentElement, (refCounts.get(contentElement) ?? 0) + 1);\n\n observer.observe(rootElement);\n observer.observe(contentElement);\n\n const rootRect = rootElement.getBoundingClientRect();\n const contentRect = contentElement.getBoundingClientRect();\n\n const rootData = { width: rootRect.width, height: rootRect.height };\n const contentData = {\n width: contentRect.width,\n height: contentRect.height,\n };\n\n elements.set(rootElement, rootData);\n elements.set(contentElement, contentData);\n\n if (\n rootData.width > 0 &&\n rootData.height > 0 &&\n contentData.width > 0 &&\n contentData.height > 0\n ) {\n notify();\n }\n }\n\n function unobserve(\n rootElement: RootElement | null,\n contentElement: Element | null\n ) {\n if (!observer || !rootElement || !contentElement) return;\n\n const rootCount = (refCounts.get(rootElement) ?? 1) - 1;\n const contentCount = (refCounts.get(contentElement) ?? 1) - 1;\n\n if (rootCount <= 0) {\n observer.unobserve(rootElement);\n elements.delete(rootElement);\n refCounts.delete(rootElement);\n } else {\n refCounts.set(rootElement, rootCount);\n }\n\n if (contentCount <= 0) {\n observer.unobserve(contentElement);\n elements.delete(contentElement);\n refCounts.delete(contentElement);\n } else {\n refCounts.set(contentElement, contentCount);\n }\n }\n\n return {\n subscribe,\n getSnapshot,\n observe,\n unobserve,\n };\n}\n\nconst resizeObserverStore = createResizeObserverStore();\n\nfunction useResizeObserverStore(\n rootRef: React.RefObject<RootElement | null>,\n contentRef: React.RefObject<ContentElement | null>,\n orientation: Orientation\n) {\n const onSubscribe = React.useCallback(\n (callback: () => void) => resizeObserverStore.subscribe(callback),\n []\n );\n\n const getSnapshot = React.useCallback(\n () =>\n resizeObserverStore.getSnapshot(\n rootRef.current,\n contentRef.current,\n orientation\n ),\n [rootRef, contentRef, orientation]\n );\n\n return React.useSyncExternalStore(onSubscribe, getSnapshot, getSnapshot);\n}\n\nconst DirectionContext = React.createContext<Direction | undefined>(undefined);\n\nfunction useDirection(dir?: Direction): Direction {\n const contextDir = React.useContext(DirectionContext);\n return dir ?? contextDir ?? \"ltr\";\n}\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ninterface MarqueeContextValue {\n side: Side;\n orientation: Orientation;\n dir: Direction;\n speed: number;\n loopCount: number;\n contentRef: React.RefObject<ContentElement | null>;\n rootRef: React.RefObject<RootElement | null>;\n autoFill: boolean;\n pauseOnHover: boolean;\n pauseOnKeyboard: boolean;\n reverse: boolean;\n paused: boolean;\n}\n\nconst MarqueeContext = React.createContext<MarqueeContextValue | null>(null);\n\nfunction useMarqueeContext(consumerName: string) {\n const context = React.useContext(MarqueeContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface MarqueeRootProps extends DivProps {\n side?: Side;\n dir?: Direction;\n speed?: number;\n delay?: number;\n loopCount?: number;\n gap?: string | number;\n autoFill?: boolean;\n pauseOnHover?: boolean;\n pauseOnKeyboard?: boolean;\n reverse?: boolean;\n}\n\nfunction MarqueeRoot(props: MarqueeRootProps) {\n const {\n side = \"left\",\n dir: dirProp,\n speed = 50,\n delay = 0,\n loopCount = 0,\n gap = \"1rem\",\n asChild,\n autoFill = false,\n pauseOnHover = false,\n pauseOnKeyboard = false,\n reverse = false,\n className,\n style: styleProp,\n ref,\n ...marqueeProps\n } = props;\n\n const orientation: Orientation =\n side === \"top\" || side === \"bottom\" ? \"vertical\" : \"horizontal\";\n\n const dir = useDirection(dirProp);\n\n const rootRef = React.useRef<RootElement>(null);\n const contentRef = React.useRef<ContentElement>(null);\n const composedRef = useComposedRefs(ref, rootRef);\n\n const [paused, setPaused] = React.useState(false);\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent) => {\n if (pauseOnKeyboard && event.key === \" \") {\n event.preventDefault();\n setPaused((prev) => !prev);\n }\n },\n [pauseOnKeyboard]\n );\n\n const dimensions = useResizeObserverStore(rootRef, contentRef, orientation);\n\n const duration = React.useMemo(() => {\n const safeSpeed = Math.max(0.001, speed);\n\n if (!dimensions) {\n const defaultDistance = autoFill ? 1000 : 2000;\n return defaultDistance / safeSpeed;\n }\n\n const { rootSize, contentSize } = dimensions;\n\n if (autoFill) {\n const multiplier =\n contentSize < rootSize ? Math.ceil(rootSize / contentSize) : 1;\n return (contentSize * multiplier) / safeSpeed;\n } else {\n return contentSize < rootSize\n ? rootSize / safeSpeed\n : contentSize / safeSpeed;\n }\n }, [dimensions, speed, autoFill]);\n\n const style = React.useMemo<React.CSSProperties>(\n () => ({\n \"--marquee-duration\": `${duration}s`,\n \"--marquee-gap\": gap,\n \"--marquee-delay\": `${delay}s`,\n \"--marquee-loop-count\":\n loopCount === 0 || loopCount === Infinity\n ? \"infinite\"\n : loopCount.toString(),\n ...styleProp,\n }),\n [duration, gap, delay, loopCount, styleProp]\n );\n\n const contextValue = React.useMemo<MarqueeContextValue>(\n () => ({\n side,\n orientation,\n dir,\n speed,\n loopCount,\n contentRef,\n rootRef,\n autoFill,\n paused,\n pauseOnHover,\n pauseOnKeyboard,\n reverse,\n }),\n [\n side,\n orientation,\n dir,\n speed,\n loopCount,\n autoFill,\n paused,\n pauseOnHover,\n pauseOnKeyboard,\n reverse,\n ]\n );\n\n const MarqueePrimitive = asChild ? Slot : \"div\";\n\n return (\n <MarqueeContext.Provider value={contextValue}>\n <div data-slot=\"marquee-wrapper\" className=\"ds:grid\">\n <MarqueePrimitive\n role=\"marquee\"\n aria-live=\"off\"\n data-orientation={orientation}\n data-slot=\"marquee\"\n dir={dir}\n tabIndex={pauseOnKeyboard ? 0 : undefined}\n {...marqueeProps}\n ref={composedRef}\n className={cn(\n \"ds:relative ds:flex ds:overflow-hidden ds:motion-reduce:animate-none\",\n orientation === \"vertical\" && \"ds:h-full ds:flex-col\",\n orientation === \"horizontal\" && \"ds:w-full\",\n paused && \"ds:[&_*]:[animation-play-state:paused]\",\n pauseOnHover && \"ds:group\",\n pauseOnKeyboard &&\n \"ds:rounded-md ds:focus-visible:border-ring ds:focus-visible:outline-none ds:focus-visible:ring-[3px] ds:focus-visible:ring-ring/50\",\n className\n )}\n style={style}\n onKeyDown={pauseOnKeyboard ? onKeyDown : undefined}\n />\n </div>\n </MarqueeContext.Provider>\n );\n}\n\nconst marqueeContentVariants = cva(\n \"ds:flex ds:min-w-full ds:shrink-0 ds:gap-(--marquee-gap)\",\n {\n variants: {\n side: {\n left: \"ds:animate-marquee-left\",\n right: \"ds:animate-marquee-right\",\n top: \"ds:min-h-full ds:min-w-auto ds:animate-marquee-up ds:flex-col\",\n bottom: \"ds:min-h-full ds:min-w-auto ds:animate-marquee-down ds:flex-col\",\n },\n dir: {\n ltr: \"\",\n rtl: \"\",\n },\n pauseOnHover: {\n true: \"ds:group-hover:[animation-play-state:paused]\",\n false: \"\",\n },\n reverse: {\n true: \"ds:[animation-direction:reverse]\",\n false: \"\",\n },\n },\n compoundVariants: [\n {\n side: \"left\",\n dir: \"rtl\",\n className: \"ds:animate-marquee-left-rtl\",\n },\n {\n side: \"right\",\n dir: \"rtl\",\n className: \"ds:animate-marquee-right-rtl\",\n },\n ],\n defaultVariants: {\n side: \"left\",\n dir: \"ltr\",\n pauseOnHover: false,\n reverse: false,\n },\n }\n);\n\nfunction MarqueeContent(props: DivProps) {\n const {\n className,\n asChild,\n ref,\n children,\n style: styleProp,\n ...contentProps\n } = props;\n\n const context = useMarqueeContext(CONTENT_NAME);\n const composedRef = useComposedRefs(ref, context.contentRef);\n\n const isVertical = context.orientation === \"vertical\";\n const isRtl = context.dir === \"rtl\";\n\n const dimensions = useResizeObserverStore(\n context.rootRef,\n context.contentRef,\n context.orientation\n );\n\n React.useEffect(() => {\n if (context.rootRef.current && context.contentRef.current) {\n resizeObserverStore.observe(\n context.rootRef.current,\n context.contentRef.current\n );\n\n return () => {\n resizeObserverStore.unobserve(\n context.rootRef.current,\n context.contentRef.current\n );\n };\n }\n }, [context.rootRef, context.contentRef]);\n\n const multiplier = React.useMemo(() => {\n if (!context.autoFill || !dimensions) return 1;\n\n const { rootSize, contentSize } = dimensions;\n if (contentSize === 0) return 1;\n\n return contentSize < rootSize ? Math.ceil(rootSize / contentSize) : 1;\n }, [context.autoFill, dimensions]);\n\n const onMultipliedChildrenRender = React.useCallback(\n (count: number) => {\n return Array.from({ length: Math.max(0, count) }).map((_, i) => (\n <React.Fragment key={i}>{children}</React.Fragment>\n ));\n },\n [children]\n );\n\n const style = React.useMemo(\n () => ({\n ...styleProp,\n animationDuration: \"var(--marquee-duration)\",\n animationDelay: \"var(--marquee-delay)\",\n animationIterationCount: \"var(--marquee-loop-count)\",\n animationDirection: context.reverse ? \"reverse\" : \"normal\",\n }),\n [styleProp, context.reverse]\n );\n\n const ContentPrimitive = asChild ? Slot : \"div\";\n\n return (\n <>\n <ContentPrimitive\n data-orientation={context.orientation}\n data-slot=\"marquee-content\"\n {...contentProps}\n style={style}\n className={cn(\n marqueeContentVariants({\n side: context.side,\n dir: context.dir,\n pauseOnHover: context.pauseOnHover,\n reverse: context.reverse,\n className,\n }),\n isVertical && \"ds:flex-col\",\n isVertical\n ? \"ds:mb-(--marquee-gap)\"\n : isRtl\n ? \"ds:ml-(--marquee-gap)\"\n : \"ds:mr-(--marquee-gap)\"\n )}\n >\n <div\n ref={composedRef}\n className={cn(\n \"ds:flex ds:shrink-0 ds:gap-(--marquee-gap)\",\n isVertical && \"ds:flex-col\"\n )}\n >\n {children}\n </div>\n {onMultipliedChildrenRender(multiplier - 1)}\n </ContentPrimitive>\n <ContentPrimitive\n role=\"presentation\"\n aria-hidden=\"true\"\n {...contentProps}\n style={style}\n className={cn(\n marqueeContentVariants({\n side: context.side,\n dir: context.dir,\n pauseOnHover: context.pauseOnHover,\n reverse: context.reverse,\n className,\n }),\n isVertical && \"ds:flex-col\"\n )}\n >\n {onMultipliedChildrenRender(multiplier)}\n </ContentPrimitive>\n </>\n );\n}\n\nfunction MarqueeItem(props: DivProps) {\n const { className, asChild, ...itemProps } = props;\n\n const ItemPrimitive = asChild ? Slot : \"div\";\n\n return (\n <ItemPrimitive\n data-slot=\"marquee-item\"\n {...itemProps}\n className={cn(\"ds:shrink-0\", className)}\n />\n );\n}\n\nconst marqueeEdgeVariants = cva(\"ds:pointer-events-none ds:absolute ds:z-10\", {\n variants: {\n side: {\n left: \"ds:top-0 ds:left-0 ds:h-full ds:bg-gradient-to-r ds:from-background ds:to-transparent\",\n right:\n \"ds:top-0 ds:right-0 ds:h-full ds:bg-gradient-to-l ds:from-background ds:to-transparent\",\n top: \"ds:top-0 ds:left-0 ds:w-full ds:bg-gradient-to-b ds:from-background ds:to-transparent\",\n bottom:\n \"ds:bottom-0 ds:left-0 ds:w-full ds:bg-gradient-to-t ds:from-background ds:to-transparent\",\n },\n size: {\n default: \"\",\n sm: \"\",\n lg: \"\",\n },\n },\n compoundVariants: [\n {\n side: [\"left\", \"right\"],\n size: \"default\",\n className: \"ds:w-1/4\",\n },\n {\n side: [\"left\", \"right\"],\n size: \"sm\",\n className: \"ds:w-1/6\",\n },\n {\n side: [\"left\", \"right\"],\n size: \"lg\",\n className: \"ds:w-1/3\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"default\",\n className: \"ds:h-1/4\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"sm\",\n className: \"ds:h-1/6\",\n },\n {\n side: [\"top\", \"bottom\"],\n size: \"lg\",\n className: \"ds:h-1/3\",\n },\n ],\n defaultVariants: {\n size: \"default\",\n },\n});\n\ninterface MarqueeEdgeProps\n extends VariantProps<typeof marqueeEdgeVariants>,\n DivProps {}\n\nfunction MarqueeEdge(props: MarqueeEdgeProps) {\n const { side, size, className, asChild, ...edgeProps } = props;\n\n const EdgePrimitive = asChild ? Slot : \"div\";\n\n return (\n <EdgePrimitive\n data-size={size}\n data-slot=\"marquee-edge\"\n {...edgeProps}\n className={cn(marqueeEdgeVariants({ side, size, className }))}\n />\n );\n}\n\nexport {\n MarqueeRoot as Root,\n MarqueeContent as Content,\n MarqueeItem as Item,\n MarqueeEdge as Edge,\n //\n MarqueeRoot as Marquee,\n MarqueeContent,\n MarqueeItem,\n MarqueeEdge,\n // types\n type MarqueeRootProps,\n type MarqueeEdgeProps,\n};\n"],"names":["ROOT_NAME","CONTENT_NAME","createResizeObserverStore","listeners","observer","elements","refCounts","isSupported","notificationScheduled","snapshotCache","notify","callback","cleanup","subscribe","getSnapshot","rootElement","contentElement","orientation","rootDims","contentDims","rootSize","contentSize","rootCache","contentCache","cached","snapshot","observe","entries","hasChanged","entry","element","width","height","currentData","rootRect","contentRect","rootData","contentData","unobserve","rootCount","contentCount","resizeObserverStore","useResizeObserverStore","rootRef","contentRef","onSubscribe","React","DirectionContext","useDirection","dir","contextDir","MarqueeContext","useMarqueeContext","consumerName","context","MarqueeRoot","props","side","dirProp","speed","delay","loopCount","gap","asChild","autoFill","pauseOnHover","pauseOnKeyboard","reverse","className","styleProp","ref","marqueeProps","composedRef","useComposedRefs","paused","setPaused","onKeyDown","event","prev","dimensions","duration","safeSpeed","multiplier","style","contextValue","MarqueePrimitive","Slot","jsx","cn","marqueeContentVariants","cva","MarqueeContent","children","contentProps","isVertical","isRtl","onMultipliedChildrenRender","count","_","i","ContentPrimitive","jsxs","Fragment","MarqueeItem","itemProps","ItemPrimitive","marqueeEdgeVariants","MarqueeEdge","size","edgeProps","EdgePrimitive"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),A=require("react"),i=require("../../packages/ui/src/components/pagination.cjs"),T=require("../../packages/ui/src/lib/utils.cjs"),H=require("../../utils/animations.cjs"),N=require("lucide-react"),C=require("../../packages/ui/src/components/popover.cjs"),v=require("../../packages/ui/src/components/command.cjs");function $(t){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),A=require("react"),i=require("../../packages/ui/src/components/pagination.cjs"),T=require("../../packages/ui/src/lib/utils.cjs"),H=require("../../utils/animations.cjs"),N=require("lucide-react"),C=require("../../packages/ui/src/components/popover.cjs"),v=require("../../packages/ui/src/components/command.cjs");function $(t){const l=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const s in t)if(s!=="default"){const n=Object.getOwnPropertyDescriptor(t,s);Object.defineProperty(l,s,n.get?n:{enumerable:!0,get:()=>t[s]})}}return l.default=t,Object.freeze(l)}const k=$(A),W=(t,l,s)=>{if(t<=s)return Array.from({length:t},(a,d)=>d+1);const n=[],o=Math.floor(s/2);let c=Math.max(1,l-o);const r=Math.min(t,c+s-1);r-c+1<s&&(c=Math.max(1,r-s+1)),c>1&&(n.push(1),c>2&&n.push("..."));for(let a=c;a<=r;a++)n.push(a);return r<t&&(r<t-1&&n.push("..."),n.push(t)),n},B=({position:t,onJumpPrevious:l,onJumpNext:s,color:n,size:o,previousText:c,nextText:r,jumpType:a="jump",total:d,onPageChange:h})=>{const[m,g]=k.useState(!1);return a==="select"?e.jsxs(C.Popover,{open:m,onOpenChange:g,children:[e.jsx(C.PopoverTrigger,{asChild:!0,children:e.jsx(i.PaginationItem,{children:e.jsx(i.PaginationEllipsis,{size:o,color:n})})}),e.jsx(C.PopoverContent,{className:"ds:w-40 ds:p-0",children:e.jsxs(v.Command,{children:[e.jsx(v.CommandInput,{placeholder:"Search pages..."}),e.jsx(v.CommandList,{children:d&&Array.from({length:d},(u,j)=>j+1).map(u=>e.jsxs(v.CommandItem,{onSelect:()=>{h?.(u),g(!1)},children:["Page ",u]},u))})]})})]}):e.jsx(i.PaginationItem,{className:"ds:group",children:t==="before"?e.jsxs(i.PaginationPrevious,{href:"#",onClick:u=>{u.preventDefault(),l?.()},color:n,size:o,hideIcon:!0,className:"ds:peer",children:[e.jsx("span",{className:"ds:hidden ds:group-hover:block ds:leading-none",children:c}),e.jsx(N.MoreHorizontalIcon,{className:"ds:group-hover:hidden ds:cursor-pointer"})]}):e.jsxs(i.PaginationNext,{href:"#",onClick:u=>{u.preventDefault(),s?.()},color:n,size:o,hideIcon:!0,children:[e.jsx("span",{className:"ds:hidden ds:group-hover:block ds:leading-none",children:r}),e.jsx(N.MoreHorizontalIcon,{className:"ds:group-hover:hidden ds:cursor-pointer"})]})})},O=k.forwardRef(({className:t,animation:l,total:s,currentPage:n=1,onPageChange:o,showPreviousNext:c=!0,color:r="muted",size:a,maxPages:d=5,previousText:h,nextText:m,jumpOnEllipsis:g=!1,jumpType:u="jump",children:j,...x},q)=>{const I=k.useMemo(()=>l?H.animationEffect({animation:l,children:j,className:t,rootClassName:"",variantType:void 0,...x}):null,[l,x,t,j]),S=()=>h===!1?!1:h===!0?"Previous":h,D=()=>m===!1?!1:m===!0?"Next":m,E=()=>{const f=Math.max(1,n-d);o?.(f)},R=()=>{const f=Math.min(s,n+d);o?.(f)},J=()=>{if(!s)return j;const f=W(s,n,d);return e.jsxs(i.PaginationContent,{children:[c&&e.jsx(i.PaginationItem,{className:"ds:flex ds:justify-center",children:e.jsx(i.PaginationPrevious,{href:"#",onClick:p=>{p.preventDefault(),n>1&&o?.(n-1)},color:r,size:a,children:S()})}),f.map((p,y)=>{if(p==="..."){if(g){const b=y,_=f.findIndex(M=>typeof M=="number"&&M===n),w=b<_?"before":"after";return e.jsx(B,{position:w,onJumpPrevious:E,onJumpNext:R,color:r,size:a,previousText:e.jsx(N.ChevronsLeft,{}),nextText:e.jsx(N.ChevronsRight,{}),jumpType:u,total:s,onPageChange:o},`ellipsis-${y}`)}return e.jsx(i.PaginationItem,{children:e.jsx(i.PaginationEllipsis,{size:a,color:r})},`ellipsis-${y}`)}const P=p,L=P===n;return e.jsx(i.PaginationItem,{children:e.jsx(i.PaginationLink,{href:"#",isActive:L,onClick:b=>{b.preventDefault(),o?.(P)},color:r,size:a,children:P})},P)}),c&&e.jsx(i.PaginationItem,{className:"ds:flex ds:justify-center",children:e.jsx(i.PaginationNext,{href:"#",onClick:p=>{p.preventDefault(),n<s&&o?.(n+1)},color:r,size:a,children:D()})})]})};return e.jsx(i.Pagination,{ref:q,className:T.cn(t,I?.className),style:{...x.style||{},...I?.style||{}},...x,children:I?.children??J()})});O.displayName="Pagination";exports.PaginationContent=i.PaginationContent;exports.PaginationEllipsis=i.PaginationEllipsis;exports.PaginationItem=i.PaginationItem;exports.PaginationLink=i.PaginationLink;exports.PaginationNext=i.PaginationNext;exports.PaginationPrevious=i.PaginationPrevious;exports.Pagination=O;
|
|
2
2
|
//# sourceMappingURL=Pagination.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.cjs","sources":["../../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n Pagination as SPagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n} from \"@dsui/ui/components/pagination\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { ButtonAnimation } from \"@/types/variables\";\nimport { animationEffect } from \"@/utils/animations\";\nimport { ChevronsLeft, ChevronsRight, MoreHorizontalIcon } from \"lucide-react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Command,\n CommandInput,\n CommandList,\n CommandItem,\n} from \"@dsui/ui/components/command\";\nimport type { Button } from \"../Button\";\n\ntype PaginationItemType =\n | number\n | \"...\"\n | { page: number; isActive?: boolean; disabled?: boolean };\n\ntype PaginationWrapperProps = React.ComponentProps<typeof SPagination> & {\n animation?: ButtonAnimation;\n total?: number;\n currentPage?: number;\n onPageChange?: (page: number) => void;\n showPreviousNext?: boolean;\n maxPages?: number; // số pages hiển thị\n previousText?: string | boolean;\n nextText?: string | boolean;\n jumpOnEllipsis?: boolean; // khi hover vào ellipsis thì hiện thành nút next/previous\n jumpType?: \"jump\" | \"select\"; // jump type for ellipsis interaction\n} & Pick<React.ComponentProps<typeof Button>, \"size\" | \"color\">;\n\ntype AnimResult = {\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nconst generatePages = (\n total: number,\n currentPage: number,\n maxPages: number\n): PaginationItemType[] => {\n if (total <= maxPages) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const pages: PaginationItemType[] = [];\n const halfSize = Math.floor(maxPages / 2);\n let start = Math.max(1, currentPage - halfSize);\n const end = Math.min(total, start + maxPages - 1);\n\n if (end - start + 1 < maxPages) {\n start = Math.max(1, end - maxPages + 1);\n }\n\n // Add first page and ellipsis if needed\n if (start > 1) {\n pages.push(1);\n if (start > 2) {\n pages.push(\"...\");\n }\n }\n\n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n // Add ellipsis and last page if needed\n if (end < total) {\n if (end < total - 1) {\n pages.push(\"...\");\n }\n pages.push(total);\n }\n\n return pages;\n};\n\nconst PaginationEllipsisWithJump = ({\n position,\n onJumpPrevious,\n onJumpNext,\n color,\n size,\n previousText,\n nextText,\n jumpType = \"jump\",\n total,\n onPageChange,\n}: {\n position: \"before\" | \"after\";\n onJumpPrevious?: () => void;\n onJumpNext?: () => void;\n color?: PaginationWrapperProps[\"color\"];\n size?: PaginationWrapperProps[\"size\"];\n previousText?: React.ReactNode;\n nextText?: React.ReactNode;\n jumpType?: \"jump\" | \"select\";\n total?: number;\n onPageChange?: (page: number) => void;\n}) => {\n const [popoverOpen, setPopoverOpen] = React.useState(false);\n\n if (jumpType === \"select\") {\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <PaginationItem>\n <PaginationEllipsis size={size} color={color} />\n </PaginationItem>\n </PopoverTrigger>\n <PopoverContent className=\"w-40 p-0\">\n <Command>\n <CommandInput placeholder=\"Search pages...\" />\n <CommandList>\n {total &&\n Array.from({ length: total }, (_, i) => i + 1).map((page) => (\n <CommandItem\n key={page}\n onSelect={() => {\n onPageChange?.(page);\n setPopoverOpen(false);\n }}\n >\n Page {page}\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <PaginationItem className=\"group\">\n {position === \"before\" ? (\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onJumpPrevious?.();\n }}\n color={color}\n size={size}\n hideIcon\n className=\"peer\"\n >\n <span className=\"hidden group-hover:block leading-none\">\n {previousText}\n </span>\n <MoreHorizontalIcon className=\"group-hover:hidden cursor-pointer\" />\n </PaginationPrevious>\n ) : (\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onJumpNext?.();\n }}\n color={color}\n size={size}\n hideIcon\n >\n <span className=\"hidden group-hover:block leading-none\">\n {nextText}\n </span>\n <MoreHorizontalIcon className=\"group-hover:hidden cursor-pointer\" />\n </PaginationNext>\n )}\n </PaginationItem>\n );\n};\n\nconst Pagination = React.forwardRef<HTMLElement, PaginationWrapperProps>(\n (\n {\n className,\n animation,\n total,\n currentPage = 1,\n onPageChange,\n showPreviousNext = true,\n color = \"muted\",\n size,\n maxPages = 5,\n previousText,\n nextText,\n jumpOnEllipsis = false,\n jumpType = \"jump\",\n children,\n ...props\n },\n ref\n ) => {\n const paginationAnimation = React.useMemo<AnimResult | null>(() => {\n if (!animation) return null;\n return animationEffect<ButtonAnimation, string | undefined>({\n animation,\n children,\n className,\n rootClassName: \"\",\n variantType: undefined,\n ...props,\n });\n }, [animation, props, className, children]);\n\n const getPreviousText = () => {\n if (previousText === false) return false;\n if (previousText === true) return \"Previous\";\n return previousText;\n };\n\n const getNextText = () => {\n if (nextText === false) return false;\n if (nextText === true) return \"Next\";\n return nextText;\n };\n\n const handleJumpPrevious = () => {\n const newPage = Math.max(1, currentPage - maxPages);\n onPageChange?.(newPage);\n };\n\n const handleJumpNext = () => {\n const newPage = Math.min(total!, currentPage + maxPages);\n onPageChange?.(newPage);\n };\n\n const renderItems = () => {\n if (!total) return children;\n\n const pages = generatePages(total, currentPage, maxPages);\n\n return (\n <PaginationContent>\n {showPreviousNext && (\n <PaginationItem className=\"flex justify-center\">\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (currentPage > 1) onPageChange?.(currentPage - 1);\n }}\n color={color}\n size={size}\n >\n {getPreviousText()}\n </PaginationPrevious>\n </PaginationItem>\n )}\n {pages.map((item, index) => {\n if (item === \"...\") {\n if (jumpOnEllipsis) {\n // Determine if this ellipsis is before or after the active page\n const ellipsisIndex = index;\n const activePageIndex = pages.findIndex(\n (page) => typeof page === \"number\" && page === currentPage\n );\n const position =\n ellipsisIndex < activePageIndex ? \"before\" : \"after\";\n\n return (\n <PaginationEllipsisWithJump\n key={`ellipsis-${index}`}\n position={position}\n onJumpPrevious={handleJumpPrevious}\n onJumpNext={handleJumpNext}\n color={color}\n size={size}\n previousText={<ChevronsLeft />}\n nextText={<ChevronsRight />}\n jumpType={jumpType}\n total={total}\n onPageChange={onPageChange}\n />\n );\n }\n return (\n <PaginationItem key={`ellipsis-${index}`}>\n <PaginationEllipsis size={size} color={color} />\n </PaginationItem>\n );\n }\n\n const page = item as number;\n const isActive = page === currentPage;\n\n return (\n <PaginationItem key={page}>\n <PaginationLink\n href=\"#\"\n isActive={isActive}\n onClick={(e) => {\n e.preventDefault();\n onPageChange?.(page);\n }}\n color={color}\n size={size}\n >\n {page}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n {showPreviousNext && (\n <PaginationItem className=\"flex justify-center\">\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (currentPage < total) onPageChange?.(currentPage + 1);\n }}\n color={color}\n size={size}\n >\n {getNextText()}\n </PaginationNext>\n </PaginationItem>\n )}\n </PaginationContent>\n );\n };\n\n return (\n <SPagination\n ref={ref}\n className={cn(className, paginationAnimation?.className)}\n style={{\n ...(props.style || {}),\n ...(paginationAnimation?.style || {}),\n }}\n {...props}\n >\n {paginationAnimation?.children ?? renderItems()}\n </SPagination>\n );\n }\n);\n\nPagination.displayName = \"Pagination\";\n\nexport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n type PaginationWrapperProps,\n type PaginationItemType,\n};\n"],"names":["generatePages","total","currentPage","maxPages","_","i","pages","halfSize","start","end","PaginationEllipsisWithJump","position","onJumpPrevious","onJumpNext","color","size","previousText","nextText","jumpType","onPageChange","popoverOpen","setPopoverOpen","React","jsxs","Popover","jsx","PopoverTrigger","PaginationItem","PaginationEllipsis","PopoverContent","Command","CommandInput","CommandList","page","CommandItem","PaginationPrevious","e","MoreHorizontalIcon","PaginationNext","Pagination","className","animation","showPreviousNext","jumpOnEllipsis","children","props","ref","paginationAnimation","animationEffect","getPreviousText","getNextText","handleJumpPrevious","newPage","handleJumpNext","renderItems","PaginationContent","item","index","ellipsisIndex","activePageIndex","ChevronsLeft","ChevronsRight","isActive","PaginationLink","SPagination","cn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.cjs","sources":["../../../../src/components/Pagination/Pagination.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n Pagination as SPagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n} from \"@dsui/ui/components/pagination\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport type { ButtonAnimation } from \"@/types/variables\";\nimport { animationEffect } from \"@/utils/animations\";\nimport { ChevronsLeft, ChevronsRight, MoreHorizontalIcon } from \"lucide-react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Command,\n CommandInput,\n CommandList,\n CommandItem,\n} from \"@dsui/ui/components/command\";\nimport type { Button } from \"../Button\";\n\ntype PaginationItemType =\n | number\n | \"...\"\n | { page: number; isActive?: boolean; disabled?: boolean };\n\ntype PaginationWrapperProps = React.ComponentProps<typeof SPagination> & {\n animation?: ButtonAnimation;\n total?: number;\n currentPage?: number;\n onPageChange?: (page: number) => void;\n showPreviousNext?: boolean;\n maxPages?: number; // số pages hiển thị\n previousText?: string | boolean;\n nextText?: string | boolean;\n jumpOnEllipsis?: boolean; // khi hover vào ellipsis thì hiện thành nút next/previous\n jumpType?: \"jump\" | \"select\"; // jump type for ellipsis interaction\n} & Pick<React.ComponentProps<typeof Button>, \"size\" | \"color\">;\n\ntype AnimResult = {\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n};\n\nconst generatePages = (\n total: number,\n currentPage: number,\n maxPages: number\n): PaginationItemType[] => {\n if (total <= maxPages) {\n return Array.from({ length: total }, (_, i) => i + 1);\n }\n\n const pages: PaginationItemType[] = [];\n const halfSize = Math.floor(maxPages / 2);\n let start = Math.max(1, currentPage - halfSize);\n const end = Math.min(total, start + maxPages - 1);\n\n if (end - start + 1 < maxPages) {\n start = Math.max(1, end - maxPages + 1);\n }\n\n // Add first page and ellipsis if needed\n if (start > 1) {\n pages.push(1);\n if (start > 2) {\n pages.push(\"...\");\n }\n }\n\n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n // Add ellipsis and last page if needed\n if (end < total) {\n if (end < total - 1) {\n pages.push(\"...\");\n }\n pages.push(total);\n }\n\n return pages;\n};\n\nconst PaginationEllipsisWithJump = ({\n position,\n onJumpPrevious,\n onJumpNext,\n color,\n size,\n previousText,\n nextText,\n jumpType = \"jump\",\n total,\n onPageChange,\n}: {\n position: \"before\" | \"after\";\n onJumpPrevious?: () => void;\n onJumpNext?: () => void;\n color?: PaginationWrapperProps[\"color\"];\n size?: PaginationWrapperProps[\"size\"];\n previousText?: React.ReactNode;\n nextText?: React.ReactNode;\n jumpType?: \"jump\" | \"select\";\n total?: number;\n onPageChange?: (page: number) => void;\n}) => {\n const [popoverOpen, setPopoverOpen] = React.useState(false);\n\n if (jumpType === \"select\") {\n return (\n <Popover open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger asChild>\n <PaginationItem>\n <PaginationEllipsis size={size} color={color} />\n </PaginationItem>\n </PopoverTrigger>\n <PopoverContent className=\"ds:w-40 ds:p-0\">\n <Command>\n <CommandInput placeholder=\"Search pages...\" />\n <CommandList>\n {total &&\n Array.from({ length: total }, (_, i) => i + 1).map((page) => (\n <CommandItem\n key={page}\n onSelect={() => {\n onPageChange?.(page);\n setPopoverOpen(false);\n }}\n >\n Page {page}\n </CommandItem>\n ))}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <PaginationItem className=\"ds:group\">\n {position === \"before\" ? (\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onJumpPrevious?.();\n }}\n color={color}\n size={size}\n hideIcon\n className=\"ds:peer\"\n >\n <span className=\"ds:hidden ds:group-hover:block ds:leading-none\">\n {previousText}\n </span>\n <MoreHorizontalIcon className=\"ds:group-hover:hidden ds:cursor-pointer\" />\n </PaginationPrevious>\n ) : (\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n onJumpNext?.();\n }}\n color={color}\n size={size}\n hideIcon\n >\n <span className=\"ds:hidden ds:group-hover:block ds:leading-none\">\n {nextText}\n </span>\n <MoreHorizontalIcon className=\"ds:group-hover:hidden ds:cursor-pointer\" />\n </PaginationNext>\n )}\n </PaginationItem>\n );\n};\n\nconst Pagination = React.forwardRef<HTMLElement, PaginationWrapperProps>(\n (\n {\n className,\n animation,\n total,\n currentPage = 1,\n onPageChange,\n showPreviousNext = true,\n color = \"muted\",\n size,\n maxPages = 5,\n previousText,\n nextText,\n jumpOnEllipsis = false,\n jumpType = \"jump\",\n children,\n ...props\n },\n ref\n ) => {\n const paginationAnimation = React.useMemo<AnimResult | null>(() => {\n if (!animation) return null;\n return animationEffect<ButtonAnimation, string | undefined>({\n animation,\n children,\n className,\n rootClassName: \"\",\n variantType: undefined,\n ...props,\n });\n }, [animation, props, className, children]);\n\n const getPreviousText = () => {\n if (previousText === false) return false;\n if (previousText === true) return \"Previous\";\n return previousText;\n };\n\n const getNextText = () => {\n if (nextText === false) return false;\n if (nextText === true) return \"Next\";\n return nextText;\n };\n\n const handleJumpPrevious = () => {\n const newPage = Math.max(1, currentPage - maxPages);\n onPageChange?.(newPage);\n };\n\n const handleJumpNext = () => {\n const newPage = Math.min(total!, currentPage + maxPages);\n onPageChange?.(newPage);\n };\n\n const renderItems = () => {\n if (!total) return children;\n\n const pages = generatePages(total, currentPage, maxPages);\n\n return (\n <PaginationContent>\n {showPreviousNext && (\n <PaginationItem className=\"ds:flex ds:justify-center\">\n <PaginationPrevious\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (currentPage > 1) onPageChange?.(currentPage - 1);\n }}\n color={color}\n size={size}\n >\n {getPreviousText()}\n </PaginationPrevious>\n </PaginationItem>\n )}\n {pages.map((item, index) => {\n if (item === \"...\") {\n if (jumpOnEllipsis) {\n // Determine if this ellipsis is before or after the active page\n const ellipsisIndex = index;\n const activePageIndex = pages.findIndex(\n (page) => typeof page === \"number\" && page === currentPage\n );\n const position =\n ellipsisIndex < activePageIndex ? \"before\" : \"after\";\n\n return (\n <PaginationEllipsisWithJump\n key={`ellipsis-${index}`}\n position={position}\n onJumpPrevious={handleJumpPrevious}\n onJumpNext={handleJumpNext}\n color={color}\n size={size}\n previousText={<ChevronsLeft />}\n nextText={<ChevronsRight />}\n jumpType={jumpType}\n total={total}\n onPageChange={onPageChange}\n />\n );\n }\n return (\n <PaginationItem key={`ellipsis-${index}`}>\n <PaginationEllipsis size={size} color={color} />\n </PaginationItem>\n );\n }\n\n const page = item as number;\n const isActive = page === currentPage;\n\n return (\n <PaginationItem key={page}>\n <PaginationLink\n href=\"#\"\n isActive={isActive}\n onClick={(e) => {\n e.preventDefault();\n onPageChange?.(page);\n }}\n color={color}\n size={size}\n >\n {page}\n </PaginationLink>\n </PaginationItem>\n );\n })}\n {showPreviousNext && (\n <PaginationItem className=\"ds:flex ds:justify-center\">\n <PaginationNext\n href=\"#\"\n onClick={(e) => {\n e.preventDefault();\n if (currentPage < total) onPageChange?.(currentPage + 1);\n }}\n color={color}\n size={size}\n >\n {getNextText()}\n </PaginationNext>\n </PaginationItem>\n )}\n </PaginationContent>\n );\n };\n\n return (\n <SPagination\n ref={ref}\n className={cn(className, paginationAnimation?.className)}\n style={{\n ...(props.style || {}),\n ...(paginationAnimation?.style || {}),\n }}\n {...props}\n >\n {paginationAnimation?.children ?? renderItems()}\n </SPagination>\n );\n }\n);\n\nPagination.displayName = \"Pagination\";\n\nexport {\n Pagination,\n PaginationContent,\n PaginationItem,\n PaginationLink,\n PaginationPrevious,\n PaginationNext,\n PaginationEllipsis,\n type PaginationWrapperProps,\n type PaginationItemType,\n};\n"],"names":["generatePages","total","currentPage","maxPages","_","i","pages","halfSize","start","end","PaginationEllipsisWithJump","position","onJumpPrevious","onJumpNext","color","size","previousText","nextText","jumpType","onPageChange","popoverOpen","setPopoverOpen","React","jsxs","Popover","jsx","PopoverTrigger","PaginationItem","PaginationEllipsis","PopoverContent","Command","CommandInput","CommandList","page","CommandItem","PaginationPrevious","e","MoreHorizontalIcon","PaginationNext","Pagination","className","animation","showPreviousNext","jumpOnEllipsis","children","props","ref","paginationAnimation","animationEffect","getPreviousText","getNextText","handleJumpPrevious","newPage","handleJumpNext","renderItems","PaginationContent","item","index","ellipsisIndex","activePageIndex","ChevronsLeft","ChevronsRight","isActive","PaginationLink","SPagination","cn"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var V=Object.create;var P=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var X=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of H(e))!W.call(t,o)&&o!==r&&P(t,o,{get:()=>e[o],enumerable:!(n=B(e,o))||n.enumerable});return t};var Y=(t,e,r)=>(r=t!=null?V(J(t)):{},X(e||!t||!t.__esModule?P(r,"default",{value:t,enumerable:!0}):r,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react/jsx-runtime"),y=require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const x=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");const Z=require("react");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const ee=require("../../packages/ui/src/lib/compose-refs.cjs");function te(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const
|
|
1
|
+
"use strict";var V=Object.create;var P=Object.defineProperty;var B=Object.getOwnPropertyDescriptor;var H=Object.getOwnPropertyNames;var J=Object.getPrototypeOf,W=Object.prototype.hasOwnProperty;var X=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of H(e))!W.call(t,o)&&o!==r&&P(t,o,{get:()=>e[o],enumerable:!(n=B(e,o))||n.enumerable});return t};var Y=(t,e,r)=>(r=t!=null?V(J(t)):{},X(e||!t||!t.__esModule?P(r,"default",{value:t,enumerable:!0}):r,t));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const v=require("react/jsx-runtime"),y=require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const x=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");const Z=require("react");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const ee=require("../../packages/ui/src/lib/compose-refs.cjs");function te(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,n.get?n:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const d=te(Z),L="QRCode",re="QRCodeCanvas",ne="QRCodeSvg",oe="QRCodeImage",se="QRCodeSkeleton";function E(t){const e=d.useRef(null);return e.current===null&&(e.current=t()),e}const M=d.createContext(null);function C(t){const e=d.useContext(M);if(!e)throw new Error(`\`useQRCode\` must be used within \`${L}\``);const r=d.useCallback(()=>t(e.getState()),[e,t]);return d.useSyncExternalStore(e.subscribe,r,r)}const U=d.createContext(null);function j(t){const e=d.useContext(U);if(!e)throw new Error(`\`${t}\` must be used within \`${L}\``);return e}function A(t){const{value:e,size:r=200,level:n="M",margin:o=1,quality:a=.92,backgroundColor:s="#ffffff",foregroundColor:i="#000000",onError:l,onGenerated:h,className:p,style:u,asChild:f,...w}=t,N=d.useRef(null),Q=E(()=>new Set),b=E(()=>({dataUrl:null,svgString:null,isGenerating:!1,error:null,generationKey:""})),q=d.useMemo(()=>({subscribe:c=>(Q.current.add(c),()=>Q.current.delete(c)),getState:()=>b.current,setState:(c,S)=>{Object.is(b.current[c],S)||(b.current[c]=S,q.notify())},setStates:c=>{let S=!1;for(const g of Object.keys(c)){const m=c[g];m!==void 0&&!Object.is(b.current[g],m)&&(Object.assign(b.current,{[g]:m}),S=!0)}S&&q.notify()},notify:()=>{for(const c of Q.current)c()}}),[Q,b]),R=d.useMemo(()=>({errorCorrectionLevel:n,type:"image/png",quality:a,margin:o,color:{dark:i,light:s},width:r}),[n,o,i,s,r,a]),k=d.useMemo(()=>e?JSON.stringify({value:e,size:r,level:n,margin:o,quality:a,foregroundColor:i,backgroundColor:s}):"",[e,n,o,i,s,r,a]),O=d.useCallback(async c=>{if(!e||!c)return;const S=q.getState();if(!(S.isGenerating||S.generationKey===c)){q.setStates({isGenerating:!0,error:null});try{const g=(await import("qrcode")).default;let m=null;try{m=await g.toDataURL(e,R)}catch{m=null}N.current&&await g.toCanvas(N.current,e,R);const F=await g.toString(e,{errorCorrectionLevel:R.errorCorrectionLevel,margin:R.margin,color:R.color,width:R.width,type:"svg"});q.setStates({dataUrl:m,svgString:F,isGenerating:!1,generationKey:c}),h?.()}catch(g){const m=g instanceof Error?g:new Error("Failed to generate QR code");q.setStates({error:m,isGenerating:!1}),l?.(m)}}},[e,R,q,l,h]),$=d.useMemo(()=>({value:e,size:r,level:n,margin:o,backgroundColor:s,foregroundColor:i,canvasRef:N}),[e,r,s,i,n,o]);d.useLayoutEffect(()=>{if(k){const c=requestAnimationFrame(()=>{O(k)});return()=>cancelAnimationFrame(c)}},[k,O]);const T=f?y.Slot:"div";return v.jsx(M.Provider,{value:q,children:v.jsx(U.Provider,{value:$,children:v.jsx(T,{"data-slot":"qr-code",...w,className:x.cn(p,"ds:relative ds:flex ds:flex-col ds:items-center ds:gap-2"),style:{"--qr-code-size":`${r}px`,...u},children:w?.children?w.children:v.jsx(z,{})})})})}function z(t){const{asChild:e,className:r,ref:n,...o}=t,a=j(re),s=C(h=>h.generationKey),i=ee.useComposedRefs(n,a.canvasRef),l=e?y.Slot:"canvas";return v.jsx(l,{"data-slot":"qr-code-canvas",...o,ref:i,width:a.size,height:a.size,className:x.cn("ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)",!s&&"ds:invisible",r)})}function _(t){const{asChild:e,className:r,style:n,...o}=t,a=j(ne),s=C(l=>l.svgString);if(!s)return null;const i=e?y.Slot:"div";return v.jsx(i,{"data-slot":"qr-code-svg",...o,className:x.cn("ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)",r),style:{width:a.size,height:a.size,...n},dangerouslySetInnerHTML:{__html:s}})}function I(t){const{alt:e="QR Code",asChild:r,className:n,...o}=t,a=j(oe),s=C(l=>l.dataUrl);if(!s)return null;const i=r?y.Slot:"img";return v.jsx(i,{"data-slot":"qr-code-image",...o,src:s,alt:e,width:a.size,height:a.size,className:x.cn("ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)",n)})}function D(t){const{filename:e="qrcode",format:r="png",asChild:n,className:o,children:a,...s}=t,i=C(u=>u.dataUrl),l=C(u=>u.svgString),h=d.useCallback(u=>{if(s.onClick?.(u),u.defaultPrevented)return;const f=document.createElement("a");if(r==="png"&&i)f.href=i,f.download=`${e}.png`;else if(r==="svg"&&l){const w=new Blob([l],{type:"image/svg+xml"});f.href=URL.createObjectURL(w),f.download=`${e}.svg`}else return;document.body.appendChild(f),f.click(),document.body.removeChild(f),r==="svg"&&l&&URL.revokeObjectURL(f.href)},[i,l,e,r,s.onClick]),p=n?y.Slot:"button";return v.jsx(p,{type:"button","data-slot":"qr-code-download",...s,className:x.cn("ds:max-w-(--qr-code-size)",o),onClick:h,children:a??`Download ${r.toUpperCase()}`})}function G(t){const{asChild:e,className:r,...n}=t,o=e?y.Slot:"div";return v.jsx(o,{"data-slot":"qr-code-overlay",...n,className:x.cn("ds:-translate-x-1/2 ds:-translate-y-1/2 ds:absolute ds:top-1/2 ds:left-1/2 ds:flex ds:items-center ds:justify-center ds:rounded-sm ds:bg-background",r)})}function K(t){const{asChild:e,className:r,style:n,...o}=t,a=j(se),s=C(u=>u.dataUrl),i=C(u=>u.svgString),l=C(u=>u.generationKey);if(s||i||l)return null;const p=e?y.Slot:"div";return v.jsx(p,{"data-slot":"qr-code-skeleton",...o,className:x.cn("ds:absolute ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size) ds:animate-pulse ds:bg-accent",r),style:{width:a.size,height:a.size,...n}})}exports.Canvas=z;exports.Download=D;exports.Image=I;exports.Overlay=G;exports.QRCode=A;exports.QRCodeCanvas=z;exports.QRCodeDownload=D;exports.QRCodeImage=I;exports.QRCodeOverlay=G;exports.QRCodeSkeleton=K;exports.QRCodeSvg=_;exports.Root=A;exports.Skeleton=K;exports.Svg=_;exports.useQRCode=C;
|
|
2
2
|
//# sourceMappingURL=QrCode.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QrCode.cjs","sources":["../../../../src/components/QrCode/QrCode.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport * as React from \"react\";\n\nconst ROOT_NAME = \"QRCode\";\nconst CANVAS_NAME = \"QRCodeCanvas\";\nconst SVG_NAME = \"QRCodeSvg\";\nconst IMAGE_NAME = \"QRCodeImage\";\nconst SKELETON_NAME = \"QRCodeSkeleton\";\n\ntype QRCodeLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\ninterface QRCodeCanvasOpts {\n errorCorrectionLevel: QRCodeLevel;\n type?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n margin?: number;\n color?: {\n dark: string;\n light: string;\n };\n width?: number;\n rendererOpts?: {\n quality?: number;\n };\n}\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\ninterface StoreState {\n dataUrl: string | null;\n svgString: string | null;\n isGenerating: boolean;\n error: Error | null;\n generationKey: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStates: (updates: Partial<StoreState>) => void;\n notify: () => void;\n}\n\ninterface QRCodeContextValue {\n value: string;\n size: number;\n margin: number;\n level: QRCodeLevel;\n backgroundColor: string;\n foregroundColor: string;\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = React.useContext(StoreContext);\n if (!store) {\n throw new Error(`\\`useQRCode\\` must be used within \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector]\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\nconst QRCodeContext = React.createContext<QRCodeContextValue | null>(null);\n\nfunction useQRCodeContext(consumerName: string) {\n const context = React.useContext(QRCodeContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface QRCodeRootProps extends Omit<React.ComponentProps<\"div\">, \"onError\"> {\n value: string;\n size?: number;\n level?: QRCodeLevel;\n margin?: number;\n quality?: number;\n backgroundColor?: string;\n foregroundColor?: string;\n onError?: (error: Error) => void;\n onGenerated?: () => void;\n asChild?: boolean;\n}\n\nfunction QRCodeRoot(props: QRCodeRootProps) {\n const {\n value,\n size = 200,\n level = \"M\",\n margin = 1,\n quality = 0.92,\n backgroundColor = \"#ffffff\",\n foregroundColor = \"#000000\",\n onError,\n onGenerated,\n className,\n style,\n asChild,\n ...rootProps\n } = props;\n\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n dataUrl: null,\n svgString: null,\n isGenerating: false,\n error: null,\n generationKey: \"\",\n }));\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n store.notify();\n },\n setStates: (updates) => {\n let hasChanged = false;\n\n for (const key of Object.keys(updates) as Array<keyof StoreState>) {\n const value = updates[key];\n if (value !== undefined && !Object.is(stateRef.current[key], value)) {\n Object.assign(stateRef.current, { [key]: value });\n hasChanged = true;\n }\n }\n\n if (hasChanged) {\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef]);\n\n const canvasOpts = React.useMemo<QRCodeCanvasOpts>(\n () => ({\n errorCorrectionLevel: level,\n type: \"image/png\",\n quality,\n margin,\n color: {\n dark: foregroundColor,\n light: backgroundColor,\n },\n width: size,\n }),\n [level, margin, foregroundColor, backgroundColor, size, quality]\n );\n\n const generationKey = React.useMemo(() => {\n if (!value) return \"\";\n\n return JSON.stringify({\n value,\n size,\n level,\n margin,\n quality,\n foregroundColor,\n backgroundColor,\n });\n }, [value, level, margin, foregroundColor, backgroundColor, size, quality]);\n\n const onQRCodeGenerate = React.useCallback(\n async (targetGenerationKey: string) => {\n if (!value || !targetGenerationKey) return;\n\n const currentState = store.getState();\n if (\n currentState.isGenerating ||\n currentState.generationKey === targetGenerationKey\n )\n return;\n\n store.setStates({\n isGenerating: true,\n error: null,\n });\n\n try {\n const QRCode = (await import(\"qrcode\")).default;\n\n let dataUrl: string | null = null;\n\n try {\n dataUrl = await QRCode.toDataURL(value, canvasOpts);\n } catch {\n dataUrl = null;\n }\n\n if (canvasRef.current) {\n await QRCode.toCanvas(canvasRef.current, value, canvasOpts);\n }\n\n const svgString = await QRCode.toString(value, {\n errorCorrectionLevel: canvasOpts.errorCorrectionLevel,\n margin: canvasOpts.margin,\n color: canvasOpts.color,\n width: canvasOpts.width,\n type: \"svg\",\n });\n\n store.setStates({\n dataUrl,\n svgString,\n isGenerating: false,\n generationKey: targetGenerationKey,\n });\n\n onGenerated?.();\n } catch (error) {\n const parsedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to generate QR code\");\n store.setStates({\n error: parsedError,\n isGenerating: false,\n });\n onError?.(parsedError);\n }\n },\n [value, canvasOpts, store, onError, onGenerated]\n );\n\n const contextValue = React.useMemo<QRCodeContextValue>(\n () => ({\n value,\n size,\n level,\n margin,\n backgroundColor,\n foregroundColor,\n canvasRef,\n }),\n [value, size, backgroundColor, foregroundColor, level, margin]\n );\n\n React.useLayoutEffect(() => {\n if (generationKey) {\n const rafId = requestAnimationFrame(() => {\n onQRCodeGenerate(generationKey);\n });\n\n return () => cancelAnimationFrame(rafId);\n }\n }, [generationKey, onQRCodeGenerate]);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <QRCodeContext.Provider value={contextValue}>\n <RootPrimitive\n data-slot=\"qr-code\"\n {...rootProps}\n className={cn(className, \"relative flex flex-col items-center gap-2\")}\n style={\n {\n \"--qr-code-size\": `${size}px`,\n ...style,\n } as React.CSSProperties\n }\n >\n {rootProps?.children ? rootProps.children : <QRCodeCanvas />}\n </RootPrimitive>\n </QRCodeContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface QRCodeCanvasProps extends React.ComponentProps<\"canvas\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeCanvas(props: QRCodeCanvasProps) {\n const { asChild, className, ref, ...canvasProps } = props;\n\n const context = useQRCodeContext(CANVAS_NAME);\n const generationKey = useStore((state) => state.generationKey);\n\n const composedRef = useComposedRefs(ref, context.canvasRef);\n\n const CanvasPrimitive = asChild ? Slot : \"canvas\";\n\n return (\n <CanvasPrimitive\n data-slot=\"qr-code-canvas\"\n {...canvasProps}\n ref={composedRef}\n width={context.size}\n height={context.size}\n className={cn(\n \"relative max-h-(--qr-code-size) max-w-(--qr-code-size)\",\n !generationKey && \"invisible\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeSvgProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeSvg(props: QRCodeSvgProps) {\n const { asChild, className, style, ...svgProps } = props;\n\n const context = useQRCodeContext(SVG_NAME);\n const svgString = useStore((state) => state.svgString);\n\n if (!svgString) return null;\n\n const SvgPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SvgPrimitive\n data-slot=\"qr-code-svg\"\n {...svgProps}\n className={cn(\n \"relative max-h-(--qr-code-size) max-w-(--qr-code-size)\",\n className\n )}\n style={{ width: context.size, height: context.size, ...style }}\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n );\n}\n\ninterface QRCodeImageProps extends React.ComponentProps<\"img\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeImage(props: QRCodeImageProps) {\n const { alt = \"QR Code\", asChild, className, ...imageProps } = props;\n\n const context = useQRCodeContext(IMAGE_NAME);\n const dataUrl = useStore((state) => state.dataUrl);\n\n if (!dataUrl) return null;\n\n const ImagePrimitive = asChild ? Slot : \"img\";\n\n return (\n <ImagePrimitive\n data-slot=\"qr-code-image\"\n {...imageProps}\n src={dataUrl}\n alt={alt}\n width={context.size}\n height={context.size}\n className={cn(\n \"relative max-h-(--qr-code-size) max-w-(--qr-code-size)\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeDownloadProps extends React.ComponentProps<\"button\"> {\n filename?: string;\n format?: \"png\" | \"svg\";\n asChild?: boolean;\n}\n\nfunction QRCodeDownload(props: QRCodeDownloadProps) {\n const {\n filename = \"qrcode\",\n format = \"png\",\n asChild,\n className,\n children,\n ...buttonProps\n } = props;\n\n const dataUrl = useStore((state) => state.dataUrl);\n const svgString = useStore((state) => state.svgString);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n buttonProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n const link = document.createElement(\"a\");\n\n if (format === \"png\" && dataUrl) {\n link.href = dataUrl;\n link.download = `${filename}.png`;\n } else if (format === \"svg\" && svgString) {\n const blob = new Blob([svgString], { type: \"image/svg+xml\" });\n link.href = URL.createObjectURL(blob);\n link.download = `${filename}.svg`;\n } else {\n return;\n }\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n if (format === \"svg\" && svgString) {\n URL.revokeObjectURL(link.href);\n }\n },\n [dataUrl, svgString, filename, format, buttonProps.onClick]\n );\n\n const ButtonPrimitive = asChild ? Slot : \"button\";\n\n return (\n <ButtonPrimitive\n type=\"button\"\n data-slot=\"qr-code-download\"\n {...buttonProps}\n className={cn(\"max-w-(--qr-code-size)\", className)}\n onClick={onClick}\n >\n {children ?? `Download ${format.toUpperCase()}`}\n </ButtonPrimitive>\n );\n}\n\ninterface QRCodeOverlayProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeOverlay(props: QRCodeOverlayProps) {\n const { asChild, className, ...overlayProps } = props;\n\n const OverlayPrimitive = asChild ? Slot : \"div\";\n\n return (\n <OverlayPrimitive\n data-slot=\"qr-code-overlay\"\n {...overlayProps}\n className={cn(\n \"-translate-x-1/2 -translate-y-1/2 absolute top-1/2 left-1/2 flex items-center justify-center rounded-sm bg-background\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeSkeletonProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeSkeleton(props: QRCodeSkeletonProps) {\n const { asChild, className, style, ...skeletonProps } = props;\n\n const context = useQRCodeContext(SKELETON_NAME);\n const dataUrl = useStore((state) => state.dataUrl);\n const svgString = useStore((state) => state.svgString);\n const generationKey = useStore((state) => state.generationKey);\n\n const isLoaded = dataUrl || svgString || generationKey;\n\n if (isLoaded) return null;\n\n const SkeletonPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SkeletonPrimitive\n data-slot=\"qr-code-skeleton\"\n {...skeletonProps}\n className={cn(\n \"absolute max-h-(--qr-code-size) max-w-(--qr-code-size) animate-pulse bg-accent\",\n className\n )}\n style={{\n width: context.size,\n height: context.size,\n ...style,\n }}\n />\n );\n}\n\nexport {\n QRCodeRoot as Root,\n QRCodeCanvas as Canvas,\n QRCodeSvg as Svg,\n QRCodeImage as Image,\n QRCodeOverlay as Overlay,\n QRCodeSkeleton as Skeleton,\n QRCodeDownload as Download,\n //\n QRCodeRoot as QRCode,\n QRCodeCanvas,\n QRCodeSvg,\n QRCodeImage,\n QRCodeOverlay,\n QRCodeSkeleton,\n QRCodeDownload,\n //\n useStore as useQRCode,\n //\n type QRCodeRootProps as QRCodeProps,\n};\n"],"names":["ROOT_NAME","CANVAS_NAME","SVG_NAME","IMAGE_NAME","SKELETON_NAME","useLazyRef","fn","ref","React","StoreContext","useStore","selector","store","getSnapshot","QRCodeContext","useQRCodeContext","consumerName","context","QRCodeRoot","props","value","size","level","margin","quality","backgroundColor","foregroundColor","onError","onGenerated","className","style","asChild","rootProps","canvasRef","listenersRef","stateRef","cb","key","updates","hasChanged","canvasOpts","generationKey","onQRCodeGenerate","targetGenerationKey","currentState","QRCode","dataUrl","svgString","error","parsedError","contextValue","rafId","RootPrimitive","Slot","jsx","cn","QRCodeCanvas","canvasProps","state","composedRef","useComposedRefs","CanvasPrimitive","QRCodeSvg","svgProps","SvgPrimitive","QRCodeImage","alt","imageProps","ImagePrimitive","QRCodeDownload","filename","format","children","buttonProps","onClick","event","link","blob","ButtonPrimitive","QRCodeOverlay","overlayProps","OverlayPrimitive","QRCodeSkeleton","skeletonProps","SkeletonPrimitive"],"mappings":"o1EAKMA,EAAY,SACZC,GAAc,eACdC,GAAW,YACXC,GAAa,cACbC,GAAgB,iBAmBtB,SAASC,EAAcC,EAAa,CAClC,MAAMC,EAAMC,EAAM,OAAiB,IAAI,EAEvC,OAAID,EAAI,UAAY,OAClBA,EAAI,QAAUD,EAAA,GAGTC,CACT,CA4BA,MAAME,EAAeD,EAAM,cAA4B,IAAI,EAE3D,SAASE,EAAYC,EAAuC,CAC1D,MAAMC,EAAQJ,EAAM,WAAWC,CAAY,EAC3C,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,uCAAuCZ,CAAS,IAAI,EAGtE,MAAMa,EAAcL,EAAM,YACxB,IAAMG,EAASC,EAAM,UAAU,EAC/B,CAACA,EAAOD,CAAQ,CAAA,EAGlB,OAAOH,EAAM,qBAAqBI,EAAM,UAAWC,EAAaA,CAAW,CAC7E,CAEA,MAAMC,EAAgBN,EAAM,cAAyC,IAAI,EAEzE,SAASO,EAAiBC,EAAsB,CAC9C,MAAMC,EAAUT,EAAM,WAAWM,CAAa,EAC9C,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,KAAKD,CAAY,4BAA4BhB,CAAS,IAAI,EAE5E,OAAOiB,CACT,CAeA,SAASC,EAAWC,EAAwB,CAC1C,KAAM,CACJ,MAAAC,EACA,KAAAC,EAAO,IACP,MAAAC,EAAQ,IACR,OAAAC,EAAS,EACT,QAAAC,EAAU,IACV,gBAAAC,EAAkB,UAClB,gBAAAC,EAAkB,UAClB,QAAAC,EACA,YAAAC,EACA,UAAAC,EACA,MAAAC,EACA,QAAAC,EACA,GAAGC,CAAA,EACDb,EAEEc,EAAYzB,EAAM,OAA0B,IAAI,EAEhD0B,EAAe7B,EAAW,IAAM,IAAI,GAAiB,EACrD8B,EAAW9B,EAAuB,KAAO,CAC7C,QAAS,KACT,UAAW,KACX,aAAc,GACd,MAAO,KACP,cAAe,EAAA,EACf,EAEIO,EAAQJ,EAAM,QAAe,KAC1B,CACL,UAAY4B,IACVF,EAAa,QAAQ,IAAIE,CAAE,EACpB,IAAMF,EAAa,QAAQ,OAAOE,CAAE,GAE7C,SAAU,IAAMD,EAAS,QACzB,SAAU,CAACE,EAAKjB,IAAU,CACpB,OAAO,GAAGe,EAAS,QAAQE,CAAG,EAAGjB,CAAK,IAC1Ce,EAAS,QAAQE,CAAG,EAAIjB,EACxBR,EAAM,OAAA,EACR,EACA,UAAY0B,GAAY,CACtB,IAAIC,EAAa,GAEjB,UAAWF,KAAO,OAAO,KAAKC,CAAO,EAA8B,CACjE,MAAMlB,EAAQkB,EAAQD,CAAG,EACrBjB,IAAU,QAAa,CAAC,OAAO,GAAGe,EAAS,QAAQE,CAAG,EAAGjB,CAAK,IAChE,OAAO,OAAOe,EAAS,QAAS,CAAE,CAACE,CAAG,EAAGjB,EAAO,EAChDmB,EAAa,GAEjB,CAEIA,GACF3B,EAAM,OAAA,CAEV,EACA,OAAQ,IAAM,CACZ,UAAWwB,KAAMF,EAAa,QAC5BE,EAAA,CAEJ,CAAA,GAED,CAACF,EAAcC,CAAQ,CAAC,EAErBK,EAAahC,EAAM,QACvB,KAAO,CACL,qBAAsBc,EACtB,KAAM,YACN,QAAAE,EACA,OAAAD,EACA,MAAO,CACL,KAAMG,EACN,MAAOD,CAAA,EAET,MAAOJ,CAAA,GAET,CAACC,EAAOC,EAAQG,EAAiBD,EAAiBJ,EAAMG,CAAO,CAAA,EAG3DiB,EAAgBjC,EAAM,QAAQ,IAC7BY,EAEE,KAAK,UAAU,CACpB,MAAAA,EACA,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,QAAAC,EACA,gBAAAE,EACA,gBAAAD,CAAA,CACD,EAVkB,GAWlB,CAACL,EAAOE,EAAOC,EAAQG,EAAiBD,EAAiBJ,EAAMG,CAAO,CAAC,EAEpEkB,EAAmBlC,EAAM,YAC7B,MAAOmC,GAAgC,CACrC,GAAI,CAACvB,GAAS,CAACuB,EAAqB,OAEpC,MAAMC,EAAehC,EAAM,SAAA,EAC3B,GACE,EAAAgC,EAAa,cACbA,EAAa,gBAAkBD,GAIjC,CAAA/B,EAAM,UAAU,CACd,aAAc,GACd,MAAO,IAAA,CACR,EAED,GAAI,CACF,MAAMiC,GAAU,KAAM,QAAO,QAAQ,GAAG,QAExC,IAAIC,EAAyB,KAE7B,GAAI,CACFA,EAAU,MAAMD,EAAO,UAAUzB,EAAOoB,CAAU,CACpD,MAAQ,CACNM,EAAU,IACZ,CAEIb,EAAU,SACZ,MAAMY,EAAO,SAASZ,EAAU,QAASb,EAAOoB,CAAU,EAG5D,MAAMO,EAAY,MAAMF,EAAO,SAASzB,EAAO,CAC7C,qBAAsBoB,EAAW,qBACjC,OAAQA,EAAW,OACnB,MAAOA,EAAW,MAClB,MAAOA,EAAW,MAClB,KAAM,KAAA,CACP,EAED5B,EAAM,UAAU,CACd,QAAAkC,EACA,UAAAC,EACA,aAAc,GACd,cAAeJ,CAAA,CAChB,EAEDf,IAAA,CACF,OAASoB,EAAO,CACd,MAAMC,EACJD,aAAiB,MACbA,EACA,IAAI,MAAM,4BAA4B,EAC5CpC,EAAM,UAAU,CACd,MAAOqC,EACP,aAAc,EAAA,CACf,EACDtB,IAAUsB,CAAW,CACvB,EACF,EACA,CAAC7B,EAAOoB,EAAY5B,EAAOe,EAASC,CAAW,CAAA,EAG3CsB,EAAe1C,EAAM,QACzB,KAAO,CACL,MAAAY,EACA,KAAAC,EACA,MAAAC,EACA,OAAAC,EACA,gBAAAE,EACA,gBAAAC,EACA,UAAAO,CAAA,GAEF,CAACb,EAAOC,EAAMI,EAAiBC,EAAiBJ,EAAOC,CAAM,CAAA,EAG/Df,EAAM,gBAAgB,IAAM,CAC1B,GAAIiC,EAAe,CACjB,MAAMU,EAAQ,sBAAsB,IAAM,CACxCT,EAAiBD,CAAa,CAChC,CAAC,EAED,MAAO,IAAM,qBAAqBU,CAAK,CACzC,CACF,EAAG,CAACV,EAAeC,CAAgB,CAAC,EAEpC,MAAMU,EAAgBrB,EAAUsB,EAAAA,KAAO,MAEvC,OACEC,EAAAA,IAAC7C,EAAa,SAAb,CAAsB,MAAOG,EAC5B,SAAA0C,EAAAA,IAACxC,EAAc,SAAd,CAAuB,MAAOoC,EAC7B,SAAAI,EAAAA,IAACF,EAAA,CACC,YAAU,UACT,GAAGpB,EACJ,UAAWuB,EAAAA,GAAG1B,EAAW,2CAA2C,EACpE,MACE,CACE,iBAAkB,GAAGR,CAAI,KACzB,GAAGS,CAAA,EAIN,SAAAE,GAAW,SAAWA,EAAU,eAAYwB,EAAA,CAAA,CAAa,CAAA,CAAA,EAE9D,CAAA,CACF,CAEJ,CAMA,SAASA,EAAarC,EAA0B,CAC9C,KAAM,CAAE,QAAAY,EAAS,UAAAF,EAAW,IAAAtB,EAAK,GAAGkD,GAAgBtC,EAE9CF,EAAUF,EAAiBd,EAAW,EACtCwC,EAAgB/B,EAAUgD,GAAUA,EAAM,aAAa,EAEvDC,EAAcC,GAAAA,gBAAgBrD,EAAKU,EAAQ,SAAS,EAEpD4C,EAAkB9B,EAAUsB,EAAAA,KAAO,SAEzC,OACEC,EAAAA,IAACO,EAAA,CACC,YAAU,iBACT,GAAGJ,EACJ,IAAKE,EACL,MAAO1C,EAAQ,KACf,OAAQA,EAAQ,KAChB,UAAWsC,EAAAA,GACT,yDACA,CAACd,GAAiB,YAClBZ,CAAA,CACF,CAAA,CAGN,CAMA,SAASiC,EAAU3C,EAAuB,CACxC,KAAM,CAAE,QAAAY,EAAS,UAAAF,EAAW,MAAAC,EAAO,GAAGiC,GAAa5C,EAE7CF,EAAUF,EAAiBb,EAAQ,EACnC6C,EAAYrC,EAAUgD,GAAUA,EAAM,SAAS,EAErD,GAAI,CAACX,EAAW,OAAO,KAEvB,MAAMiB,EAAejC,EAAUsB,EAAAA,KAAO,MAEtC,OACEC,EAAAA,IAACU,EAAA,CACC,YAAU,cACT,GAAGD,EACJ,UAAWR,EAAAA,GACT,yDACA1B,CAAA,EAEF,MAAO,CAAE,MAAOZ,EAAQ,KAAM,OAAQA,EAAQ,KAAM,GAAGa,CAAA,EACvD,wBAAyB,CAAE,OAAQiB,CAAA,CAAU,CAAA,CAGnD,CAMA,SAASkB,EAAY9C,EAAyB,CAC5C,KAAM,CAAE,IAAA+C,EAAM,UAAW,QAAAnC,EAAS,UAAAF,EAAW,GAAGsC,GAAehD,EAEzDF,EAAUF,EAAiBZ,EAAU,EACrC2C,EAAUpC,EAAUgD,GAAUA,EAAM,OAAO,EAEjD,GAAI,CAACZ,EAAS,OAAO,KAErB,MAAMsB,EAAiBrC,EAAUsB,EAAAA,KAAO,MAExC,OACEC,EAAAA,IAACc,EAAA,CACC,YAAU,gBACT,GAAGD,EACJ,IAAKrB,EACL,IAAAoB,EACA,MAAOjD,EAAQ,KACf,OAAQA,EAAQ,KAChB,UAAWsC,EAAAA,GACT,yDACA1B,CAAA,CACF,CAAA,CAGN,CAQA,SAASwC,EAAelD,EAA4B,CAClD,KAAM,CACJ,SAAAmD,EAAW,SACX,OAAAC,EAAS,MACT,QAAAxC,EACA,UAAAF,EACA,SAAA2C,EACA,GAAGC,CAAA,EACDtD,EAEE2B,EAAUpC,EAAUgD,GAAUA,EAAM,OAAO,EAC3CX,EAAYrC,EAAUgD,GAAUA,EAAM,SAAS,EAE/CgB,EAAUlE,EAAM,YACnBmE,GAA+C,CAE9C,GADAF,EAAY,UAAUE,CAAK,EACvBA,EAAM,iBAAkB,OAE5B,MAAMC,EAAO,SAAS,cAAc,GAAG,EAEvC,GAAIL,IAAW,OAASzB,EACtB8B,EAAK,KAAO9B,EACZ8B,EAAK,SAAW,GAAGN,CAAQ,eAClBC,IAAW,OAASxB,EAAW,CACxC,MAAM8B,EAAO,IAAI,KAAK,CAAC9B,CAAS,EAAG,CAAE,KAAM,gBAAiB,EAC5D6B,EAAK,KAAO,IAAI,gBAAgBC,CAAI,EACpCD,EAAK,SAAW,GAAGN,CAAQ,MAC7B,KACE,QAGF,SAAS,KAAK,YAAYM,CAAI,EAC9BA,EAAK,MAAA,EACL,SAAS,KAAK,YAAYA,CAAI,EAE1BL,IAAW,OAASxB,GACtB,IAAI,gBAAgB6B,EAAK,IAAI,CAEjC,EACA,CAAC9B,EAASC,EAAWuB,EAAUC,EAAQE,EAAY,OAAO,CAAA,EAGtDK,EAAkB/C,EAAUsB,EAAAA,KAAO,SAEzC,OACEC,EAAAA,IAACwB,EAAA,CACC,KAAK,SACL,YAAU,mBACT,GAAGL,EACJ,UAAWlB,EAAAA,GAAG,yBAA0B1B,CAAS,EACjD,QAAA6C,EAEC,SAAAF,GAAY,YAAYD,EAAO,YAAA,CAAa,EAAA,CAAA,CAGnD,CAMA,SAASQ,EAAc5D,EAA2B,CAChD,KAAM,CAAE,QAAAY,EAAS,UAAAF,EAAW,GAAGmD,GAAiB7D,EAE1C8D,EAAmBlD,EAAUsB,EAAAA,KAAO,MAE1C,OACEC,EAAAA,IAAC2B,EAAA,CACC,YAAU,kBACT,GAAGD,EACJ,UAAWzB,EAAAA,GACT,wHACA1B,CAAA,CACF,CAAA,CAGN,CAMA,SAASqD,EAAe/D,EAA4B,CAClD,KAAM,CAAE,QAAAY,EAAS,UAAAF,EAAW,MAAAC,EAAO,GAAGqD,GAAkBhE,EAElDF,EAAUF,EAAiBX,EAAa,EACxC0C,EAAUpC,EAAUgD,GAAUA,EAAM,OAAO,EAC3CX,EAAYrC,EAAUgD,GAAUA,EAAM,SAAS,EAC/CjB,EAAgB/B,EAAUgD,GAAUA,EAAM,aAAa,EAI7D,GAFiBZ,GAAWC,GAAaN,EAE3B,OAAO,KAErB,MAAM2C,EAAoBrD,EAAUsB,EAAAA,KAAO,MAE3C,OACEC,EAAAA,IAAC8B,EAAA,CACC,YAAU,mBACT,GAAGD,EACJ,UAAW5B,EAAAA,GACT,iFACA1B,CAAA,EAEF,MAAO,CACL,MAAOZ,EAAQ,KACf,OAAQA,EAAQ,KAChB,GAAGa,CAAA,CACL,CAAA,CAGN"}
|
|
1
|
+
{"version":3,"file":"QrCode.cjs","sources":["../../../../src/components/QrCode/QrCode.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport * as React from \"react\";\n\nconst ROOT_NAME = \"QRCode\";\nconst CANVAS_NAME = \"QRCodeCanvas\";\nconst SVG_NAME = \"QRCodeSvg\";\nconst IMAGE_NAME = \"QRCodeImage\";\nconst SKELETON_NAME = \"QRCodeSkeleton\";\n\ntype QRCodeLevel = \"L\" | \"M\" | \"Q\" | \"H\";\n\ninterface QRCodeCanvasOpts {\n errorCorrectionLevel: QRCodeLevel;\n type?: \"image/png\" | \"image/jpeg\" | \"image/webp\";\n quality?: number;\n margin?: number;\n color?: {\n dark: string;\n light: string;\n };\n width?: number;\n rendererOpts?: {\n quality?: number;\n };\n}\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\ninterface StoreState {\n dataUrl: string | null;\n svgString: string | null;\n isGenerating: boolean;\n error: Error | null;\n generationKey: string;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n setStates: (updates: Partial<StoreState>) => void;\n notify: () => void;\n}\n\ninterface QRCodeContextValue {\n value: string;\n size: number;\n margin: number;\n level: QRCodeLevel;\n backgroundColor: string;\n foregroundColor: string;\n canvasRef: React.RefObject<HTMLCanvasElement | null>;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = React.useContext(StoreContext);\n if (!store) {\n throw new Error(`\\`useQRCode\\` must be used within \\`${ROOT_NAME}\\``);\n }\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector]\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\nconst QRCodeContext = React.createContext<QRCodeContextValue | null>(null);\n\nfunction useQRCodeContext(consumerName: string) {\n const context = React.useContext(QRCodeContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface QRCodeRootProps extends Omit<React.ComponentProps<\"div\">, \"onError\"> {\n value: string;\n size?: number;\n level?: QRCodeLevel;\n margin?: number;\n quality?: number;\n backgroundColor?: string;\n foregroundColor?: string;\n onError?: (error: Error) => void;\n onGenerated?: () => void;\n asChild?: boolean;\n}\n\nfunction QRCodeRoot(props: QRCodeRootProps) {\n const {\n value,\n size = 200,\n level = \"M\",\n margin = 1,\n quality = 0.92,\n backgroundColor = \"#ffffff\",\n foregroundColor = \"#000000\",\n onError,\n onGenerated,\n className,\n style,\n asChild,\n ...rootProps\n } = props;\n\n const canvasRef = React.useRef<HTMLCanvasElement>(null);\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n dataUrl: null,\n svgString: null,\n isGenerating: false,\n error: null,\n generationKey: \"\",\n }));\n\n const store = React.useMemo<Store>(() => {\n return {\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => stateRef.current,\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n store.notify();\n },\n setStates: (updates) => {\n let hasChanged = false;\n\n for (const key of Object.keys(updates) as Array<keyof StoreState>) {\n const value = updates[key];\n if (value !== undefined && !Object.is(stateRef.current[key], value)) {\n Object.assign(stateRef.current, { [key]: value });\n hasChanged = true;\n }\n }\n\n if (hasChanged) {\n store.notify();\n }\n },\n notify: () => {\n for (const cb of listenersRef.current) {\n cb();\n }\n },\n };\n }, [listenersRef, stateRef]);\n\n const canvasOpts = React.useMemo<QRCodeCanvasOpts>(\n () => ({\n errorCorrectionLevel: level,\n type: \"image/png\",\n quality,\n margin,\n color: {\n dark: foregroundColor,\n light: backgroundColor,\n },\n width: size,\n }),\n [level, margin, foregroundColor, backgroundColor, size, quality]\n );\n\n const generationKey = React.useMemo(() => {\n if (!value) return \"\";\n\n return JSON.stringify({\n value,\n size,\n level,\n margin,\n quality,\n foregroundColor,\n backgroundColor,\n });\n }, [value, level, margin, foregroundColor, backgroundColor, size, quality]);\n\n const onQRCodeGenerate = React.useCallback(\n async (targetGenerationKey: string) => {\n if (!value || !targetGenerationKey) return;\n\n const currentState = store.getState();\n if (\n currentState.isGenerating ||\n currentState.generationKey === targetGenerationKey\n )\n return;\n\n store.setStates({\n isGenerating: true,\n error: null,\n });\n\n try {\n const QRCode = (await import(\"qrcode\")).default;\n\n let dataUrl: string | null = null;\n\n try {\n dataUrl = await QRCode.toDataURL(value, canvasOpts);\n } catch {\n dataUrl = null;\n }\n\n if (canvasRef.current) {\n await QRCode.toCanvas(canvasRef.current, value, canvasOpts);\n }\n\n const svgString = await QRCode.toString(value, {\n errorCorrectionLevel: canvasOpts.errorCorrectionLevel,\n margin: canvasOpts.margin,\n color: canvasOpts.color,\n width: canvasOpts.width,\n type: \"svg\",\n });\n\n store.setStates({\n dataUrl,\n svgString,\n isGenerating: false,\n generationKey: targetGenerationKey,\n });\n\n onGenerated?.();\n } catch (error) {\n const parsedError =\n error instanceof Error\n ? error\n : new Error(\"Failed to generate QR code\");\n store.setStates({\n error: parsedError,\n isGenerating: false,\n });\n onError?.(parsedError);\n }\n },\n [value, canvasOpts, store, onError, onGenerated]\n );\n\n const contextValue = React.useMemo<QRCodeContextValue>(\n () => ({\n value,\n size,\n level,\n margin,\n backgroundColor,\n foregroundColor,\n canvasRef,\n }),\n [value, size, backgroundColor, foregroundColor, level, margin]\n );\n\n React.useLayoutEffect(() => {\n if (generationKey) {\n const rafId = requestAnimationFrame(() => {\n onQRCodeGenerate(generationKey);\n });\n\n return () => cancelAnimationFrame(rafId);\n }\n }, [generationKey, onQRCodeGenerate]);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StoreContext.Provider value={store}>\n <QRCodeContext.Provider value={contextValue}>\n <RootPrimitive\n data-slot=\"qr-code\"\n {...rootProps}\n className={cn(className, \"ds:relative ds:flex ds:flex-col ds:items-center ds:gap-2\")}\n style={\n {\n \"--qr-code-size\": `${size}px`,\n ...style,\n } as React.CSSProperties\n }\n >\n {rootProps?.children ? rootProps.children : <QRCodeCanvas />}\n </RootPrimitive>\n </QRCodeContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface QRCodeCanvasProps extends React.ComponentProps<\"canvas\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeCanvas(props: QRCodeCanvasProps) {\n const { asChild, className, ref, ...canvasProps } = props;\n\n const context = useQRCodeContext(CANVAS_NAME);\n const generationKey = useStore((state) => state.generationKey);\n\n const composedRef = useComposedRefs(ref, context.canvasRef);\n\n const CanvasPrimitive = asChild ? Slot : \"canvas\";\n\n return (\n <CanvasPrimitive\n data-slot=\"qr-code-canvas\"\n {...canvasProps}\n ref={composedRef}\n width={context.size}\n height={context.size}\n className={cn(\n \"ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)\",\n !generationKey && \"ds:invisible\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeSvgProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeSvg(props: QRCodeSvgProps) {\n const { asChild, className, style, ...svgProps } = props;\n\n const context = useQRCodeContext(SVG_NAME);\n const svgString = useStore((state) => state.svgString);\n\n if (!svgString) return null;\n\n const SvgPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SvgPrimitive\n data-slot=\"qr-code-svg\"\n {...svgProps}\n className={cn(\n \"ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)\",\n className\n )}\n style={{ width: context.size, height: context.size, ...style }}\n dangerouslySetInnerHTML={{ __html: svgString }}\n />\n );\n}\n\ninterface QRCodeImageProps extends React.ComponentProps<\"img\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeImage(props: QRCodeImageProps) {\n const { alt = \"QR Code\", asChild, className, ...imageProps } = props;\n\n const context = useQRCodeContext(IMAGE_NAME);\n const dataUrl = useStore((state) => state.dataUrl);\n\n if (!dataUrl) return null;\n\n const ImagePrimitive = asChild ? Slot : \"img\";\n\n return (\n <ImagePrimitive\n data-slot=\"qr-code-image\"\n {...imageProps}\n src={dataUrl}\n alt={alt}\n width={context.size}\n height={context.size}\n className={cn(\n \"ds:relative ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size)\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeDownloadProps extends React.ComponentProps<\"button\"> {\n filename?: string;\n format?: \"png\" | \"svg\";\n asChild?: boolean;\n}\n\nfunction QRCodeDownload(props: QRCodeDownloadProps) {\n const {\n filename = \"qrcode\",\n format = \"png\",\n asChild,\n className,\n children,\n ...buttonProps\n } = props;\n\n const dataUrl = useStore((state) => state.dataUrl);\n const svgString = useStore((state) => state.svgString);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n buttonProps.onClick?.(event);\n if (event.defaultPrevented) return;\n\n const link = document.createElement(\"a\");\n\n if (format === \"png\" && dataUrl) {\n link.href = dataUrl;\n link.download = `${filename}.png`;\n } else if (format === \"svg\" && svgString) {\n const blob = new Blob([svgString], { type: \"image/svg+xml\" });\n link.href = URL.createObjectURL(blob);\n link.download = `${filename}.svg`;\n } else {\n return;\n }\n\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n if (format === \"svg\" && svgString) {\n URL.revokeObjectURL(link.href);\n }\n },\n [dataUrl, svgString, filename, format, buttonProps.onClick]\n );\n\n const ButtonPrimitive = asChild ? Slot : \"button\";\n\n return (\n <ButtonPrimitive\n type=\"button\"\n data-slot=\"qr-code-download\"\n {...buttonProps}\n className={cn(\"ds:max-w-(--qr-code-size)\", className)}\n onClick={onClick}\n >\n {children ?? `Download ${format.toUpperCase()}`}\n </ButtonPrimitive>\n );\n}\n\ninterface QRCodeOverlayProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeOverlay(props: QRCodeOverlayProps) {\n const { asChild, className, ...overlayProps } = props;\n\n const OverlayPrimitive = asChild ? Slot : \"div\";\n\n return (\n <OverlayPrimitive\n data-slot=\"qr-code-overlay\"\n {...overlayProps}\n className={cn(\n \"ds:-translate-x-1/2 ds:-translate-y-1/2 ds:absolute ds:top-1/2 ds:left-1/2 ds:flex ds:items-center ds:justify-center ds:rounded-sm ds:bg-background\",\n className\n )}\n />\n );\n}\n\ninterface QRCodeSkeletonProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nfunction QRCodeSkeleton(props: QRCodeSkeletonProps) {\n const { asChild, className, style, ...skeletonProps } = props;\n\n const context = useQRCodeContext(SKELETON_NAME);\n const dataUrl = useStore((state) => state.dataUrl);\n const svgString = useStore((state) => state.svgString);\n const generationKey = useStore((state) => state.generationKey);\n\n const isLoaded = dataUrl || svgString || generationKey;\n\n if (isLoaded) return null;\n\n const SkeletonPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SkeletonPrimitive\n data-slot=\"qr-code-skeleton\"\n {...skeletonProps}\n className={cn(\n \"ds:absolute ds:max-h-(--qr-code-size) ds:max-w-(--qr-code-size) ds:animate-pulse ds:bg-accent\",\n className\n )}\n style={{\n width: context.size,\n height: context.size,\n ...style,\n }}\n />\n );\n}\n\nexport {\n QRCodeRoot as Root,\n QRCodeCanvas as Canvas,\n QRCodeSvg as Svg,\n QRCodeImage as Image,\n QRCodeOverlay as Overlay,\n QRCodeSkeleton as Skeleton,\n QRCodeDownload as Download,\n //\n QRCodeRoot as QRCode,\n QRCodeCanvas,\n QRCodeSvg,\n QRCodeImage,\n QRCodeOverlay,\n QRCodeSkeleton,\n QRCodeDownload,\n //\n useStore as useQRCode,\n //\n type QRCodeRootProps as QRCodeProps,\n};\n"],"names":["ROOT_NAME","CANVAS_NAME","SVG_NAME","IMAGE_NAME","SKELETON_NAME","useLazyRef","fn","ref","React","StoreContext","useStore","selector","store","getSnapshot","QRCodeContext","useQRCodeContext","consumerName","context","QRCodeRoot","props","value","size","level","margin","quality","backgroundColor","foregroundColor","onError","onGenerated","className","style","asChild","rootProps","canvasRef","listenersRef","stateRef","cb","key","updates","hasChanged","canvasOpts","generationKey","onQRCodeGenerate","targetGenerationKey","currentState","QRCode","dataUrl","svgString","error","parsedError","contextValue","rafId","RootPrimitive","Slot","jsx","cn","QRCodeCanvas","canvasProps","state","composedRef","useComposedRefs","CanvasPrimitive","QRCodeSvg","svgProps","SvgPrimitive","QRCodeImage","alt","imageProps","ImagePrimitive","QRCodeDownload","filename","format","children","buttonProps","onClick","event","link","blob","ButtonPrimitive","QRCodeOverlay","overlayProps","OverlayPrimitive","QRCodeSkeleton","skeletonProps","SkeletonPrimitive"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),n=require("react"),q=require("../../packages/ui/src/components/radio-group.cjs");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const c=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const m=n.forwardRef((t
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),n=require("react"),q=require("../../packages/ui/src/components/radio-group.cjs");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const c=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const m=n.forwardRef((o,t)=>{const{label:r,variant:s="option",rootClassName:i,...a}=o,u=n.useId();return e.jsxs("div",{className:c.cn("ds:flex ds:items-center ds:space-x-2",i),children:[e.jsx(q.RadioGroupItem,{ref:t,id:u,...a}),s==="option"&&r&&e.jsx("label",{htmlFor:u,className:"ds:text-sm ds:font-medium ds:leading-none ds:peer-disabled:cursor-not-allowed ds:peer-disabled:opacity-70",children:r}),s==="button-group"&&r&&e.jsx("span",{className:"ds:sr-only",children:r})]})});m.displayName="RadioItem";const l=n.forwardRef((o,t)=>{const{options:r,label:s,helperText:i,variant:a="option",size:u="default",color:p,value:x,onValueChange:b,children:f,className:N,rootClassName:h,disabled:j}=o;return e.jsxs("div",{className:c.cn("ds:flex ds:flex-col ds:gap-1.5",h),children:[s&&e.jsx("label",{className:"ds:text-sm ds:font-medium",children:s}),e.jsxs(q.RadioGroup,{ref:t,value:x,onValueChange:b,variant:a,className:c.cn(N),children:[r&&r.map(d=>e.jsx(m,{value:d.value,label:d.label,disabled:j||d.disabled,variant:a,size:u,color:p},d.value)),f]}),i&&e.jsx("p",{className:"ds:text-xs ds:text-muted-foreground",children:i})]})});l.displayName="Radio";l.Group=q.RadioGroup;l.Item=m;exports.default=l;
|
|
2
2
|
//# sourceMappingURL=Radio.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Radio.cjs","sources":["../../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n RadioGroupItem as SRadioGroupItem,\n RadioGroup as SRadioGroup,\n type RadioGroupProps,\n type RadioGroupItemProps,\n} from \"@dsui/ui/components/radio-group\";\nimport { cn } from \"@dsui/ui/index\";\n\nexport type RadioItemProps = RadioGroupItemProps & {\n label?: React.ReactNode;\n variant?: \"option\" | \"button-group\";\n size?: \"default\" | \"sm\" | \"lg\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n rootClassName?: string;\n};\n\nconst RadioItem = React.forwardRef<HTMLButtonElement, RadioItemProps>(\n (props, ref) => {\n const { label, variant = \"option\", rootClassName, ...itemProps } = props;\n const id = React.useId();\n\n return (\n <div className={cn(\"flex items-center space-x-2\", rootClassName)}>\n <SRadioGroupItem ref={ref} id={id} {...itemProps} />\n {variant === \"option\" && label && (\n <label\n htmlFor={id}\n className=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n {variant === \"button-group\" && label && (\n <span className=\"sr-only\">{label}</span>\n )}\n </div>\n );\n }\n);\n\nRadioItem.displayName = \"RadioItem\";\n\nexport type RadioProps = {\n options?: Array<{\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n }>;\n label?: React.ReactNode;\n helperText?: React.ReactNode;\n variant?: \"option\" | \"button-group\";\n size?: \"default\" | \"sm\" | \"lg\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n value?: string;\n onValueChange?: (value: string) => void;\n children?: React.ReactNode;\n className?: string;\n rootClassName?: string;\n disabled?: boolean;\n} & RadioGroupProps;\n\nconst Radio = React.forwardRef<HTMLDivElement, RadioProps>((props, ref) => {\n const {\n options,\n label,\n helperText,\n variant = \"option\",\n size = \"default\",\n color,\n value,\n onValueChange,\n children,\n className,\n rootClassName,\n disabled,\n } = props;\n\n return (\n <div className={cn(\"flex flex-col gap-1.5\", rootClassName)}>\n {label && <label className=\"text-sm font-medium\">{label}</label>}\n\n <SRadioGroup\n ref={ref}\n value={value}\n onValueChange={onValueChange}\n variant={variant}\n className={cn(className)}\n >\n {options &&\n options.map((option) => (\n <RadioItem\n key={option.value}\n value={option.value}\n label={option.label}\n disabled={disabled || option.disabled}\n variant={variant}\n size={size}\n color={color}\n />\n ))}\n {children}\n </SRadioGroup>\n\n {helperText && (\n <p className=\"text-xs text-muted-foreground\">{helperText}</p>\n )}\n </div>\n );\n}) as React.ForwardRefExoticComponent<\n RadioProps & React.RefAttributes<HTMLDivElement>\n> & {\n Group: typeof SRadioGroup;\n Item: typeof RadioItem;\n};\n\nRadio.displayName = \"Radio\";\n\nRadio.Group = SRadioGroup;\nRadio.Item = RadioItem;\n\nexport default Radio;\nexport { type RadioGroupProps, type RadioGroupItemProps };\n"],"names":["RadioItem","React","props","ref","label","variant","rootClassName","itemProps","id","cn","jsx","SRadioGroupItem","Radio","options","helperText","size","color","value","onValueChange","children","className","disabled","jsxs","SRadioGroup","option"],"mappings":"okDAyBA,MAAMA,EAAYC,EAAM,WACtB,CAACC,EAAOC,IAAQ,CACd,KAAM,CAAE,MAAAC,EAAO,QAAAC,EAAU,SAAU,cAAAC,EAAe,GAAGC,GAAcL,EAC7DM,EAAKP,EAAM,MAAA,EAEjB,cACG,MAAA,CAAI,UAAWQ,EAAAA,GAAG,
|
|
1
|
+
{"version":3,"file":"Radio.cjs","sources":["../../../../src/components/Radio/Radio.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n RadioGroupItem as SRadioGroupItem,\n RadioGroup as SRadioGroup,\n type RadioGroupProps,\n type RadioGroupItemProps,\n} from \"@dsui/ui/components/radio-group\";\nimport { cn } from \"@dsui/ui/index\";\n\nexport type RadioItemProps = RadioGroupItemProps & {\n label?: React.ReactNode;\n variant?: \"option\" | \"button-group\";\n size?: \"default\" | \"sm\" | \"lg\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n rootClassName?: string;\n};\n\nconst RadioItem = React.forwardRef<HTMLButtonElement, RadioItemProps>(\n (props, ref) => {\n const { label, variant = \"option\", rootClassName, ...itemProps } = props;\n const id = React.useId();\n\n return (\n <div className={cn(\"ds:flex ds:items-center ds:space-x-2\", rootClassName)}>\n <SRadioGroupItem ref={ref} id={id} {...itemProps} />\n {variant === \"option\" && label && (\n <label\n htmlFor={id}\n className=\"ds:text-sm ds:font-medium ds:leading-none ds:peer-disabled:cursor-not-allowed ds:peer-disabled:opacity-70\"\n >\n {label}\n </label>\n )}\n {variant === \"button-group\" && label && (\n <span className=\"ds:sr-only\">{label}</span>\n )}\n </div>\n );\n }\n);\n\nRadioItem.displayName = \"RadioItem\";\n\nexport type RadioProps = {\n options?: Array<{\n label: React.ReactNode;\n value: string;\n disabled?: boolean;\n }>;\n label?: React.ReactNode;\n helperText?: React.ReactNode;\n variant?: \"option\" | \"button-group\";\n size?: \"default\" | \"sm\" | \"lg\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n value?: string;\n onValueChange?: (value: string) => void;\n children?: React.ReactNode;\n className?: string;\n rootClassName?: string;\n disabled?: boolean;\n} & RadioGroupProps;\n\nconst Radio = React.forwardRef<HTMLDivElement, RadioProps>((props, ref) => {\n const {\n options,\n label,\n helperText,\n variant = \"option\",\n size = \"default\",\n color,\n value,\n onValueChange,\n children,\n className,\n rootClassName,\n disabled,\n } = props;\n\n return (\n <div className={cn(\"ds:flex ds:flex-col ds:gap-1.5\", rootClassName)}>\n {label && <label className=\"ds:text-sm ds:font-medium\">{label}</label>}\n\n <SRadioGroup\n ref={ref}\n value={value}\n onValueChange={onValueChange}\n variant={variant}\n className={cn(className)}\n >\n {options &&\n options.map((option) => (\n <RadioItem\n key={option.value}\n value={option.value}\n label={option.label}\n disabled={disabled || option.disabled}\n variant={variant}\n size={size}\n color={color}\n />\n ))}\n {children}\n </SRadioGroup>\n\n {helperText && (\n <p className=\"ds:text-xs ds:text-muted-foreground\">{helperText}</p>\n )}\n </div>\n );\n}) as React.ForwardRefExoticComponent<\n RadioProps & React.RefAttributes<HTMLDivElement>\n> & {\n Group: typeof SRadioGroup;\n Item: typeof RadioItem;\n};\n\nRadio.displayName = \"Radio\";\n\nRadio.Group = SRadioGroup;\nRadio.Item = RadioItem;\n\nexport default Radio;\nexport { type RadioGroupProps, type RadioGroupItemProps };\n"],"names":["RadioItem","React","props","ref","label","variant","rootClassName","itemProps","id","cn","jsx","SRadioGroupItem","Radio","options","helperText","size","color","value","onValueChange","children","className","disabled","jsxs","SRadioGroup","option"],"mappings":"okDAyBA,MAAMA,EAAYC,EAAM,WACtB,CAACC,EAAOC,IAAQ,CACd,KAAM,CAAE,MAAAC,EAAO,QAAAC,EAAU,SAAU,cAAAC,EAAe,GAAGC,GAAcL,EAC7DM,EAAKP,EAAM,MAAA,EAEjB,cACG,MAAA,CAAI,UAAWQ,EAAAA,GAAG,uCAAwCH,CAAa,EACtE,SAAA,CAAAI,EAAAA,IAACC,EAAAA,eAAA,CAAgB,IAAAR,EAAU,GAAAK,EAAS,GAAGD,CAAA,CAAW,EACjDF,IAAY,UAAYD,GACvBM,EAAAA,IAAC,QAAA,CACC,QAASF,EACT,UAAU,4GAET,SAAAJ,CAAA,CAAA,EAGJC,IAAY,gBAAkBD,SAC5B,OAAA,CAAK,UAAU,aAAc,SAAAA,CAAA,CAAM,CAAA,EAExC,CAEJ,CACF,EAEAJ,EAAU,YAAc,YA6BxB,MAAMY,EAAQX,EAAM,WAAuC,CAACC,EAAOC,IAAQ,CACzE,KAAM,CACJ,QAAAU,EACA,MAAAT,EACA,WAAAU,EACA,QAAAT,EAAU,SACV,KAAAU,EAAO,UACP,MAAAC,EACA,MAAAC,EACA,cAAAC,EACA,SAAAC,EACA,UAAAC,EACA,cAAAd,EACA,SAAAe,CAAA,EACEnB,EAEJ,cACG,MAAA,CAAI,UAAWO,EAAAA,GAAG,iCAAkCH,CAAa,EAC/D,SAAA,CAAAF,GAASM,EAAAA,IAAC,QAAA,CAAM,UAAU,4BAA6B,SAAAN,EAAM,EAE9DkB,EAAAA,KAACC,EAAAA,WAAA,CACC,IAAApB,EACA,MAAAc,EACA,cAAAC,EACA,QAAAb,EACA,UAAWI,EAAAA,GAAGW,CAAS,EAEtB,SAAA,CAAAP,GACCA,EAAQ,IAAKW,GACXd,EAAAA,IAACV,EAAA,CAEC,MAAOwB,EAAO,MACd,MAAOA,EAAO,MACd,SAAUH,GAAYG,EAAO,SAC7B,QAAAnB,EACA,KAAAU,EACA,MAAAC,CAAA,EANKQ,EAAO,KAAA,CAQf,EACFL,CAAA,CAAA,CAAA,EAGFL,GACCJ,EAAAA,IAAC,IAAA,CAAE,UAAU,sCAAuC,SAAAI,CAAA,CAAW,CAAA,EAEnE,CAEJ,CAAC,EAODF,EAAM,YAAc,QAEpBA,EAAM,MAAQW,EAAAA,WACdX,EAAM,KAAOZ"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("react/jsx-runtime"),i=require("react"),k=require("lucide-react"),R=require("../../packages/ui/src/lib/utils.cjs"),b=i.forwardRef(({count:u=5,value:x,defaultValue:j=0,allowHalf:a=!1,allowClear:N=!0,size:d="middle",color:V="warning",character:f,className:D,style:A,disabled:l=!1,autoFocus:F=!1,keyboard:q=!0,tooltips:v,onChange:m,onHoverChange:M,onFocus:E,onBlur:L,onKeyDown:$},c)=>{const[B,p]=i.useState(j),[o,S]=i.useState(null),K=i.useRef(null),n=x!==void 0?x:B,_={small:20,middle:24,large:32},P={primary:"text-primary [&_svg]:fill-primary",secondary:"text-secondary [&_svg]:fill-secondary",accent:"text-accent [&_svg]:fill-accent",destructive:"text-destructive [&_svg]:fill-destructive",muted:"text-muted-foreground [&_svg]:fill-muted-foreground",success:"text-success [&_svg]:fill-success",error:"text-error [&_svg]:fill-error",warning:"text-yellow-400 [&_svg]:fill-yellow-400"},g=(e,s)=>{if(l)return;const t=s?e+.5:e+1;N&&t===n?(p(0),m?.(0)):(p(t),m?.(t))},h=(e,s)=>{if(l)return;const t=s?e+.5:e+1;S(t),M?.(t)},T=()=>{S(null),M?.(0)},C=e=>{if(!q||l)return;$?.(e);const s=a?.5:1;let t=n;switch(e.key){case"ArrowRight":case"ArrowUp":e.preventDefault(),t=Math.min(n+s,u);break;case"ArrowLeft":case"ArrowDown":e.preventDefault(),t=Math.max(n-s,0);break;case"Home":e.preventDefault(),t=a?.5:1;break;case"End":e.preventDefault(),t=u;break;default:return}p(t),m?.(t)},H=()=>{E?.()},O=()=>{L?.()},U=e=>{const s=o!==null?o:n;return s>=e+1?100:s>e&&s<e+1?(s-e)*100:0},z=e=>{if(!a)return!1;const t=(o!==null?o:n)-e;return t>0&&t<=.5},w=(e=!1)=>typeof f=="function"?f({count:u,value:n,defaultValue:j,allowHalf:a,allowClear:N,size:d,disabled:l}):e?r.jsx(k.StarHalf,{className:"ds:w-full ds:h-full"}):f||r.jsx(k.Star,{className:"ds:w-full ds:h-full"}),G=e=>{if(!(!v||!v[e]))return v[e]};return r.jsx("div",{ref:e=>{K.current=e,typeof c=="function"?c(e):c&&(c.current=e)},className:R.cn("ds:inline-flex ds:items-center ds:gap-1",l&&"ds:opacity-50 ds:cursor-not-allowed",!l&&"ds:cursor-pointer",D),style:A,onMouseLeave:T,onKeyDown:C,onFocus:H,onBlur:O,tabIndex:l?-1:0,role:"slider","aria-label":"Rate","aria-valuemin":0,"aria-valuemax":u,"aria-valuenow":n,"aria-disabled":l,autoFocus:F,children:Array.from({length:u},(e,s)=>{const t=U(s),y=G(s),J=z(s);return r.jsxs("div",{className:"ds:relative ds:group",title:y,children:[r.jsxs("div",{className:"ds:relative ds:inline-flex",style:{width:`${_[d]}px`,height:`${_[d]}px`},children:[r.jsx("div",{className:"ds:text-muted-foreground/30 ds:pointer-events-none",children:w(!1)}),t>0&&r.jsx("div",{className:R.cn("ds:absolute ds:inset-0 ds:pointer-events-none",P[V]),children:J?w(!0):r.jsx("div",{className:"ds:overflow-hidden",style:{width:`${t}%`},children:w(!1)})}),!l&&r.jsx(r.Fragment,{children:a?r.jsxs(r.Fragment,{children:[r.jsx("div",{className:"ds:absolute ds:inset-0 ds:w-1/2 ds:cursor-pointer",onClick:()=>g(s,!0),onMouseEnter:()=>h(s,!0)}),r.jsx("div",{className:"ds:absolute ds:inset-0 ds:left-1/2 ds:w-1/2 ds:cursor-pointer",onClick:()=>g(s,!1),onMouseEnter:()=>h(s,!1)})]}):r.jsx("div",{className:"ds:absolute ds:inset-0 ds:cursor-pointer",onClick:()=>g(s,!1),onMouseEnter:()=>h(s,!1)})})]}),y&&(o===s+1||a&&o===s+.5)&&r.jsx("div",{className:"ds:absolute ds:top-full ds:left-1/2 ds:-translate-x-1/2 ds:mt-1 ds:px-2 ds:py-1 ds:text-xs ds:bg-foreground ds:text-background ds:rounded ds:whitespace-nowrap ds:z-10",children:y})]},s)})})});b.displayName="Rate";exports.default=b;
|
|
2
2
|
//# sourceMappingURL=Rate.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Rate.cjs","sources":["../../../../src/components/Rate/Rate.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useRef } from \"react\";\nimport type { KeyboardEvent } from \"react\";\nimport { Star, StarHalf } from \"lucide-react\";\nimport { cn } from \"@dsui/ui/lib/utils\";\n\nexport interface RateProps {\n // Display\n count?: number;\n value?: number;\n defaultValue?: number;\n allowHalf?: boolean;\n allowClear?: boolean;\n\n // Appearance\n size?: \"small\" | \"middle\" | \"large\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n character?: React.ReactNode | ((rateProps: RateProps) => React.ReactNode);\n className?: string;\n style?: React.CSSProperties;\n\n // Interaction\n disabled?: boolean;\n autoFocus?: boolean;\n keyboard?: boolean;\n\n // Tooltips\n tooltips?: string[];\n\n // Callbacks\n onChange?: (value: number) => void;\n onHoverChange?: (value: number) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void;\n}\n\nconst Rate = React.forwardRef<HTMLDivElement, RateProps>(\n (\n {\n count = 5,\n value: controlledValue,\n defaultValue = 0,\n allowHalf = false,\n allowClear = true,\n size = \"middle\",\n color = \"warning\",\n character,\n className,\n style,\n disabled = false,\n autoFocus = false,\n keyboard = true,\n tooltips,\n onChange,\n onHoverChange,\n onFocus,\n onBlur,\n onKeyDown,\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [hoverValue, setHoverValue] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use controlled or uncontrolled value\n const value =\n controlledValue !== undefined ? controlledValue : internalValue;\n\n // Size in pixels\n const sizeMap = {\n small: 20,\n middle: 24,\n large: 32,\n };\n\n // Color mapping for filled stars\n const colorMap = {\n primary: \"text-primary [&_svg]:fill-primary\",\n secondary: \"text-secondary [&_svg]:fill-secondary\",\n accent: \"text-accent [&_svg]:fill-accent\",\n destructive: \"text-destructive [&_svg]:fill-destructive\",\n muted: \"text-muted-foreground [&_svg]:fill-muted-foreground\",\n success: \"text-success [&_svg]:fill-success\",\n error: \"text-error [&_svg]:fill-error\",\n warning: \"text-yellow-400 [&_svg]:fill-yellow-400\",\n };\n\n // Handle star click\n const handleStarClick = (starIndex: number, isHalf: boolean) => {\n if (disabled) return;\n\n const newValue = isHalf ? starIndex + 0.5 : starIndex + 1;\n\n // If clicking the same value and allowClear is true, clear the rating\n if (allowClear && newValue === value) {\n setInternalValue(0);\n onChange?.(0);\n } else {\n setInternalValue(newValue);\n onChange?.(newValue);\n }\n };\n\n // Handle star hover\n const handleStarHover = (starIndex: number, isHalf: boolean) => {\n if (disabled) return;\n\n const newHoverValue = isHalf ? starIndex + 0.5 : starIndex + 1;\n setHoverValue(newHoverValue);\n onHoverChange?.(newHoverValue);\n };\n\n // Handle mouse leave\n const handleMouseLeave = () => {\n setHoverValue(null);\n onHoverChange?.(0);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!keyboard || disabled) return;\n\n onKeyDown?.(event);\n\n const step = allowHalf ? 0.5 : 1;\n let newValue = value;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n event.preventDefault();\n newValue = Math.min(value + step, count);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n event.preventDefault();\n newValue = Math.max(value - step, 0);\n break;\n case \"Home\":\n event.preventDefault();\n newValue = allowHalf ? 0.5 : 1;\n break;\n case \"End\":\n event.preventDefault();\n newValue = count;\n break;\n default:\n return;\n }\n\n setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n // Handle focus\n const handleFocus = () => {\n onFocus?.();\n };\n\n // Handle blur\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Get star fill percentage\n const getStarFill = (starIndex: number) => {\n const currentValue = hoverValue !== null ? hoverValue : value;\n\n if (currentValue >= starIndex + 1) {\n return 100; // Full star\n } else if (currentValue > starIndex && currentValue < starIndex + 1) {\n return (currentValue - starIndex) * 100; // Partial star\n }\n return 0; // Empty star\n };\n\n // Check if star should show as half\n const isHalfStar = (starIndex: number) => {\n if (!allowHalf) return false;\n const currentValue = hoverValue !== null ? hoverValue : value;\n const fill = currentValue - starIndex;\n return fill > 0 && fill <= 0.5;\n };\n\n // Render character\n const renderCharacter = (isHalf: boolean = false) => {\n if (typeof character === \"function\") {\n return character({\n count,\n value,\n defaultValue,\n allowHalf,\n allowClear,\n size,\n disabled,\n });\n }\n if (isHalf) {\n return <StarHalf className=\"w-full h-full\" />;\n }\n return character || <Star className=\"w-full h-full\" />;\n };\n\n // Get tooltip for star\n const getTooltip = (starIndex: number) => {\n if (!tooltips || !tooltips[starIndex]) return undefined;\n return tooltips[starIndex];\n };\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={cn(\n \"inline-flex items-center gap-1\",\n disabled && \"opacity-50 cursor-not-allowed\",\n !disabled && \"cursor-pointer\",\n className\n )}\n style={style}\n onMouseLeave={handleMouseLeave}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Rate\"\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={value}\n aria-disabled={disabled}\n autoFocus={autoFocus}\n >\n {Array.from({ length: count }, (_, index) => {\n const fillPercentage = getStarFill(index);\n const tooltip = getTooltip(index);\n const showHalfStar = isHalfStar(index);\n\n return (\n <div key={index} className=\"relative group\" title={tooltip}>\n {/* Container for half stars */}\n <div\n className=\"relative inline-flex\"\n style={{\n width: `${sizeMap[size]}px`,\n height: `${sizeMap[size]}px`,\n }}\n >\n {/* Empty star background */}\n <div className=\"text-muted-foreground/30 pointer-events-none\">\n {renderCharacter(false)}\n </div>\n\n {/* Filled star overlay */}\n {fillPercentage > 0 && (\n <div\n className={cn(\n \"absolute inset-0 pointer-events-none\",\n colorMap[color]\n )}\n >\n {showHalfStar ? (\n renderCharacter(true)\n ) : (\n <div\n className=\"overflow-hidden\"\n style={{ width: `${fillPercentage}%` }}\n >\n {renderCharacter(false)}\n </div>\n )}\n </div>\n )}\n\n {/* Interactive overlay for clicking and hovering */}\n {!disabled && (\n <>\n {allowHalf ? (\n <>\n {/* Left half */}\n <div\n className=\"absolute inset-0 w-1/2 cursor-pointer\"\n onClick={() => handleStarClick(index, true)}\n onMouseEnter={() => handleStarHover(index, true)}\n />\n {/* Right half */}\n <div\n className=\"absolute inset-0 left-1/2 w-1/2 cursor-pointer\"\n onClick={() => handleStarClick(index, false)}\n onMouseEnter={() => handleStarHover(index, false)}\n />\n </>\n ) : (\n <div\n className=\"absolute inset-0 cursor-pointer\"\n onClick={() => handleStarClick(index, false)}\n onMouseEnter={() => handleStarHover(index, false)}\n />\n )}\n </>\n )}\n </div>\n\n {/* Show tooltip text below star on hover */}\n {tooltip &&\n (hoverValue === index + 1 ||\n (allowHalf && hoverValue === index + 0.5)) && (\n <div className=\"absolute top-full left-1/2 -translate-x-1/2 mt-1 px-2 py-1 text-xs bg-foreground text-background rounded whitespace-nowrap z-10\">\n {tooltip}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n);\n\nRate.displayName = \"Rate\";\n\nexport default Rate;\n"],"names":["Rate","React","count","controlledValue","defaultValue","allowHalf","allowClear","size","color","character","className","style","disabled","autoFocus","keyboard","tooltips","onChange","onHoverChange","onFocus","onBlur","onKeyDown","ref","internalValue","setInternalValue","useState","hoverValue","setHoverValue","containerRef","useRef","value","sizeMap","colorMap","handleStarClick","starIndex","isHalf","newValue","handleStarHover","newHoverValue","handleMouseLeave","handleKeyDown","event","step","handleFocus","handleBlur","getStarFill","currentValue","isHalfStar","fill","renderCharacter","jsx","StarHalf","Star","getTooltip","node","cn","_","index","fillPercentage","tooltip","showHalfStar","jsxs","Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Rate.cjs","sources":["../../../../src/components/Rate/Rate.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useState, useRef } from \"react\";\nimport type { KeyboardEvent } from \"react\";\nimport { Star, StarHalf } from \"lucide-react\";\nimport { cn } from \"@dsui/ui/lib/utils\";\n\nexport interface RateProps {\n // Display\n count?: number;\n value?: number;\n defaultValue?: number;\n allowHalf?: boolean;\n allowClear?: boolean;\n\n // Appearance\n size?: \"small\" | \"middle\" | \"large\";\n color?:\n | \"primary\"\n | \"secondary\"\n | \"accent\"\n | \"destructive\"\n | \"muted\"\n | \"success\"\n | \"error\"\n | \"warning\";\n character?: React.ReactNode | ((rateProps: RateProps) => React.ReactNode);\n className?: string;\n style?: React.CSSProperties;\n\n // Interaction\n disabled?: boolean;\n autoFocus?: boolean;\n keyboard?: boolean;\n\n // Tooltips\n tooltips?: string[];\n\n // Callbacks\n onChange?: (value: number) => void;\n onHoverChange?: (value: number) => void;\n onFocus?: () => void;\n onBlur?: () => void;\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void;\n}\n\nconst Rate = React.forwardRef<HTMLDivElement, RateProps>(\n (\n {\n count = 5,\n value: controlledValue,\n defaultValue = 0,\n allowHalf = false,\n allowClear = true,\n size = \"middle\",\n color = \"warning\",\n character,\n className,\n style,\n disabled = false,\n autoFocus = false,\n keyboard = true,\n tooltips,\n onChange,\n onHoverChange,\n onFocus,\n onBlur,\n onKeyDown,\n },\n ref\n ) => {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const [hoverValue, setHoverValue] = useState<number | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n\n // Use controlled or uncontrolled value\n const value =\n controlledValue !== undefined ? controlledValue : internalValue;\n\n // Size in pixels\n const sizeMap = {\n small: 20,\n middle: 24,\n large: 32,\n };\n\n // Color mapping for filled stars\n const colorMap = {\n primary: \"text-primary [&_svg]:fill-primary\",\n secondary: \"text-secondary [&_svg]:fill-secondary\",\n accent: \"text-accent [&_svg]:fill-accent\",\n destructive: \"text-destructive [&_svg]:fill-destructive\",\n muted: \"text-muted-foreground [&_svg]:fill-muted-foreground\",\n success: \"text-success [&_svg]:fill-success\",\n error: \"text-error [&_svg]:fill-error\",\n warning: \"text-yellow-400 [&_svg]:fill-yellow-400\",\n };\n\n // Handle star click\n const handleStarClick = (starIndex: number, isHalf: boolean) => {\n if (disabled) return;\n\n const newValue = isHalf ? starIndex + 0.5 : starIndex + 1;\n\n // If clicking the same value and allowClear is true, clear the rating\n if (allowClear && newValue === value) {\n setInternalValue(0);\n onChange?.(0);\n } else {\n setInternalValue(newValue);\n onChange?.(newValue);\n }\n };\n\n // Handle star hover\n const handleStarHover = (starIndex: number, isHalf: boolean) => {\n if (disabled) return;\n\n const newHoverValue = isHalf ? starIndex + 0.5 : starIndex + 1;\n setHoverValue(newHoverValue);\n onHoverChange?.(newHoverValue);\n };\n\n // Handle mouse leave\n const handleMouseLeave = () => {\n setHoverValue(null);\n onHoverChange?.(0);\n };\n\n // Handle keyboard navigation\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!keyboard || disabled) return;\n\n onKeyDown?.(event);\n\n const step = allowHalf ? 0.5 : 1;\n let newValue = value;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowUp\":\n event.preventDefault();\n newValue = Math.min(value + step, count);\n break;\n case \"ArrowLeft\":\n case \"ArrowDown\":\n event.preventDefault();\n newValue = Math.max(value - step, 0);\n break;\n case \"Home\":\n event.preventDefault();\n newValue = allowHalf ? 0.5 : 1;\n break;\n case \"End\":\n event.preventDefault();\n newValue = count;\n break;\n default:\n return;\n }\n\n setInternalValue(newValue);\n onChange?.(newValue);\n };\n\n // Handle focus\n const handleFocus = () => {\n onFocus?.();\n };\n\n // Handle blur\n const handleBlur = () => {\n onBlur?.();\n };\n\n // Get star fill percentage\n const getStarFill = (starIndex: number) => {\n const currentValue = hoverValue !== null ? hoverValue : value;\n\n if (currentValue >= starIndex + 1) {\n return 100; // Full star\n } else if (currentValue > starIndex && currentValue < starIndex + 1) {\n return (currentValue - starIndex) * 100; // Partial star\n }\n return 0; // Empty star\n };\n\n // Check if star should show as half\n const isHalfStar = (starIndex: number) => {\n if (!allowHalf) return false;\n const currentValue = hoverValue !== null ? hoverValue : value;\n const fill = currentValue - starIndex;\n return fill > 0 && fill <= 0.5;\n };\n\n // Render character\n const renderCharacter = (isHalf: boolean = false) => {\n if (typeof character === \"function\") {\n return character({\n count,\n value,\n defaultValue,\n allowHalf,\n allowClear,\n size,\n disabled,\n });\n }\n if (isHalf) {\n return <StarHalf className=\"ds:w-full ds:h-full\" />;\n }\n return character || <Star className=\"ds:w-full ds:h-full\" />;\n };\n\n // Get tooltip for star\n const getTooltip = (starIndex: number) => {\n if (!tooltips || !tooltips[starIndex]) return undefined;\n return tooltips[starIndex];\n };\n\n return (\n <div\n ref={(node) => {\n containerRef.current = node;\n if (typeof ref === \"function\") {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n }}\n className={cn(\n \"ds:inline-flex ds:items-center ds:gap-1\",\n disabled && \"ds:opacity-50 ds:cursor-not-allowed\",\n !disabled && \"ds:cursor-pointer\",\n className\n )}\n style={style}\n onMouseLeave={handleMouseLeave}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n tabIndex={disabled ? -1 : 0}\n role=\"slider\"\n aria-label=\"Rate\"\n aria-valuemin={0}\n aria-valuemax={count}\n aria-valuenow={value}\n aria-disabled={disabled}\n autoFocus={autoFocus}\n >\n {Array.from({ length: count }, (_, index) => {\n const fillPercentage = getStarFill(index);\n const tooltip = getTooltip(index);\n const showHalfStar = isHalfStar(index);\n\n return (\n <div key={index} className=\"ds:relative ds:group\" title={tooltip}>\n {/* Container for half stars */}\n <div\n className=\"ds:relative ds:inline-flex\"\n style={{\n width: `${sizeMap[size]}px`,\n height: `${sizeMap[size]}px`,\n }}\n >\n {/* Empty star background */}\n <div className=\"ds:text-muted-foreground/30 ds:pointer-events-none\">\n {renderCharacter(false)}\n </div>\n\n {/* Filled star overlay */}\n {fillPercentage > 0 && (\n <div\n className={cn(\n \"ds:absolute ds:inset-0 ds:pointer-events-none\",\n colorMap[color]\n )}\n >\n {showHalfStar ? (\n renderCharacter(true)\n ) : (\n <div\n className=\"ds:overflow-hidden\"\n style={{ width: `${fillPercentage}%` }}\n >\n {renderCharacter(false)}\n </div>\n )}\n </div>\n )}\n\n {/* Interactive overlay for clicking and hovering */}\n {!disabled && (\n <>\n {allowHalf ? (\n <>\n {/* Left half */}\n <div\n className=\"ds:absolute ds:inset-0 ds:w-1/2 ds:cursor-pointer\"\n onClick={() => handleStarClick(index, true)}\n onMouseEnter={() => handleStarHover(index, true)}\n />\n {/* Right half */}\n <div\n className=\"ds:absolute ds:inset-0 ds:left-1/2 ds:w-1/2 ds:cursor-pointer\"\n onClick={() => handleStarClick(index, false)}\n onMouseEnter={() => handleStarHover(index, false)}\n />\n </>\n ) : (\n <div\n className=\"ds:absolute ds:inset-0 ds:cursor-pointer\"\n onClick={() => handleStarClick(index, false)}\n onMouseEnter={() => handleStarHover(index, false)}\n />\n )}\n </>\n )}\n </div>\n\n {/* Show tooltip text below star on hover */}\n {tooltip &&\n (hoverValue === index + 1 ||\n (allowHalf && hoverValue === index + 0.5)) && (\n <div className=\"ds:absolute ds:top-full ds:left-1/2 ds:-translate-x-1/2 ds:mt-1 ds:px-2 ds:py-1 ds:text-xs ds:bg-foreground ds:text-background ds:rounded ds:whitespace-nowrap ds:z-10\">\n {tooltip}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n);\n\nRate.displayName = \"Rate\";\n\nexport default Rate;\n"],"names":["Rate","React","count","controlledValue","defaultValue","allowHalf","allowClear","size","color","character","className","style","disabled","autoFocus","keyboard","tooltips","onChange","onHoverChange","onFocus","onBlur","onKeyDown","ref","internalValue","setInternalValue","useState","hoverValue","setHoverValue","containerRef","useRef","value","sizeMap","colorMap","handleStarClick","starIndex","isHalf","newValue","handleStarHover","newHoverValue","handleMouseLeave","handleKeyDown","event","step","handleFocus","handleBlur","getStarFill","currentValue","isHalfStar","fill","renderCharacter","jsx","StarHalf","Star","getTooltip","node","cn","_","index","fillPercentage","tooltip","showHalfStar","jsxs","Fragment"],"mappings":"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"}
|