@alepha/ui 0.14.1 → 0.14.3

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 (183) hide show
  1. package/dist/admin/AdminAudits-B3EhKhN7.js +3 -0
  2. package/dist/admin/{AdminAudits-CwvH8e8c.js → AdminAudits-DIrCCPk3.js} +3 -2
  3. package/dist/admin/AdminAudits-DIrCCPk3.js.map +1 -0
  4. package/dist/admin/AdminFiles-C8OG4dtD.js +3 -0
  5. package/dist/admin/{AdminFiles-C_w1tb_x.js → AdminFiles-RsL178Ta.js} +2 -2
  6. package/dist/admin/{AdminFiles-C_w1tb_x.js.map → AdminFiles-RsL178Ta.js.map} +1 -1
  7. package/dist/admin/AdminNotifications-BSL4B2fQ.js +3 -0
  8. package/dist/admin/{AdminNotifications-DuYy74AN.js → AdminNotifications-cIbywWKi.js} +2 -2
  9. package/dist/admin/AdminNotifications-cIbywWKi.js.map +1 -0
  10. package/dist/admin/{AdminParameters-DYg48Jwe.js → AdminParameters-BKObzzpN.js} +1 -1
  11. package/dist/admin/{AdminParameters-YagqWTG3.js → AdminParameters-D-q3Qmhv.js} +2 -2
  12. package/dist/admin/{AdminParameters-YagqWTG3.js.map → AdminParameters-D-q3Qmhv.js.map} +1 -1
  13. package/dist/admin/AdminSessions-DHG9zPfr.js +3 -0
  14. package/dist/admin/{AdminSessions-BCjgJ-93.js → AdminSessions-vOgkrQ2U.js} +3 -2
  15. package/dist/admin/AdminSessions-vOgkrQ2U.js.map +1 -0
  16. package/dist/admin/{AdminUserAudits-B_PUXCKC.js → AdminUserAudits-CSsN1fIC.js} +3 -2
  17. package/dist/admin/AdminUserAudits-CSsN1fIC.js.map +1 -0
  18. package/dist/admin/{AdminUserAudits-D7cTcElL.js → AdminUserAudits-DmAnivo3.js} +1 -1
  19. package/dist/admin/{AdminUserCreate-DzfRbGZ4.js → AdminUserCreate-B72nu-3W.js} +3 -2
  20. package/dist/admin/AdminUserCreate-B72nu-3W.js.map +1 -0
  21. package/dist/admin/{AdminUserCreate-oUA1KDIl.js → AdminUserCreate-DpA13zwj.js} +1 -1
  22. package/dist/admin/AdminUserDetails-CKM2IEMr.js +475 -0
  23. package/dist/admin/AdminUserDetails-CKM2IEMr.js.map +1 -0
  24. package/dist/admin/{AdminUserDetails-y1H5DW8Y.js → AdminUserDetails-Zib_B6Al.js} +1 -1
  25. package/dist/admin/{AdminUserLayout-Dejnz13m.js → AdminUserLayout-BNBOEiAO.js} +1 -1
  26. package/dist/admin/AdminUserLayout-D7En9UBq.js +334 -0
  27. package/dist/admin/AdminUserLayout-D7En9UBq.js.map +1 -0
  28. package/dist/admin/AdminUserSessions-D9X2_HMA.js +3 -0
  29. package/dist/admin/{AdminUserSessions-DO9H85O-.js → AdminUserSessions-DEaGu6n6.js} +3 -2
  30. package/dist/admin/AdminUserSessions-DEaGu6n6.js.map +1 -0
  31. package/dist/admin/{AdminUserSettings-B3jA8g3p.js → AdminUserSettings-Di73D7g2.js} +8 -6
  32. package/dist/admin/AdminUserSettings-Di73D7g2.js.map +1 -0
  33. package/dist/admin/AdminUserSettings-yI-JECf5.js +3 -0
  34. package/dist/admin/{AdminUsers-ebbrJBT0.js → AdminUsers-BnGIRvmV.js} +3 -2
  35. package/dist/admin/AdminUsers-BnGIRvmV.js.map +1 -0
  36. package/dist/admin/AdminUsers-CG9-2Z8W.js +3 -0
  37. package/dist/admin/index.d.ts +25 -25
  38. package/dist/admin/index.d.ts.map +1 -1
  39. package/dist/admin/index.js +37 -36
  40. package/dist/admin/index.js.map +1 -1
  41. package/dist/auth/{AuthLayout-BAZJHzDG.js → AuthLayout-B1sUB8fB.js} +2 -2
  42. package/dist/auth/AuthLayout-B1sUB8fB.js.map +1 -0
  43. package/dist/auth/Login-BWi-pPbO.js +4 -0
  44. package/dist/auth/{Login-CeNZZjrr.js → Login-Cjxv3EDi.js} +2 -2
  45. package/dist/auth/Login-Cjxv3EDi.js.map +1 -0
  46. package/dist/auth/{Register-s4ENeyiE.js → Register-BKBIpHhW.js} +3 -2
  47. package/dist/auth/Register-BKBIpHhW.js.map +1 -0
  48. package/dist/auth/Register-CtdvihIM.js +4 -0
  49. package/dist/auth/ResetPassword-BUdM7T_R.js +3 -0
  50. package/dist/auth/{ResetPassword-GLIFkJT7.js → ResetPassword-DvqD_1SJ.js} +3 -2
  51. package/dist/auth/ResetPassword-DvqD_1SJ.js.map +1 -0
  52. package/dist/auth/VerifyEmail-BYmtnkEl.js +3 -0
  53. package/dist/auth/{VerifyEmail-R79sSej_.js → VerifyEmail-VaBruOnO.js} +3 -2
  54. package/dist/auth/VerifyEmail-VaBruOnO.js.map +1 -0
  55. package/dist/auth/index.d.ts +11 -11
  56. package/dist/auth/index.d.ts.map +1 -1
  57. package/dist/auth/index.js +10 -10
  58. package/dist/auth/index.js.map +1 -1
  59. package/dist/core/index.d.ts +36 -55
  60. package/dist/core/index.d.ts.map +1 -1
  61. package/dist/core/index.js +50 -350
  62. package/dist/core/index.js.map +1 -1
  63. package/dist/demo/DemoDataTable-2mzzf__a.js +150 -0
  64. package/dist/demo/DemoDataTable-2mzzf__a.js.map +1 -0
  65. package/dist/demo/DemoHome-CnuL5WV9.js +25 -0
  66. package/dist/demo/DemoHome-CnuL5WV9.js.map +1 -0
  67. package/dist/demo/DemoHome-D6Z7EE4V.js +3 -0
  68. package/dist/demo/DemoJsonViewer-CYUggLop.js +4 -0
  69. package/dist/demo/DemoJsonViewer-NUGst5wW.js +430 -0
  70. package/dist/demo/DemoJsonViewer-NUGst5wW.js.map +1 -0
  71. package/dist/demo/DemoLayout-ZFDzyvY3.js +3 -0
  72. package/dist/demo/DemoLayout-dvbeuBBf.js +47 -0
  73. package/dist/demo/DemoLayout-dvbeuBBf.js.map +1 -0
  74. package/dist/demo/DemoLogin--wE44i23.js +327 -0
  75. package/dist/demo/DemoLogin--wE44i23.js.map +1 -0
  76. package/dist/demo/DemoRegister-BtrMksx6.js +488 -0
  77. package/dist/demo/DemoRegister-BtrMksx6.js.map +1 -0
  78. package/dist/demo/DemoResetPassword-DVXiiiX7.js +341 -0
  79. package/dist/demo/DemoResetPassword-DVXiiiX7.js.map +1 -0
  80. package/dist/demo/DemoSidebar-DWnjYHoP.js +82 -0
  81. package/dist/demo/DemoSidebar-DWnjYHoP.js.map +1 -0
  82. package/dist/demo/DemoTypeForm-P5_VInW2.js +83 -0
  83. package/dist/demo/DemoTypeForm-P5_VInW2.js.map +1 -0
  84. package/dist/demo/DemoVerifyEmail-C_ooC5u8.js +152 -0
  85. package/dist/demo/DemoVerifyEmail-C_ooC5u8.js.map +1 -0
  86. package/dist/demo/IconGoogle-DvmFiEDB.js +58 -0
  87. package/dist/demo/IconGoogle-DvmFiEDB.js.map +1 -0
  88. package/dist/demo/Showcase-vemLuO2t.js +187 -0
  89. package/dist/demo/Showcase-vemLuO2t.js.map +1 -0
  90. package/dist/demo/index.d.ts +97 -0
  91. package/dist/demo/index.d.ts.map +1 -0
  92. package/dist/demo/index.js +121 -0
  93. package/dist/demo/index.js.map +1 -0
  94. package/dist/json/index.d.ts +58 -0
  95. package/dist/json/index.d.ts.map +1 -0
  96. package/dist/json/index.js +325 -0
  97. package/dist/json/index.js.map +1 -0
  98. package/package.json +25 -14
  99. package/src/admin/AdminRouter.ts +23 -20
  100. package/src/admin/MainRouter.ts +2 -2
  101. package/src/admin/components/audits/AdminAudits.tsx +4 -3
  102. package/src/admin/components/jobs/AdminJobs.tsx +2 -2
  103. package/src/admin/components/notifications/AdminNotifications.tsx +2 -2
  104. package/src/admin/components/parameters/AdminParameters.tsx +2 -2
  105. package/src/admin/components/sessions/AdminSessions.tsx +4 -3
  106. package/src/admin/components/shared/AdminResourceHeader.tsx +281 -0
  107. package/src/admin/components/shared/AdminResourceTabs.tsx +94 -0
  108. package/src/admin/components/shared/index.ts +10 -0
  109. package/src/admin/components/users/AdminUserAudits.tsx +4 -3
  110. package/src/admin/components/users/AdminUserCreate.tsx +4 -3
  111. package/src/admin/components/users/AdminUserDetails.tsx +339 -86
  112. package/src/admin/components/users/AdminUserLayout.tsx +165 -113
  113. package/src/admin/components/users/AdminUserSessions.tsx +4 -3
  114. package/src/admin/components/users/AdminUserSettings.tsx +12 -6
  115. package/src/admin/components/users/AdminUsers.tsx +8 -3
  116. package/src/auth/AuthRouter.ts +1 -1
  117. package/src/auth/components/AuthLayout.tsx +1 -1
  118. package/src/auth/components/Login.tsx +1 -1
  119. package/src/auth/components/Register.tsx +2 -1
  120. package/src/auth/components/ResetPassword.tsx +2 -1
  121. package/src/auth/components/VerifyEmail.tsx +2 -1
  122. package/src/auth/components/buttons/UserButton.tsx +1 -1
  123. package/src/core/RootRouter.ts +1 -1
  124. package/src/core/components/buttons/ActionButton.tsx +3 -4
  125. package/src/core/components/form/Control.tsx +12 -1
  126. package/src/core/components/form/ControlNumber.tsx +5 -0
  127. package/src/core/components/form/TypeForm.tsx +3 -2
  128. package/src/core/components/layout/AdminShell.tsx +2 -1
  129. package/src/core/components/layout/AlephaMantineProvider.tsx +7 -2
  130. package/src/core/components/layout/Omnibar.tsx +2 -1
  131. package/src/core/components/layout/Sidebar.tsx +18 -18
  132. package/src/core/index.ts +1 -2
  133. package/src/core/services/DialogService.tsx +0 -17
  134. package/{styles.css → src/core/styles.css} +1 -5
  135. package/src/demo/DemoRouter.ts +123 -0
  136. package/src/demo/components/DemoHome.tsx +29 -0
  137. package/src/demo/components/DemoLayout.tsx +52 -0
  138. package/src/demo/components/auth/DemoLogin.tsx +130 -0
  139. package/src/demo/components/auth/DemoRegister.tsx +144 -0
  140. package/src/demo/components/auth/DemoResetPassword.tsx +69 -0
  141. package/src/demo/components/auth/DemoVerifyEmail.tsx +28 -0
  142. package/src/demo/components/core/DemoDataTable.tsx +174 -0
  143. package/src/demo/components/core/DemoSidebar.tsx +85 -0
  144. package/src/demo/components/core/DemoTypeForm.tsx +69 -0
  145. package/src/demo/components/json/DemoJsonViewer.tsx +128 -0
  146. package/src/demo/components/shared/MacWindow.tsx +105 -0
  147. package/src/demo/components/shared/Showcase.tsx +112 -0
  148. package/src/demo/index.ts +30 -0
  149. package/src/demo/styles.css +0 -0
  150. package/src/json/components/JsonViewer.css +25 -0
  151. package/src/json/components/JsonViewer.tsx +526 -0
  152. package/src/json/extensions/DialogService.tsx +31 -0
  153. package/src/json/index.ts +5 -0
  154. package/src/json/styles.css +1 -0
  155. package/dist/admin/AdminAudits-CwvH8e8c.js.map +0 -1
  156. package/dist/admin/AdminAudits-Dv8Vk_6r.js +0 -3
  157. package/dist/admin/AdminFiles-5CPA3lQk.js +0 -3
  158. package/dist/admin/AdminNotifications-DLjmZWtf.js +0 -3
  159. package/dist/admin/AdminNotifications-DuYy74AN.js.map +0 -1
  160. package/dist/admin/AdminSessions-BCjgJ-93.js.map +0 -1
  161. package/dist/admin/AdminSessions-DEh2uN-4.js +0 -3
  162. package/dist/admin/AdminUserAudits-B_PUXCKC.js.map +0 -1
  163. package/dist/admin/AdminUserCreate-DzfRbGZ4.js.map +0 -1
  164. package/dist/admin/AdminUserDetails-DeTrJm-t.js +0 -221
  165. package/dist/admin/AdminUserDetails-DeTrJm-t.js.map +0 -1
  166. package/dist/admin/AdminUserLayout-CsfrrZkD.js +0 -150
  167. package/dist/admin/AdminUserLayout-CsfrrZkD.js.map +0 -1
  168. package/dist/admin/AdminUserSessions-Bbhcpz4k.js +0 -3
  169. package/dist/admin/AdminUserSessions-DO9H85O-.js.map +0 -1
  170. package/dist/admin/AdminUserSettings-B3jA8g3p.js.map +0 -1
  171. package/dist/admin/AdminUserSettings-CE0xpbQc.js +0 -3
  172. package/dist/admin/AdminUsers-CegGZDhW.js +0 -3
  173. package/dist/admin/AdminUsers-ebbrJBT0.js.map +0 -1
  174. package/dist/auth/AuthLayout-BAZJHzDG.js.map +0 -1
  175. package/dist/auth/Login-CeNZZjrr.js.map +0 -1
  176. package/dist/auth/Login-hQcu1nlu.js +0 -4
  177. package/dist/auth/Register-B6HBNVHS.js +0 -4
  178. package/dist/auth/Register-s4ENeyiE.js.map +0 -1
  179. package/dist/auth/ResetPassword-Cjd-W-Nu.js +0 -3
  180. package/dist/auth/ResetPassword-GLIFkJT7.js.map +0 -1
  181. package/dist/auth/VerifyEmail-Dc9ABKUw.js +0 -3
  182. package/dist/auth/VerifyEmail-R79sSej_.js.map +0 -1
  183. package/src/core/components/data/JsonViewer.tsx +0 -361
@@ -1,4 +1,5 @@
1
- import { useEvents, useRouter } from "@alepha/react";
1
+ import { useEvents } from "@alepha/react";
2
+ import { useRouter } from "@alepha/react/router";
2
3
  import {
3
4
  Flex,
4
5
  type FlexProps,
@@ -23,15 +24,13 @@ import OmnibarButton from "../buttons/OmnibarButton.tsx";
23
24
  import ToggleSidebarButton from "../buttons/ToggleSidebarButton.tsx";
24
25
 
25
26
  export interface SidebarProps {
26
- menu?: SidebarNode[];
27
- top?: SidebarNode[];
28
- bottom?: SidebarNode[];
27
+ items?: SidebarNode[];
29
28
  onItemClick?: (item: SidebarMenuItem) => void;
30
29
  onSearchClick?: () => void;
31
30
  theme?: SidebarTheme;
32
31
  flexProps?: Partial<FlexProps>;
33
32
  collapsed?: boolean;
34
- gap?: MantineBreakpoint;
33
+ gap?: MantineBreakpoint | number;
35
34
  hide?: {
36
35
  paths?: string[];
37
36
  };
@@ -48,7 +47,7 @@ export interface SidebarProps {
48
47
 
49
48
  export const Sidebar = (props: SidebarProps) => {
50
49
  const router = useRouter();
51
- const { top = [], bottom = [], onItemClick } = props;
50
+ const { onItemClick } = props;
52
51
 
53
52
  const renderNode = (item: SidebarNode, key: number) => {
54
53
  if ("type" in item) {
@@ -128,14 +127,16 @@ export const Sidebar = (props: SidebarProps) => {
128
127
  };
129
128
 
130
129
  const getSidebarNodes = (): SidebarNode[] => {
131
- if (props.menu) return props.menu;
130
+ if (props.items) return props.items;
132
131
  if (props.autoPopulateMenu) {
133
- const items = router.concretePages.map((page) => ({
134
- label: page.label ?? page.name,
135
- description: page.description?.slice(0, 32),
136
- icon: renderIcon(page.icon),
137
- href: router.path(page.name),
138
- })) as SidebarMenuItem[];
132
+ const items = router.concretePages
133
+ .filter((page) => !page.can || page.can())
134
+ .map((page) => ({
135
+ label: page.label ?? page.name,
136
+ //description: page.description?.slice(0, 32),
137
+ icon: renderIcon(page.icon),
138
+ href: router.path(page.name),
139
+ })) as SidebarMenuItem[];
139
140
  if (
140
141
  typeof props.autoPopulateMenu === "object" &&
141
142
  props.autoPopulateMenu.startsWith
@@ -143,12 +144,13 @@ export const Sidebar = (props: SidebarProps) => {
143
144
  const startsWith = props.autoPopulateMenu.startsWith;
144
145
  return items.filter((item) => item.href?.startsWith(startsWith));
145
146
  }
147
+ return items;
146
148
  }
147
149
  return [];
148
150
  };
149
151
 
150
152
  const padding = "md";
151
- const gap = props.menu ? props.gap : "xs";
153
+ const gap = props.items ? props.gap : "xs";
152
154
  const menu = useMemo(() => getSidebarNodes(), []);
153
155
 
154
156
  return (
@@ -160,10 +162,9 @@ export const Sidebar = (props: SidebarProps) => {
160
162
  {...props.flexProps}
161
163
  >
162
164
  <Flex gap={gap} px={padding} direction={"column"}>
163
- {top.map((item, index) => renderNode(item, index))}
164
165
  {menu
165
166
  .filter((it) => it.position === "top")
166
- .map((item, index) => renderNode(item, index + top.length))}
167
+ .map((item, index) => renderNode(item, index))}
167
168
  </Flex>
168
169
  <Flex
169
170
  gap={gap}
@@ -177,10 +178,9 @@ export const Sidebar = (props: SidebarProps) => {
177
178
  .map((item, index) => renderNode(item, index))}
178
179
  </Flex>
179
180
  <Flex gap={gap} px={padding} direction={"column"}>
180
- {bottom.map((item, index) => renderNode(item, index))}
181
181
  {menu
182
182
  .filter((it) => it.position === "bottom")
183
- .map((item, index) => renderNode(item, index + bottom.length))}
183
+ .map((item, index) => renderNode(item, index))}
184
184
  </Flex>
185
185
  </Flex>
186
186
  );
package/src/core/index.ts CHANGED
@@ -35,7 +35,6 @@ export { default as LanguageButton } from "./components/buttons/LanguageButton.t
35
35
  export { default as OmnibarButton } from "./components/buttons/OmnibarButton.tsx";
36
36
  export type { ThemeButtonProps } from "./components/buttons/ThemeButton.tsx";
37
37
  export { default as ThemeButton } from "./components/buttons/ThemeButton.tsx";
38
- export { default as JsonViewer } from "./components/data/JsonViewer.tsx";
39
38
  export { default as AlertDialog } from "./components/dialogs/AlertDialog.tsx";
40
39
  export { default as ConfirmDialog } from "./components/dialogs/ConfirmDialog.tsx";
41
40
  export { default as PromptDialog } from "./components/dialogs/PromptDialog.tsx";
@@ -126,7 +125,7 @@ declare module "alepha" {
126
125
  }
127
126
  }
128
127
 
129
- declare module "@alepha/react" {
128
+ declare module "@alepha/react/router" {
130
129
  interface PagePrimitiveOptions {
131
130
  /**
132
131
  * Human-readable title for the page.
@@ -2,7 +2,6 @@ import { Flex, type ModalProps } from "@mantine/core";
2
2
  import { modals } from "@mantine/modals";
3
3
  import type { ReactNode } from "react";
4
4
  import ErrorViewer from "../components/data/ErrorViewer.tsx";
5
- import JsonViewer from "../components/data/JsonViewer.tsx";
6
5
  import AlertDialog from "../components/dialogs/AlertDialog.tsx";
7
6
  import ConfirmDialog from "../components/dialogs/ConfirmDialog.tsx";
8
7
  import PromptDialog from "../components/dialogs/PromptDialog.tsx";
@@ -160,22 +159,6 @@ export class DialogService {
160
159
  }
161
160
  }
162
161
 
163
- /**
164
- * Show a JSON editor/viewer dialog
165
- */
166
- public json(data?: any, options?: BaseDialogOptions): void {
167
- this.open({
168
- size: "lg",
169
- title: options?.title || "Json Viewer",
170
- ...options,
171
- content: (
172
- <Flex bdrs={"md"} w={"100%"} flex={1} p={"sm"} bg={ui.colors.surface}>
173
- <JsonViewer size={"xs"} data={data} />
174
- </Flex>
175
- ),
176
- });
177
- }
178
-
179
162
  /**
180
163
  * Show an error viewer dialog
181
164
  */
@@ -20,9 +20,7 @@
20
20
  --alepha-elevated: var(--alepha-elevated-light);
21
21
  --alepha-elevated-hover: var(--alepha-elevated-hover-light);
22
22
 
23
- --alepha-border-light: var(--mantine-color-gray-3);
24
- --alepha-border-dark: var(--mantine-color-dark-4);
25
- --alepha-border: var(--alepha-border-light);
23
+ --alepha-border: var(--mantine-color-default-border);
26
24
 
27
25
  --alepha-text-light: #000000;
28
26
  --alepha-text-dark: #ffffff;
@@ -43,9 +41,7 @@
43
41
  --alepha-surface: var(--alepha-surface-dark);
44
42
  --alepha-elevated: var(--alepha-elevated-dark);
45
43
  --alepha-elevated-hover: var(--alepha-elevated-hover-dark);
46
- --alepha-border: var(--alepha-border-dark);
47
44
  --alepha-background: var(--alepha-background-dark);
48
- --alepha-shadow: var(--alepha-shadow-dark);
49
45
  --alepha-text: var(--alepha-text-dark);
50
46
  }
51
47
 
@@ -0,0 +1,123 @@
1
+ import { $page } from "@alepha/react/router";
2
+ import {
3
+ IconBinaryTree,
4
+ IconBraces,
5
+ IconForms,
6
+ IconHome,
7
+ IconKey,
8
+ IconLayoutSidebar,
9
+ IconLockQuestion,
10
+ IconLogin,
11
+ IconMailCheck,
12
+ IconPackages,
13
+ IconTable,
14
+ IconUserPlus,
15
+ IconWall,
16
+ } from "@tabler/icons-react";
17
+
18
+ export class DemoRouter {
19
+ demoLayout = $page({
20
+ icon: IconPackages,
21
+ path: "/demo",
22
+ label: "Demo",
23
+ lazy: () => import("./components/DemoLayout.tsx"),
24
+ children: () => [
25
+ this.demoHome,
26
+ this.demoCore,
27
+ this.demoJson,
28
+ this.demoAuth,
29
+ ],
30
+ });
31
+
32
+ demoHome = $page({
33
+ icon: IconHome,
34
+ path: "/",
35
+ label: "Home",
36
+ lazy: () => import("./components/DemoHome.tsx"),
37
+ });
38
+
39
+ // Core Components
40
+ demoCore = $page({
41
+ icon: IconWall,
42
+ path: "/core",
43
+ label: "Core",
44
+ children: () => [this.demoTypeForm, this.demoSidebar, this.demoDataTable],
45
+ });
46
+
47
+ demoTypeForm = $page({
48
+ icon: IconForms,
49
+ path: "/type-form",
50
+ label: "TypeForm",
51
+ lazy: () => import("./components/core/DemoTypeForm.tsx"),
52
+ });
53
+
54
+ demoSidebar = $page({
55
+ icon: IconLayoutSidebar,
56
+ path: "/sidebar",
57
+ label: "Sidebar",
58
+ lazy: () => import("./components/core/DemoSidebar.tsx"),
59
+ });
60
+
61
+ demoDataTable = $page({
62
+ icon: IconTable,
63
+ path: "/data-table",
64
+ label: "DataTable",
65
+ lazy: () => import("./components/core/DemoDataTable.tsx"),
66
+ });
67
+
68
+ // JSON Components
69
+ demoJson = $page({
70
+ icon: IconBraces,
71
+ path: "/json",
72
+ label: "Json",
73
+ children: () => [this.demoJsonViewer],
74
+ });
75
+
76
+ demoJsonViewer = $page({
77
+ icon: IconBinaryTree,
78
+ path: "/viewer",
79
+ label: "JsonViewer",
80
+ lazy: () => import("./components/json/DemoJsonViewer.tsx"),
81
+ });
82
+
83
+ // Auth Components
84
+ demoAuth = $page({
85
+ icon: IconKey,
86
+ path: "/auth",
87
+ label: "Auth",
88
+ children: () => [
89
+ this.demoLogin,
90
+ this.demoRegister,
91
+ this.demoResetPassword,
92
+ this.demoVerifyEmail,
93
+ ],
94
+ });
95
+
96
+ demoLogin = $page({
97
+ icon: IconLogin,
98
+ path: "/login",
99
+ label: "Login",
100
+ lazy: () => import("./components/auth/DemoLogin.tsx"),
101
+ });
102
+
103
+ demoRegister = $page({
104
+ icon: IconUserPlus,
105
+ path: "/register",
106
+ label: "Register",
107
+ lazy: () => import("./components/auth/DemoRegister.tsx"),
108
+ });
109
+
110
+ demoResetPassword = $page({
111
+ icon: IconLockQuestion,
112
+ path: "/reset-password",
113
+ label: "ResetPassword",
114
+ lazy: () => import("./components/auth/DemoResetPassword.tsx"),
115
+ });
116
+
117
+ demoVerifyEmail = $page({
118
+ icon: IconMailCheck,
119
+ path: "/verify-email",
120
+ label: "VerifyEmail",
121
+ lazy: () => import("./components/auth/DemoVerifyEmail.tsx"),
122
+ });
123
+ }
@@ -0,0 +1,29 @@
1
+ import { Box, Stack, Text, Title } from "@mantine/core";
2
+ import { IconBraces } from "@tabler/icons-react";
3
+
4
+ const components = [
5
+ {
6
+ name: "JsonViewer",
7
+ description:
8
+ "Interactive JSON viewer with syntax highlighting, expand/collapse, and copy functionality.",
9
+ icon: IconBraces,
10
+ href: "/demo/json-viewer",
11
+ },
12
+ ];
13
+
14
+ const DemoHome = () => {
15
+ return (
16
+ <Stack gap="xl" p="xl">
17
+ <Box>
18
+ <Title order={1} mb="xs">
19
+ Component Showcase
20
+ </Title>
21
+ <Text c="dimmed" size="lg">
22
+ Interactive demos and documentation for @alepha/ui components.
23
+ </Text>
24
+ </Box>
25
+ </Stack>
26
+ );
27
+ };
28
+
29
+ export default DemoHome;
@@ -0,0 +1,52 @@
1
+ import { useRouter } from "@alepha/react/router";
2
+ import { ActionButton, AdminShell, AlephaMantineProvider } from "@alepha/ui";
3
+ import { IconArrowLeft } from "@tabler/icons-react";
4
+ import type { DemoRouter } from "../DemoRouter.ts";
5
+
6
+ const DemoLayout = () => {
7
+ const router = useRouter<DemoRouter>();
8
+ return (
9
+ <AlephaMantineProvider>
10
+ <AdminShell
11
+ appShellMainProps={{ h: "100%" }}
12
+ appBarProps={{
13
+ items: [
14
+ {
15
+ element: (
16
+ <ActionButton variant="subtle" icon={IconArrowLeft} href="/" />
17
+ ),
18
+ position: "left",
19
+ },
20
+ {
21
+ type: "dark",
22
+ position: "right",
23
+ },
24
+ ],
25
+ }}
26
+ sidebarProps={{
27
+ items: [
28
+ router.node("demoHome"),
29
+ {
30
+ ...router.node("demoCore"),
31
+ children: [
32
+ router.node("demoTypeForm"),
33
+ router.node("demoSidebar"),
34
+ router.node("demoDataTable"),
35
+ ],
36
+ },
37
+ {
38
+ ...router.node("demoJson"),
39
+ children: [router.node("demoJsonViewer")],
40
+ },
41
+ {
42
+ ...router.node("demoAuth"),
43
+ children: [router.node("demoLogin"), router.node("demoRegister")],
44
+ },
45
+ ],
46
+ }}
47
+ />
48
+ </AlephaMantineProvider>
49
+ );
50
+ };
51
+
52
+ export default DemoLayout;
@@ -0,0 +1,130 @@
1
+ import { t } from "alepha";
2
+ import type { UserRealmConfig } from "alepha/api/users";
3
+ import Login from "../../../auth/components/Login.tsx";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ const showcaseSchema = t.object({
7
+ showCredentials: t.boolean({
8
+ title: "Credentials",
9
+ default: true,
10
+ $control: { switch: true },
11
+ }),
12
+ showGoogleOAuth: t.boolean({
13
+ title: "Google OAuth",
14
+ default: true,
15
+ $control: { switch: true },
16
+ }),
17
+ showGithubOAuth: t.boolean({
18
+ title: "GitHub OAuth",
19
+ default: false,
20
+ $control: { switch: true },
21
+ }),
22
+ usernameEnabled: t.boolean({
23
+ title: "Username Login",
24
+ default: true,
25
+ $control: { switch: true },
26
+ }),
27
+ emailEnabled: t.boolean({
28
+ title: "Email Login",
29
+ default: true,
30
+ $control: { switch: true },
31
+ }),
32
+ phoneEnabled: t.boolean({
33
+ title: "Phone Login",
34
+ default: false,
35
+ $control: { switch: true },
36
+ }),
37
+ registrationAllowed: t.boolean({
38
+ title: "Show Sign Up",
39
+ default: true,
40
+ $control: { switch: true },
41
+ }),
42
+ resetPasswordAllowed: t.boolean({
43
+ title: "Forgot Password",
44
+ default: true,
45
+ $control: { switch: true },
46
+ }),
47
+ showBranding: t.boolean({
48
+ title: "Show Branding",
49
+ default: true,
50
+ $control: { switch: true },
51
+ }),
52
+ });
53
+
54
+ const buildRealmConfig = (props: {
55
+ showCredentials: boolean;
56
+ showGoogleOAuth: boolean;
57
+ showGithubOAuth: boolean;
58
+ usernameEnabled: boolean;
59
+ emailEnabled: boolean;
60
+ phoneEnabled: boolean;
61
+ registrationAllowed: boolean;
62
+ resetPasswordAllowed: boolean;
63
+ showBranding: boolean;
64
+ }): UserRealmConfig => {
65
+ const authMethods: UserRealmConfig["authenticationMethods"] = [];
66
+
67
+ if (props.showCredentials) {
68
+ authMethods.push({ name: "credentials", type: "CREDENTIALS" });
69
+ }
70
+ if (props.showGoogleOAuth) {
71
+ authMethods.push({ name: "google", type: "OAUTH2" });
72
+ }
73
+ if (props.showGithubOAuth) {
74
+ authMethods.push({ name: "github", type: "OAUTH2" });
75
+ }
76
+
77
+ return {
78
+ realmName: "demo",
79
+ authenticationMethods: authMethods,
80
+ settings: {
81
+ displayName: props.showBranding ? "Demo App" : undefined,
82
+ description: props.showBranding ? "Sign in to continue" : undefined,
83
+ logoUrl: undefined,
84
+ registrationAllowed: props.registrationAllowed,
85
+ emailEnabled: props.emailEnabled,
86
+ emailRequired: false,
87
+ usernameEnabled: props.usernameEnabled,
88
+ usernameRequired: false,
89
+ phoneEnabled: props.phoneEnabled,
90
+ phoneRequired: false,
91
+ verifyEmailRequired: false,
92
+ verifyPhoneRequired: false,
93
+ firstNameLastNameEnabled: false,
94
+ firstNameLastNameRequired: false,
95
+ resetPasswordAllowed: props.resetPasswordAllowed,
96
+ passwordPolicy: {
97
+ minLength: 8,
98
+ requireUppercase: true,
99
+ requireLowercase: true,
100
+ requireNumbers: true,
101
+ requireSpecialCharacters: false,
102
+ },
103
+ },
104
+ };
105
+ };
106
+
107
+ const DemoLogin = () => {
108
+ return (
109
+ <Showcase
110
+ title="Login"
111
+ schema={showcaseSchema}
112
+ initialValues={{
113
+ showCredentials: true,
114
+ showGoogleOAuth: true,
115
+ showGithubOAuth: false,
116
+ usernameEnabled: true,
117
+ emailEnabled: true,
118
+ phoneEnabled: false,
119
+ registrationAllowed: true,
120
+ resetPasswordAllowed: true,
121
+ showBranding: true,
122
+ }}
123
+ columns={1}
124
+ >
125
+ {(props) => <Login realmConfig={buildRealmConfig(props)} />}
126
+ </Showcase>
127
+ );
128
+ };
129
+
130
+ export default DemoLogin;
@@ -0,0 +1,144 @@
1
+ import { t } from "alepha";
2
+ import type { UserRealmConfig } from "alepha/api/users";
3
+ import Register from "../../../auth/components/Register.tsx";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ const showcaseSchema = t.object({
7
+ showCredentials: t.boolean({
8
+ title: "Credentials",
9
+ default: true,
10
+ $control: { switch: true },
11
+ }),
12
+ showGoogleOAuth: t.boolean({
13
+ title: "Google OAuth",
14
+ default: true,
15
+ $control: { switch: true },
16
+ }),
17
+ showGithubOAuth: t.boolean({
18
+ title: "GitHub OAuth",
19
+ default: false,
20
+ $control: { switch: true },
21
+ }),
22
+ usernameEnabled: t.boolean({
23
+ title: "Username Field",
24
+ default: true,
25
+ $control: { switch: true },
26
+ }),
27
+ usernameRequired: t.boolean({
28
+ title: "Username Required",
29
+ default: false,
30
+ $control: { switch: true },
31
+ }),
32
+ emailEnabled: t.boolean({
33
+ title: "Email Field",
34
+ default: true,
35
+ $control: { switch: true },
36
+ }),
37
+ emailRequired: t.boolean({
38
+ title: "Email Required",
39
+ default: true,
40
+ $control: { switch: true },
41
+ }),
42
+ phoneEnabled: t.boolean({
43
+ title: "Phone Field",
44
+ default: false,
45
+ $control: { switch: true },
46
+ }),
47
+ phoneRequired: t.boolean({
48
+ title: "Phone Required",
49
+ default: false,
50
+ $control: { switch: true },
51
+ }),
52
+ registrationAllowed: t.boolean({
53
+ title: "Registration Allowed",
54
+ default: true,
55
+ $control: { switch: true },
56
+ }),
57
+ showBranding: t.boolean({
58
+ title: "Show Branding",
59
+ default: true,
60
+ $control: { switch: true },
61
+ }),
62
+ });
63
+
64
+ const buildRealmConfig = (props: {
65
+ showCredentials: boolean;
66
+ showGoogleOAuth: boolean;
67
+ showGithubOAuth: boolean;
68
+ usernameEnabled: boolean;
69
+ usernameRequired: boolean;
70
+ emailEnabled: boolean;
71
+ emailRequired: boolean;
72
+ phoneEnabled: boolean;
73
+ phoneRequired: boolean;
74
+ registrationAllowed: boolean;
75
+ showBranding: boolean;
76
+ }): UserRealmConfig => {
77
+ const authMethods: UserRealmConfig["authenticationMethods"] = [];
78
+
79
+ if (props.showCredentials) {
80
+ authMethods.push({ name: "credentials", type: "CREDENTIALS" });
81
+ }
82
+ if (props.showGoogleOAuth) {
83
+ authMethods.push({ name: "google", type: "OAUTH2" });
84
+ }
85
+ if (props.showGithubOAuth) {
86
+ authMethods.push({ name: "github", type: "OAUTH2" });
87
+ }
88
+
89
+ return {
90
+ realmName: "demo",
91
+ authenticationMethods: authMethods,
92
+ settings: {
93
+ displayName: props.showBranding ? "Demo App" : undefined,
94
+ description: props.showBranding ? "Create your account" : undefined,
95
+ logoUrl: undefined,
96
+ registrationAllowed: props.registrationAllowed,
97
+ emailEnabled: props.emailEnabled,
98
+ emailRequired: props.emailRequired,
99
+ usernameEnabled: props.usernameEnabled,
100
+ usernameRequired: props.usernameRequired,
101
+ phoneEnabled: props.phoneEnabled,
102
+ phoneRequired: props.phoneRequired,
103
+ verifyEmailRequired: false,
104
+ verifyPhoneRequired: false,
105
+ firstNameLastNameEnabled: false,
106
+ firstNameLastNameRequired: false,
107
+ resetPasswordAllowed: true,
108
+ passwordPolicy: {
109
+ minLength: 8,
110
+ requireUppercase: true,
111
+ requireLowercase: true,
112
+ requireNumbers: true,
113
+ requireSpecialCharacters: false,
114
+ },
115
+ },
116
+ };
117
+ };
118
+
119
+ const DemoRegister = () => {
120
+ return (
121
+ <Showcase
122
+ title="Register"
123
+ schema={showcaseSchema}
124
+ initialValues={{
125
+ showCredentials: true,
126
+ showGoogleOAuth: true,
127
+ showGithubOAuth: false,
128
+ usernameEnabled: true,
129
+ usernameRequired: false,
130
+ emailEnabled: true,
131
+ emailRequired: true,
132
+ phoneEnabled: false,
133
+ phoneRequired: false,
134
+ registrationAllowed: true,
135
+ showBranding: true,
136
+ }}
137
+ columns={1}
138
+ >
139
+ {(props) => <Register realmConfig={buildRealmConfig(props)} />}
140
+ </Showcase>
141
+ );
142
+ };
143
+
144
+ export default DemoRegister;