diff --git a/src/routes/(user)/settings/+layout.svelte b/src/routes/(user)/settings/+layout.svelte
new file mode 100644
index 0000000..9ad6f71
--- /dev/null
+++ b/src/routes/(user)/settings/+layout.svelte
@@ -0,0 +1,45 @@
+
+
+
+
+
Settings
+
+ Manage your account settings and set e-mail preferences.
+
+
+
+
+
diff --git a/src/routes/(user)/settings/+page.server.ts b/src/routes/(user)/settings/+page.server.ts
new file mode 100644
index 0000000..cb9625f
--- /dev/null
+++ b/src/routes/(user)/settings/+page.server.ts
@@ -0,0 +1,25 @@
+import type { PageServerLoad } from "./$types";
+import { superValidate } from "sveltekit-superforms";
+import { zod } from "sveltekit-superforms/adapters";
+import { profileFormSchema } from "./profile-form.svelte";
+import { fail, type Actions } from "@sveltejs/kit";
+
+export const load: PageServerLoad = async () => {
+ return {
+ form: await superValidate(zod(profileFormSchema)),
+ };
+};
+
+export const actions: Actions = {
+ default: async (event) => {
+ const form = await superValidate(event, zod(profileFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form,
+ });
+ }
+ return {
+ form,
+ };
+ },
+};
diff --git a/src/routes/(user)/settings/+page.svelte b/src/routes/(user)/settings/+page.svelte
new file mode 100644
index 0000000..f85eb89
--- /dev/null
+++ b/src/routes/(user)/settings/+page.svelte
@@ -0,0 +1,15 @@
+
+
+
+
+
Profile
+
This is how others will see you on the site.
+
+
+
+
diff --git a/src/routes/(user)/settings/account/+page.server.ts b/src/routes/(user)/settings/account/+page.server.ts
new file mode 100644
index 0000000..1eaf695
--- /dev/null
+++ b/src/routes/(user)/settings/account/+page.server.ts
@@ -0,0 +1,26 @@
+import { superValidate } from "sveltekit-superforms";
+import { zod } from "sveltekit-superforms/adapters";
+import type { PageServerLoad } from "./$types";
+import { accountFormSchema } from "./account-form.svelte";
+import { fail, type Actions } from "@sveltejs/kit";
+
+export const load: PageServerLoad = async () => {
+ return {
+ form: await superValidate(zod(accountFormSchema)),
+ };
+};
+
+export const actions: Actions = {
+ default: async (event) => {
+ const form = await superValidate(event, zod(accountFormSchema));
+ if (!form.valid) {
+ console.log(form);
+ return fail(400, {
+ form,
+ });
+ }
+ return {
+ form,
+ };
+ },
+};
diff --git a/src/routes/(user)/settings/account/+page.svelte b/src/routes/(user)/settings/account/+page.svelte
new file mode 100644
index 0000000..db3e9b4
--- /dev/null
+++ b/src/routes/(user)/settings/account/+page.svelte
@@ -0,0 +1,18 @@
+
+
+
+
+
Account
+
+ Update your account settings. Set your preferred language and timezone.
+
+
+
+
+
diff --git a/src/routes/(user)/settings/account/account-form.svelte b/src/routes/(user)/settings/account/account-form.svelte
new file mode 100644
index 0000000..38e55c1
--- /dev/null
+++ b/src/routes/(user)/settings/account/account-form.svelte
@@ -0,0 +1,179 @@
+
+
+
+
+
+
+ Name
+
+
+
+
+
+
+ Date of Birth
+
+
+
+ {dobValue ? df.format(dobValue.toDate(getLocalTimeZone())) : "Pick a date"}
+
+
+ {
+ const currDateObj = currDate.toDate(getLocalTimeZone());
+ const today = new Date();
+ today.setHours(0, 0, 0, 0);
+
+ if (currDateObj > today || currDate.year < 1900) return true;
+
+ return false;
+ }}
+ onValueChange={(value) => {
+ if (value === undefined) {
+ $formData.dob = undefined;
+ validate("dob");
+ return;
+ }
+ $formData.dob = value.toDate(getLocalTimeZone()).toISOString();
+ validate("dob");
+ }}
+ />
+
+
+
+
+
+
+
+
+
+
+ Language
+
+ {languages.find((lang) => lang.value === $formData.language)?.label ||
+ "Select a language"}
+
+
+
+
+
+
+
+ No language found.
+
+ {#each languages as language}
+ {
+ $formData.language = language.value;
+ validate("language");
+ }}
+ >
+
+ {language.label}
+
+ {/each}
+
+
+
+
+
+
+
Update account
+
+
+{#if browser}
+
+{/if}
diff --git a/src/routes/(user)/settings/appearance/+page.server.ts b/src/routes/(user)/settings/appearance/+page.server.ts
new file mode 100644
index 0000000..dc249bc
--- /dev/null
+++ b/src/routes/(user)/settings/appearance/+page.server.ts
@@ -0,0 +1,25 @@
+import { superValidate } from "sveltekit-superforms";
+import { zod } from "sveltekit-superforms/adapters";
+import type { PageServerLoad } from "../$types";
+import { appearanceFormSchema } from "./appearance-form.svelte";
+import { fail, type Actions } from "@sveltejs/kit";
+
+export const load: PageServerLoad = async () => {
+ return {
+ form: await superValidate(zod(appearanceFormSchema)),
+ };
+};
+
+export const actions: Actions = {
+ default: async (event) => {
+ const form = await superValidate(event, zod(appearanceFormSchema));
+ if (!form.valid) {
+ return fail(400, {
+ form,
+ });
+ }
+ return {
+ form,
+ };
+ },
+};
diff --git a/src/routes/(dashboard)/settings/appearance/+page.svelte b/src/routes/(user)/settings/appearance/+page.svelte
similarity index 57%
rename from src/routes/(dashboard)/settings/appearance/+page.svelte
rename to src/routes/(user)/settings/appearance/+page.svelte
index 6dea5a0..4512b07 100644
--- a/src/routes/(dashboard)/settings/appearance/+page.svelte
+++ b/src/routes/(user)/settings/appearance/+page.svelte
@@ -1,10 +1,9 @@
@@ -15,5 +14,5 @@
-
+
diff --git a/src/routes/(user)/settings/appearance/appearance-form.svelte b/src/routes/(user)/settings/appearance/appearance-form.svelte
new file mode 100644
index 0000000..01a49ea
--- /dev/null
+++ b/src/routes/(user)/settings/appearance/appearance-form.svelte
@@ -0,0 +1,132 @@
+
+
+
+
+