.buzz-sidebar-scrollbar { scrollbar-color: transparent transparent; } .buzz-sidebar-scrollbar:hover { scrollbar-color: var( --buzz-sidebar-scrollbar-thumb, hsl(var(--sidebar-border) / 0.8) ) transparent; } .buzz-sidebar-scrollbar::-webkit-scrollbar { height: 10px; width: 10px; } .buzz-sidebar-scrollbar::-webkit-scrollbar-track { background: transparent; } .buzz-sidebar-scrollbar::-webkit-scrollbar-thumb { background-clip: content-box; background-color: transparent; border: 3px solid transparent; border-radius: 999px; } .buzz-sidebar-scrollbar:hover::-webkit-scrollbar-thumb { background-color: var( --buzz-sidebar-scrollbar-thumb, hsl(var(--sidebar-border) / 0.8) ); } /* Channel activity keeps its chrome outside the scrolling surface. The slim, * low-contrast thumb belongs only to the activity list beneath the header. */ .buzz-channel-activity-scrollbar { scrollbar-gutter: stable; } .buzz-channel-activity-scrollbar::-webkit-scrollbar { width: 8px; } .buzz-channel-activity-scrollbar::-webkit-scrollbar-track { background: transparent; } .buzz-channel-activity-scrollbar::-webkit-scrollbar-thumb { background-clip: content-box; background-color: hsl(var(--foreground) / 0.15); border: 2px solid transparent; border-radius: 999px; } /* * Main-content scroll areas that have sticky blurred chrome inside them. * Native overlay scrollbars paint UNDER composited descendants * (backdrop-filter + z-index) in WKWebView, so the thumb looks cut off * behind the blur bar. A custom scrollbar occupies its own gutter outside * the content box, so sticky children can no longer cover it. */ /* * NOTE: no `scrollbar-color` here on purpose — when the standard property is * set, engines ignore the `::-webkit-scrollbar` pseudo styles and fall back * to overlay scrollbars, which reintroduces the bug. */ .buzz-content-scrollbar { scrollbar-gutter: stable; } .buzz-content-scrollbar::-webkit-scrollbar { height: 10px; width: 10px; } .buzz-content-scrollbar::-webkit-scrollbar-track { background: transparent; } /* The native thumb stays permanently transparent (but grabbable — the hit * area is real). Visibility while scrolling is handled by a separate overlay * indicator element positioned over the gutter, because WebKit does not * re-resolve `::-webkit-scrollbar` styles when classes/attributes on the * scroller change dynamically. */ .buzz-content-scrollbar::-webkit-scrollbar-thumb { background-clip: content-box; background-color: transparent; border: 3px solid transparent; border-radius: 999px; } /* Scrollbar-part pseudo-classes are resolved by the scrollbar itself, so * these DO update dynamically — keep the thumb visible under the pointer. */ .buzz-content-scrollbar::-webkit-scrollbar-thumb:hover, .buzz-content-scrollbar::-webkit-scrollbar-thumb:active { background-color: hsl(var(--border) / 0.9); }