Switching to a tray menu whose items were not currently loaded
collapsed fullHeight at the instant of the switch, so the chrome
morphed DOWN to a stub and replayed the vertical grow when the items
landed, rather than moving across from the previous panel.
An empty Card is not height 0 but 2*cardPad, so loaded-ness has to come
from the model: menuLoaded tracks menuOpener.children. While a newly
assigned menu is loading, fullHeight holds the last loaded height, so
the morph stays continuous and the correction on arrival is small —
nil when it is the same menu as last time.
ui.nix radius knob at 20.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
New settings/ui.nix holds `radius` as the one source of truth. Theme
derives radiusCard/Small/Tiny from it and hyprland's decoration.rounding
reads the same value, so one number rescales the whole desktop —
previously the shell and the window corners were unrelated constants,
which is why doubling Theme.radius left windows at 8.
Cards were using the SAME radius as the panel containing them. Nested
corners need outer − gap; matching them makes the inner corner
over-round for its size, which is the inflated/balloon look. All nine
inner surfaces now use radiusCard (radius − panelGap). Invisible at
r=8, obvious at r=32.
Radius 32 -> 24.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>