@sth87/shadcn-design-system 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +487 -0
- package/dist/cjs/_virtual/_commonjsHelpers.cjs +2 -0
- package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +1 -0
- package/dist/cjs/_virtual/index.cjs +2 -0
- package/dist/cjs/_virtual/index.cjs.map +1 -0
- package/dist/cjs/_virtual/index2.cjs +2 -0
- package/dist/cjs/_virtual/index2.cjs.map +1 -0
- package/dist/cjs/components/Accordion/Accordion.cjs +2 -0
- package/dist/cjs/components/Accordion/Accordion.cjs.map +1 -0
- package/dist/cjs/components/Avatar/Avatar.cjs +2 -0
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -0
- package/dist/cjs/components/Badge/Badge.cjs +2 -0
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +2 -0
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +1 -0
- package/dist/cjs/components/Button/Button.cjs +2 -0
- package/dist/cjs/components/Button/Button.cjs.map +1 -0
- package/dist/cjs/components/Button/ButtonGroup.cjs +2 -0
- package/dist/cjs/components/Button/ButtonGroup.cjs.map +1 -0
- package/dist/cjs/components/Calendar/Calendar.cjs +2 -0
- package/dist/cjs/components/Calendar/Calendar.cjs.map +1 -0
- package/dist/cjs/components/Carousel/Carousel.cjs +2 -0
- package/dist/cjs/components/Carousel/Carousel.cjs.map +1 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs +2 -0
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -0
- package/dist/cjs/components/Collapsible/Collapsible.cjs +2 -0
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +1 -0
- package/dist/cjs/components/Command/Command.cjs +2 -0
- package/dist/cjs/components/Command/Command.cjs.map +1 -0
- package/dist/cjs/components/Command/index.cjs +2 -0
- package/dist/cjs/components/Command/index.cjs.map +1 -0
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +2 -0
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +1 -0
- package/dist/cjs/components/ContextMenu/index.cjs +2 -0
- package/dist/cjs/components/ContextMenu/index.cjs.map +1 -0
- package/dist/cjs/components/Cropper/Cropper.cjs +2 -0
- package/dist/cjs/components/Cropper/Cropper.cjs.map +1 -0
- package/dist/cjs/components/Cropper/CropperTool.cjs +2 -0
- package/dist/cjs/components/Cropper/CropperTool.cjs.map +1 -0
- package/dist/cjs/components/Cropper/utils.cjs +2 -0
- package/dist/cjs/components/Cropper/utils.cjs.map +1 -0
- package/dist/cjs/components/DatePicker/DatePicker.cjs +2 -0
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -0
- package/dist/cjs/components/DatePicker/RangePicker.cjs +2 -0
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +1 -0
- package/dist/cjs/components/DatePicker/TimePicker.cjs +2 -0
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +1 -0
- package/dist/cjs/components/Dialog/Dialog.cjs +2 -0
- package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -0
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +2 -0
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -0
- package/dist/cjs/components/DropdownMenu/index.cjs +2 -0
- package/dist/cjs/components/DropdownMenu/index.cjs.map +1 -0
- package/dist/cjs/components/FloatLabel.cjs +2 -0
- package/dist/cjs/components/FloatLabel.cjs.map +1 -0
- package/dist/cjs/components/Glass/Glass.cjs +2 -0
- package/dist/cjs/components/Glass/Glass.cjs.map +1 -0
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +2 -0
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +1 -0
- package/dist/cjs/components/ImageViewer/ImageViewer.css +1 -0
- package/dist/cjs/components/Input/Input.cjs +2 -0
- package/dist/cjs/components/Input/Input.cjs.map +1 -0
- package/dist/cjs/components/InputOTP/InputOTP.cjs +2 -0
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +1 -0
- package/dist/cjs/components/Interactive/CursorFollow.cjs +2 -0
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -0
- package/dist/cjs/components/Marquee/Marquee.cjs +2 -0
- package/dist/cjs/components/Marquee/Marquee.cjs.map +1 -0
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs +2 -0
- package/dist/cjs/components/Marquee/MarqueeWrapper.cjs.map +1 -0
- package/dist/cjs/components/Marquee/index.cjs +2 -0
- package/dist/cjs/components/Marquee/index.cjs.map +1 -0
- package/dist/cjs/components/Masonry/Masonry.cjs +2 -0
- package/dist/cjs/components/Masonry/Masonry.cjs.map +1 -0
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs +2 -0
- package/dist/cjs/components/Masonry/MasonryWrapper.cjs.map +1 -0
- package/dist/cjs/components/Pagination/Pagination.cjs +2 -0
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -0
- package/dist/cjs/components/Pagination/index.cjs +2 -0
- package/dist/cjs/components/Pagination/index.cjs.map +1 -0
- package/dist/cjs/components/Popover/Popover.cjs +2 -0
- package/dist/cjs/components/Popover/Popover.cjs.map +1 -0
- package/dist/cjs/components/Popover/index.cjs +2 -0
- package/dist/cjs/components/Popover/index.cjs.map +1 -0
- package/dist/cjs/components/QrCode/QrCode.cjs +2 -0
- package/dist/cjs/components/QrCode/QrCode.cjs.map +1 -0
- package/dist/cjs/components/QrCode/index.cjs +2 -0
- package/dist/cjs/components/QrCode/index.cjs.map +1 -0
- package/dist/cjs/components/Radio/Radio.cjs +2 -0
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -0
- package/dist/cjs/components/Rate/Rate.cjs +2 -0
- package/dist/cjs/components/Rate/Rate.cjs.map +1 -0
- package/dist/cjs/components/Resizable/Resizable.cjs +2 -0
- package/dist/cjs/components/Resizable/Resizable.cjs.map +1 -0
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +2 -0
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -0
- package/dist/cjs/components/Select/Select.cjs +2 -0
- package/dist/cjs/components/Select/Select.cjs.map +1 -0
- package/dist/cjs/components/Separator/Separator.cjs +2 -0
- package/dist/cjs/components/Separator/Separator.cjs.map +1 -0
- package/dist/cjs/components/Sheet/Sheet.cjs +6 -0
- package/dist/cjs/components/Sheet/Sheet.cjs.map +1 -0
- package/dist/cjs/components/Sidebar/Sidebar.cjs +2 -0
- package/dist/cjs/components/Sidebar/Sidebar.cjs.map +1 -0
- package/dist/cjs/components/Skeleton/Skeleton.cjs +2 -0
- package/dist/cjs/components/Skeleton/Skeleton.cjs.map +1 -0
- package/dist/cjs/components/Slider/Slider.cjs +2 -0
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -0
- package/dist/cjs/components/Stepper/Stepper.cjs +2 -0
- package/dist/cjs/components/Stepper/Stepper.cjs.map +1 -0
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +2 -0
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +1 -0
- package/dist/cjs/components/Stepper/index.cjs +2 -0
- package/dist/cjs/components/Stepper/index.cjs.map +1 -0
- package/dist/cjs/components/Switch/Switch.cjs +2 -0
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -0
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +2 -0
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -0
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +2 -0
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -0
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +2 -0
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -0
- package/dist/cjs/components/Table/data-table-column-header.cjs +2 -0
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -0
- package/dist/cjs/components/Table/data-table-pagination.cjs +2 -0
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +1 -0
- package/dist/cjs/components/Table/data-table.cjs +2 -0
- package/dist/cjs/components/Table/data-table.cjs.map +1 -0
- package/dist/cjs/components/Tabs/Tabs.cjs +2 -0
- package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -0
- package/dist/cjs/components/Tabs/classes.cjs +2 -0
- package/dist/cjs/components/Tabs/classes.cjs.map +1 -0
- package/dist/cjs/components/Textarea/Textarea.cjs +2 -0
- package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -0
- package/dist/cjs/components/TimeGridView.cjs +2 -0
- package/dist/cjs/components/TimeGridView.cjs.map +1 -0
- package/dist/cjs/components/Toast/Toast.cjs +2 -0
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -0
- package/dist/cjs/components/Toggle/Toggle.cjs +2 -0
- package/dist/cjs/components/Toggle/Toggle.cjs.map +1 -0
- package/dist/cjs/components/Tooltip/Tooltip.cjs +2 -0
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -0
- package/dist/cjs/components/Tour/Tour.cjs +2 -0
- package/dist/cjs/components/Tour/Tour.cjs.map +1 -0
- package/dist/cjs/components/Tour/TourWrapper.cjs +2 -0
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +1 -0
- package/dist/cjs/components/Tour/index.cjs +2 -0
- package/dist/cjs/components/Tour/index.cjs.map +1 -0
- package/dist/cjs/components/Upload/Upload.cjs +4 -0
- package/dist/cjs/components/Upload/Upload.cjs.map +1 -0
- package/dist/cjs/components/WheelColumn.cjs +2 -0
- package/dist/cjs/components/WheelColumn.cjs.map +1 -0
- package/dist/cjs/constants/common.cjs +2 -0
- package/dist/cjs/constants/common.cjs.map +1 -0
- package/dist/cjs/favicon.ico +0 -0
- package/dist/cjs/hooks/use-callback-ref.cjs +2 -0
- package/dist/cjs/hooks/use-callback-ref.cjs.map +1 -0
- package/dist/cjs/hooks/use-debounced-callback.cjs +2 -0
- package/dist/cjs/hooks/use-debounced-callback.cjs.map +1 -0
- package/dist/cjs/hooks/use-debounced-value.cjs +2 -0
- package/dist/cjs/hooks/use-debounced-value.cjs.map +1 -0
- package/dist/cjs/hooks/use-event-listener.cjs +2 -0
- package/dist/cjs/hooks/use-event-listener.cjs.map +1 -0
- package/dist/cjs/hooks/use-intersection-observer.cjs +2 -0
- package/dist/cjs/hooks/use-intersection-observer.cjs.map +1 -0
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs +2 -0
- package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs.map +1 -0
- package/dist/cjs/hooks/use-media-query.cjs +2 -0
- package/dist/cjs/hooks/use-media-query.cjs.map +1 -0
- package/dist/cjs/hooks/use-on-click-outside.cjs +2 -0
- package/dist/cjs/hooks/use-on-click-outside.cjs.map +1 -0
- package/dist/cjs/hooks/use-script.cjs +2 -0
- package/dist/cjs/hooks/use-script.cjs.map +1 -0
- package/dist/cjs/hooks/use-scroll-lock.cjs +2 -0
- package/dist/cjs/hooks/use-scroll-lock.cjs.map +1 -0
- package/dist/cjs/image.png +0 -0
- package/dist/cjs/index.cjs +2 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/SplittingText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +22 -0
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +1 -0
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +2 -0
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +1 -0
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs +253 -0
- package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs.map +1 -0
- package/dist/cjs/node_modules/.pnpm/viewerjs@1.11.7/node_modules/viewerjs/dist/viewer.css +1 -0
- package/dist/cjs/styles/animation.css +1 -0
- package/dist/cjs/styles/index.css +1 -0
- package/dist/cjs/styles/theme.css +1 -0
- package/dist/cjs/utils/animations.cjs +2 -0
- package/dist/cjs/utils/animations.cjs.map +1 -0
- package/dist/cjs/utils/css.cjs +2 -0
- package/dist/cjs/utils/css.cjs.map +1 -0
- package/dist/cjs/utils/data-table.cjs +2 -0
- package/dist/cjs/utils/data-table.cjs.map +1 -0
- package/dist/cjs/utils/datetime.cjs +2 -0
- package/dist/cjs/utils/datetime.cjs.map +1 -0
- package/dist/cjs/vite.svg +1 -0
- package/dist/cjs/wave.png +0 -0
- package/dist/esm/_virtual/_commonjsHelpers.js +7 -0
- package/dist/esm/_virtual/_commonjsHelpers.js.map +1 -0
- package/dist/esm/_virtual/index.js +8 -0
- package/dist/esm/_virtual/index.js.map +1 -0
- package/dist/esm/_virtual/index2.js +5 -0
- package/dist/esm/_virtual/index2.js.map +1 -0
- package/dist/esm/components/Accordion/Accordion.js +190 -0
- package/dist/esm/components/Accordion/Accordion.js.map +1 -0
- package/dist/esm/components/Avatar/Avatar.js +93 -0
- package/dist/esm/components/Avatar/Avatar.js.map +1 -0
- package/dist/esm/components/Badge/Badge.js +35 -0
- package/dist/esm/components/Badge/Badge.js.map +1 -0
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +102 -0
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -0
- package/dist/esm/components/Button/Button.js +53 -0
- package/dist/esm/components/Button/Button.js.map +1 -0
- package/dist/esm/components/Button/ButtonGroup.js +53 -0
- package/dist/esm/components/Button/ButtonGroup.js.map +1 -0
- package/dist/esm/components/Calendar/Calendar.js +40 -0
- package/dist/esm/components/Calendar/Calendar.js.map +1 -0
- package/dist/esm/components/Carousel/Carousel.js +510 -0
- package/dist/esm/components/Carousel/Carousel.js.map +1 -0
- package/dist/esm/components/Checkbox/Checkbox.js +79 -0
- package/dist/esm/components/Checkbox/Checkbox.js.map +1 -0
- package/dist/esm/components/Collapsible/Collapsible.js +107 -0
- package/dist/esm/components/Collapsible/Collapsible.js.map +1 -0
- package/dist/esm/components/Command/Command.js +113 -0
- package/dist/esm/components/Command/Command.js.map +1 -0
- package/dist/esm/components/Command/index.js +16 -0
- package/dist/esm/components/Command/index.js.map +1 -0
- package/dist/esm/components/ContextMenu/ContextMenu.js +131 -0
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +1 -0
- package/dist/esm/components/ContextMenu/index.js +24 -0
- package/dist/esm/components/ContextMenu/index.js.map +1 -0
- package/dist/esm/components/Cropper/Cropper.js +1014 -0
- package/dist/esm/components/Cropper/Cropper.js.map +1 -0
- package/dist/esm/components/Cropper/CropperTool.js +157 -0
- package/dist/esm/components/Cropper/CropperTool.js.map +1 -0
- package/dist/esm/components/Cropper/utils.js +108 -0
- package/dist/esm/components/Cropper/utils.js.map +1 -0
- package/dist/esm/components/DatePicker/DatePicker.js +263 -0
- package/dist/esm/components/DatePicker/DatePicker.js.map +1 -0
- package/dist/esm/components/DatePicker/RangePicker.js +456 -0
- package/dist/esm/components/DatePicker/RangePicker.js.map +1 -0
- package/dist/esm/components/DatePicker/TimePicker.js +444 -0
- package/dist/esm/components/DatePicker/TimePicker.js.map +1 -0
- package/dist/esm/components/Dialog/Dialog.js +223 -0
- package/dist/esm/components/Dialog/Dialog.js.map +1 -0
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +196 -0
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +1 -0
- package/dist/esm/components/DropdownMenu/index.js +24 -0
- package/dist/esm/components/DropdownMenu/index.js.map +1 -0
- package/dist/esm/components/FloatLabel.js +59 -0
- package/dist/esm/components/FloatLabel.js.map +1 -0
- package/dist/esm/components/Glass/Glass.js +93 -0
- package/dist/esm/components/Glass/Glass.js.map +1 -0
- package/dist/esm/components/ImageViewer/ImageViewer.css +1 -0
- package/dist/esm/components/ImageViewer/ImageViewer.js +273 -0
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +1 -0
- package/dist/esm/components/Input/Input.js +267 -0
- package/dist/esm/components/Input/Input.js.map +1 -0
- package/dist/esm/components/InputOTP/InputOTP.js +70 -0
- package/dist/esm/components/InputOTP/InputOTP.js.map +1 -0
- package/dist/esm/components/Interactive/CursorFollow.js +257 -0
- package/dist/esm/components/Interactive/CursorFollow.js.map +1 -0
- package/dist/esm/components/Marquee/Marquee.js +419 -0
- package/dist/esm/components/Marquee/Marquee.js.map +1 -0
- package/dist/esm/components/Marquee/MarqueeWrapper.js +25 -0
- package/dist/esm/components/Marquee/MarqueeWrapper.js.map +1 -0
- package/dist/esm/components/Marquee/index.js +15 -0
- package/dist/esm/components/Marquee/index.js.map +1 -0
- package/dist/esm/components/Masonry/Masonry.js +840 -0
- package/dist/esm/components/Masonry/Masonry.js.map +1 -0
- package/dist/esm/components/Masonry/MasonryWrapper.js +19 -0
- package/dist/esm/components/Masonry/MasonryWrapper.js.map +1 -0
- package/dist/esm/components/Pagination/Pagination.js +209 -0
- package/dist/esm/components/Pagination/Pagination.js.map +1 -0
- package/dist/esm/components/Pagination/index.js +14 -0
- package/dist/esm/components/Pagination/index.js.map +1 -0
- package/dist/esm/components/Popover/Popover.js +51 -0
- package/dist/esm/components/Popover/Popover.js.map +1 -0
- package/dist/esm/components/Popover/index.js +9 -0
- package/dist/esm/components/Popover/index.js.map +1 -0
- package/dist/esm/components/QrCode/QrCode.js +300 -0
- package/dist/esm/components/QrCode/QrCode.js.map +1 -0
- package/dist/esm/components/QrCode/index.js +16 -0
- package/dist/esm/components/QrCode/index.js.map +1 -0
- package/dist/esm/components/Radio/Radio.js +74 -0
- package/dist/esm/components/Radio/Radio.js.map +1 -0
- package/dist/esm/components/Rate/Rate.js +191 -0
- package/dist/esm/components/Rate/Rate.js.map +1 -0
- package/dist/esm/components/Resizable/Resizable.js +89 -0
- package/dist/esm/components/Resizable/Resizable.js.map +1 -0
- package/dist/esm/components/ScrollArea/ScrollArea.js +45 -0
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +1 -0
- package/dist/esm/components/Select/Select.js +199 -0
- package/dist/esm/components/Select/Select.js.map +1 -0
- package/dist/esm/components/Separator/Separator.js +7 -0
- package/dist/esm/components/Separator/Separator.js.map +1 -0
- package/dist/esm/components/Sheet/Sheet.js +141 -0
- package/dist/esm/components/Sheet/Sheet.js.map +1 -0
- package/dist/esm/components/Sidebar/Sidebar.js +30 -0
- package/dist/esm/components/Sidebar/Sidebar.js.map +1 -0
- package/dist/esm/components/Skeleton/Skeleton.js +12 -0
- package/dist/esm/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/esm/components/Slider/Slider.js +420 -0
- package/dist/esm/components/Slider/Slider.js.map +1 -0
- package/dist/esm/components/Stepper/Stepper.js +886 -0
- package/dist/esm/components/Stepper/Stepper.js.map +1 -0
- package/dist/esm/components/Stepper/StepperWrapper.js +80 -0
- package/dist/esm/components/Stepper/StepperWrapper.js.map +1 -0
- package/dist/esm/components/Stepper/index.js +21 -0
- package/dist/esm/components/Stepper/index.js.map +1 -0
- package/dist/esm/components/Switch/Switch.js +126 -0
- package/dist/esm/components/Switch/Switch.js.map +1 -0
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +126 -0
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -0
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +138 -0
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -0
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +164 -0
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -0
- package/dist/esm/components/Table/data-table-column-header.js +82 -0
- package/dist/esm/components/Table/data-table-column-header.js.map +1 -0
- package/dist/esm/components/Table/data-table-pagination.js +73 -0
- package/dist/esm/components/Table/data-table-pagination.js.map +1 -0
- package/dist/esm/components/Table/data-table.js +94 -0
- package/dist/esm/components/Table/data-table.js.map +1 -0
- package/dist/esm/components/Tabs/Tabs.js +540 -0
- package/dist/esm/components/Tabs/Tabs.js.map +1 -0
- package/dist/esm/components/Tabs/classes.js +345 -0
- package/dist/esm/components/Tabs/classes.js.map +1 -0
- package/dist/esm/components/Textarea/Textarea.js +132 -0
- package/dist/esm/components/Textarea/Textarea.js.map +1 -0
- package/dist/esm/components/TimeGridView.js +101 -0
- package/dist/esm/components/TimeGridView.js.map +1 -0
- package/dist/esm/components/Toast/Toast.js +80 -0
- package/dist/esm/components/Toast/Toast.js.map +1 -0
- package/dist/esm/components/Toggle/Toggle.js +23 -0
- package/dist/esm/components/Toggle/Toggle.js.map +1 -0
- package/dist/esm/components/Tooltip/Tooltip.js +120 -0
- package/dist/esm/components/Tooltip/Tooltip.js.map +1 -0
- package/dist/esm/components/Tour/Tour.js +948 -0
- package/dist/esm/components/Tour/Tour.js.map +1 -0
- package/dist/esm/components/Tour/TourWrapper.js +67 -0
- package/dist/esm/components/Tour/TourWrapper.js.map +1 -0
- package/dist/esm/components/Tour/index.js +38 -0
- package/dist/esm/components/Tour/index.js.map +1 -0
- package/dist/esm/components/Upload/Upload.js +948 -0
- package/dist/esm/components/Upload/Upload.js.map +1 -0
- package/dist/esm/components/WheelColumn.js +127 -0
- package/dist/esm/components/WheelColumn.js.map +1 -0
- package/dist/esm/constants/common.js +5 -0
- package/dist/esm/constants/common.js.map +1 -0
- package/dist/esm/favicon.ico +0 -0
- package/dist/esm/hooks/use-callback-ref.js +14 -0
- package/dist/esm/hooks/use-callback-ref.js.map +1 -0
- package/dist/esm/hooks/use-debounced-callback.js +21 -0
- package/dist/esm/hooks/use-debounced-callback.js.map +1 -0
- package/dist/esm/hooks/use-debounced-value.js +12 -0
- package/dist/esm/hooks/use-debounced-value.js.map +1 -0
- package/dist/esm/hooks/use-event-listener.js +21 -0
- package/dist/esm/hooks/use-event-listener.js.map +1 -0
- package/dist/esm/hooks/use-intersection-observer.js +56 -0
- package/dist/esm/hooks/use-intersection-observer.js.map +1 -0
- package/dist/esm/hooks/use-isomorphic-layout-effect.js +6 -0
- package/dist/esm/hooks/use-isomorphic-layout-effect.js.map +1 -0
- package/dist/esm/hooks/use-media-query.js +22 -0
- package/dist/esm/hooks/use-media-query.js.map +1 -0
- package/dist/esm/hooks/use-on-click-outside.js +18 -0
- package/dist/esm/hooks/use-on-click-outside.js.map +1 -0
- package/dist/esm/hooks/use-script.js +46 -0
- package/dist/esm/hooks/use-script.js.map +1 -0
- package/dist/esm/hooks/use-scroll-lock.js +27 -0
- package/dist/esm/hooks/use-scroll-lock.js.map +1 -0
- package/dist/esm/image.png +0 -0
- package/dist/esm/index.js +223 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/TextAnimation/BlurText.js +84 -0
- package/dist/esm/lib/TextAnimation/BlurText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/CircularText.js +96 -0
- package/dist/esm/lib/TextAnimation/CircularText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/FlipWords.js +103 -0
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +1 -0
- package/dist/esm/lib/TextAnimation/GradientText.js +54 -0
- package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/RollingText.js +70 -0
- package/dist/esm/lib/TextAnimation/RollingText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/RotatingText.js +38 -0
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +64 -0
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/SplittingText.js +86 -0
- package/dist/esm/lib/TextAnimation/SplittingText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +59 -0
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +1 -0
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +128 -0
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +1 -0
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +135 -0
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +1 -0
- package/dist/esm/lib/TextAnimation/TypingText.js +118 -0
- package/dist/esm/lib/TextAnimation/TypingText.js.map +1 -0
- package/dist/esm/lib/TextAnimation/WritingText.js +45 -0
- package/dist/esm/lib/TextAnimation/WritingText.js.map +1 -0
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js +865 -0
- package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js.map +1 -0
- package/dist/esm/node_modules/.pnpm/viewerjs@1.11.7/node_modules/viewerjs/dist/viewer.css +1 -0
- package/dist/esm/styles/animation.css +1 -0
- package/dist/esm/styles/index.css +1 -0
- package/dist/esm/styles/theme.css +1 -0
- package/dist/esm/utils/animations.js +189 -0
- package/dist/esm/utils/animations.js.map +1 -0
- package/dist/esm/utils/css.js +25 -0
- package/dist/esm/utils/css.js.map +1 -0
- package/dist/esm/utils/data-table.js +20 -0
- package/dist/esm/utils/data-table.js.map +1 -0
- package/dist/esm/utils/datetime.js +17 -0
- package/dist/esm/utils/datetime.js.map +1 -0
- package/dist/esm/vite.svg +1 -0
- package/dist/esm/wave.png +0 -0
- package/dist/types/components/Accordion/Accordion.d.ts +49 -0
- package/dist/types/components/Accordion/Accordion.d.ts.map +1 -0
- package/dist/types/components/Accordion/index.d.ts +3 -0
- package/dist/types/components/Accordion/index.d.ts.map +1 -0
- package/dist/types/components/Avatar/Avatar.d.ts +18 -0
- package/dist/types/components/Avatar/Avatar.d.ts.map +1 -0
- package/dist/types/components/Avatar/index.d.ts +3 -0
- package/dist/types/components/Avatar/index.d.ts.map +1 -0
- package/dist/types/components/Badge/Badge.d.ts +10 -0
- package/dist/types/components/Badge/Badge.d.ts.map +1 -0
- package/dist/types/components/Badge/index.d.ts +2 -0
- package/dist/types/components/Badge/index.d.ts.map +1 -0
- package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +23 -0
- package/dist/types/components/Breadcrumb/Breadcrumb.d.ts.map +1 -0
- package/dist/types/components/Breadcrumb/index.d.ts +2 -0
- package/dist/types/components/Breadcrumb/index.d.ts.map +1 -0
- package/dist/types/components/Button/Button.d.ts +10 -0
- package/dist/types/components/Button/Button.d.ts.map +1 -0
- package/dist/types/components/Button/ButtonGroup.d.ts +16 -0
- package/dist/types/components/Button/ButtonGroup.d.ts.map +1 -0
- package/dist/types/components/Button/index.d.ts +5 -0
- package/dist/types/components/Button/index.d.ts.map +1 -0
- package/dist/types/components/Calendar/Calendar.d.ts +15 -0
- package/dist/types/components/Calendar/Calendar.d.ts.map +1 -0
- package/dist/types/components/Calendar/index.d.ts +3 -0
- package/dist/types/components/Calendar/index.d.ts.map +1 -0
- package/dist/types/components/Carousel/Carousel.d.ts +79 -0
- package/dist/types/components/Carousel/Carousel.d.ts.map +1 -0
- package/dist/types/components/Carousel/index.d.ts +4 -0
- package/dist/types/components/Carousel/index.d.ts.map +1 -0
- package/dist/types/components/Checkbox/Checkbox.d.ts +15 -0
- package/dist/types/components/Checkbox/Checkbox.d.ts.map +1 -0
- package/dist/types/components/Checkbox/index.d.ts +2 -0
- package/dist/types/components/Checkbox/index.d.ts.map +1 -0
- package/dist/types/components/Collapsible/Collapsible.d.ts +17 -0
- package/dist/types/components/Collapsible/Collapsible.d.ts.map +1 -0
- package/dist/types/components/Collapsible/index.d.ts +2 -0
- package/dist/types/components/Collapsible/index.d.ts.map +1 -0
- package/dist/types/components/Command/Command.d.ts +39 -0
- package/dist/types/components/Command/Command.d.ts.map +1 -0
- package/dist/types/components/Command/index.d.ts +15 -0
- package/dist/types/components/Command/index.d.ts.map +1 -0
- package/dist/types/components/ContextMenu/ContextMenu.d.ts +64 -0
- package/dist/types/components/ContextMenu/ContextMenu.d.ts.map +1 -0
- package/dist/types/components/ContextMenu/index.d.ts +23 -0
- package/dist/types/components/ContextMenu/index.d.ts.map +1 -0
- package/dist/types/components/Cropper/Cropper.d.ts +86 -0
- package/dist/types/components/Cropper/Cropper.d.ts.map +1 -0
- package/dist/types/components/Cropper/CropperTool.d.ts +149 -0
- package/dist/types/components/Cropper/CropperTool.d.ts.map +1 -0
- package/dist/types/components/Cropper/index.d.ts +4 -0
- package/dist/types/components/Cropper/index.d.ts.map +1 -0
- package/dist/types/components/Cropper/utils.d.ts +130 -0
- package/dist/types/components/Cropper/utils.d.ts.map +1 -0
- package/dist/types/components/DatePicker/DatePicker.d.ts +56 -0
- package/dist/types/components/DatePicker/DatePicker.d.ts.map +1 -0
- package/dist/types/components/DatePicker/RangePicker.d.ts +42 -0
- package/dist/types/components/DatePicker/RangePicker.d.ts.map +1 -0
- package/dist/types/components/DatePicker/TimePicker.d.ts +43 -0
- package/dist/types/components/DatePicker/TimePicker.d.ts.map +1 -0
- package/dist/types/components/DatePicker/index.d.ts +7 -0
- package/dist/types/components/DatePicker/index.d.ts.map +1 -0
- package/dist/types/components/Dialog/Dialog.d.ts +45 -0
- package/dist/types/components/Dialog/Dialog.d.ts.map +1 -0
- package/dist/types/components/Dialog/index.d.ts +2 -0
- package/dist/types/components/Dialog/index.d.ts.map +1 -0
- package/dist/types/components/DropdownMenu/DropdownMenu.d.ts +65 -0
- package/dist/types/components/DropdownMenu/DropdownMenu.d.ts.map +1 -0
- package/dist/types/components/DropdownMenu/index.d.ts +22 -0
- package/dist/types/components/DropdownMenu/index.d.ts.map +1 -0
- package/dist/types/components/FloatLabel.d.ts +8 -0
- package/dist/types/components/FloatLabel.d.ts.map +1 -0
- package/dist/types/components/Glass/Glass.d.ts +10 -0
- package/dist/types/components/Glass/Glass.d.ts.map +1 -0
- package/dist/types/components/Glass/index.d.ts +2 -0
- package/dist/types/components/Glass/index.d.ts.map +1 -0
- package/dist/types/components/ImageViewer/ImageViewer.d.ts +58 -0
- package/dist/types/components/ImageViewer/ImageViewer.d.ts.map +1 -0
- package/dist/types/components/ImageViewer/index.d.ts +4 -0
- package/dist/types/components/ImageViewer/index.d.ts.map +1 -0
- package/dist/types/components/Input/Input.d.ts +27 -0
- package/dist/types/components/Input/Input.d.ts.map +1 -0
- package/dist/types/components/Input/index.d.ts +2 -0
- package/dist/types/components/Input/index.d.ts.map +1 -0
- package/dist/types/components/InputOTP/InputOTP.d.ts +20 -0
- package/dist/types/components/InputOTP/InputOTP.d.ts.map +1 -0
- package/dist/types/components/InputOTP/index.d.ts +2 -0
- package/dist/types/components/InputOTP/index.d.ts.map +1 -0
- package/dist/types/components/Interactive/3DCard.d.ts +28 -0
- package/dist/types/components/Interactive/3DCard.d.ts.map +1 -0
- package/dist/types/components/Interactive/3DMarquee.d.ts +20 -0
- package/dist/types/components/Interactive/3DMarquee.d.ts.map +1 -0
- package/dist/types/components/Interactive/CursorFollow.d.ts +75 -0
- package/dist/types/components/Interactive/CursorFollow.d.ts.map +1 -0
- package/dist/types/components/Interactive/index.cursor.d.ts +7 -0
- package/dist/types/components/Interactive/index.cursor.d.ts.map +1 -0
- package/dist/types/components/Interactive/index.d.ts +2 -0
- package/dist/types/components/Interactive/index.d.ts.map +1 -0
- package/dist/types/components/Label/Label.d.ts +3 -0
- package/dist/types/components/Label/Label.d.ts.map +1 -0
- package/dist/types/components/Label/index.d.ts +2 -0
- package/dist/types/components/Label/index.d.ts.map +1 -0
- package/dist/types/components/Marquee/Marquee.d.ts +31 -0
- package/dist/types/components/Marquee/Marquee.d.ts.map +1 -0
- package/dist/types/components/Marquee/MarqueeWrapper.d.ts +10 -0
- package/dist/types/components/Marquee/MarqueeWrapper.d.ts.map +1 -0
- package/dist/types/components/Marquee/index.d.ts +13 -0
- package/dist/types/components/Marquee/index.d.ts.map +1 -0
- package/dist/types/components/Masonry/Masonry.d.ts +41 -0
- package/dist/types/components/Masonry/Masonry.d.ts.map +1 -0
- package/dist/types/components/Masonry/MasonryWrapper.d.ts +29 -0
- package/dist/types/components/Masonry/MasonryWrapper.d.ts.map +1 -0
- package/dist/types/components/Masonry/index.d.ts +5 -0
- package/dist/types/components/Masonry/index.d.ts.map +1 -0
- package/dist/types/components/Pagination/Pagination.d.ts +24 -0
- package/dist/types/components/Pagination/Pagination.d.ts.map +1 -0
- package/dist/types/components/Pagination/index.d.ts +11 -0
- package/dist/types/components/Pagination/index.d.ts.map +1 -0
- package/dist/types/components/Popover/Popover.d.ts +22 -0
- package/dist/types/components/Popover/Popover.d.ts.map +1 -0
- package/dist/types/components/Popover/index.d.ts +5 -0
- package/dist/types/components/Popover/index.d.ts.map +1 -0
- package/dist/types/components/QrCode/QrCode.d.ts +51 -0
- package/dist/types/components/QrCode/QrCode.d.ts.map +1 -0
- package/dist/types/components/QrCode/index.d.ts +13 -0
- package/dist/types/components/QrCode/index.d.ts.map +1 -0
- package/dist/types/components/Radio/Radio.d.ts +35 -0
- package/dist/types/components/Radio/Radio.d.ts.map +1 -0
- package/dist/types/components/Radio/index.d.ts +2 -0
- package/dist/types/components/Radio/index.d.ts.map +1 -0
- package/dist/types/components/Rate/Rate.d.ts +26 -0
- package/dist/types/components/Rate/Rate.d.ts.map +1 -0
- package/dist/types/components/Rate/index.d.ts +3 -0
- package/dist/types/components/Rate/index.d.ts.map +1 -0
- package/dist/types/components/Resizable/Resizable.d.ts +71 -0
- package/dist/types/components/Resizable/Resizable.d.ts.map +1 -0
- package/dist/types/components/Resizable/index.d.ts +4 -0
- package/dist/types/components/Resizable/index.d.ts.map +1 -0
- package/dist/types/components/ScrollArea/ScrollArea.d.ts +19 -0
- package/dist/types/components/ScrollArea/ScrollArea.d.ts.map +1 -0
- package/dist/types/components/ScrollArea/index.d.ts +2 -0
- package/dist/types/components/ScrollArea/index.d.ts.map +1 -0
- package/dist/types/components/Select/Select.d.ts +33 -0
- package/dist/types/components/Select/Select.d.ts.map +1 -0
- package/dist/types/components/Select/index.d.ts +2 -0
- package/dist/types/components/Select/index.d.ts.map +1 -0
- package/dist/types/components/Separator/Separator.d.ts +5 -0
- package/dist/types/components/Separator/Separator.d.ts.map +1 -0
- package/dist/types/components/Separator/index.d.ts +2 -0
- package/dist/types/components/Separator/index.d.ts.map +1 -0
- package/dist/types/components/Sheet/Sheet.d.ts +36 -0
- package/dist/types/components/Sheet/Sheet.d.ts.map +1 -0
- package/dist/types/components/Sheet/index.d.ts +2 -0
- package/dist/types/components/Sheet/index.d.ts.map +1 -0
- package/dist/types/components/Sidebar/Sidebar.d.ts +50 -0
- package/dist/types/components/Sidebar/Sidebar.d.ts.map +1 -0
- package/dist/types/components/Sidebar/index.d.ts +4 -0
- package/dist/types/components/Sidebar/index.d.ts.map +1 -0
- package/dist/types/components/Skeleton/Skeleton.d.ts +6 -0
- package/dist/types/components/Skeleton/Skeleton.d.ts.map +1 -0
- package/dist/types/components/Skeleton/index.d.ts +2 -0
- package/dist/types/components/Skeleton/index.d.ts.map +1 -0
- package/dist/types/components/Slider/Slider.d.ts +25 -0
- package/dist/types/components/Slider/Slider.d.ts.map +1 -0
- package/dist/types/components/Slider/index.d.ts +2 -0
- package/dist/types/components/Slider/index.d.ts.map +1 -0
- package/dist/types/components/Stepper/Stepper.d.ts +86 -0
- package/dist/types/components/Stepper/Stepper.d.ts.map +1 -0
- package/dist/types/components/Stepper/StepperWrapper.d.ts +25 -0
- package/dist/types/components/Stepper/StepperWrapper.d.ts.map +1 -0
- package/dist/types/components/Stepper/index.d.ts +18 -0
- package/dist/types/components/Stepper/index.d.ts.map +1 -0
- package/dist/types/components/Switch/Switch.d.ts +14 -0
- package/dist/types/components/Switch/Switch.d.ts.map +1 -0
- package/dist/types/components/Switch/index.d.ts +2 -0
- package/dist/types/components/Switch/index.d.ts.map +1 -0
- package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts +9 -0
- package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts.map +1 -0
- package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts +11 -0
- package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts.map +1 -0
- package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts +8 -0
- package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts.map +1 -0
- package/dist/types/components/Table/TableWrapper.d.ts +2 -0
- package/dist/types/components/Table/TableWrapper.d.ts.map +1 -0
- package/dist/types/components/Table/data-table-column-header.d.ts +9 -0
- package/dist/types/components/Table/data-table-column-header.d.ts.map +1 -0
- package/dist/types/components/Table/data-table-pagination.d.ts +12 -0
- package/dist/types/components/Table/data-table-pagination.d.ts.map +1 -0
- package/dist/types/components/Table/data-table-toolbar.d.ts +10 -0
- package/dist/types/components/Table/data-table-toolbar.d.ts.map +1 -0
- package/dist/types/components/Table/data-table-view-options.d.ts +9 -0
- package/dist/types/components/Table/data-table-view-options.d.ts.map +1 -0
- package/dist/types/components/Table/data-table.d.ts +18 -0
- package/dist/types/components/Table/data-table.d.ts.map +1 -0
- package/dist/types/components/Table/index.d.ts +2 -0
- package/dist/types/components/Table/index.d.ts.map +1 -0
- package/dist/types/components/Table/select-column.d.ts +5 -0
- package/dist/types/components/Table/select-column.d.ts.map +1 -0
- package/dist/types/components/Tabs/Tabs.d.ts +22 -0
- package/dist/types/components/Tabs/Tabs.d.ts.map +1 -0
- package/dist/types/components/Tabs/classes.d.ts +29 -0
- package/dist/types/components/Tabs/classes.d.ts.map +1 -0
- package/dist/types/components/Tabs/index.d.ts +4 -0
- package/dist/types/components/Tabs/index.d.ts.map +1 -0
- package/dist/types/components/Tabs/types.d.ts +15 -0
- package/dist/types/components/Tabs/types.d.ts.map +1 -0
- package/dist/types/components/Textarea/Textarea.d.ts +17 -0
- package/dist/types/components/Textarea/Textarea.d.ts.map +1 -0
- package/dist/types/components/Textarea/index.d.ts +2 -0
- package/dist/types/components/Textarea/index.d.ts.map +1 -0
- package/dist/types/components/Theme/ThemeShowcase.d.ts +3 -0
- package/dist/types/components/Theme/ThemeShowcase.d.ts.map +1 -0
- package/dist/types/components/TimeGridView.d.ts +15 -0
- package/dist/types/components/TimeGridView.d.ts.map +1 -0
- package/dist/types/components/Toast/Toast.d.ts +12 -0
- package/dist/types/components/Toast/Toast.d.ts.map +1 -0
- package/dist/types/components/Toast/index.d.ts +3 -0
- package/dist/types/components/Toast/index.d.ts.map +1 -0
- package/dist/types/components/Toggle/Toggle.d.ts +10 -0
- package/dist/types/components/Toggle/Toggle.d.ts.map +1 -0
- package/dist/types/components/Toggle/index.d.ts +2 -0
- package/dist/types/components/Toggle/index.d.ts.map +1 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts +19 -0
- package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -0
- package/dist/types/components/Tooltip/index.d.ts +3 -0
- package/dist/types/components/Tooltip/index.d.ts.map +1 -0
- package/dist/types/components/Tour/Tour.d.ts +105 -0
- package/dist/types/components/Tour/Tour.d.ts.map +1 -0
- package/dist/types/components/Tour/TourWrapper.d.ts +46 -0
- package/dist/types/components/Tour/TourWrapper.d.ts.map +1 -0
- package/dist/types/components/Tour/index.d.ts +36 -0
- package/dist/types/components/Tour/index.d.ts.map +1 -0
- package/dist/types/components/TreeSelect/TreeSelect.d.ts +2 -0
- package/dist/types/components/TreeSelect/TreeSelect.d.ts.map +1 -0
- package/dist/types/components/TreeSelect/index.d.ts +2 -0
- package/dist/types/components/TreeSelect/index.d.ts.map +1 -0
- package/dist/types/components/Upload/Upload.d.ts +69 -0
- package/dist/types/components/Upload/Upload.d.ts.map +1 -0
- package/dist/types/components/Upload/index.d.ts +2 -0
- package/dist/types/components/Upload/index.d.ts.map +1 -0
- package/dist/types/components/WheelColumn.d.ts +15 -0
- package/dist/types/components/WheelColumn.d.ts.map +1 -0
- package/dist/types/config/data-table.d.ts +125 -0
- package/dist/types/config/data-table.d.ts.map +1 -0
- package/dist/types/constants/common.d.ts +4 -0
- package/dist/types/constants/common.d.ts.map +1 -0
- package/dist/types/constants/theme.d.ts +13 -0
- package/dist/types/constants/theme.d.ts.map +1 -0
- package/dist/types/hooks/index.d.ts +10 -0
- package/dist/types/hooks/index.d.ts.map +1 -0
- package/dist/types/hooks/use-callback-ref.d.ts +10 -0
- package/dist/types/hooks/use-callback-ref.d.ts.map +1 -0
- package/dist/types/hooks/use-data-table.d.ts +26 -0
- package/dist/types/hooks/use-data-table.d.ts.map +1 -0
- package/dist/types/hooks/use-debounced-callback.d.ts +2 -0
- package/dist/types/hooks/use-debounced-callback.d.ts.map +1 -0
- package/dist/types/hooks/use-debounced-value.d.ts +9 -0
- package/dist/types/hooks/use-debounced-value.d.ts.map +1 -0
- package/dist/types/hooks/use-event-listener.d.ts +7 -0
- package/dist/types/hooks/use-event-listener.d.ts.map +1 -0
- package/dist/types/hooks/use-intersection-observer.d.ts +20 -0
- package/dist/types/hooks/use-intersection-observer.d.ts.map +1 -0
- package/dist/types/hooks/use-isomorphic-layout-effect.d.ts +3 -0
- package/dist/types/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
- package/dist/types/hooks/use-media-query.d.ts +7 -0
- package/dist/types/hooks/use-media-query.d.ts.map +1 -0
- package/dist/types/hooks/use-mouse-position.d.ts +14 -0
- package/dist/types/hooks/use-mouse-position.d.ts.map +1 -0
- package/dist/types/hooks/use-on-click-outside.d.ts +5 -0
- package/dist/types/hooks/use-on-click-outside.d.ts.map +1 -0
- package/dist/types/hooks/use-script.d.ts +9 -0
- package/dist/types/hooks/use-script.d.ts.map +1 -0
- package/dist/types/hooks/use-scroll-lock.d.ts +13 -0
- package/dist/types/hooks/use-scroll-lock.d.ts.map +1 -0
- package/dist/types/index.d.ts +72 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/BlurText.d.ts +18 -0
- package/dist/types/lib/TextAnimation/BlurText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/CircularText.d.ts +10 -0
- package/dist/types/lib/TextAnimation/CircularText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/FlipWords.d.ts +10 -0
- package/dist/types/lib/TextAnimation/FlipWords.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/GradientText.d.ts +11 -0
- package/dist/types/lib/TextAnimation/GradientText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/RollingText.d.ts +12 -0
- package/dist/types/lib/TextAnimation/RollingText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/RotatingText.d.ts +11 -0
- package/dist/types/lib/TextAnimation/RotatingText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/ShimmeringText.d.ts +12 -0
- package/dist/types/lib/TextAnimation/ShimmeringText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/SplittingText.d.ts +26 -0
- package/dist/types/lib/TextAnimation/SplittingText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/TextGenerateEffect.d.ts +10 -0
- package/dist/types/lib/TextAnimation/TextGenerateEffect.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/TextHoverEffect.d.ts +6 -0
- package/dist/types/lib/TextAnimation/TextHoverEffect.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts +20 -0
- package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/TypingText.d.ts +27 -0
- package/dist/types/lib/TextAnimation/TypingText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/WritingText.d.ts +13 -0
- package/dist/types/lib/TextAnimation/WritingText.d.ts.map +1 -0
- package/dist/types/lib/TextAnimation/index.d.ts +16 -0
- package/dist/types/lib/TextAnimation/index.d.ts.map +1 -0
- package/dist/types/types/data-table.d.ts +44 -0
- package/dist/types/types/data-table.d.ts.map +1 -0
- package/dist/types/types/theme.d.ts +11 -0
- package/dist/types/types/theme.d.ts.map +1 -0
- package/dist/types/types/variables.d.ts +6 -0
- package/dist/types/types/variables.d.ts.map +1 -0
- package/dist/types/utils/animations.d.ts +47 -0
- package/dist/types/utils/animations.d.ts.map +1 -0
- package/dist/types/utils/css.d.ts +4 -0
- package/dist/types/utils/css.d.ts.map +1 -0
- package/dist/types/utils/data-table.d.ts +13 -0
- package/dist/types/utils/data-table.d.ts.map +1 -0
- package/dist/types/utils/datetime.d.ts +2 -0
- package/dist/types/utils/datetime.d.ts.map +1 -0
- package/dist/types/utils/parsers.d.ts +38 -0
- package/dist/types/utils/parsers.d.ts.map +1 -0
- package/package.json +968 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Cropper.js","sources":["../../../../src/components/Cropper/Cropper.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 = \"Cropper\";\nconst CONTENT_NAME = \"CropperContent\";\nconst IMAGE_NAME = \"CropperImage\";\nconst VIDEO_NAME = \"CropperVideo\";\nconst AREA_NAME = \"CropperArea\";\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface GestureEvent extends UIEvent {\n rotation: number;\n scale: number;\n clientX: number;\n clientY: number;\n}\n\ninterface Size {\n width: number;\n height: number;\n}\n\ninterface Area {\n width: number;\n height: number;\n x: number;\n y: number;\n}\n\ninterface MediaSize {\n width: number;\n height: number;\n naturalWidth: number;\n naturalHeight: number;\n}\n\ntype Shape = \"rectangle\" | \"circle\";\ntype ObjectFit = \"contain\" | \"cover\" | \"horizontal-cover\" | \"vertical-cover\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nconst MAX_CACHE_SIZE = 200;\nconst DPR = typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n\nconst rotationSizeCache = new Map<string, Size>();\nconst cropSizeCache = new Map<string, Size>();\nconst croppedAreaCache = new Map<\n string,\n { croppedAreaPercentages: Area; croppedAreaPixels: Area }\n>();\nconst onPositionClampCache = new Map<string, Point>();\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction quantize(n: number, step = 2 / DPR): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizePosition(n: number, step = 4 / DPR): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizeZoom(n: number, step = 0.01): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizeRotation(n: number, step = 1.0): number {\n return Math.round(n / step) * step;\n}\n\nfunction snapToDevicePixel(n: number): number {\n return Math.round(n * DPR) / DPR;\n}\n\nfunction lruGet<K, V>(map: Map<K, V>, key: K): V | undefined {\n const v = map.get(key);\n if (v !== undefined) {\n map.delete(key);\n map.set(key, v);\n }\n return v;\n}\n\nfunction lruSet<K, V>(\n map: Map<K, V>,\n key: K,\n val: V,\n max = MAX_CACHE_SIZE,\n): void {\n if (map.has(key)) {\n map.delete(key);\n }\n map.set(key, val);\n if (map.size > max) {\n const firstKey = map.keys().next().value;\n if (firstKey !== undefined) {\n map.delete(firstKey);\n }\n }\n}\n\nfunction getDistanceBetweenPoints(pointA: Point, pointB: Point): number {\n return Math.sqrt((pointA.y - pointB.y) ** 2 + (pointA.x - pointB.x) ** 2);\n}\n\nfunction getCenter(a: Point, b: Point): Point {\n return {\n x: (b.x + a.x) * 0.5,\n y: (b.y + a.y) * 0.5,\n };\n}\n\nfunction getRotationBetweenPoints(pointA: Point, pointB: Point): number {\n return (Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180) / Math.PI;\n}\n\nfunction getRadianAngle(degreeValue: number): number {\n return (degreeValue * Math.PI) / 180;\n}\n\nfunction rotateSize(width: number, height: number, rotation: number): Size {\n const cacheKey = `${quantize(width)}-${quantize(height)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(rotationSizeCache, cacheKey);\n if (cached) {\n return cached;\n }\n const rotRad = getRadianAngle(rotation);\n const cosRot = Math.cos(rotRad);\n const sinRot = Math.sin(rotRad);\n\n const result: Size = {\n width: Math.abs(cosRot * width) + Math.abs(sinRot * height),\n height: Math.abs(sinRot * width) + Math.abs(cosRot * height),\n };\n\n lruSet(rotationSizeCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction getCropSize(\n mediaWidth: number,\n mediaHeight: number,\n contentWidth: number,\n contentHeight: number,\n aspect: number,\n rotation = 0,\n): Size {\n const cacheKey = `${quantize(mediaWidth, 8)}-${quantize(mediaHeight, 8)}-${quantize(contentWidth, 8)}-${quantize(contentHeight, 8)}-${quantize(aspect, 0.01)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(cropSizeCache, cacheKey);\n if (cached) {\n return cached;\n }\n const { width, height } = rotateSize(mediaWidth, mediaHeight, rotation);\n const fittingWidth = Math.min(width, contentWidth);\n const fittingHeight = Math.min(height, contentHeight);\n\n const result: Size =\n fittingWidth > fittingHeight * aspect\n ? {\n width: fittingHeight * aspect,\n height: fittingHeight,\n }\n : {\n width: fittingWidth,\n height: fittingWidth / aspect,\n };\n\n lruSet(cropSizeCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction onPositionClamp(\n position: Point,\n mediaSize: Size,\n cropSize: Size,\n zoom: number,\n rotation = 0,\n): Point {\n const quantizedX = quantizePosition(position.x);\n const quantizedY = quantizePosition(position.y);\n\n const cacheKey = `${quantizedX}-${quantizedY}-${quantize(mediaSize.width)}-${quantize(mediaSize.height)}-${quantize(cropSize.width)}-${quantize(cropSize.height)}-${quantizeZoom(zoom)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(onPositionClampCache, cacheKey);\n if (cached) {\n return cached;\n }\n const { width, height } = rotateSize(\n mediaSize.width,\n mediaSize.height,\n rotation,\n );\n\n const maxPositionX = width * zoom * 0.5 - cropSize.width * 0.5;\n const maxPositionY = height * zoom * 0.5 - cropSize.height * 0.5;\n\n const result: Point = {\n x: clamp(position.x, -maxPositionX, maxPositionX),\n y: clamp(position.y, -maxPositionY, maxPositionY),\n };\n\n lruSet(onPositionClampCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction getCroppedArea(\n crop: Point,\n mediaSize: MediaSize,\n cropSize: Size,\n aspect: number,\n zoom: number,\n rotation = 0,\n allowOverflow = false,\n): { croppedAreaPercentages: Area; croppedAreaPixels: Area } {\n const cacheKey = `${quantizePosition(crop.x)}-${quantizePosition(crop.y)}-${quantize(mediaSize.width)}-${quantize(mediaSize.height)}-${quantize(mediaSize.naturalWidth)}-${quantize(mediaSize.naturalHeight)}-${quantize(cropSize.width)}-${quantize(cropSize.height)}-${quantize(aspect, 0.01)}-${quantizeZoom(zoom)}-${quantizeRotation(rotation)}-${allowOverflow}`;\n\n const cached = lruGet(croppedAreaCache, cacheKey);\n\n if (cached) return cached;\n\n const onAreaLimit = !allowOverflow\n ? (max: number, value: number) => Math.min(max, Math.max(0, value))\n : (_max: number, value: number) => value;\n\n const mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n const mediaNaturalBBoxSize = rotateSize(\n mediaSize.naturalWidth,\n mediaSize.naturalHeight,\n rotation,\n );\n\n const croppedAreaPercentages: Area = {\n x: onAreaLimit(\n 100,\n (((mediaBBoxSize.width - cropSize.width / zoom) / 2 - crop.x / zoom) /\n mediaBBoxSize.width) *\n 100,\n ),\n y: onAreaLimit(\n 100,\n (((mediaBBoxSize.height - cropSize.height / zoom) / 2 - crop.y / zoom) /\n mediaBBoxSize.height) *\n 100,\n ),\n width: onAreaLimit(\n 100,\n ((cropSize.width / mediaBBoxSize.width) * 100) / zoom,\n ),\n height: onAreaLimit(\n 100,\n ((cropSize.height / mediaBBoxSize.height) * 100) / zoom,\n ),\n };\n\n const widthInPixels = Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.width,\n (croppedAreaPercentages.width * mediaNaturalBBoxSize.width) / 100,\n ),\n );\n const heightInPixels = Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.height,\n (croppedAreaPercentages.height * mediaNaturalBBoxSize.height) / 100,\n ),\n );\n const isImageWiderThanHigh =\n mediaNaturalBBoxSize.width >= mediaNaturalBBoxSize.height * aspect;\n\n const sizePixels: Size = isImageWiderThanHigh\n ? {\n width: Math.round(heightInPixels * aspect),\n height: heightInPixels,\n }\n : {\n width: widthInPixels,\n height: Math.round(widthInPixels / aspect),\n };\n\n const croppedAreaPixels: Area = {\n ...sizePixels,\n x: Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.width - sizePixels.width,\n (croppedAreaPercentages.x * mediaNaturalBBoxSize.width) / 100,\n ),\n ),\n y: Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.height - sizePixels.height,\n (croppedAreaPercentages.y * mediaNaturalBBoxSize.height) / 100,\n ),\n ),\n };\n\n const result = { croppedAreaPercentages, croppedAreaPixels };\n\n lruSet(croppedAreaCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\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\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\ninterface StoreState {\n crop: Point;\n zoom: number;\n rotation: number;\n mediaSize: MediaSize | null;\n cropSize: Size | null;\n isDragging: boolean;\n isWheelZooming: boolean;\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 notify: () => void;\n batch: (fn: () => void) => void;\n}\n\nfunction createStore(\n listenersRef: React.RefObject<Set<() => void>>,\n stateRef: React.RefObject<StoreState>,\n aspectRatio: number,\n allowOverflow: boolean,\n onCropChange?: (crop: Point) => void,\n onCropSizeChange?: (cropSize: Size) => void,\n onCropAreaChange?: (croppedArea: Area, croppedAreaPixels: Area) => void,\n onCropComplete?: (croppedArea: Area, croppedAreaPixels: Area) => void,\n onZoomChange?: (zoom: number) => void,\n onRotationChange?: (rotation: number) => void,\n onMediaLoaded?: (mediaSize: MediaSize) => void,\n onInteractionStart?: () => void,\n onInteractionEnd?: () => void,\n): Store {\n let isBatching = false;\n let raf: number | null = null;\n\n function notifyCropAreaChange() {\n if (raf != null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n const s = stateRef.current;\n if (s?.mediaSize && s.cropSize && onCropAreaChange) {\n const { croppedAreaPercentages, croppedAreaPixels } = getCroppedArea(\n s.crop,\n s.mediaSize,\n s.cropSize,\n aspectRatio,\n s.zoom,\n s.rotation,\n allowOverflow,\n );\n onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n }\n });\n }\n\n const store: Store = {\n subscribe: (cb) => {\n if (listenersRef.current) {\n listenersRef.current.add(cb);\n return () => listenersRef.current?.delete(cb);\n }\n return () => {};\n },\n getState: () =>\n stateRef.current ?? {\n crop: { x: 0, y: 0 },\n zoom: 1,\n rotation: 0,\n mediaSize: null,\n cropSize: null,\n isDragging: false,\n isWheelZooming: false,\n },\n setState: (key, value) => {\n const state = stateRef.current;\n if (!state || Object.is(state[key], value)) return;\n\n state[key] = value;\n\n if (\n key === \"crop\" &&\n typeof value === \"object\" &&\n value &&\n \"x\" in value\n ) {\n onCropChange?.(value);\n } else if (key === \"zoom\" && typeof value === \"number\") {\n onZoomChange?.(value);\n } else if (key === \"rotation\" && typeof value === \"number\") {\n onRotationChange?.(value);\n } else if (\n key === \"cropSize\" &&\n typeof value === \"object\" &&\n value &&\n \"width\" in value\n ) {\n onCropSizeChange?.(value);\n } else if (\n key === \"mediaSize\" &&\n typeof value === \"object\" &&\n value &&\n \"naturalWidth\" in value\n ) {\n onMediaLoaded?.(value);\n } else if (key === \"isDragging\") {\n if (value) {\n onInteractionStart?.();\n } else {\n onInteractionEnd?.();\n const currentState = stateRef.current;\n if (\n currentState?.mediaSize &&\n currentState.cropSize &&\n onCropComplete\n ) {\n const { croppedAreaPercentages, croppedAreaPixels } =\n getCroppedArea(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n aspectRatio,\n currentState.zoom,\n currentState.rotation,\n allowOverflow,\n );\n onCropComplete(croppedAreaPercentages, croppedAreaPixels);\n }\n }\n }\n\n if (\n (key === \"crop\" ||\n key === \"zoom\" ||\n key === \"rotation\" ||\n key === \"mediaSize\" ||\n key === \"cropSize\") &&\n onCropAreaChange\n ) {\n notifyCropAreaChange();\n }\n\n if (!isBatching) {\n store.notify();\n }\n },\n notify: () => {\n if (listenersRef.current) {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n },\n batch: (fn: () => void) => {\n if (isBatching) {\n fn();\n return;\n }\n isBatching = true;\n try {\n fn();\n } finally {\n isBatching = false;\n store.notify();\n }\n },\n };\n\n return store;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\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\ntype RootElement = React.ComponentRef<typeof CropperRootImpl>;\n\ninterface CropperContextValue {\n aspectRatio: number;\n minZoom: number;\n maxZoom: number;\n zoomSpeed: number;\n keyboardStep: number;\n shape: Shape;\n objectFit: ObjectFit;\n rootRef: React.RefObject<RootElement | null>;\n allowOverflow: boolean;\n preventScrollZoom: boolean;\n withGrid: boolean;\n}\n\nconst CropperContext = React.createContext<CropperContextValue | null>(null);\n\nfunction useCropperContext(consumerName: string) {\n const context = React.useContext(CropperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface CropperRootProps extends DivProps {\n crop?: Point;\n zoom?: number;\n minZoom?: number;\n maxZoom?: number;\n zoomSpeed?: number;\n rotation?: number;\n keyboardStep?: number;\n aspectRatio?: number;\n shape?: Shape;\n objectFit?: ObjectFit;\n allowOverflow?: boolean;\n preventScrollZoom?: boolean;\n withGrid?: boolean;\n onCropChange?: (crop: Point) => void;\n onCropSizeChange?: (cropSize: Size) => void;\n onCropAreaChange?: (croppedArea: Area, croppedAreaPixels: Area) => void;\n onCropComplete?: (croppedArea: Area, croppedAreaPixels: Area) => void;\n onZoomChange?: (zoom: number) => void;\n onRotationChange?: (rotation: number) => void;\n onMediaLoaded?: (mediaSize: MediaSize) => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onWheelZoom?: (event: WheelEvent) => void;\n}\n\nfunction CropperRoot(props: CropperRootProps) {\n const {\n crop = { x: 0, y: 0 },\n zoom = 1,\n minZoom = 1,\n maxZoom = 3,\n zoomSpeed = 1,\n rotation = 0,\n keyboardStep = 1,\n aspectRatio = 4 / 3,\n shape = \"rectangle\",\n objectFit = \"contain\",\n allowOverflow = false,\n preventScrollZoom = false,\n withGrid = false,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd,\n className,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n crop,\n zoom,\n rotation,\n mediaSize: null,\n cropSize: null,\n isDragging: false,\n isWheelZooming: false,\n }));\n\n const rootRef = React.useRef<RootElement>(null);\n\n const store = React.useMemo(\n () =>\n createStore(\n listenersRef,\n stateRef,\n aspectRatio,\n allowOverflow,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd,\n ),\n [\n listenersRef,\n stateRef,\n aspectRatio,\n allowOverflow,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd,\n ],\n );\n\n useIsomorphicLayoutEffect(() => {\n const updates: Partial<StoreState> = {};\n let hasUpdates = false;\n let shouldRecompute = false;\n\n if (crop !== undefined) {\n const currentState = store.getState();\n if (!Object.is(currentState.crop, crop)) {\n updates.crop = crop;\n hasUpdates = true;\n }\n }\n\n if (zoom !== undefined) {\n const currentState = store.getState();\n if (currentState.zoom !== zoom) {\n updates.zoom = zoom;\n hasUpdates = true;\n shouldRecompute = true;\n }\n }\n\n if (rotation !== undefined) {\n const currentState = store.getState();\n if (currentState.rotation !== rotation) {\n updates.rotation = rotation;\n hasUpdates = true;\n shouldRecompute = true;\n }\n }\n\n if (hasUpdates) {\n store.batch(() => {\n Object.entries(updates).forEach(([key, value]) => {\n store.setState(key as keyof StoreState, value);\n });\n });\n\n if (shouldRecompute && rootRef.current) {\n requestAnimationFrame(() => {\n const currentState = store.getState();\n if (currentState.cropSize && currentState.mediaSize) {\n const newPosition = !allowOverflow\n ? onPositionClamp(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n currentState.zoom,\n currentState.rotation,\n )\n : currentState.crop;\n\n if (\n Math.abs(newPosition.x - currentState.crop.x) > 0.001 ||\n Math.abs(newPosition.y - currentState.crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }\n });\n }\n }\n }, [crop, zoom, rotation, store, allowOverflow]);\n\n const contextValue = React.useMemo<CropperContextValue>(\n () => ({\n minZoom,\n maxZoom,\n zoomSpeed,\n keyboardStep,\n aspectRatio,\n shape,\n objectFit,\n preventScrollZoom,\n allowOverflow,\n withGrid,\n rootRef,\n }),\n [\n minZoom,\n maxZoom,\n zoomSpeed,\n keyboardStep,\n aspectRatio,\n shape,\n objectFit,\n preventScrollZoom,\n allowOverflow,\n withGrid,\n ],\n );\n\n return (\n <StoreContext.Provider value={store}>\n <CropperContext.Provider value={contextValue}>\n <div\n data-slot=\"cropper-wrapper\"\n className={cn(\"relative size-full overflow-hidden\", className)}\n >\n <CropperRootImpl {...rootProps} />\n </div>\n </CropperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface CropperRootImplProps extends CropperRootProps {\n onWheelZoom?: (event: WheelEvent) => void;\n}\n\nfunction CropperRootImpl(props: CropperRootImplProps) {\n const { className, asChild, ref, ...contentProps } = props;\n\n const context = useCropperContext(CONTENT_NAME);\n const store = useStoreContext(CONTENT_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n const mediaSize = useStore((state) => state.mediaSize);\n const cropSize = useStore((state) => state.cropSize);\n\n const composedRef = useComposedRefs(ref, context.rootRef);\n const dragStartPositionRef = React.useRef<Point>({ x: 0, y: 0 });\n const dragStartCropRef = React.useRef<Point>({ x: 0, y: 0 });\n const contentPositionRef = React.useRef<Point>({ x: 0, y: 0 });\n const lastPinchDistanceRef = React.useRef(0);\n const lastPinchRotationRef = React.useRef(0);\n const rafDragTimeoutRef = React.useRef<number | null>(null);\n const rafPinchTimeoutRef = React.useRef<number | null>(null);\n const wheelTimerRef = React.useRef<number | null>(null);\n const isTouchingRef = React.useRef(false);\n const gestureZoomStartRef = React.useRef(0);\n const gestureRotationStartRef = React.useRef(0);\n\n const onRefsCleanup = React.useCallback(() => {\n if (rafDragTimeoutRef.current) {\n cancelAnimationFrame(rafDragTimeoutRef.current);\n rafDragTimeoutRef.current = null;\n }\n if (rafPinchTimeoutRef.current) {\n cancelAnimationFrame(rafPinchTimeoutRef.current);\n rafPinchTimeoutRef.current = null;\n }\n if (wheelTimerRef.current) {\n clearTimeout(wheelTimerRef.current);\n wheelTimerRef.current = null;\n }\n isTouchingRef.current = false;\n }, []);\n\n const onCachesCleanup = React.useCallback(() => {\n if (onPositionClampCache.size > MAX_CACHE_SIZE * 1.5) {\n onPositionClampCache.clear();\n }\n if (croppedAreaCache.size > MAX_CACHE_SIZE * 1.5) {\n croppedAreaCache.clear();\n }\n }, []);\n\n const getMousePoint = React.useCallback(\n (event: MouseEvent | React.MouseEvent) => ({\n x: Number(event.clientX),\n y: Number(event.clientY),\n }),\n [],\n );\n\n const getTouchPoint = React.useCallback(\n (touch: Touch | React.Touch) => ({\n x: Number(touch.clientX),\n y: Number(touch.clientY),\n }),\n [],\n );\n\n const onContentPositionChange = React.useCallback(() => {\n if (context.rootRef?.current) {\n const bounds = context.rootRef.current.getBoundingClientRect();\n contentPositionRef.current = { x: bounds.left, y: bounds.top };\n }\n }, [context.rootRef]);\n\n const getPointOnContent = React.useCallback(\n ({ x, y }: Point, contentTopLeft: Point): Point => {\n if (!context.rootRef?.current) {\n return { x: 0, y: 0 };\n }\n const contentRect = context.rootRef.current.getBoundingClientRect();\n return {\n x: contentRect.width / 2 - (x - contentTopLeft.x),\n y: contentRect.height / 2 - (y - contentTopLeft.y),\n };\n },\n [context.rootRef],\n );\n\n const getPointOnMedia = React.useCallback(\n ({ x, y }: Point) => {\n return {\n x: (x + crop.x) / zoom,\n y: (y + crop.y) / zoom,\n };\n },\n [crop, zoom],\n );\n\n const recomputeCropPosition = React.useCallback(() => {\n if (!cropSize || !mediaSize) return;\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(crop, mediaSize, cropSize, zoom, rotation)\n : crop;\n\n if (\n Math.abs(newPosition.x - crop.x) > 0.001 ||\n Math.abs(newPosition.y - crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }, [cropSize, mediaSize, context.allowOverflow, crop, zoom, rotation, store]);\n\n const onZoomChange = React.useCallback(\n (newZoom: number, point: Point, shouldUpdatePosition = true) => {\n if (!cropSize || !mediaSize) return;\n\n const clampedZoom = clamp(newZoom, context.minZoom, context.maxZoom);\n\n store.batch(() => {\n if (shouldUpdatePosition) {\n const zoomPoint = getPointOnContent(\n point,\n contentPositionRef.current,\n );\n const zoomTarget = getPointOnMedia(zoomPoint);\n const requestedPosition = {\n x: zoomTarget.x * clampedZoom - zoomPoint.x,\n y: zoomTarget.y * clampedZoom - zoomPoint.y,\n };\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(\n requestedPosition,\n mediaSize,\n cropSize,\n clampedZoom,\n rotation,\n )\n : requestedPosition;\n\n store.setState(\"crop\", newPosition);\n }\n store.setState(\"zoom\", clampedZoom);\n });\n\n requestAnimationFrame(() => {\n recomputeCropPosition();\n });\n },\n [\n cropSize,\n mediaSize,\n context.minZoom,\n context.maxZoom,\n context.allowOverflow,\n getPointOnContent,\n getPointOnMedia,\n rotation,\n store,\n recomputeCropPosition,\n ],\n );\n\n const onDragStart = React.useCallback(\n ({ x, y }: Point) => {\n dragStartPositionRef.current = { x, y };\n dragStartCropRef.current = { ...crop };\n store.setState(\"isDragging\", true);\n },\n [crop, store],\n );\n\n const onDrag = React.useCallback(\n ({ x, y }: Point) => {\n if (rafDragTimeoutRef.current) {\n cancelAnimationFrame(rafDragTimeoutRef.current);\n }\n\n rafDragTimeoutRef.current = requestAnimationFrame(() => {\n if (!cropSize || !mediaSize) return;\n if (x === undefined || y === undefined) return;\n\n const offsetX = x - dragStartPositionRef.current.x;\n const offsetY = y - dragStartPositionRef.current.y;\n\n if (Math.abs(offsetX) < 2 && Math.abs(offsetY) < 2) {\n return;\n }\n\n const requestedPosition = {\n x: dragStartCropRef.current.x + offsetX,\n y: dragStartCropRef.current.y + offsetY,\n };\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(\n requestedPosition,\n mediaSize,\n cropSize,\n zoom,\n rotation,\n )\n : requestedPosition;\n\n const currentCrop = store.getState().crop;\n if (\n Math.abs(newPosition.x - currentCrop.x) > 1 ||\n Math.abs(newPosition.y - currentCrop.y) > 1\n ) {\n store.setState(\"crop\", newPosition);\n }\n });\n },\n [cropSize, mediaSize, context.allowOverflow, zoom, rotation, store],\n );\n\n const onMouseMove = React.useCallback(\n (event: MouseEvent) => onDrag(getMousePoint(event)),\n [getMousePoint, onDrag],\n );\n\n const onTouchMove = React.useCallback(\n (event: TouchEvent) => {\n event.preventDefault();\n if (event.touches.length === 2) {\n const [firstTouch, secondTouch] = event.touches ?? [];\n if (firstTouch && secondTouch) {\n const pointA = getTouchPoint(firstTouch);\n const pointB = getTouchPoint(secondTouch);\n const center = getCenter(pointA, pointB);\n onDrag(center);\n\n if (rafPinchTimeoutRef.current) {\n cancelAnimationFrame(rafPinchTimeoutRef.current);\n }\n\n rafPinchTimeoutRef.current = requestAnimationFrame(() => {\n const distance = getDistanceBetweenPoints(pointA, pointB);\n const distanceRatio = distance / lastPinchDistanceRef.current;\n\n if (Math.abs(distanceRatio - 1) > 0.01) {\n const newZoom = zoom * distanceRatio;\n onZoomChange(newZoom, center, false);\n lastPinchDistanceRef.current = distance;\n }\n\n const rotationAngle = getRotationBetweenPoints(pointA, pointB);\n const rotationDiff = rotationAngle - lastPinchRotationRef.current;\n\n if (Math.abs(rotationDiff) > 0.5) {\n const newRotation = rotation + rotationDiff;\n store.setState(\"rotation\", newRotation);\n lastPinchRotationRef.current = rotationAngle;\n }\n });\n }\n } else if (event.touches.length === 1) {\n const firstTouch = event.touches[0];\n if (firstTouch) {\n onDrag(getTouchPoint(firstTouch));\n }\n }\n },\n [getTouchPoint, onDrag, zoom, onZoomChange, rotation, store],\n );\n\n const onGestureChange = React.useCallback(\n (event: GestureEvent) => {\n event.preventDefault();\n if (isTouchingRef.current) {\n return;\n }\n\n const point = { x: Number(event.clientX), y: Number(event.clientY) };\n const newZoom = gestureZoomStartRef.current - 1 + event.scale;\n onZoomChange(newZoom, point, true);\n\n const newRotation = gestureRotationStartRef.current + event.rotation;\n store.setState(\"rotation\", newRotation);\n },\n [onZoomChange, store],\n );\n\n const onGestureEnd = React.useCallback(() => {\n document.removeEventListener(\n \"gesturechange\",\n onGestureChange as EventListener,\n );\n document.removeEventListener(\"gestureend\", onGestureEnd as EventListener);\n }, [onGestureChange]);\n\n const onGestureStart = React.useCallback(\n (event: GestureEvent) => {\n event.preventDefault();\n document.addEventListener(\n \"gesturechange\",\n onGestureChange as EventListener,\n );\n document.addEventListener(\"gestureend\", onGestureEnd as EventListener);\n gestureZoomStartRef.current = zoom;\n gestureRotationStartRef.current = rotation;\n },\n [zoom, rotation, onGestureChange, onGestureEnd],\n );\n\n const onSafariZoomPrevent = React.useCallback(\n (event: Event) => event.preventDefault(),\n [],\n );\n\n const onEventsCleanup = React.useCallback(() => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"touchmove\", onTouchMove);\n document.removeEventListener(\n \"gesturechange\",\n onGestureChange as EventListener,\n );\n document.removeEventListener(\"gestureend\", onGestureEnd as EventListener);\n }, [onMouseMove, onTouchMove, onGestureChange, onGestureEnd]);\n\n const onDragStopped = React.useCallback(() => {\n isTouchingRef.current = false;\n store.setState(\"isDragging\", false);\n onRefsCleanup();\n document.removeEventListener(\"mouseup\", onDragStopped);\n document.removeEventListener(\"touchend\", onDragStopped);\n onEventsCleanup();\n }, [store, onEventsCleanup, onRefsCleanup]);\n\n const getWheelDelta = React.useCallback((event: WheelEvent) => {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n let deltaZ = event.deltaZ;\n\n if (event.deltaMode === 1) {\n deltaX *= 16;\n deltaY *= 16;\n deltaZ *= 16;\n } else if (event.deltaMode === 2) {\n deltaX *= 400;\n deltaY *= 400;\n deltaZ *= 400;\n }\n\n return { deltaX, deltaY, deltaZ };\n }, []);\n\n const onWheelZoom = React.useCallback(\n (event: WheelEvent) => {\n contentProps.onWheelZoom?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n const point = getMousePoint(event);\n const { deltaY } = getWheelDelta(event);\n const newZoom = zoom - (deltaY * context.zoomSpeed) / 200;\n onZoomChange(newZoom, point, true);\n\n store.batch(() => {\n const currentState = store.getState();\n if (!currentState.isWheelZooming) {\n store.setState(\"isWheelZooming\", true);\n }\n if (!currentState.isDragging) {\n store.setState(\"isDragging\", true);\n }\n });\n\n if (wheelTimerRef.current) {\n clearTimeout(wheelTimerRef.current);\n }\n wheelTimerRef.current = window.setTimeout(() => {\n store.batch(() => {\n store.setState(\"isWheelZooming\", false);\n store.setState(\"isDragging\", false);\n });\n }, 250);\n },\n [\n contentProps.onWheelZoom,\n getMousePoint,\n zoom,\n context.zoomSpeed,\n onZoomChange,\n getWheelDelta,\n store,\n ],\n );\n\n const onKeyUp = React.useCallback(\n (event: React.KeyboardEvent<RootElement>) => {\n contentProps.onKeyUp?.(event);\n if (event.defaultPrevented) return;\n\n const arrowKeys = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ]);\n\n if (arrowKeys.has(event.key)) {\n event.preventDefault();\n store.setState(\"isDragging\", false);\n }\n },\n [contentProps.onKeyUp, store],\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<RootElement>) => {\n contentProps.onKeyDown?.(event);\n if (event.defaultPrevented || !cropSize || !mediaSize) return;\n\n let step = context.keyboardStep;\n if (event.shiftKey) {\n step *= 0.2;\n }\n\n const keyCallbacks: Record<string, () => Point> = {\n ArrowUp: () => ({ ...crop, y: crop.y - step }),\n ArrowDown: () => ({ ...crop, y: crop.y + step }),\n ArrowLeft: () => ({ ...crop, x: crop.x - step }),\n ArrowRight: () => ({ ...crop, x: crop.x + step }),\n } as const;\n\n const callback = keyCallbacks[event.key];\n if (!callback) return;\n\n event.preventDefault();\n\n let newCrop = callback();\n\n if (!context.allowOverflow) {\n newCrop = onPositionClamp(newCrop, mediaSize, cropSize, zoom, rotation);\n }\n\n if (!event.repeat) {\n store.setState(\"isDragging\", true);\n }\n\n store.setState(\"crop\", newCrop);\n },\n [\n contentProps.onKeyDown,\n cropSize,\n mediaSize,\n context.keyboardStep,\n context.allowOverflow,\n crop,\n zoom,\n rotation,\n store,\n ],\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<RootElement>) => {\n contentProps.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onDragStopped);\n onContentPositionChange();\n onDragStart(getMousePoint(event));\n },\n [\n contentProps.onMouseDown,\n getMousePoint,\n onDragStart,\n onDragStopped,\n onMouseMove,\n onContentPositionChange,\n ],\n );\n\n const onTouchStart = React.useCallback(\n (event: React.TouchEvent<RootElement>) => {\n contentProps.onTouchStart?.(event);\n if (event.defaultPrevented) return;\n\n isTouchingRef.current = true;\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n document.addEventListener(\"touchend\", onDragStopped);\n onContentPositionChange();\n\n if (event.touches.length === 2) {\n const [firstTouch, secondTouch] = event.touches\n ? Array.from(event.touches)\n : [];\n if (firstTouch && secondTouch) {\n const pointA = getTouchPoint(firstTouch);\n const pointB = getTouchPoint(secondTouch);\n lastPinchDistanceRef.current = getDistanceBetweenPoints(\n pointA,\n pointB,\n );\n lastPinchRotationRef.current = getRotationBetweenPoints(\n pointA,\n pointB,\n );\n onDragStart(getCenter(pointA, pointB));\n }\n } else if (event.touches.length === 1) {\n const firstTouch = event.touches[0];\n if (firstTouch) {\n onDragStart(getTouchPoint(firstTouch));\n }\n }\n },\n [\n contentProps.onTouchStart,\n onDragStopped,\n onTouchMove,\n onContentPositionChange,\n getTouchPoint,\n onDragStart,\n ],\n );\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (!context.preventScrollZoom) {\n content.addEventListener(\"wheel\", onWheelZoom, { passive: false });\n }\n\n content.addEventListener(\"gesturestart\", onSafariZoomPrevent);\n content.addEventListener(\"gesturestart\", onGestureStart as EventListener);\n\n return () => {\n if (!context.preventScrollZoom) {\n content.removeEventListener(\"wheel\", onWheelZoom);\n }\n content.removeEventListener(\"gesturestart\", onSafariZoomPrevent);\n content.removeEventListener(\n \"gesturestart\",\n onGestureStart as EventListener,\n );\n onRefsCleanup();\n };\n }, [\n context.rootRef,\n context.preventScrollZoom,\n onWheelZoom,\n onRefsCleanup,\n onSafariZoomPrevent,\n onGestureStart,\n ]);\n\n React.useEffect(() => {\n return () => {\n onRefsCleanup();\n onCachesCleanup();\n };\n }, [onRefsCleanup, onCachesCleanup]);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <RootPrimitive\n data-slot=\"cropper\"\n tabIndex={0}\n {...contentProps}\n ref={composedRef}\n className={cn(\n \"absolute inset-0 flex cursor-move touch-none select-none items-center justify-center overflow-hidden outline-none\",\n className,\n )}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n />\n );\n}\n\nconst cropperMediaVariants = cva(\"will-change-transform\", {\n variants: {\n objectFit: {\n contain: \"absolute inset-0 m-auto max-h-full max-w-full\",\n cover: \"h-auto w-full\",\n \"horizontal-cover\": \"h-auto w-full\",\n \"vertical-cover\": \"h-full w-auto\",\n },\n },\n defaultVariants: {\n objectFit: \"contain\",\n },\n});\n\ninterface UseMediaComputationProps<\n T extends HTMLImageElement | HTMLVideoElement,\n> {\n mediaRef: React.RefObject<T | null>;\n context: CropperContextValue;\n store: Store;\n rotation: number;\n getNaturalDimensions: (media: T) => Size;\n}\n\nfunction useMediaComputation<T extends HTMLImageElement | HTMLVideoElement>({\n mediaRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n}: UseMediaComputationProps<T>) {\n const computeSizes = React.useCallback(() => {\n const media = mediaRef.current;\n const content = context.rootRef?.current;\n if (!media || !content) return;\n\n const contentRect = content.getBoundingClientRect();\n const containerAspect = contentRect.width / contentRect.height;\n const { width: naturalWidth, height: naturalHeight } =\n getNaturalDimensions(media);\n const isScaledDown =\n media.offsetWidth < naturalWidth || media.offsetHeight < naturalHeight;\n const mediaAspect = naturalWidth / naturalHeight;\n\n let renderedMediaSize: Size;\n\n if (isScaledDown) {\n const objectFitCallbacks = {\n contain: () =>\n containerAspect > mediaAspect\n ? {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }\n : {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n },\n \"horizontal-cover\": () => ({\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n }),\n \"vertical-cover\": () => ({\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }),\n cover: () =>\n containerAspect < mediaAspect\n ? {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n }\n : {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n },\n } as const;\n\n const callback = objectFitCallbacks[context.objectFit];\n renderedMediaSize = callback\n ? callback()\n : containerAspect > mediaAspect\n ? {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }\n : {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n };\n } else {\n renderedMediaSize = {\n width: media.offsetWidth,\n height: media.offsetHeight,\n };\n }\n\n const mediaSize: MediaSize = {\n ...renderedMediaSize,\n naturalWidth,\n naturalHeight,\n };\n\n store.setState(\"mediaSize\", mediaSize);\n\n const cropSize = getCropSize(\n mediaSize.width,\n mediaSize.height,\n contentRect.width,\n contentRect.height,\n context.aspectRatio,\n rotation,\n );\n\n store.setState(\"cropSize\", cropSize);\n\n requestAnimationFrame(() => {\n const currentState = store.getState();\n if (currentState.cropSize && currentState.mediaSize) {\n const newPosition = onPositionClamp(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n currentState.zoom,\n currentState.rotation,\n );\n\n if (\n Math.abs(newPosition.x - currentState.crop.x) > 0.001 ||\n Math.abs(newPosition.y - currentState.crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }\n });\n\n return { mediaSize, cropSize };\n }, [\n mediaRef,\n context.aspectRatio,\n context.rootRef,\n context.objectFit,\n store,\n rotation,\n getNaturalDimensions,\n ]);\n\n return { computeSizes };\n}\n\ninterface CropperImageProps\n extends\n React.ComponentProps<\"img\">,\n VariantProps<typeof cropperMediaVariants> {\n asChild?: boolean;\n snapPixels?: boolean;\n}\n\nfunction CropperImage(props: CropperImageProps) {\n const {\n className,\n style,\n asChild,\n ref,\n onLoad,\n objectFit,\n snapPixels = false,\n ...imageProps\n } = props;\n\n const context = useCropperContext(IMAGE_NAME);\n const store = useStoreContext(IMAGE_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n const composedRef = useComposedRefs(ref, imageRef);\n\n const getNaturalDimensions = React.useCallback(\n (image: HTMLImageElement) => ({\n width: image.naturalWidth,\n height: image.naturalHeight,\n }),\n [],\n );\n\n const { computeSizes } = useMediaComputation({\n mediaRef: imageRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n });\n\n const onMediaLoad = React.useCallback(() => {\n const image = imageRef.current;\n if (!image) return;\n\n computeSizes();\n\n onLoad?.(\n new Event(\"load\") as unknown as React.SyntheticEvent<HTMLImageElement>,\n );\n }, [computeSizes, onLoad]);\n\n React.useEffect(() => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n onMediaLoad();\n }\n }, [onMediaLoad]);\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (typeof ResizeObserver !== \"undefined\") {\n let isFirstResize = true;\n const resizeObserver = new ResizeObserver(() => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n\n const callback = () => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n computeSizes();\n }\n };\n\n if (\"requestIdleCallback\" in window) {\n requestIdleCallback(callback);\n } else {\n setTimeout(callback, 16);\n }\n });\n\n resizeObserver.observe(content);\n\n return () => {\n resizeObserver.disconnect();\n };\n } else {\n const onWindowResize = () => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n computeSizes();\n }\n };\n\n window.addEventListener(\"resize\", onWindowResize);\n return () => {\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }\n }, [context.rootRef, computeSizes]);\n\n const ImagePrimitive = asChild ? Slot : \"img\";\n\n return (\n <ImagePrimitive\n data-slot=\"cropper-image\"\n {...imageProps}\n ref={composedRef}\n className={cn(\n cropperMediaVariants({\n objectFit: objectFit ?? context.objectFit,\n className,\n }),\n )}\n style={{\n transform: snapPixels\n ? `translate(${snapToDevicePixel(crop.x)}px, ${snapToDevicePixel(crop.y)}px) rotate(${rotation}deg) scale(${zoom})`\n : `translate(${crop.x}px, ${crop.y}px) rotate(${rotation}deg) scale(${zoom})`,\n ...style,\n }}\n onLoad={onMediaLoad}\n />\n );\n}\n\ninterface CropperVideoProps\n extends\n React.ComponentProps<\"video\">,\n VariantProps<typeof cropperMediaVariants> {\n asChild?: boolean;\n snapPixels?: boolean;\n}\n\nfunction CropperVideo(props: CropperVideoProps) {\n const {\n className,\n style,\n asChild,\n ref,\n onLoadedMetadata,\n objectFit,\n snapPixels = false,\n ...videoProps\n } = props;\n\n const context = useCropperContext(VIDEO_NAME);\n const store = useStoreContext(VIDEO_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n\n const videoRef = React.useRef<HTMLVideoElement>(null);\n const composedRef = useComposedRefs(ref, videoRef);\n\n const getNaturalDimensions = React.useCallback(\n (video: HTMLVideoElement) => ({\n width: video.videoWidth,\n height: video.videoHeight,\n }),\n [],\n );\n\n const { computeSizes } = useMediaComputation({\n mediaRef: videoRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n });\n\n const onMediaLoad = React.useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n computeSizes();\n\n onLoadedMetadata?.(\n new Event(\n \"loadedmetadata\",\n ) as unknown as React.SyntheticEvent<HTMLVideoElement>,\n );\n }, [computeSizes, onLoadedMetadata]);\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (typeof ResizeObserver !== \"undefined\") {\n let isFirstResize = true;\n const resizeObserver = new ResizeObserver(() => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n\n const callback = () => {\n const video = videoRef.current;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n computeSizes();\n }\n };\n\n if (\"requestIdleCallback\" in window) {\n requestIdleCallback(callback);\n } else {\n setTimeout(callback, 16);\n }\n });\n\n resizeObserver.observe(content);\n\n return () => {\n resizeObserver.disconnect();\n };\n } else {\n const onWindowResize = () => {\n const video = videoRef.current;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n computeSizes();\n }\n };\n\n window.addEventListener(\"resize\", onWindowResize);\n return () => {\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }\n }, [context.rootRef, computeSizes]);\n\n const VideoPrimitive = asChild ? Slot : \"video\";\n\n return (\n <VideoPrimitive\n data-slot=\"cropper-video\"\n autoPlay\n playsInline\n loop\n muted\n controls={false}\n {...videoProps}\n ref={composedRef}\n className={cn(\n cropperMediaVariants({\n objectFit: objectFit ?? context.objectFit,\n className,\n }),\n )}\n style={{\n transform: snapPixels\n ? `translate(${snapToDevicePixel(crop.x)}px, ${snapToDevicePixel(crop.y)}px) rotate(${rotation}deg) scale(${zoom})`\n : `translate(${crop.x}px, ${crop.y}px) rotate(${rotation}deg) scale(${zoom})`,\n ...style,\n }}\n onLoadedMetadata={onMediaLoad}\n />\n );\n}\n\nconst cropperAreaVariants = cva(\n \"-translate-x-1/2 -translate-y-1/2 absolute top-1/2 left-1/2 box-border overflow-hidden border border-[2.5px] border-white/90 shadow-[0_0_0_9999em_rgba(0,0,0,0.5)]\",\n {\n variants: {\n shape: {\n rectangle: \"\",\n circle: \"rounded-full\",\n },\n withGrid: {\n true: \"before:absolute before:top-0 before:right-1/3 before:bottom-0 before:left-1/3 before:box-border before:border before:border-white/50 before:border-t-0 before:border-b-0 before:content-[''] after:absolute after:top-1/3 after:right-0 after:bottom-1/3 after:left-0 after:box-border after:border after:border-white/50 after:border-r-0 after:border-l-0 after:content-['']\",\n false: \"\",\n },\n },\n defaultVariants: {\n shape: \"rectangle\",\n withGrid: false,\n },\n },\n);\n\ninterface CropperAreaProps\n extends DivProps, VariantProps<typeof cropperAreaVariants> {\n snapPixels?: boolean;\n}\n\nfunction CropperArea(props: CropperAreaProps) {\n const {\n className,\n style,\n asChild,\n ref,\n snapPixels = false,\n shape,\n withGrid,\n ...areaProps\n } = props;\n\n const context = useCropperContext(AREA_NAME);\n const cropSize = useStore((state) => state.cropSize);\n\n if (!cropSize) return null;\n\n const AreaPrimitive = asChild ? Slot : \"div\";\n\n return (\n <AreaPrimitive\n data-slot=\"cropper-area\"\n {...areaProps}\n ref={ref}\n className={cn(\n cropperAreaVariants({\n shape: shape ?? context.shape,\n withGrid: withGrid ?? context.withGrid,\n className,\n }),\n )}\n style={{\n width: snapPixels ? Math.round(cropSize.width) : cropSize.width,\n height: snapPixels ? Math.round(cropSize.height) : cropSize.height,\n ...style,\n }}\n />\n );\n}\n\nexport {\n CropperRoot as Root,\n CropperImage as Image,\n CropperVideo as Video,\n CropperArea as Area,\n //\n CropperRoot as Cropper,\n CropperImage,\n CropperVideo,\n CropperArea,\n //\n useStore as useCropper,\n //\n type CropperRootProps as CropperProps,\n type Point as CropperPoint,\n type Size as CropperSize,\n type Area as CropperAreaData,\n type Shape as CropperShape,\n type ObjectFit as CropperObjectFit,\n};\n"],"names":["ROOT_NAME","CONTENT_NAME","IMAGE_NAME","VIDEO_NAME","AREA_NAME","MAX_CACHE_SIZE","DPR","rotationSizeCache","cropSizeCache","croppedAreaCache","onPositionClampCache","clamp","value","min","max","quantize","n","step","quantizePosition","quantizeZoom","quantizeRotation","snapToDevicePixel","lruGet","map","key","v","lruSet","val","firstKey","getDistanceBetweenPoints","pointA","pointB","getCenter","a","b","getRotationBetweenPoints","getRadianAngle","degreeValue","rotateSize","width","height","rotation","cacheKey","cached","rotRad","cosRot","sinRot","result","getCropSize","mediaWidth","mediaHeight","contentWidth","contentHeight","aspect","fittingWidth","fittingHeight","onPositionClamp","position","mediaSize","cropSize","zoom","quantizedX","quantizedY","maxPositionX","maxPositionY","getCroppedArea","crop","allowOverflow","onAreaLimit","_max","mediaBBoxSize","mediaNaturalBBoxSize","croppedAreaPercentages","widthInPixels","heightInPixels","sizePixels","croppedAreaPixels","useLazyRef","fn","ref","React","useIsomorphicLayoutEffect","createStore","listenersRef","stateRef","aspectRatio","onCropChange","onCropSizeChange","onCropAreaChange","onCropComplete","onZoomChange","onRotationChange","onMediaLoaded","onInteractionStart","onInteractionEnd","isBatching","raf","notifyCropAreaChange","s","store","cb","state","currentState","StoreContext","useStoreContext","consumerName","context","useStore","selector","getSnapshot","CropperContext","useCropperContext","CropperRoot","props","minZoom","maxZoom","zoomSpeed","keyboardStep","shape","objectFit","preventScrollZoom","withGrid","className","rootProps","rootRef","updates","hasUpdates","shouldRecompute","newPosition","contextValue","jsx","cn","CropperRootImpl","asChild","contentProps","composedRef","useComposedRefs","dragStartPositionRef","dragStartCropRef","contentPositionRef","lastPinchDistanceRef","lastPinchRotationRef","rafDragTimeoutRef","rafPinchTimeoutRef","wheelTimerRef","isTouchingRef","gestureZoomStartRef","gestureRotationStartRef","onRefsCleanup","onCachesCleanup","getMousePoint","event","getTouchPoint","touch","onContentPositionChange","bounds","getPointOnContent","x","y","contentTopLeft","contentRect","getPointOnMedia","recomputeCropPosition","newZoom","point","shouldUpdatePosition","clampedZoom","zoomPoint","zoomTarget","requestedPosition","onDragStart","onDrag","offsetX","offsetY","currentCrop","onMouseMove","onTouchMove","firstTouch","secondTouch","center","distance","distanceRatio","rotationAngle","rotationDiff","newRotation","onGestureChange","onGestureEnd","onGestureStart","onSafariZoomPrevent","onEventsCleanup","onDragStopped","getWheelDelta","deltaX","deltaY","deltaZ","onWheelZoom","onKeyUp","onKeyDown","callback","newCrop","onMouseDown","onTouchStart","content","Slot","cropperMediaVariants","cva","useMediaComputation","mediaRef","getNaturalDimensions","media","containerAspect","naturalWidth","naturalHeight","isScaledDown","mediaAspect","renderedMediaSize","CropperImage","style","onLoad","snapPixels","imageProps","imageRef","image","computeSizes","onMediaLoad","isFirstResize","resizeObserver","onWindowResize","CropperVideo","onLoadedMetadata","videoProps","videoRef","video","cropperAreaVariants","CropperArea","areaProps"],"mappings":"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"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { jsxs as I, jsx as q } from "react/jsx-runtime";
|
|
2
|
+
import t from "react";
|
|
3
|
+
import { Root as j, Image as v, Area as E } from "./Cropper.js";
|
|
4
|
+
import { getCroppedImg as d } from "./utils.js";
|
|
5
|
+
const k = t.forwardRef(
|
|
6
|
+
(T, y) => {
|
|
7
|
+
const {
|
|
8
|
+
src: i,
|
|
9
|
+
alt: g = "Crop image",
|
|
10
|
+
onCropComplete: s,
|
|
11
|
+
onCropAreaChange: e,
|
|
12
|
+
cropOptions: r = {},
|
|
13
|
+
crossOrigin: S = "anonymous",
|
|
14
|
+
rotation: p = 0,
|
|
15
|
+
shape: f = "rectangle",
|
|
16
|
+
...w
|
|
17
|
+
} = T, [C, R] = t.useState({ x: 0, y: 0 }), u = t.useRef(null), c = t.useRef(null), l = t.useCallback(
|
|
18
|
+
async (h, o) => {
|
|
19
|
+
if (e?.(h, o), !!s) {
|
|
20
|
+
if (c.current) {
|
|
21
|
+
const n = c.current;
|
|
22
|
+
if (n.x === o.x && n.y === o.y && n.width === o.width && n.height === o.height)
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
c.current = o, u.current && window.clearTimeout(u.current), u.current = window.setTimeout(async () => {
|
|
26
|
+
try {
|
|
27
|
+
if ((r.type || "base64") === "blob") {
|
|
28
|
+
const b = await d({
|
|
29
|
+
imageSrc: i,
|
|
30
|
+
pixelCrop: o,
|
|
31
|
+
rotation: p,
|
|
32
|
+
shape: f,
|
|
33
|
+
format: r.format || "image/jpeg",
|
|
34
|
+
quality: r.quality ?? 0.92,
|
|
35
|
+
flip: r.flip,
|
|
36
|
+
type: "blob"
|
|
37
|
+
});
|
|
38
|
+
s(b);
|
|
39
|
+
} else {
|
|
40
|
+
const b = await d({
|
|
41
|
+
imageSrc: i,
|
|
42
|
+
pixelCrop: o,
|
|
43
|
+
rotation: p,
|
|
44
|
+
shape: f,
|
|
45
|
+
format: r.format || "image/jpeg",
|
|
46
|
+
quality: r.quality ?? 0.92,
|
|
47
|
+
flip: r.flip,
|
|
48
|
+
type: "base64"
|
|
49
|
+
});
|
|
50
|
+
s(b);
|
|
51
|
+
}
|
|
52
|
+
} catch (n) {
|
|
53
|
+
console.error("Error creating cropped image:", n);
|
|
54
|
+
}
|
|
55
|
+
}, 300);
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
[i, p, f, r, s, e]
|
|
59
|
+
);
|
|
60
|
+
return t.useEffect(() => () => {
|
|
61
|
+
u.current && window.clearTimeout(u.current);
|
|
62
|
+
}, []), /* @__PURE__ */ I(
|
|
63
|
+
j,
|
|
64
|
+
{
|
|
65
|
+
ref: y,
|
|
66
|
+
...w,
|
|
67
|
+
crop: C,
|
|
68
|
+
rotation: p,
|
|
69
|
+
shape: f,
|
|
70
|
+
onCropChange: R,
|
|
71
|
+
onCropAreaChange: l,
|
|
72
|
+
children: [
|
|
73
|
+
/* @__PURE__ */ q(v, { src: i, alt: g, crossOrigin: S }),
|
|
74
|
+
/* @__PURE__ */ q(E, {})
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
);
|
|
80
|
+
k.displayName = "CropperTool";
|
|
81
|
+
function z(T) {
|
|
82
|
+
const {
|
|
83
|
+
imageSrc: y,
|
|
84
|
+
initialCrop: i,
|
|
85
|
+
initialZoom: g = 1,
|
|
86
|
+
initialRotation: s = 0,
|
|
87
|
+
cropOptions: e,
|
|
88
|
+
type: r = "base64"
|
|
89
|
+
} = T, [S, p] = t.useState(
|
|
90
|
+
i || { x: 0, y: 0 }
|
|
91
|
+
), [f, w] = t.useState(g), [C, R] = t.useState(s), [u, c] = t.useState(
|
|
92
|
+
null
|
|
93
|
+
), l = t.useRef(null), h = t.useRef(null), o = t.useCallback(
|
|
94
|
+
async (b, m) => {
|
|
95
|
+
if (h.current) {
|
|
96
|
+
const a = h.current;
|
|
97
|
+
if (a.x === m.x && a.y === m.y && a.width === m.width && a.height === m.height)
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
h.current = m, l.current && window.clearTimeout(l.current), l.current = window.setTimeout(async () => {
|
|
101
|
+
try {
|
|
102
|
+
if (r === "blob") {
|
|
103
|
+
const a = await d({
|
|
104
|
+
imageSrc: y,
|
|
105
|
+
pixelCrop: m,
|
|
106
|
+
rotation: C,
|
|
107
|
+
shape: e?.shape,
|
|
108
|
+
format: e?.format,
|
|
109
|
+
quality: e?.quality,
|
|
110
|
+
flip: e?.flip,
|
|
111
|
+
type: "blob"
|
|
112
|
+
});
|
|
113
|
+
c(a);
|
|
114
|
+
} else {
|
|
115
|
+
const a = await d({
|
|
116
|
+
imageSrc: y,
|
|
117
|
+
pixelCrop: m,
|
|
118
|
+
rotation: C,
|
|
119
|
+
shape: e?.shape,
|
|
120
|
+
format: e?.format,
|
|
121
|
+
quality: e?.quality,
|
|
122
|
+
flip: e?.flip,
|
|
123
|
+
type: "base64"
|
|
124
|
+
});
|
|
125
|
+
c(a);
|
|
126
|
+
}
|
|
127
|
+
} catch (a) {
|
|
128
|
+
console.error("Error creating cropped image:", a);
|
|
129
|
+
}
|
|
130
|
+
}, 300);
|
|
131
|
+
},
|
|
132
|
+
[y, C, e, r]
|
|
133
|
+
);
|
|
134
|
+
t.useEffect(() => () => {
|
|
135
|
+
l.current && window.clearTimeout(l.current);
|
|
136
|
+
}, []);
|
|
137
|
+
const n = t.useCallback(() => {
|
|
138
|
+
p(i || { x: 0, y: 0 }), w(g), R(s), c(null);
|
|
139
|
+
}, [i, g, s]);
|
|
140
|
+
return {
|
|
141
|
+
crop: S,
|
|
142
|
+
zoom: f,
|
|
143
|
+
rotation: C,
|
|
144
|
+
croppedImage: u,
|
|
145
|
+
setCrop: p,
|
|
146
|
+
setZoom: w,
|
|
147
|
+
setRotation: R,
|
|
148
|
+
setCroppedImage: c,
|
|
149
|
+
handleCropAreaChange: o,
|
|
150
|
+
reset: n
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
k as CropperTool,
|
|
155
|
+
z as useCropperTool
|
|
156
|
+
};
|
|
157
|
+
//# sourceMappingURL=CropperTool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CropperTool.js","sources":["../../../../src/components/Cropper/CropperTool.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Cropper,\n CropperImage,\n CropperArea,\n type CropperProps,\n type CropperPoint,\n type CropperAreaData,\n} from \"./Cropper\";\nimport { getCroppedImg, type CroppedImageOptions } from \"./utils\";\n\nexport interface CropperToolProps extends Omit<CropperProps, \"onCropComplete\"> {\n /**\n * Image source URL\n */\n src: string;\n /**\n * Alt text for the image\n */\n alt?: string;\n /**\n * Callback when crop is completed with the cropped image as base64 or Blob\n */\n onCropComplete?: (croppedImage: string | Blob) => void;\n /**\n * Callback when crop area changes (for real-time updates)\n */\n onCropAreaChange?: (\n croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData,\n ) => void;\n /**\n * Options for the cropped image output\n */\n cropOptions?: Pick<\n CroppedImageOptions,\n \"format\" | \"quality\" | \"flip\" | \"type\"\n >;\n /**\n * Cross-origin setting for the image\n */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\n/**\n * A higher-level Cropper component that handles image cropping automatically\n * and returns the cropped image as base64 data URL or Blob.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * onCropComplete={(base64) => {\n * console.log('Cropped image:', base64);\n * }}\n * />\n *\n * // Get Blob output\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * cropOptions={{ type: 'blob' }}\n * onCropComplete={(blob) => {\n * console.log('Cropped image blob:', blob);\n * }}\n * />\n * ```\n */\nexport const CropperTool = React.forwardRef<HTMLDivElement, CropperToolProps>(\n (props, ref) => {\n const {\n src,\n alt = \"Crop image\",\n onCropComplete,\n onCropAreaChange,\n cropOptions = {},\n crossOrigin = \"anonymous\",\n rotation = 0,\n shape = \"rectangle\",\n ...cropperProps\n } = props;\n\n // State to manage crop position\n const [crop, setCrop] = React.useState<CropperPoint>({ x: 0, y: 0 });\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData,\n ) => {\n // Call the user's onCropAreaChange if provided\n onCropAreaChange?.(_croppedArea, croppedAreaPixels);\n\n if (!onCropComplete) return;\n\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n const outputType = cropOptions.type || \"base64\";\n\n if (outputType === \"blob\") {\n const croppedBlob = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"blob\",\n });\n onCropComplete(croppedBlob);\n } else {\n const croppedImageBase64 = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"base64\",\n });\n onCropComplete(croppedImageBase64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [src, rotation, shape, cropOptions, onCropComplete, onCropAreaChange],\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n return (\n <Cropper\n ref={ref}\n {...cropperProps}\n crop={crop}\n rotation={rotation}\n shape={shape}\n onCropChange={setCrop}\n onCropAreaChange={handleCropAreaChange}\n >\n <CropperImage src={src} alt={alt} crossOrigin={crossOrigin} />\n <CropperArea />\n </Cropper>\n );\n },\n);\n\nCropperTool.displayName = \"CropperTool\";\n\nexport interface UseCropperToolOptions {\n /**\n * Image source URL\n */\n imageSrc: string;\n /**\n * Initial crop position\n */\n initialCrop?: CropperPoint;\n /**\n * Initial zoom level\n */\n initialZoom?: number;\n /**\n * Initial rotation angle\n */\n initialRotation?: number;\n /**\n * Crop options (shape, format, quality, type, etc.)\n */\n cropOptions?: Omit<CroppedImageOptions, \"imageSrc\" | \"pixelCrop\">;\n /**\n * Output type: 'base64' for data URL (default) or 'blob' for Blob object\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Hook to easily handle cropping logic in your components.\n * Automatically handles crop area changes and generates cropped images.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * const {\n * crop,\n * zoom,\n * rotation,\n * setCrop,\n * setZoom,\n * setRotation,\n * croppedImage,\n * handleCropAreaChange,\n * reset\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * // Get Blob output\n * const {\n * croppedImage, // This will be a Blob\n * ...rest\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * type: \"blob\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * return (\n * <div>\n * <Cropper\n * crop={crop}\n * zoom={zoom}\n * rotation={rotation}\n * onCropChange={setCrop}\n * onZoomChange={setZoom}\n * onCropAreaChange={handleCropAreaChange}\n * >\n * <CropperImage src={imageSrc} />\n * <CropperArea />\n * </Cropper>\n * {croppedImage && typeof croppedImage === 'string' && (\n * <img src={croppedImage} alt=\"Cropped\" />\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCropperTool(options: UseCropperToolOptions) {\n const {\n imageSrc,\n initialCrop,\n initialZoom = 1,\n initialRotation = 0,\n cropOptions,\n type = \"base64\",\n } = options;\n\n const [crop, setCrop] = React.useState<CropperPoint>(\n initialCrop || { x: 0, y: 0 },\n );\n const [zoom, setZoom] = React.useState(initialZoom);\n const [rotation, setRotation] = React.useState(initialRotation);\n const [croppedImage, setCroppedImage] = React.useState<string | Blob | null>(\n null,\n );\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData,\n ) => {\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer to debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n if (type === \"blob\") {\n const blob = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"blob\",\n });\n setCroppedImage(blob);\n } else {\n const base64 = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"base64\",\n });\n setCroppedImage(base64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [imageSrc, rotation, cropOptions, type],\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n const reset = React.useCallback(() => {\n setCrop(initialCrop || { x: 0, y: 0 });\n setZoom(initialZoom);\n setRotation(initialRotation);\n setCroppedImage(null);\n }, [initialCrop, initialZoom, initialRotation]);\n\n return {\n crop,\n zoom,\n rotation,\n croppedImage,\n setCrop,\n setZoom,\n setRotation,\n setCroppedImage,\n handleCropAreaChange,\n reset,\n };\n}\n"],"names":["CropperTool","React","props","ref","src","alt","onCropComplete","onCropAreaChange","cropOptions","crossOrigin","rotation","shape","cropperProps","crop","setCrop","debounceTimerRef","prevCropAreaRef","handleCropAreaChange","_croppedArea","croppedAreaPixels","prev","croppedBlob","getCroppedImg","croppedImageBase64","error","jsxs","Cropper","jsx","CropperImage","CropperArea","useCropperTool","options","imageSrc","initialCrop","initialZoom","initialRotation","type","zoom","setZoom","setRotation","croppedImage","setCroppedImage","blob","base64","reset"],"mappings":"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"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
async function A(a) {
|
|
2
|
+
const {
|
|
3
|
+
imageSrc: e,
|
|
4
|
+
pixelCrop: t,
|
|
5
|
+
rotation: o = 0,
|
|
6
|
+
shape: r = "rectangle",
|
|
7
|
+
format: c = "image/png",
|
|
8
|
+
quality: h = 0.92,
|
|
9
|
+
flip: d = {},
|
|
10
|
+
type: R = "base64"
|
|
11
|
+
} = a;
|
|
12
|
+
let n;
|
|
13
|
+
typeof e == "string" ? n = await P(e) : n = e;
|
|
14
|
+
const g = E(o), x = Math.abs(Math.sin(g)), y = Math.abs(Math.cos(g)), w = n.width * y + n.height * x, u = n.width * x + n.height * y, m = document.createElement("canvas"), l = m.getContext("2d");
|
|
15
|
+
if (!l)
|
|
16
|
+
throw new Error("Failed to get canvas 2D context");
|
|
17
|
+
if (m.width = w, m.height = u, l.translate(w / 2, u / 2), l.rotate(g), d.horizontal || d.vertical) {
|
|
18
|
+
const M = d.horizontal ? -1 : 1, f = d.vertical ? -1 : 1;
|
|
19
|
+
l.scale(M, f);
|
|
20
|
+
}
|
|
21
|
+
l.drawImage(
|
|
22
|
+
n,
|
|
23
|
+
-n.width / 2,
|
|
24
|
+
-n.height / 2,
|
|
25
|
+
n.width,
|
|
26
|
+
n.height
|
|
27
|
+
);
|
|
28
|
+
const i = document.createElement("canvas"), s = i.getContext("2d", { alpha: !0 });
|
|
29
|
+
if (!s)
|
|
30
|
+
throw new Error("Failed to get canvas 2D context");
|
|
31
|
+
i.width = t.width, i.height = t.height, s.clearRect(0, 0, i.width, i.height);
|
|
32
|
+
const v = Math.max(0, t.x), C = Math.max(0, t.y), p = Math.min(
|
|
33
|
+
t.width - Math.max(0, -t.x),
|
|
34
|
+
// Reduce width if crop starts before image
|
|
35
|
+
w - v
|
|
36
|
+
// Don't exceed image right edge
|
|
37
|
+
), b = Math.min(
|
|
38
|
+
t.height - Math.max(0, -t.y),
|
|
39
|
+
// Reduce height if crop starts before image
|
|
40
|
+
u - C
|
|
41
|
+
// Don't exceed image bottom edge
|
|
42
|
+
), F = Math.max(0, -t.x), B = Math.max(0, -t.y);
|
|
43
|
+
return p > 0 && b > 0 && s.drawImage(
|
|
44
|
+
m,
|
|
45
|
+
v,
|
|
46
|
+
C,
|
|
47
|
+
p,
|
|
48
|
+
b,
|
|
49
|
+
F,
|
|
50
|
+
B,
|
|
51
|
+
p,
|
|
52
|
+
b
|
|
53
|
+
), r === "circle" && (s.globalCompositeOperation = "destination-in", s.beginPath(), s.arc(
|
|
54
|
+
i.width / 2,
|
|
55
|
+
i.height / 2,
|
|
56
|
+
Math.min(i.width, i.height) / 2,
|
|
57
|
+
0,
|
|
58
|
+
Math.PI * 2
|
|
59
|
+
), s.fill()), R === "blob" ? new Promise((M, f) => {
|
|
60
|
+
i.toBlob(
|
|
61
|
+
(I) => {
|
|
62
|
+
I ? M(I) : f(new Error("Failed to create blob from canvas"));
|
|
63
|
+
},
|
|
64
|
+
c,
|
|
65
|
+
h
|
|
66
|
+
);
|
|
67
|
+
}) : i.toDataURL(c, h);
|
|
68
|
+
}
|
|
69
|
+
function P(a) {
|
|
70
|
+
return new Promise((e, t) => {
|
|
71
|
+
const o = new Image();
|
|
72
|
+
o.crossOrigin = "anonymous", o.onload = () => e(o), o.onerror = (r) => t(new Error(`Failed to load image: ${r}`)), o.src = a;
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
function E(a) {
|
|
76
|
+
return a * Math.PI / 180;
|
|
77
|
+
}
|
|
78
|
+
function D(a, e, t) {
|
|
79
|
+
const o = E(t), r = Math.cos(o), c = Math.sin(o);
|
|
80
|
+
return {
|
|
81
|
+
width: Math.abs(r * a) + Math.abs(c * e),
|
|
82
|
+
height: Math.abs(c * a) + Math.abs(r * e)
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function X(a, e = "cropped-image.jpg") {
|
|
86
|
+
const t = document.createElement("a");
|
|
87
|
+
t.href = a, t.download = e, document.body.appendChild(t), t.click(), document.body.removeChild(t);
|
|
88
|
+
}
|
|
89
|
+
function z(a) {
|
|
90
|
+
const e = a.split(","), t = e[0]?.match(/:(.*?);/), o = t ? t[1] : "image/jpeg", r = atob(e[1] ?? "");
|
|
91
|
+
let c = r.length;
|
|
92
|
+
const h = new Uint8Array(c);
|
|
93
|
+
for (; c--; )
|
|
94
|
+
h[c] = r.charCodeAt(c);
|
|
95
|
+
return new Blob([h], { type: o });
|
|
96
|
+
}
|
|
97
|
+
function Y(a, e) {
|
|
98
|
+
const t = z(a);
|
|
99
|
+
return new File([t], e, { type: t.type });
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
z as base64ToBlob,
|
|
103
|
+
Y as base64ToFile,
|
|
104
|
+
X as downloadImage,
|
|
105
|
+
A as getCroppedImg,
|
|
106
|
+
D as rotateSize
|
|
107
|
+
};
|
|
108
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../src/components/Cropper/utils.ts"],"sourcesContent":["/**\n * Utility functions for Cropper component\n */\n\nexport interface CroppedImageOptions {\n /**\n * The source image URL or HTMLImageElement\n */\n imageSrc: string | HTMLImageElement;\n /**\n * Pixel coordinates of the cropped area\n */\n pixelCrop: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /**\n * Rotation angle in degrees\n */\n rotation?: number;\n /**\n * Shape of the crop area\n */\n shape?: \"rectangle\" | \"circle\";\n /**\n * Output image format (default: 'image/png')\n */\n format?: \"image/jpeg\" | \"image/png\" | \"image/webp\";\n /**\n * Quality of the output image (0-1, default: 0.92)\n */\n quality?: number;\n /**\n * Flip the image horizontally\n */\n flip?: {\n horizontal?: boolean;\n vertical?: boolean;\n };\n /**\n * Output type: 'base64' (data URL) or 'blob' (Blob object)\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Creates a cropped image from the given parameters and returns it as a base64 data URL or Blob\n *\n * @param options - Options for creating the cropped image\n * @returns Promise that resolves to a base64 data URL string or Blob based on the type option\n *\n * @example\n * ```tsx\n * // Get base64 data URL (default)\n * const croppedImageBase64 = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * rotation: 45,\n * shape: 'circle',\n * format: 'image/png',\n * quality: 0.95\n * });\n *\n * // Get Blob\n * const croppedImageBlob = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * type: 'blob'\n * });\n * ```\n */\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type: \"blob\" },\n): Promise<Blob>;\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type?: \"base64\" },\n): Promise<string>;\nexport async function getCroppedImg(\n options: CroppedImageOptions,\n): Promise<string | Blob> {\n const {\n imageSrc,\n pixelCrop,\n rotation = 0,\n shape = \"rectangle\",\n format = \"image/png\",\n quality = 0.92,\n flip = {},\n type = \"base64\",\n } = options;\n\n // Load image if URL is provided\n let image: HTMLImageElement;\n if (typeof imageSrc === \"string\") {\n image = await loadImage(imageSrc);\n } else {\n image = imageSrc;\n }\n\n const rotRad = getRadianAngle(rotation);\n const sin = Math.abs(Math.sin(rotRad));\n const cos = Math.abs(Math.cos(rotRad));\n\n // Calculate bounding box of rotated image\n const bBoxWidth = image.width * cos + image.height * sin;\n const bBoxHeight = image.width * sin + image.height * cos;\n\n // Step 1: Create a canvas for the rotated full image\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\");\n\n if (!tempCtx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n // Set temp canvas to bounding box size\n tempCanvas.width = bBoxWidth;\n tempCanvas.height = bBoxHeight;\n\n // Translate to center\n tempCtx.translate(bBoxWidth / 2, bBoxHeight / 2);\n\n // Rotate\n tempCtx.rotate(rotRad);\n\n // Apply flip if needed\n if (flip.horizontal || flip.vertical) {\n const scaleX = flip.horizontal ? -1 : 1;\n const scaleY = flip.vertical ? -1 : 1;\n tempCtx.scale(scaleX, scaleY);\n }\n\n // Draw image centered\n tempCtx.drawImage(\n image,\n -image.width / 2,\n -image.height / 2,\n image.width,\n image.height,\n );\n\n // Step 2: Create output canvas and crop from temp canvas\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: true });\n\n if (!ctx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n\n // Clear canvas to ensure transparency (important for PNG output)\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Handle overflow: calculate the valid area to draw\n // When pixelCrop.x or y is negative, it means the crop area extends beyond the image\n const sourceX = Math.max(0, pixelCrop.x);\n const sourceY = Math.max(0, pixelCrop.y);\n\n // Calculate how much of the crop area is actually within the image bounds\n const sourceWidth = Math.min(\n pixelCrop.width - Math.max(0, -pixelCrop.x), // Reduce width if crop starts before image\n bBoxWidth - sourceX, // Don't exceed image right edge\n );\n const sourceHeight = Math.min(\n pixelCrop.height - Math.max(0, -pixelCrop.y), // Reduce height if crop starts before image\n bBoxHeight - sourceY, // Don't exceed image bottom edge\n );\n\n // Calculate where to place the cropped portion on the output canvas\n // If crop area extends beyond image (negative x/y), offset the destination\n const destX = Math.max(0, -pixelCrop.x);\n const destY = Math.max(0, -pixelCrop.y);\n\n // Only draw if there's a valid area to draw\n if (sourceWidth > 0 && sourceHeight > 0) {\n ctx.drawImage(\n tempCanvas,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n destX,\n destY,\n sourceWidth,\n sourceHeight,\n );\n }\n\n // Apply circular mask if shape is circle\n if (shape === \"circle\") {\n ctx.globalCompositeOperation = \"destination-in\";\n ctx.beginPath();\n ctx.arc(\n canvas.width / 2,\n canvas.height / 2,\n Math.min(canvas.width, canvas.height) / 2,\n 0,\n Math.PI * 2,\n );\n ctx.fill();\n }\n\n // Return as blob or base64 based on type\n if (type === \"blob\") {\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n format,\n quality,\n );\n });\n }\n\n // Convert to base64\n return canvas.toDataURL(format, quality);\n}\n\n/**\n * Load an image from URL\n */\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n\n image.onload = () => resolve(image);\n image.onerror = (error) =>\n reject(new Error(`Failed to load image: ${error}`));\n\n image.src = url;\n });\n}\n\n/**\n * Convert degrees to radians\n */\nfunction getRadianAngle(degreeValue: number): number {\n return (degreeValue * Math.PI) / 180;\n}\n\n/**\n * Calculate the rotated size of a rectangle\n *\n * @param width - Original width\n * @param height - Original height\n * @param rotation - Rotation angle in degrees\n * @returns Rotated size dimensions\n */\nexport function rotateSize(\n width: number,\n height: number,\n rotation: number,\n): { width: number; height: number } {\n const rotRad = getRadianAngle(rotation);\n const cosRot = Math.cos(rotRad);\n const sinRot = Math.sin(rotRad);\n\n return {\n width: Math.abs(cosRot * width) + Math.abs(sinRot * height),\n height: Math.abs(sinRot * width) + Math.abs(cosRot * height),\n };\n}\n\n/**\n * Download a base64 image\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename (default: 'cropped-image.jpg')\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * downloadImage(croppedImage, 'my-cropped-image.png');\n * ```\n */\nexport function downloadImage(\n base64Data: string,\n filename: string = \"cropped-image.jpg\",\n): void {\n const link = document.createElement(\"a\");\n link.href = base64Data;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\n/**\n * Convert base64 data URL to Blob\n *\n * @param base64Data - Base64 data URL\n * @returns Blob object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const blob = base64ToBlob(croppedImage);\n * ```\n */\nexport function base64ToBlob(base64Data: string): Blob {\n const arr = base64Data.split(\",\");\n const mimeMatch = arr[0]?.match(/:(.*?);/);\n const mime = mimeMatch ? mimeMatch[1] : \"image/jpeg\";\n const bstr = atob(arr[1] ?? \"\");\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\n/**\n * Convert base64 data URL to File\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename\n * @returns File object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const file = base64ToFile(croppedImage, 'cropped-image.jpg');\n * ```\n */\nexport function base64ToFile(base64Data: string, filename: string): File {\n const blob = base64ToBlob(base64Data);\n return new File([blob], filename, { type: blob.type });\n}\n"],"names":["getCroppedImg","options","imageSrc","pixelCrop","rotation","shape","format","quality","flip","type","image","loadImage","rotRad","getRadianAngle","sin","cos","bBoxWidth","bBoxHeight","tempCanvas","tempCtx","scaleX","scaleY","canvas","ctx","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","resolve","reject","blob","url","error","degreeValue","rotateSize","width","height","cosRot","sinRot","downloadImage","base64Data","filename","link","base64ToBlob","arr","mimeMatch","mime","bstr","n","u8arr","base64ToFile"],"mappings":"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"}
|