@sth87/shadcn-design-system 0.1.8 → 0.2.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.
Files changed (788) hide show
  1. package/AI_README.md +114 -51
  2. package/README.md +83 -27
  3. package/dist/AI_CONTEXT.md +51 -52
  4. package/dist/cjs/_virtual/_commonjsHelpers.cjs +0 -1
  5. package/dist/cjs/_virtual/index.cjs +0 -1
  6. package/dist/cjs/_virtual/index2.cjs +0 -1
  7. package/dist/cjs/components/Accordion/Accordion.cjs +0 -1
  8. package/dist/cjs/components/Accordion/index.cjs +1 -0
  9. package/dist/cjs/components/Avatar/Avatar.cjs +1 -2
  10. package/dist/cjs/components/Avatar/index.cjs +1 -0
  11. package/dist/cjs/components/Badge/Badge.cjs +0 -1
  12. package/dist/cjs/components/Badge/index.cjs +1 -0
  13. package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +0 -1
  14. package/dist/cjs/components/Breadcrumb/index.cjs +1 -0
  15. package/dist/cjs/components/Button/Button.cjs +0 -1
  16. package/dist/cjs/components/Button/ButtonGroup.cjs +0 -1
  17. package/dist/cjs/components/Button/index.cjs +1 -0
  18. package/dist/cjs/components/Calendar/Calendar.cjs +1 -2
  19. package/dist/cjs/components/Calendar/index.cjs +1 -0
  20. package/dist/cjs/components/Carousel/Carousel.cjs +0 -1
  21. package/dist/cjs/components/Carousel/index.cjs +1 -0
  22. package/dist/cjs/components/Checkbox/Checkbox.cjs +1 -2
  23. package/dist/cjs/components/Checkbox/index.cjs +1 -0
  24. package/dist/cjs/components/Collapsible/Collapsible.cjs +0 -1
  25. package/dist/cjs/components/Collapsible/index.cjs +1 -0
  26. package/dist/cjs/components/Command/Command.cjs +0 -1
  27. package/dist/cjs/components/Command/index.cjs +0 -1
  28. package/dist/cjs/components/ContextMenu/ContextMenu.cjs +0 -1
  29. package/dist/cjs/components/ContextMenu/index.cjs +0 -1
  30. package/dist/cjs/components/Cropper/Cropper.cjs +1 -2
  31. package/dist/cjs/components/Cropper/CropperTool.cjs +0 -1
  32. package/dist/cjs/components/Cropper/index.cjs +1 -0
  33. package/dist/cjs/components/Cropper/utils.cjs +0 -1
  34. package/dist/cjs/components/DatePicker/DatePicker.cjs +1 -2
  35. package/dist/cjs/components/DatePicker/RangePicker.cjs +1 -2
  36. package/dist/cjs/components/DatePicker/TimePicker.cjs +1 -2
  37. package/dist/cjs/components/DatePicker/index.cjs +1 -0
  38. package/dist/cjs/components/Dialog/Dialog.cjs +0 -1
  39. package/dist/cjs/components/Dialog/index.cjs +1 -0
  40. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +0 -1
  41. package/dist/cjs/components/DropdownMenu/index.cjs +0 -1
  42. package/dist/cjs/components/FloatLabel.cjs +0 -1
  43. package/dist/cjs/components/Glass/Glass.cjs +1 -2
  44. package/dist/cjs/components/Glass/index.cjs +1 -0
  45. package/dist/cjs/components/ImageViewer/ImageViewer.cjs +1 -2
  46. package/dist/cjs/components/ImageViewer/index.cjs +1 -0
  47. package/dist/cjs/components/Input/Input.cjs +1 -2
  48. package/dist/cjs/components/Input/index.cjs +1 -0
  49. package/dist/cjs/components/InputOTP/InputOTP.cjs +1 -2
  50. package/dist/cjs/components/InputOTP/index.cjs +1 -0
  51. package/dist/cjs/components/Interactive/CursorFollow.cjs +1 -2
  52. package/dist/cjs/components/Interactive/index.cjs +1 -0
  53. package/dist/cjs/components/Label/index.cjs +1 -0
  54. package/dist/cjs/components/Marquee/Marquee.cjs +1 -2
  55. package/dist/cjs/components/Marquee/MarqueeWrapper.cjs +0 -1
  56. package/dist/cjs/components/Marquee/index.cjs +0 -1
  57. package/dist/cjs/components/Masonry/Masonry.cjs +1 -2
  58. package/dist/cjs/components/Masonry/MasonryWrapper.cjs +0 -1
  59. package/dist/cjs/components/Masonry/index.cjs +1 -0
  60. package/dist/cjs/components/Pagination/Pagination.cjs +0 -1
  61. package/dist/cjs/components/Pagination/index.cjs +0 -1
  62. package/dist/cjs/components/Popover/Popover.cjs +0 -1
  63. package/dist/cjs/components/Popover/index.cjs +1 -2
  64. package/dist/cjs/components/QrCode/QrCode.cjs +1 -2
  65. package/dist/cjs/components/QrCode/index.cjs +0 -1
  66. package/dist/cjs/components/Radio/Radio.cjs +1 -2
  67. package/dist/cjs/components/Radio/index.cjs +1 -0
  68. package/dist/cjs/components/Rate/Rate.cjs +0 -1
  69. package/dist/cjs/components/Rate/index.cjs +1 -0
  70. package/dist/cjs/components/Resizable/Resizable.cjs +0 -1
  71. package/dist/cjs/components/Resizable/index.cjs +1 -0
  72. package/dist/cjs/components/ScrollArea/ScrollArea.cjs +0 -1
  73. package/dist/cjs/components/ScrollArea/index.cjs +1 -0
  74. package/dist/cjs/components/Select/Select.cjs +1 -2
  75. package/dist/cjs/components/Select/index.cjs +1 -0
  76. package/dist/cjs/components/Separator/Separator.cjs +0 -1
  77. package/dist/cjs/components/Separator/index.cjs +1 -0
  78. package/dist/cjs/components/Sheet/Sheet.cjs +0 -1
  79. package/dist/cjs/components/Sheet/index.cjs +1 -0
  80. package/dist/cjs/components/Sidebar/Sidebar.cjs +0 -1
  81. package/dist/cjs/components/Sidebar/index.cjs +1 -0
  82. package/dist/cjs/components/Skeleton/Skeleton.cjs +0 -1
  83. package/dist/cjs/components/Skeleton/index.cjs +1 -0
  84. package/dist/cjs/components/Slider/Slider.cjs +0 -1
  85. package/dist/cjs/components/Slider/index.cjs +1 -0
  86. package/dist/cjs/components/Stepper/Stepper.cjs +1 -2
  87. package/dist/cjs/components/Stepper/StepperWrapper.cjs +1 -2
  88. package/dist/cjs/components/Stepper/index.cjs +0 -1
  89. package/dist/cjs/components/Switch/Switch.cjs +0 -1
  90. package/dist/cjs/components/Switch/index.cjs +1 -0
  91. package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +1 -2
  92. package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +1 -2
  93. package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +1 -2
  94. package/dist/cjs/components/Table/data-table-column-header.cjs +1 -2
  95. package/dist/cjs/components/Table/data-table-pagination.cjs +1 -2
  96. package/dist/cjs/components/Table/data-table-toolbar.cjs +1 -2
  97. package/dist/cjs/components/Table/data-table-view-options.cjs +1 -2
  98. package/dist/cjs/components/Table/data-table.cjs +1 -2
  99. package/dist/cjs/components/Table/index.cjs +1 -0
  100. package/dist/cjs/components/Table/select-column.cjs +0 -1
  101. package/dist/cjs/components/Tabs/Tabs.cjs +1 -2
  102. package/dist/cjs/components/Tabs/classes.cjs +1 -2
  103. package/dist/cjs/components/Tabs/index.cjs +1 -0
  104. package/dist/cjs/components/Textarea/Textarea.cjs +1 -2
  105. package/dist/cjs/components/Textarea/index.cjs +1 -0
  106. package/dist/cjs/components/TimeGridView.cjs +1 -2
  107. package/dist/cjs/components/Toast/Toast.cjs +1 -2
  108. package/dist/cjs/components/Toast/index.cjs +1 -0
  109. package/dist/cjs/components/Toggle/Toggle.cjs +0 -1
  110. package/dist/cjs/components/Toggle/index.cjs +1 -0
  111. package/dist/cjs/components/Tooltip/Tooltip.cjs +1 -2
  112. package/dist/cjs/components/Tooltip/index.cjs +1 -0
  113. package/dist/cjs/components/Tour/Tour.cjs +1 -2
  114. package/dist/cjs/components/Tour/TourWrapper.cjs +0 -1
  115. package/dist/cjs/components/Tour/index.cjs +0 -1
  116. package/dist/cjs/components/TreeSelect/TreeSelect.cjs +0 -1
  117. package/dist/cjs/components/TreeSelect/index.cjs +1 -0
  118. package/dist/cjs/components/Upload/Upload.cjs +0 -1
  119. package/dist/cjs/components/Upload/index.cjs +1 -0
  120. package/dist/cjs/components/WheelColumn.cjs +1 -2
  121. package/dist/cjs/config/data-table.cjs +0 -1
  122. package/dist/cjs/constants/common.cjs +0 -1
  123. package/dist/cjs/hooks/index.cjs +1 -0
  124. package/dist/cjs/hooks/use-callback-ref.cjs +0 -1
  125. package/dist/cjs/hooks/use-data-table.cjs +1 -2
  126. package/dist/cjs/hooks/use-debounced-callback.cjs +1 -2
  127. package/dist/cjs/hooks/use-debounced-value.cjs +1 -2
  128. package/dist/cjs/hooks/use-event-listener.cjs +1 -2
  129. package/dist/cjs/hooks/use-intersection-observer.cjs +0 -1
  130. package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs +0 -1
  131. package/dist/cjs/hooks/use-media-query.cjs +1 -2
  132. package/dist/cjs/hooks/use-mouse-position.cjs +1 -0
  133. package/dist/cjs/hooks/use-on-click-outside.cjs +1 -2
  134. package/dist/cjs/hooks/use-script.cjs +0 -1
  135. package/dist/cjs/hooks/use-scroll-lock.cjs +1 -2
  136. package/dist/cjs/index.cjs +1 -2
  137. package/dist/cjs/lib/TextAnimation/BlurText.cjs +0 -1
  138. package/dist/cjs/lib/TextAnimation/CircularText.cjs +0 -1
  139. package/dist/cjs/lib/TextAnimation/FlipWords.cjs +1 -2
  140. package/dist/cjs/lib/TextAnimation/GradientText.cjs +1 -2
  141. package/dist/cjs/lib/TextAnimation/RollingText.cjs +0 -1
  142. package/dist/cjs/lib/TextAnimation/RotatingText.cjs +1 -2
  143. package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +1 -2
  144. package/dist/cjs/lib/TextAnimation/SplittingText.cjs +0 -1
  145. package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +1 -2
  146. package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +0 -1
  147. package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +0 -1
  148. package/dist/cjs/lib/TextAnimation/TypingText.cjs +0 -1
  149. package/dist/cjs/lib/TextAnimation/WritingText.cjs +0 -1
  150. package/dist/cjs/lib/TextAnimation/index.cjs +1 -0
  151. package/dist/cjs/lib/utils.cjs +1 -0
  152. package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs +0 -1
  153. package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs +0 -1
  154. package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs +0 -1
  155. package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs +0 -1
  156. package/dist/cjs/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.cjs +0 -1
  157. package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs +0 -1
  158. package/dist/cjs/packages/ui/src/components/accordion.cjs +0 -1
  159. package/dist/cjs/packages/ui/src/components/alert-dialog.cjs +0 -1
  160. package/dist/cjs/packages/ui/src/components/avatar.cjs +0 -1
  161. package/dist/cjs/packages/ui/src/components/badge.cjs +0 -1
  162. package/dist/cjs/packages/ui/src/components/breadcrumb.cjs +0 -1
  163. package/dist/cjs/packages/ui/src/components/button-group.cjs +0 -1
  164. package/dist/cjs/packages/ui/src/components/button.cjs +0 -1
  165. package/dist/cjs/packages/ui/src/components/calendar.cjs +0 -1
  166. package/dist/cjs/packages/ui/src/components/checkbox.cjs +0 -1
  167. package/dist/cjs/packages/ui/src/components/collapsible.cjs +0 -1
  168. package/dist/cjs/packages/ui/src/components/combobox.cjs +1 -2
  169. package/dist/cjs/packages/ui/src/components/command.cjs +0 -1
  170. package/dist/cjs/packages/ui/src/components/context-menu.cjs +0 -1
  171. package/dist/cjs/packages/ui/src/components/dialog.cjs +0 -1
  172. package/dist/cjs/packages/ui/src/components/drawer.cjs +0 -1
  173. package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs +0 -1
  174. package/dist/cjs/packages/ui/src/components/input-otp.cjs +0 -1
  175. package/dist/cjs/packages/ui/src/components/input.cjs +0 -1
  176. package/dist/cjs/packages/ui/src/components/label.cjs +0 -1
  177. package/dist/cjs/packages/ui/src/components/pagination.cjs +0 -1
  178. package/dist/cjs/packages/ui/src/components/popover.cjs +0 -1
  179. package/dist/cjs/packages/ui/src/components/radio-group.cjs +0 -1
  180. package/dist/cjs/packages/ui/src/components/resizable.cjs +0 -1
  181. package/dist/cjs/packages/ui/src/components/scroll-area.cjs +0 -1
  182. package/dist/cjs/packages/ui/src/components/select.cjs +1 -2
  183. package/dist/cjs/packages/ui/src/components/separator.cjs +0 -1
  184. package/dist/cjs/packages/ui/src/components/sheet.cjs +0 -1
  185. package/dist/cjs/packages/ui/src/components/sidebar.cjs +0 -1
  186. package/dist/cjs/packages/ui/src/components/skeleton.cjs +0 -1
  187. package/dist/cjs/packages/ui/src/components/switch.cjs +0 -1
  188. package/dist/cjs/packages/ui/src/components/table.cjs +0 -1
  189. package/dist/cjs/packages/ui/src/components/tabs.cjs +0 -1
  190. package/dist/cjs/packages/ui/src/components/textarea.cjs +0 -1
  191. package/dist/cjs/packages/ui/src/components/toggle.cjs +0 -1
  192. package/dist/cjs/packages/ui/src/components/tooltip.cjs +0 -1
  193. package/dist/cjs/packages/ui/src/components/tree-view.cjs +0 -1
  194. package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs +0 -1
  195. package/dist/cjs/packages/ui/src/lib/compose-refs.cjs +0 -1
  196. package/dist/cjs/packages/ui/src/lib/utils.cjs +0 -1
  197. package/dist/cjs/utils/animations.cjs +1 -2
  198. package/dist/cjs/utils/css.cjs +0 -1
  199. package/dist/cjs/utils/data-table.cjs +0 -1
  200. package/dist/cjs/utils/datetime.cjs +0 -1
  201. package/dist/cjs/utils/parsers.cjs +0 -1
  202. package/dist/esm/_virtual/_commonjsHelpers.js +0 -1
  203. package/dist/esm/_virtual/index.js +0 -1
  204. package/dist/esm/_virtual/index2.js +0 -1
  205. package/dist/esm/components/Accordion/Accordion.js +0 -1
  206. package/dist/esm/components/Accordion/index.js +9 -0
  207. package/dist/esm/components/Avatar/Avatar.js +32 -63
  208. package/dist/esm/components/Avatar/index.js +4 -0
  209. package/dist/esm/components/Badge/Badge.js +0 -1
  210. package/dist/esm/components/Badge/index.js +5 -0
  211. package/dist/esm/components/Breadcrumb/Breadcrumb.js +0 -1
  212. package/dist/esm/components/Breadcrumb/index.js +5 -0
  213. package/dist/esm/components/Button/Button.js +0 -1
  214. package/dist/esm/components/Button/ButtonGroup.js +0 -1
  215. package/dist/esm/components/Button/index.js +10 -0
  216. package/dist/esm/components/Calendar/Calendar.js +25 -57
  217. package/dist/esm/components/Calendar/index.js +5 -0
  218. package/dist/esm/components/Carousel/Carousel.js +0 -1
  219. package/dist/esm/components/Carousel/index.js +6 -0
  220. package/dist/esm/components/Checkbox/Checkbox.js +29 -58
  221. package/dist/esm/components/Checkbox/index.js +5 -0
  222. package/dist/esm/components/Collapsible/Collapsible.js +0 -1
  223. package/dist/esm/components/Collapsible/index.js +5 -0
  224. package/dist/esm/components/Command/Command.js +0 -1
  225. package/dist/esm/components/Command/index.js +0 -1
  226. package/dist/esm/components/ContextMenu/ContextMenu.js +0 -1
  227. package/dist/esm/components/ContextMenu/index.js +0 -1
  228. package/dist/esm/components/Cropper/Cropper.js +261 -292
  229. package/dist/esm/components/Cropper/CropperTool.js +0 -1
  230. package/dist/esm/components/Cropper/index.js +17 -0
  231. package/dist/esm/components/Cropper/utils.js +0 -1
  232. package/dist/esm/components/DatePicker/DatePicker.js +94 -122
  233. package/dist/esm/components/DatePicker/RangePicker.js +202 -230
  234. package/dist/esm/components/DatePicker/TimePicker.js +63 -92
  235. package/dist/esm/components/DatePicker/index.js +8 -0
  236. package/dist/esm/components/Dialog/Dialog.js +0 -1
  237. package/dist/esm/components/Dialog/index.js +5 -0
  238. package/dist/esm/components/DropdownMenu/DropdownMenu.js +0 -1
  239. package/dist/esm/components/DropdownMenu/index.js +0 -1
  240. package/dist/esm/components/FloatLabel.js +0 -1
  241. package/dist/esm/components/Glass/Glass.js +7 -39
  242. package/dist/esm/components/Glass/index.js +5 -0
  243. package/dist/esm/components/ImageViewer/ImageViewer.js +95 -126
  244. package/dist/esm/components/ImageViewer/index.js +7 -0
  245. package/dist/esm/components/Input/Input.js +0 -1
  246. package/dist/esm/components/Input/index.js +5 -0
  247. package/dist/esm/components/InputOTP/InputOTP.js +28 -58
  248. package/dist/esm/components/InputOTP/index.js +5 -0
  249. package/dist/esm/components/Interactive/CursorFollow.js +90 -122
  250. package/dist/esm/components/Interactive/index.js +9 -0
  251. package/dist/esm/components/Label/index.js +4 -0
  252. package/dist/esm/components/Marquee/Marquee.js +78 -109
  253. package/dist/esm/components/Marquee/MarqueeWrapper.js +0 -1
  254. package/dist/esm/components/Marquee/index.js +0 -1
  255. package/dist/esm/components/Masonry/Masonry.js +67 -100
  256. package/dist/esm/components/Masonry/MasonryWrapper.js +0 -1
  257. package/dist/esm/components/Masonry/index.js +10 -0
  258. package/dist/esm/components/Pagination/Pagination.js +0 -1
  259. package/dist/esm/components/Pagination/index.js +0 -1
  260. package/dist/esm/components/Popover/Popover.js +0 -1
  261. package/dist/esm/components/Popover/index.js +3 -3
  262. package/dist/esm/components/QrCode/QrCode.js +126 -157
  263. package/dist/esm/components/QrCode/index.js +0 -1
  264. package/dist/esm/components/Radio/Radio.js +36 -67
  265. package/dist/esm/components/Radio/index.js +5 -0
  266. package/dist/esm/components/Rate/Rate.js +0 -1
  267. package/dist/esm/components/Rate/index.js +5 -0
  268. package/dist/esm/components/Resizable/Resizable.js +0 -1
  269. package/dist/esm/components/Resizable/index.js +13 -0
  270. package/dist/esm/components/ScrollArea/ScrollArea.js +0 -1
  271. package/dist/esm/components/ScrollArea/index.js +5 -0
  272. package/dist/esm/components/Select/Select.js +0 -1
  273. package/dist/esm/components/Select/index.js +5 -0
  274. package/dist/esm/components/Separator/Separator.js +0 -1
  275. package/dist/esm/components/Separator/index.js +5 -0
  276. package/dist/esm/components/Sheet/Sheet.js +0 -1
  277. package/dist/esm/components/Sheet/index.js +5 -0
  278. package/dist/esm/components/Sidebar/Sidebar.js +0 -1
  279. package/dist/esm/components/Sidebar/index.js +29 -0
  280. package/dist/esm/components/Skeleton/Skeleton.js +0 -1
  281. package/dist/esm/components/Skeleton/index.js +5 -0
  282. package/dist/esm/components/Slider/Slider.js +0 -1
  283. package/dist/esm/components/Slider/index.js +5 -0
  284. package/dist/esm/components/Stepper/Stepper.js +72 -102
  285. package/dist/esm/components/Stepper/StepperWrapper.js +42 -74
  286. package/dist/esm/components/Stepper/index.js +0 -1
  287. package/dist/esm/components/Switch/Switch.js +0 -1
  288. package/dist/esm/components/Switch/index.js +5 -0
  289. package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +2 -3
  290. package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +12 -13
  291. package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +66 -97
  292. package/dist/esm/components/Table/data-table-column-header.js +41 -73
  293. package/dist/esm/components/Table/data-table-pagination.js +30 -63
  294. package/dist/esm/components/Table/data-table-toolbar.js +43 -74
  295. package/dist/esm/components/Table/data-table-view-options.js +85 -116
  296. package/dist/esm/components/Table/data-table.js +52 -85
  297. package/dist/esm/components/Table/index.js +20 -0
  298. package/dist/esm/components/Table/select-column.js +0 -1
  299. package/dist/esm/components/Tabs/Tabs.js +0 -1
  300. package/dist/esm/components/Tabs/classes.js +23 -57
  301. package/dist/esm/components/Tabs/index.js +5 -0
  302. package/dist/esm/components/Textarea/Textarea.js +0 -1
  303. package/dist/esm/components/Textarea/index.js +5 -0
  304. package/dist/esm/components/TimeGridView.js +33 -65
  305. package/dist/esm/components/Toast/Toast.js +39 -71
  306. package/dist/esm/components/Toast/index.js +6 -0
  307. package/dist/esm/components/Toggle/Toggle.js +0 -1
  308. package/dist/esm/components/Toggle/index.js +5 -0
  309. package/dist/esm/components/Tooltip/Tooltip.js +34 -65
  310. package/dist/esm/components/Tooltip/index.js +4 -0
  311. package/dist/esm/components/Tour/Tour.js +331 -361
  312. package/dist/esm/components/Tour/TourWrapper.js +0 -1
  313. package/dist/esm/components/Tour/index.js +0 -1
  314. package/dist/esm/components/TreeSelect/TreeSelect.js +0 -1
  315. package/dist/esm/components/TreeSelect/index.js +5 -0
  316. package/dist/esm/components/Upload/Upload.js +0 -1
  317. package/dist/esm/components/Upload/index.js +4 -0
  318. package/dist/esm/components/WheelColumn.js +37 -69
  319. package/dist/esm/config/data-table.js +0 -1
  320. package/dist/esm/constants/common.js +0 -1
  321. package/dist/esm/hooks/index.js +26 -0
  322. package/dist/esm/hooks/use-callback-ref.js +0 -1
  323. package/dist/esm/hooks/use-data-table.js +45 -44
  324. package/dist/esm/hooks/use-debounced-callback.js +0 -1
  325. package/dist/esm/hooks/use-debounced-value.js +0 -1
  326. package/dist/esm/hooks/use-event-listener.js +0 -1
  327. package/dist/esm/hooks/use-intersection-observer.js +0 -1
  328. package/dist/esm/hooks/use-isomorphic-layout-effect.js +0 -1
  329. package/dist/esm/hooks/use-media-query.js +0 -1
  330. package/dist/esm/hooks/use-mouse-position.js +27 -0
  331. package/dist/esm/hooks/use-on-click-outside.js +0 -1
  332. package/dist/esm/hooks/use-script.js +0 -1
  333. package/dist/esm/hooks/use-scroll-lock.js +0 -1
  334. package/dist/esm/index.js +241 -268
  335. package/dist/esm/lib/TextAnimation/BlurText.js +0 -1
  336. package/dist/esm/lib/TextAnimation/CircularText.js +0 -1
  337. package/dist/esm/lib/TextAnimation/FlipWords.js +28 -60
  338. package/dist/esm/lib/TextAnimation/GradientText.js +26 -58
  339. package/dist/esm/lib/TextAnimation/RollingText.js +0 -1
  340. package/dist/esm/lib/TextAnimation/RotatingText.js +27 -59
  341. package/dist/esm/lib/TextAnimation/ShimmeringText.js +26 -58
  342. package/dist/esm/lib/TextAnimation/SplittingText.js +0 -1
  343. package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +29 -61
  344. package/dist/esm/lib/TextAnimation/TextHoverEffect.js +0 -1
  345. package/dist/esm/lib/TextAnimation/TextPressureEffect.js +0 -1
  346. package/dist/esm/lib/TextAnimation/TypingText.js +0 -1
  347. package/dist/esm/lib/TextAnimation/WritingText.js +0 -1
  348. package/dist/esm/lib/TextAnimation/index.js +28 -0
  349. package/dist/esm/lib/utils.js +12 -0
  350. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js +0 -1
  351. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js +0 -1
  352. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js +0 -1
  353. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js +0 -1
  354. package/dist/esm/node_modules/.pnpm/nuqs@2.8.0_next@15.5.9_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/nuqs/dist/server.js +0 -1
  355. package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js +0 -1
  356. package/dist/esm/packages/ui/src/components/accordion.js +0 -1
  357. package/dist/esm/packages/ui/src/components/alert-dialog.js +0 -1
  358. package/dist/esm/packages/ui/src/components/avatar.js +0 -1
  359. package/dist/esm/packages/ui/src/components/badge.js +0 -1
  360. package/dist/esm/packages/ui/src/components/breadcrumb.js +0 -1
  361. package/dist/esm/packages/ui/src/components/button-group.js +0 -1
  362. package/dist/esm/packages/ui/src/components/button.js +0 -1
  363. package/dist/esm/packages/ui/src/components/calendar.js +0 -1
  364. package/dist/esm/packages/ui/src/components/checkbox.js +0 -1
  365. package/dist/esm/packages/ui/src/components/collapsible.js +0 -1
  366. package/dist/esm/packages/ui/src/components/combobox.js +96 -81
  367. package/dist/esm/packages/ui/src/components/command.js +0 -1
  368. package/dist/esm/packages/ui/src/components/context-menu.js +0 -1
  369. package/dist/esm/packages/ui/src/components/dialog.js +0 -1
  370. package/dist/esm/packages/ui/src/components/drawer.js +0 -1
  371. package/dist/esm/packages/ui/src/components/dropdown-menu.js +0 -1
  372. package/dist/esm/packages/ui/src/components/input-otp.js +0 -1
  373. package/dist/esm/packages/ui/src/components/input.js +0 -1
  374. package/dist/esm/packages/ui/src/components/label.js +0 -1
  375. package/dist/esm/packages/ui/src/components/pagination.js +0 -1
  376. package/dist/esm/packages/ui/src/components/popover.js +0 -1
  377. package/dist/esm/packages/ui/src/components/radio-group.js +0 -1
  378. package/dist/esm/packages/ui/src/components/resizable.js +0 -1
  379. package/dist/esm/packages/ui/src/components/scroll-area.js +0 -1
  380. package/dist/esm/packages/ui/src/components/select.js +89 -83
  381. package/dist/esm/packages/ui/src/components/separator.js +0 -1
  382. package/dist/esm/packages/ui/src/components/sheet.js +0 -1
  383. package/dist/esm/packages/ui/src/components/sidebar.js +0 -1
  384. package/dist/esm/packages/ui/src/components/skeleton.js +0 -1
  385. package/dist/esm/packages/ui/src/components/switch.js +0 -1
  386. package/dist/esm/packages/ui/src/components/table.js +0 -1
  387. package/dist/esm/packages/ui/src/components/tabs.js +0 -1
  388. package/dist/esm/packages/ui/src/components/textarea.js +0 -1
  389. package/dist/esm/packages/ui/src/components/toggle.js +0 -1
  390. package/dist/esm/packages/ui/src/components/tooltip.js +0 -1
  391. package/dist/esm/packages/ui/src/components/tree-view.js +1 -2
  392. package/dist/esm/packages/ui/src/hooks/use-mobile.js +0 -1
  393. package/dist/esm/packages/ui/src/lib/compose-refs.js +0 -1
  394. package/dist/esm/packages/ui/src/lib/utils.js +0 -1
  395. package/dist/esm/utils/animations.js +40 -73
  396. package/dist/esm/utils/css.js +0 -1
  397. package/dist/esm/utils/data-table.js +0 -1
  398. package/dist/esm/utils/datetime.js +0 -1
  399. package/dist/esm/utils/parsers.js +0 -1
  400. package/dist/types/components/Accordion/index.d.ts +1 -1
  401. package/dist/types/components/Accordion/index.d.ts.map +1 -1
  402. package/dist/types/components/Badge/index.d.ts +1 -1
  403. package/dist/types/components/Badge/index.d.ts.map +1 -1
  404. package/dist/types/components/Breadcrumb/index.d.ts +1 -1
  405. package/dist/types/components/Breadcrumb/index.d.ts.map +1 -1
  406. package/dist/types/components/Button/index.d.ts +1 -1
  407. package/dist/types/components/Button/index.d.ts.map +1 -1
  408. package/dist/types/components/Checkbox/Checkbox.d.ts +1 -1
  409. package/dist/types/components/Checkbox/index.d.ts +1 -1
  410. package/dist/types/components/Checkbox/index.d.ts.map +1 -1
  411. package/dist/types/components/Collapsible/index.d.ts +1 -1
  412. package/dist/types/components/Collapsible/index.d.ts.map +1 -1
  413. package/dist/types/components/Cropper/Cropper.d.ts.map +1 -1
  414. package/dist/types/components/Dialog/index.d.ts +1 -1
  415. package/dist/types/components/Dialog/index.d.ts.map +1 -1
  416. package/dist/types/components/Glass/index.d.ts +1 -1
  417. package/dist/types/components/Glass/index.d.ts.map +1 -1
  418. package/dist/types/components/Input/index.d.ts +1 -1
  419. package/dist/types/components/Input/index.d.ts.map +1 -1
  420. package/dist/types/components/InputOTP/index.d.ts +1 -1
  421. package/dist/types/components/InputOTP/index.d.ts.map +1 -1
  422. package/dist/types/components/Label/Label.d.ts +1 -1
  423. package/dist/types/components/Label/Label.d.ts.map +1 -1
  424. package/dist/types/components/Marquee/Marquee.d.ts +1 -1
  425. package/dist/types/components/Marquee/Marquee.d.ts.map +1 -1
  426. package/dist/types/components/Masonry/Masonry.d.ts.map +1 -1
  427. package/dist/types/components/Popover/index.d.ts +1 -0
  428. package/dist/types/components/Popover/index.d.ts.map +1 -1
  429. package/dist/types/components/QrCode/QrCode.d.ts.map +1 -1
  430. package/dist/types/components/Radio/index.d.ts +1 -1
  431. package/dist/types/components/Radio/index.d.ts.map +1 -1
  432. package/dist/types/components/ScrollArea/index.d.ts +1 -1
  433. package/dist/types/components/ScrollArea/index.d.ts.map +1 -1
  434. package/dist/types/components/Select/index.d.ts +1 -1
  435. package/dist/types/components/Select/index.d.ts.map +1 -1
  436. package/dist/types/components/Sheet/index.d.ts +1 -1
  437. package/dist/types/components/Sheet/index.d.ts.map +1 -1
  438. package/dist/types/components/Skeleton/index.d.ts +1 -1
  439. package/dist/types/components/Skeleton/index.d.ts.map +1 -1
  440. package/dist/types/components/Slider/Slider.d.ts +1 -1
  441. package/dist/types/components/Slider/index.d.ts +1 -1
  442. package/dist/types/components/Slider/index.d.ts.map +1 -1
  443. package/dist/types/components/Stepper/Stepper.d.ts.map +1 -1
  444. package/dist/types/components/Switch/Switch.d.ts +1 -1
  445. package/dist/types/components/Switch/index.d.ts +1 -1
  446. package/dist/types/components/Switch/index.d.ts.map +1 -1
  447. package/dist/types/components/Tabs/index.d.ts +1 -1
  448. package/dist/types/components/Tabs/index.d.ts.map +1 -1
  449. package/dist/types/components/Textarea/index.d.ts +1 -1
  450. package/dist/types/components/Textarea/index.d.ts.map +1 -1
  451. package/dist/types/components/Toggle/Toggle.d.ts +1 -1
  452. package/dist/types/components/Toggle/index.d.ts +1 -1
  453. package/dist/types/components/Toggle/index.d.ts.map +1 -1
  454. package/dist/types/components/Tour/Tour.d.ts.map +1 -1
  455. package/dist/types/hooks/index.d.ts +3 -0
  456. package/dist/types/hooks/index.d.ts.map +1 -1
  457. package/dist/types/hooks/use-data-table.d.ts.map +1 -1
  458. package/dist/types/index.d.ts +23 -6
  459. package/dist/types/index.d.ts.map +1 -1
  460. package/dist/types/lib/utils.d.ts +1 -1
  461. package/dist/types/lib/utils.d.ts.map +1 -1
  462. package/dist/types/packages/ui/src/components/badge.d.ts +3 -3
  463. package/dist/types/packages/ui/src/components/button.d.ts +2 -2
  464. package/dist/types/packages/ui/src/components/checkbox.d.ts +1 -1
  465. package/dist/types/packages/ui/src/components/combobox.d.ts +2 -2
  466. package/dist/types/packages/ui/src/components/combobox.d.ts.map +1 -1
  467. package/dist/types/packages/ui/src/components/input-otp.d.ts +1 -1
  468. package/dist/types/packages/ui/src/components/input.d.ts +1 -1
  469. package/dist/types/packages/ui/src/components/radio-group.d.ts +1 -1
  470. package/dist/types/packages/ui/src/components/select.d.ts +2 -2
  471. package/dist/types/packages/ui/src/components/select.d.ts.map +1 -1
  472. package/dist/types/packages/ui/src/components/switch.d.ts +1 -1
  473. package/dist/types/packages/ui/src/components/textarea.d.ts +1 -1
  474. package/dist/types/packages/ui/src/components/toggle.d.ts +1 -1
  475. package/dist/types/utils/parsers.d.ts +1 -1
  476. package/package.json +258 -258
  477. package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +0 -1
  478. package/dist/cjs/_virtual/index.cjs.map +0 -1
  479. package/dist/cjs/_virtual/index2.cjs.map +0 -1
  480. package/dist/cjs/components/Accordion/Accordion.cjs.map +0 -1
  481. package/dist/cjs/components/Avatar/Avatar.cjs.map +0 -1
  482. package/dist/cjs/components/Badge/Badge.cjs.map +0 -1
  483. package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +0 -1
  484. package/dist/cjs/components/Button/Button.cjs.map +0 -1
  485. package/dist/cjs/components/Button/ButtonGroup.cjs.map +0 -1
  486. package/dist/cjs/components/Calendar/Calendar.cjs.map +0 -1
  487. package/dist/cjs/components/Carousel/Carousel.cjs.map +0 -1
  488. package/dist/cjs/components/Checkbox/Checkbox.cjs.map +0 -1
  489. package/dist/cjs/components/Collapsible/Collapsible.cjs.map +0 -1
  490. package/dist/cjs/components/Command/Command.cjs.map +0 -1
  491. package/dist/cjs/components/Command/index.cjs.map +0 -1
  492. package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +0 -1
  493. package/dist/cjs/components/ContextMenu/index.cjs.map +0 -1
  494. package/dist/cjs/components/Cropper/Cropper.cjs.map +0 -1
  495. package/dist/cjs/components/Cropper/CropperTool.cjs.map +0 -1
  496. package/dist/cjs/components/Cropper/utils.cjs.map +0 -1
  497. package/dist/cjs/components/DatePicker/DatePicker.cjs.map +0 -1
  498. package/dist/cjs/components/DatePicker/RangePicker.cjs.map +0 -1
  499. package/dist/cjs/components/DatePicker/TimePicker.cjs.map +0 -1
  500. package/dist/cjs/components/Dialog/Dialog.cjs.map +0 -1
  501. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +0 -1
  502. package/dist/cjs/components/DropdownMenu/index.cjs.map +0 -1
  503. package/dist/cjs/components/FloatLabel.cjs.map +0 -1
  504. package/dist/cjs/components/Glass/Glass.cjs.map +0 -1
  505. package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +0 -1
  506. package/dist/cjs/components/Input/Input.cjs.map +0 -1
  507. package/dist/cjs/components/InputOTP/InputOTP.cjs.map +0 -1
  508. package/dist/cjs/components/Interactive/CursorFollow.cjs.map +0 -1
  509. package/dist/cjs/components/Marquee/Marquee.cjs.map +0 -1
  510. package/dist/cjs/components/Marquee/MarqueeWrapper.cjs.map +0 -1
  511. package/dist/cjs/components/Marquee/index.cjs.map +0 -1
  512. package/dist/cjs/components/Masonry/Masonry.cjs.map +0 -1
  513. package/dist/cjs/components/Masonry/MasonryWrapper.cjs.map +0 -1
  514. package/dist/cjs/components/Pagination/Pagination.cjs.map +0 -1
  515. package/dist/cjs/components/Pagination/index.cjs.map +0 -1
  516. package/dist/cjs/components/Popover/Popover.cjs.map +0 -1
  517. package/dist/cjs/components/Popover/index.cjs.map +0 -1
  518. package/dist/cjs/components/QrCode/QrCode.cjs.map +0 -1
  519. package/dist/cjs/components/QrCode/index.cjs.map +0 -1
  520. package/dist/cjs/components/Radio/Radio.cjs.map +0 -1
  521. package/dist/cjs/components/Rate/Rate.cjs.map +0 -1
  522. package/dist/cjs/components/Resizable/Resizable.cjs.map +0 -1
  523. package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +0 -1
  524. package/dist/cjs/components/Select/Select.cjs.map +0 -1
  525. package/dist/cjs/components/Separator/Separator.cjs.map +0 -1
  526. package/dist/cjs/components/Sheet/Sheet.cjs.map +0 -1
  527. package/dist/cjs/components/Sidebar/Sidebar.cjs.map +0 -1
  528. package/dist/cjs/components/Skeleton/Skeleton.cjs.map +0 -1
  529. package/dist/cjs/components/Slider/Slider.cjs.map +0 -1
  530. package/dist/cjs/components/Stepper/Stepper.cjs.map +0 -1
  531. package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +0 -1
  532. package/dist/cjs/components/Stepper/index.cjs.map +0 -1
  533. package/dist/cjs/components/Switch/Switch.cjs.map +0 -1
  534. package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +0 -1
  535. package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +0 -1
  536. package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +0 -1
  537. package/dist/cjs/components/Table/data-table-column-header.cjs.map +0 -1
  538. package/dist/cjs/components/Table/data-table-pagination.cjs.map +0 -1
  539. package/dist/cjs/components/Table/data-table-toolbar.cjs.map +0 -1
  540. package/dist/cjs/components/Table/data-table-view-options.cjs.map +0 -1
  541. package/dist/cjs/components/Table/data-table.cjs.map +0 -1
  542. package/dist/cjs/components/Table/select-column.cjs.map +0 -1
  543. package/dist/cjs/components/Tabs/Tabs.cjs.map +0 -1
  544. package/dist/cjs/components/Tabs/classes.cjs.map +0 -1
  545. package/dist/cjs/components/Textarea/Textarea.cjs.map +0 -1
  546. package/dist/cjs/components/TimeGridView.cjs.map +0 -1
  547. package/dist/cjs/components/Toast/Toast.cjs.map +0 -1
  548. package/dist/cjs/components/Toggle/Toggle.cjs.map +0 -1
  549. package/dist/cjs/components/Tooltip/Tooltip.cjs.map +0 -1
  550. package/dist/cjs/components/Tour/Tour.cjs.map +0 -1
  551. package/dist/cjs/components/Tour/TourWrapper.cjs.map +0 -1
  552. package/dist/cjs/components/Tour/index.cjs.map +0 -1
  553. package/dist/cjs/components/TreeSelect/TreeSelect.cjs.map +0 -1
  554. package/dist/cjs/components/Upload/Upload.cjs.map +0 -1
  555. package/dist/cjs/components/WheelColumn.cjs.map +0 -1
  556. package/dist/cjs/config/data-table.cjs.map +0 -1
  557. package/dist/cjs/constants/common.cjs.map +0 -1
  558. package/dist/cjs/hooks/use-callback-ref.cjs.map +0 -1
  559. package/dist/cjs/hooks/use-data-table.cjs.map +0 -1
  560. package/dist/cjs/hooks/use-debounced-callback.cjs.map +0 -1
  561. package/dist/cjs/hooks/use-debounced-value.cjs.map +0 -1
  562. package/dist/cjs/hooks/use-event-listener.cjs.map +0 -1
  563. package/dist/cjs/hooks/use-intersection-observer.cjs.map +0 -1
  564. package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs.map +0 -1
  565. package/dist/cjs/hooks/use-media-query.cjs.map +0 -1
  566. package/dist/cjs/hooks/use-on-click-outside.cjs.map +0 -1
  567. package/dist/cjs/hooks/use-script.cjs.map +0 -1
  568. package/dist/cjs/hooks/use-scroll-lock.cjs.map +0 -1
  569. package/dist/cjs/index.cjs.map +0 -1
  570. package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +0 -1
  571. package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +0 -1
  572. package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +0 -1
  573. package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +0 -1
  574. package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +0 -1
  575. package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +0 -1
  576. package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +0 -1
  577. package/dist/cjs/lib/TextAnimation/SplittingText.cjs.map +0 -1
  578. package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +0 -1
  579. package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +0 -1
  580. package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +0 -1
  581. package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +0 -1
  582. package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +0 -1
  583. package/dist/cjs/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.cjs.map +0 -1
  584. package/dist/cjs/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.cjs.map +0 -1
  585. package/dist/cjs/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.cjs.map +0 -1
  586. package/dist/cjs/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.cjs.map +0 -1
  587. 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
  588. package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs.map +0 -1
  589. package/dist/cjs/packages/ui/src/components/accordion.cjs.map +0 -1
  590. package/dist/cjs/packages/ui/src/components/alert-dialog.cjs.map +0 -1
  591. package/dist/cjs/packages/ui/src/components/avatar.cjs.map +0 -1
  592. package/dist/cjs/packages/ui/src/components/badge.cjs.map +0 -1
  593. package/dist/cjs/packages/ui/src/components/breadcrumb.cjs.map +0 -1
  594. package/dist/cjs/packages/ui/src/components/button-group.cjs.map +0 -1
  595. package/dist/cjs/packages/ui/src/components/button.cjs.map +0 -1
  596. package/dist/cjs/packages/ui/src/components/calendar.cjs.map +0 -1
  597. package/dist/cjs/packages/ui/src/components/checkbox.cjs.map +0 -1
  598. package/dist/cjs/packages/ui/src/components/collapsible.cjs.map +0 -1
  599. package/dist/cjs/packages/ui/src/components/combobox.cjs.map +0 -1
  600. package/dist/cjs/packages/ui/src/components/command.cjs.map +0 -1
  601. package/dist/cjs/packages/ui/src/components/context-menu.cjs.map +0 -1
  602. package/dist/cjs/packages/ui/src/components/dialog.cjs.map +0 -1
  603. package/dist/cjs/packages/ui/src/components/drawer.cjs.map +0 -1
  604. package/dist/cjs/packages/ui/src/components/dropdown-menu.cjs.map +0 -1
  605. package/dist/cjs/packages/ui/src/components/input-otp.cjs.map +0 -1
  606. package/dist/cjs/packages/ui/src/components/input.cjs.map +0 -1
  607. package/dist/cjs/packages/ui/src/components/label.cjs.map +0 -1
  608. package/dist/cjs/packages/ui/src/components/pagination.cjs.map +0 -1
  609. package/dist/cjs/packages/ui/src/components/popover.cjs.map +0 -1
  610. package/dist/cjs/packages/ui/src/components/radio-group.cjs.map +0 -1
  611. package/dist/cjs/packages/ui/src/components/resizable.cjs.map +0 -1
  612. package/dist/cjs/packages/ui/src/components/scroll-area.cjs.map +0 -1
  613. package/dist/cjs/packages/ui/src/components/select.cjs.map +0 -1
  614. package/dist/cjs/packages/ui/src/components/separator.cjs.map +0 -1
  615. package/dist/cjs/packages/ui/src/components/sheet.cjs.map +0 -1
  616. package/dist/cjs/packages/ui/src/components/sidebar.cjs.map +0 -1
  617. package/dist/cjs/packages/ui/src/components/skeleton.cjs.map +0 -1
  618. package/dist/cjs/packages/ui/src/components/switch.cjs.map +0 -1
  619. package/dist/cjs/packages/ui/src/components/table.cjs.map +0 -1
  620. package/dist/cjs/packages/ui/src/components/tabs.cjs.map +0 -1
  621. package/dist/cjs/packages/ui/src/components/textarea.cjs.map +0 -1
  622. package/dist/cjs/packages/ui/src/components/toggle.cjs.map +0 -1
  623. package/dist/cjs/packages/ui/src/components/tooltip.cjs.map +0 -1
  624. package/dist/cjs/packages/ui/src/components/tree-view.cjs.map +0 -1
  625. package/dist/cjs/packages/ui/src/hooks/use-mobile.cjs.map +0 -1
  626. package/dist/cjs/packages/ui/src/lib/compose-refs.cjs.map +0 -1
  627. package/dist/cjs/packages/ui/src/lib/utils.cjs.map +0 -1
  628. package/dist/cjs/utils/animations.cjs.map +0 -1
  629. package/dist/cjs/utils/css.cjs.map +0 -1
  630. package/dist/cjs/utils/data-table.cjs.map +0 -1
  631. package/dist/cjs/utils/datetime.cjs.map +0 -1
  632. package/dist/cjs/utils/parsers.cjs.map +0 -1
  633. package/dist/esm/_virtual/_commonjsHelpers.js.map +0 -1
  634. package/dist/esm/_virtual/index.js.map +0 -1
  635. package/dist/esm/_virtual/index2.js.map +0 -1
  636. package/dist/esm/components/Accordion/Accordion.js.map +0 -1
  637. package/dist/esm/components/Avatar/Avatar.js.map +0 -1
  638. package/dist/esm/components/Badge/Badge.js.map +0 -1
  639. package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +0 -1
  640. package/dist/esm/components/Button/Button.js.map +0 -1
  641. package/dist/esm/components/Button/ButtonGroup.js.map +0 -1
  642. package/dist/esm/components/Calendar/Calendar.js.map +0 -1
  643. package/dist/esm/components/Carousel/Carousel.js.map +0 -1
  644. package/dist/esm/components/Checkbox/Checkbox.js.map +0 -1
  645. package/dist/esm/components/Collapsible/Collapsible.js.map +0 -1
  646. package/dist/esm/components/Command/Command.js.map +0 -1
  647. package/dist/esm/components/Command/index.js.map +0 -1
  648. package/dist/esm/components/ContextMenu/ContextMenu.js.map +0 -1
  649. package/dist/esm/components/ContextMenu/index.js.map +0 -1
  650. package/dist/esm/components/Cropper/Cropper.js.map +0 -1
  651. package/dist/esm/components/Cropper/CropperTool.js.map +0 -1
  652. package/dist/esm/components/Cropper/utils.js.map +0 -1
  653. package/dist/esm/components/DatePicker/DatePicker.js.map +0 -1
  654. package/dist/esm/components/DatePicker/RangePicker.js.map +0 -1
  655. package/dist/esm/components/DatePicker/TimePicker.js.map +0 -1
  656. package/dist/esm/components/Dialog/Dialog.js.map +0 -1
  657. package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +0 -1
  658. package/dist/esm/components/DropdownMenu/index.js.map +0 -1
  659. package/dist/esm/components/FloatLabel.js.map +0 -1
  660. package/dist/esm/components/Glass/Glass.js.map +0 -1
  661. package/dist/esm/components/ImageViewer/ImageViewer.js.map +0 -1
  662. package/dist/esm/components/Input/Input.js.map +0 -1
  663. package/dist/esm/components/InputOTP/InputOTP.js.map +0 -1
  664. package/dist/esm/components/Interactive/CursorFollow.js.map +0 -1
  665. package/dist/esm/components/Marquee/Marquee.js.map +0 -1
  666. package/dist/esm/components/Marquee/MarqueeWrapper.js.map +0 -1
  667. package/dist/esm/components/Marquee/index.js.map +0 -1
  668. package/dist/esm/components/Masonry/Masonry.js.map +0 -1
  669. package/dist/esm/components/Masonry/MasonryWrapper.js.map +0 -1
  670. package/dist/esm/components/Pagination/Pagination.js.map +0 -1
  671. package/dist/esm/components/Pagination/index.js.map +0 -1
  672. package/dist/esm/components/Popover/Popover.js.map +0 -1
  673. package/dist/esm/components/Popover/index.js.map +0 -1
  674. package/dist/esm/components/QrCode/QrCode.js.map +0 -1
  675. package/dist/esm/components/QrCode/index.js.map +0 -1
  676. package/dist/esm/components/Radio/Radio.js.map +0 -1
  677. package/dist/esm/components/Rate/Rate.js.map +0 -1
  678. package/dist/esm/components/Resizable/Resizable.js.map +0 -1
  679. package/dist/esm/components/ScrollArea/ScrollArea.js.map +0 -1
  680. package/dist/esm/components/Select/Select.js.map +0 -1
  681. package/dist/esm/components/Separator/Separator.js.map +0 -1
  682. package/dist/esm/components/Sheet/Sheet.js.map +0 -1
  683. package/dist/esm/components/Sidebar/Sidebar.js.map +0 -1
  684. package/dist/esm/components/Skeleton/Skeleton.js.map +0 -1
  685. package/dist/esm/components/Slider/Slider.js.map +0 -1
  686. package/dist/esm/components/Stepper/Stepper.js.map +0 -1
  687. package/dist/esm/components/Stepper/StepperWrapper.js.map +0 -1
  688. package/dist/esm/components/Stepper/index.js.map +0 -1
  689. package/dist/esm/components/Switch/Switch.js.map +0 -1
  690. package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +0 -1
  691. package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +0 -1
  692. package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +0 -1
  693. package/dist/esm/components/Table/data-table-column-header.js.map +0 -1
  694. package/dist/esm/components/Table/data-table-pagination.js.map +0 -1
  695. package/dist/esm/components/Table/data-table-toolbar.js.map +0 -1
  696. package/dist/esm/components/Table/data-table-view-options.js.map +0 -1
  697. package/dist/esm/components/Table/data-table.js.map +0 -1
  698. package/dist/esm/components/Table/select-column.js.map +0 -1
  699. package/dist/esm/components/Tabs/Tabs.js.map +0 -1
  700. package/dist/esm/components/Tabs/classes.js.map +0 -1
  701. package/dist/esm/components/Textarea/Textarea.js.map +0 -1
  702. package/dist/esm/components/TimeGridView.js.map +0 -1
  703. package/dist/esm/components/Toast/Toast.js.map +0 -1
  704. package/dist/esm/components/Toggle/Toggle.js.map +0 -1
  705. package/dist/esm/components/Tooltip/Tooltip.js.map +0 -1
  706. package/dist/esm/components/Tour/Tour.js.map +0 -1
  707. package/dist/esm/components/Tour/TourWrapper.js.map +0 -1
  708. package/dist/esm/components/Tour/index.js.map +0 -1
  709. package/dist/esm/components/TreeSelect/TreeSelect.js.map +0 -1
  710. package/dist/esm/components/Upload/Upload.js.map +0 -1
  711. package/dist/esm/components/WheelColumn.js.map +0 -1
  712. package/dist/esm/config/data-table.js.map +0 -1
  713. package/dist/esm/constants/common.js.map +0 -1
  714. package/dist/esm/hooks/use-callback-ref.js.map +0 -1
  715. package/dist/esm/hooks/use-data-table.js.map +0 -1
  716. package/dist/esm/hooks/use-debounced-callback.js.map +0 -1
  717. package/dist/esm/hooks/use-debounced-value.js.map +0 -1
  718. package/dist/esm/hooks/use-event-listener.js.map +0 -1
  719. package/dist/esm/hooks/use-intersection-observer.js.map +0 -1
  720. package/dist/esm/hooks/use-isomorphic-layout-effect.js.map +0 -1
  721. package/dist/esm/hooks/use-media-query.js.map +0 -1
  722. package/dist/esm/hooks/use-on-click-outside.js.map +0 -1
  723. package/dist/esm/hooks/use-script.js.map +0 -1
  724. package/dist/esm/hooks/use-scroll-lock.js.map +0 -1
  725. package/dist/esm/index.js.map +0 -1
  726. package/dist/esm/lib/TextAnimation/BlurText.js.map +0 -1
  727. package/dist/esm/lib/TextAnimation/CircularText.js.map +0 -1
  728. package/dist/esm/lib/TextAnimation/FlipWords.js.map +0 -1
  729. package/dist/esm/lib/TextAnimation/GradientText.js.map +0 -1
  730. package/dist/esm/lib/TextAnimation/RollingText.js.map +0 -1
  731. package/dist/esm/lib/TextAnimation/RotatingText.js.map +0 -1
  732. package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +0 -1
  733. package/dist/esm/lib/TextAnimation/SplittingText.js.map +0 -1
  734. package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +0 -1
  735. package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +0 -1
  736. package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +0 -1
  737. package/dist/esm/lib/TextAnimation/TypingText.js.map +0 -1
  738. package/dist/esm/lib/TextAnimation/WritingText.js.map +0 -1
  739. package/dist/esm/node_modules/.pnpm/@dnd-kit_accessibility@3.1.1_react@19.1.1/node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js.map +0 -1
  740. package/dist/esm/node_modules/.pnpm/@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1/node_modules/@dnd-kit/core/dist/core.esm.js.map +0 -1
  741. package/dist/esm/node_modules/.pnpm/@dnd-kit_sortable@10.0.0_@dnd-kit_core@6.3.1_react-dom@19.1.1_react@19.1.1__react@19.1.1__react@19.1.1/node_modules/@dnd-kit/sortable/dist/sortable.esm.js.map +0 -1
  742. package/dist/esm/node_modules/.pnpm/@dnd-kit_utilities@3.2.2_react@19.1.1/node_modules/@dnd-kit/utilities/dist/utilities.esm.js.map +0 -1
  743. 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
  744. package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js.map +0 -1
  745. package/dist/esm/packages/ui/src/components/accordion.js.map +0 -1
  746. package/dist/esm/packages/ui/src/components/alert-dialog.js.map +0 -1
  747. package/dist/esm/packages/ui/src/components/avatar.js.map +0 -1
  748. package/dist/esm/packages/ui/src/components/badge.js.map +0 -1
  749. package/dist/esm/packages/ui/src/components/breadcrumb.js.map +0 -1
  750. package/dist/esm/packages/ui/src/components/button-group.js.map +0 -1
  751. package/dist/esm/packages/ui/src/components/button.js.map +0 -1
  752. package/dist/esm/packages/ui/src/components/calendar.js.map +0 -1
  753. package/dist/esm/packages/ui/src/components/checkbox.js.map +0 -1
  754. package/dist/esm/packages/ui/src/components/collapsible.js.map +0 -1
  755. package/dist/esm/packages/ui/src/components/combobox.js.map +0 -1
  756. package/dist/esm/packages/ui/src/components/command.js.map +0 -1
  757. package/dist/esm/packages/ui/src/components/context-menu.js.map +0 -1
  758. package/dist/esm/packages/ui/src/components/dialog.js.map +0 -1
  759. package/dist/esm/packages/ui/src/components/drawer.js.map +0 -1
  760. package/dist/esm/packages/ui/src/components/dropdown-menu.js.map +0 -1
  761. package/dist/esm/packages/ui/src/components/input-otp.js.map +0 -1
  762. package/dist/esm/packages/ui/src/components/input.js.map +0 -1
  763. package/dist/esm/packages/ui/src/components/label.js.map +0 -1
  764. package/dist/esm/packages/ui/src/components/pagination.js.map +0 -1
  765. package/dist/esm/packages/ui/src/components/popover.js.map +0 -1
  766. package/dist/esm/packages/ui/src/components/radio-group.js.map +0 -1
  767. package/dist/esm/packages/ui/src/components/resizable.js.map +0 -1
  768. package/dist/esm/packages/ui/src/components/scroll-area.js.map +0 -1
  769. package/dist/esm/packages/ui/src/components/select.js.map +0 -1
  770. package/dist/esm/packages/ui/src/components/separator.js.map +0 -1
  771. package/dist/esm/packages/ui/src/components/sheet.js.map +0 -1
  772. package/dist/esm/packages/ui/src/components/sidebar.js.map +0 -1
  773. package/dist/esm/packages/ui/src/components/skeleton.js.map +0 -1
  774. package/dist/esm/packages/ui/src/components/switch.js.map +0 -1
  775. package/dist/esm/packages/ui/src/components/table.js.map +0 -1
  776. package/dist/esm/packages/ui/src/components/tabs.js.map +0 -1
  777. package/dist/esm/packages/ui/src/components/textarea.js.map +0 -1
  778. package/dist/esm/packages/ui/src/components/toggle.js.map +0 -1
  779. package/dist/esm/packages/ui/src/components/tooltip.js.map +0 -1
  780. package/dist/esm/packages/ui/src/components/tree-view.js.map +0 -1
  781. package/dist/esm/packages/ui/src/hooks/use-mobile.js.map +0 -1
  782. package/dist/esm/packages/ui/src/lib/compose-refs.js.map +0 -1
  783. package/dist/esm/packages/ui/src/lib/utils.js.map +0 -1
  784. package/dist/esm/utils/animations.js.map +0 -1
  785. package/dist/esm/utils/css.js.map +0 -1
  786. package/dist/esm/utils/data-table.js.map +0 -1
  787. package/dist/esm/utils/datetime.js.map +0 -1
  788. package/dist/esm/utils/parsers.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"Cropper.js","sources":["../../../../src/components/Cropper/Cropper.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nconst ROOT_NAME = \"Cropper\";\nconst CONTENT_NAME = \"CropperContent\";\nconst IMAGE_NAME = \"CropperImage\";\nconst VIDEO_NAME = \"CropperVideo\";\nconst AREA_NAME = \"CropperArea\";\n\ninterface Point {\n x: number;\n y: number;\n}\n\ninterface GestureEvent extends UIEvent {\n rotation: number;\n scale: number;\n clientX: number;\n clientY: number;\n}\n\ninterface Size {\n width: number;\n height: number;\n}\n\ninterface Area {\n width: number;\n height: number;\n x: number;\n y: number;\n}\n\ninterface MediaSize {\n width: number;\n height: number;\n naturalWidth: number;\n naturalHeight: number;\n}\n\ntype Shape = \"rectangle\" | \"circle\";\ntype ObjectFit = \"contain\" | \"cover\" | \"horizontal-cover\" | \"vertical-cover\";\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\nconst MAX_CACHE_SIZE = 200;\nconst DPR = typeof window !== \"undefined\" ? window.devicePixelRatio || 1 : 1;\n\nconst rotationSizeCache = new Map<string, Size>();\nconst cropSizeCache = new Map<string, Size>();\nconst croppedAreaCache = new Map<\n string,\n { croppedAreaPercentages: Area; croppedAreaPixels: Area }\n>();\nconst onPositionClampCache = new Map<string, Point>();\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction quantize(n: number, step = 2 / DPR): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizePosition(n: number, step = 4 / DPR): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizeZoom(n: number, step = 0.01): number {\n return Math.round(n / step) * step;\n}\n\nfunction quantizeRotation(n: number, step = 1.0): number {\n return Math.round(n / step) * step;\n}\n\nfunction snapToDevicePixel(n: number): number {\n return Math.round(n * DPR) / DPR;\n}\n\nfunction lruGet<K, V>(map: Map<K, V>, key: K): V | undefined {\n const v = map.get(key);\n if (v !== undefined) {\n map.delete(key);\n map.set(key, v);\n }\n return v;\n}\n\nfunction lruSet<K, V>(\n map: Map<K, V>,\n key: K,\n val: V,\n max = MAX_CACHE_SIZE\n): void {\n if (map.has(key)) {\n map.delete(key);\n }\n map.set(key, val);\n if (map.size > max) {\n const firstKey = map.keys().next().value;\n if (firstKey !== undefined) {\n map.delete(firstKey);\n }\n }\n}\n\nfunction getDistanceBetweenPoints(pointA: Point, pointB: Point): number {\n return Math.sqrt((pointA.y - pointB.y) ** 2 + (pointA.x - pointB.x) ** 2);\n}\n\nfunction getCenter(a: Point, b: Point): Point {\n return {\n x: (b.x + a.x) * 0.5,\n y: (b.y + a.y) * 0.5,\n };\n}\n\nfunction getRotationBetweenPoints(pointA: Point, pointB: Point): number {\n return (Math.atan2(pointB.y - pointA.y, pointB.x - pointA.x) * 180) / Math.PI;\n}\n\nfunction getRadianAngle(degreeValue: number): number {\n return (degreeValue * Math.PI) / 180;\n}\n\nfunction rotateSize(width: number, height: number, rotation: number): Size {\n const cacheKey = `${quantize(width)}-${quantize(height)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(rotationSizeCache, cacheKey);\n if (cached) {\n return cached;\n }\n const rotRad = getRadianAngle(rotation);\n const cosRot = Math.cos(rotRad);\n const sinRot = Math.sin(rotRad);\n\n const result: Size = {\n width: Math.abs(cosRot * width) + Math.abs(sinRot * height),\n height: Math.abs(sinRot * width) + Math.abs(cosRot * height),\n };\n\n lruSet(rotationSizeCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction getCropSize(\n mediaWidth: number,\n mediaHeight: number,\n contentWidth: number,\n contentHeight: number,\n aspect: number,\n rotation = 0\n): Size {\n const cacheKey = `${quantize(mediaWidth, 8)}-${quantize(mediaHeight, 8)}-${quantize(contentWidth, 8)}-${quantize(contentHeight, 8)}-${quantize(aspect, 0.01)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(cropSizeCache, cacheKey);\n if (cached) {\n return cached;\n }\n const { width, height } = rotateSize(mediaWidth, mediaHeight, rotation);\n const fittingWidth = Math.min(width, contentWidth);\n const fittingHeight = Math.min(height, contentHeight);\n\n const result: Size =\n fittingWidth > fittingHeight * aspect\n ? {\n width: fittingHeight * aspect,\n height: fittingHeight,\n }\n : {\n width: fittingWidth,\n height: fittingWidth / aspect,\n };\n\n lruSet(cropSizeCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction onPositionClamp(\n position: Point,\n mediaSize: Size,\n cropSize: Size,\n zoom: number,\n rotation = 0\n): Point {\n const quantizedX = quantizePosition(position.x);\n const quantizedY = quantizePosition(position.y);\n\n const cacheKey = `${quantizedX}-${quantizedY}-${quantize(mediaSize.width)}-${quantize(mediaSize.height)}-${quantize(cropSize.width)}-${quantize(cropSize.height)}-${quantizeZoom(zoom)}-${quantizeRotation(rotation)}`;\n\n const cached = lruGet(onPositionClampCache, cacheKey);\n if (cached) {\n return cached;\n }\n const { width, height } = rotateSize(\n mediaSize.width,\n mediaSize.height,\n rotation\n );\n\n const maxPositionX = width * zoom * 0.5 - cropSize.width * 0.5;\n const maxPositionY = height * zoom * 0.5 - cropSize.height * 0.5;\n\n const result: Point = {\n x: clamp(position.x, -maxPositionX, maxPositionX),\n y: clamp(position.y, -maxPositionY, maxPositionY),\n };\n\n lruSet(onPositionClampCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction getCroppedArea(\n crop: Point,\n mediaSize: MediaSize,\n cropSize: Size,\n aspect: number,\n zoom: number,\n rotation = 0,\n allowOverflow = false\n): { croppedAreaPercentages: Area; croppedAreaPixels: Area } {\n const cacheKey = `${quantizePosition(crop.x)}-${quantizePosition(crop.y)}-${quantize(mediaSize.width)}-${quantize(mediaSize.height)}-${quantize(mediaSize.naturalWidth)}-${quantize(mediaSize.naturalHeight)}-${quantize(cropSize.width)}-${quantize(cropSize.height)}-${quantize(aspect, 0.01)}-${quantizeZoom(zoom)}-${quantizeRotation(rotation)}-${allowOverflow}`;\n\n const cached = lruGet(croppedAreaCache, cacheKey);\n\n if (cached) return cached;\n\n const onAreaLimit = !allowOverflow\n ? (max: number, value: number) => Math.min(max, Math.max(0, value))\n : (_max: number, value: number) => value;\n\n const mediaBBoxSize = rotateSize(mediaSize.width, mediaSize.height, rotation);\n const mediaNaturalBBoxSize = rotateSize(\n mediaSize.naturalWidth,\n mediaSize.naturalHeight,\n rotation\n );\n\n const croppedAreaPercentages: Area = {\n x: onAreaLimit(\n 100,\n (((mediaBBoxSize.width - cropSize.width / zoom) / 2 - crop.x / zoom) /\n mediaBBoxSize.width) *\n 100\n ),\n y: onAreaLimit(\n 100,\n (((mediaBBoxSize.height - cropSize.height / zoom) / 2 - crop.y / zoom) /\n mediaBBoxSize.height) *\n 100\n ),\n width: onAreaLimit(\n 100,\n ((cropSize.width / mediaBBoxSize.width) * 100) / zoom\n ),\n height: onAreaLimit(\n 100,\n ((cropSize.height / mediaBBoxSize.height) * 100) / zoom\n ),\n };\n\n const widthInPixels = Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.width,\n (croppedAreaPercentages.width * mediaNaturalBBoxSize.width) / 100\n )\n );\n const heightInPixels = Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.height,\n (croppedAreaPercentages.height * mediaNaturalBBoxSize.height) / 100\n )\n );\n const isImageWiderThanHigh =\n mediaNaturalBBoxSize.width >= mediaNaturalBBoxSize.height * aspect;\n\n const sizePixels: Size = isImageWiderThanHigh\n ? {\n width: Math.round(heightInPixels * aspect),\n height: heightInPixels,\n }\n : {\n width: widthInPixels,\n height: Math.round(widthInPixels / aspect),\n };\n\n const croppedAreaPixels: Area = {\n ...sizePixels,\n x: Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.width - sizePixels.width,\n (croppedAreaPercentages.x * mediaNaturalBBoxSize.width) / 100\n )\n ),\n y: Math.round(\n onAreaLimit(\n mediaNaturalBBoxSize.height - sizePixels.height,\n (croppedAreaPercentages.y * mediaNaturalBBoxSize.height) / 100\n )\n ),\n };\n\n const result = { croppedAreaPercentages, croppedAreaPixels };\n\n lruSet(croppedAreaCache, cacheKey, result, MAX_CACHE_SIZE);\n return result;\n}\n\nfunction useLazyRef<T>(fn: () => T) {\n const ref = React.useRef<T | null>(null);\n\n if (ref.current === null) {\n ref.current = fn();\n }\n\n return ref as React.RefObject<T>;\n}\n\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? React.useLayoutEffect : React.useEffect;\n\ninterface StoreState {\n crop: Point;\n zoom: number;\n rotation: number;\n mediaSize: MediaSize | null;\n cropSize: Size | null;\n isDragging: boolean;\n isWheelZooming: boolean;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(key: K, value: StoreState[K]) => void;\n notify: () => void;\n batch: (fn: () => void) => void;\n}\n\nfunction createStore(\n listenersRef: React.RefObject<Set<() => void>>,\n stateRef: React.RefObject<StoreState>,\n aspectRatio: number,\n allowOverflow: boolean,\n onCropChange?: (crop: Point) => void,\n onCropSizeChange?: (cropSize: Size) => void,\n onCropAreaChange?: (croppedArea: Area, croppedAreaPixels: Area) => void,\n onCropComplete?: (croppedArea: Area, croppedAreaPixels: Area) => void,\n onZoomChange?: (zoom: number) => void,\n onRotationChange?: (rotation: number) => void,\n onMediaLoaded?: (mediaSize: MediaSize) => void,\n onInteractionStart?: () => void,\n onInteractionEnd?: () => void\n): Store {\n let isBatching = false;\n let raf: number | null = null;\n\n function notifyCropAreaChange() {\n if (raf != null) return;\n raf = requestAnimationFrame(() => {\n raf = null;\n const s = stateRef.current;\n if (s?.mediaSize && s.cropSize && onCropAreaChange) {\n const { croppedAreaPercentages, croppedAreaPixels } = getCroppedArea(\n s.crop,\n s.mediaSize,\n s.cropSize,\n aspectRatio,\n s.zoom,\n s.rotation,\n allowOverflow\n );\n onCropAreaChange(croppedAreaPercentages, croppedAreaPixels);\n }\n });\n }\n\n const store: Store = {\n subscribe: (cb) => {\n if (listenersRef.current) {\n listenersRef.current.add(cb);\n return () => listenersRef.current?.delete(cb);\n }\n return () => {};\n },\n getState: () =>\n stateRef.current ?? {\n crop: { x: 0, y: 0 },\n zoom: 1,\n rotation: 0,\n mediaSize: null,\n cropSize: null,\n isDragging: false,\n isWheelZooming: false,\n },\n setState: (key, value) => {\n const state = stateRef.current;\n if (!state || Object.is(state[key], value)) return;\n\n state[key] = value;\n\n if (\n key === \"crop\" &&\n typeof value === \"object\" &&\n value &&\n \"x\" in value\n ) {\n onCropChange?.(value);\n } else if (key === \"zoom\" && typeof value === \"number\") {\n onZoomChange?.(value);\n } else if (key === \"rotation\" && typeof value === \"number\") {\n onRotationChange?.(value);\n } else if (\n key === \"cropSize\" &&\n typeof value === \"object\" &&\n value &&\n \"width\" in value\n ) {\n onCropSizeChange?.(value);\n } else if (\n key === \"mediaSize\" &&\n typeof value === \"object\" &&\n value &&\n \"naturalWidth\" in value\n ) {\n onMediaLoaded?.(value);\n } else if (key === \"isDragging\") {\n if (value) {\n onInteractionStart?.();\n } else {\n onInteractionEnd?.();\n const currentState = stateRef.current;\n if (\n currentState?.mediaSize &&\n currentState.cropSize &&\n onCropComplete\n ) {\n const { croppedAreaPercentages, croppedAreaPixels } =\n getCroppedArea(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n aspectRatio,\n currentState.zoom,\n currentState.rotation,\n allowOverflow\n );\n onCropComplete(croppedAreaPercentages, croppedAreaPixels);\n }\n }\n }\n\n if (\n (key === \"crop\" ||\n key === \"zoom\" ||\n key === \"rotation\" ||\n key === \"mediaSize\" ||\n key === \"cropSize\") &&\n onCropAreaChange\n ) {\n notifyCropAreaChange();\n }\n\n if (!isBatching) {\n store.notify();\n }\n },\n notify: () => {\n if (listenersRef.current) {\n for (const cb of listenersRef.current) {\n cb();\n }\n }\n },\n batch: (fn: () => void) => {\n if (isBatching) {\n fn();\n return;\n }\n isBatching = true;\n try {\n fn();\n } finally {\n isBatching = false;\n store.notify();\n }\n },\n };\n\n return store;\n}\n\nconst StoreContext = React.createContext<Store | null>(null);\n\nfunction useStoreContext(consumerName: string) {\n const context = React.useContext(StoreContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useStore<T>(selector: (state: StoreState) => T): T {\n const store = useStoreContext(\"useStore\");\n\n const getSnapshot = React.useCallback(\n () => selector(store.getState()),\n [store, selector]\n );\n\n return React.useSyncExternalStore(store.subscribe, getSnapshot, getSnapshot);\n}\n\ntype RootElement = React.ComponentRef<typeof CropperRootImpl>;\n\ninterface CropperContextValue {\n aspectRatio: number;\n minZoom: number;\n maxZoom: number;\n zoomSpeed: number;\n keyboardStep: number;\n shape: Shape;\n objectFit: ObjectFit;\n rootRef: React.RefObject<RootElement | null>;\n allowOverflow: boolean;\n preventScrollZoom: boolean;\n withGrid: boolean;\n}\n\nconst CropperContext = React.createContext<CropperContextValue | null>(null);\n\nfunction useCropperContext(consumerName: string) {\n const context = React.useContext(CropperContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface CropperRootProps extends DivProps {\n crop?: Point;\n zoom?: number;\n minZoom?: number;\n maxZoom?: number;\n zoomSpeed?: number;\n rotation?: number;\n keyboardStep?: number;\n aspectRatio?: number;\n shape?: Shape;\n objectFit?: ObjectFit;\n allowOverflow?: boolean;\n preventScrollZoom?: boolean;\n withGrid?: boolean;\n onCropChange?: (crop: Point) => void;\n onCropSizeChange?: (cropSize: Size) => void;\n onCropAreaChange?: (croppedArea: Area, croppedAreaPixels: Area) => void;\n onCropComplete?: (croppedArea: Area, croppedAreaPixels: Area) => void;\n onZoomChange?: (zoom: number) => void;\n onRotationChange?: (rotation: number) => void;\n onMediaLoaded?: (mediaSize: MediaSize) => void;\n onInteractionStart?: () => void;\n onInteractionEnd?: () => void;\n onWheelZoom?: (event: WheelEvent) => void;\n}\n\nfunction CropperRoot(props: CropperRootProps) {\n const {\n crop = { x: 0, y: 0 },\n zoom = 1,\n minZoom = 1,\n maxZoom = 3,\n zoomSpeed = 1,\n rotation = 0,\n keyboardStep = 1,\n aspectRatio = 4 / 3,\n shape = \"rectangle\",\n objectFit = \"contain\",\n allowOverflow = false,\n preventScrollZoom = false,\n withGrid = false,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd,\n className,\n ...rootProps\n } = props;\n\n const listenersRef = useLazyRef(() => new Set<() => void>());\n const stateRef = useLazyRef<StoreState>(() => ({\n crop,\n zoom,\n rotation,\n mediaSize: null,\n cropSize: null,\n isDragging: false,\n isWheelZooming: false,\n }));\n\n const rootRef = React.useRef<RootElement>(null);\n\n const store = React.useMemo(\n () =>\n createStore(\n listenersRef,\n stateRef,\n aspectRatio,\n allowOverflow,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd\n ),\n [\n listenersRef,\n stateRef,\n aspectRatio,\n allowOverflow,\n onCropChange,\n onCropSizeChange,\n onCropAreaChange,\n onCropComplete,\n onZoomChange,\n onRotationChange,\n onMediaLoaded,\n onInteractionStart,\n onInteractionEnd,\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const updates: Partial<StoreState> = {};\n let hasUpdates = false;\n let shouldRecompute = false;\n\n if (crop !== undefined) {\n const currentState = store.getState();\n if (!Object.is(currentState.crop, crop)) {\n updates.crop = crop;\n hasUpdates = true;\n }\n }\n\n if (zoom !== undefined) {\n const currentState = store.getState();\n if (currentState.zoom !== zoom) {\n updates.zoom = zoom;\n hasUpdates = true;\n shouldRecompute = true;\n }\n }\n\n if (rotation !== undefined) {\n const currentState = store.getState();\n if (currentState.rotation !== rotation) {\n updates.rotation = rotation;\n hasUpdates = true;\n shouldRecompute = true;\n }\n }\n\n if (hasUpdates) {\n store.batch(() => {\n Object.entries(updates).forEach(([key, value]) => {\n store.setState(key as keyof StoreState, value);\n });\n });\n\n if (shouldRecompute && rootRef.current) {\n requestAnimationFrame(() => {\n const currentState = store.getState();\n if (currentState.cropSize && currentState.mediaSize) {\n const newPosition = !allowOverflow\n ? onPositionClamp(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n currentState.zoom,\n currentState.rotation\n )\n : currentState.crop;\n\n if (\n Math.abs(newPosition.x - currentState.crop.x) > 0.001 ||\n Math.abs(newPosition.y - currentState.crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }\n });\n }\n }\n }, [crop, zoom, rotation, store, allowOverflow]);\n\n const contextValue = React.useMemo<CropperContextValue>(\n () => ({\n minZoom,\n maxZoom,\n zoomSpeed,\n keyboardStep,\n aspectRatio,\n shape,\n objectFit,\n preventScrollZoom,\n allowOverflow,\n withGrid,\n rootRef,\n }),\n [\n minZoom,\n maxZoom,\n zoomSpeed,\n keyboardStep,\n aspectRatio,\n shape,\n objectFit,\n preventScrollZoom,\n allowOverflow,\n withGrid,\n ]\n );\n\n return (\n <StoreContext.Provider value={store}>\n <CropperContext.Provider value={contextValue}>\n <div\n data-slot=\"cropper-wrapper\"\n className={cn(\"ds:relative ds:size-full ds:overflow-hidden\", className)}\n >\n <CropperRootImpl {...rootProps} />\n </div>\n </CropperContext.Provider>\n </StoreContext.Provider>\n );\n}\n\ninterface CropperRootImplProps extends CropperRootProps {\n onWheelZoom?: (event: WheelEvent) => void;\n}\n\nfunction CropperRootImpl(props: CropperRootImplProps) {\n const { className, asChild, ref, ...contentProps } = props;\n\n const context = useCropperContext(CONTENT_NAME);\n const store = useStoreContext(CONTENT_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n const mediaSize = useStore((state) => state.mediaSize);\n const cropSize = useStore((state) => state.cropSize);\n\n const composedRef = useComposedRefs(ref, context.rootRef);\n const dragStartPositionRef = React.useRef<Point>({ x: 0, y: 0 });\n const dragStartCropRef = React.useRef<Point>({ x: 0, y: 0 });\n const contentPositionRef = React.useRef<Point>({ x: 0, y: 0 });\n const lastPinchDistanceRef = React.useRef(0);\n const lastPinchRotationRef = React.useRef(0);\n const rafDragTimeoutRef = React.useRef<number | null>(null);\n const rafPinchTimeoutRef = React.useRef<number | null>(null);\n const wheelTimerRef = React.useRef<number | null>(null);\n const isTouchingRef = React.useRef(false);\n const gestureZoomStartRef = React.useRef(0);\n const gestureRotationStartRef = React.useRef(0);\n\n const onRefsCleanup = React.useCallback(() => {\n if (rafDragTimeoutRef.current) {\n cancelAnimationFrame(rafDragTimeoutRef.current);\n rafDragTimeoutRef.current = null;\n }\n if (rafPinchTimeoutRef.current) {\n cancelAnimationFrame(rafPinchTimeoutRef.current);\n rafPinchTimeoutRef.current = null;\n }\n if (wheelTimerRef.current) {\n clearTimeout(wheelTimerRef.current);\n wheelTimerRef.current = null;\n }\n isTouchingRef.current = false;\n }, []);\n\n const onCachesCleanup = React.useCallback(() => {\n if (onPositionClampCache.size > MAX_CACHE_SIZE * 1.5) {\n onPositionClampCache.clear();\n }\n if (croppedAreaCache.size > MAX_CACHE_SIZE * 1.5) {\n croppedAreaCache.clear();\n }\n }, []);\n\n const getMousePoint = React.useCallback(\n (event: MouseEvent | React.MouseEvent) => ({\n x: Number(event.clientX),\n y: Number(event.clientY),\n }),\n []\n );\n\n const getTouchPoint = React.useCallback(\n (touch: Touch | React.Touch) => ({\n x: Number(touch.clientX),\n y: Number(touch.clientY),\n }),\n []\n );\n\n const onContentPositionChange = React.useCallback(() => {\n if (context.rootRef?.current) {\n const bounds = context.rootRef.current.getBoundingClientRect();\n contentPositionRef.current = { x: bounds.left, y: bounds.top };\n }\n }, [context.rootRef]);\n\n const getPointOnContent = React.useCallback(\n ({ x, y }: Point, contentTopLeft: Point): Point => {\n if (!context.rootRef?.current) {\n return { x: 0, y: 0 };\n }\n const contentRect = context.rootRef.current.getBoundingClientRect();\n return {\n x: contentRect.width / 2 - (x - contentTopLeft.x),\n y: contentRect.height / 2 - (y - contentTopLeft.y),\n };\n },\n [context.rootRef]\n );\n\n const getPointOnMedia = React.useCallback(\n ({ x, y }: Point) => {\n return {\n x: (x + crop.x) / zoom,\n y: (y + crop.y) / zoom,\n };\n },\n [crop, zoom]\n );\n\n const recomputeCropPosition = React.useCallback(() => {\n if (!cropSize || !mediaSize) return;\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(crop, mediaSize, cropSize, zoom, rotation)\n : crop;\n\n if (\n Math.abs(newPosition.x - crop.x) > 0.001 ||\n Math.abs(newPosition.y - crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }, [cropSize, mediaSize, context.allowOverflow, crop, zoom, rotation, store]);\n\n const onZoomChange = React.useCallback(\n (newZoom: number, point: Point, shouldUpdatePosition = true) => {\n if (!cropSize || !mediaSize) return;\n\n const clampedZoom = clamp(newZoom, context.minZoom, context.maxZoom);\n\n store.batch(() => {\n if (shouldUpdatePosition) {\n const zoomPoint = getPointOnContent(\n point,\n contentPositionRef.current\n );\n const zoomTarget = getPointOnMedia(zoomPoint);\n const requestedPosition = {\n x: zoomTarget.x * clampedZoom - zoomPoint.x,\n y: zoomTarget.y * clampedZoom - zoomPoint.y,\n };\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(\n requestedPosition,\n mediaSize,\n cropSize,\n clampedZoom,\n rotation\n )\n : requestedPosition;\n\n store.setState(\"crop\", newPosition);\n }\n store.setState(\"zoom\", clampedZoom);\n });\n\n requestAnimationFrame(() => {\n recomputeCropPosition();\n });\n },\n [\n cropSize,\n mediaSize,\n context.minZoom,\n context.maxZoom,\n context.allowOverflow,\n getPointOnContent,\n getPointOnMedia,\n rotation,\n store,\n recomputeCropPosition,\n ]\n );\n\n const onDragStart = React.useCallback(\n ({ x, y }: Point) => {\n dragStartPositionRef.current = { x, y };\n dragStartCropRef.current = { ...crop };\n store.setState(\"isDragging\", true);\n },\n [crop, store]\n );\n\n const onDrag = React.useCallback(\n ({ x, y }: Point) => {\n if (rafDragTimeoutRef.current) {\n cancelAnimationFrame(rafDragTimeoutRef.current);\n }\n\n rafDragTimeoutRef.current = requestAnimationFrame(() => {\n if (!cropSize || !mediaSize) return;\n if (x === undefined || y === undefined) return;\n\n const offsetX = x - dragStartPositionRef.current.x;\n const offsetY = y - dragStartPositionRef.current.y;\n\n if (Math.abs(offsetX) < 2 && Math.abs(offsetY) < 2) {\n return;\n }\n\n const requestedPosition = {\n x: dragStartCropRef.current.x + offsetX,\n y: dragStartCropRef.current.y + offsetY,\n };\n\n const newPosition = !context.allowOverflow\n ? onPositionClamp(\n requestedPosition,\n mediaSize,\n cropSize,\n zoom,\n rotation\n )\n : requestedPosition;\n\n const currentCrop = store.getState().crop;\n if (\n Math.abs(newPosition.x - currentCrop.x) > 1 ||\n Math.abs(newPosition.y - currentCrop.y) > 1\n ) {\n store.setState(\"crop\", newPosition);\n }\n });\n },\n [cropSize, mediaSize, context.allowOverflow, zoom, rotation, store]\n );\n\n const onMouseMove = React.useCallback(\n (event: MouseEvent) => onDrag(getMousePoint(event)),\n [getMousePoint, onDrag]\n );\n\n const onTouchMove = React.useCallback(\n (event: TouchEvent) => {\n event.preventDefault();\n if (event.touches.length === 2) {\n const [firstTouch, secondTouch] = event.touches ?? [];\n if (firstTouch && secondTouch) {\n const pointA = getTouchPoint(firstTouch);\n const pointB = getTouchPoint(secondTouch);\n const center = getCenter(pointA, pointB);\n onDrag(center);\n\n if (rafPinchTimeoutRef.current) {\n cancelAnimationFrame(rafPinchTimeoutRef.current);\n }\n\n rafPinchTimeoutRef.current = requestAnimationFrame(() => {\n const distance = getDistanceBetweenPoints(pointA, pointB);\n const distanceRatio = distance / lastPinchDistanceRef.current;\n\n if (Math.abs(distanceRatio - 1) > 0.01) {\n const newZoom = zoom * distanceRatio;\n onZoomChange(newZoom, center, false);\n lastPinchDistanceRef.current = distance;\n }\n\n const rotationAngle = getRotationBetweenPoints(pointA, pointB);\n const rotationDiff = rotationAngle - lastPinchRotationRef.current;\n\n if (Math.abs(rotationDiff) > 0.5) {\n const newRotation = rotation + rotationDiff;\n store.setState(\"rotation\", newRotation);\n lastPinchRotationRef.current = rotationAngle;\n }\n });\n }\n } else if (event.touches.length === 1) {\n const firstTouch = event.touches[0];\n if (firstTouch) {\n onDrag(getTouchPoint(firstTouch));\n }\n }\n },\n [getTouchPoint, onDrag, zoom, onZoomChange, rotation, store]\n );\n\n const onGestureChange = React.useCallback(\n (event: GestureEvent) => {\n event.preventDefault();\n if (isTouchingRef.current) {\n return;\n }\n\n const point = { x: Number(event.clientX), y: Number(event.clientY) };\n const newZoom = gestureZoomStartRef.current - 1 + event.scale;\n onZoomChange(newZoom, point, true);\n\n const newRotation = gestureRotationStartRef.current + event.rotation;\n store.setState(\"rotation\", newRotation);\n },\n [onZoomChange, store]\n );\n\n const onGestureEnd = React.useCallback(() => {\n document.removeEventListener(\n \"gesturechange\",\n onGestureChange as EventListener\n );\n document.removeEventListener(\"gestureend\", onGestureEnd as EventListener);\n }, [onGestureChange]);\n\n const onGestureStart = React.useCallback(\n (event: GestureEvent) => {\n event.preventDefault();\n document.addEventListener(\n \"gesturechange\",\n onGestureChange as EventListener\n );\n document.addEventListener(\"gestureend\", onGestureEnd as EventListener);\n gestureZoomStartRef.current = zoom;\n gestureRotationStartRef.current = rotation;\n },\n [zoom, rotation, onGestureChange, onGestureEnd]\n );\n\n const onSafariZoomPrevent = React.useCallback(\n (event: Event) => event.preventDefault(),\n []\n );\n\n const onEventsCleanup = React.useCallback(() => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"touchmove\", onTouchMove);\n document.removeEventListener(\n \"gesturechange\",\n onGestureChange as EventListener\n );\n document.removeEventListener(\"gestureend\", onGestureEnd as EventListener);\n }, [onMouseMove, onTouchMove, onGestureChange, onGestureEnd]);\n\n const onDragStopped = React.useCallback(() => {\n isTouchingRef.current = false;\n store.setState(\"isDragging\", false);\n onRefsCleanup();\n document.removeEventListener(\"mouseup\", onDragStopped);\n document.removeEventListener(\"touchend\", onDragStopped);\n onEventsCleanup();\n }, [store, onEventsCleanup, onRefsCleanup]);\n\n const getWheelDelta = React.useCallback((event: WheelEvent) => {\n let deltaX = event.deltaX;\n let deltaY = event.deltaY;\n let deltaZ = event.deltaZ;\n\n if (event.deltaMode === 1) {\n deltaX *= 16;\n deltaY *= 16;\n deltaZ *= 16;\n } else if (event.deltaMode === 2) {\n deltaX *= 400;\n deltaY *= 400;\n deltaZ *= 400;\n }\n\n return { deltaX, deltaY, deltaZ };\n }, []);\n\n const onWheelZoom = React.useCallback(\n (event: WheelEvent) => {\n contentProps.onWheelZoom?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n const point = getMousePoint(event);\n const { deltaY } = getWheelDelta(event);\n const newZoom = zoom - (deltaY * context.zoomSpeed) / 200;\n onZoomChange(newZoom, point, true);\n\n store.batch(() => {\n const currentState = store.getState();\n if (!currentState.isWheelZooming) {\n store.setState(\"isWheelZooming\", true);\n }\n if (!currentState.isDragging) {\n store.setState(\"isDragging\", true);\n }\n });\n\n if (wheelTimerRef.current) {\n clearTimeout(wheelTimerRef.current);\n }\n wheelTimerRef.current = window.setTimeout(() => {\n store.batch(() => {\n store.setState(\"isWheelZooming\", false);\n store.setState(\"isDragging\", false);\n });\n }, 250);\n },\n [\n contentProps.onWheelZoom,\n getMousePoint,\n zoom,\n context.zoomSpeed,\n onZoomChange,\n getWheelDelta,\n store,\n ]\n );\n\n const onKeyUp = React.useCallback(\n (event: React.KeyboardEvent<RootElement>) => {\n contentProps.onKeyUp?.(event);\n if (event.defaultPrevented) return;\n\n const arrowKeys = new Set([\n \"ArrowUp\",\n \"ArrowDown\",\n \"ArrowLeft\",\n \"ArrowRight\",\n ]);\n\n if (arrowKeys.has(event.key)) {\n event.preventDefault();\n store.setState(\"isDragging\", false);\n }\n },\n [contentProps.onKeyUp, store]\n );\n\n const onKeyDown = React.useCallback(\n (event: React.KeyboardEvent<RootElement>) => {\n contentProps.onKeyDown?.(event);\n if (event.defaultPrevented || !cropSize || !mediaSize) return;\n\n let step = context.keyboardStep;\n if (event.shiftKey) {\n step *= 0.2;\n }\n\n const keyCallbacks: Record<string, () => Point> = {\n ArrowUp: () => ({ ...crop, y: crop.y - step }),\n ArrowDown: () => ({ ...crop, y: crop.y + step }),\n ArrowLeft: () => ({ ...crop, x: crop.x - step }),\n ArrowRight: () => ({ ...crop, x: crop.x + step }),\n } as const;\n\n const callback = keyCallbacks[event.key];\n if (!callback) return;\n\n event.preventDefault();\n\n let newCrop = callback();\n\n if (!context.allowOverflow) {\n newCrop = onPositionClamp(newCrop, mediaSize, cropSize, zoom, rotation);\n }\n\n if (!event.repeat) {\n store.setState(\"isDragging\", true);\n }\n\n store.setState(\"crop\", newCrop);\n },\n [\n contentProps.onKeyDown,\n cropSize,\n mediaSize,\n context.keyboardStep,\n context.allowOverflow,\n crop,\n zoom,\n rotation,\n store,\n ]\n );\n\n const onMouseDown = React.useCallback(\n (event: React.MouseEvent<RootElement>) => {\n contentProps.onMouseDown?.(event);\n if (event.defaultPrevented) return;\n\n event.preventDefault();\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onDragStopped);\n onContentPositionChange();\n onDragStart(getMousePoint(event));\n },\n [\n contentProps.onMouseDown,\n getMousePoint,\n onDragStart,\n onDragStopped,\n onMouseMove,\n onContentPositionChange,\n ]\n );\n\n const onTouchStart = React.useCallback(\n (event: React.TouchEvent<RootElement>) => {\n contentProps.onTouchStart?.(event);\n if (event.defaultPrevented) return;\n\n isTouchingRef.current = true;\n document.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n document.addEventListener(\"touchend\", onDragStopped);\n onContentPositionChange();\n\n if (event.touches.length === 2) {\n const [firstTouch, secondTouch] = event.touches\n ? Array.from(event.touches)\n : [];\n if (firstTouch && secondTouch) {\n const pointA = getTouchPoint(firstTouch);\n const pointB = getTouchPoint(secondTouch);\n lastPinchDistanceRef.current = getDistanceBetweenPoints(\n pointA,\n pointB\n );\n lastPinchRotationRef.current = getRotationBetweenPoints(\n pointA,\n pointB\n );\n onDragStart(getCenter(pointA, pointB));\n }\n } else if (event.touches.length === 1) {\n const firstTouch = event.touches[0];\n if (firstTouch) {\n onDragStart(getTouchPoint(firstTouch));\n }\n }\n },\n [\n contentProps.onTouchStart,\n onDragStopped,\n onTouchMove,\n onContentPositionChange,\n getTouchPoint,\n onDragStart,\n ]\n );\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (!context.preventScrollZoom) {\n content.addEventListener(\"wheel\", onWheelZoom, { passive: false });\n }\n\n content.addEventListener(\"gesturestart\", onSafariZoomPrevent);\n content.addEventListener(\"gesturestart\", onGestureStart as EventListener);\n\n return () => {\n if (!context.preventScrollZoom) {\n content.removeEventListener(\"wheel\", onWheelZoom);\n }\n content.removeEventListener(\"gesturestart\", onSafariZoomPrevent);\n content.removeEventListener(\n \"gesturestart\",\n onGestureStart as EventListener\n );\n onRefsCleanup();\n };\n }, [\n context.rootRef,\n context.preventScrollZoom,\n onWheelZoom,\n onRefsCleanup,\n onSafariZoomPrevent,\n onGestureStart,\n ]);\n\n React.useEffect(() => {\n return () => {\n onRefsCleanup();\n onCachesCleanup();\n };\n }, [onRefsCleanup, onCachesCleanup]);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <RootPrimitive\n data-slot=\"cropper\"\n tabIndex={0}\n {...contentProps}\n ref={composedRef}\n className={cn(\n \"ds:absolute ds:inset-0 ds:flex ds:cursor-move ds:touch-none ds:select-none ds:items-center ds:justify-center ds:overflow-hidden ds:outline-none\",\n className\n )}\n onKeyUp={onKeyUp}\n onKeyDown={onKeyDown}\n onMouseDown={onMouseDown}\n onTouchStart={onTouchStart}\n />\n );\n}\n\nconst cropperMediaVariants = cva(\"ds:will-change-transform\", {\n variants: {\n objectFit: {\n contain: \"ds:absolute ds:inset-0 ds:m-auto ds:max-h-full ds:max-w-full\",\n cover: \"ds:h-auto ds:w-full\",\n \"horizontal-cover\": \"ds:h-auto ds:w-full\",\n \"vertical-cover\": \"ds:h-full ds:w-auto\",\n },\n },\n defaultVariants: {\n objectFit: \"contain\",\n },\n});\n\ninterface UseMediaComputationProps<\n T extends HTMLImageElement | HTMLVideoElement,\n> {\n mediaRef: React.RefObject<T | null>;\n context: CropperContextValue;\n store: Store;\n rotation: number;\n getNaturalDimensions: (media: T) => Size;\n}\n\nfunction useMediaComputation<T extends HTMLImageElement | HTMLVideoElement>({\n mediaRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n}: UseMediaComputationProps<T>) {\n const computeSizes = React.useCallback(() => {\n const media = mediaRef.current;\n const content = context.rootRef?.current;\n if (!media || !content) return;\n\n const contentRect = content.getBoundingClientRect();\n const containerAspect = contentRect.width / contentRect.height;\n const { width: naturalWidth, height: naturalHeight } =\n getNaturalDimensions(media);\n const isScaledDown =\n media.offsetWidth < naturalWidth || media.offsetHeight < naturalHeight;\n const mediaAspect = naturalWidth / naturalHeight;\n\n let renderedMediaSize: Size;\n\n if (isScaledDown) {\n const objectFitCallbacks = {\n contain: () =>\n containerAspect > mediaAspect\n ? {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }\n : {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n },\n \"horizontal-cover\": () => ({\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n }),\n \"vertical-cover\": () => ({\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }),\n cover: () =>\n containerAspect < mediaAspect\n ? {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n }\n : {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n },\n } as const;\n\n const callback = objectFitCallbacks[context.objectFit];\n renderedMediaSize = callback\n ? callback()\n : containerAspect > mediaAspect\n ? {\n width: contentRect.height * mediaAspect,\n height: contentRect.height,\n }\n : {\n width: contentRect.width,\n height: contentRect.width / mediaAspect,\n };\n } else {\n renderedMediaSize = {\n width: media.offsetWidth,\n height: media.offsetHeight,\n };\n }\n\n const mediaSize: MediaSize = {\n ...renderedMediaSize,\n naturalWidth,\n naturalHeight,\n };\n\n store.setState(\"mediaSize\", mediaSize);\n\n const cropSize = getCropSize(\n mediaSize.width,\n mediaSize.height,\n contentRect.width,\n contentRect.height,\n context.aspectRatio,\n rotation\n );\n\n store.setState(\"cropSize\", cropSize);\n\n requestAnimationFrame(() => {\n const currentState = store.getState();\n if (currentState.cropSize && currentState.mediaSize) {\n const newPosition = onPositionClamp(\n currentState.crop,\n currentState.mediaSize,\n currentState.cropSize,\n currentState.zoom,\n currentState.rotation\n );\n\n if (\n Math.abs(newPosition.x - currentState.crop.x) > 0.001 ||\n Math.abs(newPosition.y - currentState.crop.y) > 0.001\n ) {\n store.setState(\"crop\", newPosition);\n }\n }\n });\n\n return { mediaSize, cropSize };\n }, [\n mediaRef,\n context.aspectRatio,\n context.rootRef,\n context.objectFit,\n store,\n rotation,\n getNaturalDimensions,\n ]);\n\n return { computeSizes };\n}\n\ninterface CropperImageProps\n extends React.ComponentProps<\"img\">,\n VariantProps<typeof cropperMediaVariants> {\n asChild?: boolean;\n snapPixels?: boolean;\n}\n\nfunction CropperImage(props: CropperImageProps) {\n const {\n className,\n style,\n asChild,\n ref,\n onLoad,\n objectFit,\n snapPixels = false,\n ...imageProps\n } = props;\n\n const context = useCropperContext(IMAGE_NAME);\n const store = useStoreContext(IMAGE_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n\n const imageRef = React.useRef<HTMLImageElement>(null);\n const composedRef = useComposedRefs(ref, imageRef);\n\n const getNaturalDimensions = React.useCallback(\n (image: HTMLImageElement) => ({\n width: image.naturalWidth,\n height: image.naturalHeight,\n }),\n []\n );\n\n const { computeSizes } = useMediaComputation({\n mediaRef: imageRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n });\n\n const onMediaLoad = React.useCallback(() => {\n const image = imageRef.current;\n if (!image) return;\n\n computeSizes();\n\n onLoad?.(\n new Event(\"load\") as unknown as React.SyntheticEvent<HTMLImageElement>\n );\n }, [computeSizes, onLoad]);\n\n React.useEffect(() => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n onMediaLoad();\n }\n }, [onMediaLoad]);\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (typeof ResizeObserver !== \"undefined\") {\n let isFirstResize = true;\n const resizeObserver = new ResizeObserver(() => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n\n const callback = () => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n computeSizes();\n }\n };\n\n if (\"requestIdleCallback\" in window) {\n requestIdleCallback(callback);\n } else {\n setTimeout(callback, 16);\n }\n });\n\n resizeObserver.observe(content);\n\n return () => {\n resizeObserver.disconnect();\n };\n } else {\n const onWindowResize = () => {\n const image = imageRef.current;\n if (image?.complete && image.naturalWidth > 0) {\n computeSizes();\n }\n };\n\n window.addEventListener(\"resize\", onWindowResize);\n return () => {\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }\n }, [context.rootRef, computeSizes]);\n\n const ImagePrimitive = asChild ? Slot : \"img\";\n\n return (\n <ImagePrimitive\n data-slot=\"cropper-image\"\n {...imageProps}\n ref={composedRef}\n className={cn(\n cropperMediaVariants({\n objectFit: objectFit ?? context.objectFit,\n className,\n })\n )}\n style={{\n transform: snapPixels\n ? `translate(${snapToDevicePixel(crop.x)}px, ${snapToDevicePixel(crop.y)}px) rotate(${rotation}deg) scale(${zoom})`\n : `translate(${crop.x}px, ${crop.y}px) rotate(${rotation}deg) scale(${zoom})`,\n ...style,\n }}\n onLoad={onMediaLoad}\n />\n );\n}\n\ninterface CropperVideoProps\n extends React.ComponentProps<\"video\">,\n VariantProps<typeof cropperMediaVariants> {\n asChild?: boolean;\n snapPixels?: boolean;\n}\n\nfunction CropperVideo(props: CropperVideoProps) {\n const {\n className,\n style,\n asChild,\n ref,\n onLoadedMetadata,\n objectFit,\n snapPixels = false,\n ...videoProps\n } = props;\n\n const context = useCropperContext(VIDEO_NAME);\n const store = useStoreContext(VIDEO_NAME);\n const crop = useStore((state) => state.crop);\n const zoom = useStore((state) => state.zoom);\n const rotation = useStore((state) => state.rotation);\n\n const videoRef = React.useRef<HTMLVideoElement>(null);\n const composedRef = useComposedRefs(ref, videoRef);\n\n const getNaturalDimensions = React.useCallback(\n (video: HTMLVideoElement) => ({\n width: video.videoWidth,\n height: video.videoHeight,\n }),\n []\n );\n\n const { computeSizes } = useMediaComputation({\n mediaRef: videoRef,\n context,\n store,\n rotation,\n getNaturalDimensions,\n });\n\n const onMediaLoad = React.useCallback(() => {\n const video = videoRef.current;\n if (!video) return;\n\n computeSizes();\n\n onLoadedMetadata?.(\n new Event(\n \"loadedmetadata\"\n ) as unknown as React.SyntheticEvent<HTMLVideoElement>\n );\n }, [computeSizes, onLoadedMetadata]);\n\n React.useEffect(() => {\n const content = context.rootRef?.current;\n if (!content) return;\n\n if (typeof ResizeObserver !== \"undefined\") {\n let isFirstResize = true;\n const resizeObserver = new ResizeObserver(() => {\n if (isFirstResize) {\n isFirstResize = false;\n return;\n }\n\n const callback = () => {\n const video = videoRef.current;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n computeSizes();\n }\n };\n\n if (\"requestIdleCallback\" in window) {\n requestIdleCallback(callback);\n } else {\n setTimeout(callback, 16);\n }\n });\n\n resizeObserver.observe(content);\n\n return () => {\n resizeObserver.disconnect();\n };\n } else {\n const onWindowResize = () => {\n const video = videoRef.current;\n if (video && video.videoWidth > 0 && video.videoHeight > 0) {\n computeSizes();\n }\n };\n\n window.addEventListener(\"resize\", onWindowResize);\n return () => {\n window.removeEventListener(\"resize\", onWindowResize);\n };\n }\n }, [context.rootRef, computeSizes]);\n\n const VideoPrimitive = asChild ? Slot : \"video\";\n\n return (\n <VideoPrimitive\n data-slot=\"cropper-video\"\n autoPlay\n playsInline\n loop\n muted\n controls={false}\n {...videoProps}\n ref={composedRef}\n className={cn(\n cropperMediaVariants({\n objectFit: objectFit ?? context.objectFit,\n className,\n })\n )}\n style={{\n transform: snapPixels\n ? `translate(${snapToDevicePixel(crop.x)}px, ${snapToDevicePixel(crop.y)}px) rotate(${rotation}deg) scale(${zoom})`\n : `translate(${crop.x}px, ${crop.y}px) rotate(${rotation}deg) scale(${zoom})`,\n ...style,\n }}\n onLoadedMetadata={onMediaLoad}\n />\n );\n}\n\nconst cropperAreaVariants = cva(\n \"ds:-translate-x-1/2 ds:-translate-y-1/2 ds:absolute ds:top-1/2 ds:left-1/2 ds:box-border ds:overflow-hidden ds:border ds:border-[2.5px] ds:border-white/90 ds:shadow-[0_0_0_9999em_rgba(0,0,0,0.5)]\",\n {\n variants: {\n shape: {\n rectangle: \"\",\n circle: \"ds:rounded-full\",\n },\n withGrid: {\n true: \"ds:before:absolute ds:before:top-0 ds:before:right-1/3 ds:before:bottom-0 ds:before:left-1/3 ds:before:box-border ds:before:border ds:before:border-white/50 ds:before:border-t-0 ds:before:border-b-0 ds:before:content-[''] ds:after:absolute ds:after:top-1/3 ds:after:right-0 ds:after:bottom-1/3 ds:after:left-0 ds:after:box-border ds:after:border ds:after:border-white/50 ds:after:border-r-0 ds:after:border-l-0 ds:after:content-['']\",\n false: \"\",\n },\n },\n defaultVariants: {\n shape: \"rectangle\",\n withGrid: false,\n },\n }\n);\n\ninterface CropperAreaProps\n extends DivProps,\n VariantProps<typeof cropperAreaVariants> {\n snapPixels?: boolean;\n}\n\nfunction CropperArea(props: CropperAreaProps) {\n const {\n className,\n style,\n asChild,\n ref,\n snapPixels = false,\n shape,\n withGrid,\n ...areaProps\n } = props;\n\n const context = useCropperContext(AREA_NAME);\n const cropSize = useStore((state) => state.cropSize);\n\n if (!cropSize) return null;\n\n const AreaPrimitive = asChild ? Slot : \"div\";\n\n return (\n <AreaPrimitive\n data-slot=\"cropper-area\"\n {...areaProps}\n ref={ref}\n className={cn(\n cropperAreaVariants({\n shape: shape ?? context.shape,\n withGrid: withGrid ?? context.withGrid,\n className,\n })\n )}\n style={{\n width: snapPixels ? Math.round(cropSize.width) : cropSize.width,\n height: snapPixels ? Math.round(cropSize.height) : cropSize.height,\n ...style,\n }}\n />\n );\n}\n\nexport {\n CropperRoot as Root,\n CropperImage as Image,\n CropperVideo as Video,\n CropperArea as Area,\n //\n CropperRoot as Cropper,\n CropperImage,\n CropperVideo,\n CropperArea,\n //\n useStore as useCropper,\n //\n type CropperRootProps as CropperProps,\n type Point as CropperPoint,\n type Size as CropperSize,\n type Area as CropperAreaData,\n type Shape as CropperShape,\n type ObjectFit as CropperObjectFit,\n};\n"],"names":["ROOT_NAME","CONTENT_NAME","IMAGE_NAME","VIDEO_NAME","AREA_NAME","MAX_CACHE_SIZE","DPR","rotationSizeCache","cropSizeCache","croppedAreaCache","onPositionClampCache","clamp","value","min","max","quantize","n","step","quantizePosition","quantizeZoom","quantizeRotation","snapToDevicePixel","lruGet","map","key","v","lruSet","val","firstKey","getDistanceBetweenPoints","pointA","pointB","getCenter","a","b","getRotationBetweenPoints","getRadianAngle","degreeValue","rotateSize","width","height","rotation","cacheKey","cached","rotRad","cosRot","sinRot","result","getCropSize","mediaWidth","mediaHeight","contentWidth","contentHeight","aspect","fittingWidth","fittingHeight","onPositionClamp","position","mediaSize","cropSize","zoom","quantizedX","quantizedY","maxPositionX","maxPositionY","getCroppedArea","crop","allowOverflow","onAreaLimit","_max","mediaBBoxSize","mediaNaturalBBoxSize","croppedAreaPercentages","widthInPixels","heightInPixels","sizePixels","croppedAreaPixels","useLazyRef","fn","ref","React","useIsomorphicLayoutEffect","createStore","listenersRef","stateRef","aspectRatio","onCropChange","onCropSizeChange","onCropAreaChange","onCropComplete","onZoomChange","onRotationChange","onMediaLoaded","onInteractionStart","onInteractionEnd","isBatching","raf","notifyCropAreaChange","s","store","cb","state","currentState","StoreContext","useStoreContext","consumerName","context","useStore","selector","getSnapshot","CropperContext","useCropperContext","CropperRoot","props","minZoom","maxZoom","zoomSpeed","keyboardStep","shape","objectFit","preventScrollZoom","withGrid","className","rootProps","rootRef","updates","hasUpdates","shouldRecompute","newPosition","contextValue","jsx","cn","CropperRootImpl","asChild","contentProps","composedRef","useComposedRefs","dragStartPositionRef","dragStartCropRef","contentPositionRef","lastPinchDistanceRef","lastPinchRotationRef","rafDragTimeoutRef","rafPinchTimeoutRef","wheelTimerRef","isTouchingRef","gestureZoomStartRef","gestureRotationStartRef","onRefsCleanup","onCachesCleanup","getMousePoint","event","getTouchPoint","touch","onContentPositionChange","bounds","getPointOnContent","x","y","contentTopLeft","contentRect","getPointOnMedia","recomputeCropPosition","newZoom","point","shouldUpdatePosition","clampedZoom","zoomPoint","zoomTarget","requestedPosition","onDragStart","onDrag","offsetX","offsetY","currentCrop","onMouseMove","onTouchMove","firstTouch","secondTouch","center","distance","distanceRatio","rotationAngle","rotationDiff","newRotation","onGestureChange","onGestureEnd","onGestureStart","onSafariZoomPrevent","onEventsCleanup","onDragStopped","getWheelDelta","deltaX","deltaY","deltaZ","onWheelZoom","onKeyUp","onKeyDown","callback","newCrop","onMouseDown","onTouchStart","content","Slot","cropperMediaVariants","cva","useMediaComputation","mediaRef","getNaturalDimensions","media","containerAspect","naturalWidth","naturalHeight","isScaledDown","mediaAspect","renderedMediaSize","CropperImage","style","onLoad","snapPixels","imageProps","imageRef","image","computeSizes","onMediaLoad","isFirstResize","resizeObserver","onWindowResize","CropperVideo","onLoadedMetadata","videoProps","videoRef","video","cropperAreaVariants","CropperArea","areaProps"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"CropperTool.js","sources":["../../../../src/components/Cropper/CropperTool.tsx"],"sourcesContent":["import React from \"react\";\nimport {\n Cropper,\n CropperImage,\n CropperArea,\n type CropperProps,\n type CropperPoint,\n type CropperAreaData,\n} from \"./Cropper\";\nimport { getCroppedImg, type CroppedImageOptions } from \"./utils\";\n\nexport interface CropperToolProps extends Omit<CropperProps, \"onCropComplete\"> {\n /**\n * Image source URL\n */\n src: string;\n /**\n * Alt text for the image\n */\n alt?: string;\n /**\n * Callback when crop is completed with the cropped image as base64 or Blob\n */\n onCropComplete?: (croppedImage: string | Blob) => void;\n /**\n * Callback when crop area changes (for real-time updates)\n */\n onCropAreaChange?: (\n croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => void;\n /**\n * Options for the cropped image output\n */\n cropOptions?: Pick<\n CroppedImageOptions,\n \"format\" | \"quality\" | \"flip\" | \"type\"\n >;\n /**\n * Cross-origin setting for the image\n */\n crossOrigin?: \"anonymous\" | \"use-credentials\";\n}\n\n/**\n * A higher-level Cropper component that handles image cropping automatically\n * and returns the cropped image as base64 data URL or Blob.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * onCropComplete={(base64) => {\n * console.log('Cropped image:', base64);\n * }}\n * />\n *\n * // Get Blob output\n * <CropperTool\n * src=\"https://example.com/image.jpg\"\n * aspectRatio={1}\n * shape=\"circle\"\n * cropOptions={{ type: 'blob' }}\n * onCropComplete={(blob) => {\n * console.log('Cropped image blob:', blob);\n * }}\n * />\n * ```\n */\nexport const CropperTool = React.forwardRef<HTMLDivElement, CropperToolProps>(\n (props, ref) => {\n const {\n src,\n alt = \"Crop image\",\n onCropComplete,\n onCropAreaChange,\n cropOptions = {},\n crossOrigin = \"anonymous\",\n rotation = 0,\n shape = \"rectangle\",\n ...cropperProps\n } = props;\n\n // State to manage crop position\n const [crop, setCrop] = React.useState<CropperPoint>({ x: 0, y: 0 });\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => {\n // Call the user's onCropAreaChange if provided\n onCropAreaChange?.(_croppedArea, croppedAreaPixels);\n\n if (!onCropComplete) return;\n\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n const outputType = cropOptions.type || \"base64\";\n\n if (outputType === \"blob\") {\n const croppedBlob = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"blob\",\n });\n onCropComplete(croppedBlob);\n } else {\n const croppedImageBase64 = await getCroppedImg({\n imageSrc: src,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape,\n format: cropOptions.format || \"image/jpeg\",\n quality: cropOptions.quality ?? 0.92,\n flip: cropOptions.flip,\n type: \"base64\",\n });\n onCropComplete(croppedImageBase64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [src, rotation, shape, cropOptions, onCropComplete, onCropAreaChange]\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n return (\n <Cropper\n ref={ref}\n {...cropperProps}\n crop={crop}\n rotation={rotation}\n shape={shape}\n onCropChange={setCrop}\n onCropAreaChange={handleCropAreaChange}\n >\n <CropperImage src={src} alt={alt} crossOrigin={crossOrigin} />\n <CropperArea />\n </Cropper>\n );\n }\n);\n\nCropperTool.displayName = \"CropperTool\";\n\nexport interface UseCropperToolOptions {\n /**\n * Image source URL\n */\n imageSrc: string;\n /**\n * Initial crop position\n */\n initialCrop?: CropperPoint;\n /**\n * Initial zoom level\n */\n initialZoom?: number;\n /**\n * Initial rotation angle\n */\n initialRotation?: number;\n /**\n * Crop options (shape, format, quality, type, etc.)\n */\n cropOptions?: Omit<CroppedImageOptions, \"imageSrc\" | \"pixelCrop\">;\n /**\n * Output type: 'base64' for data URL (default) or 'blob' for Blob object\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Hook to easily handle cropping logic in your components.\n * Automatically handles crop area changes and generates cropped images.\n *\n * @example\n * ```tsx\n * // Get base64 output (default)\n * const {\n * crop,\n * zoom,\n * rotation,\n * setCrop,\n * setZoom,\n * setRotation,\n * croppedImage,\n * handleCropAreaChange,\n * reset\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * // Get Blob output\n * const {\n * croppedImage, // This will be a Blob\n * ...rest\n * } = useCropperTool({\n * imageSrc: \"https://example.com/image.jpg\",\n * type: \"blob\",\n * cropOptions: { shape: \"circle\", format: \"image/png\" }\n * });\n *\n * return (\n * <div>\n * <Cropper\n * crop={crop}\n * zoom={zoom}\n * rotation={rotation}\n * onCropChange={setCrop}\n * onZoomChange={setZoom}\n * onCropAreaChange={handleCropAreaChange}\n * >\n * <CropperImage src={imageSrc} />\n * <CropperArea />\n * </Cropper>\n * {croppedImage && typeof croppedImage === 'string' && (\n * <img src={croppedImage} alt=\"Cropped\" />\n * )}\n * </div>\n * );\n * ```\n */\nexport function useCropperTool(options: UseCropperToolOptions) {\n const {\n imageSrc,\n initialCrop,\n initialZoom = 1,\n initialRotation = 0,\n cropOptions,\n type = \"base64\",\n } = options;\n\n const [crop, setCrop] = React.useState<CropperPoint>(\n initialCrop || { x: 0, y: 0 }\n );\n const [zoom, setZoom] = React.useState(initialZoom);\n const [rotation, setRotation] = React.useState(initialRotation);\n const [croppedImage, setCroppedImage] = React.useState<string | Blob | null>(\n null\n );\n\n // Debounce timer ref\n const debounceTimerRef = React.useRef<number | null>(null);\n\n // Store previous crop area to compare\n const prevCropAreaRef = React.useRef<CropperAreaData | null>(null);\n\n const handleCropAreaChange = React.useCallback(\n async (\n _croppedArea: CropperAreaData,\n croppedAreaPixels: CropperAreaData\n ) => {\n // Check if crop area actually changed\n if (prevCropAreaRef.current) {\n const prev = prevCropAreaRef.current;\n const isSame =\n prev.x === croppedAreaPixels.x &&\n prev.y === croppedAreaPixels.y &&\n prev.width === croppedAreaPixels.width &&\n prev.height === croppedAreaPixels.height;\n\n if (isSame) {\n return; // Don't regenerate if nothing changed\n }\n }\n\n // Update the ref\n prevCropAreaRef.current = croppedAreaPixels;\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer to debounce the crop generation\n debounceTimerRef.current = window.setTimeout(async () => {\n try {\n if (type === \"blob\") {\n const blob = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"blob\",\n });\n setCroppedImage(blob);\n } else {\n const base64 = await getCroppedImg({\n imageSrc,\n pixelCrop: croppedAreaPixels,\n rotation,\n shape: cropOptions?.shape,\n format: cropOptions?.format,\n quality: cropOptions?.quality,\n flip: cropOptions?.flip,\n type: \"base64\",\n });\n setCroppedImage(base64);\n }\n } catch (error) {\n console.error(\"Error creating cropped image:\", error);\n }\n }, 300); // 300ms debounce delay\n },\n [imageSrc, rotation, cropOptions, type]\n );\n\n // Cleanup debounce timer on unmount\n React.useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n window.clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n const reset = React.useCallback(() => {\n setCrop(initialCrop || { x: 0, y: 0 });\n setZoom(initialZoom);\n setRotation(initialRotation);\n setCroppedImage(null);\n }, [initialCrop, initialZoom, initialRotation]);\n\n return {\n crop,\n zoom,\n rotation,\n croppedImage,\n setCrop,\n setZoom,\n setRotation,\n setCroppedImage,\n handleCropAreaChange,\n reset,\n };\n}\n"],"names":["CropperTool","React","props","ref","src","alt","onCropComplete","onCropAreaChange","cropOptions","crossOrigin","rotation","shape","cropperProps","crop","setCrop","debounceTimerRef","prevCropAreaRef","handleCropAreaChange","_croppedArea","croppedAreaPixels","prev","croppedBlob","getCroppedImg","croppedImageBase64","error","jsxs","Cropper","jsx","CropperImage","CropperArea","useCropperTool","options","imageSrc","initialCrop","initialZoom","initialRotation","type","zoom","setZoom","setRotation","croppedImage","setCroppedImage","blob","base64","reset"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../../../src/components/Cropper/utils.ts"],"sourcesContent":["/**\n * Utility functions for Cropper component\n */\n\nexport interface CroppedImageOptions {\n /**\n * The source image URL or HTMLImageElement\n */\n imageSrc: string | HTMLImageElement;\n /**\n * Pixel coordinates of the cropped area\n */\n pixelCrop: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n /**\n * Rotation angle in degrees\n */\n rotation?: number;\n /**\n * Shape of the crop area\n */\n shape?: \"rectangle\" | \"circle\";\n /**\n * Output image format (default: 'image/png')\n */\n format?: \"image/jpeg\" | \"image/png\" | \"image/webp\";\n /**\n * Quality of the output image (0-1, default: 0.92)\n */\n quality?: number;\n /**\n * Flip the image horizontally\n */\n flip?: {\n horizontal?: boolean;\n vertical?: boolean;\n };\n /**\n * Output type: 'base64' (data URL) or 'blob' (Blob object)\n */\n type?: \"base64\" | \"blob\";\n}\n\n/**\n * Creates a cropped image from the given parameters and returns it as a base64 data URL or Blob\n *\n * @param options - Options for creating the cropped image\n * @returns Promise that resolves to a base64 data URL string or Blob based on the type option\n *\n * @example\n * ```tsx\n * // Get base64 data URL (default)\n * const croppedImageBase64 = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * rotation: 45,\n * shape: 'circle',\n * format: 'image/png',\n * quality: 0.95\n * });\n *\n * // Get Blob\n * const croppedImageBlob = await getCroppedImg({\n * imageSrc: 'https://example.com/image.jpg',\n * pixelCrop: { x: 100, y: 100, width: 200, height: 200 },\n * type: 'blob'\n * });\n * ```\n */\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type: \"blob\" }\n): Promise<Blob>;\nexport async function getCroppedImg(\n options: CroppedImageOptions & { type?: \"base64\" }\n): Promise<string>;\nexport async function getCroppedImg(\n options: CroppedImageOptions\n): Promise<string | Blob> {\n const {\n imageSrc,\n pixelCrop,\n rotation = 0,\n shape = \"rectangle\",\n format = \"image/png\",\n quality = 0.92,\n flip = {},\n type = \"base64\",\n } = options;\n\n // Load image if URL is provided\n let image: HTMLImageElement;\n if (typeof imageSrc === \"string\") {\n image = await loadImage(imageSrc);\n } else {\n image = imageSrc;\n }\n\n const rotRad = getRadianAngle(rotation);\n const sin = Math.abs(Math.sin(rotRad));\n const cos = Math.abs(Math.cos(rotRad));\n\n // Calculate bounding box of rotated image\n const bBoxWidth = image.width * cos + image.height * sin;\n const bBoxHeight = image.width * sin + image.height * cos;\n\n // Step 1: Create a canvas for the rotated full image\n const tempCanvas = document.createElement(\"canvas\");\n const tempCtx = tempCanvas.getContext(\"2d\");\n\n if (!tempCtx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n // Set temp canvas to bounding box size\n tempCanvas.width = bBoxWidth;\n tempCanvas.height = bBoxHeight;\n\n // Translate to center\n tempCtx.translate(bBoxWidth / 2, bBoxHeight / 2);\n\n // Rotate\n tempCtx.rotate(rotRad);\n\n // Apply flip if needed\n if (flip.horizontal || flip.vertical) {\n const scaleX = flip.horizontal ? -1 : 1;\n const scaleY = flip.vertical ? -1 : 1;\n tempCtx.scale(scaleX, scaleY);\n }\n\n // Draw image centered\n tempCtx.drawImage(\n image,\n -image.width / 2,\n -image.height / 2,\n image.width,\n image.height\n );\n\n // Step 2: Create output canvas and crop from temp canvas\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\", { alpha: true });\n\n if (!ctx) {\n throw new Error(\"Failed to get canvas 2D context\");\n }\n\n canvas.width = pixelCrop.width;\n canvas.height = pixelCrop.height;\n\n // Clear canvas to ensure transparency (important for PNG output)\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // Handle overflow: calculate the valid area to draw\n // When pixelCrop.x or y is negative, it means the crop area extends beyond the image\n const sourceX = Math.max(0, pixelCrop.x);\n const sourceY = Math.max(0, pixelCrop.y);\n\n // Calculate how much of the crop area is actually within the image bounds\n const sourceWidth = Math.min(\n pixelCrop.width - Math.max(0, -pixelCrop.x), // Reduce width if crop starts before image\n bBoxWidth - sourceX // Don't exceed image right edge\n );\n const sourceHeight = Math.min(\n pixelCrop.height - Math.max(0, -pixelCrop.y), // Reduce height if crop starts before image\n bBoxHeight - sourceY // Don't exceed image bottom edge\n );\n\n // Calculate where to place the cropped portion on the output canvas\n // If crop area extends beyond image (negative x/y), offset the destination\n const destX = Math.max(0, -pixelCrop.x);\n const destY = Math.max(0, -pixelCrop.y);\n\n // Only draw if there's a valid area to draw\n if (sourceWidth > 0 && sourceHeight > 0) {\n ctx.drawImage(\n tempCanvas,\n sourceX,\n sourceY,\n sourceWidth,\n sourceHeight,\n destX,\n destY,\n sourceWidth,\n sourceHeight\n );\n }\n\n // Apply circular mask if shape is circle\n if (shape === \"circle\") {\n ctx.globalCompositeOperation = \"destination-in\";\n ctx.beginPath();\n ctx.arc(\n canvas.width / 2,\n canvas.height / 2,\n Math.min(canvas.width, canvas.height) / 2,\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n\n // Return as blob or base64 based on type\n if (type === \"blob\") {\n return new Promise<Blob>((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) {\n resolve(blob);\n } else {\n reject(new Error(\"Failed to create blob from canvas\"));\n }\n },\n format,\n quality\n );\n });\n }\n\n // Convert to base64\n return canvas.toDataURL(format, quality);\n}\n\n/**\n * Load an image from URL\n */\nfunction loadImage(url: string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const image = new Image();\n image.crossOrigin = \"anonymous\";\n\n image.onload = () => resolve(image);\n image.onerror = (error) =>\n reject(new Error(`Failed to load image: ${error}`));\n\n image.src = url;\n });\n}\n\n/**\n * Convert degrees to radians\n */\nfunction getRadianAngle(degreeValue: number): number {\n return (degreeValue * Math.PI) / 180;\n}\n\n/**\n * Calculate the rotated size of a rectangle\n *\n * @param width - Original width\n * @param height - Original height\n * @param rotation - Rotation angle in degrees\n * @returns Rotated size dimensions\n */\nexport function rotateSize(\n width: number,\n height: number,\n rotation: number\n): { width: number; height: number } {\n const rotRad = getRadianAngle(rotation);\n const cosRot = Math.cos(rotRad);\n const sinRot = Math.sin(rotRad);\n\n return {\n width: Math.abs(cosRot * width) + Math.abs(sinRot * height),\n height: Math.abs(sinRot * width) + Math.abs(cosRot * height),\n };\n}\n\n/**\n * Download a base64 image\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename (default: 'cropped-image.jpg')\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * downloadImage(croppedImage, 'my-cropped-image.png');\n * ```\n */\nexport function downloadImage(\n base64Data: string,\n filename: string = \"cropped-image.jpg\"\n): void {\n const link = document.createElement(\"a\");\n link.href = base64Data;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n}\n\n/**\n * Convert base64 data URL to Blob\n *\n * @param base64Data - Base64 data URL\n * @returns Blob object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const blob = base64ToBlob(croppedImage);\n * ```\n */\nexport function base64ToBlob(base64Data: string): Blob {\n const arr = base64Data.split(\",\");\n const mimeMatch = arr[0]?.match(/:(.*?);/);\n const mime = mimeMatch ? mimeMatch[1] : \"image/jpeg\";\n const bstr = atob(arr[1] ?? \"\");\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n\n return new Blob([u8arr], { type: mime });\n}\n\n/**\n * Convert base64 data URL to File\n *\n * @param base64Data - Base64 data URL\n * @param filename - Output filename\n * @returns File object\n *\n * @example\n * ```tsx\n * const croppedImage = await getCroppedImg({ ... });\n * const file = base64ToFile(croppedImage, 'cropped-image.jpg');\n * ```\n */\nexport function base64ToFile(base64Data: string, filename: string): File {\n const blob = base64ToBlob(base64Data);\n return new File([blob], filename, { type: blob.type });\n}\n"],"names":["getCroppedImg","options","imageSrc","pixelCrop","rotation","shape","format","quality","flip","type","image","loadImage","rotRad","getRadianAngle","sin","cos","bBoxWidth","bBoxHeight","tempCanvas","tempCtx","scaleX","scaleY","canvas","ctx","sourceX","sourceY","sourceWidth","sourceHeight","destX","destY","resolve","reject","blob","url","error","degreeValue","rotateSize","width","height","cosRot","sinRot","downloadImage","base64Data","filename","link","base64ToBlob","arr","mimeMatch","mime","bstr","n","u8arr","base64ToFile"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"DatePicker.js","sources":["../../../../src/components/DatePicker/DatePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n CalendarDayButton as SCalendarDayButton,\n type CalendarDayButtonProps as SCalendarDayButtonProps,\n Calendar,\n type CalendarProps,\n type CalendarColor,\n} from \"@dsui/ui/components/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Input, type InputProps } from \"../Input\";\nimport { Button } from \"../Button\";\nimport {\n TimePicker,\n type TimePickerMode,\n type DisabledTimeRange,\n} from \"./TimePicker\";\nimport { CalendarIcon } from \"lucide-react\";\nimport type { VariantProps } from \"class-variance-authority\";\nimport { isMobile } from \"react-device-detect\";\nimport { format as dfFormat, parse, isValid, type Locale } from \"date-fns\";\nimport { vi, enUS } from \"date-fns/locale\";\nimport { DATE_FORMAT } from \"@/constants/common\";\n\nfunction formatDate(\n date: Date | undefined,\n outputFormat: string = DATE_FORMAT,\n locale?: Locale\n) {\n if (!date) return \"\";\n\n return dfFormat(date, outputFormat, locale ? { locale } : undefined);\n}\n\nconst parseDate = (\n str: string,\n inputFormat: string = DATE_FORMAT\n): Date | undefined => {\n const date = parse(str, inputFormat, new Date());\n return isValid(date) ? date : undefined;\n};\n\nfunction generateMaskFromFormat(format: string): string {\n return format\n .replace(/dd|MM|yyyy/g, (match) => {\n switch (match) {\n case \"dd\":\n case \"MM\":\n return \"99\";\n case \"yyyy\":\n return \"9999\";\n default:\n return match;\n }\n })\n .replace(/d|M|y/g, (match) => {\n switch (match) {\n case \"d\":\n case \"M\":\n return \"9\";\n case \"y\":\n return \"9\";\n default:\n return match;\n }\n });\n}\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type DatePickerRenderProps = {\n value: string;\n date?: Date;\n onSelect: (date?: Date) => void;\n onChange: (text?: string) => void;\n};\n\nexport type DatePickerProps = Omit<\n InputProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"mask\" | \"children\"\n> & {\n value?: string;\n onChange?: (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n date?: Date\n ) => void;\n onSelect?: (date?: Date, value?: string) => void;\n calendarClassName?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n size?: VariantProps<typeof Input>[\"size\"];\n format?: FormatType;\n language?: \"vi\" | \"en\";\n mask?: boolean | string;\n closeOnSelect?: boolean;\n calendarConfig?: CalendarProps;\n desktopMode?: \"popover\" | \"drawer\";\n mobileMode?: \"popover\" | \"drawer\";\n showOutsideDays?: boolean;\n children?: (props: DatePickerRenderProps) => React.ReactNode;\n showTime?: boolean;\n timeFormat?: \"HH:mm\" | \"HH:mm:ss\";\n hideDate?: boolean;\n numberOfMonths?: number;\n variant?: \"default\" | \"rounded\";\n color?: CalendarColor;\n\n // TimePicker configuration options\n timePickerMode?: TimePickerMode; // Display mode: 'wheel' (default), 'select', 'compact'\n hourInterval?: number; // Hour interval (e.g., 1, 2, 3) - defaults to 1\n minuteInterval?: number; // Minute interval (e.g., 5, 10, 15, 30) - defaults to 1\n secondInterval?: number; // Second interval (e.g., 5, 10, 15, 30) - defaults to 1\n disabledTimes?: string[]; // Array of disabled times in \"HH:mm\" or \"HH:mm:ss\" format\n disabledTimeRanges?: DisabledTimeRange[]; // Array of disabled time ranges\n showNowButton?: boolean; // Show \"Now\" button to select current time\n nowButtonLabel?: string; // Label for \"Now\" button (defaults to \"Now\")\n timePickerLabel?:\n | boolean\n | { hours?: string; minutes?: string; seconds?: string };\n openOnFocus?: boolean; // Auto open datepicker when input is focused (default: true)\n};\n\nexport function DatePicker({\n value,\n onChange,\n onSelect,\n calendarClassName,\n side = \"bottom\",\n align = \"end\",\n format = \"dd/MM/yyyy\",\n language = \"vi\",\n mask,\n closeOnSelect = false,\n calendarConfig,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n showOutsideDays = true,\n children,\n showTime = false,\n timeFormat = \"HH:mm\",\n hideDate = false,\n numberOfMonths = 1,\n variant = \"default\",\n color = \"primary\",\n // TimePicker props\n timePickerMode = \"wheel\",\n hourInterval = 1,\n minuteInterval = 1,\n secondInterval = 1,\n disabledTimes,\n disabledTimeRanges,\n showNowButton = false,\n nowButtonLabel = \"Now\",\n timePickerLabel,\n openOnFocus = true,\n ...props\n}: DatePickerProps) {\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else {\n inputFormat = format.input;\n outputFormat = format.output;\n }\n\n // Determine the mask to use\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n // If mask is false or undefined, maskToUse remains undefined\n\n // Parse initial value with correct format\n // - hideDate + showTime: time only (e.g., \"HH:mm\")\n // - showTime: date + time (e.g., \"dd/MM/yyyy HH:mm\")\n // - default: date only (e.g., \"dd/MM/yyyy\")\n const fullFormat =\n hideDate && showTime\n ? timeFormat\n : showTime\n ? `${inputFormat} ${timeFormat}`\n : inputFormat;\n\n const initialDate = value ? parseDate(value, fullFormat) : undefined;\n\n const [open, setOpen] = React.useState(false);\n const [date, setDate] = React.useState<Date | undefined>(initialDate);\n const [month, setMonth] = React.useState<Date | undefined>(initialDate);\n const [inputValue, setInputValue] = React.useState(value || \"\");\n const inputRef = React.useRef<HTMLInputElement>(null);\n const isUserTyping = React.useRef(false);\n\n const _locale: Locale = calendarConfig?.locale\n ? (calendarConfig?.locale as Locale)\n : language === \"en\"\n ? enUS\n : vi;\n\n const mode = isMobile ? mobileMode : desktopMode;\n\n // Sync inputValue when value prop changes from outside\n React.useEffect(() => {\n if (value !== inputValue && !isUserTyping.current) {\n setInputValue(value || \"\");\n const parsedDate = value ? parseDate(value, fullFormat) : undefined;\n if (parsedDate) {\n setDate(parsedDate);\n setMonth(parsedDate);\n } else if (!value) {\n // Clear states if value is empty\n setDate(undefined);\n setMonth(undefined);\n }\n }\n }, [value, inputValue, fullFormat]);\n\n // Helper to format date-time based on showTime and timeFormat\n const formatDateTimeValue = (d: Date | undefined): string => {\n if (!d) return \"\";\n let result = formatDate(d, outputFormat, _locale);\n if (showTime) {\n result += ` ${dfFormat(d, timeFormat)}`;\n }\n return result;\n };\n\n // Helper functions for render props\n const handleSelectForRenderProp = (date?: Date) => {\n setDate(date);\n setInputValue(formatDateTimeValue(date));\n onSelect?.(date, formatDateTimeValue(date));\n };\n\n const handleChangeForRenderProp = (text?: string) => {\n if (!text) {\n setInputValue(\"\");\n setDate(undefined);\n onSelect?.(undefined, undefined);\n return;\n }\n setInputValue(text);\n const parsedDate = parseDate(text, inputFormat);\n if (parsedDate) {\n setDate(parsedDate);\n setMonth(parsedDate);\n onSelect?.(parsedDate, formatDateTimeValue(parsedDate));\n } else {\n setDate(undefined);\n onSelect?.(undefined, undefined);\n }\n };\n\n const handleTimeChange = (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n newDate?: Date\n ) => {\n if (!newDate) {\n // Handle clear/invalid time\n onChange?.(event, value, undefined);\n return;\n }\n\n // Merge: keep date (year, month, day) from Calendar, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(date || new Date());\n mergedDate.setHours(\n newDate.getHours(),\n newDate.getMinutes(),\n newDate.getSeconds(),\n 0\n );\n\n setDate(mergedDate);\n setInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(mergedDate, formatDateTimeValue(mergedDate));\n onChange?.(event, formatDateTimeValue(mergedDate), mergedDate);\n };\n\n // Determine trigger component\n const triggerComponent = children ? (\n children({\n value: inputValue,\n date,\n onSelect: handleSelectForRenderProp,\n onChange: handleChangeForRenderProp,\n })\n ) : (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n size={props.size}\n >\n <CalendarIcon\n className={cn({\n \"ds:size-3\": props.size === \"xs\" || props.size === \"sm\",\n \"ds:size-3.5\": !props.size || props.size === \"normal\",\n \"ds:size-4\": props.size === \"lg\" || props.size === \"xl\",\n })}\n />\n <span className=\"ds:sr-only\">Select date</span>\n </Button>\n );\n\n const calendarSelection = (\n <div\n className={cn(\n \"ds:flex ds:items-stretch ds:mx-auto ds:w-full\",\n showTime && !hideDate ? \"ds:gap-0 ds:md:max-w-lg\" : \"\",\n // mode === \"drawer\" ? \"mb-6\" : \"\",\n isMobile ? \"ds:max-w-md ds:md:max-w-md ds:lg:max-w-lg\" : \"\"\n )}\n >\n {!hideDate && (\n <Calendar\n {...calendarConfig}\n mode=\"single\"\n selected={date}\n captionLayout=\"dropdown\"\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={isMobile ? 1 : numberOfMonths || 1}\n variant={variant}\n color={color}\n onSelect={(selectedDate) => {\n // Preserve time from current date when selecting new date\n let newDate = selectedDate;\n if (selectedDate && date && showTime) {\n newDate = new Date(selectedDate);\n newDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n date.getMilliseconds()\n );\n }\n setDate(newDate);\n setInputValue(formatDateTimeValue(newDate));\n onSelect?.(newDate, formatDateTimeValue(newDate));\n if (closeOnSelect && !showTime) setOpen(false);\n }}\n locale={_locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(_locale.code, { month: \"short\" }),\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n \"ds:my-auto ds:bg-transparent ds:mx-auto\",\n {\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),52px)] ds:mb-8 ds:bg-transparent\":\n (isMobile && !showTime) || desktopMode === \"drawer\",\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),34px)]\":\n !isMobile && desktopMode !== \"drawer\",\n \"ds:w-full\": mode === \"drawer\" && showTime,\n },\n calendarClassName\n )}\n />\n )}\n {showTime && (\n <div className=\"ds:border-l ds:border-border\">\n <TimePicker\n value={date ? dfFormat(date, timeFormat) : undefined}\n format={timeFormat}\n onChange={handleTimeChange}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n mode={timePickerMode}\n hourInterval={hourInterval}\n minuteInterval={minuteInterval}\n secondInterval={secondInterval}\n disabledTimes={disabledTimes}\n disabledTimeRanges={disabledTimeRanges}\n showNowButton={showNowButton}\n nowButtonLabel={nowButtonLabel}\n timeLabel={timePickerLabel}\n standalone={false}\n color={color}\n isOpen={open}\n />\n </div>\n )}\n </div>\n );\n\n const popPicker = (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild disabled={props.disabled}>\n {triggerComponent}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n side={side}\n align={align}\n >\n {calendarSelection}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{triggerComponent}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select date</DrawerTitle>\n <DrawerDescription>Set date</DrawerDescription>\n </DrawerHeader>\n {calendarSelection}\n </DrawerContent>\n </Drawer>\n );\n\n // If children is provided, use render prop pattern with picker\n if (children) {\n return mode === \"drawer\" ? drawPicker : popPicker;\n }\n\n // Default input rendering\n return (\n <Input\n {...props}\n ref={inputRef}\n type=\"text\"\n clearable\n value={inputValue}\n mask={maskToUse}\n onChange={(e) => {\n isUserTyping.current = true;\n setInputValue(e.target.value);\n const date = parseDate(e.target.value, inputFormat);\n if (date) {\n setDate(date);\n setMonth(date);\n onSelect?.(date, formatDateTimeValue(date));\n onChange?.(e, formatDateTimeValue(date), date);\n } else {\n onSelect?.(undefined, undefined);\n onChange?.(e, undefined, undefined);\n }\n }}\n onFocus={(e) => {\n // Don't auto-open if mask is enabled - user wants to type directly\n if (openOnFocus && !open && !maskToUse) {\n setOpen(true);\n }\n props.onFocus?.(e);\n }}\n onBlur={(e) => {\n // Don't clear value when picker is open - user might be interacting with it\n // The onBlur fires when focus moves to the picker\n setTimeout(() => {\n isUserTyping.current = false;\n // Only validate and clear if picker is closed\n if (!open) {\n const parsedDate = parseDate(inputValue, inputFormat);\n if (!parsedDate && inputValue) {\n setInputValue(\"\");\n setDate(undefined);\n setMonth(undefined);\n onSelect?.(undefined, undefined);\n }\n }\n }, 150);\n props.onBlur?.(e);\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n props.onKeyDown?.(e);\n }}\n suffixIcon={mode === \"drawer\" ? drawPicker : popPicker}\n />\n );\n}\n"],"names":["formatDate","date","outputFormat","DATE_FORMAT","locale","dfFormat","parseDate","str","inputFormat","parse","isValid","generateMaskFromFormat","format","match","DatePicker","value","onChange","onSelect","calendarClassName","side","align","language","mask","closeOnSelect","calendarConfig","desktopMode","mobileMode","showOutsideDays","children","showTime","timeFormat","hideDate","numberOfMonths","variant","color","timePickerMode","hourInterval","minuteInterval","secondInterval","disabledTimes","disabledTimeRanges","showNowButton","nowButtonLabel","timePickerLabel","openOnFocus","props","maskToUse","fullFormat","initialDate","open","setOpen","React","setDate","month","setMonth","inputValue","setInputValue","inputRef","isUserTyping","_locale","enUS","vi","mode","isMobile","parsedDate","formatDateTimeValue","d","result","handleSelectForRenderProp","handleChangeForRenderProp","text","handleTimeChange","event","newDate","mergedDate","triggerComponent","jsxs","Button","jsx","CalendarIcon","cn","calendarSelection","Calendar","selectedDate","TimePicker","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","Input"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"RangePicker.js","sources":["../../../../src/components/DatePicker/RangePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n CalendarDayButton as SCalendarDayButton,\n type CalendarDayButtonProps as SCalendarDayButtonProps,\n Calendar,\n type CalendarColor,\n} from \"@dsui/ui/components/calendar\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Input, type InputProps } from \"../Input\";\nimport { Button } from \"../Button\";\nimport { TimePicker } from \"./TimePicker\";\nimport { type DatePickerProps } from \"./DatePicker\";\nimport { CalendarIcon, MoveRight } from \"lucide-react\";\nimport { isMobile } from \"react-device-detect\";\nimport { format as dfFormat, parse, isValid, type Locale } from \"date-fns\";\nimport { vi, enUS } from \"date-fns/locale\";\nimport { DATE_FORMAT } from \"@/constants/common\";\nimport { FloatingLabel } from \"@/components/FloatLabel\";\n\nexport type DateRange = {\n from?: Date | undefined;\n to?: Date | undefined;\n};\n\nexport type DateRangeText = { from?: string; to?: string } | null;\n\nfunction formatDate(\n date: Date | undefined,\n outputFormat: string = DATE_FORMAT,\n locale?: Locale\n) {\n if (!date) return \"\";\n\n return dfFormat(date, outputFormat, locale ? { locale } : undefined);\n}\n\nconst parseDate = (\n str: string,\n inputFormat: string = DATE_FORMAT\n): Date | undefined => {\n const date = parse(str, inputFormat, new Date());\n return isValid(date) ? date : undefined;\n};\n\nfunction generateMaskFromFormat(format: string): string {\n return format\n .replace(/dd|MM|yyyy/g, (match) => {\n switch (match) {\n case \"dd\":\n case \"MM\":\n return \"99\";\n case \"yyyy\":\n return \"9999\";\n default:\n return match;\n }\n })\n .replace(/d|M|y/g, (match) => {\n switch (match) {\n case \"d\":\n case \"M\":\n return \"9\";\n case \"y\":\n return \"9\";\n default:\n return match;\n }\n });\n}\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type RangePickerRenderProps = {\n fromValue: string;\n toValue: string;\n range?: DateRange;\n onSelect: (range?: DateRange) => void;\n onFromChange: (text: string) => void;\n onToChange: (text: string) => void;\n};\n\nexport type TimeConfig = Omit<\n React.ComponentProps<typeof TimePicker>,\n \"value\" | \"onSelect\" | \"format\"\n>;\n\nexport type RangePickerProps = Omit<\n DatePickerProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"children\" | \"label\" | \"placeholder\"\n> & {\n label?: string | DateRangeText;\n placeholder?: string | DateRangeText;\n value?: DateRangeText;\n onChange?: (value?: DateRange, text?: DateRangeText) => void;\n onSelect?: (value?: DateRange, text?: DateRangeText) => void;\n children?: (props: RangePickerRenderProps) => React.ReactNode;\n separator?: React.ReactNode;\n timeConfig?: [TimeConfig, TimeConfig];\n numberOfMonths?: number;\n variant?: \"default\" | \"rounded\";\n color?: CalendarColor;\n};\n\nexport function RangePicker({\n label,\n value,\n placeholder,\n onChange,\n onSelect,\n calendarClassName,\n side = \"bottom\",\n align = \"end\",\n format = \"dd/MM/yyyy\",\n language = \"vi\",\n mask,\n closeOnSelect = false,\n showOutsideDays = true,\n calendarConfig,\n timeConfig,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n children,\n separator = <MoveRight className=\"ds:size-5\" />,\n showTime = false,\n timeFormat = \"HH:mm\",\n hideDate = false,\n numberOfMonths = 1,\n variant = \"default\",\n color = \"primary\",\n ...props\n}: RangePickerProps) {\n const inputId = React.useId();\n\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else {\n inputFormat = format.input;\n outputFormat = format.output;\n }\n\n // Determine the mask to use\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n\n const initialFromDate = value?.from\n ? parseDate(value.from, inputFormat)\n : undefined;\n const initialToDate = value?.to\n ? parseDate(value.to, inputFormat)\n : undefined;\n const initialRange: DateRange = {\n from: initialFromDate,\n to: initialToDate,\n };\n\n const [open, setOpen] = React.useState(false);\n const [range, setRange] = React.useState<DateRange | undefined>(initialRange);\n const [month, setMonth] = React.useState<Date | undefined>(\n initialFromDate || new Date()\n );\n const [fromInputValue, setFromInputValue] = React.useState(value?.from || \"\");\n const [toInputValue, setToInputValue] = React.useState(value?.to || \"\");\n const [fromTime, setFromTime] = React.useState<Date | undefined>(undefined);\n const [toTime, setToTime] = React.useState<Date | undefined>(undefined);\n const fromInputRef = React.useRef<HTMLInputElement>(null);\n const toInputRef = React.useRef<HTMLInputElement>(null);\n\n const shouldFloat = !!(fromInputValue.trim() || toInputValue.trim());\n\n const _locale: Locale = calendarConfig?.locale\n ? (calendarConfig?.locale as Locale)\n : language === \"en\"\n ? enUS\n : vi;\n\n // Helper to format date-time based on showTime and timeFormat\n const formatDateTimeValue = (d: Date | undefined): string => {\n if (!d) return \"\";\n let result = formatDate(d, outputFormat, _locale);\n if (showTime) {\n result += ` ${dfFormat(d, timeFormat)}`;\n }\n return result;\n };\n\n // Helper functions for render props\n const handleSelectForRenderProp = (range?: DateRange) => {\n setRange(range);\n const fromFormatted = formatDateTimeValue(range?.from);\n const toFormatted = formatDateTimeValue(range?.to);\n setFromInputValue(fromFormatted);\n setToInputValue(toFormatted);\n onSelect?.(range, { from: fromFormatted, to: toFormatted });\n };\n\n const handleFromChangeForRenderProp = (text: string) => {\n setFromInputValue(text);\n\n // If the input is cleared (empty), clear both fields\n if (text.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let parsedDate: Date | undefined;\n if (showTime) {\n parsedDate = parseDate(text, `${inputFormat} ${timeFormat}`);\n } else {\n parsedDate = parseDate(text, inputFormat);\n }\n const newRange: DateRange = { from: parsedDate, to: range?.to };\n if (parsedDate) {\n setRange(newRange);\n setMonth(parsedDate);\n setFromTime(parsedDate);\n onSelect?.(newRange, {\n from: formatDateTimeValue(parsedDate),\n to: formatDateTimeValue(range?.to),\n });\n } else {\n setRange(newRange);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(range?.to),\n });\n }\n };\n\n const handleToChangeForRenderProp = (text: string) => {\n setToInputValue(text);\n\n // If the input is cleared (empty), clear both fields\n if (text.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let parsedDate: Date | undefined;\n if (showTime) {\n parsedDate = parseDate(text, `${inputFormat} ${timeFormat}`);\n } else {\n parsedDate = parseDate(text, inputFormat);\n }\n const newRange: DateRange = {\n from: range?.from,\n to: parsedDate,\n };\n if (parsedDate) {\n setRange(newRange);\n setToTime(parsedDate);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(parsedDate),\n });\n } else {\n setRange(newRange);\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: undefined,\n });\n }\n };\n\n const handleTimeChangeFrom = (date?: Date) => {\n if (date) {\n setFromTime(date);\n // Merge: keep date (year, month, day) from existing range.from, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(range?.from || new Date());\n mergedDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n 0\n );\n\n const newRange: DateRange = {\n from: mergedDate,\n to: range?.to,\n };\n setRange(newRange);\n setFromInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(newRange, {\n from: formatDateTimeValue(mergedDate),\n to: formatDateTimeValue(range?.to),\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(mergedDate),\n to: formatDateTimeValue(range?.to),\n });\n }\n };\n\n const handleTimeChangeTo = (date?: Date) => {\n if (date) {\n setToTime(date);\n // Merge: keep date (year, month, day) from existing range.to, take time (hours, minutes, seconds) from TimePicker\n const mergedDate = new Date(range?.to || new Date());\n mergedDate.setHours(\n date.getHours(),\n date.getMinutes(),\n date.getSeconds(),\n 0\n );\n\n const newRange: DateRange = {\n from: range?.from,\n to: mergedDate,\n };\n setRange(newRange);\n setToInputValue(formatDateTimeValue(mergedDate));\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(mergedDate),\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: formatDateTimeValue(mergedDate),\n });\n }\n };\n\n // Determine trigger component\n const triggerComponent = children ? (\n children({\n fromValue: fromInputValue,\n toValue: toInputValue,\n range,\n onSelect: handleSelectForRenderProp,\n onFromChange: handleFromChangeForRenderProp,\n onToChange: handleToChangeForRenderProp,\n })\n ) : (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n size={props?.size}\n >\n <CalendarIcon\n className={cn({\n \"ds:size-3\": props.size === \"xs\" || props.size === \"sm\",\n \"ds:size-3.5\": !props.size || props.size === \"normal\",\n \"ds:size-4\": props.size === \"lg\" || props.size === \"xl\",\n })}\n />\n <span className=\"ds:sr-only\">Select date range</span>\n </Button>\n );\n\n const calendarSelection = (\n <div\n className={cn(\"ds:flex ds:items-stretch\", showTime && !hideDate ? \"ds:gap-0\" : \"\")}\n >\n {!hideDate && (\n <Calendar\n {...calendarConfig}\n mode=\"range\"\n selected={range as any}\n captionLayout=\"dropdown\"\n month={month}\n onMonthChange={setMonth}\n numberOfMonths={isMobile ? 1 : numberOfMonths || 1}\n variant={variant}\n color={color}\n onSelect={(selectedRange) => {\n // Preserve time from TimePicker values if showTime is enabled\n let preservedRange = selectedRange;\n if (showTime) {\n // Get current time from TimePicker state\n const fromTimeObj = fromTime;\n const toTimeObj = toTime;\n\n preservedRange = {\n from: selectedRange?.from\n ? new Date(\n selectedRange.from.getFullYear(),\n selectedRange.from.getMonth(),\n selectedRange.from.getDate(),\n fromTimeObj?.getHours() || 0,\n fromTimeObj?.getMinutes() || 0,\n fromTimeObj?.getSeconds() || 0\n )\n : undefined,\n to: selectedRange?.to\n ? new Date(\n selectedRange.to.getFullYear(),\n selectedRange.to.getMonth(),\n selectedRange.to.getDate(),\n toTimeObj?.getHours() || 0,\n toTimeObj?.getMinutes() || 0,\n toTimeObj?.getSeconds() || 0\n )\n : undefined,\n };\n }\n setRange(preservedRange);\n const fromFormatted = formatDateTimeValue(preservedRange?.from);\n const toFormatted = formatDateTimeValue(preservedRange?.to);\n setFromInputValue(fromFormatted);\n setToInputValue(toFormatted);\n onSelect?.(preservedRange, {\n from: fromFormatted,\n to: toFormatted,\n });\n onChange?.(preservedRange, {\n from: fromFormatted,\n to: toFormatted,\n });\n if (\n closeOnSelect &&\n preservedRange?.from &&\n preservedRange?.to &&\n !showTime\n ) {\n setOpen(false);\n }\n }}\n locale={_locale}\n formatters={{\n formatMonthDropdown: (date) =>\n date.toLocaleString(_locale.code, { month: \"short\" }),\n }}\n showOutsideDays={showOutsideDays}\n className={cn(\n \"ds:mx-auto\",\n {\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),52px)] ds:mb-8 ds:bg-transparent\":\n isMobile || desktopMode === \"drawer\",\n \"ds:[--cell-size:clamp(0px,calc(100vw/7.5),34px)]\":\n !isMobile && desktopMode !== \"drawer\",\n },\n calendarClassName\n )}\n />\n )}\n {showTime && (\n <div className=\"ds:flex ds:gap-0 ds:border-l ds:border-border\">\n <TimePicker\n {...timeConfig?.[0]}\n value={fromTime ? dfFormat(fromTime, timeFormat) : undefined}\n onSelect={handleTimeChangeFrom}\n format={timeFormat}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n standalone={false}\n />\n <div className=\"ds:border-l ds:border-border\" />\n <TimePicker\n {...timeConfig?.[1]}\n value={toTime ? dfFormat(toTime, timeFormat) : undefined}\n onSelect={handleTimeChangeTo}\n format={timeFormat}\n showHours\n showMinutes\n showSeconds={timeFormat === \"HH:mm:ss\"}\n standalone={false}\n />\n </div>\n )}\n </div>\n );\n\n const popPicker = (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild disabled={props.disabled}>\n {triggerComponent}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n side={side}\n align={align}\n >\n {calendarSelection}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={open} onOpenChange={setOpen}>\n <DrawerTrigger asChild>{triggerComponent}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select date range</DrawerTitle>\n <DrawerDescription>Set your date range</DrawerDescription>\n </DrawerHeader>\n {calendarSelection}\n </DrawerContent>\n </Drawer>\n );\n\n // If children is provided, use render prop pattern with picker\n if (children) {\n const mode = isMobile ? mobileMode : desktopMode;\n return mode === \"drawer\" ? drawPicker : popPicker;\n }\n\n // Helper function to render range input\n const renderRangeInput = (\n type: \"from\" | \"to\",\n inputValue: string,\n setInputValue: (value: string) => void,\n additionalProps?: Partial<InputProps>\n ) => {\n const isFrom = type === \"from\";\n\n return (\n <Input\n {...props}\n {...additionalProps}\n ref={isFrom ? fromInputRef : toInputRef}\n id={inputId}\n size={\n props.isFloatLabel ? (props.size ? props.size : \"xl\") : props.size\n }\n className={props.className}\n inputClassName={cn(\n \"ds:border-0 ds:focus:ring-0 ds:rounded-none ds:hover:bg-transparent ds:active:bg-transparent ds:focus-visible:ring-0 ds:focus-visible:border-0 ds:shadow-none\",\n isFrom ? \"ds:pr-0\" : \"\"\n )}\n label={\n props.isFloatLabel && typeof label === \"object\"\n ? isFrom\n ? label?.from || \"\"\n : label?.to || \"\"\n : \"\"\n }\n placeholder={\n typeof placeholder === \"object\"\n ? isFrom\n ? placeholder?.from || \"\"\n : placeholder?.to || \"\"\n : placeholder\n }\n clearable={!isFrom}\n value={inputValue}\n mask={maskToUse}\n onChange={(e) => {\n const inputValue = e.target.value;\n setInputValue(inputValue);\n\n // If the input is cleared (empty), clear both fields\n if (inputValue.trim() === \"\") {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n return;\n }\n\n // Try to parse based on showTime\n let date: Date | undefined;\n if (showTime) {\n date = parseDate(inputValue, `${inputFormat} ${timeFormat}`);\n } else {\n date = parseDate(inputValue, inputFormat);\n }\n const newRange: DateRange = isFrom\n ? { from: date, to: range?.to }\n : { from: range?.from, to: date };\n\n if (date) {\n setRange(newRange);\n if (isFrom) setMonth(date);\n // Update time state if time was parsed\n if (isFrom) {\n setFromTime(date);\n // setFromInputValue(formatDateTimeValue(date)); // Sync input value\n } else {\n setToTime(date);\n // setToInputValue(formatDateTimeValue(date)); // Sync input value\n }\n const fromFormatted = formatDateTimeValue(\n isFrom ? date : range?.from\n );\n const toFormatted = formatDateTimeValue(isFrom ? range?.to : date);\n onSelect?.(newRange, { from: fromFormatted, to: toFormatted });\n onChange?.(newRange, {\n from: isFrom ? inputValue : fromInputValue,\n to: isFrom ? toInputValue : inputValue,\n });\n\n // If from input and date is valid, auto-focus to to input if to is empty\n // if (isFrom && toInputRef.current && !toInputValue.trim()) {\n // requestAnimationFrame(() => toInputRef.current?.focus());\n // }\n } else {\n onSelect?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: isFrom ? formatDateTimeValue(range?.to) : undefined,\n });\n onChange?.(newRange, {\n from: formatDateTimeValue(range?.from),\n to: isFrom ? formatDateTimeValue(range?.to) : undefined,\n });\n }\n }}\n onClear={\n !isFrom\n ? () => {\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = { from: undefined, to: undefined };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n }\n : undefined\n }\n onBlur={() => {\n // Check if blurring out of the entire range picker group\n const activeElement = document.activeElement;\n if (\n activeElement !== fromInputRef.current &&\n activeElement !== toInputRef.current\n ) {\n // Delay validation by 100ms\n setTimeout(() => {\n // Check again if still blurred out of the group\n const currentActiveElement = document.activeElement;\n if (\n currentActiveElement !== fromInputRef.current &&\n currentActiveElement !== toInputRef.current\n ) {\n // Blurred out of the group, validate both inputs\n const validateInput = (val: string) => {\n if (val.trim() === \"\") return true; // empty is valid (will clear)\n let parsed: Date | undefined;\n if (showTime) {\n parsed = parseDate(val, `${inputFormat} ${timeFormat}`);\n } else {\n parsed = parseDate(val, inputFormat);\n }\n return !!parsed;\n };\n\n const fromValid = validateInput(fromInputValue);\n const toValid = validateInput(toInputValue);\n\n // Clear if either is invalid, or if only one has value\n const shouldClear =\n !fromValid ||\n !toValid ||\n (fromInputValue.trim() && !toInputValue.trim()) ||\n (!fromInputValue.trim() && toInputValue.trim());\n\n if (shouldClear) {\n // If either is invalid, clear both\n setFromInputValue(\"\");\n setToInputValue(\"\");\n const newRange: DateRange = {\n from: undefined,\n to: undefined,\n };\n setRange(newRange);\n onSelect?.(newRange, newRange as DateRangeText);\n onChange?.(newRange, newRange as DateRangeText);\n }\n }\n }, 100);\n }\n }}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setOpen(true);\n }\n }}\n />\n );\n };\n\n // Default input rendering with two inputs\n return (\n <div\n className={cn(\n \"ds:group ds:relative ds:flex ds:items-center ds:border ds:rounded-md ds:focus-within:ring-2 ds:focus-within:ring-offset-2 ds:bg-background ds:transition-[color,box-shadow]\",\n {\n \"ds:border-input ds:focus-within:ring-ring\": !props.state,\n \"ds:border-success ds:focus-within:ring-success\": props.state === \"success\",\n \"ds:border-warning ds:focus-within:ring-warning\": props.state === \"warning\",\n \"ds:border-error ds:focus-within:ring-error\": props.state === \"error\",\n }\n )}\n >\n {renderRangeInput(\"from\", fromInputValue, setFromInputValue)}\n <span\n className={cn(\"ds:text-muted-foreground ds:select-none ds:pl-2\", {\n \"ds:opacity-30\": props.disabled,\n })}\n >\n {separator}\n </span>\n {renderRangeInput(\"to\", toInputValue, setToInputValue, {\n suffixIcon: isMobile\n ? mobileMode === \"drawer\"\n ? drawPicker\n : popPicker\n : desktopMode === \"drawer\"\n ? drawPicker\n : popPicker,\n })}\n {props.isFloatLabel && typeof label === \"string\" && (\n <FloatingLabel\n htmlFor={inputId}\n size={props.size}\n infoTooltip={props.infoTooltip}\n className=\"ds:z-10\"\n shouldFloat={shouldFloat}\n >\n {label}\n </FloatingLabel>\n )}\n </div>\n );\n}\n"],"names":["formatDate","date","outputFormat","DATE_FORMAT","locale","dfFormat","parseDate","str","inputFormat","parse","isValid","generateMaskFromFormat","format","match","RangePicker","label","value","placeholder","onChange","onSelect","calendarClassName","side","align","language","mask","closeOnSelect","showOutsideDays","calendarConfig","timeConfig","desktopMode","mobileMode","children","separator","jsx","MoveRight","showTime","timeFormat","hideDate","numberOfMonths","variant","color","props","inputId","React","maskToUse","initialFromDate","initialToDate","initialRange","open","setOpen","range","setRange","month","setMonth","fromInputValue","setFromInputValue","toInputValue","setToInputValue","fromTime","setFromTime","toTime","setToTime","fromInputRef","toInputRef","shouldFloat","_locale","enUS","vi","formatDateTimeValue","d","result","handleSelectForRenderProp","fromFormatted","toFormatted","handleFromChangeForRenderProp","text","newRange","parsedDate","handleToChangeForRenderProp","handleTimeChangeFrom","mergedDate","handleTimeChangeTo","triggerComponent","jsxs","Button","CalendarIcon","cn","calendarSelection","Calendar","isMobile","selectedRange","preservedRange","fromTimeObj","toTimeObj","TimePicker","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","renderRangeInput","type","inputValue","setInputValue","additionalProps","isFrom","Input","e","activeElement","currentActiveElement","validateInput","val","parsed","fromValid","toValid","FloatingLabel"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"TimePicker.js","sources":["../../../../src/components/DatePicker/TimePicker.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n type RefObject,\n} from \"react\";\nimport { cn } from \"@dsui/ui/index\";\nimport { Button } from \"../Button\";\nimport { Select } from \"../Select\";\nimport { Input, type InputProps } from \"../Input\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"@dsui/ui/components/popover\";\nimport {\n Drawer,\n DrawerContent,\n DrawerDescription,\n DrawerHeader,\n DrawerTitle,\n DrawerTrigger,\n} from \"@dsui/ui/components/drawer\";\nimport { isMobile } from \"react-device-detect\";\nimport { Clock } from \"lucide-react\";\nimport { TimeColumnwheel } from \"../../components/WheelColumn\";\nimport { TimeGridView } from \"../../components/TimeGridView\";\nimport { format as dfFormat, parse, isValid } from \"date-fns\";\nimport type { CalendarColor } from \"../Calendar/Calendar\";\n\nexport type TimePickerMode = \"wheel\" | \"select\" | \"compact\";\n\nexport type DisabledTimeRange = {\n from: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\n to: string; // Format: \"HH:mm\" or \"HH:mm:ss\"\n};\n\nexport type FormatType = string | { input: string; output: string };\n\nexport type TimePickerProps = Omit<\n InputProps,\n \"value\" | \"onChange\" | \"onSelect\" | \"mask\" | \"children\"\n> & {\n value?: string; // Time string in specified format\n onChange?: (\n event?: React.ChangeEvent<HTMLInputElement>,\n value?: string,\n date?: Date\n ) => void;\n onSelect?: (date?: Date, value?: string) => void;\n showHours?: boolean;\n showMinutes?: boolean;\n showSeconds?: boolean;\n disabled?: boolean;\n className?: string;\n timeLabel?:\n | boolean\n | string\n | { hours?: string; minutes?: string; seconds?: string };\n mask?: boolean | string; // Enable mask for time input: true (auto-generate), string (custom mask), false/undefined (no mask)\n format?: FormatType; // Time format using date-fns format tokens (default: auto from showSeconds)\n\n // New configuration options\n mode?: TimePickerMode; // Display mode: 'wheel' (default), 'select', 'compact'\n hourInterval?: number; // Hour interval (e.g., 1, 2, 3) - defaults to 1\n minuteInterval?: number; // Minute interval (e.g., 5, 10, 15, 30) - defaults to 1\n secondInterval?: number; // Second interval (e.g., 5, 10, 15, 30) - defaults to 1\n disabledTimes?: string[]; // Array of disabled times in \"HH:mm\" or \"HH:mm:ss\" format\n disabledTimeRanges?: DisabledTimeRange[]; // Array of disabled time ranges\n showNowButton?: boolean; // Show \"Now\" button to select current time\n nowButtonLabel?: string; // Label for \"Now\" button (defaults to \"Now\")\n\n // Standalone mode configuration\n standalone?: boolean; // When true (default), TimePicker shows as a drawer/popover with trigger. When false, it's used as an integrated component (e.g., inside DatePicker)\n desktopMode?: \"popover\" | \"drawer\"; // Desktop display mode for standalone: 'popover' or 'drawer'\n mobileMode?: \"popover\" | \"drawer\"; // Mobile display mode for standalone: 'popover' or 'drawer'\n color?: CalendarColor; // Color variant for selected time (defaults to \"primary\")\n isOpen?: boolean; // External control for when picker is visible (used in non-standalone mode)\n};\n\nconst generateIntervalArray = (max: number, interval: number = 1): number[] => {\n const result: number[] = [];\n for (let i = 0; i < max; i += interval) {\n result.push(i);\n }\n return result;\n};\n\nconst pad = (num: number): string => String(num).padStart(2, \"0\");\n\n// Format time Date to string using date-fns\nconst formatTime = (\n date: Date | undefined,\n format: string = \"HH:mm\"\n): string => {\n if (!date || !isValid(date)) return \"\";\n return dfFormat(date, format);\n};\n\n// Parse time string to Date using date-fns\nconst parseTimeString = (\n timeStr: string,\n format: string = \"HH:mm\"\n): Date | undefined => {\n if (!timeStr) return undefined;\n\n const referenceDate = new Date();\n const parsedDate = parse(timeStr, format, referenceDate);\n\n if (!isValid(parsedDate)) return undefined;\n\n return parsedDate;\n};\n\nfunction generateMaskFromTimeFormat(format: string): string {\n return format\n .replace(/HH|mm|ss/g, (match) => {\n switch (match) {\n case \"HH\":\n case \"mm\":\n case \"ss\":\n return \"99\";\n default:\n return match;\n }\n })\n .replace(/H|m|s/g, () => \"9\");\n}\n\nexport function TimePicker({\n value,\n onChange,\n onSelect,\n showHours = true,\n showMinutes = true,\n showSeconds = false,\n disabled = false,\n className,\n timeLabel,\n mask,\n format,\n mode = \"wheel\",\n hourInterval = 1,\n minuteInterval = 1,\n secondInterval = 1,\n disabledTimes = [],\n disabledTimeRanges = [],\n showNowButton = false,\n nowButtonLabel = \"Now\",\n standalone = true,\n desktopMode = \"popover\",\n mobileMode = \"drawer\",\n color = \"primary\",\n isOpen,\n ...props\n}: TimePickerProps) {\n // Determine input and output formats (like DatePicker)\n let inputFormat: string;\n let outputFormat: string;\n if (typeof format === \"string\") {\n inputFormat = format;\n outputFormat = format;\n } else if (format) {\n inputFormat = format.input;\n outputFormat = format.output;\n } else {\n // Auto-determine from showSeconds if not provided\n inputFormat = showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n outputFormat = showSeconds ? \"HH:mm:ss\" : \"HH:mm\";\n }\n\n const [hours, setHours] = useState<number | undefined>(undefined);\n const [minutes, setMinutes] = useState<number | undefined>(undefined);\n const [seconds, setSeconds] = useState<number | undefined>(undefined);\n const [standaloneOpen, setStandaloneOpen] = useState(false);\n\n useEffect(() => {\n if (value) {\n const parsed = parseTimeString(value, inputFormat);\n if (parsed) {\n setHours(parsed.getHours());\n setMinutes(parsed.getMinutes());\n setSeconds(parsed.getSeconds());\n }\n } else {\n setHours(undefined);\n setMinutes(undefined);\n setSeconds(undefined);\n }\n }, [value, inputFormat]);\n\n const hoursRef = useRef<HTMLDivElement>(null);\n const minutesRef = useRef<HTMLDivElement>(null);\n const secondsRef = useRef<HTMLDivElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n\n // Generate time arrays based on intervals\n const HOURS = useMemo(\n () => generateIntervalArray(24, hourInterval),\n [hourInterval]\n );\n const MINUTES = useMemo(\n () => generateIntervalArray(60, minuteInterval),\n [minuteInterval]\n );\n const SECONDS = useMemo(\n () => generateIntervalArray(60, secondInterval),\n [secondInterval]\n );\n\n // Helper function to check if a time is disabled\n const isTimeDisabled = useCallback(\n (\n h: number | undefined,\n m: number | undefined,\n s: number | undefined = 0\n ): boolean => {\n const timeStr = `${pad(h ?? 0)}:${pad(m ?? 0)}${showSeconds ? `:${pad(s ?? 0)}` : \"\"}`;\n\n // Check if specific time is disabled\n if (disabledTimes.includes(timeStr)) {\n return true;\n }\n\n // Check if time is in a disabled range\n for (const range of disabledTimeRanges) {\n const [fromH, fromM, fromS = 0] = range.from.split(\":\").map(Number);\n const [toH, toM, toS = 0] = range.to.split(\":\").map(Number);\n\n const currentTime = (h ?? 0) * 3600 + (m ?? 0) * 60 + (s ?? 0);\n const fromTime = fromH * 3600 + fromM * 60 + fromS;\n const toTime = toH * 3600 + toM * 60 + toS;\n\n if (currentTime >= fromTime && currentTime <= toTime) {\n return true;\n }\n }\n\n return false;\n },\n [disabledTimes, disabledTimeRanges, showSeconds]\n );\n\n // Helper function to get time label based on type and timeLabel prop\n const getTimeLabel = useCallback(\n (type: \"hours\" | \"minutes\" | \"seconds\"): string | undefined => {\n if (!timeLabel) return undefined;\n\n if (typeof timeLabel === \"boolean\") {\n return timeLabel\n ? type === \"hours\"\n ? \"Hour\"\n : type === \"minutes\"\n ? \"Minute\"\n : \"Second\"\n : undefined;\n }\n\n if (typeof timeLabel === \"string\") {\n return timeLabel;\n }\n\n // Object case\n if (type === \"hours\") return timeLabel.hours || \"Hour\";\n if (type === \"minutes\") return timeLabel.minutes || \"Minute\";\n return timeLabel.seconds || \"Second\";\n },\n [timeLabel]\n );\n\n // If timeLabel is a string, show it as a common label above all columns\n const shareLabel = typeof timeLabel === \"string\" && (\n <div\n key=\"common-label\"\n className=\"ds:text-xs ds:font-semibold ds:text-muted-foreground ds:uppercase ds:p-2 ds:border-b ds:w-full ds:text-center\"\n >\n {timeLabel}\n </div>\n );\n\n // Find nearest valid time\n const findNearestValidTime = useCallback(\n (\n targetH: number,\n targetM: number,\n targetS: number = 0\n ): { h: number; m: number; s: number } => {\n // Find nearest hour\n const nearestH = HOURS.reduce((prev, curr) =>\n Math.abs(curr - targetH) < Math.abs(prev - targetH) ? curr : prev\n );\n\n // Find nearest minute\n const nearestM = MINUTES.reduce((prev, curr) =>\n Math.abs(curr - targetM) < Math.abs(prev - targetM) ? curr : prev\n );\n\n // Find nearest second\n const nearestS = SECONDS.reduce((prev, curr) =>\n Math.abs(curr - targetS) < Math.abs(prev - targetS) ? curr : prev\n );\n\n // If the nearest time is disabled, find the next available time\n if (isTimeDisabled(nearestH, nearestM, nearestS)) {\n // Try to find next available time\n for (const h of HOURS) {\n for (const m of MINUTES) {\n for (const s of SECONDS) {\n if (!isTimeDisabled(h, m, s)) {\n return { h, m, s };\n }\n }\n }\n }\n }\n\n return { h: nearestH, m: nearestM, s: nearestS };\n },\n [HOURS, MINUTES, SECONDS, isTimeDisabled]\n );\n\n const updateDateTime = useCallback(\n (h: number, m: number, s: number) => {\n const newDate = new Date();\n newDate.setHours(h, m, s, 0);\n const formattedValue = formatTime(newDate, outputFormat);\n onChange?.(undefined, formattedValue, newDate);\n onSelect?.(newDate, formattedValue);\n },\n [outputFormat, onChange, onSelect]\n );\n\n const handleHourChange = (h: number) => {\n if (!isTimeDisabled(h, minutes, seconds)) {\n setHours(h);\n updateDateTime(h, minutes ?? 0, seconds ?? 0);\n }\n };\n\n const handleMinuteChange = (m: number) => {\n if (!isTimeDisabled(hours, m, seconds)) {\n setMinutes(m);\n updateDateTime(hours ?? 0, m, seconds ?? 0);\n }\n };\n\n const handleSecondChange = (s: number) => {\n if (!isTimeDisabled(hours, minutes, s)) {\n setSeconds(s);\n updateDateTime(hours ?? 0, minutes ?? 0, s);\n }\n };\n\n // Scroll to center item when selected\n const scrollToSelected = useCallback(\n (ref: RefObject<HTMLDivElement | null>) => {\n if (ref.current) {\n const selected = ref.current.querySelector(\n \"[data-selected]\"\n ) as HTMLElement;\n if (selected) {\n const container = ref.current;\n const containerHeight = container.clientHeight;\n const selectedTop = selected.offsetTop;\n const selectedHeight = selected.clientHeight;\n\n const scrollPosition =\n selectedTop - containerHeight / 2 + selectedHeight / 2;\n\n container.scrollTo({\n top: scrollPosition,\n behavior: \"smooth\",\n });\n }\n }\n },\n []\n );\n\n const scrollHandler = useCallback(() => {\n if (mode === \"wheel\") {\n // Scroll to selected item when picker opens (only for initial load)\n scrollToSelected(hoursRef);\n scrollToSelected(minutesRef);\n scrollToSelected(secondsRef);\n } else if (mode === \"compact\") {\n // Scroll to selected item in grid mode\n scrollToSelected(gridRef);\n }\n }, [hoursRef, minutesRef, secondsRef, gridRef, mode, scrollToSelected]);\n\n const handleNowClick = () => {\n const now = new Date();\n const { h, m, s } = findNearestValidTime(\n now.getHours(),\n now.getMinutes(),\n now.getSeconds()\n );\n setHours(h);\n setMinutes(m);\n setSeconds(s);\n updateDateTime(h, m, s);\n setTimeout(() => scrollHandler(), 100);\n };\n\n useEffect(() => {\n // Trigger scroll when picker opens (standalone or integrated) or when values change\n const shouldScroll = standalone ? standaloneOpen : isOpen;\n\n // Also trigger scroll if we have values (for initial load and value changes)\n const hasValues =\n hours !== undefined || minutes !== undefined || seconds !== undefined;\n\n if (shouldScroll || hasValues) {\n const timer = setTimeout(() => scrollHandler(), 100);\n return () => clearTimeout(timer);\n }\n }, [\n standaloneOpen,\n isOpen,\n standalone,\n mode,\n scrollHandler,\n hours,\n minutes,\n seconds,\n ]);\n\n // Normal Mode - Dropdown/Input style\n const TimeColumnNormal = memo(\n ({\n items,\n value: selectedValue,\n onChange: onChangeCol,\n timeLabel,\n type,\n }: {\n items: number[];\n value: number | undefined;\n onChange: (val: number) => void;\n timeLabel?: string;\n type: \"hours\" | \"minutes\" | \"seconds\";\n }) => (\n <div className=\"ds:flex ds:flex-col ds:gap-2\">\n {timeLabel && (\n <div className=\"ds:text-xs ds:font-semibold ds:text-muted-foreground ds:uppercase ds:p-2 ds:border-b ds:w-full ds:text-center\">\n {timeLabel}\n </div>\n )}\n <div className=\"ds:p-2\">\n <Select\n value={selectedValue?.toString() || \"\"}\n onValueChange={(value) => onChangeCol(Number(value))}\n disabled={disabled}\n clearable={false}\n search={false}\n options={items.map((item) => {\n const itemDisabled =\n (type === \"hours\" && isTimeDisabled(item, minutes, seconds)) ||\n (type === \"minutes\" && isTimeDisabled(hours, item, seconds)) ||\n (type === \"seconds\" && isTimeDisabled(hours, minutes, item));\n\n return {\n label: pad(item),\n value: item.toString(),\n disabled: itemDisabled,\n };\n })}\n />\n </div>\n </div>\n )\n );\n\n // Grid Mode - Combined time selection (HH:mm format only, vertical layout)\n const handleTimeSelect = (h: number, m: number) => {\n // Always set seconds to 0 in grid mode\n if (!isTimeDisabled(h, m, 0)) {\n setHours(h);\n setMinutes(m);\n setSeconds(0);\n updateDateTime(h, m, 0);\n }\n };\n\n const renderColumns = () => {\n const columns = [];\n\n // Grid mode shows combined time options\n if (mode === \"compact\") {\n return (\n <TimeGridView\n HOURS={HOURS}\n MINUTES={MINUTES}\n hours={hours}\n minutes={minutes}\n disabled={disabled}\n isTimeDisabled={isTimeDisabled}\n onTimeSelect={handleTimeSelect}\n ref={gridRef}\n color={color}\n />\n );\n }\n\n if (showHours) {\n const hourLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"hours\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"hours\"\n ref={hoursRef}\n items={HOURS}\n value={hours}\n onChange={handleHourChange}\n timeLabel={hourLabel}\n isItemDisabled={(item) => isTimeDisabled(item, minutes, seconds)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"hours\"\n items={HOURS}\n value={hours}\n onChange={handleHourChange}\n timeLabel={hourLabel}\n type=\"hours\"\n />\n );\n }\n }\n\n if (showMinutes) {\n const minuteLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"minutes\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"minutes\"\n ref={minutesRef}\n items={MINUTES}\n value={minutes}\n onChange={handleMinuteChange}\n timeLabel={minuteLabel}\n itemClassName={showHours ? \"ds:border-l\" : undefined}\n isItemDisabled={(item) => isTimeDisabled(hours, item, seconds)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"minutes\"\n items={MINUTES}\n value={minutes}\n onChange={handleMinuteChange}\n timeLabel={minuteLabel}\n type=\"minutes\"\n />\n );\n }\n }\n\n if (showSeconds) {\n const secondLabel =\n typeof timeLabel === \"string\" ? undefined : getTimeLabel(\"seconds\");\n\n if (mode === \"wheel\") {\n columns.push(\n <TimeColumnwheel\n key=\"seconds\"\n ref={secondsRef}\n items={SECONDS}\n value={seconds}\n onChange={handleSecondChange}\n timeLabel={secondLabel}\n itemClassName={showMinutes || showHours ? \"ds:border-l\" : undefined}\n isItemDisabled={(item) => isTimeDisabled(hours, minutes, item)}\n disabled={disabled}\n color={color}\n />\n );\n } else if (mode === \"select\") {\n columns.push(\n <TimeColumnNormal\n key=\"seconds\"\n items={SECONDS}\n value={seconds}\n onChange={handleSecondChange}\n timeLabel={secondLabel}\n type=\"seconds\"\n />\n );\n }\n }\n\n return columns;\n };\n\n // If standalone mode is disabled, return the content directly (for integration with DatePicker)\n if (!standalone) {\n return (\n <div\n className={cn(\"ds:flex ds:flex-col ds:gap-2 ds:h-full ds:justify-between\", className)}\n >\n {shareLabel}\n\n <div\n className={cn(\n \"ds:flex ds:rounded ds:overflow-clip ds:mb-auto\",\n mode === \"wheel\"\n ? \"ds:items-end ds:justify-center ds:p-0 ds:h-72\"\n : \"ds:items-start ds:justify-center\"\n )}\n >\n {renderColumns()}\n </div>\n\n {showNowButton && (\n <Button\n type=\"button\"\n variant=\"solid\"\n size=\"xs\"\n onClick={handleNowClick}\n disabled={disabled}\n className={cn(\"ds:rounded-none\")}\n >\n {nowButtonLabel}\n </Button>\n )}\n </div>\n );\n }\n\n // Render the time picker content\n const timePickerContent = (\n <div className={cn(\"ds:flex ds:flex-col ds:gap-4 ds:h-full\", className)}>\n {shareLabel}\n\n <div\n className={cn(\n \"ds:flex ds:rounded ds:overflow-clip ds:my-auto ds:mx-auto ds:max-w-sm ds:md:max-w-md ds:lg:max-w-lg ds:relative\",\n mode === \"wheel\"\n ? \"ds:items-end ds:justify-center ds:p-0\"\n : \"ds:items-start ds:justify-center\",\n {\n \"ds:h-72\": mode === \"wheel\",\n \"ds:w-xs\": standalone && (isMobile || desktopMode === \"drawer\"),\n }\n )}\n >\n {renderColumns()}\n </div>\n\n {showNowButton && (\n <Button\n type=\"button\"\n variant=\"solid\"\n size=\"xs\"\n onClick={handleNowClick}\n disabled={disabled}\n className={cn(\"ds:rounded-none\")}\n >\n {nowButtonLabel}\n </Button>\n )}\n </div>\n );\n\n // Standalone mode: show as drawer or popover with Input\n const iconTrigger = (\n <Button\n variant=\"ghost\"\n className=\"ds:!p-1 ds:!leading-0 ds:h-auto ds:rounded ds:hover:bg-accent ds:transition-colors\"\n disabled={disabled}\n >\n <Clock className=\"ds:size-4\" />\n <span className=\"ds:sr-only\">Select time</span>\n </Button>\n );\n\n const popPicker = (\n <Popover open={standaloneOpen} onOpenChange={setStandaloneOpen}>\n <PopoverTrigger asChild disabled={disabled}>\n {iconTrigger}\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background/50\"\n )}\n >\n {timePickerContent}\n </PopoverContent>\n </Popover>\n );\n\n const drawPicker = (\n <Drawer open={standaloneOpen} onOpenChange={setStandaloneOpen}>\n <DrawerTrigger asChild>{iconTrigger}</DrawerTrigger>\n <DrawerContent\n className={cn(\n \"ds:w-auto ds:overflow-hidden ds:p-0\",\n \"ds:backdrop-blur ds:bg-background\"\n )}\n >\n <DrawerHeader className=\"ds:sr-only\">\n <DrawerTitle>Select time</DrawerTitle>\n <DrawerDescription>Choose a time</DrawerDescription>\n </DrawerHeader>\n {timePickerContent}\n </DrawerContent>\n </Drawer>\n );\n\n // Determine the mask to use\n const timeFormat = outputFormat; // Use outputFormat for placeholder\n let maskToUse: string | undefined;\n if (mask === true) {\n maskToUse = generateMaskFromTimeFormat(inputFormat);\n } else if (typeof mask === \"string\") {\n maskToUse = mask;\n }\n // If mask is false or undefined, maskToUse remains undefined\n\n // Handle Input change (when user types)\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const inputValue = e.target.value;\n const parsedDate = parseTimeString(inputValue, inputFormat);\n\n if (parsedDate) {\n setHours(parsedDate.getHours());\n setMinutes(parsedDate.getMinutes());\n setSeconds(parsedDate.getSeconds());\n const formattedValue = formatTime(parsedDate, outputFormat);\n onChange?.(e, formattedValue, parsedDate);\n onSelect?.(parsedDate, formattedValue);\n } else {\n // Reset state when input is cleared\n setHours(0);\n setMinutes(0);\n setSeconds(0);\n onChange?.(e, inputValue, undefined);\n onSelect?.(undefined, inputValue);\n }\n };\n\n // Return Input with picker as suffix icon (standalone mode)\n return (\n <Input\n {...props}\n clearable\n value={value || \"\"}\n placeholder={timeFormat}\n mask={maskToUse}\n disabled={disabled}\n className=\"ds:cursor-pointer\"\n onChange={handleInputChange}\n suffixIcon={\n isMobile\n ? mobileMode === \"drawer\"\n ? drawPicker\n : popPicker\n : desktopMode === \"drawer\"\n ? drawPicker\n : popPicker\n }\n />\n );\n}\n"],"names":["generateIntervalArray","max","interval","result","i","pad","num","formatTime","date","format","isValid","dfFormat","parseTimeString","timeStr","parsedDate","parse","generateMaskFromTimeFormat","match","TimePicker","value","onChange","onSelect","showHours","showMinutes","showSeconds","disabled","className","timeLabel","mask","mode","hourInterval","minuteInterval","secondInterval","disabledTimes","disabledTimeRanges","showNowButton","nowButtonLabel","standalone","desktopMode","mobileMode","color","isOpen","props","inputFormat","outputFormat","hours","setHours","useState","minutes","setMinutes","seconds","setSeconds","standaloneOpen","setStandaloneOpen","useEffect","parsed","hoursRef","useRef","minutesRef","secondsRef","gridRef","HOURS","useMemo","MINUTES","SECONDS","isTimeDisabled","useCallback","h","m","s","range","fromH","fromM","fromS","toH","toM","toS","currentTime","fromTime","toTime","getTimeLabel","type","shareLabel","jsx","findNearestValidTime","targetH","targetM","targetS","nearestH","prev","curr","nearestM","nearestS","updateDateTime","newDate","formattedValue","handleHourChange","handleMinuteChange","handleSecondChange","scrollToSelected","ref","selected","container","containerHeight","selectedTop","selectedHeight","scrollPosition","scrollHandler","handleNowClick","now","timer","TimeColumnNormal","memo","items","selectedValue","onChangeCol","jsxs","Select","item","itemDisabled","handleTimeSelect","renderColumns","columns","TimeGridView","hourLabel","TimeColumnwheel","minuteLabel","secondLabel","cn","Button","timePickerContent","isMobile","iconTrigger","Clock","popPicker","Popover","PopoverTrigger","PopoverContent","drawPicker","Drawer","DrawerTrigger","DrawerContent","DrawerHeader","DrawerTitle","DrawerDescription","timeFormat","maskToUse","Input","inputValue"],"mappings":"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"}