@wealthx/shadcn 1.1.0 → 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 -154
  2. package/CHANGELOG.md +6 -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-2SF672SZ.mjs +161 -0
  6. package/dist/{chunk-GPRJQ24C.mjs → chunk-34NWQURD.mjs} +2 -2
  7. package/dist/{chunk-MQ72DIBH.mjs → chunk-3GF7OVTP.mjs} +14 -5
  8. package/dist/chunk-3WMX6KWS.mjs +245 -0
  9. package/dist/{chunk-PMKODV6M.mjs → chunk-462HMNO4.mjs} +6 -10
  10. package/dist/chunk-4CX4SBRO.mjs +153 -0
  11. package/dist/chunk-4MN6UQHG.mjs +443 -0
  12. package/dist/{chunk-GLW2UO6O.mjs → chunk-5QQVZTVZ.mjs} +82 -61
  13. package/dist/{chunk-BGP2N52Z.mjs → chunk-66MI7Q4B.mjs} +5 -5
  14. package/dist/chunk-6FCGKSZX.mjs +268 -0
  15. package/dist/{chunk-CGOKTPXU.mjs → chunk-6JQFUE5I.mjs} +20 -23
  16. package/dist/{chunk-Z3MK2KKZ.mjs → chunk-7DHU4VGG.mjs} +7 -3
  17. package/dist/{chunk-VZ2NR7L3.mjs → chunk-7PYJD5JI.mjs} +35 -27
  18. package/dist/{chunk-JU2RUWHF.mjs → chunk-7XJHLGUV.mjs} +1 -1
  19. package/dist/{chunk-BMFN37JH.mjs → chunk-7YAU5CY6.mjs} +1 -1
  20. package/dist/chunk-A56YQQHG.mjs +402 -0
  21. package/dist/chunk-AH52LG6N.mjs +315 -0
  22. package/dist/{chunk-SLWCCURD.mjs → chunk-CLIN5525.mjs} +8 -4
  23. package/dist/{chunk-3VQNJ235.mjs → chunk-CSDO6VBW.mjs} +7 -0
  24. package/dist/chunk-D4ILTPOG.mjs +293 -0
  25. package/dist/{chunk-HS7TFG7V.mjs → chunk-D6ID6M4V.mjs} +1 -1
  26. package/dist/chunk-DOH3EHX7.mjs +378 -0
  27. package/dist/{chunk-MJIEMGRD.mjs → chunk-EFRENWEJ.mjs} +9 -17
  28. package/dist/{chunk-YBXCIF5Q.mjs → chunk-ERGGHC2V.mjs} +36 -49
  29. package/dist/{chunk-OXQQNQZI.mjs → chunk-FEZKMUCF.mjs} +10 -1
  30. package/dist/{chunk-55CEW76V.mjs → chunk-FH6QVUVZ.mjs} +1 -1
  31. package/dist/chunk-FMAXJ2SI.mjs +71 -0
  32. package/dist/chunk-FZIXGLMV.mjs +173 -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-KMCGSZTX.mjs} +47 -41
  38. package/dist/{chunk-FHNT55I5.mjs → chunk-KUDCQ4FI.mjs} +4 -4
  39. package/dist/chunk-LE6YFY6D.mjs +209 -0
  40. package/dist/{chunk-NLLKTU4B.mjs → chunk-LLVQKSU3.mjs} +21 -17
  41. package/dist/{chunk-KKHTJNMM.mjs → chunk-MARPPFOJ.mjs} +8 -4
  42. package/dist/{chunk-6AFMNC42.mjs → chunk-N2PT566P.mjs} +15 -11
  43. package/dist/chunk-NLCKVHWB.mjs +161 -0
  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-NXA3CZ7A.mjs +248 -0
  47. package/dist/chunk-OGOYQ7BG.mjs +150 -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-5JGQAAQV.mjs → chunk-PJHPSRYD.mjs} +84 -62
  53. package/dist/{chunk-DDPA2XXS.mjs → chunk-PMB3A7V3.mjs} +2 -2
  54. package/dist/chunk-PR6V5XKM.mjs +209 -0
  55. package/dist/{chunk-46OFHMQA.mjs → chunk-Q76O3RIQ.mjs} +10 -6
  56. package/dist/chunk-QVKWW6KE.mjs +272 -0
  57. package/dist/chunk-RGU7HOEC.mjs +140 -0
  58. package/dist/{chunk-JF4PHPD5.mjs → chunk-RGVKLTLH.mjs} +4 -4
  59. package/dist/{chunk-VG6UF6UT.mjs → chunk-RP3SQYA3.mjs} +2 -2
  60. package/dist/chunk-RRBS6D63.mjs +163 -0
  61. package/dist/{chunk-UEL4RD5P.mjs → chunk-SMQ3DG25.mjs} +80 -67
  62. package/dist/chunk-SPJ5KXW7.mjs +199 -0
  63. package/dist/chunk-SYOD63OZ.mjs +225 -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-WA6O6EUR.mjs +1885 -0
  68. package/dist/{chunk-E3K6O4FZ.mjs → chunk-WAZD7NFU.mjs} +5 -2
  69. package/dist/chunk-WG6JGJXB.mjs +165 -0
  70. package/dist/{chunk-I64K754C.mjs → chunk-WNGWBVLV.mjs} +2 -2
  71. package/dist/{chunk-3U7SD3MS.mjs → chunk-WOEHFRGB.mjs} +3 -3
  72. package/dist/{chunk-DKZRJOMF.mjs → chunk-XIRTEFKH.mjs} +12 -12
  73. package/dist/chunk-Y6DWJSKZ.mjs +79 -0
  74. package/dist/chunk-YKPROFLB.mjs +161 -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 +639 -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 +627 -0
  106. package/dist/components/ui/cash-balance-line-chart.mjs +16 -0
  107. package/dist/components/ui/cashflow-bar-chart.js +123 -69
  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 +165 -66
  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 +163 -65
  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 +682 -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 +76 -38
  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 +11616 -3831
  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 +260 -0
  236. package/src/components/ui/backoffice-contact-history-chart.tsx +325 -0
  237. package/src/components/ui/badge.tsx +17 -15
  238. package/src/components/ui/borrowing-capacity-line-chart.tsx +357 -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 +302 -0
  243. package/src/components/ui/cashflow-bar-chart.tsx +104 -77
  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 +83 -65
  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 +79 -60
  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 +188 -0
  276. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +185 -0
  277. package/src/components/ui/property-mobile-estimate-line-chart.tsx +393 -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 +191 -0
  290. package/src/components/ui/transactions-income-expense-bar-chart.tsx +45 -38
  291. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +191 -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
@@ -0,0 +1,161 @@
1
+ import {
2
+ Skeleton
3
+ } from "./chunk-D6ID6M4V.mjs";
4
+ import {
5
+ DoughnutLegendRow,
6
+ FALLBACK_PRIMARY,
7
+ FALLBACK_SECONDARY,
8
+ formatAbbrev
9
+ } from "./chunk-FZIXGLMV.mjs";
10
+ import {
11
+ Empty,
12
+ EmptyDescription
13
+ } from "./chunk-NQPOYKAQ.mjs";
14
+ import {
15
+ Card,
16
+ CardContent,
17
+ CardHeader,
18
+ CardTitle
19
+ } from "./chunk-CLIN5525.mjs";
20
+ import {
21
+ useThemeVars
22
+ } from "./chunk-FEZKMUCF.mjs";
23
+ import {
24
+ cn
25
+ } from "./chunk-VLQZANBF.mjs";
26
+
27
+ // src/components/ui/property-debt-equity-doughnut-chart.tsx
28
+ import { useMemo } from "react";
29
+ import {
30
+ Chart as ChartJS,
31
+ ArcElement,
32
+ Tooltip
33
+ } from "chart.js";
34
+ import { Chart } from "react-chartjs-2";
35
+ import { jsx, jsxs } from "react/jsx-runtime";
36
+ ChartJS.register(ArcElement, Tooltip);
37
+ function PropertyDebtEquityDoughnutChart({
38
+ estimateValue,
39
+ debtValue,
40
+ title = "Debt & Equity",
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 brandSecondary = themeVars["--theme-secondary"] || FALLBACK_SECONDARY;
50
+ const fontFamily = themeVars["--font-sans"] || "Figtree, sans-serif";
51
+ const estimate = estimateValue != null ? estimateValue : 0;
52
+ const debt = Math.min(debtValue != null ? debtValue : 0, estimate);
53
+ const equity = Math.max(0, estimate - debt);
54
+ const hasData = estimate > 0;
55
+ const chartData = useMemo(
56
+ () => ({
57
+ labels: ["Equity", "Debt"],
58
+ datasets: [
59
+ {
60
+ data: [equity, debt],
61
+ backgroundColor: [brandPrimary, brandSecondary],
62
+ borderWidth: 0,
63
+ hoverOffset: 4
64
+ }
65
+ ]
66
+ }),
67
+ [equity, debt, brandPrimary, brandSecondary]
68
+ );
69
+ const options = useMemo(
70
+ () => ({
71
+ responsive: true,
72
+ maintainAspectRatio: false,
73
+ cutout: "68%",
74
+ animation: { duration: 600, easing: "easeOutQuart" },
75
+ plugins: {
76
+ legend: { display: false },
77
+ tooltip: {
78
+ padding: 10,
79
+ cornerRadius: 0,
80
+ titleFont: { size: 11, weight: 600 },
81
+ bodyFont: { size: 12, weight: 500 },
82
+ callbacks: {
83
+ label: (ctx) => {
84
+ const val = ctx.raw;
85
+ const pct = estimate > 0 ? `${(val / estimate * 100).toFixed(1)}%` : "0%";
86
+ return ` ${ctx.label}: ${formatAbbrev(val)} (${pct})`;
87
+ }
88
+ }
89
+ }
90
+ }
91
+ }),
92
+ [estimate]
93
+ );
94
+ const equityPct = estimate > 0 ? `${(equity / estimate * 100).toFixed(1)}%` : "0%";
95
+ const debtPct = estimate > 0 ? `${(debt / estimate * 100).toFixed(1)}%` : "0%";
96
+ return /* @__PURE__ */ jsxs(
97
+ Card,
98
+ {
99
+ className: cn("w-full py-4 sm:py-6 gap-2", className),
100
+ style: { maxWidth: width, fontFamily },
101
+ children: [
102
+ /* @__PURE__ */ jsx(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ jsx(CardTitle, { className: "text-sm sm:text-base", children: title }) }),
103
+ /* @__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: [
104
+ /* @__PURE__ */ jsxs("div", { style: { height, width: "100%", position: "relative" }, children: [
105
+ /* @__PURE__ */ jsx(
106
+ Chart,
107
+ {
108
+ type: "doughnut",
109
+ data: chartData,
110
+ options,
111
+ "aria-label": title
112
+ },
113
+ `${brandPrimary}__${brandSecondary}`
114
+ ),
115
+ /* @__PURE__ */ jsxs(
116
+ "div",
117
+ {
118
+ style: {
119
+ position: "absolute",
120
+ top: "50%",
121
+ left: "50%",
122
+ transform: "translate(-50%, -50%)",
123
+ textAlign: "center",
124
+ pointerEvents: "none"
125
+ },
126
+ children: [
127
+ /* @__PURE__ */ jsx("div", { className: "text-base font-semibold leading-tight", children: formatAbbrev(equity) }),
128
+ /* @__PURE__ */ jsx("div", { className: "text-[11px] text-muted-foreground leading-none mt-1", children: "Equity" })
129
+ ]
130
+ }
131
+ )
132
+ ] }),
133
+ showLegend && /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
134
+ /* @__PURE__ */ jsx(
135
+ DoughnutLegendRow,
136
+ {
137
+ label: "Equity",
138
+ color: brandPrimary,
139
+ value: equity,
140
+ percent: equityPct
141
+ }
142
+ ),
143
+ /* @__PURE__ */ jsx(
144
+ DoughnutLegendRow,
145
+ {
146
+ label: "Debt",
147
+ color: brandSecondary,
148
+ value: debt,
149
+ percent: debtPct
150
+ }
151
+ )
152
+ ] })
153
+ ] }) })
154
+ ]
155
+ }
156
+ );
157
+ }
158
+
159
+ export {
160
+ PropertyDebtEquityDoughnutChart
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
@@ -15,7 +15,7 @@ function Textarea(_a) {
15
15
  __spreadValues({
16
16
  className: cn(
17
17
  // WealthX: removed shadow-xs (flat panels), added font-sans
18
- "flex field-sizing-content min-h-16 w-full border border-input bg-transparent px-3 py-2 text-base font-sans transition-[color,box-shadow] outline-none placeholder:text-muted-foreground focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:aria-invalid:ring-destructive/40",
18
+ "flex field-sizing-content min-h-16 w-full border border-input bg-transparent px-3 py-2 text-body-medium font-sans transition-[color,box-shadow] outline-none placeholder:font-normal placeholder:text-muted-foreground focus-visible:border-primary focus-visible:ring-[3px] focus-visible:ring-primary/20 disabled:cursor-not-allowed disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:bg-input/30 dark:aria-invalid:ring-destructive/40",
19
19
  className
20
20
  ),
21
21
  "data-slot": "textarea"
@@ -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
  __spreadValues
@@ -36,6 +36,7 @@ function PopoverContent(_a) {
36
36
  return /* @__PURE__ */ jsx(PopoverPrimitive.Portal, { children: /* @__PURE__ */ jsx(
37
37
  PopoverPrimitive.Positioner,
38
38
  {
39
+ className: "z-[200]",
39
40
  align,
40
41
  sideOffset,
41
42
  children: /* @__PURE__ */ jsx(
@@ -57,17 +58,25 @@ function PopoverAnchor(_a) {
57
58
  return /* @__PURE__ */ jsx("div", __spreadValues({ "data-slot": "popover-anchor" }, props));
58
59
  }
59
60
  function PopoverHeader(_a) {
60
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
61
+ var _b = _a, {
62
+ className
63
+ } = _b, props = __objRest(_b, [
64
+ "className"
65
+ ]);
61
66
  return /* @__PURE__ */ jsx(
62
67
  "div",
63
68
  __spreadValues({
64
- className: cn("flex flex-col gap-1 text-sm", className),
69
+ className: cn("flex flex-col gap-1 text-body-small", className),
65
70
  "data-slot": "popover-header"
66
71
  }, props)
67
72
  );
68
73
  }
69
74
  function PopoverTitle(_a) {
70
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
75
+ var _b = _a, {
76
+ className
77
+ } = _b, props = __objRest(_b, [
78
+ "className"
79
+ ]);
71
80
  return (
72
81
  // eslint-disable-next-line jsx-a11y/heading-has-content -- children passed via props spread
73
82
  /* @__PURE__ */ jsx(
@@ -0,0 +1,245 @@
1
+ import {
2
+ Select,
3
+ SelectContent,
4
+ SelectItem,
5
+ SelectTrigger
6
+ } from "./chunk-7PYJD5JI.mjs";
7
+ import {
8
+ Separator
9
+ } from "./chunk-FH6QVUVZ.mjs";
10
+ import {
11
+ Label
12
+ } from "./chunk-NSLMILBT.mjs";
13
+ import {
14
+ Input
15
+ } from "./chunk-GYMYRIZP.mjs";
16
+ import {
17
+ Dialog,
18
+ DialogContent,
19
+ DialogFooter,
20
+ DialogHeader,
21
+ DialogTitle
22
+ } from "./chunk-XIRTEFKH.mjs";
23
+ import {
24
+ Button,
25
+ buttonVariants
26
+ } from "./chunk-2I5S2AMY.mjs";
27
+ import {
28
+ cn
29
+ } from "./chunk-VLQZANBF.mjs";
30
+ import {
31
+ __spreadValues
32
+ } from "./chunk-FWCSY2DS.mjs";
33
+
34
+ // src/components/ui/add-column-modal.tsx
35
+ import * as React from "react";
36
+ import { Plus, Trash2 } from "lucide-react";
37
+ import { jsx, jsxs } from "react/jsx-runtime";
38
+ var MAX_TASKS = 20;
39
+ function AddColumnModal({
40
+ open,
41
+ onOpenChange,
42
+ onSave,
43
+ editData,
44
+ aiAgents = [],
45
+ loading = false,
46
+ className
47
+ }) {
48
+ var _a, _b;
49
+ const isEdit = !!(editData == null ? void 0 : editData.id);
50
+ const nextId = React.useRef(0);
51
+ const [name, setName] = React.useState((_a = editData == null ? void 0 : editData.name) != null ? _a : "");
52
+ const [warningDays, setWarningDays] = React.useState(
53
+ (editData == null ? void 0 : editData.warningDays) != null ? String(editData.warningDays) : ""
54
+ );
55
+ const [priorityDays, setPriorityDays] = React.useState(
56
+ (editData == null ? void 0 : editData.priorityDays) != null ? String(editData.priorityDays) : ""
57
+ );
58
+ const [tasks, setTasks] = React.useState((_b = editData == null ? void 0 : editData.tasks) != null ? _b : []);
59
+ React.useEffect(() => {
60
+ var _a2, _b2;
61
+ if (open) {
62
+ setName((_a2 = editData == null ? void 0 : editData.name) != null ? _a2 : "");
63
+ setWarningDays(
64
+ (editData == null ? void 0 : editData.warningDays) != null ? String(editData.warningDays) : ""
65
+ );
66
+ setPriorityDays(
67
+ (editData == null ? void 0 : editData.priorityDays) != null ? String(editData.priorityDays) : ""
68
+ );
69
+ setTasks((_b2 = editData == null ? void 0 : editData.tasks) != null ? _b2 : []);
70
+ }
71
+ }, [open, editData]);
72
+ const wDays = warningDays !== "" ? parseInt(warningDays, 10) : null;
73
+ const pDays = priorityDays !== "" ? parseInt(priorityDays, 10) : null;
74
+ const daysError = wDays !== null && pDays !== null && wDays >= pDays ? "Warning days must be less than priority days." : null;
75
+ const taskNames = tasks.map((t) => t.name.trim().toLowerCase());
76
+ const hasDuplicateTasks = new Set(taskNames).size !== taskNames.filter(Boolean).length;
77
+ const isValid = name.trim().length > 0 && !daysError && !hasDuplicateTasks && tasks.every((t) => t.name.trim().length > 0);
78
+ function addTask() {
79
+ if (tasks.length >= MAX_TASKS) return;
80
+ setTasks((prev) => [
81
+ ...prev,
82
+ { id: nextId.current++, name: "", aiAgentId: null }
83
+ ]);
84
+ }
85
+ function removeTask(id) {
86
+ setTasks((prev) => prev.filter((t) => t.id !== id));
87
+ }
88
+ function updateTask(id, patch) {
89
+ setTasks((prev) => prev.map((t) => t.id === id ? __spreadValues(__spreadValues({}, t), patch) : t));
90
+ }
91
+ function handleSave() {
92
+ onSave({
93
+ id: editData == null ? void 0 : editData.id,
94
+ name: name.trim(),
95
+ orderIndex: editData == null ? void 0 : editData.orderIndex,
96
+ warningDays: wDays,
97
+ priorityDays: pDays,
98
+ tasks,
99
+ isTitleLocked: editData == null ? void 0 : editData.isTitleLocked
100
+ });
101
+ }
102
+ return /* @__PURE__ */ jsx(Dialog, { open, onOpenChange: loading ? void 0 : onOpenChange, children: /* @__PURE__ */ jsxs(DialogContent, { className: cn("max-w-md", className), children: [
103
+ /* @__PURE__ */ jsx(DialogHeader, { children: /* @__PURE__ */ jsx(DialogTitle, { children: isEdit ? "Edit Column" : "Add New Column" }) }),
104
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-4", children: [
105
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
106
+ /* @__PURE__ */ jsx(Label, { children: "Column title" }),
107
+ /* @__PURE__ */ jsx(
108
+ Input,
109
+ {
110
+ value: name,
111
+ onChange: (e) => setName(e.target.value),
112
+ placeholder: "e.g. Pre-approval",
113
+ disabled: (editData == null ? void 0 : editData.isTitleLocked) || loading
114
+ }
115
+ ),
116
+ (editData == null ? void 0 : editData.isTitleLocked) && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "This column title is locked and cannot be changed." })
117
+ ] }),
118
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
119
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-foreground", children: "Time-based alerts" }),
120
+ /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-2 gap-3", children: [
121
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
122
+ /* @__PURE__ */ jsx(Label, { className: "font-normal text-muted-foreground", children: "Warning after (days)" }),
123
+ /* @__PURE__ */ jsx(
124
+ Input,
125
+ {
126
+ type: "number",
127
+ min: 1,
128
+ value: warningDays,
129
+ onChange: (e) => setWarningDays(e.target.value),
130
+ placeholder: "e.g. 7",
131
+ disabled: loading
132
+ }
133
+ )
134
+ ] }),
135
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
136
+ /* @__PURE__ */ jsx(Label, { className: "font-normal text-muted-foreground", children: "Priority after (days)" }),
137
+ /* @__PURE__ */ jsx(
138
+ Input,
139
+ {
140
+ type: "number",
141
+ min: 1,
142
+ value: priorityDays,
143
+ onChange: (e) => setPriorityDays(e.target.value),
144
+ placeholder: "e.g. 14",
145
+ disabled: loading
146
+ }
147
+ )
148
+ ] })
149
+ ] }),
150
+ daysError && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: daysError })
151
+ ] }),
152
+ /* @__PURE__ */ jsx(Separator, {}),
153
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
154
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-between", children: [
155
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium text-foreground", children: "Task templates" }),
156
+ /* @__PURE__ */ jsxs(
157
+ Button,
158
+ {
159
+ variant: "outline",
160
+ size: "sm",
161
+ className: "h-7 gap-1 text-xs",
162
+ onClick: addTask,
163
+ disabled: tasks.length >= MAX_TASKS || loading,
164
+ children: [
165
+ /* @__PURE__ */ jsx(Plus, { className: "size-3" }),
166
+ "Add (",
167
+ tasks.length,
168
+ "/",
169
+ MAX_TASKS,
170
+ ")"
171
+ ]
172
+ }
173
+ )
174
+ ] }),
175
+ tasks.length === 0 && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "No tasks yet. Tasks will be created for each new opportunity added to this column." }),
176
+ /* @__PURE__ */ jsx("div", { className: "flex flex-col gap-2", children: tasks.map((task) => {
177
+ var _a2, _b2, _c;
178
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
179
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
180
+ /* @__PURE__ */ jsx(
181
+ Input,
182
+ {
183
+ value: task.name,
184
+ onChange: (e) => updateTask(task.id, { name: e.target.value }),
185
+ placeholder: "Task name",
186
+ className: "flex-1",
187
+ disabled: loading
188
+ }
189
+ ),
190
+ /* @__PURE__ */ jsx(
191
+ "button",
192
+ {
193
+ onClick: () => removeTask(task.id),
194
+ disabled: loading,
195
+ className: cn(
196
+ buttonVariants({ variant: "ghost", size: "icon" }),
197
+ "size-9 shrink-0 text-muted-foreground hover:text-destructive"
198
+ ),
199
+ "aria-label": "Remove task",
200
+ children: /* @__PURE__ */ jsx(Trash2, { className: "size-4" })
201
+ }
202
+ )
203
+ ] }),
204
+ aiAgents.length > 0 && /* @__PURE__ */ jsxs(
205
+ Select,
206
+ {
207
+ value: (_a2 = task.aiAgentId) != null ? _a2 : void 0,
208
+ onValueChange: (v) => updateTask(task.id, { aiAgentId: v || null }),
209
+ children: [
210
+ /* @__PURE__ */ jsx(SelectTrigger, { size: "sm", className: "w-full", children: /* @__PURE__ */ jsx(
211
+ "span",
212
+ {
213
+ className: cn(
214
+ !task.aiAgentId && "text-muted-foreground"
215
+ ),
216
+ children: task.aiAgentId ? (_c = (_b2 = aiAgents.find((a) => a.id === task.aiAgentId)) == null ? void 0 : _b2.name) != null ? _c : task.aiAgentId : "Select agent"
217
+ }
218
+ ) }),
219
+ /* @__PURE__ */ jsx(SelectContent, { children: aiAgents.map((agent) => /* @__PURE__ */ jsx(SelectItem, { value: agent.id, children: agent.name }, agent.id)) })
220
+ ]
221
+ }
222
+ )
223
+ ] }, task.id);
224
+ }) }),
225
+ hasDuplicateTasks && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: "Task names must be unique." })
226
+ ] })
227
+ ] }),
228
+ /* @__PURE__ */ jsxs(DialogFooter, { children: [
229
+ /* @__PURE__ */ jsx(
230
+ Button,
231
+ {
232
+ variant: "outline",
233
+ onClick: () => onOpenChange(false),
234
+ disabled: loading,
235
+ children: "Cancel"
236
+ }
237
+ ),
238
+ /* @__PURE__ */ jsx(Button, { onClick: handleSave, disabled: loading || !isValid, children: loading ? isEdit ? "Saving\u2026" : "Adding\u2026" : isEdit ? "Save changes" : "Add column" })
239
+ ] })
240
+ ] }) });
241
+ }
242
+
243
+ export {
244
+ AddColumnModal
245
+ };
@@ -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,
@@ -15,8 +15,8 @@ import { XIcon } from "lucide-react";
15
15
  import { Dialog as SheetPrimitive } from "@base-ui/react/dialog";
16
16
  import { jsx, jsxs } from "react/jsx-runtime";
17
17
  var SIDE_CLASSES = {
18
- right: "inset-y-0 right-0 h-full w-3/4 border-l data-ending-style:slide-out-to-right data-open:slide-in-from-right sm:max-w-sm",
19
- left: "inset-y-0 left-0 h-full w-3/4 border-r data-ending-style:slide-out-to-left data-open:slide-in-from-left sm:max-w-sm",
18
+ right: "inset-y-0 right-0 h-full w-1/2 border-l data-ending-style:slide-out-to-right data-open:slide-in-from-right",
19
+ left: "inset-y-0 left-0 h-full w-1/2 border-r data-ending-style:slide-out-to-left data-open:slide-in-from-left",
20
20
  top: "inset-x-0 top-0 h-auto border-b data-ending-style:slide-out-to-top data-open:slide-in-from-top",
21
21
  bottom: "inset-x-0 bottom-0 h-auto border-t data-ending-style:slide-out-to-bottom data-open:slide-in-from-bottom"
22
22
  };
@@ -120,11 +120,7 @@ function SheetFooter(_a) {
120
120
  );
121
121
  }
122
122
  function SheetTitle(_a) {
123
- var _b = _a, {
124
- className
125
- } = _b, props = __objRest(_b, [
126
- "className"
127
- ]);
123
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
128
124
  return /* @__PURE__ */ jsx(
129
125
  SheetPrimitive.Title,
130
126
  __spreadValues({
@@ -142,7 +138,7 @@ function SheetDescription(_a) {
142
138
  return /* @__PURE__ */ jsx(
143
139
  SheetPrimitive.Description,
144
140
  __spreadValues({
145
- className: cn("text-sm text-muted-foreground", className),
141
+ className: cn("text-body-small text-muted-foreground", className),
146
142
  "data-slot": "sheet-description"
147
143
  }, props)
148
144
  );
@@ -0,0 +1,153 @@
1
+ import {
2
+ KanbanColumn
3
+ } from "./chunk-VACKZOMY.mjs";
4
+ import {
5
+ ToggleGroup,
6
+ ToggleGroupItem
7
+ } from "./chunk-PMB3A7V3.mjs";
8
+ import {
9
+ Input
10
+ } from "./chunk-GYMYRIZP.mjs";
11
+ import {
12
+ cn
13
+ } from "./chunk-VLQZANBF.mjs";
14
+
15
+ // src/components/ui/pipeline-board.tsx
16
+ import { RefreshCw, Search, X } from "lucide-react";
17
+ import { jsx, jsxs } from "react/jsx-runtime";
18
+ function Toolbar({
19
+ searchValue,
20
+ onSearchChange,
21
+ filterOptions,
22
+ activeFilters,
23
+ onFilterChange,
24
+ onRefresh
25
+ }) {
26
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3 border-b border-border bg-background px-4 py-3", children: [
27
+ /* @__PURE__ */ jsxs("div", { className: "relative w-56 shrink-0", children: [
28
+ /* @__PURE__ */ jsx(Search, { className: "absolute left-2.5 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }),
29
+ /* @__PURE__ */ jsx(
30
+ Input,
31
+ {
32
+ placeholder: "Search opportunities\u2026",
33
+ value: searchValue,
34
+ onChange: (e) => onSearchChange(e.target.value),
35
+ className: "h-8 pl-8 text-sm"
36
+ }
37
+ ),
38
+ searchValue && /* @__PURE__ */ jsx(
39
+ "button",
40
+ {
41
+ onClick: () => onSearchChange(""),
42
+ className: "absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground",
43
+ "aria-label": "Clear search",
44
+ children: /* @__PURE__ */ jsx(X, { className: "size-3.5" })
45
+ }
46
+ )
47
+ ] }),
48
+ filterOptions.length > 0 && /* @__PURE__ */ jsx(
49
+ ToggleGroup,
50
+ {
51
+ type: "multiple",
52
+ variant: "outline",
53
+ size: "sm",
54
+ spacing: 1.5,
55
+ value: activeFilters,
56
+ onValueChange: (newValues) => {
57
+ var _a;
58
+ const toggled = (_a = newValues.find((v) => !activeFilters.includes(v))) != null ? _a : activeFilters.find((v) => !newValues.includes(v));
59
+ if (toggled) onFilterChange(toggled);
60
+ },
61
+ children: filterOptions.map((option) => /* @__PURE__ */ jsx(ToggleGroupItem, { value: option, children: option }, option))
62
+ }
63
+ ),
64
+ onRefresh && /* @__PURE__ */ jsx(
65
+ "button",
66
+ {
67
+ onClick: onRefresh,
68
+ className: "ml-auto text-muted-foreground hover:text-foreground",
69
+ "aria-label": "Refresh board",
70
+ children: /* @__PURE__ */ jsx(RefreshCw, { className: "size-4" })
71
+ }
72
+ )
73
+ ] });
74
+ }
75
+ function PipelineBoard({
76
+ columns,
77
+ searchValue = "",
78
+ onSearchChange,
79
+ filterOptions = [],
80
+ activeFilters = [],
81
+ onFilterChange,
82
+ onRefresh,
83
+ onEditColumn,
84
+ onDeleteColumn,
85
+ onTaskToggle,
86
+ onMarkAsDone,
87
+ onMoveToNextStage,
88
+ onViewDetails,
89
+ onChangePriority,
90
+ onLaunchAssistant,
91
+ onPutOnHold,
92
+ onDeleteOpportunity,
93
+ submittingOpportunityId,
94
+ className
95
+ }) {
96
+ const hasToolbar = onSearchChange || filterOptions.length > 0 && onFilterChange;
97
+ return /* @__PURE__ */ jsxs(
98
+ "div",
99
+ {
100
+ className: cn("flex h-full flex-col bg-muted/20", className),
101
+ "data-slot": "pipeline-board",
102
+ children: [
103
+ hasToolbar && /* @__PURE__ */ jsx(
104
+ Toolbar,
105
+ {
106
+ searchValue,
107
+ onSearchChange: onSearchChange != null ? onSearchChange : (() => {
108
+ }),
109
+ filterOptions,
110
+ activeFilters,
111
+ onFilterChange: onFilterChange != null ? onFilterChange : (() => {
112
+ }),
113
+ onRefresh
114
+ }
115
+ ),
116
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-1 gap-3 overflow-x-auto p-4", children: [
117
+ columns.map((col) => /* @__PURE__ */ jsx(
118
+ KanbanColumn,
119
+ {
120
+ stage: col.stage,
121
+ opportunities: col.opportunities,
122
+ isDragging: col.isDragging,
123
+ isDropTarget: col.isDropTarget,
124
+ isDefault: col.isDefault,
125
+ isLoading: col.isLoading,
126
+ isLoadingMore: col.isLoadingMore,
127
+ hasMore: col.hasMore,
128
+ loaderRef: col.loaderRef,
129
+ onEditColumn: onEditColumn ? () => onEditColumn(col.stage.id) : void 0,
130
+ onDeleteColumn: onDeleteColumn && !col.isDefault ? () => onDeleteColumn(col.stage.id) : void 0,
131
+ onTaskToggle,
132
+ onMarkAsDone,
133
+ onMoveToNextStage,
134
+ onSendLoanApplication: col.onSendLoanApplication,
135
+ onViewDetails,
136
+ onChangePriority,
137
+ onLaunchAssistant,
138
+ onPutOnHold,
139
+ onDeleteOpportunity,
140
+ submittingOpportunityId
141
+ },
142
+ col.key
143
+ )),
144
+ columns.length === 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-1 items-center justify-center", children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "No columns to display." }) })
145
+ ] })
146
+ ]
147
+ }
148
+ );
149
+ }
150
+
151
+ export {
152
+ PipelineBoard
153
+ };