← Now
v2.4.102April 1, 2026

User Menu Redesign

Vallit · 2 min read

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.


What changed
Platform

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.


Platform

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.


Platform

Black hover state

The logout row goes full black on hover in both dark and light mode.


Infra

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.