@wealthx/shadcn 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/.turbo/turbo-build.log +193 -149
  2. package/CHANGELOG.md +28 -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-A6AAWBPF.mjs → chunk-GHC7LLUX.mjs} +13 -4
  29. package/dist/chunk-HBZLGDIN.mjs +507 -0
  30. package/dist/{chunk-SIZMLSRU.mjs → chunk-HISNT2MG.mjs} +8 -6
  31. package/dist/{chunk-CGH4DRNG.mjs → chunk-HVY6KCCF.mjs} +10 -7
  32. package/dist/chunk-I3RZS7V2.mjs +136 -0
  33. package/dist/chunk-IAE3F7DR.mjs +1962 -0
  34. package/dist/{chunk-UT4KJR7V.mjs → chunk-IHMFS7NZ.mjs} +35 -74
  35. package/dist/{chunk-PCPLO5HT.mjs → chunk-IOJRDS6V.mjs} +96 -14
  36. package/dist/{chunk-LHYCMLVA.mjs → chunk-JKGDCQTZ.mjs} +11 -4
  37. package/dist/{chunk-H45TKD34.mjs → chunk-JMHR3YGZ.mjs} +1 -1
  38. package/dist/{chunk-4MN6UQHG.mjs → chunk-K5A5L6T2.mjs} +17 -39
  39. package/dist/chunk-LV35NGVG.mjs +272 -0
  40. package/dist/{chunk-FZIXGLMV.mjs → chunk-M3FV7LOK.mjs} +5 -12
  41. package/dist/{chunk-FMAXJ2SI.mjs → chunk-MBON7YRJ.mjs} +1 -1
  42. package/dist/chunk-MIZQHHUO.mjs +441 -0
  43. package/dist/chunk-MLNEWRWV.mjs +449 -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-Q2BGOAMG.mjs +202 -0
  51. package/dist/chunk-QMY3AZJH.mjs +80 -0
  52. package/dist/{chunk-BL3DXM2X.mjs → chunk-QZ4RE6NA.mjs} +11 -4
  53. package/dist/{chunk-VACKZOMY.mjs → chunk-R3VSPKNP.mjs} +3 -3
  54. package/dist/{chunk-OPNQAVVH.mjs → chunk-RJI6GKVF.mjs} +8 -6
  55. package/dist/{chunk-WG6JGJXB.mjs → chunk-T4BJLT57.mjs} +1 -1
  56. package/dist/chunk-UMTOX62O.mjs +415 -0
  57. package/dist/{chunk-7MMXNK3C.mjs → chunk-VLARHE5V.mjs} +8 -6
  58. package/dist/{chunk-2I5S2AMY.mjs → chunk-XREGSKX3.mjs} +2 -2
  59. package/dist/{chunk-JNQORUPP.mjs → chunk-YJG55G2H.mjs} +14 -11
  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 +530 -0
  65. package/dist/components/ui/advisor-card.mjs +15 -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 +426 -191
  160. package/dist/components/ui/sidebar-nav.mjs +5 -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 +12258 -8611
  170. package/dist/index.mjs +258 -190
  171. package/dist/styles.css +1 -1
  172. package/package.json +71 -1
  173. package/src/components/index.tsx +115 -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 +284 -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 +213 -157
  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-ZRSDX6OW.mjs +0 -385
  230. package/dist/{chunk-LLVQKSU3.mjs → chunk-GD4BJDJR.mjs} +3 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wealthx/shadcn",
3
- "version": "1.2.2",
3
+ "version": "1.3.1",
4
4
  "main": "./dist/index.js",
5
5
  "module": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -173,6 +173,16 @@
173
173
  "import": "./dist/components/ui/alert.mjs",
174
174
  "require": "./dist/components/ui/alert.js"
175
175
  },
176
+ "./page-header": {
177
+ "types": "./src/components/ui/page-header.tsx",
178
+ "import": "./dist/components/ui/page-header.mjs",
179
+ "require": "./dist/components/ui/page-header.js"
180
+ },
181
+ "./page-top-bar": {
182
+ "types": "./src/components/ui/page-top-bar.tsx",
183
+ "import": "./dist/components/ui/page-top-bar.mjs",
184
+ "require": "./dist/components/ui/page-top-bar.js"
185
+ },
176
186
  "./pagination": {
177
187
  "types": "./src/components/ui/pagination.tsx",
178
188
  "import": "./dist/components/ui/pagination.mjs",
@@ -368,6 +378,16 @@
368
378
  "import": "./dist/components/ui/backoffice-alert-history-chart.mjs",
369
379
  "require": "./dist/components/ui/backoffice-alert-history-chart.js"
370
380
  },
381
+ "./backoffice-alerts-chart": {
382
+ "types": "./src/components/ui/backoffice-alerts-chart.tsx",
383
+ "import": "./dist/components/ui/backoffice-alerts-chart.mjs",
384
+ "require": "./dist/components/ui/backoffice-alerts-chart.js"
385
+ },
386
+ "./backoffice-connections-chart": {
387
+ "types": "./src/components/ui/backoffice-connections-chart.tsx",
388
+ "import": "./dist/components/ui/backoffice-connections-chart.mjs",
389
+ "require": "./dist/components/ui/backoffice-connections-chart.js"
390
+ },
371
391
  "./pipeline-primitives": {
372
392
  "types": "./src/components/ui/pipeline-primitives.tsx",
373
393
  "import": "./dist/components/ui/pipeline-primitives.mjs",
@@ -447,6 +467,56 @@
447
467
  "types": "./src/components/ui/sidebar-nav.tsx",
448
468
  "import": "./dist/components/ui/sidebar-nav.mjs",
449
469
  "require": "./dist/components/ui/sidebar-nav.js"
470
+ },
471
+ "./appointment-time-slot-picker": {
472
+ "types": "./src/components/ui/appointment-time-slot-picker.tsx",
473
+ "import": "./dist/components/ui/appointment-time-slot-picker.mjs",
474
+ "require": "./dist/components/ui/appointment-time-slot-picker.js"
475
+ },
476
+ "./advisor-card": {
477
+ "types": "./src/components/ui/advisor-card.tsx",
478
+ "import": "./dist/components/ui/advisor-card.mjs",
479
+ "require": "./dist/components/ui/advisor-card.js"
480
+ },
481
+ "./appointment-upcoming-card": {
482
+ "types": "./src/components/ui/appointment-upcoming-card.tsx",
483
+ "import": "./dist/components/ui/appointment-upcoming-card.mjs",
484
+ "require": "./dist/components/ui/appointment-upcoming-card.js"
485
+ },
486
+ "./appointment-mini-card": {
487
+ "types": "./src/components/ui/appointment-mini-card.tsx",
488
+ "import": "./dist/components/ui/appointment-mini-card.mjs",
489
+ "require": "./dist/components/ui/appointment-mini-card.js"
490
+ },
491
+ "./appointment-gmail-connect": {
492
+ "types": "./src/components/ui/appointment-gmail-connect.tsx",
493
+ "import": "./dist/components/ui/appointment-gmail-connect.mjs",
494
+ "require": "./dist/components/ui/appointment-gmail-connect.js"
495
+ },
496
+ "./appointment-calendar-view": {
497
+ "types": "./src/components/ui/appointment-calendar-view.tsx",
498
+ "import": "./dist/components/ui/appointment-calendar-view.mjs",
499
+ "require": "./dist/components/ui/appointment-calendar-view.js"
500
+ },
501
+ "./appointment-action-dialogs": {
502
+ "types": "./src/components/ui/appointment-action-dialogs.tsx",
503
+ "import": "./dist/components/ui/appointment-action-dialogs.mjs",
504
+ "require": "./dist/components/ui/appointment-action-dialogs.js"
505
+ },
506
+ "./appointment-book-dialog": {
507
+ "types": "./src/components/ui/appointment-book-dialog.tsx",
508
+ "import": "./dist/components/ui/appointment-book-dialog.mjs",
509
+ "require": "./dist/components/ui/appointment-book-dialog.js"
510
+ },
511
+ "./appointment-detail-sheet": {
512
+ "types": "./src/components/ui/appointment-detail-sheet.tsx",
513
+ "import": "./dist/components/ui/appointment-detail-sheet.mjs",
514
+ "require": "./dist/components/ui/appointment-detail-sheet.js"
515
+ },
516
+ "./appointment-availability-settings": {
517
+ "types": "./src/components/ui/appointment-availability-settings.tsx",
518
+ "import": "./dist/components/ui/appointment-availability-settings.mjs",
519
+ "require": "./dist/components/ui/appointment-availability-settings.js"
450
520
  }
451
521
  }
452
522
  }
@@ -11,6 +11,22 @@ export type {
11
11
  AccordionContentProps,
12
12
  } from "./ui/accordion";
13
13
 
14
+ export { AdvisorCard, AdvisorInviteCard } from "./ui/advisor-card";
15
+ export type {
16
+ AdvisorCardProps,
17
+ AdvisorInviteCardProps,
18
+ AdvisorAppointmentStrip,
19
+ } from "./ui/advisor-card";
20
+
21
+ export { AppointmentUpcomingCard } from "./ui/appointment-upcoming-card";
22
+ export type {
23
+ AppointmentUpcomingCardProps,
24
+ AppointmentUpcomingData,
25
+ AppointmentUpcomingAdvisor,
26
+ AppointmentUpcomingStatus,
27
+ AppointmentUpcomingSlot,
28
+ } from "./ui/appointment-upcoming-card";
29
+
14
30
  export { AddColumnModal } from "./ui/add-column-modal";
15
31
  export type {
16
32
  AddColumnModalProps,
@@ -65,6 +81,72 @@ export type {
65
81
  AlertDialogTriggerProps,
66
82
  } from "./ui/alert-dialog";
67
83
 
84
+ export { AppointmentAvailabilitySettings } from "./ui/appointment-availability-settings";
85
+ export type {
86
+ AppointmentAvailabilitySettingsProps,
87
+ AppointmentAvailabilityPrefs,
88
+ AppointmentBlockedDate,
89
+ AppointmentDaySchedule,
90
+ } from "./ui/appointment-availability-settings";
91
+
92
+ export {
93
+ AppointmentConfirmDialog,
94
+ AppointmentRescheduleDialog,
95
+ } from "./ui/appointment-action-dialogs";
96
+ export type {
97
+ AppointmentConfirmAction,
98
+ AppointmentConfirmDialogProps,
99
+ AppointmentRescheduleDialogProps,
100
+ } from "./ui/appointment-action-dialogs";
101
+
102
+ export { AppointmentBookDialog } from "./ui/appointment-book-dialog";
103
+ export type {
104
+ AppointmentBookDialogProps,
105
+ AppointmentBookingSlot,
106
+ AppointmentClient,
107
+ AppointmentOfflineLocation,
108
+ } from "./ui/appointment-book-dialog";
109
+
110
+ export { AppointmentCalendarView } from "./ui/appointment-calendar-view";
111
+ export type {
112
+ AppointmentCalendarViewProps,
113
+ AppointmentCalendarItem,
114
+ AppointmentWeekDay,
115
+ } from "./ui/appointment-calendar-view";
116
+
117
+ export { AppointmentDetailSheet } from "./ui/appointment-detail-sheet";
118
+ export type {
119
+ AppointmentDetailSheetProps,
120
+ AppointmentDetailItem,
121
+ AppointmentClientProfile,
122
+ LoanApplicationStatus,
123
+ } from "./ui/appointment-detail-sheet";
124
+
125
+ export { AppointmentGmailConnect } from "./ui/appointment-gmail-connect";
126
+ export type {
127
+ AppointmentGmailConnectProps,
128
+ GmailConnection,
129
+ GmailConnectionState,
130
+ } from "./ui/appointment-gmail-connect";
131
+
132
+ export { AppointmentMiniCard } from "./ui/appointment-mini-card";
133
+ export type {
134
+ AppointmentMiniCardProps,
135
+ AppointmentMiniCardItem,
136
+ } from "./ui/appointment-mini-card";
137
+
138
+ export {
139
+ AppointmentTimeSlotPicker,
140
+ AppointmentSlotSection,
141
+ } from "./ui/appointment-time-slot-picker";
142
+ export type {
143
+ AppointmentTimeSlotPickerProps,
144
+ AppointmentSlotSectionProps,
145
+ AppointmentTimeSlot,
146
+ AppointmentStatus,
147
+ AppointmentMeetingFormat,
148
+ } from "./ui/appointment-time-slot-picker";
149
+
68
150
  export {
69
151
  Avatar,
70
152
  AvatarImage,
@@ -89,6 +171,20 @@ export type {
89
171
  AlertHistoryPeriod,
90
172
  } from "./ui/backoffice-alert-history-chart";
91
173
 
174
+ export { BackofficeAlertsChart } from "./ui/backoffice-alerts-chart";
175
+ export type {
176
+ BackofficeAlertsChartProps,
177
+ AlertSummaryDataPoint,
178
+ AlertSummaryPeriod,
179
+ } from "./ui/backoffice-alerts-chart";
180
+
181
+ export { BackofficeConnectionsChart } from "./ui/backoffice-connections-chart";
182
+ export type {
183
+ BackofficeConnectionsChartProps,
184
+ ConnectionSummaryDataPoint,
185
+ ConnectionSummaryPeriod,
186
+ } from "./ui/backoffice-connections-chart";
187
+
92
188
  export { BackofficeContactHistoryChart } from "./ui/backoffice-contact-history-chart";
93
189
  export type {
94
190
  BackofficeContactHistoryChartProps,
@@ -531,6 +627,15 @@ export type {
531
627
  export { OpportunitySummaryTab } from "./ui/opportunity-summary-tab";
532
628
  export type { OpportunitySummaryTabProps } from "./ui/opportunity-summary-tab";
533
629
 
630
+ export { SidebarNav } from "./ui/sidebar-nav";
631
+ export type {
632
+ SidebarNavProps,
633
+ SidebarNavItem,
634
+ SidebarNavSubItem,
635
+ SidebarNavMetricItem,
636
+ SidebarNavMetricsGroup,
637
+ } from "./ui/sidebar-nav";
638
+
534
639
  export {
535
640
  Pagination,
536
641
  PaginationContent,
@@ -539,6 +644,8 @@ export {
539
644
  PaginationPrevious,
540
645
  PaginationNext,
541
646
  PaginationEllipsis,
647
+ PaginationNavButtons,
648
+ TablePagination,
542
649
  } from "./ui/pagination";
543
650
  export type {
544
651
  PaginationProps,
@@ -548,6 +655,8 @@ export type {
548
655
  PaginationPreviousProps,
549
656
  PaginationNextProps,
550
657
  PaginationEllipsisProps,
658
+ PaginationNavButtonsProps,
659
+ TablePaginationProps,
551
660
  } from "./ui/pagination";
552
661
 
553
662
  export { PipelineAlerts } from "./ui/pipeline-alerts";
@@ -603,6 +712,12 @@ export type {
603
712
  PopoverDescriptionProps,
604
713
  } from "./ui/popover";
605
714
 
715
+ export { PageHeader } from "./ui/page-header";
716
+ export type { PageHeaderProps } from "./ui/page-header";
717
+
718
+ export { PageTopBar } from "./ui/page-top-bar";
719
+ export type { PageTopBarProps } from "./ui/page-top-bar";
720
+
606
721
  export { Progress } from "./ui/progress";
607
722
  export type { ProgressProps } from "./ui/progress";
608
723
 
@@ -654,15 +769,6 @@ export type {
654
769
  export { Separator } from "./ui/separator";
655
770
  export type { SeparatorProps } from "./ui/separator";
656
771
 
657
- export { SidebarNav } from "./ui/sidebar-nav";
658
- export type {
659
- SidebarNavProps,
660
- SidebarNavSubItem,
661
- SidebarNavItem,
662
- SidebarNavMetricItem,
663
- SidebarNavMetricsGroup,
664
- } from "./ui/sidebar-nav";
665
-
666
772
  export {
667
773
  Sheet,
668
774
  SheetClose,
@@ -8,7 +8,7 @@ import {
8
8
  DialogTitle,
9
9
  DialogFooter,
10
10
  } from "@/components/ui/dialog";
11
- import { Button, buttonVariants } from "@/components/ui/button";
11
+ import { Button } from "@/components/ui/button";
12
12
  import { Input } from "@/components/ui/input";
13
13
  import { Label } from "@/components/ui/label";
14
14
  import { Separator } from "@/components/ui/separator";
@@ -262,17 +262,17 @@ export function AddColumnModal({
262
262
  className="flex-1"
263
263
  disabled={loading}
264
264
  />
265
- <button
265
+ <Button
266
+ type="button"
267
+ variant="ghost"
268
+ size="icon"
266
269
  onClick={() => removeTask(task.id)}
267
270
  disabled={loading}
268
- className={cn(
269
- buttonVariants({ variant: "ghost", size: "icon" }),
270
- "size-9 shrink-0 text-muted-foreground hover:text-destructive",
271
- )}
271
+ className="size-9 shrink-0 text-muted-foreground hover:text-destructive"
272
272
  aria-label="Remove task"
273
273
  >
274
274
  <Trash2 className="size-4" />
275
- </button>
275
+ </Button>
276
276
  </div>
277
277
 
278
278
  {aiAgents.length > 0 && (
@@ -126,13 +126,16 @@ export function AddLeadModal({
126
126
  disabled={isSubmitting}
127
127
  />
128
128
  {searchValue && (
129
- <button
129
+ <Button
130
+ type="button"
131
+ variant="ghost"
132
+ size="icon"
130
133
  onClick={() => onSearchChange?.("")}
131
- className="absolute right-2.5 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground"
134
+ className="absolute right-2.5 top-1/2 size-6 -translate-y-1/2 text-muted-foreground hover:text-foreground"
132
135
  aria-label="Clear search"
133
136
  >
134
137
  <X className="size-3.5" />
135
- </button>
138
+ </Button>
136
139
  )}
137
140
  </div>
138
141
 
@@ -0,0 +1,284 @@
1
+ import React from "react";
2
+ import { Badge } from "./badge";
3
+ import { Button } from "./button";
4
+ import { Avatar, AvatarFallback, AvatarImage } from "./avatar";
5
+ import { Separator } from "./separator";
6
+ import {
7
+ Calendar,
8
+ CalendarCheck,
9
+ ChevronRight,
10
+ Mail,
11
+ MoreVertical,
12
+ Phone,
13
+ Plus,
14
+ } from "lucide-react";
15
+ import type { AppointmentStatus } from "./appointment-time-slot-picker";
16
+
17
+ // ---------------------------------------------------------------------------
18
+ // Types
19
+ // ---------------------------------------------------------------------------
20
+
21
+ /** Appointment data shown in the strip inside the advisor card */
22
+ export interface AdvisorAppointmentStrip {
23
+ status: AppointmentStatus;
24
+ /** Human-readable appointment type — e.g. "Financial Review" */
25
+ appointmentType?: string;
26
+ /** Display date string — e.g. "Wed, 23 Apr 2026" */
27
+ date: string;
28
+ /** Display start time — e.g. "2:00 PM" */
29
+ timeStart: string;
30
+ /** Display end time — e.g. "2:30 PM" */
31
+ timeEnd: string;
32
+ }
33
+
34
+ export interface AdvisorCardProps {
35
+ /** Advisor full name */
36
+ name: string;
37
+ /** Job title / role label */
38
+ role: string;
39
+ /** Phone number string */
40
+ phone: string;
41
+ /** Email address */
42
+ email: string;
43
+ /** Broker company name — shown as text fallback when no logo is provided */
44
+ companyName?: string;
45
+ /** URL of the broker company logo — renders as avatar image */
46
+ companyLogoUrl?: string;
47
+ /** Explicit initials for the avatar fallback; derived from companyName if omitted */
48
+ avatarInitials?: string;
49
+ /** Whether this is the client's primary assigned advisor */
50
+ isPrimary?: boolean;
51
+ /**
52
+ * Upcoming appointments shown as stacked strips.
53
+ * - `undefined` — strip section hidden
54
+ * - `null` or `[]` — empty state: "No upcoming appointments"
55
+ * - array of items — one coloured strip per appointment
56
+ */
57
+ appointments?: AdvisorAppointmentStrip[] | null;
58
+ /** Called when "Refer [name] to Others" is clicked */
59
+ onRefer?: () => void;
60
+ /** Called when the ⋮ overflow menu is clicked */
61
+ onMoreOptions?: () => void;
62
+ /** Called when "Book Appointment" is clicked */
63
+ onBookAppointment?: () => void;
64
+ /** Called when "View →" in an appointment strip is clicked; receives the appointment index */
65
+ onViewAppointment?: (index: number) => void;
66
+ }
67
+
68
+ export interface AdvisorInviteCardProps {
69
+ /** Called when the "Add Advisor" CTA is clicked */
70
+ onInvite?: () => void;
71
+ }
72
+
73
+ // ---------------------------------------------------------------------------
74
+ // Status config
75
+ // ---------------------------------------------------------------------------
76
+
77
+ const STATUS_VARIANT: Record<
78
+ AppointmentStatus,
79
+ "warning" | "success" | "destructive" | "info"
80
+ > = {
81
+ pending: "warning",
82
+ confirmed: "success",
83
+ cancelled: "destructive",
84
+ rescheduled: "info",
85
+ };
86
+
87
+ const STATUS_LABEL: Record<AppointmentStatus, string> = {
88
+ pending: "Pending",
89
+ confirmed: "Confirmed",
90
+ cancelled: "Cancelled",
91
+ rescheduled: "Rescheduled",
92
+ };
93
+
94
+ const STRIP_BG: Record<AppointmentStatus, string> = {
95
+ pending: "bg-warning/5",
96
+ confirmed: "bg-success/5",
97
+ cancelled: "bg-destructive/5",
98
+ rescheduled: "bg-info/5",
99
+ };
100
+
101
+ // ---------------------------------------------------------------------------
102
+ // Component
103
+ // ---------------------------------------------------------------------------
104
+
105
+ export function AdvisorCard({
106
+ name,
107
+ role,
108
+ phone,
109
+ email,
110
+ companyName,
111
+ companyLogoUrl,
112
+ avatarInitials,
113
+ isPrimary = false,
114
+ appointments,
115
+ onRefer,
116
+ onMoreOptions,
117
+ onBookAppointment,
118
+ onViewAppointment,
119
+ }: AdvisorCardProps) {
120
+ const hasAppointments = appointments !== undefined;
121
+ const appointmentList =
122
+ appointments === null ||
123
+ (Array.isArray(appointments) && appointments.length === 0)
124
+ ? null
125
+ : appointments;
126
+
127
+ return (
128
+ <div className="flex flex-col border border-border bg-card">
129
+ {/* ── Advisor info ── */}
130
+ <div className="flex items-start gap-4 p-4">
131
+ <Avatar className="h-10 w-10 shrink-0">
132
+ {companyLogoUrl && (
133
+ <AvatarImage src={companyLogoUrl} alt={`${name} company logo`} />
134
+ )}
135
+ <AvatarFallback className="text-sm">
136
+ {avatarInitials ??
137
+ (companyName
138
+ ? companyName
139
+ .split(" ")
140
+ .map((w) => w[0])
141
+ .join("")
142
+ .slice(0, 2)
143
+ .toUpperCase()
144
+ : name.slice(0, 2).toUpperCase())}
145
+ </AvatarFallback>
146
+ </Avatar>
147
+
148
+ <div className="flex min-w-0 flex-1 flex-col gap-0.5">
149
+ <p className="text-sm font-semibold leading-tight">{name}</p>
150
+ <p className="text-sm text-muted-foreground">{role}</p>
151
+ <div className="mt-2 flex flex-col gap-1">
152
+ <div className="flex items-center gap-1.5 text-sm text-muted-foreground">
153
+ <Phone className="h-4 w-4 shrink-0" />
154
+ <span>{phone}</span>
155
+ </div>
156
+ <div className="flex items-center gap-1.5 text-sm text-muted-foreground">
157
+ <Mail className="h-4 w-4 shrink-0" />
158
+ <span>{email}</span>
159
+ </div>
160
+ </div>
161
+ </div>
162
+
163
+ {/* Badge + overflow menu */}
164
+ <div className="flex shrink-0 items-center gap-1.5">
165
+ {isPrimary && <Badge variant="success">Primary</Badge>}
166
+ <Button
167
+ variant="ghost"
168
+ size="icon"
169
+ className="h-7 w-7"
170
+ onClick={onMoreOptions}
171
+ aria-label="More options"
172
+ >
173
+ <MoreVertical className="h-4 w-4" />
174
+ </Button>
175
+ </div>
176
+ </div>
177
+
178
+ {/* ── Appointment strips ── */}
179
+ {hasAppointments && (
180
+ <>
181
+ <Separator />
182
+ {appointmentList ? (
183
+ appointmentList.map((appt, i) => (
184
+ <React.Fragment key={i}>
185
+ {i > 0 && <Separator />}
186
+ <div
187
+ className={`flex items-center gap-3 px-4 py-3 ${STRIP_BG[appt.status]}`}
188
+ >
189
+ <CalendarCheck className="h-4 w-4 shrink-0 text-muted-foreground" />
190
+ <div className="flex min-w-0 flex-1 flex-col gap-0.5">
191
+ <div className="flex items-center gap-2">
192
+ <Badge
193
+ variant={STATUS_VARIANT[appt.status]}
194
+ className="text-[10px]"
195
+ >
196
+ {STATUS_LABEL[appt.status]}
197
+ </Badge>
198
+ {appt.appointmentType && (
199
+ <span className="truncate text-sm font-semibold">
200
+ {appt.appointmentType}
201
+ </span>
202
+ )}
203
+ </div>
204
+ <p className="whitespace-nowrap text-sm text-muted-foreground">
205
+ {appt.date} · {appt.timeStart}–{appt.timeEnd}
206
+ </p>
207
+ </div>
208
+ {onViewAppointment && (
209
+ <Button
210
+ variant="ghost"
211
+ size="sm"
212
+ className="h-7 shrink-0 gap-1 px-2 text-xs"
213
+ onClick={() => onViewAppointment(i)}
214
+ >
215
+ View
216
+ <ChevronRight className="h-3 w-3" />
217
+ </Button>
218
+ )}
219
+ </div>
220
+ </React.Fragment>
221
+ ))
222
+ ) : (
223
+ /* Empty state */
224
+ <div className="flex items-center gap-3 px-4 py-3">
225
+ <Calendar className="h-4 w-4 shrink-0 text-muted-foreground" />
226
+ <p className="flex-1 text-xs text-muted-foreground">
227
+ No upcoming appointments
228
+ </p>
229
+ </div>
230
+ )}
231
+ </>
232
+ )}
233
+
234
+ {/* ── Footer actions ── */}
235
+ <Separator />
236
+ <div className="flex flex-col gap-2 px-4 py-3">
237
+ {onBookAppointment && (
238
+ <Button
239
+ variant="outline-primary"
240
+ size="sm"
241
+ className="w-full"
242
+ onClick={onBookAppointment}
243
+ >
244
+ Book Appointment
245
+ </Button>
246
+ )}
247
+ {onRefer && (
248
+ <Button
249
+ variant="outline"
250
+ size="sm"
251
+ className="w-full"
252
+ onClick={onRefer}
253
+ >
254
+ Refer {name} to Others
255
+ </Button>
256
+ )}
257
+ </div>
258
+ </div>
259
+ );
260
+ }
261
+
262
+ // ---------------------------------------------------------------------------
263
+ // AdvisorInviteCard
264
+ // ---------------------------------------------------------------------------
265
+
266
+ export function AdvisorInviteCard({ onInvite }: AdvisorInviteCardProps) {
267
+ return (
268
+ <Button
269
+ variant="ghost"
270
+ onClick={onInvite}
271
+ className="flex h-auto w-full flex-col items-center justify-center gap-3 border border-dashed border-border bg-card p-8 text-center transition-colors hover:bg-muted/40"
272
+ >
273
+ <div className="flex h-10 w-10 items-center justify-center border border-dashed border-muted-foreground/40">
274
+ <Plus className="h-5 w-5 text-muted-foreground" />
275
+ </div>
276
+ <div className="flex flex-col gap-1">
277
+ <p className="text-sm font-medium">Add Another Advisor</p>
278
+ <p className="text-xs text-muted-foreground">
279
+ Connect more advisors to your account
280
+ </p>
281
+ </div>
282
+ </Button>
283
+ );
284
+ }
@@ -141,10 +141,11 @@ function AiTaskCard({
141
141
  onSelect: (text: string) => void;
142
142
  }) {
143
143
  return (
144
- <button
144
+ <Button
145
145
  type="button"
146
+ variant="ghost"
146
147
  onClick={() => onSelect(suggestion.title)}
147
- className="flex flex-col gap-1 border border-border bg-background p-3 text-left transition-colors hover:bg-muted/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
148
+ className="h-auto w-full flex-col items-start gap-1 border border-border bg-background p-3 text-left hover:bg-muted/50"
148
149
  >
149
150
  <span className="text-sm font-medium text-foreground">
150
151
  {suggestion.title}
@@ -152,7 +153,7 @@ function AiTaskCard({
152
153
  <span className="text-xs text-muted-foreground">
153
154
  {suggestion.description}
154
155
  </span>
155
- </button>
156
+ </Button>
156
157
  );
157
158
  }
158
159