From f9e892dc8581d0bd6ed04a512cf2780566dd6554 Mon Sep 17 00:00:00 2001 From: Luke Parker <10430890+Hona@users.noreply.github.com> Date: Fri, 9 Oct 2026 18:40:52 +1000 Subject: [PATCH] feat(app): match the session column to the design and use pretty text wrapping (#54020) --- .../app/e2e/regression/session-summary.spec.ts | 6 ++++-- packages/app/src/composer/dropzone.tsx | 4 ++-- .../session/composer/session-composer-region.tsx | 2 +- packages/app/src/session/preparing-composer.tsx | 2 +- packages/app/src/session/route.tsx | 2 +- .../app/src/session/timeline/message-timeline.tsx | 4 ++-- packages/session-ui/src/components/markdown.css | 5 +++++ packages/session-ui/src/components/markdown.tsx | 1 + packages/session-ui/src/pierre/index.ts | 2 ++ .../src/timeline/session-timeline-row.tsx | 4 ++-- packages/ui/src/styles/base.css | 14 ++++++++++++++ packages/ui/src/styles/tailwind/index.css | 3 +++ 12 files changed, 38 insertions(+), 11 deletions(-) diff --git a/packages/app/e2e/regression/session-summary.spec.ts b/packages/app/e2e/regression/session-summary.spec.ts index 869aaa42093..2b503e14917 100644 --- a/packages/app/e2e/regression/session-summary.spec.ts +++ b/packages/app/e2e/regression/session-summary.spec.ts @@ -215,6 +215,7 @@ for (const direction of ["ltr", "rtl"] as const) { ) const composer = page.locator('[data-component="session-composer-dock"] > div') + const timeline = page.locator('[data-slot="session-timeline-scroll"]') const summary = page.getByRole("dialog", { name: "Session details", exact: true }) await expect(row).toBeInViewport() const before = { row: (await row.boundingBox())!, composer: (await composer.boundingBox())! } @@ -229,12 +230,13 @@ for (const direction of ["ltr", "rtl"] as const) { return Math.max(Math.abs(message.x - before.row.x), Math.abs(input.x - before.composer.x)) }) .toBeLessThan(1) + // The capped session column can end before the panel, so the overlay is measured against the whole timeline. await expect .poll(async () => { - const message = (await row.boundingBox())! + const view = (await timeline.boundingBox())! const details = (await summary.boundingBox())! - return Math.min(message.x + message.width, details.x + details.width) - Math.max(message.x, details.x) + return Math.min(view.x + view.width, details.x + details.width) - Math.max(view.x, details.x) }) .toBeGreaterThan(0) const text = summary.getByText(branch, { exact: true }) diff --git a/packages/app/src/composer/dropzone.tsx b/packages/app/src/composer/dropzone.tsx index b51fb95e1ec..a2263b6e3e7 100644 --- a/packages/app/src/composer/dropzone.tsx +++ b/packages/app/src/composer/dropzone.tsx @@ -7,7 +7,7 @@ import { createAnimatedPresence } from "@/runtime/animated-presence" export function ComposerDropzone(props: { active: boolean input?: { image?: boolean; pdf?: boolean } - identity?: () => unknown + identity?: () => string | undefined }) { const language = useLanguage() const [elements, setElements] = createStore<{ dropzone?: HTMLDivElement }>({}) @@ -52,7 +52,7 @@ export function ComposerDropzone(props: { >