@onexapis/cli 1.1.38 → 1.1.39
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.
- package/dist/cli.js +384 -380
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +381 -376
- package/dist/cli.mjs.map +1 -1
- package/dist/index.js +258 -293
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +255 -289
- package/dist/index.mjs.map +1 -1
- package/dist/preview/preview-app.tsx +13 -5
- package/package.json +1 -3
- package/templates/default/AUTH_AND_PROFILE.md +167 -0
- package/templates/default/CLAUDE.md +334 -1
- package/templates/default/LAYOUT.md +195 -0
- package/templates/default/bundle-entry.ts +5 -0
- package/templates/default/esbuild.config.js +20 -0
- package/templates/default/hooks/index.ts +26 -0
- package/templates/default/hooks/use-forgot-password-form.ts +90 -0
- package/templates/default/hooks/use-login-form.ts +102 -0
- package/templates/default/hooks/use-profile-form.ts +255 -0
- package/templates/default/hooks/use-register-form.ts +154 -0
- package/templates/default/hooks/use-verify-code-form.ts +224 -0
- package/templates/default/index.ts +21 -1
- package/templates/default/pages/about.ts +2 -2
- package/templates/default/pages/forgot-password.ts +39 -0
- package/templates/default/pages/home.ts +4 -4
- package/templates/default/pages/login.ts +39 -0
- package/templates/default/pages/profile.ts +39 -0
- package/templates/default/pages/register.ts +39 -0
- package/templates/default/pages/showcase.ts +7 -7
- package/templates/default/pages/verify-code.ts +39 -0
- package/templates/default/sections/about/about.schema.ts +1 -1
- package/templates/default/sections/auth-forgot-password/auth-forgot-password-default.tsx +192 -0
- package/templates/default/sections/auth-forgot-password/auth-forgot-password.schema.ts +150 -0
- package/templates/default/sections/auth-forgot-password/index.ts +14 -0
- package/templates/default/sections/auth-login/auth-login-default.tsx +238 -0
- package/templates/default/sections/auth-login/auth-login.schema.ts +171 -0
- package/templates/default/sections/auth-login/index.ts +14 -0
- package/templates/default/sections/auth-register/auth-register-default.tsx +327 -0
- package/templates/default/sections/auth-register/auth-register.schema.ts +188 -0
- package/templates/default/sections/auth-register/index.ts +14 -0
- package/templates/default/sections/auth-verify-code/auth-verify-code-default.tsx +209 -0
- package/templates/default/sections/auth-verify-code/auth-verify-code.schema.ts +150 -0
- package/templates/default/sections/auth-verify-code/index.ts +14 -0
- package/templates/default/sections/cta/cta.schema.ts +1 -1
- package/templates/default/sections/features/features.schema.ts +1 -1
- package/templates/default/sections/footer/footer-default.tsx +214 -0
- package/templates/default/sections/footer/footer.schema.ts +170 -0
- package/templates/default/sections/footer/index.ts +14 -0
- package/templates/default/sections/gallery/gallery.schema.ts +1 -1
- package/templates/default/sections/header/header-default.tsx +322 -0
- package/templates/default/sections/header/header.schema.ts +168 -0
- package/templates/default/sections/header/index.ts +14 -0
- package/templates/default/sections/hero/hero.schema.ts +1 -1
- package/templates/default/sections/profile/index.ts +14 -0
- package/templates/default/sections/profile/profile-default.tsx +522 -0
- package/templates/default/sections/profile/profile.schema.ts +228 -0
- package/templates/default/sections/stats/stats.schema.ts +1 -1
- package/templates/default/sections/testimonials/testimonials.schema.ts +1 -1
- package/templates/default/sections-registry.ts +28 -0
- package/templates/default/theme.layout.ts +71 -2
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Register Form Hook
|
|
3
|
+
* Manages form state, validation, and submission via useAuth
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use client";
|
|
7
|
+
|
|
8
|
+
import { useState, useCallback } from "react";
|
|
9
|
+
import { useAuth } from "@onexapis/core/hooks";
|
|
10
|
+
|
|
11
|
+
export interface RegisterFormData {
|
|
12
|
+
email: string;
|
|
13
|
+
username: string;
|
|
14
|
+
password: string;
|
|
15
|
+
confirmPassword: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface UseRegisterFormReturn {
|
|
19
|
+
formData: RegisterFormData;
|
|
20
|
+
errors: Record<string, string>;
|
|
21
|
+
showPassword: boolean;
|
|
22
|
+
showConfirmPassword: boolean;
|
|
23
|
+
isPending: boolean;
|
|
24
|
+
handleInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
25
|
+
handleSubmit: (e: React.FormEvent) => void;
|
|
26
|
+
toggleShowPassword: () => void;
|
|
27
|
+
toggleShowConfirmPassword: () => void;
|
|
28
|
+
clearError: (field: string) => void;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function useRegisterForm(): UseRegisterFormReturn {
|
|
32
|
+
const [formData, setFormData] = useState<RegisterFormData>({
|
|
33
|
+
email: "",
|
|
34
|
+
username: "",
|
|
35
|
+
password: "",
|
|
36
|
+
confirmPassword: "",
|
|
37
|
+
});
|
|
38
|
+
const [errors, setErrors] = useState<Record<string, string>>({});
|
|
39
|
+
const [showPassword, setShowPassword] = useState(false);
|
|
40
|
+
const [showConfirmPassword, setShowConfirmPassword] = useState(false);
|
|
41
|
+
const [isPending, setIsPending] = useState(false);
|
|
42
|
+
|
|
43
|
+
const { signup } = useAuth();
|
|
44
|
+
|
|
45
|
+
const handleInputChange = useCallback(
|
|
46
|
+
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
47
|
+
const { name, value } = e.target;
|
|
48
|
+
setFormData((prev) => ({ ...prev, [name]: value }));
|
|
49
|
+
if (errors[name]) {
|
|
50
|
+
setErrors((prev) => ({ ...prev, [name]: "" }));
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
[errors]
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const validateForm = useCallback((): boolean => {
|
|
57
|
+
const newErrors: Record<string, string> = {};
|
|
58
|
+
|
|
59
|
+
if (!formData.email) {
|
|
60
|
+
newErrors.email = "Please enter your email";
|
|
61
|
+
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(formData.email)) {
|
|
62
|
+
newErrors.email = "Invalid email format";
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (!formData.username) {
|
|
66
|
+
newErrors.username = "Please enter a username";
|
|
67
|
+
} else if (formData.username.length < 3) {
|
|
68
|
+
newErrors.username = "Username must be at least 3 characters";
|
|
69
|
+
} else if (!/^[a-zA-Z0-9_]+$/.test(formData.username)) {
|
|
70
|
+
newErrors.username =
|
|
71
|
+
"Username can only contain letters, numbers, and underscores";
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!formData.password) {
|
|
75
|
+
newErrors.password = "Please enter a password";
|
|
76
|
+
} else if (formData.password.length < 8) {
|
|
77
|
+
newErrors.password = "Password must be at least 8 characters";
|
|
78
|
+
} else if (!/(?=.*[a-z])(?=.*[A-Z])(?=.*\d)/.test(formData.password)) {
|
|
79
|
+
newErrors.password =
|
|
80
|
+
"Password must contain uppercase, lowercase, and a number";
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!formData.confirmPassword) {
|
|
84
|
+
newErrors.confirmPassword = "Please confirm your password";
|
|
85
|
+
} else if (formData.password !== formData.confirmPassword) {
|
|
86
|
+
newErrors.confirmPassword = "Passwords do not match";
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
setErrors(newErrors);
|
|
90
|
+
return Object.keys(newErrors).length === 0;
|
|
91
|
+
}, [formData]);
|
|
92
|
+
|
|
93
|
+
const handleSubmit = useCallback(
|
|
94
|
+
async (e: React.FormEvent) => {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
if (!validateForm()) return;
|
|
97
|
+
|
|
98
|
+
setIsPending(true);
|
|
99
|
+
try {
|
|
100
|
+
await signup({
|
|
101
|
+
email: formData.email,
|
|
102
|
+
username: formData.username,
|
|
103
|
+
password: formData.password,
|
|
104
|
+
name: formData.username,
|
|
105
|
+
});
|
|
106
|
+
// Store email for verify-code page
|
|
107
|
+
if (typeof window !== "undefined") {
|
|
108
|
+
const expiryTimestamp = Date.now() + 60 * 1000;
|
|
109
|
+
localStorage.setItem(
|
|
110
|
+
`resend_countdown_${formData.username}`,
|
|
111
|
+
expiryTimestamp.toString()
|
|
112
|
+
);
|
|
113
|
+
localStorage.setItem(
|
|
114
|
+
`register_email_${formData.username}`,
|
|
115
|
+
formData.email
|
|
116
|
+
);
|
|
117
|
+
window.location.href = `/verify-code?username=${encodeURIComponent(formData.username)}`;
|
|
118
|
+
}
|
|
119
|
+
} catch (error) {
|
|
120
|
+
const message =
|
|
121
|
+
error instanceof Error ? error.message : "Registration failed";
|
|
122
|
+
setErrors({ form: message });
|
|
123
|
+
} finally {
|
|
124
|
+
setIsPending(false);
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
[validateForm, signup, formData]
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
const toggleShowPassword = useCallback(() => {
|
|
131
|
+
setShowPassword((prev) => !prev);
|
|
132
|
+
}, []);
|
|
133
|
+
|
|
134
|
+
const toggleShowConfirmPassword = useCallback(() => {
|
|
135
|
+
setShowConfirmPassword((prev) => !prev);
|
|
136
|
+
}, []);
|
|
137
|
+
|
|
138
|
+
const clearError = useCallback((field: string) => {
|
|
139
|
+
setErrors((prev) => ({ ...prev, [field]: "" }));
|
|
140
|
+
}, []);
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
formData,
|
|
144
|
+
errors,
|
|
145
|
+
showPassword,
|
|
146
|
+
showConfirmPassword,
|
|
147
|
+
isPending,
|
|
148
|
+
handleInputChange,
|
|
149
|
+
handleSubmit,
|
|
150
|
+
toggleShowPassword,
|
|
151
|
+
toggleShowConfirmPassword,
|
|
152
|
+
clearError,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verify Code Form Hook
|
|
3
|
+
* Manages OTP input state, countdown timer, and submission via useAuth
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
"use client";
|
|
7
|
+
|
|
8
|
+
import { useState, useRef, useEffect, useCallback } from "react";
|
|
9
|
+
import { useAuth } from "@onexapis/core/hooks";
|
|
10
|
+
|
|
11
|
+
export interface UseVerifyCodeFormReturn {
|
|
12
|
+
code: string[];
|
|
13
|
+
error: string | null;
|
|
14
|
+
countdown: number;
|
|
15
|
+
email: string;
|
|
16
|
+
username: string;
|
|
17
|
+
isVerifying: boolean;
|
|
18
|
+
isResending: boolean;
|
|
19
|
+
isLoading: boolean;
|
|
20
|
+
inputRefs: React.MutableRefObject<(HTMLInputElement | null)[]>;
|
|
21
|
+
handleCodeChange: (index: number, value: string) => void;
|
|
22
|
+
handleKeyDown: (
|
|
23
|
+
index: number,
|
|
24
|
+
e: React.KeyboardEvent<HTMLInputElement>
|
|
25
|
+
) => void;
|
|
26
|
+
handlePaste: (e: React.ClipboardEvent) => void;
|
|
27
|
+
handleSubmit: (e: React.FormEvent) => void;
|
|
28
|
+
handleResend: () => void;
|
|
29
|
+
setError: (error: string | null) => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export function useVerifyCodeForm(): UseVerifyCodeFormReturn {
|
|
33
|
+
const [code, setCode] = useState<string[]>(["", "", "", "", "", ""]);
|
|
34
|
+
const [error, setError] = useState<string | null>(null);
|
|
35
|
+
const [countdown, setCountdown] = useState(0);
|
|
36
|
+
const [email, setEmail] = useState("");
|
|
37
|
+
const [username, setUsername] = useState("");
|
|
38
|
+
const [isVerifying, setIsVerifying] = useState(false);
|
|
39
|
+
const [isResending, setIsResending] = useState(false);
|
|
40
|
+
const inputRefs = useRef<(HTMLInputElement | null)[]>([]);
|
|
41
|
+
|
|
42
|
+
const { verifyCode, verifyCodeReset, resendCode } = useAuth();
|
|
43
|
+
|
|
44
|
+
// Extract username from URL search params
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (typeof window !== "undefined") {
|
|
47
|
+
const params = new URLSearchParams(window.location.search);
|
|
48
|
+
const u = params.get("username") || "";
|
|
49
|
+
setUsername(u);
|
|
50
|
+
|
|
51
|
+
if (u) {
|
|
52
|
+
const storedEmail = localStorage.getItem(`register_email_${u}`);
|
|
53
|
+
if (storedEmail) setEmail(storedEmail);
|
|
54
|
+
|
|
55
|
+
const storedValue = localStorage.getItem(`resend_countdown_${u}`);
|
|
56
|
+
if (storedValue) {
|
|
57
|
+
const expiryTimestamp = parseInt(storedValue, 10);
|
|
58
|
+
const remaining = Math.max(
|
|
59
|
+
0,
|
|
60
|
+
Math.floor((expiryTimestamp - Date.now()) / 1000)
|
|
61
|
+
);
|
|
62
|
+
if (remaining > 0) setCountdown(remaining);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}, []);
|
|
67
|
+
|
|
68
|
+
// Countdown timer
|
|
69
|
+
useEffect(() => {
|
|
70
|
+
if (countdown > 0) {
|
|
71
|
+
const timer = setInterval(() => {
|
|
72
|
+
setCountdown((prev) => prev - 1);
|
|
73
|
+
}, 1000);
|
|
74
|
+
return () => clearInterval(timer);
|
|
75
|
+
}
|
|
76
|
+
}, [countdown]);
|
|
77
|
+
|
|
78
|
+
const handleSubmitCode = useCallback(
|
|
79
|
+
async (fullCode: string) => {
|
|
80
|
+
if (!username) {
|
|
81
|
+
setError("Account information not found");
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
setIsVerifying(true);
|
|
86
|
+
setError(null);
|
|
87
|
+
try {
|
|
88
|
+
const params = new URLSearchParams(window.location.search);
|
|
89
|
+
const mode = params.get("mode");
|
|
90
|
+
|
|
91
|
+
if (mode === "reset") {
|
|
92
|
+
const result = await verifyCodeReset({ username, code: fullCode });
|
|
93
|
+
// Clean up and redirect to reset-password
|
|
94
|
+
localStorage.removeItem(`register_email_${username}`);
|
|
95
|
+
localStorage.removeItem(`resend_countdown_${username}`);
|
|
96
|
+
const session = result?.session;
|
|
97
|
+
window.location.href = session
|
|
98
|
+
? `/reset-password?session=${encodeURIComponent(session)}`
|
|
99
|
+
: "/reset-password";
|
|
100
|
+
} else {
|
|
101
|
+
await verifyCode({ username, code: fullCode });
|
|
102
|
+
// Clean up and redirect to login
|
|
103
|
+
localStorage.removeItem(`register_email_${username}`);
|
|
104
|
+
localStorage.removeItem(`resend_countdown_${username}`);
|
|
105
|
+
window.location.href = "/login";
|
|
106
|
+
}
|
|
107
|
+
} catch (err) {
|
|
108
|
+
const message =
|
|
109
|
+
err instanceof Error ? err.message : "Verification failed";
|
|
110
|
+
setError(message);
|
|
111
|
+
} finally {
|
|
112
|
+
setIsVerifying(false);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
[username, verifyCode, verifyCodeReset]
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
const handleCodeChange = useCallback(
|
|
119
|
+
(index: number, value: string) => {
|
|
120
|
+
const digit = value.replace(/\D/g, "").slice(-1);
|
|
121
|
+
const newCode = [...code];
|
|
122
|
+
newCode[index] = digit;
|
|
123
|
+
setCode(newCode);
|
|
124
|
+
setError(null);
|
|
125
|
+
|
|
126
|
+
if (digit && index < 5) {
|
|
127
|
+
inputRefs.current[index + 1]?.focus();
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (digit && index === 5) {
|
|
131
|
+
const fullCode = newCode.join("");
|
|
132
|
+
if (fullCode.length === 6) {
|
|
133
|
+
handleSubmitCode(fullCode);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
[code, handleSubmitCode]
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
const handleKeyDown = useCallback(
|
|
141
|
+
(index: number, e: React.KeyboardEvent<HTMLInputElement>) => {
|
|
142
|
+
if (e.key === "Backspace" && !code[index] && index > 0) {
|
|
143
|
+
inputRefs.current[index - 1]?.focus();
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
[code]
|
|
147
|
+
);
|
|
148
|
+
|
|
149
|
+
const handlePaste = useCallback(
|
|
150
|
+
(e: React.ClipboardEvent) => {
|
|
151
|
+
e.preventDefault();
|
|
152
|
+
const pastedData = e.clipboardData.getData("text");
|
|
153
|
+
const digits = pastedData.replace(/\D/g, "").slice(0, 6);
|
|
154
|
+
|
|
155
|
+
if (digits.length > 0) {
|
|
156
|
+
const newCode = [...code];
|
|
157
|
+
for (let i = 0; i < 6; i++) {
|
|
158
|
+
newCode[i] = digits[i] || "";
|
|
159
|
+
}
|
|
160
|
+
setCode(newCode);
|
|
161
|
+
|
|
162
|
+
const lastIndex = Math.min(digits.length - 1, 5);
|
|
163
|
+
inputRefs.current[lastIndex]?.focus();
|
|
164
|
+
|
|
165
|
+
if (digits.length === 6) {
|
|
166
|
+
handleSubmitCode(digits);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
[code, handleSubmitCode]
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
const handleSubmit = useCallback(
|
|
174
|
+
(e: React.FormEvent) => {
|
|
175
|
+
e.preventDefault();
|
|
176
|
+
const fullCode = code.join("");
|
|
177
|
+
if (fullCode.length !== 6) {
|
|
178
|
+
setError("Please enter the full 6-digit code");
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
handleSubmitCode(fullCode);
|
|
182
|
+
},
|
|
183
|
+
[code, handleSubmitCode]
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
const handleResend = useCallback(async () => {
|
|
187
|
+
if (countdown > 0 || !username) return;
|
|
188
|
+
|
|
189
|
+
setIsResending(true);
|
|
190
|
+
try {
|
|
191
|
+
await resendCode({ username });
|
|
192
|
+
const expiryTimestamp = Date.now() + 60 * 1000;
|
|
193
|
+
localStorage.setItem(
|
|
194
|
+
`resend_countdown_${username}`,
|
|
195
|
+
expiryTimestamp.toString()
|
|
196
|
+
);
|
|
197
|
+
setCountdown(60);
|
|
198
|
+
} catch (err) {
|
|
199
|
+
const message =
|
|
200
|
+
err instanceof Error ? err.message : "Failed to resend code";
|
|
201
|
+
setError(message);
|
|
202
|
+
} finally {
|
|
203
|
+
setIsResending(false);
|
|
204
|
+
}
|
|
205
|
+
}, [countdown, username, resendCode]);
|
|
206
|
+
|
|
207
|
+
return {
|
|
208
|
+
code,
|
|
209
|
+
error,
|
|
210
|
+
countdown,
|
|
211
|
+
email,
|
|
212
|
+
username,
|
|
213
|
+
isVerifying,
|
|
214
|
+
isResending,
|
|
215
|
+
isLoading: isVerifying || isResending,
|
|
216
|
+
inputRefs,
|
|
217
|
+
handleCodeChange,
|
|
218
|
+
handleKeyDown,
|
|
219
|
+
handlePaste,
|
|
220
|
+
handleSubmit,
|
|
221
|
+
handleResend,
|
|
222
|
+
setError,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
@@ -14,13 +14,33 @@ export { default as layoutConfig, simpleLayoutConfig } from "./theme.layout";
|
|
|
14
14
|
export { default as homePageConfig } from "./pages/home";
|
|
15
15
|
export { default as aboutPageConfig } from "./pages/about";
|
|
16
16
|
export { default as showcasePageConfig } from "./pages/showcase";
|
|
17
|
+
export { default as loginPageConfig } from "./pages/login";
|
|
18
|
+
export { default as registerPageConfig } from "./pages/register";
|
|
19
|
+
export { default as forgotPasswordPageConfig } from "./pages/forgot-password";
|
|
20
|
+
export { default as verifyCodePageConfig } from "./pages/verify-code";
|
|
21
|
+
export { default as profilePageConfig } from "./pages/profile";
|
|
17
22
|
|
|
18
23
|
// Page map for dynamic access
|
|
19
24
|
export const pages = {
|
|
20
25
|
home: () => import("./pages/home").then((m) => m.default),
|
|
21
26
|
about: () => import("./pages/about").then((m) => m.default),
|
|
22
27
|
showcase: () => import("./pages/showcase").then((m) => m.default),
|
|
28
|
+
login: () => import("./pages/login").then((m) => m.default),
|
|
29
|
+
register: () => import("./pages/register").then((m) => m.default),
|
|
30
|
+
"forgot-password": () =>
|
|
31
|
+
import("./pages/forgot-password").then((m) => m.default),
|
|
32
|
+
"verify-code": () => import("./pages/verify-code").then((m) => m.default),
|
|
33
|
+
profile: () => import("./pages/profile").then((m) => m.default),
|
|
23
34
|
};
|
|
24
35
|
|
|
25
36
|
// Page slugs (for discovery)
|
|
26
|
-
export const pageList = [
|
|
37
|
+
export const pageList = [
|
|
38
|
+
"home",
|
|
39
|
+
"about",
|
|
40
|
+
"showcase",
|
|
41
|
+
"login",
|
|
42
|
+
"register",
|
|
43
|
+
"forgot-password",
|
|
44
|
+
"verify-code",
|
|
45
|
+
"profile",
|
|
46
|
+
] as const;
|
|
@@ -27,7 +27,7 @@ export const aboutPageConfig: Omit<
|
|
|
27
27
|
sections: [
|
|
28
28
|
{
|
|
29
29
|
id: "about-1",
|
|
30
|
-
type: "
|
|
30
|
+
type: "about",
|
|
31
31
|
template: "default",
|
|
32
32
|
order: 0,
|
|
33
33
|
enabled: true,
|
|
@@ -47,7 +47,7 @@ export const aboutPageConfig: Omit<
|
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
id: "testimonials-1",
|
|
50
|
-
type: "
|
|
50
|
+
type: "testimonials",
|
|
51
51
|
template: "default",
|
|
52
52
|
order: 1,
|
|
53
53
|
enabled: true,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* My Simple Theme - Forgot Password Page Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PageConfig } from "@onexapis/core/types";
|
|
6
|
+
|
|
7
|
+
export const forgotPasswordPageConfig: Omit<
|
|
8
|
+
PageConfig,
|
|
9
|
+
"id" | "createdAt" | "updatedAt"
|
|
10
|
+
> = {
|
|
11
|
+
title: "Forgot Password",
|
|
12
|
+
handle: "forgot-password",
|
|
13
|
+
path: "/forgot-password",
|
|
14
|
+
type: "auth",
|
|
15
|
+
renderMode: "sections",
|
|
16
|
+
themeId: "my-simple",
|
|
17
|
+
editable: true,
|
|
18
|
+
published: true,
|
|
19
|
+
|
|
20
|
+
seo: {
|
|
21
|
+
title: "Forgot Password",
|
|
22
|
+
description: "Reset your password",
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
sections: [
|
|
26
|
+
{
|
|
27
|
+
id: "auth-forgot-password-1",
|
|
28
|
+
type: "auth-forgot-password",
|
|
29
|
+
template: "default",
|
|
30
|
+
order: 0,
|
|
31
|
+
enabled: true,
|
|
32
|
+
settings: {},
|
|
33
|
+
components: [],
|
|
34
|
+
blocks: [],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default forgotPasswordPageConfig;
|
|
@@ -27,7 +27,7 @@ export const homePageConfig: Omit<
|
|
|
27
27
|
sections: [
|
|
28
28
|
{
|
|
29
29
|
id: "hero-1",
|
|
30
|
-
type: "
|
|
30
|
+
type: "hero",
|
|
31
31
|
template: "default",
|
|
32
32
|
order: 0,
|
|
33
33
|
enabled: true,
|
|
@@ -47,7 +47,7 @@ export const homePageConfig: Omit<
|
|
|
47
47
|
},
|
|
48
48
|
{
|
|
49
49
|
id: "features-1",
|
|
50
|
-
type: "
|
|
50
|
+
type: "features",
|
|
51
51
|
template: "default",
|
|
52
52
|
order: 1,
|
|
53
53
|
enabled: true,
|
|
@@ -62,7 +62,7 @@ export const homePageConfig: Omit<
|
|
|
62
62
|
},
|
|
63
63
|
{
|
|
64
64
|
id: "stats-1",
|
|
65
|
-
type: "
|
|
65
|
+
type: "stats",
|
|
66
66
|
template: "default",
|
|
67
67
|
order: 2,
|
|
68
68
|
enabled: true,
|
|
@@ -76,7 +76,7 @@ export const homePageConfig: Omit<
|
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
id: "cta-1",
|
|
79
|
-
type: "
|
|
79
|
+
type: "cta",
|
|
80
80
|
template: "default",
|
|
81
81
|
order: 3,
|
|
82
82
|
enabled: true,
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* My Simple Theme - Login Page Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PageConfig } from "@onexapis/core/types";
|
|
6
|
+
|
|
7
|
+
export const loginPageConfig: Omit<
|
|
8
|
+
PageConfig,
|
|
9
|
+
"id" | "createdAt" | "updatedAt"
|
|
10
|
+
> = {
|
|
11
|
+
title: "Login",
|
|
12
|
+
handle: "login",
|
|
13
|
+
path: "/login",
|
|
14
|
+
type: "auth",
|
|
15
|
+
renderMode: "sections",
|
|
16
|
+
themeId: "my-simple",
|
|
17
|
+
editable: true,
|
|
18
|
+
published: true,
|
|
19
|
+
|
|
20
|
+
seo: {
|
|
21
|
+
title: "Sign In",
|
|
22
|
+
description: "Sign in to your account",
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
sections: [
|
|
26
|
+
{
|
|
27
|
+
id: "auth-login-1",
|
|
28
|
+
type: "auth-login",
|
|
29
|
+
template: "default",
|
|
30
|
+
order: 0,
|
|
31
|
+
enabled: true,
|
|
32
|
+
settings: {},
|
|
33
|
+
components: [],
|
|
34
|
+
blocks: [],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default loginPageConfig;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* My Simple Theme - Profile Page Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PageConfig } from "@onexapis/core/types";
|
|
6
|
+
|
|
7
|
+
export const profilePageConfig: Omit<
|
|
8
|
+
PageConfig,
|
|
9
|
+
"id" | "createdAt" | "updatedAt"
|
|
10
|
+
> = {
|
|
11
|
+
title: "Profile",
|
|
12
|
+
handle: "profile",
|
|
13
|
+
path: "/profile",
|
|
14
|
+
type: "profile",
|
|
15
|
+
renderMode: "sections",
|
|
16
|
+
themeId: "my-simple",
|
|
17
|
+
editable: true,
|
|
18
|
+
published: true,
|
|
19
|
+
|
|
20
|
+
seo: {
|
|
21
|
+
title: "My Profile",
|
|
22
|
+
description: "Manage your account profile",
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
sections: [
|
|
26
|
+
{
|
|
27
|
+
id: "profile-1",
|
|
28
|
+
type: "profile",
|
|
29
|
+
template: "default",
|
|
30
|
+
order: 0,
|
|
31
|
+
enabled: true,
|
|
32
|
+
settings: {},
|
|
33
|
+
components: [],
|
|
34
|
+
blocks: [],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default profilePageConfig;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* My Simple Theme - Register Page Configuration
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PageConfig } from "@onexapis/core/types";
|
|
6
|
+
|
|
7
|
+
export const registerPageConfig: Omit<
|
|
8
|
+
PageConfig,
|
|
9
|
+
"id" | "createdAt" | "updatedAt"
|
|
10
|
+
> = {
|
|
11
|
+
title: "Register",
|
|
12
|
+
handle: "register",
|
|
13
|
+
path: "/register",
|
|
14
|
+
type: "auth",
|
|
15
|
+
renderMode: "sections",
|
|
16
|
+
themeId: "my-simple",
|
|
17
|
+
editable: true,
|
|
18
|
+
published: true,
|
|
19
|
+
|
|
20
|
+
seo: {
|
|
21
|
+
title: "Create Account",
|
|
22
|
+
description: "Create a new account",
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
sections: [
|
|
26
|
+
{
|
|
27
|
+
id: "auth-register-1",
|
|
28
|
+
type: "auth-register",
|
|
29
|
+
template: "default",
|
|
30
|
+
order: 0,
|
|
31
|
+
enabled: true,
|
|
32
|
+
settings: {},
|
|
33
|
+
components: [],
|
|
34
|
+
blocks: [],
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export default registerPageConfig;
|
|
@@ -27,7 +27,7 @@ export const showcasePageConfig: Omit<
|
|
|
27
27
|
sections: [
|
|
28
28
|
{
|
|
29
29
|
id: "showcase-hero",
|
|
30
|
-
type: "
|
|
30
|
+
type: "hero",
|
|
31
31
|
template: "default",
|
|
32
32
|
order: 0,
|
|
33
33
|
enabled: true,
|
|
@@ -48,7 +48,7 @@ export const showcasePageConfig: Omit<
|
|
|
48
48
|
},
|
|
49
49
|
{
|
|
50
50
|
id: "showcase-features",
|
|
51
|
-
type: "
|
|
51
|
+
type: "features",
|
|
52
52
|
template: "default",
|
|
53
53
|
order: 1,
|
|
54
54
|
enabled: true,
|
|
@@ -63,7 +63,7 @@ export const showcasePageConfig: Omit<
|
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
id: "showcase-stats",
|
|
66
|
-
type: "
|
|
66
|
+
type: "stats",
|
|
67
67
|
template: "default",
|
|
68
68
|
order: 2,
|
|
69
69
|
enabled: true,
|
|
@@ -77,7 +77,7 @@ export const showcasePageConfig: Omit<
|
|
|
77
77
|
},
|
|
78
78
|
{
|
|
79
79
|
id: "showcase-about",
|
|
80
|
-
type: "
|
|
80
|
+
type: "about",
|
|
81
81
|
template: "default",
|
|
82
82
|
order: 3,
|
|
83
83
|
enabled: true,
|
|
@@ -97,7 +97,7 @@ export const showcasePageConfig: Omit<
|
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
id: "showcase-testimonials",
|
|
100
|
-
type: "
|
|
100
|
+
type: "testimonials",
|
|
101
101
|
template: "default",
|
|
102
102
|
order: 4,
|
|
103
103
|
enabled: true,
|
|
@@ -113,7 +113,7 @@ export const showcasePageConfig: Omit<
|
|
|
113
113
|
},
|
|
114
114
|
{
|
|
115
115
|
id: "showcase-gallery",
|
|
116
|
-
type: "
|
|
116
|
+
type: "gallery",
|
|
117
117
|
template: "default",
|
|
118
118
|
order: 5,
|
|
119
119
|
enabled: true,
|
|
@@ -129,7 +129,7 @@ export const showcasePageConfig: Omit<
|
|
|
129
129
|
},
|
|
130
130
|
{
|
|
131
131
|
id: "showcase-cta",
|
|
132
|
-
type: "
|
|
132
|
+
type: "cta",
|
|
133
133
|
template: "default",
|
|
134
134
|
order: 6,
|
|
135
135
|
enabled: true,
|