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} +
+
+
+

{label}

+
+ {#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 @@ >
{#if !isAuthPage} - -

- {$appConfigStore.appName} -

+ + +

+ {$appConfigStore.appName} +

+
{/if}
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 @@ - -