feat: redesign libraries page UI with fan thumbnails and modal settings

- Replace thumbnail mosaic with fan/arc layout using series covers as background
- Move library settings from dropdown to full-page portal modal with sections
- Move FolderPicker modal to portal for proper z-index stacking
- Add descriptions to each setting for better clarity
- Move delete button to card header, compact config tags
- Add i18n keys for new labels and descriptions (en/fr)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-21 07:47:36 +01:00
parent 560087a897
commit 629708cdd0
5 changed files with 351 additions and 247 deletions

View File

@@ -140,6 +140,9 @@ const en: Record<TranslationKey, string> = {
"libraries.imminent": "Imminent",
"libraries.nextMetadataRefresh": "Next metadata refresh: {{time}}",
"libraries.nextMetadataRefreshShort": "Meta.: {{time}}",
"libraries.scanLabel": "Scan: {{mode}}",
"libraries.watcherLabel": "File watch",
"libraries.metaRefreshLabel": "Meta refresh: {{mode}}",
"libraries.index": "Index",
"libraries.fullIndex": "Full",
"libraries.batchMetadata": "Batch metadata",
@@ -157,14 +160,22 @@ const en: Record<TranslationKey, string> = {
"librarySeries.noBooksInSeries": "No books in this series",
// Library actions
"libraryActions.autoScan": "Auto scan",
"libraryActions.fileWatch": "File watch ⚡",
"libraryActions.schedule": "📅 Schedule",
"libraryActions.settingsTitle": "Library settings",
"libraryActions.sectionIndexation": "Indexation",
"libraryActions.sectionMetadata": "Metadata",
"libraryActions.autoScan": "Scheduled scan",
"libraryActions.autoScanDesc": "Automatically scan for new and modified files",
"libraryActions.fileWatch": "Real-time file watch",
"libraryActions.fileWatchDesc": "Detect file changes instantly via filesystem events",
"libraryActions.schedule": "Frequency",
"libraryActions.provider": "Provider",
"libraryActions.fallback": "Fallback",
"libraryActions.providerDesc": "Source used to fetch series and volume metadata",
"libraryActions.fallback": "Fallback provider",
"libraryActions.fallbackDesc": "Used when the primary provider returns no results",
"libraryActions.default": "Default",
"libraryActions.none": "None",
"libraryActions.metadataRefreshSchedule": "Refresh meta.",
"libraryActions.metadataRefreshSchedule": "Auto-refresh",
"libraryActions.metadataRefreshDesc": "Periodically re-fetch metadata for existing series",
"libraryActions.saving": "Saving...",
// Library sub-page header

View File

@@ -138,6 +138,9 @@ const fr = {
"libraries.imminent": "Imminent",
"libraries.nextMetadataRefresh": "Prochain rafraîchissement méta. : {{time}}",
"libraries.nextMetadataRefreshShort": "Méta. : {{time}}",
"libraries.scanLabel": "Scan : {{mode}}",
"libraries.watcherLabel": "Surveillance fichiers",
"libraries.metaRefreshLabel": "Rafraîch. méta. : {{mode}}",
"libraries.index": "Indexer",
"libraries.fullIndex": "Complet",
"libraries.batchMetadata": "Métadonnées en lot",
@@ -155,14 +158,22 @@ const fr = {
"librarySeries.noBooksInSeries": "Aucun livre dans cette série",
// Library actions
"libraryActions.autoScan": "Scan auto",
"libraryActions.fileWatch": "Surveillance fichiers ⚡",
"libraryActions.schedule": "📅 Planification",
"libraryActions.settingsTitle": "Paramètres de la bibliothèque",
"libraryActions.sectionIndexation": "Indexation",
"libraryActions.sectionMetadata": "Métadonnées",
"libraryActions.autoScan": "Scan planifié",
"libraryActions.autoScanDesc": "Scanner automatiquement les fichiers nouveaux et modifiés",
"libraryActions.fileWatch": "Surveillance en temps réel",
"libraryActions.fileWatchDesc": "Détecter les changements de fichiers instantanément",
"libraryActions.schedule": "Fréquence",
"libraryActions.provider": "Fournisseur",
"libraryActions.fallback": "Secours",
"libraryActions.providerDesc": "Source utilisée pour récupérer les métadonnées des séries",
"libraryActions.fallback": "Fournisseur de secours",
"libraryActions.fallbackDesc": "Utilisé quand le fournisseur principal ne retourne aucun résultat",
"libraryActions.default": "Par défaut",
"libraryActions.none": "Aucun",
"libraryActions.metadataRefreshSchedule": "Rafraîchir méta.",
"libraryActions.metadataRefreshSchedule": "Rafraîchissement auto",
"libraryActions.metadataRefreshDesc": "Re-télécharger périodiquement les métadonnées existantes",
"libraryActions.saving": "Enregistrement...",
// Library sub-page header