Notebook
@@ -60,13 +64,50 @@
{:else}
Sign in
{/if}
+
@@ -96,7 +137,7 @@
bind:value={searchQuery}
placeholder="Search"
aria-label="Search notes and questions"
- class="border-rule text-ink placeholder:text-faint focus:border-primary w-full rounded-none border bg-white px-3 py-2 text-sm tracking-wide transition-colors outline-none"
+ class="border-rule text-ink placeholder:text-faint focus:border-primary bg-surface w-full rounded-none border px-3 py-2 text-sm tracking-wide transition-colors outline-none"
/>
(mobileMenuOpen = false)}
@@ -129,6 +170,43 @@
onclick={() => (mobileMenuOpen = false)}>Sign in
{/if}
+
{/if}
diff --git a/src/lib/stores/theme.ts b/src/lib/stores/theme.ts
new file mode 100644
index 0000000..803abf0
--- /dev/null
+++ b/src/lib/stores/theme.ts
@@ -0,0 +1,29 @@
+import { get, writable } from "svelte/store";
+
+export type Theme = "light" | "dark";
+
+const STORAGE_KEY = "dsec_theme";
+
+function getInitialTheme(): Theme {
+ if (typeof window === "undefined") return "light";
+ const stored = localStorage.getItem(STORAGE_KEY);
+ if (stored === "light" || stored === "dark") return stored;
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
+}
+
+export const theme = writable
(getInitialTheme());
+
+function applyTheme(value: Theme) {
+ const root = document.documentElement;
+ root.classList.toggle("dark", value === "dark");
+ root.style.colorScheme = value;
+ const meta = document.querySelector('meta[name="theme-color"]');
+ if (meta) meta.setAttribute("content", value === "dark" ? "#131014" : "#ffffff");
+}
+
+export function toggleTheme() {
+ const next: Theme = get(theme) === "dark" ? "light" : "dark";
+ localStorage.setItem(STORAGE_KEY, next);
+ theme.set(next);
+ applyTheme(next);
+}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 031276e..cea1dff 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -26,14 +26,14 @@
-
+
{@render children()}