+
+
+ {$t('birthdate_set_description')}
+
{#if person.birthDate}
-
diff --git a/web/src/lib/stores/preferences.store.ts b/web/src/lib/stores/preferences.store.ts
index 3c31bef856..016942c572 100644
--- a/web/src/lib/stores/preferences.store.ts
+++ b/web/src/lib/stores/preferences.store.ts
@@ -1,3 +1,4 @@
+import type { DateTime } from 'luxon';
import { persisted } from 'svelte-persisted-store';
import { browser } from '$app/environment';
import { defaultLang } from '$lib/constants';
@@ -26,8 +27,8 @@ export interface MapSettings {
withPartners: boolean;
withSharedAlbums: boolean;
relativeDate: string;
- dateAfter: string;
- dateBefore: string;
+ dateAfter?: DateTime
;
+ dateBefore?: DateTime;
}
const defaultMapSettings = {
@@ -37,8 +38,6 @@ const defaultMapSettings = {
withPartners: false,
withSharedAlbums: false,
relativeDate: '',
- dateAfter: '',
- dateBefore: '',
};
const persistedObject = (key: string, defaults: T) =>
diff --git a/web/src/lib/utils/tunables.ts b/web/src/lib/utils/tunables.ts
index c586e11957..0d885ec4e8 100644
--- a/web/src/lib/utils/tunables.ts
+++ b/web/src/lib/utils/tunables.ts
@@ -31,4 +31,7 @@ export const TUNABLES = {
IMAGE_THUMBNAIL: {
THUMBHASH_FADE_DURATION: getNumber(storage.getItem('THUMBHASH_FADE_DURATION'), 100),
},
+ IMAGE_RASTER: {
+ MAX_PIXELS: getNumber(storage.getItem('IMAGE_RASTER.MAX_PIXELS'), 0),
+ },
};
diff --git a/web/src/routes/(user)/explore/+page.svelte b/web/src/routes/(user)/explore/+page.svelte
index df4c9a9eb5..fa688d7e8b 100644
--- a/web/src/routes/(user)/explore/+page.svelte
+++ b/web/src/routes/(user)/explore/+page.svelte
@@ -4,15 +4,18 @@
import OnEvents from '$lib/components/OnEvents.svelte';
import EmptyPlaceholder from '$lib/components/shared-components/EmptyPlaceholder.svelte';
import SingleGridRow from '$lib/components/shared-components/SingleGridRow.svelte';
+ import { assetViewerManager } from '$lib/managers/asset-viewer-manager.svelte';
import { Route } from '$lib/route';
import { getAssetMediaUrl, getPeopleThumbnailUrl } from '$lib/utils';
- import { AssetMediaSize, type SearchExploreResponseDto } from '@immich/sdk';
+ import { getAssetInfo, AssetMediaSize, type SearchExploreResponseDto } from '@immich/sdk';
+ import { authManager } from '$lib/managers/auth-manager.svelte';
import { Icon } from '@immich/ui';
import { mdiHeart } from '@mdi/js';
import { t } from 'svelte-i18n';
import type { PageData } from './$types';
import { toTimelineAsset } from '$lib/utils/timeline-util';
import { getAltText } from '$lib/utils/thumbnail-util';
+ import Portal from '$lib/elements/Portal.svelte';
interface Props {
data: PageData;
@@ -40,6 +43,15 @@
}
}
};
+
+ const onViewAsset = async (id: string) => {
+ const asset = await getAssetInfo({ ...authManager.params, id });
+ assetViewerManager.setAsset(asset);
+ };
+
+ const assetCursor = $derived({
+ current: assetViewerManager.asset!,
+ });
@@ -122,15 +134,20 @@
draggable="false">{$t('view_all')}
{/if}
+
+{#if assetViewerManager.isViewing}
+ {#await import('$lib/components/asset-viewer/AssetViewer.svelte') then { default: AssetViewer }}
+