Add Darkmode to sveltekit

How to add darkmode to a sveltekit project

hooks.server.ts

/** @type {import('@sveltejs/kit').Handle} */
const darkMode: Handle = async ({ event, resolve }) => {
    const cookie = event.request.headers.get('cookie');
    const darkModeCookie = cookie?.split(';').find((c) => c.trim().startsWith('darkmode=true')) ? true : false;

    const response = await resolve(event, {
        transformPageChunk: ({ html }) => html.replace('%darkmode%', darkModeCookie ? 'dark' : '')
    });

    return response;
};

export const handle = sequence(darkMode);

app.html

<body class="%darkmode%">

If you are using tailwind edit the following config

tailwind.config.csj

module.exports = {
    darkMode: 'selector'
}

ToggleDarkmode.svelte

<script>
    import { onMount } from 'svelte';

    let darkModeState = false;

    function toggleDarkmode() {
        darkModeState = !darkModeState;
        const darkMode = document.cookie.includes('darkmode=true');
        document.cookie = `darkmode=${!darkMode};path=/`;
        if (darkMode) document.body.classList.remove('dark');
        if (!darkMode) document.body.classList.add('dark');
    }

    onMount(() => {
        darkModeState = document.cookie.includes('darkmode=true');
    });
</script>

<button on:click={toggleDarkmode}>Toggle Darkmode</button>

Now the body element is gonna have the dark class once the cookie is set.