summaryrefslogtreecommitdiffhomepage
path: root/packages
diff options
context:
space:
mode:
authorAlex Yaroshuk <[email protected]>2026-01-29 09:45:12 +0800
committerGitHub <[email protected]>2026-01-28 19:45:12 -0600
commit0c8de47f7d8ec04400c45d491c45807b6ddacb4a (patch)
tree6c5be76a1b6735db913097880e166ebf4b26dbf4 /packages
parent7ad165fbdce352786c52b99503cc6f34422e3084 (diff)
downloadopencode-0c8de47f7d8ec04400c45d491c45807b6ddacb4a.tar.gz
opencode-0c8de47f7d8ec04400c45d491c45807b6ddacb4a.zip
fix(app): file tabs - auto scroll on open & scroll via mouse wheel (#11070)
Diffstat (limited to 'packages')
-rw-r--r--packages/app/src/pages/session.tsx57
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"