fix: prevent white background flash and overscroll on Safari iOS

- Set background-color: #101010 on html/body/.App so the Safari iOS
  rubber-band overscroll area is dark instead of white
- Always render body background style in ViewLoader (not just during
  Suspense fallback) so keyColour param and --background-color-override
  propagate to the body for the overscroll region
- Add viewport-fit=cover, apple-mobile-web-app meta tags for proper
  iOS notch/safe-area handling
- Fix manifest.json background_color from #ffffff to #101010
- Align theme_color across both manifests to #101010

https://claude.ai/code/session_016z5vU45pexTdkQV2eHJqh4
This commit is contained in:
Claude
2026-05-09 16:35:53 +00:00
parent fe44b33da2
commit e9de1ec19f
5 changed files with 13 additions and 5 deletions
+3 -1
View File
@@ -4,8 +4,10 @@
<meta charset="utf-8" /> <meta charset="utf-8" />
<base href="/" /> <base href="/" />
<link rel="icon" href="favicon.ico" /> <link rel="icon" href="favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" /> <meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<meta name="theme-color" content="#101010" /> <meta name="theme-color" content="#101010" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent" />
<meta name="ontime" content="ontime - time keeping for live events" /> <meta name="ontime" content="ontime - time keeping for live events" />
<link rel="apple-touch-icon" href="ontime-logo.png" /> <link rel="apple-touch-icon" href="ontime-logo.png" />
<link rel="icon" type="image/png" href="ontime-logo.png" /> <link rel="icon" type="image/png" href="ontime-logo.png" />
+2 -2
View File
@@ -14,6 +14,6 @@
"scope": "./", "scope": "./",
"start_url": "./", "start_url": "./",
"display": "", "display": "",
"theme_color": "#121212", "theme_color": "#101010",
"background_color": "#ffffff" "background_color": "#101010"
} }
+1 -1
View File
@@ -2,7 +2,7 @@
"name": "", "name": "",
"short_name": "", "short_name": "",
"icons": [{ "src": "ontime-logo.png", "sizes": "295x295", "type": "image/png" }], "icons": [{ "src": "ontime-logo.png", "sizes": "295x295", "type": "image/png" }],
"theme_color": "#2B5ABC", "theme_color": "#101010",
"background_color": "#101010", "background_color": "#101010",
"display": "standalone" "display": "standalone"
} }
+2
View File
@@ -81,6 +81,8 @@ html,
user-select: none; user-select: none;
-webkit-app-region: drag; -webkit-app-region: drag;
isolation: isolate; isolation: isolate;
// prevents Safari iOS from showing white in the overscroll (rubber-band) area
background-color: $ui-black;
} }
// reset button styles // reset button styles
+5 -1
View File
@@ -23,15 +23,19 @@ export default function ViewLoader({ children }: PropsWithChildren) {
const searchParams = new URLSearchParams(window.location.search); const searchParams = new URLSearchParams(window.location.search);
const colourFromParams = searchParams.get('keyColour') ?? '#101010'; const colourFromParams = searchParams.get('keyColour') ?? '#101010';
// always keep body background in sync so Safari iOS overscroll area matches the view
const bodyBgStyle = `body { background-color: var(--background-color-override, ${colourFromParams}); }`;
return ( return (
<Suspense <Suspense
fallback={ fallback={
<> <>
<style>{`body { background: var(--background-color-override, ${colourFromParams}); }`}</style> <style>{bodyBgStyle}</style>
<Loader /> <Loader />
</> </>
} }
> >
<style>{bodyBgStyle}</style>
<OverrideStyles /> <OverrideStyles />
{children} {children}
</Suspense> </Suspense>