diff options
| author | Alex Yaroshuk <[email protected]> | 2026-01-29 09:45:12 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2026-01-28 19:45:12 -0600 |
| commit | 0c8de47f7d8ec04400c45d491c45807b6ddacb4a (patch) | |
| tree | 6c5be76a1b6735db913097880e166ebf4b26dbf4 | |
| parent | 7ad165fbdce352786c52b99503cc6f34422e3084 (diff) | |
| download | opencode-0c8de47f7d8ec04400c45d491c45807b6ddacb4a.tar.gz opencode-0c8de47f7d8ec04400c45d491c45807b6ddacb4a.zip | |
fix(app): file tabs - auto scroll on open & scroll via mouse wheel (#11070)
| -rw-r--r-- | packages/app/src/pages/session.tsx | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 87ebf6db7..a3056102e 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -2183,7 +2183,62 @@ export default function Page() { <ConstrainDragYAxis /> <Tabs value={activeTab()} onChange={openTab}> <div class="sticky top-0 shrink-0 flex"> - <Tabs.List> + <Tabs.List + ref={(el) => { + let scrollTimeout: number | undefined + let prevScrollWidth = el.scrollWidth + let prevContextOpen = contextOpen() + + const handler = () => { + if (scrollTimeout !== undefined) clearTimeout(scrollTimeout) + scrollTimeout = window.setTimeout(() => { + const scrollWidth = el.scrollWidth + const clientWidth = el.clientWidth + const currentContextOpen = contextOpen() + + // Only scroll when a tab is added (width increased), not on removal + if (scrollWidth > prevScrollWidth) { + if (!prevContextOpen && currentContextOpen) { + // Context tab was opened, scroll to first + el.scrollTo({ + left: 0, + behavior: "smooth", + }) + } else if (scrollWidth > clientWidth) { + // File tab was added, scroll to rightmost + el.scrollTo({ + left: scrollWidth - clientWidth, + behavior: "smooth", + }) + } + } + // When width decreases (tab removed), don't scroll - let browser handle it naturally + + prevScrollWidth = scrollWidth + prevContextOpen = currentContextOpen + }, 0) + } + + const wheelHandler = (e: WheelEvent) => { + // Enable horizontal scrolling with mouse wheel + if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) { + el.scrollLeft += e.deltaY > 0 ? 50 : -50 + e.preventDefault() + } + } + + el.addEventListener("wheel", wheelHandler, { passive: false }) + + const observer = new MutationObserver(handler) + observer.observe(el, { childList: true }) + + onCleanup(() => { + el.removeEventListener("wheel", wheelHandler) + observer.disconnect() + if (scrollTimeout !== undefined) clearTimeout(scrollTimeout) + }) + }} + > <Show when={contextOpen()}> <Tabs.Trigger value="context" |
