@m5kdev/web-ui 0.6.0 → 0.8.0

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 (377) hide show
  1. package/dist/src/animations/card.motion.d.ts +7 -2
  2. package/dist/src/animations/card.motion.js +25 -6
  3. package/dist/src/animations/card.motion.js.map +1 -0
  4. package/dist/src/components/AvatarUpload.d.ts +14 -5
  5. package/dist/src/components/AvatarUpload.js +105 -63
  6. package/dist/src/components/AvatarUpload.js.map +1 -0
  7. package/dist/src/components/Button.d.ts +14 -4
  8. package/dist/src/components/Button.js +13 -4
  9. package/dist/src/components/Button.js.map +1 -0
  10. package/dist/src/components/Calendar.d.ts +33 -31
  11. package/dist/src/components/Calendar.js +14 -6
  12. package/dist/src/components/Calendar.js.map +1 -0
  13. package/dist/src/components/{Calendar.css → Calendar2.css} +757 -684
  14. package/dist/src/components/CardsSelect.d.ts +25 -21
  15. package/dist/src/components/CardsSelect.js +75 -42
  16. package/dist/src/components/CardsSelect.js.map +1 -0
  17. package/dist/src/components/CollapsibleSidebarMenuItem.d.ts +22 -9
  18. package/dist/src/components/CollapsibleSidebarMenuItem.js +31 -8
  19. package/dist/src/components/CollapsibleSidebarMenuItem.js.map +1 -0
  20. package/dist/src/components/ColorPicker.d.ts +15 -4
  21. package/dist/src/components/ColorPicker.js +46 -16
  22. package/dist/src/components/ColorPicker.js.map +1 -0
  23. package/dist/src/components/CopyButton.d.ts +18 -6
  24. package/dist/src/components/CopyButton.js +28 -19
  25. package/dist/src/components/CopyButton.js.map +1 -0
  26. package/dist/src/components/CropDialog.d.ts +20 -8
  27. package/dist/src/components/CropDialog.js +108 -62
  28. package/dist/src/components/CropDialog.js.map +1 -0
  29. package/dist/src/components/DialogProvider.d.ts +22 -14
  30. package/dist/src/components/DialogProvider.js +67 -45
  31. package/dist/src/components/DialogProvider.js.map +1 -0
  32. package/dist/src/components/ErrorFallback.d.ts +13 -4
  33. package/dist/src/components/ErrorFallback.js +29 -4
  34. package/dist/src/components/ErrorFallback.js.map +1 -0
  35. package/dist/src/components/FileDropzone.d.ts +12 -4
  36. package/dist/src/components/FileDropzone.js +98 -60
  37. package/dist/src/components/FileDropzone.js.map +1 -0
  38. package/dist/src/components/MultiSelectDropdown.d.ts +25 -22
  39. package/dist/src/components/MultiSelectDropdown.js +99 -49
  40. package/dist/src/components/MultiSelectDropdown.js.map +1 -0
  41. package/dist/src/components/Orb.d.ts +17 -6
  42. package/dist/src/components/Orb.js +263 -255
  43. package/dist/src/components/Orb.js.map +1 -0
  44. package/dist/src/components/PageAlert.d.ts +20 -15
  45. package/dist/src/components/PageAlert.js +67 -39
  46. package/dist/src/components/PageAlert.js.map +1 -0
  47. package/dist/src/components/SelectChips.d.ts +21 -10
  48. package/dist/src/components/SelectChips.js +21 -9
  49. package/dist/src/components/SelectChips.js.map +1 -0
  50. package/dist/src/components/SidebarItem.d.ts +18 -7
  51. package/dist/src/components/SidebarItem.js +16 -4
  52. package/dist/src/components/SidebarItem.js.map +1 -0
  53. package/dist/src/components/Steps.d.ts +21 -16
  54. package/dist/src/components/Steps.js +193 -27
  55. package/dist/src/components/Steps.js.map +1 -0
  56. package/dist/src/components/TablerIconPicker.d.ts +13 -2
  57. package/dist/src/components/TablerIconPicker.js +4254 -4234
  58. package/dist/src/components/TablerIconPicker.js.map +1 -0
  59. package/dist/src/components/app-header.d.ts +14 -6
  60. package/dist/src/components/app-header.js +27 -6
  61. package/dist/src/components/app-header.js.map +1 -0
  62. package/dist/src/components/blur-card.d.ts +25 -11
  63. package/dist/src/components/blur-card.js +134 -31
  64. package/dist/src/components/blur-card.js.map +1 -0
  65. package/dist/src/components/features-section-demo-1.d.ts +22 -6
  66. package/dist/src/components/features-section-demo-1.js +119 -47
  67. package/dist/src/components/features-section-demo-1.js.map +1 -0
  68. package/dist/src/components/features-section-demo-2.d.ts +7 -1
  69. package/dist/src/components/features-section-demo-2.js +80 -49
  70. package/dist/src/components/features-section-demo-2.js.map +1 -0
  71. package/dist/src/components/features-section-demo-3.d.ts +16 -8
  72. package/dist/src/components/features-section-demo-3.js +239 -103
  73. package/dist/src/components/features-section-demo-3.js.map +1 -0
  74. package/dist/src/components/mode-toggle.d.ts +7 -1
  75. package/dist/src/components/mode-toggle.js +42 -7
  76. package/dist/src/components/mode-toggle.js.map +1 -0
  77. package/dist/src/components/nav-main.d.ts +20 -12
  78. package/dist/src/components/nav-main.js +31 -5
  79. package/dist/src/components/nav-main.js.map +1 -0
  80. package/dist/src/components/pricing-cards.d.ts +7 -1
  81. package/dist/src/components/pricing-cards.js +125 -24
  82. package/dist/src/components/pricing-cards.js.map +1 -0
  83. package/dist/src/components/shared/ButtonCopy.d.ts +17 -6
  84. package/dist/src/components/shared/ButtonCopy.js +31 -20
  85. package/dist/src/components/shared/ButtonCopy.js.map +1 -0
  86. package/dist/src/components/team-switcher.d.ts +16 -8
  87. package/dist/src/components/team-switcher.js +70 -8
  88. package/dist/src/components/team-switcher.js.map +1 -0
  89. package/dist/src/components/theme-provider.d.ts +18 -8
  90. package/dist/src/components/theme-provider.js +42 -38
  91. package/dist/src/components/theme-provider.js.map +1 -0
  92. package/dist/src/components/typewriter.d.ts +35 -14
  93. package/dist/src/components/typewriter.js +45 -36
  94. package/dist/src/components/typewriter.js.map +1 -0
  95. package/dist/src/components/ui/alert-dialog.d.ts +48 -13
  96. package/dist/src/components/ui/alert-dialog.js +58 -15
  97. package/dist/src/components/ui/alert-dialog.js.map +1 -0
  98. package/dist/src/components/ui/alert.d.ts +24 -8
  99. package/dist/src/components/ui/alert.js +28 -15
  100. package/dist/src/components/ui/alert.js.map +1 -0
  101. package/dist/src/components/ui/avatar.d.ts +9 -5
  102. package/dist/src/components/ui/avatar.js +23 -7
  103. package/dist/src/components/ui/avatar.js.map +1 -0
  104. package/dist/src/components/ui/badge.d.ts +17 -8
  105. package/dist/src/components/ui/badge.js +17 -14
  106. package/dist/src/components/ui/badge.js.map +1 -0
  107. package/dist/src/components/ui/bento-grid.d.ts +26 -11
  108. package/dist/src/components/ui/bento-grid.js +30 -6
  109. package/dist/src/components/ui/bento-grid.js.map +1 -0
  110. package/dist/src/components/ui/bento-grid2.d.ts +30 -14
  111. package/dist/src/components/ui/bento-grid2.js +45 -9
  112. package/dist/src/components/ui/bento-grid2.js.map +1 -0
  113. package/dist/src/components/ui/breadcrumb.d.ts +27 -15
  114. package/dist/src/components/ui/breadcrumb.js +54 -14
  115. package/dist/src/components/ui/breadcrumb.js.map +1 -0
  116. package/dist/src/components/ui/button.d.ts +14 -9
  117. package/dist/src/components/ui/button.js +37 -26
  118. package/dist/src/components/ui/button.js.map +1 -0
  119. package/dist/src/components/ui/card.d.ts +12 -8
  120. package/dist/src/components/ui/card.js +38 -10
  121. package/dist/src/components/ui/card.js.map +1 -0
  122. package/dist/src/components/ui/checkbox.d.ts +6 -2
  123. package/dist/src/components/ui/checkbox.js +17 -5
  124. package/dist/src/components/ui/checkbox.js.map +1 -0
  125. package/dist/src/components/ui/collapsible.d.ts +9 -4
  126. package/dist/src/components/ui/collapsible.js +5 -1
  127. package/dist/src/components/ui/collapsible.js.map +1 -0
  128. package/dist/src/components/ui/dialog.d.ts +44 -12
  129. package/dist/src/components/ui/dialog.js +64 -14
  130. package/dist/src/components/ui/dialog.js.map +1 -0
  131. package/dist/src/components/ui/dropdown-menu.d.ts +32 -24
  132. package/dist/src/components/ui/dropdown-menu.js +64 -14
  133. package/dist/src/components/ui/dropdown-menu.js.map +1 -0
  134. package/dist/src/components/ui/floating-navbar.d.ts +18 -9
  135. package/dist/src/components/ui/floating-navbar.js +49 -35
  136. package/dist/src/components/ui/floating-navbar.js.map +1 -0
  137. package/dist/src/components/ui/form.d.ts +30 -21
  138. package/dist/src/components/ui/form.js +76 -44
  139. package/dist/src/components/ui/form.js.map +1 -0
  140. package/dist/src/components/ui/image.d.ts +6 -2
  141. package/dist/src/components/ui/image.js +51 -11
  142. package/dist/src/components/ui/image.js.map +1 -0
  143. package/dist/src/components/ui/input.d.ts +6 -2
  144. package/dist/src/components/ui/input.js +14 -5
  145. package/dist/src/components/ui/input.js.map +1 -0
  146. package/dist/src/components/ui/label.d.ts +8 -3
  147. package/dist/src/components/ui/label.js +13 -5
  148. package/dist/src/components/ui/label.js.map +1 -0
  149. package/dist/src/components/ui/pagination.d.ts +39 -12
  150. package/dist/src/components/ui/pagination.js +64 -14
  151. package/dist/src/components/ui/pagination.js.map +1 -0
  152. package/dist/src/components/ui/progress.d.ts +6 -2
  153. package/dist/src/components/ui/progress.js +16 -4
  154. package/dist/src/components/ui/progress.js.map +1 -0
  155. package/dist/src/components/ui/resizable-navbar.d.ts +84 -43
  156. package/dist/src/components/ui/resizable-navbar.js +126 -74
  157. package/dist/src/components/ui/resizable-navbar.js.map +1 -0
  158. package/dist/src/components/ui/segment-control.d.ts +10 -7
  159. package/dist/src/components/ui/segment-control.js +83 -38
  160. package/dist/src/components/ui/segment-control.js.map +1 -0
  161. package/dist/src/components/ui/select.d.ts +16 -12
  162. package/dist/src/components/ui/select.js +63 -14
  163. package/dist/src/components/ui/select.js.map +1 -0
  164. package/dist/src/components/ui/separator.d.ts +6 -2
  165. package/dist/src/components/ui/separator.js +14 -4
  166. package/dist/src/components/ui/separator.js.map +1 -0
  167. package/dist/src/components/ui/sheet.d.ts +30 -19
  168. package/dist/src/components/ui/sheet.js +52 -23
  169. package/dist/src/components/ui/sheet.js.map +1 -0
  170. package/dist/src/components/ui/sidebar.d.ts +69 -62
  171. package/dist/src/components/ui/sidebar.js +326 -171
  172. package/dist/src/components/ui/sidebar.js.map +1 -0
  173. package/dist/src/components/ui/skeleton.d.ts +9 -1
  174. package/dist/src/components/ui/skeleton.js +10 -3
  175. package/dist/src/components/ui/skeleton.js.map +1 -0
  176. package/dist/src/components/ui/slider.d.ts +6 -2
  177. package/dist/src/components/ui/slider.js +16 -4
  178. package/dist/src/components/ui/slider.js.map +1 -0
  179. package/dist/src/components/ui/sonner.d.ts +10 -3
  180. package/dist/src/components/ui/sonner.js +18 -11
  181. package/dist/src/components/ui/sonner.js.map +1 -0
  182. package/dist/src/components/ui/spinner.d.ts +21 -10
  183. package/dist/src/components/ui/spinner.js +24 -24
  184. package/dist/src/components/ui/spinner.js.map +1 -0
  185. package/dist/src/components/ui/switch.d.ts +6 -2
  186. package/dist/src/components/ui/switch.js +13 -4
  187. package/dist/src/components/ui/switch.js.map +1 -0
  188. package/dist/src/components/ui/table.d.ts +39 -10
  189. package/dist/src/components/ui/table.js +51 -11
  190. package/dist/src/components/ui/table.js.map +1 -0
  191. package/dist/src/components/ui/tabs.d.ts +23 -6
  192. package/dist/src/components/ui/tabs.js +27 -7
  193. package/dist/src/components/ui/tabs.js.map +1 -0
  194. package/dist/src/components/ui/textarea.d.ts +10 -2
  195. package/dist/src/components/ui/textarea.js +11 -3
  196. package/dist/src/components/ui/textarea.js.map +1 -0
  197. package/dist/src/components/ui/timeline.d.ts +16 -9
  198. package/dist/src/components/ui/timeline.js +87 -24
  199. package/dist/src/components/ui/timeline.js.map +1 -0
  200. package/dist/src/components/ui/toast.d.ts +19 -14
  201. package/dist/src/components/ui/toast.js +48 -22
  202. package/dist/src/components/ui/toast.js.map +1 -0
  203. package/dist/src/components/ui/tooltip.d.ts +23 -6
  204. package/dist/src/components/ui/tooltip.js +27 -7
  205. package/dist/src/components/ui/tooltip.js.map +1 -0
  206. package/dist/src/components/ui/typewriter-effect.d.ts +28 -14
  207. package/dist/src/components/ui/typewriter-effect.js +102 -72
  208. package/dist/src/components/ui/typewriter-effect.js.map +1 -0
  209. package/dist/src/hooks/use-mobile.d.ts +5 -1
  210. package/dist/src/hooks/use-mobile.js +18 -13
  211. package/dist/src/hooks/use-mobile.js.map +1 -0
  212. package/dist/src/hooks/useDialog.d.ts +8 -4
  213. package/dist/src/hooks/useDialog.js +24 -20
  214. package/dist/src/hooks/useDialog.js.map +1 -0
  215. package/dist/src/icons/GoogleIcon.d.ts +9 -5
  216. package/dist/src/icons/GoogleIcon.js +32 -3
  217. package/dist/src/icons/GoogleIcon.js.map +1 -0
  218. package/dist/src/icons/LinkedInIcon.d.ts +9 -5
  219. package/dist/src/icons/LinkedInIcon.js +27 -3
  220. package/dist/src/icons/LinkedInIcon.js.map +1 -0
  221. package/dist/src/icons/MicrosoftIcon.d.ts +9 -5
  222. package/dist/src/icons/MicrosoftIcon.js +31 -3
  223. package/dist/src/icons/MicrosoftIcon.js.map +1 -0
  224. package/dist/src/lib/chatwoot.d.ts +19 -10
  225. package/dist/src/lib/chatwoot.js +25 -27
  226. package/dist/src/lib/chatwoot.js.map +1 -0
  227. package/dist/src/lib/utils.d.ts +7 -2
  228. package/dist/src/lib/utils.js +7 -2
  229. package/dist/src/lib/utils.js.map +1 -0
  230. package/dist/src/modules/app/components/AppLoader.d.ts +8 -2
  231. package/dist/src/modules/app/components/AppLoader.js +14 -3
  232. package/dist/src/modules/app/components/AppLoader.js.map +1 -0
  233. package/dist/src/modules/app/components/AppShell.d.ts +15 -6
  234. package/dist/src/modules/app/components/AppShell.js +14 -5
  235. package/dist/src/modules/app/components/AppShell.js.map +1 -0
  236. package/dist/src/modules/app/components/AppSidebar.d.ts +16 -6
  237. package/dist/src/modules/app/components/AppSidebar.js +17 -4
  238. package/dist/src/modules/app/components/AppSidebar.js.map +1 -0
  239. package/dist/src/modules/app/components/AppSidebarContent.d.ts +22 -13
  240. package/dist/src/modules/app/components/AppSidebarContent.js +34 -5
  241. package/dist/src/modules/app/components/AppSidebarContent.js.map +1 -0
  242. package/dist/src/modules/app/components/AppSidebarHeader.d.ts +18 -8
  243. package/dist/src/modules/app/components/AppSidebarHeader.js +37 -6
  244. package/dist/src/modules/app/components/AppSidebarHeader.js.map +1 -0
  245. package/dist/src/modules/app/components/AppSidebarInvites.d.ts +11 -3
  246. package/dist/src/modules/app/components/AppSidebarInvites.js +39 -8
  247. package/dist/src/modules/app/components/AppSidebarInvites.js.map +1 -0
  248. package/dist/src/modules/app/components/AppSidebarUser.d.ts +20 -10
  249. package/dist/src/modules/app/components/AppSidebarUser.js +121 -12
  250. package/dist/src/modules/app/components/AppSidebarUser.js.map +1 -0
  251. package/dist/src/modules/auth/components/AdminUserManagement.d.ts +11 -4
  252. package/dist/src/modules/auth/components/AdminUserManagement.js +970 -418
  253. package/dist/src/modules/auth/components/AdminUserManagement.js.map +1 -0
  254. package/dist/src/modules/auth/components/AdminWaitlist.d.ts +11 -4
  255. package/dist/src/modules/auth/components/AdminWaitlist.js +284 -115
  256. package/dist/src/modules/auth/components/AdminWaitlist.js.map +1 -0
  257. package/dist/src/modules/auth/components/AuthLayout.d.ts +12 -4
  258. package/dist/src/modules/auth/components/AuthLayout.js +17 -3
  259. package/dist/src/modules/auth/components/AuthLayout.js.map +1 -0
  260. package/dist/src/modules/auth/components/AuthProviders.d.ts +17 -6
  261. package/dist/src/modules/auth/components/AuthProviders.js +80 -41
  262. package/dist/src/modules/auth/components/AuthProviders.js.map +1 -0
  263. package/dist/src/modules/auth/components/AuthRouter.d.ts +16 -7
  264. package/dist/src/modules/auth/components/AuthRouter.js +46 -10
  265. package/dist/src/modules/auth/components/AuthRouter.js.map +1 -0
  266. package/dist/src/modules/auth/components/ClaimAccountRoute.d.ts +12 -4
  267. package/dist/src/modules/auth/components/ClaimAccountRoute.js +202 -139
  268. package/dist/src/modules/auth/components/ClaimAccountRoute.js.map +1 -0
  269. package/dist/src/modules/auth/components/ErrorAuthRoute.d.ts +7 -1
  270. package/dist/src/modules/auth/components/ErrorAuthRoute.js +125 -89
  271. package/dist/src/modules/auth/components/ErrorAuthRoute.js.map +1 -0
  272. package/dist/src/modules/auth/components/ForgotPasswordForm.d.ts +7 -1
  273. package/dist/src/modules/auth/components/ForgotPasswordForm.js +49 -23
  274. package/dist/src/modules/auth/components/ForgotPasswordForm.js.map +1 -0
  275. package/dist/src/modules/auth/components/ForgotPasswordRoute.d.ts +7 -1
  276. package/dist/src/modules/auth/components/ForgotPasswordRoute.js +34 -6
  277. package/dist/src/modules/auth/components/ForgotPasswordRoute.js.map +1 -0
  278. package/dist/src/modules/auth/components/InviteFriends.d.ts +12 -4
  279. package/dist/src/modules/auth/components/InviteFriends.js +275 -69
  280. package/dist/src/modules/auth/components/InviteFriends.js.map +1 -0
  281. package/dist/src/modules/auth/components/LastUsedBadge.d.ts +17 -5
  282. package/dist/src/modules/auth/components/LastUsedBadge.js +16 -6
  283. package/dist/src/modules/auth/components/LastUsedBadge.js.map +1 -0
  284. package/dist/src/modules/auth/components/LoginForm.d.ts +11 -3
  285. package/dist/src/modules/auth/components/LoginForm.js +107 -40
  286. package/dist/src/modules/auth/components/LoginForm.js.map +1 -0
  287. package/dist/src/modules/auth/components/LoginRoute.d.ts +11 -3
  288. package/dist/src/modules/auth/components/LoginRoute.js +41 -8
  289. package/dist/src/modules/auth/components/LoginRoute.js.map +1 -0
  290. package/dist/src/modules/auth/components/LogoutRoute.d.ts +7 -1
  291. package/dist/src/modules/auth/components/LogoutRoute.js +18 -12
  292. package/dist/src/modules/auth/components/LogoutRoute.js.map +1 -0
  293. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.d.ts +21 -8
  294. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js +107 -97
  295. package/dist/src/modules/auth/components/OrganizationAcceptInvitationRoute.js.map +1 -0
  296. package/dist/src/modules/auth/components/OrganizationMembersRoute.d.ts +58 -48
  297. package/dist/src/modules/auth/components/OrganizationMembersRoute.js +448 -349
  298. package/dist/src/modules/auth/components/OrganizationMembersRoute.js.map +1 -0
  299. package/dist/src/modules/auth/components/OrganizationPreferences.d.ts +27 -16
  300. package/dist/src/modules/auth/components/OrganizationPreferences.js +129 -124
  301. package/dist/src/modules/auth/components/OrganizationPreferences.js.map +1 -0
  302. package/dist/src/modules/auth/components/OrganizationSettingsRoute.d.ts +27 -18
  303. package/dist/src/modules/auth/components/OrganizationSettingsRoute.js +184 -144
  304. package/dist/src/modules/auth/components/OrganizationSettingsRoute.js.map +1 -0
  305. package/dist/src/modules/auth/components/OrganizationSwitcher.d.ts +17 -6
  306. package/dist/src/modules/auth/components/OrganizationSwitcher.js +91 -69
  307. package/dist/src/modules/auth/components/OrganizationSwitcher.js.map +1 -0
  308. package/dist/src/modules/auth/components/PreferencesEditor.d.ts +44 -33
  309. package/dist/src/modules/auth/components/PreferencesEditor.js +82 -58
  310. package/dist/src/modules/auth/components/PreferencesEditor.js.map +1 -0
  311. package/dist/src/modules/auth/components/ProfileRoute.d.ts +7 -1
  312. package/dist/src/modules/auth/components/ProfileRoute.js +79 -36
  313. package/dist/src/modules/auth/components/ProfileRoute.js.map +1 -0
  314. package/dist/src/modules/auth/components/RangeNuqsDatePicker.d.ts +44 -30
  315. package/dist/src/modules/auth/components/RangeNuqsDatePicker.js +234 -242
  316. package/dist/src/modules/auth/components/RangeNuqsDatePicker.js.map +1 -0
  317. package/dist/src/modules/auth/components/ResetPasswordForm.d.ts +7 -1
  318. package/dist/src/modules/auth/components/ResetPasswordForm.js +97 -35
  319. package/dist/src/modules/auth/components/ResetPasswordForm.js.map +1 -0
  320. package/dist/src/modules/auth/components/ResetPasswordRoute.d.ts +7 -1
  321. package/dist/src/modules/auth/components/ResetPasswordRoute.js +34 -6
  322. package/dist/src/modules/auth/components/ResetPasswordRoute.js.map +1 -0
  323. package/dist/src/modules/auth/components/SignupFormRoute.d.ts +15 -5
  324. package/dist/src/modules/auth/components/SignupFormRoute.js +142 -99
  325. package/dist/src/modules/auth/components/SignupFormRoute.js.map +1 -0
  326. package/dist/src/modules/auth/components/SignupRoute.d.ts +13 -5
  327. package/dist/src/modules/auth/components/SignupRoute.js +59 -13
  328. package/dist/src/modules/auth/components/SignupRoute.js.map +1 -0
  329. package/dist/src/modules/auth/components/UserPreferences.d.ts +22 -11
  330. package/dist/src/modules/auth/components/UserPreferences.js +24 -12
  331. package/dist/src/modules/auth/components/UserPreferences.js.map +1 -0
  332. package/dist/src/modules/auth/components/WaitlistCard.d.ts +11 -4
  333. package/dist/src/modules/auth/components/WaitlistCard.js +63 -28
  334. package/dist/src/modules/auth/components/WaitlistCard.js.map +1 -0
  335. package/dist/src/modules/auth/components/WaitlistCodeValidation.d.ts +13 -5
  336. package/dist/src/modules/auth/components/WaitlistCodeValidation.js +42 -40
  337. package/dist/src/modules/auth/components/WaitlistCodeValidation.js.map +1 -0
  338. package/dist/src/modules/billing/components/BillingBetaPage.d.ts +15 -6
  339. package/dist/src/modules/billing/components/BillingBetaPage.js +155 -8
  340. package/dist/src/modules/billing/components/BillingBetaPage.js.map +1 -0
  341. package/dist/src/modules/billing/components/BillingInvoicePage.d.ts +13 -5
  342. package/dist/src/modules/billing/components/BillingInvoicePage.js +160 -30
  343. package/dist/src/modules/billing/components/BillingInvoicePage.js.map +1 -0
  344. package/dist/src/modules/billing/components/BillingPlanSelect.d.ts +11 -4
  345. package/dist/src/modules/billing/components/BillingPlanSelect.js +10 -7
  346. package/dist/src/modules/billing/components/BillingPlanSelect.js.map +1 -0
  347. package/dist/src/modules/billing/components/BillingRouter.d.ts +15 -7
  348. package/dist/src/modules/billing/components/BillingRouter.js +19 -6
  349. package/dist/src/modules/billing/components/BillingRouter.js.map +1 -0
  350. package/dist/src/modules/billing/components/BillingSinglePlanSelect.d.ts +17 -7
  351. package/dist/src/modules/billing/components/BillingSinglePlanSelect.js +163 -42
  352. package/dist/src/modules/billing/components/BillingSinglePlanSelect.js.map +1 -0
  353. package/dist/src/modules/table/components/ColumnOrderAndVisibility.d.ts +18 -8
  354. package/dist/src/modules/table/components/ColumnOrderAndVisibility.js +81 -38
  355. package/dist/src/modules/table/components/ColumnOrderAndVisibility.js.map +1 -0
  356. package/dist/src/modules/table/components/NuqsTable.d.ts +33 -21
  357. package/dist/src/modules/table/components/NuqsTable.js +295 -221
  358. package/dist/src/modules/table/components/NuqsTable.js.map +1 -0
  359. package/dist/src/modules/table/components/TableFiltering.d.ts +33 -21
  360. package/dist/src/modules/table/components/TableFiltering.js +408 -226
  361. package/dist/src/modules/table/components/TableFiltering.js.map +1 -0
  362. package/dist/src/modules/table/components/TableGroupBy.d.ts +18 -8
  363. package/dist/src/modules/table/components/TableGroupBy.js +56 -16
  364. package/dist/src/modules/table/components/TableGroupBy.js.map +1 -0
  365. package/dist/src/modules/table/components/TablePagination.d.ts +17 -7
  366. package/dist/src/modules/table/components/TablePagination.js +64 -32
  367. package/dist/src/modules/table/components/TablePagination.js.map +1 -0
  368. package/dist/src/modules/table/components/table.types.d.ts +15 -10
  369. package/dist/src/modules/table/components/table.types.js +0 -1
  370. package/dist/src/modules/table/filterTransformers.d.ts +35 -30
  371. package/dist/src/modules/table/filterTransformers.js +198 -261
  372. package/dist/src/modules/table/filterTransformers.js.map +1 -0
  373. package/dist/src/types.d.ts +8 -3
  374. package/dist/src/types.js +0 -1
  375. package/package.json +8 -6
  376. package/dist/translations/en/web-ui.json +0 -209
  377. package/dist/tsconfig.lib.tsbuildinfo +0 -1
@@ -1,153 +1,193 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from "@heroui/react";
3
- import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
4
- import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
5
- import { useQuery, useQueryClient } from "@tanstack/react-query";
6
1
  import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from "@heroui/react";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
7
4
  import { useTranslation } from "react-i18next";
8
5
  import { toast } from "sonner";
6
+ import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
7
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
8
+ import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
9
+ //#region src/modules/auth/components/OrganizationSettingsRoute.tsx
9
10
  function OrganizationStateCard({ title, message }) {
10
- return (_jsx("div", { className: "p-6", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "text-lg font-semibold", children: title }), _jsx(CardBody, { children: message })] }) }));
11
+ return /* @__PURE__ */ jsx("div", {
12
+ className: "p-6",
13
+ children: /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsx(CardHeader, {
14
+ className: "text-lg font-semibold",
15
+ children: title
16
+ }), /* @__PURE__ */ jsx(CardBody, { children: message })] })
17
+ });
11
18
  }
12
- function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries, }) {
13
- const { data: session, registerSession } = useSession();
14
- const queryClient = useQueryClient();
15
- const activeOrganizationId = session?.session.activeOrganizationId ?? "";
16
- const activeOrganizationRole = session?.session?.activeOrganizationRole ??
17
- "";
18
- const managerRoleSet = useMemo(() => new Set(managerRoles ?? ["admin", "owner"]), [managerRoles]);
19
- const canManageOrganization = managerRoleSet.has(activeOrganizationRole);
20
- const refreshOrganizationQueries = useCallback(async () => {
21
- await Promise.allSettled([
22
- queryClient.invalidateQueries({ queryKey: ["auth-organization-list"] }),
23
- queryClient.invalidateQueries({
24
- queryKey: ["auth-organization-details", activeOrganizationId],
25
- }),
26
- queryClient.invalidateQueries({
27
- queryKey: ["auth-organization-members", activeOrganizationId],
28
- }),
29
- queryClient.invalidateQueries({
30
- queryKey: ["auth-organization-invitations", activeOrganizationId],
31
- }),
32
- ]);
33
- registerSession(() => {
34
- void onInvalidateScopedQueries?.();
35
- });
36
- }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);
37
- return {
38
- activeOrganizationId,
39
- activeOrganizationRole,
40
- canManageOrganization,
41
- refreshOrganizationQueries,
42
- };
19
+ function useOrganizationAccess({ managerRoles, onInvalidateScopedQueries }) {
20
+ const { data: session, registerSession } = useSession();
21
+ const queryClient = useQueryClient();
22
+ const activeOrganizationId = session?.session.activeOrganizationId ?? "";
23
+ const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
24
+ return {
25
+ activeOrganizationId,
26
+ activeOrganizationRole,
27
+ canManageOrganization: useMemo(() => new Set(managerRoles ?? ["admin", "owner"]), [managerRoles]).has(activeOrganizationRole),
28
+ refreshOrganizationQueries: useCallback(async () => {
29
+ await Promise.allSettled([
30
+ queryClient.invalidateQueries({ queryKey: ["auth-organization-list"] }),
31
+ queryClient.invalidateQueries({ queryKey: ["auth-organization-details", activeOrganizationId] }),
32
+ queryClient.invalidateQueries({ queryKey: ["auth-organization-members", activeOrganizationId] }),
33
+ queryClient.invalidateQueries({ queryKey: ["auth-organization-invitations", activeOrganizationId] })
34
+ ]);
35
+ registerSession(() => {
36
+ onInvalidateScopedQueries?.();
37
+ });
38
+ }, [
39
+ activeOrganizationId,
40
+ onInvalidateScopedQueries,
41
+ queryClient,
42
+ registerSession
43
+ ])
44
+ };
43
45
  }
44
46
  function useOrganizationConfig() {
45
- const { t } = useTranslation();
46
- const translatedLabels = useMemo(() => ({
47
- settingsTitle: t("web-ui:organization.settings.title"),
48
- settingsDescription: t("web-ui:organization.settings.description"),
49
- settingsNoActive: t("web-ui:organization.settings.noActive"),
50
- settingsManageOnly: t("web-ui:organization.settings.manageOnly"),
51
- formName: t("web-ui:organization.settings.form.name"),
52
- formSlug: t("web-ui:organization.settings.form.slug"),
53
- formMetadata: t("web-ui:organization.settings.form.metadata"),
54
- formMetadataInvalidJson: t("web-ui:organization.settings.form.metadataInvalidJson"),
55
- formMetadataInvalid: t("web-ui:organization.settings.form.metadataInvalid"),
56
- saveButton: t("web-ui:organization.settings.button.save"),
57
- updateSuccess: t("web-ui:organization.settings.updateSuccess"),
58
- updateError: t("web-ui:organization.settings.updateError"),
59
- loadError: t("web-ui:organization.settings.loadError"),
60
- }), [t]);
61
- const translatedRoleLabels = useMemo(() => ({
62
- member: t("web-ui:organization.roles.member"),
63
- admin: t("web-ui:organization.roles.admin"),
64
- owner: t("web-ui:organization.roles.owner"),
65
- }), [t]);
66
- return { resolvedLabels: translatedLabels, resolvedRoleLabels: translatedRoleLabels };
47
+ const { t } = useTranslation();
48
+ return {
49
+ resolvedLabels: useMemo(() => ({
50
+ settingsTitle: t("web-ui:organization.settings.title"),
51
+ settingsDescription: t("web-ui:organization.settings.description"),
52
+ settingsNoActive: t("web-ui:organization.settings.noActive"),
53
+ settingsManageOnly: t("web-ui:organization.settings.manageOnly"),
54
+ formName: t("web-ui:organization.settings.form.name"),
55
+ formSlug: t("web-ui:organization.settings.form.slug"),
56
+ formMetadata: t("web-ui:organization.settings.form.metadata"),
57
+ formMetadataInvalidJson: t("web-ui:organization.settings.form.metadataInvalidJson"),
58
+ formMetadataInvalid: t("web-ui:organization.settings.form.metadataInvalid"),
59
+ saveButton: t("web-ui:organization.settings.button.save"),
60
+ updateSuccess: t("web-ui:organization.settings.updateSuccess"),
61
+ updateError: t("web-ui:organization.settings.updateError"),
62
+ loadError: t("web-ui:organization.settings.loadError")
63
+ }), [t]),
64
+ resolvedRoleLabels: useMemo(() => ({
65
+ member: t("web-ui:organization.roles.member"),
66
+ admin: t("web-ui:organization.roles.admin"),
67
+ owner: t("web-ui:organization.roles.owner")
68
+ }), [t])
69
+ };
67
70
  }
68
- export function OrganizationSettingsRoute({ managerRoles, onInvalidateScopedQueries, }) {
69
- const { resolvedLabels, resolvedRoleLabels } = useOrganizationConfig();
70
- const { activeOrganizationId, activeOrganizationRole, canManageOrganization, refreshOrganizationQueries, } = useOrganizationAccess({ managerRoles, onInvalidateScopedQueries });
71
- const [organizationName, setOrganizationName] = useState("");
72
- const [organizationSlug, setOrganizationSlug] = useState("");
73
- const [organizationMetadata, setOrganizationMetadata] = useState("{}");
74
- const [isSavingOrganization, setIsSavingOrganization] = useState(false);
75
- const organizationQuery = useQuery({
76
- queryKey: ["auth-organization-details", activeOrganizationId],
77
- enabled: Boolean(activeOrganizationId && canManageOrganization),
78
- queryFn: async () => {
79
- const { data, error } = await authClient.organization.getFullOrganization({
80
- query: {
81
- organizationId: activeOrganizationId,
82
- membersLimit: 200,
83
- },
84
- });
85
- if (error) {
86
- throw new Error(error.message ?? resolvedLabels.loadError);
87
- }
88
- return data;
89
- },
90
- });
91
- useEffect(() => {
92
- const organization = organizationQuery.data;
93
- if (!organization) {
94
- return;
95
- }
96
- setOrganizationName(organization.name ?? "");
97
- setOrganizationSlug(organization.slug ?? "");
98
- setOrganizationMetadata(JSON.stringify(organization.metadata ?? {}, null, 2));
99
- }, [organizationQuery.data]);
100
- const onUpdateOrganization = async () => {
101
- if (!canManageOrganization || !activeOrganizationId) {
102
- return;
103
- }
104
- try {
105
- setIsSavingOrganization(true);
106
- let parsedMetadata;
107
- try {
108
- parsedMetadata = organizationMetadata.trim()
109
- ? JSON.parse(organizationMetadata)
110
- : {};
111
- }
112
- catch (parseError) {
113
- const message = parseError instanceof SyntaxError
114
- ? resolvedLabels.formMetadataInvalidJson
115
- : parseError instanceof Error
116
- ? parseError.message
117
- : resolvedLabels.formMetadataInvalid;
118
- throw new Error(message);
119
- }
120
- const { error } = await authClient.organization.update({
121
- organizationId: activeOrganizationId,
122
- data: {
123
- name: organizationName.trim(),
124
- slug: organizationSlug.trim(),
125
- metadata: parsedMetadata,
126
- },
127
- });
128
- if (error) {
129
- throw new Error(error.message ?? resolvedLabels.updateError);
130
- }
131
- await refreshOrganizationQueries();
132
- toast.success(resolvedLabels.updateSuccess);
133
- }
134
- catch (error) {
135
- toast.error(error instanceof Error ? error.message : resolvedLabels.updateError);
136
- }
137
- finally {
138
- setIsSavingOrganization(false);
139
- }
140
- };
141
- if (!activeOrganizationId) {
142
- return (_jsx(OrganizationStateCard, { title: resolvedLabels.settingsTitle, message: resolvedLabels.settingsNoActive }));
143
- }
144
- if (!canManageOrganization) {
145
- return (_jsx(OrganizationStateCard, { title: resolvedLabels.settingsTitle, message: resolvedLabels.settingsManageOnly }));
146
- }
147
- if (organizationQuery.isLoading) {
148
- return (_jsx("div", { className: "p-6 flex justify-center", children: _jsx(Spinner, {}) }));
149
- }
150
- return (_jsx("div", { className: "p-6", children: _jsxs(Card, { children: [_jsxs(CardHeader, { className: "flex items-center justify-between", children: [_jsxs("div", { className: "flex flex-col", children: [_jsx("h2", { className: "text-xl font-semibold", children: resolvedLabels.settingsTitle }), _jsx("p", { className: "text-sm text-default-500", children: resolvedLabels.settingsDescription })] }), _jsx(Chip, { variant: "flat", color: "primary", children: resolvedRoleLabels[activeOrganizationRole] ??
151
- activeOrganizationRole ??
152
- resolvedRoleLabels.member })] }), _jsxs(CardBody, { className: "grid gap-3", children: [_jsx(Input, { label: resolvedLabels.formName, value: organizationName, onValueChange: setOrganizationName }), _jsx(Input, { label: resolvedLabels.formSlug, value: organizationSlug, onValueChange: setOrganizationSlug }), _jsx(Textarea, { label: resolvedLabels.formMetadata, value: organizationMetadata, onValueChange: setOrganizationMetadata, minRows: 4 }), _jsx("div", { className: "flex justify-end", children: _jsx(Button, { color: "primary", isLoading: isSavingOrganization, onPress: onUpdateOrganization, children: resolvedLabels.saveButton }) })] })] }) }));
71
+ function OrganizationSettingsRoute({ managerRoles, onInvalidateScopedQueries }) {
72
+ const { resolvedLabels, resolvedRoleLabels } = useOrganizationConfig();
73
+ const { activeOrganizationId, activeOrganizationRole, canManageOrganization, refreshOrganizationQueries } = useOrganizationAccess({
74
+ managerRoles,
75
+ onInvalidateScopedQueries
76
+ });
77
+ const [organizationName, setOrganizationName] = useState("");
78
+ const [organizationSlug, setOrganizationSlug] = useState("");
79
+ const [organizationMetadata, setOrganizationMetadata] = useState("{}");
80
+ const [isSavingOrganization, setIsSavingOrganization] = useState(false);
81
+ const organizationQuery = useQuery({
82
+ queryKey: ["auth-organization-details", activeOrganizationId],
83
+ enabled: Boolean(activeOrganizationId && canManageOrganization),
84
+ queryFn: async () => {
85
+ const { data, error } = await authClient.organization.getFullOrganization({ query: {
86
+ organizationId: activeOrganizationId,
87
+ membersLimit: 200
88
+ } });
89
+ if (error) throw new Error(error.message ?? resolvedLabels.loadError);
90
+ return data;
91
+ }
92
+ });
93
+ useEffect(() => {
94
+ const organization = organizationQuery.data;
95
+ if (!organization) return;
96
+ setOrganizationName(organization.name ?? "");
97
+ setOrganizationSlug(organization.slug ?? "");
98
+ setOrganizationMetadata(JSON.stringify(organization.metadata ?? {}, null, 2));
99
+ }, [organizationQuery.data]);
100
+ const onUpdateOrganization = async () => {
101
+ if (!canManageOrganization || !activeOrganizationId) return;
102
+ try {
103
+ setIsSavingOrganization(true);
104
+ let parsedMetadata;
105
+ try {
106
+ parsedMetadata = organizationMetadata.trim() ? JSON.parse(organizationMetadata) : {};
107
+ } catch (parseError) {
108
+ const message = parseError instanceof SyntaxError ? resolvedLabels.formMetadataInvalidJson : parseError instanceof Error ? parseError.message : resolvedLabels.formMetadataInvalid;
109
+ throw new Error(message);
110
+ }
111
+ const { error } = await authClient.organization.update({
112
+ organizationId: activeOrganizationId,
113
+ data: {
114
+ name: organizationName.trim(),
115
+ slug: organizationSlug.trim(),
116
+ metadata: parsedMetadata
117
+ }
118
+ });
119
+ if (error) throw new Error(error.message ?? resolvedLabels.updateError);
120
+ await refreshOrganizationQueries();
121
+ toast.success(resolvedLabels.updateSuccess);
122
+ } catch (error) {
123
+ toast.error(error instanceof Error ? error.message : resolvedLabels.updateError);
124
+ } finally {
125
+ setIsSavingOrganization(false);
126
+ }
127
+ };
128
+ if (!activeOrganizationId) return /* @__PURE__ */ jsx(OrganizationStateCard, {
129
+ title: resolvedLabels.settingsTitle,
130
+ message: resolvedLabels.settingsNoActive
131
+ });
132
+ if (!canManageOrganization) return /* @__PURE__ */ jsx(OrganizationStateCard, {
133
+ title: resolvedLabels.settingsTitle,
134
+ message: resolvedLabels.settingsManageOnly
135
+ });
136
+ if (organizationQuery.isLoading) return /* @__PURE__ */ jsx("div", {
137
+ className: "p-6 flex justify-center",
138
+ children: /* @__PURE__ */ jsx(Spinner, {})
139
+ });
140
+ return /* @__PURE__ */ jsx("div", {
141
+ className: "p-6",
142
+ children: /* @__PURE__ */ jsxs(Card, { children: [/* @__PURE__ */ jsxs(CardHeader, {
143
+ className: "flex items-center justify-between",
144
+ children: [/* @__PURE__ */ jsxs("div", {
145
+ className: "flex flex-col",
146
+ children: [/* @__PURE__ */ jsx("h2", {
147
+ className: "text-xl font-semibold",
148
+ children: resolvedLabels.settingsTitle
149
+ }), /* @__PURE__ */ jsx("p", {
150
+ className: "text-sm text-default-500",
151
+ children: resolvedLabels.settingsDescription
152
+ })]
153
+ }), /* @__PURE__ */ jsx(Chip, {
154
+ variant: "flat",
155
+ color: "primary",
156
+ children: resolvedRoleLabels[activeOrganizationRole] ?? activeOrganizationRole ?? resolvedRoleLabels.member
157
+ })]
158
+ }), /* @__PURE__ */ jsxs(CardBody, {
159
+ className: "grid gap-3",
160
+ children: [
161
+ /* @__PURE__ */ jsx(Input, {
162
+ label: resolvedLabels.formName,
163
+ value: organizationName,
164
+ onValueChange: setOrganizationName
165
+ }),
166
+ /* @__PURE__ */ jsx(Input, {
167
+ label: resolvedLabels.formSlug,
168
+ value: organizationSlug,
169
+ onValueChange: setOrganizationSlug
170
+ }),
171
+ /* @__PURE__ */ jsx(Textarea, {
172
+ label: resolvedLabels.formMetadata,
173
+ value: organizationMetadata,
174
+ onValueChange: setOrganizationMetadata,
175
+ minRows: 4
176
+ }),
177
+ /* @__PURE__ */ jsx("div", {
178
+ className: "flex justify-end",
179
+ children: /* @__PURE__ */ jsx(Button, {
180
+ color: "primary",
181
+ isLoading: isSavingOrganization,
182
+ onPress: onUpdateOrganization,
183
+ children: resolvedLabels.saveButton
184
+ })
185
+ })
186
+ ]
187
+ })] })
188
+ });
153
189
  }
190
+ //#endregion
191
+ export { OrganizationSettingsRoute };
192
+
193
+ //# sourceMappingURL=OrganizationSettingsRoute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationSettingsRoute.js","names":[],"sources":["../../../../../src/modules/auth/components/OrganizationSettingsRoute.tsx"],"sourcesContent":["import { Button, Card, CardBody, CardHeader, Chip, Input, Spinner, Textarea } from \"@heroui/react\";\r\nimport { authClient } from \"@m5kdev/frontend/modules/auth/auth.lib\";\r\nimport { useSession } from \"@m5kdev/frontend/modules/auth/hooks/useSession\";\r\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { toast } from \"sonner\";\r\n\r\ntype OrganizationDetails = {\r\n id: string;\r\n name: string;\r\n slug: string;\r\n logo?: string | null;\r\n metadata?: Record<string, unknown> | null;\r\n};\r\n\r\nexport type OrganizationSettingsRouteLabels = {\r\n settingsTitle: string;\r\n settingsDescription: string;\r\n settingsNoActive: string;\r\n settingsManageOnly: string;\r\n formName: string;\r\n formSlug: string;\r\n formMetadata: string;\r\n formMetadataInvalidJson: string;\r\n formMetadataInvalid: string;\r\n saveButton: string;\r\n updateSuccess: string;\r\n updateError: string;\r\n loadError: string;\r\n};\r\n\r\nexport type OrganizationSettingsRouteProps = {\r\n managerRoles?: string[];\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n};\r\n\r\nfunction OrganizationStateCard({ title, message }: { title: string; message: string }) {\r\n return (\r\n <div className=\"p-6\">\r\n <Card>\r\n <CardHeader className=\"text-lg font-semibold\">{title}</CardHeader>\r\n <CardBody>{message}</CardBody>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n\r\nfunction useOrganizationAccess({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: Pick<OrganizationSettingsRouteProps, \"managerRoles\" | \"onInvalidateScopedQueries\">) {\r\n const { data: session, registerSession } = useSession();\r\n const queryClient = useQueryClient();\r\n\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? \"\";\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles ?? [\"admin\", \"owner\"]), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const refreshOrganizationQueries = useCallback(async () => {\r\n await Promise.allSettled([\r\n queryClient.invalidateQueries({ queryKey: [\"auth-organization-list\"] }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-members\", activeOrganizationId],\r\n }),\r\n queryClient.invalidateQueries({\r\n queryKey: [\"auth-organization-invitations\", activeOrganizationId],\r\n }),\r\n ]);\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n }, [activeOrganizationId, onInvalidateScopedQueries, queryClient, registerSession]);\r\n\r\n return {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n };\r\n}\r\n\r\nfunction useOrganizationConfig() {\r\n const { t } = useTranslation();\r\n\r\n const translatedLabels = useMemo<OrganizationSettingsRouteLabels>(\r\n () => ({\r\n settingsTitle: t(\"web-ui:organization.settings.title\"),\r\n settingsDescription: t(\"web-ui:organization.settings.description\"),\r\n settingsNoActive: t(\"web-ui:organization.settings.noActive\"),\r\n settingsManageOnly: t(\"web-ui:organization.settings.manageOnly\"),\r\n formName: t(\"web-ui:organization.settings.form.name\"),\r\n formSlug: t(\"web-ui:organization.settings.form.slug\"),\r\n formMetadata: t(\"web-ui:organization.settings.form.metadata\"),\r\n formMetadataInvalidJson: t(\"web-ui:organization.settings.form.metadataInvalidJson\"),\r\n formMetadataInvalid: t(\"web-ui:organization.settings.form.metadataInvalid\"),\r\n saveButton: t(\"web-ui:organization.settings.button.save\"),\r\n updateSuccess: t(\"web-ui:organization.settings.updateSuccess\"),\r\n updateError: t(\"web-ui:organization.settings.updateError\"),\r\n loadError: t(\"web-ui:organization.settings.loadError\"),\r\n }),\r\n [t]\r\n );\r\n\r\n const translatedRoleLabels = useMemo<Record<string, string>>(\r\n () => ({\r\n member: t(\"web-ui:organization.roles.member\"),\r\n admin: t(\"web-ui:organization.roles.admin\"),\r\n owner: t(\"web-ui:organization.roles.owner\"),\r\n }),\r\n [t]\r\n );\r\n\r\n return { resolvedLabels: translatedLabels, resolvedRoleLabels: translatedRoleLabels };\r\n}\r\n\r\nexport function OrganizationSettingsRoute({\r\n managerRoles,\r\n onInvalidateScopedQueries,\r\n}: OrganizationSettingsRouteProps) {\r\n const { resolvedLabels, resolvedRoleLabels } = useOrganizationConfig();\r\n\r\n const {\r\n activeOrganizationId,\r\n activeOrganizationRole,\r\n canManageOrganization,\r\n refreshOrganizationQueries,\r\n } = useOrganizationAccess({ managerRoles, onInvalidateScopedQueries });\r\n\r\n const [organizationName, setOrganizationName] = useState(\"\");\r\n const [organizationSlug, setOrganizationSlug] = useState(\"\");\r\n const [organizationMetadata, setOrganizationMetadata] = useState(\"{}\");\r\n const [isSavingOrganization, setIsSavingOrganization] = useState(false);\r\n\r\n const organizationQuery = useQuery({\r\n queryKey: [\"auth-organization-details\", activeOrganizationId],\r\n enabled: Boolean(activeOrganizationId && canManageOrganization),\r\n queryFn: async () => {\r\n const { data, error } = await authClient.organization.getFullOrganization({\r\n query: {\r\n organizationId: activeOrganizationId,\r\n membersLimit: 200,\r\n },\r\n });\r\n if (error) {\r\n throw new Error(error.message ?? resolvedLabels.loadError);\r\n }\r\n return data as OrganizationDetails | null;\r\n },\r\n });\r\n\r\n useEffect(() => {\r\n const organization = organizationQuery.data;\r\n if (!organization) {\r\n return;\r\n }\r\n\r\n setOrganizationName(organization.name ?? \"\");\r\n setOrganizationSlug(organization.slug ?? \"\");\r\n setOrganizationMetadata(JSON.stringify(organization.metadata ?? {}, null, 2));\r\n }, [organizationQuery.data]);\r\n\r\n const onUpdateOrganization = async () => {\r\n if (!canManageOrganization || !activeOrganizationId) {\r\n return;\r\n }\r\n\r\n try {\r\n setIsSavingOrganization(true);\r\n let parsedMetadata: Record<string, unknown>;\r\n try {\r\n parsedMetadata = organizationMetadata.trim()\r\n ? (JSON.parse(organizationMetadata) as Record<string, unknown>)\r\n : {};\r\n } catch (parseError) {\r\n const message =\r\n parseError instanceof SyntaxError\r\n ? resolvedLabels.formMetadataInvalidJson\r\n : parseError instanceof Error\r\n ? parseError.message\r\n : resolvedLabels.formMetadataInvalid;\r\n throw new Error(message);\r\n }\r\n\r\n const { error } = await authClient.organization.update({\r\n organizationId: activeOrganizationId,\r\n data: {\r\n name: organizationName.trim(),\r\n slug: organizationSlug.trim(),\r\n metadata: parsedMetadata,\r\n },\r\n });\r\n\r\n if (error) {\r\n throw new Error(error.message ?? resolvedLabels.updateError);\r\n }\r\n\r\n await refreshOrganizationQueries();\r\n toast.success(resolvedLabels.updateSuccess);\r\n } catch (error) {\r\n toast.error(error instanceof Error ? error.message : resolvedLabels.updateError);\r\n } finally {\r\n setIsSavingOrganization(false);\r\n }\r\n };\r\n\r\n if (!activeOrganizationId) {\r\n return (\r\n <OrganizationStateCard\r\n title={resolvedLabels.settingsTitle}\r\n message={resolvedLabels.settingsNoActive}\r\n />\r\n );\r\n }\r\n\r\n if (!canManageOrganization) {\r\n return (\r\n <OrganizationStateCard\r\n title={resolvedLabels.settingsTitle}\r\n message={resolvedLabels.settingsManageOnly}\r\n />\r\n );\r\n }\r\n\r\n if (organizationQuery.isLoading) {\r\n return (\r\n <div className=\"p-6 flex justify-center\">\r\n <Spinner />\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"p-6\">\r\n <Card>\r\n <CardHeader className=\"flex items-center justify-between\">\r\n <div className=\"flex flex-col\">\r\n <h2 className=\"text-xl font-semibold\">{resolvedLabels.settingsTitle}</h2>\r\n <p className=\"text-sm text-default-500\">{resolvedLabels.settingsDescription}</p>\r\n </div>\r\n <Chip variant=\"flat\" color=\"primary\">\r\n {resolvedRoleLabels[activeOrganizationRole] ??\r\n activeOrganizationRole ??\r\n resolvedRoleLabels.member}\r\n </Chip>\r\n </CardHeader>\r\n <CardBody className=\"grid gap-3\">\r\n <Input\r\n label={resolvedLabels.formName}\r\n value={organizationName}\r\n onValueChange={setOrganizationName}\r\n />\r\n <Input\r\n label={resolvedLabels.formSlug}\r\n value={organizationSlug}\r\n onValueChange={setOrganizationSlug}\r\n />\r\n <Textarea\r\n label={resolvedLabels.formMetadata}\r\n value={organizationMetadata}\r\n onValueChange={setOrganizationMetadata}\r\n minRows={4}\r\n />\r\n <div className=\"flex justify-end\">\r\n <Button color=\"primary\" isLoading={isSavingOrganization} onPress={onUpdateOrganization}>\r\n {resolvedLabels.saveButton}\r\n </Button>\r\n </div>\r\n </CardBody>\r\n </Card>\r\n </div>\r\n );\r\n}\r\n"],"mappings":"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"}
@@ -1,7 +1,18 @@
1
- export type OrganizationSwitcherProps = {
2
- onInvalidateScopedQueries?: () => void | Promise<void>;
3
- managerRoles?: string[];
4
- managerPath?: string;
5
- fallbackPath?: string;
1
+ import * as _$react_jsx_runtime0 from "react/jsx-runtime";
2
+
3
+ //#region src/modules/auth/components/OrganizationSwitcher.d.ts
4
+ type OrganizationSwitcherProps = {
5
+ onInvalidateScopedQueries?: () => void | Promise<void>;
6
+ managerRoles?: string[];
7
+ managerPath?: string;
8
+ fallbackPath?: string;
6
9
  };
7
- export declare function OrganizationSwitcher({ onInvalidateScopedQueries, managerRoles, managerPath, fallbackPath, }: OrganizationSwitcherProps): import("react/jsx-runtime").JSX.Element;
10
+ declare function OrganizationSwitcher({
11
+ onInvalidateScopedQueries,
12
+ managerRoles,
13
+ managerPath,
14
+ fallbackPath
15
+ }: OrganizationSwitcherProps): _$react_jsx_runtime0.JSX.Element;
16
+ //#endregion
17
+ export { OrganizationSwitcher, OrganizationSwitcherProps };
18
+ //# sourceMappingURL=OrganizationSwitcher.d.ts.map
@@ -1,74 +1,96 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { cn } from "../../../lib/utils.js";
2
+ import { useSidebar } from "../../../components/ui/sidebar.js";
3
+ import { useCallback, useMemo, useState } from "react";
2
4
  import { Button, Select, SelectItem } from "@heroui/react";
3
- import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
4
- import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
5
- import { useQuery } from "@tanstack/react-query";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Building2 } from "lucide-react";
7
- import { useCallback, useMemo, useState } from "react";
8
7
  import { useTranslation } from "react-i18next";
9
- import { Link } from "react-router";
8
+ import { Link as Link$1 } from "react-router";
10
9
  import { toast } from "sonner";
11
- import { useSidebar } from "../../../components/ui/sidebar";
12
- import { cn } from "../../../lib/utils";
13
- export function OrganizationSwitcher({ onInvalidateScopedQueries, managerRoles = ["admin", "owner"], managerPath = "/organization/members", fallbackPath = "/", }) {
14
- const { t } = useTranslation();
15
- const { data: session, registerSession } = useSession();
16
- const { open } = useSidebar();
17
- const [isSwitching, setIsSwitching] = useState(false);
18
- const activeOrganizationId = session?.session.activeOrganizationId ?? null;
19
- const activeOrganizationRole = session?.session?.activeOrganizationRole ??
20
- "";
21
- const managerRoleSet = useMemo(() => new Set(managerRoles), [managerRoles]);
22
- const canManageOrganization = managerRoleSet.has(activeOrganizationRole);
23
- const { data: organizations = [], isError, error, refetch, } = useQuery({
24
- queryKey: ["auth-organization-list"],
25
- queryFn: async () => {
26
- const { data, error } = await authClient.organization.list();
27
- if (error) {
28
- throw new Error(error.message ?? t("web-ui:organization.switcher.failedToLoadOrganizations"));
29
- }
30
- return (data ?? []);
31
- },
32
- });
33
- const handleSwitchOrganization = useCallback(async (organizationId) => {
34
- if (!organizationId || organizationId === activeOrganizationId || isSwitching) {
35
- return;
36
- }
37
- try {
38
- setIsSwitching(true);
39
- const { error } = await authClient.organization.setActive({ organizationId });
40
- if (error) {
41
- throw new Error(error.message ?? t("web-ui:organization.switcher.failedToSwitchOrganization"));
42
- }
43
- registerSession(() => {
44
- void onInvalidateScopedQueries?.();
45
- });
46
- toast.success(t("web-ui:organization.switcher.organizationSwitched"));
47
- }
48
- catch (error) {
49
- toast.error(error instanceof Error
50
- ? error.message
51
- : t("web-ui:organization.switcher.failedToSwitchOrganization"));
52
- }
53
- finally {
54
- setIsSwitching(false);
55
- }
56
- }, [activeOrganizationId, isSwitching, onInvalidateScopedQueries, registerSession, t]);
57
- if (!open) {
58
- return (_jsx(Button, { as: Link, to: canManageOrganization ? managerPath : fallbackPath, variant: "light", size: "sm", isIconOnly: true, "aria-label": t("web-ui:organization.switcher.label"), children: _jsx(Building2, { className: "h-4 w-4" }) }));
59
- }
60
- if (isError) {
61
- return (_jsxs("div", { className: "mb-4 flex flex-col gap-2", children: [_jsx("p", { className: "text-sm text-destructive", children: error instanceof Error
62
- ? error.message
63
- : t("web-ui:organization.switcher.failedToLoadOrganizations") }), _jsx(Button, { size: "sm", variant: "flat", onPress: () => void refetch(), children: t("web-ui:organization.switcher.retry") })] }));
64
- }
65
- return (_jsx("div", { className: "mb-4", children: _jsx(Select, { size: "sm", label: t("web-ui:organization.switcher.label"), selectedKeys: activeOrganizationId ? [activeOrganizationId] : [], disallowEmptySelection: true, isDisabled: isSwitching || organizations.length === 0, onSelectionChange: (keys) => {
66
- const selectedOrganizationId = Array.from(keys)[0];
67
- if (selectedOrganizationId) {
68
- void handleSwitchOrganization(selectedOrganizationId);
69
- }
70
- }, classNames: {
71
- trigger: cn("min-h-10"),
72
- value: cn("text-sm"),
73
- }, children: organizations.map((organization) => (_jsx(SelectItem, { children: organization.name }, organization.id))) }) }));
10
+ import { authClient } from "@m5kdev/frontend/modules/auth/auth.lib";
11
+ import { useQuery } from "@tanstack/react-query";
12
+ import { useSession } from "@m5kdev/frontend/modules/auth/hooks/useSession";
13
+ //#region src/modules/auth/components/OrganizationSwitcher.tsx
14
+ function OrganizationSwitcher({ onInvalidateScopedQueries, managerRoles = ["admin", "owner"], managerPath = "/organization/members", fallbackPath = "/" }) {
15
+ const { t } = useTranslation();
16
+ const { data: session, registerSession } = useSession();
17
+ const { open } = useSidebar();
18
+ const [isSwitching, setIsSwitching] = useState(false);
19
+ const activeOrganizationId = session?.session.activeOrganizationId ?? null;
20
+ const activeOrganizationRole = (session?.session)?.activeOrganizationRole ?? "";
21
+ const canManageOrganization = useMemo(() => new Set(managerRoles), [managerRoles]).has(activeOrganizationRole);
22
+ const { data: organizations = [], isError, error, refetch } = useQuery({
23
+ queryKey: ["auth-organization-list"],
24
+ queryFn: async () => {
25
+ const { data, error } = await authClient.organization.list();
26
+ if (error) throw new Error(error.message ?? t("web-ui:organization.switcher.failedToLoadOrganizations"));
27
+ return data ?? [];
28
+ }
29
+ });
30
+ const handleSwitchOrganization = useCallback(async (organizationId) => {
31
+ if (!organizationId || organizationId === activeOrganizationId || isSwitching) return;
32
+ try {
33
+ setIsSwitching(true);
34
+ const { error } = await authClient.organization.setActive({ organizationId });
35
+ if (error) throw new Error(error.message ?? t("web-ui:organization.switcher.failedToSwitchOrganization"));
36
+ registerSession(() => {
37
+ onInvalidateScopedQueries?.();
38
+ });
39
+ toast.success(t("web-ui:organization.switcher.organizationSwitched"));
40
+ } catch (error) {
41
+ toast.error(error instanceof Error ? error.message : t("web-ui:organization.switcher.failedToSwitchOrganization"));
42
+ } finally {
43
+ setIsSwitching(false);
44
+ }
45
+ }, [
46
+ activeOrganizationId,
47
+ isSwitching,
48
+ onInvalidateScopedQueries,
49
+ registerSession,
50
+ t
51
+ ]);
52
+ if (!open) return /* @__PURE__ */ jsx(Button, {
53
+ as: Link$1,
54
+ to: canManageOrganization ? managerPath : fallbackPath,
55
+ variant: "light",
56
+ size: "sm",
57
+ isIconOnly: true,
58
+ "aria-label": t("web-ui:organization.switcher.label"),
59
+ children: /* @__PURE__ */ jsx(Building2, { className: "h-4 w-4" })
60
+ });
61
+ if (isError) return /* @__PURE__ */ jsxs("div", {
62
+ className: "mb-4 flex flex-col gap-2",
63
+ children: [/* @__PURE__ */ jsx("p", {
64
+ className: "text-sm text-destructive",
65
+ children: error instanceof Error ? error.message : t("web-ui:organization.switcher.failedToLoadOrganizations")
66
+ }), /* @__PURE__ */ jsx(Button, {
67
+ size: "sm",
68
+ variant: "flat",
69
+ onPress: () => void refetch(),
70
+ children: t("web-ui:organization.switcher.retry")
71
+ })]
72
+ });
73
+ return /* @__PURE__ */ jsx("div", {
74
+ className: "mb-4",
75
+ children: /* @__PURE__ */ jsx(Select, {
76
+ size: "sm",
77
+ label: t("web-ui:organization.switcher.label"),
78
+ selectedKeys: activeOrganizationId ? [activeOrganizationId] : [],
79
+ disallowEmptySelection: true,
80
+ isDisabled: isSwitching || organizations.length === 0,
81
+ onSelectionChange: (keys) => {
82
+ const selectedOrganizationId = Array.from(keys)[0];
83
+ if (selectedOrganizationId) handleSwitchOrganization(selectedOrganizationId);
84
+ },
85
+ classNames: {
86
+ trigger: cn("min-h-10"),
87
+ value: cn("text-sm")
88
+ },
89
+ children: organizations.map((organization) => /* @__PURE__ */ jsx(SelectItem, { children: organization.name }, organization.id))
90
+ })
91
+ });
74
92
  }
93
+ //#endregion
94
+ export { OrganizationSwitcher };
95
+
96
+ //# sourceMappingURL=OrganizationSwitcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationSwitcher.js","names":["Link"],"sources":["../../../../../src/modules/auth/components/OrganizationSwitcher.tsx"],"sourcesContent":["import { Button, Select, SelectItem } from \"@heroui/react\";\r\nimport { authClient } from \"@m5kdev/frontend/modules/auth/auth.lib\";\r\nimport { useSession } from \"@m5kdev/frontend/modules/auth/hooks/useSession\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { Building2 } from \"lucide-react\";\r\nimport { useCallback, useMemo, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { Link } from \"react-router\";\r\nimport { toast } from \"sonner\";\r\nimport { useSidebar } from \"../../../components/ui/sidebar\";\r\nimport { cn } from \"../../../lib/utils\";\r\n\r\ntype OrganizationOption = {\r\n id: string;\r\n name: string;\r\n slug: string;\r\n};\r\n\r\nexport type OrganizationSwitcherProps = {\r\n onInvalidateScopedQueries?: () => void | Promise<void>;\r\n managerRoles?: string[];\r\n managerPath?: string;\r\n fallbackPath?: string;\r\n};\r\n\r\nexport function OrganizationSwitcher({\r\n onInvalidateScopedQueries,\r\n managerRoles = [\"admin\", \"owner\"],\r\n managerPath = \"/organization/members\",\r\n fallbackPath = \"/\",\r\n}: OrganizationSwitcherProps) {\r\n const { t } = useTranslation();\r\n const { data: session, registerSession } = useSession();\r\n const { open } = useSidebar();\r\n const [isSwitching, setIsSwitching] = useState(false);\r\n const activeOrganizationId = session?.session.activeOrganizationId ?? null;\r\n const activeOrganizationRole =\r\n (session?.session as { activeOrganizationRole?: string } | undefined)?.activeOrganizationRole ??\r\n \"\";\r\n const managerRoleSet = useMemo(() => new Set(managerRoles), [managerRoles]);\r\n const canManageOrganization = managerRoleSet.has(activeOrganizationRole);\r\n\r\n const {\r\n data: organizations = [],\r\n isError,\r\n error,\r\n refetch,\r\n } = useQuery({\r\n queryKey: [\"auth-organization-list\"],\r\n queryFn: async () => {\r\n const { data, error } = await authClient.organization.list();\r\n if (error) {\r\n throw new Error(\r\n error.message ?? t(\"web-ui:organization.switcher.failedToLoadOrganizations\")\r\n );\r\n }\r\n return (data ?? []) as OrganizationOption[];\r\n },\r\n });\r\n\r\n const handleSwitchOrganization = useCallback(\r\n async (organizationId: string) => {\r\n if (!organizationId || organizationId === activeOrganizationId || isSwitching) {\r\n return;\r\n }\r\n\r\n try {\r\n setIsSwitching(true);\r\n const { error } = await authClient.organization.setActive({ organizationId });\r\n if (error) {\r\n throw new Error(\r\n error.message ?? t(\"web-ui:organization.switcher.failedToSwitchOrganization\")\r\n );\r\n }\r\n\r\n registerSession(() => {\r\n void onInvalidateScopedQueries?.();\r\n });\r\n toast.success(t(\"web-ui:organization.switcher.organizationSwitched\"));\r\n } catch (error) {\r\n toast.error(\r\n error instanceof Error\r\n ? error.message\r\n : t(\"web-ui:organization.switcher.failedToSwitchOrganization\")\r\n );\r\n } finally {\r\n setIsSwitching(false);\r\n }\r\n },\r\n [activeOrganizationId, isSwitching, onInvalidateScopedQueries, registerSession, t]\r\n );\r\n\r\n if (!open) {\r\n return (\r\n <Button\r\n as={Link}\r\n to={canManageOrganization ? managerPath : fallbackPath}\r\n variant=\"light\"\r\n size=\"sm\"\r\n isIconOnly\r\n aria-label={t(\"web-ui:organization.switcher.label\")}\r\n >\r\n <Building2 className=\"h-4 w-4\" />\r\n </Button>\r\n );\r\n }\r\n\r\n if (isError) {\r\n return (\r\n <div className=\"mb-4 flex flex-col gap-2\">\r\n <p className=\"text-sm text-destructive\">\r\n {error instanceof Error\r\n ? error.message\r\n : t(\"web-ui:organization.switcher.failedToLoadOrganizations\")}\r\n </p>\r\n <Button size=\"sm\" variant=\"flat\" onPress={() => void refetch()}>\r\n {t(\"web-ui:organization.switcher.retry\")}\r\n </Button>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"mb-4\">\r\n <Select\r\n size=\"sm\"\r\n label={t(\"web-ui:organization.switcher.label\")}\r\n selectedKeys={activeOrganizationId ? [activeOrganizationId] : []}\r\n disallowEmptySelection\r\n isDisabled={isSwitching || organizations.length === 0}\r\n onSelectionChange={(keys) => {\r\n const selectedOrganizationId = Array.from(keys as Set<string>)[0];\r\n if (selectedOrganizationId) {\r\n void handleSwitchOrganization(selectedOrganizationId);\r\n }\r\n }}\r\n classNames={{\r\n trigger: cn(\"min-h-10\"),\r\n value: cn(\"text-sm\"),\r\n }}\r\n >\r\n {organizations.map((organization) => (\r\n <SelectItem key={organization.id}>{organization.name}</SelectItem>\r\n ))}\r\n </Select>\r\n </div>\r\n );\r\n}\r\n"],"mappings":";;;;;;;;;;;;;AAyBA,SAAgB,qBAAqB,EACnC,2BACA,eAAe,CAAC,SAAS,QAAQ,EACjC,cAAc,yBACd,eAAe,OACa;CAC5B,MAAM,EAAE,MAAM,gBAAgB;CAC9B,MAAM,EAAE,MAAM,SAAS,oBAAoB,YAAY;CACvD,MAAM,EAAE,SAAS,YAAY;CAC7B,MAAM,CAAC,aAAa,kBAAkB,SAAS,MAAM;CACrD,MAAM,uBAAuB,SAAS,QAAQ,wBAAwB;CACtE,MAAM,0BACH,SAAS,UAA6D,0BACvE;CAEF,MAAM,wBADiB,cAAc,IAAI,IAAI,aAAa,EAAE,CAAC,aAAa,CAAC,CAC9B,IAAI,uBAAuB;CAExE,MAAM,EACJ,MAAM,gBAAgB,EAAE,EACxB,SACA,OACA,YACE,SAAS;EACX,UAAU,CAAC,yBAAyB;EACpC,SAAS,YAAY;GACnB,MAAM,EAAE,MAAM,UAAU,MAAM,WAAW,aAAa,MAAM;AAC5D,OAAI,MACF,OAAM,IAAI,MACR,MAAM,WAAW,EAAE,yDAAyD,CAC7E;AAEH,UAAQ,QAAQ,EAAE;;EAErB,CAAC;CAEF,MAAM,2BAA2B,YAC/B,OAAO,mBAA2B;AAChC,MAAI,CAAC,kBAAkB,mBAAmB,wBAAwB,YAChE;AAGF,MAAI;AACF,kBAAe,KAAK;GACpB,MAAM,EAAE,UAAU,MAAM,WAAW,aAAa,UAAU,EAAE,gBAAgB,CAAC;AAC7E,OAAI,MACF,OAAM,IAAI,MACR,MAAM,WAAW,EAAE,0DAA0D,CAC9E;AAGH,yBAAsB;AACf,iCAA6B;KAClC;AACF,SAAM,QAAQ,EAAE,oDAAoD,CAAC;WAC9D,OAAO;AACd,SAAM,MACJ,iBAAiB,QACb,MAAM,UACN,EAAE,0DAA0D,CACjE;YACO;AACR,kBAAe,MAAM;;IAGzB;EAAC;EAAsB;EAAa;EAA2B;EAAiB;EAAE,CACnF;AAED,KAAI,CAAC,KACH,QACE,oBAAC,QAAD;EACE,IAAIA;EACJ,IAAI,wBAAwB,cAAc;EAC1C,SAAQ;EACR,MAAK;EACL,YAAA;EACA,cAAY,EAAE,qCAAqC;YAEnD,oBAAC,WAAD,EAAW,WAAU,WAAY,CAAA;EAC1B,CAAA;AAIb,KAAI,QACF,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf,CACE,oBAAC,KAAD;GAAG,WAAU;aACV,iBAAiB,QACd,MAAM,UACN,EAAE,yDAAyD;GAC7D,CAAA,EACJ,oBAAC,QAAD;GAAQ,MAAK;GAAK,SAAQ;GAAO,eAAe,KAAK,SAAS;aAC3D,EAAE,qCAAqC;GACjC,CAAA,CACL;;AAIV,QACE,oBAAC,OAAD;EAAK,WAAU;YACb,oBAAC,QAAD;GACE,MAAK;GACL,OAAO,EAAE,qCAAqC;GAC9C,cAAc,uBAAuB,CAAC,qBAAqB,GAAG,EAAE;GAChE,wBAAA;GACA,YAAY,eAAe,cAAc,WAAW;GACpD,oBAAoB,SAAS;IAC3B,MAAM,yBAAyB,MAAM,KAAK,KAAoB,CAAC;AAC/D,QAAI,uBACG,0BAAyB,uBAAuB;;GAGzD,YAAY;IACV,SAAS,GAAG,WAAW;IACvB,OAAO,GAAG,UAAU;IACrB;aAEA,cAAc,KAAK,iBAClB,oBAAC,YAAD,EAAA,UAAmC,aAAa,MAAkB,EAAjD,aAAa,GAAoC,CAClE;GACK,CAAA;EACL,CAAA"}