Repository navigation
2.4.0
MangaCollector 2.4.0
This release delivers three major features: a custom cover system (series + per-volume), a tag-based filter on the dashboard, and a GDPR-compliant account deletion flow — along with substantial work on offline resilience and refined animations.
✨ Highlights
🎨 Custom covers
- Cover picker (
CoverPickerModal): clicking the poster of a series opens a carousel showing every available cover from MyAnimeList and MangaDex, deduplicated and merged. One-click validation sets the new cover, with a server-side whitelist fallback. - Per-volume covers: each volume can now carry its own cover, pulled automatically from MangaDex for series that expose them.
- Floating preview: hover (desktop) or long-press (mobile) on a volume reveals its cover in a floating polaroid-style preview. Keyboard ←/→ navigates between volumes, Escape or outside-click dismisses.
- Respects the adult filter: the preview is suppressed when the content is blurred — the visual contract is honoured.
🏷️ Tag filter on the Dashboard
- New 題 Filters button beside the search bar, with a hanko-red badge when filters are active.
- Button-anchored popover with in-panel search (if >10 tags), live matching-series counter, and a
解 Release allaction. - The popover tracks the button on scroll instead of closing — its position is recomputed frame by frame.
- A "Filtered by: [shōnen ×] [drama ×]" chip row sits between the controls and the grid, visible only when at least one tag is active.
- AND intersection logic (a series must carry every selected tag).
🔐 GDPR account deletion
- Ceremonial two-step flow: The Register (lists what will be erased with staggered animations) then The Act (type your email to confirm, ambient red pulse).
- New backend endpoint
DELETE /api/user/accountthat wipes user data (library, volumes, coffrets, settings) and S3 posters in a single transaction.
⚙️ Sync actions on MangaPage
- Split-button on the edit pencil: the chevron only appears when the series has a
mal_idor amangadex_id. - Portaled dropdown with two actions — Sync from MyAnimeList and Sync from MangaDex.
- Per-source feedback: only the clicked row's icon spins, and the menu stays open until the sync completes.
🔧 Infrastructure & resilience
Offline-first
- Dexie + outbox: cover changes now work offline. Mutations are stored locally, survive reloads, and replay automatically when the backend returns.
- Poster route moved server-side (
PATCH /api/storage/poster/{mal_id}) to resolve a matchit 405 conflict.
Backend-down detection
- The frontend now inspects the content-type of responses to distinguish a real JSON backend from an nginx SPA fallback or a generic Traefik 404.
- nginx config:
/api/*and/auth/*routes now return an explicit 502 instead ofindex.html, killing the false-positive where the backend is down but the client still appears healthy.
Accessibility & polish
titleattributes on every kanji badge, with FR/EN/ES translations.Tooltipcomponent for a CSS-only hover-stable tooltip.- Delayed unmount on modals: closing animations (
fade-out/fade-down-out) actually play instead of an instant unmount. Also fixes the red flash on CoverPickerModal close. - Module-level scroll-lock for stacked modals (fixes broken scroll after closing a second modal).
🐛 Fixes
connectivity: no more false positives when Traefik returns atext/plain404.Volume: cover preview is neutralised when the adult filter is active.
Full changelog: 2.2.0...2.4.0