your personal website on atproto - mirror blento.app
at npmx 37 lines 1.0 kB view raw
1<script lang="ts"> 2 import { browser } from '$app/environment'; 3 4 let { 5 accentColor = 'pink', 6 baseColor = 'stone' 7 }: { 8 accentColor?: string; 9 baseColor?: string; 10 } = $props(); 11 12 const allAccentColors = [ 13 'red', 'orange', 'amber', 'yellow', 'lime', 'green', 'emerald', 'teal', 14 'cyan', 'sky', 'blue', 'indigo', 'violet', 'purple', 'fuchsia', 'pink', 'rose' 15 ]; 16 const allBaseColors = ['gray', 'stone', 'zinc', 'neutral', 'slate']; 17 18 const safeJson = (v: string) => JSON.stringify(v).replace(/</g, '\\u003c'); 19 20 // SSR: inline script for initial page load (no FOUC) 21 let script = $derived( 22 `<script>(function(){document.documentElement.classList.add(${safeJson(accentColor)},${safeJson(baseColor)});})();<` + 23 '/script>' 24 ); 25 26 // Client: reactive effect for client-side navigations 27 $effect(() => { 28 if (!browser) return; 29 const el = document.documentElement; 30 el.classList.remove(...allAccentColors, ...allBaseColors); 31 el.classList.add(accentColor, baseColor); 32 }); 33</script> 34 35<svelte:head> 36 {@html script} 37</svelte:head>