fix(desktop): align jump-to-latest pill with composer height - #6606
Conversation
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz> Signed-off-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
8552551 to
a12bf13
Compare
jedwards27
left a comment
There was a problem hiding this comment.
Review verdict: changes requested
The source fix is narrow and its layout contract looks correct, but the added regression test does not protect against the WebKit-specific failure this PR is intended to prevent.
[P2] Add regression evidence that exercises the stale WebKit path
desktop/tests/e2e/smoke.spec.ts:896-946 runs under the Chromium-only Playwright project configured in desktop/playwright.config.ts:22-31. Restoring the old translate-y(...); transform-gpu implementation, rebuilding the E2E artifact, and rerunning the new focused test still produced 1/1 passing. The test therefore proves generic geometry in Chromium, but it remains green with the exact promoted-transform mechanism described as defective in WebKit.
That leaves the shipped regression causally uncovered: the stale-layer bug can return while CI stays green. Please add exact-head WKWebView/native Desktop evidence that grows the composer while detached and asserts the pill tracks the live overlay without overlap, then mutation-prove that journey fails with the old transform. A deterministic WebKit integration harness would also satisfy this if one is available.
The supplied before/after PNGs visually show the intended correction, but they do not establish exact-SHA native execution or mutation sensitivity.
What was verified at a12bf13d4a1461841a5ba457ac974f47a38c8a7c
useComposerHeightPaddingwrites--composer-overlay-heighton the shared timeline ancestor (desktop/src/features/messages/ui/useComposerHeightPadding.ts:43-46,77-94), andMessageTimelinenow consumes it through layout-ownedbottompositioning (desktop/src/features/messages/ui/MessageTimeline.tsx:862-889).- Button name, focus, click behavior, stacking, pointer behavior, clearance, and reduced-motion handling remain intact;
UnreadPillsemantics are unchanged (desktop/src/shared/ui/UnreadPill.tsx:28-42). - Timeline and composer retain the same isolated relative container (
desktop/src/features/channels/ui/ChannelPane.tsx:570-580). No relay, schema, identity, tenancy, persistence, native-command, or release-flow scope was introduced. - Exact-head checks passed:
just desktop-check(four pre-existing diagnostics outside the diff),just desktop-typecheck,just desktop-test(5,397/5,397), fresh E2E build, and the focused test. - Complementary mutation evidence: deleting the new bottom-positioning class made the geometry assertion fail (
expected >=58, received0), so the assertion detects total loss of movement; restoring the old transform still passed, showing it does not detect the WebKit failure mechanism. - GitHub’s applicable Desktop/core/build/E2E/DCO checks are green, and the remote head was rechecked immediately before this review.
Residual risk is confined to the original platform-specific compositor behavior, but that is the behavior this PR exists to fix. The dungeon demands one real WebKit receipt before it opens the gate.
Reclassified under the defect-vs-confidence rubric: no author-actionable defect; native WKWebView observation is reviewer/tooling-owned verification confidence.
jedwards27
left a comment
There was a problem hiding this comment.
Corrected review verdict: comment — no blocking code finding; verification outstanding
The earlier request-for-changes classification was too strong. The source change is sound, all applicable gates are green, and the missing native WKWebView observation is a reviewer/tooling confidence gap—not an author-actionable defect in this PR. The prior changes-requested review has been dismissed.
Author action: none.
Verification owner: reviewer/tooling, for optional exact-head native WKWebView observation of the original compositor behavior.
Verified at a12bf13d4a1461841a5ba457ac974f47a38c8a7c
useComposerHeightPaddingwrites--composer-overlay-heighton the shared timeline ancestor (desktop/src/features/messages/ui/useComposerHeightPadding.ts:43-46,77-94), andMessageTimelineconsumes it through layout-ownedbottompositioning rather than the promoted transform implicated in WebKit (desktop/src/features/messages/ui/MessageTimeline.tsx:862-889).- Button name, focus, click behavior, stacking, pointer behavior, clearance, and reduced-motion handling remain intact;
UnreadPillsemantics are unchanged (desktop/src/shared/ui/UnreadPill.tsx:28-42). - Timeline and composer retain the same isolated relative container (
desktop/src/features/channels/ui/ChannelPane.tsx:570-580). No relay, schema, identity, tenancy, persistence, native-command, or release-flow scope was introduced. - Exact-head validation passed:
just desktop-check(four pre-existing diagnostics outside the diff),just desktop-typecheck,just desktop-test(5,397/5,397), fresh E2E build, focused regression test, and all applicable GitHub Desktop/core/build/E2E/DCO checks. - Mutation evidence shows the new assertion fails if pill movement is removed entirely. Restoring the old transform remains green under Chromium, so the test does not independently reproduce the WebKit-specific stale-layer mechanism; that limits verification confidence but is not a defect the author must repair.
Residual risk is limited to lack of independent native observation of the original platform-specific compositor failure. Given the narrow CSS ownership change, direct removal of the implicated promoted transform, lower-level geometry proof, supplied before/after visuals, and green exact-head gates, this does not justify blocking the PR.
…-timeline * origin/main: fix(mobile): join starter channels after accepting invite (#5915) Add mobile profile editing (#6583) fix(desktop): align jump-to-latest pill with composer height (#6606) Signed-off-by: Rivet <a08d9a8418c7ff03afe19964724c8fd87bf1776ab9e9b9cafb8cc920edd02a6e@buzz.block.builderlab.xyz>
* origin/main: fix(desktop): bound thread /query and surface load errors, not false-empty (block#6447) fix(messages): route edits to the owning composer (block#6575) fix(mobile): join starter channels after accepting invite (block#5915) Add mobile profile editing (block#6583) fix(desktop): align jump-to-latest pill with composer height (block#6606) fix(desktop): emit singular `mention` feed category so alerts route correctly (block#6665) Signed-off-by: Matt Kursmark <kursmark@squareup.com> Co-authored-by: Matt Kursmark <kursmark@squareup.com> Co-authored-by: Codex <noreply@openai.com>
* origin/main: (90 commits) fix(desktop): bound thread /query and surface load errors, not false-empty (block#6447) fix(messages): route edits to the owning composer (block#6575) fix(mobile): join starter channels after accepting invite (block#5915) Add mobile profile editing (block#6583) fix(desktop): align jump-to-latest pill with composer height (block#6606) fix(desktop): emit singular `mention` feed category so alerts route correctly (block#6665) fix(mobile): recover stale and shuffled messages (block#6691) feat(mobile): browse and join open channels (block#6243) show mention counts in channel notifications (block#6696) fix(desktop): hide selection formatting tray on composer right-click (block#6683) fix(desktop): stabilize members dialog scrolling (block#6670) fix(desktop): keep member runtime status off the UI thread (block#6445) perf(desktop): persist channel heads, collapse thread reads and reply sends (block#6572) Downgrade desktop Huddles to audio protocol v2 (block#6610) Polish Huddle participant interactions (block#6312) Downgrade mobile Huddles to audio protocol v2 (block#6558) perf(desktop): make the Projects surface render-cheap (block#6460) refactor(acp): clarify agent prompt sections (block#6501) Add mobile Huddles voice MVP (block#6056) feat(desktop-messages): keep agents addressed across messages (block#6315) ... Signed-off-by: Matt Kursmark <kursmark@squareup.com> # Conflicts: # desktop/src/app/App.tsx # desktop/src/app/useCloseWindowShortcut.ts
Category: fix
User Impact: Jump to Latest now stays above the composer as a draft grows to multiple lines.
Problem: On WebKit, the pill's transform could retain a stale inherited composer-height value after the composer expanded, leaving the control stranded inside the composer.
Solution: Position and animate the pill with its absolute bottom offset, which consumes the live composer height through layout rather than a promoted transform layer. A smoke test now verifies that the pill rises by the full composer growth and remains clear of the composer.
File changes
desktop/src/features/messages/ui/MessageTimeline.tsx
Anchor Jump to Latest with a live bottom offset instead of a translated compositor layer so composer resizing reliably moves it.
desktop/tests/e2e/smoke.spec.ts
Add coverage that expands a detached timeline's composer and checks the pill tracks the full height increase without overlapping it.
Reproduction steps
Validation
pnpm --dir desktop test— 5,397 passedpnpm --dir desktop check— passed with four existing informational warnings outside this diffpnpm --dir desktop typecheck— passedpnpm --dir desktop exec playwright test tests/e2e/smoke.spec.ts --project=smoke— 26 passedScreenshots / Demos
Both captures use the same long, mid-history timeline and the same four-line composer.