Files
deepseek-harness/snapshots/web/sidebar-scrollbar
63026c7a5c feat(client): 左侧栏纵向空间优化,工作区滚动吸顶优化 (#7337)
* feat(client): share sidebar scrolling and dock workspace header

* fix(client): keep shared sidebar scrolling vertical

* fix(client): match sticky workspace header to sidebar fill

* fix(client): stabilize transparent sticky sidebar and compact row layout

* refactor(ui-primitives): keep sticky section observer internal

* fix(ui-primitives): limit row animations to visible scrollports

* feat(ui-workspace): drive sticky clipping with scroll timelines

* refactor(ui-primitives): bound row animations by the window

* feat(client): hand off sidebar wheel scrolling to the workspace list

The workspace list scrolls inside its own one-viewport section below the toolbar instead of sliding under a clipped sticky toolbar. The sidebar viewport scrolls the navigation away first; ui-sidebar's scroll hand-off splits each wheel event between the viewport and the section scroller, which the occupant binds through the slot-level useSectionScroller hook supplied by hookContext.

* test(client): cover the sidebar scroll hand-off and align the list scrollbar

Test-owned sidebar roles declare the slot-level scroller inject and pass its hookContext. Unit tests cover the hand-off split, wheel filtering, and listener rebinding; the e2e scenario checks one wheel event crossing from the navigation into the list and back. The list area reaches 2px from the sidebar edge for its scrollbar while rows keep the 8px inset. The unused clip module, its tests, and the sticky clearance variable are removed; READMEs and the slot catalog describe the nested scrolling.

* refactor(ui-primitives): restore MenuGroup sticky observation

The section observer was extracted for a sticky workspace toolbar that nested scrolling no longer has, so MenuGroup is its only consumer again. MenuGroup and its tests return to the master implementation.

* fix(client): keep native sidebar scrolling away from the hand-off boundary

The hand-off splits a wheel gesture in JavaScript only when its first event must move the sidebar viewport or starts outside the section scroller, and then keeps that gesture, including momentum, until wheel events pause for 100ms. Gestures the section scroller can take alone stay native, an uncancelable native gesture that reaches the section top passes the rest to the viewport, and events another listener canceled are left alone. The section is at most one viewport tall, and exactly that tall while search is expanded, so a short list leaves the navigation in place. Stale absence assertions and unused viewport declarations are removed; the READMEs document portals and the data-sidebar markers.

---------

Co-authored-by: Yif <[email protected]>
Co-authored-by: imccyu <[email protected]>
2026-11-02 22:27:26 +08:00
..