Extract three AppInner state clusters into hooks:
- useMainPanelTaskDetail: the main-panel task-detail snapshot + initial tab;
setTask accepts the SetStateAction updater form so the embedded detail can
patch the snapshot on task updates.
- useBoardScrollRestore: the board scroll snapshot refs, capture, and the
double-requestAnimationFrame restore effect keyed on taskView; exposes
requestRestore for App to schedule a restore on detail close.
- usePoppedOutTasks: the popped-out task-detail windows (dedupe-by-id popOut,
close-by-id).
App keeps the navigation-history composition (openTaskDetailInMainPanel /
closeTaskDetailMainPanel) and now consumes the hooks' primitives.
Behavior-preserving; App.test.tsx identical (5 pre-existing failures, none
introduced). Verified by typecheck, eslint, and 5 renderHook tests.
Completes U6 (App.tsx module-breakup plan).