@wealthx/shadcn 1.3.2 → 1.3.3

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 (313) hide show
  1. package/.turbo/turbo-build.log +262 -226
  2. package/CHANGELOG.md +6 -0
  3. package/dist/{chunk-2UM72RJ7.mjs → chunk-2D3HQPFN.mjs} +12 -10
  4. package/dist/chunk-2EM2FRU6.mjs +613 -0
  5. package/dist/{chunk-FH6QVUVZ.mjs → chunk-2GIYVERS.mjs} +2 -2
  6. package/dist/chunk-2P7HP7LR.mjs +68 -0
  7. package/dist/{chunk-HISNT2MG.mjs → chunk-37AE3OM5.mjs} +5 -5
  8. package/dist/{chunk-HBZLGDIN.mjs → chunk-3ERBUVHC.mjs} +169 -110
  9. package/dist/{chunk-C7CQJNMR.mjs → chunk-3VDET466.mjs} +2 -2
  10. package/dist/{chunk-462HMNO4.mjs → chunk-4MM7LHM5.mjs} +2 -2
  11. package/dist/{chunk-QMY3AZJH.mjs → chunk-4Z66LMIQ.mjs} +2 -2
  12. package/dist/{chunk-U5X52X37.mjs → chunk-57ZXILTS.mjs} +6 -6
  13. package/dist/{chunk-3OYFOX3X.mjs → chunk-5VOTTIXF.mjs} +2 -2
  14. package/dist/{chunk-LBMRIB3G.mjs → chunk-6AJUS7VX.mjs} +1 -1
  15. package/dist/{chunk-OODBHKG7.mjs → chunk-6HIOM2HL.mjs} +7 -4
  16. package/dist/{chunk-BDYZCBRT.mjs → chunk-6QAFGZC2.mjs} +2 -2
  17. package/dist/{chunk-U4NDAF2P.mjs → chunk-6TX73WG7.mjs} +1 -1
  18. package/dist/{chunk-GD4BJDJR.mjs → chunk-7BTFGCFC.mjs} +4 -4
  19. package/dist/{chunk-FAKPBKLT.mjs → chunk-7GWRPXHD.mjs} +4 -4
  20. package/dist/{chunk-NMOI6CQD.mjs → chunk-7YI3HEBH.mjs} +5 -5
  21. package/dist/{chunk-T4BJLT57.mjs → chunk-AE7MASLF.mjs} +5 -5
  22. package/dist/{chunk-VLQZANBF.mjs → chunk-AFML43VJ.mjs} +6 -1
  23. package/dist/chunk-BBXSNDS3.mjs +260 -0
  24. package/dist/chunk-BOW7U26Y.mjs +203 -0
  25. package/dist/{chunk-34NWQURD.mjs → chunk-BS75ICOO.mjs} +2 -2
  26. package/dist/chunk-D2NSIIXG.mjs +394 -0
  27. package/dist/{chunk-3GF7OVTP.mjs → chunk-DGNHGNYH.mjs} +2 -2
  28. package/dist/{chunk-VLARHE5V.mjs → chunk-DMXYRCHM.mjs} +6 -6
  29. package/dist/{chunk-OGOYQ7BG.mjs → chunk-DQB4EPIS.mjs} +1 -1
  30. package/dist/{chunk-MIZQHHUO.mjs → chunk-FL6DZFJK.mjs} +106 -38
  31. package/dist/{chunk-I3RZS7V2.mjs → chunk-FLL633WS.mjs} +19 -33
  32. package/dist/{chunk-PBL4OQV2.mjs → chunk-FTPBQVQ6.mjs} +4 -4
  33. package/dist/chunk-FYPSTTEJ.mjs +169 -0
  34. package/dist/{chunk-6O6KD7CE.mjs → chunk-G27TSQLQ.mjs} +6 -6
  35. package/dist/{chunk-66MI7Q4B.mjs → chunk-GT3RU6GA.mjs} +2 -2
  36. package/dist/{chunk-D6ID6M4V.mjs → chunk-GTAVSBDO.mjs} +2 -2
  37. package/dist/{chunk-24FUO7TD.mjs → chunk-H6NQTIF4.mjs} +2 -2
  38. package/dist/{chunk-7DHU4VGG.mjs → chunk-HK4HUQTV.mjs} +2 -2
  39. package/dist/chunk-I4KVSZCH.mjs +101 -0
  40. package/dist/{chunk-RGVKLTLH.mjs → chunk-IKXYTCSB.mjs} +2 -2
  41. package/dist/{chunk-Y6DWJSKZ.mjs → chunk-ISUA7DSB.mjs} +1 -1
  42. package/dist/{chunk-2A5RRQGG.mjs → chunk-JD3YWRNP.mjs} +10 -14
  43. package/dist/{chunk-J5UICVJS.mjs → chunk-JPGL36WQ.mjs} +2 -2
  44. package/dist/{chunk-7XJHLGUV.mjs → chunk-JTK6VJXY.mjs} +2 -2
  45. package/dist/{chunk-7YAU5CY6.mjs → chunk-JVMXMFBB.mjs} +2 -2
  46. package/dist/{chunk-IAE3F7DR.mjs → chunk-JZY6TNIS.mjs} +21 -21
  47. package/dist/{chunk-K5A5L6T2.mjs → chunk-K4KOD3KR.mjs} +12 -12
  48. package/dist/{chunk-MBON7YRJ.mjs → chunk-K5QV4TT6.mjs} +3 -3
  49. package/dist/{chunk-IHMFS7NZ.mjs → chunk-K5VHK7CM.mjs} +21 -21
  50. package/dist/{chunk-RJI6GKVF.mjs → chunk-KCWNDYPZ.mjs} +5 -5
  51. package/dist/{chunk-UFYSFDER.mjs → chunk-KFH36NKF.mjs} +1 -1
  52. package/dist/{chunk-EBXQWIYG.mjs → chunk-KLTACJ2G.mjs} +5 -5
  53. package/dist/{chunk-3TTACBDP.mjs → chunk-KWD6GANL.mjs} +4 -4
  54. package/dist/{chunk-IOJRDS6V.mjs → chunk-L4NSRQ3T.mjs} +218 -147
  55. package/dist/{chunk-GYMYRIZP.mjs → chunk-LBTHZSBT.mjs} +2 -2
  56. package/dist/{chunk-AMQZRHEZ.mjs → chunk-LQULK2E3.mjs} +5 -5
  57. package/dist/{chunk-YJG55G2H.mjs → chunk-LR6LHDP3.mjs} +5 -5
  58. package/dist/{chunk-7PV3IWCN.mjs → chunk-M4VYX2PV.mjs} +19 -1
  59. package/dist/{chunk-P76HMUI6.mjs → chunk-MDUKXXIL.mjs} +2 -2
  60. package/dist/{chunk-LV35NGVG.mjs → chunk-N6Q5IPKT.mjs} +9 -9
  61. package/dist/{chunk-DOEO3CDL.mjs → chunk-NB3ZL36B.mjs} +1 -1
  62. package/dist/{chunk-XREGSKX3.mjs → chunk-NOOEKOWY.mjs} +5 -5
  63. package/dist/{chunk-NL3ZO62D.mjs → chunk-NT4FX27K.mjs} +1 -1
  64. package/dist/{chunk-QZ4RE6NA.mjs → chunk-NTYQWVLI.mjs} +6 -6
  65. package/dist/{chunk-ERGGHC2V.mjs → chunk-OEOOYMC2.mjs} +2 -2
  66. package/dist/{chunk-4GAWMKMI.mjs → chunk-OIKBW2QD.mjs} +291 -54
  67. package/dist/{chunk-DUJTAXMH.mjs → chunk-OKTJFDPN.mjs} +6 -6
  68. package/dist/chunk-OLKMCXAR.mjs +1219 -0
  69. package/dist/{chunk-EI5F6FMT.mjs → chunk-OWFQSXVD.mjs} +3 -3
  70. package/dist/{chunk-6DZEXFNB.mjs → chunk-P2N2PEFY.mjs} +3 -3
  71. package/dist/{chunk-NSLMILBT.mjs → chunk-P7CEBZM6.mjs} +2 -2
  72. package/dist/{chunk-7S5AESZO.mjs → chunk-PNRUH7JY.mjs} +6 -6
  73. package/dist/{chunk-ZU4NV6RG.mjs → chunk-PNSYFE3K.mjs} +2 -2
  74. package/dist/{chunk-JKGDCQTZ.mjs → chunk-QTRSCVQ3.mjs} +5 -5
  75. package/dist/{chunk-ABFDMHOR.mjs → chunk-QX7IFQSF.mjs} +5 -5
  76. package/dist/{chunk-CFMQP5QS.mjs → chunk-QXKGOMUX.mjs} +6 -6
  77. package/dist/{chunk-NQPOYKAQ.mjs → chunk-R2ON6CAN.mjs} +2 -2
  78. package/dist/{chunk-DBHJ5KC3.mjs → chunk-R4HCRDU5.mjs} +1 -1
  79. package/dist/{chunk-EWRB4PAD.mjs → chunk-RCAOCHWA.mjs} +14 -14
  80. package/dist/{chunk-EFRENWEJ.mjs → chunk-RSUIPKGX.mjs} +2 -2
  81. package/dist/{chunk-DGHAXJBN.mjs → chunk-S2FKV4M5.mjs} +5 -5
  82. package/dist/{chunk-RGU7HOEC.mjs → chunk-SET2ANTY.mjs} +5 -7
  83. package/dist/chunk-SFH2NJEJ.mjs +47 -0
  84. package/dist/{chunk-6AW4KJHE.mjs → chunk-SIVYAI3M.mjs} +12 -12
  85. package/dist/{chunk-5FQIKDKP.mjs → chunk-THVO2N47.mjs} +8 -8
  86. package/dist/{chunk-JMHR3YGZ.mjs → chunk-TLAWKTSA.mjs} +3 -3
  87. package/dist/{chunk-HVY6KCCF.mjs → chunk-TOWTPLRC.mjs} +68 -72
  88. package/dist/{chunk-6JQFUE5I.mjs → chunk-UALR6JGV.mjs} +2 -2
  89. package/dist/{chunk-N6TNTQL6.mjs → chunk-UJZ4UHWI.mjs} +9 -11
  90. package/dist/{chunk-MARPPFOJ.mjs → chunk-UNACI2YK.mjs} +2 -2
  91. package/dist/{chunk-3NCUZIFP.mjs → chunk-V6XGXYCJ.mjs} +7 -7
  92. package/dist/chunk-VB5M6OZQ.mjs +57 -0
  93. package/dist/{chunk-5IS7G74I.mjs → chunk-VY5NEUP7.mjs} +6 -6
  94. package/dist/{chunk-JHJHG4GO.mjs → chunk-WE4YKBDE.mjs} +2 -2
  95. package/dist/{chunk-BKNFWEH2.mjs → chunk-WL6WVV47.mjs} +3 -3
  96. package/dist/{chunk-FWCSY2DS.mjs → chunk-WNQUEZJF.mjs} +22 -1
  97. package/dist/{chunk-2Y7YJKPE.mjs → chunk-WZ6UJCBL.mjs} +1 -1
  98. package/dist/{chunk-UMTOX62O.mjs → chunk-XYPW2XA5.mjs} +13 -10
  99. package/dist/chunk-Y2MTAVAK.mjs +34 -0
  100. package/dist/{chunk-6CR5N2JW.mjs → chunk-YCWLFG27.mjs} +6 -6
  101. package/dist/{chunk-PU4YZQXV.mjs → chunk-YE67AALL.mjs} +12 -12
  102. package/dist/{chunk-M3FV7LOK.mjs → chunk-YEWNFK5S.mjs} +6 -1
  103. package/dist/{chunk-R3VSPKNP.mjs → chunk-YIZHS72Z.mjs} +11 -12
  104. package/dist/{chunk-7PYJD5JI.mjs → chunk-ZEDMKQK2.mjs} +2 -2
  105. package/dist/{chunk-N2PT566P.mjs → chunk-ZFCDYW6N.mjs} +4 -4
  106. package/dist/chunk-ZGQIVGIN.mjs +57 -0
  107. package/dist/{chunk-Q2BGOAMG.mjs → chunk-ZKWXDQDG.mjs} +4 -4
  108. package/dist/{chunk-GHC7LLUX.mjs → chunk-ZOWL2L5J.mjs} +5 -5
  109. package/dist/components/ui/accordion.mjs +3 -3
  110. package/dist/components/ui/add-column-modal.js +2 -2
  111. package/dist/components/ui/add-column-modal.mjs +10 -10
  112. package/dist/components/ui/add-lead-modal.js +424 -82
  113. package/dist/components/ui/add-lead-modal.mjs +12 -9
  114. package/dist/components/ui/advisor-card.js +2 -2
  115. package/dist/components/ui/advisor-card.mjs +8 -8
  116. package/dist/components/ui/ai-assistant-drawer.js +2 -2
  117. package/dist/components/ui/ai-assistant-drawer.mjs +9 -9
  118. package/dist/components/ui/ai-builder.js +958 -0
  119. package/dist/components/ui/ai-builder.mjs +25 -0
  120. package/dist/components/ui/ai-conversations.js +2045 -0
  121. package/dist/components/ui/ai-conversations.mjs +41 -0
  122. package/dist/components/ui/alert-dialog.js +2 -2
  123. package/dist/components/ui/alert-dialog.mjs +5 -5
  124. package/dist/components/ui/alert.mjs +3 -3
  125. package/dist/components/ui/appointment-action-dialogs.js +19 -3
  126. package/dist/components/ui/appointment-action-dialogs.mjs +15 -14
  127. package/dist/components/ui/appointment-availability-settings.js +181 -111
  128. package/dist/components/ui/appointment-availability-settings.mjs +20 -18
  129. package/dist/components/ui/appointment-book-dialog.js +113 -24
  130. package/dist/components/ui/appointment-book-dialog.mjs +21 -20
  131. package/dist/components/ui/appointment-calendar-view.js +19 -3
  132. package/dist/components/ui/appointment-calendar-view.mjs +10 -9
  133. package/dist/components/ui/appointment-detail-sheet.js +19 -3
  134. package/dist/components/ui/appointment-detail-sheet.mjs +18 -17
  135. package/dist/components/ui/appointment-gmail-connect.js +49 -89
  136. package/dist/components/ui/appointment-gmail-connect.mjs +8 -9
  137. package/dist/components/ui/appointment-mini-card.js +2 -2
  138. package/dist/components/ui/appointment-mini-card.mjs +6 -6
  139. package/dist/components/ui/appointment-time-slot-picker.mjs +6 -6
  140. package/dist/components/ui/appointment-upcoming-card.js +19 -3
  141. package/dist/components/ui/appointment-upcoming-card.mjs +15 -14
  142. package/dist/components/ui/auth-logo.js +95 -0
  143. package/dist/components/ui/auth-logo.mjs +8 -0
  144. package/dist/components/ui/auth-page-layout.js +108 -0
  145. package/dist/components/ui/auth-page-layout.mjs +8 -0
  146. package/dist/components/ui/avatar.mjs +3 -3
  147. package/dist/components/ui/backoffice-alert-history-chart.js +2 -2
  148. package/dist/components/ui/backoffice-alert-history-chart.mjs +9 -9
  149. package/dist/components/ui/backoffice-alerts-chart.js +2 -2
  150. package/dist/components/ui/backoffice-alerts-chart.mjs +11 -11
  151. package/dist/components/ui/backoffice-connections-chart.js +2 -2
  152. package/dist/components/ui/backoffice-connections-chart.mjs +11 -11
  153. package/dist/components/ui/backoffice-contact-history-chart.js +2 -2
  154. package/dist/components/ui/backoffice-contact-history-chart.mjs +9 -9
  155. package/dist/components/ui/badge.mjs +4 -4
  156. package/dist/components/ui/borrowing-capacity-line-chart.js +145 -132
  157. package/dist/components/ui/borrowing-capacity-line-chart.mjs +9 -9
  158. package/dist/components/ui/button.js +2 -2
  159. package/dist/components/ui/button.mjs +4 -4
  160. package/dist/components/ui/calendar.js +17 -3
  161. package/dist/components/ui/calendar.mjs +6 -5
  162. package/dist/components/ui/card.mjs +3 -3
  163. package/dist/components/ui/cash-balance-line-chart.js +157 -152
  164. package/dist/components/ui/cash-balance-line-chart.mjs +9 -9
  165. package/dist/components/ui/cashflow-bar-chart.js +2 -2
  166. package/dist/components/ui/cashflow-bar-chart.mjs +9 -9
  167. package/dist/components/ui/chat-widget-primitives.js +573 -0
  168. package/dist/components/ui/chat-widget-primitives.mjs +21 -0
  169. package/dist/components/ui/chat-widget.js +1268 -0
  170. package/dist/components/ui/chat-widget.mjs +29 -0
  171. package/dist/components/ui/checkbox.mjs +3 -3
  172. package/dist/components/ui/chip.js +2 -2
  173. package/dist/components/ui/chip.mjs +6 -6
  174. package/dist/components/ui/color-picker.js +2 -2
  175. package/dist/components/ui/color-picker.mjs +7 -7
  176. package/dist/components/ui/combobox.mjs +3 -3
  177. package/dist/components/ui/data-table.js +2 -2
  178. package/dist/components/ui/data-table.mjs +12 -12
  179. package/dist/components/ui/date-picker.js +22 -6
  180. package/dist/components/ui/date-picker.mjs +9 -8
  181. package/dist/components/ui/dialog.js +2 -2
  182. package/dist/components/ui/dialog.mjs +5 -5
  183. package/dist/components/ui/document-checklist-template.js +630 -0
  184. package/dist/components/ui/document-checklist-template.mjs +15 -0
  185. package/dist/components/ui/drawer.js +2 -2
  186. package/dist/components/ui/drawer.mjs +3 -3
  187. package/dist/components/ui/dropdown-menu.mjs +3 -3
  188. package/dist/components/ui/empty.mjs +3 -3
  189. package/dist/components/ui/expense-bar-chart.js +2 -2
  190. package/dist/components/ui/expense-bar-chart.mjs +9 -9
  191. package/dist/components/ui/field.mjs +5 -5
  192. package/dist/components/ui/financial-cards.js +431 -291
  193. package/dist/components/ui/financial-cards.mjs +10 -9
  194. package/dist/components/ui/financial-drawers.js +4 -4
  195. package/dist/components/ui/financial-drawers.mjs +8 -8
  196. package/dist/components/ui/financial-primitives.mjs +3 -3
  197. package/dist/components/ui/financial-sections.js +8 -9
  198. package/dist/components/ui/financial-sections.mjs +12 -12
  199. package/dist/components/ui/form-primitives.mjs +8 -8
  200. package/dist/components/ui/income-bar-chart.js +2 -2
  201. package/dist/components/ui/income-bar-chart.mjs +9 -9
  202. package/dist/components/ui/input-group.js +2 -2
  203. package/dist/components/ui/input-group.mjs +7 -7
  204. package/dist/components/ui/input-otp.mjs +3 -3
  205. package/dist/components/ui/input.mjs +3 -3
  206. package/dist/components/ui/kanban-column.js +19 -23
  207. package/dist/components/ui/kanban-column.mjs +14 -14
  208. package/dist/components/ui/label.mjs +3 -3
  209. package/dist/components/ui/onboarding-layout.js +476 -0
  210. package/dist/components/ui/onboarding-layout.mjs +11 -0
  211. package/dist/components/ui/opportunity-card.js +2 -2
  212. package/dist/components/ui/opportunity-card.mjs +12 -12
  213. package/dist/components/ui/opportunity-edit-modals.js +22 -6
  214. package/dist/components/ui/opportunity-edit-modals.mjs +21 -20
  215. package/dist/components/ui/opportunity-summary-tab.js +991 -674
  216. package/dist/components/ui/opportunity-summary-tab.mjs +26 -26
  217. package/dist/components/ui/page-header.mjs +3 -3
  218. package/dist/components/ui/page-top-bar.mjs +3 -3
  219. package/dist/components/ui/pagination.js +2 -2
  220. package/dist/components/ui/pagination.mjs +6 -6
  221. package/dist/components/ui/password-strength-tooltip.js +197 -0
  222. package/dist/components/ui/password-strength-tooltip.mjs +11 -0
  223. package/dist/components/ui/pipeline-alerts.mjs +3 -3
  224. package/dist/components/ui/pipeline-board.js +19 -23
  225. package/dist/components/ui/pipeline-board.mjs +18 -18
  226. package/dist/components/ui/pipeline-chart.js +12 -6
  227. package/dist/components/ui/pipeline-chart.mjs +4 -3
  228. package/dist/components/ui/pipeline-dialogs.js +28 -12
  229. package/dist/components/ui/pipeline-dialogs.mjs +14 -13
  230. package/dist/components/ui/pipeline-primitives.mjs +6 -6
  231. package/dist/components/ui/popover.mjs +3 -3
  232. package/dist/components/ui/progress.mjs +3 -3
  233. package/dist/components/ui/property-cashflow-doughnut-chart.js +2 -2
  234. package/dist/components/ui/property-cashflow-doughnut-chart.mjs +9 -9
  235. package/dist/components/ui/property-debt-equity-doughnut-chart.js +2 -2
  236. package/dist/components/ui/property-debt-equity-doughnut-chart.mjs +9 -9
  237. package/dist/components/ui/property-mobile-estimate-line-chart.js +2 -2
  238. package/dist/components/ui/property-mobile-estimate-line-chart.mjs +9 -9
  239. package/dist/components/ui/radio-group.mjs +3 -3
  240. package/dist/components/ui/select.mjs +3 -3
  241. package/dist/components/ui/separator.mjs +3 -3
  242. package/dist/components/ui/sheet.mjs +3 -3
  243. package/dist/components/ui/sidebar-nav.js +6 -5
  244. package/dist/components/ui/sidebar-nav.mjs +7 -7
  245. package/dist/components/ui/skeleton.mjs +3 -3
  246. package/dist/components/ui/slider.mjs +3 -3
  247. package/dist/components/ui/sonner.mjs +2 -2
  248. package/dist/components/ui/spinner.mjs +3 -3
  249. package/dist/components/ui/stage-timeline.mjs +10 -10
  250. package/dist/components/ui/stepper.mjs +3 -3
  251. package/dist/components/ui/switch.mjs +3 -3
  252. package/dist/components/ui/table.mjs +3 -3
  253. package/dist/components/ui/tabs.mjs +3 -3
  254. package/dist/components/ui/textarea.mjs +3 -3
  255. package/dist/components/ui/toggle-group.mjs +4 -4
  256. package/dist/components/ui/toggle.mjs +3 -3
  257. package/dist/components/ui/tooltip.mjs +3 -3
  258. package/dist/components/ui/transactions-expense-categories-doughnut-chart.js +2 -2
  259. package/dist/components/ui/transactions-expense-categories-doughnut-chart.mjs +9 -9
  260. package/dist/components/ui/transactions-income-expense-bar-chart.js +2 -2
  261. package/dist/components/ui/transactions-income-expense-bar-chart.mjs +9 -9
  262. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.js +2 -2
  263. package/dist/components/ui/transactions-liabilities-breakdown-doughnut-chart.mjs +9 -9
  264. package/dist/components/ui/two-fa-setup-form.js +612 -0
  265. package/dist/components/ui/two-fa-setup-form.mjs +16 -0
  266. package/dist/components/ui/upload-card.js +187 -0
  267. package/dist/components/ui/upload-card.mjs +10 -0
  268. package/dist/components/ui/video-background.js +118 -0
  269. package/dist/components/ui/video-background.mjs +8 -0
  270. package/dist/index.js +12764 -9396
  271. package/dist/index.mjs +341 -245
  272. package/dist/lib/colors.mjs +1 -1
  273. package/dist/lib/theme-provider.mjs +1 -1
  274. package/dist/lib/typography.mjs +2 -2
  275. package/dist/lib/utils.js +8 -2
  276. package/dist/lib/utils.mjs +6 -4
  277. package/dist/styles.css +1 -1
  278. package/package.json +61 -1
  279. package/src/components/index.tsx +126 -1
  280. package/src/components/ui/add-lead-modal.tsx +101 -142
  281. package/src/components/ui/ai-builder.tsx +560 -0
  282. package/src/components/ui/ai-conversations.tsx +1690 -0
  283. package/src/components/ui/appointment-availability-settings.tsx +152 -101
  284. package/src/components/ui/appointment-book-dialog.tsx +138 -24
  285. package/src/components/ui/appointment-calendar-view.tsx +2 -3
  286. package/src/components/ui/appointment-gmail-connect.tsx +23 -42
  287. package/src/components/ui/auth-logo.tsx +50 -0
  288. package/src/components/ui/auth-page-layout.tsx +59 -0
  289. package/src/components/ui/borrowing-capacity-line-chart.tsx +10 -8
  290. package/src/components/ui/button.tsx +2 -2
  291. package/src/components/ui/calendar.tsx +2 -1
  292. package/src/components/ui/cash-balance-line-chart.tsx +10 -14
  293. package/src/components/ui/chart-shared.tsx +10 -0
  294. package/src/components/ui/chat-widget-primitives.tsx +336 -0
  295. package/src/components/ui/chat-widget.tsx +822 -0
  296. package/src/components/ui/document-checklist-template.tsx +264 -0
  297. package/src/components/ui/drawer.tsx +2 -2
  298. package/src/components/ui/financial-cards.tsx +176 -78
  299. package/src/components/ui/financial-drawers.tsx +2 -2
  300. package/src/components/ui/financial-sections.tsx +1 -1
  301. package/src/components/ui/kanban-column.tsx +2 -5
  302. package/src/components/ui/onboarding-layout.tsx +109 -0
  303. package/src/components/ui/opportunity-summary-tab.tsx +469 -142
  304. package/src/components/ui/password-strength-tooltip.tsx +70 -0
  305. package/src/components/ui/pipeline-chart.tsx +2 -6
  306. package/src/components/ui/sidebar-nav.tsx +1 -11
  307. package/src/components/ui/two-fa-setup-form.tsx +229 -0
  308. package/src/components/ui/upload-card.tsx +98 -0
  309. package/src/components/ui/video-background.tsx +55 -0
  310. package/src/lib/format-date.ts +26 -0
  311. package/src/lib/utils.ts +11 -0
  312. package/src/styles/styles-css.ts +1 -1
  313. package/tsup.config.ts +13 -0
@@ -1,43 +1,46 @@
1
1
  import {
2
2
  AddressAutocomplete
3
- } from "./chunk-U5X52X37.mjs";
3
+ } from "./chunk-57ZXILTS.mjs";
4
4
  import {
5
5
  RadioGroup,
6
6
  RadioGroupCard,
7
7
  RadioGroupItem
8
- } from "./chunk-7XJHLGUV.mjs";
8
+ } from "./chunk-JTK6VJXY.mjs";
9
+ import {
10
+ Avatar,
11
+ AvatarFallback
12
+ } from "./chunk-H6NQTIF4.mjs";
9
13
  import {
10
14
  AppointmentSlotSection
11
- } from "./chunk-3OYFOX3X.mjs";
15
+ } from "./chunk-5VOTTIXF.mjs";
12
16
  import {
13
17
  Toggle
14
- } from "./chunk-BDYZCBRT.mjs";
18
+ } from "./chunk-6QAFGZC2.mjs";
15
19
  import {
16
20
  Textarea
17
- } from "./chunk-34NWQURD.mjs";
21
+ } from "./chunk-BS75ICOO.mjs";
18
22
  import {
19
23
  Calendar
20
- } from "./chunk-OODBHKG7.mjs";
24
+ } from "./chunk-6HIOM2HL.mjs";
21
25
  import {
22
- Avatar,
23
- AvatarFallback
24
- } from "./chunk-24FUO7TD.mjs";
26
+ formatDateLong
27
+ } from "./chunk-M4VYX2PV.mjs";
28
+ import {
29
+ Label
30
+ } from "./chunk-P7CEBZM6.mjs";
31
+ import {
32
+ Separator
33
+ } from "./chunk-2GIYVERS.mjs";
25
34
  import {
26
35
  Select,
27
36
  SelectContent,
28
37
  SelectItem,
29
38
  SelectTrigger,
30
39
  SelectValue
31
- } from "./chunk-7PYJD5JI.mjs";
32
- import {
33
- Label
34
- } from "./chunk-NSLMILBT.mjs";
35
- import {
36
- Separator
37
- } from "./chunk-FH6QVUVZ.mjs";
40
+ } from "./chunk-ZEDMKQK2.mjs";
38
41
  import {
39
42
  Input
40
- } from "./chunk-GYMYRIZP.mjs";
43
+ } from "./chunk-LBTHZSBT.mjs";
41
44
  import {
42
45
  Dialog,
43
46
  DialogClose,
@@ -46,15 +49,15 @@ import {
46
49
  DialogFooter,
47
50
  DialogHeader,
48
51
  DialogTitle
49
- } from "./chunk-6DZEXFNB.mjs";
52
+ } from "./chunk-P2N2PEFY.mjs";
50
53
  import {
51
54
  Button
52
- } from "./chunk-XREGSKX3.mjs";
55
+ } from "./chunk-NOOEKOWY.mjs";
53
56
 
54
57
  // src/components/ui/appointment-book-dialog.tsx
55
58
  import React from "react";
56
59
  import { MapPin, Phone, Video } from "lucide-react";
57
- import { jsx, jsxs } from "react/jsx-runtime";
60
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
58
61
  function ClientSearch({
59
62
  clients,
60
63
  value,
@@ -189,6 +192,15 @@ function MeetingFormatSection({
189
192
  ] })
190
193
  ] });
191
194
  }
195
+ var DAY_MAP = {
196
+ Sun: 0,
197
+ Mon: 1,
198
+ Tue: 2,
199
+ Wed: 3,
200
+ Thu: 4,
201
+ Fri: 5,
202
+ Sat: 6
203
+ };
192
204
  function AppointmentBookDialog({
193
205
  open,
194
206
  onOpenChange,
@@ -196,24 +208,22 @@ function AppointmentBookDialog({
196
208
  meetingTypes = [],
197
209
  amSlots,
198
210
  pmSlots,
211
+ onDateChange,
199
212
  schedule,
200
213
  advisorOfficeAddress,
201
214
  clientHomeAddress,
202
215
  advisorInfo,
203
216
  initialClientId,
217
+ guestInfo,
204
218
  onBook
205
219
  }) {
220
+ var _a, _b, _c;
206
221
  const isClientMode = clients.length === 0;
207
- const DAY_MAP = {
208
- Sun: 0,
209
- Mon: 1,
210
- Tue: 2,
211
- Wed: 3,
212
- Thu: 4,
213
- Fri: 5,
214
- Sat: 6
215
- };
216
- const disabledDayOfWeek = schedule == null ? void 0 : schedule.filter((d) => !d.enabled).map((d) => DAY_MAP[d.day]).filter((n) => n !== void 0);
222
+ const showGuestForm = isClientMode && !((guestInfo == null ? void 0 : guestInfo.name) && (guestInfo == null ? void 0 : guestInfo.email));
223
+ const disabledDayOfWeek = React.useMemo(
224
+ () => schedule == null ? void 0 : schedule.filter((d) => !d.enabled).map((d) => DAY_MAP[d.day]).filter((n) => n !== void 0),
225
+ [schedule]
226
+ );
217
227
  const [clientId, setClientId] = React.useState(void 0);
218
228
  const [meetingType, setMeetingType] = React.useState("");
219
229
  const [meetingFormat, setMeetingFormat] = React.useState("call");
@@ -227,7 +237,13 @@ function AppointmentBookDialog({
227
237
  const [selectedPhone, setSelectedPhone] = React.useState(
228
238
  void 0
229
239
  );
230
- const selectedClient = clients.find((c) => c.id === clientId);
240
+ const [guestName, setGuestName] = React.useState((_a = guestInfo == null ? void 0 : guestInfo.name) != null ? _a : "");
241
+ const [guestEmail, setGuestEmail] = React.useState((_b = guestInfo == null ? void 0 : guestInfo.email) != null ? _b : "");
242
+ const [guestPhone, setGuestPhone] = React.useState((_c = guestInfo == null ? void 0 : guestInfo.phone) != null ? _c : "");
243
+ const selectedClient = React.useMemo(
244
+ () => clients.find((c) => c.id === clientId),
245
+ [clients, clientId]
246
+ );
231
247
  React.useEffect(() => {
232
248
  if (open && initialClientId) {
233
249
  setClientId(initialClientId);
@@ -244,8 +260,10 @@ function AppointmentBookDialog({
244
260
  const clientReady = isClientMode || !!clientId;
245
261
  const meetingTypeReady = meetingTypes.length === 0 || !!meetingType;
246
262
  const offlineReady = meetingFormat !== "offline" || offlineLocation !== "custom" || !!customAddress.trim();
247
- const canSubmit = clientReady && meetingTypeReady && !!date && !!selectedSlot && offlineReady;
263
+ const guestReady = !showGuestForm || !!guestName.trim() && !!guestEmail.trim();
264
+ const canSubmit = clientReady && meetingTypeReady && !!date && !!selectedSlot && offlineReady && guestReady;
248
265
  const handleOpenChange = (next) => {
266
+ var _a2, _b2, _c2;
249
267
  if (!next) {
250
268
  setClientId(void 0);
251
269
  setMeetingType("");
@@ -256,6 +274,9 @@ function AppointmentBookDialog({
256
274
  setSelectedSlot(void 0);
257
275
  setNotes("");
258
276
  setSelectedPhone(void 0);
277
+ setGuestName((_a2 = guestInfo == null ? void 0 : guestInfo.name) != null ? _a2 : "");
278
+ setGuestEmail((_b2 = guestInfo == null ? void 0 : guestInfo.email) != null ? _b2 : "");
279
+ setGuestPhone((_c2 = guestInfo == null ? void 0 : guestInfo.phone) != null ? _c2 : "");
259
280
  }
260
281
  onOpenChange(next);
261
282
  };
@@ -291,6 +312,53 @@ function AppointmentBookDialog({
291
312
  /* @__PURE__ */ jsx(SelectContent, { children: meetingTypes.map((t) => /* @__PURE__ */ jsx(SelectItem, { value: t, children: t }, t)) })
292
313
  ] })
293
314
  ] }),
315
+ showGuestForm && /* @__PURE__ */ jsxs(Fragment, { children: [
316
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
317
+ /* @__PURE__ */ jsx(Label, { htmlFor: "guest-name", children: "Full name" }),
318
+ /* @__PURE__ */ jsx(
319
+ Input,
320
+ {
321
+ id: "guest-name",
322
+ placeholder: "Your full name",
323
+ value: guestName,
324
+ onChange: (e) => setGuestName(e.target.value),
325
+ autoComplete: "name"
326
+ }
327
+ )
328
+ ] }),
329
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
330
+ /* @__PURE__ */ jsx(Label, { htmlFor: "guest-email", children: "Email" }),
331
+ /* @__PURE__ */ jsx(
332
+ Input,
333
+ {
334
+ id: "guest-email",
335
+ type: "email",
336
+ placeholder: "your@email.com",
337
+ value: guestEmail,
338
+ onChange: (e) => setGuestEmail(e.target.value),
339
+ autoComplete: "email"
340
+ }
341
+ )
342
+ ] }),
343
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
344
+ /* @__PURE__ */ jsxs(Label, { htmlFor: "guest-phone", children: [
345
+ "Phone",
346
+ " ",
347
+ /* @__PURE__ */ jsx("span", { className: "font-normal text-muted-foreground", children: "(optional)" })
348
+ ] }),
349
+ /* @__PURE__ */ jsx(
350
+ Input,
351
+ {
352
+ id: "guest-phone",
353
+ type: "tel",
354
+ placeholder: "+61 4XX XXX XXX",
355
+ value: guestPhone,
356
+ onChange: (e) => setGuestPhone(e.target.value),
357
+ autoComplete: "tel"
358
+ }
359
+ )
360
+ ] })
361
+ ] }),
294
362
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
295
363
  /* @__PURE__ */ jsx(Label, { children: "Meeting format" }),
296
364
  /* @__PURE__ */ jsx(
@@ -351,6 +419,7 @@ function AppointmentBookDialog({
351
419
  onSelect: (d) => {
352
420
  setDate(d);
353
421
  setSelectedSlot(void 0);
422
+ if (d) onDateChange == null ? void 0 : onDateChange(d);
354
423
  },
355
424
  captionLayout: "label",
356
425
  fromDate: /* @__PURE__ */ new Date(),
@@ -362,11 +431,7 @@ function AppointmentBookDialog({
362
431
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
363
432
  /* @__PURE__ */ jsx(Label, { children: "Time slot" }),
364
433
  date ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-3", children: [
365
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: date.toLocaleDateString("en-AU", {
366
- weekday: "long",
367
- day: "numeric",
368
- month: "long"
369
- }) }),
434
+ /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: formatDateLong(date) }),
370
435
  /* @__PURE__ */ jsx(
371
436
  AppointmentSlotSection,
372
437
  {
@@ -424,7 +489,10 @@ function AppointmentBookDialog({
424
489
  meetingFormat,
425
490
  offlineLocation: meetingFormat === "offline" ? offlineLocation : void 0,
426
491
  customAddress: meetingFormat === "offline" && offlineLocation === "custom" ? customAddress : void 0,
427
- callPhone: meetingFormat === "call" ? selectedPhone : void 0
492
+ callPhone: meetingFormat === "call" ? selectedPhone : void 0,
493
+ guestName: isClientMode ? guestName.trim() || void 0 : void 0,
494
+ guestEmail: isClientMode ? guestEmail.trim() || void 0 : void 0,
495
+ guestPhone: isClientMode ? guestPhone.trim() || void 0 : void 0
428
496
  });
429
497
  handleOpenChange(false);
430
498
  }
@@ -1,21 +1,18 @@
1
1
  import {
2
2
  Badge
3
- } from "./chunk-BKNFWEH2.mjs";
3
+ } from "./chunk-WL6WVV47.mjs";
4
4
  import {
5
5
  Separator
6
- } from "./chunk-FH6QVUVZ.mjs";
7
- import {
8
- Spinner
9
- } from "./chunk-7YAU5CY6.mjs";
6
+ } from "./chunk-2GIYVERS.mjs";
10
7
  import {
11
8
  Input
12
- } from "./chunk-GYMYRIZP.mjs";
9
+ } from "./chunk-LBTHZSBT.mjs";
13
10
  import {
14
11
  Button
15
- } from "./chunk-XREGSKX3.mjs";
12
+ } from "./chunk-NOOEKOWY.mjs";
16
13
 
17
14
  // src/components/ui/appointment-gmail-connect.tsx
18
- import { Check, Copy, Link2, Mail, ShieldCheck, Unlink } from "lucide-react";
15
+ import { Check, Copy, ExternalLink, Link2, Mail, Settings } from "lucide-react";
19
16
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
20
17
  var PERMISSIONS = [
21
18
  "Read your calendar availability",
@@ -24,21 +21,10 @@ var PERMISSIONS = [
24
21
  ];
25
22
  function AppointmentGmailConnect({
26
23
  connection,
27
- state = "disconnected",
28
- onConnect,
29
- onDisconnect,
30
24
  calendarLink,
31
- onCopyLink
25
+ onCopyLink,
26
+ onGoToIntegrations
32
27
  }) {
33
- if (state === "connecting") {
34
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4 border border-border bg-card px-6 py-8 text-center", children: [
35
- /* @__PURE__ */ jsx(Spinner, { className: "h-6 w-6 text-primary" }),
36
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
37
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium", children: "Connecting to Gmail\u2026" }),
38
- /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: "Complete the sign-in in the popup window." })
39
- ] })
40
- ] });
41
- }
42
28
  if (connection.connected) {
43
29
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col border border-border bg-card", children: [
44
30
  /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3 px-5 py-4", children: [
@@ -51,7 +37,7 @@ function AppointmentGmailConnect({
51
37
  /* @__PURE__ */ jsx(Check, { size: 10 }),
52
38
  "Active"
53
39
  ] }),
54
- connection.connectedAt && /* @__PURE__ */ jsxs("p", { className: "shrink-0 text-sm text-muted-foreground", children: [
40
+ connection.connectedAt && /* @__PURE__ */ jsxs("p", { className: "shrink-0 text-xs text-muted-foreground", children: [
55
41
  "Connected since ",
56
42
  connection.connectedAt
57
43
  ] }),
@@ -60,11 +46,11 @@ function AppointmentGmailConnect({
60
46
  {
61
47
  size: "sm",
62
48
  variant: "ghost",
63
- className: "shrink-0 gap-1.5 text-destructive hover:text-destructive",
64
- onClick: onDisconnect,
49
+ className: "shrink-0 gap-1.5 text-muted-foreground",
50
+ onClick: onGoToIntegrations,
65
51
  children: [
66
- /* @__PURE__ */ jsx(Unlink, { className: "h-3.5 w-3.5" }),
67
- "Disconnect"
52
+ /* @__PURE__ */ jsx(Settings, { className: "h-3.5 w-3.5" }),
53
+ "Manage"
68
54
  ]
69
55
  }
70
56
  )
@@ -73,7 +59,7 @@ function AppointmentGmailConnect({
73
59
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 px-5 py-4", children: [
74
60
  /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Permissions granted" }),
75
61
  PERMISSIONS.map((perm) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
76
- /* @__PURE__ */ jsx(ShieldCheck, { className: "h-4 w-4 shrink-0 text-success" }),
62
+ /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0 text-success" }),
77
63
  /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: perm })
78
64
  ] }, perm))
79
65
  ] }),
@@ -114,19 +100,19 @@ function AppointmentGmailConnect({
114
100
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-4 border border-border bg-card px-6 py-8 text-center", children: [
115
101
  /* @__PURE__ */ jsx("div", { className: "flex h-12 w-12 items-center justify-center bg-muted", children: /* @__PURE__ */ jsx(Mail, { className: "h-6 w-6 text-muted-foreground" }) }),
116
102
  /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1.5", children: [
117
- /* @__PURE__ */ jsx("p", { className: "text-base font-semibold", children: "Connect your Gmail account" }),
118
- /* @__PURE__ */ jsx("p", { className: "max-w-xs text-sm text-muted-foreground", children: "Link your Gmail to let clients book appointments and receive confirmation emails automatically." })
103
+ /* @__PURE__ */ jsx("p", { className: "text-base font-semibold", children: "Gmail not connected" }),
104
+ /* @__PURE__ */ jsx("p", { className: "max-w-xs text-sm text-muted-foreground", children: "Connect your Gmail account in Integrations to enable calendar booking and appointment confirmations." })
119
105
  ] }),
120
106
  /* @__PURE__ */ jsxs("div", { className: "flex w-full max-w-xs flex-col gap-2 text-left", children: [
121
- /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "This will allow WealthX to:" }),
107
+ /* @__PURE__ */ jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "Once connected, WealthX will be able to:" }),
122
108
  PERMISSIONS.map((perm) => /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
123
109
  /* @__PURE__ */ jsx(Check, { className: "h-3.5 w-3.5 shrink-0 text-muted-foreground" }),
124
110
  /* @__PURE__ */ jsx("span", { className: "text-sm text-muted-foreground", children: perm })
125
111
  ] }, perm))
126
112
  ] }),
127
- /* @__PURE__ */ jsxs(Button, { onClick: onConnect, className: "gap-2", children: [
128
- /* @__PURE__ */ jsx(Mail, { className: "h-4 w-4" }),
129
- "Connect Gmail"
113
+ /* @__PURE__ */ jsxs(Button, { onClick: onGoToIntegrations, className: "gap-2", children: [
114
+ /* @__PURE__ */ jsx(ExternalLink, { className: "h-4 w-4" }),
115
+ "Go to Integrations"
130
116
  ] })
131
117
  ] });
132
118
  }
@@ -4,19 +4,19 @@ import {
4
4
  SelectItem,
5
5
  SelectTrigger,
6
6
  SelectValue
7
- } from "./chunk-7PYJD5JI.mjs";
7
+ } from "./chunk-ZEDMKQK2.mjs";
8
8
  import {
9
9
  Button,
10
10
  buttonVariants
11
- } from "./chunk-XREGSKX3.mjs";
11
+ } from "./chunk-NOOEKOWY.mjs";
12
12
  import {
13
13
  cn
14
- } from "./chunk-VLQZANBF.mjs";
14
+ } from "./chunk-AFML43VJ.mjs";
15
15
  import {
16
16
  __objRest,
17
17
  __spreadProps,
18
18
  __spreadValues
19
- } from "./chunk-FWCSY2DS.mjs";
19
+ } from "./chunk-WNQUEZJF.mjs";
20
20
 
21
21
  // src/components/ui/pagination.tsx
22
22
  import {
@@ -0,0 +1,169 @@
1
+ import {
2
+ InputGroup,
3
+ InputGroupInput
4
+ } from "./chunk-7YI3HEBH.mjs";
5
+ import {
6
+ Field,
7
+ FieldError
8
+ } from "./chunk-7BTFGCFC.mjs";
9
+ import {
10
+ Label
11
+ } from "./chunk-P7CEBZM6.mjs";
12
+ import {
13
+ Button
14
+ } from "./chunk-NOOEKOWY.mjs";
15
+ import {
16
+ cn
17
+ } from "./chunk-AFML43VJ.mjs";
18
+ import {
19
+ __async
20
+ } from "./chunk-WNQUEZJF.mjs";
21
+
22
+ // src/components/ui/two-fa-setup-form.tsx
23
+ import { useState } from "react";
24
+ import { Smartphone } from "lucide-react";
25
+ import { jsx, jsxs } from "react/jsx-runtime";
26
+ var DEFAULT_APPS = [
27
+ { name: "Google Authenticator" },
28
+ { name: "Microsoft Authenticator" }
29
+ ];
30
+ function AppDownloadStep({
31
+ apps,
32
+ onNext,
33
+ onSetupLater,
34
+ required
35
+ }) {
36
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
37
+ /* @__PURE__ */ jsx("div", { className: "flex gap-4", children: apps.map((app) => {
38
+ var _a;
39
+ return /* @__PURE__ */ jsxs(
40
+ "div",
41
+ {
42
+ className: "flex flex-1 flex-col items-center gap-3 border border-border bg-muted/30 p-4 text-center",
43
+ children: [
44
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 text-sm font-medium text-foreground", children: [
45
+ (_a = app.icon) != null ? _a : /* @__PURE__ */ jsx(Smartphone, { size: 18, className: "text-muted-foreground" }),
46
+ app.name
47
+ ] }),
48
+ app.qrNode ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: app.qrNode }) : /* @__PURE__ */ jsx("div", { className: "flex h-[100px] w-[100px] items-center justify-center border border-dashed border-border bg-muted/50 text-[11px] text-muted-foreground", children: "Scan to download" })
49
+ ]
50
+ },
51
+ app.name
52
+ );
53
+ }) }),
54
+ /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-muted-foreground", children: "Once downloaded, or if you already have the app installed, click Next." }),
55
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
56
+ /* @__PURE__ */ jsx(Button, { className: "w-full", onClick: onNext, children: "Next" }),
57
+ !required && onSetupLater && /* @__PURE__ */ jsx(Button, { variant: "ghost", className: "w-full", onClick: onSetupLater, children: "Setup Later" })
58
+ ] })
59
+ ] });
60
+ }
61
+ function VerificationStep({
62
+ qrCodeNode,
63
+ onVerify,
64
+ onBack,
65
+ onSetupLater,
66
+ required
67
+ }) {
68
+ const [token, setToken] = useState("");
69
+ const [error, setError] = useState("");
70
+ const [isLoading, setIsLoading] = useState(false);
71
+ const handleVerify = () => __async(null, null, function* () {
72
+ if (!token) {
73
+ setError("Required");
74
+ return;
75
+ }
76
+ setError("");
77
+ setIsLoading(true);
78
+ try {
79
+ yield onVerify(token);
80
+ } catch (e) {
81
+ setError("Invalid code. Please try again.");
82
+ } finally {
83
+ setIsLoading(false);
84
+ }
85
+ });
86
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-6", children: [
87
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center gap-3", children: [
88
+ qrCodeNode ? /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center", children: qrCodeNode }) : /* @__PURE__ */ jsx("div", { className: "flex h-[140px] w-[140px] items-center justify-center border border-dashed border-border bg-muted/50 text-xs text-muted-foreground", children: "QR Code" }),
89
+ /* @__PURE__ */ jsx("p", { className: "text-center text-sm text-muted-foreground", children: "The temporary code will show for authentication. Insert below." })
90
+ ] }),
91
+ /* @__PURE__ */ jsxs(Field, { children: [
92
+ /* @__PURE__ */ jsx(Label, { htmlFor: "2fa-token", children: "Verification Code" }),
93
+ /* @__PURE__ */ jsx(InputGroup, { children: /* @__PURE__ */ jsx(
94
+ InputGroupInput,
95
+ {
96
+ id: "2fa-token",
97
+ type: "text",
98
+ name: "token",
99
+ placeholder: "Enter Your Code",
100
+ value: token,
101
+ "aria-invalid": !!error,
102
+ onChange: (e) => {
103
+ setToken(e.target.value);
104
+ if (error) setError("");
105
+ },
106
+ onKeyDown: (e) => {
107
+ if (e.key === "Enter") handleVerify();
108
+ }
109
+ }
110
+ ) }),
111
+ error && /* @__PURE__ */ jsx(FieldError, { children: error })
112
+ ] }),
113
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
114
+ /* @__PURE__ */ jsx(
115
+ Button,
116
+ {
117
+ loading: isLoading,
118
+ disabled: !token,
119
+ className: "w-full",
120
+ onClick: handleVerify,
121
+ children: "Verify Now"
122
+ }
123
+ ),
124
+ /* @__PURE__ */ jsx(Button, { variant: "outline", className: "w-full", onClick: onBack, children: "Back" }),
125
+ !required && onSetupLater && /* @__PURE__ */ jsx(Button, { variant: "ghost", className: "w-full", onClick: onSetupLater, children: "Setup Later" })
126
+ ] })
127
+ ] });
128
+ }
129
+ function TwoFASetupForm({
130
+ title = "2FA Setup",
131
+ apps = DEFAULT_APPS,
132
+ qrCodeNode,
133
+ onVerify,
134
+ onSetupLater,
135
+ required = true,
136
+ className
137
+ }) {
138
+ const [step, setStep] = useState(1);
139
+ const stepTitle = step === 1 ? title : "Open Auth App and Scan Code";
140
+ const stepSubtitle = step === 1 ? "We recommend Google Authenticator or Microsoft Authenticator" : "Open your authenticator app and scan the QR code";
141
+ return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col gap-6", className), children: [
142
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
143
+ /* @__PURE__ */ jsx("h2", { className: "text-xl font-semibold text-foreground", children: stepTitle }),
144
+ /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: stepSubtitle })
145
+ ] }),
146
+ step === 1 ? /* @__PURE__ */ jsx(
147
+ AppDownloadStep,
148
+ {
149
+ apps,
150
+ onNext: () => setStep(2),
151
+ onSetupLater,
152
+ required
153
+ }
154
+ ) : /* @__PURE__ */ jsx(
155
+ VerificationStep,
156
+ {
157
+ qrCodeNode,
158
+ onVerify,
159
+ onBack: () => setStep(1),
160
+ onSetupLater,
161
+ required
162
+ }
163
+ )
164
+ ] });
165
+ }
166
+
167
+ export {
168
+ TwoFASetupForm
169
+ };
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Skeleton
3
- } from "./chunk-D6ID6M4V.mjs";
3
+ } from "./chunk-GTAVSBDO.mjs";
4
4
  import {
5
5
  ChartLegendItem,
6
6
  ChartPeriodButton,
@@ -9,28 +9,28 @@ import {
9
9
  formatMonthLabel,
10
10
  formatTooltipDate,
11
11
  hexToRgba
12
- } from "./chunk-M3FV7LOK.mjs";
12
+ } from "./chunk-YEWNFK5S.mjs";
13
13
  import {
14
14
  Empty,
15
15
  EmptyDescription
16
- } from "./chunk-NQPOYKAQ.mjs";
16
+ } from "./chunk-R2ON6CAN.mjs";
17
17
  import {
18
18
  Card,
19
19
  CardAction,
20
20
  CardContent,
21
21
  CardHeader,
22
22
  CardTitle
23
- } from "./chunk-C7CQJNMR.mjs";
23
+ } from "./chunk-3VDET466.mjs";
24
24
  import {
25
25
  ToggleGroup,
26
26
  ToggleGroupItem
27
- } from "./chunk-EI5F6FMT.mjs";
27
+ } from "./chunk-OWFQSXVD.mjs";
28
28
  import {
29
29
  useThemeVars
30
30
  } from "./chunk-FEZKMUCF.mjs";
31
31
  import {
32
32
  cn
33
- } from "./chunk-VLQZANBF.mjs";
33
+ } from "./chunk-AFML43VJ.mjs";
34
34
 
35
35
  // src/components/ui/backoffice-alerts-chart.tsx
36
36
  import { useMemo, useState } from "react";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-VLQZANBF.mjs";
3
+ } from "./chunk-AFML43VJ.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues
7
- } from "./chunk-FWCSY2DS.mjs";
7
+ } from "./chunk-WNQUEZJF.mjs";
8
8
 
9
9
  // src/components/ui/table.tsx
10
10
  import { jsx } from "react/jsx-runtime";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-VLQZANBF.mjs";
3
+ } from "./chunk-AFML43VJ.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues
7
- } from "./chunk-FWCSY2DS.mjs";
7
+ } from "./chunk-WNQUEZJF.mjs";
8
8
 
9
9
  // src/components/ui/skeleton.tsx
10
10
  import { jsx } from "react/jsx-runtime";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-VLQZANBF.mjs";
3
+ } from "./chunk-AFML43VJ.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadValues
7
- } from "./chunk-FWCSY2DS.mjs";
7
+ } from "./chunk-WNQUEZJF.mjs";
8
8
 
9
9
  // src/components/ui/avatar.tsx
10
10
  import { Avatar as AvatarPrimitive } from "@base-ui/react/avatar";
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-VLQZANBF.mjs";
3
+ } from "./chunk-AFML43VJ.mjs";
4
4
  import {
5
5
  __objRest,
6
6
  __spreadProps,
7
7
  __spreadValues
8
- } from "./chunk-FWCSY2DS.mjs";
8
+ } from "./chunk-WNQUEZJF.mjs";
9
9
 
10
10
  // src/components/ui/input-otp.tsx
11
11
  import * as React from "react";