ADR-042 — ISS Explorer low-end fallback (?view=list + heuristics)
Status · Accepted
Date · 2026-05-05
Closes · RFC-013 (with ADR-040, ADR-041)
TA anchor · §components
Related · ADR-025 (accessibility), PRD-010
Context
RFC-013 OQ-3 requires a non-WebGL path and automatic degradation on weak devices.
Decision
URL override
?view=list forces list mode: alphabetical module list, same src/lib/components/IssModulePanel.svelte content. No WebGL initialisation — no THREE.WebGLRenderer, no GLB fetch.
Auto-fallback
After 3D mode starts, measure FPS for ~2 s via requestAnimationFrame deltas. If sustained < 20 fps, switch to list mode and dispose renderer, scene, and loader geometry.
If navigator.deviceMemory is defined and < 4, skip 3D and open in list mode immediately (Chrome/Android hint).
If WebGL context creation fails, list mode.
UX
Single reactive viewMode: '3d' | 'list' — avoid mounting canvas then unmounting in a way that flashes white; prefer deciding mode before first paint when URL/device hints demand list.
Toggle
HUD control syncs URL (view search param) so shareable links reproduce mode.
Consequences
Positive: Accessibility + low-end coverage without maintaining two full feature sets.
Negative: deviceMemory is non-standard — treated as optional signal only.
Implementation notes
FPS sampler runs only when viewMode === '3d' after GLB load completes.