Compare commits

..

No commits in common. "91e1059f56842db51140c097bafbbf75cbe31f7d" and "2efed23afd334d00ca4a287fabda7b70fea86ca9" have entirely different histories.

2 changed files with 15 additions and 25 deletions

View File

@ -426,8 +426,6 @@ async function handleSetup() {
playLoginSuccessWhoosh()
loginTransition.setJustCompletedOnboarding(true)
loginTransition.setJustLoggedIn(true)
// First password setup counts as the first login (video static rotation).
try { localStorage.setItem('neode_first_login_done', '1') } catch { /* ignore */ }
await new Promise(r => setTimeout(r, 520))
await router.replace(loginRedirectTo.value).catch(() => {
window.location.href = loginRedirectTo.value
@ -540,17 +538,13 @@ async function handleTotpVerify() {
/** A login right after the onboarding wizard (flag set by OnboardingDone)
* gets the FULL dashboard entrance zoom + oomph even though it's a
* regular password login (e.g. the demo). Subsequent logins stay
* deliberately low-key (justLoggedIn only).
* Also stamps neode_first_login_done: the login page keeps the intro VIDEO
* background until someone has logged in once (OnboardingWrapper reads it
* to pick video vs the rotating static backgrounds). */
* deliberately low-key (justLoggedIn only). */
function consumeOnboardingFinale() {
try {
if (sessionStorage.getItem('archy_onboarding_finale') === '1') {
sessionStorage.removeItem('archy_onboarding_finale')
loginTransition.setJustCompletedOnboarding(true)
}
localStorage.setItem('neode_first_login_done', '1')
} catch { /* ignore */ }
}

View File

@ -86,22 +86,22 @@ const videoBackgroundRoutes = ['/onboarding/intro', '/login']
// Login uses video when coming from splash, or static + glitch when direct
const isLoginRoute = computed(() => route.path === '/login')
// Check if current route should use video background.
// The FIRST login (nobody has logged in / set a password yet) keeps the VIDEO
// running so the splash login handoff is one continuous shot; only after a
// successful login does /login switch to the rotating static backgrounds.
// Login.vue sets neode_first_login_done on every successful login.
const hasLoggedInBefore = () => {
// True once onboarding is complete. Used to skip the intro video on
// the /login route so that returning (logged-out) users go straight
// to the screensaver-style static + glitch background instead of
// replaying the full intro every time.
const onboardingDone = computed(() => {
try {
return localStorage.getItem('neode_first_login_done') === '1'
return localStorage.getItem('neode_onboarding_complete') === '1'
} catch {
return false
}
}
})
// Check if current route should use video background
const useVideoBackground = computed(() => {
if (!videoBackgroundRoutes.includes(route.path)) return false
if (route.path === '/login' && hasLoggedInBefore()) return false
if (route.path === '/login' && onboardingDone.value) return false
return true
})
@ -122,12 +122,9 @@ const routeBackgrounds: Record<string, string> = {
'/login': 'bg-intro.jpg' // Video loops from splash (same as intro)
}
// Until the user has logged in (or set their password) once, the login
// background stays PINNED to the same still the intro video ends on the
// video login handoff only reads as one continuous shot when both show the
// identical frame. From the second login onward the lock screen rotates
// through bg-intro-1..6 for variety (counter persisted in localStorage).
// Login.vue sets neode_first_login_done on every successful login.
// 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.webp',
'bg-intro-2.jpg',
@ -138,14 +135,13 @@ const LOGIN_BACKGROUNDS = [
]
function pickNextLoginBackground(): string {
try {
if (localStorage.getItem('neode_first_login_done') !== '1') return 'bg-intro.jpg'
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 'bg-intro.jpg'
return LOGIN_BACKGROUNDS[Math.floor(Math.random() * LOGIN_BACKGROUNDS.length)]!
}
}
const loginBackground = ref(pickNextLoginBackground())