@wealthx/ui 1.0.0 → 1.0.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 (565) hide show
  1. package/.turbo/turbo-build.log +359 -14
  2. package/CHANGELOG.md +3 -7
  3. package/dist/accordion-details.d.mts +7 -0
  4. package/dist/accordion-details.d.ts +7 -0
  5. package/dist/accordion-details.js +62 -0
  6. package/dist/accordion-details.mjs +17 -0
  7. package/dist/accordion-summary.d.mts +7 -0
  8. package/dist/accordion-summary.d.ts +7 -0
  9. package/dist/accordion-summary.js +62 -0
  10. package/dist/accordion-summary.mjs +17 -0
  11. package/dist/accordion.d.mts +7 -0
  12. package/dist/accordion.d.ts +7 -0
  13. package/dist/accordion.js +62 -0
  14. package/dist/accordion.mjs +17 -0
  15. package/dist/alert.d.mts +7 -0
  16. package/dist/alert.d.ts +7 -0
  17. package/dist/alert.js +62 -0
  18. package/dist/alert.mjs +17 -0
  19. package/dist/app-bar.d.mts +7 -0
  20. package/dist/app-bar.d.ts +7 -0
  21. package/dist/app-bar.js +62 -0
  22. package/dist/app-bar.mjs +17 -0
  23. package/dist/autocomplete.d.mts +7 -0
  24. package/dist/autocomplete.d.ts +7 -0
  25. package/dist/autocomplete.js +62 -0
  26. package/dist/autocomplete.mjs +17 -0
  27. package/dist/avatar.d.mts +7 -0
  28. package/dist/avatar.d.ts +7 -0
  29. package/dist/avatar.js +62 -0
  30. package/dist/avatar.mjs +17 -0
  31. package/dist/backdrop.d.mts +7 -0
  32. package/dist/backdrop.d.ts +7 -0
  33. package/dist/backdrop.js +62 -0
  34. package/dist/backdrop.mjs +17 -0
  35. package/dist/badge.d.mts +7 -0
  36. package/dist/badge.d.ts +7 -0
  37. package/dist/badge.js +62 -0
  38. package/dist/badge.mjs +17 -0
  39. package/dist/bottom-navigation-action.d.mts +7 -0
  40. package/dist/bottom-navigation-action.d.ts +7 -0
  41. package/dist/bottom-navigation-action.js +62 -0
  42. package/dist/bottom-navigation-action.mjs +17 -0
  43. package/dist/bottom-navigation.d.mts +7 -0
  44. package/dist/bottom-navigation.d.ts +7 -0
  45. package/dist/bottom-navigation.js +62 -0
  46. package/dist/bottom-navigation.mjs +17 -0
  47. package/dist/box.d.mts +7 -0
  48. package/dist/box.d.ts +7 -0
  49. package/dist/box.js +62 -0
  50. package/dist/box.mjs +17 -0
  51. package/dist/breadcrumbs.d.mts +7 -0
  52. package/dist/breadcrumbs.d.ts +7 -0
  53. package/dist/breadcrumbs.js +62 -0
  54. package/dist/breadcrumbs.mjs +17 -0
  55. package/dist/button-group.d.mts +7 -0
  56. package/dist/button-group.d.ts +7 -0
  57. package/dist/button-group.js +62 -0
  58. package/dist/button-group.mjs +17 -0
  59. package/dist/button.d.mts +2 -4
  60. package/dist/button.d.ts +2 -4
  61. package/dist/button.js +6 -3
  62. package/dist/button.mjs +7 -4
  63. package/dist/card-actions.d.mts +7 -0
  64. package/dist/card-actions.d.ts +7 -0
  65. package/dist/card-actions.js +62 -0
  66. package/dist/card-actions.mjs +17 -0
  67. package/dist/card-content.d.mts +7 -0
  68. package/dist/card-content.d.ts +7 -0
  69. package/dist/card-content.js +62 -0
  70. package/dist/card-content.mjs +17 -0
  71. package/dist/card-header.d.mts +7 -0
  72. package/dist/card-header.d.ts +7 -0
  73. package/dist/card-header.js +62 -0
  74. package/dist/card-header.mjs +17 -0
  75. package/dist/card-media.d.mts +7 -0
  76. package/dist/card-media.d.ts +7 -0
  77. package/dist/card-media.js +62 -0
  78. package/dist/card-media.mjs +17 -0
  79. package/dist/card.d.mts +7 -0
  80. package/dist/card.d.ts +7 -0
  81. package/dist/card.js +62 -0
  82. package/dist/card.mjs +17 -0
  83. package/dist/charts/index.d.mts +260 -0
  84. package/dist/charts/index.d.ts +260 -0
  85. package/dist/charts/index.js +2514 -0
  86. package/dist/charts/index.mjs +2442 -0
  87. package/dist/checkbox.d.mts +9 -0
  88. package/dist/checkbox.d.ts +9 -0
  89. package/dist/checkbox.js +62 -0
  90. package/dist/checkbox.mjs +17 -0
  91. package/dist/chip.d.mts +7 -0
  92. package/dist/chip.d.ts +7 -0
  93. package/dist/chip.js +62 -0
  94. package/dist/chip.mjs +17 -0
  95. package/dist/chunk-2VVJGTUG.mjs +18 -0
  96. package/dist/chunk-3INC3CHA.mjs +702 -0
  97. package/dist/chunk-3LGY4LPH.mjs +671 -0
  98. package/dist/chunk-3ZAK7JKB.mjs +17 -0
  99. package/dist/chunk-4PT5CSRI.mjs +635 -0
  100. package/dist/chunk-4RSXKKJ3.mjs +677 -0
  101. package/dist/chunk-4YL3IDTL.mjs +712 -0
  102. package/dist/chunk-5PTI2A2O.mjs +635 -0
  103. package/dist/chunk-5QGN2CVX.mjs +738 -0
  104. package/dist/chunk-5WVSR7VI.mjs +30 -0
  105. package/dist/chunk-6XKA7TMO.mjs +654 -0
  106. package/dist/chunk-75AEPNQV.mjs +663 -0
  107. package/dist/chunk-7VN5YMMV.mjs +666 -0
  108. package/dist/chunk-7Y4J73GF.mjs +22 -0
  109. package/dist/chunk-A4GTTYXS.mjs +725 -0
  110. package/dist/chunk-A6UVH2MS.mjs +638 -0
  111. package/dist/chunk-AFUVAGQ7.mjs +717 -0
  112. package/dist/chunk-AU6MS36I.mjs +687 -0
  113. package/dist/chunk-AZ4T75GP.mjs +716 -0
  114. package/dist/chunk-B26DAG54.mjs +729 -0
  115. package/dist/chunk-B6MLUNDY.mjs +641 -0
  116. package/dist/chunk-BEP42F7C.mjs +704 -0
  117. package/dist/chunk-CDQYIC4L.mjs +638 -0
  118. package/dist/chunk-CJ5XEQAB.mjs +707 -0
  119. package/dist/chunk-CLRGEEBS.mjs +695 -0
  120. package/dist/chunk-EDDP4RXX.mjs +731 -0
  121. package/dist/chunk-EYFZ6Q2I.mjs +30 -0
  122. package/dist/chunk-EZEFJ62V.mjs +723 -0
  123. package/dist/chunk-F3Y22UH3.mjs +704 -0
  124. package/dist/chunk-FCUQVOXM.mjs +707 -0
  125. package/dist/chunk-FMFAYI6F.mjs +727 -0
  126. package/dist/chunk-FYHAFWVF.mjs +719 -0
  127. package/dist/chunk-G5LVCGAZ.mjs +715 -0
  128. package/dist/chunk-GC7M6Q7Q.mjs +712 -0
  129. package/dist/chunk-GJP3ZHQZ.mjs +712 -0
  130. package/dist/chunk-GTCMGRVH.mjs +576 -0
  131. package/dist/chunk-GXYSMEFL.mjs +704 -0
  132. package/dist/chunk-GYEEDPWP.mjs +646 -0
  133. package/dist/chunk-H5JOUGZ7.mjs +7 -0
  134. package/dist/chunk-HAXRNHML.mjs +17 -0
  135. package/dist/chunk-HGDOFGU4.mjs +717 -0
  136. package/dist/chunk-HR7CZZZU.mjs +34 -0
  137. package/dist/chunk-I5H76ESF.mjs +671 -0
  138. package/dist/chunk-IIBNCIGO.mjs +713 -0
  139. package/dist/chunk-INHKGMOA.mjs +705 -0
  140. package/dist/chunk-ISFJIOTZ.mjs +668 -0
  141. package/dist/chunk-IU4IZB74.mjs +729 -0
  142. package/dist/chunk-IXJXFW7K.mjs +712 -0
  143. package/dist/chunk-JUNAYNXW.mjs +667 -0
  144. package/dist/chunk-K2Z5MFPN.mjs +717 -0
  145. package/dist/chunk-KJDBWFV4.mjs +15 -0
  146. package/dist/chunk-KOR3RFXT.mjs +616 -0
  147. package/dist/chunk-KRCDJE37.mjs +616 -0
  148. package/dist/chunk-KX3KGQM5.mjs +704 -0
  149. package/dist/chunk-MJF7PMCN.mjs +713 -0
  150. package/dist/chunk-MSMSEKLJ.mjs +727 -0
  151. package/dist/chunk-MWVIJSXF.mjs +723 -0
  152. package/dist/chunk-MZ6NCHFH.mjs +712 -0
  153. package/dist/chunk-NHR5EVP5.mjs +34 -0
  154. package/dist/chunk-NLOG75HP.mjs +712 -0
  155. package/dist/chunk-NPIFU7NP.mjs +717 -0
  156. package/dist/chunk-NUTTLEFB.mjs +675 -0
  157. package/dist/chunk-P3F3JWWN.mjs +707 -0
  158. package/dist/chunk-PPGJLNI5.mjs +704 -0
  159. package/dist/chunk-PUPP26OX.mjs +707 -0
  160. package/dist/chunk-Q43USMAB.mjs +638 -0
  161. package/dist/chunk-QUYESF5V.mjs +706 -0
  162. package/dist/chunk-R4NJDEQL.mjs +686 -0
  163. package/dist/chunk-RE7K3H64.mjs +707 -0
  164. package/dist/chunk-RIDPXVXH.mjs +706 -0
  165. package/dist/chunk-RQIAE3MB.mjs +721 -0
  166. package/dist/chunk-RRYH5A6K.mjs +727 -0
  167. package/dist/chunk-RTUIKVKP.mjs +705 -0
  168. package/dist/chunk-RYZ2UYKN.mjs +707 -0
  169. package/dist/chunk-S37HUFPH.mjs +719 -0
  170. package/dist/chunk-S4TZORUT.mjs +708 -0
  171. package/dist/chunk-SOMFG24T.mjs +675 -0
  172. package/dist/chunk-SP3LL4DC.mjs +704 -0
  173. package/dist/chunk-TJZXXGH3.mjs +641 -0
  174. package/dist/chunk-TWFYWUDV.mjs +707 -0
  175. package/dist/chunk-U2JQUQ2B.mjs +712 -0
  176. package/dist/chunk-UCFJXIGR.mjs +671 -0
  177. package/dist/chunk-UFKECQBD.mjs +736 -0
  178. package/dist/chunk-UNZHSAWG.mjs +704 -0
  179. package/dist/chunk-UORPGX7S.mjs +637 -0
  180. package/dist/chunk-VA7BMOMQ.mjs +712 -0
  181. package/dist/chunk-VKJEODYN.mjs +705 -0
  182. package/dist/chunk-VST6TRHA.mjs +15 -0
  183. package/dist/chunk-VSTSMCNW.mjs +169 -0
  184. package/dist/chunk-W35RLK2G.mjs +714 -0
  185. package/dist/chunk-WLX3YEFG.mjs +713 -0
  186. package/dist/chunk-WUKYLWAZ.mjs +0 -0
  187. package/dist/chunk-XJFQ6VLH.mjs +676 -0
  188. package/dist/chunk-XUAVHHPE.mjs +715 -0
  189. package/dist/chunk-YHEJWFKH.mjs +711 -0
  190. package/dist/chunk-YJ5Q4Z6X.mjs +37 -0
  191. package/dist/chunk-YMWHUJU5.mjs +15 -0
  192. package/dist/chunk-YNFJJWV4.mjs +712 -0
  193. package/dist/chunk-YOEKQLSM.mjs +715 -0
  194. package/dist/chunk-ZIIKFFIL.mjs +21 -0
  195. package/dist/chunk-ZLBX4R5M.mjs +711 -0
  196. package/dist/container.d.mts +7 -0
  197. package/dist/container.d.ts +7 -0
  198. package/dist/container.js +62 -0
  199. package/dist/container.mjs +17 -0
  200. package/dist/dialog-actions.d.mts +7 -0
  201. package/dist/dialog-actions.d.ts +7 -0
  202. package/dist/dialog-actions.js +62 -0
  203. package/dist/dialog-actions.mjs +17 -0
  204. package/dist/dialog-content.d.mts +7 -0
  205. package/dist/dialog-content.d.ts +7 -0
  206. package/dist/dialog-content.js +62 -0
  207. package/dist/dialog-content.mjs +17 -0
  208. package/dist/dialog-title.d.mts +7 -0
  209. package/dist/dialog-title.d.ts +7 -0
  210. package/dist/dialog-title.js +62 -0
  211. package/dist/dialog-title.mjs +17 -0
  212. package/dist/dialog.d.mts +7 -0
  213. package/dist/dialog.d.ts +7 -0
  214. package/dist/dialog.js +62 -0
  215. package/dist/dialog.mjs +17 -0
  216. package/dist/divider.d.mts +7 -0
  217. package/dist/divider.d.ts +7 -0
  218. package/dist/divider.js +62 -0
  219. package/dist/divider.mjs +17 -0
  220. package/dist/drawer.d.mts +7 -0
  221. package/dist/drawer.d.ts +7 -0
  222. package/dist/drawer.js +62 -0
  223. package/dist/drawer.mjs +17 -0
  224. package/dist/fab.d.mts +7 -0
  225. package/dist/fab.d.ts +7 -0
  226. package/dist/fab.js +62 -0
  227. package/dist/fab.mjs +17 -0
  228. package/dist/form-control.d.mts +7 -0
  229. package/dist/form-control.d.ts +7 -0
  230. package/dist/form-control.js +62 -0
  231. package/dist/form-control.mjs +17 -0
  232. package/dist/grid.d.mts +7 -0
  233. package/dist/grid.d.ts +7 -0
  234. package/dist/grid.js +62 -0
  235. package/dist/grid.mjs +17 -0
  236. package/dist/icon-button.d.mts +7 -0
  237. package/dist/icon-button.d.ts +7 -0
  238. package/dist/icon-button.js +62 -0
  239. package/dist/icon-button.mjs +17 -0
  240. package/dist/image-list-item.d.mts +7 -0
  241. package/dist/image-list-item.d.ts +7 -0
  242. package/dist/image-list-item.js +62 -0
  243. package/dist/image-list-item.mjs +17 -0
  244. package/dist/image-list.d.mts +7 -0
  245. package/dist/image-list.d.ts +7 -0
  246. package/dist/image-list.js +62 -0
  247. package/dist/image-list.mjs +17 -0
  248. package/dist/index.d.mts +5 -0
  249. package/dist/index.d.ts +5 -0
  250. package/dist/index.js +697 -0
  251. package/dist/index.mjs +61 -0
  252. package/dist/input-label.d.mts +7 -0
  253. package/dist/input-label.d.ts +7 -0
  254. package/dist/input-label.js +62 -0
  255. package/dist/input-label.mjs +17 -0
  256. package/dist/link.d.mts +7 -0
  257. package/dist/link.d.ts +7 -0
  258. package/dist/link.js +62 -0
  259. package/dist/link.mjs +17 -0
  260. package/dist/list-item-icon.d.mts +7 -0
  261. package/dist/list-item-icon.d.ts +7 -0
  262. package/dist/list-item-icon.js +62 -0
  263. package/dist/list-item-icon.mjs +17 -0
  264. package/dist/list-item-text.d.mts +7 -0
  265. package/dist/list-item-text.d.ts +7 -0
  266. package/dist/list-item-text.js +62 -0
  267. package/dist/list-item-text.mjs +17 -0
  268. package/dist/list-item.d.mts +7 -0
  269. package/dist/list-item.d.ts +7 -0
  270. package/dist/list-item.js +62 -0
  271. package/dist/list-item.mjs +17 -0
  272. package/dist/list.d.mts +7 -0
  273. package/dist/list.d.ts +7 -0
  274. package/dist/list.js +62 -0
  275. package/dist/list.mjs +17 -0
  276. package/dist/masonry.d.mts +7 -0
  277. package/dist/masonry.d.ts +7 -0
  278. package/dist/masonry.js +62 -0
  279. package/dist/masonry.mjs +17 -0
  280. package/dist/menu-item.d.mts +7 -0
  281. package/dist/menu-item.d.ts +7 -0
  282. package/dist/menu-item.js +62 -0
  283. package/dist/menu-item.mjs +17 -0
  284. package/dist/menu.d.mts +7 -0
  285. package/dist/menu.d.ts +7 -0
  286. package/dist/menu.js +62 -0
  287. package/dist/menu.mjs +17 -0
  288. package/dist/mui-augmentation-DKlyQ0kQ.d.mts +19 -0
  289. package/dist/mui-augmentation-DKlyQ0kQ.d.ts +19 -0
  290. package/dist/pagination.d.mts +7 -0
  291. package/dist/pagination.d.ts +7 -0
  292. package/dist/pagination.js +62 -0
  293. package/dist/pagination.mjs +17 -0
  294. package/dist/paper.d.mts +7 -0
  295. package/dist/paper.d.ts +7 -0
  296. package/dist/paper.js +62 -0
  297. package/dist/paper.mjs +17 -0
  298. package/dist/progress.d.mts +10 -0
  299. package/dist/progress.d.ts +10 -0
  300. package/dist/progress.js +71 -0
  301. package/dist/progress.mjs +25 -0
  302. package/dist/radio-group.d.mts +7 -0
  303. package/dist/radio-group.d.ts +7 -0
  304. package/dist/radio-group.js +62 -0
  305. package/dist/radio-group.mjs +17 -0
  306. package/dist/radio.d.mts +10 -0
  307. package/dist/radio.d.ts +10 -0
  308. package/dist/radio.js +62 -0
  309. package/dist/radio.mjs +18 -0
  310. package/dist/rating.d.mts +7 -0
  311. package/dist/rating.d.ts +7 -0
  312. package/dist/rating.js +62 -0
  313. package/dist/rating.mjs +17 -0
  314. package/dist/select.d.mts +7 -0
  315. package/dist/select.d.ts +7 -0
  316. package/dist/select.js +62 -0
  317. package/dist/select.mjs +17 -0
  318. package/dist/selection-button-group.d.mts +16 -0
  319. package/dist/selection-button-group.d.ts +16 -0
  320. package/dist/selection-button-group.js +109 -0
  321. package/dist/selection-button-group.mjs +42 -0
  322. package/dist/skeleton.d.mts +7 -0
  323. package/dist/skeleton.d.ts +7 -0
  324. package/dist/skeleton.js +62 -0
  325. package/dist/skeleton.mjs +17 -0
  326. package/dist/slider.d.mts +7 -0
  327. package/dist/slider.d.ts +7 -0
  328. package/dist/slider.js +62 -0
  329. package/dist/slider.mjs +17 -0
  330. package/dist/snackbar.d.mts +7 -0
  331. package/dist/snackbar.d.ts +7 -0
  332. package/dist/snackbar.js +62 -0
  333. package/dist/snackbar.mjs +17 -0
  334. package/dist/speed-dial-action.d.mts +7 -0
  335. package/dist/speed-dial-action.d.ts +7 -0
  336. package/dist/speed-dial-action.js +62 -0
  337. package/dist/speed-dial-action.mjs +17 -0
  338. package/dist/speed-dial.d.mts +7 -0
  339. package/dist/speed-dial.d.ts +7 -0
  340. package/dist/speed-dial.js +62 -0
  341. package/dist/speed-dial.mjs +17 -0
  342. package/dist/stack.d.mts +7 -0
  343. package/dist/stack.d.ts +7 -0
  344. package/dist/stack.js +62 -0
  345. package/dist/stack.mjs +17 -0
  346. package/dist/step-content.d.mts +7 -0
  347. package/dist/step-content.d.ts +7 -0
  348. package/dist/step-content.js +62 -0
  349. package/dist/step-content.mjs +17 -0
  350. package/dist/step-label.d.mts +7 -0
  351. package/dist/step-label.d.ts +7 -0
  352. package/dist/step-label.js +62 -0
  353. package/dist/step-label.mjs +17 -0
  354. package/dist/step.d.mts +7 -0
  355. package/dist/step.d.ts +7 -0
  356. package/dist/step.js +62 -0
  357. package/dist/step.mjs +17 -0
  358. package/dist/stepper.d.mts +7 -0
  359. package/dist/stepper.d.ts +7 -0
  360. package/dist/stepper.js +62 -0
  361. package/dist/stepper.mjs +17 -0
  362. package/dist/switch.d.mts +10 -0
  363. package/dist/switch.d.ts +10 -0
  364. package/dist/switch.js +62 -0
  365. package/dist/switch.mjs +18 -0
  366. package/dist/tab-context.d.mts +9 -0
  367. package/dist/tab-context.d.ts +9 -0
  368. package/dist/tab-context.js +59 -0
  369. package/dist/tab-context.mjs +14 -0
  370. package/dist/tab-list.d.mts +7 -0
  371. package/dist/tab-list.d.ts +7 -0
  372. package/dist/tab-list.js +62 -0
  373. package/dist/tab-list.mjs +17 -0
  374. package/dist/tab-panel.d.mts +7 -0
  375. package/dist/tab-panel.d.ts +7 -0
  376. package/dist/tab-panel.js +62 -0
  377. package/dist/tab-panel.mjs +17 -0
  378. package/dist/tab.d.mts +7 -0
  379. package/dist/tab.d.ts +7 -0
  380. package/dist/tab.js +62 -0
  381. package/dist/tab.mjs +17 -0
  382. package/dist/table-body.d.mts +7 -0
  383. package/dist/table-body.d.ts +7 -0
  384. package/dist/table-body.js +62 -0
  385. package/dist/table-body.mjs +17 -0
  386. package/dist/table-cell.d.mts +7 -0
  387. package/dist/table-cell.d.ts +7 -0
  388. package/dist/table-cell.js +62 -0
  389. package/dist/table-cell.mjs +17 -0
  390. package/dist/table-container.d.mts +7 -0
  391. package/dist/table-container.d.ts +7 -0
  392. package/dist/table-container.js +62 -0
  393. package/dist/table-container.mjs +17 -0
  394. package/dist/table-head.d.mts +7 -0
  395. package/dist/table-head.d.ts +7 -0
  396. package/dist/table-head.js +62 -0
  397. package/dist/table-head.mjs +17 -0
  398. package/dist/table-row.d.mts +7 -0
  399. package/dist/table-row.d.ts +7 -0
  400. package/dist/table-row.js +62 -0
  401. package/dist/table-row.mjs +17 -0
  402. package/dist/table.d.mts +7 -0
  403. package/dist/table.d.ts +7 -0
  404. package/dist/table.js +62 -0
  405. package/dist/table.mjs +17 -0
  406. package/dist/tabs.d.mts +7 -0
  407. package/dist/tabs.d.ts +7 -0
  408. package/dist/tabs.js +62 -0
  409. package/dist/tabs.mjs +17 -0
  410. package/dist/text-field.d.mts +8 -0
  411. package/dist/text-field.d.ts +8 -0
  412. package/dist/text-field.js +62 -0
  413. package/dist/text-field.mjs +17 -0
  414. package/dist/theme/index.d.mts +14 -5
  415. package/dist/theme/index.d.ts +14 -5
  416. package/dist/theme/index.js +128 -4
  417. package/dist/theme/index.mjs +33 -586
  418. package/dist/timeline-connector.d.mts +7 -0
  419. package/dist/timeline-connector.d.ts +7 -0
  420. package/dist/timeline-connector.js +62 -0
  421. package/dist/timeline-connector.mjs +17 -0
  422. package/dist/timeline-content.d.mts +7 -0
  423. package/dist/timeline-content.d.ts +7 -0
  424. package/dist/timeline-content.js +62 -0
  425. package/dist/timeline-content.mjs +17 -0
  426. package/dist/timeline-dot.d.mts +7 -0
  427. package/dist/timeline-dot.d.ts +7 -0
  428. package/dist/timeline-dot.js +62 -0
  429. package/dist/timeline-dot.mjs +17 -0
  430. package/dist/timeline-item.d.mts +7 -0
  431. package/dist/timeline-item.d.ts +7 -0
  432. package/dist/timeline-item.js +62 -0
  433. package/dist/timeline-item.mjs +17 -0
  434. package/dist/timeline-separator.d.mts +7 -0
  435. package/dist/timeline-separator.d.ts +7 -0
  436. package/dist/timeline-separator.js +62 -0
  437. package/dist/timeline-separator.mjs +17 -0
  438. package/dist/timeline.d.mts +7 -0
  439. package/dist/timeline.d.ts +7 -0
  440. package/dist/timeline.js +62 -0
  441. package/dist/timeline.mjs +17 -0
  442. package/dist/toggle-button-group.d.mts +14 -0
  443. package/dist/toggle-button-group.d.ts +14 -0
  444. package/dist/toggle-button-group.js +90 -0
  445. package/dist/toggle-button-group.mjs +32 -0
  446. package/dist/toggle-button.d.mts +8 -0
  447. package/dist/toggle-button.d.ts +8 -0
  448. package/dist/toggle-button.js +62 -0
  449. package/dist/toggle-button.mjs +8 -0
  450. package/dist/tooltip.d.mts +7 -0
  451. package/dist/tooltip.d.ts +7 -0
  452. package/dist/tooltip.js +62 -0
  453. package/dist/tooltip.mjs +17 -0
  454. package/dist/typography.d.mts +7 -0
  455. package/dist/typography.d.ts +7 -0
  456. package/dist/typography.js +62 -0
  457. package/dist/typography.mjs +17 -0
  458. package/package.json +439 -7
  459. package/src/accordion-details.tsx +14 -0
  460. package/src/accordion-summary.tsx +14 -0
  461. package/src/accordion.tsx +14 -0
  462. package/src/alert.tsx +12 -0
  463. package/src/app-bar.tsx +12 -0
  464. package/src/autocomplete.tsx +26 -0
  465. package/src/avatar.tsx +12 -0
  466. package/src/backdrop.tsx +14 -0
  467. package/src/badge.tsx +12 -0
  468. package/src/bottom-navigation-action.tsx +14 -0
  469. package/src/bottom-navigation.tsx +14 -0
  470. package/src/box.tsx +12 -0
  471. package/src/breadcrumbs.tsx +14 -0
  472. package/src/button-group.tsx +14 -0
  473. package/src/button.tsx +9 -4
  474. package/src/card-actions.tsx +14 -0
  475. package/src/card-content.tsx +14 -0
  476. package/src/card-header.tsx +14 -0
  477. package/src/card-media.tsx +14 -0
  478. package/src/card.tsx +12 -0
  479. package/src/charts/BackofficeSwitchableChart.tsx +325 -0
  480. package/src/charts/FrontendBarChart.tsx +134 -0
  481. package/src/charts/FrontendDoughnutChart.tsx +372 -0
  482. package/src/charts/FrontendIncomeExpenseHorizontalBarChart.tsx +138 -0
  483. package/src/charts/FrontendLiabilitiesChart.tsx +97 -0
  484. package/src/charts/FrontendLineChart.tsx +299 -0
  485. package/src/charts/FrontendLineChartMobile.tsx +383 -0
  486. package/src/charts/FrontendMixedChart.tsx +264 -0
  487. package/src/charts/FrontendPercentageBar.tsx +247 -0
  488. package/src/charts/FrontendScenarioLineChart.tsx +308 -0
  489. package/src/charts/FrontendStackedChart.tsx +184 -0
  490. package/src/charts/LoadingChartBackdrop.tsx +32 -0
  491. package/src/charts/chart-utils.ts +58 -0
  492. package/src/charts/index.ts +59 -0
  493. package/src/charts/mock-data.ts +153 -0
  494. package/src/checkbox.tsx +16 -0
  495. package/src/chip.tsx +12 -0
  496. package/src/container.tsx +14 -0
  497. package/src/dialog-actions.tsx +14 -0
  498. package/src/dialog-content.tsx +14 -0
  499. package/src/dialog-title.tsx +14 -0
  500. package/src/dialog.tsx +12 -0
  501. package/src/divider.tsx +12 -0
  502. package/src/drawer.tsx +12 -0
  503. package/src/fab.tsx +12 -0
  504. package/src/form-control.tsx +14 -0
  505. package/src/grid.tsx +12 -0
  506. package/src/icon-button.tsx +14 -0
  507. package/src/image-list-item.tsx +14 -0
  508. package/src/image-list.tsx +14 -0
  509. package/src/input-label.tsx +14 -0
  510. package/src/link.tsx +12 -0
  511. package/src/list-item-icon.tsx +14 -0
  512. package/src/list-item-text.tsx +14 -0
  513. package/src/list-item.tsx +14 -0
  514. package/src/list.tsx +12 -0
  515. package/src/masonry.tsx +14 -0
  516. package/src/menu-item.tsx +14 -0
  517. package/src/menu.tsx +12 -0
  518. package/src/mui-augmentation.ts +23 -0
  519. package/src/pagination.tsx +14 -0
  520. package/src/paper.tsx +12 -0
  521. package/src/progress.tsx +25 -0
  522. package/src/radio-group.tsx +14 -0
  523. package/src/radio.tsx +15 -0
  524. package/src/rating.tsx +12 -0
  525. package/src/select.tsx +12 -0
  526. package/src/selection-button-group.tsx +58 -0
  527. package/src/skeleton.tsx +14 -0
  528. package/src/slider.tsx +12 -0
  529. package/src/snackbar.tsx +14 -0
  530. package/src/speed-dial-action.tsx +14 -0
  531. package/src/speed-dial.tsx +14 -0
  532. package/src/stack.tsx +12 -0
  533. package/src/step-content.tsx +14 -0
  534. package/src/step-label.tsx +14 -0
  535. package/src/step.tsx +12 -0
  536. package/src/stepper.tsx +12 -0
  537. package/src/switch.tsx +15 -0
  538. package/src/tab-context.tsx +11 -0
  539. package/src/tab-list.tsx +14 -0
  540. package/src/tab-panel.tsx +14 -0
  541. package/src/tab.tsx +12 -0
  542. package/src/table-body.tsx +14 -0
  543. package/src/table-cell.tsx +14 -0
  544. package/src/table-container.tsx +14 -0
  545. package/src/table-head.tsx +14 -0
  546. package/src/table-row.tsx +14 -0
  547. package/src/table.tsx +12 -0
  548. package/src/tabs.tsx +12 -0
  549. package/src/text-field.tsx +14 -0
  550. package/src/theme/buildCssVariables.ts +6 -0
  551. package/src/theme/createDesignTheme.ts +118 -2
  552. package/src/theme/index.ts +1 -0
  553. package/src/theme/spacing.ts +23 -0
  554. package/src/timeline-connector.tsx +14 -0
  555. package/src/timeline-content.tsx +14 -0
  556. package/src/timeline-dot.tsx +14 -0
  557. package/src/timeline-item.tsx +14 -0
  558. package/src/timeline-separator.tsx +14 -0
  559. package/src/timeline.tsx +14 -0
  560. package/src/toggle-button-group.tsx +35 -0
  561. package/src/toggle-button.tsx +15 -0
  562. package/src/tooltip.tsx +14 -0
  563. package/src/typography.tsx +14 -0
  564. package/tsup.config.ts +89 -1
  565. package/README.md +0 -124
@@ -0,0 +1,2514 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __defProps = Object.defineProperties;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
7
+ var __getOwnPropNames = Object.getOwnPropertyNames;
8
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
9
+ var __getProtoOf = Object.getPrototypeOf;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
12
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
13
+ var __spreadValues = (a, b) => {
14
+ for (var prop in b || (b = {}))
15
+ if (__hasOwnProp.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ if (__getOwnPropSymbols)
18
+ for (var prop of __getOwnPropSymbols(b)) {
19
+ if (__propIsEnum.call(b, prop))
20
+ __defNormalProp(a, prop, b[prop]);
21
+ }
22
+ return a;
23
+ };
24
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
25
+ var __export = (target, all) => {
26
+ for (var name in all)
27
+ __defProp(target, name, { get: all[name], enumerable: true });
28
+ };
29
+ var __copyProps = (to, from, except, desc) => {
30
+ if (from && typeof from === "object" || typeof from === "function") {
31
+ for (let key of __getOwnPropNames(from))
32
+ if (!__hasOwnProp.call(to, key) && key !== except)
33
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
34
+ }
35
+ return to;
36
+ };
37
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
38
+ // If the importer is in node compatibility mode or this is not an ESM
39
+ // file that has been converted to a CommonJS file using a Babel-
40
+ // compatible transform (i.e. "__esModule" has not been set), then set
41
+ // "default" to the CommonJS "module.exports" for node compatibility.
42
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
43
+ mod
44
+ ));
45
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
46
+
47
+ // src/charts/index.ts
48
+ var charts_exports = {};
49
+ __export(charts_exports, {
50
+ BackofficeSwitchableChart: () => BackofficeSwitchableChart,
51
+ FRONTEND_STACKED_CHART_MOCK_COLORS: () => FRONTEND_STACKED_CHART_MOCK_COLORS,
52
+ FRONTEND_STACKED_CHART_MOCK_DATA: () => FRONTEND_STACKED_CHART_MOCK_DATA,
53
+ FRONTEND_STACKED_CHART_MOCK_LABELS: () => FRONTEND_STACKED_CHART_MOCK_LABELS,
54
+ FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS: () => FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS,
55
+ FrontendBarChart: () => FrontendBarChart,
56
+ FrontendDoughnutChart: () => FrontendDoughnutChart,
57
+ FrontendIncomeExpenseHorizontalBarChart: () => FrontendIncomeExpenseHorizontalBarChart,
58
+ FrontendLiabilitiesChart: () => FrontendLiabilitiesChart,
59
+ FrontendLineChart: () => FrontendLineChart,
60
+ FrontendLineChartMobile: () => FrontendLineChartMobile,
61
+ FrontendMixedChart: () => FrontendMixedChart,
62
+ FrontendPercentageBar: () => FrontendPercentageBar,
63
+ FrontendScenarioLineChart: () => FrontendScenarioLineChart,
64
+ FrontendStackedChart: () => FrontendStackedChart,
65
+ LoadingChartBackdrop: () => LoadingChartBackdrop,
66
+ buildChartDataFromObject: () => buildChartDataFromObject,
67
+ convertToFloat: () => convertToFloat,
68
+ formatNumber: () => formatNumber,
69
+ formatNumberWithDollar: () => formatNumberWithDollar,
70
+ formatNumberWithText: () => formatNumberWithText,
71
+ getChartOptions: () => getChartOptions,
72
+ mockBarChartData: () => mockBarChartData,
73
+ mockDoughnutData: () => mockDoughnutData,
74
+ mockLiabilitiesParts: () => mockLiabilitiesParts,
75
+ mockLineChartData: () => mockLineChartData,
76
+ mockMixedChartDatasets: () => mockMixedChartDatasets,
77
+ mockMobileLineChartData: () => mockMobileLineChartData,
78
+ mockPercentageBarColors: () => mockPercentageBarColors,
79
+ mockPercentageBarParts: () => mockPercentageBarParts,
80
+ mockScenarioData: () => mockScenarioData,
81
+ mockScenarioSecondaryData: () => mockScenarioSecondaryData,
82
+ tooltipsBaseOption: () => tooltipsBaseOption
83
+ });
84
+ module.exports = __toCommonJS(charts_exports);
85
+
86
+ // src/theme/constants.ts
87
+ var FOUNDATION_COLORS = {
88
+ // Brand are tenant-driven; defaults for fallback
89
+ brand: {
90
+ primary: "#33FF99",
91
+ secondary: "#162029"
92
+ },
93
+ text: {
94
+ primary: "#040D13",
95
+ secondary: "#4A5C6A",
96
+ disabled: "#9EAAB5",
97
+ inverse: "#FFFFFF"
98
+ },
99
+ background: {
100
+ primary: "#FFFFFF",
101
+ secondary: "#F5F8FA",
102
+ tertiary: "#E8EAEC",
103
+ elevated: "#FFFFFF"
104
+ },
105
+ border: {
106
+ default: "#E8EAEC",
107
+ focus: "#33FF99",
108
+ // default only; at runtime --color-border-focus uses brand primary
109
+ error: "#F44336"
110
+ },
111
+ state: {
112
+ error: "#F44336",
113
+ warning: "#FF9800",
114
+ success: "#4CAF50",
115
+ info: "#2196F3"
116
+ }
117
+ };
118
+ var DEFAULT_THEME_OPTIONS = {
119
+ primary: FOUNDATION_COLORS.brand.primary,
120
+ secondary: FOUNDATION_COLORS.brand.secondary
121
+ };
122
+
123
+ // src/theme/typography.ts
124
+ var FONT_FAMILY_SANS = '"Proxima Nova", sans-serif';
125
+ function style(weight, size, lineHeight, extra) {
126
+ return __spreadValues({ fontWeight: weight, fontSize: size, lineHeight }, extra);
127
+ }
128
+ var TYPOGRAPHY_DISPLAY = {
129
+ large: style(700, "4rem", "4.5rem", { letterSpacing: "-0.03125rem" }),
130
+ medium: style(700, "3rem", "3.5rem"),
131
+ small: style(600, "2.125rem", "2.625rem")
132
+ };
133
+ var TYPOGRAPHY_HEADING = {
134
+ h1: style(700, "2rem", "2.5rem"),
135
+ h2: style(600, "1.75rem", "2.25rem"),
136
+ h3: style(600, "1.5rem", "2rem"),
137
+ h4: style(600, "1.3125rem", "1.75rem"),
138
+ h5: style(600, "1.125rem", "1.5rem"),
139
+ h6: style(600, "1rem", "1.375rem")
140
+ };
141
+ var TYPOGRAPHY_BODY = {
142
+ large: style(400, "1.125rem", "1.75rem"),
143
+ medium: style(400, "1rem", "1.5rem"),
144
+ small: style(400, "0.875rem", "1.25rem")
145
+ };
146
+ var TYPOGRAPHY_LABEL = {
147
+ large: style(600, "1rem", "1.25rem"),
148
+ medium: style(600, "0.875rem", "1.125rem"),
149
+ small: style(600, "0.75rem", "1rem", { letterSpacing: "0.03125rem" })
150
+ };
151
+ var TYPOGRAPHY_UTILITY = {
152
+ caption: style(400, "0.75rem", "1rem"),
153
+ overline: style(600, "0.625rem", "0.875rem", {
154
+ letterSpacing: "0.09375rem",
155
+ textTransform: "uppercase"
156
+ }),
157
+ code: style(400, "0.875rem", "1.25rem")
158
+ };
159
+ var RESPONSIVE_DISPLAY_MOBILE = {
160
+ displayLarge: style(700, "2.5rem", "2.8125rem", { letterSpacing: "-0.03125rem" }),
161
+ displayMedium: style(700, "2rem", "2.334rem"),
162
+ h1: style(700, "1.75rem", "2.1875rem"),
163
+ h2: style(600, "1.5rem", "1.93rem")
164
+ };
165
+ var RESPONSIVE_DISPLAY_TABLET = {
166
+ displayLarge: style(700, "3.6rem", "4.05rem", { letterSpacing: "-0.03125rem" }),
167
+ displayMedium: style(700, "2.7rem", "3.15rem"),
168
+ displaySmall: style(600, "1.9125rem", "2.3625rem")
169
+ };
170
+
171
+ // src/charts/chart-utils.ts
172
+ var tooltipsBaseOption = {
173
+ enabled: true,
174
+ mode: "nearest",
175
+ intersect: false,
176
+ backgroundColor: FOUNDATION_COLORS.background.primary,
177
+ titleColor: FOUNDATION_COLORS.text.primary,
178
+ bodyColor: FOUNDATION_COLORS.text.primary,
179
+ displayColors: false,
180
+ borderColor: FOUNDATION_COLORS.text.primary,
181
+ borderWidth: 1,
182
+ titleFont: {
183
+ family: FONT_FAMILY_SANS,
184
+ style: "normal",
185
+ size: 14
186
+ },
187
+ bodyFont: {
188
+ family: FONT_FAMILY_SANS,
189
+ style: "normal",
190
+ weight: "bold",
191
+ size: 13
192
+ }
193
+ };
194
+ var buildChartDataFromObject = (chartDataObject = {}) => {
195
+ return Object.keys(chartDataObject).map((key) => ({
196
+ x: key,
197
+ y: chartDataObject[key]
198
+ }));
199
+ };
200
+ var formatNumber = (value) => {
201
+ return value.toLocaleString("en-US");
202
+ };
203
+ var formatNumberWithText = (value, precision = 1) => {
204
+ if (Math.abs(value) >= 1e6) {
205
+ return `$${(value / 1e6).toFixed(precision)}M`;
206
+ }
207
+ if (Math.abs(value) >= 1e3) {
208
+ return `$${(value / 1e3).toFixed(precision)}K`;
209
+ }
210
+ return `$${value.toFixed(0)}`;
211
+ };
212
+ var formatNumberWithDollar = (value) => {
213
+ return `$${formatNumber(value)}`;
214
+ };
215
+ var convertToFloat = (value, precision) => {
216
+ return parseFloat(value.toFixed(precision)).toString();
217
+ };
218
+
219
+ // src/charts/LoadingChartBackdrop.tsx
220
+ var import_material = require("@mui/material");
221
+ var import_jsx_runtime = require("react/jsx-runtime");
222
+ var LoadingChartBackdrop = ({
223
+ isLoading,
224
+ isError
225
+ }) => {
226
+ if (isError) {
227
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Oops! Something went wrong. Chart data has been lost. Please try again after a few minutes." });
228
+ }
229
+ if (isLoading) {
230
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_jsx_runtime.Fragment, { children: [
231
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_material.CircularProgress, { color: "inherit", size: 24 }),
232
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: "Loading chart data..." })
233
+ ] });
234
+ }
235
+ return null;
236
+ };
237
+ LoadingChartBackdrop.displayName = "LoadingChartBackdrop";
238
+
239
+ // src/charts/BackofficeSwitchableChart.tsx
240
+ var import_react = require("react");
241
+ var import_material2 = require("@mui/material");
242
+ var import_styles = require("@mui/material/styles");
243
+ var import_StackedLineChart = __toESM(require("@mui/icons-material/StackedLineChart"));
244
+ var import_Equalizer = __toESM(require("@mui/icons-material/Equalizer"));
245
+ var import_chart = require("chart.js");
246
+ var import_chartjs_adapter_date_fns = require("chartjs-adapter-date-fns");
247
+ var import_react_chartjs_2 = require("react-chartjs-2");
248
+ var import_date_fns = require("date-fns");
249
+ var import_jsx_runtime2 = require("react/jsx-runtime");
250
+ import_chart.Chart.register(
251
+ import_chart.CategoryScale,
252
+ import_chart.LinearScale,
253
+ import_chart.TimeScale,
254
+ import_chart.PointElement,
255
+ import_chart.LineElement,
256
+ import_chart.BarElement,
257
+ import_chart.Title,
258
+ import_chart.Tooltip,
259
+ import_chart.Legend
260
+ );
261
+ function getChartOptions(options) {
262
+ var _a, _b;
263
+ const primaryColor = (_a = options == null ? void 0 : options.primaryColor) != null ? _a : FOUNDATION_COLORS.brand.primary;
264
+ const textColor = (_b = options == null ? void 0 : options.textColor) != null ? _b : FOUNDATION_COLORS.text.primary;
265
+ return {
266
+ scales: {
267
+ x: {
268
+ grid: {
269
+ display: false
270
+ },
271
+ stacked: false,
272
+ type: "time",
273
+ time: {
274
+ unit: "month"
275
+ },
276
+ ticks: {
277
+ callback: (value) => {
278
+ if (typeof value === "number" && value > 0) {
279
+ return (0, import_date_fns.format)(new Date(value), "MMM").toUpperCase();
280
+ }
281
+ const parsedValue = Number(value);
282
+ return Number.isNaN(parsedValue) ? "" : (0, import_date_fns.format)(new Date(parsedValue), "MMM").toUpperCase();
283
+ }
284
+ }
285
+ },
286
+ y: {
287
+ grid: {
288
+ display: false
289
+ },
290
+ stacked: false,
291
+ ticks: {
292
+ stepSize: 1,
293
+ maxTicksLimit: 5
294
+ }
295
+ }
296
+ },
297
+ maintainAspectRatio: false,
298
+ responsive: true,
299
+ plugins: {
300
+ tooltip: __spreadProps(__spreadValues({}, tooltipsBaseOption), {
301
+ mode: "nearest"
302
+ }),
303
+ legend: {
304
+ display: false
305
+ }
306
+ },
307
+ interaction: {
308
+ mode: "nearest",
309
+ intersect: false
310
+ }
311
+ };
312
+ return {
313
+ responsive: true,
314
+ maintainAspectRatio: false,
315
+ plugins: {
316
+ legend: {
317
+ display: true,
318
+ labels: {
319
+ color: textColor,
320
+ usePointStyle: true
321
+ }
322
+ },
323
+ tooltip: __spreadProps(__spreadValues({}, tooltipsBaseOption), {
324
+ titleColor: textColor,
325
+ bodyColor: textColor,
326
+ borderColor: primaryColor,
327
+ callbacks: {
328
+ label(tooltipItem) {
329
+ var _a2, _b2;
330
+ const value = (_b2 = (_a2 = tooltipItem.parsed) == null ? void 0 : _a2.y) != null ? _b2 : 0;
331
+ return `$${formatNumber(Math.abs(value))}`;
332
+ }
333
+ }
334
+ })
335
+ },
336
+ scales: {
337
+ x: {
338
+ type: "time",
339
+ time: { unit: "month" },
340
+ grid: { display: false },
341
+ ticks: { color: textColor, maxTicksLimit: 12 }
342
+ },
343
+ y: {
344
+ beginAtZero: true,
345
+ grid: { display: false },
346
+ ticks: {
347
+ color: textColor,
348
+ callback(value) {
349
+ return formatNumberWithText(Number(value), 1);
350
+ }
351
+ }
352
+ }
353
+ }
354
+ };
355
+ }
356
+ var ChartContainer = (0, import_styles.styled)("div")({
357
+ display: "flex",
358
+ width: "100%",
359
+ height: "100%",
360
+ minWidth: 0,
361
+ flexDirection: "column"
362
+ });
363
+ var ChartHeader = (0, import_styles.styled)("div")({
364
+ display: "flex",
365
+ justifyContent: "space-between",
366
+ alignItems: "center",
367
+ marginBottom: "1rem",
368
+ flexWrap: "wrap",
369
+ gap: "0.5rem"
370
+ });
371
+ var ChartTitle = (0, import_styles.styled)("div")({
372
+ fontSize: 16,
373
+ fontWeight: 600,
374
+ "@media (max-width: 768px)": { fontSize: 14 }
375
+ });
376
+ var ChartControls = (0, import_styles.styled)("div")({
377
+ display: "flex",
378
+ justifyContent: "flex-end",
379
+ marginBottom: 12
380
+ });
381
+ var ChartWrapper = (0, import_styles.styled)("div")({
382
+ flex: 1,
383
+ position: "relative",
384
+ minHeight: 250,
385
+ width: "100%",
386
+ height: "100%",
387
+ "@media (max-width: 768px)": { minHeight: 200 },
388
+ "@media (max-width: 480px)": { minHeight: 180 }
389
+ });
390
+ var LoadingOverlay = (0, import_styles.styled)("div")({
391
+ alignItems: "center",
392
+ backgroundColor: "rgba(255, 255, 255, 0.8)",
393
+ display: "flex",
394
+ flexDirection: "column",
395
+ height: "100%",
396
+ justifyContent: "center",
397
+ left: 0,
398
+ position: "absolute",
399
+ top: 0,
400
+ width: "100%",
401
+ "& span": { marginTop: "1rem" }
402
+ });
403
+ var BackofficeSwitchableChart = ({
404
+ chartTitle,
405
+ datasets,
406
+ chartOptions: chartOptionsOverride,
407
+ isLoading,
408
+ isError,
409
+ chartType,
410
+ onChartTypeChange,
411
+ primaryColor = FOUNDATION_COLORS.brand.primary,
412
+ textColor = FOUNDATION_COLORS.text.primary
413
+ }) => {
414
+ const chartRef = (0, import_react.useRef)(null);
415
+ const chartData = (0, import_react.useMemo)(() => ({ datasets }), [datasets]);
416
+ const responsiveChartOptions = (0, import_react.useMemo)(() => {
417
+ var _a, _b;
418
+ const base = getChartOptions({ primaryColor, textColor });
419
+ return __spreadProps(__spreadValues(__spreadValues({}, base), chartOptionsOverride), {
420
+ plugins: __spreadValues(__spreadValues({}, base.plugins), (_a = chartOptionsOverride == null ? void 0 : chartOptionsOverride.plugins) != null ? _a : {}),
421
+ scales: __spreadValues(__spreadValues({}, base.scales), (_b = chartOptionsOverride == null ? void 0 : chartOptionsOverride.scales) != null ? _b : {})
422
+ });
423
+ }, [primaryColor, textColor, chartOptionsOverride]);
424
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(ChartContainer, { children: [
425
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(ChartHeader, { children: [
426
+ chartTitle ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ChartTitle, { children: chartTitle }) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("div", {}),
427
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(ChartControls, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
428
+ import_material2.ButtonGroup,
429
+ {
430
+ size: "small",
431
+ "aria-label": "chart type selector",
432
+ sx: {
433
+ backgroundColor: "#fff",
434
+ borderRadius: "5px",
435
+ border: `1px solid ${primaryColor}`,
436
+ "& .MuiButton-root": {
437
+ minWidth: "32px",
438
+ minHeight: "32px",
439
+ padding: "4px",
440
+ border: "none",
441
+ color: textColor,
442
+ "&:hover": { boxShadow: "none" }
443
+ },
444
+ "& .MuiButton-contained": {
445
+ backgroundColor: primaryColor,
446
+ color: textColor,
447
+ "&:hover": { boxShadow: "none" }
448
+ }
449
+ },
450
+ children: [
451
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
452
+ import_material2.Button,
453
+ {
454
+ variant: chartType === "line" ? "contained" : "text",
455
+ onClick: () => onChartTypeChange("line"),
456
+ "aria-label": "Line chart",
457
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_StackedLineChart.default, { sx: { fontSize: 14 } })
458
+ }
459
+ ),
460
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
461
+ import_material2.Button,
462
+ {
463
+ variant: chartType === "bar" ? "contained" : "text",
464
+ onClick: () => onChartTypeChange("bar"),
465
+ "aria-label": "Bar chart",
466
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(import_Equalizer.default, { sx: { fontSize: 14 } })
467
+ }
468
+ )
469
+ ]
470
+ }
471
+ ) })
472
+ ] }),
473
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(ChartWrapper, { children: [
474
+ !isLoading && !isError && (chartType === "line" ? /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
475
+ import_react_chartjs_2.Line,
476
+ {
477
+ ref: chartRef,
478
+ data: chartData,
479
+ options: responsiveChartOptions
480
+ }
481
+ ) : /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
482
+ import_react_chartjs_2.Bar,
483
+ {
484
+ ref: chartRef,
485
+ data: chartData,
486
+ options: responsiveChartOptions
487
+ }
488
+ )),
489
+ (isLoading || isError) && /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(LoadingOverlay, { children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(LoadingChartBackdrop, { isLoading, isError }) })
490
+ ] })
491
+ ] });
492
+ };
493
+ BackofficeSwitchableChart.displayName = "BackofficeSwitchableChart";
494
+
495
+ // src/charts/FrontendLineChart.tsx
496
+ var import_react2 = require("react");
497
+ var import_styles2 = require("@mui/material/styles");
498
+ var import_chart2 = require("chart.js");
499
+ var import_chartjs_adapter_date_fns2 = require("chartjs-adapter-date-fns");
500
+ var import_react_chartjs_22 = require("react-chartjs-2");
501
+ var import_jsx_runtime3 = require("react/jsx-runtime");
502
+ import_chart2.Chart.register(
503
+ import_chart2.CategoryScale,
504
+ import_chart2.LinearScale,
505
+ import_chart2.PointElement,
506
+ import_chart2.LineElement,
507
+ import_chart2.LineController,
508
+ import_chart2.Title,
509
+ import_chart2.Tooltip,
510
+ import_chart2.Legend,
511
+ import_chart2.TimeScale
512
+ );
513
+ var ChartContainer2 = (0, import_styles2.styled)("div")({
514
+ width: "100%"
515
+ });
516
+ var ChartWrapper2 = (0, import_styles2.styled)("div")(
517
+ ({ chartHeight }) => ({
518
+ flex: "auto",
519
+ height: chartHeight || 270,
520
+ position: "relative",
521
+ width: "100%"
522
+ })
523
+ );
524
+ var buildChartData = (title, lineChartData, mainLineColor, referenceLineValue, referenceLineLabel, referenceLineColor = "#39FD99") => {
525
+ var _a, _b, _c, _d;
526
+ const datasets = lineChartData.map((dataset, index) => {
527
+ var _a2;
528
+ const color = ((_a2 = dataset.customOptions) == null ? void 0 : _a2.borderColor) || mainLineColor;
529
+ return __spreadValues({
530
+ type: "line",
531
+ label: dataset.label || title || `Dataset ${index + 1}`,
532
+ fill: false,
533
+ backgroundColor: color,
534
+ borderColor: color,
535
+ borderCapStyle: "butt",
536
+ borderDash: [],
537
+ borderDashOffset: 0,
538
+ borderJoinStyle: "miter",
539
+ pointBorderColor: color,
540
+ pointBackgroundColor: color,
541
+ pointBorderWidth: 1,
542
+ pointHoverRadius: 3,
543
+ pointHoverBackgroundColor: color,
544
+ pointHoverBorderColor: color,
545
+ pointHoverBorderWidth: 3,
546
+ pointRadius: 1,
547
+ pointHitRadius: 3,
548
+ borderWidth: 1.5,
549
+ tension: 0.4,
550
+ data: dataset.data
551
+ }, dataset.customOptions);
552
+ });
553
+ if (typeof referenceLineValue === "number" && lineChartData.length > 0 && ((_b = (_a = lineChartData[0]) == null ? void 0 : _a.data) == null ? void 0 : _b.length)) {
554
+ const firstDataset = lineChartData[0].data;
555
+ const firstX = (_c = firstDataset[0]) == null ? void 0 : _c.x;
556
+ const lastX = (_d = firstDataset[firstDataset.length - 1]) == null ? void 0 : _d.x;
557
+ const refData = firstX && lastX ? [
558
+ { x: firstX, y: referenceLineValue },
559
+ { x: lastX, y: referenceLineValue }
560
+ ] : firstDataset.map((p) => ({ x: p.x, y: referenceLineValue }));
561
+ datasets.push({
562
+ type: "line",
563
+ label: referenceLineLabel || "Target",
564
+ fill: false,
565
+ backgroundColor: referenceLineColor,
566
+ borderColor: referenceLineColor,
567
+ borderDash: [],
568
+ borderWidth: 1,
569
+ pointRadius: 0,
570
+ tension: 0,
571
+ data: refData,
572
+ legendHidden: true
573
+ });
574
+ }
575
+ return { datasets };
576
+ };
577
+ var buildChartOption = (customChartOptions, invertYAxis) => {
578
+ const baseOptions = {
579
+ scales: {
580
+ x: {
581
+ display: true,
582
+ grid: { display: false, drawOnChartArea: false, drawBorder: true },
583
+ stacked: true,
584
+ ticks: {
585
+ maxTicksLimit: 8,
586
+ autoSkip: true,
587
+ maxRotation: 0,
588
+ minRotation: 0,
589
+ beginAtZero: false,
590
+ source: "auto",
591
+ display: true
592
+ },
593
+ bounds: "data",
594
+ type: "time",
595
+ time: {
596
+ unit: "month",
597
+ stepSize: 1,
598
+ displayFormats: {
599
+ day: "MMM dd",
600
+ month: "MMM yyyy",
601
+ year: "yyyy"
602
+ }
603
+ },
604
+ distribution: "series"
605
+ },
606
+ y: {
607
+ display: true,
608
+ grid: {
609
+ display: false,
610
+ drawBorder: false,
611
+ drawOnChartArea: false,
612
+ color: "transparent"
613
+ },
614
+ border: { display: false },
615
+ reverse: invertYAxis,
616
+ position: "left",
617
+ ticks: {
618
+ beginAtZero: false,
619
+ display: true,
620
+ callback(value) {
621
+ return formatNumberWithText(Number(value), 1);
622
+ }
623
+ }
624
+ }
625
+ },
626
+ maintainAspectRatio: false,
627
+ responsive: true,
628
+ plugins: {
629
+ tooltip: __spreadProps(__spreadValues({}, tooltipsBaseOption), {
630
+ filter: (tooltipItem) => {
631
+ var _a;
632
+ if (tooltipItem.dataset.hideFromTooltip) {
633
+ const chartValue = (_a = tooltipItem.parsed) == null ? void 0 : _a.y;
634
+ const referenceValue = tooltipItem.dataset.referenceLineValue;
635
+ return chartValue !== referenceValue;
636
+ }
637
+ return true;
638
+ },
639
+ callbacks: {
640
+ title(tooltipItems) {
641
+ var _a;
642
+ const tooltipItem = tooltipItems[0];
643
+ if ((_a = tooltipItem == null ? void 0 : tooltipItem.parsed) == null ? void 0 : _a.x) {
644
+ const date = new Date(tooltipItem.parsed.x);
645
+ return date.toLocaleDateString("en-US", {
646
+ year: "numeric",
647
+ month: "2-digit",
648
+ day: "2-digit"
649
+ });
650
+ }
651
+ return "";
652
+ },
653
+ label(tooltipItem) {
654
+ var _a, _b;
655
+ const chartValue = (_b = (_a = tooltipItem.parsed) == null ? void 0 : _a.y) != null ? _b : 0;
656
+ const chartValueWithCommas = formatNumber(Math.abs(chartValue));
657
+ const chartTitle = tooltipItem.dataset.label;
658
+ return `${chartTitle} ${chartValue >= 0 ? `$${chartValueWithCommas}` : `-$${chartValueWithCommas}`}`.trim();
659
+ }
660
+ }
661
+ })
662
+ },
663
+ interaction: { mode: "nearest", intersect: false }
664
+ };
665
+ return __spreadValues(__spreadValues({}, baseOptions), customChartOptions);
666
+ };
667
+ var buildChartLegend = (legendDisplay) => ({
668
+ display: legendDisplay,
669
+ position: "bottom",
670
+ fullSize: true,
671
+ reverse: false,
672
+ labels: {
673
+ color: "#000",
674
+ filter: (legendItem, data) => {
675
+ var _a;
676
+ const ds = (_a = data == null ? void 0 : data.datasets) == null ? void 0 : _a[legendItem.datasetIndex];
677
+ return !(ds == null ? void 0 : ds.legendHidden);
678
+ }
679
+ }
680
+ });
681
+ var FrontendLineChart = ({
682
+ lineChartData = [],
683
+ legendDisplay = true,
684
+ title = "",
685
+ customChartOptions = {},
686
+ height,
687
+ invertYAxis = false,
688
+ referenceLineValue,
689
+ referenceLineLabel,
690
+ mainLineColor = "#162029",
691
+ referenceLineColor = "#39FD99"
692
+ }) => {
693
+ const chartRef = (0, import_react2.useRef)(null);
694
+ const chartData = (0, import_react2.useMemo)(
695
+ () => buildChartData(
696
+ title,
697
+ lineChartData,
698
+ mainLineColor,
699
+ referenceLineValue,
700
+ referenceLineLabel,
701
+ referenceLineColor
702
+ ),
703
+ [lineChartData, title, mainLineColor, referenceLineValue, referenceLineLabel, referenceLineColor]
704
+ );
705
+ const chartOption = (0, import_react2.useMemo)(
706
+ () => buildChartOption(customChartOptions, invertYAxis),
707
+ [customChartOptions, invertYAxis]
708
+ );
709
+ const chartLegend = (0, import_react2.useMemo)(() => buildChartLegend(legendDisplay), [legendDisplay]);
710
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ChartContainer2, { children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(ChartWrapper2, { chartHeight: height, children: /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
711
+ import_react_chartjs_22.Chart,
712
+ {
713
+ ref: chartRef,
714
+ type: "line",
715
+ data: chartData,
716
+ options: __spreadProps(__spreadValues({}, chartOption), {
717
+ plugins: __spreadProps(__spreadValues({}, chartOption.plugins), {
718
+ legend: chartLegend
719
+ })
720
+ })
721
+ }
722
+ ) }) });
723
+ };
724
+ FrontendLineChart.displayName = "FrontendLineChart";
725
+
726
+ // src/charts/FrontendLineChartMobile.tsx
727
+ var import_react3 = require("react");
728
+ var import_styles3 = require("@mui/material/styles");
729
+ var import_chart3 = require("chart.js");
730
+ var import_chartjs_adapter_date_fns3 = require("chartjs-adapter-date-fns");
731
+ var import_react_chartjs_23 = require("react-chartjs-2");
732
+ var import_jsx_runtime4 = require("react/jsx-runtime");
733
+ import_chart3.Chart.register(
734
+ import_chart3.CategoryScale,
735
+ import_chart3.LinearScale,
736
+ import_chart3.PointElement,
737
+ import_chart3.LineElement,
738
+ import_chart3.LineController,
739
+ import_chart3.Title,
740
+ import_chart3.Tooltip,
741
+ import_chart3.Legend,
742
+ import_chart3.TimeScale
743
+ );
744
+ var ChartContainer3 = (0, import_styles3.styled)("div")({
745
+ width: "100%"
746
+ });
747
+ var ChartSize = (0, import_styles3.styled)("div")({
748
+ flex: "auto",
749
+ height: 200,
750
+ position: "relative",
751
+ width: "100%"
752
+ });
753
+ var MobileChartTitleWrapper = (0, import_styles3.styled)("div")({
754
+ padding: "8px 0"
755
+ });
756
+ var MobileChartTitleText = (0, import_styles3.styled)("div")({
757
+ fontSize: 14,
758
+ color: "#656566"
759
+ });
760
+ var MobileChartTitleBold = (0, import_styles3.styled)("span")({
761
+ fontWeight: 600,
762
+ color: "#131c24"
763
+ });
764
+ var MobileChartValue = (0, import_styles3.styled)("div")({
765
+ fontSize: 24,
766
+ fontWeight: 700,
767
+ color: "#131c24",
768
+ marginTop: 4
769
+ });
770
+ var LegendContainer = (0, import_styles3.styled)("div")({
771
+ display: "flex",
772
+ flexWrap: "wrap",
773
+ gap: 12,
774
+ marginTop: 8,
775
+ paddingLeft: 30
776
+ });
777
+ var LegendWrap = (0, import_styles3.styled)("div")({
778
+ display: "flex",
779
+ alignItems: "center",
780
+ gap: 6
781
+ });
782
+ var LegendBox = (0, import_styles3.styled)("div")(({ isDashed }) => __spreadValues({
783
+ width: 12,
784
+ height: isDashed ? 0 : 12,
785
+ borderRadius: 2,
786
+ flexShrink: 0
787
+ }, isDashed ? {
788
+ borderTop: "2px dashed #A1B9BD",
789
+ width: 12
790
+ } : {}));
791
+ var LegendFont = (0, import_styles3.styled)("span")({
792
+ fontSize: 12,
793
+ color: "#656566"
794
+ });
795
+ var BORDER_COLOR = "#A1B9BD";
796
+ var buildChartData2 = (lineChartData, defaultColor) => ({
797
+ datasets: lineChartData.map((chartData) => {
798
+ const {
799
+ label = "",
800
+ data = [],
801
+ color = defaultColor,
802
+ lineSpacing = [],
803
+ borderWidth = 2,
804
+ customOptions = {}
805
+ } = chartData;
806
+ return __spreadValues({
807
+ label,
808
+ fill: false,
809
+ backgroundColor: color,
810
+ borderColor: color,
811
+ borderCapStyle: "butt",
812
+ borderDash: lineSpacing,
813
+ borderDashOffset: 0,
814
+ borderJoinStyle: "miter",
815
+ pointBorderColor: color,
816
+ pointBackgroundColor: color,
817
+ pointBorderWidth: 0,
818
+ pointHoverRadius: 6,
819
+ pointHoverBackgroundColor: "#ffffff",
820
+ pointHoverBorderColor: color,
821
+ pointHoverBorderWidth: 2,
822
+ pointRadius: 0,
823
+ borderWidth,
824
+ pointHitRadius: 3,
825
+ data,
826
+ tension: 0.4
827
+ }, customOptions);
828
+ })
829
+ });
830
+ var getMinMaxInArray = (mathFn, array, property) => {
831
+ return Math[mathFn](
832
+ ...array.map(
833
+ (chartItem) => Math[mathFn](...chartItem.data.map((item) => Number(item[property])))
834
+ )
835
+ );
836
+ };
837
+ var buildChartOption2 = (minChartData, maxChartData, setChartTitleValue, customChartOptions) => {
838
+ const baseOptions = {
839
+ layout: {
840
+ padding: { left: 30, right: 30, top: 0, bottom: 0 }
841
+ },
842
+ scales: {
843
+ x: {
844
+ display: false,
845
+ grid: { display: false },
846
+ ticks: { padding: 25 },
847
+ stacked: true,
848
+ bounds: "data",
849
+ type: "time",
850
+ distribution: "linear"
851
+ },
852
+ y: {
853
+ type: "linear",
854
+ display: false,
855
+ position: "right",
856
+ ticks: {
857
+ padding: 25,
858
+ min: minChartData,
859
+ max: maxChartData
860
+ }
861
+ }
862
+ },
863
+ maintainAspectRatio: false,
864
+ responsive: true,
865
+ plugins: {
866
+ tooltip: { enabled: false },
867
+ legend: { display: false }
868
+ },
869
+ interaction: { mode: "nearest", intersect: false },
870
+ onHover: (_event, activeElements, chart) => {
871
+ var _a, _b, _c;
872
+ if (activeElements.length) {
873
+ const datasetIndex = ((_a = activeElements[0]) == null ? void 0 : _a.datasetIndex) || 0;
874
+ const elementIndex = ((_b = activeElements[0]) == null ? void 0 : _b.index) || 0;
875
+ const dataset = chart.data.datasets[datasetIndex];
876
+ if ((_c = dataset == null ? void 0 : dataset.data) == null ? void 0 : _c[elementIndex]) {
877
+ setChartTitleValue({
878
+ index: datasetIndex,
879
+ value: dataset.data[elementIndex].y
880
+ });
881
+ }
882
+ }
883
+ }
884
+ };
885
+ return __spreadValues(__spreadValues({}, baseOptions), customChartOptions);
886
+ };
887
+ var drawVerticalLine = {
888
+ id: "drawVerticalLine",
889
+ afterDraw(chart) {
890
+ var _a, _b, _c;
891
+ if (((_b = (_a = chart.tooltip) == null ? void 0 : _a._active) == null ? void 0 : _b.length) && chart.config.type === "line") {
892
+ const activePoint = chart.tooltip._active[0];
893
+ if (!activePoint) return;
894
+ const { ctx } = chart;
895
+ const yAxis = chart.scales.y;
896
+ const { x } = activePoint.element;
897
+ const topY = yAxis.top;
898
+ const bottomY = yAxis.bottom;
899
+ const datasetIndex = activePoint.datasetIndex;
900
+ const dataIndex = activePoint.index;
901
+ const dataset = chart.data.datasets[datasetIndex];
902
+ const point = (_c = dataset == null ? void 0 : dataset.data) == null ? void 0 : _c[dataIndex];
903
+ let dateStr = "";
904
+ if (point == null ? void 0 : point.x) {
905
+ const date = new Date(point.x);
906
+ const mm = String(date.getMonth() + 1).padStart(2, "0");
907
+ const yyyy = date.getFullYear();
908
+ dateStr = `${yyyy}/${mm}`;
909
+ }
910
+ ctx.save();
911
+ ctx.beginPath();
912
+ ctx.moveTo(x, topY);
913
+ ctx.lineTo(x, bottomY - 20);
914
+ ctx.lineWidth = 2;
915
+ ctx.strokeStyle = BORDER_COLOR;
916
+ ctx.textAlign = "center";
917
+ ctx.textBaseline = "middle";
918
+ ctx.font = "14px sans-serif";
919
+ ctx.fillText(dateStr, x, bottomY - 10);
920
+ ctx.stroke();
921
+ ctx.restore();
922
+ }
923
+ }
924
+ };
925
+ var MobileChartTitle = ({
926
+ title = "",
927
+ subTitle = "",
928
+ value = 0
929
+ }) => /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MobileChartTitleWrapper, { children: [
930
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(MobileChartTitleText, { children: [
931
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MobileChartTitleBold, { children: title }),
932
+ " ",
933
+ subTitle
934
+ ] }),
935
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(MobileChartValue, { children: formatNumberWithDollar(value) })
936
+ ] });
937
+ var FrontendLineChartMobile = ({
938
+ chartTitle = "",
939
+ subTitle,
940
+ titleValue = 0,
941
+ chartData: lineChartData = [],
942
+ defaultColor = "#162029",
943
+ customChartOptions = {}
944
+ }) => {
945
+ var _a;
946
+ const [lineChartTitleValue, setLineChartTitleValue] = (0, import_react3.useState)({
947
+ index: 0,
948
+ value: 0
949
+ });
950
+ const lineChart = (0, import_react3.useRef)(null);
951
+ const minChartData = (0, import_react3.useMemo)(
952
+ () => lineChartData.length > 0 ? getMinMaxInArray("min", lineChartData, "y") : 0,
953
+ [lineChartData]
954
+ );
955
+ const maxChartData = (0, import_react3.useMemo)(
956
+ () => lineChartData.length > 0 ? getMinMaxInArray("max", lineChartData, "y") : 100,
957
+ [lineChartData]
958
+ );
959
+ const yAxisInnerPadding = Math.max(
960
+ minChartData * 0.2,
961
+ (maxChartData - minChartData) * 0.2
962
+ );
963
+ const data = (0, import_react3.useMemo)(
964
+ () => buildChartData2(lineChartData, defaultColor),
965
+ [lineChartData, defaultColor]
966
+ );
967
+ const options = (0, import_react3.useMemo)(
968
+ () => buildChartOption2(
969
+ minChartData - yAxisInnerPadding * 0.2,
970
+ maxChartData + yAxisInnerPadding * 0.2,
971
+ setLineChartTitleValue,
972
+ customChartOptions
973
+ ),
974
+ [minChartData, maxChartData, yAxisInnerPadding, customChartOptions]
975
+ );
976
+ const currentTitle = ((_a = lineChartData == null ? void 0 : lineChartData[lineChartTitleValue.index]) == null ? void 0 : _a.label) || chartTitle;
977
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(import_jsx_runtime4.Fragment, { children: [
978
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
979
+ MobileChartTitle,
980
+ {
981
+ title: currentTitle,
982
+ subTitle,
983
+ value: lineChartTitleValue.value || titleValue
984
+ }
985
+ ),
986
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(ChartContainer3, { children: [
987
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(ChartSize, { children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
988
+ import_react_chartjs_23.Chart,
989
+ {
990
+ type: "line",
991
+ ref: lineChart,
992
+ data,
993
+ options,
994
+ plugins: [drawVerticalLine]
995
+ }
996
+ ) }),
997
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LegendContainer, { children: lineChartData.map((ds, index) => {
998
+ var _a2, _b;
999
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsxs)(LegendWrap, { children: [
1000
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1001
+ LegendBox,
1002
+ {
1003
+ isDashed: !!((_a2 = ds.lineSpacing) == null ? void 0 : _a2.length),
1004
+ style: ((_b = ds.lineSpacing) == null ? void 0 : _b.length) ? {} : {
1005
+ backgroundColor: ds.color || defaultColor
1006
+ }
1007
+ }
1008
+ ),
1009
+ /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(LegendFont, { children: ds.label || "" })
1010
+ ] }, ds.label || index);
1011
+ }) })
1012
+ ] })
1013
+ ] });
1014
+ };
1015
+ FrontendLineChartMobile.displayName = "FrontendLineChartMobile";
1016
+
1017
+ // src/charts/FrontendBarChart.tsx
1018
+ var import_react4 = require("react");
1019
+ var import_styles4 = require("@mui/material/styles");
1020
+ var import_chart4 = require("chart.js");
1021
+ var import_react_chartjs_24 = require("react-chartjs-2");
1022
+ var import_jsx_runtime5 = require("react/jsx-runtime");
1023
+ import_chart4.Chart.register(
1024
+ import_chart4.CategoryScale,
1025
+ import_chart4.LinearScale,
1026
+ import_chart4.BarElement,
1027
+ import_chart4.BarController,
1028
+ import_chart4.Title,
1029
+ import_chart4.Tooltip,
1030
+ import_chart4.Legend
1031
+ );
1032
+ var ChartWrapper3 = (0, import_styles4.styled)("div")({
1033
+ position: "relative",
1034
+ height: 300,
1035
+ width: "100%"
1036
+ });
1037
+ var baseChartOptions = {
1038
+ maintainAspectRatio: false,
1039
+ responsive: true,
1040
+ plugins: {
1041
+ legend: { display: false },
1042
+ tooltip: __spreadProps(__spreadValues({}, tooltipsBaseOption), {
1043
+ callbacks: {
1044
+ label(tooltipItem) {
1045
+ const { parsed = { y: 0 } } = tooltipItem;
1046
+ const chartValue = parsed.y;
1047
+ const chartValueWithCommas = formatNumber(Math.abs(chartValue));
1048
+ return `${chartValue > 0 ? `$${chartValueWithCommas}` : `-$${chartValueWithCommas}`} `;
1049
+ }
1050
+ }
1051
+ })
1052
+ },
1053
+ scales: {
1054
+ x: {
1055
+ grid: { display: true, drawBorder: true, drawOnChartArea: false }
1056
+ },
1057
+ y: {
1058
+ display: true,
1059
+ position: "left",
1060
+ grid: { display: false, drawBorder: false },
1061
+ ticks: {
1062
+ padding: 10,
1063
+ callback(value) {
1064
+ return formatNumberWithText(Number(value), 1);
1065
+ }
1066
+ }
1067
+ }
1068
+ }
1069
+ };
1070
+ var mergeOptions = (base, custom) => {
1071
+ if (!custom) return base;
1072
+ return deepMerge(base, custom);
1073
+ };
1074
+ var deepMerge = (target, source) => {
1075
+ const result = __spreadValues({}, target);
1076
+ for (const key of Object.keys(source)) {
1077
+ if (source[key] && typeof source[key] === "object" && !Array.isArray(source[key]) && target[key] && typeof target[key] === "object") {
1078
+ result[key] = deepMerge(target[key], source[key]);
1079
+ } else {
1080
+ result[key] = source[key];
1081
+ }
1082
+ }
1083
+ return result;
1084
+ };
1085
+ var FrontendBarChart = ({
1086
+ data,
1087
+ customChartOptions
1088
+ }) => {
1089
+ const options = (0, import_react4.useMemo)(
1090
+ () => mergeOptions(baseChartOptions, customChartOptions),
1091
+ [customChartOptions]
1092
+ );
1093
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(ChartWrapper3, { children: /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(import_react_chartjs_24.Chart, { type: "bar", data, options }) });
1094
+ };
1095
+ FrontendBarChart.displayName = "FrontendBarChart";
1096
+
1097
+ // src/charts/FrontendDoughnutChart.tsx
1098
+ var import_react5 = require("react");
1099
+ var import_styles5 = require("@mui/material/styles");
1100
+ var import_material3 = require("@mui/material");
1101
+ var import_chart5 = require("chart.js");
1102
+ var import_react_chartjs_25 = require("react-chartjs-2");
1103
+ var import_jsx_runtime6 = require("react/jsx-runtime");
1104
+ import_chart5.Chart.register(import_chart5.ArcElement, import_chart5.DoughnutController, import_chart5.Tooltip, import_chart5.Legend);
1105
+ var getChartColorRange = (spectrum, count) => {
1106
+ if (count <= 1) return [spectrum[0] || "#162029"];
1107
+ const result = [];
1108
+ for (let i = 0; i < count; i++) {
1109
+ const ratio = i / (count - 1);
1110
+ const fromIdx = Math.floor(ratio * (spectrum.length - 1));
1111
+ const toIdx = Math.min(fromIdx + 1, spectrum.length - 1);
1112
+ const localRatio = ratio * (spectrum.length - 1) - fromIdx;
1113
+ const from = spectrum[fromIdx];
1114
+ const to = spectrum[toIdx];
1115
+ result.push(interpolateColor(from, to, localRatio));
1116
+ }
1117
+ return result;
1118
+ };
1119
+ var interpolateColor = (c1, c2, t) => {
1120
+ const parse = (hex) => {
1121
+ const h = hex.replace("#", "");
1122
+ return [
1123
+ parseInt(h.substring(0, 2), 16),
1124
+ parseInt(h.substring(2, 4), 16),
1125
+ parseInt(h.substring(4, 6), 16)
1126
+ ];
1127
+ };
1128
+ const [r1, g1, b1] = parse(c1);
1129
+ const [r2, g2, b2] = parse(c2);
1130
+ const lerp = (a, b) => Math.round(a + (b - a) * t);
1131
+ const toHex = (n) => n.toString(16).padStart(2, "0");
1132
+ return `#${toHex(lerp(r1, r2))}${toHex(lerp(g1, g2))}${toHex(lerp(b1, b2))}`;
1133
+ };
1134
+ var generateChartColor = (dataLength, providedColors) => {
1135
+ if (providedColors.length > 0) return providedColors;
1136
+ const spectrum = ["#162029", "#A1B9BD"];
1137
+ return getChartColorRange(spectrum, dataLength);
1138
+ };
1139
+ var ChartContainer4 = (0, import_styles5.styled)("div")({
1140
+ alignItems: "center",
1141
+ display: "flex",
1142
+ flexDirection: "column",
1143
+ width: "100%"
1144
+ });
1145
+ var ChartWrapper4 = (0, import_styles5.styled)("div")({
1146
+ display: "flex",
1147
+ alignItems: "center",
1148
+ justifyContent: "center",
1149
+ width: "100%"
1150
+ });
1151
+ var ChartSize2 = (0, import_styles5.styled)("div")({
1152
+ height: 160,
1153
+ maxWidth: 160,
1154
+ width: "100%"
1155
+ });
1156
+ var LegendContainer2 = (0, import_styles5.styled)("div")(
1157
+ ({ isCustom }) => ({
1158
+ display: "flex",
1159
+ flexDirection: isCustom ? "column" : "row",
1160
+ flexWrap: "wrap",
1161
+ gap: 8,
1162
+ marginTop: 16,
1163
+ width: "100%"
1164
+ })
1165
+ );
1166
+ var LegendWrap2 = (0, import_styles5.styled)("div")({
1167
+ display: "flex",
1168
+ alignItems: "center",
1169
+ gap: 8,
1170
+ padding: "4px 0"
1171
+ });
1172
+ var LegendBox2 = (0, import_styles5.styled)("div")({
1173
+ width: 12,
1174
+ height: 12,
1175
+ borderRadius: 2,
1176
+ flexShrink: 0
1177
+ });
1178
+ var LegendFont2 = (0, import_styles5.styled)("span")({
1179
+ fontSize: 13,
1180
+ lineHeight: 1.4
1181
+ });
1182
+ var LegendFontBold = (0, import_styles5.styled)("span")({
1183
+ fontSize: 13,
1184
+ fontWeight: 600,
1185
+ lineHeight: 1.4,
1186
+ display: "flex",
1187
+ alignItems: "center",
1188
+ gap: 4
1189
+ });
1190
+ var LegendBoxContainer = (0, import_styles5.styled)("div")({
1191
+ display: "flex",
1192
+ alignItems: "center"
1193
+ });
1194
+ var buildDoughnutChartOption = (textTop, textBottom, isBottomColor, bottomColor) => ({
1195
+ cutout: "85%",
1196
+ maintainAspectRatio: false,
1197
+ responsive: true,
1198
+ aspectRatio: 1,
1199
+ elements: {
1200
+ center: {
1201
+ textNumber: textTop,
1202
+ text: textBottom,
1203
+ fontColor: "#656566",
1204
+ topColor: "#131c24",
1205
+ bottomColor: isBottomColor ? bottomColor || "#131c24" : "#131c24",
1206
+ fontStyle: "normal"
1207
+ }
1208
+ },
1209
+ plugins: {
1210
+ legend: { display: false },
1211
+ tooltip: {
1212
+ mode: "nearest",
1213
+ intersect: true,
1214
+ callbacks: {
1215
+ label: (tooltipItem) => {
1216
+ const chartValue = tooltipItem.parsed;
1217
+ return `${tooltipItem.label}: ${formatNumberWithDollar(chartValue)}`;
1218
+ }
1219
+ },
1220
+ backgroundColor: "#fff",
1221
+ titleFont: { family: "sans-serif", size: 14 },
1222
+ titleColor: "#000",
1223
+ bodyFont: { family: "sans-serif", weight: "bold", size: 13 },
1224
+ bodyColor: "#000",
1225
+ displayColors: false,
1226
+ borderColor: "#000",
1227
+ borderWidth: 1
1228
+ }
1229
+ },
1230
+ interaction: { intersect: false },
1231
+ layout: { padding: {} }
1232
+ });
1233
+ var drawTextInsideDoughnutPlugin = {
1234
+ id: "doughnutCenterText",
1235
+ beforeDraw: (chart) => {
1236
+ var _a;
1237
+ if ((_a = chart.config.options.elements) == null ? void 0 : _a.center) {
1238
+ const { ctx } = chart;
1239
+ ctx.restore();
1240
+ const centerConfig = chart.config.options.elements.center;
1241
+ const fontBold = "sans-serif";
1242
+ const txt = centerConfig.textNumber;
1243
+ const { text } = centerConfig;
1244
+ const color = centerConfig.topColor;
1245
+ const maxFontSize = centerConfig.maxFontSize || 12;
1246
+ const sidePadding = centerConfig.sidePadding || 25;
1247
+ const sidePaddingCalculated = sidePadding / 100 * (chart.innerRadius * 2);
1248
+ ctx.font = `12px ${fontBold}`;
1249
+ const stringWidth = ctx.measureText(txt).width;
1250
+ const elementWidth = chart.innerRadius * 2 - sidePaddingCalculated;
1251
+ const widthRatio = elementWidth / stringWidth;
1252
+ const newFontSize = Math.floor(12 * widthRatio);
1253
+ const elementHeight = chart.innerRadius * 2;
1254
+ let fontSizeToUse = Math.min(newFontSize, elementHeight, maxFontSize);
1255
+ let { minFontSize } = centerConfig;
1256
+ const lineHeight = centerConfig.lineHeight || 12;
1257
+ let wrapText = false;
1258
+ if (minFontSize === void 0) minFontSize = 8;
1259
+ if (minFontSize && fontSizeToUse < minFontSize) {
1260
+ fontSizeToUse = minFontSize;
1261
+ wrapText = true;
1262
+ }
1263
+ ctx.textAlign = "center";
1264
+ ctx.textBaseline = "middle";
1265
+ const centerX = (chart.chartArea.left + chart.chartArea.right) / 2;
1266
+ let centerY = (chart.chartArea.top + chart.chartArea.bottom) / 2.2;
1267
+ const centerYY = chart.chartArea.top + chart.chartArea.bottom / 1.65;
1268
+ ctx.font = `${fontSizeToUse}px ${fontBold}`;
1269
+ ctx.fillStyle = color;
1270
+ if (!wrapText) {
1271
+ ctx.fillText(txt, centerX, centerY);
1272
+ const regularFont2 = "sans-serif";
1273
+ ctx.fillStyle = centerConfig.bottomColor;
1274
+ ctx.font = `${Math.min(fontSizeToUse * 0.5, 10)}px ${regularFont2}`;
1275
+ ctx.fillText(text, centerX, centerYY);
1276
+ return;
1277
+ }
1278
+ const words = txt.split(" ");
1279
+ let line = "";
1280
+ const lines = [];
1281
+ for (let n = 0; n < words.length; n++) {
1282
+ const testLine = `${line + words[n]} `;
1283
+ const metrics = ctx.measureText(testLine);
1284
+ const testWidth = metrics.width;
1285
+ if (testWidth > elementWidth && n > 0) {
1286
+ lines.push(line);
1287
+ line = `${words[n]} `;
1288
+ } else {
1289
+ line = testLine;
1290
+ }
1291
+ }
1292
+ centerY -= lines.length / 2 * lineHeight;
1293
+ ctx.restore();
1294
+ for (let n = 0; n < lines.length; n++) {
1295
+ ctx.fillText(lines[n], centerX, centerY);
1296
+ centerY += lineHeight;
1297
+ }
1298
+ ctx.fillText(line, centerX, centerY);
1299
+ const regularFont = "sans-serif";
1300
+ ctx.fillStyle = centerConfig.bottomColor;
1301
+ centerY += lineHeight;
1302
+ ctx.fillText(text, centerX, centerY);
1303
+ ctx.save();
1304
+ }
1305
+ }
1306
+ };
1307
+ var FrontendDoughnutChart = ({
1308
+ title,
1309
+ data,
1310
+ textTop = " ",
1311
+ textBottom = " ",
1312
+ legendDisplay = true,
1313
+ customLegend = false,
1314
+ isBottomColor = false,
1315
+ bottomColor = "#131c24"
1316
+ }) => {
1317
+ const chartRef = (0, import_react5.useRef)(null);
1318
+ const {
1319
+ data: dChartData = [],
1320
+ title: dChartTitle = [],
1321
+ colors: dChartColor = [],
1322
+ icons: dChartIcons = []
1323
+ } = data || {};
1324
+ const chartColors = (0, import_react5.useMemo)(
1325
+ () => generateChartColor(dChartData.length, dChartColor),
1326
+ [dChartData.length, dChartColor]
1327
+ );
1328
+ const chartOptions = (0, import_react5.useMemo)(
1329
+ () => buildDoughnutChartOption(textTop, textBottom, isBottomColor, bottomColor),
1330
+ [textTop, textBottom, isBottomColor, bottomColor]
1331
+ );
1332
+ const chartData = (0, import_react5.useMemo)(() => {
1333
+ if (!data || !dChartData.length) return { labels: [], datasets: [] };
1334
+ return {
1335
+ type: "doughnut",
1336
+ labels: dChartTitle,
1337
+ datasets: [
1338
+ {
1339
+ data: dChartData,
1340
+ backgroundColor: chartColors,
1341
+ hoverBackgroundColor: chartColors
1342
+ }
1343
+ ]
1344
+ };
1345
+ }, [data, dChartData, dChartTitle, chartColors]);
1346
+ if (!data || !dChartData.length) {
1347
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(ChartContainer4, { children: [
1348
+ title && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_material3.Typography, { variant: "subtitle2", color: "text.secondary", mb: 1, children: title }),
1349
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_material3.Box, { sx: { color: "text.disabled", py: 4 }, children: "No data" })
1350
+ ] });
1351
+ }
1352
+ const generateLegend = () => {
1353
+ if (customLegend) {
1354
+ return dChartData.map((chartDataset, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(LegendWrap2, { children: [
1355
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(LegendFontBold, { children: [
1356
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: dChartTitle[index] || "" }),
1357
+ (dChartIcons == null ? void 0 : dChartIcons[index]) && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)("span", { children: dChartIcons[index] })
1358
+ ] }),
1359
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendBoxContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendBox2, { style: { backgroundColor: chartColors[index] } }) }),
1360
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendFont2, { children: formatNumberWithDollar(chartDataset) })
1361
+ ] }, `${chartDataset}${index}`));
1362
+ }
1363
+ return dChartData.map((_chartDataset, index) => /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(LegendWrap2, { children: [
1364
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendBox2, { style: { backgroundColor: chartColors[index] } }),
1365
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendFont2, { children: dChartTitle[index] })
1366
+ ] }, dChartTitle[index]));
1367
+ };
1368
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(ChartContainer4, { children: [
1369
+ title && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(import_material3.Typography, { variant: "subtitle2", color: "text.secondary", mb: 1, children: title }),
1370
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(ChartWrapper4, { children: [
1371
+ /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(ChartSize2, { children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
1372
+ import_react_chartjs_25.Chart,
1373
+ {
1374
+ type: "doughnut",
1375
+ redraw: true,
1376
+ ref: chartRef,
1377
+ data: chartData,
1378
+ options: chartOptions,
1379
+ plugins: [drawTextInsideDoughnutPlugin]
1380
+ }
1381
+ ) }),
1382
+ legendDisplay && /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(LegendContainer2, { isCustom: customLegend, children: generateLegend() })
1383
+ ] })
1384
+ ] });
1385
+ };
1386
+ FrontendDoughnutChart.displayName = "FrontendDoughnutChart";
1387
+
1388
+ // src/charts/FrontendMixedChart.tsx
1389
+ var import_react6 = require("react");
1390
+ var import_styles6 = require("@mui/material/styles");
1391
+ var import_material4 = require("@mui/material");
1392
+ var import_chart6 = require("chart.js");
1393
+ var import_chartjs_adapter_date_fns4 = require("chartjs-adapter-date-fns");
1394
+ var import_react_chartjs_26 = require("react-chartjs-2");
1395
+ var import_jsx_runtime7 = require("react/jsx-runtime");
1396
+ import_chart6.Chart.register(
1397
+ import_chart6.CategoryScale,
1398
+ import_chart6.LinearScale,
1399
+ import_chart6.BarElement,
1400
+ import_chart6.BarController,
1401
+ import_chart6.PointElement,
1402
+ import_chart6.LineElement,
1403
+ import_chart6.LineController,
1404
+ import_chart6.Title,
1405
+ import_chart6.Tooltip,
1406
+ import_chart6.Legend,
1407
+ import_chart6.TimeScale
1408
+ );
1409
+ var FullwidthChartContainer = (0, import_styles6.styled)("div")({
1410
+ position: "relative",
1411
+ width: "100%"
1412
+ });
1413
+ var ChartHeader2 = (0, import_styles6.styled)("div")({
1414
+ display: "flex",
1415
+ justifyContent: "space-between",
1416
+ alignItems: "center",
1417
+ marginBottom: 12
1418
+ });
1419
+ var BarChartSize = (0, import_styles6.styled)("div")({
1420
+ flex: "auto",
1421
+ height: 300,
1422
+ position: "relative",
1423
+ width: "100%"
1424
+ });
1425
+ var LoadingIndicator = (0, import_styles6.styled)("div")({
1426
+ position: "absolute",
1427
+ top: 0,
1428
+ left: 0,
1429
+ right: 0,
1430
+ bottom: 0,
1431
+ display: "flex",
1432
+ flexDirection: "column",
1433
+ alignItems: "center",
1434
+ justifyContent: "center",
1435
+ backgroundColor: "rgba(255,255,255,0.8)"
1436
+ });
1437
+ var buildChartOption3 = (isMobile) => ({
1438
+ elements: { line: { fill: false } },
1439
+ scales: {
1440
+ x: {
1441
+ type: "time",
1442
+ offset: true,
1443
+ beginAtZero: false,
1444
+ display: true,
1445
+ time: {
1446
+ displayFormats: { month: "yyyy-MM", quarter: "yyyy-MM" },
1447
+ unit: "quarter",
1448
+ stepSize: 1,
1449
+ tooltipFormat: "yyyy-MM"
1450
+ },
1451
+ grid: { display: false, drawOnChartArea: false },
1452
+ ticks: {
1453
+ maxTicksLimit: isMobile ? 4 : 20,
1454
+ autoSkip: false,
1455
+ maxRotation: 0,
1456
+ minRotation: 0,
1457
+ beginAtZero: false,
1458
+ source: "auto"
1459
+ }
1460
+ },
1461
+ y: {
1462
+ type: "linear",
1463
+ display: true,
1464
+ position: "left",
1465
+ ticks: {
1466
+ padding: 5,
1467
+ maxTicksLimit: 6,
1468
+ min: 0,
1469
+ callback: (value) => formatNumberWithText(Number(value), 2)
1470
+ },
1471
+ grid: {
1472
+ display: false,
1473
+ drawBorder: false,
1474
+ drawOnChartArea: false,
1475
+ color: "transparent"
1476
+ },
1477
+ border: { display: false }
1478
+ }
1479
+ },
1480
+ maintainAspectRatio: false,
1481
+ responsive: true,
1482
+ plugins: {
1483
+ legend: {
1484
+ position: "bottom",
1485
+ labels: { usePointStyle: true, boxWidth: 12 }
1486
+ },
1487
+ tooltip: {
1488
+ enabled: true,
1489
+ mode: "nearest",
1490
+ intersect: false,
1491
+ backgroundColor: "#fff",
1492
+ titleColor: "#000",
1493
+ bodyColor: "#000",
1494
+ displayColors: false,
1495
+ borderColor: "#000",
1496
+ borderWidth: 1,
1497
+ padding: 8,
1498
+ cornerRadius: 4,
1499
+ titleSpacing: 4,
1500
+ bodySpacing: 4,
1501
+ callbacks: {
1502
+ label(tooltipItem) {
1503
+ const xLabel = tooltipItem.dataset.label;
1504
+ const { parsed = { y: 0 } } = tooltipItem;
1505
+ const yLabel = parsed.y;
1506
+ const chartValueWithCommas = formatNumber(Math.abs(yLabel));
1507
+ return `${xLabel}: ${yLabel >= 0 ? `$${chartValueWithCommas}` : `-$${chartValueWithCommas}`}`.trim();
1508
+ }
1509
+ }
1510
+ }
1511
+ },
1512
+ interaction: { mode: "nearest", intersect: false }
1513
+ });
1514
+ var FrontendMixedChart = ({
1515
+ datasets,
1516
+ labels,
1517
+ title,
1518
+ isLoading = false,
1519
+ isError = false,
1520
+ timeFilters,
1521
+ defaultTimeFilterIndex = 0,
1522
+ onTimeFilterChange,
1523
+ height,
1524
+ isMobile = false,
1525
+ customChartOptions = {}
1526
+ }) => {
1527
+ const [selectedFilter, setSelectedFilter] = (0, import_react6.useState)(defaultTimeFilterIndex);
1528
+ const handleFilterChange = (_event, newValue) => {
1529
+ if (newValue !== null) {
1530
+ setSelectedFilter(newValue);
1531
+ onTimeFilterChange == null ? void 0 : onTimeFilterChange(newValue);
1532
+ }
1533
+ };
1534
+ const chartData = (0, import_react6.useMemo)(
1535
+ () => __spreadProps(__spreadValues({}, labels ? { labels } : {}), {
1536
+ datasets
1537
+ }),
1538
+ [datasets, labels]
1539
+ );
1540
+ const options = (0, import_react6.useMemo)(
1541
+ () => __spreadValues(__spreadValues({}, buildChartOption3(isMobile)), customChartOptions),
1542
+ [isMobile, customChartOptions]
1543
+ );
1544
+ return /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(FullwidthChartContainer, { children: [
1545
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(ChartHeader2, { children: [
1546
+ title && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material4.Typography, { variant: "subtitle1", fontWeight: 600, children: title }),
1547
+ timeFilters && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1548
+ import_material4.ToggleButtonGroup,
1549
+ {
1550
+ value: selectedFilter,
1551
+ exclusive: true,
1552
+ onChange: handleFilterChange,
1553
+ size: "small",
1554
+ children: timeFilters.map((filter, index) => /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(import_material4.ToggleButton, { value: index, children: filter }, filter))
1555
+ }
1556
+ )
1557
+ ] }),
1558
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsxs)(BarChartSize, { style: height ? { height } : void 0, children: [
1559
+ /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(
1560
+ import_react_chartjs_26.Chart,
1561
+ {
1562
+ type: "bar",
1563
+ data: chartData,
1564
+ options
1565
+ }
1566
+ ),
1567
+ isLoading && /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(LoadingIndicator, { children: /* @__PURE__ */ (0, import_jsx_runtime7.jsx)(LoadingChartBackdrop, { isLoading, isError }) })
1568
+ ] })
1569
+ ] });
1570
+ };
1571
+ FrontendMixedChart.displayName = "FrontendMixedChart";
1572
+
1573
+ // src/charts/FrontendStackedChart.tsx
1574
+ var import_material5 = require("@mui/material");
1575
+ var import_styles7 = require("@mui/material/styles");
1576
+ var import_chart7 = require("chart.js");
1577
+ var import_react_chartjs_27 = require("react-chartjs-2");
1578
+ var import_jsx_runtime8 = require("react/jsx-runtime");
1579
+ import_chart7.Chart.register(
1580
+ import_chart7.CategoryScale,
1581
+ import_chart7.LinearScale,
1582
+ import_chart7.BarElement,
1583
+ import_chart7.BarController,
1584
+ import_chart7.Title,
1585
+ import_chart7.Tooltip,
1586
+ import_chart7.Legend
1587
+ );
1588
+ var StyledContainer = (0, import_styles7.styled)("div")({
1589
+ width: "100%",
1590
+ height: "100%"
1591
+ });
1592
+ var LoadingContainer = (0, import_styles7.styled)("div")({
1593
+ width: "100%",
1594
+ height: "100%",
1595
+ display: "flex",
1596
+ justifyContent: "center",
1597
+ alignItems: "center",
1598
+ minHeight: 200
1599
+ });
1600
+ var EmptyContainer = (0, import_styles7.styled)("div")({
1601
+ width: "100%",
1602
+ height: "100%",
1603
+ display: "flex",
1604
+ justifyContent: "center",
1605
+ alignItems: "center",
1606
+ color: "#A1A1A1",
1607
+ borderBottom: "1px solid #00001A4D",
1608
+ minHeight: 200
1609
+ });
1610
+ var DEFAULT_COLORS = [
1611
+ "#1976D2",
1612
+ "#001CB0",
1613
+ "#8979FF",
1614
+ "#004080",
1615
+ "#39FD99",
1616
+ "#FFC55A"
1617
+ ];
1618
+ var FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS = [
1619
+ "Jan",
1620
+ "Feb",
1621
+ "Mar",
1622
+ "Apr",
1623
+ "May",
1624
+ "Jun",
1625
+ "Jul",
1626
+ "Aug",
1627
+ "Sep",
1628
+ "Oct",
1629
+ "Nov",
1630
+ "Dec"
1631
+ ];
1632
+ var FRONTEND_STACKED_CHART_MOCK_LABELS = [
1633
+ "Recreation & Entertainment",
1634
+ "Transport",
1635
+ "Primary Residence Costs",
1636
+ "Telephone, Internet, Pay TV & Media Streaming Subscriptions",
1637
+ "Groceries",
1638
+ "Other Regular and Recurring Expenses"
1639
+ ];
1640
+ var FRONTEND_STACKED_CHART_MOCK_DATA = FRONTEND_STACKED_CHART_MOCK_LABELS.map(
1641
+ () => FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS.map(() => Math.floor(Math.random() * 1e4))
1642
+ );
1643
+ var FRONTEND_STACKED_CHART_MOCK_COLORS = DEFAULT_COLORS;
1644
+ var FrontendStackedChart = ({
1645
+ datasets = FRONTEND_STACKED_CHART_MOCK_DATA,
1646
+ labels = FRONTEND_STACKED_CHART_MOCK_LABELS,
1647
+ chartTitle,
1648
+ xAxisLabels = FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS,
1649
+ showLegend = false,
1650
+ currency = "$",
1651
+ dataColors = FRONTEND_STACKED_CHART_MOCK_COLORS,
1652
+ isLoading = false,
1653
+ noDataText = "No data"
1654
+ }) => {
1655
+ if (isLoading) {
1656
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StyledContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(LoadingContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_material5.CircularProgress, {}) }) });
1657
+ }
1658
+ if (!(datasets == null ? void 0 : datasets.length) || !(labels == null ? void 0 : labels.length) || !(xAxisLabels == null ? void 0 : xAxisLabels.length)) {
1659
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(StyledContainer, { children: /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(EmptyContainer, { children: noDataText }) });
1660
+ }
1661
+ const resolvedColors = !dataColors || typeof dataColors !== "string" && dataColors.length === 0 ? DEFAULT_COLORS.slice(0, 2) : dataColors;
1662
+ const options = {
1663
+ plugins: {
1664
+ title: { display: !!chartTitle, text: chartTitle },
1665
+ legend: { display: showLegend },
1666
+ tooltip: {
1667
+ callbacks: {
1668
+ label(tooltipItem) {
1669
+ let label = tooltipItem.dataset.label || "";
1670
+ if (label) label += ": ";
1671
+ label += currency ? currency + tooltipItem.parsed.y : tooltipItem.parsed.y;
1672
+ return label;
1673
+ }
1674
+ }
1675
+ }
1676
+ },
1677
+ maintainAspectRatio: false,
1678
+ responsive: true,
1679
+ scales: {
1680
+ x: {
1681
+ stacked: true,
1682
+ display: true,
1683
+ grid: { display: true, drawOnChartArea: false, drawTicks: false },
1684
+ ticks: { display: true, padding: 8, font: { size: 11 } }
1685
+ },
1686
+ y: {
1687
+ stacked: true,
1688
+ display: true,
1689
+ grid: { display: false },
1690
+ ticks: { display: true, maxTicksLimit: 4 }
1691
+ }
1692
+ }
1693
+ };
1694
+ const chartData = {
1695
+ labels: xAxisLabels,
1696
+ datasets: labels.map((label, index) => {
1697
+ const color = typeof resolvedColors === "string" ? resolvedColors : resolvedColors[index];
1698
+ return {
1699
+ label,
1700
+ data: datasets[index],
1701
+ backgroundColor: color,
1702
+ borderColor: "#fff",
1703
+ borderWidth: typeof resolvedColors === "string" ? 0 : 1,
1704
+ barPercentage: 0.5
1705
+ };
1706
+ })
1707
+ };
1708
+ return /* @__PURE__ */ (0, import_jsx_runtime8.jsx)(import_react_chartjs_27.Chart, { type: "bar", options, data: chartData });
1709
+ };
1710
+ FrontendStackedChart.displayName = "FrontendStackedChart";
1711
+
1712
+ // src/charts/FrontendIncomeExpenseHorizontalBarChart.tsx
1713
+ var import_react7 = require("react");
1714
+ var import_styles8 = require("@mui/material/styles");
1715
+ var import_chart8 = require("chart.js");
1716
+ var import_chartjs_plugin_datalabels = __toESM(require("chartjs-plugin-datalabels"));
1717
+ var import_react_chartjs_28 = require("react-chartjs-2");
1718
+ var import_jsx_runtime9 = require("react/jsx-runtime");
1719
+ import_chart8.Chart.register(import_chart8.CategoryScale, import_chart8.LinearScale, import_chart8.BarElement, import_chart8.Title, import_chart8.Tooltip, import_chart8.Legend);
1720
+ var ChartWrapper5 = (0, import_styles8.styled)("div")(
1721
+ ({ chartHeight }) => ({
1722
+ position: "relative",
1723
+ height: chartHeight,
1724
+ width: "100%"
1725
+ })
1726
+ );
1727
+ var FrontendIncomeExpenseHorizontalBarChart = ({
1728
+ totalIncome,
1729
+ totalExpense,
1730
+ incomeColor = "#39FD99",
1731
+ expenseColor = "#162029",
1732
+ textColor = "#040D13",
1733
+ height = 160
1734
+ }) => {
1735
+ const suggestedMax = Math.max(totalIncome, Math.abs(totalExpense)) * 1.25;
1736
+ const options = (0, import_react7.useMemo)(
1737
+ () => ({
1738
+ indexAxis: "y",
1739
+ responsive: true,
1740
+ maintainAspectRatio: false,
1741
+ plugins: {
1742
+ datalabels: {
1743
+ color: textColor,
1744
+ textAlign: "left"
1745
+ },
1746
+ legend: { display: false }
1747
+ },
1748
+ layout: {
1749
+ padding: {
1750
+ right: 120,
1751
+ left: 0,
1752
+ top: 10,
1753
+ bottom: 10
1754
+ }
1755
+ },
1756
+ scales: {
1757
+ y: {
1758
+ display: true,
1759
+ grid: { display: false, drawBorder: false },
1760
+ border: { display: false },
1761
+ ticks: { display: false }
1762
+ },
1763
+ x: {
1764
+ display: true,
1765
+ grid: { display: false, drawBorder: false },
1766
+ border: { display: false },
1767
+ ticks: {
1768
+ display: false
1769
+ },
1770
+ suggestedMax
1771
+ }
1772
+ }
1773
+ }),
1774
+ [totalIncome, totalExpense, textColor, suggestedMax]
1775
+ );
1776
+ const chartData = (0, import_react7.useMemo)(
1777
+ () => ({
1778
+ labels: ["Incoming", "Outgoing"],
1779
+ datasets: [
1780
+ {
1781
+ barThickness: 40,
1782
+ backgroundColor: [incomeColor, expenseColor],
1783
+ data: [totalIncome, Math.abs(totalExpense)],
1784
+ datalabels: {
1785
+ labels: {
1786
+ value: {
1787
+ anchor: "end",
1788
+ align: "end",
1789
+ offset: 10,
1790
+ clamp: false,
1791
+ font: { weight: "bold", size: 14 },
1792
+ formatter(value) {
1793
+ return [formatNumberWithDollar(value), ""];
1794
+ }
1795
+ },
1796
+ name: {
1797
+ anchor: "end",
1798
+ align: "end",
1799
+ offset: 10,
1800
+ clamp: false,
1801
+ formatter(_value, ctx) {
1802
+ return ["", ctx.chart.data.labels[ctx.dataIndex]];
1803
+ }
1804
+ }
1805
+ }
1806
+ }
1807
+ }
1808
+ ]
1809
+ }),
1810
+ [totalIncome, totalExpense, incomeColor, expenseColor]
1811
+ );
1812
+ return /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(ChartWrapper5, { chartHeight: height, children: /* @__PURE__ */ (0, import_jsx_runtime9.jsx)(
1813
+ import_react_chartjs_28.Chart,
1814
+ {
1815
+ type: "bar",
1816
+ plugins: [import_chartjs_plugin_datalabels.default],
1817
+ options,
1818
+ data: chartData
1819
+ }
1820
+ ) });
1821
+ };
1822
+ FrontendIncomeExpenseHorizontalBarChart.displayName = "FrontendIncomeExpenseHorizontalBarChart";
1823
+
1824
+ // src/charts/FrontendPercentageBar.tsx
1825
+ var import_react8 = require("react");
1826
+ var import_material6 = require("@mui/material");
1827
+ var import_styles9 = require("@mui/material/styles");
1828
+ var import_jsx_runtime10 = require("react/jsx-runtime");
1829
+ var MAXIMUM_CATEGORIES = 5;
1830
+ var MAXIMUM_CATEGORIES_PERCENT = 5;
1831
+ var Root = (0, import_styles9.styled)("div")({
1832
+ width: "100%"
1833
+ });
1834
+ var Title8 = (0, import_styles9.styled)("div")({
1835
+ fontSize: 16,
1836
+ overflow: "hidden",
1837
+ textOverflow: "ellipsis",
1838
+ transition: "all 0.2s ease-in",
1839
+ whiteSpace: "nowrap",
1840
+ minHeight: 24
1841
+ });
1842
+ var Bar2 = (0, import_styles9.styled)("div")({
1843
+ display: "flex",
1844
+ gap: 2,
1845
+ height: 25,
1846
+ marginBottom: "2.5rem",
1847
+ marginTop: "1.5rem",
1848
+ width: "100%",
1849
+ "&:not(:hover) .percentage-bar-part": {
1850
+ backgroundColor: "var(--bg-color)"
1851
+ },
1852
+ "&:not(:hover) .percentage-bar-icon": {
1853
+ opacity: 1
1854
+ }
1855
+ });
1856
+ var Part = (0, import_styles9.styled)("div")({
1857
+ borderRadius: 2,
1858
+ position: "relative",
1859
+ transition: "background-color 0.3s ease-in",
1860
+ cursor: "pointer",
1861
+ backgroundColor: "#e9edf2",
1862
+ "&:hover": {
1863
+ backgroundColor: "var(--bg-color)"
1864
+ },
1865
+ "&:hover .percentage-bar-icon": {
1866
+ opacity: 1
1867
+ }
1868
+ });
1869
+ var OtherBar = (0, import_styles9.styled)("div")({
1870
+ display: "flex",
1871
+ gap: 2,
1872
+ position: "relative",
1873
+ "&:hover .percentage-bar-part": {
1874
+ backgroundColor: "var(--bg-color)"
1875
+ },
1876
+ "&:hover .percentage-bar-icon": {
1877
+ opacity: 1
1878
+ }
1879
+ });
1880
+ var ValuePart = (0, import_styles9.styled)("div")({
1881
+ bottom: -28,
1882
+ height: 20,
1883
+ left: 0,
1884
+ position: "absolute",
1885
+ width: "100%",
1886
+ fontSize: 12,
1887
+ padding: "1rem 0.5rem",
1888
+ "&::after": {
1889
+ borderBottom: "2px solid #E8EAEC",
1890
+ borderLeft: "2px solid #E8EAEC",
1891
+ borderRight: "2px solid #E8EAEC",
1892
+ bottom: -4,
1893
+ content: '""',
1894
+ height: 10,
1895
+ left: 0,
1896
+ position: "absolute",
1897
+ width: "100%"
1898
+ }
1899
+ });
1900
+ var IconWrapper = (0, import_styles9.styled)("div")({
1901
+ opacity: 0,
1902
+ marginLeft: 4,
1903
+ width: 18,
1904
+ height: "100%",
1905
+ display: "flex",
1906
+ alignItems: "center",
1907
+ justifyContent: "center",
1908
+ transition: "opacity 0.3s ease-in",
1909
+ "& svg": { width: "100%" }
1910
+ });
1911
+ var mergeOtherCategories = (others) => {
1912
+ return others.reduce(
1913
+ (result, part) => __spreadProps(__spreadValues({}, result), {
1914
+ percentage: part.percentage + result.percentage
1915
+ }),
1916
+ { title: "Other", percentage: 0 }
1917
+ );
1918
+ };
1919
+ var splitCategoryParts = (items, maxIndex) => {
1920
+ if (maxIndex < 0) return [items, []];
1921
+ const idx = maxIndex > MAXIMUM_CATEGORIES ? MAXIMUM_CATEGORIES : maxIndex;
1922
+ return [items.slice(0, idx), items.slice(idx)];
1923
+ };
1924
+ var FrontendPercentageBar = ({
1925
+ defaultTitle,
1926
+ chartColors = [],
1927
+ parts = [],
1928
+ chartIcons = [],
1929
+ showFullCategory = false
1930
+ }) => {
1931
+ const [selectedTitle, setSelectedTitle] = (0, import_react8.useState)("");
1932
+ const handleMouseEnterPart = (part) => {
1933
+ setSelectedTitle(`${(part.percentage * 100).toFixed(1)}% ${part.title}`);
1934
+ };
1935
+ const handleMouseLeaveBar = () => {
1936
+ setSelectedTitle("");
1937
+ };
1938
+ const maximumCategoryItem = (0, import_react8.useMemo)(() => {
1939
+ if (showFullCategory) return parts.length;
1940
+ return parts.slice().sort((a, b) => b.percentage - a.percentage).findIndex((part) => part.percentage * 100 < MAXIMUM_CATEGORIES_PERCENT);
1941
+ }, [parts, showFullCategory]);
1942
+ const [firstParts, secondParts] = (0, import_react8.useMemo)(() => {
1943
+ if (showFullCategory) return [parts, []];
1944
+ return splitCategoryParts(parts, maximumCategoryItem);
1945
+ }, [parts, maximumCategoryItem, showFullCategory]);
1946
+ const [firstColors, secondColors] = (0, import_react8.useMemo)(() => {
1947
+ if (showFullCategory) return [chartColors, []];
1948
+ return splitCategoryParts(chartColors, maximumCategoryItem);
1949
+ }, [chartColors, maximumCategoryItem, showFullCategory]);
1950
+ const [firstIcons, secondIcons] = (0, import_react8.useMemo)(() => {
1951
+ if (showFullCategory) return [chartIcons, []];
1952
+ return splitCategoryParts(chartIcons, maximumCategoryItem);
1953
+ }, [chartIcons, maximumCategoryItem, showFullCategory]);
1954
+ const otherCategoryValue = mergeOtherCategories(secondParts);
1955
+ return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Root, { children: [
1956
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Title8, { children: selectedTitle || defaultTitle }),
1957
+ parts.length === 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1958
+ import_material6.Box,
1959
+ {
1960
+ sx: {
1961
+ height: 22,
1962
+ width: "100%",
1963
+ backgroundColor: "rgba(191,191,191,0.1)",
1964
+ border: "1px solid #E8EAEC",
1965
+ borderRadius: "3px",
1966
+ display: "flex",
1967
+ alignItems: "center",
1968
+ justifyContent: "center",
1969
+ mt: 0.5
1970
+ },
1971
+ children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(import_material6.Typography, { sx: { color: "#4A5C6A", fontSize: 12, fontWeight: 400 }, children: "No data" })
1972
+ }
1973
+ ) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(Bar2, { onMouseLeave: handleMouseLeaveBar, children: [
1974
+ firstParts.map((part, index) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1975
+ Part,
1976
+ {
1977
+ className: "percentage-bar-part",
1978
+ onMouseEnter: () => handleMouseEnterPart(part),
1979
+ style: {
1980
+ flexGrow: part.percentage * 10,
1981
+ "--bg-color": firstColors[index]
1982
+ },
1983
+ children: [
1984
+ firstIcons[index] && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(IconWrapper, { className: "percentage-bar-icon", children: firstIcons[index] }),
1985
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(ValuePart, { onMouseEnter: () => handleMouseEnterPart(part), children: [
1986
+ convertToFloat(part.percentage * 100, 1),
1987
+ "%"
1988
+ ] })
1989
+ ]
1990
+ },
1991
+ part.title
1992
+ )),
1993
+ otherCategoryValue.percentage !== 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(OtherBar, { style: { flexGrow: otherCategoryValue.percentage * 10 }, children: [
1994
+ secondParts.map((part, index) => /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1995
+ Part,
1996
+ {
1997
+ className: "percentage-bar-part",
1998
+ onMouseEnter: () => handleMouseEnterPart(part),
1999
+ style: {
2000
+ flexGrow: part.percentage * 100,
2001
+ "--bg-color": secondColors[index]
2002
+ },
2003
+ children: part.percentage > 0.05 && secondIcons[index] && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(IconWrapper, { className: "percentage-bar-icon", children: secondIcons[index] })
2004
+ },
2005
+ part.title
2006
+ )),
2007
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(ValuePart, { onMouseEnter: () => handleMouseEnterPart(otherCategoryValue), children: [
2008
+ convertToFloat(otherCategoryValue.percentage * 100, 1),
2009
+ "%"
2010
+ ] })
2011
+ ] })
2012
+ ] })
2013
+ ] });
2014
+ };
2015
+ FrontendPercentageBar.displayName = "FrontendPercentageBar";
2016
+
2017
+ // src/charts/FrontendLiabilitiesChart.tsx
2018
+ var import_react9 = require("react");
2019
+ var import_styles10 = require("@mui/material/styles");
2020
+ var import_material7 = require("@mui/material");
2021
+ var import_jsx_runtime11 = require("react/jsx-runtime");
2022
+ var generateColorGradient = (baseColor, count) => {
2023
+ if (count <= 0) return [];
2024
+ const hex = baseColor.replace("#", "");
2025
+ const r = parseInt(hex.substring(0, 2), 16);
2026
+ const g = parseInt(hex.substring(2, 4), 16);
2027
+ const b = parseInt(hex.substring(4, 6), 16);
2028
+ return Array.from({ length: count }, (_, i) => {
2029
+ const ratio = count > 1 ? i / (count - 1) : 0;
2030
+ const nr = Math.round(r + (255 - r) * ratio);
2031
+ const ng = Math.round(g + (255 - g) * ratio);
2032
+ const nb = Math.round(b + (255 - b) * ratio);
2033
+ return `#${nr.toString(16).padStart(2, "0")}${ng.toString(16).padStart(2, "0")}${nb.toString(16).padStart(2, "0")}`;
2034
+ });
2035
+ };
2036
+ var Root2 = (0, import_styles10.styled)("div")({
2037
+ width: "100%"
2038
+ });
2039
+ var LegendsContainer = (0, import_styles10.styled)("div")({
2040
+ display: "flex",
2041
+ flexWrap: "wrap",
2042
+ gap: 12,
2043
+ marginTop: 8
2044
+ });
2045
+ var LegendItem = (0, import_styles10.styled)("div")({
2046
+ display: "flex",
2047
+ alignItems: "center",
2048
+ gap: 6
2049
+ });
2050
+ var LegendColor = (0, import_styles10.styled)("div")(({ bgColor }) => ({
2051
+ width: 12,
2052
+ height: 12,
2053
+ borderRadius: 2,
2054
+ backgroundColor: bgColor,
2055
+ flexShrink: 0
2056
+ }));
2057
+ var FrontendLiabilitiesChart = ({
2058
+ defaultTitle,
2059
+ color = "#131c24",
2060
+ parts = []
2061
+ }) => {
2062
+ const colors = (0, import_react9.useMemo)(
2063
+ () => generateColorGradient(color, parts.length),
2064
+ [color, parts.length]
2065
+ );
2066
+ return /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(Root2, { children: [
2067
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2068
+ FrontendPercentageBar,
2069
+ {
2070
+ defaultTitle,
2071
+ chartColors: colors,
2072
+ parts,
2073
+ showFullCategory: true
2074
+ }
2075
+ ),
2076
+ parts.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
2077
+ "div",
2078
+ {
2079
+ style: {
2080
+ height: 22,
2081
+ backgroundColor: "#e9edf2",
2082
+ borderRadius: 2,
2083
+ marginTop: 8
2084
+ }
2085
+ }
2086
+ ),
2087
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(LegendsContainer, { children: parts.map((part, index) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(LegendItem, { children: [
2088
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(LegendColor, { bgColor: colors[index] || "#ccc" }),
2089
+ /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(import_material7.Typography, { variant: "body2", children: part.title })
2090
+ ] }, part.id || part.title)) })
2091
+ ] });
2092
+ };
2093
+ FrontendLiabilitiesChart.displayName = "FrontendLiabilitiesChart";
2094
+
2095
+ // src/charts/FrontendScenarioLineChart.tsx
2096
+ var import_react10 = require("react");
2097
+ var import_styles11 = require("@mui/material/styles");
2098
+ var import_chart9 = require("chart.js");
2099
+ var import_chartjs_adapter_date_fns5 = require("chartjs-adapter-date-fns");
2100
+ var import_react_chartjs_29 = require("react-chartjs-2");
2101
+ var import_jsx_runtime12 = require("react/jsx-runtime");
2102
+ import_chart9.Chart.register(
2103
+ import_chart9.CategoryScale,
2104
+ import_chart9.LinearScale,
2105
+ import_chart9.PointElement,
2106
+ import_chart9.LineElement,
2107
+ import_chart9.LineController,
2108
+ import_chart9.Title,
2109
+ import_chart9.Tooltip,
2110
+ import_chart9.Legend,
2111
+ import_chart9.TimeScale
2112
+ );
2113
+ var ChartContainer5 = (0, import_styles11.styled)("div")({
2114
+ position: "relative",
2115
+ width: "100%"
2116
+ });
2117
+ var LineChartSize = (0, import_styles11.styled)("div")(
2118
+ ({ chartHeight }) => ({
2119
+ flex: "auto",
2120
+ height: chartHeight || 270,
2121
+ position: "relative",
2122
+ width: "100%"
2123
+ })
2124
+ );
2125
+ var LoadingOverlay2 = (0, import_styles11.styled)("div")({
2126
+ position: "absolute",
2127
+ inset: 0,
2128
+ display: "flex",
2129
+ flexDirection: "column",
2130
+ alignItems: "center",
2131
+ justifyContent: "center",
2132
+ backgroundColor: "rgba(255,255,255,0.8)"
2133
+ });
2134
+ var SECONDARY_COLOR_40 = "rgba(22, 32, 41, 0.4)";
2135
+ var BORDER_COLOR2 = "#A1B9BD";
2136
+ var buildChartOption4 = (customOptions = {}) => {
2137
+ const defaultOptions = {
2138
+ scales: {
2139
+ x: {
2140
+ grid: { display: false },
2141
+ stacked: true,
2142
+ ticks: {
2143
+ maxTicksLimit: 15,
2144
+ autoSkip: false,
2145
+ maxRotation: 0,
2146
+ minRotation: 0,
2147
+ beginAtZero: false,
2148
+ source: "auto"
2149
+ },
2150
+ bounds: "data",
2151
+ type: "time",
2152
+ time: { unit: "month" },
2153
+ distribution: "linear"
2154
+ },
2155
+ y: {
2156
+ grid: { drawOnChartArea: false },
2157
+ display: true,
2158
+ stacked: false,
2159
+ position: "left",
2160
+ ticks: {
2161
+ beginAtZero: true,
2162
+ display: true,
2163
+ callback(value) {
2164
+ return formatNumberWithText(Number(value), 1);
2165
+ }
2166
+ }
2167
+ }
2168
+ },
2169
+ maintainAspectRatio: false,
2170
+ responsive: true,
2171
+ plugins: {
2172
+ legend: {
2173
+ display: true,
2174
+ position: "top",
2175
+ align: "end",
2176
+ fullSize: true,
2177
+ reverse: false,
2178
+ labels: {
2179
+ usePointStyle: true,
2180
+ boxWidth: 200,
2181
+ padding: 10
2182
+ }
2183
+ },
2184
+ tooltip: {
2185
+ enabled: true,
2186
+ mode: "nearest",
2187
+ intersect: false,
2188
+ backgroundColor: "#fff",
2189
+ titleColor: "#000",
2190
+ bodyColor: "#000",
2191
+ displayColors: false,
2192
+ borderColor: "#000",
2193
+ borderWidth: 1,
2194
+ padding: 8,
2195
+ cornerRadius: 4,
2196
+ titleSpacing: 4,
2197
+ bodySpacing: 4,
2198
+ callbacks: {
2199
+ title(tooltipItems) {
2200
+ var _a;
2201
+ const tooltipItem = tooltipItems[0];
2202
+ if ((_a = tooltipItem == null ? void 0 : tooltipItem.parsed) == null ? void 0 : _a.x) {
2203
+ const date = new Date(tooltipItem.parsed.x);
2204
+ return date.toLocaleDateString("en-US", {
2205
+ month: "short",
2206
+ year: "numeric"
2207
+ });
2208
+ }
2209
+ return "";
2210
+ },
2211
+ label(tooltipItem) {
2212
+ const xLabel = tooltipItem.dataset.label;
2213
+ const { parsed = { y: 0 } } = tooltipItem;
2214
+ const yLabel = parsed.y;
2215
+ const chartValueWithCommas = formatNumber(Math.abs(yLabel));
2216
+ return `${xLabel}: ${yLabel >= 0 ? `$${chartValueWithCommas}` : `-$${chartValueWithCommas}`}`.trim();
2217
+ }
2218
+ }
2219
+ }
2220
+ },
2221
+ interaction: { mode: "nearest", intersect: false }
2222
+ };
2223
+ return __spreadValues(__spreadValues({}, defaultOptions), customOptions);
2224
+ };
2225
+ var buildChartData3 = (data, secondaryData, primaryColor, borderWidth, desiredLoanAmount) => {
2226
+ const desiredLoanLine = data.map((item) => __spreadProps(__spreadValues({}, item), {
2227
+ y: desiredLoanAmount
2228
+ }));
2229
+ return {
2230
+ datasets: [
2231
+ {
2232
+ label: "Based on Current Expenses",
2233
+ fill: false,
2234
+ backgroundColor: BORDER_COLOR2,
2235
+ borderColor: "#5E6266",
2236
+ borderCapStyle: "butt",
2237
+ borderDash: [],
2238
+ borderDashOffset: 0,
2239
+ borderJoinStyle: "miter",
2240
+ pointBackgroundColor: "#5E6266",
2241
+ pointBorderWidth: 2,
2242
+ pointHoverRadius: 5,
2243
+ pointHoverBackgroundColor: "#5E6266",
2244
+ pointHoverBorderColor: SECONDARY_COLOR_40,
2245
+ pointHoverBorderWidth: 8,
2246
+ borderWidth,
2247
+ pointRadius: 0,
2248
+ pointBorderColor: "#5E6266",
2249
+ pointHitRadius: 3,
2250
+ pointStyle: "line",
2251
+ tension: 0.4,
2252
+ data
2253
+ },
2254
+ {
2255
+ label: "Optimised Estimate",
2256
+ fill: false,
2257
+ backgroundColor: BORDER_COLOR2,
2258
+ borderColor: "#A1B9BD",
2259
+ borderDash: [2, 2],
2260
+ borderDashOffset: 0,
2261
+ borderJoinStyle: "miter",
2262
+ pointBorderColor: "#A1B9BD",
2263
+ pointBackgroundColor: "#A1B9BD",
2264
+ pointBorderWidth: 2,
2265
+ pointHoverRadius: 5,
2266
+ pointHoverBackgroundColor: "#A1B9BD",
2267
+ pointHoverBorderColor: SECONDARY_COLOR_40,
2268
+ pointHoverBorderWidth: 8,
2269
+ pointRadius: 0,
2270
+ borderWidth,
2271
+ pointHitRadius: 3,
2272
+ data: secondaryData,
2273
+ tension: 0.4,
2274
+ pointStyle: "line"
2275
+ },
2276
+ {
2277
+ label: "Desired Loan Amount",
2278
+ fill: false,
2279
+ backgroundColor: "transparent",
2280
+ borderColor: primaryColor,
2281
+ borderCapStyle: "butt",
2282
+ borderDash: [5, 5],
2283
+ borderDashOffset: 0,
2284
+ borderJoinStyle: "miter",
2285
+ pointBorderColor: primaryColor,
2286
+ pointBackgroundColor: primaryColor,
2287
+ pointBorderWidth: 2,
2288
+ pointHoverRadius: 5,
2289
+ pointHoverBackgroundColor: primaryColor,
2290
+ pointHoverBorderColor: primaryColor,
2291
+ pointHoverBorderWidth: 8,
2292
+ borderWidth,
2293
+ pointRadius: 0,
2294
+ pointHitRadius: 3,
2295
+ data: desiredLoanLine,
2296
+ tension: 0,
2297
+ pointStyle: "line"
2298
+ }
2299
+ ]
2300
+ };
2301
+ };
2302
+ var DEFAULT_DESIRED_LOAN_AMOUNT = 5e5;
2303
+ var FrontendScenarioLineChart = ({
2304
+ data = [],
2305
+ secondaryData = [],
2306
+ isLoading = false,
2307
+ isError = false,
2308
+ height = 300,
2309
+ desiredLoanAmount,
2310
+ primaryColor = "#04f73d",
2311
+ customChartOptions = {}
2312
+ }) => {
2313
+ const chartRef = (0, import_react10.useRef)(null);
2314
+ const chartData = (0, import_react10.useMemo)(
2315
+ () => buildChartData3(
2316
+ data,
2317
+ secondaryData,
2318
+ primaryColor,
2319
+ 1,
2320
+ desiredLoanAmount != null ? desiredLoanAmount : DEFAULT_DESIRED_LOAN_AMOUNT
2321
+ ),
2322
+ [data, secondaryData, primaryColor, desiredLoanAmount]
2323
+ );
2324
+ const options = (0, import_react10.useMemo)(
2325
+ () => buildChartOption4(customChartOptions),
2326
+ [customChartOptions]
2327
+ );
2328
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(ChartContainer5, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(LineChartSize, { chartHeight: height, children: [
2329
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
2330
+ import_react_chartjs_29.Chart,
2331
+ {
2332
+ ref: chartRef,
2333
+ type: "line",
2334
+ data: chartData,
2335
+ options
2336
+ }
2337
+ ),
2338
+ (isLoading || isError) && /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(LoadingOverlay2, { children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(LoadingChartBackdrop, { isLoading, isError }) })
2339
+ ] }) });
2340
+ };
2341
+ FrontendScenarioLineChart.displayName = "FrontendScenarioLineChart";
2342
+
2343
+ // src/charts/mock-data.ts
2344
+ var generateMonthlyPeriods = (months = 12) => {
2345
+ const periods2 = [];
2346
+ const now = /* @__PURE__ */ new Date();
2347
+ for (let i = months - 1; i >= 0; i--) {
2348
+ const d = new Date(now.getFullYear(), now.getMonth() - i, 1);
2349
+ periods2.push(d.toISOString().split("T")[0]);
2350
+ }
2351
+ return periods2;
2352
+ };
2353
+ var randInt = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
2354
+ var periods = generateMonthlyPeriods(12);
2355
+ var mockLineChartData = [
2356
+ {
2357
+ label: "Portfolio Value",
2358
+ data: periods.map((p) => ({ x: p, y: randInt(1e5, 5e5) })),
2359
+ customOptions: {
2360
+ borderColor: "#2B72FB",
2361
+ backgroundColor: "#2B72FB1A",
2362
+ fill: true
2363
+ }
2364
+ }
2365
+ ];
2366
+ var mockMobileLineChartData = [
2367
+ {
2368
+ label: "Portfolio Value",
2369
+ data: periods.map((p) => ({ x: p, y: randInt(1e5, 5e5) })),
2370
+ color: "#162029"
2371
+ },
2372
+ {
2373
+ label: "Benchmark",
2374
+ data: periods.map((p) => ({ x: p, y: randInt(8e4, 45e4) })),
2375
+ color: "#A1B9BD",
2376
+ lineSpacing: [5, 5]
2377
+ }
2378
+ ];
2379
+ var mockBarChartData = {
2380
+ labels: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
2381
+ datasets: [
2382
+ {
2383
+ label: "Income",
2384
+ data: Array.from({ length: 12 }, () => randInt(3e3, 8e3)),
2385
+ backgroundColor: "#39FD99"
2386
+ },
2387
+ {
2388
+ label: "Expenses",
2389
+ data: Array.from({ length: 12 }, () => -randInt(2e3, 6e3)),
2390
+ backgroundColor: "#F44336"
2391
+ }
2392
+ ]
2393
+ };
2394
+ var mockDoughnutData = {
2395
+ data: [35e3, 22e3, 18e3, 12e3, 8e3, 5e3],
2396
+ title: [
2397
+ "Property",
2398
+ "Shares",
2399
+ "Superannuation",
2400
+ "Cash",
2401
+ "Crypto",
2402
+ "Other"
2403
+ ],
2404
+ colors: ["#2B72FB", "#64BDC6", "#EECA34", "#FE6A35", "#7B47E9", "#3FDC7E"]
2405
+ };
2406
+ var mockMixedChartDatasets = [
2407
+ {
2408
+ type: "line",
2409
+ label: "Estimate Value",
2410
+ data: periods.map((p) => ({ x: p, y: randInt(4e5, 6e5) })),
2411
+ borderColor: "#131C24",
2412
+ backgroundColor: "#131C24",
2413
+ borderWidth: 3,
2414
+ fill: false,
2415
+ tension: 0.4,
2416
+ pointRadius: 0,
2417
+ pointStyle: "rect"
2418
+ },
2419
+ {
2420
+ type: "line",
2421
+ label: "Suburb Average",
2422
+ data: periods.map((p) => ({ x: p, y: randInt(45e4, 55e4) })),
2423
+ borderColor: "#e8e8eb",
2424
+ backgroundColor: "#e8e8eb",
2425
+ borderWidth: 1,
2426
+ fill: false,
2427
+ tension: 0.4,
2428
+ pointRadius: 0,
2429
+ pointStyle: "rect"
2430
+ },
2431
+ {
2432
+ type: "bar",
2433
+ label: "Debt",
2434
+ data: periods.map((p) => ({ x: p, y: randInt(2e5, 35e4) })),
2435
+ backgroundColor: "#E9EDF2",
2436
+ borderColor: "#E9EDF2",
2437
+ fill: false,
2438
+ tension: 0.4,
2439
+ pointRadius: 0,
2440
+ pointStyle: "rect"
2441
+ }
2442
+ ];
2443
+ var mockPercentageBarParts = [
2444
+ { title: "Groceries", percentage: 0.25 },
2445
+ { title: "Transport", percentage: 0.18 },
2446
+ { title: "Entertainment", percentage: 0.15 },
2447
+ { title: "Utilities", percentage: 0.12 },
2448
+ { title: "Dining", percentage: 0.1 },
2449
+ { title: "Shopping", percentage: 0.08 },
2450
+ { title: "Healthcare", percentage: 0.07 },
2451
+ { title: "Education", percentage: 0.05 }
2452
+ ];
2453
+ var mockPercentageBarColors = [
2454
+ "#2B72FB",
2455
+ "#64BDC6",
2456
+ "#EECA34",
2457
+ "#FE6A35",
2458
+ "#FA4B42",
2459
+ "#EE60E0",
2460
+ "#7B47E9",
2461
+ "#3FDC7E"
2462
+ ];
2463
+ var mockLiabilitiesParts = [
2464
+ { id: "1", title: "Home Loan", percentage: 0.55 },
2465
+ { id: "2", title: "Car Loan", percentage: 0.25 },
2466
+ { id: "3", title: "Credit Card", percentage: 0.12 },
2467
+ { id: "4", title: "Personal Loan", percentage: 0.08 }
2468
+ ];
2469
+ var mockScenarioData = periods.map((p) => ({
2470
+ x: p,
2471
+ y: randInt(5e5, 8e5)
2472
+ }));
2473
+ var mockScenarioSecondaryData = periods.map(
2474
+ (p) => ({
2475
+ x: p,
2476
+ y: randInt(6e5, 9e5)
2477
+ })
2478
+ );
2479
+ // Annotate the CommonJS export names for ESM import in node:
2480
+ 0 && (module.exports = {
2481
+ BackofficeSwitchableChart,
2482
+ FRONTEND_STACKED_CHART_MOCK_COLORS,
2483
+ FRONTEND_STACKED_CHART_MOCK_DATA,
2484
+ FRONTEND_STACKED_CHART_MOCK_LABELS,
2485
+ FRONTEND_STACKED_CHART_MOCK_X_AXIS_LABELS,
2486
+ FrontendBarChart,
2487
+ FrontendDoughnutChart,
2488
+ FrontendIncomeExpenseHorizontalBarChart,
2489
+ FrontendLiabilitiesChart,
2490
+ FrontendLineChart,
2491
+ FrontendLineChartMobile,
2492
+ FrontendMixedChart,
2493
+ FrontendPercentageBar,
2494
+ FrontendScenarioLineChart,
2495
+ FrontendStackedChart,
2496
+ LoadingChartBackdrop,
2497
+ buildChartDataFromObject,
2498
+ convertToFloat,
2499
+ formatNumber,
2500
+ formatNumberWithDollar,
2501
+ formatNumberWithText,
2502
+ getChartOptions,
2503
+ mockBarChartData,
2504
+ mockDoughnutData,
2505
+ mockLiabilitiesParts,
2506
+ mockLineChartData,
2507
+ mockMixedChartDatasets,
2508
+ mockMobileLineChartData,
2509
+ mockPercentageBarColors,
2510
+ mockPercentageBarParts,
2511
+ mockScenarioData,
2512
+ mockScenarioSecondaryData,
2513
+ tooltipsBaseOption
2514
+ });