@wakastellar/ui 3.2.0 → 3.3.2

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 (518) hide show
  1. package/dist/charts.cjs.js +1 -1
  2. package/dist/charts.d.ts +1 -17
  3. package/dist/charts.es.js +2 -16
  4. package/dist/chunk-BDDJmn7V.js +1 -0
  5. package/dist/chunk-BH6uBOac.mjs +23 -0
  6. package/dist/cli/index.cjs +621 -188
  7. package/dist/cn-DnPbmOCy.js +1 -0
  8. package/dist/cn-DpLcAzrf.mjs +22 -0
  9. package/dist/doc.cjs.js +2 -0
  10. package/dist/doc.d.ts +1 -0
  11. package/dist/doc.es.js +131 -0
  12. package/dist/exceljs.min-BuefmDRS.js +28 -0
  13. package/dist/exceljs.min-DG9M8IZ1.mjs +32037 -0
  14. package/dist/export.cjs.js +1 -1
  15. package/dist/export.d.ts +1 -30
  16. package/dist/export.es.js +2 -5
  17. package/dist/index.cjs.js +259 -240
  18. package/dist/index.d.ts +1 -35
  19. package/dist/index.es.js +95716 -98932
  20. package/dist/rich-text.cjs.js +1 -1
  21. package/dist/rich-text.d.ts +1 -21
  22. package/dist/rich-text.es.js +2 -4
  23. package/dist/separator-BDReXBvI.mjs +59 -0
  24. package/dist/separator-BKjNl9sI.js +1 -0
  25. package/dist/src/blocks/waka-doc-shell/index.d.ts +3 -0
  26. package/dist/src/blocks/waka-doc-shell/types.d.ts +32 -0
  27. package/dist/src/charts.d.ts +17 -0
  28. package/dist/src/components/command/index.d.ts +83 -0
  29. package/dist/{components → src/components}/index.d.ts +39 -0
  30. package/dist/src/components/waka-actor-badge/index.d.ts +8 -0
  31. package/dist/src/components/waka-actors-list/index.d.ts +18 -0
  32. package/dist/src/components/waka-ai-assistant-button/index.d.ts +8 -0
  33. package/dist/src/components/waka-credit-activity-feed/index.d.ts +21 -0
  34. package/dist/src/components/waka-credit-alert/index.d.ts +24 -0
  35. package/dist/src/components/waka-credit-balance/index.d.ts +30 -0
  36. package/dist/src/components/waka-credit-balance/types.d.ts +34 -0
  37. package/dist/src/components/waka-credit-breakdown/index.d.ts +32 -0
  38. package/dist/src/components/waka-credit-burn-rate/index.d.ts +25 -0
  39. package/dist/src/components/waka-credit-history/index.d.ts +31 -0
  40. package/dist/src/components/waka-credit-meter/index.d.ts +27 -0
  41. package/dist/src/components/waka-credit-pricing-pack/index.d.ts +17 -0
  42. package/dist/src/components/waka-credit-projection/index.d.ts +21 -0
  43. package/dist/src/components/waka-credit-quota/index.d.ts +25 -0
  44. package/dist/src/components/waka-credit-receipt/index.d.ts +23 -0
  45. package/dist/src/components/waka-credit-top-up/index.d.ts +26 -0
  46. package/dist/src/components/waka-credit-transaction/index.d.ts +22 -0
  47. package/dist/src/components/waka-credit-transfer-form/index.d.ts +27 -0
  48. package/dist/src/components/waka-credit-usage-chart/index.d.ts +34 -0
  49. package/dist/src/components/waka-doc-breadcrumb/index.d.ts +11 -0
  50. package/dist/src/components/waka-doc-callout/index.d.ts +9 -0
  51. package/dist/src/components/waka-doc-code-block/index.d.ts +9 -0
  52. package/dist/src/components/waka-doc-nav/index.d.ts +16 -0
  53. package/dist/src/components/waka-doc-renderer/index.d.ts +7 -0
  54. package/dist/src/components/waka-doc-search/index.d.ts +18 -0
  55. package/dist/src/components/waka-doc-table/index.d.ts +8 -0
  56. package/dist/src/components/waka-doc-toc/index.d.ts +11 -0
  57. package/dist/src/components/waka-doc-toolbar/index.d.ts +10 -0
  58. package/dist/src/components/waka-doc-version/index.d.ts +13 -0
  59. package/dist/src/components/waka-document-flyover/index.d.ts +10 -0
  60. package/dist/src/components/waka-document-preview-popup/index.d.ts +26 -0
  61. package/dist/src/components/waka-hour-balance-badge/index.d.ts +8 -0
  62. package/dist/src/components/waka-hour-consumption-table/index.d.ts +15 -0
  63. package/dist/src/components/waka-hour-pack-dialog/index.d.ts +8 -0
  64. package/dist/src/components/waka-project-stats-header/index.d.ts +15 -0
  65. package/dist/src/components/waka-step-comment-bubble/index.d.ts +13 -0
  66. package/dist/src/components/waka-step-comment-panel/index.d.ts +20 -0
  67. package/dist/src/components/waka-step-permission-matrix/index.d.ts +12 -0
  68. package/dist/src/components/waka-time-entry-dialog/index.d.ts +16 -0
  69. package/dist/src/components/waka-time-tracking-flyover/index.d.ts +11 -0
  70. package/dist/src/doc.d.ts +33 -0
  71. package/dist/src/export.d.ts +30 -0
  72. package/dist/src/index.d.ts +35 -0
  73. package/dist/src/rich-text.d.ts +21 -0
  74. package/dist/types-B6GVaSIP.mjs +934 -0
  75. package/dist/types-BH9cQRqZ.js +1 -0
  76. package/dist/ui.css +2 -1
  77. package/dist/useDataTableImport-BPvfo--2.mjs +250 -0
  78. package/dist/useDataTableImport-Cm_pCKnO.js +7 -0
  79. package/dist/waka-doc-renderer-BZ2-SqyT.js +3 -0
  80. package/dist/waka-doc-renderer-BkIvas3z.mjs +1679 -0
  81. package/dist/waka-rich-text-editor-BJGlQgpq.js +1 -0
  82. package/dist/waka-rich-text-editor-BJzzxeP1.mjs +361 -0
  83. package/dist/waka-rich-text-editor-wnXLwvUo.js +1 -0
  84. package/package.json +100 -70
  85. package/src/blocks/footer/index.tsx +7 -1
  86. package/src/blocks/login/index.tsx +7 -1
  87. package/src/blocks/profile/index.tsx +5 -3
  88. package/src/blocks/waka-doc-shell/WakaDocShell.stories.tsx +198 -0
  89. package/src/blocks/waka-doc-shell/index.tsx +240 -0
  90. package/src/blocks/waka-doc-shell/types.ts +40 -0
  91. package/src/components/index.ts +46 -0
  92. package/src/components/waka-actor-badge/index.tsx +34 -0
  93. package/src/components/waka-actors-list/index.tsx +125 -0
  94. package/src/components/waka-ai-assistant-button/index.tsx +31 -0
  95. package/src/components/waka-credit-activity-feed/WakaCreditActivityFeed.stories.tsx +261 -0
  96. package/src/components/waka-credit-activity-feed/index.tsx +364 -0
  97. package/src/components/waka-credit-alert/WakaCreditAlert.stories.tsx +170 -0
  98. package/src/components/waka-credit-alert/index.tsx +179 -0
  99. package/src/components/waka-credit-balance/WakaCreditBalance.stories.tsx +259 -0
  100. package/src/components/waka-credit-balance/index.tsx +433 -0
  101. package/src/components/waka-credit-balance/types.ts +38 -0
  102. package/src/components/waka-credit-breakdown/WakaCreditBreakdown.stories.tsx +186 -0
  103. package/src/components/waka-credit-breakdown/index.tsx +487 -0
  104. package/src/components/waka-credit-burn-rate/WakaCreditBurnRate.stories.tsx +227 -0
  105. package/src/components/waka-credit-burn-rate/index.tsx +475 -0
  106. package/src/components/waka-credit-history/WakaCreditHistory.stories.tsx +290 -0
  107. package/src/components/waka-credit-history/index.tsx +654 -0
  108. package/src/components/waka-credit-meter/WakaCreditMeter.stories.tsx +418 -0
  109. package/src/components/waka-credit-meter/index.tsx +624 -0
  110. package/src/components/waka-credit-pricing-pack/WakaCreditPricingPack.stories.tsx +217 -0
  111. package/src/components/waka-credit-pricing-pack/index.tsx +185 -0
  112. package/src/components/waka-credit-projection/WakaCreditProjection.stories.tsx +163 -0
  113. package/src/components/waka-credit-projection/index.tsx +345 -0
  114. package/src/components/waka-credit-quota/WakaCreditQuota.stories.tsx +260 -0
  115. package/src/components/waka-credit-quota/index.tsx +461 -0
  116. package/src/components/waka-credit-receipt/WakaCreditReceipt.stories.tsx +98 -0
  117. package/src/components/waka-credit-receipt/index.tsx +247 -0
  118. package/src/components/waka-credit-top-up/WakaCreditTopUp.stories.tsx +196 -0
  119. package/src/components/waka-credit-top-up/index.tsx +403 -0
  120. package/src/components/waka-credit-transaction/WakaCreditTransaction.stories.tsx +218 -0
  121. package/src/components/waka-credit-transaction/index.tsx +278 -0
  122. package/src/components/waka-credit-transfer-form/WakaCreditTransferForm.stories.tsx +122 -0
  123. package/src/components/waka-credit-transfer-form/index.tsx +352 -0
  124. package/src/components/waka-credit-usage-chart/WakaCreditUsageChart.stories.tsx +214 -0
  125. package/src/components/waka-credit-usage-chart/index.tsx +307 -0
  126. package/src/components/waka-doc-breadcrumb/WakaDocBreadcrumb.stories.tsx +47 -0
  127. package/src/components/waka-doc-breadcrumb/index.tsx +42 -0
  128. package/src/components/waka-doc-callout/WakaDocCallout.stories.tsx +67 -0
  129. package/src/components/waka-doc-callout/index.tsx +86 -0
  130. package/src/components/waka-doc-code-block/WakaDocCodeBlock.stories.tsx +92 -0
  131. package/src/components/waka-doc-code-block/index.tsx +120 -0
  132. package/src/components/waka-doc-nav/WakaDocNav.stories.tsx +95 -0
  133. package/src/components/waka-doc-nav/index.tsx +125 -0
  134. package/src/components/waka-doc-renderer/WakaDocRenderer.stories.tsx +120 -0
  135. package/src/components/waka-doc-renderer/index.tsx +217 -0
  136. package/src/components/waka-doc-search/WakaDocSearch.stories.tsx +64 -0
  137. package/src/components/waka-doc-search/index.tsx +158 -0
  138. package/src/components/waka-doc-table/WakaDocTable.stories.tsx +47 -0
  139. package/src/components/waka-doc-table/index.tsx +37 -0
  140. package/src/components/waka-doc-toc/WakaDocToc.stories.tsx +54 -0
  141. package/src/components/waka-doc-toc/index.tsx +90 -0
  142. package/src/components/waka-doc-toolbar/WakaDocToolbar.stories.tsx +79 -0
  143. package/src/components/waka-doc-toolbar/index.tsx +131 -0
  144. package/src/components/waka-doc-version/WakaDocVersion.stories.tsx +41 -0
  145. package/src/components/waka-doc-version/index.tsx +63 -0
  146. package/src/components/waka-document-flyover/index.tsx +36 -0
  147. package/src/components/waka-document-preview-popup/index.tsx +103 -0
  148. package/src/components/waka-hour-balance-badge/index.tsx +43 -0
  149. package/src/components/waka-hour-consumption-table/index.tsx +72 -0
  150. package/src/components/waka-hour-pack-dialog/index.tsx +72 -0
  151. package/src/components/waka-project-stats-header/index.tsx +69 -0
  152. package/src/components/waka-step-comment-bubble/index.tsx +71 -0
  153. package/src/components/waka-step-comment-panel/index.tsx +106 -0
  154. package/src/components/waka-step-permission-matrix/index.tsx +65 -0
  155. package/src/components/waka-time-entry-dialog/index.tsx +131 -0
  156. package/src/components/waka-time-tracking-flyover/index.tsx +41 -0
  157. package/dist/cn-B-fTneHh.js +0 -1
  158. package/dist/cn-DzRe1GWm.mjs +0 -21
  159. package/dist/components/command/index.d.ts +0 -51
  160. package/dist/exceljs.min-BcLLX0PC.js +0 -29
  161. package/dist/exceljs.min-KOayaaQ4.mjs +0 -23013
  162. package/dist/index-B9GTFkji.js +0 -1
  163. package/dist/index-c0jcWyEL.mjs +0 -466
  164. package/dist/types-BOWIoR7j.mjs +0 -1111
  165. package/dist/types-D2yCJ91P.js +0 -1
  166. package/dist/useDataTableImport-COVnvslz.js +0 -9
  167. package/dist/useDataTableImport-DAlxBY8w.mjs +0 -237
  168. /package/dist/{blocks → src/blocks}/activity-timeline/index.d.ts +0 -0
  169. /package/dist/{blocks → src/blocks}/antivirus-dashboard/index.d.ts +0 -0
  170. /package/dist/{blocks → src/blocks}/apm-overview/index.d.ts +0 -0
  171. /package/dist/{blocks → src/blocks}/auth-2fa/index.d.ts +0 -0
  172. /package/dist/{blocks → src/blocks}/calendar-view/index.d.ts +0 -0
  173. /package/dist/{blocks → src/blocks}/chat/index.d.ts +0 -0
  174. /package/dist/{blocks → src/blocks}/chat/widget.d.ts +0 -0
  175. /package/dist/{blocks → src/blocks}/chat-interface/index.d.ts +0 -0
  176. /package/dist/{blocks → src/blocks}/checkout-flow/index.d.ts +0 -0
  177. /package/dist/{blocks → src/blocks}/cicd-builder/index.d.ts +0 -0
  178. /package/dist/{blocks → src/blocks}/clamav-service-status/index.d.ts +0 -0
  179. /package/dist/{blocks → src/blocks}/cloud-cost-dashboard/index.d.ts +0 -0
  180. /package/dist/{blocks → src/blocks}/container-orchestrator/index.d.ts +0 -0
  181. /package/dist/{blocks → src/blocks}/dashboard/index.d.ts +0 -0
  182. /package/dist/{blocks → src/blocks}/dashboard-kpi/index.d.ts +0 -0
  183. /package/dist/{blocks → src/blocks}/database-admin/index.d.ts +0 -0
  184. /package/dist/{blocks → src/blocks}/deployment-dashboard/index.d.ts +0 -0
  185. /package/dist/{blocks → src/blocks}/empty-states/index.d.ts +0 -0
  186. /package/dist/{blocks → src/blocks}/error-pages/index.d.ts +0 -0
  187. /package/dist/{blocks → src/blocks}/faq/index.d.ts +0 -0
  188. /package/dist/{blocks → src/blocks}/file-manager/index.d.ts +0 -0
  189. /package/dist/{blocks → src/blocks}/file-scan-uploader/index.d.ts +0 -0
  190. /package/dist/{blocks → src/blocks}/footer/index.d.ts +0 -0
  191. /package/dist/{blocks → src/blocks}/gitops-sync-status/index.d.ts +0 -0
  192. /package/dist/{blocks → src/blocks}/header/index.d.ts +0 -0
  193. /package/dist/{blocks → src/blocks}/headtab/index.d.ts +0 -0
  194. /package/dist/{blocks → src/blocks}/i18n-editor/index.d.ts +0 -0
  195. /package/dist/{blocks → src/blocks}/incident-manager/index.d.ts +0 -0
  196. /package/dist/{blocks → src/blocks}/index.d.ts +0 -0
  197. /package/dist/{blocks → src/blocks}/infrastructure-map/index.d.ts +0 -0
  198. /package/dist/{blocks → src/blocks}/kanban-board/index.d.ts +0 -0
  199. /package/dist/{blocks → src/blocks}/landing/index.d.ts +0 -0
  200. /package/dist/{blocks → src/blocks}/language-selector/index.d.ts +0 -0
  201. /package/dist/{blocks → src/blocks}/layout/index.d.ts +0 -0
  202. /package/dist/{blocks → src/blocks}/login/index.d.ts +0 -0
  203. /package/dist/{blocks → src/blocks}/login/types.d.ts +0 -0
  204. /package/dist/{blocks → src/blocks}/on-call-schedule/index.d.ts +0 -0
  205. /package/dist/{blocks → src/blocks}/player-profile/index.d.ts +0 -0
  206. /package/dist/{blocks → src/blocks}/pricing/index.d.ts +0 -0
  207. /package/dist/{blocks → src/blocks}/profile/index.d.ts +0 -0
  208. /package/dist/{blocks → src/blocks}/quarantine-manager/index.d.ts +0 -0
  209. /package/dist/{blocks → src/blocks}/release-notes/index.d.ts +0 -0
  210. /package/dist/{blocks → src/blocks}/scan-history-log/index.d.ts +0 -0
  211. /package/dist/{blocks → src/blocks}/scan-policy-editor/index.d.ts +0 -0
  212. /package/dist/{blocks → src/blocks}/scan-report-generator/index.d.ts +0 -0
  213. /package/dist/{blocks → src/blocks}/settings/index.d.ts +0 -0
  214. /package/dist/{blocks → src/blocks}/sidebar/index.d.ts +0 -0
  215. /package/dist/{blocks → src/blocks}/signature-database-manager/index.d.ts +0 -0
  216. /package/dist/{blocks → src/blocks}/threat-alert-banner/index.d.ts +0 -0
  217. /package/dist/{blocks → src/blocks}/user-management/index.d.ts +0 -0
  218. /package/dist/{blocks → src/blocks}/wizard/index.d.ts +0 -0
  219. /package/dist/{cli → src/cli}/commands/add.d.ts +0 -0
  220. /package/dist/{cli → src/cli}/commands/init.d.ts +0 -0
  221. /package/dist/{cli → src/cli}/commands/list.d.ts +0 -0
  222. /package/dist/{cli → src/cli}/commands/search.d.ts +0 -0
  223. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  224. /package/dist/{cli → src/cli}/utils/config.d.ts +0 -0
  225. /package/dist/{cli → src/cli}/utils/logger.d.ts +0 -0
  226. /package/dist/{cli → src/cli}/utils/registry.d.ts +0 -0
  227. /package/dist/{components → src/components}/DataTable/DataTable.d.ts +0 -0
  228. /package/dist/{components → src/components}/DataTable/DataTableAdvanced.d.ts +0 -0
  229. /package/dist/{components → src/components}/DataTable/DataTableColumnResizer.d.ts +0 -0
  230. /package/dist/{components → src/components}/DataTable/DataTableContextMenu.d.ts +0 -0
  231. /package/dist/{components → src/components}/DataTable/DataTableEditCell.d.ts +0 -0
  232. /package/dist/{components → src/components}/DataTable/DataTableFilters.d.ts +0 -0
  233. /package/dist/{components → src/components}/DataTable/DataTableGrouping.d.ts +0 -0
  234. /package/dist/{components → src/components}/DataTable/DataTablePagination.d.ts +0 -0
  235. /package/dist/{components → src/components}/DataTable/DataTableSelection.d.ts +0 -0
  236. /package/dist/{components → src/components}/DataTable/DataTableToolbar.d.ts +0 -0
  237. /package/dist/{components → src/components}/DataTable/examples/EditExample.d.ts +0 -0
  238. /package/dist/{components → src/components}/DataTable/hooks/useDataTable.d.ts +0 -0
  239. /package/dist/{components → src/components}/DataTable/hooks/useDataTableAdvanced.d.ts +0 -0
  240. /package/dist/{components → src/components}/DataTable/hooks/useDataTableEdit.d.ts +0 -0
  241. /package/dist/{components → src/components}/DataTable/hooks/useDataTableExport.d.ts +0 -0
  242. /package/dist/{components → src/components}/DataTable/hooks/useDataTableImport.d.ts +0 -0
  243. /package/dist/{components → src/components}/DataTable/hooks/useDataTableTheme.d.ts +0 -0
  244. /package/dist/{components → src/components}/DataTable/hooks/useDataTableVirtualization.d.ts +0 -0
  245. /package/dist/{components → src/components}/DataTable/hooks/useTableLayout.d.ts +0 -0
  246. /package/dist/{components → src/components}/DataTable/index.d.ts +0 -0
  247. /package/dist/{components → src/components}/DataTable/types.d.ts +0 -0
  248. /package/dist/{components → src/components}/DataTable/utils.d.ts +0 -0
  249. /package/dist/{components → src/components}/accordion/index.d.ts +0 -0
  250. /package/dist/{components → src/components}/alert/index.d.ts +0 -0
  251. /package/dist/{components → src/components}/alert-dialog/index.d.ts +0 -0
  252. /package/dist/{components → src/components}/aspect-ratio/index.d.ts +0 -0
  253. /package/dist/{components → src/components}/avatar/index.d.ts +0 -0
  254. /package/dist/{components → src/components}/badge/index.d.ts +0 -0
  255. /package/dist/{components → src/components}/button/index.d.ts +0 -0
  256. /package/dist/{components → src/components}/calendar/index.d.ts +0 -0
  257. /package/dist/{components → src/components}/card/index.d.ts +0 -0
  258. /package/dist/{components → src/components}/checkbox/index.d.ts +0 -0
  259. /package/dist/{components → src/components}/code/index.d.ts +0 -0
  260. /package/dist/{components → src/components}/collapsible/index.d.ts +0 -0
  261. /package/dist/{components → src/components}/context-menu/index.d.ts +0 -0
  262. /package/dist/{components → src/components}/dialog/index.d.ts +0 -0
  263. /package/dist/{components → src/components}/dropdown-menu/index.d.ts +0 -0
  264. /package/dist/{components → src/components}/error-boundary/ErrorBoundary.d.ts +0 -0
  265. /package/dist/{components → src/components}/error-boundary/index.d.ts +0 -0
  266. /package/dist/{components → src/components}/form/index.d.ts +0 -0
  267. /package/dist/{components → src/components}/hover-card/index.d.ts +0 -0
  268. /package/dist/{components → src/components}/input/index.d.ts +0 -0
  269. /package/dist/{components → src/components}/input-otp/index.d.ts +0 -0
  270. /package/dist/{components → src/components}/label/index.d.ts +0 -0
  271. /package/dist/{components → src/components}/language-selector/index.d.ts +0 -0
  272. /package/dist/{components → src/components}/menubar/index.d.ts +0 -0
  273. /package/dist/{components → src/components}/navigation-menu/index.d.ts +0 -0
  274. /package/dist/{components → src/components}/popover/index.d.ts +0 -0
  275. /package/dist/{components → src/components}/progress/index.d.ts +0 -0
  276. /package/dist/{components → src/components}/radio-group/index.d.ts +0 -0
  277. /package/dist/{components → src/components}/scroll-area/index.d.ts +0 -0
  278. /package/dist/{components → src/components}/select/index.d.ts +0 -0
  279. /package/dist/{components → src/components}/separator/index.d.ts +0 -0
  280. /package/dist/{components → src/components}/sheet/index.d.ts +0 -0
  281. /package/dist/{components → src/components}/skeleton/index.d.ts +0 -0
  282. /package/dist/{components → src/components}/slider/index.d.ts +0 -0
  283. /package/dist/{components → src/components}/switch/index.d.ts +0 -0
  284. /package/dist/{components → src/components}/table/index.d.ts +0 -0
  285. /package/dist/{components → src/components}/tabs/index.d.ts +0 -0
  286. /package/dist/{components → src/components}/textarea/index.d.ts +0 -0
  287. /package/dist/{components → src/components}/theme-selector/index.d.ts +0 -0
  288. /package/dist/{components → src/components}/toast/index.d.ts +0 -0
  289. /package/dist/{components → src/components}/toaster/index.d.ts +0 -0
  290. /package/dist/{components → src/components}/toggle/index.d.ts +0 -0
  291. /package/dist/{components → src/components}/tooltip/index.d.ts +0 -0
  292. /package/dist/{components → src/components}/typography/index.d.ts +0 -0
  293. /package/dist/{components → src/components}/waka-3d-pie-chart/index.d.ts +0 -0
  294. /package/dist/{components → src/components}/waka-achievement-unlock/index.d.ts +0 -0
  295. /package/dist/{components → src/components}/waka-activity-feed/index.d.ts +0 -0
  296. /package/dist/{components → src/components}/waka-ad-banner/index.d.ts +0 -0
  297. /package/dist/{components → src/components}/waka-ad-fallback/index.d.ts +0 -0
  298. /package/dist/{components → src/components}/waka-ad-inline/index.d.ts +0 -0
  299. /package/dist/{components → src/components}/waka-ad-interstitial/index.d.ts +0 -0
  300. /package/dist/{components → src/components}/waka-ad-placeholder/index.d.ts +0 -0
  301. /package/dist/{components → src/components}/waka-ad-provider/index.d.ts +0 -0
  302. /package/dist/{components → src/components}/waka-ad-sidebar/index.d.ts +0 -0
  303. /package/dist/{components → src/components}/waka-ad-sticky-footer/index.d.ts +0 -0
  304. /package/dist/{components → src/components}/waka-address-autocomplete/index.d.ts +0 -0
  305. /package/dist/{components → src/components}/waka-admincrumb/index.d.ts +0 -0
  306. /package/dist/{components → src/components}/waka-alert-panel/index.d.ts +0 -0
  307. /package/dist/{components → src/components}/waka-alert-stack/index.d.ts +0 -0
  308. /package/dist/{components → src/components}/waka-allocation-matrix/index.d.ts +0 -0
  309. /package/dist/{components → src/components}/waka-approval-chain/index.d.ts +0 -0
  310. /package/dist/{components → src/components}/waka-artifact-list/index.d.ts +0 -0
  311. /package/dist/{components → src/components}/waka-audit-log/index.d.ts +0 -0
  312. /package/dist/{components → src/components}/waka-autocomplete/index.d.ts +0 -0
  313. /package/dist/{components → src/components}/waka-badge-showcase/index.d.ts +0 -0
  314. /package/dist/{components → src/components}/waka-barcode/index.d.ts +0 -0
  315. /package/dist/{components → src/components}/waka-biometric-prompt/index.d.ts +0 -0
  316. /package/dist/{components → src/components}/waka-bottom-sheet/index.d.ts +0 -0
  317. /package/dist/{components → src/components}/waka-breadcrumb/index.d.ts +0 -0
  318. /package/dist/{components → src/components}/waka-breadcrumb-path/index.d.ts +0 -0
  319. /package/dist/{components → src/components}/waka-budget-burn/index.d.ts +0 -0
  320. /package/dist/{components → src/components}/waka-build-matrix/index.d.ts +0 -0
  321. /package/dist/{components → src/components}/waka-capacity-planner/index.d.ts +0 -0
  322. /package/dist/{components → src/components}/waka-carousel/index.d.ts +0 -0
  323. /package/dist/{components → src/components}/waka-cart-summary/index.d.ts +0 -0
  324. /package/dist/{components → src/components}/waka-challenge-timer/index.d.ts +0 -0
  325. /package/dist/{components → src/components}/waka-charts/WakaAreaChart.d.ts +0 -0
  326. /package/dist/{components → src/components}/waka-charts/WakaBarChart.d.ts +0 -0
  327. /package/dist/{components → src/components}/waka-charts/WakaChart.d.ts +0 -0
  328. /package/dist/{components → src/components}/waka-charts/WakaLineChart.d.ts +0 -0
  329. /package/dist/{components → src/components}/waka-charts/WakaMiniChart.d.ts +0 -0
  330. /package/dist/{components → src/components}/waka-charts/WakaPieChart.d.ts +0 -0
  331. /package/dist/{components → src/components}/waka-charts/WakaSparkline.d.ts +0 -0
  332. /package/dist/{components → src/components}/waka-charts/dataTableHelpers.d.ts +0 -0
  333. /package/dist/{components → src/components}/waka-charts/hooks/useChartTheme.d.ts +0 -0
  334. /package/dist/{components → src/components}/waka-charts/hooks/useRechartsLoader.d.ts +0 -0
  335. /package/dist/{components → src/components}/waka-charts/index.d.ts +0 -0
  336. /package/dist/{components → src/components}/waka-charts/types.d.ts +0 -0
  337. /package/dist/{components → src/components}/waka-chat-bubble/index.d.ts +0 -0
  338. /package/dist/{components → src/components}/waka-checklist/index.d.ts +0 -0
  339. /package/dist/{components → src/components}/waka-checkout-stepper/index.d.ts +0 -0
  340. /package/dist/{components → src/components}/waka-cohort-table/index.d.ts +0 -0
  341. /package/dist/{components → src/components}/waka-color-picker/index.d.ts +0 -0
  342. /package/dist/{components → src/components}/waka-combo-counter/index.d.ts +0 -0
  343. /package/dist/{components → src/components}/waka-combobox/index.d.ts +0 -0
  344. /package/dist/{components → src/components}/waka-command-bar/index.d.ts +0 -0
  345. /package/dist/{components → src/components}/waka-compare-period/index.d.ts +0 -0
  346. /package/dist/{components → src/components}/waka-config-comparator/index.d.ts +0 -0
  347. /package/dist/{components → src/components}/waka-connection-matrix/index.d.ts +0 -0
  348. /package/dist/{components → src/components}/waka-container-list/index.d.ts +0 -0
  349. /package/dist/{components → src/components}/waka-content-recommendation/index.d.ts +0 -0
  350. /package/dist/{components → src/components}/waka-contribution-graph/index.d.ts +0 -0
  351. /package/dist/{components → src/components}/waka-cost-breakdown/index.d.ts +0 -0
  352. /package/dist/{components → src/components}/waka-coupon-input/index.d.ts +0 -0
  353. /package/dist/{components → src/components}/waka-credit-card-input/index.d.ts +0 -0
  354. /package/dist/{components → src/components}/waka-daily-reward/index.d.ts +0 -0
  355. /package/dist/{components → src/components}/waka-database-card/index.d.ts +0 -0
  356. /package/dist/{components → src/components}/waka-date-range-picker/index.d.ts +0 -0
  357. /package/dist/{components → src/components}/waka-datetime-picker/index.d.ts +0 -0
  358. /package/dist/{components → src/components}/waka-datetime-picker.form-integration/index.d.ts +0 -0
  359. /package/dist/{components → src/components}/waka-dependency-tree/index.d.ts +0 -0
  360. /package/dist/{components → src/components}/waka-deployment-lane/index.d.ts +0 -0
  361. /package/dist/{components → src/components}/waka-device-trust/index.d.ts +0 -0
  362. /package/dist/{components → src/components}/waka-dock/index.d.ts +0 -0
  363. /package/dist/{components → src/components}/waka-drawer/index.d.ts +0 -0
  364. /package/dist/{components → src/components}/waka-empty-state/index.d.ts +0 -0
  365. /package/dist/{components → src/components}/waka-env-var-editor/index.d.ts +0 -0
  366. /package/dist/{components → src/components}/waka-error-shake/index.d.ts +0 -0
  367. /package/dist/{components → src/components}/waka-feature-announcement/index.d.ts +0 -0
  368. /package/dist/{components → src/components}/waka-feature-flag-row/index.d.ts +0 -0
  369. /package/dist/{components → src/components}/waka-file-upload/index.d.ts +0 -0
  370. /package/dist/{components → src/components}/waka-floating-nav/index.d.ts +0 -0
  371. /package/dist/{components → src/components}/waka-flow-diagram/index.d.ts +0 -0
  372. /package/dist/{components → src/components}/waka-funnel-chart/index.d.ts +0 -0
  373. /package/dist/{components → src/components}/waka-glow-card/index.d.ts +0 -0
  374. /package/dist/{components → src/components}/waka-goal-progress/index.d.ts +0 -0
  375. /package/dist/{components → src/components}/waka-haptic-button/index.d.ts +0 -0
  376. /package/dist/{components → src/components}/waka-health-pulse/index.d.ts +0 -0
  377. /package/dist/{components → src/components}/waka-heatmap/index.d.ts +0 -0
  378. /package/dist/{components → src/components}/waka-hotspot/index.d.ts +0 -0
  379. /package/dist/{components → src/components}/waka-image/index.d.ts +0 -0
  380. /package/dist/{components → src/components}/waka-incident-timeline/index.d.ts +0 -0
  381. /package/dist/{components → src/components}/waka-invoice-preview/index.d.ts +0 -0
  382. /package/dist/{components → src/components}/waka-kanban/index.d.ts +0 -0
  383. /package/dist/{components → src/components}/waka-kpi-dashboard/index.d.ts +0 -0
  384. /package/dist/{components → src/components}/waka-kubernetes-overview/index.d.ts +0 -0
  385. /package/dist/{components → src/components}/waka-leaderboard/index.d.ts +0 -0
  386. /package/dist/{components → src/components}/waka-level-progress/index.d.ts +0 -0
  387. /package/dist/{components → src/components}/waka-liquid-button/index.d.ts +0 -0
  388. /package/dist/{components → src/components}/waka-loading-orbit/index.d.ts +0 -0
  389. /package/dist/{components → src/components}/waka-log-viewer/index.d.ts +0 -0
  390. /package/dist/{components → src/components}/waka-loot-box/index.d.ts +0 -0
  391. /package/dist/{components → src/components}/waka-magic-link/index.d.ts +0 -0
  392. /package/dist/{components → src/components}/waka-magnetic-button/index.d.ts +0 -0
  393. /package/dist/{components → src/components}/waka-mention-input/index.d.ts +0 -0
  394. /package/dist/{components → src/components}/waka-metric-sparkline/index.d.ts +0 -0
  395. /package/dist/{components → src/components}/waka-migration-list/index.d.ts +0 -0
  396. /package/dist/{components → src/components}/waka-milestone-road/index.d.ts +0 -0
  397. /package/dist/{components → src/components}/waka-modal/index.d.ts +0 -0
  398. /package/dist/{components → src/components}/waka-morph-button/index.d.ts +0 -0
  399. /package/dist/{components → src/components}/waka-network-topology/index.d.ts +0 -0
  400. /package/dist/{components → src/components}/waka-notifications/index.d.ts +0 -0
  401. /package/dist/{components → src/components}/waka-number-input/index.d.ts +0 -0
  402. /package/dist/{components → src/components}/waka-orbital-menu/index.d.ts +0 -0
  403. /package/dist/{components → src/components}/waka-order-tracker/index.d.ts +0 -0
  404. /package/dist/{components → src/components}/waka-outstream-video/index.d.ts +0 -0
  405. /package/dist/{components → src/components}/waka-pagination/index.d.ts +0 -0
  406. /package/dist/{components → src/components}/waka-password-strength/index.d.ts +0 -0
  407. /package/dist/{components → src/components}/waka-payment-method-picker/index.d.ts +0 -0
  408. /package/dist/{components → src/components}/waka-permission-matrix/index.d.ts +0 -0
  409. /package/dist/{components → src/components}/waka-phone-input/index.d.ts +0 -0
  410. /package/dist/{components → src/components}/waka-pipeline-view/index.d.ts +0 -0
  411. /package/dist/{components → src/components}/waka-player-card/index.d.ts +0 -0
  412. /package/dist/{components → src/components}/waka-pod-card/index.d.ts +0 -0
  413. /package/dist/{components → src/components}/waka-points-popup/index.d.ts +0 -0
  414. /package/dist/{components → src/components}/waka-power-up/index.d.ts +0 -0
  415. /package/dist/{components → src/components}/waka-presence-indicator/index.d.ts +0 -0
  416. /package/dist/{components → src/components}/waka-pricing-table/index.d.ts +0 -0
  417. /package/dist/{components → src/components}/waka-product-card/index.d.ts +0 -0
  418. /package/dist/{components → src/components}/waka-progress-onboarding/index.d.ts +0 -0
  419. /package/dist/{components → src/components}/waka-pull-to-refresh/index.d.ts +0 -0
  420. /package/dist/{components → src/components}/waka-qrcode/index.d.ts +0 -0
  421. /package/dist/{components → src/components}/waka-query-explain/index.d.ts +0 -0
  422. /package/dist/{components → src/components}/waka-quest-card/index.d.ts +0 -0
  423. /package/dist/{components → src/components}/waka-quota-bar/index.d.ts +0 -0
  424. /package/dist/{components → src/components}/waka-radar-score/index.d.ts +0 -0
  425. /package/dist/{components → src/components}/waka-rank-badge/index.d.ts +0 -0
  426. /package/dist/{components → src/components}/waka-rating-input/index.d.ts +0 -0
  427. /package/dist/{components → src/components}/waka-reaction-picker/index.d.ts +0 -0
  428. /package/dist/{components → src/components}/waka-region-map/index.d.ts +0 -0
  429. /package/dist/{components → src/components}/waka-resource-gauge/index.d.ts +0 -0
  430. /package/dist/{components → src/components}/waka-resource-pool/index.d.ts +0 -0
  431. /package/dist/{components → src/components}/waka-rich-text-editor/index.d.ts +0 -0
  432. /package/dist/{components → src/components}/waka-rollback-slider/index.d.ts +0 -0
  433. /package/dist/{components → src/components}/waka-sankey-diagram/index.d.ts +0 -0
  434. /package/dist/{components → src/components}/waka-schedule-picker/index.d.ts +0 -0
  435. /package/dist/{components → src/components}/waka-scratch-card/index.d.ts +0 -0
  436. /package/dist/{components → src/components}/waka-season-pass/index.d.ts +0 -0
  437. /package/dist/{components → src/components}/waka-secret-card/index.d.ts +0 -0
  438. /package/dist/{components → src/components}/waka-security-scan-result/index.d.ts +0 -0
  439. /package/dist/{components → src/components}/waka-security-score/index.d.ts +0 -0
  440. /package/dist/{components → src/components}/waka-segmented-control/index.d.ts +0 -0
  441. /package/dist/{components → src/components}/waka-server-rack/index.d.ts +0 -0
  442. /package/dist/{components → src/components}/waka-service-graph/index.d.ts +0 -0
  443. /package/dist/{components → src/components}/waka-session-manager/index.d.ts +0 -0
  444. /package/dist/{components → src/components}/waka-signature-pad/index.d.ts +0 -0
  445. /package/dist/{components → src/components}/waka-skeleton-wave/index.d.ts +0 -0
  446. /package/dist/{components → src/components}/waka-skill-tree/index.d.ts +0 -0
  447. /package/dist/{components → src/components}/waka-sla-tracker/index.d.ts +0 -0
  448. /package/dist/{components → src/components}/waka-slider-range/index.d.ts +0 -0
  449. /package/dist/{components → src/components}/waka-spin-wheel/index.d.ts +0 -0
  450. /package/dist/{components → src/components}/waka-spinner/index.d.ts +0 -0
  451. /package/dist/{components → src/components}/waka-sponsored-badge/index.d.ts +0 -0
  452. /package/dist/{components → src/components}/waka-sponsored-card/index.d.ts +0 -0
  453. /package/dist/{components → src/components}/waka-sponsored-feed/index.d.ts +0 -0
  454. /package/dist/{components → src/components}/waka-spotlight/index.d.ts +0 -0
  455. /package/dist/{components → src/components}/waka-stat/index.d.ts +0 -0
  456. /package/dist/{components → src/components}/waka-stats-hexagon/index.d.ts +0 -0
  457. /package/dist/{components → src/components}/waka-status-matrix/index.d.ts +0 -0
  458. /package/dist/{components → src/components}/waka-stepper/index.d.ts +0 -0
  459. /package/dist/{components → src/components}/waka-streak-counter/index.d.ts +0 -0
  460. /package/dist/{components → src/components}/waka-success-explosion/index.d.ts +0 -0
  461. /package/dist/{components → src/components}/waka-swipe-card/index.d.ts +0 -0
  462. /package/dist/{components → src/components}/waka-tabs-morph/index.d.ts +0 -0
  463. /package/dist/{components → src/components}/waka-tag-input/index.d.ts +0 -0
  464. /package/dist/{components → src/components}/waka-team-banner/index.d.ts +0 -0
  465. /package/dist/{components → src/components}/waka-terminal-output/index.d.ts +0 -0
  466. /package/dist/{components → src/components}/waka-test-report/index.d.ts +0 -0
  467. /package/dist/{components → src/components}/waka-theme-creator/index.d.ts +0 -0
  468. /package/dist/{components → src/components}/waka-theme-manager/index.d.ts +0 -0
  469. /package/dist/{components → src/components}/waka-thread-view/index.d.ts +0 -0
  470. /package/dist/{components → src/components}/waka-tilt-card/index.d.ts +0 -0
  471. /package/dist/{components → src/components}/waka-time-picker/index.d.ts +0 -0
  472. /package/dist/{components → src/components}/waka-timeline/index.d.ts +0 -0
  473. /package/dist/{components → src/components}/waka-tooltip-tour/index.d.ts +0 -0
  474. /package/dist/{components → src/components}/waka-tour-guide/index.d.ts +0 -0
  475. /package/dist/{components → src/components}/waka-tournament-bracket/index.d.ts +0 -0
  476. /package/dist/{components → src/components}/waka-trace-viewer/index.d.ts +0 -0
  477. /package/dist/{components → src/components}/waka-tree/index.d.ts +0 -0
  478. /package/dist/{components → src/components}/waka-treemap-chart/index.d.ts +0 -0
  479. /package/dist/{components → src/components}/waka-two-factor-setup/index.d.ts +0 -0
  480. /package/dist/{components → src/components}/waka-typewriter/index.d.ts +0 -0
  481. /package/dist/{components → src/components}/waka-typing-indicator/index.d.ts +0 -0
  482. /package/dist/{components → src/components}/waka-versus-card/index.d.ts +0 -0
  483. /package/dist/{components → src/components}/waka-video/index.d.ts +0 -0
  484. /package/dist/{components → src/components}/waka-video-ad/index.d.ts +0 -0
  485. /package/dist/{components → src/components}/waka-video-call/index.d.ts +0 -0
  486. /package/dist/{components → src/components}/waka-video-overlay/index.d.ts +0 -0
  487. /package/dist/{components → src/components}/waka-virtual-list/index.d.ts +0 -0
  488. /package/dist/{components → src/components}/waka-voice-message/index.d.ts +0 -0
  489. /package/dist/{components → src/components}/waka-welcome-modal/index.d.ts +0 -0
  490. /package/dist/{components → src/components}/waka-xp-bar/index.d.ts +0 -0
  491. /package/dist/{context → src/context}/admincrumb-context.d.ts +0 -0
  492. /package/dist/{context → src/context}/index.d.ts +0 -0
  493. /package/dist/{context → src/context}/language-context.d.ts +0 -0
  494. /package/dist/{context → src/context}/theme-context.d.ts +0 -0
  495. /package/dist/{context → src/context}/theme-provider.d.ts +0 -0
  496. /package/dist/{context → src/context}/waka-provider.d.ts +0 -0
  497. /package/dist/{hooks → src/hooks}/index.d.ts +0 -0
  498. /package/dist/{hooks → src/hooks}/use-toast.d.ts +0 -0
  499. /package/dist/{hooks → src/hooks}/use-translation.d.ts +0 -0
  500. /package/dist/{hooks → src/hooks}/useToast.d.ts +0 -0
  501. /package/dist/{lib → src/lib}/i18n.d.ts +0 -0
  502. /package/dist/{stories → src/stories}/Button.d.ts +0 -0
  503. /package/dist/{stories → src/stories}/Button.stories.d.ts +0 -0
  504. /package/dist/{stories → src/stories}/Header.d.ts +0 -0
  505. /package/dist/{stories → src/stories}/Header.stories.d.ts +0 -0
  506. /package/dist/{stories → src/stories}/Page.d.ts +0 -0
  507. /package/dist/{stories → src/stories}/Page.stories.d.ts +0 -0
  508. /package/dist/{types → src/types}/index.d.ts +0 -0
  509. /package/dist/{types → src/types}/link.d.ts +0 -0
  510. /package/dist/{types → src/types}/provider.d.ts +0 -0
  511. /package/dist/{utils → src/utils}/cn.d.ts +0 -0
  512. /package/dist/{utils → src/utils}/datetime-helpers.d.ts +0 -0
  513. /package/dist/{utils → src/utils}/error-handling.d.ts +0 -0
  514. /package/dist/{utils → src/utils}/index.d.ts +0 -0
  515. /package/dist/{utils → src/utils}/logger.d.ts +0 -0
  516. /package/dist/{utils → src/utils}/security.d.ts +0 -0
  517. /package/dist/{utils → src/utils}/theme-loader.d.ts +0 -0
  518. /package/dist/{utils → src/utils}/tweak.d.ts +0 -0
@@ -0,0 +1,654 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "../../utils/cn"
5
+ import {
6
+ ArrowUpCircle,
7
+ ArrowDownCircle,
8
+ RotateCcw,
9
+ Gift,
10
+ Clock,
11
+ ArrowUpDown,
12
+ ArrowUp,
13
+ ArrowDown,
14
+ Download,
15
+ Filter,
16
+ Inbox,
17
+ ChevronLeft,
18
+ ChevronRight,
19
+ X,
20
+ } from "lucide-react"
21
+ import type {
22
+ CreditTransaction,
23
+ CreditTransactionType,
24
+ CreditTransactionStatus,
25
+ } from "../waka-credit-balance/types"
26
+ import { Button } from "../button"
27
+ import { Badge } from "../badge"
28
+ import {
29
+ Select,
30
+ SelectContent,
31
+ SelectItem,
32
+ SelectTrigger,
33
+ SelectValue,
34
+ } from "../select"
35
+
36
+ // ============================================================================
37
+ // Types
38
+ // ============================================================================
39
+
40
+ export type { CreditTransaction, CreditTransactionType } from "../waka-credit-balance/types"
41
+
42
+ export interface WakaCreditHistoryProps {
43
+ /** Array of credit transactions to display */
44
+ transactions: CreditTransaction[]
45
+ /** Number of items per page (default: 10) */
46
+ pageSize?: number
47
+ /** Active filters */
48
+ filters?: {
49
+ types?: CreditTransactionType[]
50
+ services?: string[]
51
+ dateRange?: { from: Date; to: Date }
52
+ }
53
+ /** Callback when export is triggered */
54
+ onExport?: (format: "csv" | "pdf", data: CreditTransaction[]) => void
55
+ /** Callback when a row is clicked */
56
+ onRowClick?: (transaction: CreditTransaction) => void
57
+ /** Show the filter bar */
58
+ showFilters?: boolean
59
+ /** Show the export button */
60
+ showExport?: boolean
61
+ /** Custom empty state message */
62
+ emptyMessage?: string
63
+ /** Additional CSS classes */
64
+ className?: string
65
+ }
66
+
67
+ // ============================================================================
68
+ // Config
69
+ // ============================================================================
70
+
71
+ type SortField = "date" | "amount" | "type"
72
+ type SortDirection = "asc" | "desc"
73
+
74
+ const TRANSACTION_TYPE_CONFIG: Record<
75
+ CreditTransactionType,
76
+ { label: string; icon: React.ElementType; colorClass: string }
77
+ > = {
78
+ credit: {
79
+ label: "Credit",
80
+ icon: ArrowUpCircle,
81
+ colorClass: "text-green-600 dark:text-green-400",
82
+ },
83
+ debit: {
84
+ label: "Debit",
85
+ icon: ArrowDownCircle,
86
+ colorClass: "text-red-600 dark:text-red-400",
87
+ },
88
+ refund: {
89
+ label: "Refund",
90
+ icon: RotateCcw,
91
+ colorClass: "text-blue-600 dark:text-blue-400",
92
+ },
93
+ bonus: {
94
+ label: "Bonus",
95
+ icon: Gift,
96
+ colorClass: "text-purple-600 dark:text-purple-400",
97
+ },
98
+ expiry: {
99
+ label: "Expiry",
100
+ icon: Clock,
101
+ colorClass: "text-orange-600 dark:text-orange-400",
102
+ },
103
+ }
104
+
105
+ const STATUS_BADGE_VARIANT: Record<
106
+ CreditTransactionStatus,
107
+ { variant: "default" | "secondary" | "destructive" | "outline"; className: string }
108
+ > = {
109
+ completed: {
110
+ variant: "default",
111
+ className: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-400 border-green-200 dark:border-green-800",
112
+ },
113
+ pending: {
114
+ variant: "outline",
115
+ className: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-400 border-yellow-200 dark:border-yellow-800",
116
+ },
117
+ failed: {
118
+ variant: "destructive",
119
+ className: "bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-400 border-red-200 dark:border-red-800",
120
+ },
121
+ cancelled: {
122
+ variant: "secondary",
123
+ className: "bg-gray-100 text-gray-600 dark:bg-gray-800/50 dark:text-gray-400 border-gray-200 dark:border-gray-700",
124
+ },
125
+ }
126
+
127
+ const ALL_TYPES: CreditTransactionType[] = ["credit", "debit", "refund", "bonus", "expiry"]
128
+
129
+ // ============================================================================
130
+ // Helpers
131
+ // ============================================================================
132
+
133
+ function toDate(value: string | Date): Date {
134
+ return value instanceof Date ? value : new Date(value)
135
+ }
136
+
137
+ function formatDate(value: string | Date): string {
138
+ const date = toDate(value)
139
+ return date.toLocaleDateString("en-US", {
140
+ year: "numeric",
141
+ month: "short",
142
+ day: "numeric",
143
+ hour: "2-digit",
144
+ minute: "2-digit",
145
+ })
146
+ }
147
+
148
+ function formatAmount(amount: number, type: CreditTransactionType): string {
149
+ const isPositive = type === "credit" || type === "refund" || type === "bonus"
150
+ const prefix = isPositive ? "+" : "-"
151
+ return `${prefix}${Math.abs(amount).toLocaleString("en-US")}`
152
+ }
153
+
154
+ function getAmountColorClass(type: CreditTransactionType): string {
155
+ const isPositive = type === "credit" || type === "refund" || type === "bonus"
156
+ return isPositive
157
+ ? "text-green-600 dark:text-green-400"
158
+ : "text-red-600 dark:text-red-400"
159
+ }
160
+
161
+ // ============================================================================
162
+ // Sub-Components
163
+ // ============================================================================
164
+
165
+ interface SortHeaderProps {
166
+ label: string
167
+ field: SortField
168
+ currentSort: SortField
169
+ currentDirection: SortDirection
170
+ onSort: (field: SortField) => void
171
+ }
172
+
173
+ function SortHeader({ label, field, currentSort, currentDirection, onSort }: SortHeaderProps) {
174
+ const isActive = currentSort === field
175
+ const Icon = isActive
176
+ ? currentDirection === "asc"
177
+ ? ArrowUp
178
+ : ArrowDown
179
+ : ArrowUpDown
180
+
181
+ return (
182
+ <button
183
+ type="button"
184
+ className={cn(
185
+ "inline-flex items-center gap-1 text-xs font-medium uppercase tracking-wider hover:text-foreground transition-colors",
186
+ isActive ? "text-foreground" : "text-muted-foreground"
187
+ )}
188
+ onClick={() => onSort(field)}
189
+ >
190
+ {label}
191
+ <Icon className="h-3 w-3" />
192
+ </button>
193
+ )
194
+ }
195
+
196
+ interface TypeFilterProps {
197
+ selectedTypes: CreditTransactionType[]
198
+ onChange: (types: CreditTransactionType[]) => void
199
+ }
200
+
201
+ function TypeFilter({ selectedTypes, onChange }: TypeFilterProps) {
202
+ const handleToggle = (type: CreditTransactionType) => {
203
+ if (selectedTypes.includes(type)) {
204
+ onChange(selectedTypes.filter((t) => t !== type))
205
+ } else {
206
+ onChange([...selectedTypes, type])
207
+ }
208
+ }
209
+
210
+ return (
211
+ <div className="flex flex-wrap gap-1.5">
212
+ {ALL_TYPES.map((type) => {
213
+ const config = TRANSACTION_TYPE_CONFIG[type]
214
+ const isSelected = selectedTypes.length === 0 || selectedTypes.includes(type)
215
+ return (
216
+ <button
217
+ key={type}
218
+ type="button"
219
+ onClick={() => handleToggle(type)}
220
+ className={cn(
221
+ "inline-flex items-center gap-1 rounded-md px-2 py-1 text-xs font-medium border transition-colors",
222
+ isSelected
223
+ ? "bg-primary/10 border-primary/30 text-foreground"
224
+ : "bg-muted/50 border-transparent text-muted-foreground hover:bg-muted"
225
+ )}
226
+ >
227
+ <config.icon className="h-3 w-3" />
228
+ {config.label}
229
+ </button>
230
+ )
231
+ })}
232
+ </div>
233
+ )
234
+ }
235
+
236
+ interface PaginationProps {
237
+ currentPage: number
238
+ totalPages: number
239
+ totalItems: number
240
+ pageSize: number
241
+ onPageChange: (page: number) => void
242
+ }
243
+
244
+ function Pagination({ currentPage, totalPages, totalItems, pageSize, onPageChange }: PaginationProps) {
245
+ const startItem = (currentPage - 1) * pageSize + 1
246
+ const endItem = Math.min(currentPage * pageSize, totalItems)
247
+
248
+ return (
249
+ <div className="flex items-center justify-between px-2 py-3">
250
+ <p className="text-xs text-muted-foreground">
251
+ Showing {startItem}-{endItem} of {totalItems} transactions
252
+ </p>
253
+ <div className="flex items-center gap-1">
254
+ <Button
255
+ variant="outline"
256
+ size="icon"
257
+ className="h-7 w-7"
258
+ disabled={currentPage <= 1}
259
+ onClick={() => onPageChange(currentPage - 1)}
260
+ >
261
+ <ChevronLeft className="h-3.5 w-3.5" />
262
+ </Button>
263
+ {Array.from({ length: totalPages }, (_, i) => i + 1)
264
+ .filter((page) => {
265
+ if (totalPages <= 7) return true
266
+ if (page === 1 || page === totalPages) return true
267
+ if (Math.abs(page - currentPage) <= 1) return true
268
+ return false
269
+ })
270
+ .map((page, idx, arr) => {
271
+ const showEllipsisBefore = idx > 0 && page - arr[idx - 1] > 1
272
+
273
+ return (
274
+ <React.Fragment key={page}>
275
+ {showEllipsisBefore && (
276
+ <span className="px-1 text-xs text-muted-foreground">...</span>
277
+ )}
278
+ <Button
279
+ variant={page === currentPage ? "default" : "outline"}
280
+ size="icon"
281
+ className="h-7 w-7 text-xs"
282
+ onClick={() => onPageChange(page)}
283
+ >
284
+ {page}
285
+ </Button>
286
+ </React.Fragment>
287
+ )
288
+ })}
289
+ <Button
290
+ variant="outline"
291
+ size="icon"
292
+ className="h-7 w-7"
293
+ disabled={currentPage >= totalPages}
294
+ onClick={() => onPageChange(currentPage + 1)}
295
+ >
296
+ <ChevronRight className="h-3.5 w-3.5" />
297
+ </Button>
298
+ </div>
299
+ </div>
300
+ )
301
+ }
302
+
303
+ // ============================================================================
304
+ // Empty State
305
+ // ============================================================================
306
+
307
+ function EmptyState({ message }: { message: string }) {
308
+ return (
309
+ <div className="flex flex-col items-center justify-center py-12 text-center">
310
+ <div className="rounded-full bg-muted p-3 mb-3">
311
+ <Inbox className="h-6 w-6 text-muted-foreground" />
312
+ </div>
313
+ <p className="text-sm text-muted-foreground">{message}</p>
314
+ </div>
315
+ )
316
+ }
317
+
318
+ // ============================================================================
319
+ // Main Component
320
+ // ============================================================================
321
+
322
+ export function WakaCreditHistory({
323
+ transactions,
324
+ pageSize = 10,
325
+ filters: externalFilters,
326
+ onExport,
327
+ onRowClick,
328
+ showFilters = false,
329
+ showExport = false,
330
+ emptyMessage = "No transactions found",
331
+ className,
332
+ }: WakaCreditHistoryProps) {
333
+ // -- State --
334
+ const [sortField, setSortField] = React.useState<SortField>("date")
335
+ const [sortDirection, setSortDirection] = React.useState<SortDirection>("desc")
336
+ const [currentPage, setCurrentPage] = React.useState(1)
337
+ const [selectedTypes, setSelectedTypes] = React.useState<CreditTransactionType[]>(
338
+ externalFilters?.types ?? []
339
+ )
340
+ const [exportFormat, setExportFormat] = React.useState<"csv" | "pdf">("csv")
341
+ const [filtersVisible, setFiltersVisible] = React.useState(showFilters)
342
+
343
+ // Reset page when filters change
344
+ React.useEffect(() => {
345
+ setCurrentPage(1)
346
+ }, [selectedTypes, externalFilters])
347
+
348
+ // Sync external filters
349
+ React.useEffect(() => {
350
+ if (externalFilters?.types) {
351
+ setSelectedTypes(externalFilters.types)
352
+ }
353
+ }, [externalFilters?.types])
354
+
355
+ // -- Filtering --
356
+ const filteredTransactions = React.useMemo(() => {
357
+ let result = [...transactions]
358
+
359
+ // Filter by type
360
+ if (selectedTypes.length > 0) {
361
+ result = result.filter((t) => selectedTypes.includes(t.type))
362
+ }
363
+
364
+ // Filter by services (external only)
365
+ if (externalFilters?.services && externalFilters.services.length > 0) {
366
+ result = result.filter(
367
+ (t) => t.service && externalFilters.services!.includes(t.service)
368
+ )
369
+ }
370
+
371
+ // Filter by date range (external only)
372
+ if (externalFilters?.dateRange) {
373
+ const { from, to } = externalFilters.dateRange
374
+ result = result.filter((t) => {
375
+ const date = toDate(t.timestamp)
376
+ return date >= from && date <= to
377
+ })
378
+ }
379
+
380
+ return result
381
+ }, [transactions, selectedTypes, externalFilters])
382
+
383
+ // -- Sorting --
384
+ const sortedTransactions = React.useMemo(() => {
385
+ const sorted = [...filteredTransactions]
386
+
387
+ sorted.sort((a, b) => {
388
+ let comparison = 0
389
+
390
+ switch (sortField) {
391
+ case "date":
392
+ comparison = toDate(a.timestamp).getTime() - toDate(b.timestamp).getTime()
393
+ break
394
+ case "amount":
395
+ comparison = a.amount - b.amount
396
+ break
397
+ case "type":
398
+ comparison = a.type.localeCompare(b.type)
399
+ break
400
+ }
401
+
402
+ return sortDirection === "asc" ? comparison : -comparison
403
+ })
404
+
405
+ return sorted
406
+ }, [filteredTransactions, sortField, sortDirection])
407
+
408
+ // -- Pagination --
409
+ const totalPages = Math.max(1, Math.ceil(sortedTransactions.length / pageSize))
410
+ const safePage = Math.min(currentPage, totalPages)
411
+ const paginatedTransactions = sortedTransactions.slice(
412
+ (safePage - 1) * pageSize,
413
+ safePage * pageSize
414
+ )
415
+
416
+ // -- Handlers --
417
+ const handleSort = (field: SortField) => {
418
+ if (sortField === field) {
419
+ setSortDirection((d) => (d === "asc" ? "desc" : "asc"))
420
+ } else {
421
+ setSortField(field)
422
+ setSortDirection("desc")
423
+ }
424
+ setCurrentPage(1)
425
+ }
426
+
427
+ const handleExport = () => {
428
+ onExport?.(exportFormat, filteredTransactions)
429
+ }
430
+
431
+ const handleClearFilters = () => {
432
+ setSelectedTypes([])
433
+ setCurrentPage(1)
434
+ }
435
+
436
+ const hasActiveFilters = selectedTypes.length > 0
437
+
438
+ // -- Render --
439
+ return (
440
+ <div className={cn("rounded-lg border bg-card shadow-sm", className)}>
441
+ {/* Toolbar */}
442
+ <div className="flex items-center justify-between gap-3 border-b px-4 py-3">
443
+ <div className="flex items-center gap-2">
444
+ <h3 className="text-sm font-semibold">Transaction History</h3>
445
+ <Badge variant="secondary" className="text-xs">
446
+ {filteredTransactions.length}
447
+ </Badge>
448
+ </div>
449
+
450
+ <div className="flex items-center gap-2">
451
+ {showFilters && (
452
+ <Button
453
+ variant={filtersVisible ? "default" : "outline"}
454
+ size="sm"
455
+ onClick={() => setFiltersVisible((v) => !v)}
456
+ className="h-8"
457
+ >
458
+ <Filter className="h-3.5 w-3.5" />
459
+ Filters
460
+ {hasActiveFilters && (
461
+ <span className="ml-1 rounded-full bg-primary-foreground/20 px-1.5 text-[10px]">
462
+ {selectedTypes.length}
463
+ </span>
464
+ )}
465
+ </Button>
466
+ )}
467
+
468
+ {showExport && onExport && (
469
+ <div className="flex items-center gap-1">
470
+ <Select value={exportFormat} onValueChange={(v: string) => setExportFormat(v as "csv" | "pdf")}>
471
+ <SelectTrigger className="h-8 w-[80px] text-xs">
472
+ <SelectValue />
473
+ </SelectTrigger>
474
+ <SelectContent>
475
+ <SelectItem value="csv">CSV</SelectItem>
476
+ <SelectItem value="pdf">PDF</SelectItem>
477
+ </SelectContent>
478
+ </Select>
479
+ <Button variant="outline" size="sm" onClick={handleExport} className="h-8">
480
+ <Download className="h-3.5 w-3.5" />
481
+ Export
482
+ </Button>
483
+ </div>
484
+ )}
485
+ </div>
486
+ </div>
487
+
488
+ {/* Filter Bar */}
489
+ {filtersVisible && (
490
+ <div className="border-b px-4 py-3 bg-muted/30">
491
+ <div className="flex items-center justify-between gap-3">
492
+ <div className="flex-1">
493
+ <p className="text-xs font-medium text-muted-foreground mb-2">Filter by type</p>
494
+ <TypeFilter selectedTypes={selectedTypes} onChange={setSelectedTypes} />
495
+ </div>
496
+ {hasActiveFilters && (
497
+ <Button
498
+ variant="ghost"
499
+ size="sm"
500
+ onClick={handleClearFilters}
501
+ className="h-7 text-xs text-muted-foreground"
502
+ >
503
+ <X className="h-3 w-3" />
504
+ Clear
505
+ </Button>
506
+ )}
507
+ </div>
508
+ </div>
509
+ )}
510
+
511
+ {/* Table */}
512
+ {sortedTransactions.length === 0 ? (
513
+ <EmptyState message={hasActiveFilters ? "No transactions match the selected filters" : emptyMessage} />
514
+ ) : (
515
+ <>
516
+ <div className="overflow-x-auto">
517
+ <table className="w-full">
518
+ <thead>
519
+ <tr className="border-b bg-muted/30">
520
+ <th className="px-4 py-3 text-left">
521
+ <SortHeader
522
+ label="Type"
523
+ field="type"
524
+ currentSort={sortField}
525
+ currentDirection={sortDirection}
526
+ onSort={handleSort}
527
+ />
528
+ </th>
529
+ <th className="px-4 py-3 text-left">
530
+ <span className="text-xs font-medium uppercase tracking-wider text-muted-foreground">
531
+ Description
532
+ </span>
533
+ </th>
534
+ <th className="px-4 py-3 text-left">
535
+ <span className="text-xs font-medium uppercase tracking-wider text-muted-foreground">
536
+ Service
537
+ </span>
538
+ </th>
539
+ <th className="px-4 py-3 text-right">
540
+ <SortHeader
541
+ label="Amount"
542
+ field="amount"
543
+ currentSort={sortField}
544
+ currentDirection={sortDirection}
545
+ onSort={handleSort}
546
+ />
547
+ </th>
548
+ <th className="px-4 py-3 text-left">
549
+ <SortHeader
550
+ label="Date"
551
+ field="date"
552
+ currentSort={sortField}
553
+ currentDirection={sortDirection}
554
+ onSort={handleSort}
555
+ />
556
+ </th>
557
+ <th className="px-4 py-3 text-left">
558
+ <span className="text-xs font-medium uppercase tracking-wider text-muted-foreground">
559
+ Status
560
+ </span>
561
+ </th>
562
+ </tr>
563
+ </thead>
564
+ <tbody className="divide-y">
565
+ {paginatedTransactions.map((transaction) => {
566
+ const typeConfig = TRANSACTION_TYPE_CONFIG[transaction.type]
567
+ const statusConfig = STATUS_BADGE_VARIANT[transaction.status]
568
+ const TypeIcon = typeConfig.icon
569
+
570
+ return (
571
+ <tr
572
+ key={transaction.id}
573
+ className={cn(
574
+ "transition-colors hover:bg-muted/50",
575
+ onRowClick && "cursor-pointer"
576
+ )}
577
+ onClick={() => onRowClick?.(transaction)}
578
+ >
579
+ {/* Type */}
580
+ <td className="px-4 py-3">
581
+ <div className="flex items-center gap-2">
582
+ <TypeIcon className={cn("h-4 w-4 flex-shrink-0", typeConfig.colorClass)} />
583
+ <span className="text-sm font-medium">{typeConfig.label}</span>
584
+ </div>
585
+ </td>
586
+
587
+ {/* Description */}
588
+ <td className="px-4 py-3">
589
+ <span className="text-sm text-foreground truncate block max-w-[200px]">
590
+ {transaction.description}
591
+ </span>
592
+ </td>
593
+
594
+ {/* Service */}
595
+ <td className="px-4 py-3">
596
+ <span className="text-sm text-muted-foreground">
597
+ {transaction.service || "\u2014"}
598
+ </span>
599
+ </td>
600
+
601
+ {/* Amount */}
602
+ <td className="px-4 py-3 text-right">
603
+ <span
604
+ className={cn(
605
+ "text-sm font-semibold tabular-nums",
606
+ getAmountColorClass(transaction.type)
607
+ )}
608
+ >
609
+ {formatAmount(transaction.amount, transaction.type)}
610
+ </span>
611
+ </td>
612
+
613
+ {/* Date */}
614
+ <td className="px-4 py-3">
615
+ <span className="text-sm text-muted-foreground whitespace-nowrap">
616
+ {formatDate(transaction.timestamp)}
617
+ </span>
618
+ </td>
619
+
620
+ {/* Status */}
621
+ <td className="px-4 py-3">
622
+ <Badge
623
+ variant={statusConfig.variant}
624
+ className={cn("text-[11px] capitalize", statusConfig.className)}
625
+ >
626
+ {transaction.status}
627
+ </Badge>
628
+ </td>
629
+ </tr>
630
+ )
631
+ })}
632
+ </tbody>
633
+ </table>
634
+ </div>
635
+
636
+ {/* Pagination */}
637
+ {totalPages > 1 && (
638
+ <div className="border-t">
639
+ <Pagination
640
+ currentPage={safePage}
641
+ totalPages={totalPages}
642
+ totalItems={sortedTransactions.length}
643
+ pageSize={pageSize}
644
+ onPageChange={setCurrentPage}
645
+ />
646
+ </div>
647
+ )}
648
+ </>
649
+ )}
650
+ </div>
651
+ )
652
+ }
653
+
654
+ export default WakaCreditHistory