{item.children.map((c) => (
!l.webOnly) : ALL_LINKS;
+ // The header carries no backdrop-blur, deliberately. It is `sticky`, so the
+ // content behind it changes on every scroll frame - which means a
+ // backdrop-filter has to re-sample and re-blur the full width of the viewport
+ // 60 times a second. On a 4K display that is ~3840px of blur per frame, and
+ // WebKitGTK (what the desktop app renders with) is markedly slower at it than
+ // Chromium. It was the largest single cause of scroll jank in the desktop
+ // app, and invisible in profiles taken at rest: idle cost was zero.
+ //
+ // An opaque background lands within a hair of the same look on a dark theme
+ // for no per-frame cost. Blur is still fine on surfaces that do not sit over
+ // moving content - the dropdown above only exists while it is open.
return (
-
+