From 271f1cb868caf6d23b2bd1026b4cfc94a8205567 Mon Sep 17 00:00:00 2001 From: Timon Date: Mon, 11 May 2026 11:49:12 +0200 Subject: [PATCH] feat(web): Add metadata overlay to slideshow (#24627) * feat: add slideshow metadata overlay and settings * Introduced a new SlideshowMetadataOverlay component to display image information during slideshows. * Updated slideshow settings modal to include options for showing the metadata overlay and selecting its display mode (Description Only or Full). * Added corresponding translations and store management for the new overlay features. * remove noisy log * constant opacity * 2nd pass * more * use text components * lint --- i18n/en.json | 4 ++ .../asset-viewer/AssetViewer.svelte | 5 ++ .../SlideshowMetadataOverlay.svelte | 65 +++++++++++++++++++ .../settings/SettingDropdown.svelte | 4 +- .../lib/modals/SlideshowSettingsModal.svelte | 40 +++++++++++- web/src/lib/stores/slideshow.store.ts | 12 ++++ 6 files changed, 127 insertions(+), 3 deletions(-) create mode 100644 web/src/lib/components/asset-viewer/SlideshowMetadataOverlay.svelte diff --git a/i18n/en.json b/i18n/en.json index 5e073559ac..a15666aed4 100644 --- a/i18n/en.json +++ b/i18n/en.json @@ -2192,6 +2192,7 @@ "show_schema": "Show schema", "show_search_options": "Show search options", "show_shared_links": "Show shared links", + "show_slideshow_metadata_overlay": "Show image info overlay", "show_slideshow_transition": "Show slideshow transition", "show_supporter_badge": "Supporter badge", "show_supporter_badge_description": "Show a supporter badge", @@ -2207,6 +2208,9 @@ "skip_to_folders": "Skip to folders", "skip_to_tags": "Skip to tags", "slideshow": "Slideshow", + "slideshow_metadata_overlay_mode": "Overlay content", + "slideshow_metadata_overlay_mode_description_only": "Description only", + "slideshow_metadata_overlay_mode_full": "Full", "slideshow_repeat": "Repeat slideshow", "slideshow_repeat_description": "Loop back to beginning when slideshow ends", "slideshow_settings": "Slideshow settings", diff --git a/web/src/lib/components/asset-viewer/AssetViewer.svelte b/web/src/lib/components/asset-viewer/AssetViewer.svelte index de6e96fa72..e2b53c8ef1 100644 --- a/web/src/lib/components/asset-viewer/AssetViewer.svelte +++ b/web/src/lib/components/asset-viewer/AssetViewer.svelte @@ -49,6 +49,7 @@ import OcrButton from './OcrButton.svelte'; import PhotoViewer from './PhotoViewer.svelte'; import SlideshowBar from './SlideshowBar.svelte'; + import SlideshowMetadataOverlay from './SlideshowMetadataOverlay.svelte'; import VideoViewer from './VideoWrapperViewer.svelte'; export type AssetCursor = { @@ -588,6 +589,10 @@ {/if} + + {#if $slideshowState !== SlideshowState.None} + + {/if} {#if $slideshowState === SlideshowState.None && showNavigation && !assetViewerManager.isShowEditor && !assetViewerManager.isFaceEditMode && nextAsset} diff --git a/web/src/lib/components/asset-viewer/SlideshowMetadataOverlay.svelte b/web/src/lib/components/asset-viewer/SlideshowMetadataOverlay.svelte new file mode 100644 index 0000000000..e1865e2c14 --- /dev/null +++ b/web/src/lib/components/asset-viewer/SlideshowMetadataOverlay.svelte @@ -0,0 +1,65 @@ + + +{#if shouldShow} +
+
+
+ {#if description} + {description} + {/if} + {#if $slideshowMetadataOverlayMode !== SlideshowMetadataOverlayMode.DescriptionOnly} +
+ {#if dateString} + {dateString} + {/if} + {#if locationString} + {locationString} + {/if} +
+ {/if} +
+
+
+{/if} diff --git a/web/src/lib/components/shared-components/settings/SettingDropdown.svelte b/web/src/lib/components/shared-components/settings/SettingDropdown.svelte index e65cf8e479..872bf688ce 100644 --- a/web/src/lib/components/shared-components/settings/SettingDropdown.svelte +++ b/web/src/lib/components/shared-components/settings/SettingDropdown.svelte @@ -11,6 +11,7 @@ options: RenderedOption[]; selectedOption: RenderedOption; isEdited?: boolean; + disabled?: boolean; onToggle: (option: RenderedOption) => void; children?: Snippet; } @@ -21,12 +22,13 @@ options, selectedOption = $bindable(), isEdited = false, + disabled = false, onToggle, children, }: Props = $props(); -
+