From eadcbd52fb419d50bb060afef30bb0bdde239a16 Mon Sep 17 00:00:00 2001 From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com> Date: Sat, 2 Nov 2024 16:49:07 +0100 Subject: [PATCH] =?UTF-8?q?chore:=20svelte=205=20=F0=9F=8E=89=20=20(#13738?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit chore: svelte 5 Co-authored-by: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- web/package-lock.json | 250 +++++++++--------- web/package.json | 16 +- web/src/lib/__mocks__/animate.mock.ts | 17 ++ .../admin-page/jobs/job-tile.svelte | 4 +- .../admin-page/jobs/jobs-panel.svelte | 5 +- .../album-page/albums-controls.svelte | 5 + .../components/album-page/albums-list.svelte | 1 + .../album-page/albums-table-header.svelte | 2 +- .../asset-viewer/activity-viewer.svelte | 2 +- .../asset-viewer/asset-viewer-nav-bar.spec.ts | 20 +- .../asset-viewer/asset-viewer-nav-bar.svelte | 1 + .../asset-viewer/asset-viewer.svelte | 2 +- .../asset-viewer/detail-panel.svelte | 2 +- .../asset-viewer/download-panel.svelte | 2 +- .../asset-viewer/editor/editor-panel.svelte | 1 + .../photo-sphere-viewer-adapter.svelte | 2 +- .../asset-viewer/photo-viewer.spec.ts | 5 + .../asset-viewer/photo-viewer.svelte | 2 +- .../__test__/image-thumbnail.spec.ts | 6 +- .../assets/thumbnail/image-thumbnail.svelte | 2 +- .../assets/thumbnail/thumbnail.svelte | 7 +- .../assets/thumbnail/video-thumbnail.svelte | 7 +- .../lib/components/elements/dropdown.svelte | 2 +- web/src/lib/components/elements/slider.svelte | 4 +- .../faces-page/face-thumbnail.svelte | 4 +- .../manage-people-visibility.svelte | 2 + .../faces-page/merge-face-selector.svelte | 2 +- .../faces-page/unmerge-face-selector.svelte | 2 +- .../components/forms/api-key-secret.svelte | 2 +- .../components/forms/edit-album-form.svelte | 2 +- .../i18n/__test__/format-message.spec.ts | 12 +- .../memory-page/memory-viewer.svelte | 7 +- .../actions/asset-job-actions.svelte | 1 + .../components/photos-page/asset-grid.svelte | 2 +- .../components/photos-page/memory-lane.svelte | 2 +- .../__test__/number-range-input.spec.ts | 11 +- .../album-selection-modal.svelte | 8 +- .../create-shared-link-modal.svelte | 1 + .../shared-components/map/map.svelte | 1 + .../navigation-loading-bar.svelte | 2 +- .../__tests__/notification-card.spec.ts | 4 +- .../__tests__/notification-list.spec.ts | 8 +- .../notification/notification-card.svelte | 1 + .../notification/notification.ts | 21 +- .../shared-components/password-field.svelte | 2 +- .../progress-bar/progress-bar.svelte | 2 +- .../purchasing/purchase-content.svelte | 2 +- .../scrubber/scrubber.svelte | 4 +- .../settings/setting-input-field.svelte | 2 +- .../settings/setting-textarea.svelte | 2 +- .../side-bar/server-status.svelte | 4 +- .../side-bar/storage-space.svelte | 2 +- .../shared-components/theme-button.svelte | 3 + .../upload-asset-preview.svelte | 2 +- .../user-settings-page/app-settings.svelte | 1 + web/src/lib/stores/preferences.store.ts | 2 +- .../[[assetId=id]]/+page.svelte | 2 + .../(user)/photos/[[assetId=id]]/+page.svelte | 1 + .../admin/library-management/+page.svelte | 5 +- web/svelte.config.js | 3 +- web/vite.config.js | 3 +- 61 files changed, 287 insertions(+), 217 deletions(-) create mode 100644 web/src/lib/__mocks__/animate.mock.ts diff --git a/web/package-lock.json b/web/package-lock.json index 5185a235db..a24de1cd75 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -23,9 +23,9 @@ "justified-layout": "^4.1.0", "lodash-es": "^4.17.21", "luxon": "^3.4.4", - "socket.io-client": "^4.7.4", + "socket.io-client": "~4.7.5", "svelte-gestures": "^5.0.4", - "svelte-i18n": "^4.0.0", + "svelte-i18n": "^4.0.1", "svelte-local-storage-store": "^0.6.4", "svelte-maplibre": "^0.9.13", "thumbhash": "^0.1.1" @@ -35,12 +35,12 @@ "@eslint/js": "^9.8.0", "@faker-js/faker": "^9.0.0", "@socket.io/component-emitter": "^3.1.0", - "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/enhanced-img": "^0.3.0", - "@sveltejs/kit": "^2.5.18", - "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@sveltejs/kit": "^2.7.2", + "@sveltejs/vite-plugin-svelte": "^4.0.0", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/svelte": "^5.2.0", + "@testing-library/svelte": "^5.2.4", "@testing-library/user-event": "^14.5.2", "@types/dom-to-image": "^2.6.7", "@types/justified-layout": "^4.1.4", @@ -63,7 +63,7 @@ "prettier-plugin-sort-json": "^4.0.0", "prettier-plugin-svelte": "^3.2.6", "rollup-plugin-visualizer": "^5.12.0", - "svelte": "^4.2.19", + "svelte": "^5.1.5", "svelte-check": "^4.0.0", "tailwindcss": "^3.4.1", "tslib": "^2.6.2", @@ -80,7 +80,7 @@ "@oazapfts/runtime": "^1.0.2" }, "devDependencies": { - "@types/node": "^22.8.0", + "@types/node": "^22.8.1", "typescript": "^5.3.3" } }, @@ -1994,43 +1994,42 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.2.tgz", - "integrity": "sha512-Txsm1tJvtiYeLUVRNqxZGKR/mI+CzuIQuc2gn+YCs9rMTowpNZ2Nqt53JdL8KF9bLhAf2ruR/dr9eZCwdTriRA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-4.0.0.tgz", + "integrity": "sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==", "dev": true, "license": "MIT", "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0", - "debug": "^4.3.4", + "@sveltejs/vite-plugin-svelte-inspector": "^3.0.0-next.0||^3.0.0", + "debug": "^4.3.7", "deepmerge": "^4.3.1", "kleur": "^4.1.5", - "magic-string": "^0.30.10", - "svelte-hmr": "^0.16.0", - "vitefu": "^0.2.5" + "magic-string": "^0.30.12", + "vitefu": "^1.0.3" }, "engines": { - "node": "^18.0.0 || >=20" + "node": "^18.0.0 || ^20.0.0 || >=22" }, "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", + "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, "node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", - "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-3.0.1.tgz", + "integrity": "sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "debug": "^4.3.7" }, "engines": { - "node": "^18.0.0 || >=20" + "node": "^18.0.0 || ^20.0.0 || >=22" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0", - "svelte": "^4.0.0 || ^5.0.0-next.0", + "@sveltejs/vite-plugin-svelte": "^4.0.0-next.0||^4.0.0", + "svelte": "^5.0.0-next.96 || ^5.0.0", "vite": "^5.0.0" } }, @@ -2230,7 +2229,6 @@ "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-5.2.4.tgz", "integrity": "sha512-EFdy73+lULQgMJ1WolAymrxWWrPv9DWyDuDFKKlUip2PA/EXuHptzfYOKWljccFWDKhhGOu3dqNmoc2f/h/Ecg==", "dev": true, - "license": "MIT", "dependencies": { "@testing-library/dom": "^10.0.0" }, @@ -2797,6 +2795,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-typescript": { + "version": "1.4.13", + "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz", + "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==", + "license": "MIT", + "peerDependencies": { + "acorn": ">=8.9.0" + } + }, "node_modules/agent-base": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", @@ -2883,6 +2890,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, "dependencies": { "dequal": "^2.0.3" } @@ -2960,11 +2968,12 @@ } }, "node_modules/axobject-query": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", - "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", - "dependencies": { - "dequal": "^2.0.3" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" } }, "node_modules/balanced-match": { @@ -3271,18 +3280,6 @@ "node": ">=6" } }, - "node_modules/code-red": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", - "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15", - "@types/estree": "^1.0.1", - "acorn": "^8.10.0", - "estree-walker": "^3.0.3", - "periscopic": "^3.1.0" - } - }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -3404,18 +3401,6 @@ "node": ">= 8" } }, - "node_modules/css-tree": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", - "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", - "dependencies": { - "mdn-data": "2.0.30", - "source-map-js": "^1.0.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, "node_modules/css.escape": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", @@ -3505,11 +3490,12 @@ } }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3656,22 +3642,23 @@ "dev": true }, "node_modules/engine.io-client": { - "version": "6.6.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.1.tgz", - "integrity": "sha512-aYuoak7I+R83M/BBPIOs2to51BmFIpC1wZe6zZzMrT2llVsHy5cvcmdsJgP2Qz6smHu+sD9oexiSUAVd8OfBPw==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz", + "integrity": "sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" + "xmlhttprequest-ssl": "~2.0.0" } }, "node_modules/engine.io-parser": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.1.tgz", - "integrity": "sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", + "license": "MIT", "engines": { "node": ">=10.0.0" } @@ -4151,8 +4138,7 @@ "node_modules/esm-env": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", - "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", - "dev": true + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==" }, "node_modules/esniff": { "version": "2.0.1", @@ -4197,6 +4183,16 @@ "node": ">=0.10" } }, + "node_modules/esrap": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz", + "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -4222,6 +4218,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, "dependencies": { "@types/estree": "^1.0.0" } @@ -4962,6 +4959,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "license": "MIT", "dependencies": { "@types/estree": "*" } @@ -5329,9 +5327,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", + "version": "0.30.12", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -5475,11 +5473,6 @@ "url": "https://github.com/maplibre/maplibre-gl-js?sponsor=1" } }, - "node_modules/mdn-data": { - "version": "2.0.30", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", - "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" - }, "node_modules/memoizee": { "version": "0.4.17", "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.17.tgz", @@ -5601,9 +5594,10 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/murmurhash-js": { "version": "1.0.0", @@ -5943,16 +5937,6 @@ "pbf": "bin/pbf" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, "node_modules/picocolors": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", @@ -6860,14 +6844,14 @@ } }, "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", + "integrity": "sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==", "license": "MIT", "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.2", - "engine.io-client": "~6.6.1", + "engine.io-client": "~6.5.2", "socket.io-parser": "~4.2.4" }, "engines": { @@ -6930,6 +6914,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -7176,28 +7161,27 @@ } }, "node_modules/svelte": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.19.tgz", - "integrity": "sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.5.tgz", + "integrity": "sha512-AyYondx6wS0g8mmBMfwJVnOYYBswjBv6L4bc99awfbET2KozWvVwxe8NSN7fhx7Pgr7pOfOXIv7K8+Impc0OoQ==", "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@jridgewell/sourcemap-codec": "^1.4.15", - "@jridgewell/trace-mapping": "^0.3.18", - "@types/estree": "^1.0.1", - "acorn": "^8.9.0", - "aria-query": "^5.3.0", - "axobject-query": "^4.0.0", - "code-red": "^1.0.3", - "css-tree": "^2.3.1", - "estree-walker": "^3.0.3", - "is-reference": "^3.0.1", + "@ampproject/remapping": "^2.3.0", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@types/estree": "^1.0.5", + "acorn": "^8.12.1", + "acorn-typescript": "^1.4.13", + "aria-query": "^5.3.1", + "axobject-query": "^4.1.0", + "esm-env": "^1.0.0", + "esrap": "^1.2.2", + "is-reference": "^3.0.2", "locate-character": "^3.0.0", - "magic-string": "^0.30.4", - "periscopic": "^3.1.0" + "magic-string": "^0.30.11", + "zimmerframe": "^1.1.2" }, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/svelte-check": { @@ -7318,18 +7302,6 @@ "integrity": "sha512-kElJnoZrQtlkXE0O/RcKioz9NP0Sxx05j31ohyosNkydo6NOEsZB85mhoaCxOQNjxN+QPumYWfmIUsznYFjihA==", "license": "MIT" }, - "node_modules/svelte-hmr": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", - "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", - "dev": true, - "engines": { - "node": "^12.20 || ^14.13.1 || >= 16" - }, - "peerDependencies": { - "svelte": "^3.19.0 || ^4.0.0" - } - }, "node_modules/svelte-i18n": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/svelte-i18n/-/svelte-i18n-4.0.1.tgz", @@ -7821,6 +7793,15 @@ "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0-next.1" } }, + "node_modules/svelte/node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -8420,12 +8401,17 @@ } }, "node_modules/vitefu": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", - "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.0.3.tgz", + "integrity": "sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==", "dev": true, + "license": "MIT", + "workspaces": [ + "tests/deps/*", + "tests/projects/*" + ], "peerDependencies": { - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0" }, "peerDependenciesMeta": { "vite": { @@ -8757,9 +8743,9 @@ "peer": true }, "node_modules/xmlhttprequest-ssl": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.1.tgz", - "integrity": "sha512-ptjR8YSJIXoA3Mbv5po7RtSYHO6mZr8s7i5VGmEk7QY2pQWyT1o0N+W1gKbOyJPUCGXGnuw0wqe8f0L6Y0ny7g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz", + "integrity": "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==", "engines": { "node": ">=0.4.0" } @@ -8820,6 +8806,12 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zimmerframe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz", + "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==", + "license": "MIT" } } } diff --git a/web/package.json b/web/package.json index 103f4535f9..b67f1cf471 100644 --- a/web/package.json +++ b/web/package.json @@ -8,7 +8,7 @@ "build:stats": "BUILD_STATS=true vite build", "package": "svelte-kit package", "preview": "vite preview", - "check:svelte": "svelte-check --no-tsconfig --fail-on-warnings", + "check:svelte": "svelte-check --no-tsconfig --fail-on-warnings --compiler-warnings 'reactive_declaration_non_reactive_property:ignore'", "check:typescript": "tsc --noEmit", "check:watch": "npm run check:svelte -- --watch", "check:code": "npm run format && npm run lint && npm run check:svelte && npm run check:typescript", @@ -27,12 +27,12 @@ "@eslint/js": "^9.8.0", "@faker-js/faker": "^9.0.0", "@socket.io/component-emitter": "^3.1.0", - "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/enhanced-img": "^0.3.0", - "@sveltejs/kit": "^2.5.18", - "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@sveltejs/kit": "^2.7.2", + "@sveltejs/vite-plugin-svelte": "^4.0.0", "@testing-library/jest-dom": "^6.4.2", - "@testing-library/svelte": "^5.2.0", + "@testing-library/svelte": "^5.2.4", "@testing-library/user-event": "^14.5.2", "@types/dom-to-image": "^2.6.7", "@types/justified-layout": "^4.1.4", @@ -55,7 +55,7 @@ "prettier-plugin-sort-json": "^4.0.0", "prettier-plugin-svelte": "^3.2.6", "rollup-plugin-visualizer": "^5.12.0", - "svelte": "^4.2.19", + "svelte": "^5.1.5", "svelte-check": "^4.0.0", "tailwindcss": "^3.4.1", "tslib": "^2.6.2", @@ -79,9 +79,9 @@ "justified-layout": "^4.1.0", "lodash-es": "^4.17.21", "luxon": "^3.4.4", - "socket.io-client": "^4.7.4", + "socket.io-client": "~4.7.5", "svelte-gestures": "^5.0.4", - "svelte-i18n": "^4.0.0", + "svelte-i18n": "^4.0.1", "svelte-local-storage-store": "^0.6.4", "svelte-maplibre": "^0.9.13", "thumbhash": "^0.1.1" diff --git a/web/src/lib/__mocks__/animate.mock.ts b/web/src/lib/__mocks__/animate.mock.ts new file mode 100644 index 0000000000..5f0d367d86 --- /dev/null +++ b/web/src/lib/__mocks__/animate.mock.ts @@ -0,0 +1,17 @@ +import { tick } from 'svelte'; +import { vi } from 'vitest'; + +export const getAnimateMock = () => + vi.fn().mockImplementation(() => { + let onfinish: (() => void) | null = null; + void tick().then(() => onfinish?.()); + + return { + set onfinish(fn: () => void) { + onfinish = fn; + }, + cancel() { + onfinish = null; + }, + }; + }); 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 b0af3a710f..81c23e927b 100644 --- a/web/src/lib/components/admin-page/jobs/job-tile.svelte +++ b/web/src/lib/components/admin-page/jobs/job-tile.svelte @@ -14,14 +14,14 @@ mdiPlay, mdiSelectionSearch, } from '@mdi/js'; - import { type ComponentType } from 'svelte'; + import { type Component } from 'svelte'; import { t } from 'svelte-i18n'; import JobTileButton from './job-tile-button.svelte'; import JobTileStatus from './job-tile-status.svelte'; export let title: string; export let subtitle: string | undefined; - export let description: ComponentType | undefined; + export let description: Component | undefined; export let jobCounts: JobCountsDto; export let queueStatus: QueueStatusDto; export let icon: string; diff --git a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte index 8702a1e933..67d672d398 100644 --- a/web/src/lib/components/admin-page/jobs/jobs-panel.svelte +++ b/web/src/lib/components/admin-page/jobs/jobs-panel.svelte @@ -19,7 +19,7 @@ mdiTagFaces, mdiVideo, } from '@mdi/js'; - import type { ComponentType } from 'svelte'; + import type { Component } from 'svelte'; import JobTile from './job-tile.svelte'; import StorageMigrationDescription from './storage-migration-description.svelte'; import { dialogController } from '$lib/components/shared-components/dialog/dialog'; @@ -30,7 +30,7 @@ interface JobDetails { title: string; subtitle?: string; - description?: ComponentType; + description?: Component; allText?: string; refreshText?: string; missingText: string; @@ -56,6 +56,7 @@ await handleCommand(jobId, dto); }; + // svelte-ignore reactive_declaration_non_reactive_property $: jobDetails = >>{ [JobName.ThumbnailGeneration]: { icon: mdiFileJpgBox, diff --git a/web/src/lib/components/album-page/albums-controls.svelte b/web/src/lib/components/album-page/albums-controls.svelte index 14faee5e7f..34563eddd3 100644 --- a/web/src/lib/components/album-page/albums-controls.svelte +++ b/web/src/lib/components/album-page/albums-controls.svelte @@ -87,6 +87,7 @@ } } + // svelte-ignore reactive_declaration_non_reactive_property $: { if (selectedGroupOption.id === AlbumGroupBy.None) { groupIcon = mdiFolderRemoveOutline; @@ -96,8 +97,10 @@ } } + // svelte-ignore reactive_declaration_non_reactive_property $: sortIcon = $albumViewSettings.sortOrder === SortOrder.Desc ? mdiArrowDownThin : mdiArrowUpThin; + // svelte-ignore reactive_declaration_non_reactive_property $: albumFilterNames = ((): Record => { return { [AlbumFilter.All]: $t('all'), @@ -106,6 +109,7 @@ }; })(); + // svelte-ignore reactive_declaration_non_reactive_property $: albumSortByNames = ((): Record => { return { [AlbumSortBy.Title]: $t('sort_title'), @@ -117,6 +121,7 @@ }; })(); + // svelte-ignore reactive_declaration_non_reactive_property $: albumGroupByNames = ((): Record => { return { [AlbumGroupBy.None]: $t('group_no'), diff --git a/web/src/lib/components/album-page/albums-list.svelte b/web/src/lib/components/album-page/albums-list.svelte index a13e37c2b5..3858dd23b7 100644 --- a/web/src/lib/components/album-page/albums-list.svelte +++ b/web/src/lib/components/album-page/albums-list.svelte @@ -135,6 +135,7 @@ let isOpen = false; // Step 1: Filter between Owned and Shared albums, or both. + // svelte-ignore reactive_declaration_non_reactive_property $: { switch (userSettings.filter) { case AlbumFilter.Owned: { diff --git a/web/src/lib/components/album-page/albums-table-header.svelte b/web/src/lib/components/album-page/albums-table-header.svelte index 2c396bebed..84e32b82f5 100644 --- a/web/src/lib/components/album-page/albums-table-header.svelte +++ b/web/src/lib/components/album-page/albums-table-header.svelte @@ -13,7 +13,7 @@ $albumViewSettings.sortOrder = option.defaultOrder; } }; - + // svelte-ignore reactive_declaration_non_reactive_property $: albumSortByNames = ((): Record => { return { [AlbumSortBy.Title]: $t('sort_title'), diff --git a/web/src/lib/components/asset-viewer/activity-viewer.svelte b/web/src/lib/components/asset-viewer/activity-viewer.svelte index 3a02454315..4f4fdb2649 100644 --- a/web/src/lib/components/asset-viewer/activity-viewer.svelte +++ b/web/src/lib/components/asset-viewer/activity-viewer.svelte @@ -293,7 +293,7 @@ class="h-[18px] {disabled ? 'cursor-not-allowed' : ''} w-full max-h-56 pr-2 items-center overflow-y-auto leading-4 outline-none resize-none bg-gray-200" - /> + > {#if isSendingMessage}
diff --git a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts index c82d9f9659..a25ea6bf90 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts +++ b/web/src/lib/components/asset-viewer/asset-viewer-nav-bar.spec.ts @@ -15,13 +15,31 @@ describe('AssetViewerNavBar component', () => { showShareButton: false, onZoomImage: () => {}, onCopyImage: () => {}, + onAction: () => {}, + onRunJob: () => {}, + onPlaySlideshow: () => {}, + onShowDetail: () => {}, + onClose: () => {}, }; + beforeAll(() => { + Element.prototype.animate = vi.fn().mockImplementation(() => ({ + cancel: () => {}, + })); + vi.stubGlobal( + 'ResizeObserver', + vi.fn(() => ({ observe: vi.fn(), unobserve: vi.fn(), disconnect: vi.fn() })), + ); + }); + afterEach(() => { - vi.resetAllMocks(); resetSavedUser(); }); + afterAll(() => { + vi.restoreAllMocks(); + }); + it('shows back button', () => { const asset = assetFactory.build({ isTrashed: false }); const { getByTitle } = render(AssetViewerNavBar, { asset, ...additionalProps }); 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 8ef4e86115..d142c43f20 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 @@ -61,6 +61,7 @@ const sharedLink = getSharedLink(); $: isOwner = $user && asset.ownerId === $user?.id; + // svelte-ignore reactive_declaration_non_reactive_property $: showDownloadButton = sharedLink ? sharedLink.allowDownload : !asset.isOffline; // $: showEditorButton = // isOwner && diff --git a/web/src/lib/components/asset-viewer/asset-viewer.svelte b/web/src/lib/components/asset-viewer/asset-viewer.svelte index 7686494aa7..4caeab6dd4 100644 --- a/web/src/lib/components/asset-viewer/asset-viewer.svelte +++ b/web/src/lib/components/asset-viewer/asset-viewer.svelte @@ -598,7 +598,7 @@ {#if stackedAsset.id == asset.id}
-
+
{/if}
diff --git a/web/src/lib/components/asset-viewer/detail-panel.svelte b/web/src/lib/components/asset-viewer/detail-panel.svelte index 88ea98778f..f7bd806afc 100644 --- a/web/src/lib/components/asset-viewer/detail-panel.svelte +++ b/web/src/lib/components/asset-viewer/detail-panel.svelte @@ -154,7 +154,7 @@

{#if $user?.isAdmin} -

{$t('admin.asset_offline_description')}

+ {$t('admin.asset_offline_description')} {:else} {$t('asset_offline_description')} {/if} diff --git a/web/src/lib/components/asset-viewer/download-panel.svelte b/web/src/lib/components/asset-viewer/download-panel.svelte index 333ee0c13b..db46e1eff0 100644 --- a/web/src/lib/components/asset-viewer/download-panel.svelte +++ b/web/src/lib/components/asset-viewer/download-panel.svelte @@ -32,7 +32,7 @@
-
+

diff --git a/web/src/lib/components/asset-viewer/editor/editor-panel.svelte b/web/src/lib/components/asset-viewer/editor/editor-panel.svelte index 1adef32735..78d5ca26e0 100644 --- a/web/src/lib/components/asset-viewer/editor/editor-panel.svelte +++ b/web/src/lib/components/asset-viewer/editor/editor-panel.svelte @@ -23,6 +23,7 @@ export let onClose: () => void; let selectedType: string = editTypes[0].name; + // svelte-ignore reactive_declaration_non_reactive_property $: selectedTypeObj = editTypes.find((t) => t.name === selectedType) || editTypes[0]; setTimeout(() => { diff --git a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte index 53a78a346c..1745cd66b6 100644 --- a/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte +++ b/web/src/lib/components/asset-viewer/photo-sphere-viewer-adapter.svelte @@ -55,4 +55,4 @@ }); -

+
diff --git a/web/src/lib/components/asset-viewer/photo-viewer.spec.ts b/web/src/lib/components/asset-viewer/photo-viewer.spec.ts index e64dc680a9..e1372e37da 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.spec.ts +++ b/web/src/lib/components/asset-viewer/photo-viewer.spec.ts @@ -1,3 +1,4 @@ +import { getAnimateMock } from '$lib/__mocks__/animate.mock'; import PhotoViewer from '$lib/components/asset-viewer/photo-viewer.svelte'; import * as utils from '$lib/utils'; import { AssetMediaSize } from '@immich/sdk'; @@ -24,6 +25,10 @@ describe('PhotoViewer component', () => { getAssetThumbnailUrlSpy = vi.spyOn(utils, 'getAssetThumbnailUrl'); }); + beforeEach(() => { + Element.prototype.animate = getAnimateMock(); + }); + afterEach(() => { vi.resetAllMocks(); }); diff --git a/web/src/lib/components/asset-viewer/photo-viewer.svelte b/web/src/lib/components/asset-viewer/photo-viewer.svelte index 4157c558d2..d7595f6b7e 100644 --- a/web/src/lib/components/asset-viewer/photo-viewer.svelte +++ b/web/src/lib/components/asset-viewer/photo-viewer.svelte @@ -193,7 +193,7 @@
+ >
{/each}
{/if} diff --git a/web/src/lib/components/assets/thumbnail/__test__/image-thumbnail.spec.ts b/web/src/lib/components/assets/thumbnail/__test__/image-thumbnail.spec.ts index 2525b86160..e14628a42f 100644 --- a/web/src/lib/components/assets/thumbnail/__test__/image-thumbnail.spec.ts +++ b/web/src/lib/components/assets/thumbnail/__test__/image-thumbnail.spec.ts @@ -3,9 +3,9 @@ import { render } from '@testing-library/svelte'; describe('ImageThumbnail component', () => { beforeAll(() => { - Object.defineProperty(HTMLImageElement.prototype, 'complete', { - value: true, - }); + Element.prototype.animate = vi.fn().mockImplementation(() => ({ + cancel: () => {}, + })); }); it('shows thumbhash while image is loading', () => { diff --git a/web/src/lib/components/assets/thumbnail/image-thumbnail.svelte b/web/src/lib/components/assets/thumbnail/image-thumbnail.svelte index 662209544a..282d152e90 100644 --- a/web/src/lib/components/assets/thumbnail/image-thumbnail.svelte +++ b/web/src/lib/components/assets/thumbnail/image-thumbnail.svelte @@ -96,5 +96,5 @@ class:rounded-full={circle} draggable="false" out:fade={{ duration: THUMBHASH_FADE_DURATION }} - /> + > {/if} diff --git a/web/src/lib/components/assets/thumbnail/thumbnail.svelte b/web/src/lib/components/assets/thumbnail/thumbnail.svelte index ac67605fc6..4c2cf74518 100644 --- a/web/src/lib/components/assets/thumbnail/thumbnail.svelte +++ b/web/src/lib/components/assets/thumbnail/thumbnail.svelte @@ -218,6 +218,7 @@ href={currentUrlReplaceAssetId(asset.id)} on:click={(evt) => evt.preventDefault()} tabindex={0} + aria-label="Thumbnail URL" > {/if} @@ -255,12 +256,12 @@
+ >
+ >
{#if !isSharedLink() && asset.isFavorite} @@ -339,7 +340,7 @@ class="absolute top-0 h-full w-full bg-immich-primary opacity-40" in:fade={{ duration: 100 }} out:fade={{ duration: 100 }} - /> + >
{/if}
{/if} diff --git a/web/src/lib/components/assets/thumbnail/video-thumbnail.svelte b/web/src/lib/components/assets/thumbnail/video-thumbnail.svelte index 5cac0b1945..14f99ac331 100644 --- a/web/src/lib/components/assets/thumbnail/video-thumbnail.svelte +++ b/web/src/lib/components/assets/thumbnail/video-thumbnail.svelte @@ -113,7 +113,10 @@ }} on:timeupdate={({ currentTarget }) => { const remaining = currentTarget.duration - currentTarget.currentTime; - remainingSeconds = Math.min(Math.ceil(remaining), durationInSeconds); + remainingSeconds = Math.min( + Math.ceil(Number.isNaN(remaining) ? Number.POSITIVE_INFINITY : remaining), + durationInSeconds, + ); }} - /> + > {/if} diff --git a/web/src/lib/components/elements/dropdown.svelte b/web/src/lib/components/elements/dropdown.svelte index 0016bbe538..80689ef1fe 100644 --- a/web/src/lib/components/elements/dropdown.svelte +++ b/web/src/lib/components/elements/dropdown.svelte @@ -102,7 +102,7 @@ {renderedOption.title}

{:else} -
+

{renderedOption.title}

diff --git a/web/src/lib/components/elements/slider.svelte b/web/src/lib/components/elements/slider.svelte index efe67fda9c..4c19696372 100644 --- a/web/src/lib/components/elements/slider.svelte +++ b/web/src/lib/components/elements/slider.svelte @@ -28,11 +28,11 @@ {#if disabled} + > {:else} + > {/if} diff --git a/web/src/lib/components/faces-page/face-thumbnail.svelte b/web/src/lib/components/faces-page/face-thumbnail.svelte index f30029ac8f..cce91b4669 100644 --- a/web/src/lib/components/faces-page/face-thumbnail.svelte +++ b/web/src/lib/components/faces-page/face-thumbnail.svelte @@ -36,14 +36,14 @@ class:hover:opacity-100={selectable} class:rounded-full={circle} class:rounded-lg={!circle} - /> + >
{#if selected}
+ >
{/if} {#if person.name} diff --git a/web/src/lib/components/faces-page/manage-people-visibility.svelte b/web/src/lib/components/faces-page/manage-people-visibility.svelte index a48fd6bf74..90e20a1e5b 100644 --- a/web/src/lib/components/faces-page/manage-people-visibility.svelte +++ b/web/src/lib/components/faces-page/manage-people-visibility.svelte @@ -44,6 +44,8 @@ return personIsHidden; }; + // svelte-ignore reactive_declaration_non_reactive_property + // svelte-ignore reactive_declaration_module_script_dependency $: toggleButtonOptions = ((): Record => { return { [ToggleVisibility.HIDE_ALL]: { icon: mdiEyeOff, label: $t('hide_all_people') }, 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 9cb3078ec0..52daa36a99 100644 --- a/web/src/lib/components/faces-page/merge-face-selector.svelte +++ b/web/src/lib/components/faces-page/merge-face-selector.svelte @@ -102,7 +102,7 @@ {:else} {$t('merge_people')} {/if} -
+