diff --git a/web/jest.config.mjs b/web/jest.config.mjs
index 5eeb60f95..307c955b7 100644
--- a/web/jest.config.mjs
+++ b/web/jest.config.mjs
@@ -186,7 +186,7 @@ export default {
},
// An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation
- transformIgnorePatterns: ['/node_modules/(?!svelte-material-icons).*/', '\\.pnp\\.[^\\/]+$'],
+ transformIgnorePatterns: ['\\.pnp\\.[^\\/]+$'],
// An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them
// unmockedModulePathPatterns: undefined,
diff --git a/web/package-lock.json b/web/package-lock.json
index dd3aad6bb..a79f648de 100644
--- a/web/package-lock.json
+++ b/web/package-lock.json
@@ -9,6 +9,7 @@
"version": "1.0.0",
"dependencies": {
"@egjs/svelte-view360": "^4.0.0-beta.7",
+ "@mdi/js": "^7.3.67",
"@zoom-image/svelte": "^0.1.8",
"axios": "^0.27.2",
"buffer": "^6.0.3",
@@ -23,7 +24,6 @@
"socket.io-client": "^4.6.1",
"svelte-loading-spinners": "^0.3.4",
"svelte-local-storage-store": "^0.5.0",
- "svelte-material-icons": "^3.0.5",
"thumbhash": "^0.1.1"
},
"devDependencies": {
@@ -3197,6 +3197,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@mdi/js": {
+ "version": "7.3.67",
+ "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz",
+ "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw=="
+ },
"node_modules/@namnode/store": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@namnode/store/-/store-0.1.0.tgz",
@@ -11418,14 +11423,6 @@
"svelte": "^3.48.0 || ^4.0.0"
}
},
- "node_modules/svelte-material-icons": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/svelte-material-icons/-/svelte-material-icons-3.0.5.tgz",
- "integrity": "sha512-UbhAa+Btd5y6e6DMljVccP+cbJ8lvesltMippiCOvfIUtYe2TsQqM+P6osfrVsZHV47b1tY6AmqCuSpMKnwMOQ==",
- "peerDependencies": {
- "svelte": "^3.0.0 || ^4.0.0"
- }
- },
"node_modules/svelte-preprocess": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz",
@@ -14495,6 +14492,11 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "@mdi/js": {
+ "version": "7.3.67",
+ "resolved": "https://registry.npmjs.org/@mdi/js/-/js-7.3.67.tgz",
+ "integrity": "sha512-MnRjknFqpTC6FifhGHjZ0+QYq2bAkZFQqIj8JA2AdPZbBxUvr8QSgB2yPAJ8/ob/XkR41xlg5majDR3c1JP1hw=="
+ },
"@namnode/store": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@namnode/store/-/store-0.1.0.tgz",
@@ -20512,12 +20514,6 @@
"integrity": "sha512-SEDrpapeia6fUqta+r1NvSLlJYPkZ4pBcl15EYIOSPNzy6vhpoXu8cnzUDmZxsWl7fZGAHxrVH9UyZCbyO4W+g==",
"requires": {}
},
- "svelte-material-icons": {
- "version": "3.0.5",
- "resolved": "https://registry.npmjs.org/svelte-material-icons/-/svelte-material-icons-3.0.5.tgz",
- "integrity": "sha512-UbhAa+Btd5y6e6DMljVccP+cbJ8lvesltMippiCOvfIUtYe2TsQqM+P6osfrVsZHV47b1tY6AmqCuSpMKnwMOQ==",
- "requires": {}
- },
"svelte-preprocess": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz",
diff --git a/web/package.json b/web/package.json
index d1d4d25c0..7934c28b2 100644
--- a/web/package.json
+++ b/web/package.json
@@ -62,6 +62,7 @@
"type": "module",
"dependencies": {
"@egjs/svelte-view360": "^4.0.0-beta.7",
+ "@mdi/js": "^7.3.67",
"@zoom-image/svelte": "^0.1.8",
"axios": "^0.27.2",
"buffer": "^6.0.3",
@@ -76,7 +77,6 @@
"socket.io-client": "^4.6.1",
"svelte-loading-spinners": "^0.3.4",
"svelte-local-storage-store": "^0.5.0",
- "svelte-material-icons": "^3.0.5",
"thumbhash": "^0.1.1"
}
}
diff --git a/web/src/lib/components/admin-page/jobs/job-tile.svelte b/web/src/lib/components/admin-page/jobs/job-tile.svelte
index ec1375607..1be188cd2 100644
--- a/web/src/lib/components/admin-page/jobs/job-tile.svelte
+++ b/web/src/lib/components/admin-page/jobs/job-tile.svelte
@@ -1,25 +1,27 @@
-
+
{/if}
diff --git a/web/src/lib/components/assets/thumbnail/thumbnail.svelte b/web/src/lib/components/assets/thumbnail/thumbnail.svelte
index 42266a805..6398e1a36 100644
--- a/web/src/lib/components/assets/thumbnail/thumbnail.svelte
+++ b/web/src/lib/components/assets/thumbnail/thumbnail.svelte
@@ -4,16 +4,19 @@
import { timeToSeconds } from '$lib/utils/time-to-seconds';
import { api, AssetResponseDto, AssetTypeEnum, ThumbnailFormat } from '@api';
import { createEventDispatcher } from 'svelte';
- import ArchiveArrowDownOutline from 'svelte-material-icons/ArchiveArrowDownOutline.svelte';
- import CheckCircle from 'svelte-material-icons/CheckCircle.svelte';
- import Heart from 'svelte-material-icons/Heart.svelte';
- import ImageBrokenVariant from 'svelte-material-icons/ImageBrokenVariant.svelte';
- import MotionPauseOutline from 'svelte-material-icons/MotionPauseOutline.svelte';
- import MotionPlayOutline from 'svelte-material-icons/MotionPlayOutline.svelte';
import { fade } from 'svelte/transition';
import ImageThumbnail from './image-thumbnail.svelte';
import VideoThumbnail from './video-thumbnail.svelte';
- import Rotate360Icon from 'svelte-material-icons/Rotate360.svelte';
+ import {
+ mdiArchiveArrowDownOutline,
+ mdiCheckCircle,
+ mdiHeart,
+ mdiImageBrokenVariant,
+ mdiMotionPauseOutline,
+ mdiMotionPlayOutline,
+ mdiRotate360,
+ } from '@mdi/js';
+ import Icon from '$lib/components/elements/icon.svelte';
const dispatch = createEventDispatcher();
@@ -93,13 +96,13 @@
{disabled}
>
{#if disabled}
-
+
{:else if selected}
-
+
{:else}
-
+
{/if}
{/if}
@@ -119,20 +122,20 @@
{#if !api.isSharedLink && asset.isFavorite}
-
+
{/if}
{#if !api.isSharedLink && showArchiveIcon && asset.isArchived}
{/if}
{#if asset.type === AssetTypeEnum.Image && asset.exifInfo?.projectionType === ProjectionType.EQUIRECTANGULAR}
-
+
{/if}
@@ -148,7 +151,7 @@
/>
{:else}
-
+
{/if}
@@ -167,8 +170,8 @@
import { Duration } from 'luxon';
- import PauseCircleOutline from 'svelte-material-icons/PauseCircleOutline.svelte';
- import PlayCircleOutline from 'svelte-material-icons/PlayCircleOutline.svelte';
- import AlertCircleOutline from 'svelte-material-icons/AlertCircleOutline.svelte';
import LoadingSpinner from '$lib/components/shared-components/loading-spinner.svelte';
+ import { mdiAlertCircleOutline, mdiPauseCircleOutline, mdiPlayCircleOutline } from '@mdi/js';
+ import Icon from '$lib/components/elements/icon.svelte';
export let url: string;
export let durationInSeconds = 0;
@@ -11,8 +10,8 @@
export let playbackOnIconHover = false;
export let showTime = true;
export let curve = false;
- export let playIcon = PlayCircleOutline;
- export let pauseIcon = PauseCircleOutline;
+ export let playIcon = mdiPlayCircleOutline;
+ export let pauseIcon = mdiPauseCircleOutline;
let remainingSeconds = durationInSeconds;
let loading = true;
@@ -55,12 +54,12 @@
{#if loading}
{:else if error}
-
+
{:else}
-
+
{/if}
{:else}
-
+
{/if}
diff --git a/web/src/lib/components/elements/buttons/circle-icon-button.svelte b/web/src/lib/components/elements/buttons/circle-icon-button.svelte
index 344793bab..ef9259d50 100644
--- a/web/src/lib/components/elements/buttons/circle-icon-button.svelte
+++ b/web/src/lib/components/elements/buttons/circle-icon-button.svelte
@@ -1,7 +1,7 @@
+
+
diff --git a/web/src/lib/components/faces-page/merge-face-selector.svelte b/web/src/lib/components/faces-page/merge-face-selector.svelte
index c087ac2d2..2bf15b1bc 100644
--- a/web/src/lib/components/faces-page/merge-face-selector.svelte
+++ b/web/src/lib/components/faces-page/merge-face-selector.svelte
@@ -6,15 +6,14 @@
import { fly } from 'svelte/transition';
import ControlAppBar from '../shared-components/control-app-bar.svelte';
import Button from '../elements/buttons/button.svelte';
- import Merge from 'svelte-material-icons/Merge.svelte';
- import CallMerge from 'svelte-material-icons/CallMerge.svelte';
import { flip } from 'svelte/animate';
import { NotificationType, notificationController } from '../shared-components/notification/notification';
import ConfirmDialogue from '../shared-components/confirm-dialogue.svelte';
import { handleError } from '$lib/utils/handle-error';
import { goto, invalidateAll } from '$app/navigation';
import { AppRoute } from '$lib/constants';
- import SwapHorizontal from 'svelte-material-icons/SwapHorizontal.svelte';
+ import { mdiCallMerge, mdiMerge, mdiSwapHorizontal } from '@mdi/js';
+ import Icon from '$lib/components/elements/icon.svelte';
export let person: PersonResponseDto;
let people: PersonResponseDto[] = [];
@@ -104,7 +103,7 @@
isShowConfirmation = true;
}}
>
-
+
Merge
@@ -123,10 +122,10 @@
{#if hasSelection}
+ >
{#if selectedPeople.length === 1}
{/if}
diff --git a/web/src/lib/components/faces-page/merge-suggestion-modal.svelte b/web/src/lib/components/faces-page/merge-suggestion-modal.svelte
index de0a45452..4300708ae 100644
--- a/web/src/lib/components/faces-page/merge-suggestion-modal.svelte
+++ b/web/src/lib/components/faces-page/merge-suggestion-modal.svelte
@@ -2,12 +2,11 @@
import FullScreenModal from '$lib/components/shared-components/full-screen-modal.svelte';
import { api, type PersonResponseDto } from '@api';
import { createEventDispatcher } from 'svelte';
- import ArrowLeft from 'svelte-material-icons/ArrowLeft.svelte';
- import Close from 'svelte-material-icons/Close.svelte';
- import Merge from 'svelte-material-icons/Merge.svelte';
import ImageThumbnail from '../assets/thumbnail/image-thumbnail.svelte';
import Button from '../elements/buttons/button.svelte';
import CircleIconButton from '../elements/buttons/circle-icon-button.svelte';
+ import { mdiArrowLeft, mdiClose, mdiMerge } from '@mdi/js';
+ import Icon from '$lib/components/elements/icon.svelte';
const dispatch = createEventDispatcher<{
reject: void;
@@ -40,7 +39,7 @@
Merge faces - {title}
- dispatch('close')} />
+ dispatch('close')} />
@@ -57,7 +56,7 @@
([personMerge1, personMerge2] = [personMerge2, personMerge1])}
/>
@@ -83,7 +82,7 @@
{:else}
-
+
diff --git a/web/src/lib/components/faces-page/people-card.svelte b/web/src/lib/components/faces-page/people-card.svelte
index 574c14b88..289234366 100644
--- a/web/src/lib/components/faces-page/people-card.svelte
+++ b/web/src/lib/components/faces-page/people-card.svelte
@@ -3,12 +3,13 @@
import { getContextMenuPosition } from '$lib/utils/context-menu';
import ImageThumbnail from '../assets/thumbnail/image-thumbnail.svelte';
import IconButton from '../elements/buttons/icon-button.svelte';
- import DotsVertical from 'svelte-material-icons/DotsVertical.svelte';
import ContextMenu from '../shared-components/context-menu/context-menu.svelte';
import MenuOption from '../shared-components/context-menu/menu-option.svelte';
import Portal from '../shared-components/portal/portal.svelte';
import { createEventDispatcher } from 'svelte';
import { AppRoute } from '$lib/constants';
+ import { mdiDotsVertical } from '@mdi/js';
+ import Icon from '$lib/components/elements/icon.svelte';
export let person: PersonResponseDto;
@@ -71,7 +72,7 @@
id={`icon-${person.id}`}
>
-
+
diff --git a/web/src/lib/components/faces-page/set-birth-date-modal.svelte b/web/src/lib/components/faces-page/set-birth-date-modal.svelte
index 20ce4d382..630c60a74 100644
--- a/web/src/lib/components/faces-page/set-birth-date-modal.svelte
+++ b/web/src/lib/components/faces-page/set-birth-date-modal.svelte
@@ -1,8 +1,9 @@
-
(showModal = true)} />
+ (showModal = true)} />
{#if showModal}
{:else if loading}
-
+
{:else}
-
+
{/if}
{#if isShowConfirmation}
diff --git a/web/src/lib/components/photos-page/actions/download-action.svelte b/web/src/lib/components/photos-page/actions/download-action.svelte
index 56f24cee6..f4e7f685e 100644
--- a/web/src/lib/components/photos-page/actions/download-action.svelte
+++ b/web/src/lib/components/photos-page/actions/download-action.svelte
@@ -1,9 +1,9 @@
- (removing = true)} logo={DeleteOutline} />
+ (removing = true)} icon={mdiDeleteOutline} />
{#if removing}
diff --git a/web/src/lib/components/photos-page/actions/select-all-assets.svelte b/web/src/lib/components/photos-page/actions/select-all-assets.svelte
index 0956e9a09..f06f499a2 100644
--- a/web/src/lib/components/photos-page/actions/select-all-assets.svelte
+++ b/web/src/lib/components/photos-page/actions/select-all-assets.svelte
@@ -3,9 +3,8 @@
import type { AssetInteractionStore } from '$lib/stores/asset-interaction.store';
import { BucketPosition, type AssetStore } from '$lib/stores/assets.store';
import { handleError } from '$lib/utils/handle-error';
- import SelectAll from 'svelte-material-icons/SelectAll.svelte';
- import TimerSand from 'svelte-material-icons/TimerSand.svelte';
import { get } from 'svelte/store';
+ import { mdiTimerSand, mdiSelectAll } from '@mdi/js';
export let assetStore: AssetStore;
export let assetInteractionStore: AssetInteractionStore;
@@ -32,8 +31,8 @@
{#if selecting}
-
+
{/if}
{#if !selecting}
-
+
{/if}
diff --git a/web/src/lib/components/photos-page/asset-date-group.svelte b/web/src/lib/components/photos-page/asset-date-group.svelte
index 9207cd924..147febbca 100644
--- a/web/src/lib/components/photos-page/asset-date-group.svelte
+++ b/web/src/lib/components/photos-page/asset-date-group.svelte
@@ -5,14 +5,14 @@
import type { AssetResponseDto } from '@api';
import justifiedLayout from 'justified-layout';
import { createEventDispatcher } from 'svelte';
- import CheckCircle from 'svelte-material-icons/CheckCircle.svelte';
- import CircleOutline from 'svelte-material-icons/CircleOutline.svelte';
+ import Icon from '$lib/components/elements/icon.svelte';
import { fly } from 'svelte/transition';
import Thumbnail from '../assets/thumbnail/thumbnail.svelte';
import { assetViewingStore } from '$lib/stores/asset-viewing.store';
import type { AssetStore } from '$lib/stores/assets.store';
import type { AssetInteractionStore } from '$lib/stores/asset-interaction.store';
import type { Viewport } from '$lib/stores/assets.store';
+ import { mdiCheckCircle, mdiCircleOutline } from '@mdi/js';
export let assets: AssetResponseDto[];
export let bucketDate: string;
@@ -154,9 +154,9 @@
on:keydown={() => handleSelectGroup(groupTitle, groupAssets)}
>
{#if $selectedGroup.has(groupTitle)}
-
+
{:else}
-
+
{/if}
{/if}
diff --git a/web/src/lib/components/photos-page/asset-select-context-menu.svelte b/web/src/lib/components/photos-page/asset-select-context-menu.svelte
index 7729aa347..9af4ff931 100644
--- a/web/src/lib/components/photos-page/asset-select-context-menu.svelte
+++ b/web/src/lib/components/photos-page/asset-select-context-menu.svelte
@@ -9,10 +9,9 @@
(showContextMenu = false)}>
-
+
{#if showContextMenu}
diff --git a/web/src/lib/components/photos-page/asset-select-control-bar.svelte b/web/src/lib/components/photos-page/asset-select-control-bar.svelte
index 3d9d94b08..6708b335c 100644
--- a/web/src/lib/components/photos-page/asset-select-control-bar.svelte
+++ b/web/src/lib/components/photos-page/asset-select-control-bar.svelte
@@ -19,8 +19,8 @@
-
+
Selected {assets.size.toLocaleString($locale)}
diff --git a/web/src/lib/components/photos-page/memory-lane.svelte b/web/src/lib/components/photos-page/memory-lane.svelte
index 1ade070eb..2424de320 100644
--- a/web/src/lib/components/photos-page/memory-lane.svelte
+++ b/web/src/lib/components/photos-page/memory-lane.svelte
@@ -1,11 +1,11 @@
-
+
-
+
-
+
-
+
diff --git a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte b/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte
index 0dae86bfa..a23eeed03 100644
--- a/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte
+++ b/web/src/lib/components/shared-components/side-bar/side-bar-button.svelte
@@ -1,11 +1,11 @@
-
goto(AppRoute.SHARING)}>
+ goto(AppRoute.SHARING)}>
Shared links
diff --git a/web/src/routes/(user)/trash/+page.svelte b/web/src/routes/(user)/trash/+page.svelte
index cce565767..5d0f6cc2f 100644
--- a/web/src/routes/(user)/trash/+page.svelte
+++ b/web/src/routes/(user)/trash/+page.svelte
@@ -16,13 +16,13 @@
import LinkButton from '$lib/components/elements/buttons/link-button.svelte';
import { AssetStore } from '$lib/stores/assets.store';
import { api, TimeBucketSize } from '@api';
- import DeleteOutline from 'svelte-material-icons/DeleteOutline.svelte';
- import HistoryOutline from 'svelte-material-icons/History.svelte';
+ import Icon from '$lib/components/elements/icon.svelte';
import type { PageData } from './$types';
import { featureFlags, serverConfig } from '$lib/stores/server-config.store';
import { goto } from '$app/navigation';
import empty3Url from '$lib/assets/empty-3.svg';
import ConfirmDialogue from '$lib/components/shared-components/confirm-dialogue.svelte';
+ import { mdiDeleteOutline, mdiHistory } from '@mdi/js';
export let data: PageData;
@@ -74,13 +74,13 @@
-
+
Restore All
(isShowEmptyConfirmation = true)}>
-
+
Empty Trash
diff --git a/web/src/routes/+error.svelte b/web/src/routes/+error.svelte
index 7a1915153..93cadacca 100644
--- a/web/src/routes/+error.svelte
+++ b/web/src/routes/+error.svelte
@@ -1,10 +1,8 @@