@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
@@ -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;
@@ -0,0 +1,69 @@
1
+ import { t } from "alepha";
2
+ import type { UserRealmConfig } from "alepha/api/users";
3
+ import ResetPassword from "../../../auth/components/ResetPassword.tsx";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ const showcaseSchema = t.object({
7
+ resetPasswordAllowed: t.boolean({
8
+ title: "Reset Allowed",
9
+ default: true,
10
+ $control: { switch: true },
11
+ }),
12
+ showBranding: t.boolean({
13
+ title: "Show Branding",
14
+ default: true,
15
+ $control: { switch: true },
16
+ }),
17
+ });
18
+
19
+ const buildRealmConfig = (props: {
20
+ resetPasswordAllowed: boolean;
21
+ showBranding: boolean;
22
+ }): UserRealmConfig => {
23
+ return {
24
+ realmName: "demo",
25
+ authenticationMethods: [{ name: "credentials", type: "CREDENTIALS" }],
26
+ settings: {
27
+ displayName: props.showBranding ? "Demo App" : undefined,
28
+ description: props.showBranding ? "Reset your password" : undefined,
29
+ logoUrl: undefined,
30
+ registrationAllowed: true,
31
+ emailEnabled: true,
32
+ emailRequired: true,
33
+ usernameEnabled: false,
34
+ usernameRequired: false,
35
+ phoneEnabled: false,
36
+ phoneRequired: false,
37
+ verifyEmailRequired: false,
38
+ verifyPhoneRequired: false,
39
+ firstNameLastNameEnabled: false,
40
+ firstNameLastNameRequired: false,
41
+ resetPasswordAllowed: props.resetPasswordAllowed,
42
+ passwordPolicy: {
43
+ minLength: 8,
44
+ requireUppercase: true,
45
+ requireLowercase: true,
46
+ requireNumbers: true,
47
+ requireSpecialCharacters: false,
48
+ },
49
+ },
50
+ };
51
+ };
52
+
53
+ const DemoResetPassword = () => {
54
+ return (
55
+ <Showcase
56
+ title="ResetPassword"
57
+ schema={showcaseSchema}
58
+ initialValues={{
59
+ resetPasswordAllowed: true,
60
+ showBranding: true,
61
+ }}
62
+ columns={1}
63
+ >
64
+ {(props) => <ResetPassword realmConfig={buildRealmConfig(props)} />}
65
+ </Showcase>
66
+ );
67
+ };
68
+
69
+ export default DemoResetPassword;
@@ -0,0 +1,28 @@
1
+ import { t } from "alepha";
2
+ import VerifyEmail from "../../../auth/components/VerifyEmail.tsx";
3
+ import Showcase from "../shared/Showcase.tsx";
4
+
5
+ const showcaseSchema = t.object({
6
+ placeholder: t.boolean({
7
+ title: "Demo Mode",
8
+ default: true,
9
+ $control: { switch: true },
10
+ }),
11
+ });
12
+
13
+ const DemoVerifyEmail = () => {
14
+ return (
15
+ <Showcase
16
+ title="VerifyEmail"
17
+ schema={showcaseSchema}
18
+ initialValues={{
19
+ placeholder: true,
20
+ }}
21
+ columns={1}
22
+ >
23
+ {() => <VerifyEmail />}
24
+ </Showcase>
25
+ );
26
+ };
27
+
28
+ export default DemoVerifyEmail;
@@ -0,0 +1,174 @@
1
+ import { DataTable } from "@alepha/ui";
2
+ import { Badge, Text } from "@mantine/core";
3
+ import { t } from "alepha";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ interface User {
7
+ id: number;
8
+ name: string;
9
+ email: string;
10
+ role: "admin" | "user" | "guest";
11
+ status: "active" | "inactive";
12
+ }
13
+
14
+ const sampleUsers: User[] = [
15
+ {
16
+ id: 1,
17
+ name: "Alice Johnson",
18
+ email: "alice@example.com",
19
+ role: "admin",
20
+ status: "active",
21
+ },
22
+ {
23
+ id: 2,
24
+ name: "Bob Smith",
25
+ email: "bob@example.com",
26
+ role: "user",
27
+ status: "active",
28
+ },
29
+ {
30
+ id: 3,
31
+ name: "Charlie Brown",
32
+ email: "charlie@example.com",
33
+ role: "user",
34
+ status: "inactive",
35
+ },
36
+ {
37
+ id: 4,
38
+ name: "Diana Prince",
39
+ email: "diana@example.com",
40
+ role: "admin",
41
+ status: "active",
42
+ },
43
+ {
44
+ id: 5,
45
+ name: "Eve Wilson",
46
+ email: "eve@example.com",
47
+ role: "guest",
48
+ status: "active",
49
+ },
50
+ ];
51
+
52
+ const filters = t.object({
53
+ search: t.optional(t.text({ title: "Search" })),
54
+ role: t.optional(t.enum(["admin", "user", "guest"], { title: "Role" })),
55
+ });
56
+
57
+ const showcaseSchema = t.object({
58
+ withCheckbox: t.boolean({
59
+ title: "Checkbox",
60
+ default: true,
61
+ $control: { switch: true },
62
+ }),
63
+ defaultSize: t.integer({
64
+ title: "Page Size",
65
+ default: 5,
66
+ minimum: 1,
67
+ maximum: 20,
68
+ $control: { slider: true },
69
+ }),
70
+ });
71
+
72
+ const DemoDataTable = () => {
73
+ return (
74
+ <Showcase
75
+ title="DataTable"
76
+ schema={showcaseSchema}
77
+ initialValues={{
78
+ withCheckbox: true,
79
+ defaultSize: 5,
80
+ }}
81
+ columns={1}
82
+ >
83
+ {(props) => (
84
+ <DataTable<User, typeof filters>
85
+ key={`${props.withCheckbox}-${props.defaultSize}`}
86
+ filters={filters}
87
+ submitOnInit
88
+ defaultSize={props.defaultSize}
89
+ items={async (params) => {
90
+ let filtered = [...sampleUsers];
91
+ if (params.search) {
92
+ const s = params.search.toLowerCase();
93
+ filtered = filtered.filter(
94
+ (u) =>
95
+ u.name.toLowerCase().includes(s) ||
96
+ u.email.toLowerCase().includes(s),
97
+ );
98
+ }
99
+ if (params.role) {
100
+ filtered = filtered.filter((u) => u.role === params.role);
101
+ }
102
+ const start = params.page * params.size;
103
+ const content = filtered.slice(start, start + params.size);
104
+ return {
105
+ content,
106
+ page: {
107
+ totalElements: filtered.length,
108
+ totalPages: Math.ceil(filtered.length / params.size),
109
+ },
110
+ };
111
+ }}
112
+ columns={{
113
+ id: {
114
+ label: "ID",
115
+ value: (u) => <Text size="sm">{u.id}</Text>,
116
+ sortable: true,
117
+ fit: true,
118
+ },
119
+ name: {
120
+ label: "Name",
121
+ value: (u) => (
122
+ <Text size="sm" fw={500}>
123
+ {u.name}
124
+ </Text>
125
+ ),
126
+ sortable: true,
127
+ },
128
+ email: {
129
+ label: "Email",
130
+ value: (u) => (
131
+ <Text size="sm" c="dimmed">
132
+ {u.email}
133
+ </Text>
134
+ ),
135
+ },
136
+ role: {
137
+ label: "Role",
138
+ value: (u) => (
139
+ <Badge
140
+ size="sm"
141
+ color={
142
+ u.role === "admin"
143
+ ? "blue"
144
+ : u.role === "user"
145
+ ? "green"
146
+ : "gray"
147
+ }
148
+ >
149
+ {u.role}
150
+ </Badge>
151
+ ),
152
+ },
153
+ status: {
154
+ label: "Status",
155
+ value: (u) => (
156
+ <Badge
157
+ size="sm"
158
+ color={u.status === "active" ? "green" : "red"}
159
+ variant="light"
160
+ >
161
+ {u.status}
162
+ </Badge>
163
+ ),
164
+ },
165
+ }}
166
+ withCheckbox={props.withCheckbox}
167
+ getItemKey={(u) => String(u.id)}
168
+ />
169
+ )}
170
+ </Showcase>
171
+ );
172
+ };
173
+
174
+ export default DemoDataTable;
@@ -0,0 +1,85 @@
1
+ import { Sidebar, type SidebarNode } from "@alepha/ui";
2
+ import { Flex } from "@mantine/core";
3
+ import {
4
+ IconDashboard,
5
+ IconFiles,
6
+ IconSettings,
7
+ IconUsers,
8
+ } from "@tabler/icons-react";
9
+ import { t } from "alepha";
10
+ import Showcase from "../shared/Showcase.tsx";
11
+
12
+ const sidebarItems = [
13
+ { type: "search" },
14
+ { type: "divider" },
15
+ {
16
+ icon: IconDashboard,
17
+ label: "Dashboard",
18
+ },
19
+ {
20
+ icon: IconUsers,
21
+ label: "Users",
22
+ children: [
23
+ { label: "All Users" },
24
+ { label: "Add User" },
25
+ { label: "Roles" },
26
+ ],
27
+ },
28
+ {
29
+ icon: IconFiles,
30
+ label: "Files",
31
+ },
32
+ { type: "spacer" },
33
+ {
34
+ position: "bottom",
35
+ icon: IconSettings,
36
+ label: "Settings",
37
+ },
38
+ ] satisfies SidebarNode[];
39
+
40
+ const showcaseSchema = t.object({
41
+ collapsed: t.boolean({
42
+ title: "Collapsed",
43
+ default: false,
44
+ $control: { switch: true },
45
+ }),
46
+ gap: t.enum(["xs", "sm", "md", "lg"], {
47
+ title: "Gap",
48
+ default: "xs",
49
+ $control: { segmented: true },
50
+ }),
51
+ });
52
+
53
+ const DemoSidebar = () => {
54
+ return (
55
+ <Showcase
56
+ title="Sidebar"
57
+ schema={showcaseSchema}
58
+ initialValues={{
59
+ collapsed: false,
60
+ gap: "xs",
61
+ }}
62
+ columns={1}
63
+ windowProps={{
64
+ fill: true,
65
+ containerProps: { p: 0 },
66
+ }}
67
+ >
68
+ {(props) => (
69
+ <Flex
70
+ h={"100%"}
71
+ w={props.collapsed ? 60 : 240}
72
+ bg="var(--alepha-surface)"
73
+ >
74
+ <Sidebar
75
+ items={sidebarItems}
76
+ collapsed={props.collapsed}
77
+ gap={props.gap}
78
+ />
79
+ </Flex>
80
+ )}
81
+ </Showcase>
82
+ );
83
+ };
84
+
85
+ export default DemoSidebar;
@@ -0,0 +1,69 @@
1
+ import { useForm } from "@alepha/react/form";
2
+ import { TypeForm } from "@alepha/ui";
3
+ import { t } from "alepha";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ const formSchema = t.object({
7
+ username: t.text({ title: "Username", default: "" }),
8
+ email: t.email({ title: "Email", default: "" }),
9
+ age: t.integer({ title: "Age", minimum: 0, maximum: 120 }),
10
+ role: t.enum(["admin", "user", "guest"], { title: "Role", default: "user" }),
11
+ subscribe: t.boolean({ title: "Subscribe", default: false }),
12
+ });
13
+
14
+ const showcaseSchema = t.object({
15
+ columns: t.integer({
16
+ title: "Columns",
17
+ default: 1,
18
+ minimum: 1,
19
+ maximum: 4,
20
+ $control: { slider: true },
21
+ }),
22
+ fill: t.boolean({
23
+ title: "Fill Width",
24
+ default: false,
25
+ $control: { switch: true },
26
+ }),
27
+ skipSubmitButton: t.boolean({
28
+ title: "Hide Submit",
29
+ default: false,
30
+ $control: { switch: true },
31
+ }),
32
+ });
33
+
34
+ const DemoTypeForm = () => {
35
+ const form = useForm(
36
+ {
37
+ schema: formSchema,
38
+ handler: (values) => {
39
+ alert(JSON.stringify(values, null, 2));
40
+ },
41
+ },
42
+ [],
43
+ );
44
+
45
+ return (
46
+ <Showcase
47
+ title="TypeForm"
48
+ schema={showcaseSchema}
49
+ initialValues={{
50
+ columns: 1,
51
+ fill: false,
52
+ skipSubmitButton: false,
53
+ }}
54
+ columns={1}
55
+ >
56
+ {(props) => (
57
+ <TypeForm
58
+ form={form}
59
+ columns={props.columns}
60
+ fill={props.fill}
61
+ skipSubmitButton={props.skipSubmitButton}
62
+ submitButtonProps={{ children: "Submit" }}
63
+ />
64
+ )}
65
+ </Showcase>
66
+ );
67
+ };
68
+
69
+ export default DemoTypeForm;
@@ -0,0 +1,128 @@
1
+ import { useI18n } from "@alepha/react/i18n";
2
+ import { t } from "alepha";
3
+ import { JsonViewer } from "../../../json/index.ts";
4
+ import Showcase from "../shared/Showcase.tsx";
5
+
6
+ const sampleData = {
7
+ name: "Sample Project",
8
+ createdAt: "2024-01-15T10:30:00.000Z",
9
+ updatedAt: "2024-06-20T14:45:30.000Z",
10
+ count: 42,
11
+ price: 99.99,
12
+ isActive: true,
13
+ nullValue: null,
14
+ tags: ["typescript", "react", "json"],
15
+ nested: {
16
+ level1: {
17
+ level2: {
18
+ deepValue: "Found me!",
19
+ },
20
+ },
21
+ },
22
+ users: [
23
+ { id: 1, name: "Alice", role: "admin" },
24
+ { id: 2, name: "Bob", role: "user" },
25
+ ],
26
+ emptyArray: [],
27
+ emptyObject: {},
28
+ longText:
29
+ "This is a very long text that should be truncated when it exceeds the maximum string length configured in the viewer options.",
30
+ };
31
+
32
+ const $control = {
33
+ switch: true,
34
+ slider: true,
35
+ segmented: true,
36
+ };
37
+
38
+ const jsonViewerSchema = t.object({
39
+ showQuotes: t.boolean({
40
+ title: "Show Quotes",
41
+ default: false,
42
+ $control: {
43
+ switch: true,
44
+ },
45
+ }),
46
+ showCopyButton: t.boolean({
47
+ title: "Show Copy Button",
48
+ default: true,
49
+ $control: {
50
+ switch: true,
51
+ },
52
+ }),
53
+ useFormatValue: t.boolean({
54
+ title: "Format Dates",
55
+ default: true,
56
+ $control: {
57
+ switch: true,
58
+ },
59
+ }),
60
+ defaultExpandedDepth: t.integer({
61
+ title: "Expand Depth",
62
+ default: 2,
63
+ minimum: 0,
64
+ maximum: 10,
65
+ $control: { slider: true },
66
+ }),
67
+ maxDepth: t.integer({
68
+ title: "Max Depth",
69
+ default: 10,
70
+ minimum: 1,
71
+ maximum: 20,
72
+ $control: { slider: true },
73
+ }),
74
+ size: t.enum(["xs", "sm", "md", "lg", "xl"], {
75
+ title: "Size",
76
+ default: "sm",
77
+ $control: {
78
+ segmented: true,
79
+ },
80
+ }),
81
+ });
82
+
83
+ const DemoJsonViewer = () => {
84
+ const i18n = useI18n();
85
+ const formatValue = (
86
+ key: string | undefined,
87
+ value: any,
88
+ ): string | number | undefined => {
89
+ if (key === "createdAt") {
90
+ return i18n.l(value, { date: "LLL" });
91
+ }
92
+ if (key === "updatedAt") {
93
+ return i18n.l(value, { date: "fromNow" });
94
+ }
95
+ return undefined;
96
+ };
97
+
98
+ return (
99
+ <Showcase
100
+ title="JsonViewer"
101
+ schema={jsonViewerSchema}
102
+ initialValues={{
103
+ showQuotes: false,
104
+ showCopyButton: true,
105
+ useFormatValue: true,
106
+ defaultExpandedDepth: 2,
107
+ maxDepth: 10,
108
+ size: "sm",
109
+ }}
110
+ columns={1}
111
+ >
112
+ {(props) => (
113
+ <JsonViewer
114
+ key={props.defaultExpandedDepth}
115
+ data={sampleData}
116
+ defaultExpandedDepth={props.defaultExpandedDepth}
117
+ showQuotes={props.showQuotes}
118
+ showCopyButton={props.showCopyButton}
119
+ formatValue={props.useFormatValue ? formatValue : undefined}
120
+ maxDepth={props.maxDepth}
121
+ size={props.size}
122
+ />
123
+ )}
124
+ </Showcase>
125
+ );
126
+ };
127
+
128
+ export default DemoJsonViewer;