Skip to content

2.4.0

Choose a tag to compare

@Dim145 Dim145 released this 23 Apr 12:11
· 339 commits to main since this release

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 all action.
  • 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/account that 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_id or a mangadex_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 of index.html, killing the false-positive where the backend is down but the client still appears healthy.

Accessibility & polish

  • title attributes on every kanji badge, with FR/EN/ES translations.
  • Tooltip component 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 a text/plain 404.
  • Volume: cover preview is neutralised when the adult filter is active.

Full changelog: 2.2.0...2.4.0