From adc732b11736919d1a3551d51cf33b736f17bc20 Mon Sep 17 00:00:00 2001 From: Adam Bowker Date: Wed, 29 Jul 2026 11:47:35 -0400 Subject: [PATCH 1/3] fix(canvas): float the workspace mode selector over the channel feed The local/cloud selector above the channel composer occupied its own row in the composer's opaque, full-width band, so scrolling the feed cut messages off at the selector instead of at the input box. Position it absolutely above the input (matching the new-task composer) and give the composer band a small top gutter, so the chip hovers over the feed and only the input box sits on solid background. Generated-By: PostHog Code Task-Id: e21b284f-a889-4f05-a683-8f2407961fa5 --- .../ui/src/features/canvas/components/ChannelHomeComposer.tsx | 4 ++-- .../ui/src/features/canvas/components/WebsiteChannelHome.tsx | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx b/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx index d2bdcd10d5..75ac8be65e 100644 --- a/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx +++ b/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx @@ -371,11 +371,11 @@ export const ChannelHomeComposer = forwardRef< const submitComposer = canvasArmed ? handleCanvasSubmit : submit; return ( -
+
{/* Canvas generation always runs in the cloud, so the local/cloud pick doesn't apply while canvas mode is armed. */} {!canvasArmed && ( -
+
-
+
Date: Wed, 29 Jul 2026 12:23:37 -0400 Subject: [PATCH 2/3] fix(canvas): give the floating mode selector an opaque backdrop Quill's outline button fill is `--muted` at 30%, so once the selector floated over the feed the messages behind it showed through. Put an opaque `bg-card` backdrop on the row at the button's own radius (`--radius-sm`), which leaves the trigger's hover and expanded fills intact. Generated-By: PostHog Code Task-Id: e21b284f-a889-4f05-a683-8f2407961fa5 --- .../src/features/canvas/components/ChannelHomeComposer.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx b/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx index 75ac8be65e..e0d620ef30 100644 --- a/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx +++ b/packages/ui/src/features/canvas/components/ChannelHomeComposer.tsx @@ -373,9 +373,11 @@ export const ChannelHomeComposer = forwardRef< return (
{/* Canvas generation always runs in the cloud, so the local/cloud pick - doesn't apply while canvas mode is armed. */} + doesn't apply while canvas mode is armed. The row floats over the feed, + and the trigger's own fill is translucent, so it carries an opaque + backdrop at the button's radius to stop messages showing through. */} {!canvasArmed && ( -
+
Date: Wed, 29 Jul 2026 12:25:45 -0400 Subject: [PATCH 3/3] fix(canvas): keep feed clear of the floating mode selector The selector hangs 24px over the end of the feed, more than the scroll content's 16px bottom padding, so at the end of the feed it sat on top of the last message. Deepen the feed's bottom padding to 40px, which restores the same 16px of clearance the in-flow selector row used to leave. Generated-By: PostHog Code Task-Id: e21b284f-a889-4f05-a683-8f2407961fa5 --- .../ui/src/features/canvas/components/ChannelFeedView.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx index 717cf52ec3..ef985d5e6e 100644 --- a/packages/ui/src/features/canvas/components/ChannelFeedView.tsx +++ b/packages/ui/src/features/canvas/components/ChannelFeedView.tsx @@ -856,8 +856,10 @@ export function ChannelFeedView({ {/* Horizontal padding is load-bearing: ThreadItem's actions float at the row's top-right corner (absolute, past the row edge). Without a - gutter they hug the scroll container and get clipped. */} - + gutter they hug the scroll container and get clipped. The deeper + bottom padding clears the composer's floating workspace-mode + selector, which hangs over the end of the feed. */} + {intro} {entries.map((entry, index) => { const previous = entries[index - 1];