Toast is back to a fixed 320 — it is the same card wherever it appears
and should not restyle itself around whatever menu is open.
The residual indent was never the width step: two rounded boxes stacked
on one edge each contribute a corner that curves away over exactly one
radius, so the outline pinches and bulges at the joint. The curves only
cancel at 2*radius of overlap, where the corner circles coincide.
Burying that deep would drive the cards together, so a fused panel grows
by what it buries. Content is pinned 12px from the panel top, not
centred, so the extra height lands entirely below the cards and the
clearance stays 12px. Geometry now derives from baseH, keeping height
(which depends on fused) out of the position that decides it.
The warp was a width step. Panel and toast are both left-anchored to the
bar, so different widths put a step on the shared right edge, and smin
fillets a step into an S-curve waist.
Toast now takes the open dropdown's drawn width, keyed off its declared
fullWidth so nothing closes a loop through the toast's own height. Below
a 200px floor there is no width worth matching (the power menu is a 64px
icon strip), so those stand off with a gap as before.
The bump was two animations stacked: _dropdownRect is positioned off
chrome.y, so chrome already eased the panel to wherever y resolved, and
the Behavior added last commit put an OutExpo behind an OutExpo.
Panels now land ON the toast rather than a panelGap short of it, buried
half a radius so the shader smins them into one outline with a shared
waist. Cards inside still clear each other by ~14px.
The toast dodging open dropdowns meant it drifted around the column
depending on which menu was open. Invert it: the toast keeps its band
and melts into the frame as before, and a dropdown treats a live toast
as a shortened screen — its clamp ends short of the toast, so a menu
that would collide opens higher instead.
Snapping still tests against the frame, so a panel stopping above a
toast floats clear of it rather than fusing to its edge.
alignTop/alignBottom were per-dropdown flags, so the battery menu pinned
to the bottom wherever its icon sat. Both replaced by a distance test
against Theme.snapDist, which the SDF already used to decide melting —
panels now fuse with a band only when they actually reach it, and a menu
that gains or loses a card re-decides on its own.
Toast steps clear of an open dropdown instead of drawing over it, and
stops melting into the frame band once it has.
Screen recorder was desktop-only, caffeine laptop-only, nightlight in
both places. Cog dropdown now holds recorder + nightlight on every host;
battery dropdown keeps the laptop-only power profile and brightness.
Caffeine stays gated: hypridle is mkIf isMacbook.
settings/theming.nix renders a full config set per wallpaper (GTK, ghostty,
btop, hyprland, vesktop, zen, folder icons) from its own base16 palette;
theme-apply swaps them in and reloads what can reload.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>