{$_('avatar.cropHint')}
+ +{errorText || errorMessage}
+ {/if} +
diff --git a/frontend/src/routes/profile/+page.svelte b/frontend/src/routes/profile/+page.svelte
index c364d914..4edce794 100644
--- a/frontend/src/routes/profile/+page.svelte
+++ b/frontend/src/routes/profile/+page.svelte
@@ -4,7 +4,7 @@
import { api } from '#lib/api.js';
import PasswordRequirements from '#lib/components/PasswordRequirements.svelte';
import { currentUser } from '#lib/stores/auth.js';
- import { Calendar, Check, Copy, ExternalLink, Info, Pencil, Trash2 } from '@lucide/svelte';
+ import { BadgeCheck, Calendar, Check, Copy, ExternalLink, ImagePlus, Info, PawPrint, Pencil, RefreshCw, Trash2 } from '@lucide/svelte';
import { _, SUPPORTED_LOCALES, setLocale } from '#lib/i18n/index.js';
import { getPasswordChecks, passwordChecksPassed, passwordPattern } from '#lib/password.js';
import { getTimezone, setTimezone, detectTimezone } from '#lib/stores/timezone.js';
@@ -12,6 +12,8 @@
import Alert from '#lib/components/Alert.svelte';
import SearchableSelect from '#lib/components/SearchableSelect.svelte';
import AdaptiveDateInput from '#lib/components/AdaptiveDateInput.svelte';
+ import UserAvatar from '#lib/components/UserAvatar.svelte';
+ import AvatarCropper from '#lib/components/AvatarCropper.svelte';
import ShareLinkDialog from '#lib/components/ShareLinkDialog.svelte';
import { toasts } from '#lib/toasts.js';
import { localizeError } from '#lib/errors.js';
@@ -19,6 +21,8 @@ import ShareLinkDialog from '#lib/components/ShareLinkDialog.svelte';
import type {
ApiKeyMeta,
AppConfig,
+ AvatarOptions,
+ AvatarSource,
EmbedTokenMeta,
OidcConfig,
OidcLinkStatus,
@@ -42,10 +46,17 @@ import ShareLinkDialog from '#lib/components/ShareLinkDialog.svelte';
let keys = $state
{$_('avatar.uploadHint')}
+{$_('avatar.oidcRefreshHint')}
+