;
@@ -38,6 +39,7 @@
{#each filterIsInOrNearViewport(viewerAssets) as viewerAsset (viewerAsset.id)}
{@const position = viewerAsset.position!}
{@const asset = viewerAsset.asset!}
+ {@const isInViewport = viewerAsset.isInViewport!}
- {@render thumbnail({ asset, position })}
+ {@render thumbnail({ asset, position, isInViewport })}
{@render customThumbnailLayout?.(asset)}
{/each}
diff --git a/web/src/lib/components/timeline/Month.svelte b/web/src/lib/components/timeline/Month.svelte
index 3f4b9b0661..f6ca89ebfd 100644
--- a/web/src/lib/components/timeline/Month.svelte
+++ b/web/src/lib/components/timeline/Month.svelte
@@ -21,6 +21,7 @@
position: CommonPosition;
timelineDay: TimelineDay;
groupIndex: number;
+ isInViewport: boolean;
},
]
>;
@@ -105,8 +106,8 @@
width={timelineDay.width}
{customThumbnailLayout}
>
- {#snippet thumbnail({ asset, position })}
- {@render thumbnailWithGroup({ asset, position, timelineDay, groupIndex })}
+ {#snippet thumbnail({ asset, position, isInViewport })}
+ {@render thumbnailWithGroup({ asset, position, timelineDay, groupIndex, isInViewport })}
{/snippet}
diff --git a/web/src/lib/components/timeline/Timeline.svelte b/web/src/lib/components/timeline/Timeline.svelte
index 646feee7b9..d4a1a647bb 100644
--- a/web/src/lib/components/timeline/Timeline.svelte
+++ b/web/src/lib/components/timeline/Timeline.svelte
@@ -673,7 +673,7 @@
manager={timelineManager}
onTimelineDaySelect={handleGroupSelect}
>
- {#snippet thumbnail({ asset, position, timelineDay, groupIndex })}
+ {#snippet thumbnail({ asset, position, timelineDay, groupIndex, isInViewport })}
{@const isAssetSelectionCandidate = assetInteraction.hasSelectionCandidate(asset.id)}
{@const isAssetSelected =
assetInteraction.hasSelectedAsset(asset.id) || timelineManager.albumAssets.has(asset.id)}
@@ -684,6 +684,7 @@
{asset}
{albumUsers}
{groupIndex}
+ {isInViewport}
onClick={(asset) => {
if (typeof onThumbnailClick === 'function') {
onThumbnailClick(asset, timelineManager, timelineDay, _onClick);
diff --git a/web/src/lib/managers/timeline-manager/viewer-asset.svelte.ts b/web/src/lib/managers/timeline-manager/viewer-asset.svelte.ts
index 0179dd9e74..a2bab899e0 100644
--- a/web/src/lib/managers/timeline-manager/viewer-asset.svelte.ts
+++ b/web/src/lib/managers/timeline-manager/viewer-asset.svelte.ts
@@ -3,6 +3,7 @@ import {
ViewportProximity,
calculateViewerAssetViewportProximity,
isInOrNearViewport,
+ isInViewport,
} from './internal/intersection-support.svelte';
import type { TimelineDay } from './timeline-day.svelte';
import type { TimelineAsset } from './types';
@@ -25,6 +26,10 @@ export class ViewerAsset {
return isInOrNearViewport(this.#viewportProximity);
}
+ get isInViewport() {
+ return isInViewport(this.#viewportProximity);
+ }
+
position: CommonPosition | undefined = $state.raw();
asset: TimelineAsset = $state() as TimelineAsset;
id: string = $derived(this.asset.id);
diff --git a/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte b/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
index 488d699368..f6d0b60bda 100644
--- a/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
+++ b/web/src/routes/(user)/search/[[photos=photos]]/[[assetId=id]]/+page.svelte
@@ -292,7 +292,7 @@