@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,111 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Button as t } from "./ui.js";
3
+ import * as n from "react";
4
+ import { Loader2 as r, X as i } from "lucide-react";
5
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
6
+ //#region src/admin/components/FormSheet.tsx
7
+ var s = {
8
+ sm: "max-w-sm",
9
+ md: "max-w-md",
10
+ lg: "max-w-lg",
11
+ xl: "max-w-xl"
12
+ };
13
+ function c({ open: r, onClose: c, title: l, description: u, children: d, width: f = "md", footer: p }) {
14
+ return n.useEffect(() => {
15
+ let e = (e) => {
16
+ e.key === "Escape" && r && c();
17
+ };
18
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
19
+ }, [r, c]), n.useEffect(() => (r ? document.body.style.overflow = "hidden" : document.body.style.overflow = "", () => {
20
+ document.body.style.overflow = "";
21
+ }), [r]), r ? /* @__PURE__ */ o("div", {
22
+ className: "fixed inset-0 z-50",
23
+ children: [/* @__PURE__ */ a("div", {
24
+ className: "fixed inset-0 bg-black/50 transition-opacity",
25
+ onClick: c,
26
+ "aria-hidden": "true"
27
+ }), /* @__PURE__ */ o("div", {
28
+ className: e("fixed inset-y-0 right-0 flex w-full flex-col bg-background shadow-xl", "animate-in slide-in-from-right duration-300", s[f]),
29
+ role: "dialog",
30
+ "aria-modal": "true",
31
+ "aria-labelledby": "sheet-title",
32
+ children: [
33
+ /* @__PURE__ */ o("div", {
34
+ className: "flex items-start justify-between border-b border-border px-6 py-4",
35
+ children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("h2", {
36
+ id: "sheet-title",
37
+ className: "text-lg font-semibold text-foreground",
38
+ children: l
39
+ }), u && /* @__PURE__ */ a("p", {
40
+ className: "mt-1 text-sm text-muted-foreground",
41
+ children: u
42
+ })] }), /* @__PURE__ */ a(t, {
43
+ variant: "ghost",
44
+ size: "icon",
45
+ onClick: c,
46
+ "aria-label": "Close",
47
+ children: /* @__PURE__ */ a(i, { className: "h-4 w-4" })
48
+ })]
49
+ }),
50
+ /* @__PURE__ */ a("div", {
51
+ className: "flex-1 overflow-y-auto px-6 py-4",
52
+ children: d
53
+ }),
54
+ p && /* @__PURE__ */ a("div", {
55
+ className: "border-t border-border px-6 py-4",
56
+ children: p
57
+ })
58
+ ]
59
+ })]
60
+ }) : null;
61
+ }
62
+ function l({ submitLabel: e = "Save", cancelLabel: n = "Cancel", onCancel: i, isSubmitting: s = !1, disabled: c = !1, formId: l, onSubmit: u, submitVariant: d = "default" }) {
63
+ return /* @__PURE__ */ o("div", {
64
+ className: "flex items-center justify-end gap-3",
65
+ children: [/* @__PURE__ */ a(t, {
66
+ variant: "outline",
67
+ onClick: i,
68
+ disabled: s,
69
+ children: n
70
+ }), /* @__PURE__ */ o(t, {
71
+ type: l ? "submit" : "button",
72
+ form: l,
73
+ onClick: u,
74
+ disabled: c || s,
75
+ variant: d,
76
+ children: [s && /* @__PURE__ */ a(r, { className: "mr-2 h-4 w-4 animate-spin" }), e]
77
+ })]
78
+ });
79
+ }
80
+ function u({ title: t, description: n, children: r, className: i }) {
81
+ return /* @__PURE__ */ o("div", {
82
+ className: e("space-y-4", i),
83
+ children: [(t || n) && /* @__PURE__ */ o("div", {
84
+ className: "space-y-1",
85
+ children: [t && /* @__PURE__ */ a("h3", {
86
+ className: "text-sm font-medium text-foreground",
87
+ children: t
88
+ }), n && /* @__PURE__ */ a("p", {
89
+ className: "text-xs text-muted-foreground",
90
+ children: n
91
+ })]
92
+ }), /* @__PURE__ */ a("div", {
93
+ className: "space-y-4",
94
+ children: r
95
+ })]
96
+ });
97
+ }
98
+ function d({ children: t, cols: n = 2, className: r }) {
99
+ return /* @__PURE__ */ a("div", {
100
+ className: e("grid gap-4", {
101
+ 2: "grid-cols-2",
102
+ 3: "grid-cols-3",
103
+ 4: "grid-cols-4"
104
+ }[n], r),
105
+ children: t
106
+ });
107
+ }
108
+ //#endregion
109
+ export { d as FormRow, u as FormSection, c as FormSheet, l as FormSheetFooter };
110
+
111
+ //# sourceMappingURL=FormSheet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormSheet.js","names":[],"sources":["../../../src/admin/components/FormSheet.tsx"],"sourcesContent":["import * as React from 'react';\nimport { X, Loader2 } from 'lucide-react';\nimport { cn } from '../utils/cn';\nimport { Button } from './ui';\n\n/**\n * FormSheet props\n */\nexport interface FormSheetProps {\n /** Whether the sheet is open */\n open: boolean;\n /** Callback when the sheet should close */\n onClose: () => void;\n /** Title of the sheet */\n title: string;\n /** Optional description */\n description?: string;\n /** Form content */\n children: React.ReactNode;\n /** Width of the sheet */\n width?: 'sm' | 'md' | 'lg' | 'xl';\n /** Optional footer actions */\n footer?: React.ReactNode;\n}\n\nconst widthClasses = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n};\n\n/**\n * FormSheet - Slide-over panel for forms\n *\n * A side panel component for displaying forms that slides in from the right.\n * Includes backdrop overlay, header with close button, and optional footer.\n */\nexport function FormSheet({\n open,\n onClose,\n title,\n description,\n children,\n width = 'md',\n footer,\n}: FormSheetProps) {\n // Handle escape key\n React.useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && open) {\n onClose();\n }\n };\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [open, onClose]);\n\n // Prevent body scroll when open\n React.useEffect(() => {\n if (open) {\n document.body.style.overflow = 'hidden';\n } else {\n document.body.style.overflow = '';\n }\n return () => {\n document.body.style.overflow = '';\n };\n }, [open]);\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-50\">\n {/* Backdrop */}\n <div\n className=\"fixed inset-0 bg-black/50 transition-opacity\"\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n {/* Sheet */}\n <div\n className={cn(\n 'fixed inset-y-0 right-0 flex w-full flex-col bg-background shadow-xl',\n 'animate-in slide-in-from-right duration-300',\n widthClasses[width]\n )}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"sheet-title\"\n >\n {/* Header */}\n <div className=\"flex items-start justify-between border-b border-border px-6 py-4\">\n <div>\n <h2 id=\"sheet-title\" className=\"text-lg font-semibold text-foreground\">\n {title}\n </h2>\n {description && <p className=\"mt-1 text-sm text-muted-foreground\">{description}</p>}\n </div>\n <Button variant=\"ghost\" size=\"icon\" onClick={onClose} aria-label=\"Close\">\n <X className=\"h-4 w-4\" />\n </Button>\n </div>\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto px-6 py-4\">{children}</div>\n\n {/* Footer */}\n {footer && <div className=\"border-t border-border px-6 py-4\">{footer}</div>}\n </div>\n </div>\n );\n}\n\n/**\n * FormSheetFooter props\n */\nexport interface FormSheetFooterProps {\n /** Primary action button text */\n submitLabel?: string;\n /** Cancel button text */\n cancelLabel?: string;\n /** Callback for cancel */\n onCancel: () => void;\n /** Whether form is submitting */\n isSubmitting?: boolean;\n /** Whether submit is disabled */\n disabled?: boolean;\n /** Form ID to connect submit button */\n formId?: string;\n /** Callback for submit (if not using form) */\n onSubmit?: () => void;\n /** Variant for submit button */\n submitVariant?: 'default' | 'destructive';\n}\n\n/**\n * FormSheetFooter - Standard footer for FormSheet with cancel/submit buttons\n */\nexport function FormSheetFooter({\n submitLabel = 'Save',\n cancelLabel = 'Cancel',\n onCancel,\n isSubmitting = false,\n disabled = false,\n formId,\n onSubmit,\n submitVariant = 'default',\n}: FormSheetFooterProps) {\n return (\n <div className=\"flex items-center justify-end gap-3\">\n <Button variant=\"outline\" onClick={onCancel} disabled={isSubmitting}>\n {cancelLabel}\n </Button>\n <Button\n type={formId ? 'submit' : 'button'}\n form={formId}\n onClick={onSubmit}\n disabled={disabled || isSubmitting}\n variant={submitVariant}\n >\n {isSubmitting && <Loader2 className=\"mr-2 h-4 w-4 animate-spin\" />}\n {submitLabel}\n </Button>\n </div>\n );\n}\n\n/**\n * FormSection - Group related form fields\n */\nexport interface FormSectionProps {\n /** Section title */\n title?: string;\n /** Section description */\n description?: string;\n /** Form fields */\n children: React.ReactNode;\n /** Additional className */\n className?: string;\n}\n\nexport function FormSection({ title, description, children, className }: FormSectionProps) {\n return (\n <div className={cn('space-y-4', className)}>\n {(title || description) && (\n <div className=\"space-y-1\">\n {title && <h3 className=\"text-sm font-medium text-foreground\">{title}</h3>}\n {description && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n </div>\n )}\n <div className=\"space-y-4\">{children}</div>\n </div>\n );\n}\n\n/**\n * FormRow - Horizontal row for form fields\n */\nexport interface FormRowProps {\n /** Form fields */\n children: React.ReactNode;\n /** Number of columns */\n cols?: 2 | 3 | 4;\n /** Additional className */\n className?: string;\n}\n\nexport function FormRow({ children, cols = 2, className }: FormRowProps) {\n const colsClass = {\n 2: 'grid-cols-2',\n 3: 'grid-cols-3',\n 4: 'grid-cols-4',\n };\n return <div className={cn('grid gap-4', colsClass[cols], className)}>{children}</div>;\n}\n"],"mappings":";;;;;;AAyBA,IAAM,IAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CACL;AAQD,SAAgB,EAAU,EACxB,SACA,YACA,UACA,gBACA,aACA,WAAQ,MACR,aACiB;AA0BjB,QAxBA,EAAM,gBAAgB;EACpB,IAAM,KAAgB,MAAqB;AACzC,GAAI,EAAE,QAAQ,YAAY,KACxB,GAAS;;AAIb,SADA,SAAS,iBAAiB,WAAW,EAAa,QACrC,SAAS,oBAAoB,WAAW,EAAa;IACjE,CAAC,GAAM,EAAQ,CAAC,EAGnB,EAAM,iBACA,IACF,SAAS,KAAK,MAAM,WAAW,WAE/B,SAAS,KAAK,MAAM,WAAW,UAEpB;AACX,WAAS,KAAK,MAAM,WAAW;KAEhC,CAAC,EAAK,CAAC,EAEL,IAGH,kBAAC,OAAD;EAAK,WAAU;YAAf,CAEE,kBAAC,OAAD;GACE,WAAU;GACV,SAAS;GACT,eAAY;GACZ,CAAA,EAGF,kBAAC,OAAD;GACE,WAAW,EACT,wEACA,+CACA,EAAa,GACd;GACD,MAAK;GACL,cAAW;GACX,mBAAgB;aARlB;IAWE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;MAAI,IAAG;MAAc,WAAU;gBAC5B;MACE,CAAA,EACJ,KAAe,kBAAC,KAAD;MAAG,WAAU;gBAAsC;MAAgB,CAAA,CAC/E,EAAA,CAAA,EACN,kBAAC,GAAD;MAAQ,SAAQ;MAAQ,MAAK;MAAO,SAAS;MAAS,cAAW;gBAC/D,kBAAC,GAAD,EAAG,WAAU,WAAY,CAAA;MAClB,CAAA,CACL;;IAGN,kBAAC,OAAD;KAAK,WAAU;KAAoC;KAAe,CAAA;IAGjE,KAAU,kBAAC,OAAD;KAAK,WAAU;eAAoC;KAAa,CAAA;IACvE;KACF;MAzCU;;AAsEpB,SAAgB,EAAgB,EAC9B,iBAAc,QACd,iBAAc,UACd,aACA,kBAAe,IACf,cAAW,IACX,WACA,aACA,mBAAgB,aACO;AACvB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf,CACE,kBAAC,GAAD;GAAQ,SAAQ;GAAU,SAAS;GAAU,UAAU;aACpD;GACM,CAAA,EACT,kBAAC,GAAD;GACE,MAAM,IAAS,WAAW;GAC1B,MAAM;GACN,SAAS;GACT,UAAU,KAAY;GACtB,SAAS;aALX,CAOG,KAAgB,kBAAC,GAAD,EAAS,WAAU,6BAA8B,CAAA,EACjE,EACM;KACL;;;AAkBV,SAAgB,EAAY,EAAE,UAAO,gBAAa,aAAU,gBAA+B;AACzF,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,aAAa,EAAU;YAA1C,EACI,KAAS,MACT,kBAAC,OAAD;GAAK,WAAU;aAAf,CACG,KAAS,kBAAC,MAAD;IAAI,WAAU;cAAuC;IAAW,CAAA,EACzE,KAAe,kBAAC,KAAD;IAAG,WAAU;cAAiC;IAAgB,CAAA,CAC1E;MAER,kBAAC,OAAD;GAAK,WAAU;GAAa;GAAe,CAAA,CACvC;;;AAgBV,SAAgB,EAAQ,EAAE,aAAU,UAAO,GAAG,gBAA2B;AAMvE,QAAO,kBAAC,OAAD;EAAK,WAAW,EAAG,cALR;GAChB,GAAG;GACH,GAAG;GACH,GAAG;GACJ,CACiD,IAAO,EAAU;EAAG;EAAe,CAAA"}
@@ -0,0 +1,40 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface MetricCardProps {
4
+ /** Card title */
5
+ title: string;
6
+ /** Metric value (number or formatted string) */
7
+ value: number | string;
8
+ /** Change from previous period */
9
+ change?: number;
10
+ /** Type of change display */
11
+ changeType?: 'number' | 'percentage' | 'currency';
12
+ /** Trend direction */
13
+ trend?: 'up' | 'down' | 'neutral';
14
+ /** Whether change is positive or negative for styling */
15
+ changeIsPositive?: boolean;
16
+ /** Icon to display */
17
+ icon?: ReactNode;
18
+ /** Subtitle text */
19
+ subtitle?: string;
20
+ /** Link to navigate to on click */
21
+ linkTo?: string;
22
+ /** Priority indicator */
23
+ priority?: 'normal' | 'high' | 'critical';
24
+ /** Loading state */
25
+ loading?: boolean;
26
+ /** Additional class name */
27
+ className?: string;
28
+ }
29
+ /**
30
+ * Metric card component for dashboard
31
+ */
32
+ export declare function MetricCard({ title, value, change, changeType, trend, changeIsPositive, icon, subtitle, linkTo, priority, loading, className, }: MetricCardProps): import("react/jsx-runtime").JSX.Element;
33
+ /**
34
+ * Grid container for metric cards
35
+ */
36
+ export declare function MetricsGrid({ children, className }: {
37
+ children: ReactNode;
38
+ className?: string;
39
+ }): import("react/jsx-runtime").JSX.Element;
40
+ //# sourceMappingURL=MetricCard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.d.ts","sourceRoot":"","sources":["../../../src/admin/components/MetricCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAOvC,MAAM,WAAW,eAAe;IAC9B,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,kCAAkC;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6BAA6B;IAC7B,UAAU,CAAC,EAAE,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;IAClD,sBAAsB;IACtB,KAAK,CAAC,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAAC;IAClC,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sBAAsB;IACtB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,oBAAoB;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yBAAyB;IACzB,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1C,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAqB,EACrB,KAAK,EACL,gBAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,OAAO,EACP,SAAS,GACV,EAAE,eAAe,2CA0EjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,2CAM/F"}
@@ -0,0 +1,57 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Badge as t, Card as n, CardContent as r, CardHeader as i, CardTitle as a, Skeleton as o } from "./ui.js";
3
+ import { formatChange as s, formatCurrency as c, formatNumber as l } from "../utils/formatters.js";
4
+ import { Minus as u, TrendingDown as d, TrendingUp as f } from "lucide-react";
5
+ import { Link as p } from "react-router-dom";
6
+ import { jsx as m, jsxs as h } from "react/jsx-runtime";
7
+ //#region src/admin/components/MetricCard.tsx
8
+ function g({ title: g, value: _, change: v, changeType: y = "number", trend: b, changeIsPositive: x, icon: S, subtitle: C, linkTo: w, priority: T, loading: E, className: D }) {
9
+ let O = x ?? b === "up", k = typeof _ == "number" ? y === "currency" ? c(_) : l(_) : _, A = v === void 0 ? null : s(v, y === "percentage"), j = b === "up" ? f : b === "down" ? d : u, M = /* @__PURE__ */ h(n, {
10
+ className: e("transition-shadow hover:shadow-md", T && {
11
+ normal: "",
12
+ high: "border-l-4 border-l-warning",
13
+ critical: "border-l-4 border-l-destructive"
14
+ }[T], D),
15
+ children: [/* @__PURE__ */ h(i, {
16
+ className: "flex flex-row items-center justify-between pb-2",
17
+ children: [/* @__PURE__ */ m(a, {
18
+ className: "text-sm font-medium text-muted-foreground",
19
+ children: g
20
+ }), S && /* @__PURE__ */ m("div", {
21
+ className: "text-muted-foreground",
22
+ children: S
23
+ })]
24
+ }), /* @__PURE__ */ m(r, { children: E ? /* @__PURE__ */ h("div", {
25
+ className: "space-y-2",
26
+ children: [/* @__PURE__ */ m(o, { className: "h-8 w-24" }), /* @__PURE__ */ m(o, { className: "h-4 w-16" })]
27
+ }) : /* @__PURE__ */ h("div", { children: [/* @__PURE__ */ h("div", {
28
+ className: "flex items-baseline justify-between",
29
+ children: [/* @__PURE__ */ m("div", {
30
+ className: "text-3xl font-bold text-foreground",
31
+ children: k
32
+ }), A !== null && /* @__PURE__ */ h(t, {
33
+ variant: O ? "success" : "destructive",
34
+ className: "flex items-center gap-1",
35
+ children: [/* @__PURE__ */ m(j, { className: "h-3 w-3" }), A]
36
+ })]
37
+ }), C && /* @__PURE__ */ m("p", {
38
+ className: "mt-1 text-xs text-muted-foreground",
39
+ children: C
40
+ })] }) })]
41
+ });
42
+ return w ? /* @__PURE__ */ m(p, {
43
+ to: w,
44
+ className: "block",
45
+ children: M
46
+ }) : M;
47
+ }
48
+ function _({ children: t, className: n }) {
49
+ return /* @__PURE__ */ m("div", {
50
+ className: e("grid gap-4", "grid-cols-1 sm:grid-cols-2 xl:grid-cols-4", n),
51
+ children: t
52
+ });
53
+ }
54
+ //#endregion
55
+ export { g as MetricCard, _ as MetricsGrid };
56
+
57
+ //# sourceMappingURL=MetricCard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MetricCard.js","names":[],"sources":["../../../src/admin/components/MetricCard.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { Link } from 'react-router-dom';\nimport { TrendingUp, TrendingDown, Minus } from 'lucide-react';\nimport { Card, CardHeader, CardTitle, CardContent, Badge, Skeleton } from './ui';\nimport { cn } from '../utils/cn';\nimport { formatNumber, formatCurrency, formatChange } from '../utils/formatters';\n\nexport interface MetricCardProps {\n /** Card title */\n title: string;\n /** Metric value (number or formatted string) */\n value: number | string;\n /** Change from previous period */\n change?: number;\n /** Type of change display */\n changeType?: 'number' | 'percentage' | 'currency';\n /** Trend direction */\n trend?: 'up' | 'down' | 'neutral';\n /** Whether change is positive or negative for styling */\n changeIsPositive?: boolean;\n /** Icon to display */\n icon?: ReactNode;\n /** Subtitle text */\n subtitle?: string;\n /** Link to navigate to on click */\n linkTo?: string;\n /** Priority indicator */\n priority?: 'normal' | 'high' | 'critical';\n /** Loading state */\n loading?: boolean;\n /** Additional class name */\n className?: string;\n}\n\n/**\n * Metric card component for dashboard\n */\nexport function MetricCard({\n title,\n value,\n change,\n changeType = 'number',\n trend,\n changeIsPositive,\n icon,\n subtitle,\n linkTo,\n priority,\n loading,\n className,\n}: MetricCardProps) {\n // Determine if change is positive based on trend or explicit prop\n const isPositive = changeIsPositive ?? trend === 'up';\n\n // Format the value\n const formattedValue =\n typeof value === 'number'\n ? changeType === 'currency'\n ? formatCurrency(value)\n : formatNumber(value)\n : value;\n\n // Format the change\n const formattedChange =\n change !== undefined ? formatChange(change, changeType === 'percentage') : null;\n\n // Get trend icon\n const TrendIcon = trend === 'up' ? TrendingUp : trend === 'down' ? TrendingDown : Minus;\n\n // Priority border classes\n const priorityClasses = {\n normal: '',\n high: 'border-l-4 border-l-warning',\n critical: 'border-l-4 border-l-destructive',\n };\n\n const cardContent = (\n <Card\n className={cn(\n 'transition-shadow hover:shadow-md',\n priority && priorityClasses[priority],\n className\n )}\n >\n <CardHeader className=\"flex flex-row items-center justify-between pb-2\">\n <CardTitle className=\"text-sm font-medium text-muted-foreground\">{title}</CardTitle>\n {icon && <div className=\"text-muted-foreground\">{icon}</div>}\n </CardHeader>\n <CardContent>\n {loading ? (\n <div className=\"space-y-2\">\n <Skeleton className=\"h-8 w-24\" />\n <Skeleton className=\"h-4 w-16\" />\n </div>\n ) : (\n <div>\n <div className=\"flex items-baseline justify-between\">\n <div className=\"text-3xl font-bold text-foreground\">{formattedValue}</div>\n {formattedChange !== null && (\n <Badge\n variant={isPositive ? 'success' : 'destructive'}\n className=\"flex items-center gap-1\"\n >\n <TrendIcon className=\"h-3 w-3\" />\n {formattedChange}\n </Badge>\n )}\n </div>\n {subtitle && <p className=\"mt-1 text-xs text-muted-foreground\">{subtitle}</p>}\n </div>\n )}\n </CardContent>\n </Card>\n );\n\n if (linkTo) {\n return (\n <Link to={linkTo} className=\"block\">\n {cardContent}\n </Link>\n );\n }\n\n return cardContent;\n}\n\n/**\n * Grid container for metric cards\n */\nexport function MetricsGrid({ children, className }: { children: ReactNode; className?: string }) {\n return (\n <div className={cn('grid gap-4', 'grid-cols-1 sm:grid-cols-2 xl:grid-cols-4', className)}>\n {children}\n </div>\n );\n}\n"],"mappings":";;;;;;;AAqCA,SAAgB,EAAW,EACzB,UACA,UACA,WACA,gBAAa,UACb,UACA,qBACA,SACA,aACA,WACA,aACA,YACA,gBACkB;CAElB,IAAM,IAAa,KAAoB,MAAU,MAG3C,IACJ,OAAO,KAAU,WACb,MAAe,aACb,EAAe,EAAM,GACrB,EAAa,EAAM,GACrB,GAGA,IACJ,MAAW,KAAA,IAAgE,OAApD,EAAa,GAAQ,MAAe,aAAa,EAGpE,IAAY,MAAU,OAAO,IAAa,MAAU,SAAS,IAAe,GAS5E,IACJ,kBAAC,GAAD;EACE,WAAW,EACT,qCACA,KAVkB;GACtB,QAAQ;GACR,MAAM;GACN,UAAU;GACX,CAMiC,IAC5B,EACD;YALH,CAOE,kBAAC,GAAD;GAAY,WAAU;aAAtB,CACE,kBAAC,GAAD;IAAW,WAAU;cAA6C;IAAkB,CAAA,EACnF,KAAQ,kBAAC,OAAD;IAAK,WAAU;cAAyB;IAAW,CAAA,CACjD;MACb,kBAAC,GAAD,EAAA,UACG,IACC,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,GAAD,EAAU,WAAU,YAAa,CAAA,EACjC,kBAAC,GAAD,EAAU,WAAU,YAAa,CAAA,CAC7B;OAEN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,OAAD;GAAK,WAAU;aAAf,CACE,kBAAC,OAAD;IAAK,WAAU;cAAsC;IAAqB,CAAA,EACzE,MAAoB,QACnB,kBAAC,GAAD;IACE,SAAS,IAAa,YAAY;IAClC,WAAU;cAFZ,CAIE,kBAAC,GAAD,EAAW,WAAU,WAAY,CAAA,EAChC,EACK;MAEN;MACL,KAAY,kBAAC,KAAD;GAAG,WAAU;aAAsC;GAAa,CAAA,CACzE,EAAA,CAAA,EAEI,CAAA,CACT;;AAWT,QARI,IAEA,kBAAC,GAAD;EAAM,IAAI;EAAQ,WAAU;YACzB;EACI,CAAA,GAIJ;;AAMT,SAAgB,EAAY,EAAE,aAAU,gBAA0D;AAChG,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,cAAc,6CAA6C,EAAU;EACrF;EACG,CAAA"}
@@ -0,0 +1,34 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ interface PageLayoutProps {
4
+ /** Page title */
5
+ title: string;
6
+ /** Optional description */
7
+ description?: string;
8
+ /** Actions to display in the header (buttons, etc.) */
9
+ actions?: ReactNode;
10
+ /** Page content */
11
+ children: ReactNode;
12
+ /** Additional class names */
13
+ className?: string;
14
+ }
15
+ /**
16
+ * Standard page layout component with title, description, and content area
17
+ */
18
+ export declare function PageLayout({ title, description, actions, children, className }: PageLayoutProps): import("react/jsx-runtime").JSX.Element;
19
+ interface PageSectionProps {
20
+ /** Section title */
21
+ title?: string;
22
+ /** Optional description */
23
+ description?: string;
24
+ /** Section content */
25
+ children: ReactNode;
26
+ /** Additional class names */
27
+ className?: string;
28
+ }
29
+ /**
30
+ * Section within a page
31
+ */
32
+ export declare function PageSection({ title, description, children, className }: PageSectionProps): import("react/jsx-runtime").JSX.Element;
33
+ export {};
34
+ //# sourceMappingURL=PageLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PageLayout.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAGvC,UAAU,eAAe;IACvB,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,mBAAmB;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,eAAe,2CAsB/F;AAED,UAAU,gBAAgB;IACxB,oBAAoB;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sBAAsB;IACtB,QAAQ,EAAE,SAAS,CAAC;IACpB,6BAA6B;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,2CAYxF"}
@@ -0,0 +1,31 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { jsx as t, jsxs as n } from "react/jsx-runtime";
3
+ //#region src/admin/components/PageLayout.tsx
4
+ function r({ title: r, description: i, actions: a, children: o, className: s }) {
5
+ return /* @__PURE__ */ n("div", {
6
+ className: e("flex h-full flex-col", s),
7
+ children: [/* @__PURE__ */ n("header", {
8
+ className: "flex flex-col gap-4 border-b border-border bg-background px-6 py-4 sm:flex-row sm:items-center sm:justify-between",
9
+ children: [/* @__PURE__ */ n("div", {
10
+ className: "min-w-0 flex-1",
11
+ children: [/* @__PURE__ */ t("h1", {
12
+ className: "text-2xl font-bold tracking-tight text-foreground sm:text-3xl",
13
+ children: r
14
+ }), i && /* @__PURE__ */ t("p", {
15
+ className: "mt-1 text-sm text-muted-foreground sm:text-base",
16
+ children: i
17
+ })]
18
+ }), a && /* @__PURE__ */ t("div", {
19
+ className: "flex flex-shrink-0 flex-wrap items-center gap-2",
20
+ children: a
21
+ })]
22
+ }), /* @__PURE__ */ t("div", {
23
+ className: "flex-1 overflow-auto p-6",
24
+ children: o
25
+ })]
26
+ });
27
+ }
28
+ //#endregion
29
+ export { r as PageLayout };
30
+
31
+ //# sourceMappingURL=PageLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.js","names":[],"sources":["../../../src/admin/components/PageLayout.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\n\ninterface PageLayoutProps {\n /** Page title */\n title: string;\n /** Optional description */\n description?: string;\n /** Actions to display in the header (buttons, etc.) */\n actions?: ReactNode;\n /** Page content */\n children: ReactNode;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Standard page layout component with title, description, and content area\n */\nexport function PageLayout({ title, description, actions, children, className }: PageLayoutProps) {\n return (\n <div className={cn('flex h-full flex-col', className)}>\n {/* Page Header */}\n <header className=\"flex flex-col gap-4 border-b border-border bg-background px-6 py-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"min-w-0 flex-1\">\n <h1 className=\"text-2xl font-bold tracking-tight text-foreground sm:text-3xl\">{title}</h1>\n {description && (\n <p className=\"mt-1 text-sm text-muted-foreground sm:text-base\">{description}</p>\n )}\n </div>\n {actions && (\n <div className=\"flex flex-shrink-0 flex-wrap items-center gap-2\">{actions}</div>\n )}\n </header>\n\n {/* Page Content — must not use a <main> landmark here because the\n host shell (AppShellLayout) already renders one; nesting <main>\n elements is invalid HTML and an a11y violation. */}\n <div className=\"flex-1 overflow-auto p-6\">{children}</div>\n </div>\n );\n}\n\ninterface PageSectionProps {\n /** Section title */\n title?: string;\n /** Optional description */\n description?: string;\n /** Section content */\n children: ReactNode;\n /** Additional class names */\n className?: string;\n}\n\n/**\n * Section within a page\n */\nexport function PageSection({ title, description, children, className }: PageSectionProps) {\n return (\n <section className={cn('space-y-4', className)}>\n {(title || description) && (\n <div>\n {title && <h2 className=\"text-lg font-semibold text-foreground\">{title}</h2>}\n {description && <p className=\"text-sm text-muted-foreground\">{description}</p>}\n </div>\n )}\n {children}\n </section>\n );\n}\n"],"mappings":";;;AAmBA,SAAgB,EAAW,EAAE,UAAO,gBAAa,YAAS,aAAU,gBAA8B;AAChG,QACE,kBAAC,OAAD;EAAK,WAAW,EAAG,wBAAwB,EAAU;YAArD,CAEE,kBAAC,UAAD;GAAQ,WAAU;aAAlB,CACE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,MAAD;KAAI,WAAU;eAAiE;KAAW,CAAA,EACzF,KACC,kBAAC,KAAD;KAAG,WAAU;eAAmD;KAAgB,CAAA,CAE9E;OACL,KACC,kBAAC,OAAD;IAAK,WAAU;cAAmD;IAAc,CAAA,CAE3E;MAKT,kBAAC,OAAD;GAAK,WAAU;GAA4B;GAAe,CAAA,CACtD"}
@@ -0,0 +1,12 @@
1
+ import { FC, ReactNode } from 'react';
2
+
3
+ interface PermissionGuardProps {
4
+ allowed: boolean;
5
+ isLoading: boolean;
6
+ pageTitle: string;
7
+ denyMessage?: string;
8
+ children: ReactNode;
9
+ }
10
+ export declare const PermissionGuard: FC<PermissionGuardProps>;
11
+ export {};
12
+ //# sourceMappingURL=PermissionGuard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionGuard.d.ts","sourceRoot":"","sources":["../../../src/admin/components/PermissionGuard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAI3C,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED,eAAO,MAAM,eAAe,EAAE,EAAE,CAAC,oBAAoB,CAoBpD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { PageLayout as e } from "./PageLayout.js";
2
+ import { AccessDenied as t } from "./AccessDenied.js";
3
+ import { Fragment as n, jsx as r } from "react/jsx-runtime";
4
+ //#region src/admin/components/PermissionGuard.tsx
5
+ var i = ({ allowed: i, isLoading: a, pageTitle: o, denyMessage: s, children: c }) => a ? /* @__PURE__ */ r(e, {
6
+ title: o,
7
+ children: /* @__PURE__ */ r("div", {
8
+ className: "text-center py-16 text-muted-foreground",
9
+ children: "Loading permissions..."
10
+ })
11
+ }) : i ? /* @__PURE__ */ r(n, { children: c }) : /* @__PURE__ */ r(e, {
12
+ title: o,
13
+ children: /* @__PURE__ */ r(t, { message: s })
14
+ });
15
+ //#endregion
16
+ export { i as PermissionGuard };
17
+
18
+ //# sourceMappingURL=PermissionGuard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PermissionGuard.js","names":[],"sources":["../../../src/admin/components/PermissionGuard.tsx"],"sourcesContent":["import type { FC, ReactNode } from 'react';\nimport { PageLayout } from './PageLayout';\nimport { AccessDenied } from './AccessDenied';\n\ninterface PermissionGuardProps {\n allowed: boolean;\n isLoading: boolean;\n pageTitle: string;\n denyMessage?: string;\n children: ReactNode;\n}\n\nexport const PermissionGuard: FC<PermissionGuardProps> = ({\n allowed,\n isLoading,\n pageTitle,\n denyMessage,\n children,\n}) => {\n if (isLoading)\n return (\n <PageLayout title={pageTitle}>\n <div className=\"text-center py-16 text-muted-foreground\">Loading permissions...</div>\n </PageLayout>\n );\n if (!allowed)\n return (\n <PageLayout title={pageTitle}>\n <AccessDenied message={denyMessage} />\n </PageLayout>\n );\n return <>{children}</>;\n};\n"],"mappings":";;;;AAYA,IAAa,KAA6C,EACxD,YACA,cACA,cACA,gBACA,kBAEI,IAEA,kBAAC,GAAD;CAAY,OAAO;WACjB,kBAAC,OAAD;EAAK,WAAU;YAA0C;EAA4B,CAAA;CAC1E,CAAA,GAEZ,IAME,kBAAA,GAAA,EAAG,aAAY,CAAA,GAJlB,kBAAC,GAAD;CAAY,OAAO;WACjB,kBAAC,GAAD,EAAc,SAAS,GAAe,CAAA;CAC3B,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { ReactNode } from 'react';
2
+
3
+ export interface RowAction {
4
+ /** Unique key for the action */
5
+ key: string;
6
+ /** Display label */
7
+ label: string;
8
+ /** Icon component */
9
+ icon?: ReactNode;
10
+ /** Action handler */
11
+ onClick: () => void;
12
+ /** Whether this is a destructive action */
13
+ destructive?: boolean;
14
+ /** Whether the action is disabled */
15
+ disabled?: boolean;
16
+ /** Separator before this item */
17
+ separator?: boolean;
18
+ }
19
+ export interface RowActionsProps {
20
+ /** Actions to display */
21
+ actions: RowAction[];
22
+ /** Accessibility label */
23
+ ariaLabel?: string;
24
+ /** Stop event propagation on click */
25
+ stopPropagation?: boolean;
26
+ }
27
+ /**
28
+ * RowActions - Dropdown menu for table row actions
29
+ */
30
+ export declare function RowActions({ actions, ariaLabel, stopPropagation, }: RowActionsProps): import("react/jsx-runtime").JSX.Element;
31
+ /**
32
+ * Create common row actions
33
+ */
34
+ export declare function createRowActions(config: {
35
+ onView?: () => void;
36
+ onEdit?: () => void;
37
+ onDuplicate?: () => void;
38
+ onOpenExternal?: () => void;
39
+ onDelete?: () => void;
40
+ }): RowAction[];
41
+ //# sourceMappingURL=RowActions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowActions.d.ts","sourceRoot":"","sources":["../../../src/admin/components/RowActions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASpE,MAAM,WAAW,SAAS;IACxB,gCAAgC;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,qBAAqB;IACrB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iCAAiC;IACjC,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,yBAAyB;IACzB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,0BAA0B;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,OAAO,EACP,SAAyB,EACzB,eAAsB,GACvB,EAAE,eAAe,2CAqGjB;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,IAAI,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB,GAAG,SAAS,EAAE,CAmDd"}
@@ -0,0 +1,93 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Button as t } from "./ui.js";
3
+ import { useEffect as n, useRef as r, useState as i } from "react";
4
+ import { Copy as a, ExternalLink as o, Eye as s, MoreHorizontal as c, Pencil as l, Trash2 as u } from "lucide-react";
5
+ import { jsx as d, jsxs as f } from "react/jsx-runtime";
6
+ //#region src/admin/components/RowActions.tsx
7
+ function p({ actions: a, ariaLabel: o = "Row actions", stopPropagation: s = !0 }) {
8
+ let [l, u] = i(!1), p = r(null), m = r(null);
9
+ n(() => {
10
+ if (!l) return;
11
+ let e = (e) => {
12
+ p.current && !p.current.contains(e.target) && u(!1);
13
+ };
14
+ return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
15
+ }, [l]), n(() => {
16
+ if (!l) return;
17
+ let e = (e) => {
18
+ e.key === "Escape" && u(!1);
19
+ };
20
+ return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
21
+ }, [l]);
22
+ let h = (e) => {
23
+ s && e.stopPropagation(), u(!l);
24
+ }, g = (e, t) => {
25
+ s && t.stopPropagation(), e.disabled || (u(!1), e.onClick());
26
+ };
27
+ return /* @__PURE__ */ f("div", {
28
+ ref: p,
29
+ className: "relative",
30
+ children: [/* @__PURE__ */ d(t, {
31
+ variant: "ghost",
32
+ size: "icon",
33
+ onClick: h,
34
+ "aria-label": o,
35
+ "aria-haspopup": "true",
36
+ "aria-expanded": l,
37
+ className: "h-8 w-8",
38
+ children: /* @__PURE__ */ d(c, { className: "h-4 w-4" })
39
+ }), l && /* @__PURE__ */ d("div", {
40
+ ref: m,
41
+ className: e("absolute right-0 top-full z-50 mt-1 min-w-[160px] rounded-md border border-border bg-popover p-1 shadow-lg", "animate-in fade-in-0 zoom-in-95 duration-100"),
42
+ role: "menu",
43
+ children: a.map((t, n) => /* @__PURE__ */ f("div", { children: [t.separator && n > 0 && /* @__PURE__ */ d("div", {
44
+ className: "my-1 h-px bg-border",
45
+ role: "separator"
46
+ }), /* @__PURE__ */ f("button", {
47
+ role: "menuitem",
48
+ onClick: (e) => g(t, e),
49
+ disabled: t.disabled,
50
+ className: e("flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors", "focus:bg-accent focus:outline-none", t.disabled ? "cursor-not-allowed opacity-50" : t.destructive ? "text-destructive hover:bg-destructive/10 focus:bg-destructive/10" : "text-foreground hover:bg-accent"),
51
+ children: [t.icon && /* @__PURE__ */ d("span", {
52
+ className: "h-4 w-4",
53
+ children: t.icon
54
+ }), t.label]
55
+ })] }, t.key))
56
+ })]
57
+ });
58
+ }
59
+ function m(e) {
60
+ let t = [];
61
+ return e.onView && t.push({
62
+ key: "view",
63
+ label: "View",
64
+ icon: /* @__PURE__ */ d(s, { className: "h-4 w-4" }),
65
+ onClick: e.onView
66
+ }), e.onEdit && t.push({
67
+ key: "edit",
68
+ label: "Edit",
69
+ icon: /* @__PURE__ */ d(l, { className: "h-4 w-4" }),
70
+ onClick: e.onEdit
71
+ }), e.onDuplicate && t.push({
72
+ key: "duplicate",
73
+ label: "Duplicate",
74
+ icon: /* @__PURE__ */ d(a, { className: "h-4 w-4" }),
75
+ onClick: e.onDuplicate
76
+ }), e.onOpenExternal && t.push({
77
+ key: "open-external",
78
+ label: "Open in new tab",
79
+ icon: /* @__PURE__ */ d(o, { className: "h-4 w-4" }),
80
+ onClick: e.onOpenExternal
81
+ }), e.onDelete && t.push({
82
+ key: "delete",
83
+ label: "Delete",
84
+ icon: /* @__PURE__ */ d(u, { className: "h-4 w-4" }),
85
+ onClick: e.onDelete,
86
+ destructive: !0,
87
+ separator: t.length > 0
88
+ }), t;
89
+ }
90
+ //#endregion
91
+ export { p as RowActions, m as createRowActions };
92
+
93
+ //# sourceMappingURL=RowActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RowActions.js","names":[],"sources":["../../../src/admin/components/RowActions.tsx"],"sourcesContent":["import { useState, useRef, useEffect, type ReactNode } from 'react';\nimport { MoreHorizontal, Pencil, Trash2, Eye, Copy, ExternalLink } from 'lucide-react';\nimport { Button } from './ui';\nimport { cn } from '../utils/cn';\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface RowAction {\n /** Unique key for the action */\n key: string;\n /** Display label */\n label: string;\n /** Icon component */\n icon?: ReactNode;\n /** Action handler */\n onClick: () => void;\n /** Whether this is a destructive action */\n destructive?: boolean;\n /** Whether the action is disabled */\n disabled?: boolean;\n /** Separator before this item */\n separator?: boolean;\n}\n\nexport interface RowActionsProps {\n /** Actions to display */\n actions: RowAction[];\n /** Accessibility label */\n ariaLabel?: string;\n /** Stop event propagation on click */\n stopPropagation?: boolean;\n}\n\n// ============================================================================\n// Component\n// ============================================================================\n\n/**\n * RowActions - Dropdown menu for table row actions\n */\nexport function RowActions({\n actions,\n ariaLabel = 'Row actions',\n stopPropagation = true,\n}: RowActionsProps) {\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on click outside\n useEffect(() => {\n if (!open) return;\n\n const handleClickOutside = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [open]);\n\n // Close on escape\n useEffect(() => {\n if (!open) return;\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n setOpen(false);\n }\n };\n\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }, [open]);\n\n const handleTriggerClick = (e: React.MouseEvent) => {\n if (stopPropagation) {\n e.stopPropagation();\n }\n setOpen(!open);\n };\n\n const handleActionClick = (action: RowAction, e: React.MouseEvent) => {\n if (stopPropagation) {\n e.stopPropagation();\n }\n if (!action.disabled) {\n setOpen(false);\n action.onClick();\n }\n };\n\n return (\n <div ref={containerRef} className=\"relative\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleTriggerClick}\n aria-label={ariaLabel}\n aria-haspopup=\"true\"\n aria-expanded={open}\n className=\"h-8 w-8\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n\n {open && (\n <div\n ref={menuRef}\n className={cn(\n 'absolute right-0 top-full z-50 mt-1 min-w-[160px] rounded-md border border-border bg-popover p-1 shadow-lg',\n 'animate-in fade-in-0 zoom-in-95 duration-100'\n )}\n role=\"menu\"\n >\n {actions.map((action, index) => (\n <div key={action.key}>\n {action.separator && index > 0 && (\n <div className=\"my-1 h-px bg-border\" role=\"separator\" />\n )}\n <button\n role=\"menuitem\"\n onClick={(e) => handleActionClick(action, e)}\n disabled={action.disabled}\n className={cn(\n 'flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-sm transition-colors',\n 'focus:bg-accent focus:outline-none',\n action.disabled\n ? 'cursor-not-allowed opacity-50'\n : action.destructive\n ? 'text-destructive hover:bg-destructive/10 focus:bg-destructive/10'\n : 'text-foreground hover:bg-accent'\n )}\n >\n {action.icon && <span className=\"h-4 w-4\">{action.icon}</span>}\n {action.label}\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n}\n\n// ============================================================================\n// Pre-built Action Helpers\n// ============================================================================\n\n/**\n * Create common row actions\n */\nexport function createRowActions(config: {\n onView?: () => void;\n onEdit?: () => void;\n onDuplicate?: () => void;\n onOpenExternal?: () => void;\n onDelete?: () => void;\n}): RowAction[] {\n const actions: RowAction[] = [];\n\n if (config.onView) {\n actions.push({\n key: 'view',\n label: 'View',\n icon: <Eye className=\"h-4 w-4\" />,\n onClick: config.onView,\n });\n }\n\n if (config.onEdit) {\n actions.push({\n key: 'edit',\n label: 'Edit',\n icon: <Pencil className=\"h-4 w-4\" />,\n onClick: config.onEdit,\n });\n }\n\n if (config.onDuplicate) {\n actions.push({\n key: 'duplicate',\n label: 'Duplicate',\n icon: <Copy className=\"h-4 w-4\" />,\n onClick: config.onDuplicate,\n });\n }\n\n if (config.onOpenExternal) {\n actions.push({\n key: 'open-external',\n label: 'Open in new tab',\n icon: <ExternalLink className=\"h-4 w-4\" />,\n onClick: config.onOpenExternal,\n });\n }\n\n if (config.onDelete) {\n actions.push({\n key: 'delete',\n label: 'Delete',\n icon: <Trash2 className=\"h-4 w-4\" />,\n onClick: config.onDelete,\n destructive: true,\n separator: actions.length > 0,\n });\n }\n\n return actions;\n}\n"],"mappings":";;;;;;AA0CA,SAAgB,EAAW,EACzB,YACA,eAAY,eACZ,qBAAkB,MACA;CAClB,IAAM,CAAC,GAAM,KAAW,EAAS,GAAM,EACjC,IAAe,EAAuB,KAAK,EAC3C,IAAU,EAAuB,KAAK;AAiB5C,CAdA,QAAgB;AACd,MAAI,CAAC,EAAM;EAEX,IAAM,KAAsB,MAAkB;AAC5C,GAAI,EAAa,WAAW,CAAC,EAAa,QAAQ,SAAS,EAAE,OAAe,IAC1E,EAAQ,GAAM;;AAKlB,SADA,SAAS,iBAAiB,aAAa,EAAmB,QAC7C,SAAS,oBAAoB,aAAa,EAAmB;IACzE,CAAC,EAAK,CAAC,EAGV,QAAgB;AACd,MAAI,CAAC,EAAM;EAEX,IAAM,KAAgB,MAAqB;AACzC,GAAI,EAAE,QAAQ,YACZ,EAAQ,GAAM;;AAKlB,SADA,SAAS,iBAAiB,WAAW,EAAa,QACrC,SAAS,oBAAoB,WAAW,EAAa;IACjE,CAAC,EAAK,CAAC;CAEV,IAAM,KAAsB,MAAwB;AAIlD,EAHI,KACF,EAAE,iBAAiB,EAErB,EAAQ,CAAC,EAAK;IAGV,KAAqB,GAAmB,MAAwB;AAIpE,EAHI,KACF,EAAE,iBAAiB,EAEhB,EAAO,aACV,EAAQ,GAAM,EACd,EAAO,SAAS;;AAIpB,QACE,kBAAC,OAAD;EAAK,KAAK;EAAc,WAAU;YAAlC,CACE,kBAAC,GAAD;GACE,SAAQ;GACR,MAAK;GACL,SAAS;GACT,cAAY;GACZ,iBAAc;GACd,iBAAe;GACf,WAAU;aAEV,kBAAC,GAAD,EAAgB,WAAU,WAAY,CAAA;GAC/B,CAAA,EAER,KACC,kBAAC,OAAD;GACE,KAAK;GACL,WAAW,EACT,8GACA,+CACD;GACD,MAAK;aAEJ,EAAQ,KAAK,GAAQ,MACpB,kBAAC,OAAD,EAAA,UAAA,CACG,EAAO,aAAa,IAAQ,KAC3B,kBAAC,OAAD;IAAK,WAAU;IAAsB,MAAK;IAAc,CAAA,EAE1D,kBAAC,UAAD;IACE,MAAK;IACL,UAAU,MAAM,EAAkB,GAAQ,EAAE;IAC5C,UAAU,EAAO;IACjB,WAAW,EACT,mFACA,sCACA,EAAO,WACH,kCACA,EAAO,cACL,qEACA,kCACP;cAZH,CAcG,EAAO,QAAQ,kBAAC,QAAD;KAAM,WAAU;eAAW,EAAO;KAAY,CAAA,EAC7D,EAAO,MACD;MACL,EAAA,EArBI,EAAO,IAqBX,CACN;GACE,CAAA,CAEJ;;;AAWV,SAAgB,EAAiB,GAMjB;CACd,IAAM,IAAuB,EAAE;AAiD/B,QA/CI,EAAO,UACT,EAAQ,KAAK;EACX,KAAK;EACL,OAAO;EACP,MAAM,kBAAC,GAAD,EAAK,WAAU,WAAY,CAAA;EACjC,SAAS,EAAO;EACjB,CAAC,EAGA,EAAO,UACT,EAAQ,KAAK;EACX,KAAK;EACL,OAAO;EACP,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;EACpC,SAAS,EAAO;EACjB,CAAC,EAGA,EAAO,eACT,EAAQ,KAAK;EACX,KAAK;EACL,OAAO;EACP,MAAM,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;EAClC,SAAS,EAAO;EACjB,CAAC,EAGA,EAAO,kBACT,EAAQ,KAAK;EACX,KAAK;EACL,OAAO;EACP,MAAM,kBAAC,GAAD,EAAc,WAAU,WAAY,CAAA;EAC1C,SAAS,EAAO;EACjB,CAAC,EAGA,EAAO,YACT,EAAQ,KAAK;EACX,KAAK;EACL,OAAO;EACP,MAAM,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;EACpC,SAAS,EAAO;EAChB,aAAa;EACb,WAAW,EAAQ,SAAS;EAC7B,CAAC,EAGG"}
@@ -0,0 +1,35 @@
1
+ import { TenantStatus, UserStatus, SubscriptionStatus, TicketStatus, TicketPriority, HealthStatus, DeploymentStatus } from '../types';
2
+
3
+ interface StatusBadgeProps {
4
+ className?: string;
5
+ }
6
+ interface TenantStatusBadgeProps extends StatusBadgeProps {
7
+ status: TenantStatus;
8
+ }
9
+ export declare function TenantStatusBadge({ status, className }: TenantStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
10
+ interface UserStatusBadgeProps extends StatusBadgeProps {
11
+ status: UserStatus;
12
+ }
13
+ export declare function UserStatusBadge({ status, className }: UserStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
14
+ interface SubscriptionStatusBadgeProps extends StatusBadgeProps {
15
+ status: SubscriptionStatus;
16
+ }
17
+ export declare function SubscriptionStatusBadge({ status, className }: SubscriptionStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
18
+ interface TicketStatusBadgeProps extends StatusBadgeProps {
19
+ status: TicketStatus;
20
+ }
21
+ export declare function TicketStatusBadge({ status, className }: TicketStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
22
+ interface TicketPriorityBadgeProps extends StatusBadgeProps {
23
+ priority: TicketPriority;
24
+ }
25
+ export declare function TicketPriorityBadge({ priority, className }: TicketPriorityBadgeProps): import("react/jsx-runtime").JSX.Element;
26
+ interface HealthStatusBadgeProps extends StatusBadgeProps {
27
+ status: HealthStatus;
28
+ }
29
+ export declare function HealthStatusBadge({ status, className }: HealthStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
30
+ interface DeploymentStatusBadgeProps extends StatusBadgeProps {
31
+ status: DeploymentStatus;
32
+ }
33
+ export declare function DeploymentStatusBadge({ status, className }: DeploymentStatusBadgeProps): import("react/jsx-runtime").JSX.Element;
34
+ export {};
35
+ //# sourceMappingURL=StatusBadge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.d.ts","sourceRoot":"","sources":["../../../src/admin/components/StatusBadge.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,UAAU,CAAC;AAElB,UAAU,gBAAgB;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,UAAU,sBAAuB,SAAQ,gBAAgB;IACvD,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAO9E;AAED,UAAU,oBAAqB,SAAQ,gBAAgB;IACrD,MAAM,EAAE,UAAU,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,oBAAoB,2CAO1E;AAED,UAAU,4BAA6B,SAAQ,gBAAgB;IAC7D,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,wBAAgB,uBAAuB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,4BAA4B,2CAO1F;AAED,UAAU,sBAAuB,SAAQ,gBAAgB;IACvD,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAO9E;AAED,UAAU,wBAAyB,SAAQ,gBAAgB;IACzD,QAAQ,EAAE,cAAc,CAAC;CAC1B;AAED,wBAAgB,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,wBAAwB,2CAOpF;AAED,UAAU,sBAAuB,SAAQ,gBAAgB;IACvD,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,sBAAsB,2CAO9E;AAED,UAAU,0BAA2B,SAAQ,gBAAgB;IAC3D,MAAM,EAAE,gBAAgB,CAAC;CAC1B;AAED,wBAAgB,qBAAqB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,0BAA0B,2CAOtF"}
@@ -0,0 +1,41 @@
1
+ import { cn as e } from "../utils/cn.js";
2
+ import { Badge as t } from "./ui.js";
3
+ import { DEPLOYMENT_STATUS_CONFIG as n, HEALTH_STATUS_CONFIG as r, TENANT_STATUS_CONFIG as i, USER_STATUS_CONFIG as a } from "../constants/index.js";
4
+ import { jsx as o } from "react/jsx-runtime";
5
+ //#region src/admin/components/StatusBadge.tsx
6
+ function s({ status: n, className: r }) {
7
+ let a = i[n];
8
+ return /* @__PURE__ */ o(t, {
9
+ className: e(a.color, r),
10
+ variant: "outline",
11
+ children: a.label
12
+ });
13
+ }
14
+ function c({ status: n, className: r }) {
15
+ let i = a[n];
16
+ return /* @__PURE__ */ o(t, {
17
+ className: e(i.color, r),
18
+ variant: "outline",
19
+ children: i.label
20
+ });
21
+ }
22
+ function l({ status: n, className: i }) {
23
+ let a = r[n];
24
+ return /* @__PURE__ */ o(t, {
25
+ className: e(a.color, i),
26
+ variant: "outline",
27
+ children: a.label
28
+ });
29
+ }
30
+ function u({ status: r, className: i }) {
31
+ let a = n[r];
32
+ return /* @__PURE__ */ o(t, {
33
+ className: e(a.color, i),
34
+ variant: "outline",
35
+ children: a.label
36
+ });
37
+ }
38
+ //#endregion
39
+ export { u as DeploymentStatusBadge, l as HealthStatusBadge, s as TenantStatusBadge, c as UserStatusBadge };
40
+
41
+ //# sourceMappingURL=StatusBadge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBadge.js","names":[],"sources":["../../../src/admin/components/StatusBadge.tsx"],"sourcesContent":["import { Badge } from './ui';\nimport { cn } from '../utils/cn';\nimport {\n TENANT_STATUS_CONFIG,\n USER_STATUS_CONFIG,\n SUBSCRIPTION_STATUS_CONFIG,\n TICKET_STATUS_CONFIG,\n TICKET_PRIORITY_CONFIG,\n HEALTH_STATUS_CONFIG,\n DEPLOYMENT_STATUS_CONFIG,\n} from '../constants';\nimport type {\n TenantStatus,\n UserStatus,\n SubscriptionStatus,\n TicketStatus,\n TicketPriority,\n HealthStatus,\n DeploymentStatus,\n} from '../types';\n\ninterface StatusBadgeProps {\n className?: string;\n}\n\ninterface TenantStatusBadgeProps extends StatusBadgeProps {\n status: TenantStatus;\n}\n\nexport function TenantStatusBadge({ status, className }: TenantStatusBadgeProps) {\n const config = TENANT_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface UserStatusBadgeProps extends StatusBadgeProps {\n status: UserStatus;\n}\n\nexport function UserStatusBadge({ status, className }: UserStatusBadgeProps) {\n const config = USER_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface SubscriptionStatusBadgeProps extends StatusBadgeProps {\n status: SubscriptionStatus;\n}\n\nexport function SubscriptionStatusBadge({ status, className }: SubscriptionStatusBadgeProps) {\n const config = SUBSCRIPTION_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface TicketStatusBadgeProps extends StatusBadgeProps {\n status: TicketStatus;\n}\n\nexport function TicketStatusBadge({ status, className }: TicketStatusBadgeProps) {\n const config = TICKET_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface TicketPriorityBadgeProps extends StatusBadgeProps {\n priority: TicketPriority;\n}\n\nexport function TicketPriorityBadge({ priority, className }: TicketPriorityBadgeProps) {\n const config = TICKET_PRIORITY_CONFIG[priority];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface HealthStatusBadgeProps extends StatusBadgeProps {\n status: HealthStatus;\n}\n\nexport function HealthStatusBadge({ status, className }: HealthStatusBadgeProps) {\n const config = HEALTH_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n\ninterface DeploymentStatusBadgeProps extends StatusBadgeProps {\n status: DeploymentStatus;\n}\n\nexport function DeploymentStatusBadge({ status, className }: DeploymentStatusBadgeProps) {\n const config = DEPLOYMENT_STATUS_CONFIG[status];\n return (\n <Badge className={cn(config.color, className)} variant=\"outline\">\n {config.label}\n </Badge>\n );\n}\n"],"mappings":";;;;;AA6BA,SAAgB,EAAkB,EAAE,WAAQ,gBAAqC;CAC/E,IAAM,IAAS,EAAqB;AACpC,QACE,kBAAC,GAAD;EAAO,WAAW,EAAG,EAAO,OAAO,EAAU;EAAE,SAAQ;YACpD,EAAO;EACF,CAAA;;AAQZ,SAAgB,EAAgB,EAAE,WAAQ,gBAAmC;CAC3E,IAAM,IAAS,EAAmB;AAClC,QACE,kBAAC,GAAD;EAAO,WAAW,EAAG,EAAO,OAAO,EAAU;EAAE,SAAQ;YACpD,EAAO;EACF,CAAA;;AA+CZ,SAAgB,EAAkB,EAAE,WAAQ,gBAAqC;CAC/E,IAAM,IAAS,EAAqB;AACpC,QACE,kBAAC,GAAD;EAAO,WAAW,EAAG,EAAO,OAAO,EAAU;EAAE,SAAQ;YACpD,EAAO;EACF,CAAA;;AAQZ,SAAgB,EAAsB,EAAE,WAAQ,gBAAyC;CACvF,IAAM,IAAS,EAAyB;AACxC,QACE,kBAAC,GAAD;EAAO,WAAW,EAAG,EAAO,OAAO,EAAU;EAAE,SAAQ;YACpD,EAAO;EACF,CAAA"}