diff --git a/src/app.html b/src/app.html
index f273cc5..e0a3d41 100644
--- a/src/app.html
+++ b/src/app.html
@@ -3,6 +3,12 @@
+
+
+
%sveltekit.head%
diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte
new file mode 100644
index 0000000..ed6a9f3
--- /dev/null
+++ b/src/lib/components/Header.svelte
@@ -0,0 +1,29 @@
+
+
+
diff --git a/src/lib/components/Sidebar.svelte b/src/lib/components/Sidebar.svelte
new file mode 100644
index 0000000..2712955
--- /dev/null
+++ b/src/lib/components/Sidebar.svelte
@@ -0,0 +1,57 @@
+
+
+
diff --git a/src/routes/(app)/+layout.server.ts b/src/routes/(app)/+layout.server.ts
new file mode 100644
index 0000000..c9d39ee
--- /dev/null
+++ b/src/routes/(app)/+layout.server.ts
@@ -0,0 +1,7 @@
+import type { LayoutServerLoad } from './$types';
+
+export const load: LayoutServerLoad = async ({ locals }) => {
+ return {
+ user: locals.user ?? null
+ };
+};
diff --git a/src/routes/(app)/+layout.svelte b/src/routes/(app)/+layout.svelte
new file mode 100644
index 0000000..a4de69b
--- /dev/null
+++ b/src/routes/(app)/+layout.svelte
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ {@render children()}
+
+
+
diff --git a/src/routes/(app)/+page.svelte b/src/routes/(app)/+page.svelte
new file mode 100644
index 0000000..486ef1c
--- /dev/null
+++ b/src/routes/(app)/+page.svelte
@@ -0,0 +1,46 @@
+
+
+
+
+ {#if data.user}
+ Welcome back, {data.user.name}
+ {:else}
+ Welcome to VASH
+ {/if}
+
+
Automated esports match management for osu!
+
+
+
diff --git a/src/routes/(app)/layout.css b/src/routes/(app)/layout.css
new file mode 100644
index 0000000..107af4c
--- /dev/null
+++ b/src/routes/(app)/layout.css
@@ -0,0 +1,43 @@
+@import 'tailwindcss';
+@plugin '@tailwindcss/typography';
+
+@theme {
+ --color-surface-900: #0a0a0f;
+ --color-surface-800: #12121a;
+ --color-surface-700: #1a1a25;
+ --color-surface-600: #24243a;
+ --color-accent: #ff66ab;
+ --color-accent-hover: #ff85be;
+ --color-accent-dim: #ff66ab33;
+ --color-text-primary: #eeeef0;
+ --color-text-secondary: #8888a0;
+ --color-border: #2a2a3d;
+ --font-display: 'Geist', system-ui, sans-serif;
+ --font-body: 'Geist', system-ui, sans-serif;
+ --font-mono: 'Geist Mono', ui-monospace, monospace;
+}
+
+html {
+ background-color: var(--color-surface-900);
+ color: var(--color-text-primary);
+ font-family: var(--font-body);
+}
+
+body {
+ min-height: 100dvh;
+}
+
+/* Scrollbar */
+::-webkit-scrollbar {
+ width: 6px;
+}
+::-webkit-scrollbar-track {
+ background: var(--color-surface-900);
+}
+::-webkit-scrollbar-thumb {
+ background: var(--color-surface-600);
+ border-radius: 3px;
+}
+::-webkit-scrollbar-thumb:hover {
+ background: var(--color-accent);
+}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
deleted file mode 100644
index 0d8eb03..0000000
--- a/src/routes/+layout.svelte
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-{@render children()}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
deleted file mode 100644
index cc88df0..0000000
--- a/src/routes/+page.svelte
+++ /dev/null
@@ -1,2 +0,0 @@
-Welcome to SvelteKit
-Visit svelte.dev/docs/kit to read the documentation
diff --git a/src/routes/layout.css b/src/routes/layout.css
deleted file mode 100644
index 1c4d2a8..0000000
--- a/src/routes/layout.css
+++ /dev/null
@@ -1,2 +0,0 @@
-@import 'tailwindcss';
-@plugin '@tailwindcss/typography';
diff --git a/src/routes/page.svelte.spec.ts b/src/routes/page.svelte.spec.ts
deleted file mode 100644
index d54f00a..0000000
--- a/src/routes/page.svelte.spec.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { page } from 'vitest/browser';
-import { describe, expect, it } from 'vitest';
-import { render } from 'vitest-browser-svelte';
-import Page from './+page.svelte';
-
-describe('/+page.svelte', () => {
- it('should render h1', async () => {
- render(Page);
-
- const heading = page.getByRole('heading', { level: 1 });
- await expect.element(heading).toBeInTheDocument();
- });
-});