Repository navigation
Polish pass over the installed-app surface on iPhone.
Touch targets (#7)
--control-h was 38px, under the 44px minimum Apple's HIG and Material both set — while .nav-link already honoured 44px on mobile, so the icon controls were an inconsistency rather than a considered density.
Bumped under @media (pointer: coarse): keyed on the pointer, not the viewport, because a narrow desktop window is still mouse-driven and 38px is the deliberate marginalia density there. One token covers topbar buttons, the theme toggle, stepper controls, search palette rows and the flashcard buttons; .sidebar-close loses its magic 40px and sizes off the token too.
Launch screens (#7)
An installed guide showed a blank screen from tap to first paint. iOS has no manifest-driven splash — WebKit's manifest support is still partial, background_color doesn't produce one, and any image whose media query doesn't match the launch window exactly is ignored — so this is a table of 19 device classes × 2 orientations, rendered as a field of the course accent with the >_ mark centred.
One table generates both the link tags and the build's render list, so a tag can't outlive its file — the failure that would silently reintroduce the blank launch.
Drawer scroll containment (#7)
Reaching the end of a long nav in the mobile drawer handed the remaining momentum to the article behind it. overscroll-behavior: contain.
Installed-app navigation (#6)
course.hubUrl points at a different origin than the guide, so it falls outside the PWA scope: tapping Alle kurs in the installed app handed the URL to an in-app browser sheet instead of navigating, which read as the app breaking. Hidden under (display-mode: standalone), scoped to that one link so the course nav is untouched. It still shows in every browser tab.
Also
Manifest id, so app identity doesn't ride on start_url.
Launch images encode at compressionLevel: 9 (24 kB rather than 84 kB on the largest). palette: true would reach 8 kB but was rejected: it turned the build from 4.1s into 11.9s, and that cost would land in every consuming repo's CI on every deploy.
Upgrading
No schema change — SCHEMA_VERSION stays 4, no migration needed. Bump your pin to #v4.2.0 and run pnpm install. The launch images and icons are generated from course.yaml's accent at build; nothing to author.