The boot shows nothing, and every screen opens at its top
Two things the phone found. The splash's loading state was applied by main.js — but this is a module script, so the browser paints the markup, placeholders and all, before it runs: LEVEL 1 stood there and then snapped to the real values. The busy class ships in index.html now and main.js only takes it off; the keyboard hints hide with it. And #intro is the one scroller the menus share, so a scroll earned deep in the stats screen outlived it: going back put the splash up scrolled, with its buttons off screen. go() resets it, at the funnel every stage change passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
3d9400cd25
commit
380f98f3a3
3 files changed
+34
-3
No files matched your search
+14
-2
@@ -84,7 +84,17 @@ let pickedTour = remembered('tour') || TOURS[0].id;
|
||||
// every stage change is a gesture, so it is also a safe place to (re)start the theme. The setup
|
||||
// screen syncs its picker rows on entry: the identity screen writes the same picked* state, and
|
||||
// rows that only ever toggle on their OWN taps would keep showing the boot-time selection.
|
||||
const go = stage => { if (stage === 'setup') syncSetup(); if (stage === 'train') buildTrain(); intro.dataset.stage = stage; menuMusic(); };
|
||||
// EVERY SCREEN OPENS AT ITS TOP (2026-08-31, Oliver: scroll the stats to the bottom, swipe back,
|
||||
// and the splash comes up scrolled with its buttons off screen). #intro is the one scroller the
|
||||
// menus share, so its offset outlives the stage that earned it unless it is reset here — the one
|
||||
// place every stage change goes through.
|
||||
const go = stage => {
|
||||
if (stage === 'setup') syncSetup();
|
||||
if (stage === 'train') buildTrain();
|
||||
intro.dataset.stage = stage;
|
||||
intro.scrollTop = 0;
|
||||
menuMusic();
|
||||
};
|
||||
|
||||
// --- MODE selection in TWO STEPS (config.MENU + config.MODES): three posters on top, and the
|
||||
// picked one deals its own second step underneath — classic deals the difficulty chips, zombie
|
||||
@@ -976,7 +986,9 @@ setTimeout(() => { profileDone = true; }, 4000);
|
||||
// whatever the fallback was. onerror counts too (render.js), so a dead network still finishes the
|
||||
// bar rather than parking the player on it forever.
|
||||
const splash = document.getElementById('splash'), bootFill = document.querySelector('#boot i');
|
||||
splash.classList.add('busy');
|
||||
splash.classList.add('busy'); // belt and braces: the class ships in index.html so the very
|
||||
// first paint is already the loading state — this only matters if
|
||||
// that ever gets dropped from the markup
|
||||
const loaded = () => !splash.classList.contains('busy');
|
||||
// setInterval, NOT requestAnimationFrame: rAF does not fire in a hidden tab, and a phone that
|
||||
// launches the app and locks — or an install that loads in the background — would come back to a
|
||||
|
||||
Reference in new issue
Block a user