@burdenoff/microfe-admin 2026.511.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (370) hide show
  1. package/README.md +74 -0
  2. package/dist/admin/AdminRoot.d.ts +31 -0
  3. package/dist/admin/AdminRoot.d.ts.map +1 -0
  4. package/dist/admin/AdminRoot.js +175 -0
  5. package/dist/admin/AdminRoot.js.map +1 -0
  6. package/dist/admin/AdminRoutes.d.ts +29 -0
  7. package/dist/admin/AdminRoutes.d.ts.map +1 -0
  8. package/dist/admin/AdminRoutes.js +143 -0
  9. package/dist/admin/AdminRoutes.js.map +1 -0
  10. package/dist/admin/components/AccessDenied.d.ts +8 -0
  11. package/dist/admin/components/AccessDenied.d.ts.map +1 -0
  12. package/dist/admin/components/AccessDenied.js +28 -0
  13. package/dist/admin/components/AccessDenied.js.map +1 -0
  14. package/dist/admin/components/ActivityFeed.d.ts +20 -0
  15. package/dist/admin/components/ActivityFeed.d.ts.map +1 -0
  16. package/dist/admin/components/ActivityFeed.js +91 -0
  17. package/dist/admin/components/ActivityFeed.js.map +1 -0
  18. package/dist/admin/components/Charts.d.ts +33 -0
  19. package/dist/admin/components/Charts.d.ts.map +1 -0
  20. package/dist/admin/components/Charts.js +37 -0
  21. package/dist/admin/components/Charts.js.map +1 -0
  22. package/dist/admin/components/ConfirmDialog.d.ts +45 -0
  23. package/dist/admin/components/ConfirmDialog.d.ts.map +1 -0
  24. package/dist/admin/components/ConfirmDialog.js +4 -0
  25. package/dist/admin/components/DataTable.d.ts +64 -0
  26. package/dist/admin/components/DataTable.d.ts.map +1 -0
  27. package/dist/admin/components/DataTable.js +127 -0
  28. package/dist/admin/components/DataTable.js.map +1 -0
  29. package/dist/admin/components/FormSheet.d.ts +79 -0
  30. package/dist/admin/components/FormSheet.d.ts.map +1 -0
  31. package/dist/admin/components/FormSheet.js +111 -0
  32. package/dist/admin/components/FormSheet.js.map +1 -0
  33. package/dist/admin/components/MetricCard.d.ts +40 -0
  34. package/dist/admin/components/MetricCard.d.ts.map +1 -0
  35. package/dist/admin/components/MetricCard.js +57 -0
  36. package/dist/admin/components/MetricCard.js.map +1 -0
  37. package/dist/admin/components/PageLayout.d.ts +34 -0
  38. package/dist/admin/components/PageLayout.d.ts.map +1 -0
  39. package/dist/admin/components/PageLayout.js +31 -0
  40. package/dist/admin/components/PageLayout.js.map +1 -0
  41. package/dist/admin/components/PermissionGuard.d.ts +12 -0
  42. package/dist/admin/components/PermissionGuard.d.ts.map +1 -0
  43. package/dist/admin/components/PermissionGuard.js +18 -0
  44. package/dist/admin/components/PermissionGuard.js.map +1 -0
  45. package/dist/admin/components/RowActions.d.ts +41 -0
  46. package/dist/admin/components/RowActions.d.ts.map +1 -0
  47. package/dist/admin/components/RowActions.js +93 -0
  48. package/dist/admin/components/RowActions.js.map +1 -0
  49. package/dist/admin/components/StatusBadge.d.ts +35 -0
  50. package/dist/admin/components/StatusBadge.d.ts.map +1 -0
  51. package/dist/admin/components/StatusBadge.js +41 -0
  52. package/dist/admin/components/StatusBadge.js.map +1 -0
  53. package/dist/admin/components/Toast.d.ts +26 -0
  54. package/dist/admin/components/Toast.d.ts.map +1 -0
  55. package/dist/admin/components/Toast.js +133 -0
  56. package/dist/admin/components/Toast.js.map +1 -0
  57. package/dist/admin/components/forms/SubscriptionForm.d.ts +57 -0
  58. package/dist/admin/components/forms/SubscriptionForm.d.ts.map +1 -0
  59. package/dist/admin/components/forms/SubscriptionForm.js +299 -0
  60. package/dist/admin/components/forms/SubscriptionForm.js.map +1 -0
  61. package/dist/admin/components/forms/TenantForm.d.ts +68 -0
  62. package/dist/admin/components/forms/TenantForm.d.ts.map +1 -0
  63. package/dist/admin/components/forms/TenantForm.js +346 -0
  64. package/dist/admin/components/forms/TenantForm.js.map +1 -0
  65. package/dist/admin/components/forms/TicketForm.d.ts +67 -0
  66. package/dist/admin/components/forms/TicketForm.d.ts.map +1 -0
  67. package/dist/admin/components/forms/TicketForm.js +55 -0
  68. package/dist/admin/components/forms/TicketForm.js.map +1 -0
  69. package/dist/admin/components/forms/UserForm.d.ts +57 -0
  70. package/dist/admin/components/forms/UserForm.d.ts.map +1 -0
  71. package/dist/admin/components/forms/UserForm.js +253 -0
  72. package/dist/admin/components/forms/UserForm.js.map +1 -0
  73. package/dist/admin/components/forms/index.d.ts +5 -0
  74. package/dist/admin/components/forms/index.d.ts.map +1 -0
  75. package/dist/admin/components/forms/index.js +4 -0
  76. package/dist/admin/components/index.d.ts +15 -0
  77. package/dist/admin/components/index.d.ts.map +1 -0
  78. package/dist/admin/components/index.js +17 -0
  79. package/dist/admin/components/ui.d.ts +52 -0
  80. package/dist/admin/components/ui.d.ts.map +1 -0
  81. package/dist/admin/components/ui.js +140 -0
  82. package/dist/admin/components/ui.js.map +1 -0
  83. package/dist/admin/constants/index.d.ts +75 -0
  84. package/dist/admin/constants/index.d.ts.map +1 -0
  85. package/dist/admin/constants/index.js +90 -0
  86. package/dist/admin/constants/index.js.map +1 -0
  87. package/dist/admin/constants/permissions.d.ts +27 -0
  88. package/dist/admin/constants/permissions.d.ts.map +1 -0
  89. package/dist/admin/constants/permissions.js +23 -0
  90. package/dist/admin/constants/permissions.js.map +1 -0
  91. package/dist/admin/hooks/useAdminPermissions.d.ts +30 -0
  92. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  93. package/dist/admin/hooks/useAdminPermissions.js +56 -0
  94. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  95. package/dist/admin/index.d.ts +31 -0
  96. package/dist/admin/index.d.ts.map +1 -0
  97. package/dist/admin/index.js +9 -0
  98. package/dist/admin/pages/AuditLogsPage.d.ts +5 -0
  99. package/dist/admin/pages/AuditLogsPage.d.ts.map +1 -0
  100. package/dist/admin/pages/AuditLogsPage.js +209 -0
  101. package/dist/admin/pages/AuditLogsPage.js.map +1 -0
  102. package/dist/admin/pages/BillingPage.d.ts +2 -0
  103. package/dist/admin/pages/BillingPage.d.ts.map +1 -0
  104. package/dist/admin/pages/BillingPage.js +164 -0
  105. package/dist/admin/pages/BillingPage.js.map +1 -0
  106. package/dist/admin/pages/CommunicationsPage.d.ts +2 -0
  107. package/dist/admin/pages/CommunicationsPage.d.ts.map +1 -0
  108. package/dist/admin/pages/CommunicationsPage.js +118 -0
  109. package/dist/admin/pages/CommunicationsPage.js.map +1 -0
  110. package/dist/admin/pages/DashboardPage.d.ts +5 -0
  111. package/dist/admin/pages/DashboardPage.d.ts.map +1 -0
  112. package/dist/admin/pages/DashboardPage.js +121 -0
  113. package/dist/admin/pages/DashboardPage.js.map +1 -0
  114. package/dist/admin/pages/FeatureFlagsPage.d.ts +2 -0
  115. package/dist/admin/pages/FeatureFlagsPage.d.ts.map +1 -0
  116. package/dist/admin/pages/FeatureFlagsPage.js +116 -0
  117. package/dist/admin/pages/FeatureFlagsPage.js.map +1 -0
  118. package/dist/admin/pages/OrganizationsListPage.d.ts +2 -0
  119. package/dist/admin/pages/OrganizationsListPage.d.ts.map +1 -0
  120. package/dist/admin/pages/OrganizationsListPage.js +112 -0
  121. package/dist/admin/pages/OrganizationsListPage.js.map +1 -0
  122. package/dist/admin/pages/ProductsPage.d.ts +5 -0
  123. package/dist/admin/pages/ProductsPage.d.ts.map +1 -0
  124. package/dist/admin/pages/ProductsPage.js +392 -0
  125. package/dist/admin/pages/ProductsPage.js.map +1 -0
  126. package/dist/admin/pages/ReferralsPage.d.ts +2 -0
  127. package/dist/admin/pages/ReferralsPage.d.ts.map +1 -0
  128. package/dist/admin/pages/ReferralsPage.js +272 -0
  129. package/dist/admin/pages/ReferralsPage.js.map +1 -0
  130. package/dist/admin/pages/RolesPermissionsPage.d.ts +2 -0
  131. package/dist/admin/pages/RolesPermissionsPage.d.ts.map +1 -0
  132. package/dist/admin/pages/RolesPermissionsPage.js +145 -0
  133. package/dist/admin/pages/RolesPermissionsPage.js.map +1 -0
  134. package/dist/admin/pages/SREPage.d.ts +5 -0
  135. package/dist/admin/pages/SREPage.d.ts.map +1 -0
  136. package/dist/admin/pages/SREPage.js +405 -0
  137. package/dist/admin/pages/SREPage.js.map +1 -0
  138. package/dist/admin/pages/SandboxSettingsPage.d.ts +7 -0
  139. package/dist/admin/pages/SandboxSettingsPage.d.ts.map +1 -0
  140. package/dist/admin/pages/SandboxSettingsPage.js +497 -0
  141. package/dist/admin/pages/SandboxSettingsPage.js.map +1 -0
  142. package/dist/admin/pages/SettingsPage.d.ts +5 -0
  143. package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
  144. package/dist/admin/pages/SettingsPage.js +279 -0
  145. package/dist/admin/pages/SettingsPage.js.map +1 -0
  146. package/dist/admin/pages/TenantDetailPage.d.ts +5 -0
  147. package/dist/admin/pages/TenantDetailPage.d.ts.map +1 -0
  148. package/dist/admin/pages/TenantDetailPage.js +274 -0
  149. package/dist/admin/pages/TenantDetailPage.js.map +1 -0
  150. package/dist/admin/pages/TenantFormRoutePage.d.ts +6 -0
  151. package/dist/admin/pages/TenantFormRoutePage.d.ts.map +1 -0
  152. package/dist/admin/pages/TenantFormRoutePage.js +136 -0
  153. package/dist/admin/pages/TenantFormRoutePage.js.map +1 -0
  154. package/dist/admin/pages/TenantsListPage.d.ts +5 -0
  155. package/dist/admin/pages/TenantsListPage.d.ts.map +1 -0
  156. package/dist/admin/pages/TenantsListPage.js +339 -0
  157. package/dist/admin/pages/TenantsListPage.js.map +1 -0
  158. package/dist/admin/pages/UsersListPage.d.ts +5 -0
  159. package/dist/admin/pages/UsersListPage.d.ts.map +1 -0
  160. package/dist/admin/pages/UsersListPage.js +250 -0
  161. package/dist/admin/pages/UsersListPage.js.map +1 -0
  162. package/dist/admin/pages/WaitlistPage.d.ts +2 -0
  163. package/dist/admin/pages/WaitlistPage.d.ts.map +1 -0
  164. package/dist/admin/pages/WaitlistPage.js +241 -0
  165. package/dist/admin/pages/WaitlistPage.js.map +1 -0
  166. package/dist/admin/pages/WorkflowsPage.d.ts +2 -0
  167. package/dist/admin/pages/WorkflowsPage.d.ts.map +1 -0
  168. package/dist/admin/pages/WorkflowsPage.js +126 -0
  169. package/dist/admin/pages/WorkflowsPage.js.map +1 -0
  170. package/dist/admin/pages/WorkspacesListPage.d.ts +2 -0
  171. package/dist/admin/pages/WorkspacesListPage.d.ts.map +1 -0
  172. package/dist/admin/pages/WorkspacesListPage.js +100 -0
  173. package/dist/admin/pages/WorkspacesListPage.js.map +1 -0
  174. package/dist/admin/pages/index.d.ts +20 -0
  175. package/dist/admin/pages/index.d.ts.map +1 -0
  176. package/dist/admin/pages/index.js +19 -0
  177. package/dist/admin/providers/AdminProvider.d.ts +13 -0
  178. package/dist/admin/providers/AdminProvider.d.ts.map +1 -0
  179. package/dist/admin/providers/AdminProvider.js +43 -0
  180. package/dist/admin/providers/AdminProvider.js.map +1 -0
  181. package/dist/admin/schemas/index.d.ts +409 -0
  182. package/dist/admin/schemas/index.d.ts.map +1 -0
  183. package/dist/admin/schemas/index.js +111 -0
  184. package/dist/admin/schemas/index.js.map +1 -0
  185. package/dist/admin/store/adminStore.d.ts +28 -0
  186. package/dist/admin/store/adminStore.d.ts.map +1 -0
  187. package/dist/admin/store/adminStore.js +48 -0
  188. package/dist/admin/store/adminStore.js.map +1 -0
  189. package/dist/admin/types/index.d.ts +325 -0
  190. package/dist/admin/types/index.d.ts.map +1 -0
  191. package/dist/admin/utils/cn.d.ts +7 -0
  192. package/dist/admin/utils/cn.d.ts.map +1 -0
  193. package/dist/admin/utils/cn.js +10 -0
  194. package/dist/admin/utils/cn.js.map +1 -0
  195. package/dist/admin/utils/directActivityGraphql.d.ts +11 -0
  196. package/dist/admin/utils/directActivityGraphql.d.ts.map +1 -0
  197. package/dist/admin/utils/directActivityGraphql.js +25 -0
  198. package/dist/admin/utils/directActivityGraphql.js.map +1 -0
  199. package/dist/admin/utils/formatters.d.ts +33 -0
  200. package/dist/admin/utils/formatters.d.ts.map +1 -0
  201. package/dist/admin/utils/formatters.js +54 -0
  202. package/dist/admin/utils/formatters.js.map +1 -0
  203. package/dist/admin/utils/gatewayGraphql.d.ts +9 -0
  204. package/dist/admin/utils/gatewayGraphql.d.ts.map +1 -0
  205. package/dist/admin/utils/i18n.d.ts +6 -0
  206. package/dist/admin/utils/i18n.d.ts.map +1 -0
  207. package/dist/admin/utils/i18n.js +15 -0
  208. package/dist/admin/utils/i18n.js.map +1 -0
  209. package/dist/admin/utils/mappers.d.ts +15 -0
  210. package/dist/admin/utils/mappers.d.ts.map +1 -0
  211. package/dist/admin/utils/mappers.js +73 -0
  212. package/dist/admin/utils/mappers.js.map +1 -0
  213. package/dist/admin/utils/navigation.d.ts +9 -0
  214. package/dist/admin/utils/navigation.d.ts.map +1 -0
  215. package/dist/admin/utils/navigation.js +8 -0
  216. package/dist/admin/utils/navigation.js.map +1 -0
  217. package/dist/admin/utils/tenantEvents.d.ts +11 -0
  218. package/dist/admin/utils/tenantEvents.d.ts.map +1 -0
  219. package/dist/admin/utils/tenantEvents.js +8 -0
  220. package/dist/admin/utils/tenantEvents.js.map +1 -0
  221. package/dist/dev/main.d.ts +2 -0
  222. package/dist/dev/main.d.ts.map +1 -0
  223. package/dist/generated/global-operations.d.ts +2749 -0
  224. package/dist/generated/global-operations.d.ts.map +1 -0
  225. package/dist/generated/global-operations.js +907 -0
  226. package/dist/generated/global-operations.js.map +1 -0
  227. package/dist/generated/global-types.d.ts +20773 -0
  228. package/dist/generated/global-types.d.ts.map +1 -0
  229. package/dist/generated/global-types.js +12 -0
  230. package/dist/generated/global-types.js.map +1 -0
  231. package/dist/generated/wspace-operations.d.ts +132 -0
  232. package/dist/generated/wspace-operations.d.ts.map +1 -0
  233. package/dist/generated/wspace-operations.js +65 -0
  234. package/dist/generated/wspace-operations.js.map +1 -0
  235. package/dist/generated/wspace-types.d.ts +53363 -0
  236. package/dist/generated/wspace-types.d.ts.map +1 -0
  237. package/dist/index.d.ts +6 -0
  238. package/dist/index.d.ts.map +1 -0
  239. package/dist/index.js +10 -0
  240. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +34 -0
  241. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -0
  242. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +118 -0
  243. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -0
  244. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  245. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  246. package/dist/node_modules/date-fns/_lib/addLeadingZeros.js +8 -0
  247. package/dist/node_modules/date-fns/_lib/addLeadingZeros.js.map +1 -0
  248. package/dist/node_modules/date-fns/_lib/defaultOptions.js +9 -0
  249. package/dist/node_modules/date-fns/_lib/defaultOptions.js.map +1 -0
  250. package/dist/node_modules/date-fns/_lib/format/formatters.js +384 -0
  251. package/dist/node_modules/date-fns/_lib/format/formatters.js.map +1 -0
  252. package/dist/node_modules/date-fns/_lib/format/lightFormatters.js +45 -0
  253. package/dist/node_modules/date-fns/_lib/format/lightFormatters.js.map +1 -0
  254. package/dist/node_modules/date-fns/_lib/format/longFormatters.js +42 -0
  255. package/dist/node_modules/date-fns/_lib/format/longFormatters.js.map +1 -0
  256. package/dist/node_modules/date-fns/_lib/getRoundingMethod.js +11 -0
  257. package/dist/node_modules/date-fns/_lib/getRoundingMethod.js.map +1 -0
  258. package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js +10 -0
  259. package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js.map +1 -0
  260. package/dist/node_modules/date-fns/_lib/normalizeDates.js +10 -0
  261. package/dist/node_modules/date-fns/_lib/normalizeDates.js.map +1 -0
  262. package/dist/node_modules/date-fns/_lib/protectedTokens.js +25 -0
  263. package/dist/node_modules/date-fns/_lib/protectedTokens.js.map +1 -0
  264. package/dist/node_modules/date-fns/compareAsc.js +10 -0
  265. package/dist/node_modules/date-fns/compareAsc.js.map +1 -0
  266. package/dist/node_modules/date-fns/constants.js +8 -0
  267. package/dist/node_modules/date-fns/constants.js.map +1 -0
  268. package/dist/node_modules/date-fns/constructFrom.js +9 -0
  269. package/dist/node_modules/date-fns/constructFrom.js.map +1 -0
  270. package/dist/node_modules/date-fns/constructNow.js +9 -0
  271. package/dist/node_modules/date-fns/constructNow.js.map +1 -0
  272. package/dist/node_modules/date-fns/differenceInCalendarDays.js +13 -0
  273. package/dist/node_modules/date-fns/differenceInCalendarDays.js.map +1 -0
  274. package/dist/node_modules/date-fns/differenceInCalendarMonths.js +10 -0
  275. package/dist/node_modules/date-fns/differenceInCalendarMonths.js.map +1 -0
  276. package/dist/node_modules/date-fns/differenceInMilliseconds.js +9 -0
  277. package/dist/node_modules/date-fns/differenceInMilliseconds.js.map +1 -0
  278. package/dist/node_modules/date-fns/differenceInMonths.js +18 -0
  279. package/dist/node_modules/date-fns/differenceInMonths.js.map +1 -0
  280. package/dist/node_modules/date-fns/differenceInSeconds.js +11 -0
  281. package/dist/node_modules/date-fns/differenceInSeconds.js.map +1 -0
  282. package/dist/node_modules/date-fns/endOfDay.js +10 -0
  283. package/dist/node_modules/date-fns/endOfDay.js.map +1 -0
  284. package/dist/node_modules/date-fns/endOfMonth.js +10 -0
  285. package/dist/node_modules/date-fns/endOfMonth.js.map +1 -0
  286. package/dist/node_modules/date-fns/format.js +61 -0
  287. package/dist/node_modules/date-fns/format.js.map +1 -0
  288. package/dist/node_modules/date-fns/formatDistance.js +39 -0
  289. package/dist/node_modules/date-fns/formatDistance.js.map +1 -0
  290. package/dist/node_modules/date-fns/formatDistanceToNow.js +10 -0
  291. package/dist/node_modules/date-fns/formatDistanceToNow.js.map +1 -0
  292. package/dist/node_modules/date-fns/getDayOfYear.js +12 -0
  293. package/dist/node_modules/date-fns/getDayOfYear.js.map +1 -0
  294. package/dist/node_modules/date-fns/getISOWeek.js +13 -0
  295. package/dist/node_modules/date-fns/getISOWeek.js.map +1 -0
  296. package/dist/node_modules/date-fns/getISOWeekYear.js +16 -0
  297. package/dist/node_modules/date-fns/getISOWeekYear.js.map +1 -0
  298. package/dist/node_modules/date-fns/getWeek.js +13 -0
  299. package/dist/node_modules/date-fns/getWeek.js.map +1 -0
  300. package/dist/node_modules/date-fns/getWeekYear.js +17 -0
  301. package/dist/node_modules/date-fns/getWeekYear.js.map +1 -0
  302. package/dist/node_modules/date-fns/isDate.js +8 -0
  303. package/dist/node_modules/date-fns/isDate.js.map +1 -0
  304. package/dist/node_modules/date-fns/isLastDayOfMonth.js +12 -0
  305. package/dist/node_modules/date-fns/isLastDayOfMonth.js.map +1 -0
  306. package/dist/node_modules/date-fns/isValid.js +10 -0
  307. package/dist/node_modules/date-fns/isValid.js.map +1 -0
  308. package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
  309. package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
  310. package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +19 -0
  311. package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
  312. package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js +24 -0
  313. package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
  314. package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +20 -0
  315. package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
  316. package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +71 -0
  317. package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
  318. package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js +34 -0
  319. package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
  320. package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +13 -0
  321. package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
  322. package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js +204 -0
  323. package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
  324. package/dist/node_modules/date-fns/locale/en-US/_lib/match.js +126 -0
  325. package/dist/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
  326. package/dist/node_modules/date-fns/locale/en-US.js +22 -0
  327. package/dist/node_modules/date-fns/locale/en-US.js.map +1 -0
  328. package/dist/node_modules/date-fns/parseISO.js +119 -0
  329. package/dist/node_modules/date-fns/parseISO.js.map +1 -0
  330. package/dist/node_modules/date-fns/startOfDay.js +10 -0
  331. package/dist/node_modules/date-fns/startOfDay.js.map +1 -0
  332. package/dist/node_modules/date-fns/startOfISOWeek.js +12 -0
  333. package/dist/node_modules/date-fns/startOfISOWeek.js.map +1 -0
  334. package/dist/node_modules/date-fns/startOfISOWeekYear.js +12 -0
  335. package/dist/node_modules/date-fns/startOfISOWeekYear.js.map +1 -0
  336. package/dist/node_modules/date-fns/startOfWeek.js +11 -0
  337. package/dist/node_modules/date-fns/startOfWeek.js.map +1 -0
  338. package/dist/node_modules/date-fns/startOfWeekYear.js +13 -0
  339. package/dist/node_modules/date-fns/startOfWeekYear.js.map +1 -0
  340. package/dist/node_modules/date-fns/startOfYear.js +10 -0
  341. package/dist/node_modules/date-fns/startOfYear.js.map +1 -0
  342. package/dist/node_modules/date-fns/toDate.js +9 -0
  343. package/dist/node_modules/date-fns/toDate.js.map +1 -0
  344. package/dist/node_modules/react-hook-form/dist/index.esm.js +1210 -0
  345. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
  346. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  347. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  348. package/dist/node_modules/zod/v3/ZodError.js +82 -0
  349. package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
  350. package/dist/node_modules/zod/v3/errors.js +10 -0
  351. package/dist/node_modules/zod/v3/errors.js.map +1 -0
  352. package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
  353. package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
  354. package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
  355. package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
  356. package/dist/node_modules/zod/v3/helpers/util.js +76 -0
  357. package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
  358. package/dist/node_modules/zod/v3/locales/en.js +62 -0
  359. package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
  360. package/dist/node_modules/zod/v3/types.js +2459 -0
  361. package/dist/node_modules/zod/v3/types.js.map +1 -0
  362. package/dist/node_modules/zod/v4/core/core.js +35 -0
  363. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  364. package/dist/node_modules/zod/v4/core/errors.js +24 -0
  365. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  366. package/dist/node_modules/zod/v4/core/parse.js +29 -0
  367. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  368. package/dist/node_modules/zod/v4/core/util.js +20 -0
  369. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  370. package/package.json +111 -0
@@ -0,0 +1,112 @@
1
+ import { Button as e, EmptyState as t, Input as n } from "../components/ui.js";
2
+ import { PageLayout as r } from "../components/PageLayout.js";
3
+ import "../components/index.js";
4
+ import { useListOrganizationsQuery as i, useUpdateOrganizationMutation as a } from "../../generated/global-operations.js";
5
+ import { useState as o } from "react";
6
+ import { Building as s, Loader2 as c, Plus as l, Search as u } from "lucide-react";
7
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
8
+ //#region src/admin/pages/OrganizationsListPage.tsx
9
+ function p() {
10
+ let [p, m] = o(""), { data: h, loading: g, refetch: _ } = i({ variables: {
11
+ filter: p ? { search: p } : void 0,
12
+ limit: 50
13
+ } }), [v] = a(), y = async (e, t) => {
14
+ await v({ variables: {
15
+ id: e,
16
+ input: { status: t === "ACTIVE" ? "INACTIVE" : "ACTIVE" }
17
+ } }), _();
18
+ }, b = h?.organizations?.items || [];
19
+ return /* @__PURE__ */ d(r, {
20
+ title: "Organizations",
21
+ description: "Manage and monitor platform organizations",
22
+ actions: /* @__PURE__ */ f(e, { children: [/* @__PURE__ */ d(l, { className: "mr-2 h-4 w-4" }), "Create Organization"] }),
23
+ children: /* @__PURE__ */ f("div", {
24
+ className: "space-y-4",
25
+ children: [/* @__PURE__ */ d("div", {
26
+ className: "flex items-center justify-between",
27
+ children: /* @__PURE__ */ f("div", {
28
+ className: "relative max-w-sm flex-1",
29
+ children: [/* @__PURE__ */ d(u, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ d(n, {
30
+ placeholder: "Search organizations...",
31
+ className: "pl-9",
32
+ value: p,
33
+ onChange: (e) => m(e.target.value)
34
+ })]
35
+ })
36
+ }), g ? /* @__PURE__ */ d("div", {
37
+ className: "flex h-64 items-center justify-center",
38
+ children: /* @__PURE__ */ d(c, { className: "h-8 w-8 animate-spin text-muted-foreground" })
39
+ }) : b.length > 0 ? /* @__PURE__ */ d("div", {
40
+ className: "rounded-md border",
41
+ children: /* @__PURE__ */ f("table", {
42
+ className: "w-full text-sm",
43
+ children: [/* @__PURE__ */ d("thead", { children: /* @__PURE__ */ f("tr", {
44
+ className: "border-b bg-muted/50 text-left",
45
+ children: [
46
+ /* @__PURE__ */ d("th", {
47
+ className: "p-4 font-medium",
48
+ children: "Name"
49
+ }),
50
+ /* @__PURE__ */ d("th", {
51
+ className: "p-4 font-medium",
52
+ children: "Slug"
53
+ }),
54
+ /* @__PURE__ */ d("th", {
55
+ className: "p-4 font-medium",
56
+ children: "Status"
57
+ }),
58
+ /* @__PURE__ */ d("th", {
59
+ className: "p-4 font-medium",
60
+ children: "Created At"
61
+ }),
62
+ /* @__PURE__ */ d("th", {
63
+ className: "p-4 font-medium text-right",
64
+ children: "Actions"
65
+ })
66
+ ]
67
+ }) }), /* @__PURE__ */ d("tbody", { children: b.map((t) => /* @__PURE__ */ f("tr", {
68
+ className: "border-b transition-colors hover:bg-muted/50",
69
+ children: [
70
+ /* @__PURE__ */ d("td", {
71
+ className: "p-4 font-medium",
72
+ children: t.name
73
+ }),
74
+ /* @__PURE__ */ d("td", {
75
+ className: "p-4 text-muted-foreground",
76
+ children: t.slug
77
+ }),
78
+ /* @__PURE__ */ d("td", {
79
+ className: "p-4",
80
+ children: /* @__PURE__ */ d("span", {
81
+ className: `inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ${t.status === "ACTIVE" ? "bg-green-100 text-green-800" : "bg-red-100 text-red-800"}`,
82
+ children: t.status
83
+ })
84
+ }),
85
+ /* @__PURE__ */ d("td", {
86
+ className: "p-4 text-muted-foreground",
87
+ children: new Date(t.createdAt).toLocaleDateString()
88
+ }),
89
+ /* @__PURE__ */ d("td", {
90
+ className: "p-4 text-right",
91
+ children: /* @__PURE__ */ d(e, {
92
+ variant: "outline",
93
+ size: "sm",
94
+ onClick: () => y(t.id, t.status),
95
+ children: "Toggle Status"
96
+ })
97
+ })
98
+ ]
99
+ }, t.id)) })]
100
+ })
101
+ }) : /* @__PURE__ */ d(t, {
102
+ icon: /* @__PURE__ */ d(s, { className: "h-8 w-8" }),
103
+ title: "No organizations found",
104
+ description: "Organizations will appear here when they are created"
105
+ })]
106
+ })
107
+ });
108
+ }
109
+ //#endregion
110
+ export { p as OrganizationsListPage };
111
+
112
+ //# sourceMappingURL=OrganizationsListPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrganizationsListPage.js","names":[],"sources":["../../../src/admin/pages/OrganizationsListPage.tsx"],"sourcesContent":["import { Building, Search, Plus, Loader2 } from 'lucide-react';\nimport { PageLayout, Input, Button, EmptyState } from '../components';\nimport {\n useListOrganizationsQuery,\n useUpdateOrganizationMutation,\n} from '../../generated/global-operations';\nimport { useState } from 'react';\n\nexport function OrganizationsListPage() {\n const [searchTerm, setSearchTerm] = useState('');\n const { data, loading, refetch } = useListOrganizationsQuery({\n variables: {\n filter: searchTerm ? { search: searchTerm } : undefined,\n limit: 50,\n },\n });\n\n const [updateOrganization] = useUpdateOrganizationMutation();\n\n const handleToggleStatus = async (id: string, currentStatus: string) => {\n const newStatus = currentStatus === 'ACTIVE' ? 'INACTIVE' : 'ACTIVE';\n await updateOrganization({\n variables: {\n id,\n input: { status: newStatus },\n },\n });\n refetch();\n };\n\n const organizations = data?.organizations?.items || [];\n\n return (\n <PageLayout\n title=\"Organizations\"\n description=\"Manage and monitor platform organizations\"\n actions={\n <Button>\n <Plus className=\"mr-2 h-4 w-4\" />\n Create Organization\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex items-center justify-between\">\n <div className=\"relative max-w-sm flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search organizations...\"\n className=\"pl-9\"\n value={searchTerm}\n onChange={(e) => setSearchTerm(e.target.value)}\n />\n </div>\n </div>\n\n {loading ? (\n <div className=\"flex h-64 items-center justify-center\">\n <Loader2 className=\"h-8 w-8 animate-spin text-muted-foreground\" />\n </div>\n ) : organizations.length > 0 ? (\n <div className=\"rounded-md border\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b bg-muted/50 text-left\">\n <th className=\"p-4 font-medium\">Name</th>\n <th className=\"p-4 font-medium\">Slug</th>\n <th className=\"p-4 font-medium\">Status</th>\n <th className=\"p-4 font-medium\">Created At</th>\n <th className=\"p-4 font-medium text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {organizations.map((org: any) => (\n <tr key={org.id} className=\"border-b transition-colors hover:bg-muted/50\">\n <td className=\"p-4 font-medium\">{org.name}</td>\n <td className=\"p-4 text-muted-foreground\">{org.slug}</td>\n <td className=\"p-4\">\n <span\n className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ${\n org.status === 'ACTIVE'\n ? 'bg-green-100 text-green-800'\n : 'bg-red-100 text-red-800'\n }`}\n >\n {org.status}\n </span>\n </td>\n <td className=\"p-4 text-muted-foreground\">\n {new Date(org.createdAt).toLocaleDateString()}\n </td>\n <td className=\"p-4 text-right\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={() => handleToggleStatus(org.id, org.status)}\n >\n Toggle Status\n </Button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n ) : (\n <EmptyState\n icon={<Building className=\"h-8 w-8\" />}\n title=\"No organizations found\"\n description=\"Organizations will appear here when they are created\"\n />\n )}\n </div>\n </PageLayout>\n );\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,IAAwB;CACtC,IAAM,CAAC,GAAY,KAAiB,EAAS,GAAG,EAC1C,EAAE,SAAM,YAAS,eAAY,EAA0B,EAC3D,WAAW;EACT,QAAQ,IAAa,EAAE,QAAQ,GAAY,GAAG,KAAA;EAC9C,OAAO;EACR,EACF,CAAC,EAEI,CAAC,KAAsB,GAA+B,EAEtD,IAAqB,OAAO,GAAY,MAA0B;AAQtE,EANA,MAAM,EAAmB,EACvB,WAAW;GACT;GACA,OAAO,EAAE,QAJK,MAAkB,WAAW,aAAa,UAI5B;GAC7B,EACF,CAAC,EACF,GAAS;IAGL,IAAgB,GAAM,eAAe,SAAS,EAAE;AAEtD,QACE,kBAAC,GAAD;EACE,OAAM;EACN,aAAY;EACZ,SACE,kBAAC,GAAD,EAAA,UAAA,CACE,kBAAC,GAAD,EAAM,WAAU,gBAAiB,CAAA,EAAA,sBAE1B,EAAA,CAAA;YAGX,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,kBAAC,GAAD;MACE,aAAY;MACZ,WAAU;MACV,OAAO;MACP,WAAW,MAAM,EAAc,EAAE,OAAO,MAAM;MAC9C,CAAA,CACE;;IACF,CAAA,EAEL,IACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD,EAAS,WAAU,8CAA+C,CAAA;IAC9D,CAAA,GACJ,EAAc,SAAS,IACzB,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;MAAI,WAAU;gBAAd;OACE,kBAAC,MAAD;QAAI,WAAU;kBAAkB;QAAS,CAAA;OACzC,kBAAC,MAAD;QAAI,WAAU;kBAAkB;QAAS,CAAA;OACzC,kBAAC,MAAD;QAAI,WAAU;kBAAkB;QAAW,CAAA;OAC3C,kBAAC,MAAD;QAAI,WAAU;kBAAkB;QAAe,CAAA;OAC/C,kBAAC,MAAD;QAAI,WAAU;kBAA6B;QAAY,CAAA;OACpD;SACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAc,KAAK,MAClB,kBAAC,MAAD;MAAiB,WAAU;gBAA3B;OACE,kBAAC,MAAD;QAAI,WAAU;kBAAmB,EAAI;QAAU,CAAA;OAC/C,kBAAC,MAAD;QAAI,WAAU;kBAA6B,EAAI;QAAU,CAAA;OACzD,kBAAC,MAAD;QAAI,WAAU;kBACZ,kBAAC,QAAD;SACE,WAAW,6EACT,EAAI,WAAW,WACX,gCACA;mBAGL,EAAI;SACA,CAAA;QACJ,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBACX,IAAI,KAAK,EAAI,UAAU,CAAC,oBAAoB;QAC1C,CAAA;OACL,kBAAC,MAAD;QAAI,WAAU;kBACZ,kBAAC,GAAD;SACE,SAAQ;SACR,MAAK;SACL,eAAe,EAAmB,EAAI,IAAI,EAAI,OAAO;mBACtD;SAEQ,CAAA;QACN,CAAA;OACF;QA1BI,EAAI,GA0BR,CACL,EACI,CAAA,CACF;;IACJ,CAAA,GAEN,kBAAC,GAAD;IACE,MAAM,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;IACtC,OAAM;IACN,aAAY;IACZ,CAAA,CAEA;;EACK,CAAA"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Products page — connected to real backend
3
+ */
4
+ export declare function ProductsPage(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=ProductsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/ProductsPage.tsx"],"names":[],"mappings":"AA6QA;;GAEG;AACH,wBAAgB,YAAY,4CAgO3B"}
@@ -0,0 +1,392 @@
1
+ import { useAdminPermissions as e } from "../hooks/useAdminPermissions.js";
2
+ import { Badge as t, Button as n, EmptyState as r, Input as i } from "../components/ui.js";
3
+ import { PageLayout as a } from "../components/PageLayout.js";
4
+ import { formatDate as o } from "../utils/formatters.js";
5
+ import { MetricCard as s, MetricsGrid as c } from "../components/MetricCard.js";
6
+ import { DataTable as l, Pagination as u } from "../components/DataTable.js";
7
+ import { PermissionGuard as d } from "../components/PermissionGuard.js";
8
+ import "../components/index.js";
9
+ import { useGetPlatformProductStatsQuery as f, useListPlatformProductsQuery as p } from "../../generated/global-operations.js";
10
+ import { useCallback as m, useMemo as h, useState as g } from "react";
11
+ import { Database as _, ExternalLink as v, Package as y, Search as b, Server as x } from "lucide-react";
12
+ import { jsx as S, jsxs as C } from "react/jsx-runtime";
13
+ import { gql as w } from "@apollo/client";
14
+ import { useApolloClient as T } from "@apollo/client/react";
15
+ //#region src/admin/pages/ProductsPage.tsx
16
+ var E = 20, D = {
17
+ ACTIVE: "default",
18
+ COMING_SOON: "secondary",
19
+ WAITLIST: "outline",
20
+ DRAFT: "destructive"
21
+ }, O = w`
22
+ ${w`
23
+ fragment AdminSeedPlatformProductFields on PlatformProduct {
24
+ id
25
+ name
26
+ slug
27
+ }
28
+ `}
29
+ query AdminSeedListProducts($limit: Int, $offset: Int) {
30
+ platformProducts(limit: $limit, offset: $offset) {
31
+ items {
32
+ ...AdminSeedPlatformProductFields
33
+ }
34
+ }
35
+ }
36
+ `, k = w`
37
+ mutation AdminSeedCreateProduct($input: CreatePlatformProductInput!) {
38
+ createPlatformProduct(input: $input) {
39
+ id
40
+ slug
41
+ }
42
+ }
43
+ `, A = w`
44
+ mutation AdminSeedUpdateProduct($id: ID!, $input: UpdatePlatformProductInput!) {
45
+ updatePlatformProduct(id: $id, input: $input) {
46
+ id
47
+ slug
48
+ }
49
+ }
50
+ `, j = [
51
+ {
52
+ name: "Workspaces",
53
+ slug: "workspaces",
54
+ description: "Enterprise collaboration and workspace management platform.",
55
+ status: "ACTIVE",
56
+ website: "https://workspaces.burdenoff.com",
57
+ appUrl: "https://app.local.burdenoff.com/",
58
+ docsUrl: "https://docs.burdenoff.com/workspaces",
59
+ githubUrl: "https://github.com/algoshred/workspaces",
60
+ statusPageUrl: "https://status.burdenoff.com",
61
+ contactEmail: "contact@burdenoff.com",
62
+ supportEmail: "support@burdenoff.com",
63
+ contactPhone: "+91-7358445777",
64
+ contactAddress: "Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117",
65
+ seoTitle: "Workspaces - Enterprise Collaboration Platform",
66
+ seoDescription: "The enterprise-grade foundation for collaborative digital workspaces.",
67
+ seoKeywords: "enterprise,collaboration,workspace,saas,multi-tenant",
68
+ socialLinks: {
69
+ twitter: "https://twitter.com/burdenoff",
70
+ github: "https://github.com/algoshred",
71
+ discord: "https://discord.gg/burdenoff",
72
+ linkedin: "https://linkedin.com/company/burdenoff"
73
+ },
74
+ metadata: {
75
+ tagline: "The Enterprise-Grade Foundation for Collaborative Digital Workspaces",
76
+ businessDomain: "Enterprise Collaboration & Workspace Management",
77
+ category: "Core Infrastructure",
78
+ company: "algoshred",
79
+ pricingRange: "$15-$125/user/month"
80
+ }
81
+ },
82
+ {
83
+ name: "VibeControls",
84
+ slug: "vibecontrols",
85
+ description: "Developer control panel for environments, terminals, tunnels, and remote work.",
86
+ status: "ACTIVE",
87
+ website: "https://vibecontrols.com",
88
+ appUrl: "https://vibecontrols.local.burdenoff.com/",
89
+ docsUrl: "https://docs.vibecontrols.com",
90
+ githubUrl: "https://github.com/algoshred/vibecontrols",
91
+ statusPageUrl: "https://status.burdenoff.com",
92
+ contactEmail: "contact@vibecontrols.com",
93
+ supportEmail: "support@burdenoff.com",
94
+ contactPhone: "+91-7358445777",
95
+ contactAddress: "Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117",
96
+ seoTitle: "VibeControls - Developer Environment Management",
97
+ seoDescription: "The Developer's Command Center for Multi-Environment Development",
98
+ seoKeywords: "developer tools,environment management,terminal,remote development,devops",
99
+ socialLinks: {
100
+ twitter: "https://twitter.com/burdenoff",
101
+ github: "https://github.com/algoshred",
102
+ discord: "https://discord.gg/burdenoff",
103
+ linkedin: "https://linkedin.com/company/burdenoff"
104
+ },
105
+ metadata: {
106
+ tagline: "The Developer's Command Center for Multi-Environment Development",
107
+ businessDomain: "Developer Control Panel",
108
+ category: "Core Infrastructure",
109
+ company: "algoshred",
110
+ pricingRange: "$25-$150/user/month"
111
+ }
112
+ },
113
+ {
114
+ name: "FluidGrids",
115
+ slug: "fluidgrids",
116
+ description: "Visual workflow automation platform for building and operating complex workflows.",
117
+ status: "ACTIVE",
118
+ website: "https://fluidgrids.com",
119
+ appUrl: "https://fluidgrids.local.burdenoff.com/",
120
+ docsUrl: "https://docs.fluidgrids.com",
121
+ githubUrl: "https://github.com/algoshred/fluidgrids",
122
+ statusPageUrl: "https://status.burdenoff.com",
123
+ contactEmail: "contact@fluidgrids.com",
124
+ supportEmail: "support@burdenoff.com",
125
+ contactPhone: "+91-7358445777",
126
+ contactAddress: "Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117",
127
+ seoTitle: "FluidGrids - Visual Workflow Automation",
128
+ seoDescription: "The Visual Automation Platform That Scales From Simple Tasks to Enterprise Workflows",
129
+ seoKeywords: "workflow,automation,drag-and-drop,visual,enterprise,integration,process",
130
+ socialLinks: {
131
+ twitter: "https://twitter.com/burdenoff",
132
+ github: "https://github.com/algoshred",
133
+ discord: "https://discord.gg/burdenoff",
134
+ linkedin: "https://linkedin.com/company/burdenoff"
135
+ },
136
+ metadata: {
137
+ tagline: "The Visual Automation Platform That Scales From Simple Tasks to Enterprise Workflows",
138
+ businessDomain: "Visual Workflow Automation Platform",
139
+ category: "Workflow & Automation",
140
+ company: "algoshred",
141
+ pricingRange: "$29-$299/user/month"
142
+ }
143
+ },
144
+ {
145
+ name: "BigConsole",
146
+ slug: "bigconsole",
147
+ description: "AI-first dashboard and data visualization platform.",
148
+ status: "ACTIVE",
149
+ website: "https://bigconsole.com",
150
+ appUrl: "https://bigconsole.local.burdenoff.com/",
151
+ docsUrl: "https://docs.bigconsole.com",
152
+ githubUrl: "https://github.com/algoshred/bigconsole",
153
+ statusPageUrl: "https://status.burdenoff.com",
154
+ contactEmail: "contact@bigconsole.com",
155
+ supportEmail: "support@burdenoff.com",
156
+ contactPhone: "+91-7358445777",
157
+ contactAddress: "Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117",
158
+ seoTitle: "BigConsole - AI Data Visualization Platform",
159
+ seoDescription: "Where Data Becomes Intelligence",
160
+ seoKeywords: "data visualization,business intelligence,AI,dashboard,analytics,reporting",
161
+ socialLinks: {
162
+ twitter: "https://twitter.com/burdenoff",
163
+ github: "https://github.com/algoshred",
164
+ discord: "https://discord.gg/burdenoff",
165
+ linkedin: "https://linkedin.com/company/burdenoff"
166
+ },
167
+ metadata: {
168
+ tagline: "Where Data Becomes Intelligence",
169
+ businessDomain: "Data Visualization and Business Intelligence",
170
+ category: "AI & Intelligence",
171
+ company: "algoshred",
172
+ pricingRange: "$29-$149/user/month"
173
+ }
174
+ },
175
+ {
176
+ name: "Botlit",
177
+ slug: "botlit",
178
+ description: "Enterprise AI agent and bot automation platform.",
179
+ status: "ACTIVE",
180
+ website: "https://botlit.ai",
181
+ appUrl: "https://botlit.local.burdenoff.com/",
182
+ docsUrl: "https://docs.botlit.ai",
183
+ githubUrl: "https://github.com/algoshred/botlit",
184
+ statusPageUrl: "https://status.burdenoff.com",
185
+ contactEmail: "contact@botlit.ai",
186
+ supportEmail: "support@burdenoff.com",
187
+ contactPhone: "+91-7358445777",
188
+ contactAddress: "Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117",
189
+ seoTitle: "Botlit - Enterprise AI Agent Platform",
190
+ seoDescription: "The Enterprise AI Platform That Makes Intelligent Automation Accessible to Everyone",
191
+ seoKeywords: "AI,bots,automation,agentic AI,intelligent automation,chatbot,enterprise AI",
192
+ socialLinks: {
193
+ twitter: "https://twitter.com/burdenoff",
194
+ github: "https://github.com/algoshred",
195
+ discord: "https://discord.gg/burdenoff",
196
+ linkedin: "https://linkedin.com/company/burdenoff"
197
+ },
198
+ metadata: {
199
+ tagline: "The Enterprise AI Platform That Makes Intelligent Automation Accessible to Everyone",
200
+ businessDomain: "AI Platform",
201
+ category: "AI & Intelligence",
202
+ company: "algoshred",
203
+ pricingRange: "$99-$1,999/month"
204
+ }
205
+ }
206
+ ];
207
+ function M() {
208
+ let { canViewProducts: w, isLoading: M } = e(), N = T(), [P, F] = g(1), [I, L] = g(""), [R, z] = g(!1), [B, V] = g(null), [H, U] = g(null), W = M || !w, { data: G } = f({ skip: W }), { data: K, loading: q, error: J, refetch: Y } = p({
209
+ variables: {
210
+ filter: I ? { search: I } : void 0,
211
+ limit: E,
212
+ offset: (P - 1) * E
213
+ },
214
+ fetchPolicy: "cache-and-network",
215
+ skip: W
216
+ }), X = h(() => K?.platformProducts?.items ?? [], [K]), Z = K?.platformProducts?.total ?? 0, Q = Math.ceil(Z / E), $ = G?.platformProductStats, ee = m(async () => {
217
+ z(!0), V(null), U(null);
218
+ try {
219
+ let e = (await N.query({
220
+ query: O,
221
+ variables: {
222
+ limit: 200,
223
+ offset: 0
224
+ },
225
+ fetchPolicy: "network-only"
226
+ })).data?.platformProducts?.items ?? [], t = new Map(e.map((e) => [e.slug, e])), n = 0, r = 0;
227
+ for (let e of j) {
228
+ let i = t.get(e.slug);
229
+ if (i) {
230
+ let t = Object.fromEntries(Object.entries(e).filter(([e]) => e !== "slug"));
231
+ await N.mutate({
232
+ mutation: A,
233
+ variables: {
234
+ id: i.id,
235
+ input: t
236
+ }
237
+ }), r += 1;
238
+ } else await N.mutate({
239
+ mutation: k,
240
+ variables: { input: e }
241
+ }), n += 1;
242
+ }
243
+ V(`Seeded products: ${n} created, ${r} updated.`), await Y();
244
+ } catch (e) {
245
+ U(e instanceof Error ? e.message : "Failed to seed products");
246
+ } finally {
247
+ z(!1);
248
+ }
249
+ }, [N, Y]);
250
+ return /* @__PURE__ */ S(d, {
251
+ allowed: w,
252
+ isLoading: M,
253
+ pageTitle: "Products",
254
+ denyMessage: "You don't have permission to view products.",
255
+ children: /* @__PURE__ */ C(a, {
256
+ title: "Products",
257
+ description: `Platform products and services${Z ? ` · ${Z} total` : ""}`,
258
+ actions: /* @__PURE__ */ C(n, {
259
+ onClick: ee,
260
+ disabled: R,
261
+ children: [/* @__PURE__ */ S(_, { className: "mr-2 h-4 w-4" }), R ? "Seeding..." : "Seed Active Products"]
262
+ }),
263
+ children: [$ && /* @__PURE__ */ C(c, {
264
+ className: "mb-6",
265
+ children: [
266
+ /* @__PURE__ */ S(s, {
267
+ title: "Total Products",
268
+ value: $.total,
269
+ icon: /* @__PURE__ */ S(y, { className: "h-5 w-5" })
270
+ }),
271
+ /* @__PURE__ */ S(s, {
272
+ title: "Active",
273
+ value: $.active,
274
+ icon: /* @__PURE__ */ S(x, { className: "h-5 w-5" })
275
+ }),
276
+ /* @__PURE__ */ S(s, {
277
+ title: "Waitlist",
278
+ value: $.waitlist,
279
+ icon: /* @__PURE__ */ S(y, { className: "h-5 w-5" })
280
+ }),
281
+ /* @__PURE__ */ S(s, {
282
+ title: "Draft",
283
+ value: $.draft,
284
+ icon: /* @__PURE__ */ S(y, { className: "h-5 w-5" })
285
+ })
286
+ ]
287
+ }), /* @__PURE__ */ C("div", {
288
+ className: "space-y-4",
289
+ children: [
290
+ /* @__PURE__ */ C("div", {
291
+ className: "relative max-w-sm",
292
+ children: [/* @__PURE__ */ S(b, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ S(i, {
293
+ placeholder: "Search products...",
294
+ value: I,
295
+ onChange: (e) => {
296
+ F(1), L(e.target.value);
297
+ },
298
+ className: "pl-9"
299
+ })]
300
+ }),
301
+ J && /* @__PURE__ */ C("div", {
302
+ className: "rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
303
+ children: ["Failed to load products: ", J.message]
304
+ }),
305
+ B && /* @__PURE__ */ S("div", {
306
+ className: "rounded-md border border-border bg-muted p-4 text-sm text-foreground",
307
+ children: B
308
+ }),
309
+ H && /* @__PURE__ */ S("div", {
310
+ className: "rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
311
+ children: H
312
+ }),
313
+ /* @__PURE__ */ S(l, {
314
+ columns: [
315
+ {
316
+ key: "name",
317
+ header: "Product",
318
+ render: (e) => /* @__PURE__ */ S("div", {
319
+ className: "flex items-center gap-3",
320
+ children: /* @__PURE__ */ C("div", {
321
+ className: "min-w-0",
322
+ children: [/* @__PURE__ */ C("div", {
323
+ className: "flex items-center gap-2",
324
+ children: [/* @__PURE__ */ S("span", {
325
+ className: "font-medium text-foreground",
326
+ children: e.name
327
+ }), e.appUrl && /* @__PURE__ */ S("a", {
328
+ href: e.appUrl,
329
+ target: "_blank",
330
+ rel: "noopener noreferrer",
331
+ onClick: (e) => e.stopPropagation(),
332
+ children: /* @__PURE__ */ S(v, { className: "h-3 w-3 text-muted-foreground hover:text-foreground" })
333
+ })]
334
+ }), /* @__PURE__ */ S("div", {
335
+ className: "truncate text-xs text-muted-foreground",
336
+ children: e.slug
337
+ })]
338
+ })
339
+ })
340
+ },
341
+ {
342
+ key: "status",
343
+ header: "Status",
344
+ width: "110px",
345
+ render: (e) => /* @__PURE__ */ S(t, {
346
+ variant: D[e.status] ?? "outline",
347
+ className: "text-xs capitalize",
348
+ children: e.status.toLowerCase().replace("_", " ")
349
+ })
350
+ },
351
+ {
352
+ key: "activeUsers",
353
+ header: "Users",
354
+ width: "80px",
355
+ align: "right",
356
+ render: (e) => /* @__PURE__ */ S("span", {
357
+ className: "text-sm",
358
+ children: e.activeUsers
359
+ })
360
+ },
361
+ {
362
+ key: "updatedAt",
363
+ header: "Updated",
364
+ width: "110px",
365
+ render: (e) => o(e.updatedAt)
366
+ }
367
+ ],
368
+ data: X,
369
+ keyExtractor: (e) => e.id,
370
+ loading: q,
371
+ emptyState: /* @__PURE__ */ S(r, {
372
+ icon: /* @__PURE__ */ S(y, { className: "h-8 w-8" }),
373
+ title: "No products found",
374
+ description: "No platform products match your search"
375
+ })
376
+ }),
377
+ Z > E && /* @__PURE__ */ S(u, {
378
+ page: P,
379
+ totalPages: Q,
380
+ totalItems: Z,
381
+ pageSize: E,
382
+ onPageChange: F
383
+ })
384
+ ]
385
+ })]
386
+ })
387
+ });
388
+ }
389
+ //#endregion
390
+ export { M as ProductsPage };
391
+
392
+ //# sourceMappingURL=ProductsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProductsPage.js","names":[],"sources":["../../../src/admin/pages/ProductsPage.tsx"],"sourcesContent":["import { useState, useMemo, useCallback } from 'react';\nimport { gql } from '@apollo/client';\nimport { useApolloClient } from '@apollo/client/react';\nimport { Package, Search, ExternalLink, Server, Database } from 'lucide-react';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport {\n PageLayout,\n Input,\n DataTable,\n Pagination,\n EmptyState,\n MetricCard,\n MetricsGrid,\n Badge,\n Button,\n PermissionGuard,\n} from '../components';\nimport { formatDate } from '../utils/formatters';\nimport {\n useListPlatformProductsQuery,\n useGetPlatformProductStatsQuery,\n} from '../../generated/global-operations';\n\nconst PAGE_SIZE = 20;\n\ntype ProductStatus = 'ACTIVE' | 'COMING_SOON' | 'WAITLIST' | 'DRAFT';\n\nconst STATUS_VARIANT: Record<ProductStatus, 'default' | 'secondary' | 'outline' | 'destructive'> = {\n ACTIVE: 'default',\n COMING_SOON: 'secondary',\n WAITLIST: 'outline',\n DRAFT: 'destructive',\n};\n\nconst PLATFORM_PRODUCT_FIELDS = gql`\n fragment AdminSeedPlatformProductFields on PlatformProduct {\n id\n name\n slug\n }\n`;\n\nconst UPSERT_PRODUCTS_QUERY = gql`\n ${PLATFORM_PRODUCT_FIELDS}\n query AdminSeedListProducts($limit: Int, $offset: Int) {\n platformProducts(limit: $limit, offset: $offset) {\n items {\n ...AdminSeedPlatformProductFields\n }\n }\n }\n`;\n\nconst CREATE_PRODUCT_MUTATION = gql`\n mutation AdminSeedCreateProduct($input: CreatePlatformProductInput!) {\n createPlatformProduct(input: $input) {\n id\n slug\n }\n }\n`;\n\nconst UPDATE_PRODUCT_MUTATION = gql`\n mutation AdminSeedUpdateProduct($id: ID!, $input: UpdatePlatformProductInput!) {\n updatePlatformProduct(id: $id, input: $input) {\n id\n slug\n }\n }\n`;\n\ntype SeedProductInput = {\n name: string;\n slug: string;\n description: string;\n status: ProductStatus;\n website: string | null;\n appUrl: string;\n docsUrl: string | null;\n githubUrl: string;\n statusPageUrl: string;\n contactEmail: string;\n supportEmail: string;\n contactPhone: string;\n contactAddress: string;\n seoTitle: string;\n seoDescription: string;\n seoKeywords: string;\n socialLinks: Record<string, string>;\n metadata: Record<string, string>;\n};\n\nconst PRODUCT_SEEDS: SeedProductInput[] = [\n {\n name: 'Workspaces',\n slug: 'workspaces',\n description: 'Enterprise collaboration and workspace management platform.',\n status: 'ACTIVE',\n website: 'https://workspaces.burdenoff.com',\n appUrl: 'https://app.local.burdenoff.com/',\n docsUrl: 'https://docs.burdenoff.com/workspaces',\n githubUrl: 'https://github.com/algoshred/workspaces',\n statusPageUrl: 'https://status.burdenoff.com',\n contactEmail: 'contact@burdenoff.com',\n supportEmail: 'support@burdenoff.com',\n contactPhone: '+91-7358445777',\n contactAddress: 'Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117',\n seoTitle: 'Workspaces - Enterprise Collaboration Platform',\n seoDescription: 'The enterprise-grade foundation for collaborative digital workspaces.',\n seoKeywords: 'enterprise,collaboration,workspace,saas,multi-tenant',\n socialLinks: {\n twitter: 'https://twitter.com/burdenoff',\n github: 'https://github.com/algoshred',\n discord: 'https://discord.gg/burdenoff',\n linkedin: 'https://linkedin.com/company/burdenoff',\n },\n metadata: {\n tagline: 'The Enterprise-Grade Foundation for Collaborative Digital Workspaces',\n businessDomain: 'Enterprise Collaboration & Workspace Management',\n category: 'Core Infrastructure',\n company: 'algoshred',\n pricingRange: '$15-$125/user/month',\n },\n },\n {\n name: 'VibeControls',\n slug: 'vibecontrols',\n description: 'Developer control panel for environments, terminals, tunnels, and remote work.',\n status: 'ACTIVE',\n website: 'https://vibecontrols.com',\n appUrl: 'https://vibecontrols.local.burdenoff.com/',\n docsUrl: 'https://docs.vibecontrols.com',\n githubUrl: 'https://github.com/algoshred/vibecontrols',\n statusPageUrl: 'https://status.burdenoff.com',\n contactEmail: 'contact@vibecontrols.com',\n supportEmail: 'support@burdenoff.com',\n contactPhone: '+91-7358445777',\n contactAddress: 'Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117',\n seoTitle: 'VibeControls - Developer Environment Management',\n seoDescription: \"The Developer's Command Center for Multi-Environment Development\",\n seoKeywords: 'developer tools,environment management,terminal,remote development,devops',\n socialLinks: {\n twitter: 'https://twitter.com/burdenoff',\n github: 'https://github.com/algoshred',\n discord: 'https://discord.gg/burdenoff',\n linkedin: 'https://linkedin.com/company/burdenoff',\n },\n metadata: {\n tagline: \"The Developer's Command Center for Multi-Environment Development\",\n businessDomain: 'Developer Control Panel',\n category: 'Core Infrastructure',\n company: 'algoshred',\n pricingRange: '$25-$150/user/month',\n },\n },\n {\n name: 'FluidGrids',\n slug: 'fluidgrids',\n description:\n 'Visual workflow automation platform for building and operating complex workflows.',\n status: 'ACTIVE',\n website: 'https://fluidgrids.com',\n appUrl: 'https://fluidgrids.local.burdenoff.com/',\n docsUrl: 'https://docs.fluidgrids.com',\n githubUrl: 'https://github.com/algoshred/fluidgrids',\n statusPageUrl: 'https://status.burdenoff.com',\n contactEmail: 'contact@fluidgrids.com',\n supportEmail: 'support@burdenoff.com',\n contactPhone: '+91-7358445777',\n contactAddress: 'Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117',\n seoTitle: 'FluidGrids - Visual Workflow Automation',\n seoDescription:\n 'The Visual Automation Platform That Scales From Simple Tasks to Enterprise Workflows',\n seoKeywords: 'workflow,automation,drag-and-drop,visual,enterprise,integration,process',\n socialLinks: {\n twitter: 'https://twitter.com/burdenoff',\n github: 'https://github.com/algoshred',\n discord: 'https://discord.gg/burdenoff',\n linkedin: 'https://linkedin.com/company/burdenoff',\n },\n metadata: {\n tagline:\n 'The Visual Automation Platform That Scales From Simple Tasks to Enterprise Workflows',\n businessDomain: 'Visual Workflow Automation Platform',\n category: 'Workflow & Automation',\n company: 'algoshred',\n pricingRange: '$29-$299/user/month',\n },\n },\n {\n name: 'BigConsole',\n slug: 'bigconsole',\n description: 'AI-first dashboard and data visualization platform.',\n status: 'ACTIVE',\n website: 'https://bigconsole.com',\n appUrl: 'https://bigconsole.local.burdenoff.com/',\n docsUrl: 'https://docs.bigconsole.com',\n githubUrl: 'https://github.com/algoshred/bigconsole',\n statusPageUrl: 'https://status.burdenoff.com',\n contactEmail: 'contact@bigconsole.com',\n supportEmail: 'support@burdenoff.com',\n contactPhone: '+91-7358445777',\n contactAddress: 'Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117',\n seoTitle: 'BigConsole - AI Data Visualization Platform',\n seoDescription: 'Where Data Becomes Intelligence',\n seoKeywords: 'data visualization,business intelligence,AI,dashboard,analytics,reporting',\n socialLinks: {\n twitter: 'https://twitter.com/burdenoff',\n github: 'https://github.com/algoshred',\n discord: 'https://discord.gg/burdenoff',\n linkedin: 'https://linkedin.com/company/burdenoff',\n },\n metadata: {\n tagline: 'Where Data Becomes Intelligence',\n businessDomain: 'Data Visualization and Business Intelligence',\n category: 'AI & Intelligence',\n company: 'algoshred',\n pricingRange: '$29-$149/user/month',\n },\n },\n {\n name: 'Botlit',\n slug: 'botlit',\n description: 'Enterprise AI agent and bot automation platform.',\n status: 'ACTIVE',\n website: 'https://botlit.ai',\n appUrl: 'https://botlit.local.burdenoff.com/',\n docsUrl: 'https://docs.botlit.ai',\n githubUrl: 'https://github.com/algoshred/botlit',\n statusPageUrl: 'https://status.burdenoff.com',\n contactEmail: 'contact@botlit.ai',\n supportEmail: 'support@burdenoff.com',\n contactPhone: '+91-7358445777',\n contactAddress: 'Plot No.43, Veeramani Nagar, 2nd Cross Street, Nanmangalam, Chennai - 600117',\n seoTitle: 'Botlit - Enterprise AI Agent Platform',\n seoDescription:\n 'The Enterprise AI Platform That Makes Intelligent Automation Accessible to Everyone',\n seoKeywords: 'AI,bots,automation,agentic AI,intelligent automation,chatbot,enterprise AI',\n socialLinks: {\n twitter: 'https://twitter.com/burdenoff',\n github: 'https://github.com/algoshred',\n discord: 'https://discord.gg/burdenoff',\n linkedin: 'https://linkedin.com/company/burdenoff',\n },\n metadata: {\n tagline:\n 'The Enterprise AI Platform That Makes Intelligent Automation Accessible to Everyone',\n businessDomain: 'AI Platform',\n category: 'AI & Intelligence',\n company: 'algoshred',\n pricingRange: '$99-$1,999/month',\n },\n },\n];\n\ntype ProductItem = {\n id: string;\n name: string;\n slug: string;\n description: string | null | undefined;\n status: string;\n appUrl: string | null | undefined;\n activeUsers: number;\n apiCalls: number;\n contactEmail: string | null | undefined;\n createdAt: string;\n updatedAt: string;\n};\n\n/**\n * Products page — connected to real backend\n */\nexport function ProductsPage() {\n const { canViewProducts, isLoading: permissionsLoading } = useAdminPermissions();\n const apolloClient = useApolloClient();\n\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState('');\n const [isSeeding, setIsSeeding] = useState(false);\n const [seedMessage, setSeedMessage] = useState<string | null>(null);\n const [seedError, setSeedError] = useState<string | null>(null);\n\n const skipQueries = permissionsLoading || !canViewProducts;\n\n const { data: statsData } = useGetPlatformProductStatsQuery({\n skip: skipQueries,\n });\n const { data, loading, error, refetch } = useListPlatformProductsQuery({\n variables: {\n filter: search ? { search } : undefined,\n limit: PAGE_SIZE,\n offset: (page - 1) * PAGE_SIZE,\n },\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n\n const products: ProductItem[] = useMemo(\n () => (data?.platformProducts?.items ?? []) as ProductItem[],\n [data]\n );\n\n const total = data?.platformProducts?.total ?? 0;\n const totalPages = Math.ceil(total / PAGE_SIZE);\n const stats = statsData?.platformProductStats;\n\n const handleSeedProducts = useCallback(async () => {\n setIsSeeding(true);\n setSeedMessage(null);\n setSeedError(null);\n\n try {\n const existingResult = await apolloClient.query<{\n platformProducts: { items: Array<{ id: string; slug: string }> };\n }>({\n query: UPSERT_PRODUCTS_QUERY,\n variables: { limit: 200, offset: 0 },\n fetchPolicy: 'network-only',\n });\n const existingProducts = existingResult.data?.platformProducts?.items ?? [];\n const existingBySlug = new Map(existingProducts.map((product) => [product.slug, product]));\n\n let created = 0;\n let updated = 0;\n for (const seed of PRODUCT_SEEDS) {\n const existing = existingBySlug.get(seed.slug);\n if (existing) {\n const input = Object.fromEntries(Object.entries(seed).filter(([key]) => key !== 'slug'));\n await apolloClient.mutate({\n mutation: UPDATE_PRODUCT_MUTATION,\n variables: { id: existing.id, input },\n });\n updated += 1;\n } else {\n await apolloClient.mutate({\n mutation: CREATE_PRODUCT_MUTATION,\n variables: { input: seed },\n });\n created += 1;\n }\n }\n\n setSeedMessage(`Seeded products: ${created} created, ${updated} updated.`);\n await refetch();\n } catch (err) {\n setSeedError(err instanceof Error ? err.message : 'Failed to seed products');\n } finally {\n setIsSeeding(false);\n }\n }, [apolloClient, refetch]);\n\n const columns = [\n {\n key: 'name',\n header: 'Product',\n render: (p: ProductItem) => (\n <div className=\"flex items-center gap-3\">\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-medium text-foreground\">{p.name}</span>\n {p.appUrl && (\n <a\n href={p.appUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={(e) => e.stopPropagation()}\n >\n <ExternalLink className=\"h-3 w-3 text-muted-foreground hover:text-foreground\" />\n </a>\n )}\n </div>\n <div className=\"truncate text-xs text-muted-foreground\">{p.slug}</div>\n </div>\n </div>\n ),\n },\n {\n key: 'status',\n header: 'Status',\n width: '110px',\n render: (p: ProductItem) => (\n <Badge\n variant={STATUS_VARIANT[p.status as ProductStatus] ?? 'outline'}\n className=\"text-xs capitalize\"\n >\n {p.status.toLowerCase().replace('_', ' ')}\n </Badge>\n ),\n },\n {\n key: 'activeUsers',\n header: 'Users',\n width: '80px',\n align: 'right' as const,\n render: (p: ProductItem) => <span className=\"text-sm\">{p.activeUsers}</span>,\n },\n {\n key: 'updatedAt',\n header: 'Updated',\n width: '110px',\n render: (p: ProductItem) => formatDate(p.updatedAt),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canViewProducts}\n isLoading={permissionsLoading}\n pageTitle=\"Products\"\n denyMessage=\"You don't have permission to view products.\"\n >\n <PageLayout\n title=\"Products\"\n description={`Platform products and services${total ? ` · ${total} total` : ''}`}\n actions={\n <Button onClick={handleSeedProducts} disabled={isSeeding}>\n <Database className=\"mr-2 h-4 w-4\" />\n {isSeeding ? 'Seeding...' : 'Seed Active Products'}\n </Button>\n }\n >\n {/* Stats */}\n {stats && (\n <MetricsGrid className=\"mb-6\">\n <MetricCard\n title=\"Total Products\"\n value={stats.total}\n icon={<Package className=\"h-5 w-5\" />}\n />\n <MetricCard title=\"Active\" value={stats.active} icon={<Server className=\"h-5 w-5\" />} />\n <MetricCard\n title=\"Waitlist\"\n value={stats.waitlist}\n icon={<Package className=\"h-5 w-5\" />}\n />\n <MetricCard title=\"Draft\" value={stats.draft} icon={<Package className=\"h-5 w-5\" />} />\n </MetricsGrid>\n )}\n\n <div className=\"space-y-4\">\n <div className=\"relative max-w-sm\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search products...\"\n value={search}\n onChange={(e) => {\n setPage(1);\n setSearch(e.target.value);\n }}\n className=\"pl-9\"\n />\n </div>\n\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load products: {error.message}\n </div>\n )}\n {seedMessage && (\n <div className=\"rounded-md border border-border bg-muted p-4 text-sm text-foreground\">\n {seedMessage}\n </div>\n )}\n {seedError && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n {seedError}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={products}\n keyExtractor={(p) => p.id}\n loading={loading}\n emptyState={\n <EmptyState\n icon={<Package className=\"h-8 w-8\" />}\n title=\"No products found\"\n description=\"No platform products match your search\"\n />\n }\n />\n\n {total > PAGE_SIZE && (\n <Pagination\n page={page}\n totalPages={totalPages}\n totalItems={total}\n pageSize={PAGE_SIZE}\n onPageChange={setPage}\n />\n )}\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function ReferralsPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ReferralsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReferralsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/ReferralsPage.tsx"],"names":[],"mappings":"AAmDA,wBAAgB,aAAa,4CAgT5B"}