From bbc88eb8e3c176681943a76680b3b85455bf25b9 Mon Sep 17 00:00:00 2001 From: Brendan Allan <14191578+Brendonovich@users.noreply.github.com> Date: Tue, 23 Jun 2026 16:58:05 +0800 Subject: [PATCH] fix(app): refine mobile session layout (#32796) --- .../regression/review-line-comment.spec.ts | 1 + .../src/components/session/session-header.tsx | 34 ++++++----- packages/app/src/pages/session.tsx | 61 ++++++++++--------- .../session/timeline/message-timeline.tsx | 4 +- packages/ui/src/components/session-review.tsx | 2 +- 5 files changed, 58 insertions(+), 44 deletions(-) diff --git a/packages/app/e2e/regression/review-line-comment.spec.ts b/packages/app/e2e/regression/review-line-comment.spec.ts index eac90c7eb..dcc355cf0 100644 --- a/packages/app/e2e/regression/review-line-comment.spec.ts +++ b/packages/app/e2e/regression/review-line-comment.spec.ts @@ -74,6 +74,7 @@ test("stages a submitted line comment in the prompt context", async ({ page }) = await review.locator('[data-slot="line-comment-action"][data-variant="primary"]').click() await expect(review.getByText("Use the existing value instead", { exact: true })).toBeVisible() + await page.getByRole("tab", { name: "Session" }).click() const context = page.getByText("Use the existing value instead", { exact: true }).last() await expect(context).toBeVisible() await expect(context.locator("..")).toContainText("review.ts:2") diff --git a/packages/app/src/components/session/session-header.tsx b/packages/app/src/components/session/session-header.tsx index db1990dfa..a65bc6491 100644 --- a/packages/app/src/components/session/session-header.tsx +++ b/packages/app/src/components/session/session-header.tsx @@ -10,6 +10,7 @@ import { Tooltip, TooltipKeybind } from "@opencode-ai/ui/tooltip" import { getFilename } from "@opencode-ai/core/util/path" import { createEffect, createMemo, createSignal, For, onMount, Show } from "solid-js" import { createStore } from "solid-js/store" +import { createMediaQuery } from "@solid-primitives/media" import { Portal } from "solid-js/web" import { useCommand } from "@/context/command" import { useLanguage } from "@/context/language" @@ -158,6 +159,7 @@ export function SessionHeader() { const isV2 = settings.general.newLayoutDesigns const search = settings.visibility.search const status = settings.visibility.status + const isDesktop = createMediaQuery("(min-width: 768px)") const [exists, setExists] = createStore>>({ finder: true, @@ -236,6 +238,7 @@ export function SessionHeader() { statusLabel: language.t("status.popover.trigger"), reviewLabel: language.t("command.review.toggle"), reviewKeybind: command.keybind("review.toggle"), + reviewVisible: isDesktop(), reviewOpened: view().reviewPanel.opened(), onReviewToggle: () => view().reviewPanel.toggle(), })) @@ -518,6 +521,7 @@ type SessionHeaderV2ActionsState = { statusLabel: string reviewLabel: string reviewKeybind: string + reviewVisible: boolean reviewOpened: boolean onReviewToggle: () => void } @@ -530,20 +534,22 @@ function SessionHeaderV2Actions(props: { state: SessionHeaderV2ActionsState }) { - - } - /> - + + + } + /> + + ) } diff --git a/packages/app/src/pages/session.tsx b/packages/app/src/pages/session.tsx index 011094415..b797a854d 100644 --- a/packages/app/src/pages/session.tsx +++ b/packages/app/src/pages/session.tsx @@ -1568,40 +1568,42 @@ export default function Page() { /> ) + const mobileTabs = (compact = false) => ( + + + setStore("mobileTab", "session")} + > + {language.t("session.tab.session")} + + setStore("mobileTab", "changes")} + > + {hasReview() + ? language.t("session.review.filesChanged", { count: reviewCount() }) + : language.t("session.review.change.other")} + + + + ) + return (
{sessionSync() ?? ""}
- - - - setStore("mobileTab", "session")} - > - {language.t("session.tab.session")} - - setStore("mobileTab", "changes")} - > - {hasReview() - ? language.t("session.review.filesChanged", { count: reviewCount() }) - : language.t("session.review.change.other")} - - - - + {mobileTabs()}
+ + {mobileTabs(true)} +
@@ -1627,8 +1632,8 @@ export default function Page() { {reviewContent({ diffStyle: "unified", classes: { - root: "pb-8", - header: "px-4", + root: "pb-8 [&_[data-slot=session-review-list]]:pb-0", + header: "px-4 !h-16 !pb-4", container: "px-4", }, loadingClass: "px-4 py-4 text-text-weak", @@ -1684,7 +1689,7 @@ export default function Page() {
- {composerRegion("dock")} + {composerRegion("dock")}
diff --git a/packages/app/src/pages/session/timeline/message-timeline.tsx b/packages/app/src/pages/session/timeline/message-timeline.tsx index 2b15e1125..aedfa5b59 100644 --- a/packages/app/src/pages/session/timeline/message-timeline.tsx +++ b/packages/app/src/pages/session/timeline/message-timeline.tsx @@ -1300,7 +1300,9 @@ export function MessageTimeline(props: { "sticky top-0 z-30 bg-[linear-gradient(to_bottom,var(--background-stronger)_48px,transparent)]": true, "w-full": true, "pb-4": true, - "pl-2 pr-3 md:pl-4 md:pr-3": true, + "pr-3": true, + "pl-4": settings.general.newLayoutDesigns(), + "pl-2 md:pl-4": !settings.general.newLayoutDesigns(), "md:max-w-200 md:mx-auto 2xl:max-w-[1000px]": props.centered, }} > diff --git a/packages/ui/src/components/session-review.tsx b/packages/ui/src/components/session-review.tsx index fdfbff04f..7aad942c5 100644 --- a/packages/ui/src/components/session-review.tsx +++ b/packages/ui/src/components/session-review.tsx @@ -386,7 +386,7 @@ export const SessionReview = (props: SessionReviewProps) => { >
-
+
{(file) => {