- Add ThemeToggle segmented control (Light/Dark/System) with DOM class toggle - Use getStored() lazy init and applyTheme() for side-effect-free render - Stub localStorage and matchMedia in tests for Node v25 compatibility - Wire ThemeToggle into App.tsx header flex row next to h1 - Change App outer div to bg-surface, h1 to text-on-surface - All 7 ThemeToggle unit tests passing; 166 total tests green