@alepha/ui 0.18.3 → 0.19.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 (181) hide show
  1. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js → AdminApiKeys-C2ze85eD.js} +3 -4
  2. package/dist/admin/{AdminApiKeys-Dy_k-4Vd.js.map → AdminApiKeys-C2ze85eD.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-CKiFMSSU.js → AdminAudits-BIj81e4k.js} +3 -4
  4. package/dist/admin/{AdminAudits-CKiFMSSU.js.map → AdminAudits-BIj81e4k.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-PhC_dZqo.js → AdminDashboard-PMVzrwSu.js} +3 -4
  6. package/dist/admin/{AdminDashboard-PhC_dZqo.js.map → AdminDashboard-PMVzrwSu.js.map} +1 -1
  7. package/dist/admin/AdminFiles-Bq03BLt-.js +189 -0
  8. package/dist/admin/AdminFiles-Bq03BLt-.js.map +1 -0
  9. package/dist/admin/{AdminJobExecutions-D9E-CS-U.js → AdminJobs-D1_QGCDy.js} +401 -358
  10. package/dist/admin/AdminJobs-D1_QGCDy.js.map +1 -0
  11. package/dist/admin/{AdminLayout-I6TlUMPc.js → AdminLayout-BNiwiw2D.js} +8 -25
  12. package/dist/admin/AdminLayout-BNiwiw2D.js.map +1 -0
  13. package/dist/admin/{AdminNotifications-ZPHCYrv7.js → AdminNotifications-DSKQtUfn.js} +85 -124
  14. package/dist/admin/AdminNotifications-DSKQtUfn.js.map +1 -0
  15. package/dist/admin/{AdminParameters-CqgvhRsb.js → AdminParameters-CoB7EhyM.js} +3 -12
  16. package/dist/admin/{AdminParameters-CqgvhRsb.js.map → AdminParameters-CoB7EhyM.js.map} +1 -1
  17. package/dist/admin/{AdminSessions-Bz5NRuoW.js → AdminSessions-DFbFcrJQ.js} +3 -4
  18. package/dist/admin/{AdminSessions-Bz5NRuoW.js.map → AdminSessions-DFbFcrJQ.js.map} +1 -1
  19. package/dist/admin/{AdminUserLayout-lXT6I0Qq.js → AdminUserLayout-fSfi3KMm.js} +72 -111
  20. package/dist/admin/AdminUserLayout-fSfi3KMm.js.map +1 -0
  21. package/dist/admin/{AdminUserProfile-vFBLoJ3h.js → AdminUserProfile-_C-h8vUK.js} +7 -6
  22. package/dist/admin/AdminUserProfile-_C-h8vUK.js.map +1 -0
  23. package/dist/admin/{AdminUserSessions-CT_YDim0.js → AdminUserSessions-KpJHIeQo.js} +3 -4
  24. package/dist/admin/{AdminUserSessions-CT_YDim0.js.map → AdminUserSessions-KpJHIeQo.js.map} +1 -1
  25. package/dist/admin/{AdminUsers-D1UfGya9.js → AdminUsers-DcVrzdQP.js} +4 -4
  26. package/dist/admin/AdminUsers-DcVrzdQP.js.map +1 -0
  27. package/dist/admin/{AuthLayout-_frhdgOO.js → AuthLayout-CazfLzcf.js} +3 -4
  28. package/dist/admin/{AuthLayout-_frhdgOO.js.map → AuthLayout-CazfLzcf.js.map} +1 -1
  29. package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
  30. package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  31. package/dist/admin/{Login-xtNmQtGh.js → Login-CaMjUrDP.js} +5 -6
  32. package/dist/{auth/Login-BA1E8IZl.js.map → admin/Login-CaMjUrDP.js.map} +1 -1
  33. package/dist/admin/{Profile-_AtPUwAP.js → Profile-Ca4fZX15.js} +3 -5
  34. package/dist/{demo/Profile-DS5q4vOh.js.map → admin/Profile-Ca4fZX15.js.map} +1 -1
  35. package/dist/admin/{Register-JcCjHUUn.js → Register-C5DyKWPO.js} +5 -6
  36. package/dist/{demo/Register-B4hLBeEv.js.map → admin/Register-C5DyKWPO.js.map} +1 -1
  37. package/dist/admin/{ResetPassword-CwGBPLJO.js → ResetPassword-BA5sAgXo.js} +4 -5
  38. package/dist/{auth/ResetPassword-DCtGcneA.js.map → admin/ResetPassword-BA5sAgXo.js.map} +1 -1
  39. package/dist/admin/{VerifyEmail-hNxWejWf.js → VerifyEmail-DKNXROj_.js} +4 -5
  40. package/dist/{auth/VerifyEmail-DkH7NBfn.js.map → admin/VerifyEmail-DKNXROj_.js.map} +1 -1
  41. package/dist/admin/adminUserAtom-BLNc7XbT.js +11 -0
  42. package/dist/admin/adminUserAtom-BLNc7XbT.js.map +1 -0
  43. package/dist/admin/{core-CYaRQ8O-.js → core-CJCEx18C.js} +132 -86
  44. package/dist/admin/core-CJCEx18C.js.map +1 -0
  45. package/dist/admin/index.d.ts +80 -13
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +38 -68
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
  50. package/dist/{demo/AuthLayout-Brri4A-L.js → auth/AuthLayout-vXPcCVzp.js} +3 -4
  51. package/dist/auth/{AuthLayout-AvLlcLjS.js.map → AuthLayout-vXPcCVzp.js.map} +1 -1
  52. package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
  53. package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
  54. package/dist/auth/{Login-BA1E8IZl.js → Login-Dg08QR20.js} +5 -6
  55. package/dist/{demo/Login-C12N4oGs.js.map → auth/Login-Dg08QR20.js.map} +1 -1
  56. package/dist/{demo/Profile-DS5q4vOh.js → auth/Profile-Bb5O1yeh.js} +3 -5
  57. package/dist/auth/{Profile-YcWdeuFz.js.map → Profile-Bb5O1yeh.js.map} +1 -1
  58. package/dist/auth/{Register-CPhEO5MG.js → Register-B2AN71NC.js} +5 -6
  59. package/dist/{admin/Register-JcCjHUUn.js.map → auth/Register-B2AN71NC.js.map} +1 -1
  60. package/dist/{demo/ResetPassword-D8g9ha1N.js → auth/ResetPassword-BLxwzbDj.js} +4 -5
  61. package/dist/{admin/ResetPassword-CwGBPLJO.js.map → auth/ResetPassword-BLxwzbDj.js.map} +1 -1
  62. package/dist/auth/{VerifyEmail-DkH7NBfn.js → VerifyEmail-CSDOk3Zm.js} +4 -5
  63. package/dist/{admin/VerifyEmail-hNxWejWf.js.map → auth/VerifyEmail-CSDOk3Zm.js.map} +1 -1
  64. package/dist/auth/{core-D5jIAVF2.js → core-DuGkjPiU.js} +23 -54
  65. package/dist/auth/core-DuGkjPiU.js.map +1 -0
  66. package/dist/auth/index.d.ts +20 -6
  67. package/dist/auth/index.d.ts.map +1 -1
  68. package/dist/auth/index.js +13 -18
  69. package/dist/auth/index.js.map +1 -1
  70. package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
  71. package/dist/core/index.d.ts +78 -20
  72. package/dist/core/index.d.ts.map +1 -1
  73. package/dist/core/index.js +130 -98
  74. package/dist/core/index.js.map +1 -1
  75. package/dist/{auth/AuthLayout-AvLlcLjS.js → demo/AuthLayout-DPsOOG4u.js} +3 -4
  76. package/dist/demo/{AuthLayout-Brri4A-L.js.map → AuthLayout-DPsOOG4u.js.map} +1 -1
  77. package/dist/demo/{DemoButton-wiCxZZ_L.js → DemoButton-wzcqGk4u.js} +4 -5
  78. package/dist/demo/{DemoButton-wiCxZZ_L.js.map → DemoButton-wzcqGk4u.js.map} +1 -1
  79. package/dist/demo/{DemoControlSelect-D7ILObVg.js → DemoControlSelect-CMWvQ6Gm.js} +4 -5
  80. package/dist/demo/{DemoControlSelect-D7ILObVg.js.map → DemoControlSelect-CMWvQ6Gm.js.map} +1 -1
  81. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js → DemoDataTable-CHsAP3e2.js} +4 -5
  82. package/dist/demo/{DemoDataTable-DZ5Y8pFX.js.map → DemoDataTable-CHsAP3e2.js.map} +1 -1
  83. package/dist/demo/{DemoDialog-CUWdLHim.js → DemoDialog-Co2IePxX.js} +3 -4
  84. package/dist/demo/{DemoDialog-CUWdLHim.js.map → DemoDialog-Co2IePxX.js.map} +1 -1
  85. package/dist/demo/{DemoFlex-a8OhMMvq.js → DemoFlex-OEwQt5do.js} +4 -5
  86. package/dist/demo/{DemoFlex-a8OhMMvq.js.map → DemoFlex-OEwQt5do.js.map} +1 -1
  87. package/dist/demo/DemoHeading-Db-XkQIK.js +69 -0
  88. package/dist/demo/DemoHeading-Db-XkQIK.js.map +1 -0
  89. package/dist/demo/{DemoHome-D_De3UiT.js → DemoHome-Cyp29ygy.js} +4 -5
  90. package/dist/demo/{DemoHome-D_De3UiT.js.map → DemoHome-Cyp29ygy.js.map} +1 -1
  91. package/dist/demo/{DemoJsonViewer-B50s9aGM.js → DemoJsonViewer-DXtCeMzH.js} +4 -5
  92. package/dist/demo/{DemoJsonViewer-B50s9aGM.js.map → DemoJsonViewer-DXtCeMzH.js.map} +1 -1
  93. package/dist/demo/{DemoLayout-CHU8WTwO.js → DemoLayout-hh9VmZQP.js} +4 -5
  94. package/dist/demo/DemoLayout-hh9VmZQP.js.map +1 -0
  95. package/dist/demo/{DemoLogin-BBlrWpml.js → DemoLogin-DX7mnmkh.js} +15 -11
  96. package/dist/demo/{DemoLogin-BBlrWpml.js.map → DemoLogin-DX7mnmkh.js.map} +1 -1
  97. package/dist/demo/{DemoRegister-BuNE3_-f.js → DemoRegister-DVcZl04m.js} +15 -11
  98. package/dist/demo/{DemoRegister-BuNE3_-f.js.map → DemoRegister-DVcZl04m.js.map} +1 -1
  99. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js → DemoResetPassword-CPENlZH5.js} +15 -11
  100. package/dist/demo/{DemoResetPassword-D_IjjjOJ.js.map → DemoResetPassword-CPENlZH5.js.map} +1 -1
  101. package/dist/demo/{DemoSidebar-Giy2HRBD.js → DemoSidebar-CGu7DZeM.js} +4 -5
  102. package/dist/demo/{DemoSidebar-Giy2HRBD.js.map → DemoSidebar-CGu7DZeM.js.map} +1 -1
  103. package/dist/demo/{DemoText-ubcw-vog.js → DemoText-DYUJ7bY_.js} +4 -5
  104. package/dist/demo/{DemoText-ubcw-vog.js.map → DemoText-DYUJ7bY_.js.map} +1 -1
  105. package/dist/demo/{DemoToast-9die_dYT.js → DemoToast-CgdnZNvx.js} +3 -4
  106. package/dist/demo/{DemoToast-9die_dYT.js.map → DemoToast-CgdnZNvx.js.map} +1 -1
  107. package/dist/demo/{DemoTypeForm-D_d6OVKL.js → DemoTypeForm-Pims-cGa.js} +4 -5
  108. package/dist/demo/{DemoTypeForm-D_d6OVKL.js.map → DemoTypeForm-Pims-cGa.js.map} +1 -1
  109. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js → DemoVerifyEmail-C7B3xxch.js} +10 -11
  110. package/dist/demo/{DemoVerifyEmail-B43KlF4F.js.map → DemoVerifyEmail-C7B3xxch.js.map} +1 -1
  111. package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
  112. package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
  113. package/dist/demo/{Login-C12N4oGs.js → Login-pwMF4TUj.js} +5 -6
  114. package/dist/{admin/Login-xtNmQtGh.js.map → demo/Login-pwMF4TUj.js.map} +1 -1
  115. package/dist/{auth/Profile-YcWdeuFz.js → demo/Profile-BliZapZS.js} +3 -5
  116. package/dist/{admin/Profile-_AtPUwAP.js.map → demo/Profile-BliZapZS.js.map} +1 -1
  117. package/dist/demo/{Register-B4hLBeEv.js → Register-CiwAT7Hy.js} +5 -6
  118. package/dist/{auth/Register-CPhEO5MG.js.map → demo/Register-CiwAT7Hy.js.map} +1 -1
  119. package/dist/{auth/ResetPassword-DCtGcneA.js → demo/ResetPassword-l9Vg4JE-.js} +4 -5
  120. package/dist/demo/{ResetPassword-D8g9ha1N.js.map → ResetPassword-l9Vg4JE-.js.map} +1 -1
  121. package/dist/demo/{Showcase-D6Fxt4X4.js → Showcase-CX6bDgwe.js} +3 -5
  122. package/dist/demo/{Showcase-D6Fxt4X4.js.map → Showcase-CX6bDgwe.js.map} +1 -1
  123. package/dist/demo/{VerifyEmail-BjDo0cZA.js → VerifyEmail-CAB-OS7i.js} +4 -5
  124. package/dist/demo/{VerifyEmail-BjDo0cZA.js.map → VerifyEmail-CAB-OS7i.js.map} +1 -1
  125. package/dist/demo/{auth-ByVTreDl.js → auth-uegJAdKu.js} +18 -35
  126. package/dist/demo/{auth-ByVTreDl.js.map → auth-uegJAdKu.js.map} +1 -1
  127. package/dist/demo/{core-DFgB3yU4.js → core-B4LVHzPn.js} +132 -93
  128. package/dist/demo/core-B4LVHzPn.js.map +1 -0
  129. package/dist/demo/index.js +20 -23
  130. package/dist/demo/index.js.map +1 -1
  131. package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
  132. package/package.json +17 -20
  133. package/src/admin/AdminRouter.tsx +23 -38
  134. package/src/admin/atoms/adminUserAtom.ts +7 -0
  135. package/src/admin/components/AdminLayout.tsx +2 -14
  136. package/src/admin/components/files/AdminFiles.tsx +123 -1
  137. package/src/admin/components/jobs/{AdminJobExecutions.tsx → AdminJobs.tsx} +450 -317
  138. package/src/admin/components/notifications/AdminNotifications.tsx +11 -25
  139. package/src/admin/components/users/AdminUserLayout.tsx +84 -127
  140. package/src/admin/components/users/AdminUserProfile.tsx +5 -2
  141. package/src/admin/components/users/AdminUsers.tsx +1 -1
  142. package/src/core/components/Flex.tsx +24 -0
  143. package/src/core/components/Section.tsx +109 -0
  144. package/src/core/components/SectionHeader.tsx +106 -0
  145. package/src/core/components/buttons/ActionButton.tsx +1 -0
  146. package/src/core/components/dialogs/PromptDialog.tsx +1 -1
  147. package/src/core/components/layout/Breadcrumb.tsx +2 -2
  148. package/src/core/components/layout/DashboardShell.tsx +1 -1
  149. package/src/core/index.ts +4 -1
  150. package/src/core/services/DialogService.tsx +2 -2
  151. package/src/core/styles.css +2 -1
  152. package/src/core/table/components/DataTable.tsx +5 -2
  153. package/src/demo/DemoRouter.ts +1 -1
  154. package/src/demo/components/auth/DemoLogin.tsx +5 -0
  155. package/src/demo/components/auth/DemoRegister.tsx +5 -0
  156. package/src/demo/components/auth/DemoResetPassword.tsx +5 -0
  157. package/src/demo/components/core/DemoHeading.tsx +56 -3
  158. package/dist/admin/AdminFiles-DFTjijGp.js +0 -111
  159. package/dist/admin/AdminFiles-DFTjijGp.js.map +0 -1
  160. package/dist/admin/AdminJobDashboard-BL8gGPDp.js +0 -354
  161. package/dist/admin/AdminJobDashboard-BL8gGPDp.js.map +0 -1
  162. package/dist/admin/AdminJobExecutions-D9E-CS-U.js.map +0 -1
  163. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js +0 -270
  164. package/dist/admin/AdminJobRegistry-Ci9ue1zC.js.map +0 -1
  165. package/dist/admin/AdminLayout-I6TlUMPc.js.map +0 -1
  166. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +0 -1
  167. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +0 -1
  168. package/dist/admin/AdminUserProfile-vFBLoJ3h.js.map +0 -1
  169. package/dist/admin/AdminUsers-D1UfGya9.js.map +0 -1
  170. package/dist/admin/core-CYaRQ8O-.js.map +0 -1
  171. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  172. package/dist/auth/core-D5jIAVF2.js.map +0 -1
  173. package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
  174. package/dist/demo/DemoHeading-C13OVDfS.js +0 -18
  175. package/dist/demo/DemoHeading-C13OVDfS.js.map +0 -1
  176. package/dist/demo/DemoLayout-CHU8WTwO.js.map +0 -1
  177. package/dist/demo/core-DFgB3yU4.js.map +0 -1
  178. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  179. package/src/admin/components/jobs/AdminJobDashboard.tsx +0 -349
  180. package/src/admin/components/jobs/AdminJobRegistry.tsx +0 -301
  181. package/src/core/components/Heading.tsx +0 -19
@@ -69,7 +69,7 @@ export interface DashboardShellProps {
69
69
  container?: boolean | ContainerProps;
70
70
 
71
71
  /**
72
- * If true, the DashboardShell will fill the height of its container.
72
+ * If true, the DashboardShell will fill the height with its container.
73
73
  */
74
74
  fill?: boolean;
75
75
  }
package/src/core/index.ts CHANGED
@@ -61,7 +61,6 @@ export { default as ConfirmDialog } from "./components/dialogs/ConfirmDialog.tsx
61
61
  export { default as PromptDialog } from "./components/dialogs/PromptDialog.tsx";
62
62
  export type { FlexProps } from "./components/Flex.tsx";
63
63
  export { default as Flex } from "./components/Flex.tsx";
64
- export { default as Heading } from "./components/Heading.tsx";
65
64
  export type {
66
65
  AppBarBack,
67
66
  AppBarBurger,
@@ -105,6 +104,10 @@ export { Sidebar } from "./components/layout/Sidebar.tsx";
105
104
  export { SidebarCollapsedItem } from "./components/layout/SidebarCollapsedItem.tsx";
106
105
  export type { SidebarItemProps } from "./components/layout/SidebarItem.tsx";
107
106
  export { SidebarItem } from "./components/layout/SidebarItem.tsx";
107
+ export type { SectionProps } from "./components/Section.tsx";
108
+ export { default as Section } from "./components/Section.tsx";
109
+ export type { SectionHeaderProps } from "./components/SectionHeader.tsx";
110
+ export { default as SectionHeader } from "./components/SectionHeader.tsx";
108
111
  export type { TextProps } from "./components/Text.tsx";
109
112
  export { default as Text } from "./components/Text.tsx";
110
113
  export * from "./constants/ui.ts";
@@ -117,8 +117,8 @@ export class DialogService {
117
117
  <ConfirmDialog
118
118
  options={options}
119
119
  onConfirm={(confirmed) => {
120
- this.close(modalId);
121
120
  done(confirmed);
121
+ this.close(modalId);
122
122
  }}
123
123
  />
124
124
  ),
@@ -147,8 +147,8 @@ export class DialogService {
147
147
  <PromptDialog
148
148
  options={options}
149
149
  onSubmit={(value) => {
150
- this.close(modalId);
151
150
  done(value);
151
+ this.close(modalId);
152
152
  }}
153
153
  />
154
154
  ),
@@ -112,7 +112,8 @@
112
112
 
113
113
  /* ------------------------------------------------------------------------------------------------------------------ */
114
114
  /* our custom "minimal" variant for <Button/> - from Blueprint */
115
- .mantine-Button-root[data-variant="minimal"] {
115
+ .mantine-Button-root[data-variant="minimal"],
116
+ .mantine-Anchor-root[data-variant="minimal"] {
116
117
  background-color: transparent;
117
118
  color: var(--mantine-color-text);
118
119
  }
@@ -90,7 +90,11 @@ const toAriaSort = (
90
90
  return "none";
91
91
  };
92
92
 
93
- const FIT_STYLE = { width: 1, whiteSpace: "nowrap" } as const;
93
+ const FIT_STYLE = {
94
+ width: 1,
95
+ whiteSpace: "nowrap",
96
+ minWidth: "fit-content",
97
+ } as const;
94
98
 
95
99
  const DataTable = <T extends object, Filters extends TObject>(
96
100
  props: DataTableProps<T, Filters>,
@@ -606,7 +610,6 @@ const DataTable = <T extends object, Filters extends TObject>(
606
610
  position: "sticky",
607
611
  top: 0,
608
612
  zIndex: 1,
609
- backgroundColor: "var(--alepha-elevated)",
610
613
  }}
611
614
  >
612
615
  <Table.Tr>
@@ -76,7 +76,7 @@ export class DemoRouter {
76
76
  demoHeading = $page({
77
77
  icon: IconHeading,
78
78
  path: "/heading",
79
- label: "Heading",
79
+ label: "Section",
80
80
  lazy: () => import("./components/core/DemoHeading.tsx"),
81
81
  });
82
82
 
@@ -104,6 +104,11 @@ const buildRealmConfig = (props: {
104
104
  requireNumbers: true,
105
105
  requireSpecialCharacters: false,
106
106
  },
107
+ loginRateLimit: {
108
+ ipMaxAttempts: 15,
109
+ accountMaxAttempts: 5,
110
+ windowMs: 15 * 60 * 1000,
111
+ },
107
112
  },
108
113
  };
109
114
  };
@@ -98,6 +98,11 @@ const buildRealmConfig = (props: {
98
98
  requireNumbers: true,
99
99
  requireSpecialCharacters: false,
100
100
  },
101
+ loginRateLimit: {
102
+ ipMaxAttempts: 15,
103
+ accountMaxAttempts: 5,
104
+ windowMs: 15 * 60 * 1000,
105
+ },
101
106
  },
102
107
  };
103
108
  };
@@ -45,6 +45,11 @@ const buildRealmConfig = (props: {
45
45
  requireNumbers: true,
46
46
  requireSpecialCharacters: false,
47
47
  },
48
+ loginRateLimit: {
49
+ ipMaxAttempts: 15,
50
+ accountMaxAttempts: 5,
51
+ windowMs: 15 * 60 * 1000,
52
+ },
48
53
  },
49
54
  };
50
55
  };
@@ -1,11 +1,64 @@
1
- import { Heading } from "@alepha/ui";
1
+ import { Flex, Section, SectionHeader } from "@alepha/ui";
2
+ import { IconUser } from "@tabler/icons-react";
2
3
  import { t } from "alepha";
3
4
  import Showcase from "../shared/Showcase.tsx";
4
5
 
5
6
  const DemoHeading = () => {
6
7
  return (
7
- <Showcase title="Flex" schema={t.object({})} initialValues={{}}>
8
- {(props) => <Heading title={"Hello!"} />}
8
+ <Showcase
9
+ title="SectionHeader & Section"
10
+ schema={t.object({})}
11
+ initialValues={{}}
12
+ >
13
+ {() => (
14
+ <Flex col gap="lg" w="100%">
15
+ <SectionHeader title="Simple" />
16
+
17
+ <SectionHeader
18
+ title="With Icon & Subtitle"
19
+ icon={IconUser}
20
+ subtitle="This is a subtitle"
21
+ />
22
+
23
+ <SectionHeader
24
+ title="With Actions"
25
+ subtitle="Section with action buttons"
26
+ actions={[
27
+ { children: "Edit", onClick: () => {} },
28
+ { children: "Delete", intent: "danger", onClick: () => {} },
29
+ ]}
30
+ />
31
+
32
+ <Section title="Basic Section">
33
+ Section body content goes here.
34
+ </Section>
35
+
36
+ <Section
37
+ title="With Icon & Actions"
38
+ icon={IconUser}
39
+ subtitle="A section with header features"
40
+ actions={[{ children: "Edit", onClick: () => {} }]}
41
+ >
42
+ Section body with icon and actions.
43
+ </Section>
44
+
45
+ <Section
46
+ title="Collapsible Section"
47
+ collapsible
48
+ subtitle="Click header to toggle"
49
+ >
50
+ This content can be collapsed.
51
+ </Section>
52
+
53
+ <Section title="Collapsed by Default" collapsible defaultCollapsed>
54
+ This was hidden initially.
55
+ </Section>
56
+
57
+ <Section>
58
+ Section without header — just a bordered surface container.
59
+ </Section>
60
+ </Flex>
61
+ )}
9
62
  </Showcase>
10
63
  );
11
64
  };
@@ -1,111 +0,0 @@
1
- import { l as Flex, r as DataTable, s as Text } from "./core-CYaRQ8O-.js";
2
- import { t } from "alepha";
3
- import { useI18n } from "alepha/react/i18n";
4
- import { jsx } from "react/jsx-runtime";
5
- import { useClient } from "alepha/react";
6
- import { files } from "alepha/api/files";
7
-
8
- //#region ../../src/admin/components/files/AdminFiles.tsx
9
- const AdminFiles = () => {
10
- const client = useClient();
11
- const { l } = useI18n();
12
- const filters = t.object({
13
- bucket: t.optional(t.string()),
14
- name: t.optional(t.string({ $control: { query: t.pick(files.schema, [
15
- "name",
16
- "bucket",
17
- "mimeType"
18
- ]) } }))
19
- });
20
- const formatFileSize = (bytes) => {
21
- if (bytes === 0) return "0 B";
22
- const k = 1024;
23
- const sizes = [
24
- "B",
25
- "KB",
26
- "MB",
27
- "GB"
28
- ];
29
- const i = Math.floor(Math.log(bytes) / Math.log(k));
30
- return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
31
- };
32
- return /* @__PURE__ */ jsx(Flex, {
33
- p: "md",
34
- flex: 1,
35
- direction: "column",
36
- children: /* @__PURE__ */ jsx(DataTable, {
37
- submitOnInit: true,
38
- defaultSize: 10,
39
- typeFormProps: {
40
- skipSubmitButton: true,
41
- columns: 3
42
- },
43
- tableProps: {
44
- horizontalSpacing: "xs",
45
- verticalSpacing: "xs"
46
- },
47
- onFilterChange: (key, _value, form) => {
48
- if (key === "name" || key === "bucket") return form.submit();
49
- },
50
- filters,
51
- items: async (filters) => {
52
- return await client.findFiles({ query: filters });
53
- },
54
- columns: {
55
- name: {
56
- label: "Name",
57
- value: (item) => /* @__PURE__ */ jsx(Text, {
58
- size: "sm",
59
- fw: 500,
60
- lineClamp: 1,
61
- children: item.name
62
- })
63
- },
64
- bucket: {
65
- label: "Bucket",
66
- value: (item) => /* @__PURE__ */ jsx(Text, {
67
- size: "xs",
68
- ff: "monospace",
69
- children: item.bucket
70
- })
71
- },
72
- mimeType: {
73
- label: "Type",
74
- value: (item) => /* @__PURE__ */ jsx(Text, {
75
- size: "xs",
76
- c: "dimmed",
77
- children: item.mimeType
78
- })
79
- },
80
- size: {
81
- label: "Size",
82
- value: (item) => /* @__PURE__ */ jsx(Text, {
83
- size: "xs",
84
- c: "dimmed",
85
- children: formatFileSize(item.size)
86
- })
87
- },
88
- creatorName: {
89
- label: "Creator",
90
- value: (item) => /* @__PURE__ */ jsx(Text, {
91
- size: "xs",
92
- c: "dimmed",
93
- children: item.creatorName || "-"
94
- })
95
- },
96
- createdAt: {
97
- label: "Created",
98
- value: (item) => /* @__PURE__ */ jsx(Text, {
99
- size: "xs",
100
- c: "dimmed",
101
- children: l(item.createdAt, { date: "fromNow" })
102
- })
103
- }
104
- }
105
- })
106
- });
107
- };
108
-
109
- //#endregion
110
- export { AdminFiles as default };
111
- //# sourceMappingURL=AdminFiles-DFTjijGp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminFiles-DFTjijGp.js","names":[],"sources":["../../src/admin/components/files/AdminFiles.tsx"],"sourcesContent":["import { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { type Page, t } from \"alepha\";\nimport { type FileController, type FileEntity, files } from \"alepha/api/files\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\n\nconst AdminFiles = () => {\n const client = useClient<FileController>();\n const { l } = useI18n();\n\n const filters = t.object({\n bucket: t.optional(t.string()),\n name: t.optional(\n t.string({\n $control: {\n query: t.pick(files.schema, [\"name\", \"bucket\", \"mimeType\"]),\n },\n }),\n ),\n });\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;\n };\n\n return (\n <Flex p=\"md\" flex={1} direction={\"column\"}>\n <DataTable<FileEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"name\" || key === \"bucket\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.findFiles({\n query: filters,\n });\n\n return response as Page<FileEntity>;\n }}\n columns={{\n name: {\n label: \"Name\",\n value: (item) => (\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {item.name}\n </Text>\n ),\n },\n bucket: {\n label: \"Bucket\",\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\">\n {item.bucket}\n </Text>\n ),\n },\n mimeType: {\n label: \"Type\",\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.mimeType}\n </Text>\n ),\n },\n size: {\n label: \"Size\",\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {formatFileSize(item.size)}\n </Text>\n ),\n },\n creatorName: {\n label: \"Creator\",\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.creatorName || \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Created\",\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminFiles;\n"],"mappings":";;;;;;;;AAMA,MAAM,mBAAmB;CACvB,MAAM,SAAS,WAA2B;CAC1C,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO;EACvB,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC9B,MAAM,EAAE,SACN,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,MAAM,QAAQ;GAAC;GAAQ;GAAU;GAAW,CAAC,EAC5D,EACF,CAAC,CACH;EACF,CAAC;CAEF,MAAM,kBAAkB,UAAkB;AACxC,MAAI,UAAU,EAAG,QAAO;EACxB,MAAM,IAAI;EACV,MAAM,QAAQ;GAAC;GAAK;GAAM;GAAM;GAAK;EACrC,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,SAAO,GAAG,OAAO,YAAY,QAAQ,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM;;AAGpE,QACE,oBAAC;EAAK,GAAE;EAAK,MAAM;EAAG,WAAW;YAC/B,oBAAC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,UAAU,QAAQ,SAC5B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,YAAY;AAKxB,WAJiB,MAAM,OAAO,UAAU,EACtC,OAAO,SACR,CAAC;;GAIJ,SAAS;IACP,MAAM;KACJ,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAI;MAAK,WAAW;gBACjC,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAG;gBAChB,KAAK;OACD;KAEV;IACD,UAAU;KACR,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK;OACD;KAEV;IACD,MAAM;KACJ,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,eAAe,KAAK,KAAK;OACrB;KAEV;IACD,aAAa;KACX,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK,eAAe;OAChB;KAEV;IACD,WAAW;KACT,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG"}
@@ -1,354 +0,0 @@
1
- import { _ as ActionButton, b as useToast, l as Flex$1, s as Text$1, u as StatCards } from "./core-CYaRQ8O-.js";
2
- import { useI18n } from "alepha/react/i18n";
3
- import { Paper, SimpleGrid, Table } from "@mantine/core";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
- import { useCallback, useEffect, useState } from "react";
6
- import { IconAlertTriangle, IconCircleCheck, IconPlayerPlay, IconRefresh, IconTerminal2 } from "@tabler/icons-react";
7
- import { useClient } from "alepha/react";
8
- import { AreaChart, BarChart, DonutChart } from "@mantine/charts";
9
-
10
- //#region ../../src/admin/components/jobs/AdminJobDashboard.tsx
11
- const formatDuration = (start, end) => {
12
- const startTime = new Date(start).getTime();
13
- const duration = (end ? new Date(end).getTime() : Date.now()) - startTime;
14
- if (duration < 1e3) return `${duration}ms`;
15
- if (duration < 6e4) return `${(duration / 1e3).toFixed(1)}s`;
16
- if (duration < 36e5) return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
17
- return `${Math.floor(duration / 36e5)}h ${Math.floor(duration % 36e5 / 6e4)}m`;
18
- };
19
- const AdminJobDashboard = () => {
20
- const client = useClient();
21
- const { l } = useI18n();
22
- const toast = useToast();
23
- const [stats, setStats] = useState(null);
24
- const [recent, setRecent] = useState([]);
25
- const [failures, setFailures] = useState([]);
26
- const [activity, setActivity] = useState([]);
27
- const [queueDepth, setQueueDepth] = useState([]);
28
- const loadData = useCallback(async () => {
29
- try {
30
- const [statsData, recentData, failureData, activityData, queueData] = await Promise.all([
31
- client.getJobStats(),
32
- client.findJobExecutions({ query: {
33
- sort: "-createdAt",
34
- size: 10
35
- } }),
36
- client.getJobTopFailures(),
37
- client.getJobActivity({ query: { days: 14 } }),
38
- client.getJobQueueDepth()
39
- ]);
40
- setStats(statsData);
41
- setRecent(recentData.content);
42
- setFailures(failureData);
43
- setActivity(activityData);
44
- setQueueDepth(queueData);
45
- } catch {
46
- toast.danger("Failed to load dashboard data");
47
- }
48
- }, [client, toast]);
49
- useEffect(() => {
50
- loadData();
51
- }, [loadData]);
52
- const activityChartData = activity.map((point) => ({
53
- date: new Date(point.date).toLocaleDateString("en-US", {
54
- month: "short",
55
- day: "numeric"
56
- }),
57
- completed: point.completed,
58
- failed: point.failed
59
- }));
60
- const queueChartData = queueDepth.filter((q) => q.pending + q.running + q.scheduled + q.retrying + q.dead > 0).map((q) => ({
61
- job: q.jobName.length > 20 ? `...${q.jobName.slice(q.jobName.length - 18)}` : q.jobName,
62
- pending: q.pending,
63
- running: q.running,
64
- scheduled: q.scheduled,
65
- retrying: q.retrying,
66
- dead: q.dead
67
- }));
68
- const statusDonutData = stats ? [
69
- {
70
- name: "Running",
71
- value: stats.running,
72
- color: "blue"
73
- },
74
- {
75
- name: "Pending",
76
- value: stats.pending,
77
- color: "gray"
78
- },
79
- {
80
- name: "Scheduled",
81
- value: stats.scheduled,
82
- color: "violet"
83
- },
84
- {
85
- name: "Retrying",
86
- value: stats.retrying,
87
- color: "yellow"
88
- },
89
- {
90
- name: "Dead",
91
- value: stats.dead,
92
- color: "red"
93
- }
94
- ].filter((d) => d.value > 0) : [];
95
- return /* @__PURE__ */ jsxs(Flex$1, {
96
- flex: 1,
97
- direction: "column",
98
- gap: "md",
99
- p: "md",
100
- children: [
101
- /* @__PURE__ */ jsxs(Flex$1, {
102
- justify: "space-between",
103
- align: "center",
104
- children: [/* @__PURE__ */ jsx(Text$1, {
105
- size: "lg",
106
- fw: 600,
107
- children: "Jobs Dashboard"
108
- }), /* @__PURE__ */ jsx(ActionButton, {
109
- tooltip: "Refresh",
110
- variant: "light",
111
- size: "sm",
112
- icon: IconRefresh,
113
- onClick: loadData
114
- })]
115
- }),
116
- stats && /* @__PURE__ */ jsx(StatCards, { items: [
117
- {
118
- label: "Registered",
119
- value: stats.registered,
120
- icon: IconTerminal2
121
- },
122
- {
123
- label: "Running",
124
- value: stats.running,
125
- icon: IconPlayerPlay
126
- },
127
- {
128
- label: "Completed 24h",
129
- value: stats.completed24h,
130
- icon: IconCircleCheck
131
- },
132
- {
133
- label: "Failed 24h",
134
- value: stats.failed24h,
135
- icon: IconAlertTriangle
136
- }
137
- ] }),
138
- /* @__PURE__ */ jsxs(SimpleGrid, {
139
- cols: {
140
- base: 1,
141
- md: 2
142
- },
143
- spacing: "md",
144
- children: [/* @__PURE__ */ jsxs(Paper, {
145
- p: "md",
146
- radius: "md",
147
- withBorder: true,
148
- children: [/* @__PURE__ */ jsx(Text$1, {
149
- size: "sm",
150
- fw: 600,
151
- mb: "sm",
152
- children: "Activity (14d)"
153
- }), activityChartData.length > 0 ? /* @__PURE__ */ jsx(AreaChart, {
154
- h: 220,
155
- data: activityChartData,
156
- dataKey: "date",
157
- series: [{
158
- name: "completed",
159
- label: "Completed",
160
- color: "teal.6"
161
- }, {
162
- name: "failed",
163
- label: "Failed",
164
- color: "red.6"
165
- }],
166
- curveType: "monotone",
167
- withGradient: true,
168
- withTooltip: true,
169
- withDots: false
170
- }) : /* @__PURE__ */ jsx(Flex$1, {
171
- h: 220,
172
- align: "center",
173
- justify: "center",
174
- children: /* @__PURE__ */ jsx(Text$1, {
175
- size: "sm",
176
- c: "dimmed",
177
- children: "No activity data"
178
- })
179
- })]
180
- }), /* @__PURE__ */ jsxs(Paper, {
181
- p: "md",
182
- radius: "md",
183
- withBorder: true,
184
- children: [/* @__PURE__ */ jsx(Text$1, {
185
- size: "sm",
186
- fw: 600,
187
- mb: "sm",
188
- children: "Active Executions"
189
- }), statusDonutData.length > 0 ? /* @__PURE__ */ jsx(DonutChart, {
190
- h: 220,
191
- data: statusDonutData,
192
- withTooltip: true,
193
- tooltipDataSource: "segment",
194
- chartLabel: String(statusDonutData.reduce((sum, d) => sum + d.value, 0))
195
- }) : /* @__PURE__ */ jsx(Flex$1, {
196
- h: 220,
197
- align: "center",
198
- justify: "center",
199
- children: /* @__PURE__ */ jsx(Text$1, {
200
- size: "sm",
201
- c: "dimmed",
202
- children: "No active executions"
203
- })
204
- })]
205
- })]
206
- }),
207
- queueChartData.length > 0 && /* @__PURE__ */ jsxs(Paper, {
208
- p: "md",
209
- radius: "md",
210
- withBorder: true,
211
- children: [/* @__PURE__ */ jsx(Text$1, {
212
- size: "sm",
213
- fw: 600,
214
- mb: "sm",
215
- children: "Queue Depth by Job"
216
- }), /* @__PURE__ */ jsx(BarChart, {
217
- h: 200,
218
- data: queueChartData,
219
- dataKey: "job",
220
- type: "stacked",
221
- series: [
222
- {
223
- name: "running",
224
- label: "Running",
225
- color: "blue.6"
226
- },
227
- {
228
- name: "pending",
229
- label: "Pending",
230
- color: "gray.5"
231
- },
232
- {
233
- name: "scheduled",
234
- label: "Scheduled",
235
- color: "violet.5"
236
- },
237
- {
238
- name: "retrying",
239
- label: "Retrying",
240
- color: "yellow.5"
241
- },
242
- {
243
- name: "dead",
244
- label: "Dead",
245
- color: "red.6"
246
- }
247
- ],
248
- withTooltip: true,
249
- withLegend: true
250
- })]
251
- }),
252
- /* @__PURE__ */ jsxs(SimpleGrid, {
253
- cols: {
254
- base: 1,
255
- md: 2
256
- },
257
- spacing: "md",
258
- children: [/* @__PURE__ */ jsxs(Paper, {
259
- p: "md",
260
- radius: "md",
261
- withBorder: true,
262
- children: [/* @__PURE__ */ jsx(Text$1, {
263
- size: "sm",
264
- fw: 600,
265
- mb: "sm",
266
- children: "Recent Executions"
267
- }), /* @__PURE__ */ jsxs(Table, {
268
- highlightOnHover: true,
269
- children: [/* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
270
- /* @__PURE__ */ jsx(Table.Th, { children: "Job" }),
271
- /* @__PURE__ */ jsx(Table.Th, { children: "Status" }),
272
- /* @__PURE__ */ jsx(Table.Th, { children: "Duration" })
273
- ] }) }), /* @__PURE__ */ jsxs(Table.Tbody, { children: [recent.map((exec) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
274
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
275
- size: "xs",
276
- fw: 500,
277
- ff: "monospace",
278
- lineClamp: 1,
279
- children: exec.jobName
280
- }) }),
281
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
282
- size: "xs",
283
- ff: "monospace",
284
- children: exec.status
285
- }) }),
286
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
287
- size: "xs",
288
- c: "dimmed",
289
- ff: "monospace",
290
- children: exec.startedAt && (exec.completedAt || exec.status === "running") ? formatDuration(exec.startedAt, exec.completedAt) : "—"
291
- }) })
292
- ] }, exec.id)), recent.length === 0 && /* @__PURE__ */ jsx(Table.Tr, { children: /* @__PURE__ */ jsx(Table.Td, {
293
- colSpan: 3,
294
- children: /* @__PURE__ */ jsx(Text$1, {
295
- size: "sm",
296
- c: "dimmed",
297
- ta: "center",
298
- children: "No recent executions"
299
- })
300
- }) })] })]
301
- })]
302
- }), /* @__PURE__ */ jsxs(Paper, {
303
- p: "md",
304
- radius: "md",
305
- withBorder: true,
306
- children: [/* @__PURE__ */ jsx(Text$1, {
307
- size: "sm",
308
- fw: 600,
309
- mb: "sm",
310
- children: "Top Failures (7d)"
311
- }), failures.length > 0 ? /* @__PURE__ */ jsxs(Table, { children: [/* @__PURE__ */ jsx(Table.Thead, { children: /* @__PURE__ */ jsxs(Table.Tr, { children: [
312
- /* @__PURE__ */ jsx(Table.Th, { children: "Job" }),
313
- /* @__PURE__ */ jsx(Table.Th, { children: "Count" }),
314
- /* @__PURE__ */ jsx(Table.Th, { children: "Last Error" })
315
- ] }) }), /* @__PURE__ */ jsx(Table.Tbody, { children: failures.map((f) => /* @__PURE__ */ jsxs(Table.Tr, { children: [
316
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
317
- size: "xs",
318
- fw: 500,
319
- ff: "monospace",
320
- lineClamp: 1,
321
- children: f.jobName
322
- }) }),
323
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
324
- size: "xs",
325
- fw: 600,
326
- ff: "monospace",
327
- children: f.failures
328
- }) }),
329
- /* @__PURE__ */ jsx(Table.Td, { children: /* @__PURE__ */ jsx(Text$1, {
330
- size: "xs",
331
- c: "dimmed",
332
- lineClamp: 1,
333
- style: { maxWidth: 200 },
334
- children: f.lastError ?? "—"
335
- }) })
336
- ] }, f.jobName)) })] }) : /* @__PURE__ */ jsx(Flex$1, {
337
- h: 100,
338
- align: "center",
339
- justify: "center",
340
- children: /* @__PURE__ */ jsx(Text$1, {
341
- size: "sm",
342
- c: "dimmed",
343
- children: "No failures in the last 7 days"
344
- })
345
- })]
346
- })]
347
- })
348
- ]
349
- });
350
- };
351
-
352
- //#endregion
353
- export { AdminJobDashboard as default };
354
- //# sourceMappingURL=AdminJobDashboard-BL8gGPDp.js.map