@alepha/ui 0.14.0 → 0.14.2

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 (174) hide show
  1. package/README.md +1 -1
  2. package/dist/admin/AdminAudits-B3EhKhN7.js +3 -0
  3. package/dist/admin/{AdminAudits-CwvH8e8c.js → AdminAudits-DIrCCPk3.js} +3 -2
  4. package/dist/admin/AdminAudits-DIrCCPk3.js.map +1 -0
  5. package/dist/admin/AdminFiles-C8OG4dtD.js +3 -0
  6. package/dist/admin/{AdminFiles-C_w1tb_x.js → AdminFiles-RsL178Ta.js} +2 -2
  7. package/dist/admin/{AdminFiles-C_w1tb_x.js.map → AdminFiles-RsL178Ta.js.map} +1 -1
  8. package/dist/admin/AdminNotifications-BSL4B2fQ.js +3 -0
  9. package/dist/admin/{AdminNotifications-DuYy74AN.js → AdminNotifications-cIbywWKi.js} +2 -2
  10. package/dist/admin/{AdminNotifications-DuYy74AN.js.map → AdminNotifications-cIbywWKi.js.map} +1 -1
  11. package/dist/admin/{AdminParameters-DYg48Jwe.js → AdminParameters-BKObzzpN.js} +1 -1
  12. package/dist/admin/{AdminParameters-YagqWTG3.js → AdminParameters-D-q3Qmhv.js} +2 -2
  13. package/dist/admin/{AdminParameters-YagqWTG3.js.map → AdminParameters-D-q3Qmhv.js.map} +1 -1
  14. package/dist/admin/AdminSessions-DHG9zPfr.js +3 -0
  15. package/dist/admin/{AdminSessions-BCjgJ-93.js → AdminSessions-vOgkrQ2U.js} +3 -2
  16. package/dist/admin/AdminSessions-vOgkrQ2U.js.map +1 -0
  17. package/dist/admin/{AdminUserAudits-B_PUXCKC.js → AdminUserAudits-CSsN1fIC.js} +3 -2
  18. package/dist/admin/AdminUserAudits-CSsN1fIC.js.map +1 -0
  19. package/dist/admin/{AdminUserAudits-D7cTcElL.js → AdminUserAudits-DmAnivo3.js} +1 -1
  20. package/dist/admin/{AdminUserCreate-DzfRbGZ4.js → AdminUserCreate-B72nu-3W.js} +3 -2
  21. package/dist/admin/AdminUserCreate-B72nu-3W.js.map +1 -0
  22. package/dist/admin/{AdminUserCreate-oUA1KDIl.js → AdminUserCreate-DpA13zwj.js} +1 -1
  23. package/dist/admin/{AdminUserDetails-DeTrJm-t.js → AdminUserDetails-BCt8Su-4.js} +3 -2
  24. package/dist/admin/AdminUserDetails-BCt8Su-4.js.map +1 -0
  25. package/dist/admin/{AdminUserDetails-y1H5DW8Y.js → AdminUserDetails-z1y8kJeB.js} +1 -1
  26. package/dist/admin/{AdminUserLayout-CsfrrZkD.js → AdminUserLayout-Ck0GLRE5.js} +3 -2
  27. package/dist/admin/AdminUserLayout-Ck0GLRE5.js.map +1 -0
  28. package/dist/admin/{AdminUserLayout-Dejnz13m.js → AdminUserLayout-DyQYacQQ.js} +1 -1
  29. package/dist/admin/AdminUserSessions-D9X2_HMA.js +3 -0
  30. package/dist/admin/{AdminUserSessions-DO9H85O-.js → AdminUserSessions-DEaGu6n6.js} +3 -2
  31. package/dist/admin/AdminUserSessions-DEaGu6n6.js.map +1 -0
  32. package/dist/admin/AdminUserSettings-CE66UTIP.js +3 -0
  33. package/dist/admin/{AdminUserSettings-B3jA8g3p.js → AdminUserSettings-CR7MxX_R.js} +3 -2
  34. package/dist/admin/AdminUserSettings-CR7MxX_R.js.map +1 -0
  35. package/dist/admin/{AdminUsers-ebbrJBT0.js → AdminUsers-BnGIRvmV.js} +3 -2
  36. package/dist/admin/AdminUsers-BnGIRvmV.js.map +1 -0
  37. package/dist/admin/AdminUsers-CG9-2Z8W.js +3 -0
  38. package/dist/admin/index.d.ts +16 -16
  39. package/dist/admin/index.d.ts.map +1 -1
  40. package/dist/admin/index.js +26 -25
  41. package/dist/admin/index.js.map +1 -1
  42. package/dist/auth/{AuthLayout-BAZJHzDG.js → AuthLayout-B1sUB8fB.js} +2 -2
  43. package/dist/auth/AuthLayout-B1sUB8fB.js.map +1 -0
  44. package/dist/auth/Login-BWi-pPbO.js +4 -0
  45. package/dist/auth/{Login-CeNZZjrr.js → Login-Cjxv3EDi.js} +2 -2
  46. package/dist/auth/Login-Cjxv3EDi.js.map +1 -0
  47. package/dist/auth/{Register-s4ENeyiE.js → Register-BKBIpHhW.js} +3 -2
  48. package/dist/auth/Register-BKBIpHhW.js.map +1 -0
  49. package/dist/auth/Register-CtdvihIM.js +4 -0
  50. package/dist/auth/ResetPassword-BUdM7T_R.js +3 -0
  51. package/dist/auth/{ResetPassword-GLIFkJT7.js → ResetPassword-DvqD_1SJ.js} +3 -2
  52. package/dist/auth/ResetPassword-DvqD_1SJ.js.map +1 -0
  53. package/dist/auth/VerifyEmail-BYmtnkEl.js +3 -0
  54. package/dist/auth/{VerifyEmail-R79sSej_.js → VerifyEmail-VaBruOnO.js} +3 -2
  55. package/dist/auth/VerifyEmail-VaBruOnO.js.map +1 -0
  56. package/dist/auth/index.d.ts +11 -11
  57. package/dist/auth/index.d.ts.map +1 -1
  58. package/dist/auth/index.js +10 -10
  59. package/dist/auth/index.js.map +1 -1
  60. package/dist/core/index.d.ts +36 -55
  61. package/dist/core/index.d.ts.map +1 -1
  62. package/dist/core/index.js +44 -345
  63. package/dist/core/index.js.map +1 -1
  64. package/dist/demo/DemoDataTable-2mzzf__a.js +150 -0
  65. package/dist/demo/DemoDataTable-2mzzf__a.js.map +1 -0
  66. package/dist/demo/DemoHome-CnuL5WV9.js +25 -0
  67. package/dist/demo/DemoHome-CnuL5WV9.js.map +1 -0
  68. package/dist/demo/DemoHome-D6Z7EE4V.js +3 -0
  69. package/dist/demo/DemoJsonViewer-CYUggLop.js +4 -0
  70. package/dist/demo/DemoJsonViewer-NUGst5wW.js +430 -0
  71. package/dist/demo/DemoJsonViewer-NUGst5wW.js.map +1 -0
  72. package/dist/demo/DemoLayout-ZFDzyvY3.js +3 -0
  73. package/dist/demo/DemoLayout-dvbeuBBf.js +47 -0
  74. package/dist/demo/DemoLayout-dvbeuBBf.js.map +1 -0
  75. package/dist/demo/DemoLogin--wE44i23.js +327 -0
  76. package/dist/demo/DemoLogin--wE44i23.js.map +1 -0
  77. package/dist/demo/DemoRegister-BtrMksx6.js +488 -0
  78. package/dist/demo/DemoRegister-BtrMksx6.js.map +1 -0
  79. package/dist/demo/DemoResetPassword-DVXiiiX7.js +341 -0
  80. package/dist/demo/DemoResetPassword-DVXiiiX7.js.map +1 -0
  81. package/dist/demo/DemoSidebar-DWnjYHoP.js +82 -0
  82. package/dist/demo/DemoSidebar-DWnjYHoP.js.map +1 -0
  83. package/dist/demo/DemoTypeForm-P5_VInW2.js +83 -0
  84. package/dist/demo/DemoTypeForm-P5_VInW2.js.map +1 -0
  85. package/dist/demo/DemoVerifyEmail-C_ooC5u8.js +152 -0
  86. package/dist/demo/DemoVerifyEmail-C_ooC5u8.js.map +1 -0
  87. package/dist/demo/IconGoogle-DvmFiEDB.js +58 -0
  88. package/dist/demo/IconGoogle-DvmFiEDB.js.map +1 -0
  89. package/dist/demo/Showcase-vemLuO2t.js +187 -0
  90. package/dist/demo/Showcase-vemLuO2t.js.map +1 -0
  91. package/dist/demo/index.d.ts +97 -0
  92. package/dist/demo/index.d.ts.map +1 -0
  93. package/dist/demo/index.js +121 -0
  94. package/dist/demo/index.js.map +1 -0
  95. package/dist/json/index.d.ts +58 -0
  96. package/dist/json/index.d.ts.map +1 -0
  97. package/dist/json/index.js +325 -0
  98. package/dist/json/index.js.map +1 -0
  99. package/package.json +17 -6
  100. package/src/admin/AdminRouter.ts +1 -1
  101. package/src/admin/MainRouter.ts +1 -1
  102. package/src/admin/components/audits/AdminAudits.tsx +2 -1
  103. package/src/admin/components/sessions/AdminSessions.tsx +2 -1
  104. package/src/admin/components/users/AdminUserAudits.tsx +2 -1
  105. package/src/admin/components/users/AdminUserCreate.tsx +2 -1
  106. package/src/admin/components/users/AdminUserDetails.tsx +2 -1
  107. package/src/admin/components/users/AdminUserLayout.tsx +2 -6
  108. package/src/admin/components/users/AdminUserSessions.tsx +2 -1
  109. package/src/admin/components/users/AdminUserSettings.tsx +2 -1
  110. package/src/admin/components/users/AdminUsers.tsx +2 -1
  111. package/src/auth/AuthRouter.ts +1 -1
  112. package/src/auth/components/AuthLayout.tsx +1 -1
  113. package/src/auth/components/Login.tsx +1 -1
  114. package/src/auth/components/Register.tsx +2 -1
  115. package/src/auth/components/ResetPassword.tsx +2 -1
  116. package/src/auth/components/VerifyEmail.tsx +2 -1
  117. package/src/auth/components/buttons/UserButton.tsx +1 -1
  118. package/src/core/RootRouter.ts +1 -1
  119. package/src/core/components/buttons/ActionButton.tsx +3 -4
  120. package/src/core/components/form/Control.tsx +12 -1
  121. package/src/core/components/form/ControlNumber.tsx +5 -0
  122. package/src/core/components/layout/AdminShell.tsx +2 -1
  123. package/src/core/components/layout/AlephaMantineProvider.tsx +2 -1
  124. package/src/core/components/layout/Omnibar.tsx +2 -1
  125. package/src/core/components/layout/Sidebar.tsx +10 -13
  126. package/src/core/index.ts +1 -2
  127. package/src/core/services/DialogService.tsx +0 -17
  128. package/{styles.css → src/core/styles.css} +1 -5
  129. package/src/demo/DemoRouter.ts +123 -0
  130. package/src/demo/components/DemoHome.tsx +29 -0
  131. package/src/demo/components/DemoLayout.tsx +52 -0
  132. package/src/demo/components/auth/DemoLogin.tsx +130 -0
  133. package/src/demo/components/auth/DemoRegister.tsx +144 -0
  134. package/src/demo/components/auth/DemoResetPassword.tsx +69 -0
  135. package/src/demo/components/auth/DemoVerifyEmail.tsx +28 -0
  136. package/src/demo/components/core/DemoDataTable.tsx +174 -0
  137. package/src/demo/components/core/DemoSidebar.tsx +85 -0
  138. package/src/demo/components/core/DemoTypeForm.tsx +69 -0
  139. package/src/demo/components/json/DemoJsonViewer.tsx +128 -0
  140. package/src/demo/components/shared/MacWindow.tsx +105 -0
  141. package/src/demo/components/shared/Showcase.tsx +112 -0
  142. package/src/demo/index.ts +30 -0
  143. package/src/demo/styles.css +0 -0
  144. package/src/json/components/JsonViewer.css +25 -0
  145. package/src/json/components/JsonViewer.tsx +526 -0
  146. package/src/json/extensions/DialogService.tsx +31 -0
  147. package/src/json/index.ts +5 -0
  148. package/src/json/styles.css +1 -0
  149. package/dist/admin/AdminAudits-CwvH8e8c.js.map +0 -1
  150. package/dist/admin/AdminAudits-Dv8Vk_6r.js +0 -3
  151. package/dist/admin/AdminFiles-5CPA3lQk.js +0 -3
  152. package/dist/admin/AdminNotifications-DLjmZWtf.js +0 -3
  153. package/dist/admin/AdminSessions-BCjgJ-93.js.map +0 -1
  154. package/dist/admin/AdminSessions-DEh2uN-4.js +0 -3
  155. package/dist/admin/AdminUserAudits-B_PUXCKC.js.map +0 -1
  156. package/dist/admin/AdminUserCreate-DzfRbGZ4.js.map +0 -1
  157. package/dist/admin/AdminUserDetails-DeTrJm-t.js.map +0 -1
  158. package/dist/admin/AdminUserLayout-CsfrrZkD.js.map +0 -1
  159. package/dist/admin/AdminUserSessions-Bbhcpz4k.js +0 -3
  160. package/dist/admin/AdminUserSessions-DO9H85O-.js.map +0 -1
  161. package/dist/admin/AdminUserSettings-B3jA8g3p.js.map +0 -1
  162. package/dist/admin/AdminUserSettings-CE0xpbQc.js +0 -3
  163. package/dist/admin/AdminUsers-CegGZDhW.js +0 -3
  164. package/dist/admin/AdminUsers-ebbrJBT0.js.map +0 -1
  165. package/dist/auth/AuthLayout-BAZJHzDG.js.map +0 -1
  166. package/dist/auth/Login-CeNZZjrr.js.map +0 -1
  167. package/dist/auth/Login-hQcu1nlu.js +0 -4
  168. package/dist/auth/Register-B6HBNVHS.js +0 -4
  169. package/dist/auth/Register-s4ENeyiE.js.map +0 -1
  170. package/dist/auth/ResetPassword-Cjd-W-Nu.js +0 -3
  171. package/dist/auth/ResetPassword-GLIFkJT7.js.map +0 -1
  172. package/dist/auth/VerifyEmail-Dc9ABKUw.js +0 -3
  173. package/dist/auth/VerifyEmail-R79sSej_.js.map +0 -1
  174. package/src/core/components/data/JsonViewer.tsx +0 -361
@@ -1,5 +1,5 @@
1
- import { useRouter } from "@alepha/react";
2
1
  import { useAuth } from "@alepha/react/auth";
2
+ import { useRouter } from "@alepha/react/router";
3
3
  import {
4
4
  ActionButton,
5
5
  type ActionMenuConfig,
@@ -1,4 +1,4 @@
1
- import { $page } from "@alepha/react";
1
+ import { $page } from "@alepha/react/router";
2
2
  import AlephaMantineProvider from "./components/layout/AlephaMantineProvider.tsx";
3
3
 
4
4
  export class RootRouter {
@@ -1,12 +1,11 @@
1
+ import { type UseActionReturn, useAction } from "@alepha/react";
2
+ import { type FormModel, useFormState } from "@alepha/react/form";
1
3
  import {
2
4
  type RouterGoOptions,
3
- type UseActionReturn,
4
5
  type UseActiveOptions,
5
- useAction,
6
6
  useActive,
7
7
  useRouter,
8
- } from "@alepha/react";
9
- import { type FormModel, useFormState } from "@alepha/react/form";
8
+ } from "@alepha/react/router";
10
9
  import {
11
10
  Anchor,
12
11
  type AnchorProps,
@@ -48,6 +48,9 @@ export interface ControlProps extends GenericControlProps {
48
48
  object?: boolean | Partial<Omit<ControlObjectProps, "input">>; // Nested object editing
49
49
  array?: boolean | Partial<Omit<ControlArrayProps, "input">>; // Array of items editing
50
50
  custom?: ComponentType<CustomControlProps>;
51
+
52
+ slider?: boolean;
53
+ segmented?: boolean;
51
54
  }
52
55
 
53
56
  /**
@@ -183,6 +186,9 @@ const Control = (_props: ControlProps) => {
183
186
  ) {
184
187
  const controlNumberProps =
185
188
  typeof props.number === "object" ? props.number : {};
189
+ if (props.slider) {
190
+ controlNumberProps.sliderProps ??= {};
191
+ }
186
192
  return (
187
193
  <ControlNumber
188
194
  input={props.input}
@@ -237,6 +243,9 @@ const Control = (_props: ControlProps) => {
237
243
 
238
244
  if (isEnum || (isArray && !isArrayOfObjects) || props.select) {
239
245
  const opts = typeof props.select === "object" ? props.select : {};
246
+ if (props.segmented) {
247
+ opts.segmented ??= {};
248
+ }
240
249
  return (
241
250
  <ControlSelect
242
251
  input={props.input}
@@ -264,7 +273,9 @@ const Control = (_props: ControlProps) => {
264
273
  id={id}
265
274
  color={"blue"}
266
275
  defaultChecked={props.input.props.defaultValue}
267
- {...props.input.props}
276
+ onChange={(event) => {
277
+ props.input.set(event.currentTarget.checked);
278
+ }}
268
279
  {...switchProps}
269
280
  />
270
281
  );
@@ -50,6 +50,8 @@ const ControlNumber = (props: ControlNumberProps) => {
50
50
  const { type, ...inputPropsWithoutType } = props.input.props;
51
51
 
52
52
  if (props.sliderProps) {
53
+ const min = props.sliderProps.min ?? inputProps.minimum ?? 0;
54
+ const max = props.sliderProps.max ?? inputProps.maximum ?? 100;
53
55
  return (
54
56
  <Input.Wrapper {...inputProps}>
55
57
  <div
@@ -65,6 +67,9 @@ const ControlNumber = (props: ControlNumberProps) => {
65
67
  {...inputPropsWithoutType}
66
68
  {...props.sliderProps}
67
69
  value={value}
70
+ min={min}
71
+ max={max}
72
+ label={() => value}
68
73
  onChange={(val) => {
69
74
  setValue(val);
70
75
  props.input.set(val);
@@ -1,4 +1,5 @@
1
- import { NestedView, useEvents, useRouter, useStore } from "@alepha/react";
1
+ import { useEvents, useStore } from "@alepha/react";
2
+ import { NestedView, useRouter } from "@alepha/react/router";
2
3
  import {
3
4
  AppShell,
4
5
  type AppShellFooterProps,
@@ -1,5 +1,6 @@
1
- import { NestedView, useEvents } from "@alepha/react";
1
+ import { useEvents } from "@alepha/react";
2
2
  import { FormValidationError } from "@alepha/react/form";
3
+ import { NestedView } from "@alepha/react/router";
3
4
  import {
4
5
  ColorSchemeScript,
5
6
  type ColorSchemeScriptProps,
@@ -1,4 +1,5 @@
1
- import { useRouter, useStore } from "@alepha/react";
1
+ import { useStore } from "@alepha/react";
2
+ import { useRouter } from "@alepha/react/router";
2
3
  import { Spotlight, type SpotlightActionData } from "@mantine/spotlight";
3
4
  import { IconSearch } from "@tabler/icons-react";
4
5
  import { type ReactNode, useMemo } from "react";
@@ -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,11 +127,11 @@ 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
132
  const items = router.concretePages.map((page) => ({
134
133
  label: page.label ?? page.name,
135
- description: page.description?.slice(0, 32),
134
+ //description: page.description?.slice(0, 32),
136
135
  icon: renderIcon(page.icon),
137
136
  href: router.path(page.name),
138
137
  })) as SidebarMenuItem[];
@@ -148,7 +147,7 @@ export const Sidebar = (props: SidebarProps) => {
148
147
  };
149
148
 
150
149
  const padding = "md";
151
- const gap = props.menu ? props.gap : "xs";
150
+ const gap = props.items ? props.gap : "xs";
152
151
  const menu = useMemo(() => getSidebarNodes(), []);
153
152
 
154
153
  return (
@@ -160,10 +159,9 @@ export const Sidebar = (props: SidebarProps) => {
160
159
  {...props.flexProps}
161
160
  >
162
161
  <Flex gap={gap} px={padding} direction={"column"}>
163
- {top.map((item, index) => renderNode(item, index))}
164
162
  {menu
165
163
  .filter((it) => it.position === "top")
166
- .map((item, index) => renderNode(item, index + top.length))}
164
+ .map((item, index) => renderNode(item, index))}
167
165
  </Flex>
168
166
  <Flex
169
167
  gap={gap}
@@ -177,10 +175,9 @@ export const Sidebar = (props: SidebarProps) => {
177
175
  .map((item, index) => renderNode(item, index))}
178
176
  </Flex>
179
177
  <Flex gap={gap} px={padding} direction={"column"}>
180
- {bottom.map((item, index) => renderNode(item, index))}
181
178
  {menu
182
179
  .filter((it) => it.position === "bottom")
183
- .map((item, index) => renderNode(item, index + bottom.length))}
180
+ .map((item, index) => renderNode(item, index))}
184
181
  </Flex>
185
182
  </Flex>
186
183
  );
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;