diff --git a/src/lib/components/chrome/SplashScreen.svelte b/src/lib/components/chrome/SplashScreen.svelte index fad48ec..05e5415 100644 --- a/src/lib/components/chrome/SplashScreen.svelte +++ b/src/lib/components/chrome/SplashScreen.svelte @@ -49,6 +49,7 @@ notConfigured?: boolean showCards?: boolean showFps?: boolean + showDevOverlay?: boolean pinLen?: number pinCorrect?: string onReady?: () => void @@ -60,7 +61,7 @@ let { mode = 'loading', ringFull = false, failed = false, - notConfigured = false, showCards = true, showFps = false, + notConfigured = false, showCards = true, showFps = false, showDevOverlay = false, pinLen = 4, pinCorrect = '', onReady, onUnlock, onRetry, onBypass, onDismiss, }: Props = $props() @@ -464,7 +465,7 @@ {/if} {/if} - {#if isDev && mode === 'idle' && devMetrics} + {#if isDev && mode === 'idle' && devMetrics && showDevOverlay}
canvas ยท idle splash
diff --git a/src/lib/components/settings/sections/DevToolsSettings.svelte b/src/lib/components/settings/sections/DevToolsSettings.svelte index 9733bbe..b13b4c8 100644 --- a/src/lib/components/settings/sections/DevToolsSettings.svelte +++ b/src/lib/components/settings/sections/DevToolsSettings.svelte @@ -102,10 +102,10 @@ } function triggerSplash() { - if (appState.idleSplash) return + if (appState.devSplash) return splashTriggered = true setTimeout(() => splashTriggered = false, 200) - appState.idleSplash = true + appState.devSplash = true } async function testWindowsHello() { diff --git a/src/lib/state/app.svelte.ts b/src/lib/state/app.svelte.ts index 8e4e1f3..2f302d1 100644 --- a/src/lib/state/app.svelte.ts +++ b/src/lib/state/app.svelte.ts @@ -36,6 +36,7 @@ export const appState = $state({ toasts: [] as unknown[], appDir: '', idleSplash: false, + devSplash: false, }) export function setSettingsOpen(next: boolean) { app.setSettingsOpen(next) } diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 3db14b5..d16a939 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -142,20 +142,38 @@ if (appState.status === 'booting') splashDismissed = false }) - let idleSplashLocked = false - - function showIdleSplash() { - if (idleSplashLocked || appState.idleSplash) return - appState.idleSplash = true - } + let idleTimer: ReturnType | null = null + let idleDismissLock = false function onIdleDismiss() { - if (idleSplashLocked) return - idleSplashLocked = true + if (idleDismissLock) return + idleDismissLock = true appState.idleSplash = false - setTimeout(() => { idleSplashLocked = false }, 400) + setTimeout(() => { idleDismissLock = false }, 400) } + function armIdleTimer() { + if (idleTimer !== null) clearTimeout(idleTimer) + const mins = settingsState.settings.idleTimeoutMin ?? 5 + if (mins <= 0) return + idleTimer = setTimeout(() => { + if (appState.status === 'ready' && !appState.idleSplash) appState.idleSplash = true + }, mins * 60_000) + } + + $effect(() => { + if (appState.status !== 'ready') return + + const events = ['mousemove', 'mousedown', 'keydown', 'touchstart', 'touchmove', 'wheel', 'click'] as const + for (const e of events) document.addEventListener(e, armIdleTimer, { capture: true, passive: true }) + armIdleTimer() + + return () => { + if (idleTimer !== null) { clearTimeout(idleTimer); idleTimer = null } + for (const e of events) document.removeEventListener(e, armIdleTimer, { capture: true }) + } + }) + function onSplashRetry() { import('$lib/state/boot.svelte').then(({ retryBoot }) => { retryBoot(appState.authMode ?? 'NONE', appState.authUser ?? '', appState.authPass ?? '') @@ -187,6 +205,10 @@ {/if} +{#if appState.devSplash} + appState.devSplash = false} /> +{/if} + {#if showApp} {#if strippedLayout} {@render children()}