@m5kdev/web-ui 0.1.3 → 0.1.5

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 (375) hide show
  1. package/dist/src/animations/card.motion.d.ts +2 -0
  2. package/dist/src/animations/card.motion.js +7 -0
  3. package/dist/src/components/AvatarUpload.d.ts +7 -0
  4. package/dist/src/components/AvatarUpload.js +67 -0
  5. package/dist/src/components/Button.d.ts +5 -0
  6. package/dist/src/components/Button.js +5 -0
  7. package/dist/src/components/Calendar.d.ts +35 -0
  8. package/dist/src/components/Calendar.js +10 -0
  9. package/dist/src/components/CardsSelect.d.ts +23 -0
  10. package/dist/src/components/CardsSelect.js +46 -0
  11. package/dist/src/components/CollapsibleSidebarMenuItem.d.ts +9 -0
  12. package/dist/src/components/CollapsibleSidebarMenuItem.js +11 -0
  13. package/dist/src/components/ColorPicker.d.ts +4 -0
  14. package/dist/src/components/ColorPicker.js +21 -0
  15. package/dist/src/components/CopyButton.d.ts +6 -0
  16. package/dist/src/components/CopyButton.js +24 -0
  17. package/dist/src/components/CropDialog.d.ts +10 -0
  18. package/dist/src/components/CropDialog.js +67 -0
  19. package/dist/src/components/DialogProvider.d.ts +15 -0
  20. package/dist/src/components/DialogProvider.js +50 -0
  21. package/dist/src/components/ErrorFallback.d.ts +4 -0
  22. package/dist/src/components/ErrorFallback.js +5 -0
  23. package/dist/src/components/FileDropzone.d.ts +6 -0
  24. package/dist/src/components/FileDropzone.js +63 -0
  25. package/dist/src/components/MultiSelectDropdown.d.ts +26 -0
  26. package/dist/src/components/MultiSelectDropdown.js +53 -0
  27. package/dist/src/components/Orb.d.ts +6 -0
  28. package/{src/components/Orb.tsx → dist/src/components/Orb.js} +107 -136
  29. package/dist/src/components/PageAlert.d.ts +18 -0
  30. package/dist/src/components/PageAlert.js +48 -0
  31. package/dist/src/components/SelectChips.d.ts +10 -0
  32. package/dist/src/components/SelectChips.js +11 -0
  33. package/dist/src/components/SidebarItem.d.ts +7 -0
  34. package/dist/src/components/SidebarItem.js +6 -0
  35. package/dist/src/components/Steps.d.ts +19 -0
  36. package/dist/src/components/Steps.js +34 -0
  37. package/dist/src/components/TablerIconPicker.d.ts +2 -0
  38. package/dist/src/components/TablerIconPicker.js +4238 -0
  39. package/dist/src/components/app-header.d.ts +6 -0
  40. package/dist/src/components/app-header.js +8 -0
  41. package/dist/src/components/blur-card.d.ts +13 -0
  42. package/dist/src/components/blur-card.js +34 -0
  43. package/dist/src/components/features-section-demo-1.d.ts +6 -0
  44. package/dist/src/components/features-section-demo-1.js +53 -0
  45. package/dist/src/components/features-section-demo-2.d.ts +1 -0
  46. package/dist/src/components/features-section-demo-2.js +51 -0
  47. package/dist/src/components/features-section-demo-3.d.ts +8 -0
  48. package/dist/src/components/features-section-demo-3.js +116 -0
  49. package/dist/src/components/mode-toggle.d.ts +1 -0
  50. package/dist/src/components/mode-toggle.js +9 -0
  51. package/dist/src/components/nav-main.d.ts +13 -0
  52. package/dist/src/components/nav-main.js +9 -0
  53. package/dist/src/components/pricing-cards.d.ts +1 -0
  54. package/dist/src/components/pricing-cards.js +27 -0
  55. package/dist/src/components/shared/ButtonCopy.d.ts +6 -0
  56. package/dist/src/components/shared/ButtonCopy.js +24 -0
  57. package/dist/src/components/team-switcher.d.ts +8 -0
  58. package/dist/src/components/team-switcher.js +10 -0
  59. package/dist/src/components/theme-provider.d.ts +13 -0
  60. package/dist/src/components/theme-provider.js +41 -0
  61. package/dist/src/components/typewriter.d.ts +18 -0
  62. package/dist/src/components/typewriter.js +38 -0
  63. package/dist/src/components/ui/alert-dialog.d.ts +14 -0
  64. package/dist/src/components/ui/alert-dialog.js +38 -0
  65. package/dist/src/components/ui/alert.d.ts +9 -0
  66. package/dist/src/components/ui/alert.js +24 -0
  67. package/dist/src/components/ui/avatar.d.ts +6 -0
  68. package/dist/src/components/ui/avatar.js +12 -0
  69. package/dist/src/components/ui/badge.d.ts +9 -0
  70. package/dist/src/components/ui/badge.js +20 -0
  71. package/dist/src/components/ui/bento-grid.d.ts +11 -0
  72. package/dist/src/components/ui/bento-grid.js +8 -0
  73. package/dist/src/components/ui/bento-grid2.d.ts +15 -0
  74. package/dist/src/components/ui/bento-grid2.js +13 -0
  75. package/dist/src/components/ui/breadcrumb.d.ts +19 -0
  76. package/dist/src/components/ui/breadcrumb.js +23 -0
  77. package/dist/src/components/ui/button.d.ts +11 -0
  78. package/dist/src/components/ui/button.js +33 -0
  79. package/dist/src/components/ui/card.d.ts +8 -0
  80. package/dist/src/components/ui/card.js +16 -0
  81. package/dist/src/components/ui/checkbox.d.ts +4 -0
  82. package/dist/src/components/ui/checkbox.js +8 -0
  83. package/dist/src/components/ui/collapsible.d.ts +5 -0
  84. package/{src/components/ui/collapsible.tsx → dist/src/components/ui/collapsible.js} +5 -9
  85. package/dist/src/components/ui/dialog.d.ts +13 -0
  86. package/dist/src/components/ui/dialog.js +35 -0
  87. package/dist/src/components/ui/dropdown-menu.d.ts +27 -0
  88. package/dist/src/components/ui/dropdown-menu.js +32 -0
  89. package/dist/src/components/ui/floating-navbar.d.ts +9 -0
  90. package/dist/src/components/ui/floating-navbar.js +38 -0
  91. package/dist/src/components/ui/form.d.ts +23 -0
  92. package/dist/src/components/ui/form.js +60 -0
  93. package/dist/src/components/ui/image.d.ts +6 -0
  94. package/dist/src/components/ui/image.js +15 -0
  95. package/dist/src/components/ui/input.d.ts +3 -0
  96. package/dist/src/components/ui/input.js +8 -0
  97. package/dist/src/components/ui/label.d.ts +5 -0
  98. package/dist/src/components/ui/label.js +9 -0
  99. package/dist/src/components/ui/pagination.d.ts +13 -0
  100. package/dist/src/components/ui/pagination.js +29 -0
  101. package/dist/src/components/ui/progress.d.ts +4 -0
  102. package/dist/src/components/ui/progress.js +7 -0
  103. package/dist/src/components/ui/resizable-navbar.d.ts +56 -0
  104. package/dist/src/components/ui/resizable-navbar.js +86 -0
  105. package/dist/src/components/ui/segment-control.d.ts +9 -0
  106. package/dist/src/components/ui/segment-control.js +42 -0
  107. package/dist/src/components/ui/select.d.ts +13 -0
  108. package/dist/src/components/ui/select.js +26 -0
  109. package/dist/src/components/ui/separator.d.ts +4 -0
  110. package/dist/src/components/ui/separator.js +7 -0
  111. package/dist/src/components/ui/sheet.d.ts +25 -0
  112. package/dist/src/components/ui/sheet.js +37 -0
  113. package/dist/src/components/ui/sidebar.d.ts +66 -0
  114. package/dist/src/components/ui/sidebar.js +222 -0
  115. package/dist/src/components/ui/skeleton.d.ts +2 -0
  116. package/dist/src/components/ui/skeleton.js +6 -0
  117. package/dist/src/components/ui/slider.d.ts +4 -0
  118. package/dist/src/components/ui/slider.js +7 -0
  119. package/dist/src/components/ui/sonner.d.ts +4 -0
  120. package/dist/src/components/ui/sonner.js +15 -0
  121. package/dist/src/components/ui/spinner.d.ts +14 -0
  122. package/dist/src/components/ui/spinner.js +30 -0
  123. package/dist/src/components/ui/switch.d.ts +4 -0
  124. package/dist/src/components/ui/switch.js +7 -0
  125. package/dist/src/components/ui/table.d.ts +10 -0
  126. package/dist/src/components/ui/table.js +27 -0
  127. package/dist/src/components/ui/tabs.d.ts +7 -0
  128. package/dist/src/components/ui/tabs.js +16 -0
  129. package/dist/src/components/ui/textarea.d.ts +3 -0
  130. package/dist/src/components/ui/textarea.js +6 -0
  131. package/dist/src/components/ui/timeline.d.ts +11 -0
  132. package/dist/src/components/ui/timeline.js +27 -0
  133. package/dist/src/components/ui/toast.d.ts +15 -0
  134. package/dist/src/components/ui/toast.js +33 -0
  135. package/dist/src/components/ui/tooltip.d.ts +7 -0
  136. package/dist/src/components/ui/tooltip.js +16 -0
  137. package/dist/src/components/ui/typewriter-effect.d.ts +16 -0
  138. package/dist/src/components/ui/typewriter-effect.js +76 -0
  139. package/dist/src/hooks/use-mobile.d.ts +1 -0
  140. package/dist/src/hooks/use-mobile.js +15 -0
  141. package/dist/src/hooks/useDialog.d.ts +4 -0
  142. package/dist/src/hooks/useDialog.js +22 -0
  143. package/dist/src/icons/GoogleIcon.d.ts +5 -0
  144. package/dist/src/icons/GoogleIcon.js +4 -0
  145. package/dist/src/icons/LinkedInIcon.d.ts +5 -0
  146. package/dist/src/icons/LinkedInIcon.js +4 -0
  147. package/dist/src/icons/MicrosoftIcon.d.ts +5 -0
  148. package/dist/src/icons/MicrosoftIcon.js +4 -0
  149. package/dist/src/lib/chatwoot.d.ts +11 -0
  150. package/dist/src/lib/chatwoot.js +28 -0
  151. package/dist/src/lib/utils.d.ts +2 -0
  152. package/dist/src/lib/utils.js +5 -0
  153. package/dist/src/modules/app/components/AppLoader.d.ts +2 -0
  154. package/dist/src/modules/app/components/AppLoader.js +5 -0
  155. package/dist/src/modules/app/components/AppShell.d.ts +7 -0
  156. package/dist/src/modules/app/components/AppShell.js +7 -0
  157. package/dist/src/modules/app/components/AppSidebar.d.ts +7 -0
  158. package/dist/src/modules/app/components/AppSidebar.js +5 -0
  159. package/dist/src/modules/app/components/AppSidebarContent.d.ts +16 -0
  160. package/dist/src/modules/app/components/AppSidebarContent.js +7 -0
  161. package/dist/src/modules/app/components/AppSidebarHeader.d.ts +8 -0
  162. package/dist/src/modules/app/components/AppSidebarHeader.js +10 -0
  163. package/dist/src/modules/app/components/AppSidebarInvites.d.ts +3 -0
  164. package/dist/src/modules/app/components/AppSidebarInvites.js +12 -0
  165. package/dist/src/modules/app/components/AppSidebarUser.d.ts +11 -0
  166. package/dist/src/modules/app/components/AppSidebarUser.js +16 -0
  167. package/dist/src/modules/auth/components/AdminUserManagement.d.ts +6 -0
  168. package/dist/src/modules/auth/components/AdminUserManagement.js +422 -0
  169. package/dist/src/modules/auth/components/AdminWaitlist.d.ts +6 -0
  170. package/dist/src/modules/auth/components/AdminWaitlist.js +118 -0
  171. package/dist/src/modules/auth/components/AuthLayout.d.ts +4 -0
  172. package/dist/src/modules/auth/components/AuthLayout.js +5 -0
  173. package/dist/src/modules/auth/components/AuthProviders.d.ts +6 -0
  174. package/dist/src/modules/auth/components/AuthProviders.js +45 -0
  175. package/dist/src/modules/auth/components/AuthRouter.d.ts +9 -0
  176. package/dist/src/modules/auth/components/AuthRouter.js +12 -0
  177. package/dist/src/modules/auth/components/ClaimAccountRoute.d.ts +4 -0
  178. package/dist/src/modules/auth/components/ClaimAccountRoute.js +143 -0
  179. package/dist/src/modules/auth/components/ErrorAuthRoute.d.ts +1 -0
  180. package/dist/src/modules/auth/components/ErrorAuthRoute.js +93 -0
  181. package/dist/src/modules/auth/components/ForgotPasswordForm.d.ts +1 -0
  182. package/dist/src/modules/auth/components/ForgotPasswordForm.js +27 -0
  183. package/dist/src/modules/auth/components/ForgotPasswordRoute.d.ts +1 -0
  184. package/dist/src/modules/auth/components/ForgotPasswordRoute.js +9 -0
  185. package/dist/src/modules/auth/components/InviteFriends.d.ts +5 -0
  186. package/dist/src/modules/auth/components/InviteFriends.js +74 -0
  187. package/dist/src/modules/auth/components/LastUsedBadge.d.ts +5 -0
  188. package/dist/src/modules/auth/components/LastUsedBadge.js +9 -0
  189. package/dist/src/modules/auth/components/LoginForm.d.ts +3 -0
  190. package/dist/src/modules/auth/components/LoginForm.js +44 -0
  191. package/dist/src/modules/auth/components/LoginRoute.d.ts +3 -0
  192. package/dist/src/modules/auth/components/LoginRoute.js +11 -0
  193. package/dist/src/modules/auth/components/LogoutRoute.d.ts +1 -0
  194. package/dist/src/modules/auth/components/LogoutRoute.js +15 -0
  195. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.d.ts +9 -0
  196. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js +102 -0
  197. package/dist/src/modules/auth/components/OrganizationMembersRoute.d.ts +51 -0
  198. package/dist/src/modules/auth/components/OrganizationMembersRoute.js +359 -0
  199. package/dist/src/modules/auth/components/OrganizationSettingsRoute.d.ts +20 -0
  200. package/dist/src/modules/auth/components/OrganizationSettingsRoute.js +153 -0
  201. package/dist/src/modules/auth/components/OrganizationSwitcher.d.ts +7 -0
  202. package/dist/src/modules/auth/components/OrganizationSwitcher.js +74 -0
  203. package/dist/src/modules/auth/components/ProfileRoute.d.ts +1 -0
  204. package/dist/src/modules/auth/components/ProfileRoute.js +42 -0
  205. package/dist/src/modules/auth/components/RangeNuqsDatePicker.d.ts +31 -0
  206. package/dist/src/modules/auth/components/RangeNuqsDatePicker.js +236 -0
  207. package/dist/src/modules/auth/components/ResetPasswordForm.d.ts +1 -0
  208. package/dist/src/modules/auth/components/ResetPasswordForm.js +39 -0
  209. package/dist/src/modules/auth/components/ResetPasswordRoute.d.ts +1 -0
  210. package/dist/src/modules/auth/components/ResetPasswordRoute.js +9 -0
  211. package/dist/src/modules/auth/components/SignupFormRoute.d.ts +5 -0
  212. package/dist/src/modules/auth/components/SignupFormRoute.js +106 -0
  213. package/dist/src/modules/auth/components/SignupRoute.d.ts +7 -0
  214. package/dist/src/modules/auth/components/SignupRoute.js +16 -0
  215. package/dist/src/modules/auth/components/UserPreferences.d.ts +30 -0
  216. package/dist/src/modules/auth/components/UserPreferences.js +60 -0
  217. package/dist/src/modules/auth/components/WaitlistCard.d.ts +6 -0
  218. package/dist/src/modules/auth/components/WaitlistCard.js +32 -0
  219. package/dist/src/modules/auth/components/WaitlistCodeValidation.d.ts +7 -0
  220. package/dist/src/modules/auth/components/WaitlistCodeValidation.js +43 -0
  221. package/dist/src/modules/billing/components/BillingBetaPage.d.ts +8 -0
  222. package/dist/src/modules/billing/components/BillingBetaPage.js +11 -0
  223. package/dist/src/modules/billing/components/BillingInvoicePage.d.ts +7 -0
  224. package/dist/src/modules/billing/components/BillingInvoicePage.js +32 -0
  225. package/dist/src/modules/billing/components/BillingPlanSelect.d.ts +6 -0
  226. package/dist/src/modules/billing/components/BillingPlanSelect.js +8 -0
  227. package/dist/src/modules/billing/components/BillingRouter.d.ts +9 -0
  228. package/dist/src/modules/billing/components/BillingRouter.js +8 -0
  229. package/dist/src/modules/billing/components/BillingSinglePlanSelect.d.ts +8 -0
  230. package/dist/src/modules/billing/components/BillingSinglePlanSelect.js +46 -0
  231. package/dist/src/modules/table/components/ColumnOrderAndVisibility.d.ts +10 -0
  232. package/dist/src/modules/table/components/ColumnOrderAndVisibility.js +42 -0
  233. package/dist/src/modules/table/components/NuqsTable.d.ts +23 -0
  234. package/dist/src/modules/table/components/NuqsTable.js +198 -0
  235. package/dist/src/modules/table/components/TableFiltering.d.ts +23 -0
  236. package/dist/src/modules/table/components/TableFiltering.js +236 -0
  237. package/dist/src/modules/table/components/TablePagination.d.ts +9 -0
  238. package/dist/src/modules/table/components/TablePagination.js +21 -0
  239. package/{src/modules/table/components/table.types.ts → dist/src/modules/table/components/table.types.d.ts} +12 -11
  240. package/dist/src/modules/table/components/table.types.js +1 -0
  241. package/dist/src/modules/table/filterTransformers.d.ts +53 -0
  242. package/dist/src/modules/table/filterTransformers.js +276 -0
  243. package/{src/types.ts → dist/src/types.d.ts} +3 -4
  244. package/dist/src/types.js +1 -0
  245. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  246. package/package.json +8 -5
  247. package/.cursor/rules/web-ui.mdc +0 -126
  248. package/.turbo/turbo-build.log +0 -5
  249. package/.turbo/turbo-check-types.log +0 -5
  250. package/.turbo/turbo-lint$colon$fix.log +0 -381
  251. package/.turbo/turbo-lint.log +0 -361
  252. package/CHANGELOG.md +0 -19
  253. package/components.json +0 -21
  254. package/src/animations/card.motion.ts +0 -9
  255. package/src/components/AvatarUpload.tsx +0 -133
  256. package/src/components/Button.tsx +0 -14
  257. package/src/components/Calendar.css +0 -684
  258. package/src/components/Calendar.tsx +0 -32
  259. package/src/components/CardsSelect.tsx +0 -155
  260. package/src/components/CollapsibleSidebarMenuItem.tsx +0 -57
  261. package/src/components/ColorPicker.tsx +0 -56
  262. package/src/components/CopyButton.tsx +0 -45
  263. package/src/components/CropDialog.tsx +0 -154
  264. package/src/components/DialogProvider.tsx +0 -105
  265. package/src/components/ErrorFallback.tsx +0 -17
  266. package/src/components/FileDropzone.tsx +0 -120
  267. package/src/components/MultiSelectDropdown.tsx +0 -233
  268. package/src/components/PageAlert.tsx +0 -121
  269. package/src/components/SelectChips.tsx +0 -40
  270. package/src/components/SidebarItem.tsx +0 -26
  271. package/src/components/Steps.tsx +0 -340
  272. package/src/components/TablerIconPicker.tsx +0 -4260
  273. package/src/components/app-header.tsx +0 -40
  274. package/src/components/blur-card.tsx +0 -132
  275. package/src/components/features-section-demo-1.tsx +0 -127
  276. package/src/components/features-section-demo-2.tsx +0 -102
  277. package/src/components/features-section-demo-3.tsx +0 -272
  278. package/src/components/mode-toggle.tsx +0 -31
  279. package/src/components/nav-main.tsx +0 -69
  280. package/src/components/pricing-cards.tsx +0 -133
  281. package/src/components/shared/ButtonCopy.tsx +0 -50
  282. package/src/components/team-switcher.tsx +0 -83
  283. package/src/components/theme-provider.tsx +0 -74
  284. package/src/components/typewriter.tsx +0 -90
  285. package/src/components/ui/alert-dialog.tsx +0 -133
  286. package/src/components/ui/alert.tsx +0 -60
  287. package/src/components/ui/avatar.tsx +0 -47
  288. package/src/components/ui/badge.tsx +0 -33
  289. package/src/components/ui/bento-grid.tsx +0 -54
  290. package/src/components/ui/bento-grid2.tsx +0 -66
  291. package/src/components/ui/breadcrumb.tsx +0 -101
  292. package/src/components/ui/button.tsx +0 -50
  293. package/src/components/ui/card.tsx +0 -55
  294. package/src/components/ui/checkbox.tsx +0 -26
  295. package/src/components/ui/dialog.tsx +0 -119
  296. package/src/components/ui/dropdown-menu.tsx +0 -186
  297. package/src/components/ui/floating-navbar.tsx +0 -78
  298. package/src/components/ui/form.tsx +0 -167
  299. package/src/components/ui/image.tsx +0 -55
  300. package/src/components/ui/input.tsx +0 -22
  301. package/src/components/ui/label.tsx +0 -19
  302. package/src/components/ui/pagination.tsx +0 -105
  303. package/src/components/ui/progress.tsx +0 -23
  304. package/src/components/ui/resizable-navbar.tsx +0 -260
  305. package/src/components/ui/segment-control.tsx +0 -143
  306. package/src/components/ui/select.tsx +0 -153
  307. package/src/components/ui/separator.tsx +0 -24
  308. package/src/components/ui/sheet.tsx +0 -121
  309. package/src/components/ui/sidebar.tsx +0 -736
  310. package/src/components/ui/skeleton.tsx +0 -7
  311. package/src/components/ui/slider.tsx +0 -23
  312. package/src/components/ui/sonner.tsx +0 -27
  313. package/src/components/ui/spinner.tsx +0 -45
  314. package/src/components/ui/switch.tsx +0 -27
  315. package/src/components/ui/table.tsx +0 -90
  316. package/src/components/ui/tabs.tsx +0 -52
  317. package/src/components/ui/textarea.tsx +0 -18
  318. package/src/components/ui/timeline.tsx +0 -95
  319. package/src/components/ui/toast.tsx +0 -126
  320. package/src/components/ui/tooltip.tsx +0 -55
  321. package/src/components/ui/typewriter-effect.tsx +0 -181
  322. package/src/hooks/use-mobile.ts +0 -19
  323. package/src/hooks/useDialog.ts +0 -25
  324. package/src/icons/GoogleIcon.tsx +0 -32
  325. package/src/icons/LinkedInIcon.tsx +0 -30
  326. package/src/icons/MicrosoftIcon.tsx +0 -21
  327. package/src/lib/chatwoot.ts +0 -51
  328. package/src/lib/utils.ts +0 -6
  329. package/src/modules/app/components/AppLoader.tsx +0 -9
  330. package/src/modules/app/components/AppShell.tsx +0 -21
  331. package/src/modules/app/components/AppSidebar.tsx +0 -26
  332. package/src/modules/app/components/AppSidebarContent.tsx +0 -73
  333. package/src/modules/app/components/AppSidebarHeader.tsx +0 -57
  334. package/src/modules/app/components/AppSidebarInvites.tsx +0 -32
  335. package/src/modules/app/components/AppSidebarUser.tsx +0 -128
  336. package/src/modules/auth/components/AdminUserManagement.tsx +0 -1136
  337. package/src/modules/auth/components/AdminWaitlist.tsx +0 -358
  338. package/src/modules/auth/components/AuthLayout.tsx +0 -13
  339. package/src/modules/auth/components/AuthProviders.tsx +0 -105
  340. package/src/modules/auth/components/AuthRouter.tsx +0 -29
  341. package/src/modules/auth/components/ClaimAccountRoute.tsx +0 -242
  342. package/src/modules/auth/components/ErrorAuthRoute.tsx +0 -121
  343. package/src/modules/auth/components/ForgotPasswordForm.tsx +0 -58
  344. package/src/modules/auth/components/ForgotPasswordRoute.tsx +0 -27
  345. package/src/modules/auth/components/InviteFriends.tsx +0 -273
  346. package/src/modules/auth/components/LastUsedBadge.tsx +0 -22
  347. package/src/modules/auth/components/LoginForm.tsx +0 -104
  348. package/src/modules/auth/components/LoginRoute.tsx +0 -31
  349. package/src/modules/auth/components/LogoutRoute.tsx +0 -21
  350. package/src/modules/auth/components/OrganizationAcceptInvitationRoute.tsx +0 -161
  351. package/src/modules/auth/components/OrganizationMembersRoute.tsx +0 -730
  352. package/src/modules/auth/components/OrganizationSettingsRoute.tsx +0 -280
  353. package/src/modules/auth/components/OrganizationSwitcher.tsx +0 -148
  354. package/src/modules/auth/components/ProfileRoute.tsx +0 -104
  355. package/src/modules/auth/components/RangeNuqsDatePicker.tsx +0 -365
  356. package/src/modules/auth/components/ResetPasswordForm.tsx +0 -103
  357. package/src/modules/auth/components/ResetPasswordRoute.tsx +0 -27
  358. package/src/modules/auth/components/SignupFormRoute.tsx +0 -189
  359. package/src/modules/auth/components/SignupRoute.tsx +0 -53
  360. package/src/modules/auth/components/UserPreferences.tsx +0 -144
  361. package/src/modules/auth/components/WaitlistCard.tsx +0 -78
  362. package/src/modules/auth/components/WaitlistCodeValidation.tsx +0 -79
  363. package/src/modules/billing/components/BillingBetaPage.tsx +0 -124
  364. package/src/modules/billing/components/BillingInvoicePage.tsx +0 -180
  365. package/src/modules/billing/components/BillingPlanSelect.tsx +0 -14
  366. package/src/modules/billing/components/BillingRouter.tsx +0 -20
  367. package/src/modules/billing/components/BillingSinglePlanSelect.tsx +0 -172
  368. package/src/modules/table/components/ColumnOrderAndVisibility.tsx +0 -127
  369. package/src/modules/table/components/NuqsTable.tsx +0 -396
  370. package/src/modules/table/components/TableFiltering.tsx +0 -520
  371. package/src/modules/table/components/TablePagination.tsx +0 -59
  372. package/src/modules/table/filterTransformers.ts +0 -323
  373. package/src/vite-env.d.ts +0 -1
  374. package/translations/en/web-ui.json +0 -192
  375. package/tsconfig.json +0 -30
@@ -1,53 +0,0 @@
1
- import { Card, CardBody, CardHeader } from "@heroui/react";
2
- import { useQueryState } from "nuqs";
3
- import { useTranslation } from "react-i18next";
4
- import { Link } from "react-router";
5
- import { SignupForm } from "#modules/auth/components/SignupFormRoute";
6
- import type { UseBackendTRPC } from "#types";
7
- import { AuthProviders } from "./AuthProviders";
8
- import { WaitlistCard } from "./WaitlistCard";
9
- import { WaitlistCodeValidation } from "./WaitlistCodeValidation";
10
-
11
- interface SignupRouteProps {
12
- providers?: string[];
13
- useTRPC?: UseBackendTRPC;
14
- }
15
-
16
- export function SignupRoute({ providers, useTRPC }: SignupRouteProps) {
17
- const { t } = useTranslation();
18
-
19
- const [code] = useQueryState("code");
20
- const [email] = useQueryState("email");
21
-
22
- const hasWaitlist = !!useTRPC;
23
-
24
- return (
25
- <div className="flex flex-col gap-6">
26
- {hasWaitlist && !code ? (
27
- <WaitlistCard useTRPC={useTRPC} />
28
- ) : (
29
- <Card>
30
- <CardHeader className="text-center flex flex-col gap-1">
31
- <p className="text-xl font-semibold">{t("web-ui:auth.signup.createAccount")}</p>
32
- <p className="text-sm text-default-600">{t("web-ui:auth.signup.description")}</p>
33
- </CardHeader>
34
- <CardBody>
35
- <div className="grid gap-6">
36
- {hasWaitlist && code && useTRPC && (
37
- <WaitlistCodeValidation code={code} useTRPC={useTRPC} />
38
- )}
39
- <AuthProviders providers={providers} code={code} requestSignUp />
40
- <SignupForm code={code} email={email} waitlist={hasWaitlist} />
41
- </div>
42
- </CardBody>
43
- </Card>
44
- )}
45
- <div className="text-center text-xs text-muted-foreground">
46
- {t("web-ui:auth.signup.alreadyHaveAccount")}{" "}
47
- <Link to="/login" className="underline underline-offset-4 hover:text-primary">
48
- {t("web-ui:auth.login.button")}
49
- </Link>
50
- </div>
51
- </div>
52
- );
53
- }
@@ -1,144 +0,0 @@
1
- import { Button, Form, Input, Select, SelectItem, Switch } from "@heroui/react";
2
- import type { FormEvent, ReactElement } from "react";
3
- import { useTranslation } from "react-i18next";
4
- import { toast } from "sonner";
5
- import type { z } from "zod";
6
-
7
- type UpdatePreferencesOptions = {
8
- noOptimisticUpdate?: boolean;
9
- onSuccess?: () => void;
10
- onError?: (error: unknown) => void;
11
- };
12
-
13
- interface ControlDefinition {
14
- label: string;
15
- element: "switch" | "select" | "number";
16
- options?: { label: string; value: string }[];
17
- min?: number;
18
- max?: number;
19
- step?: number;
20
- }
21
-
22
- type ControlsFor<Preferences> = {
23
- [K in keyof Preferences]: ControlDefinition;
24
- };
25
-
26
- export function UserPreferences<S extends z.ZodObject<z.ZodRawShape>>({
27
- schema,
28
- controls,
29
- preferences,
30
- isLoading,
31
- isPending,
32
- updatePreferences,
33
- }: {
34
- schema: S;
35
- controls: ControlsFor<z.infer<S>>;
36
- preferences: z.infer<S>;
37
- isLoading: boolean;
38
- isPending: boolean;
39
- updatePreferences: (
40
- partialPreferences: Partial<z.infer<S>>,
41
- options: UpdatePreferencesOptions
42
- ) => void;
43
- }): ReactElement {
44
- const { t } = useTranslation("web-ui");
45
-
46
- function handleSubmit(event: FormEvent<HTMLFormElement>) {
47
- event.preventDefault();
48
- const formData = new FormData(event.currentTarget);
49
-
50
- const keys = Object.keys(controls) as Array<keyof typeof controls>;
51
- const raw: Record<string, unknown> = {};
52
- for (const key of keys) {
53
- const control = controls[key];
54
- if (control.element === "switch") {
55
- raw[String(key)] = formData.get(String(key)) != null;
56
- }
57
- if (control.element === "select") {
58
- raw[String(key)] = formData.get(String(key)) as string;
59
- }
60
- if (control.element === "number") {
61
- const value = formData.get(String(key));
62
- raw[String(key)] = value == null || value === "" ? undefined : Number(value);
63
- }
64
- }
65
-
66
- const result = schema.safeParse(raw);
67
- if (result.success) {
68
- updatePreferences(result.data as Partial<z.infer<S>>, {
69
- noOptimisticUpdate: true,
70
- onSuccess: () => {
71
- toast.success("Preferences updated");
72
- },
73
- onError: () => {
74
- toast.error("Failed to update preferences");
75
- },
76
- });
77
- } else {
78
- // eslint-disable-next-line no-console
79
- console.error(result.error);
80
- }
81
- }
82
-
83
- const keys = Object.keys(controls) as Array<keyof typeof controls>;
84
-
85
- if (isLoading) {
86
- // FIXME: Add a loading state
87
- return <div>Loading...</div>;
88
- }
89
-
90
- return (
91
- <Form onSubmit={handleSubmit} className="p-6 flex flex-col gap-4">
92
- <h1 className="text-2xl font-bold">{t("web-ui:preferences.title")}</h1>
93
- {keys.map((key) => {
94
- const control = controls[key];
95
- switch (control.element) {
96
- case "switch":
97
- return (
98
- <Switch
99
- key={String(key)}
100
- name={String(key)}
101
- value="on"
102
- defaultSelected={Boolean(preferences[key as keyof typeof preferences])}
103
- >
104
- {control.label}
105
- </Switch>
106
- );
107
- case "select":
108
- return (
109
- <Select
110
- key={String(key)}
111
- name={String(key)}
112
- label={control.label}
113
- labelPlacement="outside-top"
114
- defaultSelectedKeys={[String(preferences[key as keyof typeof preferences])]}
115
- >
116
- {(control.options ?? []).map((option) => (
117
- <SelectItem key={option.value}>{option.label}</SelectItem>
118
- ))}
119
- </Select>
120
- );
121
- case "number":
122
- return (
123
- <Input
124
- key={String(key)}
125
- name={String(key)}
126
- type="number"
127
- label={control.label}
128
- labelPlacement="outside-top"
129
- defaultValue={String(preferences[key as keyof typeof preferences] ?? "")}
130
- min={control.min}
131
- max={control.max}
132
- step={control.step}
133
- />
134
- );
135
- default:
136
- return <div key={String(key)}>Invalid control</div>;
137
- }
138
- })}
139
- <Button type="submit" color="success" isLoading={isPending}>
140
- {t("web-ui:preferences.submit")}
141
- </Button>
142
- </Form>
143
- );
144
- }
@@ -1,78 +0,0 @@
1
- import { Alert, Button, Card, CardBody, CardHeader, Input } from "@heroui/react";
2
- import { useMutation } from "@tanstack/react-query";
3
- import { useState } from "react";
4
- import { useTranslation } from "react-i18next";
5
- import { toast } from "sonner";
6
- import type { UseBackendTRPC } from "#types";
7
-
8
- interface WaitlistCardProps {
9
- useTRPC: UseBackendTRPC;
10
- }
11
-
12
- export function WaitlistCard({ useTRPC }: WaitlistCardProps) {
13
- const { t } = useTranslation();
14
- const trpc = useTRPC();
15
- const [email, setEmail] = useState("");
16
- const [joined, setJoined] = useState(false);
17
-
18
- const { mutate } = useMutation(trpc.auth.joinWaitlist.mutationOptions());
19
-
20
- const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
21
- e.preventDefault();
22
- mutate(
23
- { email },
24
- {
25
- onSuccess: () => {
26
- setJoined(true);
27
- },
28
- onError: (error) => {
29
- toast.error(
30
- error instanceof Error
31
- ? error.message
32
- : t("web-ui:auth.waitlist.error", {
33
- defaultValue: "Failed to join waitlist. Please try again.",
34
- })
35
- );
36
- },
37
- }
38
- );
39
- };
40
-
41
- if (joined) {
42
- return (
43
- <Card>
44
- <CardBody className="pt-6">
45
- <Alert color="success" variant="faded" title={t("web-ui:auth.waitlist.success")} />
46
- </CardBody>
47
- </Card>
48
- );
49
- }
50
-
51
- return (
52
- <Card>
53
- <CardHeader className="text-center flex flex-col gap-1">
54
- <p className="text-xl font-semibold">{t("web-ui:auth.waitlist.title")}</p>
55
- <p className="text-sm text-default-600">{t("web-ui:auth.waitlist.description")}</p>
56
- </CardHeader>
57
- <CardBody>
58
- <form onSubmit={handleSubmit} className="grid gap-6">
59
- <div className="grid gap-2">
60
- <Input
61
- type="email"
62
- label={t("web-ui:auth.waitlist.email")}
63
- labelPlacement="outside"
64
- placeholder={t("web-ui:auth.waitlist.placeholder.email")}
65
- isRequired
66
- variant="bordered"
67
- value={email}
68
- onChange={(e) => setEmail(e.target.value)}
69
- />
70
- </div>
71
- <Button type="submit" color="primary">
72
- {t("web-ui:auth.waitlist.button")}
73
- </Button>
74
- </form>
75
- </CardBody>
76
- </Card>
77
- );
78
- }
@@ -1,79 +0,0 @@
1
- import { Alert } from "@heroui/react";
2
- import { useQuery } from "@tanstack/react-query";
3
- import { useTranslation } from "react-i18next";
4
- import type { UseBackendTRPC } from "#types";
5
-
6
- interface WaitlistCodeValidationProps {
7
- useTRPC: UseBackendTRPC;
8
- code: string;
9
- }
10
-
11
- export function WaitlistCodeValidation({ useTRPC, code }: WaitlistCodeValidationProps) {
12
- const { t } = useTranslation();
13
- const trpc = useTRPC();
14
- const { data, isLoading, error } = useQuery(
15
- trpc.auth.validateWaitlistCode.queryOptions({ code })
16
- );
17
- const status = data?.status;
18
-
19
- const className = "p-1";
20
-
21
- if (isLoading) {
22
- return (
23
- <Alert
24
- className={className}
25
- color="default"
26
- variant="faded"
27
- title={t("web-ui:auth.waitlist.validatingCode", {
28
- defaultValue: "Validating the invitation code...",
29
- })}
30
- />
31
- );
32
- }
33
-
34
- if (error) {
35
- return (
36
- <Alert
37
- className={className}
38
- color="danger"
39
- variant="faded"
40
- title={t("web-ui:auth.waitlist.codeError", {
41
- defaultValue: "An error occurred while validating the invitation code.",
42
- })}
43
- />
44
- );
45
- }
46
-
47
- if (status === "VALID") {
48
- return (
49
- <Alert
50
- className={className}
51
- color="success"
52
- variant="faded"
53
- title={t("web-ui:auth.waitlist.codeValid", {
54
- defaultValue: "Invitation code is valid. You can proceed.",
55
- })}
56
- />
57
- );
58
- }
59
-
60
- if (status) {
61
- let message = t("web-ui:auth.waitlist.invalidCode", {
62
- defaultValue: "Invalid invitation code.",
63
- });
64
-
65
- if (status === "EXPIRED") {
66
- message = t("web-ui:auth.waitlist.expiredCode", {
67
- defaultValue: "Invitation code has expired.",
68
- });
69
- } else if (status === "NOT_FOUND") {
70
- message = t("web-ui:auth.waitlist.codeNotFound", {
71
- defaultValue: "Invitation code not found.",
72
- });
73
- }
74
-
75
- return <Alert className={className} color="danger" variant="faded" title={message} />;
76
- }
77
-
78
- return null;
79
- }
@@ -1,124 +0,0 @@
1
- import { Bell, CheckCircle2, Clock3, Sparkles } from "lucide-react";
2
- import type { ReactNode } from "react";
3
- import { useTranslation } from "react-i18next";
4
- import { Badge } from "#components/ui/badge";
5
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "#components/ui/card";
6
- import { Separator } from "#components/ui/separator";
7
- import { cn } from "#utils";
8
-
9
- interface BillingBetaPageProps {
10
- appName: string;
11
- className?: string;
12
- footer?: ReactNode;
13
- }
14
-
15
- export function BillingBetaPage({ appName, className, footer }: BillingBetaPageProps) {
16
- const { t } = useTranslation("web-ui");
17
- return (
18
- <div className={cn("mx-auto max-w-5xl px-4 py-12 md:py-16", className)}>
19
- {/* Heading */}
20
- <div className="flex flex-col items-center text-center gap-4">
21
- <Badge variant="secondary" className="uppercase tracking-wide">
22
- {t("billing.beta.badge")}
23
- </Badge>
24
- <div className="space-y-3">
25
- <h1 className="text-3xl md:text-4xl font-semibold tracking-tight">
26
- {t("billing.title")}
27
- </h1>
28
- <p className="text-muted-foreground max-w-2xl">{t("billing.subtitle", { appName })}</p>
29
- </div>
30
- </div>
31
-
32
- <Separator className="my-8" />
33
-
34
- {/* Info Cards */}
35
- <div className="grid grid-cols-1 md:grid-cols-3 gap-4 md:gap-6">
36
- <Card>
37
- <CardHeader className="space-y-2">
38
- <div className="flex items-center gap-2 text-green-600 dark:text-green-500">
39
- <Sparkles className="h-5 w-5 shrink-0" />
40
- <CardTitle>{t("billing.card.free.title")}</CardTitle>
41
- </div>
42
- <CardDescription>{t("billing.card.free.description")}</CardDescription>
43
- </CardHeader>
44
- <CardContent>
45
- <div className="flex items-baseline gap-2">
46
- <span className="text-4xl font-bold tracking-tight">
47
- {t("billing.card.free.price")}
48
- </span>
49
- <span className="text-muted-foreground">{t("billing.card.free.priceSuffix")}</span>
50
- </div>
51
- <ul className="mt-4 space-y-2 text-sm">
52
- <li className="flex items-center gap-2">
53
- <CheckCircle2 className="h-4 w-4 shrink-0 text-green-600" />{" "}
54
- {t("billing.card.free.feature.fullAccess")}
55
- </li>
56
- <li className="flex items-center gap-2">
57
- <CheckCircle2 className="h-4 w-4 shrink-0 text-green-600" />{" "}
58
- {t("billing.card.free.feature.noCard")}
59
- </li>
60
- <li className="flex items-center gap-2">
61
- <CheckCircle2 className="h-4 w-4 shrink-0 text-green-600" />{" "}
62
- {t("billing.card.free.feature.riskFree")}
63
- </li>
64
- </ul>
65
- </CardContent>
66
- </Card>
67
-
68
- <Card>
69
- <CardHeader className="space-y-2">
70
- <div className="flex items-center gap-2 text-blue-600 dark:text-blue-500">
71
- <Clock3 className="h-5 w-5 shrink-0" />
72
- <CardTitle>{t("billing.card.progress.title")}</CardTitle>
73
- </div>
74
- <CardDescription>{t("billing.card.progress.description")}</CardDescription>
75
- </CardHeader>
76
- <CardContent>
77
- <ul className="space-y-2 text-sm">
78
- <li className="flex items-center gap-2">
79
- <CheckCircle2 className="h-4 w-4 shrink-0 text-blue-600" />{" "}
80
- {t("billing.card.progress.feature.transparentPlans")}
81
- </li>
82
- <li className="flex items-center gap-2">
83
- <CheckCircle2 className="h-4 w-4 shrink-0 text-blue-600" />{" "}
84
- {t("billing.card.progress.feature.fairValue")}
85
- </li>
86
- <li className="flex items-center gap-2">
87
- <CheckCircle2 className="h-4 w-4 shrink-0 text-blue-600" />{" "}
88
- {t("billing.card.progress.feature.simpleBilling")}
89
- </li>
90
- </ul>
91
- </CardContent>
92
- </Card>
93
-
94
- <Card>
95
- <CardHeader className="space-y-2">
96
- <div className="flex items-center gap-2 text-amber-600 dark:text-amber-500">
97
- <Bell className="h-5 w-5 shrink-0" />
98
- <CardTitle>{t("billing.card.notice.title")}</CardTitle>
99
- </div>
100
- <CardDescription>{t("billing.card.notice.description")}</CardDescription>
101
- </CardHeader>
102
- <CardContent>
103
- <ul className="space-y-2 text-sm">
104
- <li className="flex items-center gap-2">
105
- <CheckCircle2 className="h-4 w-4 shrink-0 text-amber-600" />{" "}
106
- {t("billing.card.notice.feature.timeToDecide")}
107
- </li>
108
- <li className="flex items-center gap-2">
109
- <CheckCircle2 className="h-4 w-4 shrink-0 text-amber-600" />{" "}
110
- {t("billing.card.notice.feature.safeData")}
111
- </li>
112
- <li className="flex items-center gap-2">
113
- <CheckCircle2 className="h-4 w-4 shrink-0 text-amber-600" />{" "}
114
- {t("billing.card.notice.feature.autoFreeTier")}
115
- </li>
116
- </ul>
117
- </CardContent>
118
- </Card>
119
- </div>
120
-
121
- {footer}
122
- </div>
123
- );
124
- }
@@ -1,180 +0,0 @@
1
- import {
2
- Button,
3
- Card,
4
- CardBody,
5
- CardHeader,
6
- Chip,
7
- Link,
8
- Spinner,
9
- Table,
10
- TableBody,
11
- TableCell,
12
- TableColumn,
13
- TableHeader,
14
- TableRow,
15
- } from "@heroui/react";
16
- import { useSubscription } from "@m5kdev/frontend/modules/billing/hooks/useSubscription";
17
- import { useQuery } from "@tanstack/react-query";
18
- import { AlertCircle, CheckCircle2, ExternalLink } from "lucide-react";
19
-
20
- import type { UseBackendTRPC } from "#types";
21
-
22
- interface BillingInvoicePageProps {
23
- useTRPC: UseBackendTRPC;
24
- serverUrl: string;
25
- }
26
-
27
- export function BillingInvoicePage({ useTRPC, serverUrl }: BillingInvoicePageProps) {
28
- const trpc = useTRPC();
29
- const { data: invoices, isLoading } = useQuery(trpc.billing.listInvoices.queryOptions());
30
-
31
- const { data: activeSubscription, isLoading: isLoadingSubscriptions } = useSubscription();
32
- const formatCurrency = (amount: number, currency: string) => {
33
- return new Intl.NumberFormat("en-US", {
34
- style: "currency",
35
- currency: currency.toUpperCase(),
36
- }).format(amount / 100);
37
- };
38
-
39
- const formatDate = (timestamp: number | Date) => {
40
- const date = timestamp instanceof Date ? timestamp : new Date(timestamp * 1000);
41
- return date.toLocaleDateString(undefined, {
42
- year: "numeric",
43
- month: "long",
44
- day: "numeric",
45
- });
46
- };
47
-
48
- const cancelAt = activeSubscription?.cancelAt || activeSubscription?.cancelAtPeriodEnd;
49
- return (
50
- <div className="container mx-auto p-10 space-y-8">
51
- <Card>
52
- <CardHeader className="flex flex-col items-start gap-1 px-6 pt-6">
53
- <h1 className="text-xl font-bold">Active Subscription</h1>
54
- <p className="text-small text-default-500">Manage your active subscription.</p>
55
- </CardHeader>
56
- <CardBody className="px-6 pb-6">
57
- {isLoadingSubscriptions ? (
58
- <div className="flex justify-center py-8">
59
- <Spinner />
60
- </div>
61
- ) : !activeSubscription ? (
62
- <div className="flex flex-col items-center justify-center py-8 text-center gap-4">
63
- <div className="p-4 rounded-full bg-default-100">
64
- <AlertCircle className="w-8 h-8 text-default-500" />
65
- </div>
66
- <div>
67
- <p className="text-lg font-medium">No active subscription</p>
68
- <p className="text-small text-default-500">
69
- You are currently on the free tier. Upgrade to access premium features.
70
- </p>
71
- </div>
72
- <Button as={Link} href="/pricing" color="primary">
73
- View Plans
74
- </Button>
75
- </div>
76
- ) : (
77
- <div className="space-y-6">
78
- <div className="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-4 p-4 rounded-lg bg-default-50 border border-default-200">
79
- <div className="space-y-1">
80
- <div className="flex items-center gap-2">
81
- <h3 className="text-lg font-semibold capitalize">
82
- {activeSubscription.plan || "Premium Plan"}
83
- </h3>
84
-
85
- <Chip
86
- color={
87
- cancelAt
88
- ? "danger"
89
- : activeSubscription.status === "active"
90
- ? "success"
91
- : "warning"
92
- }
93
- variant="flat"
94
- size="sm"
95
- startContent={<CheckCircle2 className="w-3 h-3 ml-1" />}
96
- >
97
- {cancelAt ? "Cancelled" : activeSubscription.status}
98
- </Chip>
99
- </div>
100
- <p className="text-small text-default-500 flex items-center gap-2">
101
- {cancelAt ? "Your subscription will end on " : "Next billing date: "}
102
- <span className="font-medium text-foreground">
103
- {activeSubscription.periodEnd
104
- ? formatDate(activeSubscription.periodEnd)
105
- : "N/A"}
106
- </span>
107
- <span className="text-small text-default-500">
108
- {`(${activeSubscription.interval === "month" ? "Monthly" : "Annually"})`}
109
- </span>
110
- </p>
111
- </div>
112
- <div className="flex gap-3">
113
- <Button variant="bordered" as="a" href={`${serverUrl}/stripe/portal`}>
114
- Manage Subscription
115
- </Button>
116
- </div>
117
- </div>
118
- </div>
119
- )}
120
- </CardBody>
121
- </Card>
122
- <Card>
123
- <CardHeader className="flex flex-col items-start gap-1 px-6 pt-6">
124
- <h1 className="text-xl font-bold">Invoices</h1>
125
- <p className="text-small text-default-500">
126
- View your invoice history and download past invoices.
127
- </p>
128
- </CardHeader>
129
- <CardBody className="px-6 pb-6">
130
- {isLoading ? (
131
- <div className="flex justify-center py-8">
132
- <Spinner />
133
- </div>
134
- ) : (
135
- <Table aria-label="Invoices table" removeWrapper>
136
- <TableHeader>
137
- <TableColumn>Date</TableColumn>
138
- <TableColumn>Amount</TableColumn>
139
- <TableColumn>Status</TableColumn>
140
- <TableColumn align="end">Action</TableColumn>
141
- </TableHeader>
142
- <TableBody emptyContent="No invoices found.">
143
- {(invoices || []).map((invoice) => (
144
- <TableRow key={invoice.id}>
145
- <TableCell>{formatDate(invoice.created)}</TableCell>
146
- <TableCell>{formatCurrency(invoice.total, invoice.currency)}</TableCell>
147
- <TableCell>
148
- <Chip
149
- color={invoice.status === "paid" ? "success" : "default"}
150
- variant="flat"
151
- size="sm"
152
- >
153
- {invoice.status}
154
- </Chip>
155
- </TableCell>
156
- <TableCell className="text-right">
157
- {invoice.hosted_invoice_url && (
158
- <Button
159
- as={Link}
160
- href={invoice.hosted_invoice_url}
161
- target="_blank"
162
- rel="noopener noreferrer"
163
- variant="light"
164
- size="sm"
165
- endContent={<ExternalLink className="h-4 w-4" />}
166
- >
167
- View
168
- </Button>
169
- )}
170
- </TableCell>
171
- </TableRow>
172
- ))}
173
- </TableBody>
174
- </Table>
175
- )}
176
- </CardBody>
177
- </Card>
178
- </div>
179
- );
180
- }
@@ -1,14 +0,0 @@
1
- import type { StripePlan } from "@m5kdev/commons/modules/billing/billing.types";
2
- import { BillingSinglePlanSelect } from "#modules/billing/components/BillingSinglePlanSelect";
3
-
4
- interface BillingPlanSelectProps {
5
- plans: StripePlan[];
6
- }
7
-
8
- export function BillingPlanSelect({ plans }: BillingPlanSelectProps) {
9
- if (plans.length === 1) {
10
- return <BillingSinglePlanSelect plan={plans[0]} />;
11
- }
12
-
13
- return "Multiple plans selection not implemented yet";
14
- }