@desbug/ultra-ui 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (379) hide show
  1. package/README.md +203 -0
  2. package/dist/components/blocks/activity-feed-card.d.ts +25 -0
  3. package/dist/components/blocks/activity-feed-card.d.ts.map +1 -0
  4. package/dist/components/blocks/activity-feed-card.js +13 -0
  5. package/dist/components/blocks/activity-feed-card.js.map +1 -0
  6. package/dist/components/blocks/bar-breakdown-card.d.ts +34 -0
  7. package/dist/components/blocks/bar-breakdown-card.d.ts.map +1 -0
  8. package/dist/components/blocks/bar-breakdown-card.js +24 -0
  9. package/dist/components/blocks/bar-breakdown-card.js.map +1 -0
  10. package/dist/components/blocks/block-card.d.ts +39 -0
  11. package/dist/components/blocks/block-card.d.ts.map +1 -0
  12. package/dist/components/blocks/block-card.js +14 -0
  13. package/dist/components/blocks/block-card.js.map +1 -0
  14. package/dist/components/blocks/callout-card.d.ts +20 -0
  15. package/dist/components/blocks/callout-card.d.ts.map +1 -0
  16. package/dist/components/blocks/callout-card.js +12 -0
  17. package/dist/components/blocks/callout-card.js.map +1 -0
  18. package/dist/components/blocks/donut-card.d.ts +28 -0
  19. package/dist/components/blocks/donut-card.d.ts.map +1 -0
  20. package/dist/components/blocks/donut-card.js +24 -0
  21. package/dist/components/blocks/donut-card.js.map +1 -0
  22. package/dist/components/blocks/file-list-card.d.ts +21 -0
  23. package/dist/components/blocks/file-list-card.d.ts.map +1 -0
  24. package/dist/components/blocks/file-list-card.js +12 -0
  25. package/dist/components/blocks/file-list-card.js.map +1 -0
  26. package/dist/components/blocks/funnel-card.d.ts +19 -0
  27. package/dist/components/blocks/funnel-card.d.ts.map +1 -0
  28. package/dist/components/blocks/funnel-card.js +18 -0
  29. package/dist/components/blocks/funnel-card.js.map +1 -0
  30. package/dist/components/blocks/gauge-card.d.ts +20 -0
  31. package/dist/components/blocks/gauge-card.d.ts.map +1 -0
  32. package/dist/components/blocks/gauge-card.js +12 -0
  33. package/dist/components/blocks/gauge-card.js.map +1 -0
  34. package/dist/components/blocks/index.d.ts +21 -0
  35. package/dist/components/blocks/index.d.ts.map +1 -0
  36. package/dist/components/blocks/index.js +24 -0
  37. package/dist/components/blocks/index.js.map +1 -0
  38. package/dist/components/blocks/kpi-card.d.ts +18 -0
  39. package/dist/components/blocks/kpi-card.d.ts.map +1 -0
  40. package/dist/components/blocks/kpi-card.js +11 -0
  41. package/dist/components/blocks/kpi-card.js.map +1 -0
  42. package/dist/components/blocks/palette.d.ts +9 -0
  43. package/dist/components/blocks/palette.d.ts.map +1 -0
  44. package/dist/components/blocks/palette.js +20 -0
  45. package/dist/components/blocks/palette.js.map +1 -0
  46. package/dist/components/blocks/progress-list-card.d.ts +29 -0
  47. package/dist/components/blocks/progress-list-card.d.ts.map +1 -0
  48. package/dist/components/blocks/progress-list-card.js +19 -0
  49. package/dist/components/blocks/progress-list-card.js.map +1 -0
  50. package/dist/components/blocks/radar-stats-card.d.ts +18 -0
  51. package/dist/components/blocks/radar-stats-card.d.ts.map +1 -0
  52. package/dist/components/blocks/radar-stats-card.js +10 -0
  53. package/dist/components/blocks/radar-stats-card.js.map +1 -0
  54. package/dist/components/blocks/ranking-list-card.d.ts +25 -0
  55. package/dist/components/blocks/ranking-list-card.d.ts.map +1 -0
  56. package/dist/components/blocks/ranking-list-card.js +10 -0
  57. package/dist/components/blocks/ranking-list-card.js.map +1 -0
  58. package/dist/components/blocks/spark-stat-card.d.ts +22 -0
  59. package/dist/components/blocks/spark-stat-card.d.ts.map +1 -0
  60. package/dist/components/blocks/spark-stat-card.js +10 -0
  61. package/dist/components/blocks/spark-stat-card.js.map +1 -0
  62. package/dist/components/blocks/steps-card.d.ts +17 -0
  63. package/dist/components/blocks/steps-card.d.ts.map +1 -0
  64. package/dist/components/blocks/steps-card.js +16 -0
  65. package/dist/components/blocks/steps-card.js.map +1 -0
  66. package/dist/components/blocks/team-list-card.d.ts +21 -0
  67. package/dist/components/blocks/team-list-card.d.ts.map +1 -0
  68. package/dist/components/blocks/team-list-card.js +9 -0
  69. package/dist/components/blocks/team-list-card.js.map +1 -0
  70. package/dist/components/blocks/timeline-card.d.ts +19 -0
  71. package/dist/components/blocks/timeline-card.d.ts.map +1 -0
  72. package/dist/components/blocks/timeline-card.js +13 -0
  73. package/dist/components/blocks/timeline-card.js.map +1 -0
  74. package/dist/components/blocks/todo-list-card.d.ts +21 -0
  75. package/dist/components/blocks/todo-list-card.d.ts.map +1 -0
  76. package/dist/components/blocks/todo-list-card.js +11 -0
  77. package/dist/components/blocks/todo-list-card.js.map +1 -0
  78. package/dist/components/blocks/trend-chart-card.d.ts +33 -0
  79. package/dist/components/blocks/trend-chart-card.d.ts.map +1 -0
  80. package/dist/components/blocks/trend-chart-card.js +13 -0
  81. package/dist/components/blocks/trend-chart-card.js.map +1 -0
  82. package/dist/components/shared/avatar-stack.d.ts +17 -0
  83. package/dist/components/shared/avatar-stack.d.ts.map +1 -0
  84. package/dist/components/shared/avatar-stack.js +10 -0
  85. package/dist/components/shared/avatar-stack.js.map +1 -0
  86. package/dist/components/shared/avatar-with-name.d.ts +15 -0
  87. package/dist/components/shared/avatar-with-name.d.ts.map +1 -0
  88. package/dist/components/shared/avatar-with-name.js +8 -0
  89. package/dist/components/shared/avatar-with-name.js.map +1 -0
  90. package/dist/components/shared/chart-card.d.ts +20 -0
  91. package/dist/components/shared/chart-card.d.ts.map +1 -0
  92. package/dist/components/shared/chart-card.js +8 -0
  93. package/dist/components/shared/chart-card.js.map +1 -0
  94. package/dist/components/shared/data-table-cells.d.ts +35 -0
  95. package/dist/components/shared/data-table-cells.d.ts.map +1 -0
  96. package/dist/components/shared/data-table-cells.js +37 -0
  97. package/dist/components/shared/data-table-cells.js.map +1 -0
  98. package/dist/components/shared/data-table-column-manager.d.ts +25 -0
  99. package/dist/components/shared/data-table-column-manager.d.ts.map +1 -0
  100. package/dist/components/shared/data-table-column-manager.js +88 -0
  101. package/dist/components/shared/data-table-column-manager.js.map +1 -0
  102. package/dist/components/shared/data-table-pagination.d.ts +11 -0
  103. package/dist/components/shared/data-table-pagination.d.ts.map +1 -0
  104. package/dist/components/shared/data-table-pagination.js +24 -0
  105. package/dist/components/shared/data-table-pagination.js.map +1 -0
  106. package/dist/components/shared/data-table-toolbar.d.ts +15 -0
  107. package/dist/components/shared/data-table-toolbar.d.ts.map +1 -0
  108. package/dist/components/shared/data-table-toolbar.js +14 -0
  109. package/dist/components/shared/data-table-toolbar.js.map +1 -0
  110. package/dist/components/shared/data-table.d.ts +49 -0
  111. package/dist/components/shared/data-table.d.ts.map +1 -0
  112. package/dist/components/shared/data-table.js +56 -0
  113. package/dist/components/shared/data-table.js.map +1 -0
  114. package/dist/components/shared/empty-state.d.ts +14 -0
  115. package/dist/components/shared/empty-state.d.ts.map +1 -0
  116. package/dist/components/shared/empty-state.js +7 -0
  117. package/dist/components/shared/empty-state.js.map +1 -0
  118. package/dist/components/shared/github-link.d.ts +16 -0
  119. package/dist/components/shared/github-link.d.ts.map +1 -0
  120. package/dist/components/shared/github-link.js +15 -0
  121. package/dist/components/shared/github-link.js.map +1 -0
  122. package/dist/components/shared/gradient-def.d.ts +23 -0
  123. package/dist/components/shared/gradient-def.d.ts.map +1 -0
  124. package/dist/components/shared/gradient-def.js +13 -0
  125. package/dist/components/shared/gradient-def.js.map +1 -0
  126. package/dist/components/shared/header-actions-menu.d.ts +12 -0
  127. package/dist/components/shared/header-actions-menu.d.ts.map +1 -0
  128. package/dist/components/shared/header-actions-menu.js +11 -0
  129. package/dist/components/shared/header-actions-menu.js.map +1 -0
  130. package/dist/components/shared/header-search.d.ts +12 -0
  131. package/dist/components/shared/header-search.d.ts.map +1 -0
  132. package/dist/components/shared/header-search.js +10 -0
  133. package/dist/components/shared/header-search.js.map +1 -0
  134. package/dist/components/shared/index.d.ts +23 -0
  135. package/dist/components/shared/index.d.ts.map +1 -0
  136. package/dist/components/shared/index.js +27 -0
  137. package/dist/components/shared/index.js.map +1 -0
  138. package/dist/components/shared/messages-menu.d.ts +16 -0
  139. package/dist/components/shared/messages-menu.d.ts.map +1 -0
  140. package/dist/components/shared/messages-menu.js +12 -0
  141. package/dist/components/shared/messages-menu.js.map +1 -0
  142. package/dist/components/shared/notifications-menu.d.ts +18 -0
  143. package/dist/components/shared/notifications-menu.d.ts.map +1 -0
  144. package/dist/components/shared/notifications-menu.js +12 -0
  145. package/dist/components/shared/notifications-menu.js.map +1 -0
  146. package/dist/components/shared/page-header.d.ts +25 -0
  147. package/dist/components/shared/page-header.d.ts.map +1 -0
  148. package/dist/components/shared/page-header.js +13 -0
  149. package/dist/components/shared/page-header.js.map +1 -0
  150. package/dist/components/shared/progress-bar.d.ts +16 -0
  151. package/dist/components/shared/progress-bar.d.ts.map +1 -0
  152. package/dist/components/shared/progress-bar.js +8 -0
  153. package/dist/components/shared/progress-bar.js.map +1 -0
  154. package/dist/components/shared/section-card.d.ts +18 -0
  155. package/dist/components/shared/section-card.d.ts.map +1 -0
  156. package/dist/components/shared/section-card.js +8 -0
  157. package/dist/components/shared/section-card.js.map +1 -0
  158. package/dist/components/shared/series-chart.d.ts +49 -0
  159. package/dist/components/shared/series-chart.d.ts.map +1 -0
  160. package/dist/components/shared/series-chart.js +29 -0
  161. package/dist/components/shared/series-chart.js.map +1 -0
  162. package/dist/components/shared/stat-card.d.ts +32 -0
  163. package/dist/components/shared/stat-card.d.ts.map +1 -0
  164. package/dist/components/shared/stat-card.js +18 -0
  165. package/dist/components/shared/stat-card.js.map +1 -0
  166. package/dist/components/shared/stats-grid.d.ts +21 -0
  167. package/dist/components/shared/stats-grid.d.ts.map +1 -0
  168. package/dist/components/shared/stats-grid.js +19 -0
  169. package/dist/components/shared/stats-grid.js.map +1 -0
  170. package/dist/components/shared/status-badge.d.ts +26 -0
  171. package/dist/components/shared/status-badge.d.ts.map +1 -0
  172. package/dist/components/shared/status-badge.js +95 -0
  173. package/dist/components/shared/status-badge.js.map +1 -0
  174. package/dist/components/ui/accordion.d.ts +8 -0
  175. package/dist/components/ui/accordion.d.ts.map +1 -0
  176. package/dist/components/ui/accordion.js +19 -0
  177. package/dist/components/ui/accordion.js.map +1 -0
  178. package/dist/components/ui/alert-dialog.d.ts +19 -0
  179. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  180. package/dist/components/ui/alert-dialog.js +43 -0
  181. package/dist/components/ui/alert-dialog.js.map +1 -0
  182. package/dist/components/ui/alert.d.ts +11 -0
  183. package/dist/components/ui/alert.d.ts.map +1 -0
  184. package/dist/components/ui/alert.js +28 -0
  185. package/dist/components/ui/alert.js.map +1 -0
  186. package/dist/components/ui/aspect-ratio.d.ts +4 -0
  187. package/dist/components/ui/aspect-ratio.d.ts.map +1 -0
  188. package/dist/components/ui/aspect-ratio.js +8 -0
  189. package/dist/components/ui/aspect-ratio.js.map +1 -0
  190. package/dist/components/ui/avatar.d.ts +12 -0
  191. package/dist/components/ui/avatar.d.ts.map +1 -0
  192. package/dist/components/ui/avatar.js +24 -0
  193. package/dist/components/ui/avatar.js.map +1 -0
  194. package/dist/components/ui/badge.d.ts +10 -0
  195. package/dist/components/ui/badge.d.ts.map +1 -0
  196. package/dist/components/ui/badge.js +25 -0
  197. package/dist/components/ui/badge.js.map +1 -0
  198. package/dist/components/ui/breadcrumb.d.ts +12 -0
  199. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  200. package/dist/components/ui/breadcrumb.js +28 -0
  201. package/dist/components/ui/breadcrumb.js.map +1 -0
  202. package/dist/components/ui/button.d.ts +11 -0
  203. package/dist/components/ui/button.d.ts.map +1 -0
  204. package/dist/components/ui/button.js +36 -0
  205. package/dist/components/ui/button.js.map +1 -0
  206. package/dist/components/ui/calendar.d.ts +11 -0
  207. package/dist/components/ui/calendar.d.ts.map +1 -0
  208. package/dist/components/ui/calendar.js +77 -0
  209. package/dist/components/ui/calendar.js.map +1 -0
  210. package/dist/components/ui/card.d.ts +12 -0
  211. package/dist/components/ui/card.d.ts.map +1 -0
  212. package/dist/components/ui/card.js +25 -0
  213. package/dist/components/ui/card.js.map +1 -0
  214. package/dist/components/ui/carousel.d.ts +29 -0
  215. package/dist/components/ui/carousel.d.ts.map +1 -0
  216. package/dist/components/ui/carousel.js +92 -0
  217. package/dist/components/ui/carousel.js.map +1 -0
  218. package/dist/components/ui/chart.d.ts +45 -0
  219. package/dist/components/ui/chart.d.ts.map +1 -0
  220. package/dist/components/ui/chart.js +133 -0
  221. package/dist/components/ui/chart.js.map +1 -0
  222. package/dist/components/ui/checkbox.d.ts +5 -0
  223. package/dist/components/ui/checkbox.d.ts.map +1 -0
  224. package/dist/components/ui/checkbox.js +10 -0
  225. package/dist/components/ui/checkbox.js.map +1 -0
  226. package/dist/components/ui/collapsible.d.ts +6 -0
  227. package/dist/components/ui/collapsible.d.ts.map +1 -0
  228. package/dist/components/ui/collapsible.js +14 -0
  229. package/dist/components/ui/collapsible.js.map +1 -0
  230. package/dist/components/ui/command.d.ts +19 -0
  231. package/dist/components/ui/command.d.ts.map +1 -0
  232. package/dist/components/ui/command.js +36 -0
  233. package/dist/components/ui/command.js.map +1 -0
  234. package/dist/components/ui/context-menu.d.ts +32 -0
  235. package/dist/components/ui/context-menu.d.ts.map +1 -0
  236. package/dist/components/ui/context-menu.js +52 -0
  237. package/dist/components/ui/context-menu.js.map +1 -0
  238. package/dist/components/ui/dialog.d.ts +18 -0
  239. package/dist/components/ui/dialog.d.ts.map +1 -0
  240. package/dist/components/ui/dialog.js +38 -0
  241. package/dist/components/ui/dialog.js.map +1 -0
  242. package/dist/components/ui/drawer.d.ts +14 -0
  243. package/dist/components/ui/drawer.d.ts.map +1 -0
  244. package/dist/components/ui/drawer.js +36 -0
  245. package/dist/components/ui/drawer.js.map +1 -0
  246. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  247. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  248. package/dist/components/ui/dropdown-menu.js +52 -0
  249. package/dist/components/ui/dropdown-menu.js.map +1 -0
  250. package/dist/components/ui/form.d.ts +25 -0
  251. package/dist/components/ui/form.d.ts.map +1 -0
  252. package/dist/components/ui/form.js +60 -0
  253. package/dist/components/ui/form.js.map +1 -0
  254. package/dist/components/ui/hover-card.d.ts +7 -0
  255. package/dist/components/ui/hover-card.d.ts.map +1 -0
  256. package/dist/components/ui/hover-card.js +15 -0
  257. package/dist/components/ui/hover-card.js.map +1 -0
  258. package/dist/components/ui/input-group.d.ts +17 -0
  259. package/dist/components/ui/input-group.d.ts.map +1 -0
  260. package/dist/components/ui/input-group.js +58 -0
  261. package/dist/components/ui/input-group.js.map +1 -0
  262. package/dist/components/ui/input-otp.d.ts +12 -0
  263. package/dist/components/ui/input-otp.d.ts.map +1 -0
  264. package/dist/components/ui/input-otp.js +22 -0
  265. package/dist/components/ui/input-otp.js.map +1 -0
  266. package/dist/components/ui/input.d.ts +4 -0
  267. package/dist/components/ui/input.d.ts.map +1 -0
  268. package/dist/components/ui/input.js +7 -0
  269. package/dist/components/ui/input.js.map +1 -0
  270. package/dist/components/ui/kbd.d.ts +4 -0
  271. package/dist/components/ui/kbd.d.ts.map +1 -0
  272. package/dist/components/ui/kbd.js +10 -0
  273. package/dist/components/ui/kbd.js.map +1 -0
  274. package/dist/components/ui/label.d.ts +5 -0
  275. package/dist/components/ui/label.d.ts.map +1 -0
  276. package/dist/components/ui/label.js +9 -0
  277. package/dist/components/ui/label.js.map +1 -0
  278. package/dist/components/ui/menubar.d.ts +31 -0
  279. package/dist/components/ui/menubar.d.ts.map +1 -0
  280. package/dist/components/ui/menubar.js +55 -0
  281. package/dist/components/ui/menubar.js.map +1 -0
  282. package/dist/components/ui/navigation-menu.d.ts +15 -0
  283. package/dist/components/ui/navigation-menu.d.ts.map +1 -0
  284. package/dist/components/ui/navigation-menu.js +32 -0
  285. package/dist/components/ui/navigation-menu.js.map +1 -0
  286. package/dist/components/ui/pagination.d.ts +18 -0
  287. package/dist/components/ui/pagination.d.ts.map +1 -0
  288. package/dist/components/ui/pagination.js +27 -0
  289. package/dist/components/ui/pagination.js.map +1 -0
  290. package/dist/components/ui/popover.d.ts +11 -0
  291. package/dist/components/ui/popover.d.ts.map +1 -0
  292. package/dist/components/ui/popover.js +27 -0
  293. package/dist/components/ui/popover.js.map +1 -0
  294. package/dist/components/ui/progress.d.ts +5 -0
  295. package/dist/components/ui/progress.d.ts.map +1 -0
  296. package/dist/components/ui/progress.js +9 -0
  297. package/dist/components/ui/progress.js.map +1 -0
  298. package/dist/components/ui/radio-group.d.ts +6 -0
  299. package/dist/components/ui/radio-group.d.ts.map +1 -0
  300. package/dist/components/ui/radio-group.js +12 -0
  301. package/dist/components/ui/radio-group.js.map +1 -0
  302. package/dist/components/ui/resizable.d.ts +8 -0
  303. package/dist/components/ui/resizable.d.ts.map +1 -0
  304. package/dist/components/ui/resizable.js +15 -0
  305. package/dist/components/ui/resizable.js.map +1 -0
  306. package/dist/components/ui/scroll-area.d.ts +6 -0
  307. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  308. package/dist/components/ui/scroll-area.js +12 -0
  309. package/dist/components/ui/scroll-area.js.map +1 -0
  310. package/dist/components/ui/select.d.ts +16 -0
  311. package/dist/components/ui/select.d.ts.map +1 -0
  312. package/dist/components/ui/select.js +37 -0
  313. package/dist/components/ui/select.js.map +1 -0
  314. package/dist/components/ui/separator.d.ts +5 -0
  315. package/dist/components/ui/separator.d.ts.map +1 -0
  316. package/dist/components/ui/separator.js +9 -0
  317. package/dist/components/ui/separator.js.map +1 -0
  318. package/dist/components/ui/sheet.d.ts +15 -0
  319. package/dist/components/ui/sheet.d.ts.map +1 -0
  320. package/dist/components/ui/sheet.js +38 -0
  321. package/dist/components/ui/sheet.js.map +1 -0
  322. package/dist/components/ui/sidebar.d.ts +70 -0
  323. package/dist/components/ui/sidebar.d.ts.map +1 -0
  324. package/dist/components/ui/sidebar.js +207 -0
  325. package/dist/components/ui/sidebar.js.map +1 -0
  326. package/dist/components/ui/skeleton.d.ts +3 -0
  327. package/dist/components/ui/skeleton.d.ts.map +1 -0
  328. package/dist/components/ui/skeleton.js +7 -0
  329. package/dist/components/ui/skeleton.js.map +1 -0
  330. package/dist/components/ui/slider.d.ts +5 -0
  331. package/dist/components/ui/slider.d.ts.map +1 -0
  332. package/dist/components/ui/slider.js +15 -0
  333. package/dist/components/ui/slider.js.map +1 -0
  334. package/dist/components/ui/sonner.d.ts +4 -0
  335. package/dist/components/ui/sonner.d.ts.map +1 -0
  336. package/dist/components/ui/sonner.js +26 -0
  337. package/dist/components/ui/sonner.js.map +1 -0
  338. package/dist/components/ui/switch.d.ts +7 -0
  339. package/dist/components/ui/switch.d.ts.map +1 -0
  340. package/dist/components/ui/switch.js +9 -0
  341. package/dist/components/ui/switch.js.map +1 -0
  342. package/dist/components/ui/table.d.ts +11 -0
  343. package/dist/components/ui/table.d.ts.map +1 -0
  344. package/dist/components/ui/table.js +29 -0
  345. package/dist/components/ui/table.js.map +1 -0
  346. package/dist/components/ui/tabs.d.ts +12 -0
  347. package/dist/components/ui/tabs.d.ts.map +1 -0
  348. package/dist/components/ui/tabs.js +30 -0
  349. package/dist/components/ui/tabs.js.map +1 -0
  350. package/dist/components/ui/textarea.d.ts +4 -0
  351. package/dist/components/ui/textarea.d.ts.map +1 -0
  352. package/dist/components/ui/textarea.js +7 -0
  353. package/dist/components/ui/textarea.js.map +1 -0
  354. package/dist/components/ui/toggle-group.d.ts +11 -0
  355. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  356. package/dist/components/ui/toggle-group.js +24 -0
  357. package/dist/components/ui/toggle-group.js.map +1 -0
  358. package/dist/components/ui/toggle.d.ts +10 -0
  359. package/dist/components/ui/toggle.d.ts.map +1 -0
  360. package/dist/components/ui/toggle.js +27 -0
  361. package/dist/components/ui/toggle.js.map +1 -0
  362. package/dist/components/ui/tooltip.d.ts +8 -0
  363. package/dist/components/ui/tooltip.d.ts.map +1 -0
  364. package/dist/components/ui/tooltip.js +18 -0
  365. package/dist/components/ui/tooltip.js.map +1 -0
  366. package/dist/hooks/use-mobile.d.ts +2 -0
  367. package/dist/hooks/use-mobile.d.ts.map +1 -0
  368. package/dist/hooks/use-mobile.js +16 -0
  369. package/dist/hooks/use-mobile.js.map +1 -0
  370. package/dist/index.d.ts +53 -0
  371. package/dist/index.d.ts.map +1 -0
  372. package/dist/index.js +57 -0
  373. package/dist/index.js.map +1 -0
  374. package/dist/lib/utils.d.ts +3 -0
  375. package/dist/lib/utils.d.ts.map +1 -0
  376. package/dist/lib/utils.js +6 -0
  377. package/dist/lib/utils.js.map +1 -0
  378. package/dist/styles.css +240 -0
  379. package/package.json +67 -0
package/README.md ADDED
@@ -0,0 +1,203 @@
1
+ # @debug/ui
2
+
3
+ Design system Debug — **tokens, tema (light/dark) e componentes** extraídos do
4
+ projeto Thema Ultra. Empacota:
5
+
6
+ - **Fontes** — tema mapeado para **Geist Sans / Geist Mono** (com fallback de
7
+ sistema se você não configurar).
8
+ - **Tokens** — cores OKLCH (light + dark), escala de raio, mapeamento
9
+ `@theme inline` do Tailwind v4 (`styles.css`).
10
+ - **Primitivos** — 47 componentes shadcn/ui no estilo `radix-nova`
11
+ (`Badge`, `Button`, `Card`, `Table`, `Dialog`, `Sidebar`…).
12
+ - **Blocos compartilhados** — `PageHeader`, `DataTable`, `StatusBadge`,
13
+ `StatCard`, `StatsGrid`, `ChartCard`, `SeriesChart`, `EmptyState`…
14
+ - **Utils** — `cn()` e o hook `useIsMobile()`.
15
+
16
+ > **Requisitos:** React 19+, Tailwind CSS **v4**, e um bundler (Next.js, Vite,
17
+ > Remix…). O pacote não depende de Next.
18
+
19
+ ---
20
+
21
+ ## 1. Instalação
22
+
23
+ ```bash
24
+ pnpm add @debug/ui
25
+ # peers (se ainda não tiver):
26
+ pnpm add react react-dom tailwindcss
27
+ ```
28
+
29
+ As demais libs de runtime (radix-ui, lucide-react, recharts, sonner,
30
+ @tanstack/react-table, cmdk, vaul, embla, react-day-picker, react-hook-form,
31
+ react-resizable-panels, tw-animate-css, cva, clsx, tailwind-merge) já vêm como
32
+ dependências do pacote.
33
+
34
+ ## 2. Estilos (Tailwind v4)
35
+
36
+ No CSS global da sua app:
37
+
38
+ ```css
39
+ @import "tailwindcss";
40
+
41
+ /* IMPORTANTE: o Tailwind v4 ignora node_modules por padrão. Sem esta linha as
42
+ classes dos componentes do @debug/ui são removidas no purge. Ajuste o caminho
43
+ relativo conforme a localização deste arquivo CSS. */
44
+ @source "../node_modules/@debug/ui/dist";
45
+
46
+ /* tokens + tema + base (light/dark) */
47
+ @import "@debug/ui/styles.css";
48
+ ```
49
+
50
+ O dark mode é ativado pela classe `.dark` no `<html>` (compatível com
51
+ `next-themes`).
52
+
53
+ ## 3. Fonte Geist
54
+
55
+ O tema usa as variáveis `--font-geist-sans` e `--font-geist-mono`. Configure-as
56
+ uma vez:
57
+
58
+ ### Next.js (App Router)
59
+
60
+ ```tsx
61
+ // app/layout.tsx
62
+ import { Geist, Geist_Mono } from "next/font/google";
63
+
64
+ const geistSans = Geist({ variable: "--font-geist-sans", subsets: ["latin"] });
65
+ const geistMono = Geist_Mono({ variable: "--font-geist-mono", subsets: ["latin"] });
66
+
67
+ export default function RootLayout({ children }: { children: React.ReactNode }) {
68
+ return (
69
+ <html lang="pt-BR" className={`${geistSans.variable} ${geistMono.variable}`}>
70
+ <body>{children}</body>
71
+ </html>
72
+ );
73
+ }
74
+ ```
75
+
76
+ ### Vite / outros (fontsource)
77
+
78
+ ```bash
79
+ pnpm add @fontsource-variable/geist @fontsource-variable/geist-mono
80
+ ```
81
+
82
+ ```css
83
+ @import "@fontsource-variable/geist";
84
+ @import "@fontsource-variable/geist-mono";
85
+
86
+ :root {
87
+ --font-geist-sans: "Geist Variable", sans-serif;
88
+ --font-geist-mono: "Geist Mono Variable", monospace;
89
+ }
90
+ ```
91
+
92
+ > Se você pular este passo, o tema cai para `ui-sans-serif, system-ui` — funciona,
93
+ > só não fica com a cara da Geist.
94
+
95
+ ## 4. Uso
96
+
97
+ ```tsx
98
+ import { Badge, Button, Card, CardHeader, CardTitle, CardContent, cn } from "@debug/ui";
99
+
100
+ export function Example() {
101
+ return (
102
+ <Card>
103
+ <CardHeader>
104
+ <CardTitle>Olá <Badge variant="secondary">novo</Badge></CardTitle>
105
+ </CardHeader>
106
+ <CardContent>
107
+ <Button className={cn("w-full")}>Continuar</Button>
108
+ </CardContent>
109
+ </Card>
110
+ );
111
+ }
112
+ ```
113
+
114
+ Blocos de mais alto nível:
115
+
116
+ ```tsx
117
+ import { StatCard, StatusBadge, DataTable } from "@debug/ui";
118
+ import { Users, CheckCircle2 } from "lucide-react";
119
+
120
+ <StatCard variant="panel" title="Total" value={42} icon={Users} />
121
+ <StatusBadge tone="emerald" icon={CheckCircle2} label="Active" />
122
+ ```
123
+
124
+ > Os componentes recebem o ícone como prop (`icon={LucideIcon}`), então a escolha
125
+ > da biblioteca de ícones fica com você — recomendado **lucide-react** (já é dep).
126
+
127
+ ## 5. Blocos pré-montados (`blocks`)
128
+
129
+ Componentes "tudo pronto", data-driven, no estilo dos dashboards. Você passa só
130
+ os dados:
131
+
132
+ ```tsx
133
+ import {
134
+ StatsRow, // linha de 4 cards de métrica
135
+ BarBreakdownCard, // barras horizontais por categoria (ex: Leads by Status)
136
+ TrendChartCard, // card de gráfico área/barra/linha + total
137
+ DonutCard, // rosca/pizza com legenda
138
+ GaugeCard, // progresso radial (meta/score)
139
+ ProgressListCard, // lista de barras de progresso + %
140
+ SparkStatCard, // métrica compacta + sparkline
141
+ ActivityFeedCard, // feed/timeline
142
+ RankingListCard, // top N
143
+ KpiCard, // KPI compacto (bubble + valor + delta)
144
+ TimelineCard, // timeline vertical com linha conectora
145
+ TodoListCard, // checklist com checkboxes
146
+ TeamListCard, // membros (avatar + cargo + status)
147
+ FunnelCard, // funil de conversão
148
+ RadarStatsCard, // radar multi-eixo
149
+ CalloutCard, // card promo/CTA com gradiente
150
+ FileListCard, // lista de arquivos/documentos
151
+ StepsCard, // stepper vertical (done/current/todo)
152
+ } from "@debug/ui";
153
+ import { Tag, TrendingUp } from "lucide-react";
154
+
155
+ <BarBreakdownCard
156
+ title="Leads by Status"
157
+ icon={Tag}
158
+ change="+20%(244)"
159
+ caption="vs Last Months"
160
+ items={[
161
+ { label: "New Leads", value: 1420, color: "#375dfb" },
162
+ { label: "Contacted", value: 980, color: "#6985fc" },
163
+ { label: "Qualified", value: 620, color: "#9baefd" },
164
+ ]}
165
+ />
166
+
167
+ <TrendChartCard
168
+ title="Monthly Lead Growth"
169
+ icon={TrendingUp}
170
+ data={data}
171
+ xKey="month"
172
+ series={[{ key: "leads", label: "Leads", color: "#6e3ff3" }]}
173
+ type="area"
174
+ total="4,820"
175
+ change="+20%(244)"
176
+ caption="vs Last Months"
177
+ />
178
+ ```
179
+
180
+ Todos aceitam `actions` (ex.: um menu "⋯"), `className` e formatadores. A
181
+ paleta padrão (`chartPalette`) reproduz o ramp azul→roxo dos widgets.
182
+
183
+ ---
184
+
185
+ ## Desenvolvimento
186
+
187
+ ```bash
188
+ pnpm install
189
+ pnpm build # tsc -> dist (ESM + .d.ts) + tsc-alias + copia styles.css
190
+ pnpm dev # build em watch
191
+ pnpm typecheck
192
+ ```
193
+
194
+ - Fonte em `src/` (alias `@/*` → `src/*`); o build resolve os aliases para
195
+ caminhos relativos e preserva as diretivas `"use client"` por arquivo.
196
+ - Saída em `dist/` (não versionada; gerada no build/publish).
197
+
198
+ ## Publicação
199
+
200
+ ```bash
201
+ pnpm build
202
+ npm publish --access public # ou configure um registry privado / GitHub Packages
203
+ ```
@@ -0,0 +1,25 @@
1
+ import * as React from "react";
2
+ import { type StatusTone } from "../../components/shared/index.js";
3
+ export interface ActivityItem {
4
+ title: React.ReactNode;
5
+ description?: React.ReactNode;
6
+ /** Right-aligned timestamp, e.g. "2h ago". */
7
+ time?: React.ReactNode;
8
+ /** Avatar image URL (takes precedence over `icon`). */
9
+ avatar?: string;
10
+ fallback?: string;
11
+ /** Leading icon (used when no avatar). */
12
+ icon?: React.ElementType;
13
+ /** Tint for the icon bubble. */
14
+ tone?: StatusTone;
15
+ }
16
+ export interface ActivityFeedCardProps {
17
+ title?: React.ReactNode;
18
+ icon?: React.ElementType;
19
+ actions?: React.ReactNode;
20
+ items: ActivityItem[];
21
+ className?: string;
22
+ }
23
+ /** Timeline / activity feed: avatar or tinted icon + title + description + time. */
24
+ export declare function ActivityFeedCard({ title, icon, actions, items, className, }: ActivityFeedCardProps): React.JSX.Element;
25
+ //# sourceMappingURL=activity-feed-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-feed-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/activity-feed-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGhE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,8CAA8C;IAC9C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,gCAAgC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,oFAAoF;AACpF,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,SAAS,GACV,EAAE,qBAAqB,qBAkDvB"}
@@ -0,0 +1,13 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { Avatar, AvatarFallback, AvatarImage } from "../../components/ui/avatar.js";
4
+ import { toneSoft } from "../../components/shared/index.js";
5
+ import { BlockCard } from "./block-card.js";
6
+ /** Timeline / activity feed: avatar or tinted icon + title + description + time. */
7
+ export function ActivityFeedCard({ title, icon, actions, items, className, }) {
8
+ return (_jsx(BlockCard, { title: title, icon: icon, actions: actions, className: className, bodyClassName: "space-y-4", children: items.map((item, i) => {
9
+ const Leading = item.icon;
10
+ return (_jsxs("div", { className: "flex items-start gap-3", children: [item.avatar !== undefined || !Leading ? (_jsxs(Avatar, { className: "size-8 shrink-0", children: [item.avatar && (_jsx(AvatarImage, { src: item.avatar, alt: "" })), _jsx(AvatarFallback, { className: "bg-muted text-xs", children: item.fallback ?? "•" })] })) : (_jsx("span", { className: cn("flex size-8 shrink-0 items-center justify-center rounded-full", toneSoft[item.tone ?? "gray"]), children: _jsx(Leading, { className: "size-4" }) })), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: item.title }), item.description && (_jsx("p", { className: "truncate text-xs text-muted-foreground", children: item.description }))] }), item.time && (_jsx("span", { className: "shrink-0 text-xs text-muted-foreground", children: item.time }))] }, i));
11
+ }) }));
12
+ }
13
+ //# sourceMappingURL=activity-feed-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-feed-card.js","sourceRoot":"","sources":["../../../src/components/blocks/activity-feed-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAwBzC,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,SAAS,GACa;IACtB,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAC,WAAW,YAExB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,OAAO,CACL,eAAa,SAAS,EAAC,wBAAwB,aAC5C,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CACvC,MAAC,MAAM,IAAC,SAAS,EAAC,iBAAiB,aAChC,IAAI,CAAC,MAAM,IAAI,CACd,KAAC,WAAW,IAAC,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAC,EAAE,GAAG,CACzC,EACD,KAAC,cAAc,IAAC,SAAS,EAAC,kBAAkB,YACzC,IAAI,CAAC,QAAQ,IAAI,GAAG,GACN,IACV,CACV,CAAC,CAAC,CAAC,CACF,eACE,SAAS,EAAE,EAAE,CACX,+DAA+D,EAC/D,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAC9B,YAED,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,GAAG,GACzB,CACR,EACD,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,8BAA8B,YAAE,IAAI,CAAC,KAAK,GAAK,EAC3D,IAAI,CAAC,WAAW,IAAI,CACnB,YAAG,SAAS,EAAC,wCAAwC,YAClD,IAAI,CAAC,WAAW,GACf,CACL,IACG,EACL,IAAI,CAAC,IAAI,IAAI,CACZ,eAAM,SAAS,EAAC,wCAAwC,YACrD,IAAI,CAAC,IAAI,GACL,CACR,KAhCO,CAAC,CAiCL,CACP,CAAC;QACJ,CAAC,CAAC,GACQ,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,34 @@
1
+ import * as React from "react";
2
+ export interface BarBreakdownItem {
3
+ label: string;
4
+ value: number;
5
+ /** Bar color (hex / css var). Falls back to the primary token. */
6
+ color?: string;
7
+ }
8
+ export interface BarBreakdownCardProps {
9
+ title?: React.ReactNode;
10
+ icon?: React.ElementType;
11
+ actions?: React.ReactNode;
12
+ items: BarBreakdownItem[];
13
+ /** Headline total. Defaults to the sum of `items`. */
14
+ total?: number;
15
+ /** e.g. "+20%(244)". */
16
+ change?: string;
17
+ trend?: "up" | "down";
18
+ /** Headline caption, e.g. "vs Last Months". */
19
+ caption?: string;
20
+ /** Hide the big total headline. */
21
+ showTotal?: boolean;
22
+ /** Sort rows by value (default "desc"); "none" keeps input order. */
23
+ sortBy?: "desc" | "asc" | "none";
24
+ /** Format the per-row + total numbers. Defaults to `toLocaleString()`. */
25
+ formatValue?: (value: number) => string;
26
+ className?: string;
27
+ bodyClassName?: string;
28
+ }
29
+ /**
30
+ * Horizontal labeled-bar breakdown (the "Leads by Status" widget): a header,
31
+ * an optional total + change headline, and one scaled bar per item.
32
+ */
33
+ export declare function BarBreakdownCard({ title, icon, actions, items, total, change, trend, caption, showTotal, sortBy, formatValue, className, bodyClassName, }: BarBreakdownCardProps): React.JSX.Element;
34
+ //# sourceMappingURL=bar-breakdown-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-breakdown-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/bar-breakdown-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,qBAAqB;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wBAAwB;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACjC,0EAA0E;IAC1E,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAgB,EAChB,MAAe,EACf,WAA4B,EAC5B,SAAS,EACT,aAAa,GACd,EAAE,qBAAqB,qBAyDvB"}
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/utils.js";
5
+ import { BlockCard, MetricHeadline } from "./block-card.js";
6
+ const DEFAULT_FORMAT = (v) => v.toLocaleString();
7
+ /**
8
+ * Horizontal labeled-bar breakdown (the "Leads by Status" widget): a header,
9
+ * an optional total + change headline, and one scaled bar per item.
10
+ */
11
+ export function BarBreakdownCard({ title, icon, actions, items, total, change, trend, caption, showTotal = true, sortBy = "desc", formatValue = DEFAULT_FORMAT, className, bodyClassName, }) {
12
+ const rows = React.useMemo(() => {
13
+ if (sortBy === "none")
14
+ return items;
15
+ return [...items].sort((a, b) => sortBy === "asc" ? a.value - b.value : b.value - a.value);
16
+ }, [items, sortBy]);
17
+ const max = React.useMemo(() => Math.max(...items.map((i) => i.value), 1), [items]);
18
+ const sum = React.useMemo(() => items.reduce((acc, i) => acc + i.value, 0), [items]);
19
+ return (_jsxs(BlockCard, { title: title, icon: icon, actions: actions, className: className, bodyClassName: cn("space-y-6 sm:space-y-8", bodyClassName), children: [showTotal && (_jsx(MetricHeadline, { value: formatValue(total ?? sum), change: change, trend: trend, caption: caption })), _jsx("div", { className: "space-y-3 sm:space-y-4", children: rows.map((item) => (_jsxs("div", { className: "flex items-center gap-3 sm:gap-4", children: [_jsx("span", { className: "w-16 shrink-0 truncate text-xs text-muted-foreground sm:w-[62px]", children: item.label }), _jsx("div", { className: "h-[15px] flex-1 rounded bg-muted", children: _jsx("div", { className: "h-full rounded bg-primary transition-all duration-300", style: {
20
+ width: `${(item.value / max) * 100}%`,
21
+ backgroundColor: item.color,
22
+ } }) }), _jsx("span", { className: "w-10 shrink-0 text-right text-xs font-semibold sm:w-[42px]", children: formatValue(item.value) })] }, item.label))) })] }));
23
+ }
24
+ //# sourceMappingURL=bar-breakdown-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bar-breakdown-card.js","sourceRoot":"","sources":["../../../src/components/blocks/bar-breakdown-card.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA+BzD,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;AAEzD;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,GAAG,IAAI,EAChB,MAAM,GAAG,MAAM,EACf,WAAW,GAAG,cAAc,EAC5B,SAAS,EACT,aAAa,GACS;IACtB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QAC9B,IAAI,MAAM,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACpC,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC9B,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CACzD,CAAC;IACJ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEpB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAC/C,CAAC,KAAK,CAAC,CACR,CAAC;IACF,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,EAChD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,OAAO,CACL,MAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,EAAE,CAAC,wBAAwB,EAAE,aAAa,CAAC,aAEzD,SAAS,IAAI,CACZ,KAAC,cAAc,IACb,KAAK,EAAE,WAAW,CAAC,KAAK,IAAI,GAAG,CAAC,EAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,GAChB,CACH,EAED,cAAK,SAAS,EAAC,wBAAwB,YACpC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAClB,eAAsB,SAAS,EAAC,kCAAkC,aAChE,eAAM,SAAS,EAAC,kEAAkE,YAC/E,IAAI,CAAC,KAAK,GACN,EACP,cAAK,SAAS,EAAC,kCAAkC,YAC/C,cACE,SAAS,EAAC,uDAAuD,EACjE,KAAK,EAAE;oCACL,KAAK,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG;oCACrC,eAAe,EAAE,IAAI,CAAC,KAAK;iCAC5B,GACD,GACE,EACN,eAAM,SAAS,EAAC,4DAA4D,YACzE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GACnB,KAfC,IAAI,CAAC,KAAK,CAgBd,CACP,CAAC,GACE,IACI,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ import * as React from "react";
2
+ /**
3
+ * Shared chrome for the dashboard blocks — reproduces the Square UI widget look:
4
+ * a rounded card with a header row (outline icon button + title, optional
5
+ * actions on the right) and a `px-5 pb-5` body.
6
+ */
7
+ export interface BlockCardProps {
8
+ title?: React.ReactNode;
9
+ /** Leading icon, rendered inside a small outline button. */
10
+ icon?: React.ElementType;
11
+ /** Right-side header content (a "⋯" menu, a period selector, etc.). */
12
+ actions?: React.ReactNode;
13
+ /** Replace the whole left header block (icon + title). */
14
+ header?: React.ReactNode;
15
+ children: React.ReactNode;
16
+ className?: string;
17
+ headerClassName?: string;
18
+ bodyClassName?: string;
19
+ titleClassName?: string;
20
+ iconClassName?: string;
21
+ }
22
+ export declare function BlockCard({ title, icon: Icon, actions, header, children, className, headerClassName, bodyClassName, titleClassName, iconClassName, }: BlockCardProps): React.JSX.Element;
23
+ /**
24
+ * The big "value + change + caption" headline used at the top of breakdown and
25
+ * trend cards (e.g. "3,612 +20%(244) vs Last Months").
26
+ */
27
+ export interface MetricHeadlineProps {
28
+ value: React.ReactNode;
29
+ /** e.g. "+20%(244)". Color auto-derives from the leading sign. */
30
+ change?: string;
31
+ /** Force the trend color instead of inferring from `change`. */
32
+ trend?: "up" | "down";
33
+ /** e.g. "vs Last Months" (hidden on small screens). */
34
+ caption?: string;
35
+ className?: string;
36
+ valueClassName?: string;
37
+ }
38
+ export declare function MetricHeadline({ value, change, trend, caption, className, valueClassName, }: MetricHeadlineProps): React.JSX.Element;
39
+ //# sourceMappingURL=block-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/block-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,uEAAuE;IACvE,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,0DAA0D;IAC1D,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EAAE,IAAI,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,GACd,EAAE,cAAc,qBAiDhB;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,kEAAkE;IAClE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,wBAAgB,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,cAAc,GACf,EAAE,mBAAmB,qBAmCrB"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { Button } from "../../components/ui/button.js";
4
+ export function BlockCard({ title, icon: Icon, actions, header, children, className, headerClassName, bodyClassName, titleClassName, iconClassName, }) {
5
+ const hasHeader = header || title || Icon || actions;
6
+ return (_jsxs("div", { className: cn("flex w-full flex-col rounded-xl border bg-card text-card-foreground", className), children: [hasHeader && (_jsxs("div", { className: cn("flex flex-row items-center justify-between gap-2 px-5 py-5", headerClassName), children: [header ?? (_jsxs("div", { className: "flex min-w-0 items-center gap-2", children: [Icon && (_jsx(Button, { variant: "outline", size: "icon", className: "size-8 shrink-0", "aria-hidden": true, tabIndex: -1, children: _jsx(Icon, { className: cn("size-4 text-muted-foreground", iconClassName) }) })), title && (_jsx("h3", { className: cn("truncate text-sm font-medium sm:text-base", titleClassName), children: title }))] })), actions] })), _jsx("div", { className: cn("px-5 pb-5", bodyClassName), children: children })] }));
7
+ }
8
+ export function MetricHeadline({ value, change, trend, caption, className, valueClassName, }) {
9
+ const positive = trend ? trend === "up" : !change?.trim().startsWith("-");
10
+ return (_jsxs("div", { className: cn("flex items-end gap-2", className), children: [_jsx("span", { className: cn("text-2xl font-semibold tracking-tight sm:text-[28px]", valueClassName), children: value }), (change || caption) && (_jsxs("div", { className: "flex items-center gap-2 pb-1 text-xs sm:text-sm", children: [change && (_jsx("span", { className: cn("font-medium", positive
11
+ ? "text-emerald-600 dark:text-emerald-400"
12
+ : "text-red-600 dark:text-red-400"), children: change })), caption && (_jsx("span", { className: "hidden text-muted-foreground sm:inline", children: caption }))] }))] }));
13
+ }
14
+ //# sourceMappingURL=block-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-card.js","sourceRoot":"","sources":["../../../src/components/blocks/block-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAuBhD,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EAAE,IAAI,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,eAAe,EACf,aAAa,EACb,cAAc,EACd,aAAa,GACE;IACf,MAAM,SAAS,GAAG,MAAM,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,CAAC;IACrD,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,qEAAqE,EACrE,SAAS,CACV,aAEA,SAAS,IAAI,CACZ,eACE,SAAS,EAAE,EAAE,CACX,4DAA4D,EAC5D,eAAe,CAChB,aAEA,MAAM,IAAI,CACT,eAAK,SAAS,EAAC,iCAAiC,aAC7C,IAAI,IAAI,CACP,KAAC,MAAM,IACL,OAAO,EAAC,SAAS,EACjB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,iBAAiB,uBAE3B,QAAQ,EAAE,CAAC,CAAC,YAEZ,KAAC,IAAI,IACH,SAAS,EAAE,EAAE,CAAC,8BAA8B,EAAE,aAAa,CAAC,GAC5D,GACK,CACV,EACA,KAAK,IAAI,CACR,aACE,SAAS,EAAE,EAAE,CACX,2CAA2C,EAC3C,cAAc,CACf,YAEA,KAAK,GACH,CACN,IACG,CACP,EACA,OAAO,IACJ,CACP,EACD,cAAK,SAAS,EAAE,EAAE,CAAC,WAAW,EAAE,aAAa,CAAC,YAAG,QAAQ,GAAO,IAC5D,CACP,CAAC;AACJ,CAAC;AAkBD,MAAM,UAAU,cAAc,CAAC,EAC7B,KAAK,EACL,MAAM,EACN,KAAK,EACL,OAAO,EACP,SAAS,EACT,cAAc,GACM;IACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;IAC1E,OAAO,CACL,eAAK,SAAS,EAAE,EAAE,CAAC,sBAAsB,EAAE,SAAS,CAAC,aACnD,eACE,SAAS,EAAE,EAAE,CACX,sDAAsD,EACtD,cAAc,CACf,YAEA,KAAK,GACD,EACN,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CACtB,eAAK,SAAS,EAAC,iDAAiD,aAC7D,MAAM,IAAI,CACT,eACE,SAAS,EAAE,EAAE,CACX,aAAa,EACb,QAAQ;4BACN,CAAC,CAAC,wCAAwC;4BAC1C,CAAC,CAAC,gCAAgC,CACrC,YAEA,MAAM,GACF,CACR,EACA,OAAO,IAAI,CACV,eAAM,SAAS,EAAC,wCAAwC,YACrD,OAAO,GACH,CACR,IACG,CACP,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import * as React from "react";
2
+ export interface CalloutCardProps {
3
+ title: React.ReactNode;
4
+ description?: React.ReactNode;
5
+ icon?: React.ElementType;
6
+ /** Primary action button. */
7
+ actionLabel?: React.ReactNode;
8
+ onAction?: () => void;
9
+ /** Render the action as a link instead of a button. */
10
+ href?: string;
11
+ /** Override the gradient/background (Tailwind classes). */
12
+ gradientClassName?: string;
13
+ className?: string;
14
+ }
15
+ /**
16
+ * Gradient promo / upgrade card (CTA). Defaults to a violet→indigo gradient on
17
+ * a white-on-color layout; override via `gradientClassName`.
18
+ */
19
+ export declare function CalloutCard({ title, description, icon: Icon, actionLabel, onAction, href, gradientClassName, className, }: CalloutCardProps): React.JSX.Element;
20
+ //# sourceMappingURL=callout-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/callout-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,6BAA6B;IAC7B,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,uDAAuD;IACvD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,iBAAiB,EACjB,SAAS,GACV,EAAE,gBAAgB,qBAqClB"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { Button } from "../../components/ui/button.js";
4
+ /**
5
+ * Gradient promo / upgrade card (CTA). Defaults to a violet→indigo gradient on
6
+ * a white-on-color layout; override via `gradientClassName`.
7
+ */
8
+ export function CalloutCard({ title, description, icon: Icon, actionLabel, onAction, href, gradientClassName, className, }) {
9
+ return (_jsxs("div", { className: cn("relative flex flex-col gap-4 overflow-hidden rounded-xl p-6 text-white", gradientClassName ??
10
+ "bg-gradient-to-br from-violet-500 via-indigo-500 to-indigo-700", className), children: [_jsx("div", { className: "pointer-events-none absolute -right-8 -top-8 size-32 rounded-full bg-white/10", "aria-hidden": true }), Icon && (_jsx("span", { className: "flex size-10 items-center justify-center rounded-lg bg-white/15", children: _jsx(Icon, { className: "size-5" }) })), _jsxs("div", { className: "space-y-1", children: [_jsx("h3", { className: "text-base font-semibold", children: title }), description && (_jsx("p", { className: "text-sm text-white/80", children: description }))] }), actionLabel && (_jsx(Button, { asChild: !!href, onClick: onAction, variant: "secondary", className: "mt-1 w-fit bg-white text-foreground hover:bg-white/90", children: href ? _jsx("a", { href: href, children: actionLabel }) : _jsx("span", { children: actionLabel }) }))] }));
11
+ }
12
+ //# sourceMappingURL=callout-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callout-card.js","sourceRoot":"","sources":["../../../src/components/blocks/callout-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAgBhD;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,IAAI,EAAE,IAAI,EACV,WAAW,EACX,QAAQ,EACR,IAAI,EACJ,iBAAiB,EACjB,SAAS,GACQ;IACjB,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,wEAAwE,EACxE,iBAAiB;YACf,gEAAgE,EAClE,SAAS,CACV,aAED,cACE,SAAS,EAAC,+EAA+E,wBAEzF,EACD,IAAI,IAAI,CACP,eAAM,SAAS,EAAC,iEAAiE,YAC/E,KAAC,IAAI,IAAC,SAAS,EAAC,QAAQ,GAAG,GACtB,CACR,EACD,eAAK,SAAS,EAAC,WAAW,aACxB,aAAI,SAAS,EAAC,yBAAyB,YAAE,KAAK,GAAM,EACnD,WAAW,IAAI,CACd,YAAG,SAAS,EAAC,uBAAuB,YAAE,WAAW,GAAK,CACvD,IACG,EACL,WAAW,IAAI,CACd,KAAC,MAAM,IACL,OAAO,EAAE,CAAC,CAAC,IAAI,EACf,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAC,WAAW,EACnB,SAAS,EAAC,uDAAuD,YAEhE,IAAI,CAAC,CAAC,CAAC,YAAG,IAAI,EAAE,IAAI,YAAG,WAAW,GAAK,CAAC,CAAC,CAAC,yBAAO,WAAW,GAAQ,GAC9D,CACV,IACG,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,28 @@
1
+ import * as React from "react";
2
+ export interface DonutItem {
3
+ label: string;
4
+ value: number;
5
+ color?: string;
6
+ }
7
+ export interface DonutCardProps {
8
+ title?: React.ReactNode;
9
+ icon?: React.ElementType;
10
+ actions?: React.ReactNode;
11
+ items: DonutItem[];
12
+ /** Donut (with hole) vs full pie. Default `true` (donut). */
13
+ donut?: boolean;
14
+ /** Center value when donut; defaults to the total. Pass `null` to hide. */
15
+ centerValue?: React.ReactNode | null;
16
+ centerLabel?: React.ReactNode;
17
+ /** Hide the legend list on the right. */
18
+ showLegend?: boolean;
19
+ /** Show each legend value as a percentage of the total. */
20
+ legendAsPercent?: boolean;
21
+ formatValue?: (value: number) => string;
22
+ /** Chart box height (default `h-[220px]`). */
23
+ height?: string;
24
+ className?: string;
25
+ }
26
+ /** Donut / pie breakdown with a center total and a colored legend list. */
27
+ export declare function DonutCard({ title, icon, actions, items, donut, centerValue, centerLabel, showLegend, legendAsPercent, formatValue, height, className, }: DonutCardProps): React.JSX.Element;
28
+ //# sourceMappingURL=donut-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"donut-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/donut-card.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,6DAA6D;IAC7D,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,2EAA2E;IAC3E,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;IACrC,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,yCAAyC;IACzC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,8CAA8C;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAmCD,2EAA2E;AAC3E,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,KAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAiB,EACjB,eAAuB,EACvB,WAA4B,EAC5B,MAAoB,EACpB,SAAS,GACV,EAAE,cAAc,qBAmFhB"}
@@ -0,0 +1,24 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from "recharts";
5
+ import { cn } from "../../lib/utils.js";
6
+ import { BlockCard } from "./block-card.js";
7
+ import { paletteColor } from "./palette.js";
8
+ const DEFAULT_FORMAT = (v) => v.toLocaleString();
9
+ function DonutTooltip({ active, payload, format, }) {
10
+ if (!active || !payload?.length)
11
+ return null;
12
+ const d = payload[0];
13
+ return (_jsx("div", { className: "rounded-md border bg-card p-2 text-xs shadow-sm", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "size-2 rounded-full", style: { backgroundColor: d.payload.color } }), _jsx("span", { className: "text-muted-foreground", children: d.name }), _jsx("span", { className: "font-semibold", children: format(d.value) })] }) }));
14
+ }
15
+ /** Donut / pie breakdown with a center total and a colored legend list. */
16
+ export function DonutCard({ title, icon, actions, items, donut = true, centerValue, centerLabel, showLegend = true, legendAsPercent = false, formatValue = DEFAULT_FORMAT, height = "h-[220px]", className, }) {
17
+ const data = React.useMemo(() => items.map((it, i) => ({ ...it, color: it.color ?? paletteColor(i) })), [items]);
18
+ const total = React.useMemo(() => items.reduce((acc, i) => acc + i.value, 0), [items]);
19
+ const center = centerValue === undefined ? formatValue(total) : centerValue;
20
+ return (_jsx(BlockCard, { title: title, icon: icon, actions: actions, className: className, children: _jsxs("div", { className: "flex flex-col items-center gap-4 sm:flex-row sm:gap-2", children: [_jsxs("div", { className: cn("relative w-full sm:w-1/2", height), children: [_jsx(ResponsiveContainer, { width: "100%", height: "100%", children: _jsxs(PieChart, { children: [_jsx(Tooltip, { content: _jsx(DonutTooltip, { format: formatValue }), cursor: false }), _jsx(Pie, { data: data, dataKey: "value", nameKey: "label", innerRadius: donut ? "62%" : 0, outerRadius: "92%", paddingAngle: donut ? 2 : 0, strokeWidth: 0, children: data.map((d) => (_jsx(Cell, { fill: d.color }, d.label))) })] }) }), donut && center !== null && (_jsxs("div", { className: "pointer-events-none absolute inset-0 flex flex-col items-center justify-center", children: [_jsx("span", { className: "text-xl font-semibold tracking-tight sm:text-2xl", children: center }), centerLabel && (_jsx("span", { className: "text-xs text-muted-foreground", children: centerLabel }))] }))] }), showLegend && (_jsx("ul", { className: "w-full space-y-2 sm:w-1/2", children: data.map((d) => (_jsxs("li", { className: "flex items-center justify-between gap-2 text-sm", children: [_jsxs("span", { className: "flex min-w-0 items-center gap-2", children: [_jsx("span", { className: "size-2 shrink-0 rounded-full", style: { backgroundColor: d.color } }), _jsx("span", { className: "truncate text-muted-foreground", children: d.label })] }), _jsx("span", { className: "shrink-0 font-medium tabular-nums", children: legendAsPercent
21
+ ? `${Math.round((d.value / (total || 1)) * 100)}%`
22
+ : formatValue(d.value) })] }, d.label))) }))] }) }));
23
+ }
24
+ //# sourceMappingURL=donut-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"donut-card.js","sourceRoot":"","sources":["../../../src/components/blocks/donut-card.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ import { type StatusTone } from "../../components/shared/index.js";
3
+ export interface FileItem {
4
+ name: React.ReactNode;
5
+ /** Secondary line, e.g. "2.4 MB · 2d ago". */
6
+ meta?: React.ReactNode;
7
+ icon?: React.ElementType;
8
+ tone?: StatusTone;
9
+ /** Trailing content (size, menu, download button…). */
10
+ trailing?: React.ReactNode;
11
+ }
12
+ export interface FileListCardProps {
13
+ title?: React.ReactNode;
14
+ icon?: React.ElementType;
15
+ actions?: React.ReactNode;
16
+ files: FileItem[];
17
+ className?: string;
18
+ }
19
+ /** File / document list: tinted type icon + name + meta + trailing slot. */
20
+ export declare function FileListCard({ title, icon, actions, files, className, }: FileListCardProps): React.JSX.Element;
21
+ //# sourceMappingURL=file-list-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-list-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/file-list-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAY,KAAK,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAGhE,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,KAAK,CAAC,SAAS,CAAC;IACtB,8CAA8C;IAC9C,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,uDAAuD;IACvD,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,SAAS,GACV,EAAE,iBAAiB,qBA0CnB"}
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { toneSoft } from "../../components/shared/index.js";
4
+ import { BlockCard } from "./block-card.js";
5
+ /** File / document list: tinted type icon + name + meta + trailing slot. */
6
+ export function FileListCard({ title, icon, actions, files, className, }) {
7
+ return (_jsx(BlockCard, { title: title, icon: icon, actions: actions, className: className, bodyClassName: "space-y-1", children: files.map((file, i) => {
8
+ const Leading = file.icon;
9
+ return (_jsxs("div", { className: "flex items-center gap-3 rounded-md px-1 py-2 hover:bg-muted/50", children: [_jsx("span", { className: cn("flex size-9 shrink-0 items-center justify-center rounded-lg", toneSoft[file.tone ?? "gray"]), children: Leading && _jsx(Leading, { className: "size-4" }) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "truncate text-sm font-medium", children: file.name }), file.meta && (_jsx("p", { className: "truncate text-xs text-muted-foreground", children: file.meta }))] }), file.trailing && (_jsx("div", { className: "shrink-0 text-xs text-muted-foreground", children: file.trailing }))] }, i));
10
+ }) }));
11
+ }
12
+ //# sourceMappingURL=file-list-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-list-card.js","sourceRoot":"","sources":["../../../src/components/blocks/file-list-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAmB,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAoBzC,4EAA4E;AAC5E,MAAM,UAAU,YAAY,CAAC,EAC3B,KAAK,EACL,IAAI,EACJ,OAAO,EACP,KAAK,EACL,SAAS,GACS;IAClB,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAC,WAAW,YAExB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,OAAO,CACL,eAEE,SAAS,EAAC,gEAAgE,aAE1E,eACE,SAAS,EAAE,EAAE,CACX,6DAA6D,EAC7D,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,CAC9B,YAEA,OAAO,IAAI,KAAC,OAAO,IAAC,SAAS,EAAC,QAAQ,GAAG,GACrC,EACP,eAAK,SAAS,EAAC,gBAAgB,aAC7B,YAAG,SAAS,EAAC,8BAA8B,YAAE,IAAI,CAAC,IAAI,GAAK,EAC1D,IAAI,CAAC,IAAI,IAAI,CACZ,YAAG,SAAS,EAAC,wCAAwC,YAClD,IAAI,CAAC,IAAI,GACR,CACL,IACG,EACL,IAAI,CAAC,QAAQ,IAAI,CAChB,cAAK,SAAS,EAAC,wCAAwC,YACpD,IAAI,CAAC,QAAQ,GACV,CACP,KAvBI,CAAC,CAwBF,CACP,CAAC;QACJ,CAAC,CAAC,GACQ,CACb,CAAC;AACJ,CAAC"}
@@ -0,0 +1,19 @@
1
+ import * as React from "react";
2
+ export interface FunnelStage {
3
+ label: string;
4
+ value: number;
5
+ color?: string;
6
+ }
7
+ export interface FunnelCardProps {
8
+ title?: React.ReactNode;
9
+ icon?: React.ElementType;
10
+ actions?: React.ReactNode;
11
+ stages: FunnelStage[];
12
+ /** Show conversion % relative to the first stage. */
13
+ showConversion?: boolean;
14
+ formatValue?: (value: number) => string;
15
+ className?: string;
16
+ }
17
+ /** Funnel: decreasing centered bars with value + conversion vs. the top stage. */
18
+ export declare function FunnelCard({ title, icon, actions, stages, showConversion, formatValue, className, }: FunnelCardProps): React.JSX.Element;
19
+ //# sourceMappingURL=funnel-card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel-card.d.ts","sourceRoot":"","sources":["../../../src/components/blocks/funnel-card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,IAAI,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC;IACzB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,qDAAqD;IACrD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAID,kFAAkF;AAClF,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACJ,OAAO,EACP,MAAM,EACN,cAAqB,EACrB,WAA4B,EAC5B,SAAS,GACV,EAAE,eAAe,qBA0CjB"}
@@ -0,0 +1,18 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { cn } from "../../lib/utils.js";
3
+ import { BlockCard } from "./block-card.js";
4
+ import { paletteColor } from "./palette.js";
5
+ const DEFAULT_FORMAT = (v) => v.toLocaleString();
6
+ /** Funnel: decreasing centered bars with value + conversion vs. the top stage. */
7
+ export function FunnelCard({ title, icon, actions, stages, showConversion = true, formatValue = DEFAULT_FORMAT, className, }) {
8
+ const top = stages[0]?.value ?? 1;
9
+ return (_jsx(BlockCard, { title: title, icon: icon, actions: actions, className: className, bodyClassName: "space-y-3", children: stages.map((s, i) => {
10
+ const pct = (s.value / (top || 1)) * 100;
11
+ const color = s.color ?? paletteColor(i);
12
+ return (_jsxs("div", { className: "space-y-1", children: [_jsxs("div", { className: "flex items-center justify-between text-xs", children: [_jsx("span", { className: "text-muted-foreground", children: s.label }), _jsxs("span", { className: "font-medium tabular-nums", children: [formatValue(s.value), showConversion && (_jsxs("span", { className: "ml-1.5 text-muted-foreground", children: [Math.round(pct), "%"] }))] })] }), _jsx("div", { className: "flex justify-center", children: _jsx("div", { className: cn("h-8 rounded-md transition-all duration-300"), style: {
13
+ width: `${Math.max(pct, 6)}%`,
14
+ backgroundColor: color,
15
+ } }) })] }, s.label));
16
+ }) }));
17
+ }
18
+ //# sourceMappingURL=funnel-card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"funnel-card.js","sourceRoot":"","sources":["../../../src/components/blocks/funnel-card.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAmBzC,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;AAEzD,kFAAkF;AAClF,MAAM,UAAU,UAAU,CAAC,EACzB,KAAK,EACL,IAAI,EACJ,OAAO,EACP,MAAM,EACN,cAAc,GAAG,IAAI,EACrB,WAAW,GAAG,cAAc,EAC5B,SAAS,GACO;IAChB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAClC,OAAO,CACL,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,aAAa,EAAC,WAAW,YAExB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACnB,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YACzC,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;YACzC,OAAO,CACL,eAAmB,SAAS,EAAC,WAAW,aACtC,eAAK,SAAS,EAAC,2CAA2C,aACxD,eAAM,SAAS,EAAC,uBAAuB,YAAE,CAAC,CAAC,KAAK,GAAQ,EACxD,gBAAM,SAAS,EAAC,0BAA0B,aACvC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,EACpB,cAAc,IAAI,CACjB,gBAAM,SAAS,EAAC,8BAA8B,aAC3C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SACX,CACR,IACI,IACH,EACN,cAAK,SAAS,EAAC,qBAAqB,YAClC,cACE,SAAS,EAAE,EAAE,CACX,4CAA4C,CAC7C,EACD,KAAK,EAAE;gCACL,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG;gCAC7B,eAAe,EAAE,KAAK;6BACvB,GACD,GACE,KAtBE,CAAC,CAAC,KAAK,CAuBX,CACP,CAAC;QACJ,CAAC,CAAC,GACQ,CACb,CAAC;AACJ,CAAC"}