Skip to content

Polish composer activity layout and transitions - #3151

Merged
morgmart merged 4 commits into
mainfrom
composer-activity-dock
Jul 27, 2026
Merged

Polish composer activity layout and transitions#3151
morgmart merged 4 commits into
mainfrom
composer-activity-dock

Conversation

@morgmart

@morgmart morgmart commented Jul 27, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Replace the permanently reserved composer activity row with a conditional, content-driven accessory for channel and thread composers.
  • Keep the composer dock geometrically stable while activity appears, so the composer’s bottom edge resizes smoothly without shifting the conversation.
  • Preserve translucent backdrop blur during the resize with a stable dock-level blur layer, and keep thread overlay/focus-mode alignment consistent.
  • Keep bottom-pinned virtualized conversations fully visible as composer content, zoom, or viewport height changes without repinning readers who have scrolled into history.
  • Refine the activity lockup with aligned avatars/text and a subtle, reduced-motion-safe shimmer.
  • Centralize the dock’s quiet inset, activity rail, released space, and activity offset in one CSS-variable geometry contract.

This takes a different, systemic route from the spacing reduction proposed in #2602 and supersedes that approach.

Related issue

Related PR: #2602

Testing

  • ./scripts/check-branch-skew.sh
  • just desktop-check
  • just desktop-test — 3,638 passing
  • useAnchoredScroll.test.mjs — virtualized viewport resize follows the explicit bottom state
  • Focused desktop smoke E2E — 6 passing across stable dock geometry, multiline growth, viewport resize, reduced motion, blur ownership, and thread overlay alignment
  • Pre-push hooks passed for organization safety, branch skew, desktop checks/tests, Rust tests, workspace tests, and desktop Tauri tests
  • Mobile pre-push is independently red on latest main; the exact activity_page_test.dart compiler failure reproduces on untouched origin/main
  • Visually tested channel and thread composers across quiet/activity states, multiline composer growth, and thread overlay/focus mode
Screen.Recording.2026-07-26.at.6.31.44.PM.mov

@morgmart
morgmart requested a review from a team as a code owner July 27, 2026 16:57
@morgmart
morgmart force-pushed the composer-activity-dock branch from 6f1f6cd to c58ac5d Compare July 27, 2026 17:43

@tellaho tellaho 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.

🤖 Requesting changes on four blocking seams; the overall dock/CSS-variable architecture looks sound.

  1. Preserve useComposerHeightPadding’s growth-only fallback contract. The padding > previousPaddingpadding !== previousPadding change makes composer shrink force-scroll both MessageThreadPanel and InboxDetailPane to the absolute bottom (immediately and again on rAF), even though neither supplies the new semantic settleAtBottom callback. A reader within the 32px near-bottom threshold can therefore be pulled down when activity disappears. Blame/history confirms the growth-only condition was deliberately introduced in #806 and preserved through #941/#1698, and the hook documentation still says it follows when padding increases. Please either scope shrink settling to the channel consumer that explicitly supplies settleAtBottom, or give the other consumers equivalent semantic anchoring plus shrink regression coverage and update the contract documentation.

  2. Do not use toolbarExtraActions truthiness as thread activity state. In MessageThreadPanel, Boolean(toolbarExtraActions) now controls whether the activity rail is reserved, while the prop’s name/type still describe a generic ReactNode; MessageComposerProps also has a different toolbarExtraActions that genuinely renders in the toolbar. A future static action would permanently open the rail. Please represent activity explicitly and rename/separate the accessory content from its visibility signal.

  3. Make dock mode explicit instead of encoding it in bottomAccessoryVisible === undefined. undefined means legacy blur ownership/no quiet spacer, while both true and false opt into dock blur ownership and spacer behavior. That is a hidden tri-state behind a boolean-shaped prop and is duplicated across MessageComposer and ComposerDockToolbar. Please separate/rename the mode and visibility contracts so false cannot unexpectedly alter layout/blur ownership.

  4. Restore the contract documentation lost in the MessageComposerProps extraction. The new MessageComposer.types.ts drops the existing documentation for autoSubmitDraftKey, editTarget.imetaMedia, onEditLastOwnMessage, and onCaptureSendContext. Those comments describe fire-once, NIP-92, return-value, and capture-before-await behavior that callers need to preserve.

morgmart added 4 commits July 27, 2026 15:07
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
@morgmart
morgmart force-pushed the composer-activity-dock branch from c58ac5d to fbc7f7d Compare July 27, 2026 22:18
@morgmart

Copy link
Copy Markdown
Contributor Author

🤖 Addressed all four requested seams in fbc7f7d2a:

  1. Growth-only fallback restored. useComposerHeightPadding now allows shrink settling only through an explicit semantic settleAtBottom owner; thread/inbox fallback scrolling remains initial-measurement/growth-only. Added a regression policy test for shrink.
  2. Thread activity is explicit. Replaced generic toolbarExtraActions with separate activityAccessoryContent and activityAccessoryVisible contracts. Rendering is gated by the visibility source so stale content cannot leak when human typing opens the rail.
  3. Dock mode is explicit. Replaced the optional-boolean tri-state with layoutMode="dock" | "standalone". Activity visibility remains owned by the surrounding dock; MessageComposer only decides blur/layout ownership.
  4. Composer prop docs restored. Restored the original fire-once auto-submit, NIP-92 attachment, ↑-to-edit return-value, and capture-before-await contracts in MessageComposer.types.ts.

Also rebased onto latest main. Since useAnchoredScroll.ts was left four lines below its hard ceiling upstream, extracted pure scroll policy and virtualized viewport-resize lifecycle into focused modules rather than adding an exception.

Verification on the final rebased tree:

  • desktop-check / typecheck / file-size / token guards pass
  • 3,717 desktop tests pass
  • 10 focused scroll/composer policy tests pass
  • 6 focused composer smoke tests pass
  • pre-push desktop, Rust unit, mobile, and Tauri checks pass

The full integration pre-push command was blocked before tests by stale local Postgres migration state (migration 25 was previously applied but is missing in the resolved migrations), unrelated to this desktop-only diff.

@tellaho tellaho 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.

🤖 Re-reviewed at fbc7f7d2ad5a44bf70a33a441098fd0c502a1804. All four requested changes are addressed:

  • composer shrink now delegates only to an explicit semantic bottom owner; legacy thread/inbox fallback remains initial-measurement/growth-only, with regression coverage
  • thread activity visibility and content are explicit, separate contracts
  • dock vs. standalone layout/blur ownership is explicit rather than hidden in an optional boolean
  • the extracted composer prop contracts are restored

I also reviewed the scroll-policy/viewport-resize extraction introduced to stay within the file limit; it preserves the existing behavior and keeps its policy tests. Exact-head CI is green. Approved.

@morgmart
morgmart merged commit d8f9d87 into main Jul 27, 2026
25 checks passed
@morgmart
morgmart deleted the composer-activity-dock branch July 27, 2026 22:47
wpfleger96 added a commit that referenced this pull request Jul 28, 2026
…log-sharing

* origin/main:
  Polish composer activity layout and transitions (#3151)
tlongwell-block pushed a commit that referenced this pull request Jul 28, 2026
* origin/main: (70 commits)
  feat(relay): make Postgres pool size configurable, default 50 (#3191)
  Publish symbol-bearing debug relay images (#3250)
  feat(tracing): add datastore tracing plumbing (#2760)
  fix(buzz-acp): accept id-keyed config options when resolving model switch (#2795)
  fix(desktop): probe legacy Goose install dir on Windows (#3248)
  refactor(desktop): extract install command execution into install_exec (#3251)
  Polish composer activity layout and transitions (#3151)
  feat(invites): add use-limited invite links (#3141)
  fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor (#3218)
  fix(desktop): preserve thread anchor through layout reflow (#3212)
  feat(search): parse from:/in:/after:/before: and pass them in the filter (#2871)
  fix(desktop): fetch join policies through native networking (#2862)
  fix(desktop): republish agent identity records when a persona rename propagates (#2607)
  fix(desktop): keep project Inbox previews compact (#3193)
  Inbox refactor (#2045)
  Fix composer selection formatting and drop overlay (#3172)
  Refine pending message status (#3153)
  feat(admin): show reported message content in report detail (#3149)
  fix(desktop): recover full local storage on startup (#3182)
  Replace mobile reconnect banners with skeleton shimmer (#3143)
  ...

Co-authored-by: Tyler Longwell <tlongwell@block.xyz>
Signed-off-by: Tyler Longwell <tlongwell@block.xyz>
cameronhotchkies pushed a commit to cameronhotchkies/buzz that referenced this pull request Jul 28, 2026
…y-to-env

* origin/main: (22 commits)
  Polish mobile message and search layouts (block#3121)
  Add mobile message image galleries (block#3312)
  chore(release): release Buzz Desktop version 0.5.0 (block#3213)
  feat(relay): make Postgres pool size configurable, default 50 (block#3191)
  Publish symbol-bearing debug relay images (block#3250)
  feat(tracing): add datastore tracing plumbing (block#2760)
  fix(buzz-acp): accept id-keyed config options when resolving model switch (block#2795)
  fix(desktop): probe legacy Goose install dir on Windows (block#3248)
  refactor(desktop): extract install command execution into install_exec (block#3251)
  Polish composer activity layout and transitions (block#3151)
  feat(invites): add use-limited invite links (block#3141)
  fix(node): bump Buzz-supplied Node runtimes past OpenClaw's >=24.15.0 floor (block#3218)
  fix(desktop): preserve thread anchor through layout reflow (block#3212)
  feat(search): parse from:/in:/after:/before: and pass them in the filter (block#2871)
  fix(desktop): fetch join policies through native networking (block#2862)
  fix(desktop): republish agent identity records when a persona rename propagates (block#2607)
  fix(desktop): keep project Inbox previews compact (block#3193)
  Inbox refactor (block#2045)
  Fix composer selection formatting and drop overlay (block#3172)
  Refine pending message status (block#3153)
  ...

Signed-off-by: npub1x4hk035p3p9q39a3fcrd2fe30lpkrhr5dwe0cqzzjphxyyh8m0gsq4vqap <356f67c681884a0897b14e06d527317fc361dc746bb2fc0042906e6212e7dbd1@buzz.block.builderlab.xyz>
Co-authored-by: npub1x4hk035p3p9q39a3fcrd2fe30lpkrhr5dwe0cqzzjphxyyh8m0gsq4vqap <356f67c681884a0897b14e06d527317fc361dc746bb2fc0042906e6212e7dbd1@buzz.block.builderlab.xyz>
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