@sth87/shadcn-design-system 0.0.36 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/AI_CONTEXT.md +212 -214
- package/dist/cjs/components/Accordion/Accordion.cjs +1 -1
- package/dist/cjs/components/Accordion/Accordion.cjs.map +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs +1 -1
- package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -1
- package/dist/cjs/components/Badge/Badge.cjs +1 -1
- package/dist/cjs/components/Badge/Badge.cjs.map +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +1 -1
- package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +1 -1
- package/dist/cjs/components/Button/Button.cjs +1 -1
- package/dist/cjs/components/Button/Button.cjs.map +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs +1 -1
- package/dist/cjs/components/Calendar/Calendar.cjs.map +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs +1 -1
- package/dist/cjs/components/Carousel/Carousel.cjs.map +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -1
- package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs +1 -1
- package/dist/cjs/components/Collapsible/Collapsible.cjs.map +1 -1
- package/dist/cjs/components/Command/Command.cjs +1 -1
- package/dist/cjs/components/Command/Command.cjs.map +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs +1 -1
- package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs +1 -1
- package/dist/cjs/components/Cropper/Cropper.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/RangePicker.cjs.map +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -1
- package/dist/cjs/components/DatePicker/TimePicker.cjs.map +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs +1 -1
- package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +1 -1
- package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -1
- package/dist/cjs/components/FloatLabel.cjs +1 -1
- package/dist/cjs/components/FloatLabel.cjs.map +1 -1
- package/dist/cjs/components/Glass/Glass.cjs +1 -1
- package/dist/cjs/components/Glass/Glass.cjs.map +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -1
- package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +1 -1
- package/dist/cjs/components/Input/Input.cjs +1 -1
- package/dist/cjs/components/Input/Input.cjs.map +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -1
- package/dist/cjs/components/InputOTP/InputOTP.cjs.map +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -1
- package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs +1 -1
- package/dist/cjs/components/Marquee/Marquee.cjs.map +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs +1 -1
- package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs +1 -1
- package/dist/cjs/components/QrCode/QrCode.cjs.map +1 -1
- package/dist/cjs/components/Radio/Radio.cjs +1 -1
- package/dist/cjs/components/Radio/Radio.cjs.map +1 -1
- package/dist/cjs/components/Rate/Rate.cjs +1 -1
- package/dist/cjs/components/Rate/Rate.cjs.map +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs +1 -1
- package/dist/cjs/components/Resizable/Resizable.cjs.map +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs +1 -1
- package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -1
- package/dist/cjs/components/Select/Select.cjs +1 -1
- package/dist/cjs/components/Select/Select.cjs.map +1 -1
- package/dist/cjs/components/Sheet/Sheet.cjs +2 -2
- package/dist/cjs/components/Sheet/Sheet.cjs.map +1 -1
- package/dist/cjs/components/Slider/Slider.cjs +1 -1
- package/dist/cjs/components/Slider/Slider.cjs.map +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs +1 -1
- package/dist/cjs/components/Stepper/Stepper.cjs.map +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -1
- package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +1 -1
- package/dist/cjs/components/Switch/Switch.cjs +1 -1
- package/dist/cjs/components/Switch/Switch.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -1
- package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs +1 -1
- package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs +1 -1
- package/dist/cjs/components/Table/data-table-pagination.cjs.map +1 -1
- package/dist/cjs/components/Table/data-table.cjs +1 -1
- package/dist/cjs/components/Table/data-table.cjs.map +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs +1 -1
- package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -1
- package/dist/cjs/components/Tabs/classes.cjs +1 -1
- package/dist/cjs/components/Tabs/classes.cjs.map +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs +1 -1
- package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -1
- package/dist/cjs/components/TimeGridView.cjs +1 -1
- package/dist/cjs/components/TimeGridView.cjs.map +1 -1
- package/dist/cjs/components/Toast/Toast.cjs +1 -1
- package/dist/cjs/components/Toast/Toast.cjs.map +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -1
- package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -1
- package/dist/cjs/components/Tour/Tour.cjs +1 -1
- package/dist/cjs/components/Tour/Tour.cjs.map +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs +1 -1
- package/dist/cjs/components/Tour/TourWrapper.cjs.map +1 -1
- package/dist/cjs/components/Upload/Upload.cjs +3 -3
- package/dist/cjs/components/Upload/Upload.cjs.map +1 -1
- package/dist/cjs/components/WheelColumn.cjs +1 -1
- package/dist/cjs/components/WheelColumn.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +2 -2
- package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs +1 -1
- package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +1 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +1 -0
- package/dist/cjs/packages/ui/src/components/accordion.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/accordion.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/avatar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/badge.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/button.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/calendar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/combobox.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/command.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dialog.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/drawer.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/input.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/label.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/pagination.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/popover.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/resizable.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/select.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/separator.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sheet.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/switch.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/table.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tabs.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/textarea.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/toggle.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs +1 -1
- package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +1 -1
- package/dist/cjs/styles/index.css +1 -1
- package/dist/cjs/utils/animations.cjs +1 -1
- package/dist/cjs/utils/animations.cjs.map +1 -1
- package/dist/cjs/utils/css.cjs +1 -1
- package/dist/cjs/utils/css.cjs.map +1 -1
- package/dist/cjs/utils/parsers.cjs +1 -1
- package/dist/cjs/utils/parsers.cjs.map +1 -1
- package/dist/esm/components/Accordion/Accordion.js +60 -60
- package/dist/esm/components/Accordion/Accordion.js.map +1 -1
- package/dist/esm/components/Avatar/Avatar.js +40 -40
- package/dist/esm/components/Avatar/Avatar.js.map +1 -1
- package/dist/esm/components/Badge/Badge.js +1 -1
- package/dist/esm/components/Badge/Badge.js.map +1 -1
- package/dist/esm/components/Breadcrumb/Breadcrumb.js +36 -36
- package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -1
- package/dist/esm/components/Button/Button.js +9 -9
- package/dist/esm/components/Button/Button.js.map +1 -1
- package/dist/esm/components/Calendar/Calendar.js +4 -4
- package/dist/esm/components/Calendar/Calendar.js.map +1 -1
- package/dist/esm/components/Carousel/Carousel.js +165 -165
- package/dist/esm/components/Carousel/Carousel.js.map +1 -1
- package/dist/esm/components/Checkbox/Checkbox.js +26 -26
- package/dist/esm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/esm/components/Collapsible/Collapsible.js +43 -43
- package/dist/esm/components/Collapsible/Collapsible.js.map +1 -1
- package/dist/esm/components/Command/Command.js +28 -28
- package/dist/esm/components/Command/Command.js.map +1 -1
- package/dist/esm/components/ContextMenu/ContextMenu.js +11 -11
- package/dist/esm/components/ContextMenu/ContextMenu.js.map +1 -1
- package/dist/esm/components/Cropper/Cropper.js +132 -132
- package/dist/esm/components/Cropper/Cropper.js.map +1 -1
- package/dist/esm/components/DatePicker/DatePicker.js +75 -75
- package/dist/esm/components/DatePicker/DatePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/RangePicker.js +136 -136
- package/dist/esm/components/DatePicker/RangePicker.js.map +1 -1
- package/dist/esm/components/DatePicker/TimePicker.js +150 -150
- package/dist/esm/components/DatePicker/TimePicker.js.map +1 -1
- package/dist/esm/components/Dialog/Dialog.js +114 -114
- package/dist/esm/components/Dialog/Dialog.js.map +1 -1
- package/dist/esm/components/DropdownMenu/DropdownMenu.js +13 -13
- package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +1 -1
- package/dist/esm/components/FloatLabel.js +44 -44
- package/dist/esm/components/FloatLabel.js.map +1 -1
- package/dist/esm/components/Glass/Glass.js +15 -15
- package/dist/esm/components/Glass/Glass.js.map +1 -1
- package/dist/esm/components/ImageViewer/ImageViewer.js +53 -53
- package/dist/esm/components/ImageViewer/ImageViewer.js.map +1 -1
- package/dist/esm/components/Input/Input.js +104 -104
- package/dist/esm/components/Input/Input.js.map +1 -1
- package/dist/esm/components/InputOTP/InputOTP.js +16 -16
- package/dist/esm/components/InputOTP/InputOTP.js.map +1 -1
- package/dist/esm/components/Interactive/CursorFollow.js +49 -49
- package/dist/esm/components/Interactive/CursorFollow.js.map +1 -1
- package/dist/esm/components/Marquee/Marquee.js +130 -130
- package/dist/esm/components/Marquee/Marquee.js.map +1 -1
- package/dist/esm/components/Pagination/Pagination.js +68 -68
- package/dist/esm/components/Pagination/Pagination.js.map +1 -1
- package/dist/esm/components/QrCode/QrCode.js +37 -37
- package/dist/esm/components/QrCode/QrCode.js.map +1 -1
- package/dist/esm/components/Radio/Radio.js +16 -16
- package/dist/esm/components/Radio/Radio.js.map +1 -1
- package/dist/esm/components/Rate/Rate.js +62 -62
- package/dist/esm/components/Rate/Rate.js.map +1 -1
- package/dist/esm/components/Resizable/Resizable.js +6 -6
- package/dist/esm/components/Resizable/Resizable.js.map +1 -1
- package/dist/esm/components/ScrollArea/ScrollArea.js +10 -10
- package/dist/esm/components/ScrollArea/ScrollArea.js.map +1 -1
- package/dist/esm/components/Select/Select.js +64 -64
- package/dist/esm/components/Select/Select.js.map +1 -1
- package/dist/esm/components/Sheet/Sheet.js +21 -21
- package/dist/esm/components/Sheet/Sheet.js.map +1 -1
- package/dist/esm/components/Slider/Slider.js +54 -54
- package/dist/esm/components/Slider/Slider.js.map +1 -1
- package/dist/esm/components/Stepper/Stepper.js +198 -198
- package/dist/esm/components/Stepper/Stepper.js.map +1 -1
- package/dist/esm/components/Stepper/StepperWrapper.js +15 -15
- package/dist/esm/components/Stepper/StepperWrapper.js.map +1 -1
- package/dist/esm/components/Switch/Switch.js +38 -38
- package/dist/esm/components/Switch/Switch.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +37 -37
- package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +25 -25
- package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -1
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +64 -64
- package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -1
- package/dist/esm/components/Table/data-table-column-header.js +18 -18
- package/dist/esm/components/Table/data-table-column-header.js.map +1 -1
- package/dist/esm/components/Table/data-table-pagination.js +21 -21
- package/dist/esm/components/Table/data-table-pagination.js.map +1 -1
- package/dist/esm/components/Table/data-table.js +18 -18
- package/dist/esm/components/Table/data-table.js.map +1 -1
- package/dist/esm/components/Tabs/Tabs.js +242 -242
- package/dist/esm/components/Tabs/Tabs.js.map +1 -1
- package/dist/esm/components/Tabs/classes.js +51 -51
- package/dist/esm/components/Tabs/classes.js.map +1 -1
- package/dist/esm/components/Textarea/Textarea.js +49 -49
- package/dist/esm/components/Textarea/Textarea.js.map +1 -1
- package/dist/esm/components/TimeGridView.js +12 -12
- package/dist/esm/components/TimeGridView.js.map +1 -1
- package/dist/esm/components/Toast/Toast.js +45 -45
- package/dist/esm/components/Toast/Toast.js.map +1 -1
- package/dist/esm/components/Tooltip/Tooltip.js +19 -19
- package/dist/esm/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/esm/components/Tour/Tour.js +11 -11
- package/dist/esm/components/Tour/Tour.js.map +1 -1
- package/dist/esm/components/Tour/TourWrapper.js +15 -15
- package/dist/esm/components/Tour/TourWrapper.js.map +1 -1
- package/dist/esm/components/Upload/Upload.js +405 -405
- package/dist/esm/components/Upload/Upload.js.map +1 -1
- package/dist/esm/components/WheelColumn.js +47 -47
- package/dist/esm/components/WheelColumn.js.map +1 -1
- package/dist/esm/lib/TextAnimation/BlurText.js +18 -18
- package/dist/esm/lib/TextAnimation/BlurText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/CircularText.js +7 -7
- package/dist/esm/lib/TextAnimation/CircularText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/FlipWords.js +21 -21
- package/dist/esm/lib/TextAnimation/FlipWords.js.map +1 -1
- package/dist/esm/lib/TextAnimation/GradientText.js +4 -4
- package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RollingText.js +24 -24
- package/dist/esm/lib/TextAnimation/RollingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/RotatingText.js +6 -6
- package/dist/esm/lib/TextAnimation/RotatingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/ShimmeringText.js +9 -9
- package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +14 -14
- package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js +9 -9
- package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js +3 -3
- package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +1 -1
- package/dist/esm/lib/TextAnimation/TypingText.js +17 -17
- package/dist/esm/lib/TextAnimation/TypingText.js.map +1 -1
- package/dist/esm/lib/TextAnimation/WritingText.js +10 -10
- package/dist/esm/lib/TextAnimation/WritingText.js.map +1 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +1 -0
- package/dist/esm/packages/ui/src/components/accordion.js +31 -31
- package/dist/esm/packages/ui/src/components/accordion.js.map +1 -1
- package/dist/esm/packages/ui/src/components/alert-dialog.js +33 -33
- package/dist/esm/packages/ui/src/components/alert-dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/avatar.js +20 -20
- package/dist/esm/packages/ui/src/components/avatar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/badge.js +53 -53
- package/dist/esm/packages/ui/src/components/badge.js.map +1 -1
- package/dist/esm/packages/ui/src/components/breadcrumb.js +20 -20
- package/dist/esm/packages/ui/src/components/breadcrumb.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button-group.js +31 -31
- package/dist/esm/packages/ui/src/components/button-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/button.js +90 -90
- package/dist/esm/packages/ui/src/components/button.js.map +1 -1
- package/dist/esm/packages/ui/src/components/calendar.js +94 -94
- package/dist/esm/packages/ui/src/components/calendar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/checkbox.js +47 -47
- package/dist/esm/packages/ui/src/components/checkbox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/combobox.js +64 -64
- package/dist/esm/packages/ui/src/components/combobox.js.map +1 -1
- package/dist/esm/packages/ui/src/components/command.js +77 -77
- package/dist/esm/packages/ui/src/components/command.js.map +1 -1
- package/dist/esm/packages/ui/src/components/context-menu.js +76 -76
- package/dist/esm/packages/ui/src/components/context-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dialog.js +54 -54
- package/dist/esm/packages/ui/src/components/dialog.js.map +1 -1
- package/dist/esm/packages/ui/src/components/drawer.js +39 -39
- package/dist/esm/packages/ui/src/components/drawer.js.map +1 -1
- package/dist/esm/packages/ui/src/components/dropdown-menu.js +109 -109
- package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input-otp.js +30 -30
- package/dist/esm/packages/ui/src/components/input-otp.js.map +1 -1
- package/dist/esm/packages/ui/src/components/input.js +19 -19
- package/dist/esm/packages/ui/src/components/input.js.map +1 -1
- package/dist/esm/packages/ui/src/components/label.js +9 -9
- package/dist/esm/packages/ui/src/components/label.js.map +1 -1
- package/dist/esm/packages/ui/src/components/pagination.js +26 -26
- package/dist/esm/packages/ui/src/components/pagination.js.map +1 -1
- package/dist/esm/packages/ui/src/components/popover.js +13 -13
- package/dist/esm/packages/ui/src/components/popover.js.map +1 -1
- package/dist/esm/packages/ui/src/components/radio-group.js +45 -45
- package/dist/esm/packages/ui/src/components/radio-group.js.map +1 -1
- package/dist/esm/packages/ui/src/components/resizable.js +18 -18
- package/dist/esm/packages/ui/src/components/resizable.js.map +1 -1
- package/dist/esm/packages/ui/src/components/scroll-area.js +31 -31
- package/dist/esm/packages/ui/src/components/scroll-area.js.map +1 -1
- package/dist/esm/packages/ui/src/components/select.js +119 -119
- package/dist/esm/packages/ui/src/components/select.js.map +1 -1
- package/dist/esm/packages/ui/src/components/separator.js +86 -86
- package/dist/esm/packages/ui/src/components/separator.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sheet.js +50 -50
- package/dist/esm/packages/ui/src/components/sheet.js.map +1 -1
- package/dist/esm/packages/ui/src/components/sidebar.js +198 -198
- package/dist/esm/packages/ui/src/components/sidebar.js.map +1 -1
- package/dist/esm/packages/ui/src/components/skeleton.js +3 -3
- package/dist/esm/packages/ui/src/components/skeleton.js.map +1 -1
- package/dist/esm/packages/ui/src/components/switch.js +57 -57
- package/dist/esm/packages/ui/src/components/switch.js.map +1 -1
- package/dist/esm/packages/ui/src/components/table.js +17 -17
- package/dist/esm/packages/ui/src/components/table.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tabs.js +33 -33
- package/dist/esm/packages/ui/src/components/tabs.js.map +1 -1
- package/dist/esm/packages/ui/src/components/textarea.js +17 -17
- package/dist/esm/packages/ui/src/components/textarea.js.map +1 -1
- package/dist/esm/packages/ui/src/components/toggle.js +36 -36
- package/dist/esm/packages/ui/src/components/toggle.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tooltip.js +20 -20
- package/dist/esm/packages/ui/src/components/tooltip.js.map +1 -1
- package/dist/esm/packages/ui/src/components/tree-view.js +218 -218
- package/dist/esm/packages/ui/src/components/tree-view.js.map +1 -1
- package/dist/esm/styles/index.css +1 -1
- package/dist/esm/utils/animations.js +55 -55
- package/dist/esm/utils/animations.js.map +1 -1
- package/dist/esm/utils/css.js +7 -7
- package/dist/esm/utils/css.js.map +1 -1
- package/dist/esm/utils/parsers.js +1 -1
- package/dist/types/components/DatePicker/RangePicker.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts.map +1 -1
- package/dist/types/lib/TextAnimation/TypingText.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs.map +0 -1
- package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js.map +0 -1
- /package/dist/cjs/node_modules/.pnpm/{nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.cjs +0 -0
- /package/dist/esm/node_modules/.pnpm/{nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1 → nuqs@2.8.0_next@15.5.9_@babel_core@7.28.5_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1}/node_modules/nuqs/dist/server.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"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 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 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,\n 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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"}
|
|
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(\"ds:relative ds:size-full ds: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 \"ds:absolute ds:inset-0 ds:flex ds:cursor-move ds:touch-none ds:select-none ds:items-center ds:justify-center ds:overflow-hidden ds:outline-none\",\n className\n )}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n />\n );\n}\n\nconst cropperMediaVariants = cva(\"ds:will-change-transform\", {\n variants: {\n objectFit: {\n contain: \"ds:absolute ds:inset-0 ds:m-auto ds:max-h-full ds:max-w-full\",\n cover: \"ds:h-auto ds:w-full\",\n \"horizontal-cover\": \"ds:h-auto ds:w-full\",\n \"vertical-cover\": \"ds:h-full ds: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 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 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 \"ds:-translate-x-1/2 ds:-translate-y-1/2 ds:absolute ds:top-1/2 ds:left-1/2 ds:box-border ds:overflow-hidden ds:border ds:border-[2.5px] ds:border-white/90 ds:shadow-[0_0_0_9999em_rgba(0,0,0,0.5)]\",\n {\n variants: {\n shape: {\n rectangle: \"\",\n circle: \"ds:rounded-full\",\n },\n withGrid: {\n true: \"ds:before:absolute ds:before:top-0 ds:before:right-1/3 ds:before:bottom-0 ds:before:left-1/3 ds:before:box-border ds:before:border ds:before:border-white/50 ds:before:border-t-0 ds:before:border-b-0 ds:before:content-[''] ds:after:absolute ds:after:top-1/3 ds:after:right-0 ds:after:bottom-1/3 ds:after:left-0 ds:after:box-border ds:after:border ds:after:border-white/50 ds:after:border-r-0 ds:after:border-l-0 ds:after:content-['']\",\n false: \"\",\n },\n },\n defaultVariants: {\n shape: \"rectangle\",\n withGrid: false,\n },\n }\n);\n\ninterface CropperAreaProps\n extends DivProps,\n 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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"}
|