@alepha/ui 0.16.2 → 0.17.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 (175) hide show
  1. package/dist/admin/{AdminApiKeys-CoTOTfgU.js → AdminApiKeys-CF_qOO3u.js} +20 -20
  2. package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +1 -0
  3. package/dist/admin/{AdminAudits-BmsxFbDa.js → AdminAudits-BQno3hZG.js} +7 -8
  4. package/dist/admin/AdminAudits-BQno3hZG.js.map +1 -0
  5. package/dist/admin/{AdminFiles-BBB8knca.js → AdminFiles-kvuUaASF.js} +3 -5
  6. package/dist/admin/{AdminFiles-BBB8knca.js.map → AdminFiles-kvuUaASF.js.map} +1 -1
  7. package/dist/admin/AdminJobDashboard-CrPxp0W1.js +485 -0
  8. package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +1 -0
  9. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js +678 -0
  10. package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +1 -0
  11. package/dist/admin/AdminJobRegistry-CNX5cpDx.js +301 -0
  12. package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +1 -0
  13. package/dist/admin/{AdminLayout-CsjvpeD1.js → AdminLayout-e-ZP5nWw.js} +1 -1
  14. package/dist/admin/{AdminLayout-CsjvpeD1.js.map → AdminLayout-e-ZP5nWw.js.map} +1 -1
  15. package/dist/admin/{AdminNotifications-LwR6RKrx.js → AdminNotifications-DeHJFf6W.js} +3 -5
  16. package/dist/admin/{AdminNotifications-LwR6RKrx.js.map → AdminNotifications-DeHJFf6W.js.map} +1 -1
  17. package/dist/admin/{AdminParameters-B_83Vie9.js → AdminParameters-iQE8o7a7.js} +43 -36
  18. package/dist/admin/AdminParameters-iQE8o7a7.js.map +1 -0
  19. package/dist/admin/{AdminSessions-CWnPosdd.js → AdminSessions-oKJCbd7w.js} +5 -7
  20. package/dist/admin/AdminSessions-oKJCbd7w.js.map +1 -0
  21. package/dist/admin/{AdminUserAudits-nHv636E_.js → AdminUserAudits-BNCEle_E.js} +6 -8
  22. package/dist/admin/AdminUserAudits-BNCEle_E.js.map +1 -0
  23. package/dist/admin/{AdminUserCreate-CjYD3Kjc.js → AdminUserCreate-CgqeFwCt.js} +6 -7
  24. package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +1 -0
  25. package/dist/admin/{AdminUserDetails-Ccq-LsZ0.js → AdminUserDetails-DDe1A1GP.js} +30 -29
  26. package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +1 -0
  27. package/dist/admin/{AdminUserLayout-7s41DiF_.js → AdminUserLayout-HAlobhWf.js} +18 -16
  28. package/dist/admin/AdminUserLayout-HAlobhWf.js.map +1 -0
  29. package/dist/admin/{AdminUserSessions-Ds3ODq_d.js → AdminUserSessions-Bq1LnVLf.js} +5 -7
  30. package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +1 -0
  31. package/dist/admin/{AdminUserSettings-CGh4gROo.js → AdminUserSettings-BRsBZoxV.js} +10 -10
  32. package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +1 -0
  33. package/dist/admin/{AdminUsers-CvPiBzQK.js → AdminUsers-D71kIOSn.js} +6 -8
  34. package/dist/admin/AdminUsers-D71kIOSn.js.map +1 -0
  35. package/dist/admin/index.d.ts +7 -83
  36. package/dist/admin/index.d.ts.map +1 -1
  37. package/dist/admin/index.js +49 -70
  38. package/dist/admin/index.js.map +1 -1
  39. package/dist/auth/{Login-DS_OqA0G.js → Login-BS_FYTy0.js} +13 -8
  40. package/dist/auth/Login-BS_FYTy0.js.map +1 -0
  41. package/dist/auth/{Profile-Di7N7HZL.js → Profile-CjDsW378.js} +16 -10
  42. package/dist/auth/Profile-CjDsW378.js.map +1 -0
  43. package/dist/auth/{Register-BRR2_gux.js → Register-C5eqzAaD.js} +21 -12
  44. package/dist/auth/Register-C5eqzAaD.js.map +1 -0
  45. package/dist/auth/{ResetPassword-oQu72lod.js → ResetPassword-XifinVao.js} +14 -8
  46. package/dist/auth/ResetPassword-XifinVao.js.map +1 -0
  47. package/dist/auth/{VerifyEmail-DC6HPZjd.js → VerifyEmail-DTgbeJOO.js} +6 -4
  48. package/dist/auth/VerifyEmail-DTgbeJOO.js.map +1 -0
  49. package/dist/auth/index.d.ts +4 -0
  50. package/dist/auth/index.d.ts.map +1 -1
  51. package/dist/auth/index.js +15 -14
  52. package/dist/auth/index.js.map +1 -1
  53. package/dist/core/index.d.ts +37 -26
  54. package/dist/core/index.d.ts.map +1 -1
  55. package/dist/core/index.js +444 -193
  56. package/dist/core/index.js.map +1 -1
  57. package/dist/demo/DemoDataTable-lnBKWBf8.js +362 -0
  58. package/dist/demo/DemoDataTable-lnBKWBf8.js.map +1 -0
  59. package/dist/demo/{DemoHome-DpRrPlBC.js → DemoHome-CUMZsYaH.js} +6 -7
  60. package/dist/demo/DemoHome-CUMZsYaH.js.map +1 -0
  61. package/dist/demo/{DemoJsonViewer-zeucGKHV.js → DemoJsonViewer-_uokbGaW.js} +17 -19
  62. package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +1 -0
  63. package/dist/demo/{DemoLayout-PhgbAAiQ.js → DemoLayout-DHVoacE6.js} +2 -4
  64. package/dist/demo/{DemoLayout-PhgbAAiQ.js.map → DemoLayout-DHVoacE6.js.map} +1 -1
  65. package/dist/demo/{DemoLogin-DSzP0Lkv.js → DemoLogin-DjJ9314c.js} +22 -17
  66. package/dist/demo/DemoLogin-DjJ9314c.js.map +1 -0
  67. package/dist/demo/{DemoRegister-DavFBsCz.js → DemoRegister-DzkJ5M83.js} +34 -25
  68. package/dist/demo/DemoRegister-DzkJ5M83.js.map +1 -0
  69. package/dist/demo/{DemoResetPassword-BS2rIAQK.js → DemoResetPassword-DWh4_BpQ.js} +27 -21
  70. package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +1 -0
  71. package/dist/demo/{DemoSidebar-zNkUmHRl.js → DemoSidebar-C1csnGhX.js} +2 -2
  72. package/dist/demo/{DemoSidebar-zNkUmHRl.js.map → DemoSidebar-C1csnGhX.js.map} +1 -1
  73. package/dist/demo/{DemoTypeForm-B9q7oT0b.js → DemoTypeForm-CWz6fJrJ.js} +2 -2
  74. package/dist/demo/{DemoTypeForm-B9q7oT0b.js.map → DemoTypeForm-CWz6fJrJ.js.map} +1 -1
  75. package/dist/demo/{DemoVerifyEmail-Bi4SdWz0.js → DemoVerifyEmail-DbU_tCj8.js} +13 -11
  76. package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +1 -0
  77. package/dist/demo/{IconGoogle-CTeZyrek.js → IconGoogle-Ch1m3Uzl.js} +1 -1
  78. package/dist/demo/{IconGoogle-CTeZyrek.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
  79. package/dist/demo/{Showcase-C9btr_SJ.js → Showcase-BzoXNlCn.js} +10 -10
  80. package/dist/demo/Showcase-BzoXNlCn.js.map +1 -0
  81. package/dist/demo/index.d.ts +1 -68
  82. package/dist/demo/index.d.ts.map +1 -1
  83. package/dist/demo/index.js +11 -15
  84. package/dist/demo/index.js.map +1 -1
  85. package/dist/json/index.js +2 -2
  86. package/dist/json/index.js.map +1 -1
  87. package/package.json +9 -5
  88. package/src/admin/AdminRouter.ts +36 -5
  89. package/src/admin/components/audits/AdminAudits.tsx +5 -5
  90. package/src/admin/components/jobs/AdminJobDashboard.tsx +455 -0
  91. package/src/admin/components/jobs/AdminJobExecutions.tsx +693 -0
  92. package/src/admin/components/jobs/AdminJobRegistry.tsx +325 -0
  93. package/src/admin/components/keys/AdminApiKeys.tsx +28 -31
  94. package/src/admin/components/parameters/AdminParameters.tsx +3 -3
  95. package/src/admin/components/parameters/ParameterDetails.tsx +34 -29
  96. package/src/admin/components/parameters/ParameterEmptyState.tsx +5 -5
  97. package/src/admin/components/parameters/ParameterHistory.tsx +11 -19
  98. package/src/admin/components/parameters/ParameterTree.tsx +16 -18
  99. package/src/admin/components/sessions/AdminSessions.tsx +3 -3
  100. package/src/admin/components/shared/AdminResourceHeader.tsx +20 -16
  101. package/src/admin/components/users/AdminUserAudits.tsx +5 -5
  102. package/src/admin/components/users/AdminUserCreate.tsx +3 -3
  103. package/src/admin/components/users/AdminUserDetails.tsx +51 -53
  104. package/src/admin/components/users/AdminUserLayout.tsx +7 -7
  105. package/src/admin/components/users/AdminUserSessions.tsx +3 -3
  106. package/src/admin/components/users/AdminUserSettings.tsx +9 -9
  107. package/src/admin/components/users/AdminUsers.tsx +5 -5
  108. package/src/admin/components/verifications/AdminVerifications.tsx +3 -3
  109. package/src/admin/index.ts +0 -24
  110. package/src/auth/components/Login.tsx +13 -13
  111. package/src/auth/components/Profile.tsx +17 -26
  112. package/src/auth/components/Register.tsx +21 -31
  113. package/src/auth/components/ResetPassword.tsx +13 -22
  114. package/src/auth/components/VerifyEmail.tsx +5 -5
  115. package/src/auth/components/buttons/UserButton.tsx +14 -4
  116. package/src/core/components/buttons/ActionButton.tsx +9 -2
  117. package/src/core/components/data/ErrorViewer.tsx +15 -15
  118. package/src/core/components/dialogs/AlertDialog.tsx +3 -3
  119. package/src/core/components/dialogs/ConfirmDialog.tsx +3 -3
  120. package/src/core/components/dialogs/PromptDialog.tsx +3 -3
  121. package/src/core/components/form/Control.tsx +9 -0
  122. package/src/core/components/form/ControlArray.tsx +6 -7
  123. package/src/core/components/form/ControlObject.tsx +3 -3
  124. package/src/core/components/form/ControlQueryBuilder.tsx +20 -22
  125. package/src/core/components/form/ControlSelect.tsx +4 -0
  126. package/src/core/components/form/TypeForm.tsx +7 -0
  127. package/src/core/components/layout/Breadcrumb.tsx +6 -6
  128. package/src/core/components/layout/Omnibar.tsx +2 -1
  129. package/src/core/components/layout/Sidebar.tsx +5 -1
  130. package/src/core/components/table/ColumnPicker.tsx +47 -31
  131. package/src/core/components/table/DataTable.tsx +277 -201
  132. package/src/core/components/table/DataTableFilters.tsx +8 -0
  133. package/src/core/components/table/DataTableToolbar.tsx +98 -5
  134. package/src/core/components/table/FilterPicker.tsx +28 -26
  135. package/src/core/components/table/types.ts +52 -37
  136. package/src/core/components/table/useTableSelection.ts +83 -0
  137. package/src/core/styles.css +1 -0
  138. package/src/core/utils/parseInput.ts +1 -0
  139. package/src/demo/components/DemoHome.tsx +5 -5
  140. package/src/demo/components/core/DemoDataTable.tsx +209 -5
  141. package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
  142. package/src/demo/components/shared/MacWindow.tsx +7 -7
  143. package/src/demo/components/shared/Showcase.tsx +3 -3
  144. package/src/demo/index.ts +0 -11
  145. package/src/json/components/JsonViewer.tsx +3 -3
  146. package/dist/admin/AdminApiKeys-CoTOTfgU.js.map +0 -1
  147. package/dist/admin/AdminAudits-BmsxFbDa.js.map +0 -1
  148. package/dist/admin/AdminJobs-C604joTz.js +0 -698
  149. package/dist/admin/AdminJobs-C604joTz.js.map +0 -1
  150. package/dist/admin/AdminParameters-B_83Vie9.js.map +0 -1
  151. package/dist/admin/AdminSessions-CWnPosdd.js.map +0 -1
  152. package/dist/admin/AdminUserAudits-nHv636E_.js.map +0 -1
  153. package/dist/admin/AdminUserCreate-CjYD3Kjc.js.map +0 -1
  154. package/dist/admin/AdminUserDetails-Ccq-LsZ0.js.map +0 -1
  155. package/dist/admin/AdminUserLayout-7s41DiF_.js.map +0 -1
  156. package/dist/admin/AdminUserSessions-Ds3ODq_d.js.map +0 -1
  157. package/dist/admin/AdminUserSettings-CGh4gROo.js.map +0 -1
  158. package/dist/admin/AdminUsers-CvPiBzQK.js.map +0 -1
  159. package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
  160. package/dist/auth/Login-DS_OqA0G.js.map +0 -1
  161. package/dist/auth/Profile-Di7N7HZL.js.map +0 -1
  162. package/dist/auth/Register-BRR2_gux.js.map +0 -1
  163. package/dist/auth/ResetPassword-oQu72lod.js.map +0 -1
  164. package/dist/auth/VerifyEmail-DC6HPZjd.js.map +0 -1
  165. package/dist/demo/DemoDataTable-DCsJq8v5.js +0 -149
  166. package/dist/demo/DemoDataTable-DCsJq8v5.js.map +0 -1
  167. package/dist/demo/DemoHome-DpRrPlBC.js.map +0 -1
  168. package/dist/demo/DemoJsonViewer-zeucGKHV.js.map +0 -1
  169. package/dist/demo/DemoLogin-DSzP0Lkv.js.map +0 -1
  170. package/dist/demo/DemoRegister-DavFBsCz.js.map +0 -1
  171. package/dist/demo/DemoResetPassword-BS2rIAQK.js.map +0 -1
  172. package/dist/demo/DemoVerifyEmail-Bi4SdWz0.js.map +0 -1
  173. package/dist/demo/Showcase-C9btr_SJ.js.map +0 -1
  174. package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
  175. package/src/admin/components/jobs/AdminJobs.tsx +0 -772
@@ -1,14 +1,5 @@
1
1
  import { ActionButton } from "@alepha/ui";
2
- import {
3
- Avatar,
4
- Badge,
5
- Card,
6
- Flex,
7
- Group,
8
- Stack,
9
- Text,
10
- Title,
11
- } from "@mantine/core";
2
+ import { Avatar, Badge, Card, Flex, Text, Title } from "@mantine/core";
12
3
  import {
13
4
  IconAt,
14
5
  IconCalendar,
@@ -35,9 +26,9 @@ const Profile = () => {
35
26
 
36
27
  return (
37
28
  <Flex flex={1} justify="center" align="center">
38
- <Stack gap="md" w={400}>
29
+ <Flex direction="column" gap="md" w={400}>
39
30
  <Card withBorder p="xl" bg="var(--alepha-elevated)">
40
- <Stack gap="lg">
31
+ <Flex direction="column" gap="lg">
41
32
  {/* Avatar and name */}
42
33
  <Flex direction="column" align="center" gap="md">
43
34
  <Avatar
@@ -48,18 +39,18 @@ const Profile = () => {
48
39
  >
49
40
  {!picture && <IconUser size={48} />}
50
41
  </Avatar>
51
- <Stack gap={4} align="center">
42
+ <Flex direction="column" gap={4} align="center">
52
43
  <Title order={3}>{displayName}</Title>
53
44
  {email && username && (
54
45
  <Text size="sm" c="dimmed">
55
46
  @{username}
56
47
  </Text>
57
48
  )}
58
- </Stack>
49
+ </Flex>
59
50
  </Flex>
60
51
 
61
52
  {/* User details */}
62
- <Stack gap="sm">
53
+ <Flex direction="column" gap="sm">
63
54
  {email && (
64
55
  <ProfileField icon={<IconAt size={18} />} label="Email">
65
56
  {email}
@@ -83,13 +74,13 @@ const Profile = () => {
83
74
  {/* Roles */}
84
75
  {roles && roles.length > 0 && (
85
76
  <ProfileField icon={<IconShield size={18} />} label="Roles">
86
- <Group gap="xs">
77
+ <Flex gap="xs">
87
78
  {roles.map((role) => (
88
79
  <Badge key={role} size="sm" variant="light">
89
80
  {role}
90
81
  </Badge>
91
82
  ))}
92
- </Group>
83
+ </Flex>
93
84
  </ProfileField>
94
85
  )}
95
86
 
@@ -99,19 +90,19 @@ const Profile = () => {
99
90
  icon={<IconCalendar size={18} />}
100
91
  label="Organizations"
101
92
  >
102
- <Group gap="xs">
93
+ <Flex gap="xs">
103
94
  {organizations.map((org) => (
104
95
  <Badge key={org} size="sm" variant="outline">
105
96
  {org}
106
97
  </Badge>
107
98
  ))}
108
- </Group>
99
+ </Flex>
109
100
  </ProfileField>
110
101
  )}
111
- </Stack>
102
+ </Flex>
112
103
 
113
104
  {/* Actions */}
114
- <Stack gap="sm" mt="md">
105
+ <Flex direction="column" gap="sm" mt="md">
115
106
  <ActionButton
116
107
  variant="light"
117
108
  color="red"
@@ -120,14 +111,14 @@ const Profile = () => {
120
111
  >
121
112
  Sign out
122
113
  </ActionButton>
123
- </Stack>
124
- </Stack>
114
+ </Flex>
115
+ </Flex>
125
116
  </Card>
126
117
 
127
118
  <ActionButton variant="subtle" href="/">
128
119
  Back to home
129
120
  </ActionButton>
130
- </Stack>
121
+ </Flex>
131
122
  </Flex>
132
123
  );
133
124
  };
@@ -144,12 +135,12 @@ const ProfileField = ({ icon, label, children }: ProfileFieldProps) => {
144
135
  <Flex c="dimmed" mt={2}>
145
136
  {icon}
146
137
  </Flex>
147
- <Stack gap={2} flex={1}>
138
+ <Flex direction="column" gap={2} flex={1}>
148
139
  <Text size="xs" c="dimmed" tt="uppercase" fw={500}>
149
140
  {label}
150
141
  </Text>
151
142
  <Text size="sm">{children}</Text>
152
- </Stack>
143
+ </Flex>
153
144
  </Flex>
154
145
  );
155
146
  };
@@ -1,15 +1,5 @@
1
1
  import { ActionButton, Control, capitalize } from "@alepha/ui";
2
- import {
3
- Alert,
4
- Card,
5
- Flex,
6
- Group,
7
- Image,
8
- PinInput,
9
- Stack,
10
- Text,
11
- Title,
12
- } from "@mantine/core";
2
+ import { Alert, Card, Flex, Image, PinInput, Text, Title } from "@mantine/core";
13
3
  import {
14
4
  IconAlertCircle,
15
5
  IconLock,
@@ -222,9 +212,9 @@ const Register = (props: RegisterProps) => {
222
212
  if (registrationState.phase === "verification" && registrationState.intent) {
223
213
  return (
224
214
  <Flex flex={1} justify={"center"} align={"center"}>
225
- <Stack gap={"sm"} w={360}>
215
+ <Flex direction="column" gap={"sm"} w={360}>
226
216
  <Card withBorder p={"lg"} bg={"var(--alepha-elevated)"}>
227
- <Stack gap={"md"}>
217
+ <Flex direction="column" gap={"md"}>
228
218
  <Text size="lg" fw={500} ta="center">
229
219
  {tr("registerVerifyTitle") ?? "Verify your account"}
230
220
  </Text>
@@ -240,7 +230,7 @@ const Register = (props: RegisterProps) => {
240
230
  )}
241
231
 
242
232
  {registrationState.intent.expectEmailVerification && (
243
- <Stack gap={"xs"}>
233
+ <Flex direction="column" gap={"xs"}>
244
234
  <Text size="sm" fw={500}>
245
235
  {tr("registerEmailCode")}
246
236
  </Text>
@@ -254,11 +244,11 @@ const Register = (props: RegisterProps) => {
254
244
  aria-label="Email verification code"
255
245
  />
256
246
  </Flex>
257
- </Stack>
247
+ </Flex>
258
248
  )}
259
249
 
260
250
  {registrationState.intent.expectPhoneVerification && (
261
- <Stack gap={"xs"}>
251
+ <Flex direction="column" gap={"xs"}>
262
252
  <Text size="sm" fw={500}>
263
253
  {tr("registerPhoneCode")}
264
254
  </Text>
@@ -272,7 +262,7 @@ const Register = (props: RegisterProps) => {
272
262
  aria-label="Phone verification code"
273
263
  />
274
264
  </Flex>
275
- </Stack>
265
+ </Flex>
276
266
  )}
277
267
 
278
268
  <ActionButton
@@ -292,9 +282,9 @@ const Register = (props: RegisterProps) => {
292
282
  >
293
283
  {tr("registerVerifyBack") ?? "Back to registration"}
294
284
  </ActionButton>
295
- </Stack>
285
+ </Flex>
296
286
  </Card>
297
- </Stack>
287
+ </Flex>
298
288
  </Flex>
299
289
  );
300
290
  }
@@ -309,14 +299,14 @@ const Register = (props: RegisterProps) => {
309
299
  // Registration form phase UI
310
300
  return (
311
301
  <Flex flex={1} justify={"center"} align={"center"}>
312
- <Stack gap={"sm"} w={360}>
302
+ <Flex direction="column" gap={"sm"} w={360}>
313
303
  <Card withBorder p={"lg"} bg={"var(--alepha-elevated)"}>
314
- <Stack gap={"md"}>
304
+ <Flex direction="column" gap={"md"}>
315
305
  {/* Realm branding */}
316
306
  {(settings.logoUrl ||
317
307
  settings.displayName ||
318
308
  settings.description) && (
319
- <Stack gap={"xs"} align="center" mb="xs">
309
+ <Flex direction="column" gap={"xs"} align="center" mb="xs">
320
310
  {settings.logoUrl && (
321
311
  <Image
322
312
  src={settings.logoUrl}
@@ -336,7 +326,7 @@ const Register = (props: RegisterProps) => {
336
326
  {settings.description}
337
327
  </Text>
338
328
  )}
339
- </Stack>
329
+ </Flex>
340
330
  )}
341
331
 
342
332
  {!isRegistrationAllowed ? (
@@ -361,7 +351,7 @@ const Register = (props: RegisterProps) => {
361
351
  {/* Credentials registration form */}
362
352
  {credentialsProvider && (
363
353
  <form {...form.props}>
364
- <Stack flex={1} gap={"md"}>
354
+ <Flex direction="column" flex={1} gap={"md"}>
365
355
  {settings.usernameEnabled !== false &&
366
356
  form.input.username && (
367
357
  <Control
@@ -417,24 +407,24 @@ const Register = (props: RegisterProps) => {
417
407
  >
418
408
  {tr("registerCreateAccount")}
419
409
  </ActionButton>
420
- </Stack>
410
+ </Flex>
421
411
  </form>
422
412
  )}
423
413
 
424
414
  {/* OR divider - only when both credentials AND external methods exist */}
425
415
  {showOrDivider && (
426
- <Group align="center" justify="center" gap={"md"}>
416
+ <Flex align="center" justify="center" gap={"md"}>
427
417
  <Flex flex={1} h={"1px"} bg={"var(--alepha-border)"} />
428
418
  <Text size="xs" c="dimmed">
429
419
  {tr("registerOr")}
430
420
  </Text>
431
421
  <Flex flex={1} h={"1px"} bg={"var(--alepha-border)"} />
432
- </Group>
422
+ </Flex>
433
423
  )}
434
424
 
435
425
  {/* External login methods */}
436
426
  {externalMethods.length > 0 && (
437
- <Stack gap={"sm"}>
427
+ <Flex direction="column" gap={"sm"}>
438
428
  {externalMethods.map((method) => (
439
429
  <ActionButton
440
430
  variant={"default"}
@@ -452,7 +442,7 @@ const Register = (props: RegisterProps) => {
452
442
  })}
453
443
  </ActionButton>
454
444
  ))}
455
- </Stack>
445
+ </Flex>
456
446
  )}
457
447
 
458
448
  {/* Sign in link */}
@@ -469,12 +459,12 @@ const Register = (props: RegisterProps) => {
469
459
  </Text>
470
460
  </>
471
461
  )}
472
- </Stack>
462
+ </Flex>
473
463
  </Card>
474
464
  <ActionButton variant={"subtle"} href={redirect}>
475
465
  {tr("registerCancel")}
476
466
  </ActionButton>
477
- </Stack>
467
+ </Flex>
478
468
  </Flex>
479
469
  );
480
470
  };
@@ -1,14 +1,5 @@
1
1
  import { ActionButton, Control } from "@alepha/ui";
2
- import {
3
- Alert,
4
- Card,
5
- Flex,
6
- Image,
7
- PinInput,
8
- Stack,
9
- Text,
10
- Title,
11
- } from "@mantine/core";
2
+ import { Alert, Card, Flex, Image, PinInput, Text, Title } from "@mantine/core";
12
3
  import {
13
4
  IconAlertCircle,
14
5
  IconCheck,
@@ -139,14 +130,14 @@ const ResetPassword = (props: ResetPasswordProps) => {
139
130
 
140
131
  return (
141
132
  <Flex flex={1} justify={"center"} align={"center"}>
142
- <Stack gap={"sm"} w={360}>
133
+ <Flex direction="column" gap={"sm"} w={360}>
143
134
  <Card withBorder p={"lg"} bg={"var(--alepha-elevated)"}>
144
- <Stack gap={"md"}>
135
+ <Flex direction="column" gap={"md"}>
145
136
  {/* Realm branding */}
146
137
  {(settings.logoUrl ||
147
138
  settings.displayName ||
148
139
  settings.description) && (
149
- <Stack gap={"xs"} align="center" mb="xs">
140
+ <Flex direction="column" gap={"xs"} align="center" mb="xs">
150
141
  {settings.logoUrl && (
151
142
  <Image
152
143
  src={settings.logoUrl}
@@ -166,7 +157,7 @@ const ResetPassword = (props: ResetPasswordProps) => {
166
157
  {settings.description}
167
158
  </Text>
168
159
  )}
169
- </Stack>
160
+ </Flex>
170
161
  )}
171
162
 
172
163
  {error && (
@@ -194,7 +185,7 @@ const ResetPassword = (props: ResetPasswordProps) => {
194
185
  </>
195
186
  ) : resetState.step === "email" ? (
196
187
  <form {...emailForm.props}>
197
- <Stack flex={1} gap={"md"}>
188
+ <Flex direction="column" flex={1} gap={"md"}>
198
189
  <Text size="lg" fw={500} ta="center">
199
190
  {tr("resetPasswordTitle")}
200
191
  </Text>
@@ -217,10 +208,10 @@ const ResetPassword = (props: ResetPasswordProps) => {
217
208
  >
218
209
  {tr("resetPasswordSendCode")}
219
210
  </ActionButton>
220
- </Stack>
211
+ </Flex>
221
212
  </form>
222
213
  ) : resetState.step === "code" ? (
223
- <Stack gap={"md"}>
214
+ <Flex direction="column" gap={"md"}>
224
215
  <Text size="lg" fw={500} ta="center">
225
216
  {tr("resetPasswordTitle")}
226
217
  </Text>
@@ -247,10 +238,10 @@ const ResetPassword = (props: ResetPasswordProps) => {
247
238
  >
248
239
  {tr("resetPasswordResendCode")}
249
240
  </ActionButton>
250
- </Stack>
241
+ </Flex>
251
242
  ) : resetState.step === "password" ? (
252
243
  <form {...passwordForm.props}>
253
- <Stack flex={1} gap={"md"}>
244
+ <Flex direction="column" flex={1} gap={"md"}>
254
245
  <Text size="lg" fw={500} ta="center">
255
246
  {tr("resetPasswordTitle")}
256
247
  </Text>
@@ -277,7 +268,7 @@ const ResetPassword = (props: ResetPasswordProps) => {
277
268
  <ActionButton form={passwordForm}>
278
269
  {tr("resetPasswordSetNewPassword")}
279
270
  </ActionButton>
280
- </Stack>
271
+ </Flex>
281
272
  </form>
282
273
  ) : (
283
274
  <>
@@ -293,12 +284,12 @@ const ResetPassword = (props: ResetPasswordProps) => {
293
284
  </ActionButton>
294
285
  </>
295
286
  )}
296
- </Stack>
287
+ </Flex>
297
288
  </Card>
298
289
  <ActionButton variant={"subtle"} href={redirect}>
299
290
  {tr("resetPasswordCancel")}
300
291
  </ActionButton>
301
- </Stack>
292
+ </Flex>
302
293
  </Flex>
303
294
  );
304
295
  };
@@ -1,5 +1,5 @@
1
1
  import { ActionButton } from "@alepha/ui";
2
- import { Alert, Card, Flex, Loader, Stack, Text } from "@mantine/core";
2
+ import { Alert, Card, Flex, Loader, Text } from "@mantine/core";
3
3
  import { IconAlertCircle, IconCheck, IconMailCheck } from "@tabler/icons-react";
4
4
  import type { UserController } from "alepha/api/users";
5
5
  import { useClient } from "alepha/react";
@@ -49,9 +49,9 @@ const VerifyEmail = (_props: VerifyEmailProps) => {
49
49
 
50
50
  return (
51
51
  <Flex flex={1} justify="center" align="center">
52
- <Stack gap="sm" w={400}>
52
+ <Flex direction="column" gap="sm" w={400}>
53
53
  <Card withBorder p="lg" bg="var(--alepha-elevated)">
54
- <Stack gap="md" align="center">
54
+ <Flex direction="column" gap="md" align="center">
55
55
  {step === "verifying" && (
56
56
  <>
57
57
  <Loader size="lg" />
@@ -93,9 +93,9 @@ const VerifyEmail = (_props: VerifyEmailProps) => {
93
93
  </ActionButton>
94
94
  </>
95
95
  )}
96
- </Stack>
96
+ </Flex>
97
97
  </Card>
98
- </Stack>
98
+ </Flex>
99
99
  </Flex>
100
100
  );
101
101
  };
@@ -31,6 +31,11 @@ export interface UserButtonProps
31
31
  */
32
32
  logoutLabel?: string;
33
33
 
34
+ /**
35
+ * Custom label for the login button when user is not authenticated
36
+ */
37
+ loginLabel?: string;
38
+
34
39
  /**
35
40
  * Menu configuration overrides
36
41
  */
@@ -51,6 +56,7 @@ const UserButton = (props: UserButtonProps) => {
51
56
  const {
52
57
  menuItems = [],
53
58
  logoutLabel = "Sign out",
59
+ loginLabel,
54
60
  menuConfig,
55
61
  showLogoutDivider = menuItems.length > 0,
56
62
  icon,
@@ -79,9 +85,11 @@ const UserButton = (props: UserButtonProps) => {
79
85
  return (
80
86
  <ActionButton
81
87
  {...buttonProps}
82
- icon={IconLogin2}
88
+ icon={icon === null ? undefined : (icon ?? IconLogin2)}
83
89
  href={authRouter.path("login")}
84
- />
90
+ >
91
+ {loginLabel ?? children}
92
+ </ActionButton>
85
93
  );
86
94
  }
87
95
 
@@ -132,12 +140,14 @@ const UserButton = (props: UserButtonProps) => {
132
140
  });
133
141
 
134
142
  // Use leftSection for Avatar (JSX element), icon prop for component types
135
- const hasAvatar = !icon && auth.user.picture;
143
+ const hasAvatar = icon === undefined && auth.user.picture;
136
144
 
137
145
  return (
138
146
  <ActionButton
139
147
  {...buttonProps}
140
- icon={hasAvatar ? undefined : (icon ?? IconUser)}
148
+ icon={
149
+ hasAvatar ? undefined : icon === null ? undefined : (icon ?? IconUser)
150
+ }
141
151
  leftSection={
142
152
  hasAvatar ? (
143
153
  <Avatar
@@ -497,6 +497,7 @@ const ActionHookButton = (props: ActionHookButtonProps) => {
497
497
 
498
498
  export interface ActionClickButtonProps extends ButtonProps {
499
499
  onClick: (e: any) => any;
500
+ preventDefault?: boolean;
500
501
  }
501
502
 
502
503
  /**
@@ -509,14 +510,20 @@ export interface ActionClickButtonProps extends ButtonProps {
509
510
  * </ActionButton>
510
511
  * ```
511
512
  */
512
- const ActionClickButton = (props: ActionClickButtonProps) => {
513
+ const ActionClickButton = ({
514
+ preventDefault,
515
+ ...props
516
+ }: ActionClickButtonProps) => {
513
517
  const action = useAction(
514
518
  {
515
519
  handler: async (e: any) => {
520
+ if (preventDefault) {
521
+ e.preventDefault();
522
+ }
516
523
  await props.onClick(e);
517
524
  },
518
525
  },
519
- [props.onClick],
526
+ [props.onClick, preventDefault],
520
527
  );
521
528
 
522
529
  return (
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  ActionIcon,
3
- Box,
4
3
  Collapse,
5
4
  CopyButton,
5
+ Flex,
6
6
  type MantineSize,
7
7
  Text,
8
8
  Tooltip,
@@ -64,9 +64,9 @@ export const ErrorViewer = ({
64
64
  };
65
65
 
66
66
  return (
67
- <Box pos="relative" w="100%">
67
+ <Flex pos="relative" w="100%">
68
68
  {copyable && (
69
- <Box pos="absolute" top={0} right={0} style={{ zIndex: 1 }}>
69
+ <Flex pos="absolute" top={0} right={0} style={{ zIndex: 1 }}>
70
70
  <CopyButton value={getCopyContent()}>
71
71
  {({ copied, copy }) => (
72
72
  <Tooltip label={copied ? "Copied" : "Copy Error"}>
@@ -85,10 +85,10 @@ export const ErrorViewer = ({
85
85
  </Tooltip>
86
86
  )}
87
87
  </CopyButton>
88
- </Box>
88
+ </Flex>
89
89
  )}
90
- <Box pt={copyable ? 30 : 0}>
91
- <Box
90
+ <Flex pt={copyable ? 30 : 0}>
91
+ <Flex
92
92
  style={{
93
93
  display: "flex",
94
94
  alignItems: "flex-start",
@@ -112,11 +112,11 @@ export const ErrorViewer = ({
112
112
  >
113
113
  {errorMessage}
114
114
  </Text>
115
- </Box>
115
+ </Flex>
116
116
 
117
117
  {showStack && stackLines.length > 1 && (
118
- <Box mt="sm">
119
- <Box
118
+ <Flex mt="sm">
119
+ <Flex
120
120
  style={{
121
121
  display: "flex",
122
122
  alignItems: "center",
@@ -135,10 +135,10 @@ export const ErrorViewer = ({
135
135
  <Text c="dimmed" size={sizeConfig.text} fw={500}>
136
136
  Stack Trace ({stackLines.length - 1} frames)
137
137
  </Text>
138
- </Box>
138
+ </Flex>
139
139
 
140
140
  <Collapse in={stackExpanded}>
141
- <Box
141
+ <Flex
142
142
  mt="xs"
143
143
  pl="md"
144
144
  style={{
@@ -159,12 +159,12 @@ export const ErrorViewer = ({
159
159
  {line}
160
160
  </Text>
161
161
  ))}
162
- </Box>
162
+ </Flex>
163
163
  </Collapse>
164
- </Box>
164
+ </Flex>
165
165
  )}
166
- </Box>
167
- </Box>
166
+ </Flex>
167
+ </Flex>
168
168
  );
169
169
  };
170
170
 
@@ -1,12 +1,12 @@
1
- import { Button, Group, Text } from "@mantine/core";
1
+ import { Button, Flex, Text } from "@mantine/core";
2
2
  import type { AlertDialogProps } from "../../services/DialogService.tsx";
3
3
 
4
4
  const AlertDialog = ({ options, onClose }: AlertDialogProps) => (
5
5
  <>
6
6
  {options?.message && <Text mb="md">{options.message}</Text>}
7
- <Group justify="flex-end">
7
+ <Flex justify="flex-end">
8
8
  <Button onClick={onClose}>{options?.okLabel || "OK"}</Button>
9
- </Group>
9
+ </Flex>
10
10
  </>
11
11
  );
12
12
 
@@ -1,10 +1,10 @@
1
- import { Button, Group, Text } from "@mantine/core";
1
+ import { Button, Flex, Text } from "@mantine/core";
2
2
  import type { ConfirmDialogProps } from "../../services/DialogService.tsx";
3
3
 
4
4
  const ConfirmDialog = ({ options, onConfirm }: ConfirmDialogProps) => (
5
5
  <>
6
6
  {options?.message && <Text mb="md">{options.message}</Text>}
7
- <Group justify="flex-end">
7
+ <Flex justify="flex-end">
8
8
  <Button variant="subtle" onClick={() => onConfirm(false)}>
9
9
  {options?.cancelLabel || "Cancel"}
10
10
  </Button>
@@ -14,7 +14,7 @@ const ConfirmDialog = ({ options, onConfirm }: ConfirmDialogProps) => (
14
14
  >
15
15
  {options?.confirmLabel || "Confirm"}
16
16
  </Button>
17
- </Group>
17
+ </Flex>
18
18
  </>
19
19
  );
20
20
 
@@ -1,4 +1,4 @@
1
- import { Button, Group, Text, TextInput } from "@mantine/core";
1
+ import { Button, Flex, Text, TextInput } from "@mantine/core";
2
2
  import { useEffect, useRef, useState } from "react";
3
3
  import type { PromptDialogProps } from "../../services/DialogService.tsx";
4
4
 
@@ -36,7 +36,7 @@ const PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {
36
36
  required={options?.required}
37
37
  mb="md"
38
38
  />
39
- <Group justify="flex-end">
39
+ <Flex justify="flex-end">
40
40
  <Button variant="subtle" onClick={() => onSubmit(null)}>
41
41
  {options?.cancelLabel || "Cancel"}
42
42
  </Button>
@@ -46,7 +46,7 @@ const PromptDialog = ({ options, onSubmit }: PromptDialogProps) => {
46
46
  >
47
47
  {options?.submitLabel || "OK"}
48
48
  </Button>
49
- </Group>
49
+ </Flex>
50
50
  </>
51
51
  );
52
52
  };