@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,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const W=require("react/jsx-runtime"),ce=require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const Y=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");const Xe=require("react");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const be=require("../../packages/ui/src/lib/compose-refs.cjs"),ke=require("class-variance-authority");function Ye(o){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const b=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(t,c,b.get?b:{enumerable:!0,get:()=>o[c]})}}return t.default=o,Object.freeze(t)}const s=Ye(Xe),Le="Cropper",Re="CropperContent",ve="CropperImage",Me="CropperVideo",Ue="CropperArea",K=200,te=typeof window<"u"&&window.devicePixelRatio||1,ze=new Map,Pe=new Map,oe=new Map,re=new Map;function we(o,t,c){return Math.min(Math.max(o,t),c)}function E(o,t=2/te){return Math.round(o/t)*t}function ne(o,t=4/te){return Math.round(o/t)*t}function je(o,t=.01){return Math.round(o/t)*t}function ae(o,t=1){return Math.round(o/t)*t}function ie(o){return Math.round(o*te)/te}function ue(o,t){const c=o.get(t);return c!==void 0&&(o.delete(t),o.set(t,c)),c}function le(o,t,c,b=K){if(o.has(t)&&o.delete(t),o.set(t,c),o.size>b){const f=o.keys().next().value;f!==void 0&&o.delete(f)}}function qe(o,t){return Math.sqrt((o.y-t.y)**2+(o.x-t.x)**2)}function Ee(o,t){return{x:(t.x+o.x)*.5,y:(t.y+o.y)*.5}}function Ae(o,t){return Math.atan2(t.y-o.y,t.x-o.x)*180/Math.PI}function Je(o){return o*Math.PI/180}function se(o,t,c){const b=`${E(o)}-${E(t)}-${ae(c)}`,f=ue(ze,b);if(f)return f;const a=Je(c),r=Math.cos(a),m=Math.sin(a),i={width:Math.abs(r*o)+Math.abs(m*t),height:Math.abs(m*o)+Math.abs(r*t)};return le(ze,b,i,K),i}function Qe(o,t,c,b,f,a=0){const r=`${E(o,8)}-${E(t,8)}-${E(c,8)}-${E(b,8)}-${E(f,.01)}-${ae(a)}`,m=ue(Pe,r);if(m)return m;const{width:i,height:h}=se(o,t,a),g=Math.min(i,c),u=Math.min(h,b),C=g>u*f?{width:u*f,height:u}:{width:g,height:g/f};return le(Pe,r,C,K),C}function H(o,t,c,b,f=0){const a=ne(o.x),r=ne(o.y),m=`${a}-${r}-${E(t.width)}-${E(t.height)}-${E(c.width)}-${E(c.height)}-${je(b)}-${ae(f)}`,i=ue(re,m);if(i)return i;const{width:h,height:g}=se(t.width,t.height,f),u=h*b*.5-c.width*.5,C=g*b*.5-c.height*.5,p={x:we(o.x,-u,u),y:we(o.y,-C,C)};return le(re,m,p,K),p}function $e(o,t,c,b,f,a=0,r=!1){const m=`${ne(o.x)}-${ne(o.y)}-${E(t.width)}-${E(t.height)}-${E(t.naturalWidth)}-${E(t.naturalHeight)}-${E(c.width)}-${E(c.height)}-${E(b,.01)}-${je(f)}-${ae(a)}-${r}`,i=ue(oe,m);if(i)return i;const h=r?(y,l)=>l:(y,l)=>Math.min(y,Math.max(0,l)),g=se(t.width,t.height,a),u=se(t.naturalWidth,t.naturalHeight,a),C={x:h(100,((g.width-c.width/f)/2-o.x/f)/g.width*100),y:h(100,((g.height-c.height/f)/2-o.y/f)/g.height*100),width:h(100,c.width/g.width*100/f),height:h(100,c.height/g.height*100/f)},p=Math.round(h(u.width,C.width*u.width/100)),S=Math.round(h(u.height,C.height*u.height/100)),M=u.width>=u.height*b?{width:Math.round(S*b),height:S}:{width:p,height:Math.round(p/b)},n={...M,x:Math.round(h(u.width-M.width,C.x*u.width/100)),y:Math.round(h(u.height-M.height,C.y*u.height/100))},d={croppedAreaPercentages:C,croppedAreaPixels:n};return le(oe,m,d,K),d}function De(o){const t=s.useRef(null);return t.current===null&&(t.current=o()),t}const et=typeof window<"u"?s.useLayoutEffect:s.useEffect;function tt(o,t,c,b,f,a,r,m,i,h,g,u,C){let p=!1,S=null;function A(){S==null&&(S=requestAnimationFrame(()=>{S=null;const n=t.current;if(n?.mediaSize&&n.cropSize&&r){const{croppedAreaPercentages:d,croppedAreaPixels:y}=$e(n.crop,n.mediaSize,n.cropSize,c,n.zoom,n.rotation,b);r(d,y)}}))}const M={subscribe:n=>o.current?(o.current.add(n),()=>o.current?.delete(n)):()=>{},getState:()=>t.current??{crop:{x:0,y:0},zoom:1,rotation:0,mediaSize:null,cropSize:null,isDragging:!1,isWheelZooming:!1},setState:(n,d)=>{const y=t.current;if(!(!y||Object.is(y[n],d))){if(y[n]=d,n==="crop"&&typeof d=="object"&&d&&"x"in d)f?.(d);else if(n==="zoom"&&typeof d=="number")i?.(d);else if(n==="rotation"&&typeof d=="number")h?.(d);else if(n==="cropSize"&&typeof d=="object"&&d&&"width"in d)a?.(d);else if(n==="mediaSize"&&typeof d=="object"&&d&&"naturalWidth"in d)g?.(d);else if(n==="isDragging")if(d)u?.();else{C?.();const l=t.current;if(l?.mediaSize&&l.cropSize&&m){const{croppedAreaPercentages:z,croppedAreaPixels:q}=$e(l.crop,l.mediaSize,l.cropSize,c,l.zoom,l.rotation,b);m(z,q)}}(n==="crop"||n==="zoom"||n==="rotation"||n==="mediaSize"||n==="cropSize")&&r&&A(),p||M.notify()}},notify:()=>{if(o.current)for(const n of o.current)n()},batch:n=>{if(p){n();return}p=!0;try{n()}finally{p=!1,M.notify()}}};return M}const Ze=s.createContext(null);function fe(o){const t=s.useContext(Ze);if(!t)throw new Error(`\`${o}\` must be used within \`${Le}\``);return t}function k(o){const t=fe("useStore"),c=s.useCallback(()=>o(t.getState()),[t,o]);return s.useSyncExternalStore(t.subscribe,c,c)}const Oe=s.createContext(null);function he(o){const t=s.useContext(Oe);if(!t)throw new Error(`\`${o}\` must be used within \`${Le}\``);return t}function Te(o){const{crop:t={x:0,y:0},zoom:c=1,minZoom:b=1,maxZoom:f=3,zoomSpeed:a=1,rotation:r=0,keyboardStep:m=1,aspectRatio:i=4/3,shape:h="rectangle",objectFit:g="contain",allowOverflow:u=!1,preventScrollZoom:C=!1,withGrid:p=!1,onCropChange:S,onCropSizeChange:A,onCropAreaChange:M,onCropComplete:n,onZoomChange:d,onRotationChange:y,onMediaLoaded:l,onInteractionStart:z,onInteractionEnd:q,className:Z,...$}=o,B=De(()=>new Set),T=De(()=>({crop:t,zoom:c,rotation:r,mediaSize:null,cropSize:null,isDragging:!1,isWheelZooming:!1})),L=s.useRef(null),D=s.useMemo(()=>tt(B,T,i,u,S,A,M,n,d,y,l,z,q),[B,T,i,u,S,A,M,n,d,y,l,z,q]);et(()=>{const I={};let _=!1,O=!1;if(t!==void 0){const R=D.getState();Object.is(R.crop,t)||(I.crop=t,_=!0)}c!==void 0&&D.getState().zoom!==c&&(I.zoom=c,_=!0,O=!0),r!==void 0&&D.getState().rotation!==r&&(I.rotation=r,_=!0,O=!0),_&&(D.batch(()=>{Object.entries(I).forEach(([R,j])=>{D.setState(R,j)})}),O&&L.current&&requestAnimationFrame(()=>{const R=D.getState();if(R.cropSize&&R.mediaSize){const j=u?R.crop:H(R.crop,R.mediaSize,R.cropSize,R.zoom,R.rotation);(Math.abs(j.x-R.crop.x)>.001||Math.abs(j.y-R.crop.y)>.001)&&D.setState("crop",j)}}))},[t,c,r,D,u]);const U=s.useMemo(()=>({minZoom:b,maxZoom:f,zoomSpeed:a,keyboardStep:m,aspectRatio:i,shape:h,objectFit:g,preventScrollZoom:C,allowOverflow:u,withGrid:p,rootRef:L}),[b,f,a,m,i,h,g,C,u,p]);return W.jsx(Ze.Provider,{value:D,children:W.jsx(Oe.Provider,{value:U,children:W.jsx("div",{"data-slot":"cropper-wrapper",className:Y.cn("relative size-full overflow-hidden",Z),children:W.jsx(ot,{...$})})})})}function ot(o){const{className:t,asChild:c,ref:b,...f}=o,a=he(Re),r=fe(Re),m=k(e=>e.crop),i=k(e=>e.zoom),h=k(e=>e.rotation),g=k(e=>e.mediaSize),u=k(e=>e.cropSize),C=be.useComposedRefs(b,a.rootRef),p=s.useRef({x:0,y:0}),S=s.useRef({x:0,y:0}),A=s.useRef({x:0,y:0}),M=s.useRef(0),n=s.useRef(0),d=s.useRef(null),y=s.useRef(null),l=s.useRef(null),z=s.useRef(!1),q=s.useRef(0),Z=s.useRef(0),$=s.useCallback(()=>{d.current&&(cancelAnimationFrame(d.current),d.current=null),y.current&&(cancelAnimationFrame(y.current),y.current=null),l.current&&(clearTimeout(l.current),l.current=null),z.current=!1},[]),B=s.useCallback(()=>{re.size>K*1.5&&re.clear(),oe.size>K*1.5&&oe.clear()},[]),T=s.useCallback(e=>({x:Number(e.clientX),y:Number(e.clientY)}),[]),L=s.useCallback(e=>({x:Number(e.clientX),y:Number(e.clientY)}),[]),D=s.useCallback(()=>{if(a.rootRef?.current){const e=a.rootRef.current.getBoundingClientRect();A.current={x:e.left,y:e.top}}},[a.rootRef]),U=s.useCallback(({x:e,y:w},v)=>{if(!a.rootRef?.current)return{x:0,y:0};const x=a.rootRef.current.getBoundingClientRect();return{x:x.width/2-(e-v.x),y:x.height/2-(w-v.y)}},[a.rootRef]),I=s.useCallback(({x:e,y:w})=>({x:(e+m.x)/i,y:(w+m.y)/i}),[m,i]),_=s.useCallback(()=>{if(!u||!g)return;const e=a.allowOverflow?m:H(m,g,u,i,h);(Math.abs(e.x-m.x)>.001||Math.abs(e.y-m.y)>.001)&&r.setState("crop",e)},[u,g,a.allowOverflow,m,i,h,r]),O=s.useCallback((e,w,v=!0)=>{if(!u||!g)return;const x=we(e,a.minZoom,a.maxZoom);r.batch(()=>{if(v){const P=U(w,A.current),N=I(P),F={x:N.x*x-P.x,y:N.y*x-P.y},ee=a.allowOverflow?F:H(F,g,u,x,h);r.setState("crop",ee)}r.setState("zoom",x)}),requestAnimationFrame(()=>{_()})},[u,g,a.minZoom,a.maxZoom,a.allowOverflow,U,I,h,r,_]),R=s.useCallback(({x:e,y:w})=>{p.current={x:e,y:w},S.current={...m},r.setState("isDragging",!0)},[m,r]),j=s.useCallback(({x:e,y:w})=>{d.current&&cancelAnimationFrame(d.current),d.current=requestAnimationFrame(()=>{if(!u||!g||e===void 0||w===void 0)return;const v=e-p.current.x,x=w-p.current.y;if(Math.abs(v)<2&&Math.abs(x)<2)return;const P={x:S.current.x+v,y:S.current.y+x},N=a.allowOverflow?P:H(P,g,u,i,h),F=r.getState().crop;(Math.abs(N.x-F.x)>1||Math.abs(N.y-F.y)>1)&&r.setState("crop",N)})},[u,g,a.allowOverflow,i,h,r]),J=s.useCallback(e=>j(T(e)),[T,j]),Q=s.useCallback(e=>{if(e.preventDefault(),e.touches.length===2){const[w,v]=e.touches??[];if(w&&v){const x=L(w),P=L(v),N=Ee(x,P);j(N),y.current&&cancelAnimationFrame(y.current),y.current=requestAnimationFrame(()=>{const F=qe(x,P),ee=F/M.current;if(Math.abs(ee-1)>.01){const pe=i*ee;O(pe,N,!1),M.current=F}const Ce=Ae(x,P),ye=Ce-n.current;if(Math.abs(ye)>.5){const pe=h+ye;r.setState("rotation",pe),n.current=Ce}})}}else if(e.touches.length===1){const w=e.touches[0];w&&j(L(w))}},[L,j,i,O,h,r]),V=s.useCallback(e=>{if(e.preventDefault(),z.current)return;const w={x:Number(e.clientX),y:Number(e.clientY)},v=q.current-1+e.scale;O(v,w,!0);const x=Z.current+e.rotation;r.setState("rotation",x)},[O,r]),X=s.useCallback(()=>{document.removeEventListener("gesturechange",V),document.removeEventListener("gestureend",X)},[V]),de=s.useCallback(e=>{e.preventDefault(),document.addEventListener("gesturechange",V),document.addEventListener("gestureend",X),q.current=i,Z.current=h},[i,h,V,X]),me=s.useCallback(e=>e.preventDefault(),[]),Se=s.useCallback(()=>{document.removeEventListener("mousemove",J),document.removeEventListener("touchmove",Q),document.removeEventListener("gesturechange",V),document.removeEventListener("gestureend",X)},[J,Q,V,X]),G=s.useCallback(()=>{z.current=!1,r.setState("isDragging",!1),$(),document.removeEventListener("mouseup",G),document.removeEventListener("touchend",G),Se()},[r,Se,$]),xe=s.useCallback(e=>{let w=e.deltaX,v=e.deltaY,x=e.deltaZ;return e.deltaMode===1?(w*=16,v*=16,x*=16):e.deltaMode===2&&(w*=400,v*=400,x*=400),{deltaX:w,deltaY:v,deltaZ:x}},[]),ge=s.useCallback(e=>{if(f.onWheelZoom?.(e),e.defaultPrevented)return;e.preventDefault();const w=T(e),{deltaY:v}=xe(e),x=i-v*a.zoomSpeed/200;O(x,w,!0),r.batch(()=>{const P=r.getState();P.isWheelZooming||r.setState("isWheelZooming",!0),P.isDragging||r.setState("isDragging",!0)}),l.current&&clearTimeout(l.current),l.current=window.setTimeout(()=>{r.batch(()=>{r.setState("isWheelZooming",!1),r.setState("isDragging",!1)})},250)},[f.onWheelZoom,T,i,a.zoomSpeed,O,xe,r]),Ke=s.useCallback(e=>{if(f.onKeyUp?.(e),e.defaultPrevented)return;new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]).has(e.key)&&(e.preventDefault(),r.setState("isDragging",!1))},[f.onKeyUp,r]),Ve=s.useCallback(e=>{if(f.onKeyDown?.(e),e.defaultPrevented||!u||!g)return;let w=a.keyboardStep;e.shiftKey&&(w*=.2);const x={ArrowUp:()=>({...m,y:m.y-w}),ArrowDown:()=>({...m,y:m.y+w}),ArrowLeft:()=>({...m,x:m.x-w}),ArrowRight:()=>({...m,x:m.x+w})}[e.key];if(!x)return;e.preventDefault();let P=x();a.allowOverflow||(P=H(P,g,u,i,h)),e.repeat||r.setState("isDragging",!0),r.setState("crop",P)},[f.onKeyDown,u,g,a.keyboardStep,a.allowOverflow,m,i,h,r]),Ge=s.useCallback(e=>{f.onMouseDown?.(e),!e.defaultPrevented&&(e.preventDefault(),document.addEventListener("mousemove",J),document.addEventListener("mouseup",G),D(),R(T(e)))},[f.onMouseDown,T,R,G,J,D]),He=s.useCallback(e=>{if(f.onTouchStart?.(e),!e.defaultPrevented){if(z.current=!0,document.addEventListener("touchmove",Q,{passive:!1}),document.addEventListener("touchend",G),D(),e.touches.length===2){const[w,v]=e.touches?Array.from(e.touches):[];if(w&&v){const x=L(w),P=L(v);M.current=qe(x,P),n.current=Ae(x,P),R(Ee(x,P))}}else if(e.touches.length===1){const w=e.touches[0];w&&R(L(w))}}},[f.onTouchStart,G,Q,D,L,R]);s.useEffect(()=>{const e=a.rootRef?.current;if(e)return a.preventScrollZoom||e.addEventListener("wheel",ge,{passive:!1}),e.addEventListener("gesturestart",me),e.addEventListener("gesturestart",de),()=>{a.preventScrollZoom||e.removeEventListener("wheel",ge),e.removeEventListener("gesturestart",me),e.removeEventListener("gesturestart",de),$()}},[a.rootRef,a.preventScrollZoom,ge,$,me,de]),s.useEffect(()=>()=>{$(),B()},[$,B]);const Be=c?ce.Slot:"div";return W.jsx(Be,{"data-slot":"cropper",tabIndex:0,...f,ref:C,className:Y.cn("absolute inset-0 flex cursor-move touch-none select-none items-center justify-center overflow-hidden outline-none",t),onKeyUp:Ke,onKeyDown:Ve,onMouseDown:Ge,onTouchStart:He})}const Ne=ke.cva("will-change-transform",{variants:{objectFit:{contain:"absolute inset-0 m-auto max-h-full max-w-full",cover:"h-auto w-full","horizontal-cover":"h-auto w-full","vertical-cover":"h-full w-auto"}},defaultVariants:{objectFit:"contain"}});function Fe({mediaRef:o,context:t,store:c,rotation:b,getNaturalDimensions:f}){return{computeSizes:s.useCallback(()=>{const r=o.current,m=t.rootRef?.current;if(!r||!m)return;const i=m.getBoundingClientRect(),h=i.width/i.height,{width:g,height:u}=f(r),C=r.offsetWidth<g||r.offsetHeight<u,p=g/u;let S;if(C){const d={contain:()=>h>p?{width:i.height*p,height:i.height}:{width:i.width,height:i.width/p},"horizontal-cover":()=>({width:i.width,height:i.width/p}),"vertical-cover":()=>({width:i.height*p,height:i.height}),cover:()=>h<p?{width:i.width,height:i.width/p}:{width:i.height*p,height:i.height}}[t.objectFit];S=d?d():h>p?{width:i.height*p,height:i.height}:{width:i.width,height:i.width/p}}else S={width:r.offsetWidth,height:r.offsetHeight};const A={...S,naturalWidth:g,naturalHeight:u};c.setState("mediaSize",A);const M=Qe(A.width,A.height,i.width,i.height,t.aspectRatio,b);return c.setState("cropSize",M),requestAnimationFrame(()=>{const n=c.getState();if(n.cropSize&&n.mediaSize){const d=H(n.crop,n.mediaSize,n.cropSize,n.zoom,n.rotation);(Math.abs(d.x-n.crop.x)>.001||Math.abs(d.y-n.crop.y)>.001)&&c.setState("crop",d)}}),{mediaSize:A,cropSize:M}},[o,t.aspectRatio,t.rootRef,t.objectFit,c,b,f])}}function We(o){const{className:t,style:c,asChild:b,ref:f,onLoad:a,objectFit:r,snapPixels:m=!1,...i}=o,h=he(ve),g=fe(ve),u=k(l=>l.crop),C=k(l=>l.zoom),p=k(l=>l.rotation),S=s.useRef(null),A=be.useComposedRefs(f,S),M=s.useCallback(l=>({width:l.naturalWidth,height:l.naturalHeight}),[]),{computeSizes:n}=Fe({mediaRef:S,context:h,store:g,rotation:p,getNaturalDimensions:M}),d=s.useCallback(()=>{S.current&&(n(),a?.(new Event("load")))},[n,a]);s.useEffect(()=>{const l=S.current;l?.complete&&l.naturalWidth>0&&d()},[d]),s.useEffect(()=>{const l=h.rootRef?.current;if(l)if(typeof ResizeObserver<"u"){let z=!0;const q=new ResizeObserver(()=>{if(z){z=!1;return}const Z=()=>{const $=S.current;$?.complete&&$.naturalWidth>0&&n()};"requestIdleCallback"in window?requestIdleCallback(Z):setTimeout(Z,16)});return q.observe(l),()=>{q.disconnect()}}else{const z=()=>{const q=S.current;q?.complete&&q.naturalWidth>0&&n()};return window.addEventListener("resize",z),()=>{window.removeEventListener("resize",z)}}},[h.rootRef,n]);const y=b?ce.Slot:"img";return W.jsx(y,{"data-slot":"cropper-image",...i,ref:A,className:Y.cn(Ne({objectFit:r??h.objectFit,className:t})),style:{transform:m?`translate(${ie(u.x)}px, ${ie(u.y)}px) rotate(${p}deg) scale(${C})`:`translate(${u.x}px, ${u.y}px) rotate(${p}deg) scale(${C})`,...c},onLoad:d})}function Ie(o){const{className:t,style:c,asChild:b,ref:f,onLoadedMetadata:a,objectFit:r,snapPixels:m=!1,...i}=o,h=he(Me),g=fe(Me),u=k(l=>l.crop),C=k(l=>l.zoom),p=k(l=>l.rotation),S=s.useRef(null),A=be.useComposedRefs(f,S),M=s.useCallback(l=>({width:l.videoWidth,height:l.videoHeight}),[]),{computeSizes:n}=Fe({mediaRef:S,context:h,store:g,rotation:p,getNaturalDimensions:M}),d=s.useCallback(()=>{S.current&&(n(),a?.(new Event("loadedmetadata")))},[n,a]);s.useEffect(()=>{const l=h.rootRef?.current;if(l)if(typeof ResizeObserver<"u"){let z=!0;const q=new ResizeObserver(()=>{if(z){z=!1;return}const Z=()=>{const $=S.current;$&&$.videoWidth>0&&$.videoHeight>0&&n()};"requestIdleCallback"in window?requestIdleCallback(Z):setTimeout(Z,16)});return q.observe(l),()=>{q.disconnect()}}else{const z=()=>{const q=S.current;q&&q.videoWidth>0&&q.videoHeight>0&&n()};return window.addEventListener("resize",z),()=>{window.removeEventListener("resize",z)}}},[h.rootRef,n]);const y=b?ce.Slot:"video";return W.jsx(y,{"data-slot":"cropper-video",autoPlay:!0,playsInline:!0,loop:!0,muted:!0,controls:!1,...i,ref:A,className:Y.cn(Ne({objectFit:r??h.objectFit,className:t})),style:{transform:m?`translate(${ie(u.x)}px, ${ie(u.y)}px) rotate(${p}deg) scale(${C})`:`translate(${u.x}px, ${u.y}px) rotate(${p}deg) scale(${C})`,...c},onLoadedMetadata:d})}const rt=ke.cva("-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)]",{variants:{shape:{rectangle:"",circle:"rounded-full"},withGrid:{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-['']",false:""}},defaultVariants:{shape:"rectangle",withGrid:!1}});function _e(o){const{className:t,style:c,asChild:b,ref:f,snapPixels:a=!1,shape:r,withGrid:m,...i}=o,h=he(Ue),g=k(C=>C.cropSize);if(!g)return null;const u=b?ce.Slot:"div";return W.jsx(u,{"data-slot":"cropper-area",...i,ref:f,className:Y.cn(rt({shape:r??h.shape,withGrid:m??h.withGrid,className:t})),style:{width:a?Math.round(g.width):g.width,height:a?Math.round(g.height):g.height,...c}})}exports.Area=_e;exports.Cropper=Te;exports.CropperArea=_e;exports.CropperImage=We;exports.CropperVideo=Ie;exports.Image=We;exports.Root=Te;exports.Video=Ie;exports.useCropper=k;
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const W=require("react/jsx-runtime"),ce=require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const Y=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");const Xe=require("react");require("lucide-react");require("react-day-picker");require("../../packages/ui/src/components/popover.cjs");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("vaul");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const be=require("../../packages/ui/src/lib/compose-refs.cjs"),ke=require("class-variance-authority");function Ye(o){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(o){for(const c in o)if(c!=="default"){const b=Object.getOwnPropertyDescriptor(o,c);Object.defineProperty(t,c,b.get?b:{enumerable:!0,get:()=>o[c]})}}return t.default=o,Object.freeze(t)}const i=Ye(Xe),Le="Cropper",Re="CropperContent",ve="CropperImage",Me="CropperVideo",Ue="CropperArea",K=200,te=typeof window<"u"&&window.devicePixelRatio||1,ze=new Map,Pe=new Map,oe=new Map,re=new Map;function we(o,t,c){return Math.min(Math.max(o,t),c)}function E(o,t=2/te){return Math.round(o/t)*t}function ne(o,t=4/te){return Math.round(o/t)*t}function je(o,t=.01){return Math.round(o/t)*t}function ae(o,t=1){return Math.round(o/t)*t}function se(o){return Math.round(o*te)/te}function ue(o,t){const c=o.get(t);return c!==void 0&&(o.delete(t),o.set(t,c)),c}function le(o,t,c,b=K){if(o.has(t)&&o.delete(t),o.set(t,c),o.size>b){const d=o.keys().next().value;d!==void 0&&o.delete(d)}}function qe(o,t){return Math.sqrt((o.y-t.y)**2+(o.x-t.x)**2)}function Ee(o,t){return{x:(t.x+o.x)*.5,y:(t.y+o.y)*.5}}function Ae(o,t){return Math.atan2(t.y-o.y,t.x-o.x)*180/Math.PI}function Je(o){return o*Math.PI/180}function ie(o,t,c){const b=`${E(o)}-${E(t)}-${ae(c)}`,d=ue(ze,b);if(d)return d;const a=Je(c),r=Math.cos(a),m=Math.sin(a),s={width:Math.abs(r*o)+Math.abs(m*t),height:Math.abs(m*o)+Math.abs(r*t)};return le(ze,b,s,K),s}function Qe(o,t,c,b,d,a=0){const r=`${E(o,8)}-${E(t,8)}-${E(c,8)}-${E(b,8)}-${E(d,.01)}-${ae(a)}`,m=ue(Pe,r);if(m)return m;const{width:s,height:f}=ie(o,t,a),g=Math.min(s,c),u=Math.min(f,b),C=g>u*d?{width:u*d,height:u}:{width:g,height:g/d};return le(Pe,r,C,K),C}function H(o,t,c,b,d=0){const a=ne(o.x),r=ne(o.y),m=`${a}-${r}-${E(t.width)}-${E(t.height)}-${E(c.width)}-${E(c.height)}-${je(b)}-${ae(d)}`,s=ue(re,m);if(s)return s;const{width:f,height:g}=ie(t.width,t.height,d),u=f*b*.5-c.width*.5,C=g*b*.5-c.height*.5,p={x:we(o.x,-u,u),y:we(o.y,-C,C)};return le(re,m,p,K),p}function $e(o,t,c,b,d,a=0,r=!1){const m=`${ne(o.x)}-${ne(o.y)}-${E(t.width)}-${E(t.height)}-${E(t.naturalWidth)}-${E(t.naturalHeight)}-${E(c.width)}-${E(c.height)}-${E(b,.01)}-${je(d)}-${ae(a)}-${r}`,s=ue(oe,m);if(s)return s;const f=r?(y,l)=>l:(y,l)=>Math.min(y,Math.max(0,l)),g=ie(t.width,t.height,a),u=ie(t.naturalWidth,t.naturalHeight,a),C={x:f(100,((g.width-c.width/d)/2-o.x/d)/g.width*100),y:f(100,((g.height-c.height/d)/2-o.y/d)/g.height*100),width:f(100,c.width/g.width*100/d),height:f(100,c.height/g.height*100/d)},p=Math.round(f(u.width,C.width*u.width/100)),S=Math.round(f(u.height,C.height*u.height/100)),M=u.width>=u.height*b?{width:Math.round(S*b),height:S}:{width:p,height:Math.round(p/b)},n={...M,x:Math.round(f(u.width-M.width,C.x*u.width/100)),y:Math.round(f(u.height-M.height,C.y*u.height/100))},h={croppedAreaPercentages:C,croppedAreaPixels:n};return le(oe,m,h,K),h}function De(o){const t=i.useRef(null);return t.current===null&&(t.current=o()),t}const et=typeof window<"u"?i.useLayoutEffect:i.useEffect;function tt(o,t,c,b,d,a,r,m,s,f,g,u,C){let p=!1,S=null;function A(){S==null&&(S=requestAnimationFrame(()=>{S=null;const n=t.current;if(n?.mediaSize&&n.cropSize&&r){const{croppedAreaPercentages:h,croppedAreaPixels:y}=$e(n.crop,n.mediaSize,n.cropSize,c,n.zoom,n.rotation,b);r(h,y)}}))}const M={subscribe:n=>o.current?(o.current.add(n),()=>o.current?.delete(n)):()=>{},getState:()=>t.current??{crop:{x:0,y:0},zoom:1,rotation:0,mediaSize:null,cropSize:null,isDragging:!1,isWheelZooming:!1},setState:(n,h)=>{const y=t.current;if(!(!y||Object.is(y[n],h))){if(y[n]=h,n==="crop"&&typeof h=="object"&&h&&"x"in h)d?.(h);else if(n==="zoom"&&typeof h=="number")s?.(h);else if(n==="rotation"&&typeof h=="number")f?.(h);else if(n==="cropSize"&&typeof h=="object"&&h&&"width"in h)a?.(h);else if(n==="mediaSize"&&typeof h=="object"&&h&&"naturalWidth"in h)g?.(h);else if(n==="isDragging")if(h)u?.();else{C?.();const l=t.current;if(l?.mediaSize&&l.cropSize&&m){const{croppedAreaPercentages:z,croppedAreaPixels:q}=$e(l.crop,l.mediaSize,l.cropSize,c,l.zoom,l.rotation,b);m(z,q)}}(n==="crop"||n==="zoom"||n==="rotation"||n==="mediaSize"||n==="cropSize")&&r&&A(),p||M.notify()}},notify:()=>{if(o.current)for(const n of o.current)n()},batch:n=>{if(p){n();return}p=!0;try{n()}finally{p=!1,M.notify()}}};return M}const Ze=i.createContext(null);function de(o){const t=i.useContext(Ze);if(!t)throw new Error(`\`${o}\` must be used within \`${Le}\``);return t}function k(o){const t=de("useStore"),c=i.useCallback(()=>o(t.getState()),[t,o]);return i.useSyncExternalStore(t.subscribe,c,c)}const Oe=i.createContext(null);function fe(o){const t=i.useContext(Oe);if(!t)throw new Error(`\`${o}\` must be used within \`${Le}\``);return t}function Te(o){const{crop:t={x:0,y:0},zoom:c=1,minZoom:b=1,maxZoom:d=3,zoomSpeed:a=1,rotation:r=0,keyboardStep:m=1,aspectRatio:s=4/3,shape:f="rectangle",objectFit:g="contain",allowOverflow:u=!1,preventScrollZoom:C=!1,withGrid:p=!1,onCropChange:S,onCropSizeChange:A,onCropAreaChange:M,onCropComplete:n,onZoomChange:h,onRotationChange:y,onMediaLoaded:l,onInteractionStart:z,onInteractionEnd:q,className:Z,...$}=o,B=De(()=>new Set),T=De(()=>({crop:t,zoom:c,rotation:r,mediaSize:null,cropSize:null,isDragging:!1,isWheelZooming:!1})),L=i.useRef(null),D=i.useMemo(()=>tt(B,T,s,u,S,A,M,n,h,y,l,z,q),[B,T,s,u,S,A,M,n,h,y,l,z,q]);et(()=>{const I={};let _=!1,O=!1;if(t!==void 0){const R=D.getState();Object.is(R.crop,t)||(I.crop=t,_=!0)}c!==void 0&&D.getState().zoom!==c&&(I.zoom=c,_=!0,O=!0),r!==void 0&&D.getState().rotation!==r&&(I.rotation=r,_=!0,O=!0),_&&(D.batch(()=>{Object.entries(I).forEach(([R,j])=>{D.setState(R,j)})}),O&&L.current&&requestAnimationFrame(()=>{const R=D.getState();if(R.cropSize&&R.mediaSize){const j=u?R.crop:H(R.crop,R.mediaSize,R.cropSize,R.zoom,R.rotation);(Math.abs(j.x-R.crop.x)>.001||Math.abs(j.y-R.crop.y)>.001)&&D.setState("crop",j)}}))},[t,c,r,D,u]);const U=i.useMemo(()=>({minZoom:b,maxZoom:d,zoomSpeed:a,keyboardStep:m,aspectRatio:s,shape:f,objectFit:g,preventScrollZoom:C,allowOverflow:u,withGrid:p,rootRef:L}),[b,d,a,m,s,f,g,C,u,p]);return W.jsx(Ze.Provider,{value:D,children:W.jsx(Oe.Provider,{value:U,children:W.jsx("div",{"data-slot":"cropper-wrapper",className:Y.cn("ds:relative ds:size-full ds:overflow-hidden",Z),children:W.jsx(ot,{...$})})})})}function ot(o){const{className:t,asChild:c,ref:b,...d}=o,a=fe(Re),r=de(Re),m=k(e=>e.crop),s=k(e=>e.zoom),f=k(e=>e.rotation),g=k(e=>e.mediaSize),u=k(e=>e.cropSize),C=be.useComposedRefs(b,a.rootRef),p=i.useRef({x:0,y:0}),S=i.useRef({x:0,y:0}),A=i.useRef({x:0,y:0}),M=i.useRef(0),n=i.useRef(0),h=i.useRef(null),y=i.useRef(null),l=i.useRef(null),z=i.useRef(!1),q=i.useRef(0),Z=i.useRef(0),$=i.useCallback(()=>{h.current&&(cancelAnimationFrame(h.current),h.current=null),y.current&&(cancelAnimationFrame(y.current),y.current=null),l.current&&(clearTimeout(l.current),l.current=null),z.current=!1},[]),B=i.useCallback(()=>{re.size>K*1.5&&re.clear(),oe.size>K*1.5&&oe.clear()},[]),T=i.useCallback(e=>({x:Number(e.clientX),y:Number(e.clientY)}),[]),L=i.useCallback(e=>({x:Number(e.clientX),y:Number(e.clientY)}),[]),D=i.useCallback(()=>{if(a.rootRef?.current){const e=a.rootRef.current.getBoundingClientRect();A.current={x:e.left,y:e.top}}},[a.rootRef]),U=i.useCallback(({x:e,y:w},v)=>{if(!a.rootRef?.current)return{x:0,y:0};const x=a.rootRef.current.getBoundingClientRect();return{x:x.width/2-(e-v.x),y:x.height/2-(w-v.y)}},[a.rootRef]),I=i.useCallback(({x:e,y:w})=>({x:(e+m.x)/s,y:(w+m.y)/s}),[m,s]),_=i.useCallback(()=>{if(!u||!g)return;const e=a.allowOverflow?m:H(m,g,u,s,f);(Math.abs(e.x-m.x)>.001||Math.abs(e.y-m.y)>.001)&&r.setState("crop",e)},[u,g,a.allowOverflow,m,s,f,r]),O=i.useCallback((e,w,v=!0)=>{if(!u||!g)return;const x=we(e,a.minZoom,a.maxZoom);r.batch(()=>{if(v){const P=U(w,A.current),N=I(P),F={x:N.x*x-P.x,y:N.y*x-P.y},ee=a.allowOverflow?F:H(F,g,u,x,f);r.setState("crop",ee)}r.setState("zoom",x)}),requestAnimationFrame(()=>{_()})},[u,g,a.minZoom,a.maxZoom,a.allowOverflow,U,I,f,r,_]),R=i.useCallback(({x:e,y:w})=>{p.current={x:e,y:w},S.current={...m},r.setState("isDragging",!0)},[m,r]),j=i.useCallback(({x:e,y:w})=>{h.current&&cancelAnimationFrame(h.current),h.current=requestAnimationFrame(()=>{if(!u||!g||e===void 0||w===void 0)return;const v=e-p.current.x,x=w-p.current.y;if(Math.abs(v)<2&&Math.abs(x)<2)return;const P={x:S.current.x+v,y:S.current.y+x},N=a.allowOverflow?P:H(P,g,u,s,f),F=r.getState().crop;(Math.abs(N.x-F.x)>1||Math.abs(N.y-F.y)>1)&&r.setState("crop",N)})},[u,g,a.allowOverflow,s,f,r]),J=i.useCallback(e=>j(T(e)),[T,j]),Q=i.useCallback(e=>{if(e.preventDefault(),e.touches.length===2){const[w,v]=e.touches??[];if(w&&v){const x=L(w),P=L(v),N=Ee(x,P);j(N),y.current&&cancelAnimationFrame(y.current),y.current=requestAnimationFrame(()=>{const F=qe(x,P),ee=F/M.current;if(Math.abs(ee-1)>.01){const pe=s*ee;O(pe,N,!1),M.current=F}const Ce=Ae(x,P),ye=Ce-n.current;if(Math.abs(ye)>.5){const pe=f+ye;r.setState("rotation",pe),n.current=Ce}})}}else if(e.touches.length===1){const w=e.touches[0];w&&j(L(w))}},[L,j,s,O,f,r]),V=i.useCallback(e=>{if(e.preventDefault(),z.current)return;const w={x:Number(e.clientX),y:Number(e.clientY)},v=q.current-1+e.scale;O(v,w,!0);const x=Z.current+e.rotation;r.setState("rotation",x)},[O,r]),X=i.useCallback(()=>{document.removeEventListener("gesturechange",V),document.removeEventListener("gestureend",X)},[V]),he=i.useCallback(e=>{e.preventDefault(),document.addEventListener("gesturechange",V),document.addEventListener("gestureend",X),q.current=s,Z.current=f},[s,f,V,X]),me=i.useCallback(e=>e.preventDefault(),[]),Se=i.useCallback(()=>{document.removeEventListener("mousemove",J),document.removeEventListener("touchmove",Q),document.removeEventListener("gesturechange",V),document.removeEventListener("gestureend",X)},[J,Q,V,X]),G=i.useCallback(()=>{z.current=!1,r.setState("isDragging",!1),$(),document.removeEventListener("mouseup",G),document.removeEventListener("touchend",G),Se()},[r,Se,$]),xe=i.useCallback(e=>{let w=e.deltaX,v=e.deltaY,x=e.deltaZ;return e.deltaMode===1?(w*=16,v*=16,x*=16):e.deltaMode===2&&(w*=400,v*=400,x*=400),{deltaX:w,deltaY:v,deltaZ:x}},[]),ge=i.useCallback(e=>{if(d.onWheelZoom?.(e),e.defaultPrevented)return;e.preventDefault();const w=T(e),{deltaY:v}=xe(e),x=s-v*a.zoomSpeed/200;O(x,w,!0),r.batch(()=>{const P=r.getState();P.isWheelZooming||r.setState("isWheelZooming",!0),P.isDragging||r.setState("isDragging",!0)}),l.current&&clearTimeout(l.current),l.current=window.setTimeout(()=>{r.batch(()=>{r.setState("isWheelZooming",!1),r.setState("isDragging",!1)})},250)},[d.onWheelZoom,T,s,a.zoomSpeed,O,xe,r]),Ke=i.useCallback(e=>{if(d.onKeyUp?.(e),e.defaultPrevented)return;new Set(["ArrowUp","ArrowDown","ArrowLeft","ArrowRight"]).has(e.key)&&(e.preventDefault(),r.setState("isDragging",!1))},[d.onKeyUp,r]),Ve=i.useCallback(e=>{if(d.onKeyDown?.(e),e.defaultPrevented||!u||!g)return;let w=a.keyboardStep;e.shiftKey&&(w*=.2);const x={ArrowUp:()=>({...m,y:m.y-w}),ArrowDown:()=>({...m,y:m.y+w}),ArrowLeft:()=>({...m,x:m.x-w}),ArrowRight:()=>({...m,x:m.x+w})}[e.key];if(!x)return;e.preventDefault();let P=x();a.allowOverflow||(P=H(P,g,u,s,f)),e.repeat||r.setState("isDragging",!0),r.setState("crop",P)},[d.onKeyDown,u,g,a.keyboardStep,a.allowOverflow,m,s,f,r]),Ge=i.useCallback(e=>{d.onMouseDown?.(e),!e.defaultPrevented&&(e.preventDefault(),document.addEventListener("mousemove",J),document.addEventListener("mouseup",G),D(),R(T(e)))},[d.onMouseDown,T,R,G,J,D]),He=i.useCallback(e=>{if(d.onTouchStart?.(e),!e.defaultPrevented){if(z.current=!0,document.addEventListener("touchmove",Q,{passive:!1}),document.addEventListener("touchend",G),D(),e.touches.length===2){const[w,v]=e.touches?Array.from(e.touches):[];if(w&&v){const x=L(w),P=L(v);M.current=qe(x,P),n.current=Ae(x,P),R(Ee(x,P))}}else if(e.touches.length===1){const w=e.touches[0];w&&R(L(w))}}},[d.onTouchStart,G,Q,D,L,R]);i.useEffect(()=>{const e=a.rootRef?.current;if(e)return a.preventScrollZoom||e.addEventListener("wheel",ge,{passive:!1}),e.addEventListener("gesturestart",me),e.addEventListener("gesturestart",he),()=>{a.preventScrollZoom||e.removeEventListener("wheel",ge),e.removeEventListener("gesturestart",me),e.removeEventListener("gesturestart",he),$()}},[a.rootRef,a.preventScrollZoom,ge,$,me,he]),i.useEffect(()=>()=>{$(),B()},[$,B]);const Be=c?ce.Slot:"div";return W.jsx(Be,{"data-slot":"cropper",tabIndex:0,...d,ref:C,className:Y.cn("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",t),onKeyUp:Ke,onKeyDown:Ve,onMouseDown:Ge,onTouchStart:He})}const Ne=ke.cva("ds:will-change-transform",{variants:{objectFit:{contain:"ds:absolute ds:inset-0 ds:m-auto ds:max-h-full ds:max-w-full",cover:"ds:h-auto ds:w-full","horizontal-cover":"ds:h-auto ds:w-full","vertical-cover":"ds:h-full ds:w-auto"}},defaultVariants:{objectFit:"contain"}});function Fe({mediaRef:o,context:t,store:c,rotation:b,getNaturalDimensions:d}){return{computeSizes:i.useCallback(()=>{const r=o.current,m=t.rootRef?.current;if(!r||!m)return;const s=m.getBoundingClientRect(),f=s.width/s.height,{width:g,height:u}=d(r),C=r.offsetWidth<g||r.offsetHeight<u,p=g/u;let S;if(C){const h={contain:()=>f>p?{width:s.height*p,height:s.height}:{width:s.width,height:s.width/p},"horizontal-cover":()=>({width:s.width,height:s.width/p}),"vertical-cover":()=>({width:s.height*p,height:s.height}),cover:()=>f<p?{width:s.width,height:s.width/p}:{width:s.height*p,height:s.height}}[t.objectFit];S=h?h():f>p?{width:s.height*p,height:s.height}:{width:s.width,height:s.width/p}}else S={width:r.offsetWidth,height:r.offsetHeight};const A={...S,naturalWidth:g,naturalHeight:u};c.setState("mediaSize",A);const M=Qe(A.width,A.height,s.width,s.height,t.aspectRatio,b);return c.setState("cropSize",M),requestAnimationFrame(()=>{const n=c.getState();if(n.cropSize&&n.mediaSize){const h=H(n.crop,n.mediaSize,n.cropSize,n.zoom,n.rotation);(Math.abs(h.x-n.crop.x)>.001||Math.abs(h.y-n.crop.y)>.001)&&c.setState("crop",h)}}),{mediaSize:A,cropSize:M}},[o,t.aspectRatio,t.rootRef,t.objectFit,c,b,d])}}function We(o){const{className:t,style:c,asChild:b,ref:d,onLoad:a,objectFit:r,snapPixels:m=!1,...s}=o,f=fe(ve),g=de(ve),u=k(l=>l.crop),C=k(l=>l.zoom),p=k(l=>l.rotation),S=i.useRef(null),A=be.useComposedRefs(d,S),M=i.useCallback(l=>({width:l.naturalWidth,height:l.naturalHeight}),[]),{computeSizes:n}=Fe({mediaRef:S,context:f,store:g,rotation:p,getNaturalDimensions:M}),h=i.useCallback(()=>{S.current&&(n(),a?.(new Event("load")))},[n,a]);i.useEffect(()=>{const l=S.current;l?.complete&&l.naturalWidth>0&&h()},[h]),i.useEffect(()=>{const l=f.rootRef?.current;if(l)if(typeof ResizeObserver<"u"){let z=!0;const q=new ResizeObserver(()=>{if(z){z=!1;return}const Z=()=>{const $=S.current;$?.complete&&$.naturalWidth>0&&n()};"requestIdleCallback"in window?requestIdleCallback(Z):setTimeout(Z,16)});return q.observe(l),()=>{q.disconnect()}}else{const z=()=>{const q=S.current;q?.complete&&q.naturalWidth>0&&n()};return window.addEventListener("resize",z),()=>{window.removeEventListener("resize",z)}}},[f.rootRef,n]);const y=b?ce.Slot:"img";return W.jsx(y,{"data-slot":"cropper-image",...s,ref:A,className:Y.cn(Ne({objectFit:r??f.objectFit,className:t})),style:{transform:m?`translate(${se(u.x)}px, ${se(u.y)}px) rotate(${p}deg) scale(${C})`:`translate(${u.x}px, ${u.y}px) rotate(${p}deg) scale(${C})`,...c},onLoad:h})}function Ie(o){const{className:t,style:c,asChild:b,ref:d,onLoadedMetadata:a,objectFit:r,snapPixels:m=!1,...s}=o,f=fe(Me),g=de(Me),u=k(l=>l.crop),C=k(l=>l.zoom),p=k(l=>l.rotation),S=i.useRef(null),A=be.useComposedRefs(d,S),M=i.useCallback(l=>({width:l.videoWidth,height:l.videoHeight}),[]),{computeSizes:n}=Fe({mediaRef:S,context:f,store:g,rotation:p,getNaturalDimensions:M}),h=i.useCallback(()=>{S.current&&(n(),a?.(new Event("loadedmetadata")))},[n,a]);i.useEffect(()=>{const l=f.rootRef?.current;if(l)if(typeof ResizeObserver<"u"){let z=!0;const q=new ResizeObserver(()=>{if(z){z=!1;return}const Z=()=>{const $=S.current;$&&$.videoWidth>0&&$.videoHeight>0&&n()};"requestIdleCallback"in window?requestIdleCallback(Z):setTimeout(Z,16)});return q.observe(l),()=>{q.disconnect()}}else{const z=()=>{const q=S.current;q&&q.videoWidth>0&&q.videoHeight>0&&n()};return window.addEventListener("resize",z),()=>{window.removeEventListener("resize",z)}}},[f.rootRef,n]);const y=b?ce.Slot:"video";return W.jsx(y,{"data-slot":"cropper-video",autoPlay:!0,playsInline:!0,loop:!0,muted:!0,controls:!1,...s,ref:A,className:Y.cn(Ne({objectFit:r??f.objectFit,className:t})),style:{transform:m?`translate(${se(u.x)}px, ${se(u.y)}px) rotate(${p}deg) scale(${C})`:`translate(${u.x}px, ${u.y}px) rotate(${p}deg) scale(${C})`,...c},onLoadedMetadata:h})}const rt=ke.cva("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)]",{variants:{shape:{rectangle:"",circle:"ds:rounded-full"},withGrid:{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-['']",false:""}},defaultVariants:{shape:"rectangle",withGrid:!1}});function _e(o){const{className:t,style:c,asChild:b,ref:d,snapPixels:a=!1,shape:r,withGrid:m,...s}=o,f=fe(Ue),g=k(C=>C.cropSize);if(!g)return null;const u=b?ce.Slot:"div";return W.jsx(u,{"data-slot":"cropper-area",...s,ref:d,className:Y.cn(rt({shape:r??f.shape,withGrid:m??f.withGrid,className:t})),style:{width:a?Math.round(g.width):g.width,height:a?Math.round(g.height):g.height,...c}})}exports.Area=_e;exports.Cropper=Te;exports.CropperArea=_e;exports.CropperImage=We;exports.CropperVideo=Ie;exports.Image=We;exports.Root=Te;exports.Video=Ie;exports.useCropper=k;
|
|
2
2
|
//# sourceMappingURL=Cropper.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Cropper.cjs","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","RootPrimitive","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","ImagePrimitive","CropperVideo","onLoadedMetadata","videoProps","videoRef","video","VideoPrimitive","cropperAreaVariants","CropperArea","areaProps","AreaPrimitive"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Cropper.cjs","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","RootPrimitive","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","ImagePrimitive","CropperVideo","onLoadedMetadata","videoProps","videoRef","video","VideoPrimitive","cropperAreaVariants","CropperArea","areaProps","AreaPrimitive"],"mappings":"m7DAMMA,GAAY,UACZC,GAAe,iBACfC,GAAa,eACbC,GAAa,eACbC,GAAY,cAwCZC,EAAiB,IACjBC,GAAM,OAAO,OAAW,KAAc,OAAO,kBAAoB,EAEjEC,OAAwB,IACxBC,OAAoB,IACpBC,OAAuB,IAIvBC,OAA2B,IAEjC,SAASC,GAAMC,EAAeC,EAAaC,EAAqB,CAC9D,OAAO,KAAK,IAAI,KAAK,IAAIF,EAAOC,CAAG,EAAGC,CAAG,CAC3C,CAEA,SAASC,EAASC,EAAWC,EAAO,EAAIX,GAAa,CACnD,OAAO,KAAK,MAAMU,EAAIC,CAAI,EAAIA,CAChC,CAEA,SAASC,GAAiBF,EAAWC,EAAO,EAAIX,GAAa,CAC3D,OAAO,KAAK,MAAMU,EAAIC,CAAI,EAAIA,CAChC,CAEA,SAASE,GAAaH,EAAWC,EAAO,IAAc,CACpD,OAAO,KAAK,MAAMD,EAAIC,CAAI,EAAIA,CAChC,CAEA,SAASG,GAAiBJ,EAAWC,EAAO,EAAa,CACvD,OAAO,KAAK,MAAMD,EAAIC,CAAI,EAAIA,CAChC,CAEA,SAASI,GAAkBL,EAAmB,CAC5C,OAAO,KAAK,MAAMA,EAAIV,EAAG,EAAIA,EAC/B,CAEA,SAASgB,GAAaC,EAAgBC,EAAuB,CAC3D,MAAMC,EAAIF,EAAI,IAAIC,CAAG,EACrB,OAAIC,IAAM,SACRF,EAAI,OAAOC,CAAG,EACdD,EAAI,IAAIC,EAAKC,CAAC,GAETA,CACT,CAEA,SAASC,GACPH,EACAC,EACAG,EACAb,EAAMT,EACA,CAKN,GAJIkB,EAAI,IAAIC,CAAG,GACbD,EAAI,OAAOC,CAAG,EAEhBD,EAAI,IAAIC,EAAKG,CAAG,EACZJ,EAAI,KAAOT,EAAK,CAClB,MAAMc,EAAWL,EAAI,KAAA,EAAO,OAAO,MAC/BK,IAAa,QACfL,EAAI,OAAOK,CAAQ,CAEvB,CACF,CAEA,SAASC,GAAyBC,EAAeC,EAAuB,CACtE,OAAO,KAAK,MAAMD,EAAO,EAAIC,EAAO,IAAM,GAAKD,EAAO,EAAIC,EAAO,IAAM,CAAC,CAC1E,CAEA,SAASC,GAAUC,EAAUC,EAAiB,CAC5C,MAAO,CACL,GAAIA,EAAE,EAAID,EAAE,GAAK,GACjB,GAAIC,EAAE,EAAID,EAAE,GAAK,EAAA,CAErB,CAEA,SAASE,GAAyBL,EAAeC,EAAuB,CACtE,OAAQ,KAAK,MAAMA,EAAO,EAAID,EAAO,EAAGC,EAAO,EAAID,EAAO,CAAC,EAAI,IAAO,KAAK,EAC7E,CAEA,SAASM,GAAeC,EAA6B,CACnD,OAAQA,EAAc,KAAK,GAAM,GACnC,CAEA,SAASC,GAAWC,EAAeC,EAAgBC,EAAwB,CACzE,MAAMC,EAAW,GAAG3B,EAASwB,CAAK,CAAC,IAAIxB,EAASyB,CAAM,CAAC,IAAIpB,GAAiBqB,CAAQ,CAAC,GAE/EE,EAASrB,GAAOf,GAAmBmC,CAAQ,EACjD,GAAIC,EACF,OAAOA,EAET,MAAMC,EAASR,GAAeK,CAAQ,EAChCI,EAAS,KAAK,IAAID,CAAM,EACxBE,EAAS,KAAK,IAAIF,CAAM,EAExBG,EAAe,CACnB,MAAO,KAAK,IAAIF,EAASN,CAAK,EAAI,KAAK,IAAIO,EAASN,CAAM,EAC1D,OAAQ,KAAK,IAAIM,EAASP,CAAK,EAAI,KAAK,IAAIM,EAASL,CAAM,CAAA,EAG7D,OAAAd,GAAOnB,GAAmBmC,EAAUK,EAAQ1C,CAAc,EACnD0C,CACT,CAEA,SAASC,GACPC,EACAC,EACAC,EACAC,EACAC,EACAZ,EAAW,EACL,CACN,MAAMC,EAAW,GAAG3B,EAASkC,EAAY,CAAC,CAAC,IAAIlC,EAASmC,EAAa,CAAC,CAAC,IAAInC,EAASoC,EAAc,CAAC,CAAC,IAAIpC,EAASqC,EAAe,CAAC,CAAC,IAAIrC,EAASsC,EAAQ,GAAI,CAAC,IAAIjC,GAAiBqB,CAAQ,CAAC,GAEpLE,EAASrB,GAAOd,GAAekC,CAAQ,EAC7C,GAAIC,EACF,OAAOA,EAET,KAAM,CAAE,MAAAJ,EAAO,OAAAC,CAAA,EAAWF,GAAWW,EAAYC,EAAaT,CAAQ,EAChEa,EAAe,KAAK,IAAIf,EAAOY,CAAY,EAC3CI,EAAgB,KAAK,IAAIf,EAAQY,CAAa,EAE9CL,EACJO,EAAeC,EAAgBF,EAC3B,CACE,MAAOE,EAAgBF,EACvB,OAAQE,CAAA,EAEV,CACE,MAAOD,EACP,OAAQA,EAAeD,CAAA,EAG/B,OAAA3B,GAAOlB,GAAekC,EAAUK,EAAQ1C,CAAc,EAC/C0C,CACT,CAEA,SAASS,EACPC,EACAC,EACAC,EACAC,EACAnB,EAAW,EACJ,CACP,MAAMoB,EAAa3C,GAAiBuC,EAAS,CAAC,EACxCK,EAAa5C,GAAiBuC,EAAS,CAAC,EAExCf,EAAW,GAAGmB,CAAU,IAAIC,CAAU,IAAI/C,EAAS2C,EAAU,KAAK,CAAC,IAAI3C,EAAS2C,EAAU,MAAM,CAAC,IAAI3C,EAAS4C,EAAS,KAAK,CAAC,IAAI5C,EAAS4C,EAAS,MAAM,CAAC,IAAIxC,GAAayC,CAAI,CAAC,IAAIxC,GAAiBqB,CAAQ,CAAC,GAE9ME,EAASrB,GAAOZ,GAAsBgC,CAAQ,EACpD,GAAIC,EACF,OAAOA,EAET,KAAM,CAAE,MAAAJ,EAAO,OAAAC,CAAA,EAAWF,GACxBoB,EAAU,MACVA,EAAU,OACVjB,CAAA,EAGIsB,EAAexB,EAAQqB,EAAO,GAAMD,EAAS,MAAQ,GACrDK,EAAexB,EAASoB,EAAO,GAAMD,EAAS,OAAS,GAEvDZ,EAAgB,CACpB,EAAGpC,GAAM8C,EAAS,EAAG,CAACM,EAAcA,CAAY,EAChD,EAAGpD,GAAM8C,EAAS,EAAG,CAACO,EAAcA,CAAY,CAAA,EAGlD,OAAAtC,GAAOhB,GAAsBgC,EAAUK,EAAQ1C,CAAc,EACtD0C,CACT,CAEA,SAASkB,GACPC,EACAR,EACAC,EACAN,EACAO,EACAnB,EAAW,EACX0B,EAAgB,GAC2C,CAC3D,MAAMzB,EAAW,GAAGxB,GAAiBgD,EAAK,CAAC,CAAC,IAAIhD,GAAiBgD,EAAK,CAAC,CAAC,IAAInD,EAAS2C,EAAU,KAAK,CAAC,IAAI3C,EAAS2C,EAAU,MAAM,CAAC,IAAI3C,EAAS2C,EAAU,YAAY,CAAC,IAAI3C,EAAS2C,EAAU,aAAa,CAAC,IAAI3C,EAAS4C,EAAS,KAAK,CAAC,IAAI5C,EAAS4C,EAAS,MAAM,CAAC,IAAI5C,EAASsC,EAAQ,GAAI,CAAC,IAAIlC,GAAayC,CAAI,CAAC,IAAIxC,GAAiBqB,CAAQ,CAAC,IAAI0B,CAAa,GAE9VxB,EAASrB,GAAOb,GAAkBiC,CAAQ,EAEhD,GAAIC,EAAQ,OAAOA,EAEnB,MAAMyB,EAAeD,EAEjB,CAACE,EAAczD,IAAkBA,EADjC,CAACE,EAAaF,IAAkB,KAAK,IAAIE,EAAK,KAAK,IAAI,EAAGF,CAAK,CAAC,EAG9D0D,EAAgBhC,GAAWoB,EAAU,MAAOA,EAAU,OAAQjB,CAAQ,EACtE8B,EAAuBjC,GAC3BoB,EAAU,aACVA,EAAU,cACVjB,CAAA,EAGI+B,EAA+B,CACnC,EAAGJ,EACD,MACGE,EAAc,MAAQX,EAAS,MAAQC,GAAQ,EAAIM,EAAK,EAAIN,GAC7DU,EAAc,MACd,GAAA,EAEJ,EAAGF,EACD,MACGE,EAAc,OAASX,EAAS,OAASC,GAAQ,EAAIM,EAAK,EAAIN,GAC/DU,EAAc,OACd,GAAA,EAEJ,MAAOF,EACL,IACET,EAAS,MAAQW,EAAc,MAAS,IAAOV,CAAA,EAEnD,OAAQQ,EACN,IACET,EAAS,OAASW,EAAc,OAAU,IAAOV,CAAA,CACrD,EAGIa,EAAgB,KAAK,MACzBL,EACEG,EAAqB,MACpBC,EAAuB,MAAQD,EAAqB,MAAS,GAAA,CAChE,EAEIG,EAAiB,KAAK,MAC1BN,EACEG,EAAqB,OACpBC,EAAuB,OAASD,EAAqB,OAAU,GAAA,CAClE,EAKII,EAFJJ,EAAqB,OAASA,EAAqB,OAASlB,EAG1D,CACE,MAAO,KAAK,MAAMqB,EAAiBrB,CAAM,EACzC,OAAQqB,CAAA,EAEV,CACE,MAAOD,EACP,OAAQ,KAAK,MAAMA,EAAgBpB,CAAM,CAAA,EAGzCuB,EAA0B,CAC9B,GAAGD,EACH,EAAG,KAAK,MACNP,EACEG,EAAqB,MAAQI,EAAW,MACvCH,EAAuB,EAAID,EAAqB,MAAS,GAAA,CAC5D,EAEF,EAAG,KAAK,MACNH,EACEG,EAAqB,OAASI,EAAW,OACxCH,EAAuB,EAAID,EAAqB,OAAU,GAAA,CAC7D,CACF,EAGIxB,EAAS,CAAE,uBAAAyB,EAAwB,kBAAAI,CAAA,EAEzC,OAAAlD,GAAOjB,GAAkBiC,EAAUK,EAAQ1C,CAAc,EAClD0C,CACT,CAEA,SAAS8B,GAAcC,EAAa,CAClC,MAAMC,EAAMC,EAAM,OAAiB,IAAI,EAEvC,OAAID,EAAI,UAAY,OAClBA,EAAI,QAAUD,EAAA,GAGTC,CACT,CAEA,MAAME,GACJ,OAAO,OAAW,IAAcD,EAAM,gBAAkBA,EAAM,UAoBhE,SAASE,GACPC,EACAC,EACAC,EACAlB,EACAmB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACO,CACP,IAAIC,EAAa,GACbC,EAAqB,KAEzB,SAASC,GAAuB,CAC1BD,GAAO,OACXA,EAAM,sBAAsB,IAAM,CAChCA,EAAM,KACN,MAAME,EAAId,EAAS,QACnB,GAAIc,GAAG,WAAaA,EAAE,UAAYV,EAAkB,CAClD,KAAM,CAAE,uBAAAhB,EAAwB,kBAAAI,CAAA,EAAsBX,GACpDiC,EAAE,KACFA,EAAE,UACFA,EAAE,SACFb,EACAa,EAAE,KACFA,EAAE,SACF/B,CAAA,EAEFqB,EAAiBhB,EAAwBI,CAAiB,CAC5D,CACF,CAAC,EACH,CAEA,MAAMuB,EAAe,CACnB,UAAYC,GACNjB,EAAa,SACfA,EAAa,QAAQ,IAAIiB,CAAE,EACpB,IAAMjB,EAAa,SAAS,OAAOiB,CAAE,GAEvC,IAAM,CAAC,EAEhB,SAAU,IACRhB,EAAS,SAAW,CAClB,KAAM,CAAE,EAAG,EAAG,EAAG,CAAA,EACjB,KAAM,EACN,SAAU,EACV,UAAW,KACX,SAAU,KACV,WAAY,GACZ,eAAgB,EAAA,EAEpB,SAAU,CAAC5D,EAAKZ,IAAU,CACxB,MAAMyF,EAAQjB,EAAS,QACvB,GAAI,GAACiB,GAAS,OAAO,GAAGA,EAAM7E,CAAG,EAAGZ,CAAK,GAIzC,IAFAyF,EAAM7E,CAAG,EAAIZ,EAGXY,IAAQ,QACR,OAAOZ,GAAU,UACjBA,GACA,MAAOA,EAEP0E,IAAe1E,CAAK,UACXY,IAAQ,QAAU,OAAOZ,GAAU,SAC5C8E,IAAe9E,CAAK,UACXY,IAAQ,YAAc,OAAOZ,GAAU,SAChD+E,IAAmB/E,CAAK,UAExBY,IAAQ,YACR,OAAOZ,GAAU,UACjBA,GACA,UAAWA,EAEX2E,IAAmB3E,CAAK,UAExBY,IAAQ,aACR,OAAOZ,GAAU,UACjBA,GACA,iBAAkBA,EAElBgF,IAAgBhF,CAAK,UACZY,IAAQ,aACjB,GAAIZ,EACFiF,IAAA,MACK,CACLC,IAAA,EACA,MAAMQ,EAAelB,EAAS,QAC9B,GACEkB,GAAc,WACdA,EAAa,UACbb,EACA,CACA,KAAM,CAAE,uBAAAjB,EAAwB,kBAAAI,CAAA,EAC9BX,GACEqC,EAAa,KACbA,EAAa,UACbA,EAAa,SACbjB,EACAiB,EAAa,KACbA,EAAa,SACbnC,CAAA,EAEJsB,EAAejB,EAAwBI,CAAiB,CAC1D,CACF,EAICpD,IAAQ,QACPA,IAAQ,QACRA,IAAQ,YACRA,IAAQ,aACRA,IAAQ,aACVgE,GAEAS,EAAA,EAGGF,GACHI,EAAM,OAAA,EAEV,EACA,OAAQ,IAAM,CACZ,GAAIhB,EAAa,QACf,UAAWiB,KAAMjB,EAAa,QAC5BiB,EAAA,CAGN,EACA,MAAQtB,GAAmB,CACzB,GAAIiB,EAAY,CACdjB,EAAA,EACA,MACF,CACAiB,EAAa,GACb,GAAI,CACFjB,EAAA,CACF,QAAA,CACEiB,EAAa,GACbI,EAAM,OAAA,CACR,CACF,CAAA,EAGF,OAAOA,CACT,CAEA,MAAMI,GAAevB,EAAM,cAA4B,IAAI,EAE3D,SAASwB,GAAgBC,EAAsB,CAC7C,MAAMC,EAAU1B,EAAM,WAAWuB,EAAY,EAC7C,GAAI,CAACG,EACH,MAAM,IAAI,MAAM,KAAKD,CAAY,4BAA4BzG,EAAS,IAAI,EAE5E,OAAO0G,CACT,CAEA,SAASC,EAAYC,EAAuC,CAC1D,MAAMT,EAAQK,GAAgB,UAAU,EAElCK,EAAc7B,EAAM,YACxB,IAAM4B,EAAST,EAAM,UAAU,EAC/B,CAACA,EAAOS,CAAQ,CAAA,EAGlB,OAAO5B,EAAM,qBAAqBmB,EAAM,UAAWU,EAAaA,CAAW,CAC7E,CAkBA,MAAMC,GAAiB9B,EAAM,cAA0C,IAAI,EAE3E,SAAS+B,GAAkBN,EAAsB,CAC/C,MAAMC,EAAU1B,EAAM,WAAW8B,EAAc,EAC/C,GAAI,CAACJ,EACH,MAAM,IAAI,MAAM,KAAKD,CAAY,4BAA4BzG,EAAS,IAAI,EAE5E,OAAO0G,CACT,CA4BA,SAASM,GAAYC,EAAyB,CAC5C,KAAM,CACJ,KAAA/C,EAAO,CAAE,EAAG,EAAG,EAAG,CAAA,EAClB,KAAAN,EAAO,EACP,QAAAsD,EAAU,EACV,QAAAC,EAAU,EACV,UAAAC,EAAY,EACZ,SAAA3E,EAAW,EACX,aAAA4E,EAAe,EACf,YAAAhC,EAAc,EAAI,EAClB,MAAAiC,EAAQ,YACR,UAAAC,EAAY,UACZ,cAAApD,EAAgB,GAChB,kBAAAqD,EAAoB,GACpB,SAAAC,EAAW,GACX,aAAAnC,EACA,iBAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,aAAAC,EACA,iBAAAC,EACA,cAAAC,EACA,mBAAAC,EACA,iBAAAC,EACA,UAAA4B,EACA,GAAGC,CAAA,EACDV,EAEE9B,EAAeN,GAAW,IAAM,IAAI,GAAiB,EACrDO,EAAWP,GAAuB,KAAO,CAC7C,KAAAX,EACA,KAAAN,EACA,SAAAnB,EACA,UAAW,KACX,SAAU,KACV,WAAY,GACZ,eAAgB,EAAA,EAChB,EAEImF,EAAU5C,EAAM,OAAoB,IAAI,EAExCmB,EAAQnB,EAAM,QAClB,IACEE,GACEC,EACAC,EACAC,EACAlB,EACAmB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,EAEJ,CACEX,EACAC,EACAC,EACAlB,EACAmB,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,CAAA,CACF,EAGFb,GAA0B,IAAM,CAC9B,MAAM4C,EAA+B,CAAA,EACrC,IAAIC,EAAa,GACbC,EAAkB,GAEtB,GAAI7D,IAAS,OAAW,CACtB,MAAMoC,EAAeH,EAAM,SAAA,EACtB,OAAO,GAAGG,EAAa,KAAMpC,CAAI,IACpC2D,EAAQ,KAAO3D,EACf4D,EAAa,GAEjB,CAEIlE,IAAS,QACUuC,EAAM,SAAA,EACV,OAASvC,IACxBiE,EAAQ,KAAOjE,EACfkE,EAAa,GACbC,EAAkB,IAIlBtF,IAAa,QACM0D,EAAM,SAAA,EACV,WAAa1D,IAC5BoF,EAAQ,SAAWpF,EACnBqF,EAAa,GACbC,EAAkB,IAIlBD,IACF3B,EAAM,MAAM,IAAM,CAChB,OAAO,QAAQ0B,CAAO,EAAE,QAAQ,CAAC,CAACrG,EAAKZ,CAAK,IAAM,CAChDuF,EAAM,SAAS3E,EAAyBZ,CAAK,CAC/C,CAAC,CACH,CAAC,EAEGmH,GAAmBH,EAAQ,SAC7B,sBAAsB,IAAM,CAC1B,MAAMtB,EAAeH,EAAM,SAAA,EAC3B,GAAIG,EAAa,UAAYA,EAAa,UAAW,CACnD,MAAM0B,EAAe7D,EAQjBmC,EAAa,KAPb9C,EACE8C,EAAa,KACbA,EAAa,UACbA,EAAa,SACbA,EAAa,KACbA,EAAa,QAAA,GAKjB,KAAK,IAAI0B,EAAY,EAAI1B,EAAa,KAAK,CAAC,EAAI,MAChD,KAAK,IAAI0B,EAAY,EAAI1B,EAAa,KAAK,CAAC,EAAI,OAEhDH,EAAM,SAAS,OAAQ6B,CAAW,CAEtC,CACF,CAAC,EAGP,EAAG,CAAC9D,EAAMN,EAAMnB,EAAU0D,EAAOhC,CAAa,CAAC,EAE/C,MAAM8D,EAAejD,EAAM,QACzB,KAAO,CACL,QAAAkC,EACA,QAAAC,EACA,UAAAC,EACA,aAAAC,EACA,YAAAhC,EACA,MAAAiC,EACA,UAAAC,EACA,kBAAAC,EACA,cAAArD,EACA,SAAAsD,EACA,QAAAG,CAAA,GAEF,CACEV,EACAC,EACAC,EACAC,EACAhC,EACAiC,EACAC,EACAC,EACArD,EACAsD,CAAA,CACF,EAGF,OACES,EAAAA,IAAC3B,GAAa,SAAb,CAAsB,MAAOJ,EAC5B,SAAA+B,EAAAA,IAACpB,GAAe,SAAf,CAAwB,MAAOmB,EAC9B,SAAAC,EAAAA,IAAC,MAAA,CACC,YAAU,kBACV,UAAWC,EAAAA,GAAG,8CAA+CT,CAAS,EAEtE,SAAAQ,EAAAA,IAACE,GAAA,CAAiB,GAAGT,CAAA,CAAW,CAAA,CAAA,EAEpC,CAAA,CACF,CAEJ,CAMA,SAASS,GAAgBnB,EAA6B,CACpD,KAAM,CAAE,UAAAS,EAAW,QAAAW,EAAS,IAAAtD,EAAK,GAAGuD,GAAiBrB,EAE/CP,EAAUK,GAAkB9G,EAAY,EACxCkG,EAAQK,GAAgBvG,EAAY,EACpCiE,EAAOyC,EAAUN,GAAUA,EAAM,IAAI,EACrCzC,EAAO+C,EAAUN,GAAUA,EAAM,IAAI,EACrC5D,EAAWkE,EAAUN,GAAUA,EAAM,QAAQ,EAC7C3C,EAAYiD,EAAUN,GAAUA,EAAM,SAAS,EAC/C1C,EAAWgD,EAAUN,GAAUA,EAAM,QAAQ,EAE7CkC,EAAcC,GAAAA,gBAAgBzD,EAAK2B,EAAQ,OAAO,EAClD+B,EAAuBzD,EAAM,OAAc,CAAE,EAAG,EAAG,EAAG,EAAG,EACzD0D,EAAmB1D,EAAM,OAAc,CAAE,EAAG,EAAG,EAAG,EAAG,EACrD2D,EAAqB3D,EAAM,OAAc,CAAE,EAAG,EAAG,EAAG,EAAG,EACvD4D,EAAuB5D,EAAM,OAAO,CAAC,EACrC6D,EAAuB7D,EAAM,OAAO,CAAC,EACrC8D,EAAoB9D,EAAM,OAAsB,IAAI,EACpD+D,EAAqB/D,EAAM,OAAsB,IAAI,EACrDgE,EAAgBhE,EAAM,OAAsB,IAAI,EAChDiE,EAAgBjE,EAAM,OAAO,EAAK,EAClCkE,EAAsBlE,EAAM,OAAO,CAAC,EACpCmE,EAA0BnE,EAAM,OAAO,CAAC,EAExCoE,EAAgBpE,EAAM,YAAY,IAAM,CACxC8D,EAAkB,UACpB,qBAAqBA,EAAkB,OAAO,EAC9CA,EAAkB,QAAU,MAE1BC,EAAmB,UACrB,qBAAqBA,EAAmB,OAAO,EAC/CA,EAAmB,QAAU,MAE3BC,EAAc,UAChB,aAAaA,EAAc,OAAO,EAClCA,EAAc,QAAU,MAE1BC,EAAc,QAAU,EAC1B,EAAG,CAAA,CAAE,EAECI,EAAkBrE,EAAM,YAAY,IAAM,CAC1CtE,GAAqB,KAAOL,EAAiB,KAC/CK,GAAqB,MAAA,EAEnBD,GAAiB,KAAOJ,EAAiB,KAC3CI,GAAiB,MAAA,CAErB,EAAG,CAAA,CAAE,EAEC6I,EAAgBtE,EAAM,YACzBuE,IAA0C,CACzC,EAAG,OAAOA,EAAM,OAAO,EACvB,EAAG,OAAOA,EAAM,OAAO,CAAA,GAEzB,CAAA,CAAC,EAGGC,EAAgBxE,EAAM,YACzByE,IAAgC,CAC/B,EAAG,OAAOA,EAAM,OAAO,EACvB,EAAG,OAAOA,EAAM,OAAO,CAAA,GAEzB,CAAA,CAAC,EAGGC,EAA0B1E,EAAM,YAAY,IAAM,CACtD,GAAI0B,EAAQ,SAAS,QAAS,CAC5B,MAAMiD,EAASjD,EAAQ,QAAQ,QAAQ,sBAAA,EACvCiC,EAAmB,QAAU,CAAE,EAAGgB,EAAO,KAAM,EAAGA,EAAO,GAAA,CAC3D,CACF,EAAG,CAACjD,EAAQ,OAAO,CAAC,EAEdkD,EAAoB5E,EAAM,YAC9B,CAAC,CAAE,EAAA6E,EAAG,EAAAC,CAAA,EAAYC,IAAiC,CACjD,GAAI,CAACrD,EAAQ,SAAS,QACpB,MAAO,CAAE,EAAG,EAAG,EAAG,CAAA,EAEpB,MAAMsD,EAActD,EAAQ,QAAQ,QAAQ,sBAAA,EAC5C,MAAO,CACL,EAAGsD,EAAY,MAAQ,GAAKH,EAAIE,EAAe,GAC/C,EAAGC,EAAY,OAAS,GAAKF,EAAIC,EAAe,EAAA,CAEpD,EACA,CAACrD,EAAQ,OAAO,CAAA,EAGZuD,EAAkBjF,EAAM,YAC5B,CAAC,CAAE,EAAA6E,EAAG,EAAAC,MACG,CACL,GAAID,EAAI3F,EAAK,GAAKN,EAClB,GAAIkG,EAAI5F,EAAK,GAAKN,CAAA,GAGtB,CAACM,EAAMN,CAAI,CAAA,EAGPsG,EAAwBlF,EAAM,YAAY,IAAM,CACpD,GAAI,CAACrB,GAAY,CAACD,EAAW,OAE7B,MAAMsE,EAAetB,EAAQ,cAEzBxC,EADAV,EAAgBU,EAAMR,EAAWC,EAAUC,EAAMnB,CAAQ,GAI3D,KAAK,IAAIuF,EAAY,EAAI9D,EAAK,CAAC,EAAI,MACnC,KAAK,IAAI8D,EAAY,EAAI9D,EAAK,CAAC,EAAI,OAEnCiC,EAAM,SAAS,OAAQ6B,CAAW,CAEtC,EAAG,CAACrE,EAAUD,EAAWgD,EAAQ,cAAexC,EAAMN,EAAMnB,EAAU0D,CAAK,CAAC,EAEtET,EAAeV,EAAM,YACzB,CAACmF,EAAiBC,EAAcC,EAAuB,KAAS,CAC9D,GAAI,CAAC1G,GAAY,CAACD,EAAW,OAE7B,MAAM4G,EAAc3J,GAAMwJ,EAASzD,EAAQ,QAASA,EAAQ,OAAO,EAEnEP,EAAM,MAAM,IAAM,CAChB,GAAIkE,EAAsB,CACxB,MAAME,EAAYX,EAChBQ,EACAzB,EAAmB,OAAA,EAEf6B,EAAaP,EAAgBM,CAAS,EACtCE,EAAoB,CACxB,EAAGD,EAAW,EAAIF,EAAcC,EAAU,EAC1C,EAAGC,EAAW,EAAIF,EAAcC,EAAU,CAAA,EAGtCvC,GAAetB,EAAQ,cAQzB+D,EAPAjH,EACEiH,EACA/G,EACAC,EACA2G,EACA7H,CAAA,EAIN0D,EAAM,SAAS,OAAQ6B,EAAW,CACpC,CACA7B,EAAM,SAAS,OAAQmE,CAAW,CACpC,CAAC,EAED,sBAAsB,IAAM,CAC1BJ,EAAA,CACF,CAAC,CACH,EACA,CACEvG,EACAD,EACAgD,EAAQ,QACRA,EAAQ,QACRA,EAAQ,cACRkD,EACAK,EACAxH,EACA0D,EACA+D,CAAA,CACF,EAGIQ,EAAc1F,EAAM,YACxB,CAAC,CAAE,EAAA6E,EAAG,EAAAC,KAAe,CACnBrB,EAAqB,QAAU,CAAE,EAAAoB,EAAG,EAAAC,CAAA,EACpCpB,EAAiB,QAAU,CAAE,GAAGxE,CAAA,EAChCiC,EAAM,SAAS,aAAc,EAAI,CACnC,EACA,CAACjC,EAAMiC,CAAK,CAAA,EAGRwE,EAAS3F,EAAM,YACnB,CAAC,CAAE,EAAA6E,EAAG,EAAAC,KAAe,CACfhB,EAAkB,SACpB,qBAAqBA,EAAkB,OAAO,EAGhDA,EAAkB,QAAU,sBAAsB,IAAM,CAEtD,GADI,CAACnF,GAAY,CAACD,GACdmG,IAAM,QAAaC,IAAM,OAAW,OAExC,MAAMc,EAAUf,EAAIpB,EAAqB,QAAQ,EAC3CoC,EAAUf,EAAIrB,EAAqB,QAAQ,EAEjD,GAAI,KAAK,IAAImC,CAAO,EAAI,GAAK,KAAK,IAAIC,CAAO,EAAI,EAC/C,OAGF,MAAMJ,EAAoB,CACxB,EAAG/B,EAAiB,QAAQ,EAAIkC,EAChC,EAAGlC,EAAiB,QAAQ,EAAImC,CAAA,EAG5B7C,EAAetB,EAAQ,cAQzB+D,EAPAjH,EACEiH,EACA/G,EACAC,EACAC,EACAnB,CAAA,EAIAqI,EAAc3E,EAAM,SAAA,EAAW,MAEnC,KAAK,IAAI6B,EAAY,EAAI8C,EAAY,CAAC,EAAI,GAC1C,KAAK,IAAI9C,EAAY,EAAI8C,EAAY,CAAC,EAAI,IAE1C3E,EAAM,SAAS,OAAQ6B,CAAW,CAEtC,CAAC,CACH,EACA,CAACrE,EAAUD,EAAWgD,EAAQ,cAAe9C,EAAMnB,EAAU0D,CAAK,CAAA,EAG9D4E,EAAc/F,EAAM,YACvBuE,GAAsBoB,EAAOrB,EAAcC,CAAK,CAAC,EAClD,CAACD,EAAeqB,CAAM,CAAA,EAGlBK,EAAchG,EAAM,YACvBuE,GAAsB,CAErB,GADAA,EAAM,eAAA,EACFA,EAAM,QAAQ,SAAW,EAAG,CAC9B,KAAM,CAAC0B,EAAYC,CAAW,EAAI3B,EAAM,SAAW,CAAA,EACnD,GAAI0B,GAAcC,EAAa,CAC7B,MAAMpJ,EAAS0H,EAAcyB,CAAU,EACjClJ,EAASyH,EAAc0B,CAAW,EAClCC,EAASnJ,GAAUF,EAAQC,CAAM,EACvC4I,EAAOQ,CAAM,EAETpC,EAAmB,SACrB,qBAAqBA,EAAmB,OAAO,EAGjDA,EAAmB,QAAU,sBAAsB,IAAM,CACvD,MAAMqC,EAAWvJ,GAAyBC,EAAQC,CAAM,EAClDsJ,GAAgBD,EAAWxC,EAAqB,QAEtD,GAAI,KAAK,IAAIyC,GAAgB,CAAC,EAAI,IAAM,CACtC,MAAMlB,GAAUvG,EAAOyH,GACvB3F,EAAayE,GAASgB,EAAQ,EAAK,EACnCvC,EAAqB,QAAUwC,CACjC,CAEA,MAAME,GAAgBnJ,GAAyBL,EAAQC,CAAM,EACvDwJ,GAAeD,GAAgBzC,EAAqB,QAE1D,GAAI,KAAK,IAAI0C,EAAY,EAAI,GAAK,CAChC,MAAMC,GAAc/I,EAAW8I,GAC/BpF,EAAM,SAAS,WAAYqF,EAAW,EACtC3C,EAAqB,QAAUyC,EACjC,CACF,CAAC,CACH,CACF,SAAW/B,EAAM,QAAQ,SAAW,EAAG,CACrC,MAAM0B,EAAa1B,EAAM,QAAQ,CAAC,EAC9B0B,GACFN,EAAOnB,EAAcyB,CAAU,CAAC,CAEpC,CACF,EACA,CAACzB,EAAemB,EAAQ/G,EAAM8B,EAAcjD,EAAU0D,CAAK,CAAA,EAGvDsF,EAAkBzG,EAAM,YAC3BuE,GAAwB,CAEvB,GADAA,EAAM,eAAA,EACFN,EAAc,QAChB,OAGF,MAAMmB,EAAQ,CAAE,EAAG,OAAOb,EAAM,OAAO,EAAG,EAAG,OAAOA,EAAM,OAAO,CAAA,EAC3DY,EAAUjB,EAAoB,QAAU,EAAIK,EAAM,MACxD7D,EAAayE,EAASC,EAAO,EAAI,EAEjC,MAAMoB,EAAcrC,EAAwB,QAAUI,EAAM,SAC5DpD,EAAM,SAAS,WAAYqF,CAAW,CACxC,EACA,CAAC9F,EAAcS,CAAK,CAAA,EAGhBuF,EAAe1G,EAAM,YAAY,IAAM,CAC3C,SAAS,oBACP,gBACAyG,CAAA,EAEF,SAAS,oBAAoB,aAAcC,CAA6B,CAC1E,EAAG,CAACD,CAAe,CAAC,EAEdE,GAAiB3G,EAAM,YAC1BuE,GAAwB,CACvBA,EAAM,eAAA,EACN,SAAS,iBACP,gBACAkC,CAAA,EAEF,SAAS,iBAAiB,aAAcC,CAA6B,EACrExC,EAAoB,QAAUtF,EAC9BuF,EAAwB,QAAU1G,CACpC,EACA,CAACmB,EAAMnB,EAAUgJ,EAAiBC,CAAY,CAAA,EAG1CE,GAAsB5G,EAAM,YAC/BuE,GAAiBA,EAAM,eAAA,EACxB,CAAA,CAAC,EAGGsC,GAAkB7G,EAAM,YAAY,IAAM,CAC9C,SAAS,oBAAoB,YAAa+F,CAAW,EACrD,SAAS,oBAAoB,YAAaC,CAAW,EACrD,SAAS,oBACP,gBACAS,CAAA,EAEF,SAAS,oBAAoB,aAAcC,CAA6B,CAC1E,EAAG,CAACX,EAAaC,EAAaS,EAAiBC,CAAY,CAAC,EAEtDI,EAAgB9G,EAAM,YAAY,IAAM,CAC5CiE,EAAc,QAAU,GACxB9C,EAAM,SAAS,aAAc,EAAK,EAClCiD,EAAA,EACA,SAAS,oBAAoB,UAAW0C,CAAa,EACrD,SAAS,oBAAoB,WAAYA,CAAa,EACtDD,GAAA,CACF,EAAG,CAAC1F,EAAO0F,GAAiBzC,CAAa,CAAC,EAEpC2C,GAAgB/G,EAAM,YAAauE,GAAsB,CAC7D,IAAIyC,EAASzC,EAAM,OACf0C,EAAS1C,EAAM,OACf2C,EAAS3C,EAAM,OAEnB,OAAIA,EAAM,YAAc,GACtByC,GAAU,GACVC,GAAU,GACVC,GAAU,IACD3C,EAAM,YAAc,IAC7ByC,GAAU,IACVC,GAAU,IACVC,GAAU,KAGL,CAAE,OAAAF,EAAQ,OAAAC,EAAQ,OAAAC,CAAA,CAC3B,EAAG,CAAA,CAAE,EAECC,GAAcnH,EAAM,YACvBuE,GAAsB,CAErB,GADAjB,EAAa,cAAciB,CAAK,EAC5BA,EAAM,iBAAkB,OAE5BA,EAAM,eAAA,EACN,MAAMa,EAAQd,EAAcC,CAAK,EAC3B,CAAE,OAAA0C,CAAA,EAAWF,GAAcxC,CAAK,EAChCY,EAAUvG,EAAQqI,EAASvF,EAAQ,UAAa,IACtDhB,EAAayE,EAASC,EAAO,EAAI,EAEjCjE,EAAM,MAAM,IAAM,CAChB,MAAMG,EAAeH,EAAM,SAAA,EACtBG,EAAa,gBAChBH,EAAM,SAAS,iBAAkB,EAAI,EAElCG,EAAa,YAChBH,EAAM,SAAS,aAAc,EAAI,CAErC,CAAC,EAEG6C,EAAc,SAChB,aAAaA,EAAc,OAAO,EAEpCA,EAAc,QAAU,OAAO,WAAW,IAAM,CAC9C7C,EAAM,MAAM,IAAM,CAChBA,EAAM,SAAS,iBAAkB,EAAK,EACtCA,EAAM,SAAS,aAAc,EAAK,CACpC,CAAC,CACH,EAAG,GAAG,CACR,EACA,CACEmC,EAAa,YACbgB,EACA1F,EACA8C,EAAQ,UACRhB,EACAqG,GACA5F,CAAA,CACF,EAGIiG,GAAUpH,EAAM,YACnBuE,GAA4C,CAE3C,GADAjB,EAAa,UAAUiB,CAAK,EACxBA,EAAM,iBAAkB,WAEN,IAAI,CACxB,UACA,YACA,YACA,YAAA,CACD,EAEa,IAAIA,EAAM,GAAG,IACzBA,EAAM,eAAA,EACNpD,EAAM,SAAS,aAAc,EAAK,EAEtC,EACA,CAACmC,EAAa,QAASnC,CAAK,CAAA,EAGxBkG,GAAYrH,EAAM,YACrBuE,GAA4C,CAE3C,GADAjB,EAAa,YAAYiB,CAAK,EAC1BA,EAAM,kBAAoB,CAAC5F,GAAY,CAACD,EAAW,OAEvD,IAAIzC,EAAOyF,EAAQ,aACf6C,EAAM,WACRtI,GAAQ,IAUV,MAAMqL,EAP4C,CAChD,QAAS,KAAO,CAAE,GAAGpI,EAAM,EAAGA,EAAK,EAAIjD,IACvC,UAAW,KAAO,CAAE,GAAGiD,EAAM,EAAGA,EAAK,EAAIjD,IACzC,UAAW,KAAO,CAAE,GAAGiD,EAAM,EAAGA,EAAK,EAAIjD,IACzC,WAAY,KAAO,CAAE,GAAGiD,EAAM,EAAGA,EAAK,EAAIjD,CAAA,EAAK,EAGnBsI,EAAM,GAAG,EACvC,GAAI,CAAC+C,EAAU,OAEf/C,EAAM,eAAA,EAEN,IAAIgD,EAAUD,EAAA,EAET5F,EAAQ,gBACX6F,EAAU/I,EAAgB+I,EAAS7I,EAAWC,EAAUC,EAAMnB,CAAQ,GAGnE8G,EAAM,QACTpD,EAAM,SAAS,aAAc,EAAI,EAGnCA,EAAM,SAAS,OAAQoG,CAAO,CAChC,EACA,CACEjE,EAAa,UACb3E,EACAD,EACAgD,EAAQ,aACRA,EAAQ,cACRxC,EACAN,EACAnB,EACA0D,CAAA,CACF,EAGIqG,GAAcxH,EAAM,YACvBuE,GAAyC,CACxCjB,EAAa,cAAciB,CAAK,EAC5B,CAAAA,EAAM,mBAEVA,EAAM,eAAA,EACN,SAAS,iBAAiB,YAAawB,CAAW,EAClD,SAAS,iBAAiB,UAAWe,CAAa,EAClDpC,EAAA,EACAgB,EAAYpB,EAAcC,CAAK,CAAC,EAClC,EACA,CACEjB,EAAa,YACbgB,EACAoB,EACAoB,EACAf,EACArB,CAAA,CACF,EAGI+C,GAAezH,EAAM,YACxBuE,GAAyC,CAExC,GADAjB,EAAa,eAAeiB,CAAK,EAC7B,CAAAA,EAAM,kBAOV,GALAN,EAAc,QAAU,GACxB,SAAS,iBAAiB,YAAa+B,EAAa,CAAE,QAAS,GAAO,EACtE,SAAS,iBAAiB,WAAYc,CAAa,EACnDpC,EAAA,EAEIH,EAAM,QAAQ,SAAW,EAAG,CAC9B,KAAM,CAAC0B,EAAYC,CAAW,EAAI3B,EAAM,QACpC,MAAM,KAAKA,EAAM,OAAO,EACxB,CAAA,EACJ,GAAI0B,GAAcC,EAAa,CAC7B,MAAMpJ,EAAS0H,EAAcyB,CAAU,EACjClJ,EAASyH,EAAc0B,CAAW,EACxCtC,EAAqB,QAAU/G,GAC7BC,EACAC,CAAA,EAEF8G,EAAqB,QAAU1G,GAC7BL,EACAC,CAAA,EAEF2I,EAAY1I,GAAUF,EAAQC,CAAM,CAAC,CACvC,CACF,SAAWwH,EAAM,QAAQ,SAAW,EAAG,CACrC,MAAM0B,EAAa1B,EAAM,QAAQ,CAAC,EAC9B0B,GACFP,EAAYlB,EAAcyB,CAAU,CAAC,CAEzC,EACF,EACA,CACE3C,EAAa,aACbwD,EACAd,EACAtB,EACAF,EACAkB,CAAA,CACF,EAGF1F,EAAM,UAAU,IAAM,CACpB,MAAM0H,EAAUhG,EAAQ,SAAS,QACjC,GAAKgG,EAEL,OAAKhG,EAAQ,mBACXgG,EAAQ,iBAAiB,QAASP,GAAa,CAAE,QAAS,GAAO,EAGnEO,EAAQ,iBAAiB,eAAgBd,EAAmB,EAC5Dc,EAAQ,iBAAiB,eAAgBf,EAA+B,EAEjE,IAAM,CACNjF,EAAQ,mBACXgG,EAAQ,oBAAoB,QAASP,EAAW,EAElDO,EAAQ,oBAAoB,eAAgBd,EAAmB,EAC/Dc,EAAQ,oBACN,eACAf,EAAA,EAEFvC,EAAA,CACF,CACF,EAAG,CACD1C,EAAQ,QACRA,EAAQ,kBACRyF,GACA/C,EACAwC,GACAD,EAAA,CACD,EAED3G,EAAM,UAAU,IACP,IAAM,CACXoE,EAAA,EACAC,EAAA,CACF,EACC,CAACD,EAAeC,CAAe,CAAC,EAEnC,MAAMsD,GAAgBtE,EAAUuE,GAAAA,KAAO,MAEvC,OACE1E,EAAAA,IAACyE,GAAA,CACC,YAAU,UACV,SAAU,EACT,GAAGrE,EACJ,IAAKC,EACL,UAAWJ,EAAAA,GACT,kJACAT,CAAA,EAEF,QAAA0E,GACA,UAAAC,GACA,YAAAG,GACA,aAAAC,EAAA,CAAA,CAGN,CAEA,MAAMI,GAAuBC,GAAAA,IAAI,2BAA4B,CAC3D,SAAU,CACR,UAAW,CACT,QAAS,+DACT,MAAO,sBACP,mBAAoB,sBACpB,iBAAkB,qBAAA,CACpB,EAEF,gBAAiB,CACf,UAAW,SAAA,CAEf,CAAC,EAYD,SAASC,GAAmE,CAC1E,SAAAC,EACA,QAAAtG,EACA,MAAAP,EACA,SAAA1D,EACA,qBAAAwK,CACF,EAAgC,CAqH9B,MAAO,CAAE,aApHYjI,EAAM,YAAY,IAAM,CAC3C,MAAMkI,EAAQF,EAAS,QACjBN,EAAUhG,EAAQ,SAAS,QACjC,GAAI,CAACwG,GAAS,CAACR,EAAS,OAExB,MAAM1C,EAAc0C,EAAQ,sBAAA,EACtBS,EAAkBnD,EAAY,MAAQA,EAAY,OAClD,CAAE,MAAOoD,EAAc,OAAQC,CAAA,EACnCJ,EAAqBC,CAAK,EACtBI,EACJJ,EAAM,YAAcE,GAAgBF,EAAM,aAAeG,EACrDE,EAAcH,EAAeC,EAEnC,IAAIG,EAEJ,GAAIF,EAAc,CAgChB,MAAMhB,EA/BqB,CACzB,QAAS,IACPa,EAAkBI,EACd,CACE,MAAOvD,EAAY,OAASuD,EAC5B,OAAQvD,EAAY,MAAA,EAEtB,CACE,MAAOA,EAAY,MACnB,OAAQA,EAAY,MAAQuD,CAAA,EAEpC,mBAAoB,KAAO,CACzB,MAAOvD,EAAY,MACnB,OAAQA,EAAY,MAAQuD,CAAA,GAE9B,iBAAkB,KAAO,CACvB,MAAOvD,EAAY,OAASuD,EAC5B,OAAQvD,EAAY,MAAA,GAEtB,MAAO,IACLmD,EAAkBI,EACd,CACE,MAAOvD,EAAY,MACnB,OAAQA,EAAY,MAAQuD,CAAA,EAE9B,CACE,MAAOvD,EAAY,OAASuD,EAC5B,OAAQvD,EAAY,MAAA,CACtB,EAG4BtD,EAAQ,SAAS,EACrD8G,EAAoBlB,EAChBA,IACAa,EAAkBI,EAChB,CACE,MAAOvD,EAAY,OAASuD,EAC5B,OAAQvD,EAAY,MAAA,EAEtB,CACE,MAAOA,EAAY,MACnB,OAAQA,EAAY,MAAQuD,CAAA,CAEtC,MACEC,EAAoB,CAClB,MAAON,EAAM,YACb,OAAQA,EAAM,YAAA,EAIlB,MAAMxJ,EAAuB,CAC3B,GAAG8J,EACH,aAAAJ,EACA,cAAAC,CAAA,EAGFlH,EAAM,SAAS,YAAazC,CAAS,EAErC,MAAMC,EAAWX,GACfU,EAAU,MACVA,EAAU,OACVsG,EAAY,MACZA,EAAY,OACZtD,EAAQ,YACRjE,CAAA,EAGF,OAAA0D,EAAM,SAAS,WAAYxC,CAAQ,EAEnC,sBAAsB,IAAM,CAC1B,MAAM2C,EAAeH,EAAM,SAAA,EAC3B,GAAIG,EAAa,UAAYA,EAAa,UAAW,CACnD,MAAM0B,EAAcxE,EAClB8C,EAAa,KACbA,EAAa,UACbA,EAAa,SACbA,EAAa,KACbA,EAAa,QAAA,GAIb,KAAK,IAAI0B,EAAY,EAAI1B,EAAa,KAAK,CAAC,EAAI,MAChD,KAAK,IAAI0B,EAAY,EAAI1B,EAAa,KAAK,CAAC,EAAI,OAEhDH,EAAM,SAAS,OAAQ6B,CAAW,CAEtC,CACF,CAAC,EAEM,CAAE,UAAAtE,EAAW,SAAAC,CAAA,CACtB,EAAG,CACDqJ,EACAtG,EAAQ,YACRA,EAAQ,QACRA,EAAQ,UACRP,EACA1D,EACAwK,CAAA,CACD,CAEQ,CACX,CASA,SAASQ,GAAaxG,EAA0B,CAC9C,KAAM,CACJ,UAAAS,EACA,MAAAgG,EACA,QAAArF,EACA,IAAAtD,EACA,OAAA4I,EACA,UAAApG,EACA,WAAAqG,EAAa,GACb,GAAGC,CAAA,EACD5G,EAEEP,EAAUK,GAAkB7G,EAAU,EACtCiG,EAAQK,GAAgBtG,EAAU,EAClCgE,EAAOyC,EAAUN,GAAUA,EAAM,IAAI,EACrCzC,EAAO+C,EAAUN,GAAUA,EAAM,IAAI,EACrC5D,EAAWkE,EAAUN,GAAUA,EAAM,QAAQ,EAE7CyH,EAAW9I,EAAM,OAAyB,IAAI,EAC9CuD,EAAcC,GAAAA,gBAAgBzD,EAAK+I,CAAQ,EAE3Cb,EAAuBjI,EAAM,YAChC+I,IAA6B,CAC5B,MAAOA,EAAM,aACb,OAAQA,EAAM,aAAA,GAEhB,CAAA,CAAC,EAGG,CAAE,aAAAC,CAAA,EAAiBjB,GAAoB,CAC3C,SAAUe,EACV,QAAApH,EACA,MAAAP,EACA,SAAA1D,EACA,qBAAAwK,CAAA,CACD,EAEKgB,EAAcjJ,EAAM,YAAY,IAAM,CAC5B8I,EAAS,UAGvBE,EAAA,EAEAL,IACE,IAAI,MAAM,MAAM,CAAA,EAEpB,EAAG,CAACK,EAAcL,CAAM,CAAC,EAEzB3I,EAAM,UAAU,IAAM,CACpB,MAAM+I,EAAQD,EAAS,QACnBC,GAAO,UAAYA,EAAM,aAAe,GAC1CE,EAAA,CAEJ,EAAG,CAACA,CAAW,CAAC,EAEhBjJ,EAAM,UAAU,IAAM,CACpB,MAAM0H,EAAUhG,EAAQ,SAAS,QACjC,GAAKgG,EAEL,GAAI,OAAO,eAAmB,IAAa,CACzC,IAAIwB,EAAgB,GACpB,MAAMC,EAAiB,IAAI,eAAe,IAAM,CAC9C,GAAID,EAAe,CACjBA,EAAgB,GAChB,MACF,CAEA,MAAM5B,EAAW,IAAM,CACrB,MAAMyB,EAAQD,EAAS,QACnBC,GAAO,UAAYA,EAAM,aAAe,GAC1CC,EAAA,CAEJ,EAEI,wBAAyB,OAC3B,oBAAoB1B,CAAQ,EAE5B,WAAWA,EAAU,EAAE,CAE3B,CAAC,EAED,OAAA6B,EAAe,QAAQzB,CAAO,EAEvB,IAAM,CACXyB,EAAe,WAAA,CACjB,CACF,KAAO,CACL,MAAMC,EAAiB,IAAM,CAC3B,MAAML,EAAQD,EAAS,QACnBC,GAAO,UAAYA,EAAM,aAAe,GAC1CC,EAAA,CAEJ,EAEA,cAAO,iBAAiB,SAAUI,CAAc,EACzC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAc,CACrD,CACF,CACF,EAAG,CAAC1H,EAAQ,QAASsH,CAAY,CAAC,EAElC,MAAMK,EAAiBhG,EAAUuE,GAAAA,KAAO,MAExC,OACE1E,EAAAA,IAACmG,EAAA,CACC,YAAU,gBACT,GAAGR,EACJ,IAAKtF,EACL,UAAWJ,EAAAA,GACT0E,GAAqB,CACnB,UAAWtF,GAAab,EAAQ,UAChC,UAAAgB,CAAA,CACD,CAAA,EAEH,MAAO,CACL,UAAWkG,EACP,aAAavM,GAAkB6C,EAAK,CAAC,CAAC,OAAO7C,GAAkB6C,EAAK,CAAC,CAAC,cAAczB,CAAQ,cAAcmB,CAAI,IAC9G,aAAaM,EAAK,CAAC,OAAOA,EAAK,CAAC,cAAczB,CAAQ,cAAcmB,CAAI,IAC5E,GAAG8J,CAAA,EAEL,OAAQO,CAAA,CAAA,CAGd,CASA,SAASK,GAAarH,EAA0B,CAC9C,KAAM,CACJ,UAAAS,EACA,MAAAgG,EACA,QAAArF,EACA,IAAAtD,EACA,iBAAAwJ,EACA,UAAAhH,EACA,WAAAqG,EAAa,GACb,GAAGY,CAAA,EACDvH,EAEEP,EAAUK,GAAkB5G,EAAU,EACtCgG,EAAQK,GAAgBrG,EAAU,EAClC+D,EAAOyC,EAAUN,GAAUA,EAAM,IAAI,EACrCzC,EAAO+C,EAAUN,GAAUA,EAAM,IAAI,EACrC5D,EAAWkE,EAAUN,GAAUA,EAAM,QAAQ,EAE7CoI,EAAWzJ,EAAM,OAAyB,IAAI,EAC9CuD,EAAcC,GAAAA,gBAAgBzD,EAAK0J,CAAQ,EAE3CxB,EAAuBjI,EAAM,YAChC0J,IAA6B,CAC5B,MAAOA,EAAM,WACb,OAAQA,EAAM,WAAA,GAEhB,CAAA,CAAC,EAGG,CAAE,aAAAV,CAAA,EAAiBjB,GAAoB,CAC3C,SAAU0B,EACV,QAAA/H,EACA,MAAAP,EACA,SAAA1D,EACA,qBAAAwK,CAAA,CACD,EAEKgB,EAAcjJ,EAAM,YAAY,IAAM,CAC5ByJ,EAAS,UAGvBT,EAAA,EAEAO,IACE,IAAI,MACF,gBAAA,CACF,EAEJ,EAAG,CAACP,EAAcO,CAAgB,CAAC,EAEnCvJ,EAAM,UAAU,IAAM,CACpB,MAAM0H,EAAUhG,EAAQ,SAAS,QACjC,GAAKgG,EAEL,GAAI,OAAO,eAAmB,IAAa,CACzC,IAAIwB,EAAgB,GACpB,MAAMC,EAAiB,IAAI,eAAe,IAAM,CAC9C,GAAID,EAAe,CACjBA,EAAgB,GAChB,MACF,CAEA,MAAM5B,EAAW,IAAM,CACrB,MAAMoC,EAAQD,EAAS,QACnBC,GAASA,EAAM,WAAa,GAAKA,EAAM,YAAc,GACvDV,EAAA,CAEJ,EAEI,wBAAyB,OAC3B,oBAAoB1B,CAAQ,EAE5B,WAAWA,EAAU,EAAE,CAE3B,CAAC,EAED,OAAA6B,EAAe,QAAQzB,CAAO,EAEvB,IAAM,CACXyB,EAAe,WAAA,CACjB,CACF,KAAO,CACL,MAAMC,EAAiB,IAAM,CAC3B,MAAMM,EAAQD,EAAS,QACnBC,GAASA,EAAM,WAAa,GAAKA,EAAM,YAAc,GACvDV,EAAA,CAEJ,EAEA,cAAO,iBAAiB,SAAUI,CAAc,EACzC,IAAM,CACX,OAAO,oBAAoB,SAAUA,CAAc,CACrD,CACF,CACF,EAAG,CAAC1H,EAAQ,QAASsH,CAAY,CAAC,EAElC,MAAMW,EAAiBtG,EAAUuE,GAAAA,KAAO,QAExC,OACE1E,EAAAA,IAACyG,EAAA,CACC,YAAU,gBACV,SAAQ,GACR,YAAW,GACX,KAAI,GACJ,MAAK,GACL,SAAU,GACT,GAAGH,EACJ,IAAKjG,EACL,UAAWJ,EAAAA,GACT0E,GAAqB,CACnB,UAAWtF,GAAab,EAAQ,UAChC,UAAAgB,CAAA,CACD,CAAA,EAEH,MAAO,CACL,UAAWkG,EACP,aAAavM,GAAkB6C,EAAK,CAAC,CAAC,OAAO7C,GAAkB6C,EAAK,CAAC,CAAC,cAAczB,CAAQ,cAAcmB,CAAI,IAC9G,aAAaM,EAAK,CAAC,OAAOA,EAAK,CAAC,cAAczB,CAAQ,cAAcmB,CAAI,IAC5E,GAAG8J,CAAA,EAEL,iBAAkBO,CAAA,CAAA,CAGxB,CAEA,MAAMW,GAAsB9B,GAAAA,IAC1B,sMACA,CACE,SAAU,CACR,MAAO,CACL,UAAW,GACX,OAAQ,iBAAA,EAEV,SAAU,CACR,KAAM,mbACN,MAAO,EAAA,CACT,EAEF,gBAAiB,CACf,MAAO,YACP,SAAU,EAAA,CACZ,CAEJ,EAQA,SAAS+B,GAAY5H,EAAyB,CAC5C,KAAM,CACJ,UAAAS,EACA,MAAAgG,EACA,QAAArF,EACA,IAAAtD,EACA,WAAA6I,EAAa,GACb,MAAAtG,EACA,SAAAG,EACA,GAAGqH,CAAA,EACD7H,EAEEP,EAAUK,GAAkB3G,EAAS,EACrCuD,EAAWgD,EAAUN,GAAUA,EAAM,QAAQ,EAEnD,GAAI,CAAC1C,EAAU,OAAO,KAEtB,MAAMoL,EAAgB1G,EAAUuE,GAAAA,KAAO,MAEvC,OACE1E,EAAAA,IAAC6G,EAAA,CACC,YAAU,eACT,GAAGD,EACJ,IAAA/J,EACA,UAAWoD,EAAAA,GACTyG,GAAoB,CAClB,MAAOtH,GAASZ,EAAQ,MACxB,SAAUe,GAAYf,EAAQ,SAC9B,UAAAgB,CAAA,CACD,CAAA,EAEH,MAAO,CACL,MAAOkG,EAAa,KAAK,MAAMjK,EAAS,KAAK,EAAIA,EAAS,MAC1D,OAAQiK,EAAa,KAAK,MAAMjK,EAAS,MAAM,EAAIA,EAAS,OAC5D,GAAG+J,CAAA,CACL,CAAA,CAGN"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),ve=require("react"),be=require("../../packages/ui/src/components/calendar.cjs"),I=require("../../packages/ui/src/components/popover.cjs"),b=require("../../packages/ui/src/components/drawer.cjs");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const h=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");const we=require("lucide-react");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const xe=require("./TimePicker.cjs"),D=require("react-device-detect"),j=require("date-fns"),K=require("date-fns/locale"),G=require("../../constants/common.cjs"),ye=require("../Button/Button.cjs"),he=require("../Input/Input.cjs");function De(
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime"),ve=require("react"),be=require("../../packages/ui/src/components/calendar.cjs"),I=require("../../packages/ui/src/components/popover.cjs"),b=require("../../packages/ui/src/components/drawer.cjs");require("@radix-ui/react-slot");require("../../packages/ui/src/components/button.cjs");require("../../packages/ui/src/components/button-group.cjs");require("../../packages/ui/src/components/input.cjs");require("../../packages/ui/src/components/textarea.cjs");require("@radix-ui/react-label");const h=require("../../packages/ui/src/lib/utils.cjs");require("../../packages/ui/src/components/select.cjs");require("../../packages/ui/src/components/combobox.cjs");require("@radix-ui/react-tooltip");require("@radix-ui/react-separator");require("../../packages/ui/src/components/switch.cjs");require("@radix-ui/react-scroll-area");require("../../packages/ui/src/components/tree-view.cjs");require("@radix-ui/react-alert-dialog");require("@radix-ui/react-avatar");require("../../packages/ui/src/components/badge.cjs");const we=require("lucide-react");require("../../packages/ui/src/components/checkbox.cjs");require("@radix-ui/react-collapsible");require("cmdk");require("@radix-ui/react-dialog");require("@radix-ui/react-dropdown-menu");require("../../packages/ui/src/components/input-otp.cjs");require("../../packages/ui/src/components/radio-group.cjs");require("../../packages/ui/src/components/sidebar.cjs");require("@radix-ui/react-slider");require("../../packages/ui/src/components/tabs.cjs");require("../../packages/ui/src/components/toggle.cjs");const xe=require("./TimePicker.cjs"),D=require("react-device-detect"),j=require("date-fns"),K=require("date-fns/locale"),G=require("../../constants/common.cjs"),ye=require("../Button/Button.cjs"),he=require("../Input/Input.cjs");function De(s){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(s){for(const t in s)if(t!=="default"){const z=Object.getOwnPropertyDescriptor(s,t);Object.defineProperty(n,t,z.get?z:{enumerable:!0,get:()=>s[t]})}}return n.default=s,Object.freeze(n)}const m=De(ve);function Me(s,n=G.DATE_FORMAT,t){return s?j.format(s,n,t?{locale:t}:void 0):""}const M=(s,n=G.DATE_FORMAT)=>{const t=j.parse(s,n,new Date);return j.isValid(t)?t:void 0};function je(s){return s.replace(/dd|MM|yyyy/g,n=>{switch(n){case"dd":case"MM":return"99";case"yyyy":return"9999";default:return n}}).replace(/d|M|y/g,n=>{switch(n){case"d":case"M":return"9";case"y":return"9";default:return n}})}function ze({value:s,onChange:n,onSelect:t,calendarClassName:z,side:J="bottom",align:Q="end",format:w="dd/MM/yyyy",language:W="vi",mask:S,closeOnSelect:X=!1,calendarConfig:k,desktopMode:N="popover",mobileMode:Y="drawer",showOutsideDays:Z=!0,children:R,showTime:c=!1,timeFormat:p="HH:mm",hideDate:C=!1,numberOfMonths:ee=1,variant:re="default",color:V="primary",timePickerMode:se="wheel",hourInterval:te=1,minuteInterval:ne=1,secondInterval:ie=1,disabledTimes:oe,disabledTimeRanges:ae,showNowButton:de=!1,nowButtonLabel:ue="Now",timePickerLabel:ce,openOnFocus:le=!0,...o}){let l,H;typeof w=="string"?(l=w,H=w):(l=w.input,H=w.output);let P;S===!0?P=je(l):typeof S=="string"&&(P=S);const T=C&&c?p:c?`${l} ${p}`:l,B=s?M(s,T):void 0,[x,y]=m.useState(!1),[a,d]=m.useState(B),[fe,q]=m.useState(B),[v,f]=m.useState(s||""),ge=m.useRef(null),F=m.useRef(!1),_=k?.locale?k?.locale:W==="en"?K.enUS:K.vi,A=D.isMobile?Y:N;m.useEffect(()=>{if(s!==v&&!F.current){f(s||"");const e=s?M(s,T):void 0;e?(d(e),q(e)):s||(d(void 0),q(void 0))}},[s,v,T]);const u=e=>{if(!e)return"";let r=Me(e,H,_);return c&&(r+=` ${j.format(e,p)}`),r},me=e=>{d(e),f(u(e)),t?.(e,u(e))},pe=e=>{if(!e){f(""),d(void 0),t?.(void 0,void 0);return}f(e);const r=M(e,l);r?(d(r),q(r),t?.(r,u(r))):(d(void 0),t?.(void 0,void 0))},qe=(e,r,O)=>{if(!O){n?.(e,r,void 0);return}const g=new Date(a||new Date);g.setHours(O.getHours(),O.getMinutes(),O.getSeconds(),0),d(g),f(u(g)),t?.(g,u(g)),n?.(e,u(g),g)},E=R?R({value:v,date:a,onSelect:me,onChange:pe}):i.jsxs(ye.default,{variant:"ghost",className:"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors",size:o.size,children:[i.jsx(we.CalendarIcon,{className:h.cn({"ds:size-3":o.size==="xs"||o.size==="sm","ds:size-3.5":!o.size||o.size==="normal","ds:size-4":o.size==="lg"||o.size==="xl"})}),i.jsx("span",{className:"ds:sr-only",children:"Select date"})]}),L=i.jsxs("div",{className:h.cn("ds:flex ds:items-stretch ds:mx-auto ds:w-full",c&&!C?"ds:gap-0 ds:md:max-w-lg":"",D.isMobile?"ds:max-w-md ds:md:max-w-md ds:lg:max-w-lg":""),children:[!C&&i.jsx(be.Calendar,{...k,mode:"single",selected:a,captionLayout:"dropdown",month:fe,onMonthChange:q,numberOfMonths:D.isMobile?1:ee||1,variant:re,color:V,onSelect:e=>{let r=e;e&&a&&c&&(r=new Date(e),r.setHours(a.getHours(),a.getMinutes(),a.getSeconds(),a.getMilliseconds())),d(r),f(u(r)),t?.(r,u(r)),X&&!c&&y(!1)},locale:_,formatters:{formatMonthDropdown:e=>e.toLocaleString(_.code,{month:"short"})},showOutsideDays:Z,className:h.cn("ds:my-auto ds:bg-transparent ds:mx-auto",{"ds:[--cell-size:clamp(0px,calc(100vw/7.5),52px)] ds:mb-8 ds:bg-transparent":D.isMobile&&!c||N==="drawer","ds:[--cell-size:clamp(0px,calc(100vw/7.5),34px)]":!D.isMobile&&N!=="drawer","ds:w-full":A==="drawer"&&c},z)}),c&&i.jsx("div",{className:"ds:border-l ds:border-border",children:i.jsx(xe.TimePicker,{value:a?j.format(a,p):void 0,format:p,onChange:qe,showHours:!0,showMinutes:!0,showSeconds:p==="HH:mm:ss",mode:se,hourInterval:te,minuteInterval:ne,secondInterval:ie,disabledTimes:oe,disabledTimeRanges:ae,showNowButton:de,nowButtonLabel:ue,timeLabel:ce,standalone:!1,color:V,isOpen:x})})]}),U=i.jsxs(I.Popover,{open:x,onOpenChange:y,children:[i.jsx(I.PopoverTrigger,{asChild:!0,disabled:o.disabled,children:E}),i.jsx(I.PopoverContent,{className:h.cn("ds:w-auto ds:overflow-hidden ds:p-0","ds:backdrop-blur ds:bg-background/50"),side:J,align:Q,children:L})]}),$=i.jsxs(b.Drawer,{open:x,onOpenChange:y,children:[i.jsx(b.DrawerTrigger,{asChild:!0,children:E}),i.jsxs(b.DrawerContent,{className:h.cn("ds:w-auto ds:overflow-hidden ds:p-0","ds:backdrop-blur ds:bg-background"),children:[i.jsxs(b.DrawerHeader,{className:"ds:sr-only",children:[i.jsx(b.DrawerTitle,{children:"Select date"}),i.jsx(b.DrawerDescription,{children:"Set date"})]}),L]})]});return R?A==="drawer"?$:U:i.jsx(he.default,{...o,ref:ge,type:"text",clearable:!0,value:v,mask:P,onChange:e=>{F.current=!0,f(e.target.value);const r=M(e.target.value,l);r?(d(r),q(r),t?.(r,u(r)),n?.(e,u(r),r)):(t?.(void 0,void 0),n?.(e,void 0,void 0))},onFocus:e=>{le&&!x&&!P&&y(!0),o.onFocus?.(e)},onBlur:e=>{setTimeout(()=>{F.current=!1,x||!M(v,l)&&v&&(f(""),d(void 0),q(void 0),t?.(void 0,void 0))},150),o.onBlur?.(e)},onKeyDown:e=>{e.key==="ArrowDown"&&(e.preventDefault(),y(!0)),o.onKeyDown?.(e)},suffixIcon:A==="drawer"?$:U})}exports.DatePicker=ze;
|
|
2
2
|
//# sourceMappingURL=DatePicker.cjs.map
|