mirror of
https://github.com/immich-app/immich.git
synced 2026-05-22 07:32:32 -04:00
Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b93632ddcb |
@@ -2,20 +2,16 @@
|
|||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { filterIsInOrNearViewport } from '$lib/managers/timeline-manager/utils.svelte';
|
import { filterIsInOrNearViewport } from '$lib/managers/timeline-manager/utils.svelte';
|
||||||
import type { ViewerAsset } from '$lib/managers/timeline-manager/viewer-asset.svelte';
|
import type { ViewerAsset } from '$lib/managers/timeline-manager/viewer-asset.svelte';
|
||||||
import type { VirtualScrollManager } from '$lib/managers/VirtualScrollManager/VirtualScrollManager.svelte';
|
|
||||||
import { uploadAssetsStore } from '$lib/stores/upload';
|
|
||||||
import type { CommonPosition } from '$lib/utils/layout-utils';
|
import type { CommonPosition } from '$lib/utils/layout-utils';
|
||||||
import type { Snippet } from 'svelte';
|
import type { Snippet } from 'svelte';
|
||||||
import { flip } from 'svelte/animate';
|
import { flip } from 'svelte/animate';
|
||||||
import { scale } from 'svelte/transition';
|
import { scale } from 'svelte/transition';
|
||||||
|
|
||||||
let { isUploading } = uploadAssetsStore;
|
|
||||||
|
|
||||||
type Props = {
|
type Props = {
|
||||||
viewerAssets: ViewerAsset[];
|
viewerAssets: ViewerAsset[];
|
||||||
width: number;
|
width: number;
|
||||||
height: number;
|
height: number;
|
||||||
manager: VirtualScrollManager;
|
suspendTransitions: boolean;
|
||||||
thumbnail: Snippet<
|
thumbnail: Snippet<
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
@@ -27,10 +23,7 @@
|
|||||||
customThumbnailLayout?: Snippet<[asset: TimelineAsset]>;
|
customThumbnailLayout?: Snippet<[asset: TimelineAsset]>;
|
||||||
};
|
};
|
||||||
|
|
||||||
const { viewerAssets, width, height, manager, thumbnail, customThumbnailLayout }: Props = $props();
|
const { viewerAssets, width, height, suspendTransitions, thumbnail, customThumbnailLayout }: Props = $props();
|
||||||
|
|
||||||
const transitionDuration = $derived(manager.suspendTransitions && !$isUploading ? 0 : 150);
|
|
||||||
const scaleDuration = $derived(transitionDuration === 0 ? 0 : transitionDuration + 100);
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<!-- Image grid -->
|
<!-- Image grid -->
|
||||||
@@ -40,6 +33,7 @@
|
|||||||
{@const asset = viewerAsset.asset!}
|
{@const asset = viewerAsset.asset!}
|
||||||
|
|
||||||
<!-- note: don't remove data-asset-id - its used by web e2e tests -->
|
<!-- note: don't remove data-asset-id - its used by web e2e tests -->
|
||||||
|
<!-- Be careful with $derived values in out:scale, because Svelte can retain DOM nodes -->
|
||||||
<div
|
<div
|
||||||
data-asset-id={asset.id}
|
data-asset-id={asset.id}
|
||||||
class="absolute"
|
class="absolute"
|
||||||
@@ -47,8 +41,8 @@
|
|||||||
style:inset-inline-start={position.left + 'px'}
|
style:inset-inline-start={position.left + 'px'}
|
||||||
style:width={position.width + 'px'}
|
style:width={position.width + 'px'}
|
||||||
style:height={position.height + 'px'}
|
style:height={position.height + 'px'}
|
||||||
out:scale|global={{ start: 0.1, duration: scaleDuration }}
|
out:scale|global={{ start: 0.1, duration: suspendTransitions ? 0 : 250 }}
|
||||||
animate:flip={{ duration: transitionDuration }}
|
animate:flip={{ duration: suspendTransitions ? 0 : 150 }}
|
||||||
>
|
>
|
||||||
{@render thumbnail({ asset, position })}
|
{@render thumbnail({ asset, position })}
|
||||||
{@render customThumbnailLayout?.(asset)}
|
{@render customThumbnailLayout?.(asset)}
|
||||||
|
|||||||
@@ -5,7 +5,6 @@
|
|||||||
import type { TimelineMonth } from '$lib/managers/timeline-manager/timeline-month.svelte';
|
import type { TimelineMonth } from '$lib/managers/timeline-manager/timeline-month.svelte';
|
||||||
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
import type { TimelineAsset } from '$lib/managers/timeline-manager/types';
|
||||||
import { assetsSnapshot, filterIsInOrNearViewport } from '$lib/managers/timeline-manager/utils.svelte';
|
import { assetsSnapshot, filterIsInOrNearViewport } from '$lib/managers/timeline-manager/utils.svelte';
|
||||||
import type { VirtualScrollManager } from '$lib/managers/VirtualScrollManager/VirtualScrollManager.svelte';
|
|
||||||
import { uploadAssetsStore } from '$lib/stores/upload';
|
import { uploadAssetsStore } from '$lib/stores/upload';
|
||||||
import type { CommonPosition } from '$lib/utils/layout-utils';
|
import type { CommonPosition } from '$lib/utils/layout-utils';
|
||||||
import { fromTimelinePlainDate, getDateLocaleString } from '$lib/utils/timeline-util';
|
import { fromTimelinePlainDate, getDateLocaleString } from '$lib/utils/timeline-util';
|
||||||
@@ -28,7 +27,6 @@
|
|||||||
singleSelect: boolean;
|
singleSelect: boolean;
|
||||||
assetInteraction: AssetMultiSelectManager;
|
assetInteraction: AssetMultiSelectManager;
|
||||||
timelineMonth: TimelineMonth;
|
timelineMonth: TimelineMonth;
|
||||||
manager: VirtualScrollManager;
|
|
||||||
onTimelineDaySelect: (timelineDay: TimelineDay, assets: TimelineAsset[]) => void;
|
onTimelineDaySelect: (timelineDay: TimelineDay, assets: TimelineAsset[]) => void;
|
||||||
};
|
};
|
||||||
let {
|
let {
|
||||||
@@ -37,14 +35,13 @@
|
|||||||
singleSelect,
|
singleSelect,
|
||||||
assetInteraction,
|
assetInteraction,
|
||||||
timelineMonth,
|
timelineMonth,
|
||||||
manager,
|
|
||||||
onTimelineDaySelect,
|
onTimelineDaySelect,
|
||||||
}: Props = $props();
|
}: Props = $props();
|
||||||
|
|
||||||
let { isUploading } = uploadAssetsStore;
|
let { isUploading } = uploadAssetsStore;
|
||||||
let hoveredTimelineDay = $state<string | null>(null);
|
let hoveredTimelineDay = $state<string | null>(null);
|
||||||
|
|
||||||
const transitionDuration = $derived(timelineMonth.timelineManager.suspendTransitions && !$isUploading ? 0 : 150);
|
const suspendTransitions = $derived(timelineMonth.timelineManager.suspendTransitions && !$isUploading);
|
||||||
|
|
||||||
const getTimelineDayFullDate = (timelineDay: TimelineDay): string => {
|
const getTimelineDayFullDate = (timelineDay: TimelineDay): string => {
|
||||||
const { month, year } = timelineDay.timelineMonth.yearMonth;
|
const { month, year } = timelineDay.timelineMonth.yearMonth;
|
||||||
@@ -61,10 +58,8 @@
|
|||||||
{@const isTimelineDaySelected = assetInteraction.selectedGroup.has(timelineDay.groupTitle)}
|
{@const isTimelineDaySelected = assetInteraction.selectedGroup.has(timelineDay.groupTitle)}
|
||||||
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
<!-- svelte-ignore a11y_no_static_element_interactions -->
|
||||||
<section
|
<section
|
||||||
class={[
|
class:transition-all={!suspendTransitions}
|
||||||
{ 'transition-all': !timelineMonth.timelineManager.suspendTransitions },
|
class:delay-150={!suspendTransitions}
|
||||||
!timelineMonth.timelineManager.suspendTransitions && `delay-${transitionDuration}`,
|
|
||||||
]}
|
|
||||||
data-group
|
data-group
|
||||||
style:position="absolute"
|
style:position="absolute"
|
||||||
style:inset-inline-start={timelineDay.start + 'px'}
|
style:inset-inline-start={timelineDay.start + 'px'}
|
||||||
@@ -99,10 +94,10 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<AssetLayout
|
<AssetLayout
|
||||||
{manager}
|
|
||||||
viewerAssets={timelineDay.viewerAssets}
|
viewerAssets={timelineDay.viewerAssets}
|
||||||
height={timelineDay.height}
|
height={timelineDay.height}
|
||||||
width={timelineDay.width}
|
width={timelineDay.width}
|
||||||
|
{suspendTransitions}
|
||||||
{customThumbnailLayout}
|
{customThumbnailLayout}
|
||||||
>
|
>
|
||||||
{#snippet thumbnail({ asset, position })}
|
{#snippet thumbnail({ asset, position })}
|
||||||
|
|||||||
@@ -670,7 +670,6 @@
|
|||||||
{customThumbnailLayout}
|
{customThumbnailLayout}
|
||||||
{singleSelect}
|
{singleSelect}
|
||||||
{timelineMonth}
|
{timelineMonth}
|
||||||
manager={timelineManager}
|
|
||||||
onTimelineDaySelect={handleGroupSelect}
|
onTimelineDaySelect={handleGroupSelect}
|
||||||
>
|
>
|
||||||
{#snippet thumbnail({ asset, position, timelineDay, groupIndex })}
|
{#snippet thumbnail({ asset, position, timelineDay, groupIndex })}
|
||||||
|
|||||||
Reference in New Issue
Block a user