User Menu Redesign
Small surfaces carry a lot of trust. The user menu is the first thing you interact with every session — so getting the details right matters. This update makes it feel intentional.
The trigger is now the full row — avatar, name, and email — so the whole footer area responds to a click, not just the tiny avatar circle. Inside, segmented controls replace the old radio groups: a monitor icon for System, sun and moon for light and dark mode, plain EN / DE text labels for language. Every icon comes from the same Lucide set used across the rest of the app, so nothing looks out of place.
Hover on the logout row goes full black regardless of theme — a deliberate contrast that makes a destructive action feel distinct. The dropdown itself animates in with a quick fade and scale from the bottom-left origin. On the bug-fix side, the language preference was silently failing to persist because errors from the save request were being swallowed. The fix adds proper async handling so failures are surfaced and the "Saving…" state accurately reflects the real in-flight request.
Full-row sidebar trigger
Avatar, name, and email are now a single clickable button — no more hunting for the small circle.
Previously only the 28 px avatar circle opened the menu, with name and email rendered as inert text next to it. The trigger now spans the full footer width, making it easier to hit and visually coherent.
Cohesive Lucide icon set
Monitor, Sun, Moon, Globe, and LogOut — all from the same stroke-based family as the rest of the UI.
The previous menu mixed emoji characters with Lucide icons. Every slot now uses a proper SVG: Monitor for System, Sun for Hell, Moon for Dunkel, Globe for Sprache, LogOut for Abmelden. Language options EN and DE stay as clean text labels.
Black hover state
The logout row goes full black on hover in both dark and light mode.
Language preference persistence fix
Save failures are no longer swallowed silently — language selection now reliably survives a hard refresh.
The previous implementation used useTransition with a fire-and-forget fetch, meaning any network or server error was invisible to the user. The preference appeared saved client-side but reset to System on the next page load. The fix replaces this with explicit async/await and error logging so failures are always surfaced.