Step 2 of the gui/app.py + gui/preview.py structural refactor. Pure move: the popout viewport NamedTuple and the drift-tolerance constant are now in their own module under popout/. preview.py grows another re-export shim line so FullscreenPreview's method bodies (which reference Viewport and _DRIFT_TOLERANCE by bare name) keep working unchanged. Shim removed in commit 14. See docs/REFACTOR_PLAN.md.