Polish composer activity layout and transitions - #3151
Conversation
6f1f6cd to
c58ac5d
Compare
tellaho
left a comment
There was a problem hiding this comment.
🤖 Requesting changes on four blocking seams; the overall dock/CSS-variable architecture looks sound.
-
Preserve
useComposerHeightPadding’s growth-only fallback contract. Thepadding > previousPadding→padding !== previousPaddingchange makes composer shrink force-scroll bothMessageThreadPanelandInboxDetailPaneto the absolute bottom (immediately and again on rAF), even though neither supplies the new semanticsettleAtBottomcallback. 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 suppliessettleAtBottom, or give the other consumers equivalent semantic anchoring plus shrink regression coverage and update the contract documentation. -
Do not use
toolbarExtraActionstruthiness as thread activity state. InMessageThreadPanel,Boolean(toolbarExtraActions)now controls whether the activity rail is reserved, while the prop’s name/type still describe a genericReactNode;MessageComposerPropsalso has a differenttoolbarExtraActionsthat 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. -
Make dock mode explicit instead of encoding it in
bottomAccessoryVisible === undefined.undefinedmeans legacy blur ownership/no quiet spacer, while bothtrueandfalseopt into dock blur ownership and spacer behavior. That is a hidden tri-state behind a boolean-shaped prop and is duplicated acrossMessageComposerandComposerDockToolbar. Please separate/rename the mode and visibility contracts sofalsecannot unexpectedly alter layout/blur ownership. -
Restore the contract documentation lost in the
MessageComposerPropsextraction. The newMessageComposer.types.tsdrops the existing documentation forautoSubmitDraftKey,editTarget.imetaMedia,onEditLastOwnMessage, andonCaptureSendContext. Those comments describe fire-once, NIP-92, return-value, and capture-before-await behavior that callers need to preserve.
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>
c58ac5d to
fbc7f7d
Compare
|
🤖 Addressed all four requested seams in
Also rebased onto latest Verification on the final rebased tree:
The full integration pre-push command was blocked before tests by stale local Postgres migration state ( |
tellaho
left a comment
There was a problem hiding this comment.
🤖 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.
…log-sharing * origin/main: Polish composer activity layout and transitions (#3151)
* 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>
…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>
…rom #3151 Post-rebase integration fixes after rebasing onto main, which landed the composer dock geometry contract (PR #3151) in the same region this branch reworks. The rebase kept main's dock architecture (reserved bottom rail + ComposerActivityAccessory fade) with the branch's pill strip rendered inside it; this commit cleans up the fallout: - ChannelPane.tsx: re-add the useChannelWorkingAgentPubkeys import — the dock's reserved-rail toggle (composer-dock--with-activity) still needs the channel-level working-set check even though ChannelComposerActivityRow computes its own copy — and consolidate the gating into a single hasComposerBottomActivity expression - ChannelComposerActivityAccessory.tsx: delete — main's channel-level wrapper from #3151 is fully superseded by ChannelComposerActivityRow rendered inside ComposerActivityAccessory - AppShell.tsx / routes/root.tsx: move the temporary DebugHarnessMount from AppShell (999/1000 lines on main, so the mount no longer fits the file-size ratchet) to the root route via a RootComponent wrapper - agents/debug/README.md + DebugHarnessMount.tsx: update the removal instructions and header comment for the new mount location Validated with just desktop-check, 3,817 desktop unit tests, and the channels / composer-overflow / threadpane-ultrawide e2e specs (88 passing). Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
## 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 block#2602 and supersedes that approach. ### Related issue Related PR: block#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 https://github.com/user-attachments/assets/ed0b08d9-18e0-4061-b272-ab509dbcd8ee --------- Signed-off-by: morgmart <98432065+morgmart@users.noreply.github.com>
…rom #3151 Post-rebase integration fixes after rebasing onto main, which landed the composer dock geometry contract (PR #3151) in the same region this branch reworks. The rebase kept main's dock architecture (reserved bottom rail + ComposerActivityAccessory fade) with the branch's pill strip rendered inside it; this commit cleans up the fallout: - ChannelPane.tsx: re-add the useChannelWorkingAgentPubkeys import — the dock's reserved-rail toggle (composer-dock--with-activity) still needs the channel-level working-set check even though ChannelComposerActivityRow computes its own copy — and consolidate the gating into a single hasComposerBottomActivity expression - ChannelComposerActivityAccessory.tsx: delete — main's channel-level wrapper from #3151 is fully superseded by ChannelComposerActivityRow rendered inside ComposerActivityAccessory - AppShell.tsx / routes/root.tsx: move the temporary DebugHarnessMount from AppShell (999/1000 lines on main, so the mount no longer fits the file-size ratchet) to the root route via a RootComponent wrapper - agents/debug/README.md + DebugHarnessMount.tsx: update the removal instructions and header comment for the new mount location Validated with just desktop-check, 3,817 desktop unit tests, and the channels / composer-overflow / threadpane-ultrawide e2e specs (88 passing). Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…rom #3151 Post-rebase integration fixes after rebasing onto main, which landed the composer dock geometry contract (PR #3151) in the same region this branch reworks. The rebase kept main's dock architecture (reserved bottom rail + ComposerActivityAccessory fade) with the branch's pill strip rendered inside it; this commit cleans up the fallout: - ChannelPane.tsx: re-add the useChannelWorkingAgentPubkeys import — the dock's reserved-rail toggle (composer-dock--with-activity) still needs the channel-level working-set check even though ChannelComposerActivityRow computes its own copy — and consolidate the gating into a single hasComposerBottomActivity expression - ChannelComposerActivityAccessory.tsx: delete — main's channel-level wrapper from #3151 is fully superseded by ChannelComposerActivityRow rendered inside ComposerActivityAccessory - AppShell.tsx / routes/root.tsx: move the temporary DebugHarnessMount from AppShell (999/1000 lines on main, so the mount no longer fits the file-size ratchet) to the root route via a RootComponent wrapper - agents/debug/README.md + DebugHarnessMount.tsx: update the removal instructions and header comment for the new mount location Validated with just desktop-check, 3,817 desktop unit tests, and the channels / composer-overflow / threadpane-ultrawide e2e specs (88 passing). Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…rom #3151 Post-rebase integration fixes after rebasing onto main, which landed the composer dock geometry contract (PR #3151) in the same region this branch reworks. The rebase kept main's dock architecture (reserved bottom rail + ComposerActivityAccessory fade) with the branch's pill strip rendered inside it; this commit cleans up the fallout: - ChannelPane.tsx: re-add the useChannelWorkingAgentPubkeys import — the dock's reserved-rail toggle (composer-dock--with-activity) still needs the channel-level working-set check even though ChannelComposerActivityRow computes its own copy — and consolidate the gating into a single hasComposerBottomActivity expression - ChannelComposerActivityAccessory.tsx: delete — main's channel-level wrapper from #3151 is fully superseded by ChannelComposerActivityRow rendered inside ComposerActivityAccessory - AppShell.tsx / routes/root.tsx: move the temporary DebugHarnessMount from AppShell (999/1000 lines on main, so the mount no longer fits the file-size ratchet) to the root route via a RootComponent wrapper - agents/debug/README.md + DebugHarnessMount.tsx: update the removal instructions and header comment for the new mount location Validated with just desktop-check, 3,817 desktop unit tests, and the channels / composer-overflow / threadpane-ultrawide e2e specs (88 passing). Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Summary
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.shjust desktop-checkjust desktop-test— 3,638 passinguseAnchoredScroll.test.mjs— virtualized viewport resize follows the explicit bottom statemain; the exactactivity_page_test.dartcompiler failure reproduces on untouchedorigin/mainScreen.Recording.2026-07-26.at.6.31.44.PM.mov