Skip to content

fix(desktop): align jump-to-latest pill with composer height - #6606

Merged
tellaho merged 1 commit into
mainfrom
tho/jump-to-latest-height
Aug 24, 2026
Merged

fix(desktop): align jump-to-latest pill with composer height#6606
tellaho merged 1 commit into
mainfrom
tho/jump-to-latest-height

Conversation

@tellaho

@tellaho tellaho commented Aug 23, 2026

Copy link
Copy Markdown
Contributor

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

  1. Open a channel with enough messages to scroll.
  2. Scroll away from the newest message until Jump to Latest appears.
  3. Add several lines to the composer without sending.
  4. Confirm Jump to Latest rises with the composer and remains directly above it.

Validation

  • pnpm --dir desktop test — 5,397 passed
  • pnpm --dir desktop check — passed with four existing informational warnings outside this diff
  • pnpm --dir desktop typecheck — passed
  • pnpm --dir desktop exec playwright test tests/e2e/smoke.spec.ts --project=smoke — 26 passed
  • Push hooks — desktop check, typecheck, and tests passed

Screenshots / Demos

Both captures use the same long, mid-history timeline and the same four-line composer.

Before After
The stale pill position overflows into the expanded composer. The pill tracks the live composer height and stays clear above it.
Before — Jump to Latest overlaps the tall composer After — Jump to Latest clears the tall composer

@tellaho
tellaho requested a review from a team as a code owner August 23, 2026 04:01
@tellaho
tellaho marked this pull request as draft August 23, 2026 07:11
@tellaho tellaho changed the title fix desktop jump pill position as composer grows fix(desktop): keep jump pill above growing composer Aug 23, 2026
@tellaho tellaho changed the title fix(desktop): keep jump pill above growing composer fix(desktop): align jump-to-latest pill with composer height Aug 23, 2026
tellaho pushed a commit that referenced this pull request Aug 23, 2026
tellaho pushed a commit that referenced this pull request Aug 23, 2026
tellaho pushed a commit that referenced this pull request Aug 23, 2026
Co-authored-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
Signed-off-by: Rizz <302abe414ca6e3134763d2539bfcf145aea2a63fe5f8455204ed602fd40cf381@buzz.block.builderlab.xyz>
@tellaho
tellaho force-pushed the tho/jump-to-latest-height branch from 8552551 to a12bf13 Compare August 23, 2026 21:05
@tellaho
tellaho marked this pull request as ready for review August 23, 2026 23:00

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • useComposerHeightPadding writes --composer-overlay-height on the shared timeline ancestor (desktop/src/features/messages/ui/useComposerHeightPadding.ts:43-46,77-94), and MessageTimeline now consumes it through layout-owned bottom positioning (desktop/src/features/messages/ui/MessageTimeline.tsx:862-889).
  • Button name, focus, click behavior, stacking, pointer behavior, clearance, and reduced-motion handling remain intact; UnreadPill semantics 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, received 0), 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.

@jedwards27
jedwards27 dismissed their stale review August 24, 2026 14:58

Reclassified under the defect-vs-confidence rubric: no author-actionable defect; native WKWebView observation is reviewer/tooling-owned verification confidence.

@jedwards27 jedwards27 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

  • useComposerHeightPadding writes --composer-overlay-height on the shared timeline ancestor (desktop/src/features/messages/ui/useComposerHeightPadding.ts:43-46,77-94), and MessageTimeline consumes it through layout-owned bottom positioning 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; UnreadPill semantics 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.

@tellaho
tellaho merged commit 9f55bf6 into main Aug 24, 2026
24 checks passed
@tellaho
tellaho deleted the tho/jump-to-latest-height branch August 24, 2026 18:56
morgmart pushed a commit that referenced this pull request Aug 24, 2026
…-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>
kursmark-sq added a commit to kursmark-sq/buzz that referenced this pull request Aug 24, 2026
* 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>
kursmark-sq added a commit to kursmark-sq/buzz that referenced this pull request Aug 24, 2026
* 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants