diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 490eec47..ed5dfd0e 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "pocket-id-frontend",
- "version": "0.44.0",
+ "version": "0.45.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "pocket-id-frontend",
- "version": "0.44.0",
+ "version": "0.45.0",
"dependencies": {
"@simplewebauthn/browser": "^13.1.0",
"@tailwindcss/vite": "^4.0.0",
@@ -16,7 +16,7 @@
"crypto": "^1.0.1",
"formsnap": "^1.0.1",
"jose": "^5.9.6",
- "lucide-svelte": "^0.479.0",
+ "lucide-svelte": "^0.483.0",
"mode-watcher": "^0.5.1",
"svelte-sonner": "^0.3.28",
"sveltekit-superforms": "^2.23.1",
@@ -3605,9 +3605,9 @@
"dev": true
},
"node_modules/lucide-svelte": {
- "version": "0.479.0",
- "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.479.0.tgz",
- "integrity": "sha512-epCj6WL86ykxg7oCQTmPEth5e11pwJUzIfG9ROUsWsTP+WPtb3qat+VmAjfx/r4TRW7memTFcbTPvMrZvKthqw==",
+ "version": "0.483.0",
+ "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.483.0.tgz",
+ "integrity": "sha512-MyMgEVLlFfPbyodGpkB+KCpyPkpjI7EKiFw1crA92B1ZXRK5hq5vTsGWAm9Nt3GAKHunoNc5MVsq3EOCz0DZSQ==",
"peerDependencies": {
"svelte": "^3 || ^4 || ^5.0.0-next.42"
}
diff --git a/frontend/package.json b/frontend/package.json
index 6a3db08a..60557f6e 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -1,59 +1,59 @@
{
- "name": "pocket-id-frontend",
- "version": "0.45.0",
- "private": true,
- "type": "module",
- "scripts": {
- "dev": "vite dev --port 3000",
- "build": "vite build",
- "preview": "vite preview --port 3000",
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "lint": "prettier --check . && eslint .",
- "format": "prettier --write ."
- },
- "dependencies": {
- "@simplewebauthn/browser": "^13.1.0",
- "@tailwindcss/vite": "^4.0.0",
- "axios": "^1.8.2",
- "bits-ui": "^0.22.0",
- "clsx": "^2.1.1",
- "crypto": "^1.0.1",
- "formsnap": "^1.0.1",
- "jose": "^5.9.6",
- "lucide-svelte": "^0.479.0",
- "mode-watcher": "^0.5.1",
- "svelte-sonner": "^0.3.28",
- "sveltekit-superforms": "^2.23.1",
- "tailwind-merge": "^2.6.0",
- "tailwind-variants": "^0.3.1",
- "zod": "^3.24.1"
- },
- "devDependencies": {
- "@inlang/paraglide-js": "^2.0.0",
- "@inlang/plugin-m-function-matcher": "^2.0.7",
- "@inlang/plugin-message-format": "^4.0.0",
- "@internationalized/date": "^3.7.0",
- "@playwright/test": "^1.50.0",
- "@sveltejs/adapter-auto": "^4.0.0",
- "@sveltejs/adapter-node": "^5.2.12",
- "@sveltejs/kit": "^2.16.1",
- "@sveltejs/vite-plugin-svelte": "^5.0.3",
- "@types/eslint": "^9.6.1",
- "@types/node": "^22.10.10",
- "eslint": "^9.19.0",
- "eslint-config-prettier": "^10.0.1",
- "eslint-plugin-svelte": "^2.46.1",
- "globals": "^15.14.0",
- "prettier": "^3.4.2",
- "prettier-plugin-svelte": "^3.3.3",
- "prettier-plugin-tailwindcss": "^0.6.11",
- "svelte": "^5.19.3",
- "svelte-check": "^4.1.4",
- "tailwindcss": "^4.0.0",
- "tslib": "^2.8.1",
- "typescript": "^5.7.3",
- "typescript-eslint": "^8.21.0",
- "vite": "^6.2.3"
- }
+ "name": "pocket-id-frontend",
+ "version": "0.45.0",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "dev": "vite dev --port 3000",
+ "build": "vite build",
+ "preview": "vite preview --port 3000",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
+ "lint": "prettier --check . && eslint .",
+ "format": "prettier --write ."
+ },
+ "dependencies": {
+ "@simplewebauthn/browser": "^13.1.0",
+ "@tailwindcss/vite": "^4.0.0",
+ "axios": "^1.8.2",
+ "bits-ui": "^0.22.0",
+ "clsx": "^2.1.1",
+ "crypto": "^1.0.1",
+ "formsnap": "^1.0.1",
+ "jose": "^5.9.6",
+ "lucide-svelte": "^0.483.0",
+ "mode-watcher": "^0.5.1",
+ "svelte-sonner": "^0.3.28",
+ "sveltekit-superforms": "^2.23.1",
+ "tailwind-merge": "^2.6.0",
+ "tailwind-variants": "^0.3.1",
+ "zod": "^3.24.1"
+ },
+ "devDependencies": {
+ "@inlang/paraglide-js": "^2.0.0",
+ "@inlang/plugin-m-function-matcher": "^2.0.7",
+ "@inlang/plugin-message-format": "^4.0.0",
+ "@internationalized/date": "^3.7.0",
+ "@playwright/test": "^1.50.0",
+ "@sveltejs/adapter-auto": "^4.0.0",
+ "@sveltejs/adapter-node": "^5.2.12",
+ "@sveltejs/kit": "^2.16.1",
+ "@sveltejs/vite-plugin-svelte": "^5.0.3",
+ "@types/eslint": "^9.6.1",
+ "@types/node": "^22.10.10",
+ "eslint": "^9.19.0",
+ "eslint-config-prettier": "^10.0.1",
+ "eslint-plugin-svelte": "^2.46.1",
+ "globals": "^15.14.0",
+ "prettier": "^3.4.2",
+ "prettier-plugin-svelte": "^3.3.3",
+ "prettier-plugin-tailwindcss": "^0.6.11",
+ "svelte": "^5.19.3",
+ "svelte-check": "^4.1.4",
+ "tailwindcss": "^4.0.0",
+ "tslib": "^2.8.1",
+ "typescript": "^5.7.3",
+ "typescript-eslint": "^8.21.0",
+ "vite": "^6.2.3"
+ }
}
diff --git a/frontend/src/app.css b/frontend/src/app.css
index 6fead588..5b91980b 100644
--- a/frontend/src/app.css
+++ b/frontend/src/app.css
@@ -1,4 +1,4 @@
-@import "tailwindcss";
+@import 'tailwindcss';
@config '../tailwind.config.ts';
@@ -68,6 +68,55 @@
}
}
+.animate-fade-in {
+ animation: fadeIn 0.8s ease-out forwards;
+ opacity: 0;
+}
+
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes slide-bg-container {
+ 0% {
+ left: 0;
+ }
+ 100% {
+ left: 650px;
+ }
+}
+
+.animate-slide-bg-container {
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ animation: slide-bg-container 1.2s cubic-bezier(0.33, 1, 0.68, 1) forwards;
+}
+
+/* Fade in for content after the slide is mostly complete */
+@keyframes delayed-fade {
+ 0%,
+ 40% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+
+.animate-delayed-fade {
+ animation: delayed-fade 1.5s ease-out forwards;
+}
+
@layer base {
* {
@apply border-border;
@@ -77,7 +126,7 @@
@apply bg-background text-foreground;
}
- button{
+ button {
@apply cursor-pointer;
}
diff --git a/frontend/src/lib/components/collapsible-card.svelte b/frontend/src/lib/components/collapsible-card.svelte
index 4f4bcba0..e1b94cae 100644
--- a/frontend/src/lib/components/collapsible-card.svelte
+++ b/frontend/src/lib/components/collapsible-card.svelte
@@ -1,23 +1,25 @@
+
+
+
+
+
+
+ {@render children()}
+
diff --git a/frontend/src/lib/components/form/profile-picture-settings.svelte b/frontend/src/lib/components/form/profile-picture-settings.svelte
index 88fc7005..1fcf142e 100644
--- a/frontend/src/lib/components/form/profile-picture-settings.svelte
+++ b/frontend/src/lib/components/form/profile-picture-settings.svelte
@@ -5,6 +5,7 @@
import { LucideLoader, LucideRefreshCw, LucideUpload } from 'lucide-svelte';
import { openConfirmDialog } from '../confirm-dialog';
import { m } from '$lib/paraglide/messages';
+ import type UserService from '$lib/services/user-service';
let {
userId,
@@ -34,7 +35,7 @@
reader.readAsDataURL(file);
await updateCallback(file).catch(() => {
- imageDataURL = `/api/users/${userId}/profile-picture.png}`;
+ imageDataURL = `/api/users/${userId}/profile-picture.png`;
});
isLoading = false;
}
@@ -55,62 +56,53 @@
}
-
-
-
-
{m.profile_picture()}
- {#if isLdapUser}
-
- {m.profile_picture_is_managed_by_ldap_server()}
-
- {:else}
-
- {m.click_profile_picture_to_upload_custom()}
-
-
{m.image_should_be_in_format()}
- {/if}
-
-
+
+
{#if isLdapUser}
{:else}
-
-
-
-
-
-
-
- {#if isLoading}
-
- {:else}
-
- {/if}
-
+
+
+
+
+
+
+ {#if isLoading}
+
+ {:else}
+
+ {/if}
-
-
+
+
+ {/if}
+
+
+
+
{m.profile_picture()}
+ {#if isLdapUser}
+
+ {m.profile_picture_is_managed_by_ldap_server()}
+
+ {:else}
+
+ {m.click_profile_picture_to_upload_custom()}
+
+
{m.image_should_be_in_format()}
+
{/if}
diff --git a/frontend/src/lib/components/glass-row-item.svelte b/frontend/src/lib/components/glass-row-item.svelte
new file mode 100644
index 00000000..e629bcb4
--- /dev/null
+++ b/frontend/src/lib/components/glass-row-item.svelte
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+ {#if icon}{@const Icon = icon}
+
+ {/if}
+
+
+
+ {#if description}
+
+
+ {description}
+
+ {/if}
+
+
+
+
+
+
+
+
+ {m.rename()}
+
+
+
+
+
+
+ {m.delete()}
+
+
+
+
diff --git a/frontend/src/lib/components/header/header.svelte b/frontend/src/lib/components/header/header.svelte
index 770929ed..da85e11f 100644
--- a/frontend/src/lib/components/header/header.svelte
+++ b/frontend/src/lib/components/header/header.svelte
@@ -20,10 +20,15 @@
>
diff --git a/frontend/src/lib/components/login-wrapper.svelte b/frontend/src/lib/components/login-wrapper.svelte
index ed66852d..dae7c798 100644
--- a/frontend/src/lib/components/login-wrapper.svelte
+++ b/frontend/src/lib/components/login-wrapper.svelte
@@ -1,34 +1,46 @@
-
-