From b77f89a14c25364fbc193a3a4cf0a998bba4e308 Mon Sep 17 00:00:00 2001 From: Local Dev Date: Sun, 20 Sep 2026 16:50:24 +0200 Subject: [PATCH] =?UTF-8?q?feat(theseus):=20Firefox-style=20tab=20overflow?= =?UTF-8?q?=20=E2=80=94=20scroll=20arrows,=20earliest=20tabs=20slide=20out?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Tabs keep a readable minimum width (76px). Once they overflow, the row scrolls: the earliest tabs slide out on the left and an arrow at each end moves the row by 60% of its width, disabled at its end of travel and hidden while everything fits. The wheel scrolls the row too, the selected tab is brought into view when the selection changes (never while the user is scrolling), and the + button stays outside the row. Moves are immediate rather than animated: the chrome view has no smooth scrolling, and frame callbacks stop while the window is occluded, which stranded a frame-driven slide at its start. --- chrome.html | 61 +++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/chrome.html b/chrome.html index 59762ab3..c71be915 100644 --- a/chrome.html +++ b/chrome.html @@ -55,10 +55,18 @@ matter how many tabs are open; the row scrolls (wheel) once tabs hit their minimum width, like Chrome. */ .tabs > .newtab { flex: none; margin-left: 2px; } + /* Firefox-style overflow: once tabs hit their minimum width the row + scrolls, the earliest tabs slide out on the left, and an arrow at each + end moves the row (they only appear when there is something to scroll). */ + .tabscroll { flex: none; width: 24px; height: 28px; margin: 0 2px; padding: 0; border: 1px solid var(--line2); border-bottom: none; + border-radius: 8px 8px 0 0; background: var(--surface); color: var(--mut); cursor: pointer; font: 16px/1 system-ui, sans-serif; + -webkit-app-region: no-drag; } + .tabscroll:hover { color: var(--ink); background: var(--hover); } + .tabscroll:disabled { opacity: .3; cursor: default; } /* Same-size tabs: each tab claims an equal share of the row, capped at 200px so 2 tabs don't stretch across the whole window. With many tabs they shrink down to icon + close (34px) before anything is clipped. */ - .tab { display: flex; align-items: center; gap: 8px; flex: 1 1 0; max-width: 200px; min-width: 34px; padding: 6px 10px; + .tab { display: flex; align-items: center; gap: 8px; flex: 1 1 0; max-width: 200px; min-width: 76px; padding: 6px 10px; background: var(--surface); border: 1px solid var(--line2); border-bottom: none; border-radius: 8px 8px 0 0; font-size: 12.5px; cursor: default; color: var(--mut); user-select: none; } .tab.dragging { opacity: .45; cursor: grabbing; } @@ -421,7 +429,7 @@ .bcnrbar .bdismiss { color: var(--dim); text-decoration: none; } .bcnrbar .bdismiss:hover { color: var(--ink); } -
+