diff --git a/.changeset/funny-bears-teach.md b/.changeset/funny-bears-teach.md
new file mode 100644
index 00000000..b4afdb06
--- /dev/null
+++ b/.changeset/funny-bears-teach.md
@@ -0,0 +1,7 @@
+---
+'@sveltejs/site-kit': major
+---
+
+Dark mode toggle, dark mode styles changed as well
+
+This is a breaking change because svelte.dev and kit.svelte.dev rely on variables changing based on `@media (prefers-color-scheme: dark)`, and the variables belonging to `:root` rather than `body`
diff --git a/.changeset/pre.json b/.changeset/pre.json
new file mode 100644
index 00000000..a6f19ec8
--- /dev/null
+++ b/.changeset/pre.json
@@ -0,0 +1,8 @@
+{
+ "mode": "pre",
+ "tag": "next",
+ "initialVersions": {
+ "@sveltejs/site-kit": "3.4.0"
+ },
+ "changesets": []
+}
diff --git a/packages/site-kit/package.json b/packages/site-kit/package.json
index e5941d9a..bd7d4234 100644
--- a/packages/site-kit/package.json
+++ b/packages/site-kit/package.json
@@ -24,6 +24,7 @@
"@sveltejs/package": "^1.0.2",
"flexsearch": "^0.7.31",
"svelte": "^3.55.1",
+ "svelte-local-storage-store": "^0.4.0",
"typescript": "^4.9.5",
"vite": "^4.0.4"
},
@@ -32,7 +33,7 @@
"directory": "package"
},
"peerDependencies": {
- "svelte": "^3.54.0",
- "@sveltejs/kit": "^1.0.0"
+ "@sveltejs/kit": "^1.0.0",
+ "svelte": "^3.54.0"
}
}
diff --git a/packages/site-kit/src/lib/components/Nav.svelte b/packages/site-kit/src/lib/components/Nav.svelte
index d912c4c7..6cfc1ed9 100644
--- a/packages/site-kit/src/lib/components/Nav.svelte
+++ b/packages/site-kit/src/lib/components/Nav.svelte
@@ -3,7 +3,9 @@ Top navigation bar for the application. It provides a slot for the left side, th
-->
+
+
+
+
diff --git a/packages/site-kit/src/lib/theme/index.js b/packages/site-kit/src/lib/theme/index.js
new file mode 100644
index 00000000..fc368e63
--- /dev/null
+++ b/packages/site-kit/src/lib/theme/index.js
@@ -0,0 +1,2 @@
+export * from './store';
+export { default as ThemeToggle } from './ThemeToggle.svelte';
diff --git a/packages/site-kit/src/lib/theme/store.js b/packages/site-kit/src/lib/theme/store.js
new file mode 100644
index 00000000..7f5d0892
--- /dev/null
+++ b/packages/site-kit/src/lib/theme/store.js
@@ -0,0 +1,23 @@
+import { browser } from '$app/environment';
+import { persisted } from 'svelte-local-storage-store';
+
+/**
+ * @typedef {{ preference: 'light' | 'dark' | 'system', current: 'light' | 'dark' }} Theme
+ */
+
+/** @type {import('svelte/store').Writable} */
+export const theme = persisted('sveltekit:theme', {
+ preference: 'system',
+ current: browser
+ ? window.matchMedia('(prefers-color-scheme: dark)').matches
+ ? 'dark'
+ : 'light'
+ : 'light'
+});
+
+theme.subscribe(($theme) => {
+ if (!browser) return;
+
+ document.body.classList.remove('light', 'dark');
+ document.body.classList.add($theme.current);
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index dc901c06..0ae20610 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -22,6 +22,9 @@ importers:
svelte:
specifier: ^3.55.1
version: 3.55.1
+ svelte-local-storage-store:
+ specifier: ^0.4.0
+ version: 0.4.0(svelte@3.55.1)
typescript:
specifier: ^4.9.5
version: 4.9.5
@@ -2089,6 +2092,15 @@ packages:
svelte: 3.55.1
dev: true
+ /svelte-local-storage-store@0.4.0(svelte@3.55.1):
+ resolution: {integrity: sha512-ctPykTt4S3BE5bF0mfV0jKiUR1qlmqLvnAkQvYHLeb9wRyO1MdIFDVI23X+TZEFleATHkTaOpYZswIvf3b2tWA==}
+ engines: {node: '>=0.14'}
+ peerDependencies:
+ svelte: ^3.48.0
+ dependencies:
+ svelte: 3.55.1
+ dev: true
+
/svelte2tsx@0.6.0(svelte@3.55.1)(typescript@4.9.5):
resolution: {integrity: sha512-TrxfQkO7CKi8Pu2eC/FyteDCdk3OOeQV5u6z7OjYAsOhsd0ClzAKqxJdvp6xxNQLrbFzf/XvCi9Fy8MQ1MleFA==}
peerDependencies: