+layout.svelte
1 <script lang="ts"> 2 import { friendkit } from '$lib/store.svelte'; 3 import { page } from '$app/state'; 4 import { goto } from '$app/navigation'; 5 import { resolve } from '$app/paths'; 6 import { accessibility } from '$lib/accessibility.svelte'; 7 import favicon from '$lib/assets/favicon.svg'; 8 import { UIRoot } from 'svelte-akui'; 9 import '$lib/styles/global.css'; 10 11 let { children } = $props(); 12 13 // Global onboarding redirect logic 14 $effect(() => { 15 const isAuth = friendkit.accessToken && friendkit.instance; 16 const hasSync = !!friendkit.lastSync; 17 const path = page.url.pathname; 18 19 if (isAuth && !hasSync && path !== '/' && !path.startsWith('/callback') && path !== '/firstrun') { 20 goto(resolve('/firstrun')).catch(console.error); 21 } 22 }); 23 24 // The 'accessibility' store handles theme and contrast detection globally. 25 </script> 26 27 <svelte:head> 28 <link rel="icon" href={favicon} /> 29 <title>Friendkit - Mastodon Friend Manager</title> 30 </svelte:head> 31 32 <UIRoot> 33 {@render children()} 34 </UIRoot> 35 36 <style> 37 </style>