@arolariu/components 0.0.40 → 0.1.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 (475) hide show
  1. package/DEBUGGING.md +396 -401
  2. package/EXAMPLES.md +1035 -1035
  3. package/{LICENSE → LICENSE.md} +21 -21
  4. package/{readme.md → README.md} +627 -627
  5. package/changelog.md +17 -0
  6. package/dist/components/ui/accordion.d.ts.map +1 -0
  7. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  8. package/dist/components/ui/alert.d.ts.map +1 -0
  9. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  10. package/dist/components/ui/avatar.d.ts.map +1 -0
  11. package/dist/components/ui/background-beams.d.ts.map +1 -0
  12. package/dist/components/ui/badge.d.ts.map +1 -0
  13. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  14. package/dist/components/ui/bubble-background.d.ts.map +1 -0
  15. package/dist/components/ui/bubble-background.js.map +1 -0
  16. package/dist/components/ui/button.d.ts.map +1 -0
  17. package/dist/components/ui/calendar.d.ts.map +1 -0
  18. package/dist/{esm/components → components}/ui/calendar.js +1 -1
  19. package/dist/components/ui/calendar.js.map +1 -0
  20. package/dist/components/ui/card.d.ts.map +1 -0
  21. package/dist/components/ui/carousel.d.ts.map +1 -0
  22. package/dist/{types/components → components}/ui/chart.d.ts +13 -13
  23. package/dist/components/ui/chart.d.ts.map +1 -0
  24. package/dist/{esm/components → components}/ui/chart.js +4 -1
  25. package/dist/components/ui/chart.js.map +1 -0
  26. package/dist/components/ui/checkbox.d.ts.map +1 -0
  27. package/dist/components/ui/collapsible.d.ts.map +1 -0
  28. package/dist/components/ui/command.d.ts.map +1 -0
  29. package/dist/components/ui/context-menu.d.ts.map +1 -0
  30. package/dist/components/ui/counting-number.d.ts.map +1 -0
  31. package/dist/components/ui/dialog.d.ts.map +1 -0
  32. package/dist/components/ui/dot-background.d.ts.map +1 -0
  33. package/dist/components/ui/drawer.d.ts.map +1 -0
  34. package/dist/components/ui/drawer.js.map +1 -0
  35. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  36. package/dist/components/ui/dropdrawer.d.ts.map +1 -0
  37. package/dist/components/ui/dropdrawer.js.map +1 -0
  38. package/dist/components/ui/fireworks-background.d.ts.map +1 -0
  39. package/dist/components/ui/flip-button.d.ts.map +1 -0
  40. package/dist/components/ui/form.d.ts.map +1 -0
  41. package/dist/components/ui/gradient-background.d.ts.map +1 -0
  42. package/dist/components/ui/gradient-text.d.ts.map +1 -0
  43. package/dist/components/ui/highlight-text.d.ts.map +1 -0
  44. package/dist/components/ui/hole-background.d.ts.map +1 -0
  45. package/dist/components/ui/hover-card.d.ts.map +1 -0
  46. package/dist/components/ui/input-otp.d.ts.map +1 -0
  47. package/dist/components/ui/input.d.ts.map +1 -0
  48. package/dist/components/ui/input.js.map +1 -0
  49. package/dist/components/ui/label.d.ts.map +1 -0
  50. package/dist/components/ui/menubar.d.ts.map +1 -0
  51. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  52. package/dist/components/ui/pagination.d.ts.map +1 -0
  53. package/dist/components/ui/popover.d.ts.map +1 -0
  54. package/dist/components/ui/progress.d.ts.map +1 -0
  55. package/dist/components/ui/radio-group.d.ts.map +1 -0
  56. package/dist/components/ui/resizable.d.ts.map +1 -0
  57. package/dist/components/ui/ripple-button.d.ts.map +1 -0
  58. package/dist/components/ui/ripple-button.js.map +1 -0
  59. package/dist/components/ui/scratcher.d.ts.map +1 -0
  60. package/dist/components/ui/scratcher.js.map +1 -0
  61. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  62. package/dist/components/ui/select.d.ts.map +1 -0
  63. package/dist/components/ui/separator.d.ts.map +1 -0
  64. package/dist/components/ui/sheet.d.ts.map +1 -0
  65. package/dist/components/ui/sidebar.d.ts.map +1 -0
  66. package/dist/components/ui/skeleton.d.ts.map +1 -0
  67. package/dist/components/ui/slider.d.ts.map +1 -0
  68. package/dist/components/ui/sonner.d.ts.map +1 -0
  69. package/dist/components/ui/switch.d.ts.map +1 -0
  70. package/dist/components/ui/table.d.ts.map +1 -0
  71. package/dist/components/ui/tabs.d.ts.map +1 -0
  72. package/dist/components/ui/textarea.d.ts.map +1 -0
  73. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  74. package/dist/components/ui/toggle.d.ts.map +1 -0
  75. package/dist/components/ui/tooltip.d.ts.map +1 -0
  76. package/dist/components/ui/typewriter.d.ts +18 -0
  77. package/dist/components/ui/typewriter.d.ts.map +1 -0
  78. package/dist/components/ui/typewriter.js +128 -0
  79. package/dist/components/ui/typewriter.js.map +1 -0
  80. package/dist/hooks/use-mobile.d.ts.map +1 -0
  81. package/dist/hooks/use-mobile.js.map +1 -0
  82. package/dist/index.css +66 -0
  83. package/dist/index.css.map +1 -0
  84. package/dist/{types/index.d.ts → index.d.ts} +2 -1
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +63 -62
  87. package/dist/lib/utils.d.ts.map +1 -0
  88. package/dist/lib/utils.js.map +1 -0
  89. package/package.json +254 -319
  90. package/src/components/ui/bubble-background.tsx +189 -189
  91. package/src/components/ui/calendar.tsx +216 -213
  92. package/src/components/ui/chart.tsx +385 -380
  93. package/src/components/ui/drawer.tsx +141 -141
  94. package/src/components/ui/dropdrawer.tsx +973 -973
  95. package/src/components/ui/input.tsx +22 -22
  96. package/src/components/ui/ripple-button.tsx +111 -111
  97. package/src/components/ui/scratcher.tsx +171 -171
  98. package/src/components/ui/typewriter.tsx +188 -0
  99. package/src/hooks/use-mobile.tsx +44 -44
  100. package/src/index.css +67 -69
  101. package/src/index.ts +407 -400
  102. package/src/lib/utils.ts +10 -10
  103. package/dist/cjs/components/ui/accordion.cjs +0 -92
  104. package/dist/cjs/components/ui/accordion.cjs.map +0 -1
  105. package/dist/cjs/components/ui/alert-dialog.cjs +0 -152
  106. package/dist/cjs/components/ui/alert-dialog.cjs.map +0 -1
  107. package/dist/cjs/components/ui/alert.cjs +0 -83
  108. package/dist/cjs/components/ui/alert.cjs.map +0 -1
  109. package/dist/cjs/components/ui/aspect-ratio.cjs +0 -47
  110. package/dist/cjs/components/ui/aspect-ratio.cjs.map +0 -1
  111. package/dist/cjs/components/ui/avatar.cjs +0 -69
  112. package/dist/cjs/components/ui/avatar.cjs.map +0 -1
  113. package/dist/cjs/components/ui/background-beams.cjs +0 -200
  114. package/dist/cjs/components/ui/background-beams.cjs.map +0 -1
  115. package/dist/cjs/components/ui/badge.cjs +0 -69
  116. package/dist/cjs/components/ui/badge.cjs.map +0 -1
  117. package/dist/cjs/components/ui/breadcrumb.cjs +0 -128
  118. package/dist/cjs/components/ui/breadcrumb.cjs.map +0 -1
  119. package/dist/cjs/components/ui/bubble-background.cjs +0 -213
  120. package/dist/cjs/components/ui/bubble-background.cjs.map +0 -1
  121. package/dist/cjs/components/ui/button.cjs +0 -80
  122. package/dist/cjs/components/ui/button.cjs.map +0 -1
  123. package/dist/cjs/components/ui/calendar.cjs +0 -146
  124. package/dist/cjs/components/ui/calendar.cjs.map +0 -1
  125. package/dist/cjs/components/ui/card.cjs +0 -108
  126. package/dist/cjs/components/ui/card.cjs.map +0 -1
  127. package/dist/cjs/components/ui/carousel.cjs +0 -207
  128. package/dist/cjs/components/ui/carousel.cjs.map +0 -1
  129. package/dist/cjs/components/ui/chart.cjs +0 -221
  130. package/dist/cjs/components/ui/chart.cjs.map +0 -1
  131. package/dist/cjs/components/ui/checkbox.cjs +0 -57
  132. package/dist/cjs/components/ui/checkbox.cjs.map +0 -1
  133. package/dist/cjs/components/ui/collapsible.cjs +0 -65
  134. package/dist/cjs/components/ui/collapsible.cjs.map +0 -1
  135. package/dist/cjs/components/ui/command.cjs +0 -159
  136. package/dist/cjs/components/ui/command.cjs.map +0 -1
  137. package/dist/cjs/components/ui/context-menu.cjs +0 -219
  138. package/dist/cjs/components/ui/context-menu.cjs.map +0 -1
  139. package/dist/cjs/components/ui/counting-number.cjs +0 -95
  140. package/dist/cjs/components/ui/counting-number.cjs.map +0 -1
  141. package/dist/cjs/components/ui/dialog.cjs +0 -156
  142. package/dist/cjs/components/ui/dialog.cjs.map +0 -1
  143. package/dist/cjs/components/ui/dot-background.cjs +0 -131
  144. package/dist/cjs/components/ui/dot-background.cjs.map +0 -1
  145. package/dist/cjs/components/ui/drawer.cjs +0 -147
  146. package/dist/cjs/components/ui/drawer.cjs.map +0 -1
  147. package/dist/cjs/components/ui/dropdown-menu.cjs +0 -220
  148. package/dist/cjs/components/ui/dropdown-menu.cjs.map +0 -1
  149. package/dist/cjs/components/ui/dropdrawer.cjs +0 -627
  150. package/dist/cjs/components/ui/dropdrawer.cjs.map +0 -1
  151. package/dist/cjs/components/ui/fireworks-background.cjs +0 -259
  152. package/dist/cjs/components/ui/fireworks-background.cjs.map +0 -1
  153. package/dist/cjs/components/ui/flip-button.cjs +0 -100
  154. package/dist/cjs/components/ui/flip-button.cjs.map +0 -1
  155. package/dist/cjs/components/ui/form.cjs +0 -149
  156. package/dist/cjs/components/ui/form.cjs.map +0 -1
  157. package/dist/cjs/components/ui/gradient-background.cjs +0 -60
  158. package/dist/cjs/components/ui/gradient-background.cjs.map +0 -1
  159. package/dist/cjs/components/ui/gradient-text.cjs +0 -83
  160. package/dist/cjs/components/ui/gradient-text.cjs.map +0 -1
  161. package/dist/cjs/components/ui/highlight-text.cjs +0 -74
  162. package/dist/cjs/components/ui/highlight-text.cjs.map +0 -1
  163. package/dist/cjs/components/ui/hole-background.cjs +0 -361
  164. package/dist/cjs/components/ui/hole-background.cjs.map +0 -1
  165. package/dist/cjs/components/ui/hover-card.cjs +0 -72
  166. package/dist/cjs/components/ui/hover-card.cjs.map +0 -1
  167. package/dist/cjs/components/ui/input-otp.cjs +0 -94
  168. package/dist/cjs/components/ui/input-otp.cjs.map +0 -1
  169. package/dist/cjs/components/ui/input.cjs +0 -49
  170. package/dist/cjs/components/ui/input.cjs.map +0 -1
  171. package/dist/cjs/components/ui/label.cjs +0 -49
  172. package/dist/cjs/components/ui/label.cjs.map +0 -1
  173. package/dist/cjs/components/ui/menubar.cjs +0 -233
  174. package/dist/cjs/components/ui/menubar.cjs.map +0 -1
  175. package/dist/cjs/components/ui/navigation-menu.cjs +0 -144
  176. package/dist/cjs/components/ui/navigation-menu.cjs.map +0 -1
  177. package/dist/cjs/components/ui/pagination.cjs +0 -142
  178. package/dist/cjs/components/ui/pagination.cjs.map +0 -1
  179. package/dist/cjs/components/ui/popover.cjs +0 -80
  180. package/dist/cjs/components/ui/popover.cjs.map +0 -1
  181. package/dist/cjs/components/ui/progress.cjs +0 -56
  182. package/dist/cjs/components/ui/progress.cjs.map +0 -1
  183. package/dist/cjs/components/ui/radio-group.cjs +0 -67
  184. package/dist/cjs/components/ui/radio-group.cjs.map +0 -1
  185. package/dist/cjs/components/ui/resizable.cjs +0 -75
  186. package/dist/cjs/components/ui/resizable.cjs.map +0 -1
  187. package/dist/cjs/components/ui/ripple-button.cjs +0 -108
  188. package/dist/cjs/components/ui/ripple-button.cjs.map +0 -1
  189. package/dist/cjs/components/ui/scratcher.cjs +0 -179
  190. package/dist/cjs/components/ui/scratcher.cjs.map +0 -1
  191. package/dist/cjs/components/ui/scroll-area.cjs +0 -73
  192. package/dist/cjs/components/ui/scroll-area.cjs.map +0 -1
  193. package/dist/cjs/components/ui/select.cjs +0 -177
  194. package/dist/cjs/components/ui/select.cjs.map +0 -1
  195. package/dist/cjs/components/ui/separator.cjs +0 -51
  196. package/dist/cjs/components/ui/separator.cjs.map +0 -1
  197. package/dist/cjs/components/ui/sheet.cjs +0 -150
  198. package/dist/cjs/components/ui/sheet.cjs.map +0 -1
  199. package/dist/cjs/components/ui/sidebar.cjs +0 -513
  200. package/dist/cjs/components/ui/sidebar.cjs.map +0 -1
  201. package/dist/cjs/components/ui/skeleton.cjs +0 -48
  202. package/dist/cjs/components/ui/skeleton.cjs.map +0 -1
  203. package/dist/cjs/components/ui/slider.cjs +0 -78
  204. package/dist/cjs/components/ui/slider.cjs.map +0 -1
  205. package/dist/cjs/components/ui/sonner.cjs +0 -58
  206. package/dist/cjs/components/ui/sonner.cjs.map +0 -1
  207. package/dist/cjs/components/ui/switch.cjs +0 -53
  208. package/dist/cjs/components/ui/switch.cjs.map +0 -1
  209. package/dist/cjs/components/ui/table.cjs +0 -122
  210. package/dist/cjs/components/ui/table.cjs.map +0 -1
  211. package/dist/cjs/components/ui/tabs.cjs +0 -79
  212. package/dist/cjs/components/ui/tabs.cjs.map +0 -1
  213. package/dist/cjs/components/ui/textarea.cjs +0 -48
  214. package/dist/cjs/components/ui/textarea.cjs.map +0 -1
  215. package/dist/cjs/components/ui/toggle-group.cjs +0 -80
  216. package/dist/cjs/components/ui/toggle-group.cjs.map +0 -1
  217. package/dist/cjs/components/ui/toggle.cjs +0 -74
  218. package/dist/cjs/components/ui/toggle.cjs.map +0 -1
  219. package/dist/cjs/components/ui/tooltip.cjs +0 -88
  220. package/dist/cjs/components/ui/tooltip.cjs.map +0 -1
  221. package/dist/cjs/hooks/use-mobile.cjs +0 -52
  222. package/dist/cjs/hooks/use-mobile.cjs.map +0 -1
  223. package/dist/cjs/index.cjs +0 -905
  224. package/dist/cjs/index.cjs.map +0 -1
  225. package/dist/cjs/index.css +0 -7309
  226. package/dist/cjs/index.css.map +0 -1
  227. package/dist/cjs/lib/utils.cjs +0 -42
  228. package/dist/cjs/lib/utils.cjs.map +0 -1
  229. package/dist/esm/components/ui/bubble-background.js.map +0 -1
  230. package/dist/esm/components/ui/calendar.js.map +0 -1
  231. package/dist/esm/components/ui/chart.js.map +0 -1
  232. package/dist/esm/components/ui/drawer.js.map +0 -1
  233. package/dist/esm/components/ui/dropdrawer.js.map +0 -1
  234. package/dist/esm/components/ui/input.js.map +0 -1
  235. package/dist/esm/components/ui/ripple-button.js.map +0 -1
  236. package/dist/esm/components/ui/scratcher.js.map +0 -1
  237. package/dist/esm/hooks/use-mobile.js.map +0 -1
  238. package/dist/esm/index.css +0 -7309
  239. package/dist/esm/index.css.map +0 -1
  240. package/dist/esm/index.js +0 -62
  241. package/dist/esm/lib/utils.js.map +0 -1
  242. package/dist/types/components/ui/accordion.d.ts.map +0 -1
  243. package/dist/types/components/ui/alert-dialog.d.ts.map +0 -1
  244. package/dist/types/components/ui/alert.d.ts.map +0 -1
  245. package/dist/types/components/ui/aspect-ratio.d.ts.map +0 -1
  246. package/dist/types/components/ui/avatar.d.ts.map +0 -1
  247. package/dist/types/components/ui/background-beams.d.ts.map +0 -1
  248. package/dist/types/components/ui/badge.d.ts.map +0 -1
  249. package/dist/types/components/ui/breadcrumb.d.ts.map +0 -1
  250. package/dist/types/components/ui/bubble-background.d.ts.map +0 -1
  251. package/dist/types/components/ui/button.d.ts.map +0 -1
  252. package/dist/types/components/ui/calendar.d.ts.map +0 -1
  253. package/dist/types/components/ui/card.d.ts.map +0 -1
  254. package/dist/types/components/ui/carousel.d.ts.map +0 -1
  255. package/dist/types/components/ui/chart.d.ts.map +0 -1
  256. package/dist/types/components/ui/checkbox.d.ts.map +0 -1
  257. package/dist/types/components/ui/collapsible.d.ts.map +0 -1
  258. package/dist/types/components/ui/command.d.ts.map +0 -1
  259. package/dist/types/components/ui/context-menu.d.ts.map +0 -1
  260. package/dist/types/components/ui/counting-number.d.ts.map +0 -1
  261. package/dist/types/components/ui/dialog.d.ts.map +0 -1
  262. package/dist/types/components/ui/dot-background.d.ts.map +0 -1
  263. package/dist/types/components/ui/drawer.d.ts.map +0 -1
  264. package/dist/types/components/ui/dropdown-menu.d.ts.map +0 -1
  265. package/dist/types/components/ui/dropdrawer.d.ts.map +0 -1
  266. package/dist/types/components/ui/fireworks-background.d.ts.map +0 -1
  267. package/dist/types/components/ui/flip-button.d.ts.map +0 -1
  268. package/dist/types/components/ui/form.d.ts.map +0 -1
  269. package/dist/types/components/ui/gradient-background.d.ts.map +0 -1
  270. package/dist/types/components/ui/gradient-text.d.ts.map +0 -1
  271. package/dist/types/components/ui/highlight-text.d.ts.map +0 -1
  272. package/dist/types/components/ui/hole-background.d.ts.map +0 -1
  273. package/dist/types/components/ui/hover-card.d.ts.map +0 -1
  274. package/dist/types/components/ui/input-otp.d.ts.map +0 -1
  275. package/dist/types/components/ui/input.d.ts.map +0 -1
  276. package/dist/types/components/ui/label.d.ts.map +0 -1
  277. package/dist/types/components/ui/menubar.d.ts.map +0 -1
  278. package/dist/types/components/ui/navigation-menu.d.ts.map +0 -1
  279. package/dist/types/components/ui/pagination.d.ts.map +0 -1
  280. package/dist/types/components/ui/popover.d.ts.map +0 -1
  281. package/dist/types/components/ui/progress.d.ts.map +0 -1
  282. package/dist/types/components/ui/radio-group.d.ts.map +0 -1
  283. package/dist/types/components/ui/resizable.d.ts.map +0 -1
  284. package/dist/types/components/ui/ripple-button.d.ts.map +0 -1
  285. package/dist/types/components/ui/scratcher.d.ts.map +0 -1
  286. package/dist/types/components/ui/scroll-area.d.ts.map +0 -1
  287. package/dist/types/components/ui/select.d.ts.map +0 -1
  288. package/dist/types/components/ui/separator.d.ts.map +0 -1
  289. package/dist/types/components/ui/sheet.d.ts.map +0 -1
  290. package/dist/types/components/ui/sidebar.d.ts.map +0 -1
  291. package/dist/types/components/ui/skeleton.d.ts.map +0 -1
  292. package/dist/types/components/ui/slider.d.ts.map +0 -1
  293. package/dist/types/components/ui/sonner.d.ts.map +0 -1
  294. package/dist/types/components/ui/switch.d.ts.map +0 -1
  295. package/dist/types/components/ui/table.d.ts.map +0 -1
  296. package/dist/types/components/ui/tabs.d.ts.map +0 -1
  297. package/dist/types/components/ui/textarea.d.ts.map +0 -1
  298. package/dist/types/components/ui/toggle-group.d.ts.map +0 -1
  299. package/dist/types/components/ui/toggle.d.ts.map +0 -1
  300. package/dist/types/components/ui/tooltip.d.ts.map +0 -1
  301. package/dist/types/hooks/use-mobile.d.ts.map +0 -1
  302. package/dist/types/index.d.ts.map +0 -1
  303. package/dist/types/lib/utils.d.ts.map +0 -1
  304. package/tailwind.config.mjs +0 -65
  305. package/tsconfig.json +0 -58
  306. /package/dist/{types/components → components}/ui/accordion.d.ts +0 -0
  307. /package/dist/{esm/components → components}/ui/accordion.js +0 -0
  308. /package/dist/{esm/components → components}/ui/accordion.js.map +0 -0
  309. /package/dist/{types/components → components}/ui/alert-dialog.d.ts +0 -0
  310. /package/dist/{esm/components → components}/ui/alert-dialog.js +0 -0
  311. /package/dist/{esm/components → components}/ui/alert-dialog.js.map +0 -0
  312. /package/dist/{types/components → components}/ui/alert.d.ts +0 -0
  313. /package/dist/{esm/components → components}/ui/alert.js +0 -0
  314. /package/dist/{esm/components → components}/ui/alert.js.map +0 -0
  315. /package/dist/{types/components → components}/ui/aspect-ratio.d.ts +0 -0
  316. /package/dist/{esm/components → components}/ui/aspect-ratio.js +0 -0
  317. /package/dist/{esm/components → components}/ui/aspect-ratio.js.map +0 -0
  318. /package/dist/{types/components → components}/ui/avatar.d.ts +0 -0
  319. /package/dist/{esm/components → components}/ui/avatar.js +0 -0
  320. /package/dist/{esm/components → components}/ui/avatar.js.map +0 -0
  321. /package/dist/{types/components → components}/ui/background-beams.d.ts +0 -0
  322. /package/dist/{esm/components → components}/ui/background-beams.js +0 -0
  323. /package/dist/{esm/components → components}/ui/background-beams.js.map +0 -0
  324. /package/dist/{types/components → components}/ui/badge.d.ts +0 -0
  325. /package/dist/{esm/components → components}/ui/badge.js +0 -0
  326. /package/dist/{esm/components → components}/ui/badge.js.map +0 -0
  327. /package/dist/{types/components → components}/ui/breadcrumb.d.ts +0 -0
  328. /package/dist/{esm/components → components}/ui/breadcrumb.js +0 -0
  329. /package/dist/{esm/components → components}/ui/breadcrumb.js.map +0 -0
  330. /package/dist/{types/components → components}/ui/bubble-background.d.ts +0 -0
  331. /package/dist/{esm/components → components}/ui/bubble-background.js +0 -0
  332. /package/dist/{types/components → components}/ui/button.d.ts +0 -0
  333. /package/dist/{esm/components → components}/ui/button.js +0 -0
  334. /package/dist/{esm/components → components}/ui/button.js.map +0 -0
  335. /package/dist/{types/components → components}/ui/calendar.d.ts +0 -0
  336. /package/dist/{types/components → components}/ui/card.d.ts +0 -0
  337. /package/dist/{esm/components → components}/ui/card.js +0 -0
  338. /package/dist/{esm/components → components}/ui/card.js.map +0 -0
  339. /package/dist/{types/components → components}/ui/carousel.d.ts +0 -0
  340. /package/dist/{esm/components → components}/ui/carousel.js +0 -0
  341. /package/dist/{esm/components → components}/ui/carousel.js.map +0 -0
  342. /package/dist/{types/components → components}/ui/checkbox.d.ts +0 -0
  343. /package/dist/{esm/components → components}/ui/checkbox.js +0 -0
  344. /package/dist/{esm/components → components}/ui/checkbox.js.map +0 -0
  345. /package/dist/{types/components → components}/ui/collapsible.d.ts +0 -0
  346. /package/dist/{esm/components → components}/ui/collapsible.js +0 -0
  347. /package/dist/{esm/components → components}/ui/collapsible.js.map +0 -0
  348. /package/dist/{types/components → components}/ui/command.d.ts +0 -0
  349. /package/dist/{esm/components → components}/ui/command.js +0 -0
  350. /package/dist/{esm/components → components}/ui/command.js.map +0 -0
  351. /package/dist/{types/components → components}/ui/context-menu.d.ts +0 -0
  352. /package/dist/{esm/components → components}/ui/context-menu.js +0 -0
  353. /package/dist/{esm/components → components}/ui/context-menu.js.map +0 -0
  354. /package/dist/{types/components → components}/ui/counting-number.d.ts +0 -0
  355. /package/dist/{esm/components → components}/ui/counting-number.js +0 -0
  356. /package/dist/{esm/components → components}/ui/counting-number.js.map +0 -0
  357. /package/dist/{types/components → components}/ui/dialog.d.ts +0 -0
  358. /package/dist/{esm/components → components}/ui/dialog.js +0 -0
  359. /package/dist/{esm/components → components}/ui/dialog.js.map +0 -0
  360. /package/dist/{types/components → components}/ui/dot-background.d.ts +0 -0
  361. /package/dist/{esm/components → components}/ui/dot-background.js +0 -0
  362. /package/dist/{esm/components → components}/ui/dot-background.js.map +0 -0
  363. /package/dist/{types/components → components}/ui/drawer.d.ts +0 -0
  364. /package/dist/{esm/components → components}/ui/drawer.js +0 -0
  365. /package/dist/{types/components → components}/ui/dropdown-menu.d.ts +0 -0
  366. /package/dist/{esm/components → components}/ui/dropdown-menu.js +0 -0
  367. /package/dist/{esm/components → components}/ui/dropdown-menu.js.map +0 -0
  368. /package/dist/{types/components → components}/ui/dropdrawer.d.ts +0 -0
  369. /package/dist/{esm/components → components}/ui/dropdrawer.js +0 -0
  370. /package/dist/{types/components → components}/ui/fireworks-background.d.ts +0 -0
  371. /package/dist/{esm/components → components}/ui/fireworks-background.js +0 -0
  372. /package/dist/{esm/components → components}/ui/fireworks-background.js.map +0 -0
  373. /package/dist/{types/components → components}/ui/flip-button.d.ts +0 -0
  374. /package/dist/{esm/components → components}/ui/flip-button.js +0 -0
  375. /package/dist/{esm/components → components}/ui/flip-button.js.map +0 -0
  376. /package/dist/{types/components → components}/ui/form.d.ts +0 -0
  377. /package/dist/{esm/components → components}/ui/form.js +0 -0
  378. /package/dist/{esm/components → components}/ui/form.js.map +0 -0
  379. /package/dist/{types/components → components}/ui/gradient-background.d.ts +0 -0
  380. /package/dist/{esm/components → components}/ui/gradient-background.js +0 -0
  381. /package/dist/{esm/components → components}/ui/gradient-background.js.map +0 -0
  382. /package/dist/{types/components → components}/ui/gradient-text.d.ts +0 -0
  383. /package/dist/{esm/components → components}/ui/gradient-text.js +0 -0
  384. /package/dist/{esm/components → components}/ui/gradient-text.js.map +0 -0
  385. /package/dist/{types/components → components}/ui/highlight-text.d.ts +0 -0
  386. /package/dist/{esm/components → components}/ui/highlight-text.js +0 -0
  387. /package/dist/{esm/components → components}/ui/highlight-text.js.map +0 -0
  388. /package/dist/{types/components → components}/ui/hole-background.d.ts +0 -0
  389. /package/dist/{esm/components → components}/ui/hole-background.js +0 -0
  390. /package/dist/{esm/components → components}/ui/hole-background.js.map +0 -0
  391. /package/dist/{types/components → components}/ui/hover-card.d.ts +0 -0
  392. /package/dist/{esm/components → components}/ui/hover-card.js +0 -0
  393. /package/dist/{esm/components → components}/ui/hover-card.js.map +0 -0
  394. /package/dist/{types/components → components}/ui/input-otp.d.ts +0 -0
  395. /package/dist/{esm/components → components}/ui/input-otp.js +0 -0
  396. /package/dist/{esm/components → components}/ui/input-otp.js.map +0 -0
  397. /package/dist/{types/components → components}/ui/input.d.ts +0 -0
  398. /package/dist/{esm/components → components}/ui/input.js +0 -0
  399. /package/dist/{types/components → components}/ui/label.d.ts +0 -0
  400. /package/dist/{esm/components → components}/ui/label.js +0 -0
  401. /package/dist/{esm/components → components}/ui/label.js.map +0 -0
  402. /package/dist/{types/components → components}/ui/menubar.d.ts +0 -0
  403. /package/dist/{esm/components → components}/ui/menubar.js +0 -0
  404. /package/dist/{esm/components → components}/ui/menubar.js.map +0 -0
  405. /package/dist/{types/components → components}/ui/navigation-menu.d.ts +0 -0
  406. /package/dist/{esm/components → components}/ui/navigation-menu.js +0 -0
  407. /package/dist/{esm/components → components}/ui/navigation-menu.js.map +0 -0
  408. /package/dist/{types/components → components}/ui/pagination.d.ts +0 -0
  409. /package/dist/{esm/components → components}/ui/pagination.js +0 -0
  410. /package/dist/{esm/components → components}/ui/pagination.js.map +0 -0
  411. /package/dist/{types/components → components}/ui/popover.d.ts +0 -0
  412. /package/dist/{esm/components → components}/ui/popover.js +0 -0
  413. /package/dist/{esm/components → components}/ui/popover.js.map +0 -0
  414. /package/dist/{types/components → components}/ui/progress.d.ts +0 -0
  415. /package/dist/{esm/components → components}/ui/progress.js +0 -0
  416. /package/dist/{esm/components → components}/ui/progress.js.map +0 -0
  417. /package/dist/{types/components → components}/ui/radio-group.d.ts +0 -0
  418. /package/dist/{esm/components → components}/ui/radio-group.js +0 -0
  419. /package/dist/{esm/components → components}/ui/radio-group.js.map +0 -0
  420. /package/dist/{types/components → components}/ui/resizable.d.ts +0 -0
  421. /package/dist/{esm/components → components}/ui/resizable.js +0 -0
  422. /package/dist/{esm/components → components}/ui/resizable.js.map +0 -0
  423. /package/dist/{types/components → components}/ui/ripple-button.d.ts +0 -0
  424. /package/dist/{esm/components → components}/ui/ripple-button.js +0 -0
  425. /package/dist/{types/components → components}/ui/scratcher.d.ts +0 -0
  426. /package/dist/{esm/components → components}/ui/scratcher.js +0 -0
  427. /package/dist/{types/components → components}/ui/scroll-area.d.ts +0 -0
  428. /package/dist/{esm/components → components}/ui/scroll-area.js +0 -0
  429. /package/dist/{esm/components → components}/ui/scroll-area.js.map +0 -0
  430. /package/dist/{types/components → components}/ui/select.d.ts +0 -0
  431. /package/dist/{esm/components → components}/ui/select.js +0 -0
  432. /package/dist/{esm/components → components}/ui/select.js.map +0 -0
  433. /package/dist/{types/components → components}/ui/separator.d.ts +0 -0
  434. /package/dist/{esm/components → components}/ui/separator.js +0 -0
  435. /package/dist/{esm/components → components}/ui/separator.js.map +0 -0
  436. /package/dist/{types/components → components}/ui/sheet.d.ts +0 -0
  437. /package/dist/{esm/components → components}/ui/sheet.js +0 -0
  438. /package/dist/{esm/components → components}/ui/sheet.js.map +0 -0
  439. /package/dist/{types/components → components}/ui/sidebar.d.ts +0 -0
  440. /package/dist/{esm/components → components}/ui/sidebar.js +0 -0
  441. /package/dist/{esm/components → components}/ui/sidebar.js.map +0 -0
  442. /package/dist/{types/components → components}/ui/skeleton.d.ts +0 -0
  443. /package/dist/{esm/components → components}/ui/skeleton.js +0 -0
  444. /package/dist/{esm/components → components}/ui/skeleton.js.map +0 -0
  445. /package/dist/{types/components → components}/ui/slider.d.ts +0 -0
  446. /package/dist/{esm/components → components}/ui/slider.js +0 -0
  447. /package/dist/{esm/components → components}/ui/slider.js.map +0 -0
  448. /package/dist/{types/components → components}/ui/sonner.d.ts +0 -0
  449. /package/dist/{esm/components → components}/ui/sonner.js +0 -0
  450. /package/dist/{esm/components → components}/ui/sonner.js.map +0 -0
  451. /package/dist/{types/components → components}/ui/switch.d.ts +0 -0
  452. /package/dist/{esm/components → components}/ui/switch.js +0 -0
  453. /package/dist/{esm/components → components}/ui/switch.js.map +0 -0
  454. /package/dist/{types/components → components}/ui/table.d.ts +0 -0
  455. /package/dist/{esm/components → components}/ui/table.js +0 -0
  456. /package/dist/{esm/components → components}/ui/table.js.map +0 -0
  457. /package/dist/{types/components → components}/ui/tabs.d.ts +0 -0
  458. /package/dist/{esm/components → components}/ui/tabs.js +0 -0
  459. /package/dist/{esm/components → components}/ui/tabs.js.map +0 -0
  460. /package/dist/{types/components → components}/ui/textarea.d.ts +0 -0
  461. /package/dist/{esm/components → components}/ui/textarea.js +0 -0
  462. /package/dist/{esm/components → components}/ui/textarea.js.map +0 -0
  463. /package/dist/{types/components → components}/ui/toggle-group.d.ts +0 -0
  464. /package/dist/{esm/components → components}/ui/toggle-group.js +0 -0
  465. /package/dist/{esm/components → components}/ui/toggle-group.js.map +0 -0
  466. /package/dist/{types/components → components}/ui/toggle.d.ts +0 -0
  467. /package/dist/{esm/components → components}/ui/toggle.js +0 -0
  468. /package/dist/{esm/components → components}/ui/toggle.js.map +0 -0
  469. /package/dist/{types/components → components}/ui/tooltip.d.ts +0 -0
  470. /package/dist/{esm/components → components}/ui/tooltip.js +0 -0
  471. /package/dist/{esm/components → components}/ui/tooltip.js.map +0 -0
  472. /package/dist/{types/hooks → hooks}/use-mobile.d.ts +0 -0
  473. /package/dist/{esm/hooks → hooks}/use-mobile.js +0 -0
  474. /package/dist/{types/lib → lib}/utils.d.ts +0 -0
  475. /package/dist/{esm/lib → lib}/utils.js +0 -0
@@ -1,380 +1,385 @@
1
- "use client";
2
-
3
- import * as React from "react";
4
- import * as RechartsPrimitive from "recharts";
5
- import type { LegendPayload } from "recharts/types/component/DefaultLegendContent";
6
- import {
7
- NameType,
8
- Payload,
9
- ValueType,
10
- } from "recharts/types/component/DefaultTooltipContent";
11
- import type { Props as LegendProps } from "recharts/types/component/Legend";
12
- import { TooltipContentProps } from "recharts/types/component/Tooltip";
13
-
14
- import { cn } from "@/lib/utils";
15
-
16
- // Format: { THEME_NAME: CSS_SELECTOR }
17
- const THEMES = { light: "", dark: ".dark" } as const;
18
-
19
- export type ChartConfig = {
20
- [k in string]: {
21
- label?: React.ReactNode;
22
- icon?: React.ComponentType;
23
- } & (
24
- | { color?: string; theme?: never }
25
- | { color?: never; theme: Record<keyof typeof THEMES, string> }
26
- );
27
- };
28
-
29
- type ChartContextProps = {
30
- config: ChartConfig;
31
- };
32
-
33
- const ChartContext = React.createContext<ChartContextProps | null>(null);
34
-
35
- function useChart() {
36
- const context = React.useContext(ChartContext);
37
-
38
- if (!context) {
39
- throw new Error("useChart must be used within a <ChartContainer />");
40
- }
41
-
42
- return context;
43
- }
44
-
45
- function ChartContainer({
46
- id,
47
- className,
48
- children,
49
- config,
50
- ...props
51
- }: React.ComponentProps<"div"> & {
52
- config: ChartConfig;
53
- children: React.ComponentProps<
54
- typeof RechartsPrimitive.ResponsiveContainer
55
- >["children"];
56
- }) {
57
- const uniqueId = React.useId();
58
- const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
59
-
60
- return (
61
- <ChartContext.Provider value={{ config }}>
62
- <div
63
- data-slot="chart"
64
- data-chart={chartId}
65
- className={cn(
66
- "[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
67
- className,
68
- )}
69
- {...props}
70
- >
71
- <ChartStyle id={chartId} config={config} />
72
- <RechartsPrimitive.ResponsiveContainer>
73
- {children}
74
- </RechartsPrimitive.ResponsiveContainer>
75
- </div>
76
- </ChartContext.Provider>
77
- );
78
- }
79
-
80
- const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
81
- const colorConfig = Object.entries(config).filter(
82
- ([, config]) => config.theme || config.color,
83
- );
84
-
85
- if (!colorConfig.length) {
86
- return null;
87
- }
88
-
89
- return (
90
- <style
91
- dangerouslySetInnerHTML={{
92
- __html: Object.entries(THEMES)
93
- .map(
94
- ([theme, prefix]) => `
95
- ${prefix} [data-chart=${id}] {
96
- ${colorConfig
97
- .map(([key, itemConfig]) => {
98
- const color =
99
- itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||
100
- itemConfig.color;
101
- return color ? ` --color-${key}: ${color};` : null;
102
- })
103
- .join("\n")}
104
- }
105
- `,
106
- )
107
- .join("\n"),
108
- }}
109
- />
110
- );
111
- };
112
-
113
- const ChartTooltip = RechartsPrimitive.Tooltip;
114
-
115
- type CustomTooltipProps = TooltipContentProps<ValueType, NameType> & {
116
- className?: string;
117
- hideLabel?: boolean;
118
- hideIndicator?: boolean;
119
- indicator?: "line" | "dot" | "dashed";
120
- nameKey?: string;
121
- labelKey?: string;
122
- labelFormatter?: (
123
- label: TooltipContentProps<number, string>["label"],
124
- payload: TooltipContentProps<number, string>["payload"],
125
- ) => React.ReactNode;
126
- formatter?: (
127
- value: number | string,
128
- name: string,
129
- item: Payload<number | string, string>,
130
- index: number,
131
- payload: ReadonlyArray<Payload<number | string, string>>,
132
- ) => React.ReactNode;
133
- labelClassName?: string;
134
- color?: string;
135
- };
136
-
137
- function ChartTooltipContent({
138
- active,
139
- payload,
140
- label,
141
- className,
142
- indicator = "dot",
143
- hideLabel = false,
144
- hideIndicator = false,
145
- labelFormatter,
146
- formatter,
147
- labelClassName,
148
- color,
149
- nameKey,
150
- labelKey,
151
- }: CustomTooltipProps) {
152
- const { config } = useChart();
153
-
154
- const tooltipLabel = React.useMemo(() => {
155
- if (hideLabel || !payload?.length) {
156
- return null;
157
- }
158
-
159
- const [item] = payload;
160
- const key = `${labelKey || item?.dataKey || item?.name || "value"}`;
161
- const itemConfig = getPayloadConfigFromPayload(config, item, key);
162
- const value =
163
- !labelKey && typeof label === "string"
164
- ? config[label as keyof typeof config]?.label || label
165
- : itemConfig?.label;
166
-
167
- if (labelFormatter) {
168
- return (
169
- <div className={cn("font-medium", labelClassName)}>
170
- {labelFormatter(value, payload)}
171
- </div>
172
- );
173
- }
174
-
175
- if (!value) {
176
- return null;
177
- }
178
-
179
- return <div className={cn("font-medium", labelClassName)}>{value}</div>;
180
- }, [
181
- label,
182
- labelFormatter,
183
- payload,
184
- hideLabel,
185
- labelClassName,
186
- config,
187
- labelKey,
188
- ]);
189
-
190
- if (!active || !payload?.length) {
191
- return null;
192
- }
193
-
194
- const nestLabel = payload.length === 1 && indicator !== "dot";
195
-
196
- return (
197
- <div
198
- className={cn(
199
- "border-border/50 bg-background grid min-w-[8rem] items-start gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs shadow-xl",
200
- className,
201
- )}
202
- >
203
- {!nestLabel ? tooltipLabel : null}
204
- <div className="grid gap-1.5">
205
- {payload.map((item, index) => {
206
- const key = `${nameKey || item.name || item.dataKey || "value"}`;
207
- const itemConfig = getPayloadConfigFromPayload(config, item, key);
208
- const indicatorColor = color || item.payload.fill || item.color;
209
-
210
- return (
211
- <div
212
- key={item.dataKey}
213
- className={cn(
214
- "[&>svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5",
215
- indicator === "dot" && "items-center",
216
- )}
217
- >
218
- {formatter && item?.value !== undefined && item.name ? (
219
- formatter(item.value, item.name, item, index, item.payload)
220
- ) : (
221
- <>
222
- {itemConfig?.icon ? (
223
- <itemConfig.icon />
224
- ) : (
225
- !hideIndicator && (
226
- <div
227
- className={cn(
228
- "shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
229
- {
230
- "h-2.5 w-2.5": indicator === "dot",
231
- "w-1": indicator === "line",
232
- "w-0 border-[1.5px] border-dashed bg-transparent":
233
- indicator === "dashed",
234
- "my-0.5": nestLabel && indicator === "dashed",
235
- },
236
- )}
237
- style={
238
- {
239
- "--color-bg": indicatorColor,
240
- "--color-border": indicatorColor,
241
- } as React.CSSProperties
242
- }
243
- />
244
- )
245
- )}
246
- <div
247
- className={cn(
248
- "flex flex-1 justify-between leading-none",
249
- nestLabel ? "items-end" : "items-center",
250
- )}
251
- >
252
- <div className="grid gap-1.5">
253
- {nestLabel ? tooltipLabel : null}
254
- <span className="text-muted-foreground">
255
- {itemConfig?.label || item.name}
256
- </span>
257
- </div>
258
- {item.value && (
259
- <span className="text-foreground font-mono font-medium tabular-nums">
260
- {item.value.toLocaleString()}
261
- </span>
262
- )}
263
- </div>
264
- </>
265
- )}
266
- </div>
267
- );
268
- })}
269
- </div>
270
- </div>
271
- );
272
- }
273
-
274
- const ChartLegend = RechartsPrimitive.Legend;
275
-
276
- type ChartLegendContentProps = {
277
- className?: string;
278
- hideIcon?: boolean;
279
- verticalAlign?: LegendProps["verticalAlign"];
280
- payload?: LegendPayload[];
281
- nameKey?: string;
282
- };
283
-
284
- function ChartLegendContent({
285
- className,
286
- hideIcon = false,
287
- payload,
288
- verticalAlign = "bottom",
289
- nameKey,
290
- }: ChartLegendContentProps) {
291
- const { config } = useChart();
292
-
293
- if (!payload?.length) {
294
- return null;
295
- }
296
-
297
- return (
298
- <div
299
- className={cn(
300
- "flex items-center justify-center gap-4",
301
- verticalAlign === "top" ? "pb-3" : "pt-3",
302
- className,
303
- )}
304
- >
305
- {payload.map((item) => {
306
- const key = `${nameKey || item.dataKey || "value"}`;
307
- const itemConfig = getPayloadConfigFromPayload(config, item, key);
308
-
309
- return (
310
- <div
311
- key={item.value}
312
- className={cn(
313
- "[&>svg]:text-muted-foreground flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3",
314
- )}
315
- >
316
- {itemConfig?.icon && !hideIcon ? (
317
- <itemConfig.icon />
318
- ) : (
319
- <div
320
- className="h-2 w-2 shrink-0 rounded-[2px]"
321
- style={{
322
- backgroundColor: item.color,
323
- }}
324
- />
325
- )}
326
- {itemConfig?.label}
327
- </div>
328
- );
329
- })}
330
- </div>
331
- );
332
- }
333
-
334
- // Helper to extract item config from a payload.
335
- function getPayloadConfigFromPayload(
336
- config: ChartConfig,
337
- payload: unknown,
338
- key: string,
339
- ) {
340
- if (typeof payload !== "object" || payload === null) {
341
- return undefined;
342
- }
343
-
344
- const payloadPayload =
345
- "payload" in payload &&
346
- typeof payload.payload === "object" &&
347
- payload.payload !== null
348
- ? payload.payload
349
- : undefined;
350
-
351
- let configLabelKey: string = key;
352
-
353
- if (
354
- key in payload &&
355
- typeof payload[key as keyof typeof payload] === "string"
356
- ) {
357
- configLabelKey = payload[key as keyof typeof payload] as string;
358
- } else if (
359
- payloadPayload &&
360
- key in payloadPayload &&
361
- typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
362
- ) {
363
- configLabelKey = payloadPayload[
364
- key as keyof typeof payloadPayload
365
- ] as string;
366
- }
367
-
368
- return configLabelKey in config
369
- ? config[configLabelKey]
370
- : config[key as keyof typeof config];
371
- }
372
-
373
- export {
374
- ChartContainer,
375
- ChartTooltip,
376
- ChartTooltipContent,
377
- ChartLegend,
378
- ChartLegendContent,
379
- ChartStyle,
380
- };
1
+ "use client";
2
+
3
+ import * as React from "react";
4
+ import * as RechartsPrimitive from "recharts";
5
+
6
+ import type { LegendPayload } from "recharts/types/component/DefaultLegendContent";
7
+ import {
8
+ NameType,
9
+ Payload,
10
+ ValueType,
11
+ } from "recharts/types/component/DefaultTooltipContent";
12
+ import type { Props as LegendProps } from "recharts/types/component/Legend";
13
+ import { TooltipContentProps } from "recharts/types/component/Tooltip";
14
+
15
+ import { cn } from "@/lib/utils";
16
+
17
+ // Format: { THEME_NAME: CSS_SELECTOR }
18
+ const THEMES = { light: "", dark: ".dark" } as const;
19
+
20
+ export type ChartConfig = {
21
+ [k in string]: {
22
+ label?: React.ReactNode;
23
+ icon?: React.ComponentType;
24
+ } & (
25
+ | { color?: string; theme?: never }
26
+ | { color?: never; theme: Record<keyof typeof THEMES, string> }
27
+ );
28
+ };
29
+
30
+ type ChartContextProps = {
31
+ config: ChartConfig;
32
+ };
33
+
34
+ export type CustomTooltipProps = TooltipContentProps<ValueType, NameType> & {
35
+ className?: string;
36
+ hideLabel?: boolean;
37
+ hideIndicator?: boolean;
38
+ indicator?: "line" | "dot" | "dashed";
39
+ nameKey?: string;
40
+ labelKey?: string;
41
+ labelFormatter?: (
42
+ label: TooltipContentProps<number, string>["label"],
43
+ payload: TooltipContentProps<number, string>["payload"],
44
+ ) => React.ReactNode;
45
+ formatter?: (
46
+ value: number | string,
47
+ name: string,
48
+ item: Payload<number | string, string>,
49
+ index: number,
50
+ payload: ReadonlyArray<Payload<number | string, string>>,
51
+ ) => React.ReactNode;
52
+ labelClassName?: string;
53
+ color?: string;
54
+ };
55
+
56
+ export type ChartLegendContentProps = {
57
+ className?: string;
58
+ hideIcon?: boolean;
59
+ verticalAlign?: LegendProps["verticalAlign"];
60
+ payload?: LegendPayload[];
61
+ nameKey?: string;
62
+ };
63
+
64
+ const ChartContext = React.createContext<ChartContextProps | null>(null);
65
+
66
+ function useChart() {
67
+ const context = React.useContext(ChartContext);
68
+
69
+ if (!context) {
70
+ throw new Error("useChart must be used within a <ChartContainer />");
71
+ }
72
+
73
+ return context;
74
+ }
75
+
76
+ function ChartContainer({
77
+ id,
78
+ className,
79
+ children,
80
+ config,
81
+ ...props
82
+ }: React.ComponentProps<"div"> & {
83
+ config: ChartConfig;
84
+ children: React.ComponentProps<
85
+ typeof RechartsPrimitive.ResponsiveContainer
86
+ >["children"];
87
+ }) {
88
+ const uniqueId = React.useId();
89
+ const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
90
+
91
+ return (
92
+ <ChartContext.Provider value={{ config }}>
93
+ <div
94
+ data-slot="chart"
95
+ data-chart={chartId}
96
+ className={cn(
97
+ "[&_.recharts-cartesian-axis-tick_text]:fill-muted-foreground [&_.recharts-cartesian-grid_line[stroke='#ccc']]:stroke-border/50 [&_.recharts-curve.recharts-tooltip-cursor]:stroke-border [&_.recharts-polar-grid_[stroke='#ccc']]:stroke-border [&_.recharts-radial-bar-background-sector]:fill-muted [&_.recharts-rectangle.recharts-tooltip-cursor]:fill-muted [&_.recharts-reference-line_[stroke='#ccc']]:stroke-border flex aspect-video justify-center text-xs [&_.recharts-dot[stroke='#fff']]:stroke-transparent [&_.recharts-layer]:outline-hidden [&_.recharts-sector]:outline-hidden [&_.recharts-sector[stroke='#fff']]:stroke-transparent [&_.recharts-surface]:outline-hidden",
98
+ className,
99
+ )}
100
+ {...props}
101
+ >
102
+ <ChartStyle id={chartId} config={config} />
103
+ <RechartsPrimitive.ResponsiveContainer>
104
+ {children}
105
+ </RechartsPrimitive.ResponsiveContainer>
106
+ </div>
107
+ </ChartContext.Provider>
108
+ );
109
+ }
110
+
111
+ const ChartStyle = ({ id, config }: { id: string; config: ChartConfig }) => {
112
+ const colorConfig = Object.entries(config).filter(
113
+ ([, config]) => config.theme || config.color,
114
+ );
115
+
116
+ if (!colorConfig.length) {
117
+ return null;
118
+ }
119
+
120
+ return (
121
+ <style
122
+ dangerouslySetInnerHTML={{
123
+ __html: Object.entries(THEMES)
124
+ .map(
125
+ ([theme, prefix]) => `
126
+ ${prefix} [data-chart=${id}] {
127
+ ${colorConfig
128
+ .map(([key, itemConfig]) => {
129
+ const color =
130
+ itemConfig.theme?.[theme as keyof typeof itemConfig.theme] ||
131
+ itemConfig.color;
132
+ return color ? ` --color-${key}: ${color};` : null;
133
+ })
134
+ .join("\n")}
135
+ }
136
+ `,
137
+ )
138
+ .join("\n"),
139
+ }}
140
+ />
141
+ );
142
+ };
143
+
144
+ const ChartTooltip = RechartsPrimitive.Tooltip;
145
+
146
+ function ChartTooltipContent({
147
+ active,
148
+ payload,
149
+ label,
150
+ className,
151
+ indicator = "dot",
152
+ hideLabel = false,
153
+ hideIndicator = false,
154
+ labelFormatter,
155
+ formatter,
156
+ labelClassName,
157
+ color,
158
+ nameKey,
159
+ labelKey,
160
+ }: CustomTooltipProps) {
161
+ const { config } = useChart();
162
+
163
+ const tooltipLabel = React.useMemo(() => {
164
+ if (hideLabel || !payload?.length) {
165
+ return null;
166
+ }
167
+
168
+ const [item] = payload;
169
+ const key = `${labelKey || item?.dataKey || item?.name || "value"}`;
170
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
171
+ const value = (() => {
172
+ const v =
173
+ !labelKey && typeof label === "string"
174
+ ? (config[label as keyof typeof config]?.label ?? label)
175
+ : itemConfig?.label;
176
+
177
+ return typeof v === "string" || typeof v === "number" ? v : undefined;
178
+ })();
179
+
180
+ if (labelFormatter) {
181
+ return (
182
+ <div className={cn("font-medium", labelClassName)}>
183
+ {labelFormatter(value, payload)}
184
+ </div>
185
+ );
186
+ }
187
+
188
+ if (!value) {
189
+ return null;
190
+ }
191
+
192
+ return <div className={cn("font-medium", labelClassName)}>{value}</div>;
193
+ }, [
194
+ label,
195
+ labelFormatter,
196
+ payload,
197
+ hideLabel,
198
+ labelClassName,
199
+ config,
200
+ labelKey,
201
+ ]);
202
+
203
+ if (!active || !payload?.length) {
204
+ return null;
205
+ }
206
+
207
+ const nestLabel = payload.length === 1 && indicator !== "dot";
208
+
209
+ return (
210
+ <div
211
+ className={cn(
212
+ "border-border/50 bg-background grid min-w-[8rem] items-start gap-1.5 rounded-lg border px-2.5 py-1.5 text-xs shadow-xl",
213
+ className,
214
+ )}
215
+ >
216
+ {!nestLabel ? tooltipLabel : null}
217
+ <div className="grid gap-1.5">
218
+ {payload.map((item, index) => {
219
+ const key = `${nameKey || item.name || item.dataKey || "value"}`;
220
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
221
+ const indicatorColor = color || item.payload.fill || item.color;
222
+
223
+ return (
224
+ <div
225
+ key={item.dataKey}
226
+ className={cn(
227
+ "[&>svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5",
228
+ indicator === "dot" && "items-center",
229
+ )}
230
+ >
231
+ {formatter && item?.value !== undefined && item.name ? (
232
+ formatter(item.value, item.name, item, index, item.payload)
233
+ ) : (
234
+ <>
235
+ {itemConfig?.icon ? (
236
+ <itemConfig.icon />
237
+ ) : (
238
+ !hideIndicator && (
239
+ <div
240
+ className={cn(
241
+ "shrink-0 rounded-[2px] border-(--color-border) bg-(--color-bg)",
242
+ {
243
+ "h-2.5 w-2.5": indicator === "dot",
244
+ "w-1": indicator === "line",
245
+ "w-0 border-[1.5px] border-dashed bg-transparent":
246
+ indicator === "dashed",
247
+ "my-0.5": nestLabel && indicator === "dashed",
248
+ },
249
+ )}
250
+ style={
251
+ {
252
+ "--color-bg": indicatorColor,
253
+ "--color-border": indicatorColor,
254
+ } as React.CSSProperties
255
+ }
256
+ />
257
+ )
258
+ )}
259
+ <div
260
+ className={cn(
261
+ "flex flex-1 justify-between leading-none",
262
+ nestLabel ? "items-end" : "items-center",
263
+ )}
264
+ >
265
+ <div className="grid gap-1.5">
266
+ {nestLabel ? tooltipLabel : null}
267
+ <span className="text-muted-foreground">
268
+ {itemConfig?.label || item.name}
269
+ </span>
270
+ </div>
271
+ {item.value && (
272
+ <span className="text-foreground font-mono font-medium tabular-nums">
273
+ {item.value.toLocaleString()}
274
+ </span>
275
+ )}
276
+ </div>
277
+ </>
278
+ )}
279
+ </div>
280
+ );
281
+ })}
282
+ </div>
283
+ </div>
284
+ );
285
+ }
286
+
287
+ const ChartLegend = RechartsPrimitive.Legend;
288
+
289
+ function ChartLegendContent({
290
+ className,
291
+ hideIcon = false,
292
+ payload,
293
+ verticalAlign = "bottom",
294
+ nameKey,
295
+ }: ChartLegendContentProps) {
296
+ const { config } = useChart();
297
+
298
+ if (!payload?.length) {
299
+ return null;
300
+ }
301
+
302
+ return (
303
+ <div
304
+ className={cn(
305
+ "flex items-center justify-center gap-4",
306
+ verticalAlign === "top" ? "pb-3" : "pt-3",
307
+ className,
308
+ )}
309
+ >
310
+ {payload.map((item) => {
311
+ const key = `${nameKey || item.dataKey || "value"}`;
312
+ const itemConfig = getPayloadConfigFromPayload(config, item, key);
313
+
314
+ return (
315
+ <div
316
+ key={item.value}
317
+ className={cn(
318
+ "[&>svg]:text-muted-foreground flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3",
319
+ )}
320
+ >
321
+ {itemConfig?.icon && !hideIcon ? (
322
+ <itemConfig.icon />
323
+ ) : (
324
+ <div
325
+ className="h-2 w-2 shrink-0 rounded-[2px]"
326
+ style={{
327
+ backgroundColor: item.color,
328
+ }}
329
+ />
330
+ )}
331
+ {itemConfig?.label}
332
+ </div>
333
+ );
334
+ })}
335
+ </div>
336
+ );
337
+ }
338
+
339
+ // Helper to extract item config from a payload.
340
+ function getPayloadConfigFromPayload(
341
+ config: ChartConfig,
342
+ payload: unknown,
343
+ key: string,
344
+ ) {
345
+ if (typeof payload !== "object" || payload === null) {
346
+ return undefined;
347
+ }
348
+
349
+ const payloadPayload =
350
+ "payload" in payload &&
351
+ typeof payload.payload === "object" &&
352
+ payload.payload !== null
353
+ ? payload.payload
354
+ : undefined;
355
+
356
+ let configLabelKey: string = key;
357
+
358
+ if (
359
+ key in payload &&
360
+ typeof payload[key as keyof typeof payload] === "string"
361
+ ) {
362
+ configLabelKey = payload[key as keyof typeof payload] as string;
363
+ } else if (
364
+ payloadPayload &&
365
+ key in payloadPayload &&
366
+ typeof payloadPayload[key as keyof typeof payloadPayload] === "string"
367
+ ) {
368
+ configLabelKey = payloadPayload[
369
+ key as keyof typeof payloadPayload
370
+ ] as string;
371
+ }
372
+
373
+ return configLabelKey in config
374
+ ? config[configLabelKey]
375
+ : config[key as keyof typeof config];
376
+ }
377
+
378
+ export {
379
+ ChartContainer,
380
+ ChartTooltip,
381
+ ChartTooltipContent,
382
+ ChartLegend,
383
+ ChartLegendContent,
384
+ ChartStyle,
385
+ };