diff --git a/core/Cargo.lock b/core/Cargo.lock index 1da20db5..0ddd2491 100644 --- a/core/Cargo.lock +++ b/core/Cargo.lock @@ -80,7 +80,7 @@ checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" dependencies = [ "anyhow", "archipelago-container", diff --git a/core/archipelago/Cargo.toml b/core/archipelago/Cargo.toml index 28e858db..0ddd5b2a 100644 --- a/core/archipelago/Cargo.toml +++ b/core/archipelago/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "archipelago" -version = "1.7.33-alpha" +version = "1.7.34-alpha" edition = "2021" description = "Archipelago Bitcoin Node OS - Native backend" authors = ["Archipelago Team"] diff --git a/neode-ui/src/composables/useOnboarding.ts b/neode-ui/src/composables/useOnboarding.ts index 4c70acd3..c9573979 100644 --- a/neode-ui/src/composables/useOnboarding.ts +++ b/neode-ui/src/composables/useOnboarding.ts @@ -24,7 +24,18 @@ export async function isOnboardingComplete(): Promise { // as already-onboarded and skip the wizard entirely). Only fall // back to localStorage if the backend is unreachable. const result = await callWithRetry(() => rpcClient.isOnboardingComplete(), 2) - if (result !== null) return result + if (result !== null) { + // Re-seed the localStorage cache so non-async consumers + // (OnboardingWrapper's useVideoBackground computed, etc.) see the + // right answer after the user clears site data on an already- + // onboarded node. + if (result) { + try { localStorage.setItem('neode_onboarding_complete', '1') } catch {} + } else { + try { localStorage.removeItem('neode_onboarding_complete') } catch {} + } + return result + } return localStorage.getItem('neode_onboarding_complete') === '1' } diff --git a/neode-ui/src/views/Dashboard.vue b/neode-ui/src/views/Dashboard.vue index 571d80cb..c30be20b 100644 --- a/neode-ui/src/views/Dashboard.vue +++ b/neode-ui/src/views/Dashboard.vue @@ -285,17 +285,15 @@ onMounted(() => { loginTransition.setPendingWelcomeTyping(false) }, 4000) } else if (loginTransition.justLoggedIn) { - // Regular re-login — quick interface draw, no triple glitch flashes. - // Just the zoom-in for a short beat, then welcome typing fires fast. + // Regular re-login — no zoom, no glitch. Just land on the + // dashboard and kick off the welcome typing quickly. playDashboardLoadOomph() - showZoomIn.value = true loginTransition.setPendingWelcomeTyping(true) loginTransition.setJustLoggedIn(false) - scheduledTimeout(() => { showZoomIn.value = false }, 1200) scheduledTimeout(() => { loginTransition.setStartWelcomeTyping(true) loginTransition.setPendingWelcomeTyping(false) - }, 600) + }, 300) } window.addEventListener('keydown', handleKioskShortcuts) diff --git a/neode-ui/src/views/OnboardingWrapper.vue b/neode-ui/src/views/OnboardingWrapper.vue index 0b9f3da1..358d1546 100644 --- a/neode-ui/src/views/OnboardingWrapper.vue +++ b/neode-ui/src/views/OnboardingWrapper.vue @@ -122,7 +122,32 @@ const routeBackgrounds: Record = { '/login': 'bg-intro.jpg' // Video loops from splash (same as intro) } -const loginBackground = 'bg-intro-1.jpg' +// Rotate the login background so the lock screen doesn't look +// identical on every logout. Cycles through bg-intro-1..6 using a +// counter persisted to localStorage so subsequent visits advance. +const LOGIN_BACKGROUNDS = [ + 'bg-intro-1.jpg', + 'bg-intro-2.jpg', + 'bg-intro-3.jpg', + 'bg-intro-4.jpg', + 'bg-intro-5.jpg', + 'bg-intro-6.jpg', +] +function pickNextLoginBackground(): string { + try { + const raw = localStorage.getItem('neode_login_bg_idx') + const prev = raw !== null ? parseInt(raw, 10) : -1 + const next = (Number.isFinite(prev) ? prev + 1 : 0) % LOGIN_BACKGROUNDS.length + localStorage.setItem('neode_login_bg_idx', String(next)) + return LOGIN_BACKGROUNDS[next]! + } catch { + return LOGIN_BACKGROUNDS[Math.floor(Math.random() * LOGIN_BACKGROUNDS.length)]! + } +} +const loginBackground = ref(pickNextLoginBackground()) +watch(() => route.path, (p) => { + if (p === '/login') loginBackground.value = pickNextLoginBackground() +}) // Restore video time from splash screen for seamless transition function restoreVideoTime() {