@wealthx/shadcn 1.5.42 → 1.5.44

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 (209) hide show
  1. package/.turbo/turbo-build.log +207 -202
  2. package/CHANGELOG.md +12 -0
  3. package/dist/{chunk-5FHBC6DY.mjs → chunk-33WZ5NCW.mjs} +1 -1
  4. package/dist/{chunk-LBXIYS34.mjs → chunk-4PVCJ3JD.mjs} +1 -1
  5. package/dist/{chunk-EHQL64B7.mjs → chunk-4SUXTO2Z.mjs} +4 -4
  6. package/dist/{chunk-BAONSY54.mjs → chunk-5RYH7SOQ.mjs} +1 -1
  7. package/dist/{chunk-3C4DZTGA.mjs → chunk-5XD7A7YC.mjs} +1 -1
  8. package/dist/{chunk-5DAQU3B6.mjs → chunk-66JXT7NY.mjs} +1 -1
  9. package/dist/{chunk-NGKTJRFN.mjs → chunk-6DO4EGT2.mjs} +2 -2
  10. package/dist/{chunk-C7ZTZTEW.mjs → chunk-6XJWL2E5.mjs} +1 -1
  11. package/dist/{chunk-C35JMOII.mjs → chunk-7RMXM5O6.mjs} +5 -5
  12. package/dist/{chunk-FQUT5XD6.mjs → chunk-A4UP4QFB.mjs} +1 -1
  13. package/dist/{chunk-USIRKDYQ.mjs → chunk-BFCX7ADE.mjs} +1 -1
  14. package/dist/{chunk-XGRSPFFC.mjs → chunk-CQHKU24Z.mjs} +1 -1
  15. package/dist/{chunk-HONTZFLO.mjs → chunk-DP4ER6TJ.mjs} +1 -1
  16. package/dist/{chunk-VLVEZHFE.mjs → chunk-EFSLAMHI.mjs} +4 -4
  17. package/dist/{chunk-FYZBGWYR.mjs → chunk-FVSOFXJQ.mjs} +1 -1
  18. package/dist/{chunk-JUMEIPII.mjs → chunk-G2MOZZPE.mjs} +8 -8
  19. package/dist/{chunk-D3HKFRQO.mjs → chunk-GQWKBESP.mjs} +8 -5
  20. package/dist/{chunk-MD66TGX7.mjs → chunk-GXDKWCMV.mjs} +1 -1
  21. package/dist/{chunk-77L3UPBW.mjs → chunk-H7NOUDU3.mjs} +5 -5
  22. package/dist/{chunk-4LLTZ45R.mjs → chunk-HOXTEU5K.mjs} +8 -7
  23. package/dist/{chunk-ZA37ZWZW.mjs → chunk-IXW77PMI.mjs} +7 -7
  24. package/dist/{chunk-XHZONBL4.mjs → chunk-JLEQU5BO.mjs} +1 -1
  25. package/dist/{chunk-6UKOJLXO.mjs → chunk-JSFWRD7K.mjs} +4 -4
  26. package/dist/{chunk-7PTRHNUV.mjs → chunk-JY3FUGNL.mjs} +1 -1
  27. package/dist/{chunk-3ZU5BH6X.mjs → chunk-KEOAPKJO.mjs} +3 -3
  28. package/dist/{chunk-4QTHK7ML.mjs → chunk-KWYFJQV6.mjs} +1 -1
  29. package/dist/{chunk-FGMDBJCF.mjs → chunk-LDPCSE7J.mjs} +4 -4
  30. package/dist/chunk-LFWNKXZU.mjs +109 -0
  31. package/dist/{chunk-IRZWYTGV.mjs → chunk-M32YSAWL.mjs} +8 -7
  32. package/dist/{chunk-LLAGF6BA.mjs → chunk-MUB2G36A.mjs} +1 -1
  33. package/dist/{chunk-DQNNP6I4.mjs → chunk-NIETQFJQ.mjs} +1 -1
  34. package/dist/{chunk-RUX3OLVZ.mjs → chunk-OTFG57ZF.mjs} +1 -1
  35. package/dist/{chunk-OKIWXOJL.mjs → chunk-OWTW5WAJ.mjs} +1 -1
  36. package/dist/{chunk-WWIWRNBK.mjs → chunk-P7NSCTAW.mjs} +1 -1
  37. package/dist/{chunk-BZWQU52U.mjs → chunk-QZREZL2F.mjs} +1 -1
  38. package/dist/{chunk-E432NK23.mjs → chunk-RBQ4BZUV.mjs} +6 -6
  39. package/dist/{chunk-I2EKKSEF.mjs → chunk-RKBLVNDC.mjs} +4 -7
  40. package/dist/{chunk-LHQACMZY.mjs → chunk-SPPQFW32.mjs} +106 -50
  41. package/dist/{chunk-OSSS56CB.mjs → chunk-SUXJWKRI.mjs} +4 -4
  42. package/dist/{chunk-SCGCGVDN.mjs → chunk-SZXIPE5J.mjs} +1 -1
  43. package/dist/{chunk-VVURVETY.mjs → chunk-TOQRA2TD.mjs} +1 -1
  44. package/dist/{chunk-GYWOD2YI.mjs → chunk-TZSDYQFH.mjs} +4 -4
  45. package/dist/{chunk-S7SBLNX4.mjs → chunk-UB3WG6I4.mjs} +1 -1
  46. package/dist/{chunk-PGJRZHN7.mjs → chunk-UVZ3JWFG.mjs} +1 -1
  47. package/dist/{chunk-UD5UF5OC.mjs → chunk-W7OPFKTZ.mjs} +4 -4
  48. package/dist/{chunk-YEWNFK5S.mjs → chunk-WLXP4OOF.mjs} +5 -5
  49. package/dist/{chunk-ORMC3TV3.mjs → chunk-XYXYTTNW.mjs} +1 -1
  50. package/dist/{chunk-CZOGJC76.mjs → chunk-YACFZWRR.mjs} +7 -7
  51. package/dist/{chunk-UTCW5YUX.mjs → chunk-YPATB6YQ.mjs} +9 -9
  52. package/dist/{chunk-BZGFW6L7.mjs → chunk-YWJAIPUA.mjs} +1 -1
  53. package/dist/{chunk-MHBQJVHE.mjs → chunk-Z65BGSHI.mjs} +5 -5
  54. package/dist/{chunk-PCULNQWA.mjs → chunk-ZGSFRUVI.mjs} +3 -3
  55. package/dist/{chunk-7NQKFPXE.mjs → chunk-ZRYG6ICN.mjs} +1 -1
  56. package/dist/{chunk-ZFKAYRFQ.mjs → chunk-ZUHFYW65.mjs} +1 -1
  57. package/dist/components/ui/about-you-form.mjs +2 -2
  58. package/dist/components/ui/account-list-carousel.mjs +2 -2
  59. package/dist/components/ui/add-column-modal.mjs +4 -4
  60. package/dist/components/ui/add-lead-modal.mjs +4 -4
  61. package/dist/components/ui/advisor-card.mjs +2 -2
  62. package/dist/components/ui/ai-assistant-drawer.mjs +2 -2
  63. package/dist/components/ui/ai-builder/index.mjs +4 -4
  64. package/dist/components/ui/ai-conversations/index.mjs +4 -4
  65. package/dist/components/ui/alert-dialog.mjs +3 -3
  66. package/dist/components/ui/applicant-expenses-section.mjs +1 -1
  67. package/dist/components/ui/appointment-action-dialogs.mjs +5 -5
  68. package/dist/components/ui/appointment-availability-settings.mjs +4 -4
  69. package/dist/components/ui/appointment-book-dialog.mjs +4 -4
  70. package/dist/components/ui/appointment-detail-sheet.mjs +6 -6
  71. package/dist/components/ui/appointment-upcoming-card.mjs +4 -4
  72. package/dist/components/ui/asset-accordion.mjs +7 -7
  73. package/dist/components/ui/assets-liabilities-side-card.js +19 -66
  74. package/dist/components/ui/assets-liabilities-side-card.mjs +22 -69
  75. package/dist/components/ui/backoffice-alert-history-chart.js +1 -1
  76. package/dist/components/ui/backoffice-alert-history-chart.mjs +5 -5
  77. package/dist/components/ui/backoffice-alert-matching-chart.js +1 -1
  78. package/dist/components/ui/backoffice-alert-matching-chart.mjs +5 -5
  79. package/dist/components/ui/backoffice-alerts-chart.js +1 -1
  80. package/dist/components/ui/backoffice-alerts-chart.mjs +5 -5
  81. package/dist/components/ui/backoffice-connections-chart.js +1 -1
  82. package/dist/components/ui/backoffice-connections-chart.mjs +5 -5
  83. package/dist/components/ui/backoffice-contact-history-chart.js +1 -1
  84. package/dist/components/ui/backoffice-contact-history-chart.mjs +5 -5
  85. package/dist/components/ui/backoffice-contact-matching-chart.js +1 -1
  86. package/dist/components/ui/backoffice-contact-matching-chart.mjs +5 -5
  87. package/dist/components/ui/backoffice-signup-steps.mjs +4 -4
  88. package/dist/components/ui/bank-statement-generate-dialog.mjs +4 -4
  89. package/dist/components/ui/bank-statement-pdf-viewer.mjs +4 -4
  90. package/dist/components/ui/borrowing-capacity-atoms.js +3 -6
  91. package/dist/components/ui/borrowing-capacity-atoms.mjs +2 -2
  92. package/dist/components/ui/borrowing-capacity-card.js +5 -5
  93. package/dist/components/ui/borrowing-capacity-card.mjs +6 -6
  94. package/dist/components/ui/borrowing-capacity-line-chart.js +5 -5
  95. package/dist/components/ui/borrowing-capacity-line-chart.mjs +5 -5
  96. package/dist/components/ui/calculator-section.mjs +4 -4
  97. package/dist/components/ui/cash-balance-line-chart.js +102 -46
  98. package/dist/components/ui/cash-balance-line-chart.mjs +5 -5
  99. package/dist/components/ui/cashflow-bar-chart.js +7 -4
  100. package/dist/components/ui/cashflow-bar-chart.mjs +5 -5
  101. package/dist/components/ui/category-edit-dialog.js +1 -1
  102. package/dist/components/ui/category-edit-dialog.mjs +4 -4
  103. package/dist/components/ui/color-picker.mjs +2 -2
  104. package/dist/components/ui/contact-alert-dialog/index.mjs +4 -4
  105. package/dist/components/ui/create-contact-modal.mjs +4 -4
  106. package/dist/components/ui/csv-import-modal.mjs +4 -4
  107. package/dist/components/ui/dashboard-expense-categories.js +99 -66
  108. package/dist/components/ui/dashboard-expense-categories.mjs +104 -69
  109. package/dist/components/ui/dashboard-transactions-table.js +19 -9
  110. package/dist/components/ui/dashboard-transactions-table.mjs +26 -16
  111. package/dist/components/ui/data-table.mjs +2 -2
  112. package/dist/components/ui/date-picker.mjs +2 -2
  113. package/dist/components/ui/debt-accordion.mjs +7 -7
  114. package/dist/components/ui/delete-contact-component.mjs +4 -4
  115. package/dist/components/ui/dialog.mjs +3 -3
  116. package/dist/components/ui/document-checklist-template.mjs +2 -2
  117. package/dist/components/ui/expense-bar-chart.js +8 -7
  118. package/dist/components/ui/expense-bar-chart.mjs +5 -5
  119. package/dist/components/ui/expense-categories-bar.js +261 -0
  120. package/dist/components/ui/expense-categories-bar.mjs +12 -0
  121. package/dist/components/ui/expense-work-details.js +8 -7
  122. package/dist/components/ui/expense-work-details.mjs +7 -7
  123. package/dist/components/ui/file-preview-dialog.mjs +4 -4
  124. package/dist/components/ui/financial-cards.mjs +2 -2
  125. package/dist/components/ui/financial-drawers.mjs +2 -2
  126. package/dist/components/ui/financial-sections.mjs +3 -3
  127. package/dist/components/ui/frontend-signup-steps.mjs +2 -2
  128. package/dist/components/ui/income-bar-chart.js +8 -7
  129. package/dist/components/ui/income-bar-chart.mjs +5 -5
  130. package/dist/components/ui/income-sources-card.mjs +1 -1
  131. package/dist/components/ui/income-summary-component.mjs +1 -1
  132. package/dist/components/ui/income-work-details.js +8 -7
  133. package/dist/components/ui/income-work-details.mjs +6 -6
  134. package/dist/components/ui/incoming-outgoings-card.js +2 -2
  135. package/dist/components/ui/incoming-outgoings-card.mjs +3 -3
  136. package/dist/components/ui/interest-rate-section.mjs +1 -1
  137. package/dist/components/ui/kanban-column.mjs +5 -5
  138. package/dist/components/ui/loan-application-cards.mjs +3 -3
  139. package/dist/components/ui/loan-financials.mjs +3 -3
  140. package/dist/components/ui/money-input-with-slider.mjs +2 -2
  141. package/dist/components/ui/opportunity-card.mjs +4 -4
  142. package/dist/components/ui/opportunity-edit-modals.mjs +4 -4
  143. package/dist/components/ui/opportunity-summary-tab.mjs +8 -8
  144. package/dist/components/ui/pagination.mjs +2 -2
  145. package/dist/components/ui/pipeline-board.mjs +6 -6
  146. package/dist/components/ui/pipeline-chart.mjs +2 -2
  147. package/dist/components/ui/pipeline-dialogs.mjs +4 -4
  148. package/dist/components/ui/policy-ai/index.mjs +2 -2
  149. package/dist/components/ui/property-asset-card.mjs +4 -4
  150. package/dist/components/ui/property-cashflow-doughnut-chart.js +3 -3
  151. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +5 -5
  152. package/dist/components/ui/property-debt-equity-doughnut-chart.js +3 -3
  153. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +5 -5
  154. package/dist/components/ui/property-list-carousel.mjs +2 -2
  155. package/dist/components/ui/property-mobile-estimate-line-chart.js +4 -4
  156. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +5 -5
  157. package/dist/components/ui/property-report-dialog.mjs +5 -5
  158. package/dist/components/ui/resource-center/index.mjs +4 -4
  159. package/dist/components/ui/review-alerts-dialog.mjs +4 -4
  160. package/dist/components/ui/savings-goal-modal.mjs +7 -7
  161. package/dist/components/ui/scenario-drawer.mjs +4 -4
  162. package/dist/components/ui/scenario-list.js +4 -7
  163. package/dist/components/ui/scenario-list.mjs +5 -5
  164. package/dist/components/ui/share-details-dialog.mjs +4 -4
  165. package/dist/components/ui/sidebar-nav.mjs +4 -4
  166. package/dist/components/ui/signup-form-primitives.mjs +2 -2
  167. package/dist/components/ui/stage-timeline.mjs +1 -1
  168. package/dist/components/ui/support-agent/index.mjs +2 -2
  169. package/dist/components/ui/top-three-product.mjs +1 -1
  170. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +3 -3
  171. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +5 -5
  172. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -5
  173. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +4 -4
  174. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +5 -5
  175. package/dist/components/ui/transactions-summary-block.js +13 -0
  176. package/dist/components/ui/transactions-summary-block.mjs +13 -0
  177. package/dist/index.js +2092 -1935
  178. package/dist/index.mjs +138 -134
  179. package/dist/lib/format-currency.js +54 -0
  180. package/dist/lib/format-currency.mjs +9 -0
  181. package/dist/styles.css +1 -1
  182. package/package.json +6 -1
  183. package/src/component-descriptions/assets-liabilities-side-card.md +19 -0
  184. package/src/component-descriptions/pipeline-chart.md +17 -0
  185. package/src/components/index.tsx +6 -0
  186. package/src/components/ui/assets-liabilities-side-card.tsx +43 -83
  187. package/src/components/ui/borrowing-capacity-atoms.tsx +4 -7
  188. package/src/components/ui/borrowing-capacity-line-chart.tsx +4 -4
  189. package/src/components/ui/cash-balance-line-chart.tsx +123 -42
  190. package/src/components/ui/cashflow-bar-chart.tsx +7 -4
  191. package/src/components/ui/category-edit-dialog.tsx +1 -1
  192. package/src/components/ui/chart-shared.tsx +4 -4
  193. package/src/components/ui/dashboard-expense-categories.tsx +139 -63
  194. package/src/components/ui/dashboard-transactions-table.tsx +51 -15
  195. package/src/components/ui/expense-bar-chart.tsx +32 -19
  196. package/src/components/ui/expense-categories-bar.tsx +178 -0
  197. package/src/components/ui/income-bar-chart.tsx +32 -19
  198. package/src/components/ui/incoming-outgoings-card.tsx +2 -2
  199. package/src/components/ui/property-mobile-estimate-line-chart.tsx +4 -4
  200. package/src/components/ui/scenario-list.tsx +2 -2
  201. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +7 -5
  202. package/src/components/ui/transactions-summary-block.tsx +39 -6
  203. package/src/styles/styles-css.ts +1 -1
  204. package/tsup.config.ts +2 -0
  205. package/dist/{chunk-CEYEK3TI.mjs → chunk-B4R62ID3.mjs} +3 -3
  206. package/dist/{chunk-7LN5OGC2.mjs → chunk-E3VAK4EB.mjs} +3 -3
  207. package/dist/{chunk-EY36WDCF.mjs → chunk-EEZFXE3P.mjs} +3 -3
  208. package/dist/{chunk-T5FRVEJQ.mjs → chunk-JTMN36BK.mjs} +3 -3
  209. /package/dist/{chunk-MN5NYQCL.mjs → chunk-XQDTFNVL.mjs} +0 -0
@@ -0,0 +1,109 @@
1
+ import {
2
+ Tooltip,
3
+ TooltipContent,
4
+ TooltipTrigger
5
+ } from "./chunk-3S6KVFF5.mjs";
6
+ import {
7
+ formatCurrency
8
+ } from "./chunk-XQDTFNVL.mjs";
9
+ import {
10
+ cn
11
+ } from "./chunk-AFML43VJ.mjs";
12
+
13
+ // src/components/ui/expense-categories-bar.tsx
14
+ import { useState } from "react";
15
+ import { Info } from "lucide-react";
16
+ import { jsx, jsxs } from "react/jsx-runtime";
17
+ function ExpenseCategoriesBar({
18
+ title,
19
+ subtitle,
20
+ tooltipText,
21
+ parts = [],
22
+ icons = [],
23
+ color = "secondary",
24
+ className
25
+ }) {
26
+ const [hoveredIndex, setHoveredIndex] = useState(-1);
27
+ const segmentBase = color === "primary" ? "bg-primary" : "bg-brand-secondary";
28
+ const segmentHover = color === "primary" ? "border-primary/50 bg-primary/60" : "border-brand-secondary/50 bg-brand-secondary/60";
29
+ const iconDefault = color === "primary" ? "[&_svg]:stroke-primary-foreground [&_svg]:text-primary-foreground" : "[&_svg]:stroke-brand-secondary-foreground [&_svg]:text-brand-secondary-foreground";
30
+ const iconHovered = "[&_svg]:stroke-foreground [&_svg]:text-foreground";
31
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col", className), children: [
32
+ (title || subtitle) && /* @__PURE__ */ jsxs("div", { className: "flex items-baseline gap-2", children: [
33
+ title && /* @__PURE__ */ jsx("p", { className: "m-0 overflow-hidden text-ellipsis whitespace-nowrap text-[22px] font-normal leading-tight", children: title }),
34
+ subtitle && /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 items-center gap-1", children: [
35
+ /* @__PURE__ */ jsx("span", { className: "whitespace-nowrap text-sm text-muted-foreground", children: subtitle }),
36
+ tooltipText && /* @__PURE__ */ jsxs(Tooltip, { children: [
37
+ /* @__PURE__ */ jsx(
38
+ TooltipTrigger,
39
+ {
40
+ render: /* @__PURE__ */ jsx(
41
+ "button",
42
+ {
43
+ type: "button",
44
+ className: "flex items-center text-muted-foreground transition-colors hover:text-foreground"
45
+ }
46
+ ),
47
+ children: /* @__PURE__ */ jsx(Info, { className: "size-4" })
48
+ }
49
+ ),
50
+ /* @__PURE__ */ jsx(TooltipContent, { side: "top", children: tooltipText })
51
+ ] })
52
+ ] })
53
+ ] }),
54
+ /* @__PURE__ */ jsx(
55
+ "div",
56
+ {
57
+ className: "mt-4 mb-6 flex h-8 w-full gap-px",
58
+ onMouseLeave: () => setHoveredIndex(-1),
59
+ children: parts.length === 0 ? /* @__PURE__ */ jsx("div", { className: "grow bg-muted" }) : parts.map((part, index) => {
60
+ const isHovered = hoveredIndex === index;
61
+ const showIcon = part.percentage > 0.01;
62
+ const icon = icons[index];
63
+ return /* @__PURE__ */ jsxs(Tooltip, { open: isHovered, children: [
64
+ /* @__PURE__ */ jsx(
65
+ TooltipTrigger,
66
+ {
67
+ render: /* @__PURE__ */ jsx(
68
+ "div",
69
+ {
70
+ className: cn(
71
+ "relative border border-transparent transition-colors duration-200",
72
+ segmentBase,
73
+ isHovered && segmentHover
74
+ ),
75
+ style: {
76
+ flexGrow: Math.max(part.percentage, 1e-4) * 10
77
+ },
78
+ onMouseEnter: () => setHoveredIndex(index)
79
+ }
80
+ ),
81
+ children: showIcon && icon && /* @__PURE__ */ jsx(
82
+ "div",
83
+ {
84
+ className: cn(
85
+ "absolute left-2 top-0 bottom-0 flex items-center [&_svg]:size-4",
86
+ isHovered ? iconHovered : iconDefault
87
+ ),
88
+ children: icon
89
+ }
90
+ )
91
+ }
92
+ ),
93
+ /* @__PURE__ */ jsx(TooltipContent, { side: "top", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5 min-w-[120px]", children: [
94
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
95
+ icon && /* @__PURE__ */ jsx("span", { className: "[&_svg]:size-4", children: icon }),
96
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-semibold leading-tight line-clamp-2", children: part.title })
97
+ ] }),
98
+ /* @__PURE__ */ jsx("span", { className: "self-end text-sm font-bold", children: formatCurrency(part.amount) })
99
+ ] }) })
100
+ ] }, part.id);
101
+ })
102
+ }
103
+ )
104
+ ] });
105
+ }
106
+
107
+ export {
108
+ ExpenseCategoriesBar
109
+ };
@@ -11,7 +11,7 @@ import {
11
11
  FALLBACK_TICK,
12
12
  formatTooltipDate,
13
13
  hexToRgba
14
- } from "./chunk-YEWNFK5S.mjs";
14
+ } from "./chunk-WLXP4OOF.mjs";
15
15
  import {
16
16
  Empty,
17
17
  EmptyDescription
@@ -67,7 +67,8 @@ function IncomeBarChart({
67
67
  height = 280,
68
68
  width = "100%",
69
69
  className,
70
- isLoading = false
70
+ isLoading = false,
71
+ showPeriodSelector = true
71
72
  }) {
72
73
  const periods = CHART_PERIODS[granularity];
73
74
  const [period, setPeriod] = useState(defaultPeriod);
@@ -166,7 +167,7 @@ function IncomeBarChart({
166
167
  stacked: true,
167
168
  grid: { display: false },
168
169
  border: { display: false },
169
- ticks: { font: { size: 10 }, color: FALLBACK_TICK }
170
+ ticks: { font: { size: 12 }, color: FALLBACK_TICK }
170
171
  },
171
172
  y: {
172
173
  display: showYAxis,
@@ -174,7 +175,7 @@ function IncomeBarChart({
174
175
  grid: { display: false },
175
176
  border: { display: false },
176
177
  ticks: {
177
- font: { size: 10 },
178
+ font: { size: 12 },
178
179
  color: FALLBACK_TICK,
179
180
  maxTicksLimit: 5,
180
181
  padding: 8,
@@ -191,9 +192,9 @@ function IncomeBarChart({
191
192
  className: cn("w-full py-4 sm:py-6 gap-2", className),
192
193
  style: { maxWidth: width, fontFamily },
193
194
  children: [
194
- /* @__PURE__ */ jsxs(CardHeader, { className: "px-3 sm:px-6", children: [
195
- /* @__PURE__ */ jsx(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }),
196
- /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx("div", { className: "flex gap-0.5 sm:gap-1", children: periods.map((p) => /* @__PURE__ */ jsx(
195
+ (title || showPeriodSelector) && /* @__PURE__ */ jsxs(CardHeader, { className: "px-3 sm:px-6", children: [
196
+ title && /* @__PURE__ */ jsx(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }),
197
+ showPeriodSelector && /* @__PURE__ */ jsx(CardAction, { children: /* @__PURE__ */ jsx("div", { className: "flex gap-0.5 sm:gap-1", children: periods.map((p) => /* @__PURE__ */ jsx(
197
198
  ChartPeriodButton,
198
199
  {
199
200
  period: p,
@@ -4,7 +4,7 @@ import {
4
4
  import {
5
5
  formatCurrency,
6
6
  formatCurrencyAbbrev
7
- } from "./chunk-MN5NYQCL.mjs";
7
+ } from "./chunk-XQDTFNVL.mjs";
8
8
  import {
9
9
  cn
10
10
  } from "./chunk-AFML43VJ.mjs";
@@ -24,7 +24,7 @@ import {
24
24
  DialogFooter,
25
25
  DialogHeader,
26
26
  DialogTitle
27
- } from "./chunk-T5FRVEJQ.mjs";
27
+ } from "./chunk-JTMN36BK.mjs";
28
28
  import {
29
29
  Avatar,
30
30
  AvatarFallback
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  formatCurrency
3
- } from "./chunk-MN5NYQCL.mjs";
3
+ } from "./chunk-XQDTFNVL.mjs";
4
4
  import {
5
5
  Button
6
6
  } from "./chunk-NOOEKOWY.mjs";
@@ -14,7 +14,7 @@ import {
14
14
  DialogFooter,
15
15
  DialogHeader,
16
16
  DialogTitle
17
- } from "./chunk-T5FRVEJQ.mjs";
17
+ } from "./chunk-JTMN36BK.mjs";
18
18
  import {
19
19
  Spinner
20
20
  } from "./chunk-JVMXMFBB.mjs";
@@ -9,7 +9,7 @@ import {
9
9
  formatMonthLabel,
10
10
  formatTooltipDate,
11
11
  hexToRgba
12
- } from "./chunk-YEWNFK5S.mjs";
12
+ } from "./chunk-WLXP4OOF.mjs";
13
13
  import {
14
14
  Empty,
15
15
  EmptyDescription
@@ -42,7 +42,7 @@ import {
42
42
  DialogFooter,
43
43
  DialogHeader,
44
44
  DialogTitle
45
- } from "./chunk-T5FRVEJQ.mjs";
45
+ } from "./chunk-JTMN36BK.mjs";
46
46
  import {
47
47
  Avatar,
48
48
  AvatarFallback,
@@ -4,17 +4,17 @@ import {
4
4
  TooltipProvider,
5
5
  TooltipTrigger
6
6
  } from "./chunk-3S6KVFF5.mjs";
7
- import {
8
- Accordion,
9
- AccordionContent,
10
- AccordionItem
11
- } from "./chunk-UNACI2YK.mjs";
12
7
  import {
13
8
  formatCurrency
14
- } from "./chunk-MN5NYQCL.mjs";
9
+ } from "./chunk-XQDTFNVL.mjs";
15
10
  import {
16
11
  Button
17
12
  } from "./chunk-NOOEKOWY.mjs";
13
+ import {
14
+ Accordion,
15
+ AccordionContent,
16
+ AccordionItem
17
+ } from "./chunk-UNACI2YK.mjs";
18
18
  import {
19
19
  cn,
20
20
  getInitials
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  formatCurrencyAbbrev
3
- } from "./chunk-MN5NYQCL.mjs";
3
+ } from "./chunk-XQDTFNVL.mjs";
4
4
  import {
5
5
  Button
6
6
  } from "./chunk-NOOEKOWY.mjs";
@@ -117,7 +117,7 @@ function LoanToValueRatio({
117
117
  ] });
118
118
  }
119
119
  function AddScenarioButton({
120
- title = "Compare Loan Options",
120
+ title = "Add New Scenario",
121
121
  disabled = false,
122
122
  onClick,
123
123
  className
@@ -125,13 +125,10 @@ function AddScenarioButton({
125
125
  return /* @__PURE__ */ jsxs(
126
126
  Button,
127
127
  {
128
- variant: "outline-secondary",
128
+ variant: "outline",
129
129
  disabled,
130
130
  onClick,
131
- className: cn(
132
- "w-full justify-between border-dashed text-base",
133
- className
134
- ),
131
+ className: cn("w-full justify-between", className),
135
132
  children: [
136
133
  /* @__PURE__ */ jsx("span", { children: title }),
137
134
  /* @__PURE__ */ jsx(Plus, { size: 18, className: "shrink-0" })
@@ -5,7 +5,7 @@ import {
5
5
  FALLBACK_TICK,
6
6
  formatChartDateLabel,
7
7
  formatTooltipDate
8
- } from "./chunk-YEWNFK5S.mjs";
8
+ } from "./chunk-WLXP4OOF.mjs";
9
9
  import {
10
10
  Empty,
11
11
  EmptyDescription
@@ -19,13 +19,13 @@ import {
19
19
  import {
20
20
  Spinner
21
21
  } from "./chunk-JVMXMFBB.mjs";
22
- import {
23
- useThemeVars
24
- } from "./chunk-XYSRRDBH.mjs";
25
22
  import {
26
23
  formatCurrency,
27
24
  formatCurrencyAbbrev
28
- } from "./chunk-MN5NYQCL.mjs";
25
+ } from "./chunk-XQDTFNVL.mjs";
26
+ import {
27
+ useThemeVars
28
+ } from "./chunk-XYSRRDBH.mjs";
29
29
  import {
30
30
  cn
31
31
  } from "./chunk-AFML43VJ.mjs";
@@ -68,7 +68,8 @@ function CashBalanceLineChart({
68
68
  showYAxis = true,
69
69
  showBalanceValue = false,
70
70
  showLegend = false,
71
- legendPosition = "bottom"
71
+ legendPosition = "bottom",
72
+ extraDatasets
72
73
  }) {
73
74
  const themeVars = useThemeVars();
74
75
  const brandPrimary = themeVars["--theme-primary"] || FALLBACK_PRIMARY;
@@ -83,30 +84,48 @@ function CashBalanceLineChart({
83
84
  indices.add(count - 1);
84
85
  return indices;
85
86
  }, [hasData, chartData]);
87
+ const hasExtra = Array.isArray(extraDatasets) && extraDatasets.length > 0;
86
88
  const data = useMemo(() => {
87
89
  if (!hasData) return { labels: [], datasets: [] };
90
+ const mainDs = {
91
+ label: title,
92
+ data: chartData.map((p) => p.y),
93
+ fill: false,
94
+ borderColor: brandPrimary,
95
+ backgroundColor: "transparent",
96
+ borderWidth: 2.5,
97
+ borderDash: [],
98
+ tension: 0.4,
99
+ pointRadius: 0,
100
+ pointHoverRadius: 6,
101
+ pointHoverBackgroundColor: FALLBACK_BG,
102
+ pointHoverBorderColor: brandPrimary,
103
+ pointHoverBorderWidth: 3,
104
+ pointHitRadius: 10,
105
+ yAxisID: "y"
106
+ };
107
+ const extraDs = hasExtra ? extraDatasets.map((ds) => ({
108
+ label: ds.label,
109
+ data: ds.data.map((p) => p.y),
110
+ fill: false,
111
+ borderColor: ds.color,
112
+ backgroundColor: "transparent",
113
+ borderWidth: 1.5,
114
+ borderDash: ds.dashed ? [5, 4] : [],
115
+ tension: 0.4,
116
+ pointRadius: 0,
117
+ pointHoverRadius: 4,
118
+ pointHoverBackgroundColor: FALLBACK_BG,
119
+ pointHoverBorderColor: ds.color,
120
+ pointHoverBorderWidth: 2,
121
+ pointHitRadius: 10,
122
+ yAxisID: "y2"
123
+ })) : [];
88
124
  return {
89
125
  labels: chartData.map((p) => p.x),
90
- // raw ISO — used for tooltip + tick lookup
91
- datasets: [
92
- {
93
- label: title,
94
- data: chartData.map((p) => p.y),
95
- fill: false,
96
- borderColor: brandPrimary,
97
- backgroundColor: "transparent",
98
- borderWidth: 2.5,
99
- tension: 0.4,
100
- pointRadius: 0,
101
- pointHoverRadius: 6,
102
- pointHoverBackgroundColor: FALLBACK_BG,
103
- pointHoverBorderColor: brandPrimary,
104
- pointHoverBorderWidth: 3,
105
- pointHitRadius: 10
106
- }
107
- ]
126
+ datasets: [mainDs, ...extraDs]
108
127
  };
109
- }, [hasData, chartData, brandPrimary, title]);
128
+ }, [hasData, chartData, brandPrimary, title, hasExtra, extraDatasets]);
110
129
  const options = useMemo(
111
130
  () => ({
112
131
  responsive: true,
@@ -118,11 +137,11 @@ function CashBalanceLineChart({
118
137
  enabled: true,
119
138
  mode: "index",
120
139
  intersect: false,
121
- displayColors: false,
140
+ displayColors: hasExtra,
122
141
  padding: 12,
123
142
  cornerRadius: 0,
124
143
  titleFont: { size: 11, weight: "600", family: fontFamily },
125
- bodyFont: { size: 13, weight: "700", family: fontFamily },
144
+ bodyFont: { size: 12, weight: "500", family: fontFamily },
126
145
  callbacks: {
127
146
  title: (items) => {
128
147
  var _a;
@@ -130,7 +149,8 @@ function CashBalanceLineChart({
130
149
  return iso ? formatDateTooltip(iso) : "";
131
150
  },
132
151
  label: (ctx) => {
133
- return formatCurrency(ctx.parsed.y, { decimals: 2 });
152
+ const value = formatCurrency(ctx.parsed.y, { decimals: 2 });
153
+ return hasExtra ? ` ${ctx.dataset.label}: ${value}` : value;
134
154
  }
135
155
  }
136
156
  }
@@ -147,7 +167,7 @@ function CashBalanceLineChart({
147
167
  maxRotation: 0,
148
168
  minRotation: 0,
149
169
  color: FALLBACK_TICK,
150
- font: { size: 10, family: fontFamily },
170
+ font: { size: 12, family: fontFamily },
151
171
  callback: function(_, index) {
152
172
  if (!tickIndices.has(index) || !chartData) return "";
153
173
  return formatDateLabel(chartData[index].x);
@@ -164,13 +184,27 @@ function CashBalanceLineChart({
164
184
  maxTicksLimit: 5,
165
185
  padding: 8,
166
186
  color: FALLBACK_TICK,
167
- font: { size: 10, family: fontFamily },
187
+ font: { size: 12, family: fontFamily },
188
+ callback: (v) => formatCurrencyAbbrev(Number(v))
189
+ }
190
+ },
191
+ y2: {
192
+ display: hasExtra && showYAxis,
193
+ position: "right",
194
+ beginAtZero: true,
195
+ grid: { display: false },
196
+ border: { display: false },
197
+ ticks: {
198
+ maxTicksLimit: 5,
199
+ padding: 8,
200
+ color: FALLBACK_TICK,
201
+ font: { size: 12, family: fontFamily },
168
202
  callback: (v) => formatCurrencyAbbrev(Number(v))
169
203
  }
170
204
  }
171
205
  }
172
206
  }),
173
- [tickIndices, chartData, showXAxis, showYAxis, fontFamily]
207
+ [tickIndices, chartData, showXAxis, showYAxis, fontFamily, hasExtra]
174
208
  );
175
209
  const latestValue = hasData ? chartData[chartData.length - 1].y : null;
176
210
  return /* @__PURE__ */ jsxs(
@@ -179,9 +213,9 @@ function CashBalanceLineChart({
179
213
  className: cn("w-full py-4 sm:py-6 gap-2", className),
180
214
  style: { maxWidth: width, fontFamily },
181
215
  children: [
182
- /* @__PURE__ */ jsx(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
183
- /* @__PURE__ */ jsx(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }),
184
- showBalanceValue && latestValue !== null && /* @__PURE__ */ jsx("p", { className: "text-2xl font-bold tabular-nums leading-tight", children: formatCurrency(latestValue, { decimals: 2 }) })
216
+ (title || showBalanceValue && latestValue !== null) && /* @__PURE__ */ jsx(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-0.5", children: [
217
+ title && /* @__PURE__ */ jsx(CardTitle, { className: "text-xs font-semibold uppercase tracking-wider text-muted-foreground", children: title }),
218
+ showBalanceValue && latestValue !== null && /* @__PURE__ */ jsx("p", { className: "text-lg font-bold tabular-nums leading-tight", children: formatCurrency(latestValue, { decimals: 2 }) })
185
219
  ] }) }),
186
220
  /* @__PURE__ */ jsx(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ jsx(
187
221
  "div",
@@ -191,14 +225,25 @@ function CashBalanceLineChart({
191
225
  children: /* @__PURE__ */ jsx(Spinner, { size: "lg" })
192
226
  }
193
227
  ) : !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-2", children: [
194
- showLegend && legendPosition === "top" && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5", children: /* @__PURE__ */ jsx(
195
- ChartLegendItem,
196
- {
197
- label: title,
198
- color: brandPrimary,
199
- lineStyle: "solid"
200
- }
201
- ) }),
228
+ showLegend && legendPosition === "top" && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5", children: [
229
+ title && /* @__PURE__ */ jsx(
230
+ ChartLegendItem,
231
+ {
232
+ label: title,
233
+ color: brandPrimary,
234
+ lineStyle: "solid"
235
+ }
236
+ ),
237
+ extraDatasets == null ? void 0 : extraDatasets.map((ds) => /* @__PURE__ */ jsx(
238
+ ChartLegendItem,
239
+ {
240
+ label: ds.label,
241
+ color: ds.color,
242
+ lineStyle: ds.dashed ? "dashed" : "solid"
243
+ },
244
+ ds.label
245
+ ))
246
+ ] }),
202
247
  /* @__PURE__ */ jsx("div", { style: { height, width: "100%", position: "relative" }, children: /* @__PURE__ */ jsx(
203
248
  Chart,
204
249
  {
@@ -209,14 +254,25 @@ function CashBalanceLineChart({
209
254
  },
210
255
  brandPrimary
211
256
  ) }),
212
- showLegend && legendPosition === "bottom" && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5", children: /* @__PURE__ */ jsx(
213
- ChartLegendItem,
214
- {
215
- label: title,
216
- color: brandPrimary,
217
- lineStyle: "solid"
218
- }
219
- ) })
257
+ showLegend && legendPosition === "bottom" && /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-x-4 gap-y-1.5", children: [
258
+ title && /* @__PURE__ */ jsx(
259
+ ChartLegendItem,
260
+ {
261
+ label: title,
262
+ color: brandPrimary,
263
+ lineStyle: "solid"
264
+ }
265
+ ),
266
+ extraDatasets == null ? void 0 : extraDatasets.map((ds) => /* @__PURE__ */ jsx(
267
+ ChartLegendItem,
268
+ {
269
+ label: ds.label,
270
+ color: ds.color,
271
+ lineStyle: ds.dashed ? "dashed" : "solid"
272
+ },
273
+ ds.label
274
+ ))
275
+ ] })
220
276
  ] }) })
221
277
  ]
222
278
  }
@@ -22,19 +22,19 @@ import {
22
22
  DialogFooter,
23
23
  DialogHeader,
24
24
  DialogTitle
25
- } from "./chunk-T5FRVEJQ.mjs";
25
+ } from "./chunk-JTMN36BK.mjs";
26
26
  import {
27
27
  Separator
28
28
  } from "./chunk-2GIYVERS.mjs";
29
29
  import {
30
30
  Spinner
31
31
  } from "./chunk-JVMXMFBB.mjs";
32
+ import {
33
+ formatCurrency
34
+ } from "./chunk-XQDTFNVL.mjs";
32
35
  import {
33
36
  Input
34
37
  } from "./chunk-LBTHZSBT.mjs";
35
- import {
36
- formatCurrency
37
- } from "./chunk-MN5NYQCL.mjs";
38
38
  import {
39
39
  Button
40
40
  } from "./chunk-NOOEKOWY.mjs";
@@ -24,7 +24,7 @@ import {
24
24
  DialogFooter,
25
25
  DialogHeader,
26
26
  DialogTitle
27
- } from "./chunk-T5FRVEJQ.mjs";
27
+ } from "./chunk-JTMN36BK.mjs";
28
28
  import {
29
29
  ToggleGroup,
30
30
  ToggleGroupItem
@@ -4,7 +4,7 @@ import {
4
4
  DialogFooter,
5
5
  DialogHeader,
6
6
  DialogTitle
7
- } from "./chunk-T5FRVEJQ.mjs";
7
+ } from "./chunk-JTMN36BK.mjs";
8
8
  import {
9
9
  Separator
10
10
  } from "./chunk-2GIYVERS.mjs";
@@ -5,7 +5,7 @@ import {
5
5
  DoughnutLegendRow,
6
6
  FALLBACK_PRIMARY,
7
7
  FALLBACK_SECONDARY
8
- } from "./chunk-YEWNFK5S.mjs";
8
+ } from "./chunk-WLXP4OOF.mjs";
9
9
  import {
10
10
  Empty,
11
11
  EmptyDescription
@@ -16,12 +16,12 @@ import {
16
16
  CardHeader,
17
17
  CardTitle
18
18
  } from "./chunk-3VDET466.mjs";
19
+ import {
20
+ formatCurrencyAbbrev
21
+ } from "./chunk-XQDTFNVL.mjs";
19
22
  import {
20
23
  useThemeVars
21
24
  } from "./chunk-XYSRRDBH.mjs";
22
- import {
23
- formatCurrencyAbbrev
24
- } from "./chunk-MN5NYQCL.mjs";
25
25
  import {
26
26
  cn
27
27
  } from "./chunk-AFML43VJ.mjs";
@@ -9,7 +9,7 @@ import {
9
9
  DialogFooter,
10
10
  DialogHeader,
11
11
  DialogTitle
12
- } from "./chunk-T5FRVEJQ.mjs";
12
+ } from "./chunk-JTMN36BK.mjs";
13
13
  import {
14
14
  Avatar,
15
15
  AvatarFallback
@@ -9,7 +9,7 @@ import {
9
9
  formatMonthLabel,
10
10
  formatTooltipDate,
11
11
  hexToRgba
12
- } from "./chunk-YEWNFK5S.mjs";
12
+ } from "./chunk-WLXP4OOF.mjs";
13
13
  import {
14
14
  Empty,
15
15
  EmptyDescription
@@ -26,7 +26,7 @@ import {
26
26
  DialogFooter,
27
27
  DialogHeader,
28
28
  DialogTitle
29
- } from "./chunk-T5FRVEJQ.mjs";
29
+ } from "./chunk-JTMN36BK.mjs";
30
30
  import {
31
31
  Textarea
32
32
  } from "./chunk-BS75ICOO.mjs";
@@ -43,14 +43,14 @@ import {
43
43
  import {
44
44
  Input
45
45
  } from "./chunk-LBTHZSBT.mjs";
46
+ import {
47
+ Button
48
+ } from "./chunk-NOOEKOWY.mjs";
46
49
  import {
47
50
  Accordion,
48
51
  AccordionContent,
49
52
  AccordionItem
50
53
  } from "./chunk-UNACI2YK.mjs";
51
- import {
52
- Button
53
- } from "./chunk-NOOEKOWY.mjs";
54
54
  import {
55
55
  cn
56
56
  } from "./chunk-AFML43VJ.mjs";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  formatCurrencyAbbrev
3
- } from "./chunk-MN5NYQCL.mjs";
3
+ } from "./chunk-XQDTFNVL.mjs";
4
4
  import {
5
5
  Button
6
6
  } from "./chunk-NOOEKOWY.mjs";
@@ -98,7 +98,7 @@ function ChartLegendItem({
98
98
  }
99
99
  }
100
100
  ),
101
- /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground leading-none", children: label })
101
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground leading-none", children: label })
102
102
  ] });
103
103
  }
104
104
  function DoughnutLegendRow({
@@ -121,11 +121,11 @@ function DoughnutLegendRow({
121
121
  }
122
122
  }
123
123
  ),
124
- /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground leading-none truncate", children: label })
124
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground leading-none truncate", children: label })
125
125
  ] }),
126
126
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [
127
- /* @__PURE__ */ jsx("span", { className: "text-[11px] font-medium leading-none", children: formatCurrencyAbbrev(value) }),
128
- /* @__PURE__ */ jsx("span", { className: "text-[11px] text-muted-foreground leading-none w-10 text-right", children: percent })
127
+ /* @__PURE__ */ jsx("span", { className: "text-sm font-medium leading-none", children: formatCurrencyAbbrev(value) }),
128
+ /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground leading-none w-12 text-right", children: percent })
129
129
  ] })
130
130
  ] });
131
131
  }