diff --git a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte index 3a5105629..e4deffeef 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.svelte @@ -182,7 +182,12 @@ {#if !asset.isReadOnly || !asset.isExternal} dispatch('delete')} title="Delete" /> {/if} -
(isShowAssetOptions = false)}> +
(isShowAssetOptions = false), + onEscape: () => (isShowAssetOptions = false), + }} + > {#if isShowAssetOptions} diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index be5d13e5f..c49faeaba 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -50,6 +50,7 @@ import SlideshowBar from './slideshow-bar.svelte'; import VideoViewer from './video-viewer.svelte'; import CreateSharedLinkModal from '$lib/components/shared-components/create-share-link-modal/create-shared-link-modal.svelte'; + import FocusTrap from '$lib/components/shared-components/focus-trap.svelte'; export let assetStore: AssetStore | null = null; export let asset: AssetResponseDto; @@ -514,239 +515,255 @@ -
- - {#if $slideshowState === SlideshowState.None} -
- 0} - showShareButton={shouldShowShareModal} - on:back={closeViewer} - on:showDetail={showDetailInfoHandler} - on:download={() => downloadFile(asset)} - on:delete={() => trashOrDelete()} - on:favorite={toggleFavorite} - on:addToAlbum={() => openAlbumPicker(false)} - on:addToSharedAlbum={() => openAlbumPicker(true)} - on:playMotionPhoto={() => (shouldPlayMotionPhoto = true)} - on:stopMotionPhoto={() => (shouldPlayMotionPhoto = false)} - on:toggleArchive={toggleArchive} - on:asProfileImage={() => (isShowProfileImageCrop = true)} - on:runJob={({ detail: job }) => handleRunJob(job)} - on:playSlideShow={() => ($slideshowState = SlideshowState.PlaySlideshow)} - on:unstack={handleUnstack} - on:showShareModal={() => (isShowShareModal = true)} - /> -
- {/if} - - {#if $slideshowState === SlideshowState.None && showNavigation} -
- navigateAsset('previous', e)} label="View previous asset"> - - -
- {/if} - - -
- {#if $slideshowState != SlideshowState.None} -
- assetViewerHtmlElement.requestFullscreen()} - onPrevious={() => navigateAsset('previous')} - onNext={() => navigateAsset('next')} - onClose={() => ($slideshowState = SlideshowState.StopSlideshow)} + +
+ + {#if $slideshowState === SlideshowState.None} +
+ 0} + showShareButton={shouldShowShareModal} + on:back={closeViewer} + on:showDetail={showDetailInfoHandler} + on:download={() => downloadFile(asset)} + on:delete={() => trashOrDelete()} + on:favorite={toggleFavorite} + on:addToAlbum={() => openAlbumPicker(false)} + on:addToSharedAlbum={() => openAlbumPicker(true)} + on:playMotionPhoto={() => (shouldPlayMotionPhoto = true)} + on:stopMotionPhoto={() => (shouldPlayMotionPhoto = false)} + on:toggleArchive={toggleArchive} + on:asProfileImage={() => (isShowProfileImageCrop = true)} + on:runJob={({ detail: job }) => handleRunJob(job)} + on:playSlideShow={() => ($slideshowState = SlideshowState.PlaySlideshow)} + on:unstack={handleUnstack} + on:showShareModal={() => (isShowShareModal = true)} />
{/if} - {#if previewStackedAsset} - {#key previewStackedAsset.id} - {#if previewStackedAsset.type === AssetTypeEnum.Image} - - {:else} - - {/if} - {/key} - {:else} - {#key asset.id} - {#if !asset.resized} -
-
- -
-
- {:else if asset.type === AssetTypeEnum.Image} - {#if shouldPlayMotionPhoto && asset.livePhotoVideoId} - (shouldPlayMotionPhoto = false)} - /> - {:else if asset.exifInfo?.projectionType === ProjectionType.EQUIRECTANGULAR || (asset.originalPath && asset.originalPath - .toLowerCase() - .endsWith('.insp'))} - - {:else} - - {/if} - {:else} - - {/if} - {#if $slideshowState === SlideshowState.None && isShared && ((album && album.isActivityEnabled) || numberOfComments > 0)} -
- -
- {/if} - {/key} - {/if} - - {#if $stackAssetsStore.length > 0 && withStacked} -
-
- {#each $stackAssetsStore as stackedAsset, index (stackedAsset.id)} -
- { - asset = stackedAsset; - preloadAssets = index + 1 >= $stackAssetsStore.length ? [] : [$stackAssetsStore[index + 1]]; - }} - on:mouse-event={(e) => handleStackedAssetMouseEvent(e, stackedAsset)} - readonly - thumbnailSize={stackedAsset.id == asset.id ? 65 : 60} - showStackedIcon={false} - /> - - {#if stackedAsset.id == asset.id} -
-
-
- {/if} -
- {/each} -
+ {#if $slideshowState === SlideshowState.None && showNavigation} +
+ navigateAsset('previous', e)} label="View previous asset"> + +
{/if} -
- {#if $slideshowState === SlideshowState.None && showNavigation} -
- navigateAsset('next', e)} label="View next asset"> - - + +
+ {#if $slideshowState != SlideshowState.None} +
+ assetViewerHtmlElement.requestFullscreen()} + onPrevious={() => navigateAsset('previous')} + onNext={() => navigateAsset('next')} + onClose={() => ($slideshowState = SlideshowState.StopSlideshow)} + /> +
+ {/if} + + {#if previewStackedAsset} + {#key previewStackedAsset.id} + {#if previewStackedAsset.type === AssetTypeEnum.Image} + + {:else} + + {/if} + {/key} + {:else} + {#key asset.id} + {#if !asset.resized} +
+
+ +
+
+ {:else if asset.type === AssetTypeEnum.Image} + {#if shouldPlayMotionPhoto && asset.livePhotoVideoId} + (shouldPlayMotionPhoto = false)} + /> + {:else if asset.exifInfo?.projectionType === ProjectionType.EQUIRECTANGULAR || (asset.originalPath && asset.originalPath + .toLowerCase() + .endsWith('.insp'))} + + {:else} + + {/if} + {:else} + + {/if} + {#if $slideshowState === SlideshowState.None && isShared && ((album && album.isActivityEnabled) || numberOfComments > 0)} +
+ +
+ {/if} + {/key} + {/if} + + {#if $stackAssetsStore.length > 0 && withStacked} +
+
+ {#each $stackAssetsStore as stackedAsset, index (stackedAsset.id)} +
+ { + asset = stackedAsset; + preloadAssets = index + 1 >= $stackAssetsStore.length ? [] : [$stackAssetsStore[index + 1]]; + }} + on:mouse-event={(e) => handleStackedAssetMouseEvent(e, stackedAsset)} + readonly + thumbnailSize={stackedAsset.id == asset.id ? 65 : 60} + showStackedIcon={false} + /> + + {#if stackedAsset.id == asset.id} +
+
+
+ {/if} +
+ {/each} +
+
+ {/if}
- {/if} - {#if $slideshowState === SlideshowState.None && $isShowDetail} -
- + navigateAsset('next', e)} label="View next asset"> + + +
+ {/if} + + {#if $slideshowState === SlideshowState.None && $isShowDetail} +
+ ($isShowDetail = false)} + on:closeViewer={handleCloseViewer} + /> +
+ {/if} + + {#if isShared && album && isShowActivity && $user} +
+ (isLiked = null)} + on:close={() => (isShowActivity = false)} + /> +
+ {/if} + + {#if isShowAlbumPicker} + handleAddToNewAlbum(detail)} + on:album={({ detail }) => handleAddToAlbum(detail)} + on:close={() => (isShowAlbumPicker = false)} + on:escape={() => (isShowAlbumPicker = false)} + /> + {/if} + + {#if isShowDeleteConfirmation} + (isShowDeleteConfirmation = false)} + on:escape={() => (isShowDeleteConfirmation = false)} + on:confirm={() => deleteAsset()} + /> + {/if} + + {#if isShowProfileImageCrop} + ($isShowDetail = false)} - on:closeViewer={handleCloseViewer} + on:close={() => (isShowProfileImageCrop = false)} + on:escape={() => (isShowProfileImageCrop = false)} /> -
- {/if} + {/if} - {#if isShared && album && isShowActivity && $user} -
- (isLiked = null)} - on:close={() => (isShowActivity = false)} + {#if isShowShareModal} + (isShowShareModal = false)} + on:escape={() => (isShowShareModal = false)} /> -
- {/if} - - {#if isShowAlbumPicker} - handleAddToNewAlbum(detail)} - on:album={({ detail }) => handleAddToAlbum(detail)} - on:close={() => (isShowAlbumPicker = false)} - /> - {/if} - - {#if isShowDeleteConfirmation} - (isShowDeleteConfirmation = false)} - on:escape={() => (isShowDeleteConfirmation = false)} - on:confirm={() => deleteAsset()} - /> - {/if} - - {#if isShowProfileImageCrop} - (isShowProfileImageCrop = false)} /> - {/if} - - {#if isShowShareModal} - (isShowShareModal = false)} /> - {/if} -
+ {/if} +
+