Theme

Initialisation

src/routes/layout.svelte

<script>
    import { theme } from 'gros/theme'

    theme.init()
</script>

Vérifie et applique les préférences de l’utilisateur (défini dans les options du navigateur ou dans les cookies).

Switch

<script>
    import { theme } from 'gros/theme'
</script>

<button onclick={() => theme.switch()} class="btn">
    {#if theme.value === 'dark'}
        ☀️
    {:else}
        🌙
    {/if}
</button>

Flashbang

Définir la préférence de l’utilisateur côté serveur à l’aide du cookie “siteTheme”.

src/hooks.server.ts

export const handle = async ({ event, resolve }) => {
    const theme = event.cookies.get('siteTheme')
    if (theme) {
        return await resolve(event, {
            transformPageChunk: ({ html }) => html.replace(`data-theme=""`, `data-theme="${theme}"`)
        })
    }

    return await resolve(event)
}

src/app.html

<!DOCTYPE html>
<html data-theme="">
    <head>
        [...]