@sth87/shadcn-design-system 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (760) hide show
  1. package/README.md +487 -0
  2. package/dist/cjs/_virtual/_commonjsHelpers.cjs +2 -0
  3. package/dist/cjs/_virtual/_commonjsHelpers.cjs.map +1 -0
  4. package/dist/cjs/_virtual/index.cjs +2 -0
  5. package/dist/cjs/_virtual/index.cjs.map +1 -0
  6. package/dist/cjs/_virtual/index2.cjs +2 -0
  7. package/dist/cjs/_virtual/index2.cjs.map +1 -0
  8. package/dist/cjs/components/Accordion/Accordion.cjs +2 -0
  9. package/dist/cjs/components/Accordion/Accordion.cjs.map +1 -0
  10. package/dist/cjs/components/Avatar/Avatar.cjs +2 -0
  11. package/dist/cjs/components/Avatar/Avatar.cjs.map +1 -0
  12. package/dist/cjs/components/Badge/Badge.cjs +2 -0
  13. package/dist/cjs/components/Badge/Badge.cjs.map +1 -0
  14. package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs +2 -0
  15. package/dist/cjs/components/Breadcrumb/Breadcrumb.cjs.map +1 -0
  16. package/dist/cjs/components/Button/Button.cjs +2 -0
  17. package/dist/cjs/components/Button/Button.cjs.map +1 -0
  18. package/dist/cjs/components/Button/ButtonGroup.cjs +2 -0
  19. package/dist/cjs/components/Button/ButtonGroup.cjs.map +1 -0
  20. package/dist/cjs/components/Calendar/Calendar.cjs +2 -0
  21. package/dist/cjs/components/Calendar/Calendar.cjs.map +1 -0
  22. package/dist/cjs/components/Carousel/Carousel.cjs +2 -0
  23. package/dist/cjs/components/Carousel/Carousel.cjs.map +1 -0
  24. package/dist/cjs/components/Checkbox/Checkbox.cjs +2 -0
  25. package/dist/cjs/components/Checkbox/Checkbox.cjs.map +1 -0
  26. package/dist/cjs/components/Collapsible/Collapsible.cjs +2 -0
  27. package/dist/cjs/components/Collapsible/Collapsible.cjs.map +1 -0
  28. package/dist/cjs/components/Command/Command.cjs +2 -0
  29. package/dist/cjs/components/Command/Command.cjs.map +1 -0
  30. package/dist/cjs/components/Command/index.cjs +2 -0
  31. package/dist/cjs/components/Command/index.cjs.map +1 -0
  32. package/dist/cjs/components/ContextMenu/ContextMenu.cjs +2 -0
  33. package/dist/cjs/components/ContextMenu/ContextMenu.cjs.map +1 -0
  34. package/dist/cjs/components/ContextMenu/index.cjs +2 -0
  35. package/dist/cjs/components/ContextMenu/index.cjs.map +1 -0
  36. package/dist/cjs/components/Cropper/Cropper.cjs +2 -0
  37. package/dist/cjs/components/Cropper/Cropper.cjs.map +1 -0
  38. package/dist/cjs/components/Cropper/CropperTool.cjs +2 -0
  39. package/dist/cjs/components/Cropper/CropperTool.cjs.map +1 -0
  40. package/dist/cjs/components/Cropper/utils.cjs +2 -0
  41. package/dist/cjs/components/Cropper/utils.cjs.map +1 -0
  42. package/dist/cjs/components/DatePicker/DatePicker.cjs +2 -0
  43. package/dist/cjs/components/DatePicker/DatePicker.cjs.map +1 -0
  44. package/dist/cjs/components/DatePicker/RangePicker.cjs +2 -0
  45. package/dist/cjs/components/DatePicker/RangePicker.cjs.map +1 -0
  46. package/dist/cjs/components/DatePicker/TimePicker.cjs +2 -0
  47. package/dist/cjs/components/DatePicker/TimePicker.cjs.map +1 -0
  48. package/dist/cjs/components/Dialog/Dialog.cjs +2 -0
  49. package/dist/cjs/components/Dialog/Dialog.cjs.map +1 -0
  50. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs +2 -0
  51. package/dist/cjs/components/DropdownMenu/DropdownMenu.cjs.map +1 -0
  52. package/dist/cjs/components/DropdownMenu/index.cjs +2 -0
  53. package/dist/cjs/components/DropdownMenu/index.cjs.map +1 -0
  54. package/dist/cjs/components/FloatLabel.cjs +2 -0
  55. package/dist/cjs/components/FloatLabel.cjs.map +1 -0
  56. package/dist/cjs/components/Glass/Glass.cjs +2 -0
  57. package/dist/cjs/components/Glass/Glass.cjs.map +1 -0
  58. package/dist/cjs/components/ImageViewer/ImageViewer.cjs +2 -0
  59. package/dist/cjs/components/ImageViewer/ImageViewer.cjs.map +1 -0
  60. package/dist/cjs/components/ImageViewer/ImageViewer.css +1 -0
  61. package/dist/cjs/components/Input/Input.cjs +2 -0
  62. package/dist/cjs/components/Input/Input.cjs.map +1 -0
  63. package/dist/cjs/components/InputOTP/InputOTP.cjs +2 -0
  64. package/dist/cjs/components/InputOTP/InputOTP.cjs.map +1 -0
  65. package/dist/cjs/components/Interactive/CursorFollow.cjs +2 -0
  66. package/dist/cjs/components/Interactive/CursorFollow.cjs.map +1 -0
  67. package/dist/cjs/components/Marquee/Marquee.cjs +2 -0
  68. package/dist/cjs/components/Marquee/Marquee.cjs.map +1 -0
  69. package/dist/cjs/components/Marquee/MarqueeWrapper.cjs +2 -0
  70. package/dist/cjs/components/Marquee/MarqueeWrapper.cjs.map +1 -0
  71. package/dist/cjs/components/Marquee/index.cjs +2 -0
  72. package/dist/cjs/components/Marquee/index.cjs.map +1 -0
  73. package/dist/cjs/components/Masonry/Masonry.cjs +2 -0
  74. package/dist/cjs/components/Masonry/Masonry.cjs.map +1 -0
  75. package/dist/cjs/components/Masonry/MasonryWrapper.cjs +2 -0
  76. package/dist/cjs/components/Masonry/MasonryWrapper.cjs.map +1 -0
  77. package/dist/cjs/components/Pagination/Pagination.cjs +2 -0
  78. package/dist/cjs/components/Pagination/Pagination.cjs.map +1 -0
  79. package/dist/cjs/components/Pagination/index.cjs +2 -0
  80. package/dist/cjs/components/Pagination/index.cjs.map +1 -0
  81. package/dist/cjs/components/Popover/Popover.cjs +2 -0
  82. package/dist/cjs/components/Popover/Popover.cjs.map +1 -0
  83. package/dist/cjs/components/Popover/index.cjs +2 -0
  84. package/dist/cjs/components/Popover/index.cjs.map +1 -0
  85. package/dist/cjs/components/QrCode/QrCode.cjs +2 -0
  86. package/dist/cjs/components/QrCode/QrCode.cjs.map +1 -0
  87. package/dist/cjs/components/QrCode/index.cjs +2 -0
  88. package/dist/cjs/components/QrCode/index.cjs.map +1 -0
  89. package/dist/cjs/components/Radio/Radio.cjs +2 -0
  90. package/dist/cjs/components/Radio/Radio.cjs.map +1 -0
  91. package/dist/cjs/components/Rate/Rate.cjs +2 -0
  92. package/dist/cjs/components/Rate/Rate.cjs.map +1 -0
  93. package/dist/cjs/components/Resizable/Resizable.cjs +2 -0
  94. package/dist/cjs/components/Resizable/Resizable.cjs.map +1 -0
  95. package/dist/cjs/components/ScrollArea/ScrollArea.cjs +2 -0
  96. package/dist/cjs/components/ScrollArea/ScrollArea.cjs.map +1 -0
  97. package/dist/cjs/components/Select/Select.cjs +2 -0
  98. package/dist/cjs/components/Select/Select.cjs.map +1 -0
  99. package/dist/cjs/components/Separator/Separator.cjs +2 -0
  100. package/dist/cjs/components/Separator/Separator.cjs.map +1 -0
  101. package/dist/cjs/components/Sheet/Sheet.cjs +6 -0
  102. package/dist/cjs/components/Sheet/Sheet.cjs.map +1 -0
  103. package/dist/cjs/components/Sidebar/Sidebar.cjs +2 -0
  104. package/dist/cjs/components/Sidebar/Sidebar.cjs.map +1 -0
  105. package/dist/cjs/components/Skeleton/Skeleton.cjs +2 -0
  106. package/dist/cjs/components/Skeleton/Skeleton.cjs.map +1 -0
  107. package/dist/cjs/components/Slider/Slider.cjs +2 -0
  108. package/dist/cjs/components/Slider/Slider.cjs.map +1 -0
  109. package/dist/cjs/components/Stepper/Stepper.cjs +2 -0
  110. package/dist/cjs/components/Stepper/Stepper.cjs.map +1 -0
  111. package/dist/cjs/components/Stepper/StepperWrapper.cjs +2 -0
  112. package/dist/cjs/components/Stepper/StepperWrapper.cjs.map +1 -0
  113. package/dist/cjs/components/Stepper/index.cjs +2 -0
  114. package/dist/cjs/components/Stepper/index.cjs.map +1 -0
  115. package/dist/cjs/components/Switch/Switch.cjs +2 -0
  116. package/dist/cjs/components/Switch/Switch.cjs.map +1 -0
  117. package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs +2 -0
  118. package/dist/cjs/components/Table/TableFilter/data-table-date-filter.cjs.map +1 -0
  119. package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs +2 -0
  120. package/dist/cjs/components/Table/TableFilter/data-table-filter-popover.cjs.map +1 -0
  121. package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs +2 -0
  122. package/dist/cjs/components/Table/TableFilter/data-table-slider-filter.cjs.map +1 -0
  123. package/dist/cjs/components/Table/data-table-column-header.cjs +2 -0
  124. package/dist/cjs/components/Table/data-table-column-header.cjs.map +1 -0
  125. package/dist/cjs/components/Table/data-table-pagination.cjs +2 -0
  126. package/dist/cjs/components/Table/data-table-pagination.cjs.map +1 -0
  127. package/dist/cjs/components/Table/data-table.cjs +2 -0
  128. package/dist/cjs/components/Table/data-table.cjs.map +1 -0
  129. package/dist/cjs/components/Tabs/Tabs.cjs +2 -0
  130. package/dist/cjs/components/Tabs/Tabs.cjs.map +1 -0
  131. package/dist/cjs/components/Tabs/classes.cjs +2 -0
  132. package/dist/cjs/components/Tabs/classes.cjs.map +1 -0
  133. package/dist/cjs/components/Textarea/Textarea.cjs +2 -0
  134. package/dist/cjs/components/Textarea/Textarea.cjs.map +1 -0
  135. package/dist/cjs/components/TimeGridView.cjs +2 -0
  136. package/dist/cjs/components/TimeGridView.cjs.map +1 -0
  137. package/dist/cjs/components/Toast/Toast.cjs +2 -0
  138. package/dist/cjs/components/Toast/Toast.cjs.map +1 -0
  139. package/dist/cjs/components/Toggle/Toggle.cjs +2 -0
  140. package/dist/cjs/components/Toggle/Toggle.cjs.map +1 -0
  141. package/dist/cjs/components/Tooltip/Tooltip.cjs +2 -0
  142. package/dist/cjs/components/Tooltip/Tooltip.cjs.map +1 -0
  143. package/dist/cjs/components/Tour/Tour.cjs +2 -0
  144. package/dist/cjs/components/Tour/Tour.cjs.map +1 -0
  145. package/dist/cjs/components/Tour/TourWrapper.cjs +2 -0
  146. package/dist/cjs/components/Tour/TourWrapper.cjs.map +1 -0
  147. package/dist/cjs/components/Tour/index.cjs +2 -0
  148. package/dist/cjs/components/Tour/index.cjs.map +1 -0
  149. package/dist/cjs/components/Upload/Upload.cjs +4 -0
  150. package/dist/cjs/components/Upload/Upload.cjs.map +1 -0
  151. package/dist/cjs/components/WheelColumn.cjs +2 -0
  152. package/dist/cjs/components/WheelColumn.cjs.map +1 -0
  153. package/dist/cjs/constants/common.cjs +2 -0
  154. package/dist/cjs/constants/common.cjs.map +1 -0
  155. package/dist/cjs/favicon.ico +0 -0
  156. package/dist/cjs/hooks/use-callback-ref.cjs +2 -0
  157. package/dist/cjs/hooks/use-callback-ref.cjs.map +1 -0
  158. package/dist/cjs/hooks/use-debounced-callback.cjs +2 -0
  159. package/dist/cjs/hooks/use-debounced-callback.cjs.map +1 -0
  160. package/dist/cjs/hooks/use-debounced-value.cjs +2 -0
  161. package/dist/cjs/hooks/use-debounced-value.cjs.map +1 -0
  162. package/dist/cjs/hooks/use-event-listener.cjs +2 -0
  163. package/dist/cjs/hooks/use-event-listener.cjs.map +1 -0
  164. package/dist/cjs/hooks/use-intersection-observer.cjs +2 -0
  165. package/dist/cjs/hooks/use-intersection-observer.cjs.map +1 -0
  166. package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs +2 -0
  167. package/dist/cjs/hooks/use-isomorphic-layout-effect.cjs.map +1 -0
  168. package/dist/cjs/hooks/use-media-query.cjs +2 -0
  169. package/dist/cjs/hooks/use-media-query.cjs.map +1 -0
  170. package/dist/cjs/hooks/use-on-click-outside.cjs +2 -0
  171. package/dist/cjs/hooks/use-on-click-outside.cjs.map +1 -0
  172. package/dist/cjs/hooks/use-script.cjs +2 -0
  173. package/dist/cjs/hooks/use-script.cjs.map +1 -0
  174. package/dist/cjs/hooks/use-scroll-lock.cjs +2 -0
  175. package/dist/cjs/hooks/use-scroll-lock.cjs.map +1 -0
  176. package/dist/cjs/image.png +0 -0
  177. package/dist/cjs/index.cjs +2 -0
  178. package/dist/cjs/index.cjs.map +1 -0
  179. package/dist/cjs/lib/TextAnimation/BlurText.cjs +2 -0
  180. package/dist/cjs/lib/TextAnimation/BlurText.cjs.map +1 -0
  181. package/dist/cjs/lib/TextAnimation/CircularText.cjs +2 -0
  182. package/dist/cjs/lib/TextAnimation/CircularText.cjs.map +1 -0
  183. package/dist/cjs/lib/TextAnimation/FlipWords.cjs +2 -0
  184. package/dist/cjs/lib/TextAnimation/FlipWords.cjs.map +1 -0
  185. package/dist/cjs/lib/TextAnimation/GradientText.cjs +2 -0
  186. package/dist/cjs/lib/TextAnimation/GradientText.cjs.map +1 -0
  187. package/dist/cjs/lib/TextAnimation/RollingText.cjs +2 -0
  188. package/dist/cjs/lib/TextAnimation/RollingText.cjs.map +1 -0
  189. package/dist/cjs/lib/TextAnimation/RotatingText.cjs +2 -0
  190. package/dist/cjs/lib/TextAnimation/RotatingText.cjs.map +1 -0
  191. package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs +2 -0
  192. package/dist/cjs/lib/TextAnimation/ShimmeringText.cjs.map +1 -0
  193. package/dist/cjs/lib/TextAnimation/SplittingText.cjs +2 -0
  194. package/dist/cjs/lib/TextAnimation/SplittingText.cjs.map +1 -0
  195. package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs +2 -0
  196. package/dist/cjs/lib/TextAnimation/TextGenerateEffect.cjs.map +1 -0
  197. package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs +2 -0
  198. package/dist/cjs/lib/TextAnimation/TextHoverEffect.cjs.map +1 -0
  199. package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs +22 -0
  200. package/dist/cjs/lib/TextAnimation/TextPressureEffect.cjs.map +1 -0
  201. package/dist/cjs/lib/TextAnimation/TypingText.cjs +2 -0
  202. package/dist/cjs/lib/TextAnimation/TypingText.cjs.map +1 -0
  203. package/dist/cjs/lib/TextAnimation/WritingText.cjs +2 -0
  204. package/dist/cjs/lib/TextAnimation/WritingText.cjs.map +1 -0
  205. package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs +253 -0
  206. package/dist/cjs/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.cjs.map +1 -0
  207. package/dist/cjs/node_modules/.pnpm/viewerjs@1.11.7/node_modules/viewerjs/dist/viewer.css +1 -0
  208. package/dist/cjs/styles/animation.css +1 -0
  209. package/dist/cjs/styles/index.css +1 -0
  210. package/dist/cjs/styles/theme.css +1 -0
  211. package/dist/cjs/utils/animations.cjs +2 -0
  212. package/dist/cjs/utils/animations.cjs.map +1 -0
  213. package/dist/cjs/utils/css.cjs +2 -0
  214. package/dist/cjs/utils/css.cjs.map +1 -0
  215. package/dist/cjs/utils/data-table.cjs +2 -0
  216. package/dist/cjs/utils/data-table.cjs.map +1 -0
  217. package/dist/cjs/utils/datetime.cjs +2 -0
  218. package/dist/cjs/utils/datetime.cjs.map +1 -0
  219. package/dist/cjs/vite.svg +1 -0
  220. package/dist/cjs/wave.png +0 -0
  221. package/dist/esm/_virtual/_commonjsHelpers.js +7 -0
  222. package/dist/esm/_virtual/_commonjsHelpers.js.map +1 -0
  223. package/dist/esm/_virtual/index.js +8 -0
  224. package/dist/esm/_virtual/index.js.map +1 -0
  225. package/dist/esm/_virtual/index2.js +5 -0
  226. package/dist/esm/_virtual/index2.js.map +1 -0
  227. package/dist/esm/components/Accordion/Accordion.js +190 -0
  228. package/dist/esm/components/Accordion/Accordion.js.map +1 -0
  229. package/dist/esm/components/Avatar/Avatar.js +93 -0
  230. package/dist/esm/components/Avatar/Avatar.js.map +1 -0
  231. package/dist/esm/components/Badge/Badge.js +35 -0
  232. package/dist/esm/components/Badge/Badge.js.map +1 -0
  233. package/dist/esm/components/Breadcrumb/Breadcrumb.js +102 -0
  234. package/dist/esm/components/Breadcrumb/Breadcrumb.js.map +1 -0
  235. package/dist/esm/components/Button/Button.js +53 -0
  236. package/dist/esm/components/Button/Button.js.map +1 -0
  237. package/dist/esm/components/Button/ButtonGroup.js +53 -0
  238. package/dist/esm/components/Button/ButtonGroup.js.map +1 -0
  239. package/dist/esm/components/Calendar/Calendar.js +40 -0
  240. package/dist/esm/components/Calendar/Calendar.js.map +1 -0
  241. package/dist/esm/components/Carousel/Carousel.js +510 -0
  242. package/dist/esm/components/Carousel/Carousel.js.map +1 -0
  243. package/dist/esm/components/Checkbox/Checkbox.js +79 -0
  244. package/dist/esm/components/Checkbox/Checkbox.js.map +1 -0
  245. package/dist/esm/components/Collapsible/Collapsible.js +107 -0
  246. package/dist/esm/components/Collapsible/Collapsible.js.map +1 -0
  247. package/dist/esm/components/Command/Command.js +113 -0
  248. package/dist/esm/components/Command/Command.js.map +1 -0
  249. package/dist/esm/components/Command/index.js +16 -0
  250. package/dist/esm/components/Command/index.js.map +1 -0
  251. package/dist/esm/components/ContextMenu/ContextMenu.js +131 -0
  252. package/dist/esm/components/ContextMenu/ContextMenu.js.map +1 -0
  253. package/dist/esm/components/ContextMenu/index.js +24 -0
  254. package/dist/esm/components/ContextMenu/index.js.map +1 -0
  255. package/dist/esm/components/Cropper/Cropper.js +1014 -0
  256. package/dist/esm/components/Cropper/Cropper.js.map +1 -0
  257. package/dist/esm/components/Cropper/CropperTool.js +157 -0
  258. package/dist/esm/components/Cropper/CropperTool.js.map +1 -0
  259. package/dist/esm/components/Cropper/utils.js +108 -0
  260. package/dist/esm/components/Cropper/utils.js.map +1 -0
  261. package/dist/esm/components/DatePicker/DatePicker.js +263 -0
  262. package/dist/esm/components/DatePicker/DatePicker.js.map +1 -0
  263. package/dist/esm/components/DatePicker/RangePicker.js +456 -0
  264. package/dist/esm/components/DatePicker/RangePicker.js.map +1 -0
  265. package/dist/esm/components/DatePicker/TimePicker.js +444 -0
  266. package/dist/esm/components/DatePicker/TimePicker.js.map +1 -0
  267. package/dist/esm/components/Dialog/Dialog.js +223 -0
  268. package/dist/esm/components/Dialog/Dialog.js.map +1 -0
  269. package/dist/esm/components/DropdownMenu/DropdownMenu.js +196 -0
  270. package/dist/esm/components/DropdownMenu/DropdownMenu.js.map +1 -0
  271. package/dist/esm/components/DropdownMenu/index.js +24 -0
  272. package/dist/esm/components/DropdownMenu/index.js.map +1 -0
  273. package/dist/esm/components/FloatLabel.js +59 -0
  274. package/dist/esm/components/FloatLabel.js.map +1 -0
  275. package/dist/esm/components/Glass/Glass.js +93 -0
  276. package/dist/esm/components/Glass/Glass.js.map +1 -0
  277. package/dist/esm/components/ImageViewer/ImageViewer.css +1 -0
  278. package/dist/esm/components/ImageViewer/ImageViewer.js +273 -0
  279. package/dist/esm/components/ImageViewer/ImageViewer.js.map +1 -0
  280. package/dist/esm/components/Input/Input.js +267 -0
  281. package/dist/esm/components/Input/Input.js.map +1 -0
  282. package/dist/esm/components/InputOTP/InputOTP.js +70 -0
  283. package/dist/esm/components/InputOTP/InputOTP.js.map +1 -0
  284. package/dist/esm/components/Interactive/CursorFollow.js +257 -0
  285. package/dist/esm/components/Interactive/CursorFollow.js.map +1 -0
  286. package/dist/esm/components/Marquee/Marquee.js +419 -0
  287. package/dist/esm/components/Marquee/Marquee.js.map +1 -0
  288. package/dist/esm/components/Marquee/MarqueeWrapper.js +25 -0
  289. package/dist/esm/components/Marquee/MarqueeWrapper.js.map +1 -0
  290. package/dist/esm/components/Marquee/index.js +15 -0
  291. package/dist/esm/components/Marquee/index.js.map +1 -0
  292. package/dist/esm/components/Masonry/Masonry.js +840 -0
  293. package/dist/esm/components/Masonry/Masonry.js.map +1 -0
  294. package/dist/esm/components/Masonry/MasonryWrapper.js +19 -0
  295. package/dist/esm/components/Masonry/MasonryWrapper.js.map +1 -0
  296. package/dist/esm/components/Pagination/Pagination.js +209 -0
  297. package/dist/esm/components/Pagination/Pagination.js.map +1 -0
  298. package/dist/esm/components/Pagination/index.js +14 -0
  299. package/dist/esm/components/Pagination/index.js.map +1 -0
  300. package/dist/esm/components/Popover/Popover.js +51 -0
  301. package/dist/esm/components/Popover/Popover.js.map +1 -0
  302. package/dist/esm/components/Popover/index.js +9 -0
  303. package/dist/esm/components/Popover/index.js.map +1 -0
  304. package/dist/esm/components/QrCode/QrCode.js +300 -0
  305. package/dist/esm/components/QrCode/QrCode.js.map +1 -0
  306. package/dist/esm/components/QrCode/index.js +16 -0
  307. package/dist/esm/components/QrCode/index.js.map +1 -0
  308. package/dist/esm/components/Radio/Radio.js +74 -0
  309. package/dist/esm/components/Radio/Radio.js.map +1 -0
  310. package/dist/esm/components/Rate/Rate.js +191 -0
  311. package/dist/esm/components/Rate/Rate.js.map +1 -0
  312. package/dist/esm/components/Resizable/Resizable.js +89 -0
  313. package/dist/esm/components/Resizable/Resizable.js.map +1 -0
  314. package/dist/esm/components/ScrollArea/ScrollArea.js +45 -0
  315. package/dist/esm/components/ScrollArea/ScrollArea.js.map +1 -0
  316. package/dist/esm/components/Select/Select.js +199 -0
  317. package/dist/esm/components/Select/Select.js.map +1 -0
  318. package/dist/esm/components/Separator/Separator.js +7 -0
  319. package/dist/esm/components/Separator/Separator.js.map +1 -0
  320. package/dist/esm/components/Sheet/Sheet.js +141 -0
  321. package/dist/esm/components/Sheet/Sheet.js.map +1 -0
  322. package/dist/esm/components/Sidebar/Sidebar.js +30 -0
  323. package/dist/esm/components/Sidebar/Sidebar.js.map +1 -0
  324. package/dist/esm/components/Skeleton/Skeleton.js +12 -0
  325. package/dist/esm/components/Skeleton/Skeleton.js.map +1 -0
  326. package/dist/esm/components/Slider/Slider.js +420 -0
  327. package/dist/esm/components/Slider/Slider.js.map +1 -0
  328. package/dist/esm/components/Stepper/Stepper.js +886 -0
  329. package/dist/esm/components/Stepper/Stepper.js.map +1 -0
  330. package/dist/esm/components/Stepper/StepperWrapper.js +80 -0
  331. package/dist/esm/components/Stepper/StepperWrapper.js.map +1 -0
  332. package/dist/esm/components/Stepper/index.js +21 -0
  333. package/dist/esm/components/Stepper/index.js.map +1 -0
  334. package/dist/esm/components/Switch/Switch.js +126 -0
  335. package/dist/esm/components/Switch/Switch.js.map +1 -0
  336. package/dist/esm/components/Table/TableFilter/data-table-date-filter.js +126 -0
  337. package/dist/esm/components/Table/TableFilter/data-table-date-filter.js.map +1 -0
  338. package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js +138 -0
  339. package/dist/esm/components/Table/TableFilter/data-table-filter-popover.js.map +1 -0
  340. package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js +164 -0
  341. package/dist/esm/components/Table/TableFilter/data-table-slider-filter.js.map +1 -0
  342. package/dist/esm/components/Table/data-table-column-header.js +82 -0
  343. package/dist/esm/components/Table/data-table-column-header.js.map +1 -0
  344. package/dist/esm/components/Table/data-table-pagination.js +73 -0
  345. package/dist/esm/components/Table/data-table-pagination.js.map +1 -0
  346. package/dist/esm/components/Table/data-table.js +94 -0
  347. package/dist/esm/components/Table/data-table.js.map +1 -0
  348. package/dist/esm/components/Tabs/Tabs.js +540 -0
  349. package/dist/esm/components/Tabs/Tabs.js.map +1 -0
  350. package/dist/esm/components/Tabs/classes.js +345 -0
  351. package/dist/esm/components/Tabs/classes.js.map +1 -0
  352. package/dist/esm/components/Textarea/Textarea.js +132 -0
  353. package/dist/esm/components/Textarea/Textarea.js.map +1 -0
  354. package/dist/esm/components/TimeGridView.js +101 -0
  355. package/dist/esm/components/TimeGridView.js.map +1 -0
  356. package/dist/esm/components/Toast/Toast.js +80 -0
  357. package/dist/esm/components/Toast/Toast.js.map +1 -0
  358. package/dist/esm/components/Toggle/Toggle.js +23 -0
  359. package/dist/esm/components/Toggle/Toggle.js.map +1 -0
  360. package/dist/esm/components/Tooltip/Tooltip.js +120 -0
  361. package/dist/esm/components/Tooltip/Tooltip.js.map +1 -0
  362. package/dist/esm/components/Tour/Tour.js +948 -0
  363. package/dist/esm/components/Tour/Tour.js.map +1 -0
  364. package/dist/esm/components/Tour/TourWrapper.js +67 -0
  365. package/dist/esm/components/Tour/TourWrapper.js.map +1 -0
  366. package/dist/esm/components/Tour/index.js +38 -0
  367. package/dist/esm/components/Tour/index.js.map +1 -0
  368. package/dist/esm/components/Upload/Upload.js +948 -0
  369. package/dist/esm/components/Upload/Upload.js.map +1 -0
  370. package/dist/esm/components/WheelColumn.js +127 -0
  371. package/dist/esm/components/WheelColumn.js.map +1 -0
  372. package/dist/esm/constants/common.js +5 -0
  373. package/dist/esm/constants/common.js.map +1 -0
  374. package/dist/esm/favicon.ico +0 -0
  375. package/dist/esm/hooks/use-callback-ref.js +14 -0
  376. package/dist/esm/hooks/use-callback-ref.js.map +1 -0
  377. package/dist/esm/hooks/use-debounced-callback.js +21 -0
  378. package/dist/esm/hooks/use-debounced-callback.js.map +1 -0
  379. package/dist/esm/hooks/use-debounced-value.js +12 -0
  380. package/dist/esm/hooks/use-debounced-value.js.map +1 -0
  381. package/dist/esm/hooks/use-event-listener.js +21 -0
  382. package/dist/esm/hooks/use-event-listener.js.map +1 -0
  383. package/dist/esm/hooks/use-intersection-observer.js +56 -0
  384. package/dist/esm/hooks/use-intersection-observer.js.map +1 -0
  385. package/dist/esm/hooks/use-isomorphic-layout-effect.js +6 -0
  386. package/dist/esm/hooks/use-isomorphic-layout-effect.js.map +1 -0
  387. package/dist/esm/hooks/use-media-query.js +22 -0
  388. package/dist/esm/hooks/use-media-query.js.map +1 -0
  389. package/dist/esm/hooks/use-on-click-outside.js +18 -0
  390. package/dist/esm/hooks/use-on-click-outside.js.map +1 -0
  391. package/dist/esm/hooks/use-script.js +46 -0
  392. package/dist/esm/hooks/use-script.js.map +1 -0
  393. package/dist/esm/hooks/use-scroll-lock.js +27 -0
  394. package/dist/esm/hooks/use-scroll-lock.js.map +1 -0
  395. package/dist/esm/image.png +0 -0
  396. package/dist/esm/index.js +223 -0
  397. package/dist/esm/index.js.map +1 -0
  398. package/dist/esm/lib/TextAnimation/BlurText.js +84 -0
  399. package/dist/esm/lib/TextAnimation/BlurText.js.map +1 -0
  400. package/dist/esm/lib/TextAnimation/CircularText.js +96 -0
  401. package/dist/esm/lib/TextAnimation/CircularText.js.map +1 -0
  402. package/dist/esm/lib/TextAnimation/FlipWords.js +103 -0
  403. package/dist/esm/lib/TextAnimation/FlipWords.js.map +1 -0
  404. package/dist/esm/lib/TextAnimation/GradientText.js +54 -0
  405. package/dist/esm/lib/TextAnimation/GradientText.js.map +1 -0
  406. package/dist/esm/lib/TextAnimation/RollingText.js +70 -0
  407. package/dist/esm/lib/TextAnimation/RollingText.js.map +1 -0
  408. package/dist/esm/lib/TextAnimation/RotatingText.js +38 -0
  409. package/dist/esm/lib/TextAnimation/RotatingText.js.map +1 -0
  410. package/dist/esm/lib/TextAnimation/ShimmeringText.js +64 -0
  411. package/dist/esm/lib/TextAnimation/ShimmeringText.js.map +1 -0
  412. package/dist/esm/lib/TextAnimation/SplittingText.js +86 -0
  413. package/dist/esm/lib/TextAnimation/SplittingText.js.map +1 -0
  414. package/dist/esm/lib/TextAnimation/TextGenerateEffect.js +59 -0
  415. package/dist/esm/lib/TextAnimation/TextGenerateEffect.js.map +1 -0
  416. package/dist/esm/lib/TextAnimation/TextHoverEffect.js +128 -0
  417. package/dist/esm/lib/TextAnimation/TextHoverEffect.js.map +1 -0
  418. package/dist/esm/lib/TextAnimation/TextPressureEffect.js +135 -0
  419. package/dist/esm/lib/TextAnimation/TextPressureEffect.js.map +1 -0
  420. package/dist/esm/lib/TextAnimation/TypingText.js +118 -0
  421. package/dist/esm/lib/TextAnimation/TypingText.js.map +1 -0
  422. package/dist/esm/lib/TextAnimation/WritingText.js +45 -0
  423. package/dist/esm/lib/TextAnimation/WritingText.js.map +1 -0
  424. package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js +865 -0
  425. package/dist/esm/node_modules/.pnpm/react-viewer@3.2.2/node_modules/react-viewer/dist/index.js.map +1 -0
  426. package/dist/esm/node_modules/.pnpm/viewerjs@1.11.7/node_modules/viewerjs/dist/viewer.css +1 -0
  427. package/dist/esm/styles/animation.css +1 -0
  428. package/dist/esm/styles/index.css +1 -0
  429. package/dist/esm/styles/theme.css +1 -0
  430. package/dist/esm/utils/animations.js +189 -0
  431. package/dist/esm/utils/animations.js.map +1 -0
  432. package/dist/esm/utils/css.js +25 -0
  433. package/dist/esm/utils/css.js.map +1 -0
  434. package/dist/esm/utils/data-table.js +20 -0
  435. package/dist/esm/utils/data-table.js.map +1 -0
  436. package/dist/esm/utils/datetime.js +17 -0
  437. package/dist/esm/utils/datetime.js.map +1 -0
  438. package/dist/esm/vite.svg +1 -0
  439. package/dist/esm/wave.png +0 -0
  440. package/dist/types/components/Accordion/Accordion.d.ts +49 -0
  441. package/dist/types/components/Accordion/Accordion.d.ts.map +1 -0
  442. package/dist/types/components/Accordion/index.d.ts +3 -0
  443. package/dist/types/components/Accordion/index.d.ts.map +1 -0
  444. package/dist/types/components/Avatar/Avatar.d.ts +18 -0
  445. package/dist/types/components/Avatar/Avatar.d.ts.map +1 -0
  446. package/dist/types/components/Avatar/index.d.ts +3 -0
  447. package/dist/types/components/Avatar/index.d.ts.map +1 -0
  448. package/dist/types/components/Badge/Badge.d.ts +10 -0
  449. package/dist/types/components/Badge/Badge.d.ts.map +1 -0
  450. package/dist/types/components/Badge/index.d.ts +2 -0
  451. package/dist/types/components/Badge/index.d.ts.map +1 -0
  452. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts +23 -0
  453. package/dist/types/components/Breadcrumb/Breadcrumb.d.ts.map +1 -0
  454. package/dist/types/components/Breadcrumb/index.d.ts +2 -0
  455. package/dist/types/components/Breadcrumb/index.d.ts.map +1 -0
  456. package/dist/types/components/Button/Button.d.ts +10 -0
  457. package/dist/types/components/Button/Button.d.ts.map +1 -0
  458. package/dist/types/components/Button/ButtonGroup.d.ts +16 -0
  459. package/dist/types/components/Button/ButtonGroup.d.ts.map +1 -0
  460. package/dist/types/components/Button/index.d.ts +5 -0
  461. package/dist/types/components/Button/index.d.ts.map +1 -0
  462. package/dist/types/components/Calendar/Calendar.d.ts +15 -0
  463. package/dist/types/components/Calendar/Calendar.d.ts.map +1 -0
  464. package/dist/types/components/Calendar/index.d.ts +3 -0
  465. package/dist/types/components/Calendar/index.d.ts.map +1 -0
  466. package/dist/types/components/Carousel/Carousel.d.ts +79 -0
  467. package/dist/types/components/Carousel/Carousel.d.ts.map +1 -0
  468. package/dist/types/components/Carousel/index.d.ts +4 -0
  469. package/dist/types/components/Carousel/index.d.ts.map +1 -0
  470. package/dist/types/components/Checkbox/Checkbox.d.ts +15 -0
  471. package/dist/types/components/Checkbox/Checkbox.d.ts.map +1 -0
  472. package/dist/types/components/Checkbox/index.d.ts +2 -0
  473. package/dist/types/components/Checkbox/index.d.ts.map +1 -0
  474. package/dist/types/components/Collapsible/Collapsible.d.ts +17 -0
  475. package/dist/types/components/Collapsible/Collapsible.d.ts.map +1 -0
  476. package/dist/types/components/Collapsible/index.d.ts +2 -0
  477. package/dist/types/components/Collapsible/index.d.ts.map +1 -0
  478. package/dist/types/components/Command/Command.d.ts +39 -0
  479. package/dist/types/components/Command/Command.d.ts.map +1 -0
  480. package/dist/types/components/Command/index.d.ts +15 -0
  481. package/dist/types/components/Command/index.d.ts.map +1 -0
  482. package/dist/types/components/ContextMenu/ContextMenu.d.ts +64 -0
  483. package/dist/types/components/ContextMenu/ContextMenu.d.ts.map +1 -0
  484. package/dist/types/components/ContextMenu/index.d.ts +23 -0
  485. package/dist/types/components/ContextMenu/index.d.ts.map +1 -0
  486. package/dist/types/components/Cropper/Cropper.d.ts +86 -0
  487. package/dist/types/components/Cropper/Cropper.d.ts.map +1 -0
  488. package/dist/types/components/Cropper/CropperTool.d.ts +149 -0
  489. package/dist/types/components/Cropper/CropperTool.d.ts.map +1 -0
  490. package/dist/types/components/Cropper/index.d.ts +4 -0
  491. package/dist/types/components/Cropper/index.d.ts.map +1 -0
  492. package/dist/types/components/Cropper/utils.d.ts +130 -0
  493. package/dist/types/components/Cropper/utils.d.ts.map +1 -0
  494. package/dist/types/components/DatePicker/DatePicker.d.ts +56 -0
  495. package/dist/types/components/DatePicker/DatePicker.d.ts.map +1 -0
  496. package/dist/types/components/DatePicker/RangePicker.d.ts +42 -0
  497. package/dist/types/components/DatePicker/RangePicker.d.ts.map +1 -0
  498. package/dist/types/components/DatePicker/TimePicker.d.ts +43 -0
  499. package/dist/types/components/DatePicker/TimePicker.d.ts.map +1 -0
  500. package/dist/types/components/DatePicker/index.d.ts +7 -0
  501. package/dist/types/components/DatePicker/index.d.ts.map +1 -0
  502. package/dist/types/components/Dialog/Dialog.d.ts +45 -0
  503. package/dist/types/components/Dialog/Dialog.d.ts.map +1 -0
  504. package/dist/types/components/Dialog/index.d.ts +2 -0
  505. package/dist/types/components/Dialog/index.d.ts.map +1 -0
  506. package/dist/types/components/DropdownMenu/DropdownMenu.d.ts +65 -0
  507. package/dist/types/components/DropdownMenu/DropdownMenu.d.ts.map +1 -0
  508. package/dist/types/components/DropdownMenu/index.d.ts +22 -0
  509. package/dist/types/components/DropdownMenu/index.d.ts.map +1 -0
  510. package/dist/types/components/FloatLabel.d.ts +8 -0
  511. package/dist/types/components/FloatLabel.d.ts.map +1 -0
  512. package/dist/types/components/Glass/Glass.d.ts +10 -0
  513. package/dist/types/components/Glass/Glass.d.ts.map +1 -0
  514. package/dist/types/components/Glass/index.d.ts +2 -0
  515. package/dist/types/components/Glass/index.d.ts.map +1 -0
  516. package/dist/types/components/ImageViewer/ImageViewer.d.ts +58 -0
  517. package/dist/types/components/ImageViewer/ImageViewer.d.ts.map +1 -0
  518. package/dist/types/components/ImageViewer/index.d.ts +4 -0
  519. package/dist/types/components/ImageViewer/index.d.ts.map +1 -0
  520. package/dist/types/components/Input/Input.d.ts +27 -0
  521. package/dist/types/components/Input/Input.d.ts.map +1 -0
  522. package/dist/types/components/Input/index.d.ts +2 -0
  523. package/dist/types/components/Input/index.d.ts.map +1 -0
  524. package/dist/types/components/InputOTP/InputOTP.d.ts +20 -0
  525. package/dist/types/components/InputOTP/InputOTP.d.ts.map +1 -0
  526. package/dist/types/components/InputOTP/index.d.ts +2 -0
  527. package/dist/types/components/InputOTP/index.d.ts.map +1 -0
  528. package/dist/types/components/Interactive/3DCard.d.ts +28 -0
  529. package/dist/types/components/Interactive/3DCard.d.ts.map +1 -0
  530. package/dist/types/components/Interactive/3DMarquee.d.ts +20 -0
  531. package/dist/types/components/Interactive/3DMarquee.d.ts.map +1 -0
  532. package/dist/types/components/Interactive/CursorFollow.d.ts +75 -0
  533. package/dist/types/components/Interactive/CursorFollow.d.ts.map +1 -0
  534. package/dist/types/components/Interactive/index.cursor.d.ts +7 -0
  535. package/dist/types/components/Interactive/index.cursor.d.ts.map +1 -0
  536. package/dist/types/components/Interactive/index.d.ts +2 -0
  537. package/dist/types/components/Interactive/index.d.ts.map +1 -0
  538. package/dist/types/components/Label/Label.d.ts +3 -0
  539. package/dist/types/components/Label/Label.d.ts.map +1 -0
  540. package/dist/types/components/Label/index.d.ts +2 -0
  541. package/dist/types/components/Label/index.d.ts.map +1 -0
  542. package/dist/types/components/Marquee/Marquee.d.ts +31 -0
  543. package/dist/types/components/Marquee/Marquee.d.ts.map +1 -0
  544. package/dist/types/components/Marquee/MarqueeWrapper.d.ts +10 -0
  545. package/dist/types/components/Marquee/MarqueeWrapper.d.ts.map +1 -0
  546. package/dist/types/components/Marquee/index.d.ts +13 -0
  547. package/dist/types/components/Marquee/index.d.ts.map +1 -0
  548. package/dist/types/components/Masonry/Masonry.d.ts +41 -0
  549. package/dist/types/components/Masonry/Masonry.d.ts.map +1 -0
  550. package/dist/types/components/Masonry/MasonryWrapper.d.ts +29 -0
  551. package/dist/types/components/Masonry/MasonryWrapper.d.ts.map +1 -0
  552. package/dist/types/components/Masonry/index.d.ts +5 -0
  553. package/dist/types/components/Masonry/index.d.ts.map +1 -0
  554. package/dist/types/components/Pagination/Pagination.d.ts +24 -0
  555. package/dist/types/components/Pagination/Pagination.d.ts.map +1 -0
  556. package/dist/types/components/Pagination/index.d.ts +11 -0
  557. package/dist/types/components/Pagination/index.d.ts.map +1 -0
  558. package/dist/types/components/Popover/Popover.d.ts +22 -0
  559. package/dist/types/components/Popover/Popover.d.ts.map +1 -0
  560. package/dist/types/components/Popover/index.d.ts +5 -0
  561. package/dist/types/components/Popover/index.d.ts.map +1 -0
  562. package/dist/types/components/QrCode/QrCode.d.ts +51 -0
  563. package/dist/types/components/QrCode/QrCode.d.ts.map +1 -0
  564. package/dist/types/components/QrCode/index.d.ts +13 -0
  565. package/dist/types/components/QrCode/index.d.ts.map +1 -0
  566. package/dist/types/components/Radio/Radio.d.ts +35 -0
  567. package/dist/types/components/Radio/Radio.d.ts.map +1 -0
  568. package/dist/types/components/Radio/index.d.ts +2 -0
  569. package/dist/types/components/Radio/index.d.ts.map +1 -0
  570. package/dist/types/components/Rate/Rate.d.ts +26 -0
  571. package/dist/types/components/Rate/Rate.d.ts.map +1 -0
  572. package/dist/types/components/Rate/index.d.ts +3 -0
  573. package/dist/types/components/Rate/index.d.ts.map +1 -0
  574. package/dist/types/components/Resizable/Resizable.d.ts +71 -0
  575. package/dist/types/components/Resizable/Resizable.d.ts.map +1 -0
  576. package/dist/types/components/Resizable/index.d.ts +4 -0
  577. package/dist/types/components/Resizable/index.d.ts.map +1 -0
  578. package/dist/types/components/ScrollArea/ScrollArea.d.ts +19 -0
  579. package/dist/types/components/ScrollArea/ScrollArea.d.ts.map +1 -0
  580. package/dist/types/components/ScrollArea/index.d.ts +2 -0
  581. package/dist/types/components/ScrollArea/index.d.ts.map +1 -0
  582. package/dist/types/components/Select/Select.d.ts +33 -0
  583. package/dist/types/components/Select/Select.d.ts.map +1 -0
  584. package/dist/types/components/Select/index.d.ts +2 -0
  585. package/dist/types/components/Select/index.d.ts.map +1 -0
  586. package/dist/types/components/Separator/Separator.d.ts +5 -0
  587. package/dist/types/components/Separator/Separator.d.ts.map +1 -0
  588. package/dist/types/components/Separator/index.d.ts +2 -0
  589. package/dist/types/components/Separator/index.d.ts.map +1 -0
  590. package/dist/types/components/Sheet/Sheet.d.ts +36 -0
  591. package/dist/types/components/Sheet/Sheet.d.ts.map +1 -0
  592. package/dist/types/components/Sheet/index.d.ts +2 -0
  593. package/dist/types/components/Sheet/index.d.ts.map +1 -0
  594. package/dist/types/components/Sidebar/Sidebar.d.ts +50 -0
  595. package/dist/types/components/Sidebar/Sidebar.d.ts.map +1 -0
  596. package/dist/types/components/Sidebar/index.d.ts +4 -0
  597. package/dist/types/components/Sidebar/index.d.ts.map +1 -0
  598. package/dist/types/components/Skeleton/Skeleton.d.ts +6 -0
  599. package/dist/types/components/Skeleton/Skeleton.d.ts.map +1 -0
  600. package/dist/types/components/Skeleton/index.d.ts +2 -0
  601. package/dist/types/components/Skeleton/index.d.ts.map +1 -0
  602. package/dist/types/components/Slider/Slider.d.ts +25 -0
  603. package/dist/types/components/Slider/Slider.d.ts.map +1 -0
  604. package/dist/types/components/Slider/index.d.ts +2 -0
  605. package/dist/types/components/Slider/index.d.ts.map +1 -0
  606. package/dist/types/components/Stepper/Stepper.d.ts +86 -0
  607. package/dist/types/components/Stepper/Stepper.d.ts.map +1 -0
  608. package/dist/types/components/Stepper/StepperWrapper.d.ts +25 -0
  609. package/dist/types/components/Stepper/StepperWrapper.d.ts.map +1 -0
  610. package/dist/types/components/Stepper/index.d.ts +18 -0
  611. package/dist/types/components/Stepper/index.d.ts.map +1 -0
  612. package/dist/types/components/Switch/Switch.d.ts +14 -0
  613. package/dist/types/components/Switch/Switch.d.ts.map +1 -0
  614. package/dist/types/components/Switch/index.d.ts +2 -0
  615. package/dist/types/components/Switch/index.d.ts.map +1 -0
  616. package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts +9 -0
  617. package/dist/types/components/Table/TableFilter/data-table-date-filter.d.ts.map +1 -0
  618. package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts +11 -0
  619. package/dist/types/components/Table/TableFilter/data-table-filter-popover.d.ts.map +1 -0
  620. package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts +8 -0
  621. package/dist/types/components/Table/TableFilter/data-table-slider-filter.d.ts.map +1 -0
  622. package/dist/types/components/Table/TableWrapper.d.ts +2 -0
  623. package/dist/types/components/Table/TableWrapper.d.ts.map +1 -0
  624. package/dist/types/components/Table/data-table-column-header.d.ts +9 -0
  625. package/dist/types/components/Table/data-table-column-header.d.ts.map +1 -0
  626. package/dist/types/components/Table/data-table-pagination.d.ts +12 -0
  627. package/dist/types/components/Table/data-table-pagination.d.ts.map +1 -0
  628. package/dist/types/components/Table/data-table-toolbar.d.ts +10 -0
  629. package/dist/types/components/Table/data-table-toolbar.d.ts.map +1 -0
  630. package/dist/types/components/Table/data-table-view-options.d.ts +9 -0
  631. package/dist/types/components/Table/data-table-view-options.d.ts.map +1 -0
  632. package/dist/types/components/Table/data-table.d.ts +18 -0
  633. package/dist/types/components/Table/data-table.d.ts.map +1 -0
  634. package/dist/types/components/Table/index.d.ts +2 -0
  635. package/dist/types/components/Table/index.d.ts.map +1 -0
  636. package/dist/types/components/Table/select-column.d.ts +5 -0
  637. package/dist/types/components/Table/select-column.d.ts.map +1 -0
  638. package/dist/types/components/Tabs/Tabs.d.ts +22 -0
  639. package/dist/types/components/Tabs/Tabs.d.ts.map +1 -0
  640. package/dist/types/components/Tabs/classes.d.ts +29 -0
  641. package/dist/types/components/Tabs/classes.d.ts.map +1 -0
  642. package/dist/types/components/Tabs/index.d.ts +4 -0
  643. package/dist/types/components/Tabs/index.d.ts.map +1 -0
  644. package/dist/types/components/Tabs/types.d.ts +15 -0
  645. package/dist/types/components/Tabs/types.d.ts.map +1 -0
  646. package/dist/types/components/Textarea/Textarea.d.ts +17 -0
  647. package/dist/types/components/Textarea/Textarea.d.ts.map +1 -0
  648. package/dist/types/components/Textarea/index.d.ts +2 -0
  649. package/dist/types/components/Textarea/index.d.ts.map +1 -0
  650. package/dist/types/components/Theme/ThemeShowcase.d.ts +3 -0
  651. package/dist/types/components/Theme/ThemeShowcase.d.ts.map +1 -0
  652. package/dist/types/components/TimeGridView.d.ts +15 -0
  653. package/dist/types/components/TimeGridView.d.ts.map +1 -0
  654. package/dist/types/components/Toast/Toast.d.ts +12 -0
  655. package/dist/types/components/Toast/Toast.d.ts.map +1 -0
  656. package/dist/types/components/Toast/index.d.ts +3 -0
  657. package/dist/types/components/Toast/index.d.ts.map +1 -0
  658. package/dist/types/components/Toggle/Toggle.d.ts +10 -0
  659. package/dist/types/components/Toggle/Toggle.d.ts.map +1 -0
  660. package/dist/types/components/Toggle/index.d.ts +2 -0
  661. package/dist/types/components/Toggle/index.d.ts.map +1 -0
  662. package/dist/types/components/Tooltip/Tooltip.d.ts +19 -0
  663. package/dist/types/components/Tooltip/Tooltip.d.ts.map +1 -0
  664. package/dist/types/components/Tooltip/index.d.ts +3 -0
  665. package/dist/types/components/Tooltip/index.d.ts.map +1 -0
  666. package/dist/types/components/Tour/Tour.d.ts +105 -0
  667. package/dist/types/components/Tour/Tour.d.ts.map +1 -0
  668. package/dist/types/components/Tour/TourWrapper.d.ts +46 -0
  669. package/dist/types/components/Tour/TourWrapper.d.ts.map +1 -0
  670. package/dist/types/components/Tour/index.d.ts +36 -0
  671. package/dist/types/components/Tour/index.d.ts.map +1 -0
  672. package/dist/types/components/TreeSelect/TreeSelect.d.ts +2 -0
  673. package/dist/types/components/TreeSelect/TreeSelect.d.ts.map +1 -0
  674. package/dist/types/components/TreeSelect/index.d.ts +2 -0
  675. package/dist/types/components/TreeSelect/index.d.ts.map +1 -0
  676. package/dist/types/components/Upload/Upload.d.ts +69 -0
  677. package/dist/types/components/Upload/Upload.d.ts.map +1 -0
  678. package/dist/types/components/Upload/index.d.ts +2 -0
  679. package/dist/types/components/Upload/index.d.ts.map +1 -0
  680. package/dist/types/components/WheelColumn.d.ts +15 -0
  681. package/dist/types/components/WheelColumn.d.ts.map +1 -0
  682. package/dist/types/config/data-table.d.ts +125 -0
  683. package/dist/types/config/data-table.d.ts.map +1 -0
  684. package/dist/types/constants/common.d.ts +4 -0
  685. package/dist/types/constants/common.d.ts.map +1 -0
  686. package/dist/types/constants/theme.d.ts +13 -0
  687. package/dist/types/constants/theme.d.ts.map +1 -0
  688. package/dist/types/hooks/index.d.ts +10 -0
  689. package/dist/types/hooks/index.d.ts.map +1 -0
  690. package/dist/types/hooks/use-callback-ref.d.ts +10 -0
  691. package/dist/types/hooks/use-callback-ref.d.ts.map +1 -0
  692. package/dist/types/hooks/use-data-table.d.ts +26 -0
  693. package/dist/types/hooks/use-data-table.d.ts.map +1 -0
  694. package/dist/types/hooks/use-debounced-callback.d.ts +2 -0
  695. package/dist/types/hooks/use-debounced-callback.d.ts.map +1 -0
  696. package/dist/types/hooks/use-debounced-value.d.ts +9 -0
  697. package/dist/types/hooks/use-debounced-value.d.ts.map +1 -0
  698. package/dist/types/hooks/use-event-listener.d.ts +7 -0
  699. package/dist/types/hooks/use-event-listener.d.ts.map +1 -0
  700. package/dist/types/hooks/use-intersection-observer.d.ts +20 -0
  701. package/dist/types/hooks/use-intersection-observer.d.ts.map +1 -0
  702. package/dist/types/hooks/use-isomorphic-layout-effect.d.ts +3 -0
  703. package/dist/types/hooks/use-isomorphic-layout-effect.d.ts.map +1 -0
  704. package/dist/types/hooks/use-media-query.d.ts +7 -0
  705. package/dist/types/hooks/use-media-query.d.ts.map +1 -0
  706. package/dist/types/hooks/use-mouse-position.d.ts +14 -0
  707. package/dist/types/hooks/use-mouse-position.d.ts.map +1 -0
  708. package/dist/types/hooks/use-on-click-outside.d.ts +5 -0
  709. package/dist/types/hooks/use-on-click-outside.d.ts.map +1 -0
  710. package/dist/types/hooks/use-script.d.ts +9 -0
  711. package/dist/types/hooks/use-script.d.ts.map +1 -0
  712. package/dist/types/hooks/use-scroll-lock.d.ts +13 -0
  713. package/dist/types/hooks/use-scroll-lock.d.ts.map +1 -0
  714. package/dist/types/index.d.ts +72 -0
  715. package/dist/types/index.d.ts.map +1 -0
  716. package/dist/types/lib/TextAnimation/BlurText.d.ts +18 -0
  717. package/dist/types/lib/TextAnimation/BlurText.d.ts.map +1 -0
  718. package/dist/types/lib/TextAnimation/CircularText.d.ts +10 -0
  719. package/dist/types/lib/TextAnimation/CircularText.d.ts.map +1 -0
  720. package/dist/types/lib/TextAnimation/FlipWords.d.ts +10 -0
  721. package/dist/types/lib/TextAnimation/FlipWords.d.ts.map +1 -0
  722. package/dist/types/lib/TextAnimation/GradientText.d.ts +11 -0
  723. package/dist/types/lib/TextAnimation/GradientText.d.ts.map +1 -0
  724. package/dist/types/lib/TextAnimation/RollingText.d.ts +12 -0
  725. package/dist/types/lib/TextAnimation/RollingText.d.ts.map +1 -0
  726. package/dist/types/lib/TextAnimation/RotatingText.d.ts +11 -0
  727. package/dist/types/lib/TextAnimation/RotatingText.d.ts.map +1 -0
  728. package/dist/types/lib/TextAnimation/ShimmeringText.d.ts +12 -0
  729. package/dist/types/lib/TextAnimation/ShimmeringText.d.ts.map +1 -0
  730. package/dist/types/lib/TextAnimation/SplittingText.d.ts +26 -0
  731. package/dist/types/lib/TextAnimation/SplittingText.d.ts.map +1 -0
  732. package/dist/types/lib/TextAnimation/TextGenerateEffect.d.ts +10 -0
  733. package/dist/types/lib/TextAnimation/TextGenerateEffect.d.ts.map +1 -0
  734. package/dist/types/lib/TextAnimation/TextHoverEffect.d.ts +6 -0
  735. package/dist/types/lib/TextAnimation/TextHoverEffect.d.ts.map +1 -0
  736. package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts +20 -0
  737. package/dist/types/lib/TextAnimation/TextPressureEffect.d.ts.map +1 -0
  738. package/dist/types/lib/TextAnimation/TypingText.d.ts +27 -0
  739. package/dist/types/lib/TextAnimation/TypingText.d.ts.map +1 -0
  740. package/dist/types/lib/TextAnimation/WritingText.d.ts +13 -0
  741. package/dist/types/lib/TextAnimation/WritingText.d.ts.map +1 -0
  742. package/dist/types/lib/TextAnimation/index.d.ts +16 -0
  743. package/dist/types/lib/TextAnimation/index.d.ts.map +1 -0
  744. package/dist/types/types/data-table.d.ts +44 -0
  745. package/dist/types/types/data-table.d.ts.map +1 -0
  746. package/dist/types/types/theme.d.ts +11 -0
  747. package/dist/types/types/theme.d.ts.map +1 -0
  748. package/dist/types/types/variables.d.ts +6 -0
  749. package/dist/types/types/variables.d.ts.map +1 -0
  750. package/dist/types/utils/animations.d.ts +47 -0
  751. package/dist/types/utils/animations.d.ts.map +1 -0
  752. package/dist/types/utils/css.d.ts +4 -0
  753. package/dist/types/utils/css.d.ts.map +1 -0
  754. package/dist/types/utils/data-table.d.ts +13 -0
  755. package/dist/types/utils/data-table.d.ts.map +1 -0
  756. package/dist/types/utils/datetime.d.ts +2 -0
  757. package/dist/types/utils/datetime.d.ts.map +1 -0
  758. package/dist/types/utils/parsers.d.ts +38 -0
  759. package/dist/types/utils/parsers.d.ts.map +1 -0
  760. package/package.json +968 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Tour.cjs","sources":["../../../../src/components/Tour/Tour.tsx"],"sourcesContent":["\"use client\";\n\nimport { cn, Slot, useComposedRefs } from \"@dsui/ui/index\";\nimport {\n autoUpdate,\n flip,\n hide,\n limitShift,\n type Middleware,\n offset,\n arrow as onArrow,\n type Placement,\n shift,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport { ChevronLeft, ChevronRight, X } from \"lucide-react\";\nimport * as React from \"react\";\nimport * as ReactDOM from \"react-dom\";\nimport Button from \"../Button\";\n\nconst ROOT_NAME = \"Tour\";\nconst PORTAL_NAME = \"TourPortal\";\nconst STEP_NAME = \"TourStep\";\nconst ARROW_NAME = \"TourArrow\";\nconst HEADER_NAME = \"TourHeader\";\nconst TITLE_NAME = \"TourTitle\";\nconst DESCRIPTION_NAME = \"TourDescription\";\nconst CLOSE_NAME = \"TourClose\";\nconst PREV_NAME = \"TourPrev\";\nconst NEXT_NAME = \"TourNext\";\nconst SKIP_NAME = \"TourSkip\";\nconst FOOTER_NAME = \"TourFooter\";\n\nconst POINTER_DOWN_OUTSIDE = \"tour.pointerDownOutside\";\nconst INTERACT_OUTSIDE = \"tour.interactOutside\";\nconst OPEN_AUTO_FOCUS = \"tour.openAutoFocus\";\nconst CLOSE_AUTO_FOCUS = \"tour.closeAutoFocus\";\nconst EVENT_OPTIONS = { bubbles: false, cancelable: true };\n\nconst SIDE_OPTIONS = [\"top\", \"right\", \"bottom\", \"left\"] as const;\nconst ALIGN_OPTIONS = [\"start\", \"center\", \"end\"] as const;\n\nconst DEFAULT_ALIGN_OFFSET = 0;\nconst DEFAULT_SIDE_OFFSET = 16;\nconst DEFAULT_SPOTLIGHT_PADDING = 4;\n\ntype Side = (typeof SIDE_OPTIONS)[number];\ntype Align = (typeof ALIGN_OPTIONS)[number];\ntype Direction = \"ltr\" | \"rtl\";\n\ninterface ScrollOffset {\n top?: number;\n bottom?: number;\n left?: number;\n right?: number;\n}\n\ntype Boundary = Element | null;\n\ninterface DivProps extends React.ComponentProps<\"div\"> {\n asChild?: boolean;\n}\n\ntype StepElement = React.ComponentRef<typeof TourStep>;\ntype CloseElement = React.ComponentRef<typeof TourClose>;\ntype PrevElement = React.ComponentRef<typeof TourPrev>;\ntype NextElement = React.ComponentRef<typeof TourNext>;\ntype SkipElement = React.ComponentRef<typeof TourSkip>;\ntype FooterElement = React.ComponentRef<typeof TourFooter>;\n\nconst OPPOSITE_SIDE: Record<Side, Side> = {\n top: \"bottom\",\n right: \"left\",\n bottom: \"top\",\n left: \"right\",\n};\n\nconst useIsomorphicLayoutEffect =\n typeof window === \"undefined\" ? React.useEffect : React.useLayoutEffect;\n\nfunction useAsRef<T>(props: T) {\n const ref = React.useRef<T>(props);\n\n useIsomorphicLayoutEffect(() => {\n ref.current = props;\n });\n\n return ref;\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\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/focus-guards/src/focus-guards.tsx\n */\nlet focusGuardCount = 0;\n\nfunction createFocusGuard() {\n const element = document.createElement(\"span\");\n element.setAttribute(\"data-tour-focus-guard\", \"\");\n element.tabIndex = 0;\n element.style.outline = \"none\";\n element.style.opacity = \"0\";\n element.style.position = \"fixed\";\n element.style.pointerEvents = \"none\";\n return element;\n}\n\nfunction useFocusGuards() {\n React.useEffect(() => {\n const edgeGuards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n document.body.insertAdjacentElement(\n \"afterbegin\",\n edgeGuards[0] ?? createFocusGuard(),\n );\n document.body.insertAdjacentElement(\n \"beforeend\",\n edgeGuards[1] ?? createFocusGuard(),\n );\n focusGuardCount++;\n\n return () => {\n if (focusGuardCount === 1) {\n const guards = document.querySelectorAll(\"[data-tour-focus-guard]\");\n for (const node of guards) {\n node.remove();\n }\n }\n focusGuardCount--;\n };\n }, []);\n}\n\nfunction useFocusTrap(\n containerRef: React.RefObject<HTMLElement | null>,\n enabled: boolean,\n tourOpen: boolean,\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void,\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void,\n) {\n const lastFocusedElementRef = React.useRef<HTMLElement | null>(null);\n const onOpenAutoFocusRef = useAsRef(onOpenAutoFocus);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n const tourOpenRef = useAsRef(tourOpen);\n\n React.useEffect(() => {\n if (!enabled) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const previouslyFocusedElement =\n document.activeElement as HTMLElement | null;\n\n function getTabbableCandidates() {\n if (!container) return [];\n\n const nodes: HTMLElement[] = [];\n const walker = document.createTreeWalker(\n container,\n NodeFilter.SHOW_ELEMENT,\n {\n acceptNode: (node: Element) => {\n const element = node as HTMLElement;\n const isHiddenInput =\n element.tagName === \"INPUT\" &&\n (element as HTMLInputElement).type === \"hidden\";\n if (element.hidden || isHiddenInput) return NodeFilter.FILTER_SKIP;\n return element.tabIndex >= 0\n ? NodeFilter.FILTER_ACCEPT\n : NodeFilter.FILTER_SKIP;\n },\n },\n );\n while (walker.nextNode()) {\n nodes.push(walker.currentNode as HTMLElement);\n }\n return nodes;\n }\n\n function getTabbableEdges() {\n const candidates = getTabbableCandidates();\n const first = candidates[0];\n const last = candidates[candidates.length - 1];\n return [first, last] as const;\n }\n\n function onFocusIn(event: FocusEvent) {\n if (!container) return;\n\n const target = event.target as HTMLElement | null;\n if (container.contains(target)) {\n lastFocusedElementRef.current = target;\n } else {\n const elementToFocus =\n lastFocusedElementRef.current ?? getTabbableCandidates()[0];\n elementToFocus?.focus({ preventScroll: true });\n }\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key !== \"Tab\" || event.altKey || event.ctrlKey || event.metaKey)\n return;\n\n const [first, last] = getTabbableEdges();\n const hasTabbableElements = first && last;\n\n if (!hasTabbableElements) {\n if (document.activeElement === container) event.preventDefault();\n return;\n }\n\n if (!event.shiftKey && document.activeElement === last) {\n event.preventDefault();\n first?.focus({ preventScroll: true });\n } else if (event.shiftKey && document.activeElement === first) {\n event.preventDefault();\n last?.focus({ preventScroll: true });\n }\n }\n\n const openAutoFocusEvent = new CustomEvent(OPEN_AUTO_FOCUS, EVENT_OPTIONS);\n if (onOpenAutoFocusRef.current) {\n container.addEventListener(\n OPEN_AUTO_FOCUS,\n onOpenAutoFocusRef.current as EventListener,\n { once: true },\n );\n }\n container.dispatchEvent(openAutoFocusEvent);\n\n if (!openAutoFocusEvent.defaultPrevented) {\n const tabbableCandidates = getTabbableCandidates();\n if (tabbableCandidates.length > 0) {\n tabbableCandidates[0]?.focus({ preventScroll: true });\n } else {\n container.focus({ preventScroll: true });\n }\n }\n\n document.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"keydown\", onKeyDown);\n\n return () => {\n document.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"keydown\", onKeyDown);\n\n if (!tourOpenRef.current) {\n setTimeout(() => {\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS,\n );\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true },\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n if (\n previouslyFocusedElement &&\n document.body.contains(previouslyFocusedElement)\n ) {\n previouslyFocusedElement.focus({ preventScroll: true });\n }\n }\n\n if (onCloseAutoFocusRef.current) {\n container.removeEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n );\n }\n }, 0);\n }\n };\n }, [\n containerRef,\n enabled,\n onOpenAutoFocusRef,\n onCloseAutoFocusRef,\n tourOpenRef,\n ]);\n}\n\nconst DirectionContext = React.createContext<Direction | undefined>(undefined);\n\nfunction useDirection(dirProp?: Direction): Direction {\n const contextDir = React.useContext(DirectionContext);\n return dirProp ?? contextDir ?? \"ltr\";\n}\n\nfunction getDataState(open: boolean): string {\n return open ? \"open\" : \"closed\";\n}\n\ninterface StepData {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n align?: Align;\n alignOffset?: number;\n side?: Side;\n sideOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n required?: boolean;\n}\n\ninterface StoreState {\n open: boolean;\n value: number;\n steps: StepData[];\n maskPath: string;\n spotlightRect: { x: number; y: number; width: number; height: number } | null;\n}\n\ninterface Store {\n subscribe: (callback: () => void) => () => void;\n getState: () => StoreState;\n setState: <K extends keyof StoreState>(\n key: K,\n value: StoreState[K],\n opts?: unknown,\n ) => void;\n notify: () => void;\n addStep: (stepData: StepData) => { id: string; index: number };\n removeStep: (id: string) => void;\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\nfunction getTargetElement(\n target: string | React.RefObject<HTMLElement> | HTMLElement,\n): HTMLElement | null {\n if (typeof target === \"string\") {\n return document.querySelector(target);\n }\n if (target && \"current\" in target) {\n return target.current;\n }\n if (target instanceof HTMLElement) {\n return target;\n }\n return null;\n}\n\nfunction getDefaultScrollBehavior(): ScrollBehavior {\n if (typeof window === \"undefined\") return \"smooth\";\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches\n ? \"auto\"\n : \"smooth\";\n}\n\nfunction onScrollToElement(\n element: HTMLElement,\n scrollBehavior: ScrollBehavior = getDefaultScrollBehavior(),\n scrollOffset?: ScrollOffset,\n) {\n const offset: Required<ScrollOffset> = {\n top: 100,\n bottom: 100,\n left: 0,\n right: 0,\n ...scrollOffset,\n };\n const rect = element.getBoundingClientRect();\n const viewportHeight = window.innerHeight;\n const viewportWidth = window.innerWidth;\n\n const isInViewport =\n rect.top >= offset.top &&\n rect.bottom <= viewportHeight - offset.bottom &&\n rect.left >= offset.left &&\n rect.right <= viewportWidth - offset.right;\n\n if (!isInViewport) {\n const elementTop = rect.top + window.scrollY;\n const scrollTop = elementTop - offset.top;\n\n window.scrollTo({\n top: Math.max(0, scrollTop),\n behavior: scrollBehavior,\n });\n }\n}\n\nfunction getSideAndAlignFromPlacement(placement: Placement): [Side, Align] {\n const [side, align = \"center\"] = placement.split(\"-\") as [Side, Align?];\n return [side, align];\n}\n\nfunction getPlacement(side: Side, align: Align): Placement {\n if (align === \"center\") {\n return side as Placement;\n }\n return `${side}-${align}` as Placement;\n}\n\nfunction updateMask(\n store: Store,\n targetElement: HTMLElement,\n padding: number = DEFAULT_SPOTLIGHT_PADDING,\n) {\n const clientRect = targetElement.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n const x = Math.max(0, clientRect.left - padding);\n const y = Math.max(0, clientRect.top - padding);\n const width = Math.min(viewportWidth - x, clientRect.width + padding * 2);\n const height = Math.min(viewportHeight - y, clientRect.height + padding * 2);\n\n const path = `polygon(0% 0%, 0% 100%, ${x}px 100%, ${x}px ${y}px, ${x + width}px ${y}px, ${x + width}px ${y + height}px, ${x}px ${y + height}px, ${x}px 100%, 100% 100%, 100% 0%)`;\n store.setState(\"maskPath\", path);\n store.setState(\"spotlightRect\", { x, y, width, height });\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\ninterface TourContextValue {\n dir: Direction;\n alignOffset: number;\n sideOffset: number;\n spotlightPadding: number;\n dismissible: boolean;\n modal: boolean;\n stepFooter?: React.ReactElement;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n}\n\nconst TourContext = React.createContext<TourContextValue | null>(null);\n\nfunction useTourContext(consumerName: string) {\n const context = React.useContext(TourContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\ninterface StepContextValue {\n arrowX?: number;\n arrowY?: number;\n placedAlign: Align;\n placedSide: Side;\n shouldHideArrow: boolean;\n onArrowChange: (arrow: HTMLSpanElement | null) => void;\n onFooterChange: (footer: FooterElement | null) => void;\n}\n\nconst StepContext = React.createContext<StepContextValue | null>(null);\n\nfunction useStepContext(consumerName: string) {\n const context = React.useContext(StepContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${STEP_NAME}\\``);\n }\n return context;\n}\n\nconst DefaultFooterContext = React.createContext(false);\n\ninterface PortalContextValue {\n portal: HTMLElement | null;\n onPortalChange: (node: HTMLElement | null) => void;\n}\n\nconst PortalContext = React.createContext<PortalContextValue | null>(null);\n\nfunction usePortalContext(consumerName: string) {\n const context = React.useContext(PortalContext);\n if (!context) {\n throw new Error(`\\`${consumerName}\\` must be used within \\`${ROOT_NAME}\\``);\n }\n return context;\n}\n\nfunction useScrollLock(enabled: boolean) {\n React.useEffect(() => {\n if (!enabled) return;\n\n const originalStyle = window.getComputedStyle(document.body).overflow;\n const scrollbarWidth =\n window.innerWidth - document.documentElement.clientWidth;\n\n document.body.style.overflow = \"hidden\";\n if (scrollbarWidth > 0) {\n document.body.style.paddingRight = `${scrollbarWidth}px`;\n }\n\n return () => {\n document.body.style.overflow = originalStyle;\n document.body.style.paddingRight = \"\";\n };\n }, [enabled]);\n}\n\ntype PointerDownOutsideEvent = CustomEvent<{ originalEvent: PointerEvent }>;\ntype InteractOutsideEvent = CustomEvent<{\n originalEvent: PointerEvent | FocusEvent;\n}>;\ntype OpenAutoFocusEvent = CustomEvent<Record<string, never>>;\ntype CloseAutoFocusEvent = CustomEvent<Record<string, never>>;\n\ninterface TourRootProps extends DivProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n value?: number;\n defaultValue?: number;\n onValueChange?: (step: number) => void;\n onComplete?: () => void;\n onSkip?: () => void;\n onEscapeKeyDown?: (event: KeyboardEvent) => void;\n onPointerDownOutside?: (event: PointerDownOutsideEvent) => void;\n onInteractOutside?: (event: InteractOutsideEvent) => void;\n onOpenAutoFocus?: (event: OpenAutoFocusEvent) => void;\n onCloseAutoFocus?: (event: CloseAutoFocusEvent) => void;\n dir?: Direction;\n alignOffset?: number;\n sideOffset?: number;\n spotlightPadding?: number;\n autoScroll?: boolean;\n scrollBehavior?: ScrollBehavior;\n scrollOffset?: ScrollOffset;\n dismissible?: boolean;\n modal?: boolean;\n stepFooter?: React.ReactElement;\n}\n\nfunction TourRoot(props: TourRootProps) {\n const {\n open: openProp,\n defaultOpen = false,\n onOpenChange,\n value: valueProp,\n defaultValue = 0,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll = true,\n scrollBehavior = getDefaultScrollBehavior(),\n scrollOffset,\n ...rootProps\n } = props;\n\n const stateRef = useLazyRef<StoreState>(() => ({\n open: openProp ?? defaultOpen,\n value: valueProp ?? defaultValue,\n steps: [],\n maskPath: \"\",\n spotlightRect: null,\n }));\n const listenersRef = useLazyRef<Set<() => void>>(() => new Set());\n const stepIdsMapRef = useLazyRef<Map<string, number>>(() => new Map());\n const stepIdCounterRef = useLazyRef(() => ({ current: 0 }));\n const propsRef = useAsRef({\n valueProp,\n onOpenChange,\n onValueChange,\n onComplete,\n onSkip,\n autoScroll,\n scrollBehavior,\n scrollOffset,\n });\n\n const store: Store = React.useMemo(\n () => ({\n subscribe: (cb) => {\n listenersRef.current.add(cb);\n return () => listenersRef.current.delete(cb);\n },\n getState: () => {\n return stateRef.current;\n },\n setState: (key, value) => {\n if (Object.is(stateRef.current[key], value)) return;\n stateRef.current[key] = value;\n\n if (key === \"open\" && typeof value === \"boolean\") {\n propsRef.current.onOpenChange?.(value);\n\n if (value) {\n if (stateRef.current.steps.length > 0) {\n if (stateRef.current.value >= stateRef.current.steps.length) {\n store.setState(\"value\", 0);\n }\n }\n } else {\n if (\n stateRef.current.value <\n (stateRef.current.steps.length || 0) - 1\n ) {\n propsRef.current.onSkip?.();\n }\n }\n } else if (key === \"value\" && typeof value === \"number\") {\n const prevStep = stateRef.current.steps[stateRef.current.value];\n const nextStep = stateRef.current.steps[value];\n\n prevStep?.onStepLeave?.();\n nextStep?.onStepEnter?.();\n\n if (value >= stateRef.current.steps.length) {\n propsRef.current.onComplete?.();\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n }\n\n store.setState(\"open\", false);\n return;\n }\n\n if (propsRef.current.valueProp !== undefined) {\n propsRef.current.onValueChange?.(value);\n return;\n }\n\n propsRef.current.onValueChange?.(value);\n\n if (nextStep && propsRef.current.autoScroll) {\n const targetElement = getTargetElement(nextStep.target);\n if (targetElement) {\n onScrollToElement(\n targetElement,\n propsRef.current.scrollBehavior,\n propsRef.current.scrollOffset,\n );\n }\n }\n }\n\n store.notify();\n },\n notify: () => {\n listenersRef.current.forEach((l) => {\n l();\n });\n },\n addStep: (stepData) => {\n const id = `step-${stepIdCounterRef.current.current++}`;\n const index = stateRef.current.steps.length;\n stepIdsMapRef.current.set(id, index);\n stateRef.current.steps = [...stateRef.current.steps, stepData];\n store.notify();\n return { id, index };\n },\n removeStep: (id) => {\n const index = stepIdsMapRef.current.get(id);\n if (index === undefined) return;\n\n stateRef.current.steps = stateRef.current.steps.filter(\n (_, i) => i !== index,\n );\n\n stepIdsMapRef.current.delete(id);\n\n for (const [stepId, stepIndex] of stepIdsMapRef.current.entries()) {\n if (stepIndex > index) {\n stepIdsMapRef.current.set(stepId, stepIndex - 1);\n }\n }\n\n store.notify();\n },\n }),\n [stateRef, listenersRef, stepIdsMapRef, stepIdCounterRef, propsRef],\n );\n\n useIsomorphicLayoutEffect(() => {\n if (openProp !== undefined) {\n store.setState(\"open\", openProp);\n }\n }, [openProp, store]);\n\n useIsomorphicLayoutEffect(() => {\n if (valueProp !== undefined) {\n store.setState(\"value\", valueProp);\n }\n }, [valueProp, store]);\n\n return (\n <StoreContext.Provider value={store}>\n <TourRootImpl {...rootProps} />\n </StoreContext.Provider>\n );\n}\n\ninterface TourRootImplProps extends Omit<\n TourRootProps,\n | \"open\"\n | \"defaultOpen\"\n | \"onOpenChange\"\n | \"value\"\n | \"defaultValue\"\n | \"onValueChange\"\n | \"onComplete\"\n | \"onSkip\"\n | \"autoScroll\"\n | \"scrollBehavior\"\n | \"scrollOffset\"\n> {}\n\nfunction TourRootImpl(props: TourRootImplProps) {\n const {\n onEscapeKeyDown,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n dir: dirProp,\n alignOffset = DEFAULT_ALIGN_OFFSET,\n sideOffset = DEFAULT_SIDE_OFFSET,\n spotlightPadding = DEFAULT_SPOTLIGHT_PADDING,\n dismissible = true,\n modal = true,\n stepFooter,\n asChild,\n ...rootImplProps\n } = props;\n\n const store = useStoreContext(\"TourRootImpl\");\n const dir = useDirection(dirProp);\n\n const [portal, setPortal] = React.useState<HTMLElement | null>(null);\n const previouslyFocusedElementRef = React.useRef<HTMLElement | null>(null);\n\n const onEscapeKeyDownRef = useAsRef(onEscapeKeyDown);\n const onCloseAutoFocusRef = useAsRef(onCloseAutoFocus);\n\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent) {\n if (store.getState().open && event.key === \"Escape\") {\n if (onEscapeKeyDownRef.current) {\n onEscapeKeyDownRef.current(event);\n if (event.defaultPrevented) return;\n }\n store.setState(\"open\", false);\n }\n }\n\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [store, onEscapeKeyDownRef]);\n\n const open = useStore((state) => state.open);\n const prevOpenRef = React.useRef<boolean | undefined>(undefined);\n\n useIsomorphicLayoutEffect(() => {\n const wasOpen = prevOpenRef.current;\n\n if (open && !wasOpen) {\n previouslyFocusedElementRef.current =\n document.activeElement as HTMLElement | null;\n } else if (!open && wasOpen) {\n setTimeout(() => {\n const container = portal ?? document.body;\n const closeAutoFocusEvent = new CustomEvent(\n CLOSE_AUTO_FOCUS,\n EVENT_OPTIONS,\n );\n\n if (onCloseAutoFocusRef.current) {\n container.addEventListener(\n CLOSE_AUTO_FOCUS,\n onCloseAutoFocusRef.current as EventListener,\n { once: true },\n );\n }\n container.dispatchEvent(closeAutoFocusEvent);\n\n if (!closeAutoFocusEvent.defaultPrevented) {\n const elementToFocus = previouslyFocusedElementRef.current;\n if (elementToFocus && document.body.contains(elementToFocus)) {\n elementToFocus.focus({ preventScroll: true });\n }\n }\n\n previouslyFocusedElementRef.current = null;\n }, 0);\n }\n\n prevOpenRef.current = open;\n }, [open, portal, onCloseAutoFocusRef]);\n\n const contextValue = React.useMemo<TourContextValue>(\n () => ({\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n }),\n [\n dir,\n alignOffset,\n sideOffset,\n spotlightPadding,\n dismissible,\n modal,\n stepFooter,\n onPointerDownOutside,\n onInteractOutside,\n onOpenAutoFocus,\n onCloseAutoFocus,\n ],\n );\n\n const portalContextValue = React.useMemo<PortalContextValue>(\n () => ({\n portal,\n onPortalChange: setPortal,\n }),\n [portal],\n );\n\n useScrollLock(open && modal);\n\n const RootPrimitive = asChild ? Slot : \"div\";\n\n return (\n <TourContext.Provider value={contextValue}>\n <PortalContext.Provider value={portalContextValue}>\n <RootPrimitive data-slot=\"tour\" dir={dir} {...rootImplProps} />\n </PortalContext.Provider>\n </TourContext.Provider>\n );\n}\n\ninterface TourStepProps extends DivProps {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n side?: Side;\n sideOffset?: number;\n align?: Align;\n alignOffset?: number;\n collisionBoundary?: Boundary | Boundary[];\n collisionPadding?: number | Partial<Record<Side, number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n required?: boolean;\n forceMount?: boolean;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n}\n\nfunction TourStep(props: TourStepProps) {\n const {\n target,\n side = \"bottom\",\n sideOffset,\n align = \"center\",\n alignOffset,\n collisionBoundary = [],\n collisionPadding = 0,\n arrowPadding = 0,\n sticky = \"partial\",\n hideWhenDetached = false,\n avoidCollisions = true,\n required = false,\n forceMount = false,\n onStepEnter,\n onStepLeave,\n onPointerDownCapture: onPointerDownCaptureProp,\n onFocusCapture: onFocusCaptureProp,\n onBlurCapture: onBlurCaptureProp,\n children,\n className,\n style,\n asChild,\n ...stepProps\n } = props;\n\n const store = useStoreContext(STEP_NAME);\n\n const [arrow, setArrow] = React.useState<HTMLSpanElement | null>(null);\n const [footer, setFooter] = React.useState<FooterElement | null>(null);\n\n const stepRef = React.useRef<StepElement | null>(null);\n const stepIdRef = React.useRef<string>(\"\");\n const stepOrderRef = React.useRef<number>(-1);\n const isPointerInsideReactTreeRef = React.useRef(false);\n const isFocusInsideReactTreeRef = React.useRef(false);\n\n const open = useStore((state) => state.open);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n const context = useTourContext(STEP_NAME);\n\n const resolvedSideOffset = sideOffset ?? context.sideOffset;\n const resolvedAlignOffset = alignOffset ?? context.alignOffset;\n\n useIsomorphicLayoutEffect(() => {\n const { id, index } = store.addStep({\n target,\n align,\n alignOffset: resolvedAlignOffset,\n side,\n sideOffset: resolvedSideOffset,\n collisionBoundary,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n onStepEnter,\n onStepLeave,\n required,\n });\n stepIdRef.current = id;\n stepOrderRef.current = index;\n\n return () => {\n store.removeStep(stepIdRef.current);\n };\n }, [\n target,\n side,\n resolvedSideOffset,\n align,\n resolvedAlignOffset,\n collisionPadding,\n arrowPadding,\n sticky,\n hideWhenDetached,\n avoidCollisions,\n required,\n onStepEnter,\n onStepLeave,\n store,\n ]);\n\n const stepData = steps[value];\n const targetElement = stepData ? getTargetElement(stepData.target) : null;\n\n const isCurrentStep = stepOrderRef.current === value;\n\n const middleware = React.useMemo(() => {\n if (!stepData) return [];\n\n const mainAxisOffset = stepData.sideOffset ?? resolvedSideOffset;\n const crossAxisOffset = stepData.alignOffset ?? resolvedAlignOffset;\n\n const padding =\n typeof stepData.collisionPadding === \"number\"\n ? stepData.collisionPadding\n : {\n top: stepData.collisionPadding?.top ?? 0,\n right: stepData.collisionPadding?.right ?? 0,\n bottom: stepData.collisionPadding?.bottom ?? 0,\n left: stepData.collisionPadding?.left ?? 0,\n };\n\n const boundary = Array.isArray(stepData.collisionBoundary)\n ? stepData.collisionBoundary\n : stepData.collisionBoundary\n ? [stepData.collisionBoundary]\n : [];\n const hasExplicitBoundaries = boundary.length > 0;\n\n const detectOverflowOptions = {\n padding,\n boundary: boundary.filter((b): b is Element => b !== null),\n altBoundary: hasExplicitBoundaries,\n };\n\n return [\n offset({\n mainAxis: mainAxisOffset,\n alignmentAxis: crossAxisOffset,\n }),\n stepData.avoidCollisions &&\n shift({\n mainAxis: true,\n crossAxis: false,\n limiter: stepData.sticky === \"partial\" ? limitShift() : undefined,\n ...detectOverflowOptions,\n }),\n stepData.avoidCollisions && flip({ ...detectOverflowOptions }),\n arrow && onArrow({ element: arrow, padding: stepData.arrowPadding }),\n stepData.hideWhenDetached &&\n hide({\n strategy: \"referenceHidden\",\n ...detectOverflowOptions,\n }),\n ].filter(Boolean) as Middleware[];\n }, [stepData, resolvedSideOffset, resolvedAlignOffset, arrow]);\n\n const placement = getPlacement(\n stepData?.side ?? side,\n stepData?.align ?? align,\n );\n\n const {\n refs,\n floatingStyles,\n placement: finalPlacement,\n middlewareData,\n } = useFloating({\n placement,\n middleware,\n strategy: \"fixed\",\n whileElementsMounted: autoUpdate,\n elements: {\n reference: targetElement,\n },\n });\n\n const composedRef = useComposedRefs(refs.setFloating, stepRef);\n\n const [placedSide, placedAlign] =\n getSideAndAlignFromPlacement(finalPlacement);\n\n const arrowX = middlewareData.arrow?.x;\n const arrowY = middlewareData.arrow?.y;\n const cannotCenterArrow = middlewareData.arrow?.centerOffset !== 0;\n const isHidden = hideWhenDetached && middlewareData.hide?.referenceHidden;\n\n const stepContextValue = React.useMemo<StepContextValue>(\n () => ({\n arrowX,\n arrowY,\n placedAlign,\n placedSide,\n shouldHideArrow: cannotCenterArrow,\n onArrowChange: setArrow,\n onFooterChange: setFooter,\n }),\n [arrowX, arrowY, placedSide, placedAlign, cannotCenterArrow],\n );\n\n React.useEffect(() => {\n if (open && targetElement && isCurrentStep) {\n updateMask(store, targetElement, context.spotlightPadding);\n\n let rafId: number | null = null;\n\n function onResize() {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n }\n\n function onScroll() {\n if (rafId !== null) return;\n rafId = requestAnimationFrame(() => {\n if (targetElement) {\n updateMask(store, targetElement, context.spotlightPadding);\n }\n rafId = null;\n });\n }\n\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"scroll\", onScroll, { passive: true });\n return () => {\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"scroll\", onScroll);\n if (rafId !== null) {\n cancelAnimationFrame(rafId);\n }\n };\n }\n }, [open, targetElement, isCurrentStep, store, context.spotlightPadding]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onPointerDown(event: PointerEvent) {\n if (event.target && !isPointerInsideReactTreeRef.current) {\n const pointerDownOutsideEvent = new CustomEvent(POINTER_DOWN_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onPointerDownOutside?.(pointerDownOutsideEvent);\n\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (\n !pointerDownOutsideEvent.defaultPrevented &&\n !interactOutsideEvent.defaultPrevented &&\n context.dismissible\n ) {\n store.setState(\"open\", false);\n }\n }\n\n isPointerInsideReactTreeRef.current = false;\n }\n\n const timerId = window.setTimeout(() => {\n ownerDocument.addEventListener(\"pointerdown\", onPointerDown);\n }, 0);\n\n return () => {\n window.clearTimeout(timerId);\n ownerDocument.removeEventListener(\"pointerdown\", onPointerDown);\n };\n }, [open, isCurrentStep, store, context]);\n\n React.useEffect(() => {\n if (!open || !isCurrentStep) return;\n\n const stepElement = stepRef.current;\n if (!stepElement) return;\n\n const ownerDocument = stepElement.ownerDocument;\n\n function onFocusIn(event: FocusEvent) {\n const target = event.target as HTMLElement;\n\n const isFocusInStep = stepElement?.contains(target);\n const isFocusInTarget = targetElement?.contains(target);\n\n if (\n event.target &&\n !isFocusInsideReactTreeRef.current &&\n !isFocusInStep &&\n !isFocusInTarget\n ) {\n const interactOutsideEvent = new CustomEvent(INTERACT_OUTSIDE, {\n ...EVENT_OPTIONS,\n detail: { originalEvent: event },\n });\n\n context.onInteractOutside?.(interactOutsideEvent);\n\n if (!interactOutsideEvent.defaultPrevented && context.dismissible) {\n store.setState(\"open\", false);\n }\n }\n }\n\n ownerDocument.addEventListener(\"focusin\", onFocusIn);\n\n return () => {\n ownerDocument.removeEventListener(\"focusin\", onFocusIn);\n };\n }, [open, isCurrentStep, store, context, targetElement]);\n\n const onPointerDownCapture = React.useCallback(\n (event: React.PointerEvent<StepElement>) => {\n onPointerDownCaptureProp?.(event);\n isPointerInsideReactTreeRef.current = true;\n },\n [onPointerDownCaptureProp],\n );\n\n const onFocusCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onFocusCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = true;\n },\n [onFocusCaptureProp],\n );\n\n const onBlurCapture = React.useCallback(\n (event: React.FocusEvent<StepElement>) => {\n onBlurCaptureProp?.(event);\n isFocusInsideReactTreeRef.current = false;\n },\n [onBlurCaptureProp],\n );\n\n React.useEffect(() => {\n if (!open || !isCurrentStep || !targetElement) return;\n\n function onTargetPointerDownCapture() {\n isPointerInsideReactTreeRef.current = true;\n }\n\n function onTargetFocusCapture() {\n isFocusInsideReactTreeRef.current = true;\n }\n\n function onTargetBlurCapture() {\n isFocusInsideReactTreeRef.current = false;\n }\n\n targetElement.addEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true,\n );\n targetElement.addEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.addEventListener(\"blur\", onTargetBlurCapture, true);\n\n return () => {\n targetElement.removeEventListener(\n \"pointerdown\",\n onTargetPointerDownCapture,\n true,\n );\n targetElement.removeEventListener(\"focus\", onTargetFocusCapture, true);\n targetElement.removeEventListener(\"blur\", onTargetBlurCapture, true);\n };\n }, [open, isCurrentStep, targetElement]);\n\n useFocusGuards();\n useFocusTrap(\n stepRef,\n open && isCurrentStep,\n open,\n context.onOpenAutoFocus,\n context.onCloseAutoFocus,\n );\n\n if (!open || !stepData || (!targetElement && !forceMount) || !isCurrentStep) {\n return null;\n }\n\n const StepPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepContext.Provider value={stepContextValue}>\n <StepPrimitive\n ref={composedRef}\n data-slot=\"tour-step\"\n data-side={placedSide}\n data-align={placedAlign}\n dir={context.dir}\n tabIndex={-1}\n {...stepProps}\n onPointerDownCapture={onPointerDownCapture}\n onFocusCapture={onFocusCapture}\n onBlurCapture={onBlurCapture}\n className={cn(\n \"fixed z-50 flex w-80 flex-col gap-4 rounded-lg border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n className,\n )}\n style={{\n ...style,\n ...floatingStyles,\n visibility: isHidden ? \"hidden\" : undefined,\n pointerEvents: isHidden ? \"none\" : undefined,\n }}\n >\n {children}\n {!footer && (\n <DefaultFooterContext.Provider value={true}>\n {context.stepFooter}\n </DefaultFooterContext.Provider>\n )}\n </StepPrimitive>\n </StepContext.Provider>\n );\n}\n\ninterface TourSpotlightProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlight(props: TourSpotlightProps) {\n const {\n asChild,\n className,\n style,\n forceMount = false,\n ...backdropProps\n } = props;\n\n const open = useStore((state) => state.open);\n const maskPath = useStore((state) => state.maskPath);\n\n if (!open && !forceMount) return null;\n\n const SpotlightPrimitive = asChild ? Slot : \"div\";\n\n return (\n <SpotlightPrimitive\n data-slot=\"tour-spotlight\"\n data-state={getDataState(open)}\n {...backdropProps}\n className={cn(\n \"data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-40 bg-black/80 data-[state=closed]:animate-out data-[state=open]:animate-in\",\n className,\n )}\n style={{\n clipPath: maskPath,\n ...style,\n }}\n />\n );\n}\n\ninterface TourSpotlightRingProps extends DivProps {\n forceMount?: boolean;\n}\n\nfunction TourSpotlightRing(props: TourSpotlightRingProps) {\n const { asChild, className, style, forceMount = false, ...ringProps } = props;\n\n const open = useStore((state) => state.open);\n const spotlightRect = useStore((state) => state.spotlightRect);\n\n if (!open && !forceMount) return null;\n if (!spotlightRect) return null;\n\n const RingPrimitive = asChild ? Slot : \"div\";\n\n return (\n <RingPrimitive\n data-slot=\"tour-spotlight-ring\"\n data-state={getDataState(open)}\n {...ringProps}\n className={cn(\n \"pointer-events-none fixed z-40 border-ring ring-[3px] ring-ring/50\",\n className,\n )}\n style={{\n left: spotlightRect.x,\n top: spotlightRect.y,\n width: spotlightRect.width,\n height: spotlightRect.height,\n ...style,\n }}\n />\n );\n}\n\ninterface TourPortalProps {\n children?: React.ReactNode;\n container?: HTMLElement | null;\n}\n\nfunction TourPortal(props: TourPortalProps) {\n const { children, container } = props;\n\n const portalContext = usePortalContext(PORTAL_NAME);\n\n const [mounted, setMounted] = React.useState(false);\n\n useIsomorphicLayoutEffect(() => {\n setMounted(true);\n\n const node = container ?? document.body;\n\n portalContext?.onPortalChange(node);\n return () => {\n portalContext?.onPortalChange(null);\n };\n }, [container, portalContext]);\n\n if (!mounted) return null;\n\n const portalContainer = container ?? portalContext?.portal ?? document.body;\n\n return ReactDOM.createPortal(children, portalContainer);\n}\n\ninterface TourArrowProps extends React.ComponentProps<\"svg\"> {\n width?: number;\n height?: number;\n asChild?: boolean;\n}\n\nfunction TourArrow(props: TourArrowProps) {\n const {\n width = 10,\n height = 5,\n className,\n children,\n asChild,\n ...arrowProps\n } = props;\n\n const stepContext = useStepContext(ARROW_NAME);\n const baseSide = OPPOSITE_SIDE[stepContext.placedSide];\n\n return (\n <span\n ref={stepContext.onArrowChange}\n data-slot=\"tour-arrow\"\n style={{\n position: \"absolute\",\n left:\n stepContext.arrowX != null ? `${stepContext.arrowX}px` : undefined,\n top: stepContext.arrowY != null ? `${stepContext.arrowY}px` : undefined,\n [baseSide]: 0,\n transformOrigin: {\n top: \"\",\n right: \"0 0\",\n bottom: \"center 0\",\n left: \"100% 0\",\n }[stepContext.placedSide],\n transform: {\n top: \"translateY(100%)\",\n right: \"translateY(50%) rotate(90deg) translateX(-50%)\",\n bottom: \"rotate(180deg)\",\n left: \"translateY(50%) rotate(-90deg) translateX(50%)\",\n }[stepContext.placedSide],\n visibility: stepContext.shouldHideArrow ? \"hidden\" : undefined,\n }}\n >\n <svg\n viewBox=\"0 0 30 10\"\n preserveAspectRatio=\"none\"\n width={width}\n height={height}\n {...arrowProps}\n className={cn(\"block fill-popover stroke-border\", className)}\n >\n {asChild ? children : <polygon points=\"0,0 30,0 15,10\" />}\n </svg>\n </span>\n );\n}\n\nfunction TourHeader(props: DivProps) {\n const { asChild, className, ...headerProps } = props;\n\n const context = useTourContext(HEADER_NAME);\n\n const HeaderPrimitive = asChild ? Slot : \"div\";\n\n return (\n <HeaderPrimitive\n data-slot=\"tour-header\"\n dir={context.dir}\n {...headerProps}\n className={cn(\n \"flex flex-col gap-1.5 text-center sm:text-left\",\n className,\n )}\n />\n );\n}\n\nfunction TourTitle(props: DivProps) {\n const { asChild, className, ...titleProps } = props;\n\n const context = useTourContext(TITLE_NAME);\n\n const TitlePrimitive = asChild ? Slot : \"div\";\n\n return (\n <TitlePrimitive\n data-slot=\"tour-title\"\n dir={context.dir}\n {...titleProps}\n className={cn(\n \"font-semibold text-lg leading-none tracking-tight\",\n className,\n )}\n />\n );\n}\n\nfunction TourDescription(props: DivProps) {\n const { asChild, className, ...descriptionProps } = props;\n\n const context = useTourContext(DESCRIPTION_NAME);\n\n const DescriptionPrimitive = asChild ? Slot : \"div\";\n\n return (\n <DescriptionPrimitive\n data-slot=\"tour-description\"\n dir={context.dir}\n {...descriptionProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n />\n );\n}\n\ninterface TourCloseProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nfunction TourClose(props: TourCloseProps) {\n const {\n asChild,\n className,\n onClick: onClickProp,\n ...closeButtonProps\n } = props;\n\n const store = useStoreContext(CLOSE_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<CloseElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp],\n );\n\n const ClosePrimitive = asChild ? Slot : \"button\";\n\n return (\n <ClosePrimitive\n type=\"button\"\n aria-label=\"Close tour\"\n className={cn(\n \"absolute top-4 right-4 rounded-xs opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-hidden focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none [&_svg:not([class*='size-'])]:size-4 [&_svg]:pointer-events-none [&_svg]:shrink-0\",\n className,\n )}\n onClick={onClick}\n {...closeButtonProps}\n >\n <X className=\"size-4\" />\n </ClosePrimitive>\n );\n}\n\nfunction TourPrev(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...prevButtonProps } = props;\n\n const store = useStoreContext(PREV_NAME);\n const value = useStore((state) => state.value);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<PrevElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n if (value > 0) {\n store.setState(\"value\", value - 1);\n }\n },\n [value, store, onClickProp],\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Previous step\"\n data-slot=\"tour-prev\"\n variant=\"outline\"\n {...prevButtonProps}\n onClick={onClick}\n disabled={value === 0}\n >\n {children ?? (\n <>\n <ChevronLeft />\n Previous\n </>\n )}\n </Button>\n );\n}\n\nfunction TourNext(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...nextButtonProps } = props;\n const store = useStoreContext(NEXT_NAME);\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const isLastStep = value === steps.length - 1;\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<NextElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"value\", value + 1);\n },\n [value, store, onClickProp],\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Next step\"\n data-slot=\"tour-next\"\n {...nextButtonProps}\n onClick={onClick}\n >\n {children ?? (\n <>\n {isLastStep ? \"Finish\" : \"Next\"}\n {!isLastStep && <ChevronRight />}\n </>\n )}\n </Button>\n );\n}\n\nfunction TourSkip(props: React.ComponentProps<typeof Button>) {\n const { children, onClick: onClickProp, ...skipButtonProps } = props;\n\n const store = useStoreContext(SKIP_NAME);\n\n const onClick = React.useCallback(\n (event: React.MouseEvent<SkipElement>) => {\n onClickProp?.(event);\n if (event.defaultPrevented) return;\n\n store.setState(\"open\", false);\n },\n [store, onClickProp],\n );\n\n return (\n <Button\n type=\"button\"\n aria-label=\"Skip tour\"\n data-slot=\"tour-skip\"\n variant=\"outline\"\n {...skipButtonProps}\n onClick={onClick}\n >\n {children ?? \"Skip\"}\n </Button>\n );\n}\n\ninterface TourStepCounterProps extends DivProps {\n format?: (current: number, total: number) => string;\n}\n\nfunction TourStepCounter(props: TourStepCounterProps) {\n const {\n format = (current, total) => `${current} / ${total}`,\n asChild,\n className,\n children,\n ...stepCounterProps\n } = props;\n\n const value = useStore((state) => state.value);\n const steps = useStore((state) => state.steps);\n\n const StepCounterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <StepCounterPrimitive\n data-slot=\"tour-step-counter\"\n {...stepCounterProps}\n className={cn(\"text-muted-foreground text-sm\", className)}\n >\n {children ?? format(value + 1, steps.length)}\n </StepCounterPrimitive>\n );\n}\n\nfunction TourFooter(props: DivProps) {\n const { asChild, className, ref, ...footerProps } = props;\n\n const stepContext = useStepContext(FOOTER_NAME);\n const hasDefaultFooter = React.useContext(DefaultFooterContext);\n const context = useTourContext(FOOTER_NAME);\n\n const composedRef = useComposedRefs(\n ref,\n hasDefaultFooter ? undefined : stepContext.onFooterChange,\n );\n\n const FooterPrimitive = asChild ? Slot : \"div\";\n\n return (\n <FooterPrimitive\n data-slot=\"tour-footer\"\n dir={context.dir}\n {...footerProps}\n ref={composedRef}\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className,\n )}\n />\n );\n}\n\nexport {\n TourRoot as Root,\n TourPortal as Portal,\n TourSpotlight as Spotlight,\n TourSpotlightRing as SpotlightRing,\n TourStep as Step,\n TourArrow as Arrow,\n TourHeader as Header,\n TourTitle as Title,\n TourDescription as Description,\n TourClose as Close,\n TourPrev as Prev,\n TourNext as Next,\n TourSkip as Skip,\n TourStepCounter as StepCounter,\n TourFooter as Footer,\n //\n TourRoot as Tour,\n TourPortal,\n TourSpotlight,\n TourSpotlightRing,\n TourStep,\n TourArrow,\n TourHeader,\n TourTitle,\n TourDescription,\n TourClose,\n TourPrev,\n TourNext,\n TourSkip,\n TourStepCounter,\n TourFooter,\n //\n type TourRootProps as TourProps,\n};\n"],"names":["ROOT_NAME","PORTAL_NAME","STEP_NAME","ARROW_NAME","HEADER_NAME","TITLE_NAME","DESCRIPTION_NAME","CLOSE_NAME","PREV_NAME","NEXT_NAME","SKIP_NAME","FOOTER_NAME","POINTER_DOWN_OUTSIDE","INTERACT_OUTSIDE","OPEN_AUTO_FOCUS","CLOSE_AUTO_FOCUS","EVENT_OPTIONS","DEFAULT_ALIGN_OFFSET","DEFAULT_SIDE_OFFSET","DEFAULT_SPOTLIGHT_PADDING","OPPOSITE_SIDE","useIsomorphicLayoutEffect","React","useAsRef","props","ref","useLazyRef","fn","focusGuardCount","createFocusGuard","element","useFocusGuards","edgeGuards","guards","node","useFocusTrap","containerRef","enabled","tourOpen","onOpenAutoFocus","onCloseAutoFocus","lastFocusedElementRef","onOpenAutoFocusRef","onCloseAutoFocusRef","tourOpenRef","container","previouslyFocusedElement","getTabbableCandidates","nodes","walker","isHiddenInput","getTabbableEdges","candidates","first","last","onFocusIn","event","target","onKeyDown","openAutoFocusEvent","tabbableCandidates","closeAutoFocusEvent","DirectionContext","useDirection","dirProp","contextDir","getDataState","open","useStore","selector","store","useStoreContext","getSnapshot","getTargetElement","getDefaultScrollBehavior","onScrollToElement","scrollBehavior","scrollOffset","offset","rect","viewportHeight","viewportWidth","scrollTop","getSideAndAlignFromPlacement","placement","side","align","getPlacement","updateMask","targetElement","padding","clientRect","x","y","width","height","path","StoreContext","consumerName","context","TourContext","useTourContext","StepContext","useStepContext","DefaultFooterContext","PortalContext","usePortalContext","useScrollLock","originalStyle","scrollbarWidth","TourRoot","openProp","defaultOpen","onOpenChange","valueProp","defaultValue","onValueChange","onComplete","onSkip","autoScroll","rootProps","stateRef","listenersRef","stepIdsMapRef","stepIdCounterRef","propsRef","cb","key","value","prevStep","nextStep","l","stepData","id","index","_","i","stepId","stepIndex","jsx","TourRootImpl","onEscapeKeyDown","onPointerDownOutside","onInteractOutside","alignOffset","sideOffset","spotlightPadding","dismissible","modal","stepFooter","asChild","rootImplProps","dir","portal","setPortal","previouslyFocusedElementRef","onEscapeKeyDownRef","state","prevOpenRef","wasOpen","elementToFocus","contextValue","portalContextValue","RootPrimitive","Slot","TourStep","collisionBoundary","collisionPadding","arrowPadding","sticky","hideWhenDetached","avoidCollisions","required","forceMount","onStepEnter","onStepLeave","onPointerDownCaptureProp","onFocusCaptureProp","onBlurCaptureProp","children","className","style","stepProps","arrow","setArrow","footer","setFooter","stepRef","stepIdRef","stepOrderRef","isPointerInsideReactTreeRef","isFocusInsideReactTreeRef","steps","resolvedSideOffset","resolvedAlignOffset","isCurrentStep","middleware","mainAxisOffset","crossAxisOffset","boundary","hasExplicitBoundaries","detectOverflowOptions","b","shift","limitShift","flip","onArrow","hide","refs","floatingStyles","finalPlacement","middlewareData","useFloating","autoUpdate","composedRef","useComposedRefs","placedSide","placedAlign","arrowX","arrowY","cannotCenterArrow","isHidden","stepContextValue","onResize","onScroll","rafId","stepElement","ownerDocument","onPointerDown","pointerDownOutsideEvent","interactOutsideEvent","timerId","isFocusInStep","isFocusInTarget","onPointerDownCapture","onFocusCapture","onBlurCapture","onTargetPointerDownCapture","onTargetFocusCapture","onTargetBlurCapture","StepPrimitive","jsxs","cn","TourSpotlight","backdropProps","maskPath","SpotlightPrimitive","TourSpotlightRing","ringProps","spotlightRect","RingPrimitive","TourPortal","portalContext","mounted","setMounted","portalContainer","ReactDOM","TourArrow","arrowProps","stepContext","baseSide","TourHeader","headerProps","HeaderPrimitive","TourTitle","titleProps","TitlePrimitive","TourDescription","descriptionProps","DescriptionPrimitive","TourClose","onClickProp","closeButtonProps","onClick","ClosePrimitive","X","TourPrev","prevButtonProps","Button","Fragment","ChevronLeft","TourNext","nextButtonProps","isLastStep","ChevronRight","TourSkip","skipButtonProps","TourStepCounter","format","current","total","stepCounterProps","StepCounterPrimitive","TourFooter","footerProps","hasDefaultFooter","FooterPrimitive"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("react/jsx-runtime");require("react");const r=require("./Tour.cjs");function t({steps:l,children:s,showSpotlight:c=!0,showSpotlightRing:o=!0,spotlightClassName:a,spotlightRingClassName:h,buttonConfig:n,...x}){return i.jsxs(r.Root,{...x,children:[i.jsxs(r.Portal,{children:[c&&i.jsxs(i.Fragment,{children:[i.jsx(r.Spotlight,{className:a}),o&&i.jsx(r.SpotlightRing,{className:h})]}),l&&l.length>0&&l.map((e,d)=>i.jsxs(r.Step,{target:e.target,side:e.side,align:e.align,alignOffset:e.alignOffset,sideOffset:e.sideOffset,collisionBoundary:e.collisionBoundary,collisionPadding:e.collisionPadding,arrowPadding:e.arrowPadding,sticky:e.sticky,hideWhenDetached:e.hideWhenDetached,avoidCollisions:e.avoidCollisions,required:e.required,forceMount:e.forceMount,onStepEnter:e.onStepEnter,onStepLeave:e.onStepLeave,children:[!e.hideArrow&&i.jsx(r.Arrow,{}),i.jsxs(r.Header,{children:[i.jsx(r.Title,{children:e.title}),!e.hideClose&&i.jsx(r.Close,{})]}),e.description&&i.jsx(r.Description,{children:e.description}),e.content&&i.jsx("div",{className:"py-2",children:e.content}),!e.hideFooter&&i.jsxs(r.Footer,{children:[i.jsxs("div",{className:"flex items-center gap-2",children:[!e.hideStepCounter&&i.jsx(r.StepCounter,{}),!e.hideSkip&&d===0&&(n?.skip?i.jsx(r.Skip,{children:n.skip}):i.jsx(r.Skip,{}))]}),i.jsxs("div",{className:"flex items-center gap-2",children:[d>0&&(n?.prev?i.jsx(r.Prev,{children:n.prev}):i.jsx(r.Prev,{})),n?.next?d===l.length-1&&n?.finish?i.jsx(r.Next,{children:n.finish}):i.jsx(r.Next,{children:n.next}):i.jsx(r.Next,{})]})]})]},d))]}),s]})}exports.TourWrapper=t;
2
+ //# sourceMappingURL=TourWrapper.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TourWrapper.cjs","sources":["../../../../src/components/Tour/TourWrapper.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n Root,\n Portal,\n Step,\n Arrow,\n Header,\n Title,\n Description,\n Close,\n Footer,\n Prev,\n Next,\n Skip,\n StepCounter,\n Spotlight,\n SpotlightRing,\n} from \"./Tour\";\nimport type { TourProps } from \"./Tour\";\n\ninterface TourStep {\n target: string | React.RefObject<HTMLElement> | HTMLElement;\n title: string;\n description?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n alignOffset?: number;\n sideOffset?: number;\n collisionBoundary?: Element | null | Array<Element | null>;\n collisionPadding?:\n | number\n | Partial<Record<\"top\" | \"right\" | \"bottom\" | \"left\", number>>;\n arrowPadding?: number;\n sticky?: \"partial\" | \"always\";\n hideWhenDetached?: boolean;\n avoidCollisions?: boolean;\n required?: boolean;\n forceMount?: boolean;\n hideArrow?: boolean;\n hideClose?: boolean;\n hideFooter?: boolean;\n hideSkip?: boolean;\n hideStepCounter?: boolean;\n content?: React.ReactNode;\n onStepEnter?: () => void;\n onStepLeave?: () => void;\n}\n\ninterface ButtonConfig {\n skip?: string;\n prev?: string;\n next?: string;\n finish?: string;\n}\n\ninterface TourWrapperProps extends Omit<TourProps, \"children\"> {\n steps?: TourStep[];\n children?: React.ReactNode;\n showSpotlight?: boolean;\n showSpotlightRing?: boolean;\n spotlightClassName?: string;\n spotlightRingClassName?: string;\n buttonConfig?: ButtonConfig;\n}\n\nfunction TourWrapper({\n steps,\n children,\n showSpotlight = true,\n showSpotlightRing = true,\n spotlightClassName,\n spotlightRingClassName,\n buttonConfig,\n ...props\n}: TourWrapperProps) {\n return (\n <Root {...props}>\n <Portal>\n {showSpotlight && (\n <>\n <Spotlight className={spotlightClassName} />\n {showSpotlightRing && (\n <SpotlightRing className={spotlightRingClassName} />\n )}\n </>\n )}\n\n {steps &&\n steps.length > 0 &&\n steps.map((step, index) => (\n <Step\n key={index}\n target={step.target}\n side={step.side}\n align={step.align}\n alignOffset={step.alignOffset}\n sideOffset={step.sideOffset}\n collisionBoundary={step.collisionBoundary}\n collisionPadding={step.collisionPadding}\n arrowPadding={step.arrowPadding}\n sticky={step.sticky}\n hideWhenDetached={step.hideWhenDetached}\n avoidCollisions={step.avoidCollisions}\n required={step.required}\n forceMount={step.forceMount}\n onStepEnter={step.onStepEnter}\n onStepLeave={step.onStepLeave}\n >\n {!step.hideArrow && <Arrow />}\n <Header>\n <Title>{step.title}</Title>\n {!step.hideClose && <Close />}\n </Header>\n {step.description && (\n <Description>{step.description}</Description>\n )}\n {step.content && <div className=\"py-2\">{step.content}</div>}\n {!step.hideFooter && (\n <Footer>\n <div className=\"flex items-center gap-2\">\n {!step.hideStepCounter && <StepCounter />}\n {!step.hideSkip &&\n index === 0 &&\n (buttonConfig?.skip ? (\n <Skip>{buttonConfig.skip}</Skip>\n ) : (\n <Skip />\n ))}\n </div>\n <div className=\"flex items-center gap-2\">\n {index > 0 &&\n (buttonConfig?.prev ? (\n <Prev>{buttonConfig.prev}</Prev>\n ) : (\n <Prev />\n ))}\n {buttonConfig?.next ? (\n index === steps.length - 1 && buttonConfig?.finish ? (\n <Next>{buttonConfig.finish}</Next>\n ) : (\n <Next>{buttonConfig.next}</Next>\n )\n ) : (\n <Next />\n )}\n </div>\n </Footer>\n )}\n </Step>\n ))}\n </Portal>\n\n {children}\n </Root>\n );\n}\n\nexport { TourWrapper };\nexport type { TourWrapperProps, TourStep, ButtonConfig };\n"],"names":["TourWrapper","steps","children","showSpotlight","showSpotlightRing","spotlightClassName","spotlightRingClassName","buttonConfig","props","jsxs","Root","Portal","Fragment","jsx","Spotlight","SpotlightRing","step","index","Step","Arrow","Header","Title","Close","Description","Footer","StepCounter","Skip","Prev","Next"],"mappings":"oKAmEA,SAASA,EAAY,CACnB,MAAAC,EACA,SAAAC,EACA,cAAAC,EAAgB,GAChB,kBAAAC,EAAoB,GACpB,mBAAAC,EACA,uBAAAC,EACA,aAAAC,EACA,GAAGC,CACL,EAAqB,CACnB,OACEC,EAAAA,KAACC,EAAAA,KAAA,CAAM,GAAGF,EACR,SAAA,CAAAC,OAACE,EAAAA,OAAA,CACE,SAAA,CAAAR,GACCM,EAAAA,KAAAG,WAAA,CACE,SAAA,CAAAC,EAAAA,IAACC,EAAAA,UAAA,CAAU,UAAWT,CAAA,CAAoB,EACzCD,GACCS,EAAAA,IAACE,EAAAA,cAAA,CAAc,UAAWT,CAAA,CAAwB,CAAA,EAEtD,EAGDL,GACCA,EAAM,OAAS,GACfA,EAAM,IAAI,CAACe,EAAMC,IACfR,EAAAA,KAACS,EAAAA,KAAA,CAEC,OAAQF,EAAK,OACb,KAAMA,EAAK,KACX,MAAOA,EAAK,MACZ,YAAaA,EAAK,YAClB,WAAYA,EAAK,WACjB,kBAAmBA,EAAK,kBACxB,iBAAkBA,EAAK,iBACvB,aAAcA,EAAK,aACnB,OAAQA,EAAK,OACb,iBAAkBA,EAAK,iBACvB,gBAAiBA,EAAK,gBACtB,SAAUA,EAAK,SACf,WAAYA,EAAK,WACjB,YAAaA,EAAK,YAClB,YAAaA,EAAK,YAEjB,SAAA,CAAA,CAACA,EAAK,WAAaH,MAACM,EAAAA,MAAA,CAAA,CAAM,SAC1BC,EAAAA,OAAA,CACC,SAAA,CAAAP,EAAAA,IAACQ,EAAAA,MAAA,CAAO,WAAK,KAAA,CAAM,EAClB,CAACL,EAAK,WAAaH,EAAAA,IAACS,EAAAA,MAAA,CAAA,CAAM,CAAA,EAC7B,EACCN,EAAK,aACJH,MAACU,EAAAA,YAAA,CAAa,WAAK,YAAY,EAEhCP,EAAK,SAAWH,EAAAA,IAAC,OAAI,UAAU,OAAQ,WAAK,QAAQ,EACpD,CAACG,EAAK,YACLP,EAAAA,KAACe,EAAAA,OAAA,CACC,SAAA,CAAAf,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAA,CAACO,EAAK,iBAAmBH,MAACY,EAAAA,YAAA,CAAA,CAAY,EACtC,CAACT,EAAK,UACLC,IAAU,IACTV,GAAc,KACbM,EAAAA,IAACa,EAAAA,KAAA,CAAM,SAAAnB,EAAa,IAAA,CAAK,QAExBmB,EAAAA,KAAA,EAAK,EAAA,EAEZ,EACAjB,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,CAAAQ,EAAQ,IACNV,GAAc,KACbM,EAAAA,IAACc,EAAAA,MAAM,SAAApB,EAAa,IAAA,CAAK,EAEzBM,EAAAA,IAACc,EAAAA,KAAA,CAAA,CAAK,GAETpB,GAAc,KACbU,IAAUhB,EAAM,OAAS,GAAKM,GAAc,OAC1CM,MAACe,EAAAA,MAAM,SAAArB,EAAa,OAAO,EAE3BM,MAACe,EAAAA,KAAA,CAAM,WAAa,IAAA,CAAK,QAG1BA,EAAAA,KAAA,CAAA,CAAK,CAAA,CAAA,CAEV,CAAA,CAAA,CACF,CAAA,CAAA,EAvDGX,CAAA,CA0DR,CAAA,EACL,EAECf,CAAA,EACH,CAEJ"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./Tour.cjs"),r=require("./TourWrapper.cjs"),t=Object.assign(r.TourWrapper,{Root:o.Root,Portal:o.Portal,Spotlight:o.Spotlight,SpotlightRing:o.SpotlightRing,Step:o.Step,Arrow:o.Arrow,Header:o.Header,Title:o.Title,Description:o.Description,Close:o.Close,Prev:o.Prev,Next:o.Next,Skip:o.Skip,StepCounter:o.StepCounter,Footer:o.Footer,TourPortal:o.Portal,TourSpotlight:o.Spotlight,TourSpotlightRing:o.SpotlightRing,TourStep:o.Step,TourArrow:o.Arrow,TourHeader:o.Header,TourTitle:o.Title,TourDescription:o.Description,TourClose:o.Close,TourPrev:o.Prev,TourNext:o.Next,TourSkip:o.Skip,TourStepCounter:o.StepCounter,TourFooter:o.Footer});exports.Tour=t;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../../src/components/Tour/index.ts"],"sourcesContent":["import {\n Root,\n Portal,\n Spotlight,\n SpotlightRing,\n Step,\n Arrow,\n Header,\n Title,\n Description,\n Close,\n Prev,\n Next,\n Skip,\n StepCounter,\n Footer,\n //\n TourPortal,\n TourSpotlight,\n TourSpotlightRing,\n TourStep,\n TourArrow,\n TourHeader,\n TourTitle,\n TourDescription,\n TourClose,\n TourPrev,\n TourNext,\n TourSkip,\n TourStepCounter,\n TourFooter,\n //\n type TourProps,\n} from \"./Tour\";\nimport {\n TourWrapper,\n type TourWrapperProps,\n type TourStep as TourStepType,\n type ButtonConfig,\n} from \"./TourWrapper\";\n\nconst Tour = Object.assign(TourWrapper, {\n Root,\n Portal,\n Spotlight,\n SpotlightRing,\n Step,\n Arrow,\n Header,\n Title,\n Description,\n Close,\n Prev,\n Next,\n Skip,\n StepCounter,\n Footer,\n //\n TourPortal,\n TourSpotlight,\n TourSpotlightRing,\n TourStep,\n TourArrow,\n TourHeader,\n TourTitle,\n TourDescription,\n TourClose,\n TourPrev,\n TourNext,\n TourSkip,\n TourStepCounter,\n TourFooter,\n});\n\nexport { Tour };\nexport type {\n TourProps,\n TourWrapperProps,\n TourStepType as TourStep,\n ButtonConfig,\n};\n"],"names":["Tour","TourWrapper","Root","Portal","Spotlight","SpotlightRing","Step","Arrow","Header","Title","Description","Close","Prev","Next","Skip","StepCounter","Footer","TourPortal","TourSpotlight","TourSpotlightRing","TourStep","TourArrow","TourHeader","TourTitle","TourDescription","TourClose","TourPrev","TourNext","TourSkip","TourStepCounter","TourFooter"],"mappings":"6IAyCMA,EAAO,OAAO,OAAOC,cAAa,CAAA,KACtCC,EAAAA,KAAA,OACAC,EAAAA,OAAA,UACAC,EAAAA,UAAA,cACAC,EAAAA,cAAA,KACAC,EAAAA,KAAA,MACAC,EAAAA,MAAA,OACAC,EAAAA,OAAA,MACAC,EAAAA,MAAA,YACAC,EAAAA,YAAA,MACAC,EAAAA,MAAA,KACAC,EAAAA,KAAA,KACAC,EAAAA,KAAA,KACAC,EAAAA,KAAA,YACAC,EAAAA,YAAA,OACAC,EAAAA,OAAA,WAEAC,EAAAA,OAAA,cACAC,EAAAA,UAAA,kBACAC,EAAAA,cAAA,SACAC,EAAAA,KAAA,UACAC,EAAAA,MAAA,WACAC,EAAAA,OAAA,UACAC,EAAAA,MAAA,gBACAC,EAAAA,YAAA,UACAC,EAAAA,MAAA,SACAC,EAAAA,KAAA,SACAC,EAAAA,KAAA,SACAC,EAAAA,KAAA,gBACAC,EAAAA,YAAA,WACAC,EAAAA,MACF,CAAC"}
@@ -0,0 +1,4 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("react/jsx-runtime"),z=require("react"),Ue=require("class-variance-authority"),C=require("@dsui/ui/lib/utils"),i=require("lucide-react"),P=require("../Toast/Toast.cjs"),Re=require("../Dialog/Dialog.cjs"),$e=Ue.cva("relative flex justify-center items-center rounded-lg transition-all duration-200 cursor-pointer select-none",{variants:{variant:{outline:"border border-foreground/10 bg-background text-foreground",primaryOutline:"border border-primary bg-background text-primary",icon:"border border-primary text-primary bg-background rounded-xl p-2",avatar:"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full flex-col text-center hover:border-foreground/40 !p-1",avatarCircle:"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full rounded-full flex-col text-center hover:border-foreground/40 !p-1",dropzone:"border border-foreground/10 bg-background flex-col text-center py-10",primaryDropzone:"border border-primary bg-primary/10 flex-col text-center py-10",secondaryDropzone:"border border-foreground/10 bg-foreground/10 flex-col text-center py-10"},size:{small:"h-8 p-[6px] text-sm",medium:"h-10 p-2 text-base",large:"h-12 p-3 text-base"},status:{idle:"",dragover:"border-primary bg-primary/5 scale-[1.02]",disabled:"opacity-50 cursor-not-allowed"}},defaultVariants:{variant:"outline",size:"medium",status:"idle"}}),A=t=>{const o=t.type||"",m=t.name.toLowerCase();return o.startsWith("image/")?e.jsx(i.Image,{className:"h-4 w-4"}):o.startsWith("video/")?e.jsx(i.Film,{className:"h-4 w-4"}):o.startsWith("audio/")?e.jsx(i.Music,{className:"h-4 w-4"}):m.endsWith(".zip")||m.endsWith(".rar")||m.endsWith(".7z")?e.jsx(i.Archive,{className:"h-4 w-4"}):m.endsWith(".js")||m.endsWith(".ts")||m.endsWith(".jsx")||m.endsWith(".tsx")||m.endsWith(".css")||m.endsWith(".html")?e.jsx(i.FileCode,{className:"h-4 w-4"}):m.endsWith(".txt")||m.endsWith(".md")?e.jsx(i.FileText,{className:"h-4 w-4"}):e.jsx(i.File,{className:"h-4 w-4"})},J=t=>{if(t===0)return"0 Bytes";const o=1024,m=["Bytes","KB","MB","GB"],w=Math.floor(Math.log(t)/Math.log(o));return Math.round(t/Math.pow(o,w)*100)/100+" "+m[w]},ae=()=>`upload-${Date.now()}-${Math.random().toString(36).substring(2,9)}`,le=z.forwardRef(({className:t,variant:o,accept:m,multiple:w=!1,disabled:j=!1,fileList:U,defaultFileList:$=[],action:v,customRequest:N,beforeUpload:L,onChange:c,onRemove:X,onPreview:K,onDownload:Q,maxCount:E,maxSize:R,listType:ie="text",showUploadList:T=!0,pictureCardSize:ce,pictureCardCols:de=3,iconOnly:H=!1,showBorder:ue=!0,uploadText:pe="Click to upload",uploadDescription:Z,uploadIcon:ee,size:M="medium",children:me,headers:I,withCredentials:_,directory:W=!1,...he},ge)=>{const S=z.useRef(null),[xe,be]=z.useState($),[fe,G]=z.useState(!1),[ye,te]=z.useState(!1),[we,ve]=z.useState(""),[re,je]=z.useState(""),x=U??xe,V=U?void 0:be,Ne=["dropzone","primaryDropzone","secondaryDropzone"].includes(o||""),F=W||Ne&&x.length>0?"text":ie,se=z.useRef(x);se.current=x;const O=E?x.length<E:W||w?!0:x.length===0,b=z.useCallback((s,n)=>{const a=s(se.current);V&&V(s),c&&c({file:n||{},fileList:a})},[V,c]),ke=z.useCallback(s=>{const n=s.type.startsWith("image/")?URL.createObjectURL(s):void 0,a={uid:ae(),name:s.name,size:s.size,type:s.type,status:"uploading",percent:0,originFileObj:s,url:n,thumbUrl:n};if(b(h=>[...h,a],a),N)N({file:s,onProgress:h=>{const u={...a,percent:h};b(r=>r.map(l=>l.uid===a.uid?u:l),u)},onSuccess:h=>{const u={...a,status:"done",percent:100,response:h};b(r=>r.map(l=>l.uid===a.uid?u:l),u)},onError:h=>{const u={...a,status:"error",error:h};b(r=>r.map(l=>l.uid===a.uid?u:l),u)}});else if(v){const h=typeof v=="function"?v(s):v,u=new FormData;u.append("file",s);const r=new XMLHttpRequest;r.upload.addEventListener("progress",l=>{if(l.lengthComputable){const y=Math.round(l.loaded/l.total*100),g={...a,percent:y};b(f=>f.map(p=>p.uid===a.uid?g:p),g)}}),r.addEventListener("load",()=>{if(r.status>=200&&r.status<300){const l=JSON.parse(r.responseText),y={...a,status:"done",percent:100,response:l,url:l.url||l.data?.url};b(g=>g.map(f=>f.uid===a.uid?y:f),y)}else{const l={...a,status:"error",error:new Error(`Upload failed with status ${r.status}`)};b(y=>y.map(g=>g.uid===a.uid?l:g),l)}}),r.addEventListener("error",()=>{const l={...a,status:"error",error:new Error("Network error")};b(y=>y.map(g=>g.uid===a.uid?l:g),l)}),r.open("POST",h),I&&Object.entries(I).forEach(([l,y])=>{r.setRequestHeader(l,y)}),_&&(r.withCredentials=!0),r.send(u)}else setTimeout(()=>{const h={...a,status:"done",percent:100};b(u=>u.map(r=>r.uid===a.uid?h:r),h)},100)},[v,N,b,I,_]),De=async s=>{const n=Array.from(s.target.files||[]);if(console.log("=== handleFileChange DEBUG ==="),console.log("Files from browser:",n.length),console.log("Directory mode:",W),console.log("Multiple mode:",w),console.log("Current fileList length:",x.length),console.log("File names:",n.map(r=>r.name)),n.length===0)return;if(!W&&!w&&x.length>0){P.toast.error("You can only upload one file. Please remove the existing file first.");return}if(E&&x.length+n.length>E){P.toast.error(`You can only upload up to ${E} file(s)`);return}let a=0;const h=[];for(const r of n){if(console.log(`
2
+ 📁 Processing: ${r.name}`),R&&r.size>R){console.log(`❌ REJECTED: File size ${r.size} exceeds maxSize ${R}`),P.toast.error(`${r.name} exceeds maximum size of ${J(R)}`);continue}if(L){if(console.log(`🔍 Calling beforeUpload for ${r.name}...`),await L(r,n)===!1){console.log(`❌ REJECTED by beforeUpload: ${r.name}`);continue}console.log(`✅ beforeUpload passed for ${r.name}`)}console.log(`✅ Valid file: ${r.name}`),h.push(r),a++}console.log(`
3
+ 📊 Summary: ${a} / ${n.length} files will be uploaded`);const u=h.map(r=>{const l=r.type.startsWith("image/")?URL.createObjectURL(r):void 0;return{uid:ae(),name:r.name,size:r.size,type:r.type,status:"uploading",percent:0,originFileObj:r,url:l,thumbUrl:l}});b(r=>[...r,...u]),u.forEach((r,l)=>{const y=h[l];if(N)N({file:y,onProgress:g=>{const f={...r,percent:g};b(p=>p.map(d=>d.uid===r.uid?f:d),f)},onSuccess:g=>{const f={...r,status:"done",percent:100,response:g};b(p=>p.map(d=>d.uid===r.uid?f:d),f)},onError:g=>{const f={...r,status:"error",error:g};b(p=>p.map(d=>d.uid===r.uid?f:d),f)}});else if(v){const g=typeof v=="function"?v(y):v,f=new FormData;f.append("file",y);const p=new XMLHttpRequest;p.upload.addEventListener("progress",d=>{if(d.lengthComputable){const k=Math.round(d.loaded/d.total*100),D={...r,percent:k};b(q=>q.map(ne=>ne.uid===r.uid?D:ne),D)}}),p.addEventListener("load",()=>{if(p.status>=200&&p.status<300){const d=JSON.parse(p.responseText),k={...r,status:"done",percent:100,response:d,url:d.url||d.data?.url};b(D=>D.map(q=>q.uid===r.uid?k:q),k)}else{const d={...r,status:"error",error:new Error(`Upload failed with status ${p.status}`)};b(k=>k.map(D=>D.uid===r.uid?d:D),d)}}),p.addEventListener("error",()=>{const d={...r,status:"error",error:new Error("Network error")};b(k=>k.map(D=>D.uid===r.uid?d:D),d)}),p.open("POST",g),I&&Object.entries(I).forEach(([d,k])=>{p.setRequestHeader(d,k)}),_&&(p.withCredentials=!0),p.send(f)}else console.log(`⏱️ Mock upload starting for ${y.name} (delay: ${100+l*50}ms)`),setTimeout(()=>{console.log(`✅ Mock upload complete for ${y.name}`);const g={...r,status:"done",percent:100};b(f=>(console.log(`📝 Updating status for ${y.name}, current list:`,f.length),f.map(p=>p.uid===r.uid?g:p)),g)},100+l*50)}),S.current&&(S.current.value="")},oe=async s=>{X&&await X(s)===!1||(b(n=>n.filter(a=>a.uid!==s.uid),{...s,status:"removed"}),s.url&&s.url.startsWith("blob:")&&URL.revokeObjectURL(s.url))},ze=s=>{s.preventDefault(),s.stopPropagation(),!j&&O&&G(!0)},Ce=s=>{s.preventDefault(),s.stopPropagation(),G(!1)},Le=async s=>{if(s.preventDefault(),s.stopPropagation(),G(!1),j||!O)return;let n=Array.from(s.dataTransfer.files);if(n.length!==0){if(!w&&x.length>0){P.toast.error("You can only upload one file. Please remove the existing file first.");return}if(!w&&n.length>1&&(P.toast.error("You can only upload one file at a time"),n=[n[0]]),E&&x.length+n.length>E){P.toast.error(`You can only upload up to ${E} file(s)`);return}for(const a of n)if(!(m&&!a.type.match(new RegExp(m.replace(/,/g,"|"))))){if(R&&a.size>R){P.toast.error(`${a.name} exceeds maximum size of ${J(R)}`);continue}L&&await L(a,n)===!1||ke(a)}}},Pe=()=>{!j&&O&&S.current?.click()},Ee=s=>{K?K(s):(s.url||s.thumbUrl)&&(ve(s.url||s.thumbUrl||""),je(s.name),te(!0))},Fe=async s=>{if(Q)Q(s);else if(s.url){if(s.status==="uploading"){P.toast.error("Please wait until the file finishes uploading");return}if(s.status==="error"){P.toast.error("Cannot download file with error status");return}try{const a=await(await fetch(s.url)).blob(),h=URL.createObjectURL(a),u=document.createElement("a");u.href=h,u.download=s.name,u.style.display="none",document.body.appendChild(u),u.click(),document.body.removeChild(u),setTimeout(()=>URL.revokeObjectURL(h),100)}catch{const n=document.createElement("a");n.href=s.url,n.download=s.name,n.target="_blank",n.rel="noopener noreferrer",n.style.display="none",document.body.appendChild(n),n.click(),document.body.removeChild(n)}}},Y=typeof T=="boolean"?{showPreviewIcon:!0,showRemoveIcon:!0,showDownloadIcon:!0}:{showPreviewIcon:T.showPreviewIcon??!0,showRemoveIcon:T.showRemoveIcon??!0,showDownloadIcon:T.showDownloadIcon??!0};return e.jsxs(e.Fragment,{children:[e.jsxs("div",{ref:ge,className:C.cn(t),...he,children:[e.jsxs("div",{className:C.cn($e({variant:o,status:j||!O?"disabled":fe?"dragover":"idle",size:["dropzone","primaryDropzone","secondaryDropzone"].includes(o)?void 0:M}),["dropzone","primaryDropzone","secondaryDropzone"].includes(o)&&"min-h-[180px] min-w-[300px]",!ue&&"border-0",!H&&o!=="avatar"&&o!=="avatarCircle"&&"px-4",(o==="avatar"||o==="avatarCircle")&&x.length>0&&x[0].url&&"opacity-100!"),onDragOver:ze,onDragLeave:Ce,onDrop:Le,onClick:Pe,children:[e.jsx("input",{ref:S,type:"file",accept:m,multiple:w,disabled:j,onChange:De,className:"hidden",...W?{webkitdirectory:"",directory:""}:{}}),o==="avatar"||o==="avatarCircle"?e.jsx(e.Fragment,{children:x.length>0&&x[0].url&&!j?e.jsxs("div",{className:"relative w-full h-full group",children:[e.jsx("img",{draggable:!1,src:x[0].url||x[0].thumbUrl,alt:x[0].name,className:C.cn("w-full h-full object-cover",o==="avatarCircle"&&"rounded-full",o==="avatar"&&"rounded-lg")}),e.jsx("div",{className:C.cn("absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center",o==="avatarCircle"&&"rounded-full",o==="avatar"&&"rounded-lg"),onClick:s=>{s.stopPropagation(),oe(x[0])},children:e.jsx(i.Trash2,{className:"h-6 w-6 text-white cursor-pointer hover:scale-110 transition-transform"})})]}):me}):e.jsxs("div",{className:C.cn("flex items-center justify-center gap-2",["secondaryDropzone","dropzone","primaryDropzone"].includes(o)&&"flex-col"),children:[ee?e.jsx("div",{className:C.cn(["dropzone","primaryDropzone","secondaryDropzone"].includes(o)?"h-10 w-10":M==="small"?"h-5 w-5":"h-6 w-6",o==="outline"&&"text-gray-500",["primaryDropzone","secondaryDropzone","primaryOutline"].includes(o)&&"text-primary"),children:ee}):e.jsx(e.Fragment,{children:H?e.jsx(i.Upload,{className:C.cn(["dropzone","primaryDropzone","secondaryDropzone"].includes(o)?"h-10 w-10":M==="small"?"h-5 w-5":"h-6 w-6",o==="outline"&&"text-gray-500",["secondaryDropzone","primaryDropzone","primaryOutline"].includes(o)&&"text-primary")}):e.jsx(i.CloudUploadIcon,{className:C.cn(["dropzone","primaryDropzone","secondaryDropzone"].includes(o)?"h-10 w-10":M==="small"?"h-5 w-5":"h-6 w-6",o==="outline"&&"text-gray-500",["primaryDropzone","secondaryDropzone","primaryOutline"].includes(o)&&"text-primary")})}),!H&&e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"font-medium whitespace-nowrap text-sm",children:pe}),Z&&["dropzone","primaryDropzone","secondaryDropzone"].includes(o)&&e.jsx("span",{className:"text-xs text-gray-500",children:Z})]})]})]}),T&&x.length>0&&e.jsx("div",{className:C.cn("mt-4",(F==="picture-card"||F==="picture-circle")&&"grid gap-2",F==="picture"&&"space-y-2"),style:{gridTemplateColumns:F==="picture-card"||F==="picture-circle"?`repeat(${de}, 1fr)`:void 0,minWidth:F==="picture-card"||F==="picture-circle"?"100px":void 0},children:x.filter(s=>s.response!==B.LIST_IGNORE).map(s=>e.jsx(Te,{file:s,listType:F,onRemove:()=>oe(s),onPreview:Ee,onDownload:Fe,showPreviewIcon:Y.showPreviewIcon,showRemoveIcon:Y.showRemoveIcon,showDownloadIcon:Y.showDownloadIcon,pictureCardSize:ce},s.uid))})]}),e.jsx(Re.default,{open:ye,onOpenChange:te,title:re,size:"lg",children:e.jsx("img",{src:we,alt:re,className:"w-full h-auto max-h-[70vh] object-contain"})})]})});le.displayName="Upload";const B=le;B.LIST_IGNORE="LIST_IGNORE";const Te=({file:t,listType:o,onRemove:m,onPreview:w,onDownload:j,showPreviewIcon:U,showRemoveIcon:$,showDownloadIcon:v})=>{const N=t.type?.startsWith("image/"),L=N||t.url;return o==="picture-card"?e.jsxs("div",{className:"relative aspect-square rounded-lg border bg-muted/50 overflow-hidden group",style:{width:"100px",height:"100px",minWidth:"100px",minHeight:"100px",padding:"4px"},children:[t.url&&N?e.jsx("img",{src:t.thumbUrl||t.url,alt:t.name,className:"h-full w-full object-cover rounded-lg"}):e.jsx("div",{className:"flex items-center justify-center h-full",children:A(t)}),t.status==="uploading"&&e.jsx("div",{className:"absolute inset-0 bg-background/80 flex items-center justify-center",children:e.jsxs("div",{className:"w-full px-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx(i.Loader2,{className:"h-4 w-4 animate-spin"}),e.jsxs("span",{className:"text-xs",children:[t.percent,"%"]})]}),e.jsx("div",{className:"h-1 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-300",style:{width:`${t.percent}%`}})})]})}),t.status==="done"&&e.jsx("div",{className:"absolute top-2 right-2 bg-green-500 rounded-full p-1",children:e.jsx(i.CheckCircle2,{className:"h-4 w-4 text-white"})}),t.status==="error"&&e.jsx("div",{className:"absolute top-2 right-2 bg-red-500 rounded-full p-1",children:e.jsx(i.AlertCircle,{className:"h-4 w-4 text-white"})}),e.jsxs("div",{className:"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2",children:[U&&L&&e.jsx("button",{onClick:c=>{c.stopPropagation(),w?.(t)},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Preview",children:e.jsx(i.Eye,{className:"h-4 w-4 text-white"})}),v&&t.url&&e.jsx("button",{onClick:c=>{c.stopPropagation(),j?.(t)},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Download",children:e.jsx(i.Download,{className:"h-4 w-4 text-white"})}),$&&e.jsx("button",{onClick:c=>{c.stopPropagation(),m()},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Remove",children:e.jsx(i.Trash2,{className:"h-4 w-4 text-white"})})]}),e.jsx("div",{className:"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 transition-opacity",children:t.name})]}):o==="picture-circle"?e.jsxs("div",{className:C.cn("relative aspect-square rounded-full border bg-muted/50 overflow-hidden group",t.status==="done"&&"border-2 border-green-500",t.status==="error"&&"border-2 border-red-500"),style:{width:"100px",height:"100px",minWidth:"100px",minHeight:"100px",padding:"4px"},children:[t.url&&N?e.jsx("img",{src:t.thumbUrl||t.url,alt:t.name,className:"h-full w-full object-cover rounded-full"}):e.jsx("div",{className:"flex items-center justify-center h-full rounded-full bg-muted",children:A(t)}),t.status==="uploading"&&e.jsx("div",{className:"absolute inset-0 bg-background/80 flex items-center justify-center rounded-full",children:e.jsxs("div",{className:"w-full px-4",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2 justify-center",children:[e.jsx(i.Loader2,{className:"h-4 w-4 animate-spin"}),e.jsxs("span",{className:"text-xs",children:[t.percent,"%"]})]}),e.jsx("div",{className:"h-1 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-300",style:{width:`${t.percent}%`}})})]})}),e.jsxs("div",{className:"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2 rounded-full",children:[U&&L&&e.jsx("button",{onClick:c=>{c.stopPropagation(),w?.(t)},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Preview",children:e.jsx(i.Eye,{className:"h-4 w-4 text-white"})}),v&&t.url&&e.jsx("button",{onClick:c=>{c.stopPropagation(),j?.(t)},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Download",children:e.jsx(i.Download,{className:"h-4 w-4 text-white"})}),$&&e.jsx("button",{onClick:c=>{c.stopPropagation(),m()},className:"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors",title:"Remove",children:e.jsx(i.Trash2,{className:"h-4 w-4 text-white"})}),e.jsx("div",{className:"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 transition-opacity",children:t.name})]})]}):o==="picture"?e.jsxs("div",{className:"flex items-center gap-3 p-2 rounded-lg border bg-background hover:bg-muted/50 transition-colors group",children:[e.jsx("div",{className:"shrink-0 h-10 w-10 rounded overflow-hidden bg-muted flex items-center justify-center",children:t.url&&N?e.jsx("img",{src:t.thumbUrl||t.url,alt:t.name,className:"h-full w-full object-cover"}):A(t)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsx("p",{className:"text-sm font-medium truncate",children:t.name}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[t.size&&e.jsx("span",{className:"text-xs text-muted-foreground",children:J(t.size)}),t.status==="uploading"&&e.jsxs("span",{className:"text-xs text-primary",children:[t.percent,"%"]}),t.status==="done"&&e.jsx(i.CheckCircle2,{className:"h-4 w-4 text-green-500"}),t.status==="error"&&e.jsx(i.AlertCircle,{className:"h-4 w-4 text-red-500"})]}),t.status==="uploading"&&e.jsx("div",{className:"h-1 bg-muted rounded-full overflow-hidden mt-2",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-300",style:{width:`${t.percent}%`}})})]}),e.jsxs("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[U&&L&&e.jsx("button",{onClick:c=>{c.stopPropagation(),w?.(t)},className:"p-1.5 rounded hover:bg-muted transition-colors",title:"Preview",children:e.jsx(i.Eye,{className:"h-4 w-4"})}),v&&t.url&&e.jsx("button",{onClick:c=>{c.stopPropagation(),j?.(t)},className:"p-1.5 rounded hover:bg-muted transition-colors",title:"Download",children:e.jsx(i.Download,{className:"h-4 w-4"})}),$&&e.jsx("button",{onClick:c=>{c.stopPropagation(),m()},className:"p-1.5 rounded hover:bg-destructive/10 transition-colors text-destructive",title:"Remove",children:e.jsx(i.X,{className:"h-4 w-4"})})]})]}):e.jsxs("div",{className:"flex items-center gap-2 p-2 rounded hover:bg-muted/50 transition-colors group",children:[e.jsx("div",{className:"shrink-0",children:A(t)}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"text-sm truncate",children:t.name}),t.status==="done"&&e.jsx(i.CheckCircle2,{className:"h-4 w-4 text-green-500 shrink-0"}),t.status==="error"&&e.jsx(i.AlertCircle,{className:"h-4 w-4 text-red-500 shrink-0"}),t.status==="uploading"&&e.jsx(i.Loader2,{className:"h-4 w-4 animate-spin shrink-0"})]}),t.status==="uploading"&&e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"flex-1 h-1 bg-muted rounded-full overflow-hidden",children:e.jsx("div",{className:"h-full bg-primary transition-all duration-300",style:{width:`${t.percent}%`}})}),e.jsxs("span",{className:"text-xs text-muted-foreground",children:[t.percent,"%"]})]})]}),e.jsxs("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",children:[U&&L&&e.jsx("button",{onClick:c=>{c.stopPropagation(),w?.(t)},className:"p-1 rounded hover:bg-muted transition-colors",title:"Preview",children:e.jsx(i.Eye,{className:"h-4 w-4"})}),v&&t.url&&e.jsx("button",{onClick:c=>{c.stopPropagation(),j?.(t)},className:"p-1 rounded hover:bg-muted transition-colors",title:"Download",children:e.jsx(i.Download,{className:"h-4 w-4"})}),$&&e.jsx("button",{onClick:c=>{c.stopPropagation(),m()},className:"p-1 rounded hover:bg-destructive/10 transition-colors text-destructive",title:"Remove",children:e.jsx(i.Trash2,{className:"h-4 w-4"})})]})]})};exports.Upload=B;exports.default=B;
4
+ //# sourceMappingURL=Upload.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Upload.cjs","sources":["../../../../src/components/Upload/Upload.tsx"],"sourcesContent":["\"use client\";\n\nimport React, { useRef, useState, useCallback } from \"react\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { cn } from \"@dsui/ui/lib/utils\";\nimport {\n Upload as UploadIcon,\n X,\n File,\n FileText,\n Image as ImageIcon,\n Film,\n Music,\n Archive,\n FileCode,\n CheckCircle2,\n AlertCircle,\n Loader2,\n Eye,\n Download,\n Trash2,\n CloudUploadIcon,\n} from \"lucide-react\";\nimport { toast } from \"../Toast/Toast\";\nimport Dialog from \"../Dialog/Dialog\";\n\n// Variants for upload container\nconst uploadVariants = cva(\n \"relative flex justify-center items-center rounded-lg transition-all duration-200 cursor-pointer select-none\",\n {\n variants: {\n variant: {\n outline: \"border border-foreground/10 bg-background text-foreground\",\n primaryOutline: \"border border-primary bg-background text-primary\",\n icon: \"border border-primary text-primary bg-background rounded-xl p-2\",\n avatar:\n \"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full flex-col text-center hover:border-foreground/40 !p-1\",\n avatarCircle:\n \"border-2 border-dashed border-foreground/20 bg-background !w-full !h-full rounded-full flex-col text-center hover:border-foreground/40 !p-1\",\n dropzone:\n \"border border-foreground/10 bg-background flex-col text-center py-10\",\n primaryDropzone:\n \"border border-primary bg-primary/10 flex-col text-center py-10\",\n secondaryDropzone:\n \"border border-foreground/10 bg-foreground/10 flex-col text-center py-10\",\n },\n\n size: {\n small: \"h-8 p-[6px] text-sm\",\n medium: \"h-10 p-2 text-base\",\n large: \"h-12 p-3 text-base\",\n },\n\n status: {\n idle: \"\",\n dragover: \"border-primary bg-primary/5 scale-[1.02]\",\n disabled: \"opacity-50 cursor-not-allowed\",\n },\n },\n\n defaultVariants: {\n variant: \"outline\",\n size: \"medium\",\n status: \"idle\",\n },\n },\n);\n\n// File status type\nexport type FileStatus = \"uploading\" | \"done\" | \"error\" | \"removed\";\n\n// Upload file item interface\nexport interface UploadFile {\n uid: string;\n name: string;\n status?: FileStatus;\n url?: string;\n thumbUrl?: string;\n size?: number;\n type?: string;\n percent?: number;\n error?: Error;\n response?: any;\n originFileObj?: File;\n}\n\n// Upload props interface\nexport interface UploadProps\n extends\n Omit<React.HTMLAttributes<HTMLDivElement>, \"onChange\" | \"size\">,\n VariantProps<typeof uploadVariants> {\n // Core props\n accept?: string;\n multiple?: boolean;\n disabled?: boolean;\n fileList?: UploadFile[];\n defaultFileList?: UploadFile[];\n\n // Upload behavior\n action?: string | ((file: File) => string);\n customRequest?: (options: {\n file: File;\n onProgress: (percent: number) => void;\n onSuccess: (response: any) => void;\n onError: (error: Error) => void;\n }) => void;\n beforeUpload?: (file: File, fileList: File[]) => boolean | Promise<boolean>;\n onChange?: (info: { file: UploadFile; fileList: UploadFile[] }) => void;\n onRemove?: (file: UploadFile) => boolean | Promise<boolean> | void;\n onPreview?: (file: UploadFile) => void;\n onDownload?: (file: UploadFile) => void;\n\n // Validation\n maxCount?: number;\n maxSize?: number; // in bytes\n\n // Display\n listType?: \"text\" | \"picture\" | \"picture-card\" | \"picture-circle\";\n showUploadList?:\n | boolean\n | {\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n };\n pictureCardSize?: number; // Size in pixels for picture-card (default: auto based on cols)\n pictureCardCols?: number; // Number of columns for picture-card grid (default: 3)\n compact?: boolean; // Compact mode - shows as small button\n iconOnly?: boolean; // Show only icon without text in compact mode\n showBorder?: boolean; // Show border around upload area (default: true)\n uploadText?: string; // Custom text for upload area (default: \"Click to upload or drag and drop\")\n uploadDescription?: string; // Custom description text for upload area\n uploadIcon?: React.ReactNode; // Custom icon for upload area\n // Content\n children?: React.ReactNode;\n\n // Headers for upload request\n headers?: Record<string, string>;\n withCredentials?: boolean;\n\n // Drag and drop\n directory?: boolean;\n}\n\n// Helper function to get file icon based on type\nconst getFileIcon = (file: UploadFile) => {\n const type = file.type || \"\";\n const name = file.name.toLowerCase();\n\n if (type.startsWith(\"image/\")) return <ImageIcon className=\"h-4 w-4\" />;\n if (type.startsWith(\"video/\")) return <Film className=\"h-4 w-4\" />;\n if (type.startsWith(\"audio/\")) return <Music className=\"h-4 w-4\" />;\n if (name.endsWith(\".zip\") || name.endsWith(\".rar\") || name.endsWith(\".7z\"))\n return <Archive className=\"h-4 w-4\" />;\n if (\n name.endsWith(\".js\") ||\n name.endsWith(\".ts\") ||\n name.endsWith(\".jsx\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".css\") ||\n name.endsWith(\".html\")\n )\n return <FileCode className=\"h-4 w-4\" />;\n if (name.endsWith(\".txt\") || name.endsWith(\".md\"))\n return <FileText className=\"h-4 w-4\" />;\n return <File className=\"h-4 w-4\" />;\n};\n\n// Helper function to format file size\nconst formatFileSize = (bytes: number): string => {\n if (bytes === 0) return \"0 Bytes\";\n const k = 1024;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + \" \" + sizes[i];\n};\n\n// Generate unique ID\nconst generateUID = () => {\n return `upload-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n};\n\nconst UploadBase = React.forwardRef<HTMLDivElement, UploadProps>(\n (\n {\n className,\n variant,\n accept,\n multiple = false,\n disabled = false,\n fileList: controlledFileList,\n defaultFileList = [],\n action,\n customRequest,\n beforeUpload,\n onChange,\n onRemove,\n onPreview,\n onDownload,\n maxCount,\n maxSize,\n listType = \"text\",\n showUploadList = true,\n pictureCardSize,\n pictureCardCols = 3,\n iconOnly = false,\n showBorder = true,\n uploadText = \"Click to upload\",\n uploadDescription,\n uploadIcon,\n size = \"medium\",\n children,\n headers,\n withCredentials,\n directory = false,\n ...props\n },\n ref,\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [internalFileList, setInternalFileList] =\n useState<UploadFile[]>(defaultFileList);\n const [isDragOver, setIsDragOver] = useState(false);\n\n // Built-in preview dialog state\n const [previewOpen, setPreviewOpen] = useState(false);\n const [previewImage, setPreviewImage] = useState(\"\");\n const [previewTitle, setPreviewTitle] = useState(\"\");\n\n // Use controlled or uncontrolled fileList\n const fileList = controlledFileList ?? internalFileList;\n const setFileList = controlledFileList ? undefined : setInternalFileList;\n\n // Check if dropzone variant\n const isDropzoneVariant = [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant || \"\");\n\n // Auto set listType to 'text' when directory mode is enabled or when uploading with dropzone variants\n const effectiveListType = directory\n ? \"text\"\n : isDropzoneVariant && fileList.length > 0\n ? \"text\"\n : listType;\n\n // Track the latest fileList for controlled mode\n const fileListRef = useRef<UploadFile[]>(fileList);\n fileListRef.current = fileList;\n\n // Check if can upload more files\n const canUploadMore = maxCount\n ? fileList.length < maxCount\n : directory || multiple\n ? true\n : fileList.length === 0;\n\n // Update file list\n const updateFileList = useCallback(\n (updater: (prev: UploadFile[]) => UploadFile[], file?: UploadFile) => {\n const newList = updater(fileListRef.current);\n\n if (setFileList) {\n setFileList(updater);\n }\n\n // Trigger onChange for controlled mode\n if (onChange) {\n // Always trigger onChange with the new list\n const dummyFile = file || ({} as UploadFile);\n onChange({ file: dummyFile, fileList: newList });\n }\n },\n [setFileList, onChange],\n );\n\n // Upload file\n const uploadFile = useCallback(\n (file: File) => {\n // Generate preview URL immediately for images\n const previewUrl = file.type.startsWith(\"image/\")\n ? URL.createObjectURL(file)\n : undefined;\n\n const uploadFileObj: UploadFile = {\n uid: generateUID(),\n name: file.name,\n size: file.size,\n type: file.type,\n status: \"uploading\",\n percent: 0,\n originFileObj: file,\n url: previewUrl,\n thumbUrl: previewUrl,\n };\n\n // Add to file list immediately\n updateFileList((prev) => [...prev, uploadFileObj], uploadFileObj);\n\n // Custom request\n if (customRequest) {\n customRequest({\n file,\n onProgress: (percent) => {\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f,\n ),\n updatedFile,\n );\n },\n onSuccess: (response) => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n ),\n successFile,\n );\n },\n onError: (error) => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f,\n ),\n errorFile,\n );\n },\n });\n } else if (action) {\n // Default upload using fetch\n const url = typeof action === \"function\" ? action(file) : action;\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f,\n ),\n updatedFile,\n );\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const response = JSON.parse(xhr.responseText);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n url: response.url || response.data?.url,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n ),\n successFile,\n );\n } else {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(`Upload failed with status ${xhr.status}`),\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f,\n ),\n errorFile,\n );\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(\"Network error\"),\n };\n updateFileList(\n (prev) =>\n prev.map((f) => (f.uid === uploadFileObj.uid ? errorFile : f)),\n errorFile,\n );\n });\n\n xhr.open(\"POST\", url);\n\n // Set headers\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n if (withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n } else {\n // No action or customRequest, just mark as done (for preview only)\n setTimeout(() => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n ),\n successFile,\n );\n }, 100);\n }\n },\n [action, customRequest, updateFileList, headers, withCredentials],\n );\n\n // Handle file selection\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(e.target.files || []);\n\n console.log(\"=== handleFileChange DEBUG ===\");\n console.log(\"Files from browser:\", files.length);\n console.log(\"Directory mode:\", directory);\n console.log(\"Multiple mode:\", multiple);\n console.log(\"Current fileList length:\", fileList.length);\n console.log(\n \"File names:\",\n files.map((f) => f.name),\n );\n\n if (files.length === 0) return;\n\n // Check multiple - if multiple is false and there's already a file, reject (except for directory upload)\n if (!directory && !multiple && fileList.length > 0) {\n toast.error(\n \"You can only upload one file. Please remove the existing file first.\",\n );\n return;\n }\n\n // Check max count\n if (maxCount && fileList.length + files.length > maxCount) {\n toast.error(`You can only upload up to ${maxCount} file(s)`);\n return;\n }\n\n // Process each file - collect valid files first\n let uploadedCount = 0;\n const validFiles: File[] = [];\n\n for (const file of files) {\n console.log(`\\n📁 Processing: ${file.name}`);\n\n // Check max size\n if (maxSize && file.size > maxSize) {\n console.log(\n `❌ REJECTED: File size ${file.size} exceeds maxSize ${maxSize}`,\n );\n toast.error(\n `${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`,\n );\n continue;\n }\n\n // Before upload hook\n if (beforeUpload) {\n console.log(`🔍 Calling beforeUpload for ${file.name}...`);\n const result = await beforeUpload(file, files);\n if (result === false) {\n console.log(`❌ REJECTED by beforeUpload: ${file.name}`);\n continue;\n }\n console.log(`✅ beforeUpload passed for ${file.name}`);\n }\n\n console.log(`✅ Valid file: ${file.name}`);\n validFiles.push(file);\n uploadedCount++;\n }\n\n console.log(\n `\\n📊 Summary: ${uploadedCount} / ${files.length} files will be uploaded`,\n );\n\n // Create upload file objects for all valid files at once\n const uploadFileObjects: UploadFile[] = validFiles.map((file) => {\n const previewUrl = file.type.startsWith(\"image/\")\n ? URL.createObjectURL(file)\n : undefined;\n\n return {\n uid: generateUID(),\n name: file.name,\n size: file.size,\n type: file.type,\n status: \"uploading\" as FileStatus,\n percent: 0,\n originFileObj: file,\n url: previewUrl,\n thumbUrl: previewUrl,\n };\n });\n\n // Add all files to list at once\n updateFileList((prev) => [...prev, ...uploadFileObjects]);\n\n // Then trigger upload for each file\n uploadFileObjects.forEach((uploadFileObj, index) => {\n const file = validFiles[index];\n\n // Start upload process\n if (customRequest) {\n customRequest({\n file,\n onProgress: (percent) => {\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f,\n ),\n updatedFile,\n );\n },\n onSuccess: (response) => {\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n ),\n successFile,\n );\n },\n onError: (error) => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f,\n ),\n errorFile,\n );\n },\n });\n } else if (action) {\n // Default upload using XHR - similar implementation\n const url = typeof action === \"function\" ? action(file) : action;\n const formData = new FormData();\n formData.append(\"file\", file);\n\n const xhr = new XMLHttpRequest();\n\n xhr.upload.addEventListener(\"progress\", (e) => {\n if (e.lengthComputable) {\n const percent = Math.round((e.loaded / e.total) * 100);\n const updatedFile = { ...uploadFileObj, percent };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? updatedFile : f,\n ),\n updatedFile,\n );\n }\n });\n\n xhr.addEventListener(\"load\", () => {\n if (xhr.status >= 200 && xhr.status < 300) {\n const response = JSON.parse(xhr.responseText);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n response,\n url: response.url || response.data?.url,\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n ),\n successFile,\n );\n } else {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(`Upload failed with status ${xhr.status}`),\n };\n updateFileList(\n (prev) =>\n prev.map((f) =>\n f.uid === uploadFileObj.uid ? errorFile : f,\n ),\n errorFile,\n );\n }\n });\n\n xhr.addEventListener(\"error\", () => {\n const errorFile = {\n ...uploadFileObj,\n status: \"error\" as FileStatus,\n error: new Error(\"Network error\"),\n };\n updateFileList(\n (prev) =>\n prev.map((f) => (f.uid === uploadFileObj.uid ? errorFile : f)),\n errorFile,\n );\n });\n\n xhr.open(\"POST\", url);\n\n if (headers) {\n Object.entries(headers).forEach(([key, value]) => {\n xhr.setRequestHeader(key, value);\n });\n }\n\n if (withCredentials) {\n xhr.withCredentials = true;\n }\n\n xhr.send(formData);\n } else {\n // No action or customRequest, just mark as done (mock upload)\n console.log(\n `⏱️ Mock upload starting for ${file.name} (delay: ${100 + index * 50}ms)`,\n );\n setTimeout(\n () => {\n console.log(`✅ Mock upload complete for ${file.name}`);\n const successFile = {\n ...uploadFileObj,\n status: \"done\" as FileStatus,\n percent: 100,\n };\n updateFileList((prev) => {\n console.log(\n `📝 Updating status for ${file.name}, current list:`,\n prev.length,\n );\n return prev.map((f) =>\n f.uid === uploadFileObj.uid ? successFile : f,\n );\n }, successFile);\n },\n 100 + index * 50,\n ); // Stagger completion times\n }\n });\n\n // Reset input\n if (inputRef.current) {\n inputRef.current.value = \"\";\n }\n };\n\n // Handle remove\n const handleRemove = async (file: UploadFile) => {\n if (onRemove) {\n const result = await onRemove(file);\n if (result === false) return;\n }\n\n updateFileList((prev) => prev.filter((f) => f.uid !== file.uid), {\n ...file,\n status: \"removed\" as FileStatus,\n });\n\n // Revoke object URL if exists\n if (file.url && file.url.startsWith(\"blob:\")) {\n URL.revokeObjectURL(file.url);\n }\n };\n\n // Handle drag and drop\n const handleDragOver = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n if (!disabled && canUploadMore) {\n setIsDragOver(true);\n }\n };\n\n const handleDragLeave = (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n };\n\n const handleDrop = async (e: React.DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n\n if (disabled || !canUploadMore) return;\n\n let files = Array.from(e.dataTransfer.files);\n\n if (files.length === 0) return;\n\n // Check multiple - if multiple is false and there's already a file, reject\n if (!multiple && fileList.length > 0) {\n toast.error(\n \"You can only upload one file. Please remove the existing file first.\",\n );\n return;\n }\n\n // Check multiple - only allow 1 file if multiple is false\n if (!multiple && files.length > 1) {\n toast.error(\"You can only upload one file at a time\");\n files = [files[0]]; // Take only the first file\n }\n\n // Check max count\n if (maxCount && fileList.length + files.length > maxCount) {\n toast.error(`You can only upload up to ${maxCount} file(s)`);\n return;\n }\n\n // Process each file\n for (const file of files) {\n // Check accept\n if (accept && !file.type.match(new RegExp(accept.replace(/,/g, \"|\")))) {\n continue;\n }\n\n // Check max size\n if (maxSize && file.size > maxSize) {\n toast.error(\n `${file.name} exceeds maximum size of ${formatFileSize(maxSize)}`,\n );\n continue;\n }\n\n // Before upload hook\n if (beforeUpload) {\n const result = await beforeUpload(file, files);\n if (result === false) continue;\n }\n\n uploadFile(file);\n }\n };\n\n // Click to upload\n const handleClick = () => {\n if (!disabled && canUploadMore) {\n inputRef.current?.click();\n }\n };\n\n // Handle preview - use built-in dialog if no onPreview provided\n const handlePreview = (file: UploadFile) => {\n if (onPreview) {\n onPreview(file);\n } else {\n // Built-in preview for images\n if (file.url || file.thumbUrl) {\n setPreviewImage(file.url || file.thumbUrl || \"\");\n setPreviewTitle(file.name);\n setPreviewOpen(true);\n }\n }\n };\n\n // Handle download - use built-in download if no onDownload provided\n const handleDownload = async (file: UploadFile) => {\n if (onDownload) {\n onDownload(file);\n } else {\n // Built-in download - handle cross-origin URLs\n if (file.url) {\n // Don't allow download for uploading or error status\n if (file.status === \"uploading\") {\n toast.error(\"Please wait until the file finishes uploading\");\n return;\n }\n if (file.status === \"error\") {\n toast.error(\"Cannot download file with error status\");\n return;\n }\n\n try {\n // For cross-origin URLs (like Unsplash), we need to fetch and create a blob\n const response = await fetch(file.url);\n const blob = await response.blob();\n const blobUrl = URL.createObjectURL(blob);\n\n const link = document.createElement(\"a\");\n link.href = blobUrl;\n link.download = file.name;\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n\n // Clean up blob URL after download\n setTimeout(() => URL.revokeObjectURL(blobUrl), 100);\n } catch {\n // Fallback to direct link if fetch fails (e.g., CORS issues)\n const link = document.createElement(\"a\");\n link.href = file.url;\n link.download = file.name;\n link.target = \"_blank\";\n link.rel = \"noopener noreferrer\";\n link.style.display = \"none\";\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n }\n }\n }\n };\n\n // Show upload list config\n const uploadListConfig =\n typeof showUploadList === \"boolean\"\n ? {\n showPreviewIcon: true,\n showRemoveIcon: true,\n showDownloadIcon: true,\n }\n : {\n showPreviewIcon: showUploadList.showPreviewIcon ?? true,\n showRemoveIcon: showUploadList.showRemoveIcon ?? true,\n showDownloadIcon: showUploadList.showDownloadIcon ?? true,\n };\n\n return (\n <>\n <div ref={ref} className={cn(className)} {...props}>\n {/* Upload Area - Always show, just disable when needed */}\n <div\n className={cn(\n uploadVariants({\n variant,\n status:\n disabled || !canUploadMore\n ? \"disabled\"\n : isDragOver\n ? \"dragover\"\n : \"idle\",\n size: [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? undefined\n : size,\n }),\n [\"dropzone\", \"primaryDropzone\", \"secondaryDropzone\"].includes(\n variant as any,\n ) && \"min-h-[180px] min-w-[300px]\",\n !showBorder && \"border-0\",\n !iconOnly &&\n variant !== \"avatar\" &&\n variant !== \"avatarCircle\" &&\n \"px-4\",\n // Remove disabled opacity for avatar variants when image is shown\n (variant === \"avatar\" || variant === \"avatarCircle\") &&\n fileList.length > 0 &&\n fileList[0].url &&\n \"opacity-100!\",\n )}\n onDragOver={handleDragOver}\n onDragLeave={handleDragLeave}\n onDrop={handleDrop}\n onClick={handleClick}\n >\n <input\n ref={inputRef}\n type=\"file\"\n accept={accept}\n multiple={multiple}\n disabled={disabled}\n onChange={handleFileChange}\n className=\"hidden\"\n {...(directory\n ? ({ webkitdirectory: \"\", directory: \"\" } as any)\n : {})}\n />\n\n {/* Avatar variant - show image if exists and not disabled, otherwise show children */}\n {variant === \"avatar\" || variant === \"avatarCircle\" ? (\n <>\n {fileList.length > 0 && fileList[0].url && !disabled ? (\n <div className=\"relative w-full h-full group\">\n <img\n draggable={false}\n src={fileList[0].url || fileList[0].thumbUrl}\n alt={fileList[0].name}\n className={cn(\n \"w-full h-full object-cover\",\n variant === \"avatarCircle\" && \"rounded-full\",\n variant === \"avatar\" && \"rounded-lg\",\n )}\n />\n {/* Delete button overlay */}\n <div\n className={cn(\n \"absolute inset-0 bg-black/50 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center\",\n variant === \"avatarCircle\" && \"rounded-full\",\n variant === \"avatar\" && \"rounded-lg\",\n )}\n onClick={(e) => {\n e.stopPropagation();\n handleRemove(fileList[0]);\n }}\n >\n <Trash2 className=\"h-6 w-6 text-white cursor-pointer hover:scale-110 transition-transform\" />\n </div>\n </div>\n ) : (\n children\n )}\n </>\n ) : (\n <div\n className={cn(\n \"flex items-center justify-center gap-2\",\n [\"secondaryDropzone\", \"dropzone\", \"primaryDropzone\"].includes(\n variant as any,\n ) && \"flex-col\",\n )}\n >\n {uploadIcon ? (\n <div\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"text-primary\",\n )}\n >\n {uploadIcon}\n </div>\n ) : (\n <>\n {iconOnly ? (\n <UploadIcon\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"secondaryDropzone\",\n \"primaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"text-primary\",\n )}\n />\n ) : (\n <CloudUploadIcon\n className={cn(\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any)\n ? \"h-10 w-10\"\n : size === \"small\"\n ? \"h-5 w-5\"\n : \"h-6 w-6\",\n variant === \"outline\" && \"text-gray-500\",\n [\n \"primaryDropzone\",\n \"secondaryDropzone\",\n \"primaryOutline\",\n ].includes(variant as any) && \"text-primary\",\n )}\n />\n )}\n </>\n )}\n {!iconOnly && (\n <>\n <span className=\"font-medium whitespace-nowrap text-sm\">\n {uploadText}\n </span>\n {uploadDescription &&\n [\n \"dropzone\",\n \"primaryDropzone\",\n \"secondaryDropzone\",\n ].includes(variant as any) && (\n <span className=\"text-xs text-gray-500\">\n {uploadDescription}\n </span>\n )}\n </>\n )}\n </div>\n )}\n </div>\n\n {/* File List */}\n {showUploadList && fileList.length > 0 && (\n <div\n className={cn(\n \"mt-4\",\n (effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\") &&\n \"grid gap-2\",\n effectiveListType === \"picture\" && \"space-y-2\",\n )}\n style={{\n gridTemplateColumns:\n effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\"\n ? `repeat(${pictureCardCols}, 1fr)`\n : undefined,\n minWidth:\n effectiveListType === \"picture-card\" ||\n effectiveListType === \"picture-circle\"\n ? \"100px\"\n : undefined,\n }}\n >\n {fileList\n .filter((file) => file.response !== Upload.LIST_IGNORE)\n .map((file) => (\n <FileItem\n key={file.uid}\n file={file}\n listType={effectiveListType}\n onRemove={() => handleRemove(file)}\n onPreview={handlePreview}\n onDownload={handleDownload}\n showPreviewIcon={uploadListConfig.showPreviewIcon}\n showRemoveIcon={uploadListConfig.showRemoveIcon}\n showDownloadIcon={uploadListConfig.showDownloadIcon}\n pictureCardSize={pictureCardSize}\n />\n ))}\n </div>\n )}\n </div>\n\n {/* Built-in preview dialog */}\n <Dialog\n open={previewOpen}\n onOpenChange={setPreviewOpen}\n title={previewTitle}\n size=\"lg\"\n >\n <img\n src={previewImage}\n alt={previewTitle}\n className=\"w-full h-auto max-h-[70vh] object-contain\"\n />\n </Dialog>\n </>\n );\n },\n);\n\nUploadBase.displayName = \"Upload\";\n\n// Add static property for LIST_IGNORE\ninterface UploadComponent extends React.ForwardRefExoticComponent<\n UploadProps & React.RefAttributes<HTMLDivElement>\n> {\n LIST_IGNORE: string;\n}\n\nexport const Upload = UploadBase as UploadComponent;\nUpload.LIST_IGNORE = \"LIST_IGNORE\";\n\n// File Item Component\ninterface FileItemProps {\n file: UploadFile;\n listType: \"text\" | \"picture\" | \"picture-card\" | \"picture-circle\";\n onRemove: () => void;\n onPreview?: (file: UploadFile) => void;\n onDownload?: (file: UploadFile) => void;\n showPreviewIcon?: boolean;\n showRemoveIcon?: boolean;\n showDownloadIcon?: boolean;\n pictureCardSize?: number;\n}\n\nconst FileItem: React.FC<FileItemProps> = ({\n file,\n listType,\n onRemove,\n onPreview,\n onDownload,\n showPreviewIcon,\n showRemoveIcon,\n showDownloadIcon,\n // pictureCardSize, // Unused currently\n}) => {\n const isImage = file.type?.startsWith(\"image/\");\n const canPreview = isImage || file.url;\n\n if (listType === \"picture-card\") {\n return (\n <div\n className=\"relative aspect-square rounded-lg border bg-muted/50 overflow-hidden group\"\n style={{\n width: \"100px\",\n height: \"100px\",\n minWidth: \"100px\",\n minHeight: \"100px\",\n padding: \"4px\",\n }}\n >\n {/* Image or Icon */}\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"h-full w-full object-cover rounded-lg\"\n />\n ) : (\n <div className=\"flex items-center justify-center h-full\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center\">\n <div className=\"w-full px-4\">\n <div className=\"flex items-center gap-2 mb-2\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-xs\">{file.percent}%</span>\n </div>\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Status Icon */}\n {file.status === \"done\" && (\n <div className=\"absolute top-2 right-2 bg-green-500 rounded-full p-1\">\n <CheckCircle2 className=\"h-4 w-4 text-white\" />\n </div>\n )}\n {file.status === \"error\" && (\n <div className=\"absolute top-2 right-2 bg-red-500 rounded-full p-1\">\n <AlertCircle className=\"h-4 w-4 text-white\" />\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4 text-white\" />\n </button>\n )}\n </div>\n\n {/* File name tooltip */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 transition-opacity\">\n {file.name}\n </div>\n </div>\n );\n }\n\n if (listType === \"picture-circle\") {\n return (\n <div\n className={cn(\n \"relative aspect-square rounded-full border bg-muted/50 overflow-hidden group\",\n file.status === \"done\" && \"border-2 border-green-500\",\n file.status === \"error\" && \"border-2 border-red-500\",\n )}\n style={{\n width: \"100px\",\n height: \"100px\",\n minWidth: \"100px\",\n minHeight: \"100px\",\n padding: \"4px\",\n }}\n >\n {/* Image or Icon */}\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"h-full w-full object-cover rounded-full\"\n />\n ) : (\n <div className=\"flex items-center justify-center h-full rounded-full bg-muted\">\n {getFileIcon(file)}\n </div>\n )}\n\n {/* Upload Progress */}\n {file.status === \"uploading\" && (\n <div className=\"absolute inset-0 bg-background/80 flex items-center justify-center rounded-full\">\n <div className=\"w-full px-4\">\n <div className=\"flex items-center gap-2 mb-2 justify-center\">\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-xs\">{file.percent}%</span>\n </div>\n <div className=\"h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n </div>\n </div>\n )}\n\n {/* Hover Actions */}\n <div className=\"absolute inset-0 bg-black/60 opacity-0 group-hover:opacity-100 transition-opacity flex items-center justify-center gap-2 rounded-full\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded-full bg-background/20 hover:bg-background/30 transition-colors\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4 text-white\" />\n </button>\n )}\n {/* File name tooltip */}\n <div className=\"absolute bottom-0 left-0 right-0 bg-black/60 p-2 text-white text-xs truncate opacity-0 group-hover:opacity-100 transition-opacity\">\n {file.name}\n </div>\n </div>\n </div>\n );\n }\n\n if (listType === \"picture\") {\n return (\n <div className=\"flex items-center gap-3 p-2 rounded-lg border bg-background hover:bg-muted/50 transition-colors group\">\n {/* Thumbnail */}\n <div className=\"shrink-0 h-10 w-10 rounded overflow-hidden bg-muted flex items-center justify-center\">\n {file.url && isImage ? (\n <img\n src={file.thumbUrl || file.url}\n alt={file.name}\n className=\"h-full w-full object-cover\"\n />\n ) : (\n getFileIcon(file)\n )}\n </div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"text-sm font-medium truncate\">{file.name}</p>\n <div className=\"flex items-center gap-2 mt-1\">\n {file.size && (\n <span className=\"text-xs text-muted-foreground\">\n {formatFileSize(file.size)}\n </span>\n )}\n {file.status === \"uploading\" && (\n <span className=\"text-xs text-primary\">{file.percent}%</span>\n )}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"h-4 w-4 text-green-500\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"h-4 w-4 text-red-500\" />\n )}\n </div>\n {file.status === \"uploading\" && (\n <div className=\"h-1 bg-muted rounded-full overflow-hidden mt-2\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1.5 rounded hover:bg-muted transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1.5 rounded hover:bg-muted transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1.5 rounded hover:bg-destructive/10 transition-colors text-destructive\"\n title=\"Remove\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n }\n\n // Text list\n return (\n <div className=\"flex items-center gap-2 p-2 rounded hover:bg-muted/50 transition-colors group\">\n {/* Icon */}\n <div className=\"shrink-0\">{getFileIcon(file)}</div>\n\n {/* Info */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <p className=\"text-sm truncate\">{file.name}</p>\n {/* Status */}\n {file.status === \"done\" && (\n <CheckCircle2 className=\"h-4 w-4 text-green-500 shrink-0\" />\n )}\n {file.status === \"error\" && (\n <AlertCircle className=\"h-4 w-4 text-red-500 shrink-0\" />\n )}\n {file.status === \"uploading\" && (\n <Loader2 className=\"h-4 w-4 animate-spin shrink-0\" />\n )}\n </div>\n\n {file.status === \"uploading\" && (\n <div className=\"flex items-center gap-2\">\n <div className=\"flex-1 h-1 bg-muted rounded-full overflow-hidden\">\n <div\n className=\"h-full bg-primary transition-all duration-300\"\n style={{ width: `${file.percent}%` }}\n />\n </div>\n <span className=\"text-xs text-muted-foreground\">\n {file.percent}%\n </span>\n </div>\n )}\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity\">\n {showPreviewIcon && canPreview && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onPreview?.(file);\n }}\n className=\"p-1 rounded hover:bg-muted transition-colors\"\n title=\"Preview\"\n >\n <Eye className=\"h-4 w-4\" />\n </button>\n )}\n {showDownloadIcon && file.url && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onDownload?.(file);\n }}\n className=\"p-1 rounded hover:bg-muted transition-colors\"\n title=\"Download\"\n >\n <Download className=\"h-4 w-4\" />\n </button>\n )}\n {showRemoveIcon && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onRemove();\n }}\n className=\"p-1 rounded hover:bg-destructive/10 transition-colors text-destructive\"\n title=\"Remove\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n );\n};\n\nexport default Upload;\n"],"names":["uploadVariants","cva","getFileIcon","file","type","name","jsx","ImageIcon","Film","Music","Archive","FileCode","FileText","File","formatFileSize","bytes","k","sizes","i","generateUID","UploadBase","React","className","variant","accept","multiple","disabled","controlledFileList","defaultFileList","action","customRequest","beforeUpload","onChange","onRemove","onPreview","onDownload","maxCount","maxSize","listType","showUploadList","pictureCardSize","pictureCardCols","iconOnly","showBorder","uploadText","uploadDescription","uploadIcon","size","children","headers","withCredentials","directory","props","ref","inputRef","useRef","internalFileList","setInternalFileList","useState","isDragOver","setIsDragOver","previewOpen","setPreviewOpen","previewImage","setPreviewImage","previewTitle","setPreviewTitle","fileList","setFileList","isDropzoneVariant","effectiveListType","fileListRef","canUploadMore","updateFileList","useCallback","updater","newList","uploadFile","previewUrl","uploadFileObj","prev","percent","updatedFile","f","response","successFile","error","errorFile","url","formData","xhr","e","key","value","handleFileChange","files","toast","uploadedCount","validFiles","uploadFileObjects","index","handleRemove","handleDragOver","handleDragLeave","handleDrop","handleClick","handlePreview","handleDownload","blob","blobUrl","link","uploadListConfig","jsxs","Fragment","cn","Trash2","UploadIcon","CloudUploadIcon","Upload","FileItem","Dialog","showPreviewIcon","showRemoveIcon","showDownloadIcon","isImage","canPreview","Loader2","CheckCircle2","AlertCircle","Eye","Download","X"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react/jsx-runtime"),c=require("react"),T=require("@dsui/ui/index");function _(t){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(r,n,i.get?i:{enumerable:!0,get:()=>t[n]})}}return r.default=t,Object.freeze(r)}const z=_(c),P=t=>String(t).padStart(2,"0"),q=(t="primary")=>({primary:"text-primary",secondary:"text-secondary",accent:"text-accent",destructive:"text-destructive",muted:"text-muted-foreground",success:"text-success",error:"text-error",warning:"text-warning",foreground:"text-foreground"})[t],j=c.memo(z.forwardRef(({items:t,value:r,onChange:n,timeLabel:i,itemClassName:S,isItemDisabled:p,disabled:h,color:H="primary"},d)=>{const s=c.useRef(null),m=c.useRef(null),[N,C]=c.useState(0),b=c.useCallback(()=>{if(!m.current||h)return;const e=m.current,l=e.scrollTop;C(l),s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{const f=e.scrollTop,a=40,x=e.clientHeight/2,y=f-120+x;let u=t[0],v=1/0;t.forEach((R,O)=>{const E=O*a+a/2,k=Math.abs(E-y);k<v&&(v=k,u=R)}),u!==r&&!p(u)&&n(u)},150)},[t,r,n,p,h]);c.useEffect(()=>{const e=m.current;if(e)return e.addEventListener("scroll",b,{passive:!0}),()=>{e.removeEventListener("scroll",b),s.current&&clearTimeout(s.current)}},[b]),c.useEffect(()=>()=>{s.current&&clearTimeout(s.current)},[]);const M=(e,l)=>{const x=120+e*40+20,w=Math.abs(x-(N+128)),y=256/2;return{opacity:Math.max(.3,1-w/y*.7),fontSize:l?"1.3rem":"1rem",transition:"opacity 0.2s ease, transform 0.2s ease"}};return o.jsxs("div",{className:"flex flex-col items-center gap-2 w-full h-full max-h-72",children:[i&&o.jsx("div",{className:"text-xs font-semibold text-muted-foreground uppercase p-2 border-b w-full text-center h-8",children:i}),o.jsxs("div",{className:T.cn("relative w-full",i?"h-[calc(100%_-_2rem)]":" h-full"),children:[o.jsx("div",{className:"absolute top-1/2 left-0 right-0 h-10 -translate-y-1/2 border-t border-b border-border pointer-events-none z-10"}),o.jsxs("div",{ref:e=>{m.current=e,typeof d=="function"?d(e):d&&(d.current=e)},className:T.cn("relative h-full w-full min-w-20 min-h-60 overflow-y-scroll scroll-smooth","[&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent","[&::-webkit-scrollbar-thumb]:bg-border [&::-webkit-scrollbar-thumb]:rounded","flex flex-col snap-y snap-mandatory",S),style:{maskImage:"linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)",WebkitMaskImage:"linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)"},children:[o.jsx("div",{className:"h-[calc(50%-1.25rem)] flex-shrink-0"}),t.map((e,l)=>{const f=p(e),a=r!==void 0&&e===r,g=M(l,a);return o.jsx("div",{onClick:h||f?void 0:()=>n(e),"data-selected":a||void 0,className:T.cn("h-10 flex-shrink-0 flex items-center justify-center transition-all snap-center","cursor-pointer text-lg font-medium select-none","disabled:opacity-30 disabled:cursor-not-allowed disabled:line-through",a?`${q(H)} font-bold`:"text-muted-foreground"),style:g,children:P(e)},e)}),o.jsx("div",{className:"h-[calc(50%-1.25rem)] flex-shrink-0"})]})]})]})}));j.displayName="TimeColumnwheel";exports.TimeColumnwheel=j;
2
+ //# sourceMappingURL=WheelColumn.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WheelColumn.cjs","sources":["../../../src/components/WheelColumn.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { memo, useCallback, useEffect, useRef, useState } from \"react\";\nimport { cn } from \"@dsui/ui/index\";\nimport type { CalendarColor } from \"./Calendar/Calendar\";\n\nconst pad = (num: number): string => String(num).padStart(2, \"0\");\n\n// Color variants for time picker items\nconst getColorClass = (color: CalendarColor = \"primary\"): string => {\n const colorMap = {\n primary: \"text-primary\",\n secondary: \"text-secondary\",\n accent: \"text-accent\",\n destructive: \"text-destructive\",\n muted: \"text-muted-foreground\",\n success: \"text-success\",\n error: \"text-error\",\n warning: \"text-warning\",\n foreground: \"text-foreground\",\n };\n return colorMap[color];\n};\n\ntype TimeColumnwheelProps = {\n items: number[];\n value: number | undefined;\n onChange: (val: number) => void;\n timeLabel?: string;\n itemClassName?: string;\n isItemDisabled: (item: number) => boolean;\n disabled: boolean;\n color?: CalendarColor;\n};\n\nexport const TimeColumnwheel = memo(\n React.forwardRef<HTMLDivElement, TimeColumnwheelProps>(\n (\n {\n items,\n value: selectedValue,\n onChange: onChangeCol,\n timeLabel,\n itemClassName,\n isItemDisabled,\n disabled,\n color = \"primary\",\n },\n ref,\n ) => {\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [scrollTop, setScrollTop] = useState(0);\n\n // Debounced scroll handler\n const handleScroll = useCallback(() => {\n if (!containerRef.current || disabled) return;\n\n const container = containerRef.current;\n const currentScrollTop = container.scrollTop;\n setScrollTop(currentScrollTop);\n\n // Clear previous timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n\n // Set new timer\n debounceTimerRef.current = setTimeout(() => {\n const scrollTop = container.scrollTop;\n const itemHeight = 40; // h-10 = 40px\n const containerHeight = container.clientHeight;\n const dividerCenter = containerHeight / 2; // Divider lines ở giữa container\n\n // Calculate which item is at the divider center\n // Account for top spacer (h-30 = 120px)\n const adjustedScrollTop = scrollTop - 120;\n const dividerPosition = adjustedScrollTop + dividerCenter;\n\n // Find the item whose center is closest to divider center\n let closestItem = items[0];\n let minDistance = Infinity;\n\n items.forEach((item, index) => {\n const itemTop = index * itemHeight;\n const itemCenter = itemTop + itemHeight / 2;\n const distance = Math.abs(itemCenter - dividerPosition);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestItem = item;\n }\n });\n\n // Only trigger change if different from current value and not disabled\n if (closestItem !== selectedValue && !isItemDisabled(closestItem)) {\n onChangeCol(closestItem);\n }\n }, 150); // 150ms debounce\n }, [items, selectedValue, onChangeCol, isItemDisabled, disabled]);\n\n // Set up scroll listener\n useEffect(() => {\n const container = containerRef.current;\n if (container) {\n container.addEventListener(\"scroll\", handleScroll, { passive: true });\n return () => {\n container.removeEventListener(\"scroll\", handleScroll);\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }\n }, [handleScroll]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current);\n }\n };\n }, []);\n\n const getItemStyle = (index: number, isSelected: boolean) => {\n const itemHeight = 40;\n const containerHeight = 256; // h-64 = 256px\n const centerY = containerHeight / 2;\n const itemCenterY = 120 + index * itemHeight + itemHeight / 2; // 120px spacer + item position\n const distanceFromCenter = Math.abs(\n itemCenterY - (scrollTop + centerY),\n );\n const maxDistance = containerHeight / 2;\n\n // Calculate opacity and scale based on distance\n const opacity = Math.max(\n 0.3,\n 1 - (distanceFromCenter / maxDistance) * 0.7,\n );\n const fontSize = isSelected ? \"1.3rem\" : \"1rem\";\n\n return {\n opacity,\n fontSize,\n transition: \"opacity 0.2s ease, transform 0.2s ease\",\n };\n };\n\n return (\n <div className=\"flex flex-col items-center gap-2 w-full h-full max-h-72\">\n {timeLabel && (\n <div className=\"text-xs font-semibold text-muted-foreground uppercase p-2 border-b w-full text-center h-8\">\n {timeLabel}\n </div>\n )}\n <div\n className={cn(\n \"relative w-full\",\n timeLabel ? \"h-[calc(100%_-_2rem)]\" : \" h-full\",\n )}\n >\n {/* wheel style divider lines */}\n <div className=\"absolute top-1/2 left-0 right-0 h-10 -translate-y-1/2 border-t border-b border-border pointer-events-none z-10\" />\n\n <div\n ref={(el) => {\n containerRef.current = el;\n if (typeof ref === \"function\") {\n ref(el);\n } else if (ref) {\n ref.current = el;\n }\n }}\n className={cn(\n \"relative h-full w-full min-w-20 min-h-60 overflow-y-scroll scroll-smooth\",\n \"[&::-webkit-scrollbar]:w-1 [&::-webkit-scrollbar-track]:bg-transparent\",\n \"[&::-webkit-scrollbar-thumb]:bg-border [&::-webkit-scrollbar-thumb]:rounded\",\n \"flex flex-col snap-y snap-mandatory\",\n itemClassName,\n )}\n style={{\n maskImage: `linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)`,\n WebkitMaskImage: `linear-gradient(to bottom, transparent 0%, black 15%, black 85%, transparent 100%)`,\n }}\n >\n {/* Spacer Top */}\n <div className=\"h-[calc(50%-1.25rem)] flex-shrink-0\" />\n\n {items.map((item, index) => {\n const itemDisabled = isItemDisabled(item);\n const isSelected =\n selectedValue !== undefined && item === selectedValue;\n const itemStyle = getItemStyle(index, isSelected);\n\n return (\n <div\n key={item}\n onClick={\n disabled || itemDisabled\n ? undefined\n : () => onChangeCol(item)\n }\n data-selected={isSelected || undefined}\n className={cn(\n \"h-10 flex-shrink-0 flex items-center justify-center transition-all snap-center\",\n \"cursor-pointer text-lg font-medium select-none\",\n \"disabled:opacity-30 disabled:cursor-not-allowed disabled:line-through\",\n isSelected\n ? `${getColorClass(color)} font-bold`\n : \"text-muted-foreground\",\n )}\n style={itemStyle}\n >\n {pad(item)}\n </div>\n );\n })}\n\n {/* Spacer Bottom */}\n <div className=\"h-[calc(50%-1.25rem)] flex-shrink-0\" />\n </div>\n </div>\n </div>\n );\n },\n ),\n);\n\nTimeColumnwheel.displayName = \"TimeColumnwheel\";\n"],"names":["pad","num","getColorClass","color","TimeColumnwheel","memo","React","items","selectedValue","onChangeCol","timeLabel","itemClassName","isItemDisabled","disabled","ref","debounceTimerRef","useRef","containerRef","scrollTop","setScrollTop","useState","handleScroll","useCallback","container","currentScrollTop","itemHeight","dividerCenter","dividerPosition","closestItem","minDistance","item","index","itemCenter","distance","useEffect","getItemStyle","isSelected","itemCenterY","distanceFromCenter","maxDistance","jsxs","jsx","cn","el","itemDisabled","itemStyle"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e="dd/MM/yyyy";exports.DATE_FORMAT=e;
2
+ //# sourceMappingURL=common.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.cjs","sources":["../../../src/constants/common.ts"],"sourcesContent":["export const DATE_FORMAT = \"dd/MM/yyyy\";\nexport const TIME_FORMAT = \"HH:mm\";\nexport const DATE_TIME_FORMAT = `${DATE_FORMAT} ${TIME_FORMAT}`;\n"],"names":["DATE_FORMAT"],"mappings":"gFAAO,MAAMA,EAAc"}
Binary file
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react");function o(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const c=o(u);function a(e){const t=c.useRef(e);return c.useEffect(()=>{t.current=e}),c.useMemo(()=>((...r)=>t.current?.(...r)),[])}exports.useCallbackRef=a;
2
+ //# sourceMappingURL=use-callback-ref.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-callback-ref.cjs","sources":["../../../src/hooks/use-callback-ref.ts"],"sourcesContent":["import * as React from \"react\";\n\n/**\n * @see https://github.com/radix-ui/primitives/blob/main/packages/react/use-callback-ref/src/useCallbackRef.tsx\n */\n\n/**\n * A custom hook that converts a callback to a ref to avoid triggering re-renders when passed as a\n * prop or avoid re-executing effects when passed as a dependency\n */\nfunction useCallbackRef<T extends (...args: never[]) => unknown>(\n callback: T | undefined,\n): T {\n const callbackRef = React.useRef(callback);\n\n React.useEffect(() => {\n callbackRef.current = callback;\n });\n\n // https://github.com/facebook/react/issues/19240\n return React.useMemo(\n () => ((...args) => callbackRef.current?.(...args)) as T,\n [],\n );\n}\n\nexport { useCallbackRef };\n"],"names":["useCallbackRef","callback","callbackRef","React","args"],"mappings":"mYAUA,SAASA,EACPC,EACG,CACH,MAAMC,EAAcC,EAAM,OAAOF,CAAQ,EAEzCE,OAAAA,EAAM,UAAU,IAAM,CACpBD,EAAY,QAAUD,CACxB,CAAC,EAGME,EAAM,QACX,KAAO,IAAIC,IAASF,EAAY,UAAU,GAAGE,CAAI,GACjD,CAAA,CAAC,CAEL"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("react"),a=require("./use-callback-ref.cjs");function l(e){const c=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const n=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(c,t,n.get?n:{enumerable:!0,get:()=>e[t]})}}return c.default=e,Object.freeze(c)}const u=l(o);function s(e,c){const t=a.useCallbackRef(e),n=u.useRef(0);return u.useEffect(()=>()=>window.clearTimeout(n.current),[]),u.useCallback((...r)=>{window.clearTimeout(n.current),n.current=window.setTimeout(()=>t(...r),c)},[t,c])}exports.useDebouncedCallback=s;
2
+ //# sourceMappingURL=use-debounced-callback.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-debounced-callback.cjs","sources":["../../../src/hooks/use-debounced-callback.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { useCallbackRef } from \"@/hooks/use-callback-ref\";\n\nexport function useDebouncedCallback<T extends (...args: never[]) => unknown>(\n callback: T,\n delay: number,\n) {\n const handleCallback = useCallbackRef(callback);\n const debounceTimerRef = React.useRef(0);\n React.useEffect(\n () => () => window.clearTimeout(debounceTimerRef.current),\n [],\n );\n\n const setValue = React.useCallback(\n (...args: Parameters<T>) => {\n window.clearTimeout(debounceTimerRef.current);\n debounceTimerRef.current = window.setTimeout(\n () => handleCallback(...args),\n delay,\n );\n },\n [handleCallback, delay],\n );\n\n return setValue;\n}\n"],"names":["useDebouncedCallback","callback","delay","handleCallback","useCallbackRef","debounceTimerRef","React","args"],"mappings":"uaAIO,SAASA,EACdC,EACAC,EACA,CACA,MAAMC,EAAiBC,EAAAA,eAAeH,CAAQ,EACxCI,EAAmBC,EAAM,OAAO,CAAC,EACvCA,OAAAA,EAAM,UACJ,IAAM,IAAM,OAAO,aAAaD,EAAiB,OAAO,EACxD,CAAA,CAAC,EAGcC,EAAM,YACrB,IAAIC,IAAwB,CAC1B,OAAO,aAAaF,EAAiB,OAAO,EAC5CA,EAAiB,QAAU,OAAO,WAChC,IAAMF,EAAe,GAAGI,CAAI,EAC5BL,CAAA,CAEJ,EACA,CAACC,EAAgBD,CAAK,CAAA,CAI1B"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react"),a=require("./use-debounced-callback.cjs");function b(u,o){const e=u instanceof Function?u():u,[s,r]=t.useState(e),n=t.useRef(e),c=a.useDebouncedCallback(r,o);return n.current!==e&&(c(e),n.current=e),[s,c]}exports.useDebounceValue=b;
2
+ //# sourceMappingURL=use-debounced-value.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-debounced-value.cjs","sources":["../../../src/hooks/use-debounced-value.ts"],"sourcesContent":["\"use client\";\nimport { useRef, useState } from \"react\";\nimport { useDebouncedCallback } from \"./use-debounced-callback\";\n\n/**\n * Custom hook that returns a debounced version of the provided value, along with a function to update it.\n * @param initialValue The value to be debounced\n * @param delay The delay in milliseconds before the value is updated (default is 500ms)\n * @param options Optional configurations for the debouncing behavior\n * @returns An array containing the debounced value and the function to update it\n */\nexport function useDebounceValue<T>(\n initialValue: T | (() => T),\n delay: number,\n): [T, (value: T) => void] {\n const unwrappedInitialValue =\n initialValue instanceof Function ? initialValue() : initialValue;\n const [debouncedValue, setDebouncedValue] = useState<T>(\n unwrappedInitialValue,\n );\n const previousValueRef = useRef<T | undefined>(unwrappedInitialValue);\n const updateDebouncedValue = useDebouncedCallback(setDebouncedValue, delay);\n // Update the debounced value if the initial value changes\n if (previousValueRef.current !== unwrappedInitialValue) {\n updateDebouncedValue(unwrappedInitialValue);\n previousValueRef.current = unwrappedInitialValue;\n }\n return [debouncedValue, updateDebouncedValue];\n}\n"],"names":["useDebounceValue","initialValue","delay","unwrappedInitialValue","debouncedValue","setDebouncedValue","useState","previousValueRef","useRef","updateDebouncedValue","useDebouncedCallback"],"mappings":"mJAWO,SAASA,EACdC,EACAC,EACyB,CACzB,MAAMC,EACJF,aAAwB,SAAWA,EAAA,EAAiBA,EAChD,CAACG,EAAgBC,CAAiB,EAAIC,EAAAA,SAC1CH,CAAA,EAEII,EAAmBC,EAAAA,OAAsBL,CAAqB,EAC9DM,EAAuBC,EAAAA,qBAAqBL,EAAmBH,CAAK,EAE1E,OAAIK,EAAiB,UAAYJ,IAC/BM,EAAqBN,CAAqB,EAC1CI,EAAiB,QAAUJ,GAEtB,CAACC,EAAgBK,CAAoB,CAC9C"}