/* What a tap looks like before the server answers. * * Every screen under /my is `force-dynamic` and rendered from its own database query, and App * Router keeps the previous screen fully painted until that query comes back. On ward wifi that is * two or three seconds in which nothing at all acknowledges the tap — so people tap again, and the * app reads as frozen. This is the route-level fallback the framework wants for exactly that: it * replaces the body the moment a navigation starts, keeping the app's own chrome so the change * reads as "loading" rather than "gone". * * Deliberately not the tab bar: the nav belongs to the four screens that draw it, and painting one * here would make it flash into existence on the way to a detail screen that has none. The top bar * has no title for the same reason — this fallback covers every route in the group, and inventing a * title would mean printing the wrong one somewhere. */ const INK = "#201e1d"; const GROUND = "#f3f2f2"; /** A grey block standing in for a line of text. Sized in the same 2px system as everything else. */ function Bar({ w, h = 16 }: { w: string; h?: number }) { return
; } export default function StaffLoading() { return ( <>
One moment
{/* Announced once, quietly. The blocks below are decoration and say nothing. */}
Loading…
); }