bookshelves.js used direct Gitea API fetch() for commit banners and
PR bookshelves. weather.js used direct Open-Meteo fetch() for weather.
Route both through their respective data/ modules (data/gitea.js and
data/weather.js). Add fetchMergedPRs() to data/gitea.js.
The one remaining fetch() in weather.js (runPortalHealthChecks) is a
no-cors connectivity probe, not data collection — accepted exception.
Fixes#421
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>