@wealthx/shadcn 1.0.2 → 1.2.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 (300) hide show
  1. package/.turbo/turbo-build.log +235 -138
  2. package/CHANGELOG.md +12 -0
  3. package/README.md +82 -0
  4. package/dist/{chunk-6OJF6XRN.mjs → chunk-24FUO7TD.mjs} +4 -8
  5. package/dist/{chunk-4AJ5HWHD.mjs → chunk-2I5S2AMY.mjs} +3 -3
  6. package/dist/chunk-2SF672SZ.mjs +161 -0
  7. package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
  8. package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
  9. package/dist/chunk-3WMX6KWS.mjs +245 -0
  10. package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
  11. package/dist/chunk-4CX4SBRO.mjs +153 -0
  12. package/dist/chunk-4MN6UQHG.mjs +443 -0
  13. package/dist/chunk-5QQVZTVZ.mjs +233 -0
  14. package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
  15. package/dist/chunk-6FCGKSZX.mjs +268 -0
  16. package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
  17. package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
  18. package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
  19. package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
  20. package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
  21. package/dist/chunk-A56YQQHG.mjs +402 -0
  22. package/dist/chunk-AH52LG6N.mjs +315 -0
  23. package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
  24. package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
  25. package/dist/chunk-D4ILTPOG.mjs +293 -0
  26. package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
  27. package/dist/chunk-DOH3EHX7.mjs +378 -0
  28. package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
  29. package/dist/chunk-ERGGHC2V.mjs +185 -0
  30. package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
  31. package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
  32. package/dist/chunk-FMAXJ2SI.mjs +71 -0
  33. package/dist/chunk-FZIXGLMV.mjs +173 -0
  34. package/dist/{chunk-DS2AMHN2.mjs → chunk-GYMYRIZP.mjs} +2 -2
  35. package/dist/{chunk-KQDD5MU3.mjs → chunk-H45TKD34.mjs} +5 -5
  36. package/dist/{chunk-BBJBJSXQ.mjs → chunk-J5UICVJS.mjs} +1 -1
  37. package/dist/{chunk-RL772EH7.mjs → chunk-JHJHG4GO.mjs} +4 -12
  38. package/dist/chunk-KMCGSZTX.mjs +177 -0
  39. package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
  40. package/dist/chunk-LE6YFY6D.mjs +209 -0
  41. package/dist/{chunk-HUVTPUV2.mjs → chunk-LLVQKSU3.mjs} +23 -19
  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-NLCKVHWB.mjs +161 -0
  45. package/dist/{chunk-YN5SYTOO.mjs → chunk-NQPOYKAQ.mjs} +9 -5
  46. package/dist/{chunk-ZZV5JVNW.mjs → chunk-NSLMILBT.mjs} +3 -7
  47. package/dist/chunk-NXA3CZ7A.mjs +248 -0
  48. package/dist/chunk-OGOYQ7BG.mjs +150 -0
  49. package/dist/{chunk-3NQGYJEZ.mjs → chunk-P6AM5V7O.mjs} +10 -18
  50. package/dist/{chunk-CZ3BW5GL.mjs → chunk-P76HMUI6.mjs} +5 -11
  51. package/dist/chunk-PCPLO5HT.mjs +671 -0
  52. package/dist/chunk-PG6K5XEC.mjs +475 -0
  53. package/dist/chunk-PJHPSRYD.mjs +234 -0
  54. package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
  55. package/dist/chunk-PR6V5XKM.mjs +209 -0
  56. package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
  57. package/dist/chunk-QVKWW6KE.mjs +272 -0
  58. package/dist/chunk-RGU7HOEC.mjs +140 -0
  59. package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
  60. package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
  61. package/dist/chunk-RRBS6D63.mjs +163 -0
  62. package/dist/chunk-SMQ3DG25.mjs +285 -0
  63. package/dist/chunk-SPJ5KXW7.mjs +199 -0
  64. package/dist/chunk-SYOD63OZ.mjs +225 -0
  65. package/dist/chunk-UFYSFDER.mjs +42 -0
  66. package/dist/chunk-VACKZOMY.mjs +190 -0
  67. package/dist/chunk-VLQZANBF.mjs +42 -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-YKPROFLB.mjs +161 -0
  76. package/dist/{chunk-K76E2TQU.mjs → chunk-ZRO5JO3H.mjs} +107 -67
  77. package/dist/{chunk-VYMHBV6D.mjs → chunk-ZU4NV6RG.mjs} +5 -3
  78. package/dist/components/ui/accordion.js +40 -4
  79. package/dist/components/ui/accordion.mjs +2 -2
  80. package/dist/components/ui/add-column-modal.js +789 -0
  81. package/dist/components/ui/add-column-modal.mjs +17 -0
  82. package/dist/components/ui/add-lead-modal.js +647 -0
  83. package/dist/components/ui/add-lead-modal.mjs +16 -0
  84. package/dist/components/ui/ai-assistant-drawer.js +686 -0
  85. package/dist/components/ui/ai-assistant-drawer.mjs +16 -0
  86. package/dist/components/ui/alert-dialog.js +37 -5
  87. package/dist/components/ui/alert-dialog.mjs +4 -4
  88. package/dist/components/ui/alert.js +37 -11
  89. package/dist/components/ui/alert.mjs +2 -2
  90. package/dist/components/ui/avatar.js +36 -8
  91. package/dist/components/ui/avatar.mjs +2 -2
  92. package/dist/components/ui/backoffice-alert-history-chart.js +624 -0
  93. package/dist/components/ui/backoffice-alert-history-chart.mjs +16 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.js +687 -0
  95. package/dist/components/ui/backoffice-contact-history-chart.mjs +16 -0
  96. package/dist/components/ui/badge.js +37 -2
  97. package/dist/components/ui/badge.mjs +2 -2
  98. package/dist/components/ui/borrowing-capacity-line-chart.js +639 -0
  99. package/dist/components/ui/borrowing-capacity-line-chart.mjs +16 -0
  100. package/dist/components/ui/button.js +35 -3
  101. package/dist/components/ui/button.mjs +2 -2
  102. package/dist/components/ui/calendar.js +43 -19
  103. package/dist/components/ui/calendar.mjs +3 -3
  104. package/dist/components/ui/card.js +40 -4
  105. package/dist/components/ui/card.mjs +2 -2
  106. package/dist/components/ui/cash-balance-line-chart.js +627 -0
  107. package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
  108. package/dist/components/ui/cashflow-bar-chart.js +650 -0
  109. package/dist/components/ui/cashflow-bar-chart.mjs +16 -0
  110. package/dist/components/ui/checkbox.js +36 -5
  111. package/dist/components/ui/checkbox.mjs +2 -3
  112. package/dist/components/ui/chip.js +37 -2
  113. package/dist/components/ui/chip.mjs +3 -3
  114. package/dist/components/ui/combobox.js +280 -0
  115. package/dist/components/ui/combobox.mjs +28 -0
  116. package/dist/components/ui/data-table.js +160 -88
  117. package/dist/components/ui/data-table.mjs +10 -11
  118. package/dist/components/ui/date-picker.js +44 -20
  119. package/dist/components/ui/date-picker.mjs +6 -7
  120. package/dist/components/ui/dialog.js +44 -12
  121. package/dist/components/ui/dialog.mjs +4 -4
  122. package/dist/components/ui/drawer.js +46 -10
  123. package/dist/components/ui/drawer.mjs +3 -3
  124. package/dist/components/ui/dropdown-menu.js +40 -16
  125. package/dist/components/ui/dropdown-menu.mjs +3 -3
  126. package/dist/components/ui/empty.js +41 -5
  127. package/dist/components/ui/empty.mjs +2 -2
  128. package/dist/components/ui/expense-bar-chart.js +642 -0
  129. package/dist/components/ui/expense-bar-chart.mjs +16 -0
  130. package/dist/components/ui/field.js +53 -21
  131. package/dist/components/ui/field.mjs +4 -4
  132. package/dist/components/ui/financial-cards.js +1002 -0
  133. package/dist/components/ui/financial-cards.mjs +24 -0
  134. package/dist/components/ui/financial-drawers.js +637 -0
  135. package/dist/components/ui/financial-drawers.mjs +17 -0
  136. package/dist/components/ui/financial-primitives.js +218 -0
  137. package/dist/components/ui/financial-primitives.mjs +22 -0
  138. package/dist/components/ui/financial-sections.js +1422 -0
  139. package/dist/components/ui/financial-sections.mjs +30 -0
  140. package/dist/components/ui/form-primitives.js +682 -0
  141. package/dist/components/ui/form-primitives.mjs +19 -0
  142. package/dist/components/ui/income-bar-chart.js +641 -0
  143. package/dist/components/ui/income-bar-chart.mjs +16 -0
  144. package/dist/components/ui/input-group.js +43 -7
  145. package/dist/components/ui/input-group.mjs +5 -5
  146. package/dist/components/ui/input-otp.js +39 -3
  147. package/dist/components/ui/input-otp.mjs +2 -2
  148. package/dist/components/ui/input.js +34 -2
  149. package/dist/components/ui/input.mjs +2 -2
  150. package/dist/components/ui/kanban-column.js +1143 -0
  151. package/dist/components/ui/kanban-column.mjs +20 -0
  152. package/dist/components/ui/label.js +35 -7
  153. package/dist/components/ui/label.mjs +2 -2
  154. package/dist/components/ui/opportunity-card.js +960 -0
  155. package/dist/components/ui/opportunity-card.mjs +20 -0
  156. package/dist/components/ui/opportunity-edit-modals.js +3360 -0
  157. package/dist/components/ui/opportunity-edit-modals.mjs +37 -0
  158. package/dist/components/ui/opportunity-summary-tab.js +4365 -0
  159. package/dist/components/ui/opportunity-summary-tab.mjs +34 -0
  160. package/dist/components/ui/pagination.js +35 -3
  161. package/dist/components/ui/pagination.mjs +3 -3
  162. package/dist/components/ui/pipeline-alerts.js +103 -0
  163. package/dist/components/ui/pipeline-alerts.mjs +8 -0
  164. package/dist/components/ui/pipeline-board.js +1408 -0
  165. package/dist/components/ui/pipeline-board.mjs +24 -0
  166. package/dist/components/ui/pipeline-chart.js +216 -0
  167. package/dist/components/ui/pipeline-chart.mjs +10 -0
  168. package/dist/components/ui/pipeline-dialogs.js +1183 -0
  169. package/dist/components/ui/pipeline-dialogs.mjs +23 -0
  170. package/dist/components/ui/pipeline-primitives.js +300 -0
  171. package/dist/components/ui/pipeline-primitives.mjs +11 -0
  172. package/dist/components/ui/popover.js +45 -4
  173. package/dist/components/ui/popover.mjs +3 -3
  174. package/dist/components/ui/progress.js +33 -1
  175. package/dist/components/ui/progress.mjs +2 -2
  176. package/dist/components/ui/property-cashflow-doughnut-chart.js +523 -0
  177. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +16 -0
  178. package/dist/components/ui/property-debt-equity-doughnut-chart.js +521 -0
  179. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +16 -0
  180. package/dist/components/ui/property-mobile-estimate-line-chart.js +682 -0
  181. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +16 -0
  182. package/dist/components/ui/radio-group.js +33 -1
  183. package/dist/components/ui/radio-group.mjs +2 -2
  184. package/dist/components/ui/select.js +66 -26
  185. package/dist/components/ui/select.mjs +3 -3
  186. package/dist/components/ui/separator.js +33 -1
  187. package/dist/components/ui/separator.mjs +2 -2
  188. package/dist/components/ui/sheet.js +37 -9
  189. package/dist/components/ui/sheet.mjs +3 -3
  190. package/dist/components/ui/skeleton.js +33 -1
  191. package/dist/components/ui/skeleton.mjs +2 -2
  192. package/dist/components/ui/slider.js +86 -102
  193. package/dist/components/ui/slider.mjs +2 -2
  194. package/dist/components/ui/spinner.js +33 -1
  195. package/dist/components/ui/spinner.mjs +2 -2
  196. package/dist/components/ui/stage-timeline.js +579 -0
  197. package/dist/components/ui/stage-timeline.mjs +15 -0
  198. package/dist/components/ui/switch.js +37 -4
  199. package/dist/components/ui/switch.mjs +2 -3
  200. package/dist/components/ui/table.js +37 -5
  201. package/dist/components/ui/table.mjs +2 -2
  202. package/dist/components/ui/tabs.js +36 -12
  203. package/dist/components/ui/tabs.mjs +2 -2
  204. package/dist/components/ui/textarea.js +34 -2
  205. package/dist/components/ui/textarea.mjs +2 -2
  206. package/dist/components/ui/toggle-group.js +35 -4
  207. package/dist/components/ui/toggle-group.mjs +3 -4
  208. package/dist/components/ui/toggle.js +35 -4
  209. package/dist/components/ui/toggle.mjs +2 -3
  210. package/dist/components/ui/tooltip.js +51 -22
  211. package/dist/components/ui/tooltip.mjs +3 -3
  212. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +528 -0
  213. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +16 -0
  214. package/dist/components/ui/transactions-income-expense-bar-chart.js +516 -0
  215. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +16 -0
  216. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +528 -0
  217. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +16 -0
  218. package/dist/index.js +11613 -2868
  219. package/dist/index.mjs +377 -164
  220. package/dist/lib/theme-provider.js +10 -1
  221. package/dist/lib/theme-provider.mjs +1 -1
  222. package/dist/lib/typography.js +8 -0
  223. package/dist/lib/typography.mjs +3 -1
  224. package/dist/lib/utils.js +33 -1
  225. package/dist/lib/utils.mjs +1 -1
  226. package/dist/styles.css +1 -1
  227. package/package.json +169 -6
  228. package/src/components/index.tsx +323 -13
  229. package/src/components/ui/accordion.tsx +6 -3
  230. package/src/components/ui/add-column-modal.tsx +339 -0
  231. package/src/components/ui/add-lead-modal.tsx +290 -0
  232. package/src/components/ui/ai-assistant-drawer.tsx +408 -0
  233. package/src/components/ui/alert-dialog.tsx +80 -54
  234. package/src/components/ui/alert.tsx +28 -28
  235. package/src/components/ui/avatar.tsx +30 -29
  236. package/src/components/ui/backoffice-alert-history-chart.tsx +260 -0
  237. package/src/components/ui/backoffice-contact-history-chart.tsx +325 -0
  238. package/src/components/ui/badge.tsx +17 -15
  239. package/src/components/ui/borrowing-capacity-line-chart.tsx +357 -0
  240. package/src/components/ui/button.tsx +30 -27
  241. package/src/components/ui/calendar.tsx +53 -67
  242. package/src/components/ui/card.tsx +27 -24
  243. package/src/components/ui/cash-balance-line-chart.tsx +302 -0
  244. package/src/components/ui/cashflow-bar-chart.tsx +363 -0
  245. package/src/components/ui/chart-shared.tsx +261 -0
  246. package/src/components/ui/checkbox.tsx +30 -26
  247. package/src/components/ui/combobox.tsx +223 -0
  248. package/src/components/ui/data-table.tsx +160 -99
  249. package/src/components/ui/date-picker.tsx +0 -2
  250. package/src/components/ui/dialog.tsx +70 -60
  251. package/src/components/ui/drawer.tsx +57 -48
  252. package/src/components/ui/dropdown-menu.tsx +90 -82
  253. package/src/components/ui/empty.tsx +31 -27
  254. package/src/components/ui/expense-bar-chart.tsx +296 -0
  255. package/src/components/ui/field.tsx +70 -62
  256. package/src/components/ui/financial-cards.tsx +830 -0
  257. package/src/components/ui/financial-drawers.tsx +339 -0
  258. package/src/components/ui/financial-primitives.tsx +331 -0
  259. package/src/components/ui/financial-sections.tsx +672 -0
  260. package/src/components/ui/form-primitives.tsx +536 -0
  261. package/src/components/ui/income-bar-chart.tsx +297 -0
  262. package/src/components/ui/input-group.tsx +41 -34
  263. package/src/components/ui/input-otp.tsx +29 -24
  264. package/src/components/ui/input.tsx +8 -8
  265. package/src/components/ui/kanban-column.tsx +333 -0
  266. package/src/components/ui/label.tsx +9 -12
  267. package/src/components/ui/opportunity-card.tsx +616 -0
  268. package/src/components/ui/opportunity-edit-modals.tsx +2528 -0
  269. package/src/components/ui/opportunity-summary-tab.tsx +579 -0
  270. package/src/components/ui/pipeline-alerts.tsx +74 -0
  271. package/src/components/ui/pipeline-board.tsx +268 -0
  272. package/src/components/ui/pipeline-chart.tsx +173 -0
  273. package/src/components/ui/pipeline-dialogs.tsx +303 -0
  274. package/src/components/ui/pipeline-primitives.tsx +108 -0
  275. package/src/components/ui/popover.tsx +41 -36
  276. package/src/components/ui/property-cashflow-doughnut-chart.tsx +188 -0
  277. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +185 -0
  278. package/src/components/ui/property-mobile-estimate-line-chart.tsx +393 -0
  279. package/src/components/ui/select.tsx +65 -52
  280. package/src/components/ui/sheet.tsx +55 -52
  281. package/src/components/ui/slider.tsx +54 -77
  282. package/src/components/ui/stage-timeline.tsx +205 -0
  283. package/src/components/ui/switch.tsx +42 -29
  284. package/src/components/ui/table.tsx +28 -28
  285. package/src/components/ui/tabs.tsx +22 -28
  286. package/src/components/ui/textarea.tsx +8 -8
  287. package/src/components/ui/toggle-group.tsx +0 -2
  288. package/src/components/ui/toggle.tsx +13 -15
  289. package/src/components/ui/tooltip.tsx +30 -28
  290. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +191 -0
  291. package/src/components/ui/transactions-income-expense-bar-chart.tsx +205 -0
  292. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +191 -0
  293. package/src/lib/theme-provider.tsx +10 -0
  294. package/src/lib/typography.ts +9 -0
  295. package/src/lib/utils.ts +41 -3
  296. package/src/styles/globals.css +371 -124
  297. package/src/styles/styles-css.ts +1 -1
  298. package/tsup.config.ts +32 -0
  299. package/dist/chunk-K74JRTJR.mjs +0 -105
  300. package/dist/chunk-V7CNWJT3.mjs +0 -10
@@ -0,0 +1,209 @@
1
+ import {
2
+ Skeleton
3
+ } from "./chunk-D6ID6M4V.mjs";
4
+ import {
5
+ ChartLegendItem,
6
+ ChartPeriodButton,
7
+ FALLBACK_TICK,
8
+ SEVERITY_COLORS,
9
+ formatCount,
10
+ formatMonthLabel,
11
+ formatTooltipDate
12
+ } from "./chunk-FZIXGLMV.mjs";
13
+ import {
14
+ Empty,
15
+ EmptyDescription
16
+ } from "./chunk-NQPOYKAQ.mjs";
17
+ import {
18
+ Card,
19
+ CardAction,
20
+ CardContent,
21
+ CardHeader,
22
+ CardTitle
23
+ } from "./chunk-CLIN5525.mjs";
24
+ import {
25
+ useThemeVars
26
+ } from "./chunk-FEZKMUCF.mjs";
27
+ import {
28
+ cn
29
+ } from "./chunk-VLQZANBF.mjs";
30
+
31
+ // src/components/ui/backoffice-alert-history-chart.tsx
32
+ import { useMemo, useState } from "react";
33
+ import {
34
+ Chart as ChartJS,
35
+ CategoryScale,
36
+ LinearScale,
37
+ BarElement,
38
+ Tooltip
39
+ } from "chart.js";
40
+ import { Chart } from "react-chartjs-2";
41
+ import { jsx, jsxs } from "react/jsx-runtime";
42
+ ChartJS.register(CategoryScale, LinearScale, BarElement, Tooltip);
43
+ var ALERT_PERIODS = [3, 6, 12];
44
+ var SLICE_COUNT = { 3: 3, 6: 6, 12: 12 };
45
+ function ChartLegend() {
46
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap gap-x-3 gap-y-1.5 pb-2", children: [
47
+ /* @__PURE__ */ jsx(ChartLegendItem, { label: "High", color: SEVERITY_COLORS.high }),
48
+ /* @__PURE__ */ jsx(ChartLegendItem, { label: "Medium", color: SEVERITY_COLORS.medium }),
49
+ /* @__PURE__ */ jsx(ChartLegendItem, { label: "Low", color: SEVERITY_COLORS.low })
50
+ ] });
51
+ }
52
+ function BackofficeAlertHistoryChart({
53
+ chartData,
54
+ title = "Alert History",
55
+ showLegend = true,
56
+ legendPosition = "top",
57
+ showXAxis = true,
58
+ showYAxis = false,
59
+ defaultPeriod = 6,
60
+ height = 200,
61
+ width = "100%",
62
+ className,
63
+ isLoading = false
64
+ }) {
65
+ const [period, setPeriod] = useState(defaultPeriod);
66
+ const themeVars = useThemeVars();
67
+ const fontFamily = themeVars["--font-sans"] || "Figtree, sans-serif";
68
+ const sliced = useMemo(() => {
69
+ if (!(chartData == null ? void 0 : chartData.length)) return null;
70
+ const count = Math.min(SLICE_COUNT[period], chartData.length);
71
+ return chartData.slice(chartData.length - count);
72
+ }, [chartData, period]);
73
+ const labels = useMemo(
74
+ () => {
75
+ var _a;
76
+ return (_a = sliced == null ? void 0 : sliced.map((p) => formatMonthLabel(p.date))) != null ? _a : [];
77
+ },
78
+ [sliced]
79
+ );
80
+ const data = useMemo(() => {
81
+ if (!sliced) return { labels: [], datasets: [] };
82
+ return {
83
+ labels,
84
+ datasets: [
85
+ {
86
+ label: "High",
87
+ data: sliced.map((p) => p.high),
88
+ backgroundColor: SEVERITY_COLORS.high,
89
+ borderWidth: 0,
90
+ stack: "alerts"
91
+ },
92
+ {
93
+ label: "Medium",
94
+ data: sliced.map((p) => p.medium),
95
+ backgroundColor: SEVERITY_COLORS.medium,
96
+ borderWidth: 0,
97
+ stack: "alerts"
98
+ },
99
+ {
100
+ label: "Low",
101
+ data: sliced.map((p) => p.low),
102
+ backgroundColor: SEVERITY_COLORS.low,
103
+ borderWidth: 0,
104
+ stack: "alerts"
105
+ }
106
+ ]
107
+ };
108
+ }, [sliced, labels]);
109
+ const options = useMemo(
110
+ () => ({
111
+ responsive: true,
112
+ maintainAspectRatio: false,
113
+ animation: { duration: 600, easing: "easeOutQuart" },
114
+ layout: { padding: 0 },
115
+ plugins: {
116
+ legend: { display: false },
117
+ tooltip: {
118
+ mode: "index",
119
+ intersect: false,
120
+ padding: 12,
121
+ cornerRadius: 0,
122
+ titleFont: { size: 11, weight: 600 },
123
+ bodyFont: { size: 12, weight: 500 },
124
+ callbacks: {
125
+ title: (tooltipItems) => {
126
+ var _a, _b, _c, _d;
127
+ const idx = (_a = tooltipItems[0]) == null ? void 0 : _a.dataIndex;
128
+ if (idx != null && ((_b = sliced == null ? void 0 : sliced[idx]) == null ? void 0 : _b.date)) {
129
+ return formatTooltipDate(sliced[idx].date, "monthly");
130
+ }
131
+ return (_d = (_c = tooltipItems[0]) == null ? void 0 : _c.label) != null ? _d : "";
132
+ },
133
+ label: (ctx) => {
134
+ const val = ctx.raw;
135
+ if (val === 0) return;
136
+ return ` ${ctx.dataset.label}: ${formatCount(val)}`;
137
+ }
138
+ }
139
+ }
140
+ },
141
+ scales: {
142
+ x: {
143
+ stacked: true,
144
+ display: showXAxis,
145
+ grid: { display: false },
146
+ border: { display: false },
147
+ ticks: {
148
+ maxRotation: 0,
149
+ minRotation: 0,
150
+ color: FALLBACK_TICK,
151
+ font: { size: 10 }
152
+ }
153
+ },
154
+ y: {
155
+ stacked: true,
156
+ display: showYAxis,
157
+ grid: { display: false },
158
+ border: { display: false },
159
+ ticks: {
160
+ padding: 8,
161
+ maxTicksLimit: 5,
162
+ color: FALLBACK_TICK,
163
+ font: { size: 10 },
164
+ callback: (v) => formatCount(Number(v))
165
+ }
166
+ }
167
+ }
168
+ }),
169
+ [showXAxis, showYAxis, sliced]
170
+ );
171
+ return /* @__PURE__ */ jsxs(
172
+ Card,
173
+ {
174
+ className: cn("w-full py-4 sm:py-6 gap-2", className),
175
+ style: { maxWidth: width, fontFamily },
176
+ children: [
177
+ /* @__PURE__ */ jsxs(CardHeader, { className: "px-3 sm:px-6", children: [
178
+ /* @__PURE__ */ jsx(CardTitle, { className: "text-sm sm:text-base", children: title }),
179
+ /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx("div", { className: "flex gap-0.5 sm:gap-1", children: ALERT_PERIODS.map((p) => /* @__PURE__ */ jsx(
180
+ ChartPeriodButton,
181
+ {
182
+ period: p,
183
+ active: period === p,
184
+ onClick: () => setPeriod(p)
185
+ },
186
+ p
187
+ )) }) })
188
+ ] }),
189
+ /* @__PURE__ */ jsx(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ jsx(Skeleton, { style: { height, width: "100%" } }) : !sliced ? /* @__PURE__ */ jsx(Empty, { className: "flex-none p-4", style: { height }, children: /* @__PURE__ */ jsx(EmptyDescription, { children: "No data available" }) }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
190
+ showLegend && legendPosition === "top" && /* @__PURE__ */ jsx(ChartLegend, {}),
191
+ /* @__PURE__ */ jsx("div", { style: { height, width: "100%", position: "relative" }, children: /* @__PURE__ */ jsx(
192
+ Chart,
193
+ {
194
+ type: "bar",
195
+ data,
196
+ options,
197
+ "aria-label": title
198
+ }
199
+ ) }),
200
+ showLegend && legendPosition === "bottom" && /* @__PURE__ */ jsx(ChartLegend, {})
201
+ ] }) })
202
+ ]
203
+ }
204
+ );
205
+ }
206
+
207
+ export {
208
+ BackofficeAlertHistoryChart
209
+ };
@@ -1,12 +1,12 @@
1
- import {
2
- Label
3
- } from "./chunk-ZZV5JVNW.mjs";
4
1
  import {
5
2
  Separator
6
- } from "./chunk-55CEW76V.mjs";
3
+ } from "./chunk-FH6QVUVZ.mjs";
4
+ import {
5
+ Label
6
+ } from "./chunk-NSLMILBT.mjs";
7
7
  import {
8
8
  cn
9
- } from "./chunk-V7CNWJT3.mjs";
9
+ } from "./chunk-VLQZANBF.mjs";
10
10
  import {
11
11
  __objRest,
12
12
  __spreadProps,
@@ -43,9 +43,9 @@ function FieldLegend(_a) {
43
43
  "legend",
44
44
  __spreadValues({
45
45
  className: cn(
46
- "mb-3 font-medium",
47
- "data-[variant=legend]:text-base",
48
- "data-[variant=label]:text-sm",
46
+ "mb-3",
47
+ "data-[variant=legend]:text-label-large",
48
+ "data-[variant=label]:text-label-medium",
49
49
  className
50
50
  ),
51
51
  "data-slot": "field-legend",
@@ -108,7 +108,11 @@ function Field(_a) {
108
108
  );
109
109
  }
110
110
  function FieldContent(_a) {
111
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
111
+ var _b = _a, {
112
+ className
113
+ } = _b, props = __objRest(_b, [
114
+ "className"
115
+ ]);
112
116
  return /* @__PURE__ */ jsx(
113
117
  "div",
114
118
  __spreadValues({
@@ -121,11 +125,7 @@ function FieldContent(_a) {
121
125
  );
122
126
  }
123
127
  function FieldLabel(_a) {
124
- var _b = _a, {
125
- className
126
- } = _b, props = __objRest(_b, [
127
- "className"
128
- ]);
128
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
129
129
  return /* @__PURE__ */ jsx(
130
130
  Label,
131
131
  __spreadValues({
@@ -145,7 +145,7 @@ function FieldTitle(_a) {
145
145
  "div",
146
146
  __spreadValues({
147
147
  className: cn(
148
- "flex w-fit items-center gap-2 text-sm leading-snug font-medium group-data-[disabled=true]/field:opacity-50",
148
+ "flex w-fit items-center gap-2 text-label-medium leading-snug group-data-[disabled=true]/field:opacity-50",
149
149
  className
150
150
  ),
151
151
  "data-slot": "field-label"
@@ -153,12 +153,16 @@ function FieldTitle(_a) {
153
153
  );
154
154
  }
155
155
  function FieldDescription(_a) {
156
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
156
+ var _b = _a, {
157
+ className
158
+ } = _b, props = __objRest(_b, [
159
+ "className"
160
+ ]);
157
161
  return /* @__PURE__ */ jsx(
158
162
  "p",
159
163
  __spreadValues({
160
164
  className: cn(
161
- "text-xs leading-normal font-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance",
165
+ "text-caption leading-normal text-muted-foreground group-has-[[data-orientation=horizontal]]/field:text-balance",
162
166
  "last:mt-0 nth-last-2:-mt-1 [[data-variant=legend]+&]:-mt-1.5",
163
167
  "[&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
164
168
  className
@@ -179,7 +183,7 @@ function FieldSeparator(_a) {
179
183
  "div",
180
184
  __spreadProps(__spreadValues({
181
185
  className: cn(
182
- "relative -my-2 h-5 text-sm group-data-[variant=outline]/field-group:-mb-2",
186
+ "relative -my-2 h-5 text-body-small group-data-[variant=outline]/field-group:-mb-2",
183
187
  className
184
188
  ),
185
189
  "data-content": Boolean(children),
@@ -233,7 +237,7 @@ function FieldError(_a) {
233
237
  return /* @__PURE__ */ jsx(
234
238
  "div",
235
239
  __spreadProps(__spreadValues({
236
- className: cn("text-xs font-normal text-destructive", className),
240
+ className: cn("text-caption text-destructive", className),
237
241
  "data-slot": "field-error",
238
242
  role: "alert"
239
243
  }, props), {
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-V7CNWJT3.mjs";
3
+ } from "./chunk-VLQZANBF.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadProps,
@@ -15,7 +15,11 @@ function Accordion(props) {
15
15
  return /* @__PURE__ */ jsx(AccordionPrimitive.Root, __spreadValues({ "data-slot": "accordion" }, props));
16
16
  }
17
17
  function AccordionItem(_a) {
18
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
18
+ var _b = _a, {
19
+ className
20
+ } = _b, props = __objRest(_b, [
21
+ "className"
22
+ ]);
19
23
  return /* @__PURE__ */ jsx(
20
24
  AccordionPrimitive.Item,
21
25
  __spreadValues({
@@ -39,7 +43,7 @@ function AccordionTrigger(_a) {
39
43
  // layout
40
44
  "flex flex-1 items-center justify-between gap-4 py-4 text-left",
41
45
  // typography
42
- "text-sm font-medium",
46
+ "text-label-medium",
43
47
  // base
44
48
  "rounded-none outline-none transition-[color,opacity]",
45
49
  // interactive states
@@ -70,7 +74,7 @@ function AccordionContent(_a) {
70
74
  return /* @__PURE__ */ jsx(
71
75
  AccordionPrimitive.Panel,
72
76
  __spreadProps(__spreadValues({
73
- className: "overflow-hidden text-sm h-(--accordion-panel-height) transition-[height] duration-200 ease-out data-starting-style:h-0 data-ending-style:h-0",
77
+ className: "overflow-hidden text-body-small h-(--accordion-panel-height) transition-[height] duration-200 ease-out data-starting-style:h-0 data-ending-style:h-0",
74
78
  "data-slot": "accordion-content"
75
79
  }, props), {
76
80
  children: /* @__PURE__ */ jsx("div", { className: cn("pb-4 text-muted-foreground", className), children })
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  useThemeVars
3
- } from "./chunk-OXQQNQZI.mjs";
3
+ } from "./chunk-FEZKMUCF.mjs";
4
4
  import {
5
5
  cn
6
- } from "./chunk-V7CNWJT3.mjs";
6
+ } from "./chunk-VLQZANBF.mjs";
7
7
  import {
8
8
  __objRest,
9
9
  __spreadProps,
@@ -84,7 +84,11 @@ function DrawerContent(_a) {
84
84
  ] });
85
85
  }
86
86
  function DrawerHeader(_a) {
87
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
87
+ var _b = _a, {
88
+ className
89
+ } = _b, props = __objRest(_b, [
90
+ "className"
91
+ ]);
88
92
  return /* @__PURE__ */ jsx(
89
93
  "div",
90
94
  __spreadValues({
@@ -94,7 +98,11 @@ function DrawerHeader(_a) {
94
98
  );
95
99
  }
96
100
  function DrawerFooter(_a) {
97
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
101
+ var _b = _a, {
102
+ className
103
+ } = _b, props = __objRest(_b, [
104
+ "className"
105
+ ]);
98
106
  return /* @__PURE__ */ jsx(
99
107
  "div",
100
108
  __spreadValues({
@@ -104,15 +112,11 @@ function DrawerFooter(_a) {
104
112
  );
105
113
  }
106
114
  function DrawerTitle(_a) {
107
- var _b = _a, {
108
- className
109
- } = _b, props = __objRest(_b, [
110
- "className"
111
- ]);
115
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
112
116
  return /* @__PURE__ */ jsx(
113
117
  DrawerPrimitive.Title,
114
118
  __spreadValues({
115
- className: cn("text-lg font-semibold text-foreground", className),
119
+ className: cn("text-h5 text-foreground", className),
116
120
  "data-slot": "drawer-title"
117
121
  }, props)
118
122
  );
@@ -126,7 +130,7 @@ function DrawerDescription(_a) {
126
130
  return /* @__PURE__ */ jsx(
127
131
  DrawerPrimitive.Description,
128
132
  __spreadValues({
129
- className: cn("text-sm text-muted-foreground", className),
133
+ className: cn("text-body-small text-muted-foreground", className),
130
134
  "data-slot": "drawer-description"
131
135
  }, props)
132
136
  );
@@ -0,0 +1,161 @@
1
+ import {
2
+ Skeleton
3
+ } from "./chunk-D6ID6M4V.mjs";
4
+ import {
5
+ DATASET_ALPHAS,
6
+ DoughnutLegendRow,
7
+ FALLBACK_PRIMARY,
8
+ formatAbbrev,
9
+ hexToRgba
10
+ } from "./chunk-FZIXGLMV.mjs";
11
+ import {
12
+ Empty,
13
+ EmptyDescription
14
+ } from "./chunk-NQPOYKAQ.mjs";
15
+ import {
16
+ Card,
17
+ CardContent,
18
+ CardHeader,
19
+ CardTitle
20
+ } from "./chunk-CLIN5525.mjs";
21
+ import {
22
+ useThemeVars
23
+ } from "./chunk-FEZKMUCF.mjs";
24
+ import {
25
+ cn
26
+ } from "./chunk-VLQZANBF.mjs";
27
+
28
+ // src/components/ui/transactions-expense-categories-doughnut-chart.tsx
29
+ import { useMemo } from "react";
30
+ import {
31
+ Chart as ChartJS,
32
+ ArcElement,
33
+ Tooltip
34
+ } from "chart.js";
35
+ import { Chart } from "react-chartjs-2";
36
+ import { jsx, jsxs } from "react/jsx-runtime";
37
+ ChartJS.register(ArcElement, Tooltip);
38
+ function TransactionsExpenseCategoriesDoughnutChart({
39
+ segments,
40
+ title = "Expense Categories",
41
+ showLegend = true,
42
+ height = 200,
43
+ width = "100%",
44
+ className,
45
+ isLoading = false
46
+ }) {
47
+ const themeVars = useThemeVars();
48
+ const brandPrimary = themeVars["--theme-primary"] || FALLBACK_PRIMARY;
49
+ const fontFamily = themeVars["--font-sans"] || "Figtree, sans-serif";
50
+ const hasData = !!(segments == null ? void 0 : segments.length) && segments.some((s) => s.value > 0);
51
+ const total = useMemo(
52
+ () => {
53
+ var _a;
54
+ return (_a = segments == null ? void 0 : segments.reduce((sum, s) => sum + s.value, 0)) != null ? _a : 0;
55
+ },
56
+ [segments]
57
+ );
58
+ const colors = useMemo(
59
+ () => (segments != null ? segments : []).map(
60
+ (_, i) => hexToRgba(brandPrimary, DATASET_ALPHAS[i % DATASET_ALPHAS.length])
61
+ ),
62
+ [segments, brandPrimary]
63
+ );
64
+ const chartData = useMemo(
65
+ () => {
66
+ var _a, _b;
67
+ return {
68
+ labels: (_a = segments == null ? void 0 : segments.map((s) => s.label)) != null ? _a : [],
69
+ datasets: [
70
+ {
71
+ data: (_b = segments == null ? void 0 : segments.map((s) => s.value)) != null ? _b : [],
72
+ backgroundColor: colors,
73
+ borderWidth: 0,
74
+ hoverOffset: 4
75
+ }
76
+ ]
77
+ };
78
+ },
79
+ [segments, colors]
80
+ );
81
+ const options = useMemo(
82
+ () => ({
83
+ responsive: true,
84
+ maintainAspectRatio: false,
85
+ cutout: "68%",
86
+ animation: { duration: 600, easing: "easeOutQuart" },
87
+ plugins: {
88
+ legend: { display: false },
89
+ tooltip: {
90
+ padding: 10,
91
+ cornerRadius: 0,
92
+ titleFont: { size: 11, weight: 600 },
93
+ bodyFont: { size: 12, weight: 500 },
94
+ callbacks: {
95
+ label: (ctx) => {
96
+ const val = ctx.raw;
97
+ const pct = total > 0 ? `${(val / total * 100).toFixed(1)}%` : "0%";
98
+ return ` ${ctx.label}: ${formatAbbrev(val)} (${pct})`;
99
+ }
100
+ }
101
+ }
102
+ }
103
+ }),
104
+ [total]
105
+ );
106
+ return /* @__PURE__ */ jsxs(
107
+ Card,
108
+ {
109
+ className: cn("w-full py-4 sm:py-6 gap-2", className),
110
+ style: { maxWidth: width, fontFamily },
111
+ children: [
112
+ /* @__PURE__ */ jsx(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-sm sm:text-base", children: title }) }),
113
+ /* @__PURE__ */ jsx(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ jsx(Skeleton, { style: { height, width: "100%" } }) : !hasData ? /* @__PURE__ */ jsx(Empty, { className: "flex-none p-4", style: { height }, children: /* @__PURE__ */ jsx(EmptyDescription, { children: "No data available" }) }) : /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
114
+ /* @__PURE__ */ jsxs("div", { style: { height, width: "100%", position: "relative" }, children: [
115
+ /* @__PURE__ */ jsx(
116
+ Chart,
117
+ {
118
+ type: "doughnut",
119
+ data: chartData,
120
+ options,
121
+ "aria-label": title
122
+ },
123
+ brandPrimary
124
+ ),
125
+ /* @__PURE__ */ jsxs(
126
+ "div",
127
+ {
128
+ style: {
129
+ position: "absolute",
130
+ top: "50%",
131
+ left: "50%",
132
+ transform: "translate(-50%, -50%)",
133
+ textAlign: "center",
134
+ pointerEvents: "none"
135
+ },
136
+ children: [
137
+ /* @__PURE__ */ jsx("div", { className: "text-base font-semibold leading-tight", children: formatAbbrev(total) }),
138
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] text-muted-foreground leading-none mt-1", children: "Total" })
139
+ ]
140
+ }
141
+ )
142
+ ] }),
143
+ showLegend && /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: segments.map((s, i) => /* @__PURE__ */ jsx(
144
+ DoughnutLegendRow,
145
+ {
146
+ label: s.label,
147
+ color: colors[i],
148
+ value: s.value,
149
+ percent: total > 0 ? `${(s.value / total * 100).toFixed(1)}%` : "0%"
150
+ },
151
+ s.label
152
+ )) })
153
+ ] }) })
154
+ ]
155
+ }
156
+ );
157
+ }
158
+
159
+ export {
160
+ TransactionsExpenseCategoriesDoughnutChart
161
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-V7CNWJT3.mjs";
3
+ } from "./chunk-VLQZANBF.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues
@@ -71,7 +71,7 @@ function EmptyTitle(_a) {
71
71
  return /* @__PURE__ */ jsx(
72
72
  "div",
73
73
  __spreadValues({
74
- className: cn("text-lg font-medium tracking-tight", className),
74
+ className: cn("text-h5", className),
75
75
  "data-slot": "empty-title"
76
76
  }, props)
77
77
  );
@@ -86,7 +86,7 @@ function EmptyDescription(_a) {
86
86
  "div",
87
87
  __spreadValues({
88
88
  className: cn(
89
- "text-sm/relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
89
+ "text-body-small leading-relaxed text-muted-foreground [&>a]:underline [&>a]:underline-offset-4 [&>a:hover]:text-primary",
90
90
  className
91
91
  ),
92
92
  "data-slot": "empty-description"
@@ -94,12 +94,16 @@ function EmptyDescription(_a) {
94
94
  );
95
95
  }
96
96
  function EmptyContent(_a) {
97
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
97
+ var _b = _a, {
98
+ className
99
+ } = _b, props = __objRest(_b, [
100
+ "className"
101
+ ]);
98
102
  return /* @__PURE__ */ jsx(
99
103
  "div",
100
104
  __spreadValues({
101
105
  className: cn(
102
- "flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-sm text-balance",
106
+ "flex w-full max-w-sm min-w-0 flex-col items-center gap-4 text-body-small text-balance",
103
107
  className
104
108
  ),
105
109
  "data-slot": "empty-content"
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-V7CNWJT3.mjs";
3
+ } from "./chunk-VLQZANBF.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues
@@ -9,18 +9,14 @@ import {
9
9
  // src/components/ui/label.tsx
10
10
  import { jsx } from "react/jsx-runtime";
11
11
  function Label(_a) {
12
- var _b = _a, {
13
- className
14
- } = _b, props = __objRest(_b, [
15
- "className"
16
- ]);
12
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
17
13
  return (
18
14
  // eslint-disable-next-line jsx-a11y/label-has-associated-control -- htmlFor is passed by the consumer
19
15
  /* @__PURE__ */ jsx(
20
16
  "label",
21
17
  __spreadValues({
22
18
  className: cn(
23
- "flex items-center gap-2 text-sm leading-none font-medium select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
19
+ "flex items-center gap-2 text-label-medium leading-none select-none group-data-[disabled=true]:pointer-events-none group-data-[disabled=true]:opacity-50 peer-disabled:cursor-not-allowed peer-disabled:opacity-50",
24
20
  className
25
21
  ),
26
22
  "data-slot": "label"