@wealthx/shadcn 1.1.0 → 1.2.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 (300) hide show
  1. package/.turbo/turbo-build.log +235 -154
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-6OJF6XRN.mjs → chunk-24FUO7TD.mjs} +4 -8
  4. package/dist/{chunk-4AJ5HWHD.mjs → chunk-2I5S2AMY.mjs} +3 -3
  5. package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
  6. package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
  7. package/dist/chunk-3WMX6KWS.mjs +245 -0
  8. package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
  9. package/dist/chunk-4CX4SBRO.mjs +153 -0
  10. package/dist/chunk-4MN6UQHG.mjs +443 -0
  11. package/dist/chunk-4Y6R4WEC.mjs +250 -0
  12. package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
  13. package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
  14. package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
  15. package/dist/chunk-7MMXNK3C.mjs +317 -0
  16. package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
  17. package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
  18. package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
  19. package/dist/chunk-A56YQQHG.mjs +402 -0
  20. package/dist/{chunk-GLW2UO6O.mjs → chunk-BL3DXM2X.mjs} +84 -62
  21. package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
  22. package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
  23. package/dist/chunk-D4ILTPOG.mjs +293 -0
  24. package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
  25. package/dist/chunk-DOH3EHX7.mjs +378 -0
  26. package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
  27. package/dist/{chunk-YBXCIF5Q.mjs → chunk-ERGGHC2V.mjs} +36 -49
  28. package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
  29. package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
  30. package/dist/chunk-FMAXJ2SI.mjs +71 -0
  31. package/dist/chunk-FZIXGLMV.mjs +173 -0
  32. package/dist/chunk-GGM2UYGG.mjs +273 -0
  33. package/dist/{chunk-DS2AMHN2.mjs → chunk-GYMYRIZP.mjs} +2 -2
  34. package/dist/{chunk-KQDD5MU3.mjs → chunk-H45TKD34.mjs} +5 -5
  35. package/dist/{chunk-BBJBJSXQ.mjs → chunk-J5UICVJS.mjs} +1 -1
  36. package/dist/{chunk-RL772EH7.mjs → chunk-JHJHG4GO.mjs} +4 -12
  37. package/dist/{chunk-RN67642N.mjs → chunk-JNQORUPP.mjs} +49 -42
  38. package/dist/{chunk-5JGQAAQV.mjs → chunk-K3JYD4IU.mjs} +86 -63
  39. package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
  40. package/dist/{chunk-UEL4RD5P.mjs → chunk-LHYCMLVA.mjs} +82 -68
  41. package/dist/{chunk-NLLKTU4B.mjs → chunk-LLVQKSU3.mjs} +21 -17
  42. package/dist/{chunk-KKHTJNMM.mjs → chunk-MARPPFOJ.mjs} +8 -4
  43. package/dist/{chunk-6AFMNC42.mjs → chunk-N2PT566P.mjs} +15 -11
  44. package/dist/{chunk-YN5SYTOO.mjs → chunk-NQPOYKAQ.mjs} +9 -5
  45. package/dist/{chunk-ZZV5JVNW.mjs → chunk-NSLMILBT.mjs} +3 -7
  46. package/dist/chunk-OGOYQ7BG.mjs +150 -0
  47. package/dist/chunk-OPNQAVVH.mjs +162 -0
  48. package/dist/{chunk-3NQGYJEZ.mjs → chunk-P6AM5V7O.mjs} +10 -18
  49. package/dist/{chunk-CZ3BW5GL.mjs → chunk-P76HMUI6.mjs} +5 -11
  50. package/dist/chunk-PCPLO5HT.mjs +671 -0
  51. package/dist/chunk-PG6K5XEC.mjs +475 -0
  52. package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
  53. package/dist/chunk-PR6V5XKM.mjs +209 -0
  54. package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
  55. package/dist/chunk-RGU7HOEC.mjs +140 -0
  56. package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
  57. package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
  58. package/dist/chunk-RYCLWMZ7.mjs +162 -0
  59. package/dist/chunk-SIZMLSRU.mjs +162 -0
  60. package/dist/chunk-SPJ5KXW7.mjs +199 -0
  61. package/dist/chunk-SWGT756Z.mjs +210 -0
  62. package/dist/chunk-SYOD63OZ.mjs +225 -0
  63. package/dist/chunk-TS2ZX2VS.mjs +270 -0
  64. package/dist/chunk-UFYSFDER.mjs +42 -0
  65. package/dist/chunk-VACKZOMY.mjs +190 -0
  66. package/dist/chunk-VLQZANBF.mjs +42 -0
  67. package/dist/chunk-VPBN3WOO.mjs +164 -0
  68. package/dist/chunk-WA6O6EUR.mjs +1885 -0
  69. package/dist/{chunk-E3K6O4FZ.mjs → chunk-WAZD7NFU.mjs} +5 -2
  70. package/dist/chunk-WG6JGJXB.mjs +165 -0
  71. package/dist/{chunk-I64K754C.mjs → chunk-WNGWBVLV.mjs} +2 -2
  72. package/dist/{chunk-3U7SD3MS.mjs → chunk-WOEHFRGB.mjs} +3 -3
  73. package/dist/{chunk-DKZRJOMF.mjs → chunk-XIRTEFKH.mjs} +12 -12
  74. package/dist/chunk-Y6DWJSKZ.mjs +79 -0
  75. package/dist/{chunk-CJ46PDXE.mjs → chunk-ZRO5JO3H.mjs} +106 -66
  76. package/dist/{chunk-VYMHBV6D.mjs → chunk-ZU4NV6RG.mjs} +5 -3
  77. package/dist/components/ui/accordion.js +40 -4
  78. package/dist/components/ui/accordion.mjs +2 -2
  79. package/dist/components/ui/add-column-modal.js +789 -0
  80. package/dist/components/ui/add-column-modal.mjs +17 -0
  81. package/dist/components/ui/add-lead-modal.js +647 -0
  82. package/dist/components/ui/add-lead-modal.mjs +16 -0
  83. package/dist/components/ui/ai-assistant-drawer.js +686 -0
  84. package/dist/components/ui/ai-assistant-drawer.mjs +16 -0
  85. package/dist/components/ui/alert-dialog.js +37 -5
  86. package/dist/components/ui/alert-dialog.mjs +4 -4
  87. package/dist/components/ui/alert.js +37 -11
  88. package/dist/components/ui/alert.mjs +2 -2
  89. package/dist/components/ui/avatar.js +36 -8
  90. package/dist/components/ui/avatar.mjs +2 -2
  91. package/dist/components/ui/backoffice-alert-history-chart.js +624 -0
  92. package/dist/components/ui/backoffice-alert-history-chart.mjs +16 -0
  93. package/dist/components/ui/backoffice-contact-history-chart.js +687 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.mjs +16 -0
  95. package/dist/components/ui/badge.js +37 -2
  96. package/dist/components/ui/badge.mjs +2 -2
  97. package/dist/components/ui/borrowing-capacity-line-chart.js +640 -0
  98. package/dist/components/ui/borrowing-capacity-line-chart.mjs +16 -0
  99. package/dist/components/ui/button.js +35 -3
  100. package/dist/components/ui/button.mjs +2 -2
  101. package/dist/components/ui/calendar.js +43 -19
  102. package/dist/components/ui/calendar.mjs +3 -3
  103. package/dist/components/ui/card.js +40 -4
  104. package/dist/components/ui/card.mjs +2 -2
  105. package/dist/components/ui/cash-balance-line-chart.js +628 -0
  106. package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
  107. package/dist/components/ui/cashflow-bar-chart.js +124 -70
  108. package/dist/components/ui/cashflow-bar-chart.mjs +8 -8
  109. package/dist/components/ui/checkbox.js +36 -5
  110. package/dist/components/ui/checkbox.mjs +2 -3
  111. package/dist/components/ui/chip.js +37 -2
  112. package/dist/components/ui/chip.mjs +3 -3
  113. package/dist/components/ui/combobox.js +68 -49
  114. package/dist/components/ui/combobox.mjs +2 -2
  115. package/dist/components/ui/data-table.js +160 -88
  116. package/dist/components/ui/data-table.mjs +10 -11
  117. package/dist/components/ui/date-picker.js +44 -20
  118. package/dist/components/ui/date-picker.mjs +6 -7
  119. package/dist/components/ui/dialog.js +44 -12
  120. package/dist/components/ui/dialog.mjs +4 -4
  121. package/dist/components/ui/drawer.js +46 -10
  122. package/dist/components/ui/drawer.mjs +3 -3
  123. package/dist/components/ui/dropdown-menu.js +40 -16
  124. package/dist/components/ui/dropdown-menu.mjs +3 -3
  125. package/dist/components/ui/empty.js +41 -5
  126. package/dist/components/ui/empty.mjs +2 -2
  127. package/dist/components/ui/expense-bar-chart.js +166 -67
  128. package/dist/components/ui/expense-bar-chart.mjs +8 -8
  129. package/dist/components/ui/field.js +53 -21
  130. package/dist/components/ui/field.mjs +4 -4
  131. package/dist/components/ui/financial-cards.js +1002 -0
  132. package/dist/components/ui/financial-cards.mjs +24 -0
  133. package/dist/components/ui/financial-drawers.js +637 -0
  134. package/dist/components/ui/financial-drawers.mjs +17 -0
  135. package/dist/components/ui/financial-primitives.js +218 -0
  136. package/dist/components/ui/financial-primitives.mjs +22 -0
  137. package/dist/components/ui/financial-sections.js +1422 -0
  138. package/dist/components/ui/financial-sections.mjs +30 -0
  139. package/dist/components/ui/form-primitives.js +682 -0
  140. package/dist/components/ui/form-primitives.mjs +19 -0
  141. package/dist/components/ui/income-bar-chart.js +164 -66
  142. package/dist/components/ui/income-bar-chart.mjs +8 -8
  143. package/dist/components/ui/input-group.js +43 -7
  144. package/dist/components/ui/input-group.mjs +5 -5
  145. package/dist/components/ui/input-otp.js +39 -3
  146. package/dist/components/ui/input-otp.mjs +2 -2
  147. package/dist/components/ui/input.js +34 -2
  148. package/dist/components/ui/input.mjs +2 -2
  149. package/dist/components/ui/kanban-column.js +1143 -0
  150. package/dist/components/ui/kanban-column.mjs +20 -0
  151. package/dist/components/ui/label.js +35 -7
  152. package/dist/components/ui/label.mjs +2 -2
  153. package/dist/components/ui/opportunity-card.js +960 -0
  154. package/dist/components/ui/opportunity-card.mjs +20 -0
  155. package/dist/components/ui/opportunity-edit-modals.js +3360 -0
  156. package/dist/components/ui/opportunity-edit-modals.mjs +37 -0
  157. package/dist/components/ui/opportunity-summary-tab.js +4365 -0
  158. package/dist/components/ui/opportunity-summary-tab.mjs +34 -0
  159. package/dist/components/ui/pagination.js +35 -3
  160. package/dist/components/ui/pagination.mjs +3 -3
  161. package/dist/components/ui/pipeline-alerts.js +103 -0
  162. package/dist/components/ui/pipeline-alerts.mjs +8 -0
  163. package/dist/components/ui/pipeline-board.js +1408 -0
  164. package/dist/components/ui/pipeline-board.mjs +24 -0
  165. package/dist/components/ui/pipeline-chart.js +216 -0
  166. package/dist/components/ui/pipeline-chart.mjs +10 -0
  167. package/dist/components/ui/pipeline-dialogs.js +1183 -0
  168. package/dist/components/ui/pipeline-dialogs.mjs +23 -0
  169. package/dist/components/ui/pipeline-primitives.js +300 -0
  170. package/dist/components/ui/pipeline-primitives.mjs +11 -0
  171. package/dist/components/ui/popover.js +45 -4
  172. package/dist/components/ui/popover.mjs +3 -3
  173. package/dist/components/ui/progress.js +33 -1
  174. package/dist/components/ui/progress.mjs +2 -2
  175. package/dist/components/ui/property-cashflow-doughnut-chart.js +523 -0
  176. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +16 -0
  177. package/dist/components/ui/property-debt-equity-doughnut-chart.js +521 -0
  178. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +16 -0
  179. package/dist/components/ui/property-mobile-estimate-line-chart.js +683 -0
  180. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +16 -0
  181. package/dist/components/ui/radio-group.js +33 -1
  182. package/dist/components/ui/radio-group.mjs +2 -2
  183. package/dist/components/ui/select.js +66 -26
  184. package/dist/components/ui/select.mjs +3 -3
  185. package/dist/components/ui/separator.js +33 -1
  186. package/dist/components/ui/separator.mjs +2 -2
  187. package/dist/components/ui/sheet.js +37 -9
  188. package/dist/components/ui/sheet.mjs +3 -3
  189. package/dist/components/ui/skeleton.js +33 -1
  190. package/dist/components/ui/skeleton.mjs +2 -2
  191. package/dist/components/ui/slider.js +86 -102
  192. package/dist/components/ui/slider.mjs +2 -2
  193. package/dist/components/ui/spinner.js +33 -1
  194. package/dist/components/ui/spinner.mjs +2 -2
  195. package/dist/components/ui/stage-timeline.js +579 -0
  196. package/dist/components/ui/stage-timeline.mjs +15 -0
  197. package/dist/components/ui/switch.js +37 -4
  198. package/dist/components/ui/switch.mjs +2 -3
  199. package/dist/components/ui/table.js +37 -5
  200. package/dist/components/ui/table.mjs +2 -2
  201. package/dist/components/ui/tabs.js +36 -12
  202. package/dist/components/ui/tabs.mjs +2 -2
  203. package/dist/components/ui/textarea.js +34 -2
  204. package/dist/components/ui/textarea.mjs +2 -2
  205. package/dist/components/ui/toggle-group.js +35 -4
  206. package/dist/components/ui/toggle-group.mjs +3 -4
  207. package/dist/components/ui/toggle.js +35 -4
  208. package/dist/components/ui/toggle.mjs +2 -3
  209. package/dist/components/ui/tooltip.js +51 -22
  210. package/dist/components/ui/tooltip.mjs +3 -3
  211. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +528 -0
  212. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +16 -0
  213. package/dist/components/ui/transactions-income-expense-bar-chart.js +77 -39
  214. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +8 -8
  215. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +528 -0
  216. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +16 -0
  217. package/dist/index.js +11620 -3832
  218. package/dist/index.mjs +333 -161
  219. package/dist/lib/theme-provider.js +10 -1
  220. package/dist/lib/theme-provider.mjs +1 -1
  221. package/dist/lib/typography.js +8 -0
  222. package/dist/lib/typography.mjs +3 -1
  223. package/dist/lib/utils.js +33 -1
  224. package/dist/lib/utils.mjs +1 -1
  225. package/dist/styles.css +1 -1
  226. package/package.json +140 -5
  227. package/src/components/index.tsx +296 -42
  228. package/src/components/ui/accordion.tsx +6 -3
  229. package/src/components/ui/add-column-modal.tsx +339 -0
  230. package/src/components/ui/add-lead-modal.tsx +290 -0
  231. package/src/components/ui/ai-assistant-drawer.tsx +408 -0
  232. package/src/components/ui/alert-dialog.tsx +80 -54
  233. package/src/components/ui/alert.tsx +28 -28
  234. package/src/components/ui/avatar.tsx +30 -29
  235. package/src/components/ui/backoffice-alert-history-chart.tsx +261 -0
  236. package/src/components/ui/backoffice-contact-history-chart.tsx +326 -0
  237. package/src/components/ui/badge.tsx +17 -15
  238. package/src/components/ui/borrowing-capacity-line-chart.tsx +359 -0
  239. package/src/components/ui/button.tsx +30 -27
  240. package/src/components/ui/calendar.tsx +53 -67
  241. package/src/components/ui/card.tsx +27 -24
  242. package/src/components/ui/cash-balance-line-chart.tsx +304 -0
  243. package/src/components/ui/cashflow-bar-chart.tsx +106 -78
  244. package/src/components/ui/chart-shared.tsx +176 -15
  245. package/src/components/ui/checkbox.tsx +30 -26
  246. package/src/components/ui/combobox.tsx +78 -72
  247. package/src/components/ui/data-table.tsx +160 -99
  248. package/src/components/ui/date-picker.tsx +0 -2
  249. package/src/components/ui/dialog.tsx +70 -60
  250. package/src/components/ui/drawer.tsx +57 -48
  251. package/src/components/ui/dropdown-menu.tsx +90 -82
  252. package/src/components/ui/empty.tsx +31 -27
  253. package/src/components/ui/expense-bar-chart.tsx +85 -66
  254. package/src/components/ui/field.tsx +70 -62
  255. package/src/components/ui/financial-cards.tsx +830 -0
  256. package/src/components/ui/financial-drawers.tsx +339 -0
  257. package/src/components/ui/financial-primitives.tsx +331 -0
  258. package/src/components/ui/financial-sections.tsx +672 -0
  259. package/src/components/ui/form-primitives.tsx +536 -0
  260. package/src/components/ui/income-bar-chart.tsx +81 -61
  261. package/src/components/ui/input-group.tsx +41 -34
  262. package/src/components/ui/input-otp.tsx +29 -24
  263. package/src/components/ui/input.tsx +8 -8
  264. package/src/components/ui/kanban-column.tsx +333 -0
  265. package/src/components/ui/label.tsx +9 -12
  266. package/src/components/ui/opportunity-card.tsx +616 -0
  267. package/src/components/ui/opportunity-edit-modals.tsx +2528 -0
  268. package/src/components/ui/opportunity-summary-tab.tsx +579 -0
  269. package/src/components/ui/pipeline-alerts.tsx +74 -0
  270. package/src/components/ui/pipeline-board.tsx +268 -0
  271. package/src/components/ui/pipeline-chart.tsx +173 -0
  272. package/src/components/ui/pipeline-dialogs.tsx +303 -0
  273. package/src/components/ui/pipeline-primitives.tsx +108 -0
  274. package/src/components/ui/popover.tsx +41 -36
  275. package/src/components/ui/property-cashflow-doughnut-chart.tsx +189 -0
  276. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +186 -0
  277. package/src/components/ui/property-mobile-estimate-line-chart.tsx +395 -0
  278. package/src/components/ui/select.tsx +65 -52
  279. package/src/components/ui/sheet.tsx +55 -52
  280. package/src/components/ui/slider.tsx +54 -77
  281. package/src/components/ui/stage-timeline.tsx +205 -0
  282. package/src/components/ui/switch.tsx +42 -29
  283. package/src/components/ui/table.tsx +28 -28
  284. package/src/components/ui/tabs.tsx +22 -28
  285. package/src/components/ui/textarea.tsx +8 -8
  286. package/src/components/ui/toggle-group.tsx +0 -2
  287. package/src/components/ui/toggle.tsx +13 -15
  288. package/src/components/ui/tooltip.tsx +30 -28
  289. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +192 -0
  290. package/src/components/ui/transactions-income-expense-bar-chart.tsx +47 -39
  291. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +192 -0
  292. package/src/lib/theme-provider.tsx +10 -0
  293. package/src/lib/typography.ts +9 -0
  294. package/src/lib/utils.ts +41 -3
  295. package/src/styles/globals.css +371 -124
  296. package/src/styles/styles-css.ts +1 -1
  297. package/tsup.config.ts +27 -0
  298. package/dist/chunk-3EQP72AW.mjs +0 -58
  299. package/dist/chunk-K74JRTJR.mjs +0 -105
  300. package/dist/chunk-V7CNWJT3.mjs +0 -10
@@ -1,5 +1,3 @@
1
- "use client"
2
-
3
1
  /**
4
2
  * DataTable — WealthX Design System
5
3
  *
@@ -16,8 +14,8 @@
16
14
  *
17
15
  * All colors use design tokens — no hex codes.
18
16
  */
19
- import { type ReactElement } from "react"
20
- import * as React from "react"
17
+ import { type ReactElement } from "react";
18
+ import * as React from "react";
21
19
  import {
22
20
  type ColumnDef,
23
21
  type ColumnFiltersState,
@@ -31,7 +29,7 @@ import {
31
29
  getPaginationRowModel,
32
30
  getSortedRowModel,
33
31
  useReactTable,
34
- } from "@tanstack/react-table"
32
+ } from "@tanstack/react-table";
35
33
  import {
36
34
  ArrowUpDown,
37
35
  ArrowUp,
@@ -41,8 +39,8 @@ import {
41
39
  ChevronsLeftIcon,
42
40
  ChevronsRightIcon,
43
41
  SlidersHorizontal,
44
- } from "lucide-react"
45
- import { cn } from "@/lib/utils"
42
+ } from "lucide-react";
43
+ import { cn } from "@/lib/utils";
46
44
  import {
47
45
  Table,
48
46
  TableBody,
@@ -50,17 +48,17 @@ import {
50
48
  TableHead,
51
49
  TableHeader,
52
50
  TableRow,
53
- } from "@/components/ui/table"
54
- import { Input } from "@/components/ui/input"
55
- import { Button } from "@/components/ui/button"
56
- import { Checkbox } from "@/components/ui/checkbox"
51
+ } from "@/components/ui/table";
52
+ import { Input } from "@/components/ui/input";
53
+ import { Button } from "@/components/ui/button";
54
+ import { Checkbox } from "@/components/ui/checkbox";
57
55
  import {
58
56
  Select,
59
57
  SelectContent,
60
58
  SelectItem,
61
59
  SelectTrigger,
62
60
  SelectValue,
63
- } from "@/components/ui/select"
61
+ } from "@/components/ui/select";
64
62
  import {
65
63
  DropdownMenu,
66
64
  DropdownMenuCheckboxItem,
@@ -69,8 +67,8 @@ import {
69
67
  DropdownMenuLabel,
70
68
  DropdownMenuSeparator,
71
69
  DropdownMenuTrigger,
72
- } from "@/components/ui/dropdown-menu"
73
- import { Skeleton } from "@/components/ui/skeleton"
70
+ } from "@/components/ui/dropdown-menu";
71
+ import { Skeleton } from "@/components/ui/skeleton";
74
72
 
75
73
  // ---------------------------------------------------------------------------
76
74
  // Types
@@ -78,31 +76,31 @@ import { Skeleton } from "@/components/ui/skeleton"
78
76
 
79
77
  export interface DataTableProps<TData, TValue> {
80
78
  /** Column definitions — pass ColumnDef[] from \@tanstack/react-table */
81
- columns: ColumnDef<TData, TValue>[]
79
+ columns: ColumnDef<TData, TValue>[];
82
80
  /** Row data */
83
- data: TData[]
81
+ data: TData[];
84
82
  /** Show a global search/filter input above the table */
85
- searchKey?: string
83
+ searchKey?: string;
86
84
  /** Placeholder for the search input */
87
- searchPlaceholder?: string
85
+ searchPlaceholder?: string;
88
86
  /** Enable row selection with checkboxes */
89
- enableRowSelection?: boolean
87
+ enableRowSelection?: boolean;
90
88
  /** Enable column visibility toggle dropdown */
91
- enableColumnVisibility?: boolean
89
+ enableColumnVisibility?: boolean;
92
90
  /** Page size options for the page-size selector */
93
- pageSizeOptions?: number[]
91
+ pageSizeOptions?: number[];
94
92
  /** Show loading skeleton */
95
- loading?: boolean
93
+ loading?: boolean;
96
94
  /** Number of skeleton rows to show while loading */
97
- skeletonRows?: number
95
+ skeletonRows?: number;
98
96
  /** Callback when row selection changes */
99
- onRowSelectionChange?: (selection: RowSelectionState) => void
97
+ onRowSelectionChange?: (selection: RowSelectionState) => void;
100
98
  /** Additional className for the root wrapper */
101
- className?: string
99
+ className?: string;
102
100
  /** Render a toolbar above the table (replaces default toolbar) */
103
- toolbar?: (table: TanstackTable<TData>) => React.ReactNode
101
+ toolbar?: (table: TanstackTable<TData>) => React.ReactNode;
104
102
  /** Text shown when no results found */
105
- emptyText?: string
103
+ emptyText?: string;
106
104
  }
107
105
 
108
106
  // ---------------------------------------------------------------------------
@@ -114,36 +112,45 @@ export function DataTableColumnHeader({
114
112
  title,
115
113
  className,
116
114
  }: {
117
- column: { getIsSorted: () => false | "asc" | "desc"; toggleSorting: (desc?: boolean) => void; getCanSort: () => boolean }
118
- title: string
119
- className?: string
115
+ column: {
116
+ getIsSorted: () => false | "asc" | "desc";
117
+ toggleSorting: (desc?: boolean) => void;
118
+ getCanSort: () => boolean;
119
+ };
120
+ title: string;
121
+ className?: string;
120
122
  }): ReactElement {
121
123
  if (!column.getCanSort()) {
122
- return <span className={className}>{title}</span>
124
+ return <span className={className}>{title}</span>;
123
125
  }
124
126
 
125
- const sorted = column.getIsSorted()
127
+ const sorted = column.getIsSorted();
126
128
 
127
- let sortIcon: ReactElement
129
+ let sortIcon: ReactElement;
128
130
  if (sorted === "asc") {
129
- sortIcon = <ArrowUp className="ml-1 size-3.5" />
131
+ sortIcon = <ArrowUp className="ml-1 size-3.5" />;
130
132
  } else if (sorted === "desc") {
131
- sortIcon = <ArrowDown className="ml-1 size-3.5" />
133
+ sortIcon = <ArrowDown className="ml-1 size-3.5" />;
132
134
  } else {
133
- sortIcon = <ArrowUpDown className="ml-1 size-3.5" />
135
+ sortIcon = <ArrowUpDown className="ml-1 size-3.5" />;
134
136
  }
135
137
 
136
138
  return (
137
139
  <Button
138
- className={cn("-ml-3 h-8 font-medium text-muted-foreground hover:text-foreground", className)}
139
- onClick={() => { column.toggleSorting(sorted === "asc"); }}
140
+ className={cn(
141
+ "-ml-3 h-8 text-muted-foreground hover:text-foreground",
142
+ className,
143
+ )}
144
+ onClick={() => {
145
+ column.toggleSorting(sorted === "asc");
146
+ }}
140
147
  size="sm"
141
148
  variant="ghost"
142
149
  >
143
150
  {title}
144
151
  {sortIcon}
145
152
  </Button>
146
- )
153
+ );
147
154
  }
148
155
 
149
156
  // ---------------------------------------------------------------------------
@@ -157,20 +164,26 @@ export function getSelectionColumn<TData>(): ColumnDef<TData> {
157
164
  <Checkbox
158
165
  aria-label="Select all"
159
166
  checked={table.getIsAllPageRowsSelected()}
160
- indeterminate={table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected()}
161
- onCheckedChange={(checked) => { table.toggleAllPageRowsSelected(Boolean(checked)); }}
167
+ indeterminate={
168
+ table.getIsSomePageRowsSelected() && !table.getIsAllPageRowsSelected()
169
+ }
170
+ onCheckedChange={(checked) => {
171
+ table.toggleAllPageRowsSelected(Boolean(checked));
172
+ }}
162
173
  />
163
174
  ),
164
175
  cell: ({ row }) => (
165
176
  <Checkbox
166
177
  aria-label="Select row"
167
178
  checked={row.getIsSelected()}
168
- onCheckedChange={(checked) => { row.toggleSelected(Boolean(checked)); }}
179
+ onCheckedChange={(checked) => {
180
+ row.toggleSelected(Boolean(checked));
181
+ }}
169
182
  />
170
183
  ),
171
184
  enableSorting: false,
172
185
  enableHiding: false,
173
- }
186
+ };
174
187
  }
175
188
 
176
189
  // ---------------------------------------------------------------------------
@@ -183,24 +196,38 @@ function DataTableToolbar<TData>({
183
196
  searchPlaceholder,
184
197
  enableColumnVisibility,
185
198
  }: {
186
- table: TanstackTable<TData>
187
- searchKey?: string
188
- searchPlaceholder?: string
189
- enableColumnVisibility?: boolean
199
+ table: TanstackTable<TData>;
200
+ searchKey?: string;
201
+ searchPlaceholder?: string;
202
+ enableColumnVisibility?: boolean;
190
203
  }): ReactElement {
191
204
  return (
192
- <div className="flex items-center justify-between gap-2 py-4" data-slot="data-table-toolbar">
205
+ <div
206
+ className="flex items-center justify-between gap-2 py-4"
207
+ data-slot="data-table-toolbar"
208
+ >
193
209
  <div className="flex flex-1 items-center gap-2">
194
- {searchKey ? <Input
210
+ {searchKey ? (
211
+ <Input
195
212
  className="max-w-xs"
196
- onChange={(e) => table.getColumn(searchKey)?.setFilterValue(e.target.value)}
213
+ onChange={(e) =>
214
+ table.getColumn(searchKey)?.setFilterValue(e.target.value)
215
+ }
197
216
  placeholder={searchPlaceholder ?? `Filter ${searchKey}...`}
198
217
  value={table.getColumn(searchKey)?.getFilterValue() as string}
199
- /> : null}
218
+ />
219
+ ) : null}
200
220
  </div>
201
- {enableColumnVisibility ? <DropdownMenu>
221
+ {enableColumnVisibility ? (
222
+ <DropdownMenu>
202
223
  <DropdownMenuTrigger
203
- render={<Button className="ml-auto h-8 gap-1.5" size="sm" variant="outline" />}
224
+ render={
225
+ <Button
226
+ className="ml-auto h-8 gap-1.5"
227
+ size="sm"
228
+ variant="outline"
229
+ />
230
+ }
204
231
  >
205
232
  <SlidersHorizontal className="size-3.5" />
206
233
  <span className="hidden sm:inline">Columns</span>
@@ -217,24 +244,27 @@ function DataTableToolbar<TData>({
217
244
  checked={col.getIsVisible()}
218
245
  className="capitalize"
219
246
  key={col.id}
220
- onCheckedChange={(value) => { col.toggleVisibility(Boolean(value)); }}
247
+ onCheckedChange={(value) => {
248
+ col.toggleVisibility(Boolean(value));
249
+ }}
221
250
  >
222
251
  {col.id}
223
252
  </DropdownMenuCheckboxItem>
224
253
  ))}
225
254
  </DropdownMenuGroup>
226
255
  </DropdownMenuContent>
227
- </DropdownMenu> : null}
256
+ </DropdownMenu>
257
+ ) : null}
228
258
  </div>
229
- )
259
+ );
230
260
  }
231
261
 
232
262
  function DataTablePagination<TData>({
233
263
  table,
234
264
  pageSizeOptions = [10, 20, 30, 50],
235
265
  }: {
236
- table: TanstackTable<TData>
237
- pageSizeOptions?: number[]
266
+ table: TanstackTable<TData>;
267
+ pageSizeOptions?: number[];
238
268
  }): ReactElement {
239
269
  return (
240
270
  <div
@@ -242,7 +272,7 @@ function DataTablePagination<TData>({
242
272
  data-slot="data-table-pagination"
243
273
  >
244
274
  {/* Selected rows info */}
245
- <p className="text-sm text-muted-foreground">
275
+ <p className="text-body-small text-muted-foreground">
246
276
  {table.getFilteredSelectedRowModel().rows.length > 0 && (
247
277
  <>
248
278
  {table.getFilteredSelectedRowModel().rows.length} of{" "}
@@ -254,13 +284,19 @@ function DataTablePagination<TData>({
254
284
  <div className="flex items-center gap-6">
255
285
  {/* Page size selector */}
256
286
  <div className="flex items-center gap-2">
257
- <p className="text-sm text-muted-foreground whitespace-nowrap">Rows per page</p>
287
+ <p className="text-body-small text-muted-foreground whitespace-nowrap">
288
+ Rows per page
289
+ </p>
258
290
  <Select
259
- onValueChange={(value) => { table.setPageSize(Number(value)); }}
291
+ onValueChange={(value) => {
292
+ table.setPageSize(Number(value));
293
+ }}
260
294
  value={`${table.getState().pagination.pageSize}`}
261
295
  >
262
296
  <SelectTrigger className="w-[70px]" size="sm">
263
- <SelectValue placeholder={`${table.getState().pagination.pageSize}`} />
297
+ <SelectValue
298
+ placeholder={`${table.getState().pagination.pageSize}`}
299
+ />
264
300
  </SelectTrigger>
265
301
  <SelectContent>
266
302
  {pageSizeOptions.map((pageSize) => (
@@ -273,8 +309,9 @@ function DataTablePagination<TData>({
273
309
  </div>
274
310
 
275
311
  {/* Page info */}
276
- <p className="text-sm text-muted-foreground whitespace-nowrap">
277
- Page {table.getState().pagination.pageIndex + 1} of {table.getPageCount()}
312
+ <p className="text-body-small text-muted-foreground whitespace-nowrap">
313
+ Page {table.getState().pagination.pageIndex + 1} of{" "}
314
+ {table.getPageCount()}
278
315
  </p>
279
316
 
280
317
  {/* Page navigation */}
@@ -282,7 +319,9 @@ function DataTablePagination<TData>({
282
319
  <Button
283
320
  aria-label="Go to first page"
284
321
  disabled={!table.getCanPreviousPage()}
285
- onClick={() => { table.setPageIndex(0); }}
322
+ onClick={() => {
323
+ table.setPageIndex(0);
324
+ }}
286
325
  size="icon-sm"
287
326
  variant="outline"
288
327
  >
@@ -291,7 +330,9 @@ function DataTablePagination<TData>({
291
330
  <Button
292
331
  aria-label="Go to previous page"
293
332
  disabled={!table.getCanPreviousPage()}
294
- onClick={() => { table.previousPage(); }}
333
+ onClick={() => {
334
+ table.previousPage();
335
+ }}
295
336
  size="icon-sm"
296
337
  variant="outline"
297
338
  >
@@ -300,7 +341,9 @@ function DataTablePagination<TData>({
300
341
  <Button
301
342
  aria-label="Go to next page"
302
343
  disabled={!table.getCanNextPage()}
303
- onClick={() => { table.nextPage(); }}
344
+ onClick={() => {
345
+ table.nextPage();
346
+ }}
304
347
  size="icon-sm"
305
348
  variant="outline"
306
349
  >
@@ -309,7 +352,9 @@ function DataTablePagination<TData>({
309
352
  <Button
310
353
  aria-label="Go to last page"
311
354
  disabled={!table.getCanNextPage()}
312
- onClick={() => { table.setPageIndex(table.getPageCount() - 1); }}
355
+ onClick={() => {
356
+ table.setPageIndex(table.getPageCount() - 1);
357
+ }}
313
358
  size="icon-sm"
314
359
  variant="outline"
315
360
  >
@@ -318,7 +363,7 @@ function DataTablePagination<TData>({
318
363
  </div>
319
364
  </div>
320
365
  </div>
321
- )
366
+ );
322
367
  }
323
368
 
324
369
  // ---------------------------------------------------------------------------
@@ -329,22 +374,24 @@ function DataTableSkeleton({
329
374
  columnCount,
330
375
  rowCount = 5,
331
376
  }: {
332
- columnCount: number
333
- rowCount?: number
377
+ columnCount: number;
378
+ rowCount?: number;
334
379
  }): ReactElement {
335
380
  return (
336
381
  <>
337
382
  {Array.from({ length: rowCount }).map((_, rowIdx) => (
338
383
  <TableRow key={`skeleton-row-${String(rowIdx)}`}>
339
384
  {Array.from({ length: columnCount }).map((_inner, colIdx) => (
340
- <TableCell key={`skeleton-cell-${String(rowIdx)}-${String(colIdx)}`}>
385
+ <TableCell
386
+ key={`skeleton-cell-${String(rowIdx)}-${String(colIdx)}`}
387
+ >
341
388
  <Skeleton className="h-4 w-3/4" />
342
389
  </TableCell>
343
390
  ))}
344
391
  </TableRow>
345
392
  ))}
346
393
  </>
347
- )
394
+ );
348
395
  }
349
396
 
350
397
  // ---------------------------------------------------------------------------
@@ -366,16 +413,22 @@ function DataTable<TData, TValue>({
366
413
  toolbar,
367
414
  emptyText = "No results.",
368
415
  }: DataTableProps<TData, TValue>): ReactElement {
369
- const [sorting, setSorting] = React.useState<SortingState>([])
370
- const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>([])
371
- const [columnVisibility, setColumnVisibility] = React.useState<VisibilityState>({})
372
- const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({})
416
+ const [sorting, setSorting] = React.useState<SortingState>([]);
417
+ const [columnFilters, setColumnFilters] = React.useState<ColumnFiltersState>(
418
+ [],
419
+ );
420
+ const [columnVisibility, setColumnVisibility] =
421
+ React.useState<VisibilityState>({});
422
+ const [rowSelection, setRowSelection] = React.useState<RowSelectionState>({});
373
423
 
374
424
  // Prepend selection column if enabled
375
425
  const resolvedColumns = React.useMemo(() => {
376
- if (!enableRowSelection) return userColumns
377
- return [getSelectionColumn<TData>(), ...userColumns] as ColumnDef<TData, TValue>[]
378
- }, [userColumns, enableRowSelection])
426
+ if (!enableRowSelection) return userColumns;
427
+ return [getSelectionColumn<TData>(), ...userColumns] as ColumnDef<
428
+ TData,
429
+ TValue
430
+ >[];
431
+ }, [userColumns, enableRowSelection]);
379
432
 
380
433
  const table = useReactTable({
381
434
  data,
@@ -390,20 +443,26 @@ function DataTable<TData, TValue>({
390
443
  onColumnFiltersChange: setColumnFilters,
391
444
  onColumnVisibilityChange: setColumnVisibility,
392
445
  onRowSelectionChange: (updater) => {
393
- const next = typeof updater === "function" ? updater(rowSelection) : updater
394
- setRowSelection(next)
395
- onRowSelectionChange?.(next)
446
+ const next =
447
+ typeof updater === "function" ? updater(rowSelection) : updater;
448
+ setRowSelection(next);
449
+ onRowSelectionChange?.(next);
396
450
  },
397
451
  getCoreRowModel: getCoreRowModel(),
398
452
  getFilteredRowModel: getFilteredRowModel(),
399
453
  getPaginationRowModel: getPaginationRowModel(),
400
454
  getSortedRowModel: getSortedRowModel(),
401
455
  enableRowSelection,
402
- })
456
+ });
403
457
 
404
458
  function renderTableBody(): ReactElement {
405
459
  if (loading) {
406
- return <DataTableSkeleton columnCount={resolvedColumns.length} rowCount={skeletonRows} />
460
+ return (
461
+ <DataTableSkeleton
462
+ columnCount={resolvedColumns.length}
463
+ rowCount={skeletonRows}
464
+ />
465
+ );
407
466
  }
408
467
 
409
468
  if (table.getRowModel().rows.length) {
@@ -422,7 +481,7 @@ function DataTable<TData, TValue>({
422
481
  </TableRow>
423
482
  ))}
424
483
  </>
425
- )
484
+ );
426
485
  }
427
486
 
428
487
  return (
@@ -434,7 +493,7 @@ function DataTable<TData, TValue>({
434
493
  {emptyText}
435
494
  </TableCell>
436
495
  </TableRow>
437
- )
496
+ );
438
497
  }
439
498
 
440
499
  return (
@@ -461,30 +520,32 @@ function DataTable<TData, TValue>({
461
520
  <TableHead key={header.id}>
462
521
  {header.isPlaceholder
463
522
  ? null
464
- : flexRender(header.column.columnDef.header, header.getContext())}
523
+ : flexRender(
524
+ header.column.columnDef.header,
525
+ header.getContext(),
526
+ )}
465
527
  </TableHead>
466
528
  ))}
467
529
  </TableRow>
468
530
  ))}
469
531
  </TableHeader>
470
- <TableBody>
471
- {renderTableBody()}
472
- </TableBody>
532
+ <TableBody>{renderTableBody()}</TableBody>
473
533
  </Table>
474
534
  </div>
475
535
 
476
536
  {/* Pagination */}
477
537
  <DataTablePagination pageSizeOptions={pageSizeOptions} table={table} />
478
538
  </div>
479
- )
539
+ );
480
540
  }
481
541
 
482
- export {
483
- DataTable,
484
- DataTableToolbar,
485
- DataTablePagination,
486
- DataTableSkeleton,
487
- }
542
+ export { DataTable, DataTableToolbar, DataTablePagination, DataTableSkeleton };
488
543
 
489
544
  // Re-export tanstack types for consumer convenience
490
- export type { ColumnDef, SortingState, ColumnFiltersState, VisibilityState, RowSelectionState }
545
+ export type {
546
+ ColumnDef,
547
+ SortingState,
548
+ ColumnFiltersState,
549
+ VisibilityState,
550
+ RowSelectionState,
551
+ };
@@ -1,5 +1,3 @@
1
- "use client"
2
-
3
1
  import { type ReactElement } from "react"
4
2
  import * as React from "react"
5
3
  import { format } from "date-fns"