@wealthx/shadcn 1.2.2 → 1.3.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 (229) hide show
  1. package/.turbo/turbo-build.log +200 -156
  2. package/CHANGELOG.md +22 -0
  3. package/dist/{chunk-4Y6R4WEC.mjs → chunk-2A5RRQGG.mjs} +9 -22
  4. package/dist/{chunk-TS2ZX2VS.mjs → chunk-2UM72RJ7.mjs} +11 -15
  5. package/dist/{chunk-A56YQQHG.mjs → chunk-3NCUZIFP.mjs} +2 -2
  6. package/dist/chunk-3OYFOX3X.mjs +79 -0
  7. package/dist/{chunk-RP3SQYA3.mjs → chunk-3TTACBDP.mjs} +9 -4
  8. package/dist/chunk-4GAWMKMI.mjs +710 -0
  9. package/dist/{chunk-VGSESELX.mjs → chunk-5FQIKDKP.mjs} +5 -5
  10. package/dist/{chunk-K3JYD4IU.mjs → chunk-5IS7G74I.mjs} +11 -4
  11. package/dist/chunk-6AW4KJHE.mjs +235 -0
  12. package/dist/chunk-6CR5N2JW.mjs +302 -0
  13. package/dist/{chunk-XIRTEFKH.mjs → chunk-6DZEXFNB.mjs} +36 -8
  14. package/dist/chunk-6O6KD7CE.mjs +271 -0
  15. package/dist/chunk-7PV3IWCN.mjs +33 -0
  16. package/dist/{chunk-SPJ5KXW7.mjs → chunk-7S5AESZO.mjs} +5 -5
  17. package/dist/{chunk-RYCLWMZ7.mjs → chunk-ABFDMHOR.mjs} +9 -7
  18. package/dist/{chunk-SWGT756Z.mjs → chunk-AMQZRHEZ.mjs} +10 -4
  19. package/dist/{chunk-WAZD7NFU.mjs → chunk-BKNFWEH2.mjs} +6 -6
  20. package/dist/{chunk-CLIN5525.mjs → chunk-C7CQJNMR.mjs} +1 -1
  21. package/dist/{chunk-D4ILTPOG.mjs → chunk-CFMQP5QS.mjs} +5 -4
  22. package/dist/{chunk-VPBN3WOO.mjs → chunk-DGHAXJBN.mjs} +9 -7
  23. package/dist/chunk-DOEO3CDL.mjs +27 -0
  24. package/dist/{chunk-5MEWU56Z.mjs → chunk-DUJTAXMH.mjs} +11 -6
  25. package/dist/{chunk-GGM2UYGG.mjs → chunk-EBXQWIYG.mjs} +10 -4
  26. package/dist/chunk-EWRB4PAD.mjs +468 -0
  27. package/dist/{chunk-ZSHYDDRB.mjs → chunk-FAKPBKLT.mjs} +6 -2
  28. package/dist/chunk-FNQXOAYJ.mjs +169 -0
  29. package/dist/{chunk-A6AAWBPF.mjs → chunk-GHC7LLUX.mjs} +13 -4
  30. package/dist/chunk-HBZLGDIN.mjs +507 -0
  31. package/dist/{chunk-SIZMLSRU.mjs → chunk-HISNT2MG.mjs} +8 -6
  32. package/dist/{chunk-CGH4DRNG.mjs → chunk-HVY6KCCF.mjs} +10 -7
  33. package/dist/chunk-I3RZS7V2.mjs +136 -0
  34. package/dist/chunk-IAE3F7DR.mjs +1962 -0
  35. package/dist/{chunk-UT4KJR7V.mjs → chunk-IHMFS7NZ.mjs} +35 -74
  36. package/dist/{chunk-PCPLO5HT.mjs → chunk-IOJRDS6V.mjs} +96 -14
  37. package/dist/{chunk-LHYCMLVA.mjs → chunk-JKGDCQTZ.mjs} +11 -4
  38. package/dist/{chunk-H45TKD34.mjs → chunk-JMHR3YGZ.mjs} +1 -1
  39. package/dist/{chunk-4MN6UQHG.mjs → chunk-K5A5L6T2.mjs} +17 -39
  40. package/dist/chunk-LV35NGVG.mjs +272 -0
  41. package/dist/{chunk-FZIXGLMV.mjs → chunk-M3FV7LOK.mjs} +5 -12
  42. package/dist/{chunk-FMAXJ2SI.mjs → chunk-MBON7YRJ.mjs} +1 -1
  43. package/dist/chunk-MIZQHHUO.mjs +441 -0
  44. package/dist/chunk-MN5NYQCL.mjs +29 -0
  45. package/dist/chunk-NL3ZO62D.mjs +31 -0
  46. package/dist/{chunk-Q76O3RIQ.mjs → chunk-NMOI6CQD.mjs} +1 -1
  47. package/dist/{chunk-P6AM5V7O.mjs → chunk-OODBHKG7.mjs} +1 -1
  48. package/dist/chunk-PBL4OQV2.mjs +283 -0
  49. package/dist/{chunk-Y4QFWRNR.mjs → chunk-PU4YZQXV.mjs} +17 -18
  50. package/dist/chunk-QMY3AZJH.mjs +80 -0
  51. package/dist/{chunk-BL3DXM2X.mjs → chunk-QZ4RE6NA.mjs} +11 -4
  52. package/dist/{chunk-VACKZOMY.mjs → chunk-R3VSPKNP.mjs} +3 -3
  53. package/dist/{chunk-OPNQAVVH.mjs → chunk-RJI6GKVF.mjs} +8 -6
  54. package/dist/{chunk-WG6JGJXB.mjs → chunk-T4BJLT57.mjs} +1 -1
  55. package/dist/chunk-UMTOX62O.mjs +415 -0
  56. package/dist/{chunk-7MMXNK3C.mjs → chunk-VLARHE5V.mjs} +8 -6
  57. package/dist/{chunk-2I5S2AMY.mjs → chunk-XREGSKX3.mjs} +2 -2
  58. package/dist/{chunk-JNQORUPP.mjs → chunk-YJG55G2H.mjs} +14 -11
  59. package/dist/{chunk-ZRSDX6OW.mjs → chunk-ZC45IGZO.mjs} +33 -30
  60. package/dist/components/ui/add-column-modal.js +42 -14
  61. package/dist/components/ui/add-column-modal.mjs +5 -5
  62. package/dist/components/ui/add-lead-modal.js +42 -11
  63. package/dist/components/ui/add-lead-modal.mjs +3 -3
  64. package/dist/components/ui/advisor-card.js +497 -0
  65. package/dist/components/ui/advisor-card.mjs +13 -0
  66. package/dist/components/ui/ai-assistant-drawer.js +11 -10
  67. package/dist/components/ui/ai-assistant-drawer.mjs +3 -3
  68. package/dist/components/ui/alert-dialog.js +2 -2
  69. package/dist/components/ui/alert-dialog.mjs +2 -2
  70. package/dist/components/ui/appointment-action-dialogs.js +1160 -0
  71. package/dist/components/ui/appointment-action-dialogs.mjs +23 -0
  72. package/dist/components/ui/appointment-availability-settings.js +1590 -0
  73. package/dist/components/ui/appointment-availability-settings.mjs +23 -0
  74. package/dist/components/ui/appointment-book-dialog.js +1744 -0
  75. package/dist/components/ui/appointment-book-dialog.mjs +27 -0
  76. package/dist/components/ui/appointment-calendar-view.js +833 -0
  77. package/dist/components/ui/appointment-calendar-view.mjs +14 -0
  78. package/dist/components/ui/appointment-detail-sheet.js +1517 -0
  79. package/dist/components/ui/appointment-detail-sheet.mjs +24 -0
  80. package/dist/components/ui/appointment-gmail-connect.js +467 -0
  81. package/dist/components/ui/appointment-gmail-connect.mjs +14 -0
  82. package/dist/components/ui/appointment-mini-card.js +345 -0
  83. package/dist/components/ui/appointment-mini-card.mjs +11 -0
  84. package/dist/components/ui/appointment-time-slot-picker.js +311 -0
  85. package/dist/components/ui/appointment-time-slot-picker.mjs +13 -0
  86. package/dist/components/ui/appointment-upcoming-card.js +1268 -0
  87. package/dist/components/ui/appointment-upcoming-card.mjs +21 -0
  88. package/dist/components/ui/backoffice-alert-history-chart.js +11 -5
  89. package/dist/components/ui/backoffice-alert-history-chart.mjs +5 -4
  90. package/dist/components/ui/backoffice-alerts-chart.js +786 -0
  91. package/dist/components/ui/backoffice-alerts-chart.mjs +19 -0
  92. package/dist/components/ui/backoffice-connections-chart.js +817 -0
  93. package/dist/components/ui/backoffice-connections-chart.mjs +19 -0
  94. package/dist/components/ui/backoffice-contact-history-chart.js +11 -5
  95. package/dist/components/ui/backoffice-contact-history-chart.mjs +5 -4
  96. package/dist/components/ui/badge.js +6 -6
  97. package/dist/components/ui/badge.mjs +1 -1
  98. package/dist/components/ui/borrowing-capacity-line-chart.js +30 -21
  99. package/dist/components/ui/borrowing-capacity-line-chart.mjs +5 -4
  100. package/dist/components/ui/button.js +2 -2
  101. package/dist/components/ui/button.mjs +1 -1
  102. package/dist/components/ui/calendar.js +2 -2
  103. package/dist/components/ui/calendar.mjs +2 -2
  104. package/dist/components/ui/card.js +1 -1
  105. package/dist/components/ui/card.mjs +1 -1
  106. package/dist/components/ui/cash-balance-line-chart.js +31 -23
  107. package/dist/components/ui/cash-balance-line-chart.mjs +5 -4
  108. package/dist/components/ui/cashflow-bar-chart.js +12 -5
  109. package/dist/components/ui/cashflow-bar-chart.mjs +5 -4
  110. package/dist/components/ui/chip.js +97 -18
  111. package/dist/components/ui/chip.mjs +3 -2
  112. package/dist/components/ui/color-picker.js +158 -28
  113. package/dist/components/ui/color-picker.mjs +3 -1
  114. package/dist/components/ui/data-table.js +140 -119
  115. package/dist/components/ui/data-table.mjs +3 -2
  116. package/dist/components/ui/date-picker.js +48 -27
  117. package/dist/components/ui/date-picker.mjs +4 -3
  118. package/dist/components/ui/dialog.js +37 -9
  119. package/dist/components/ui/dialog.mjs +2 -2
  120. package/dist/components/ui/expense-bar-chart.js +12 -5
  121. package/dist/components/ui/expense-bar-chart.mjs +5 -4
  122. package/dist/components/ui/field.mjs +2 -2
  123. package/dist/components/ui/financial-cards.js +322 -155
  124. package/dist/components/ui/financial-cards.mjs +5 -3
  125. package/dist/components/ui/financial-drawers.js +2 -2
  126. package/dist/components/ui/financial-drawers.mjs +3 -3
  127. package/dist/components/ui/financial-sections.js +14 -10
  128. package/dist/components/ui/financial-sections.mjs +6 -5
  129. package/dist/components/ui/income-bar-chart.js +12 -5
  130. package/dist/components/ui/income-bar-chart.mjs +5 -4
  131. package/dist/components/ui/input-group.js +2 -2
  132. package/dist/components/ui/input-group.mjs +2 -2
  133. package/dist/components/ui/kanban-column.js +52 -44
  134. package/dist/components/ui/kanban-column.mjs +7 -5
  135. package/dist/components/ui/opportunity-card.js +52 -44
  136. package/dist/components/ui/opportunity-card.mjs +6 -4
  137. package/dist/components/ui/opportunity-edit-modals.js +1367 -1263
  138. package/dist/components/ui/opportunity-edit-modals.mjs +8 -8
  139. package/dist/components/ui/opportunity-summary-tab.js +2744 -2157
  140. package/dist/components/ui/opportunity-summary-tab.mjs +14 -14
  141. package/dist/components/ui/page-header.js +92 -0
  142. package/dist/components/ui/page-header.mjs +8 -0
  143. package/dist/components/ui/page-top-bar.js +88 -0
  144. package/dist/components/ui/page-top-bar.mjs +8 -0
  145. package/dist/components/ui/pagination.js +303 -19
  146. package/dist/components/ui/pagination.mjs +11 -4
  147. package/dist/components/ui/pipeline-board.js +205 -191
  148. package/dist/components/ui/pipeline-board.mjs +9 -7
  149. package/dist/components/ui/pipeline-dialogs.js +114 -65
  150. package/dist/components/ui/pipeline-dialogs.mjs +7 -6
  151. package/dist/components/ui/pipeline-primitives.js +6 -6
  152. package/dist/components/ui/pipeline-primitives.mjs +2 -2
  153. package/dist/components/ui/property-cashflow-doughnut-chart.js +14 -12
  154. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +5 -4
  155. package/dist/components/ui/property-debt-equity-doughnut-chart.js +14 -12
  156. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +5 -4
  157. package/dist/components/ui/property-mobile-estimate-line-chart.js +16 -14
  158. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +5 -4
  159. package/dist/components/ui/sidebar-nav.js +234 -95
  160. package/dist/components/ui/sidebar-nav.mjs +4 -1
  161. package/dist/components/ui/stage-timeline.js +6 -6
  162. package/dist/components/ui/stage-timeline.mjs +3 -3
  163. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +18 -16
  164. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +5 -4
  165. package/dist/components/ui/transactions-income-expense-bar-chart.js +28 -12
  166. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +5 -4
  167. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +18 -16
  168. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +5 -4
  169. package/dist/index.js +12899 -9343
  170. package/dist/index.mjs +256 -190
  171. package/dist/styles.css +1 -1
  172. package/package.json +71 -1
  173. package/src/components/index.tsx +114 -9
  174. package/src/components/ui/add-column-modal.tsx +7 -7
  175. package/src/components/ui/add-lead-modal.tsx +6 -3
  176. package/src/components/ui/advisor-card.tsx +227 -0
  177. package/src/components/ui/ai-assistant-drawer.tsx +4 -3
  178. package/src/components/ui/appointment-action-dialogs.tsx +297 -0
  179. package/src/components/ui/appointment-availability-settings.tsx +645 -0
  180. package/src/components/ui/appointment-book-dialog.tsx +618 -0
  181. package/src/components/ui/appointment-calendar-view.tsx +510 -0
  182. package/src/components/ui/appointment-detail-sheet.tsx +415 -0
  183. package/src/components/ui/appointment-gmail-connect.tsx +188 -0
  184. package/src/components/ui/appointment-mini-card.tsx +104 -0
  185. package/src/components/ui/appointment-time-slot-picker.tsx +123 -0
  186. package/src/components/ui/appointment-upcoming-card.tsx +635 -0
  187. package/src/components/ui/backoffice-alert-history-chart.tsx +10 -2
  188. package/src/components/ui/backoffice-alerts-chart.tsx +312 -0
  189. package/src/components/ui/backoffice-connections-chart.tsx +339 -0
  190. package/src/components/ui/backoffice-contact-history-chart.tsx +10 -2
  191. package/src/components/ui/badge.tsx +12 -6
  192. package/src/components/ui/borrowing-capacity-line-chart.tsx +4 -11
  193. package/src/components/ui/button.tsx +2 -2
  194. package/src/components/ui/card.tsx +1 -1
  195. package/src/components/ui/cash-balance-line-chart.tsx +4 -23
  196. package/src/components/ui/cashflow-bar-chart.tsx +9 -2
  197. package/src/components/ui/chart-shared.tsx +4 -11
  198. package/src/components/ui/chip.tsx +23 -19
  199. package/src/components/ui/color-picker.tsx +4 -2
  200. package/src/components/ui/data-table.tsx +28 -74
  201. package/src/components/ui/date-picker.tsx +42 -37
  202. package/src/components/ui/dialog.tsx +72 -6
  203. package/src/components/ui/expense-bar-chart.tsx +11 -2
  204. package/src/components/ui/financial-cards.tsx +99 -10
  205. package/src/components/ui/income-bar-chart.tsx +11 -2
  206. package/src/components/ui/opportunity-card.tsx +10 -39
  207. package/src/components/ui/opportunity-edit-modals.tsx +98 -36
  208. package/src/components/ui/opportunity-summary-tab.tsx +548 -232
  209. package/src/components/ui/page-header.tsx +57 -0
  210. package/src/components/ui/page-top-bar.tsx +48 -0
  211. package/src/components/ui/pagination.tsx +171 -22
  212. package/src/components/ui/pipeline-board.tsx +12 -5
  213. package/src/components/ui/property-cashflow-doughnut-chart.tsx +3 -1
  214. package/src/components/ui/property-debt-equity-doughnut-chart.tsx +3 -1
  215. package/src/components/ui/property-mobile-estimate-line-chart.tsx +3 -1
  216. package/src/components/ui/sidebar-nav.tsx +36 -37
  217. package/src/components/ui/transactions-expense-categories-doughnut-chart.tsx +3 -1
  218. package/src/components/ui/transactions-income-expense-bar-chart.tsx +12 -9
  219. package/src/components/ui/transactions-liabilities-breakdown-doughnut-chart.tsx +3 -1
  220. package/src/lib/format-currency.ts +44 -0
  221. package/src/lib/format-date.ts +50 -0
  222. package/src/lib/opportunity-constants.ts +12 -0
  223. package/src/styles/globals.css +17 -15
  224. package/src/styles/styles-css.ts +1 -1
  225. package/tsup.config.ts +14 -0
  226. package/dist/chunk-S4QRUQNW.mjs +0 -475
  227. package/dist/chunk-URGMJAE3.mjs +0 -1885
  228. package/dist/chunk-WNGWBVLV.mjs +0 -148
  229. package/dist/{chunk-LLVQKSU3.mjs → chunk-GD4BJDJR.mjs} +3 -3
@@ -134,7 +134,7 @@ function CardHeader(_a) {
134
134
  "div",
135
135
  __spreadValues({
136
136
  className: cn(
137
- "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
137
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-center gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
138
138
  className
139
139
  ),
140
140
  "data-slot": "card-header"
@@ -285,10 +285,10 @@ var buttonVariants = (0, import_class_variance_authority2.cva)(
285
285
  default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
286
286
  secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
287
287
  destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
288
- outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
288
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
289
289
  "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
290
290
  "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
291
- ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs dark:hover:bg-accent/50",
291
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
292
292
  link: "text-primary underline-offset-4 hover:underline"
293
293
  },
294
294
  size: {
@@ -349,6 +349,17 @@ var Button = (0, import_react2.forwardRef)(function Button2(_a, ref) {
349
349
  );
350
350
  });
351
351
 
352
+ // src/lib/format-currency.ts
353
+ function formatCurrencyAbbrev(value) {
354
+ const abs = Math.abs(value);
355
+ const sign = value < 0 ? "-" : "";
356
+ if (abs >= 1e9)
357
+ return `${sign}$${(abs / 1e9).toFixed(1)}B`;
358
+ if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(1)}M`;
359
+ if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(0)}K`;
360
+ return `${sign}$${abs.toFixed(0)}`;
361
+ }
362
+
352
363
  // src/components/ui/chart-shared.tsx
353
364
  var import_jsx_runtime6 = require("react/jsx-runtime");
354
365
  function hexToRgba(hex, alpha) {
@@ -361,15 +372,6 @@ function hexToRgba(hex, alpha) {
361
372
  }
362
373
  var DATASET_ALPHAS = [1, 0.72, 0.52, 0.36, 0.24, 0.15];
363
374
  var FALLBACK_PRIMARY = "#33FF99";
364
- function formatAbbrev(value) {
365
- const abs = Math.abs(value);
366
- const sign = value < 0 ? "-" : "";
367
- if (abs >= 1e9)
368
- return `${sign}$${(abs / 1e9).toFixed(1)}B`;
369
- if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(1)}M`;
370
- if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(0)}K`;
371
- return `${sign}$${abs.toFixed(0)}`;
372
- }
373
375
  function DoughnutLegendRow({
374
376
  label,
375
377
  color,
@@ -393,7 +395,7 @@ function DoughnutLegendRow({
393
395
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] text-muted-foreground leading-none truncate", children: label })
394
396
  ] }),
395
397
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-2 shrink-0", children: [
396
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] font-medium leading-none", children: formatAbbrev(value) }),
398
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] font-medium leading-none", children: formatCurrencyAbbrev(value) }),
397
399
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] text-muted-foreground leading-none w-10 text-right", children: percent })
398
400
  ] })
399
401
  ] });
@@ -462,7 +464,7 @@ function TransactionsExpenseCategoriesDoughnutChart({
462
464
  label: (ctx) => {
463
465
  const val = ctx.raw;
464
466
  const pct = total > 0 ? `${(val / total * 100).toFixed(1)}%` : "0%";
465
- return ` ${ctx.label}: ${formatAbbrev(val)} (${pct})`;
467
+ return ` ${ctx.label}: ${formatCurrencyAbbrev(val)} (${pct})`;
466
468
  }
467
469
  }
468
470
  }
@@ -476,7 +478,7 @@ function TransactionsExpenseCategoriesDoughnutChart({
476
478
  className: cn("w-full py-4 sm:py-6 gap-2", className),
477
479
  style: { maxWidth: width, fontFamily },
478
480
  children: [
479
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-sm sm:text-base", children: title }) }),
481
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }) }),
480
482
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Skeleton, { style: { height, width: "100%" } }) : !hasData ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Empty, { className: "flex-none p-4", style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EmptyDescription, { children: "No data available" }) }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-col gap-4", children: [
481
483
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { height, width: "100%", position: "relative" }, children: [
482
484
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
@@ -501,7 +503,7 @@ function TransactionsExpenseCategoriesDoughnutChart({
501
503
  pointerEvents: "none"
502
504
  },
503
505
  children: [
504
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-base font-semibold leading-tight", children: formatAbbrev(total) }),
506
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-base font-semibold leading-tight", children: formatCurrencyAbbrev(total) }),
505
507
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-[11px] text-muted-foreground leading-none mt-1", children: "Total" })
506
508
  ]
507
509
  }
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  TransactionsExpenseCategoriesDoughnutChart
3
- } from "../../chunk-OPNQAVVH.mjs";
3
+ } from "../../chunk-RJI6GKVF.mjs";
4
4
  import "../../chunk-D6ID6M4V.mjs";
5
- import "../../chunk-FZIXGLMV.mjs";
5
+ import "../../chunk-M3FV7LOK.mjs";
6
+ import "../../chunk-MN5NYQCL.mjs";
6
7
  import "../../chunk-NQPOYKAQ.mjs";
7
- import "../../chunk-CLIN5525.mjs";
8
- import "../../chunk-2I5S2AMY.mjs";
8
+ import "../../chunk-C7CQJNMR.mjs";
9
+ import "../../chunk-XREGSKX3.mjs";
9
10
  import "../../chunk-DBHJ5KC3.mjs";
10
11
  import "../../chunk-FEZKMUCF.mjs";
11
12
  import "../../chunk-QOJ2DQD6.mjs";
@@ -135,7 +135,7 @@ function CardHeader(_a) {
135
135
  "div",
136
136
  __spreadValues({
137
137
  className: cn(
138
- "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
138
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-center gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
139
139
  className
140
140
  ),
141
141
  "data-slot": "card-header"
@@ -240,6 +240,22 @@ function Spinner(_a) {
240
240
  );
241
241
  }
242
242
 
243
+ // src/lib/format-currency.ts
244
+ function formatCurrency(value, options) {
245
+ const { decimals = 0, showSign = false } = options != null ? options : {};
246
+ const abs = Math.abs(value);
247
+ const formatted = new Intl.NumberFormat("en-AU", {
248
+ style: "currency",
249
+ currency: "AUD",
250
+ minimumFractionDigits: decimals,
251
+ maximumFractionDigits: decimals
252
+ }).format(abs);
253
+ if (!showSign) return value < 0 ? `-${formatted}` : formatted;
254
+ if (value > 0) return `+${formatted}`;
255
+ if (value < 0) return `-${formatted}`;
256
+ return formatted;
257
+ }
258
+
243
259
  // src/components/ui/button.tsx
244
260
  var import_react2 = require("react");
245
261
  var import_class_variance_authority3 = require("class-variance-authority");
@@ -302,10 +318,10 @@ var buttonVariants = (0, import_class_variance_authority3.cva)(
302
318
  default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
303
319
  secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
304
320
  destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
305
- outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
321
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
306
322
  "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
307
323
  "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
308
- ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs dark:hover:bg-accent/50",
324
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
309
325
  link: "text-primary underline-offset-4 hover:underline"
310
326
  },
311
327
  size: {
@@ -374,13 +390,13 @@ var FALLBACK_TICK = "#9EAAB5";
374
390
 
375
391
  // src/components/ui/transactions-income-expense-bar-chart.tsx
376
392
  var import_jsx_runtime7 = require("react/jsx-runtime");
377
- import_chart.Chart.register(import_chart.CategoryScale, import_chart.LinearScale, import_chart.BarController, import_chart.BarElement, import_chart.Tooltip);
378
- function formatDollar(value) {
379
- return `$${value.toLocaleString(void 0, {
380
- minimumFractionDigits: 2,
381
- maximumFractionDigits: 2
382
- })}`;
383
- }
393
+ import_chart.Chart.register(
394
+ import_chart.CategoryScale,
395
+ import_chart.LinearScale,
396
+ import_chart.BarController,
397
+ import_chart.BarElement,
398
+ import_chart.Tooltip
399
+ );
384
400
  function TransactionsIncomeExpenseBarChart({
385
401
  totalIncome,
386
402
  totalExpense,
@@ -423,7 +439,7 @@ function TransactionsIncomeExpenseBarChart({
423
439
  color: FALLBACK_SECONDARY,
424
440
  textAlign: "left",
425
441
  // Returns array for multi-line: dollar value on line 1, blank on line 2
426
- formatter: (v) => [formatDollar(v), ""]
442
+ formatter: (v) => [formatCurrency(v, { decimals: 2 }), ""]
427
443
  },
428
444
  name: {
429
445
  anchor: "end",
@@ -487,7 +503,7 @@ function TransactionsIncomeExpenseBarChart({
487
503
  className: cn("w-full py-4 sm:py-6 gap-2", className),
488
504
  style: { maxWidth: width, fontFamily },
489
505
  children: [
490
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-sm sm:text-base", children: title }) }),
506
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }) }),
491
507
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
492
508
  "div",
493
509
  {
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  TransactionsIncomeExpenseBarChart
3
- } from "../../chunk-JNQORUPP.mjs";
4
- import "../../chunk-FZIXGLMV.mjs";
3
+ } from "../../chunk-YJG55G2H.mjs";
4
+ import "../../chunk-M3FV7LOK.mjs";
5
+ import "../../chunk-MN5NYQCL.mjs";
5
6
  import "../../chunk-NQPOYKAQ.mjs";
6
- import "../../chunk-CLIN5525.mjs";
7
+ import "../../chunk-C7CQJNMR.mjs";
7
8
  import "../../chunk-7YAU5CY6.mjs";
8
- import "../../chunk-2I5S2AMY.mjs";
9
+ import "../../chunk-XREGSKX3.mjs";
9
10
  import "../../chunk-DBHJ5KC3.mjs";
10
11
  import "../../chunk-FEZKMUCF.mjs";
11
12
  import "../../chunk-QOJ2DQD6.mjs";
@@ -134,7 +134,7 @@ function CardHeader(_a) {
134
134
  "div",
135
135
  __spreadValues({
136
136
  className: cn(
137
- "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
137
+ "@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-center gap-2 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6",
138
138
  className
139
139
  ),
140
140
  "data-slot": "card-header"
@@ -285,10 +285,10 @@ var buttonVariants = (0, import_class_variance_authority2.cva)(
285
285
  default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90",
286
286
  secondary: "bg-brand-secondary text-brand-secondary-foreground shadow-xs hover:bg-brand-secondary/80 focus-visible:ring-brand-secondary/30",
287
287
  destructive: "bg-destructive text-destructive-foreground shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:bg-destructive/60 dark:focus-visible:ring-destructive/40",
288
- outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
288
+ outline: "border border-input bg-background shadow-xs hover:bg-accent hover:text-accent-foreground focus-visible:ring-border/50 dark:bg-input/30 dark:border-input dark:hover:bg-input/50",
289
289
  "outline-primary": "border border-primary text-foreground bg-transparent shadow-xs hover:bg-primary/5 focus-visible:ring-primary/50",
290
290
  "outline-secondary": "border border-brand-secondary text-brand-secondary bg-transparent shadow-xs hover:bg-brand-secondary/10 focus-visible:ring-brand-secondary/30",
291
- ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs dark:hover:bg-accent/50",
291
+ ghost: "hover:bg-accent hover:text-accent-foreground hover:shadow-xs focus-visible:ring-border/50 dark:hover:bg-accent/50",
292
292
  link: "text-primary underline-offset-4 hover:underline"
293
293
  },
294
294
  size: {
@@ -349,6 +349,17 @@ var Button = (0, import_react2.forwardRef)(function Button2(_a, ref) {
349
349
  );
350
350
  });
351
351
 
352
+ // src/lib/format-currency.ts
353
+ function formatCurrencyAbbrev(value) {
354
+ const abs = Math.abs(value);
355
+ const sign = value < 0 ? "-" : "";
356
+ if (abs >= 1e9)
357
+ return `${sign}$${(abs / 1e9).toFixed(1)}B`;
358
+ if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(1)}M`;
359
+ if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(0)}K`;
360
+ return `${sign}$${abs.toFixed(0)}`;
361
+ }
362
+
352
363
  // src/components/ui/chart-shared.tsx
353
364
  var import_jsx_runtime6 = require("react/jsx-runtime");
354
365
  function hexToRgba(hex, alpha) {
@@ -361,15 +372,6 @@ function hexToRgba(hex, alpha) {
361
372
  }
362
373
  var DATASET_ALPHAS = [1, 0.72, 0.52, 0.36, 0.24, 0.15];
363
374
  var FALLBACK_PRIMARY = "#33FF99";
364
- function formatAbbrev(value) {
365
- const abs = Math.abs(value);
366
- const sign = value < 0 ? "-" : "";
367
- if (abs >= 1e9)
368
- return `${sign}$${(abs / 1e9).toFixed(1)}B`;
369
- if (abs >= 1e6) return `${sign}$${(abs / 1e6).toFixed(1)}M`;
370
- if (abs >= 1e3) return `${sign}$${(abs / 1e3).toFixed(0)}K`;
371
- return `${sign}$${abs.toFixed(0)}`;
372
- }
373
375
  function DoughnutLegendRow({
374
376
  label,
375
377
  color,
@@ -393,7 +395,7 @@ function DoughnutLegendRow({
393
395
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] text-muted-foreground leading-none truncate", children: label })
394
396
  ] }),
395
397
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className: "flex items-center gap-2 shrink-0", children: [
396
- /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] font-medium leading-none", children: formatAbbrev(value) }),
398
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] font-medium leading-none", children: formatCurrencyAbbrev(value) }),
397
399
  /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { className: "text-[11px] text-muted-foreground leading-none w-10 text-right", children: percent })
398
400
  ] })
399
401
  ] });
@@ -462,7 +464,7 @@ function TransactionsLiabilitiesBreakdownChart({
462
464
  label: (ctx) => {
463
465
  const val = ctx.raw;
464
466
  const pct = total > 0 ? `${(val / total * 100).toFixed(1)}%` : "0%";
465
- return ` ${ctx.label}: ${formatAbbrev(val)} (${pct})`;
467
+ return ` ${ctx.label}: ${formatCurrencyAbbrev(val)} (${pct})`;
466
468
  }
467
469
  }
468
470
  }
@@ -476,7 +478,7 @@ function TransactionsLiabilitiesBreakdownChart({
476
478
  className: cn("w-full py-4 sm:py-6 gap-2", className),
477
479
  style: { maxWidth: width, fontFamily },
478
480
  children: [
479
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-sm sm:text-base", children: title }) }),
481
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardHeader, { className: "px-3 sm:px-6", children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardTitle, { className: "text-xs font-semibold uppercase tracking-wide", children: title }) }),
480
482
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(CardContent, { className: "px-3 sm:px-6", children: isLoading ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Skeleton, { style: { height, width: "100%" } }) : !hasData ? /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(Empty, { className: "flex-none p-4", style: { height }, children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(EmptyDescription, { children: "No data available" }) }) : /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { className: "flex flex-col gap-4", children: [
481
483
  /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)("div", { style: { height, width: "100%", position: "relative" }, children: [
482
484
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
@@ -501,7 +503,7 @@ function TransactionsLiabilitiesBreakdownChart({
501
503
  pointerEvents: "none"
502
504
  },
503
505
  children: [
504
- /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-base font-semibold leading-tight", children: formatAbbrev(total) }),
506
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-base font-semibold leading-tight", children: formatCurrencyAbbrev(total) }),
505
507
  /* @__PURE__ */ (0, import_jsx_runtime7.jsx)("div", { className: "text-[11px] text-muted-foreground leading-none mt-1", children: "Total" })
506
508
  ]
507
509
  }
@@ -1,11 +1,12 @@
1
1
  import {
2
2
  TransactionsLiabilitiesBreakdownChart
3
- } from "../../chunk-SIZMLSRU.mjs";
3
+ } from "../../chunk-HISNT2MG.mjs";
4
4
  import "../../chunk-D6ID6M4V.mjs";
5
- import "../../chunk-FZIXGLMV.mjs";
5
+ import "../../chunk-M3FV7LOK.mjs";
6
+ import "../../chunk-MN5NYQCL.mjs";
6
7
  import "../../chunk-NQPOYKAQ.mjs";
7
- import "../../chunk-CLIN5525.mjs";
8
- import "../../chunk-2I5S2AMY.mjs";
8
+ import "../../chunk-C7CQJNMR.mjs";
9
+ import "../../chunk-XREGSKX3.mjs";
9
10
  import "../../chunk-DBHJ5KC3.mjs";
10
11
  import "../../chunk-FEZKMUCF.mjs";
11
12
  import "../../chunk-QOJ2DQD6.mjs";