The header's feed <select> is now a funnel button that opens a modal with
an "All feeds" checkbox and one checkbox per feed with unread items. The
selection is either "All feeds" or at least one feed, is applied once when
the modal closes, and is persisted in localStorage.
- feedFilter holds string[] | null; setFeedFilter is a no-op when the
selection is unchanged (order-insensitive), sparing callers the
scroll/mark-read side effects.
- Selected feeds stay listed at 0 unread so they can be unchecked; titles
whose feed no longer exists are pruned after each fetch.
- The persisted filter is cleared on logout and on 401 (handler extracted
to httpAuthInterceptor.js so it is unit-testable).
- The modal locks body scroll while open so scrolling behind it can't
mark articles read.