From dff8020a588dc247746a44775901230348ea9ad2 Mon Sep 17 00:00:00 2001 From: Test Date: Thu, 25 Jun 2026 02:59:30 +0000 Subject: [PATCH] fix(app): shrink titlebar tabs --- packages/app/src/components/titlebar.css | 13 ++++++ packages/app/src/components/titlebar.tsx | 59 ++++++++++-------------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/packages/app/src/components/titlebar.css b/packages/app/src/components/titlebar.css index edce93c3106..0683d7532d5 100644 --- a/packages/app/src/components/titlebar.css +++ b/packages/app/src/components/titlebar.css @@ -20,6 +20,7 @@ remaining scroll distance > 1px. Hidden defaults make an inactive timeline (no overflow) a no-op. Unsupported browsers also degrade to no fades. */ [data-slot="titlebar-tabs"] { + container-type: inline-size; timeline-scope: --titlebar-tabs-scroll; [data-slot^="titlebar-tabs-fade-"] { @@ -27,6 +28,18 @@ } } +@container (max-width: 64px) { + [data-slot="titlebar-tab-link"] { + justify-content: center; + gap: 0; + padding-inline: 0; + } + + [data-slot="titlebar-tab-title"] { + display: none; + } +} + @supports (animation-timeline: --titlebar-tabs-scroll) and (timeline-scope: --titlebar-tabs-scroll) { [data-slot="titlebar-tabs-scroll"] { scroll-timeline: --titlebar-tabs-scroll x; diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 0aed18fe979..07f6e522f31 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -3,7 +3,6 @@ import { createMemo, createResource, createRoot, - createSignal, For, Match, onMount, @@ -33,7 +32,6 @@ import { applyPath, backPath, forwardPath } from "./titlebar-history" import { projectForSession } from "@/pages/layout/helpers" import { SessionTabAvatar } from "@/pages/layout/session-tab-avatar" import { makeEventListener } from "@solid-primitives/event-listener" -import { createResizeObserver } from "@solid-primitives/resize-observer" import { createMediaQuery } from "@solid-primitives/media" import { readSessionTabsRemovedDetail, SESSION_TABS_REMOVED_EVENT } from "@/components/titlebar-session-events" import { useGlobal } from "@/context/global" @@ -421,13 +419,6 @@ export function Titlebar(props: { update?: TitlebarUpdate }) { ].filter((v) => v !== undefined) }) - const [tabsAreOverflowing, setTabsAreOverflowing] = createSignal(false) - let tabScrollRef!: HTMLDivElement - - function refreshTabsAreOverflowing() { - setTabsAreOverflowing(tabScrollRef.scrollWidth > tabScrollRef.clientWidth) - } - return (
-
+
{ - tabScrollRef = el - createResizeObserver(el, refreshTabsAreOverflowing) - }} + class="flex min-w-0 flex-row items-center overflow-hidden [app-region:no-drag]" > -
createResizeObserver(el, refreshTabsAreOverflowing)} - > +
{(tab, i) => { let ref!: HTMLDivElement @@ -574,7 +557,6 @@ export function Titlebar(props: { update?: TitlebarUpdate }) { onClose={() => tabsStoreActions.removeTab(i())} active={currentTab() === tab} activeServer={tab.server === server.key} - forceTruncate={tabsAreOverflowing()} /> )} @@ -631,7 +613,6 @@ export function Titlebar(props: { update?: TitlebarUpdate }) { aria-label={language.t("command.session.new")} /> -
@@ -882,7 +863,6 @@ function TabNavItem(props: { onNavigate: () => void active?: boolean activeServer: boolean - forceTruncate?: boolean session: Session }) { const closeTab = (event: MouseEvent) => { @@ -900,7 +880,8 @@ function TabNavItem(props: { return (
{ if (event.button !== 1) return @@ -918,7 +899,8 @@ function TabNavItem(props: { event.preventDefault() props.onNavigate() }} - class="flex h-full min-w-0 flex-1 flex-row items-center gap-1.5 text-[13px] font-medium text-v2-text-text-faint group-data-[active='true']:text-v2-text-text-base" + data-slot="titlebar-tab-link" + class="flex h-full min-w-0 flex-1 flex-row items-center gap-1.5 px-1.5 text-[13px] font-medium text-v2-text-text-faint group-data-[active='true']:text-v2-text-text-base" > - {session().title} + + {session().title} + ) }}
{ if (event.button !== 1) return closeTab(event) @@ -986,12 +970,15 @@ function DraftTabItem(props: { event.preventDefault() props.onNavigate() }} - class="flex h-full min-w-0 flex-1 flex-row items-center gap-1.5 overflow-hidden text-[13px] font-medium leading-5 text-v2-text-text-faint group-data-[active='true']:text-[var(--v2-text-text-base)]" + data-slot="titlebar-tab-link" + class="flex h-full min-w-0 flex-1 flex-row items-center gap-1.5 overflow-hidden pl-1.5 pr-8 text-[13px] font-medium leading-5 text-v2-text-text-faint group-data-[active='true']:text-[var(--v2-text-text-base)]" > - {props.title} + + {props.title} +
{ if (event.button !== 1) return closeTab(event) @@ -1028,12 +1016,15 @@ function NewSessionTabItem(props: { ref?: HTMLDivElement; href: string; title: s - {props.title} + + {props.title} +