@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,5 @@
1
1
  /**
2
- * Shared utilities and sub-components for IncomeBarChart and ExpenseBarChart.
2
+ * Shared utilities and sub-components for all shadcn chart components.
3
3
  * Not part of the public package API — internal use only.
4
4
  */
5
5
  import React from "react";
@@ -21,15 +21,18 @@ export type ChartGranularity = "monthly" | "daily";
21
21
  * monthly: slice by calendar month count.
22
22
  * daily: slice by approximate day count (1M=30d, 3M=90d, 6M=180d, 12M=365d).
23
23
  */
24
- export const CHART_SLICE_COUNT: Record<ChartGranularity, Record<ChartPeriod, number>> = {
25
- monthly: { 1: 1, 3: 3, 6: 6, 12: 12 },
26
- daily: { 1: 30, 3: 90, 6: 180, 12: 365 },
24
+ export const CHART_SLICE_COUNT: Record<
25
+ ChartGranularity,
26
+ Record<ChartPeriod, number>
27
+ > = {
28
+ monthly: { 1: 1, 3: 3, 6: 6, 12: 12 },
29
+ daily: { 1: 30, 3: 90, 6: 180, 12: 365 },
27
30
  };
28
31
 
29
32
  /** Period buttons shown per granularity. monthly hides 1M; daily shows all four. */
30
33
  export const CHART_PERIODS: Record<ChartGranularity, ChartPeriod[]> = {
31
34
  monthly: [3, 6, 12],
32
- daily: [1, 3, 6, 12],
35
+ daily: [1, 3, 6, 12],
33
36
  };
34
37
 
35
38
  // ---------------------------------------------------------------------------
@@ -40,7 +43,10 @@ export function hexToRgba(hex: string, alpha: number): string {
40
43
  const clean = hex.replace("#", "");
41
44
  const full =
42
45
  clean.length === 3
43
- ? clean.split("").map((c) => c + c).join("")
46
+ ? clean
47
+ .split("")
48
+ .map((c) => c + c)
49
+ .join("")
44
50
  : clean;
45
51
  const r = parseInt(full.slice(0, 2), 16);
46
52
  const g = parseInt(full.slice(2, 4), 16);
@@ -51,7 +57,51 @@ export function hexToRgba(hex: string, alpha: number): string {
51
57
  /** Opacity steps to derive distinct shades from a single brand color (up to 6 datasets). */
52
58
  export const DATASET_ALPHAS = [1, 0.72, 0.52, 0.36, 0.24, 0.15];
53
59
 
60
+ // ---------------------------------------------------------------------------
61
+ // Fallback resolved colors for Chart.js canvas API.
62
+ // Chart.js requires actual hex/rgb strings — CSS variables cannot be used directly.
63
+ // All values match the :root defaults defined in globals.css.
64
+ // ---------------------------------------------------------------------------
65
+
66
+ /** Fallback for --primary (WealthX green) */
67
+ export const FALLBACK_PRIMARY = "#33FF99";
68
+ /** Fallback for --brand-secondary (WealthX dark navy) */
69
+ export const FALLBACK_SECONDARY = "#162029";
70
+ /** Fallback for --background (white) */
71
+ export const FALLBACK_BG = "#ffffff";
72
+ /** Fallback for --foreground (near-black) */
73
+ export const FALLBACK_FOREGROUND = "#040D13";
74
+ /** Fallback for --muted-foreground used as axis tick color */
54
75
  export const FALLBACK_TICK = "#9EAAB5";
76
+ /** Fallback neutral grey for comparison / suburb lines */
77
+ export const FALLBACK_NEUTRAL = "#B9BCBF";
78
+ /** Fallback semi-transparent grid line color */
79
+ export const FALLBACK_GRID_COLOR = "rgba(0,0,0,0.06)";
80
+
81
+ /**
82
+ * Semantic severity colors for alert / status charts.
83
+ * Match WealthX design tokens: --destructive, --warning, --success.
84
+ * Intentionally fixed — severity meaning must be recognisable regardless of tenant theme.
85
+ */
86
+ export const SEVERITY_COLORS = {
87
+ high: "#F44336", // default --destructive oklch(0.643 0.215 28.8)
88
+ medium: "#FF9800", // default --warning oklch(0.77 0.174 64.1)
89
+ low: "#4CAF50", // default --success oklch(0.673 0.162 144.2)
90
+ } as const;
91
+
92
+ /**
93
+ * Format a dollar amount as an abbreviated string for chart axis ticks.
94
+ * e.g. 1_200_000 → "$1.2M", 580_000 → "$580K", -250_000 → "-$250K"
95
+ */
96
+ export function formatAbbrev(value: number): string {
97
+ const abs = Math.abs(value);
98
+ const sign = value < 0 ? "-" : "";
99
+ if (abs >= 1_000_000_000)
100
+ return `${sign}$${(abs / 1_000_000_000).toFixed(1)}B`;
101
+ if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;
102
+ if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(0)}K`;
103
+ return `${sign}$${abs.toFixed(0)}`;
104
+ }
55
105
 
56
106
  // ---------------------------------------------------------------------------
57
107
  // Tooltip date format
@@ -61,24 +111,128 @@ export const FALLBACK_TICK = "#9EAAB5";
61
111
  * Format an ISO date string for the chart tooltip title.
62
112
  * Daily granularity includes the day; monthly shows only month + year.
63
113
  */
64
- export function formatTooltipDate(iso: string, granularity: ChartGranularity): string {
114
+ export function formatTooltipDate(
115
+ iso: string,
116
+ granularity: ChartGranularity,
117
+ ): string {
65
118
  const d = new Date(iso);
66
- return d.toLocaleDateString("en-US",
119
+ return d.toLocaleDateString(
120
+ "en-US",
67
121
  granularity === "daily"
68
122
  ? { month: "short", day: "numeric", year: "numeric" }
69
- : { month: "short", year: "numeric" }
123
+ : { month: "short", year: "numeric" },
70
124
  );
71
125
  }
72
126
 
127
+ // ---------------------------------------------------------------------------
128
+ // Date / count formatters (shared across bar and doughnut charts)
129
+ // ---------------------------------------------------------------------------
130
+
131
+ /** Format an ISO date string as "Mon 'YY" for X-axis month labels. */
132
+ export function formatMonthLabel(iso: string): string {
133
+ return new Date(iso).toLocaleDateString("en-US", {
134
+ month: "short",
135
+ year: "2-digit",
136
+ });
137
+ }
138
+
139
+ /** Format a raw integer count for axis ticks and tooltips. */
140
+ export function formatCount(n: number): string {
141
+ if (n >= 1_000) return `${(n / 1_000).toFixed(1)}k`;
142
+ return String(Math.round(n));
143
+ }
144
+
73
145
  // ---------------------------------------------------------------------------
74
146
  // Sub-components
75
147
  // ---------------------------------------------------------------------------
76
148
 
77
- export function ChartLegendItem({ label, color }: { label: string; color: string }) {
149
+ export function ChartLegendItem({
150
+ label,
151
+ color,
152
+ lineStyle,
153
+ }: {
154
+ label: string;
155
+ color: string;
156
+ /** When provided, renders a line indicator instead of a square swatch */
157
+ lineStyle?: "solid" | "dashed";
158
+ }) {
78
159
  return (
79
160
  <div className="flex items-center gap-1.5">
80
- <div style={{ width: 10, height: 10, backgroundColor: color, flexShrink: 0 }} />
81
- <span className="text-[11px] text-muted-foreground leading-none">{label}</span>
161
+ {lineStyle ? (
162
+ <svg
163
+ width="20"
164
+ height="10"
165
+ viewBox="0 0 20 10"
166
+ aria-hidden="true"
167
+ style={{ flexShrink: 0 }}
168
+ >
169
+ <line
170
+ x1="0"
171
+ y1="5"
172
+ x2="20"
173
+ y2="5"
174
+ stroke={color}
175
+ strokeWidth="2"
176
+ strokeLinecap="square"
177
+ strokeDasharray={lineStyle === "dashed" ? "5 3" : undefined}
178
+ />
179
+ </svg>
180
+ ) : (
181
+ <div
182
+ style={{
183
+ width: 10,
184
+ height: 10,
185
+ backgroundColor: color,
186
+ flexShrink: 0,
187
+ }}
188
+ />
189
+ )}
190
+ <span className="text-[11px] text-muted-foreground leading-none">
191
+ {label}
192
+ </span>
193
+ </div>
194
+ );
195
+ }
196
+
197
+ /**
198
+ * One row in a doughnut chart legend — circle swatch, label, dollar value, percent.
199
+ * The label truncates when the container is constrained.
200
+ */
201
+ export function DoughnutLegendRow({
202
+ label,
203
+ color,
204
+ value,
205
+ percent,
206
+ }: {
207
+ label: string;
208
+ color: string;
209
+ value: number;
210
+ percent: string;
211
+ }) {
212
+ return (
213
+ <div className="flex items-center justify-between gap-2">
214
+ <div className="flex items-center gap-1.5 min-w-0">
215
+ <div
216
+ style={{
217
+ width: 10,
218
+ height: 10,
219
+ borderRadius: "50%",
220
+ backgroundColor: color,
221
+ flexShrink: 0,
222
+ }}
223
+ />
224
+ <span className="text-[11px] text-muted-foreground leading-none truncate">
225
+ {label}
226
+ </span>
227
+ </div>
228
+ <div className="flex items-center gap-2 shrink-0">
229
+ <span className="text-[11px] font-medium leading-none">
230
+ {formatAbbrev(value)}
231
+ </span>
232
+ <span className="text-[11px] text-muted-foreground leading-none w-10 text-right">
233
+ {percent}
234
+ </span>
235
+ </div>
82
236
  </div>
83
237
  );
84
238
  }
@@ -87,14 +241,21 @@ export function ChartPeriodButton({
87
241
  period,
88
242
  active,
89
243
  onClick,
244
+ unit = "M",
90
245
  }: {
91
- period: ChartPeriod;
246
+ period: number;
92
247
  active: boolean;
93
248
  onClick: () => void;
249
+ unit?: string;
94
250
  }) {
95
251
  return (
96
- <Button variant={active ? "default" : "outline"} size="xs" onClick={onClick}>
97
- {period}M
252
+ <Button
253
+ variant={active ? "default" : "outline"}
254
+ size="xs"
255
+ onClick={onClick}
256
+ >
257
+ {period}
258
+ {unit}
98
259
  </Button>
99
260
  );
100
261
  }
@@ -1,9 +1,7 @@
1
- "use client"
2
-
3
- import { type ReactElement, useState, type ComponentProps } from "react"
4
- import { CheckIcon, MinusIcon } from "lucide-react"
5
- import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox"
6
- import { cn } from "@/lib/utils"
1
+ import { type ReactElement, useState, type ComponentProps } from "react";
2
+ import { CheckIcon, MinusIcon } from "lucide-react";
3
+ import { Checkbox as CheckboxPrimitive } from "@base-ui/react/checkbox";
4
+ import { cn } from "@/lib/utils";
7
5
 
8
6
  /**
9
7
  * Checkbox — shadcn/WealthX Design System
@@ -13,13 +11,13 @@ import { cn } from "@/lib/utils"
13
11
  * White-label: checked/indeterminate use `primary` token → adapts to tenant color.
14
12
  * Error+checked/indeterminate: stacked variant overrides primary with destructive (higher specificity).
15
13
  */
16
- export type CheckboxProps = ComponentProps<typeof CheckboxPrimitive.Root>
14
+ export type CheckboxProps = ComponentProps<typeof CheckboxPrimitive.Root>;
17
15
 
18
16
  function Checkbox({ className, ...props }: CheckboxProps): ReactElement {
19
17
  return (
20
18
  <CheckboxPrimitive.Root
21
19
  className={cn(
22
- "peer group inline-flex size-4 shrink-0 rounded-[4px] border border-input shadow-xs transition-all outline-none",
20
+ "peer group inline-flex size-4 shrink-0 border border-input shadow-xs transition-all outline-none",
23
21
  "focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50",
24
22
  "disabled:cursor-not-allowed disabled:opacity-50",
25
23
  "aria-invalid:border-destructive aria-invalid:ring-destructive/20",
@@ -30,7 +28,7 @@ function Checkbox({ className, ...props }: CheckboxProps): ReactElement {
30
28
  // Stacked (2 attr selectors) → wins over single-attr rules above
31
29
  "aria-invalid:data-checked:border-destructive aria-invalid:data-checked:bg-destructive aria-invalid:data-checked:text-destructive-foreground",
32
30
  "aria-invalid:data-indeterminate:border-destructive aria-invalid:data-indeterminate:bg-destructive aria-invalid:data-indeterminate:text-destructive-foreground",
33
- className
31
+ className,
34
32
  )}
35
33
  data-slot="checkbox"
36
34
  {...props}
@@ -43,7 +41,7 @@ function Checkbox({ className, ...props }: CheckboxProps): ReactElement {
43
41
  <MinusIcon className="size-3.5 hidden group-data-indeterminate:block" />
44
42
  </CheckboxPrimitive.Indicator>
45
43
  </CheckboxPrimitive.Root>
46
- )
44
+ );
47
45
  }
48
46
 
49
47
  /**
@@ -53,11 +51,13 @@ function Checkbox({ className, ...props }: CheckboxProps): ReactElement {
53
51
  * Card background: primary/5 when checked/indeterminate; destructive/5 when error+checked.
54
52
  * White-label: opacity modifier on primary token → adapts to tenant color.
55
53
  */
56
- export type CheckboxCardProps = ComponentProps<typeof CheckboxPrimitive.Root> & {
57
- label: string
58
- description?: string
59
- error?: boolean
60
- }
54
+ export type CheckboxCardProps = ComponentProps<
55
+ typeof CheckboxPrimitive.Root
56
+ > & {
57
+ label: string;
58
+ description?: string;
59
+ error?: boolean;
60
+ };
61
61
 
62
62
  function CheckboxCard({
63
63
  className,
@@ -71,11 +71,11 @@ function CheckboxCard({
71
71
  ...props
72
72
  }: CheckboxCardProps): ReactElement {
73
73
  const [internalChecked, setInternalChecked] = useState<boolean>(
74
- Boolean(defaultChecked)
75
- )
74
+ Boolean(defaultChecked),
75
+ );
76
76
 
77
- const resolvedChecked = checked ?? internalChecked
78
- const isTinted = resolvedChecked
77
+ const resolvedChecked = checked ?? internalChecked;
78
+ const isTinted = resolvedChecked;
79
79
 
80
80
  return (
81
81
  <label
@@ -85,7 +85,7 @@ function CheckboxCard({
85
85
  ? ["border-destructive", isTinted && "bg-destructive/5"]
86
86
  : isTinted && "border-primary bg-primary/5",
87
87
  disabled && "cursor-not-allowed opacity-50",
88
- className
88
+ className,
89
89
  )}
90
90
  data-slot="checkbox-card"
91
91
  >
@@ -95,17 +95,21 @@ function CheckboxCard({
95
95
  className="mt-0.5"
96
96
  disabled={disabled}
97
97
  onCheckedChange={(value, event) => {
98
- setInternalChecked(value as boolean)
99
- onCheckedChange?.(value, event)
98
+ setInternalChecked(value as boolean);
99
+ onCheckedChange?.(value, event);
100
100
  }}
101
101
  {...props}
102
102
  />
103
103
  <div className="flex flex-col gap-1">
104
- <span className="text-sm font-medium leading-none">{label}</span>
105
- {description ? <span className="text-sm text-muted-foreground">{description}</span> : null}
104
+ <span className="text-label-medium leading-none">{label}</span>
105
+ {description ? (
106
+ <span className="text-body-small text-muted-foreground">
107
+ {description}
108
+ </span>
109
+ ) : null}
106
110
  </div>
107
111
  </label>
108
- )
112
+ );
109
113
  }
110
114
 
111
- export { Checkbox, CheckboxCard }
115
+ export { Checkbox, CheckboxCard };
@@ -4,24 +4,28 @@
4
4
  * WealthX overrides: square corners (rounded-none), design token colors,
5
5
  * consistent styling with Select component, built-in search filtering.
6
6
  */
7
- import * as React from "react"
8
- import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react"
9
- import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox"
7
+ import * as React from "react";
8
+ import { CheckIcon, ChevronDownIcon, SearchIcon } from "lucide-react";
9
+ import { Combobox as ComboboxPrimitive } from "@base-ui/react/combobox";
10
10
 
11
- import { cn } from "@/lib/utils"
11
+ import { cn } from "@/lib/utils";
12
12
 
13
- export type ComboboxProps<Value = string, Multiple extends boolean | undefined = false> =
14
- React.ComponentProps<typeof ComboboxPrimitive.Root<Value, Multiple>>
13
+ export type ComboboxProps<
14
+ Value = string,
15
+ Multiple extends boolean | undefined = false,
16
+ > = React.ComponentProps<typeof ComboboxPrimitive.Root<Value, Multiple>>;
15
17
 
16
18
  function Combobox<Value, Multiple extends boolean | undefined = false>({
17
19
  ...props
18
20
  }: React.ComponentProps<typeof ComboboxPrimitive.Root<Value, Multiple>>) {
19
- return <ComboboxPrimitive.Root data-slot="combobox" {...props} />
21
+ return <ComboboxPrimitive.Root data-slot="combobox" {...props} />;
20
22
  }
21
23
 
22
- export type ComboboxTriggerProps = React.ComponentProps<typeof ComboboxPrimitive.Trigger> & {
23
- size?: "sm" | "default"
24
- }
24
+ export type ComboboxTriggerProps = React.ComponentProps<
25
+ typeof ComboboxPrimitive.Trigger
26
+ > & {
27
+ size?: "sm" | "default";
28
+ };
25
29
 
26
30
  function ComboboxTrigger({
27
31
  className,
@@ -34,8 +38,8 @@ function ComboboxTrigger({
34
38
  data-slot="combobox-trigger"
35
39
  data-size={size}
36
40
  className={cn(
37
- "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-small whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-[popup-open]:border-primary data-[popup-open]:ring-[3px] data-[popup-open]:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=combobox-value]:line-clamp-1 *:data-[slot=combobox-value]:flex *:data-[slot=combobox-value]:items-center *:data-[slot=combobox-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
38
- className
41
+ "flex w-fit items-center justify-between gap-2 border border-input bg-transparent px-3 py-2 text-body-small whitespace-nowrap shadow-xs transition-[color,box-shadow] outline-none focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 data-[popup-open]:border-primary data-[popup-open]:ring-[3px] data-[popup-open]:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[placeholder]:font-normal data-[placeholder]:text-muted-foreground data-[size=default]:h-9 data-[size=sm]:h-8 *:data-[slot=combobox-value]:line-clamp-1 *:data-[slot=combobox-value]:flex *:data-[slot=combobox-value]:items-center *:data-[slot=combobox-value]:gap-2 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
42
+ className,
39
43
  )}
40
44
  {...props}
41
45
  >
@@ -44,39 +48,43 @@ function ComboboxTrigger({
44
48
  <ChevronDownIcon className="size-4 opacity-50" />
45
49
  </ComboboxPrimitive.Icon>
46
50
  </ComboboxPrimitive.Trigger>
47
- )
51
+ );
48
52
  }
49
53
 
50
- export type ComboboxValueProps = React.ComponentProps<typeof ComboboxPrimitive.Value>
54
+ export type ComboboxValueProps = React.ComponentProps<
55
+ typeof ComboboxPrimitive.Value
56
+ >;
51
57
 
52
- function ComboboxValue({
53
- ...props
54
- }: ComboboxValueProps) {
55
- return <ComboboxPrimitive.Value data-slot="combobox-value" {...props} />
58
+ function ComboboxValue({ ...props }: ComboboxValueProps) {
59
+ return <ComboboxPrimitive.Value data-slot="combobox-value" {...props} />;
56
60
  }
57
61
 
58
- export type ComboboxInputProps = React.ComponentProps<typeof ComboboxPrimitive.Input>
62
+ export type ComboboxInputProps = React.ComponentProps<
63
+ typeof ComboboxPrimitive.Input
64
+ >;
59
65
 
60
- function ComboboxInput({
61
- className,
62
- ...props
63
- }: ComboboxInputProps) {
66
+ function ComboboxInput({ className, ...props }: ComboboxInputProps) {
64
67
  return (
65
- <div data-slot="combobox-input-wrapper" className="flex items-center gap-2 border-b border-border px-3">
68
+ <div
69
+ data-slot="combobox-input-wrapper"
70
+ className="flex items-center gap-2 border-b border-border px-3"
71
+ >
66
72
  <SearchIcon className="size-4 shrink-0 text-muted-foreground" />
67
73
  <ComboboxPrimitive.Input
68
74
  data-slot="combobox-input"
69
75
  className={cn(
70
- "h-9 w-full min-w-0 bg-transparent py-1 text-body-small outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
71
- className
76
+ "h-9 w-full min-w-0 bg-transparent py-1 text-body-small outline-none placeholder:font-normal placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:opacity-50",
77
+ className,
72
78
  )}
73
79
  {...props}
74
80
  />
75
81
  </div>
76
- )
82
+ );
77
83
  }
78
84
 
79
- export type ComboboxContentProps = React.ComponentProps<typeof ComboboxPrimitive.Popup>
85
+ export type ComboboxContentProps = React.ComponentProps<
86
+ typeof ComboboxPrimitive.Popup
87
+ >;
80
88
 
81
89
  function ComboboxContent({
82
90
  className,
@@ -90,7 +98,7 @@ function ComboboxContent({
90
98
  data-slot="combobox-content"
91
99
  className={cn(
92
100
  "relative z-50 max-h-[var(--available-height)] min-w-[8rem] overflow-hidden border bg-popover text-popover-foreground shadow-md data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 data-[ending-style]:animate-out data-[ending-style]:fade-out-0 data-[ending-style]:zoom-out-95 data-[open]:animate-in data-[open]:fade-in-0 data-[open]:zoom-in-95",
93
- className
101
+ className,
94
102
  )}
95
103
  {...props}
96
104
  >
@@ -98,40 +106,37 @@ function ComboboxContent({
98
106
  </ComboboxPrimitive.Popup>
99
107
  </ComboboxPrimitive.Positioner>
100
108
  </ComboboxPrimitive.Portal>
101
- )
109
+ );
102
110
  }
103
111
 
104
- export type ComboboxListProps = React.ComponentProps<typeof ComboboxPrimitive.List>
112
+ export type ComboboxListProps = React.ComponentProps<
113
+ typeof ComboboxPrimitive.List
114
+ >;
105
115
 
106
- function ComboboxList({
107
- className,
108
- ...props
109
- }: ComboboxListProps) {
116
+ function ComboboxList({ className, ...props }: ComboboxListProps) {
110
117
  return (
111
118
  <ComboboxPrimitive.List
112
119
  data-slot="combobox-list"
113
120
  className={cn(
114
121
  "max-h-[min(var(--available-height),18rem)] overflow-y-auto p-1",
115
- className
122
+ className,
116
123
  )}
117
124
  {...props}
118
125
  />
119
- )
126
+ );
120
127
  }
121
128
 
122
- export type ComboboxItemProps = React.ComponentProps<typeof ComboboxPrimitive.Item>
129
+ export type ComboboxItemProps = React.ComponentProps<
130
+ typeof ComboboxPrimitive.Item
131
+ >;
123
132
 
124
- function ComboboxItem({
125
- className,
126
- children,
127
- ...props
128
- }: ComboboxItemProps) {
133
+ function ComboboxItem({ className, children, ...props }: ComboboxItemProps) {
129
134
  return (
130
135
  <ComboboxPrimitive.Item
131
136
  data-slot="combobox-item"
132
137
  className={cn(
133
- "relative flex w-full cursor-default items-center gap-2 rounded-sm py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-[highlighted]:bg-primary/5 data-[highlighted]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
134
- className
138
+ "relative flex w-full cursor-default items-center gap-2 py-1.5 pr-8 pl-2 text-body-small outline-hidden select-none data-highlighted:bg-primary/5 data-highlighted:text-foreground data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4 [&_svg:not([class*='text-'])]:text-muted-foreground",
139
+ className,
135
140
  )}
136
141
  {...props}
137
142
  >
@@ -145,53 +150,54 @@ function ComboboxItem({
145
150
  </span>
146
151
  {children}
147
152
  </ComboboxPrimitive.Item>
148
- )
153
+ );
149
154
  }
150
155
 
151
- export type ComboboxEmptyProps = React.ComponentProps<typeof ComboboxPrimitive.Empty>
156
+ export type ComboboxEmptyProps = React.ComponentProps<
157
+ typeof ComboboxPrimitive.Empty
158
+ >;
152
159
 
153
- function ComboboxEmpty({
154
- className,
155
- ...props
156
- }: ComboboxEmptyProps) {
160
+ function ComboboxEmpty({ className, ...props }: ComboboxEmptyProps) {
157
161
  return (
158
162
  <ComboboxPrimitive.Empty
159
163
  data-slot="combobox-empty"
160
- className={`text-body-small ${cn("py-6 text-center text-muted-foreground empty:hidden", className)}`}
164
+ className={cn(
165
+ "text-body-small py-6 text-center text-muted-foreground empty:hidden",
166
+ className,
167
+ )}
161
168
  {...props}
162
169
  />
163
- )
170
+ );
164
171
  }
165
172
 
166
- export type ComboboxGroupProps = React.ComponentProps<typeof ComboboxPrimitive.Group>
173
+ export type ComboboxGroupProps = React.ComponentProps<
174
+ typeof ComboboxPrimitive.Group
175
+ >;
167
176
 
168
- function ComboboxGroup({
169
- ...props
170
- }: ComboboxGroupProps) {
171
- return <ComboboxPrimitive.Group data-slot="combobox-group" {...props} />
177
+ function ComboboxGroup({ ...props }: ComboboxGroupProps) {
178
+ return <ComboboxPrimitive.Group data-slot="combobox-group" {...props} />;
172
179
  }
173
180
 
174
- export type ComboboxGroupLabelProps = React.ComponentProps<typeof ComboboxPrimitive.GroupLabel>
181
+ export type ComboboxGroupLabelProps = React.ComponentProps<
182
+ typeof ComboboxPrimitive.GroupLabel
183
+ >;
175
184
 
176
- function ComboboxGroupLabel({
177
- className,
178
- ...props
179
- }: ComboboxGroupLabelProps) {
185
+ function ComboboxGroupLabel({ className, ...props }: ComboboxGroupLabelProps) {
180
186
  return (
181
187
  <ComboboxPrimitive.GroupLabel
182
188
  data-slot="combobox-group-label"
183
- className={`text-label-small ${cn("px-2 py-1.5 uppercase text-muted-foreground", className)}`}
189
+ className={cn(
190
+ "text-label-small px-2 py-1.5 uppercase text-muted-foreground",
191
+ className,
192
+ )}
184
193
  {...props}
185
194
  />
186
- )
195
+ );
187
196
  }
188
197
 
189
- export type ComboboxSeparatorProps = React.ComponentProps<"div">
198
+ export type ComboboxSeparatorProps = React.ComponentProps<"div">;
190
199
 
191
- function ComboboxSeparator({
192
- className,
193
- ...props
194
- }: ComboboxSeparatorProps) {
200
+ function ComboboxSeparator({ className, ...props }: ComboboxSeparatorProps) {
195
201
  return (
196
202
  <div
197
203
  role="separator"
@@ -199,7 +205,7 @@ function ComboboxSeparator({
199
205
  className={cn("pointer-events-none -mx-1 my-1 h-px bg-border", className)}
200
206
  {...props}
201
207
  />
202
- )
208
+ );
203
209
  }
204
210
 
205
211
  export {
@@ -214,4 +220,4 @@ export {
214
220
  ComboboxGroup,
215
221
  ComboboxGroupLabel,
216
222
  ComboboxSeparator,
217
- }
223
+ };