@alepha/ui 0.13.3 → 0.13.5

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 (79) hide show
  1. package/dist/admin/AdminFiles-B-0UcHVV.js +3 -0
  2. package/dist/admin/{AdminFiles-BjofP3OC.js → AdminFiles-B_jfB_Py.js} +4 -4
  3. package/dist/admin/{AdminFiles-BjofP3OC.js.map → AdminFiles-B_jfB_Py.js.map} +1 -1
  4. package/dist/admin/{AdminLayout-JakF7ESb.js → AdminLayout-BMtiXAzS.js} +37 -29
  5. package/dist/admin/AdminLayout-BMtiXAzS.js.map +1 -0
  6. package/dist/admin/AdminLayout-BNo3GoHR.js +3 -0
  7. package/dist/admin/{AdminNotifications-BPrxALdS.js → AdminNotifications-BFEjqpqx.js} +3 -3
  8. package/dist/admin/{AdminNotifications-BPrxALdS.js.map → AdminNotifications-BFEjqpqx.js.map} +1 -1
  9. package/dist/admin/AdminNotifications-DJs2ZjNj.js +3 -0
  10. package/dist/admin/{AdminSessions-CMmBtbSw.js → AdminSessions-D7DESfWK.js} +4 -4
  11. package/dist/admin/{AdminSessions-CMmBtbSw.js.map → AdminSessions-D7DESfWK.js.map} +1 -1
  12. package/dist/admin/AdminSessions-PS2M8iXi.js +3 -0
  13. package/dist/admin/{AdminUserCreate-Coa_yi6m.js → AdminUserCreate-Bhxsn92l.js} +3 -3
  14. package/dist/admin/{AdminUserCreate-Coa_yi6m.js.map → AdminUserCreate-Bhxsn92l.js.map} +1 -1
  15. package/dist/admin/{AdminUserCreate-DjiCcAk0.js → AdminUserCreate-CYI_xW5T.js} +1 -1
  16. package/dist/admin/{AdminUserDetails-BCFwOm9w.js → AdminUserDetails-C2y1Ig4n.js} +5 -5
  17. package/dist/admin/{AdminUserDetails-BCFwOm9w.js.map → AdminUserDetails-C2y1Ig4n.js.map} +1 -1
  18. package/dist/admin/{AdminUserDetails-C5yeJNa3.js → AdminUserDetails-Cmzx9HxH.js} +1 -1
  19. package/dist/admin/{AdminUserLayout-B8ga5QvP.js → AdminUserLayout-DGSf612u.js} +1 -1
  20. package/dist/admin/{AdminUserLayout-CR2OqV9Z.js → AdminUserLayout-sW6cjZL0.js} +3 -3
  21. package/dist/admin/{AdminUserLayout-CR2OqV9Z.js.map → AdminUserLayout-sW6cjZL0.js.map} +1 -1
  22. package/dist/admin/{AdminUserSessions-Bcf6-rjG.js → AdminUserSessions-CvN15wPe.js} +4 -4
  23. package/dist/admin/{AdminUserSessions-Bcf6-rjG.js.map → AdminUserSessions-CvN15wPe.js.map} +1 -1
  24. package/dist/admin/AdminUserSessions-D-aOcZgV.js +3 -0
  25. package/dist/admin/AdminUserSettings-CEMhIYrI.js +3 -0
  26. package/dist/admin/{AdminUserSettings-DRYVdW6S.js → AdminUserSettings-DvaaxgcV.js} +3 -3
  27. package/dist/admin/{AdminUserSettings-DRYVdW6S.js.map → AdminUserSettings-DvaaxgcV.js.map} +1 -1
  28. package/dist/admin/{AdminUsers-IN_2yHKt.js → AdminUsers-BR3C-jrg.js} +3 -3
  29. package/dist/admin/{AdminUsers-IN_2yHKt.js.map → AdminUsers-BR3C-jrg.js.map} +1 -1
  30. package/dist/admin/AdminUsers-CMW9vN09.js +3 -0
  31. package/dist/admin/index.d.ts +1169 -1163
  32. package/dist/admin/index.js +31 -29
  33. package/dist/admin/index.js.map +1 -1
  34. package/dist/auth/{AuthLayout-BSL8ZHgr.js → AuthLayout-CzwUKD9y.js} +2 -2
  35. package/dist/auth/{AuthLayout-BSL8ZHgr.js.map → AuthLayout-CzwUKD9y.js.map} +1 -1
  36. package/dist/auth/{IconGoogle-v_58os2T.js → IconGoogle-Cm5d8J3f.js} +3 -3
  37. package/dist/auth/{IconGoogle-v_58os2T.js.map → IconGoogle-Cm5d8J3f.js.map} +1 -1
  38. package/dist/auth/{Login-kBfaRgKG.js → Login-7HlBjDeV.js} +4 -4
  39. package/dist/auth/{Login-kBfaRgKG.js.map → Login-7HlBjDeV.js.map} +1 -1
  40. package/dist/auth/Login-C-e27DGb.js +4 -0
  41. package/dist/auth/{Register-BxJmOqpF.js → Register-CuQr3kgi.js} +3 -3
  42. package/dist/auth/{Register-BxJmOqpF.js.map → Register-CuQr3kgi.js.map} +1 -1
  43. package/dist/auth/Register-DbvXwgbG.js +4 -0
  44. package/dist/auth/{ResetPassword-BhyZ9ek4.js → ResetPassword-BzU-cdd4.js} +2 -2
  45. package/dist/auth/{ResetPassword-BhyZ9ek4.js.map → ResetPassword-BzU-cdd4.js.map} +1 -1
  46. package/dist/auth/ResetPassword-DSvrdpaA.js +3 -0
  47. package/dist/auth/VerifyEmail-Dc9ABKUw.js +3 -0
  48. package/dist/auth/{VerifyEmail-DeLct3oQ.js → VerifyEmail-R79sSej_.js} +2 -2
  49. package/dist/auth/{VerifyEmail-DeLct3oQ.js.map → VerifyEmail-R79sSej_.js.map} +1 -1
  50. package/dist/auth/index.d.ts +534 -534
  51. package/dist/auth/index.js +15 -14
  52. package/dist/auth/index.js.map +1 -1
  53. package/dist/core/index.d.ts +187 -187
  54. package/dist/core/index.js +51 -59
  55. package/dist/core/index.js.map +1 -1
  56. package/package.json +5 -4
  57. package/src/admin/AdminSidebar.ts +31 -0
  58. package/src/admin/components/AdminLayout.tsx +5 -26
  59. package/src/admin/index.ts +4 -1
  60. package/src/auth/components/Login.tsx +1 -1
  61. package/src/auth/components/buttons/UserButton.tsx +7 -1
  62. package/src/core/components/buttons/ActionButton.tsx +1 -0
  63. package/src/core/components/layout/Sidebar.tsx +0 -2
  64. package/src/core/hooks/useTheme.ts +2 -2
  65. package/src/core/providers/ThemeProvider.ts +11 -8
  66. package/src/core/themes/midnight.ts +1 -7
  67. package/styles.css +84 -0
  68. package/dist/admin/AdminFiles-DldZB7oo.js +0 -3
  69. package/dist/admin/AdminLayout-JakF7ESb.js.map +0 -1
  70. package/dist/admin/AdminLayout-qNsIyl30.js +0 -3
  71. package/dist/admin/AdminNotifications-DV-35Fi3.js +0 -3
  72. package/dist/admin/AdminSessions-Df2VYzlE.js +0 -3
  73. package/dist/admin/AdminUserSessions-A_5KkqTY.js +0 -3
  74. package/dist/admin/AdminUserSettings-DAsAhFjX.js +0 -3
  75. package/dist/admin/AdminUsers-Dd9a5UqO.js +0 -3
  76. package/dist/auth/Login-DDsyCNAA.js +0 -4
  77. package/dist/auth/Register-D10MnlQc.js +0 -4
  78. package/dist/auth/ResetPassword-llBG-STp.js +0 -3
  79. package/dist/auth/VerifyEmail-BvOG-IUC.js +0 -3
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  "mantine"
8
8
  ],
9
9
  "author": "Nicolas Foures",
10
- "version": "0.13.3",
10
+ "version": "0.13.5",
11
11
  "type": "module",
12
12
  "engines": {
13
13
  "node": ">=22.0.0"
@@ -18,10 +18,11 @@
18
18
  "style": "./styles.css",
19
19
  "files": [
20
20
  "dist",
21
- "src"
21
+ "src",
22
+ "styles.css"
22
23
  ],
23
24
  "dependencies": {
24
- "@alepha/react": "0.13.3",
25
+ "@alepha/react": "0.13.5",
25
26
  "@mantine/core": "^8.3.9",
26
27
  "@mantine/dates": "^8.3.9",
27
28
  "@mantine/hooks": "^8.3.9",
@@ -30,7 +31,7 @@
30
31
  "@mantine/nprogress": "^8.3.9",
31
32
  "@mantine/spotlight": "^8.3.9",
32
33
  "@tabler/icons-react": "^3.35.0",
33
- "alepha": "0.13.3",
34
+ "alepha": "0.13.5",
34
35
  "dayjs": "^1.11.19"
35
36
  },
36
37
  "devDependencies": {
@@ -0,0 +1,31 @@
1
+ import type { ReactRouter } from "@alepha/react";
2
+ import type { SidebarNode } from "@alepha/ui";
3
+ import { createElement } from "react";
4
+ import ToggleSidebarButton from "../core/components/buttons/ToggleSidebarButton.tsx";
5
+
6
+ export class AdminSidebar {
7
+ public menu = (router: ReactRouter<any>): SidebarNode[] => [
8
+ {
9
+ element: createElement(ToggleSidebarButton),
10
+ },
11
+ {
12
+ type: "spacer",
13
+ },
14
+ {
15
+ ...router.node("adminUsers"),
16
+ description: undefined,
17
+ },
18
+ {
19
+ ...router.node("adminSessions"),
20
+ description: undefined,
21
+ },
22
+ {
23
+ ...router.node("adminNotifications"),
24
+ description: undefined,
25
+ },
26
+ {
27
+ ...router.node("adminFiles"),
28
+ description: undefined,
29
+ },
30
+ ];
31
+ }
@@ -1,4 +1,4 @@
1
- import { NestedView, useRouter } from "@alepha/react";
1
+ import { NestedView, useInject, useRouter } from "@alepha/react";
2
2
  import {
3
3
  ActionButton,
4
4
  AdminShell,
@@ -8,11 +8,13 @@ import {
8
8
  import { UserButton } from "@alepha/ui/auth";
9
9
  import { Flex } from "@mantine/core";
10
10
  import { IconArrowLeft } from "@tabler/icons-react";
11
- import ToggleSidebarButton from "../../core/components/buttons/ToggleSidebarButton.tsx";
12
11
  import type { AdminRouter } from "../AdminRouter.ts";
12
+ import { AdminSidebar } from "../AdminSidebar.ts";
13
13
 
14
14
  const AdminLayout = () => {
15
15
  const router = useRouter<AdminRouter>();
16
+ const sidebar = useInject(AdminSidebar);
17
+
16
18
  return (
17
19
  <AdminShell
18
20
  appShellMainProps={{
@@ -61,30 +63,7 @@ const AdminLayout = () => {
61
63
  }}
62
64
  sidebarProps={{
63
65
  gap: "xs",
64
- menu: [
65
- {
66
- element: <ToggleSidebarButton />,
67
- },
68
- {
69
- type: "spacer",
70
- },
71
- {
72
- ...router.node("adminUsers"),
73
- description: undefined,
74
- },
75
- {
76
- ...router.node("adminSessions"),
77
- description: undefined,
78
- },
79
- {
80
- ...router.node("adminNotifications"),
81
- description: undefined,
82
- },
83
- {
84
- ...router.node("adminFiles"),
85
- description: undefined,
86
- },
87
- ],
66
+ menu: sidebar.menu(router),
88
67
  }}
89
68
  >
90
69
  <Flex flex={1} bg={"var(--alepha-surface)"}>
@@ -2,11 +2,13 @@ import { AlephaUI } from "@alepha/ui";
2
2
  import { AlephaUIAuth } from "@alepha/ui/auth";
3
3
  import { $module } from "alepha";
4
4
  import { AdminRouter } from "./AdminRouter.ts";
5
+ import { AdminSidebar } from "./AdminSidebar.ts";
5
6
  import { MainRouter } from "./MainRouter.ts";
6
7
 
7
8
  // ---------------------------------------------------------------------------------------------------------------------
8
9
 
9
10
  export { AdminRouter } from "./AdminRouter.ts";
11
+ export { AdminSidebar } from "./AdminSidebar.ts";
10
12
  export { default as AdminFiles } from "./components/AdminFiles.tsx";
11
13
  export { default as AdminJobs } from "./components/AdminJobs.tsx";
12
14
  export { default as AdminLayout } from "./components/AdminLayout.tsx";
@@ -31,8 +33,9 @@ export { MainRouter } from "./MainRouter.ts";
31
33
  */
32
34
  export const AlephaUIAdmin = $module({
33
35
  name: "alepha.ui.admin",
34
- services: [AlephaUI, AlephaUIAuth, AdminRouter, MainRouter],
36
+ services: [AlephaUI, AlephaUIAuth, AdminRouter, MainRouter, AdminSidebar],
35
37
  register: (alepha) => {
36
38
  alepha.with(AdminRouter);
39
+ alepha.with(AdminSidebar);
37
40
  },
38
41
  });
@@ -174,7 +174,7 @@ const Login = (props: LoginProps) => {
174
174
  )}
175
175
  </Stack>
176
176
  </Card>
177
- <ActionButton variant={"subtle"} href={redirect}>
177
+ <ActionButton variant={"subtle"} href={"/"}>
178
178
  {tr("loginCancel")}
179
179
  </ActionButton>
180
180
  </Stack>
@@ -60,7 +60,13 @@ const UserButton = (props: UserButtonProps) => {
60
60
  const authRouter = useRouter<AuthRouter>();
61
61
 
62
62
  if (!auth.user) {
63
- return <ActionButton icon={IconLogin2} href={authRouter.path("login")} />;
63
+ return (
64
+ <ActionButton
65
+ {...buttonProps}
66
+ icon={IconLogin2}
67
+ href={authRouter.path("login")}
68
+ />
69
+ );
64
70
  }
65
71
 
66
72
  const userLabel = auth.user.username || auth.user.email;
@@ -244,6 +244,7 @@ const ActionButton = (_props: ActionProps) => {
244
244
 
245
245
  // set default color to gray (not colored)
246
246
  restProps.color ??= "gray";
247
+ restProps.c ??= "var(--mantine-color-text)";
247
248
 
248
249
  if (props.icon) {
249
250
  const icon = isComponentType(props.icon) ? (
@@ -229,7 +229,6 @@ export const SidebarItem = (props: SidebarItemProps) => {
229
229
  props.theme.button?.size ??
230
230
  (level === 0 ? "sm" : "xs")
231
231
  }
232
- color={"var(--alepha-text)"}
233
232
  variant={"subtle"}
234
233
  variantActive={"default"}
235
234
  radius={props.item.theme?.radius ?? props.theme.button?.radius ?? "md"}
@@ -342,7 +341,6 @@ const SidebarCollapsedItem = (props: SidebarItemProps) => {
342
341
  props.theme.button?.size ??
343
342
  (level === 0 ? "sm" : "xs")
344
343
  }
345
- color={"var(--alepha-text)"}
346
344
  variant={"subtle"}
347
345
  variantActive={"default"}
348
346
  tooltip={
@@ -1,13 +1,13 @@
1
1
  import { useInject, useStore } from "@alepha/react";
2
2
  import {
3
3
  type AlephaTheme,
4
+ mantineThemeAtom,
4
5
  type Theme,
5
6
  ThemeProvider,
6
- themeAtom,
7
7
  } from "../providers/ThemeProvider.ts";
8
8
 
9
9
  export const useTheme = () => {
10
- useStore(themeAtom);
10
+ useStore(mantineThemeAtom);
11
11
 
12
12
  const themeService = useInject(ThemeProvider);
13
13
  const currentTheme = themeService.getTheme();
@@ -12,7 +12,7 @@ import {
12
12
  slateTheme,
13
13
  } from "../themes/index.ts";
14
14
 
15
- export const themeAtom = $atom({
15
+ export const mantineThemeAtom = $atom({
16
16
  name: "alepha.ui.theme",
17
17
  schema: t.object({
18
18
  id: t.string(),
@@ -22,11 +22,11 @@ export const themeAtom = $atom({
22
22
  },
23
23
  });
24
24
 
25
- export type Theme = Static<typeof themeAtom.schema>;
25
+ export type Theme = Static<typeof mantineThemeAtom.schema>;
26
26
 
27
27
  declare module "alepha" {
28
28
  interface State {
29
- [themeAtom.key]?: Theme;
29
+ [mantineThemeAtom.key]?: Theme;
30
30
  }
31
31
  }
32
32
 
@@ -38,7 +38,7 @@ export type AlephaTheme = MantineThemeOverride & {
38
38
 
39
39
  export class ThemeProvider {
40
40
  protected readonly alepha = $inject(Alepha);
41
- protected themeCookie = $cookie(themeAtom);
41
+ protected themeCookie = $cookie(mantineThemeAtom);
42
42
 
43
43
  public themes: AlephaTheme[] = [
44
44
  defaultTheme,
@@ -60,7 +60,7 @@ export class ThemeProvider {
60
60
 
61
61
  public setTheme(theme: Theme) {
62
62
  this.themeCookie.set(theme);
63
- this.alepha.store.set(themeAtom, theme);
63
+ this.alepha.store.set(mantineThemeAtom, theme);
64
64
 
65
65
  if (typeof document === "undefined") return;
66
66
 
@@ -76,12 +76,15 @@ export class ThemeProvider {
76
76
  try {
77
77
  return (
78
78
  this.themeCookie.get() ??
79
- this.alepha.store.get(themeAtom) ??
80
- themeAtom.options.default
79
+ this.alepha.store.get(mantineThemeAtom) ??
80
+ mantineThemeAtom.options.default
81
81
  );
82
82
  } catch {
83
83
  // TODO: atom should take default value if undefined ???
84
- return this.alepha.store.get(themeAtom) ?? themeAtom.options.default;
84
+ return (
85
+ this.alepha.store.get(mantineThemeAtom) ??
86
+ mantineThemeAtom.options.default
87
+ );
85
88
  }
86
89
  }
87
90
  }
@@ -24,13 +24,7 @@ export const midnightTheme: AlephaTheme = {
24
24
  h6: { fontSize: "0.75rem", lineHeight: "1.5" },
25
25
  },
26
26
  },
27
- fontSizes: {
28
- xs: "0.75rem",
29
- sm: "0.875rem",
30
- md: "0.875rem",
31
- lg: "1rem",
32
- xl: "1.25rem",
33
- },
27
+
34
28
  radius: {
35
29
  xs: "3px",
36
30
  sm: "6px",
package/styles.css ADDED
@@ -0,0 +1,84 @@
1
+ @import "@mantine/core/styles.css";
2
+ @import "@mantine/nprogress/styles.css";
3
+ @import "@mantine/spotlight/styles.css";
4
+ @import "@mantine/dates/styles.css";
5
+ @import "@mantine/notifications/styles.css";
6
+
7
+ :root {
8
+ --alepha-background-light: var(--mantine-color-gray-1);
9
+ --alepha-background-dark: var(--mantine-color-dark-9);
10
+ --alepha-background: var(--alepha-background-light);
11
+
12
+ --alepha-surface-light: var(--mantine-color-gray-0);
13
+ --alepha-surface-dark: var(--mantine-color-dark-8);
14
+ --alepha-surface: var(--alepha-surface-light);
15
+
16
+ --alepha-elevated-light: var(--mantine-color-white);
17
+ --alepha-elevated-hover-light: #f6f5f5;
18
+ --alepha-elevated-dark: var(--mantine-color-dark-7);
19
+ --alepha-elevated-hover-dark: var(--mantine-color-dark-6);
20
+ --alepha-elevated: var(--alepha-elevated-light);
21
+ --alepha-elevated-hover: var(--alepha-elevated-hover-light);
22
+
23
+ --alepha-border-light: #cbcbcb;
24
+ --alepha-border-dark: var(--mantine-color-dark-4);
25
+ --alepha-border: var(--alepha-border-light);
26
+
27
+ --alepha-text-light: #000000;
28
+ --alepha-text-dark: #ffffff;
29
+ --alepha-text-muted: #6c757d;
30
+ --alepha-text: var(--alepha-text-light);
31
+ }
32
+
33
+ #root {
34
+ display: flex;
35
+ background-color: var(--alepha-background);
36
+ color: var(--alepha-text);
37
+ min-height: 100dvh;
38
+ }
39
+
40
+ /* ------------------------------------------------------------------------------------------------------------------ */
41
+
42
+ [data-mantine-color-scheme="dark"] {
43
+ --alepha-surface: var(--alepha-surface-dark);
44
+ --alepha-elevated: var(--alepha-elevated-dark);
45
+ --alepha-elevated-hover: var(--alepha-elevated-hover-dark);
46
+ --alepha-border: var(--alepha-border-dark);
47
+ --alepha-background: var(--alepha-background-dark);
48
+ --alepha-shadow: var(--alepha-shadow-dark);
49
+ --alepha-text: var(--alepha-text-dark);
50
+ }
51
+
52
+ /* ------------------------------------------------------------------------------------------------------------------ */
53
+
54
+ .overflow-auto {
55
+ overflow: auto;
56
+ scrollbar-color: var(--alepha-text-muted) transparent;
57
+ scrollbar-width: thin;
58
+ }
59
+
60
+ /* ------------------------------------------------------------------------------------------------------------------ */
61
+ /* Modal Customizations */
62
+
63
+ /* Custom modal scale animation */
64
+ @keyframes modalScaleIn {
65
+ from {
66
+ opacity: 0;
67
+ transform: scale(0.9);
68
+ }
69
+ to {
70
+ opacity: 1;
71
+ transform: scale(1);
72
+ }
73
+ }
74
+
75
+ @keyframes modalScaleOut {
76
+ from {
77
+ opacity: 1;
78
+ transform: scale(1);
79
+ }
80
+ to {
81
+ opacity: 0;
82
+ transform: scale(0.95);
83
+ }
84
+ }
@@ -1,3 +0,0 @@
1
- import { t as AdminFiles_default } from "./AdminFiles-BjofP3OC.js";
2
-
3
- export { AdminFiles_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"AdminLayout-JakF7ESb.js","names":["menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown>","ActionButton","icon","Flex","defaultTooltipProps: Partial<TooltipProps>","ActionButton","Flex","ToggleSidebarButton"],"sources":["../../src/core/constants/ui.ts","../../src/core/components/buttons/ActionButton.tsx","../../src/core/components/buttons/ToggleSidebarButton.tsx","../../src/admin/components/AdminLayout.tsx"],"sourcesContent":["export const ui = {\n colors: {\n transparent: \"transparent\",\n background: \"var(--alepha-background)\",\n surface: \"var(--alepha-surface)\",\n elevated: \"var(--alepha-elevated)\",\n border: \"var(--alepha-border)\",\n },\n sizes: {\n icon: {\n xs: 12,\n sm: 16,\n md: 20,\n lg: 24,\n xl: 32,\n },\n },\n};\n","import {\n type RouterGoOptions,\n type UseActionReturn,\n type UseActiveOptions,\n useAction,\n useActive,\n useRouter,\n} from \"@alepha/react\";\nimport { type FormModel, useFormState } from \"@alepha/react/form\";\nimport {\n Anchor,\n type AnchorProps,\n Button,\n type ButtonProps,\n Flex,\n Menu,\n type MenuItemProps,\n type MenuProps,\n type MenuTargetProps,\n ThemeIcon,\n type ThemeIconProps,\n Tooltip,\n type TooltipProps,\n} from \"@mantine/core\";\nimport { IconCheck, IconChevronRight } from \"@tabler/icons-react\";\nimport {\n type ButtonHTMLAttributes,\n Children,\n type ComponentType,\n isValidElement,\n type ReactNode,\n} from \"react\";\nimport { ui } from \"../../constants/ui.ts\";\n\nexport interface ActionMenuItem {\n /**\n * Menu item type\n */\n type?: \"item\" | \"divider\" | \"label\";\n\n /**\n * Label text for the menu item\n */\n label?: string | ReactNode;\n\n /**\n * Icon element to display before the label\n */\n icon?: ReactNode;\n\n /**\n * Click handler for menu items\n */\n onClick?: () => void;\n\n /**\n * Href for navigation menu items\n */\n href?: string;\n\n /**\n * Color for the menu item (e.g., \"red\" for danger actions)\n */\n color?: string;\n\n /**\n * Nested submenu items\n */\n children?: ActionMenuItem[];\n\n /**\n * Whether the menu item is active\n */\n active?: boolean;\n}\n\nexport interface ActionMenuConfig {\n /**\n * Array of menu items to display\n */\n items: ActionMenuItem[];\n\n /**\n * Menu position relative to the button\n */\n position?:\n | \"bottom\"\n | \"bottom-start\"\n | \"bottom-end\"\n | \"top\"\n | \"top-start\"\n | \"top-end\"\n | \"left\"\n | \"right\";\n\n /**\n * Menu width\n */\n width?: number | string;\n\n /**\n * Menu shadow\n */\n shadow?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n on?: \"hover\" | \"click\";\n\n targetProps?: MenuTargetProps;\n\n menuProps?: MenuProps;\n}\n\nexport interface ActionCommonProps extends ButtonProps {\n children?: ReactNode;\n\n textVisibleFrom?: \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\n /**\n * Tooltip to display on hover. Can be a string for simple tooltips\n * or a TooltipProps object for advanced configuration.\n */\n tooltip?: string | TooltipProps;\n\n /**\n * Menu configuration. When provided, the action will display a dropdown menu.\n */\n menu?: ActionMenuConfig;\n\n /**\n * If set, a confirmation dialog will be shown before performing the action.\n * If `true`, a default title and message will be used.\n * If a string, it will be used as the message with a default title.\n * If an object, it can contain `title` and `message` properties to customize the dialog.\n */\n confirm?: boolean | string | { title?: string; message: string };\n\n /**\n * Icon to display on the left side of the button.\n * If no children are provided, the button will be styled as an icon-only button.\n */\n icon?: ReactNode | ComponentType;\n\n /**\n * Additional props to pass to the ThemeIcon wrapping the icon.\n */\n themeIconProps?: ThemeIconProps;\n\n /**\n * Visual intent of the action button.\n */\n intent?: \"primary\" | \"success\" | \"danger\" | \"warning\" | \"info\";\n}\n\nexport type ActionProps = ActionCommonProps &\n (\n | ActionNavigationButtonProps\n | ActionClickButtonProps\n | ActionSubmitButtonProps\n | ActionHookButtonProps\n | {}\n );\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Helper function to render menu items recursively\nconst ActionMenuItem = (props: {\n item: ActionMenuItem;\n index: number;\n}): ReactNode => {\n const { item, index } = props;\n\n const router = useRouter();\n const action = useAction(\n {\n handler: async (e: any) => {\n await item.onClick?.();\n },\n },\n [item.onClick],\n );\n\n // Render divider\n if (item.type === \"divider\") {\n return <Menu.Divider key={index} />;\n }\n\n // Render label\n if (item.type === \"label\") {\n return <Menu.Label key={index}>{item.label}</Menu.Label>;\n }\n\n // Render submenu if it has children\n if (item.children && item.children.length > 0) {\n return (\n <Menu key={index} trigger=\"hover\" position=\"right-start\" offset={2}>\n <Menu.Target>\n <Menu.Item\n leftSection={item.icon}\n rightSection={<IconChevronRight size={14} />}\n >\n {item.label}\n </Menu.Item>\n </Menu.Target>\n <Menu.Dropdown>\n {item.children.map((child, childIndex) => (\n <ActionMenuItem item={child} index={childIndex} key={childIndex} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n const menuItemProps: MenuItemProps & ButtonHTMLAttributes<unknown> = {};\n if (props.item.onClick) {\n menuItemProps.onClick = action.run;\n } else if (props.item.href) {\n Object.assign(menuItemProps, router.anchor(props.item.href));\n }\n\n // render regular menu item\n return (\n <Menu.Item\n key={index}\n leftSection={item.icon}\n onClick={item.onClick}\n color={item.color}\n rightSection={\n item.active ? (\n <ThemeIcon size={\"xs\"} variant={\"transparent\"}>\n <IconCheck />\n </ThemeIcon>\n ) : undefined\n }\n {...menuItemProps}\n >\n {item.label}\n </Menu.Item>\n );\n};\n\nconst ActionButton = (_props: ActionProps) => {\n const props = { variant: \"subtle\", ..._props };\n const { tooltip, menu, icon, ...restProps } = props;\n\n // set default color to gray (not colored)\n restProps.color ??= \"gray\";\n\n if (props.icon) {\n const icon = isComponentType(props.icon) ? (\n <props.icon size={ui.sizes.icon.md} />\n ) : (\n <ThemeIcon\n w={24} // TODO: make size configurable\n variant={\"transparent\"}\n size={\"sm\"}\n c={\"var(--mantine-color-text)\"}\n {...props.themeIconProps}\n >\n {props.icon as ReactNode}\n </ThemeIcon>\n );\n\n if (!props.children) {\n restProps.children = Children.only(icon);\n restProps.px ??= \"xs\";\n } else {\n restProps.leftSection = icon;\n }\n }\n\n if (props.leftSection && !props.children) {\n restProps.px ??= \"xs\";\n }\n\n if (props.textVisibleFrom) {\n const { children, textVisibleFrom, leftSection, ...rest } = restProps;\n return (\n <>\n <Flex w={\"100%\"} visibleFrom={textVisibleFrom}>\n <ActionButton\n flex={1}\n {...rest}\n leftSection={leftSection}\n tooltip={tooltip}\n menu={menu}\n >\n {children}\n </ActionButton>\n </Flex>\n <Flex w={\"100%\"} hiddenFrom={textVisibleFrom}>\n <ActionButton px={\"xs\"} {...rest} tooltip={tooltip} menu={menu}>\n {leftSection}\n </ActionButton>\n </Flex>\n </>\n );\n }\n\n const renderAction = () => {\n if (\"href\" in restProps && restProps.href) {\n if (restProps.href.startsWith(\"http\") || restProps.target) {\n return (\n <ActionHrefButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionHrefButton>\n );\n }\n return (\n <ActionNavigationButton {...restProps} href={restProps.href}>\n {restProps.children}\n </ActionNavigationButton>\n );\n }\n\n delete (restProps as any).classNameActive;\n delete (restProps as any).variantActive;\n\n if (\"action\" in restProps && restProps.action) {\n return (\n <ActionHookButton {...restProps} action={restProps.action}>\n {restProps.children}\n </ActionHookButton>\n );\n }\n\n if (\"onClick\" in restProps && restProps.onClick) {\n return (\n <ActionClickButton {...restProps} onClick={restProps.onClick}>\n {restProps.children}\n </ActionClickButton>\n );\n }\n\n if (\"form\" in restProps && restProps.form) {\n if (restProps.type === \"reset\") {\n return (\n <ActionResetButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionResetButton>\n );\n }\n return (\n <ActionSubmitButton {...restProps} form={restProps.form}>\n {restProps.children}\n </ActionSubmitButton>\n );\n }\n\n return <Button {...(restProps as any)}>{restProps.children}</Button>;\n };\n\n let actionElement = renderAction();\n\n // wrap with Menu if provided\n if (menu) {\n actionElement = (\n <Menu\n position={menu.position || \"bottom-start\"}\n width={menu.width || 200}\n shadow={menu.shadow || \"md\"}\n trigger={menu.on === \"hover\" ? \"hover\" : \"click\"}\n {...menu.menuProps}\n >\n <Menu.Target {...menu.targetProps}>{actionElement}</Menu.Target>\n <Menu.Dropdown>\n {menu.items.map((item, index) => (\n <ActionMenuItem item={item} index={index} key={index} />\n ))}\n </Menu.Dropdown>\n </Menu>\n );\n }\n\n // Wrap with Tooltip if provided\n if (tooltip) {\n // openDelay: 1000 -> like HTML title attribute\n const defaultTooltipProps: Partial<TooltipProps> = {\n openDelay: 1000,\n };\n const tooltipProps: TooltipProps =\n typeof tooltip === \"string\"\n ? {\n ...defaultTooltipProps,\n label: tooltip,\n children: actionElement,\n }\n : { ...defaultTooltipProps, ...tooltip, children: actionElement };\n\n return <Tooltip {...tooltipProps} />;\n }\n\n return actionElement;\n};\n\nexport default ActionButton;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Submit\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionSubmitButtonProps extends ButtonProps {\n form: FormModel<any>;\n type?: \"submit\" | \"reset\";\n}\n\n/**\n * Action button that submits a form with loading and disabled state handling.\n */\nconst ActionSubmitButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button\n {...buttonProps}\n loading={state.loading}\n disabled={state.loading}\n type={\"submit\"}\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionResetButton = (props: ActionSubmitButtonProps) => {\n const { form, ...buttonProps } = props;\n const state = useFormState(form);\n return (\n <Button {...buttonProps} disabled={state.loading} type={\"reset\"}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action with useAction Hook\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionHookButtonProps extends ButtonProps {\n action: UseActionReturn<any[], any>;\n}\n\n/**\n * Action button that integrates with useAction hook return value.\n * Automatically handles loading state and executes the action on click.\n *\n * @example\n * ```tsx\n * const saveAction = useAction({\n * handler: async (data) => {\n * await api.save(data);\n * }\n * }, []);\n *\n * <ActionButton action={saveAction}>\n * Save\n * </ActionButton>\n * ```\n */\nconst ActionHookButton = (props: ActionHookButtonProps) => {\n const { action, ...buttonProps } = props;\n\n return (\n <Button\n {...buttonProps}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={() => action.run()}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Click\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionClickButtonProps extends ButtonProps {\n onClick: (e: any) => any;\n}\n\n/**\n * Basic action button that handles click events with loading and error handling.\n *\n * @example\n * ```tsx\n * <ActionButton onClick={() => api.doSomething()}>\n * Do Something\n * </ActionButton>\n * ```\n */\nconst ActionClickButton = (props: ActionClickButtonProps) => {\n const action = useAction(\n {\n handler: async (e: any) => {\n await props.onClick(e);\n },\n },\n [props.onClick],\n );\n\n return (\n <Button\n {...props}\n disabled={action.loading || props.disabled}\n loading={action.loading}\n onClick={action.run}\n >\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n// Action Navigation\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ActionNavigationButtonProps extends ButtonProps {\n href: string;\n active?: Partial<UseActiveOptions> | false;\n routerGoOptions?: RouterGoOptions;\n classNameActive?: string;\n variantActive?: ButtonProps[\"variant\"];\n target?: string;\n anchorProps?: AnchorProps;\n}\n\n/**\n * Action for navigation with active state support.\n */\nconst ActionNavigationButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n ...buttonProps\n } = props;\n const router = useRouter();\n const { isPending, isActive } = useActive(\n options ? { href: props.href, ...options } : { href: props.href },\n );\n const anchorProps = router.anchor(props.href, routerGoOptions);\n\n const className = buttonProps.className || \"\";\n if (isActive && options !== false && classNameActive) {\n buttonProps.className = `${className} ${classNameActive}`.trim();\n }\n\n if (props.anchorProps) {\n return (\n <Anchor component={\"a\"} {...anchorProps} {...props.anchorProps}>\n {props.children}\n </Anchor>\n );\n }\n\n return (\n <Button\n component={\"a\"}\n loading={isPending}\n {...buttonProps}\n {...anchorProps}\n variant={\n isActive && options !== false\n ? (variantActive ?? \"filled\")\n : (buttonProps.variant ?? \"subtle\")\n }\n >\n {props.children}\n </Button>\n );\n};\n\nconst ActionHrefButton = (props: ActionNavigationButtonProps) => {\n const {\n active: options,\n classNameActive,\n variantActive,\n routerGoOptions,\n target,\n ...buttonProps\n } = props;\n\n return (\n <Button component={\"a\"} target={target} {...buttonProps}>\n {props.children}\n </Button>\n );\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function isComponentType(param: any): param is ComponentType<any> {\n if (isValidElement(param)) return false;\n return (\n typeof param === \"function\" ||\n (typeof param === \"object\" && param !== null && \"$$typeof\" in param)\n );\n}\n\nexport const renderIcon = (icon: ReactNode | ComponentType): ReactNode => {\n if (!icon) return null;\n if (isValidElement(icon)) return icon;\n if (isComponentType(icon)) {\n const IconComponent = icon;\n return <IconComponent size={ui.sizes.icon.md} />;\n }\n return icon as ReactNode;\n};\n","import { useStore } from \"@alepha/react\";\nimport {\n IconLayoutSidebarLeftCollapse,\n IconLayoutSidebarRightCollapse,\n} from \"@tabler/icons-react\";\nimport ActionButton from \"./ActionButton.tsx\";\n\nconst ToggleSidebarButton = () => {\n const [collapsed, setCollapsed] = useStore(\"alepha.ui.sidebar.collapsed\");\n\n return (\n <ActionButton\n icon={\n collapsed ? (\n <IconLayoutSidebarRightCollapse />\n ) : (\n <IconLayoutSidebarLeftCollapse />\n )\n }\n variant={\"subtle\"}\n size={\"md\"}\n onClick={() => setCollapsed(!collapsed)}\n tooltip={{\n position: \"right\",\n label: collapsed ? \"Show sidebar\" : \"Hide sidebar\",\n }}\n />\n );\n};\n\nexport default ToggleSidebarButton;\n","import { NestedView, useRouter } from \"@alepha/react\";\nimport {\n ActionButton,\n AdminShell,\n OmnibarButton,\n ThemeButton,\n} from \"@alepha/ui\";\nimport { UserButton } from \"@alepha/ui/auth\";\nimport { Flex } from \"@mantine/core\";\nimport { IconArrowLeft } from \"@tabler/icons-react\";\nimport ToggleSidebarButton from \"../../core/components/buttons/ToggleSidebarButton.tsx\";\nimport type { AdminRouter } from \"../AdminRouter.ts\";\n\nconst AdminLayout = () => {\n const router = useRouter<AdminRouter>();\n return (\n <AdminShell\n appShellMainProps={{\n bg: \"var(--alepha-surface)\",\n }}\n appShellHeaderProps={{\n bg: \"var(--alepha-background)\",\n }}\n appShellNavbarProps={\n {\n // bg: \"var(--alepha-background)\",\n }\n }\n appShellProps={\n {\n // withBorder: false,\n }\n }\n appShellFooterProps={{\n bg: \"var(--alepha-background)\",\n }}\n footer={<Flex h={12} />}\n appBarProps={{\n items: [\n {\n element: <ActionButton icon={IconArrowLeft} href={\"/\"} />,\n position: \"left\",\n },\n {\n element: <OmnibarButton actionProps={{ variant: \"outline\" }} />,\n position: \"right\",\n },\n {\n element: <UserButton />,\n position: \"right\",\n },\n {\n element: <ThemeButton />,\n position: \"right\",\n },\n {\n type: \"dark\",\n position: \"right\",\n },\n ],\n }}\n sidebarProps={{\n gap: \"xs\",\n menu: [\n {\n element: <ToggleSidebarButton />,\n },\n {\n type: \"spacer\",\n },\n {\n ...router.node(\"adminUsers\"),\n description: undefined,\n },\n {\n ...router.node(\"adminSessions\"),\n description: undefined,\n },\n {\n ...router.node(\"adminNotifications\"),\n description: undefined,\n },\n {\n ...router.node(\"adminFiles\"),\n description: undefined,\n },\n ],\n }}\n >\n <Flex flex={1} bg={\"var(--alepha-surface)\"}>\n <NestedView />\n </Flex>\n </AdminShell>\n );\n};\n\nexport default AdminLayout;\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import { t as AdminLayout_default } from "./AdminLayout-JakF7ESb.js";
2
-
3
- export { AdminLayout_default as default };
@@ -1,3 +0,0 @@
1
- import { t as AdminNotifications_default } from "./AdminNotifications-BPrxALdS.js";
2
-
3
- export { AdminNotifications_default as default };
@@ -1,3 +0,0 @@
1
- import { t as AdminSessions_default } from "./AdminSessions-CMmBtbSw.js";
2
-
3
- export { AdminSessions_default as default };
@@ -1,3 +0,0 @@
1
- import { t as AdminUserSessions_default } from "./AdminUserSessions-Bcf6-rjG.js";
2
-
3
- export { AdminUserSessions_default as default };
@@ -1,3 +0,0 @@
1
- import { t as AdminUserSettings_default } from "./AdminUserSettings-DRYVdW6S.js";
2
-
3
- export { AdminUserSettings_default as default };
@@ -1,3 +0,0 @@
1
- import { t as AdminUsers_default } from "./AdminUsers-IN_2yHKt.js";
2
-
3
- export { AdminUsers_default as default };
@@ -1,4 +0,0 @@
1
- import "./IconGoogle-v_58os2T.js";
2
- import { t as Login_default } from "./Login-kBfaRgKG.js";
3
-
4
- export { Login_default as default };
@@ -1,4 +0,0 @@
1
- import "./IconGoogle-v_58os2T.js";
2
- import { t as Register_default } from "./Register-BxJmOqpF.js";
3
-
4
- export { Register_default as default };
@@ -1,3 +0,0 @@
1
- import { t as ResetPassword_default } from "./ResetPassword-BhyZ9ek4.js";
2
-
3
- export { ResetPassword_default as default };
@@ -1,3 +0,0 @@
1
- import { t as VerifyEmail_default } from "./VerifyEmail-DeLct3oQ.js";
2
-
3
- export { VerifyEmail_default as default };