diff --git a/packages/ui/src/App.tsx b/packages/ui/src/App.tsx index 2f90b3cb8..e17eda1fa 100644 --- a/packages/ui/src/App.tsx +++ b/packages/ui/src/App.tsx @@ -103,7 +103,6 @@ const App: Component = () => { binaryPath: string instanceId: string } | null>(null) - const phoneQuery = useMediaQuery("(max-width: 767px)") const isPhoneLayout = createMemo(() => phoneQuery()) diff --git a/packages/ui/src/components/instance/instance-shell2.tsx b/packages/ui/src/components/instance/instance-shell2.tsx index bb90f31ee..ab8cbfb36 100644 --- a/packages/ui/src/components/instance/instance-shell2.tsx +++ b/packages/ui/src/components/instance/instance-shell2.tsx @@ -514,6 +514,23 @@ const InstanceShell2: Component = (props) => { ) + const renderPreviewToggleButton = () => ( + + + {(() => { + const Icon = PreviewToggleIcon() + return + + ) + const handleCommandPaletteClick = () => { showCommandPalette(props.instance.id) } @@ -834,6 +851,50 @@ const InstanceShell2: Component = (props) => { } const showingInfoView = createMemo(() => activeSessionIdForInstance() === "info") + const activeSessionTitle = createMemo(() => { + if (showingInfoView()) return null + const title = activeSessionForInstance()?.title?.trim() + return title || t("sessionList.session.untitled") + }) + const showHeaderLeftSlot = createMemo(() => !leftPinned()) + const showHeaderSessionTitle = createMemo(() => !compactHeaderLayout() && showHeaderLeftSlot() && Boolean(activeSessionTitle())) + const headerToolbarHorizontalInset = createMemo(() => (isPhoneLayout() ? 16 : 24)) + const headerLeftSlotWidth = createMemo(() => Math.max(0, sessionSidebarWidth() - headerToolbarHorizontalInset())) + const headerLeftSlotStyle = createMemo(() => + leftDrawerState() === "floating-open" || showHeaderSessionTitle() ? { width: `${headerLeftSlotWidth()}px` } : undefined, + ) + + const renderActiveSessionHeaderTitle = () => ( + +
+ {activeSessionTitle()} +
+
+ ) + + const renderHeaderLeftSlot = () => ( + +
+ + + {leftAppBarButtonIcon()} + + + {renderActiveSessionHeaderTitle()} +
+
+ ) const isLaunching = createMemo(() => props.instance.status === "starting") @@ -933,94 +994,76 @@ const InstanceShell2: Component = (props) => { fallback={
- - - {leftAppBarButtonIcon()} - - + {renderHeaderLeftSlot()} -
- {renderSessionHeaderIndicators()} -
+
+ {renderSessionHeaderIndicators()} +
-
- +
+ + + + + + + + +
+ +
+ + + +
+ + + {renderPreviewToggleButton()} + + + - + {renderPreviewToggleButton()} + + + - {(() => { - const Icon = PreviewToggleIcon() - return - - - - -
- -
- - - -
- - - - - - - - - {rightAppBarButtonIcon()} - -
@@ -1038,18 +1081,7 @@ const InstanceShell2: Component = (props) => { } >
- - - {leftAppBarButtonIcon()} - - + {renderHeaderLeftSlot()} = (props) => { > diff --git a/packages/ui/src/styles/panels/session-layout.css b/packages/ui/src/styles/panels/session-layout.css index 07738886a..c6223f981 100644 --- a/packages/ui/src/styles/panels/session-layout.css +++ b/packages/ui/src/styles/panels/session-layout.css @@ -105,6 +105,32 @@ color: var(--text-primary); } +.session-header-left-slot { + @apply flex items-center gap-2 min-w-0; + flex: 0 0 auto; +} + +.session-header-active-title { + display: flex; + align-items: center; + flex: 1 1 auto; + min-width: 0; + align-self: stretch; + padding-inline: 0.75rem; + border-inline: 1px solid color-mix(in oklab, var(--border-base) 72%, transparent); + color: var(--text-secondary); +} + +.session-header-active-title-text { + display: -webkit-box; + -webkit-line-clamp: 2; + -webkit-box-orient: vertical; + overflow: hidden; + font-size: 0.8125rem; + font-weight: 500; + line-height: 1.15; +} + .session-sidebar-shortcuts { @apply flex flex-col gap-1; }