Skip to content

Commit 0c8de47

Browse files
authored
fix(app): file tabs - auto scroll on open & scroll via mouse wheel (#11070)
1 parent 7ad165f commit 0c8de47

1 file changed

Lines changed: 56 additions & 1 deletion

File tree

packages/app/src/pages/session.tsx

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2183,7 +2183,62 @@ export default function Page() {
21832183
<ConstrainDragYAxis />
21842184
<Tabs value={activeTab()} onChange={openTab}>
21852185
<div class="sticky top-0 shrink-0 flex">
2186-
<Tabs.List>
2186+
<Tabs.List
2187+
ref={(el) => {
2188+
let scrollTimeout: number | undefined
2189+
let prevScrollWidth = el.scrollWidth
2190+
let prevContextOpen = contextOpen()
2191+
2192+
const handler = () => {
2193+
if (scrollTimeout !== undefined) clearTimeout(scrollTimeout)
2194+
scrollTimeout = window.setTimeout(() => {
2195+
const scrollWidth = el.scrollWidth
2196+
const clientWidth = el.clientWidth
2197+
const currentContextOpen = contextOpen()
2198+
2199+
// Only scroll when a tab is added (width increased), not on removal
2200+
if (scrollWidth > prevScrollWidth) {
2201+
if (!prevContextOpen && currentContextOpen) {
2202+
// Context tab was opened, scroll to first
2203+
el.scrollTo({
2204+
left: 0,
2205+
behavior: "smooth",
2206+
})
2207+
} else if (scrollWidth > clientWidth) {
2208+
// File tab was added, scroll to rightmost
2209+
el.scrollTo({
2210+
left: scrollWidth - clientWidth,
2211+
behavior: "smooth",
2212+
})
2213+
}
2214+
}
2215+
// When width decreases (tab removed), don't scroll - let browser handle it naturally
2216+
2217+
prevScrollWidth = scrollWidth
2218+
prevContextOpen = currentContextOpen
2219+
}, 0)
2220+
}
2221+
2222+
const wheelHandler = (e: WheelEvent) => {
2223+
// Enable horizontal scrolling with mouse wheel
2224+
if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {
2225+
el.scrollLeft += e.deltaY > 0 ? 50 : -50
2226+
e.preventDefault()
2227+
}
2228+
}
2229+
2230+
el.addEventListener("wheel", wheelHandler, { passive: false })
2231+
2232+
const observer = new MutationObserver(handler)
2233+
observer.observe(el, { childList: true })
2234+
2235+
onCleanup(() => {
2236+
el.removeEventListener("wheel", wheelHandler)
2237+
observer.disconnect()
2238+
if (scrollTimeout !== undefined) clearTimeout(scrollTimeout)
2239+
})
2240+
}}
2241+
>
21872242
<Show when={contextOpen()}>
21882243
<Tabs.Trigger
21892244
value="context"

0 commit comments

Comments
 (0)