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: