Skip to content

feat(editor): Polish workflow review experience - #36941

Open
JanOstrowka wants to merge 2 commits into
jan/adaptive-chat-inputfrom
jan/workflow-review-polish
Open

feat(editor): Polish workflow review experience#36941
JanOstrowka wants to merge 2 commits into
jan/adaptive-chat-inputfrom
jan/workflow-review-polish

Conversation

@JanOstrowka

@JanOstrowka JanOstrowka commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Summary

Polishes the workflow review experience across navigation, activity, metadata, and workflow diffs.

Depends on #36939 for the adaptive N8nChatInput layout.

What changed and why

  • Made the reviews sidebar resizable and persisted its width.
    Why: Lets users allocate more space to review titles and content.

  • Added full-width dividers beneath the Open/Closed and Activity/Changes tabs.
    Why: Creates clearer separation between navigation, actions, and content.

  • Refined review list item states using design-system surface tokens.
    Why: Removes unnecessary borders while making hover and active states clearer.

  • Stopped rendering empty review sections.
    Why: Avoids showing headings that contain no actionable reviews.

  • Centered the activity column and limited it to 720px.
    Why: Improves readability while accounting for the metadata rail.

  • Moved the comment composer into the activity timeline and applied the adaptive input.
    Why: Keeps comments in context and allows the composer to grow smoothly with its content.

  • Added a fade, upward movement, and blur transition for newly posted comments.
    Why: Makes successful comment submission feel smoother and easier to follow.

  • Refined activity typography and separators.
    Why: De-emphasizes timestamps and system actions while keeping comment content readable.

  • Made the review detail a single scrollable surface with sticky metadata.
    Why: Prevents the activity column from scrolling independently and keeps review information accessible.

  • Added an opaque, token-based background behind the sticky tab row.
    Why: Prevents scrolling content from appearing behind the tabs and divider.

  • Replaced the status dot separator with the pipe divider used elsewhere in the UI.
    Why: Uses the same divider consistently throughout the review experience.

  • Updated workflow diff containers to use the 8px radius token.
    Why: Aligns the diff presentation with the design system.

  • Improved first-publish workflow diffs with a compact “New workflow” context area.
    Why: Communicates that no baseline exists without wasting half the diff on an empty canvas.

  • Limited decision-note resizing to the popover’s available viewport height.
    Why: Keeps Comment, Request changes, and Approve actions visible.

  • Updated tests and removed unused empty-state translations.
    Why: Covers the new behavior and removes copy that can no longer be displayed.

Test plan

  • Run workflow review component tests.
  • Run workflow diff component tests.
  • Manually verify sidebar resizing, scrolling, comments, first-publish diffs, and decision-note resizing.

Improve review navigation, activity discussions, and workflow diff presentation for a clearer review flow.

Co-authored-by: Cursor <cursoragent@cursor.com>
@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Bundle Report

Changes will decrease total bundle size by 124.61kB (-0.2%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
editor-ui-esm 62.93MB -124.61kB (-0.2%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: editor-ui-esm

Assets Changed:

Asset Name Size Change Total Size Change (%)
assets/typescript.worker-*.js -414 bytes 10.88MB -0.0%
assets/src-*.js -1.88kB 792.25kB -0.24%
assets/src-*.js -17.82kB 3.32MB -0.53%
assets/src-*.js -4.16kB 48.81kB -7.85%
assets/worker-*.js -414 bytes 3.21MB -0.01%
assets/index-*.js -1.33kB 1.76MB -0.08%
assets/ParameterInputList-*.js -300 bytes 1.47MB -0.02%
assets/workflows.store-*.js -2.33kB 822.68kB -0.28%
assets/AgentBuilderView-*.js -8.37kB 776.02kB -1.07%
assets/InstanceAiThreadView-*.js 14.2kB 609.07kB 2.39%
assets/InstanceAiThreadView-*.css 9.58kB 534.49kB 1.83%
assets/InstanceAiEmptyView-*.js -10.37kB 456.12kB -2.22%
assets/AgentBuilderView-*.css -8.69kB 435.72kB -1.95%
assets/RunData-*.js -8.8kB 373.81kB -2.3%
assets/InstanceAiEmptyView-*.css -31.77kB 259.31kB -10.92%
assets/Icon-*.js -704 bytes 229.08kB -0.31%
assets/WorkflowDiffView-*.js -1.22kB 222.73kB -0.55%
assets/RunData-*.css -9.95kB 212.0kB -4.48%
assets/useRootStore-*.js -59 bytes 186.48kB -0.03%
assets/DateRangePicker-*.js 3 bytes 177.69kB 0.0%
assets/router-*.js -409 bytes 156.38kB -0.26%
assets/NodeSettings-*.js -1 bytes 145.36kB -0.0%
assets/WorkflowReviewRequestsView-*.css 4.53kB 145.21kB 3.22%
assets/WorkflowReviewRequestsView-*.js 1.34kB 138.41kB 0.98%
assets/canvas.eventBus-*.js 23 bytes 120.52kB 0.02%
assets/DropdownMenu-*.js 46 bytes 116.08kB 0.04%
assets/builder.store-*.js -30 bytes 111.72kB -0.03%
assets/agents.eventBus-*.js -696 bytes 99.03kB -0.7%
assets/CanvasRunWorkflowButton-*.js -222 bytes 96.87kB -0.23%
assets/Select-*.js 46 bytes 67.72kB 0.07%
assets/AgentToolConfigModal-*.js -9.56kB 66.69kB -12.53%
assets/ToolsConnectionModal-*.js -330 bytes 61.36kB -0.53%
assets/WorkflowDiffView-*.css 122 bytes 59.89kB 0.2%
assets/ToolsConnectionModal-*.css -22 bytes 58.84kB -0.04%
assets/SettingsOpenTelemetryView-*.js 779 bytes 58.2kB 1.36%
assets/AgentToolConfigModal-*.css -481 bytes 53.99kB -0.88%
assets/WorkflowBuilderUnavailableNotice-*.css -9.58kB 48.64kB -16.46%
assets/WorkflowBuilderUnavailableNotice-*.js -19.93kB 45.81kB -30.31%
assets/constants-*.js -105 bytes 44.24kB -0.24%
assets/constants-*.js 209 bytes 1.64kB 14.63% ⚠️
assets/InstanceAiView-*.js -145 bytes 42.34kB -0.34%
assets/readyToRunWorkflows.store-*.js -50 bytes 40.86kB -0.12%
assets/ui.store-*.js -1.58kB 38.97kB -3.9%
assets/DialogTitle-*.js 46 bytes 32.66kB 0.14%
assets/instanceAiSettings.store-*.js 1.53kB 26.92kB 6.04% ⚠️
assets/N8nMarkdown-*.css 13 bytes 24.85kB 0.05%
assets/InstanceAiToolsConnectionModalWrapper-*.js -831 bytes 23.4kB -3.43%
assets/ComputerUseSetupContent-*.js 90 bytes 22.4kB 0.4%
assets/BrowserUseSetupContent-*.js 2.5kB 22.34kB 12.63% ⚠️
assets/ToolIcon-*.css -22 bytes 19.52kB -0.11%
assets/AttachmentPreview-*.js -128 bytes 18.41kB -0.69%
assets/PopoverTrigger-*.js 46 bytes 18.08kB 0.26%
assets/ToolIcon-*.js -144 bytes 17.46kB -0.82%
assets/toolIcons-*.js 4.17kB 15.18kB 37.95% ⚠️
assets/MigrationRuleDetail-*.js -173 bytes 14.91kB -1.15%
assets/N8nEmptyState-*.js 35 bytes 14.45kB 0.24%
assets/useMcpServerAdapter-*.js -156 bytes 12.1kB -1.27%
assets/useHideOthers-*.js (New) 10.98kB 10.98kB 100.0% 🚀
assets/FocusScope-*.js -10.83kB 9.21kB -54.04%
assets/useSettingsItems-*.js 323 bytes 7.4kB 4.56%
assets/DemoLayout-*.js -32 bytes 5.55kB -0.57%
assets/views-*.js 64 bytes 4.93kB 1.31%
assets/utils-*.js 2 bytes 2.06kB 0.1%
assets/z-*.js -32 bytes 955 bytes -3.24%
assets/invite-*.utils-D9bGoeHT.js (New) 809 bytes 809 bytes 100.0% 🚀
assets/useMcpServerConnect-*.js (Deleted) -4.73kB 0 bytes -100.0% 🗑️
assets/useExtensionDirectConnect-*.js (Deleted) -4.54kB 0 bytes -100.0% 🗑️
assets/otel.constants-*.js (Deleted) -1.33kB 0 bytes -100.0% 🗑️
assets/invite-*.utils-DGeyge-M.js (Deleted) -809 bytes 0 bytes -100.0% 🗑️
assets/instanceAiComputerUse.telemetry-*.js (Deleted) -655 bytes 0 bytes -100.0% 🗑️

Files in assets/WorkflowDiffView-*.js:

  • ./src/features/workflows/workflowDiff/WorkflowDiffContent.vue → Total Size: 368 bytes

Files in assets/WorkflowReviewRequestsView-*.js:

  • ./src/features/workflow-reviews/components/WorkflowReviewRequestsSidebar.vue → Total Size: 413 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewActivityFeed.vue → Total Size: 401 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewChangesSection.vue → Total Size: 409 bytes

  • ./src/features/workflow-reviews/views/WorkflowReviewRequestsView.vue → Total Size: 392 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewDetailTabs.vue → Total Size: 393 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewDecisionPopover.vue → Total Size: 413 bytes

  • ./src/features/workflow-reviews/components/activity-entries/WorkflowReviewActivityComment.vue → Total Size: 432 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewCommentComposer.vue → Total Size: 413 bytes

  • ./src/features/workflow-reviews/components/activity-entries/WorkflowReviewActivityEventEntry.vue → Total Size: 442 bytes

  • ./src/features/workflow-reviews/components/WorkflowReviewDetailMetadata.vue → Total Size: 409 bytes

  • ./src/features/workflow-reviews/workflowReviewStatus.utils.ts → Total Size: 1.1kB

Files in assets/constants-*.js:

  • ./src/app/constants/localStorage.ts → Total Size: 2.61kB

Files in assets/constants-*.js:

  • ./src/features/workflow-reviews/constants.ts → Total Size: 1.49kB

@codecov

codecov Bot commented Aug 24, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 81.13208% with 10 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...-reviews/components/WorkflowReviewActivityFeed.vue 80.00% 2 Missing and 3 partials ⚠️
...views/components/WorkflowReviewCommentComposer.vue 42.85% 4 Missing ⚠️
...kflow-reviews/views/WorkflowReviewRequestsView.vue 80.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@cubic-dev-ai cubic-dev-ai Bot 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.

6 issues found across 18 files

Prompt for AI agents (unresolved issues)

Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.


<file name="packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffContent.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffContent.vue:171">
P2: When one side is missing, the panel is fixed to 96px (--height--5xl) while .emptyWorkflow now adds 12px vertical padding, leaving only ~72px for the heading plus the description slot text. At the review panel's narrow width the explanatory sentence wraps, so the centered empty-state text gets clipped by the outer overflow:hidden container or spills over the sibling canvas. Give the empty panel room to fit the content (e.g. min-height instead of a fixed height, or allow it to size to its content up to a cap) so the new/deleted message stays fully visible.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailTabs.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailTabs.vue:182">
P2: When the activity feed first-page request fails, open reviews no longer show the comment composer, so users cannot post comments during a transient feed error. Keep the composer available outside the feed error/loading branch or render the composer slot in the feed’s initial error state.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewChangesSection.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewChangesSection.vue:221">
P2: The comment says the design calls for 8px (radii/m), but `--radius--lg` is 20px (`--radius--md` is the 16px one being replaced). The 8px token is `--radius--xs` (0.5rem). As written, the radius is now larger than it was before, the opposite of the stated intent.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailMetadata.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailMetadata.vue:46">
P2: This status text now hardcodes the separator and token order, so translations can no longer control how state and decision are composed. Render the localized combined label from `statusDisplay.label` here to keep status grammar and punctuation locale-safe.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewCommentComposer.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewCommentComposer.vue:90">
P2: At narrow review widths, this leaves only a 1px inset while `N8nChatInput`'s focus ring is 2px, so the left focus outline is clipped by the detail scrollport. Use the focus-ring width for the inset.</violation>
</file>

<file name="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewActivityFeed.vue">

<violation number="1" location="packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewActivityFeed.vue:19">
P2: At the narrow `review-detail` breakpoint, `detailBody` changes to a column and places metadata after the activity panel. With this shared root, `scrollToBottom()` can land at the bottom of a tall metadata rail instead of showing the newest comment or composer. Keep the activity feed bounded at the narrow container breakpoint, or scroll the activity list’s last item rather than the whole detail body.

(Based on your team's feedback about keeping the activity feed as the scroll container at narrow review-detail widths.)</violation>
</file>
Architecture diagram
sequenceDiagram
    participant User
    participant LS as Local Storage
    participant View as WorkflowReviewRequestsView
    participant Sidebar as WorkflowReviewRequestsSidebar
    participant Detail as WorkflowReviewDetailTabs
    participant Feed as WorkflowReviewActivityFeed
    participant Composer as WorkflowReviewCommentComposer
    participant Store as ReviewActivityStore

    Note over View,LS: View Initialization
    View->>LS: GET N8N_WORKFLOW_REVIEW_SIDEBAR_WIDTH
    LS-->>View: persisted width
    View->>Sidebar: NEW: Render inside ResizeWrapper

    Note over Detail,Feed: Shared Scroll Coordination
    Detail->>Detail: Create detailBodyRef (HTMLElement)
    Detail->>Feed: NEW: Provide scroll root (InjectionKey)
    Feed->>Feed: CHANGED: Attach IntersectionObserver to parent scroll root
    
    Note over User,Composer: Composer & Activity Flow
    User->>Composer: Types multiline comment
    Composer->>Composer: NEW: ResizeObserver triggers scrollIntoView()
    User->>Composer: Clicks Send
    Composer->>Store: postComment(text)
    Store->>Store: Set posting = true
    Store-->>Feed: Reactive update (entries)
    
    rect rgb(240, 240, 240)
        Note over Feed: Animation Logic
        Feed->>Feed: NEW: Sync watch (entries + posting)
        Feed->>Feed: NEW: Set enteringCommentId
        Feed->>User: Render entry with CSS fade-in-up + sharpen
    end

    Store->>Store: Set posting = false
    
    Note over Detail,Feed: Metadata & Layout
    Detail->>Detail: Render Metadata (Sticky self-start)
    Note over Detail: Metadata and Feed now scroll<br/>together in shared detailBodyRef

    alt User resizes sidebar
        User->>View: Drag resize handle
        View->>LS: NEW: Persist width as fraction
    end
Loading

Tip: instead of fixing issues one by one fix them all with cubic
Tip: cubic used a learning from your PR history. Let your coding agent read cubic learnings directly with the cubic MCP.

Re-trigger cubic

/* A missing side is context, not a second canvas. GitHub/GitLab similarly keep
the "new/deleted" fact visible while giving the actual changed content the
reviewing space. */
.emptyWorkflowPanel {

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: When one side is missing, the panel is fixed to 96px (--height--5xl) while .emptyWorkflow now adds 12px vertical padding, leaving only ~72px for the heading plus the description slot text. At the review panel's narrow width the explanatory sentence wraps, so the centered empty-state text gets clipped by the outer overflow:hidden container or spills over the sibling canvas. Give the empty panel room to fit the content (e.g. min-height instead of a fixed height, or allow it to size to its content up to a cap) so the new/deleted message stays fully visible.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffContent.vue, line 171:

<comment>When one side is missing, the panel is fixed to 96px (--height--5xl) while .emptyWorkflow now adds 12px vertical padding, leaving only ~72px for the heading plus the description slot text. At the review panel's narrow width the explanatory sentence wraps, so the centered empty-state text gets clipped by the outer overflow:hidden container or spills over the sibling canvas. Give the empty panel room to fit the content (e.g. min-height instead of a fixed height, or allow it to size to its content up to a cap) so the new/deleted message stays fully visible.</comment>

<file context>
@@ -165,6 +165,13 @@ function getEdgeStatusClass(id: string) {
+/* A missing side is context, not a second canvas. GitHub/GitLab similarly keep
+	the "new/deleted" fact visible while giving the actual changed content the
+	reviewing space. */
+.emptyWorkflowPanel {
+	flex: 0 0 var(--height--5xl);
+}
</file context>
Fix with cubic

</N8nCallout>
</template>
<!-- Closed reviews take no new comments (the backend 409s) -->
<template v-if="review.state === 'open'" #composer>

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: When the activity feed first-page request fails, open reviews no longer show the comment composer, so users cannot post comments during a transient feed error. Keep the composer available outside the feed error/loading branch or render the composer slot in the feed’s initial error state.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailTabs.vue, line 182:

<comment>When the activity feed first-page request fails, open reviews no longer show the comment composer, so users cannot post comments during a transient feed error. Keep the composer available outside the feed error/loading branch or render the composer slot in the feed’s initial error state.</comment>

<file context>
@@ -172,13 +178,11 @@ const tabOptions = computed(() => [
 						</N8nCallout>
 					</template>
+					<!-- Closed reviews take no new comments (the backend 409s) -->
+					<template v-if="review.state === 'open'" #composer>
+						<WorkflowReviewCommentComposer :can-comment="viewerCanComment" />
+					</template>
</file context>
Fix with cubic

border: var(--border-width) var(--border-style) var(--border-color--subtle);
border-radius: var(--radius--md);
/* 8px — the design's radii/m. Not `--radius--md`: that primitive is 16px. */
border-radius: var(--radius--lg);

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: The comment says the design calls for 8px (radii/m), but --radius--lg is 20px (--radius--md is the 16px one being replaced). The 8px token is --radius--xs (0.5rem). As written, the radius is now larger than it was before, the opposite of the stated intent.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewChangesSection.vue, line 221:

<comment>The comment says the design calls for 8px (radii/m), but `--radius--lg` is 20px (`--radius--md` is the 16px one being replaced). The 8px token is `--radius--xs` (0.5rem). As written, the radius is now larger than it was before, the opposite of the stated intent.</comment>

<file context>
@@ -217,7 +217,8 @@ const targetLabel = computed(() =>
 	border: var(--border-width) var(--border-style) var(--border-color--subtle);
-	border-radius: var(--radius--md);
+	/* 8px — the design's radii/m. Not `--radius--md`: that primitive is 16px. */
+	border-radius: var(--radius--lg);
 	overflow: hidden;
 }
</file context>
Fix with cubic

{{ statusDisplay.stateLabel }}
<!-- Decorative, like the activity headline's divider; the dot's aria-label
keeps the shared combined form. -->
<span aria-hidden="true" :class="$style.statusSeparator">|</span>

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: This status text now hardcodes the separator and token order, so translations can no longer control how state and decision are composed. Render the localized combined label from statusDisplay.label here to keep status grammar and punctuation locale-safe.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewDetailMetadata.vue, line 46:

<comment>This status text now hardcodes the separator and token order, so translations can no longer control how state and decision are composed. Render the localized combined label from `statusDisplay.label` here to keep status grammar and punctuation locale-safe.</comment>

<file context>
@@ -39,7 +39,13 @@ const statusSummary = computed(
+					{{ statusDisplay.stateLabel }}
+					<!-- Decorative, like the activity headline's divider; the dot's aria-label
+						keeps the shared combined form. -->
+					<span aria-hidden="true" :class="$style.statusSeparator">|</span>
+					{{ statusDisplay.decisionLabel }}
+				</N8nText>
</file context>
Fix with cubic

/* Nearly the boxed entries' negative inset (see _activity-card.scss), held back by
the focus ring's width: flush with the feed's clip edge, the ring's left line
would be cut off entirely. */
margin-inline: calc(-1 * var(--spacing--sm) + var(--border-width));

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: At narrow review widths, this leaves only a 1px inset while N8nChatInput's focus ring is 2px, so the left focus outline is clipped by the detail scrollport. Use the focus-ring width for the inset.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewCommentComposer.vue, line 90:

<comment>At narrow review widths, this leaves only a 1px inset while `N8nChatInput`'s focus ring is 2px, so the left focus outline is clipped by the detail scrollport. Use the focus-ring width for the inset.</comment>

<file context>
@@ -66,9 +84,10 @@ async function onSubmit() {
+	/* Nearly the boxed entries' negative inset (see _activity-card.scss), held back by
+		the focus ring's width: flush with the feed's clip edge, the ring's left line
+		would be cut off entirely. */
+	margin-inline: calc(-1 * var(--spacing--sm) + var(--border-width));
 }
 
</file context>
Suggested change
margin-inline: calc(-1 * var(--spacing--sm) + var(--border-width));
\tmargin-inline: calc(-1 * var(--spacing--sm) + var(--focus--border-width));
Fix with cubic

const scrollContainer = ref<HTMLElement | null>(null);
const feed = ref<HTMLElement | null>(null);
const providedScrollContainer = inject(ReviewDetailScrollContainerKey, null);
const scrollContainer = computed(() =>

@cubic-dev-ai cubic-dev-ai Bot Aug 24, 2026

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.

P2: At the narrow review-detail breakpoint, detailBody changes to a column and places metadata after the activity panel. With this shared root, scrollToBottom() can land at the bottom of a tall metadata rail instead of showing the newest comment or composer. Keep the activity feed bounded at the narrow container breakpoint, or scroll the activity list’s last item rather than the whole detail body.

(Based on your team's feedback about keeping the activity feed as the scroll container at narrow review-detail widths.)

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/frontend/editor-ui/src/features/workflow-reviews/components/WorkflowReviewActivityFeed.vue, line 19:

<comment>At the narrow `review-detail` breakpoint, `detailBody` changes to a column and places metadata after the activity panel. With this shared root, `scrollToBottom()` can land at the bottom of a tall metadata rail instead of showing the newest comment or composer. Keep the activity feed bounded at the narrow container breakpoint, or scroll the activity list’s last item rather than the whole detail body.

(Based on your team's feedback about keeping the activity feed as the scroll container at narrow review-detail widths.) </comment>

<file context>
@@ -2,26 +2,56 @@
-const scrollContainer = ref<HTMLElement | null>(null);
+const feed = ref<HTMLElement | null>(null);
+const providedScrollContainer = inject(ReviewDetailScrollContainerKey, null);
+const scrollContainer = computed(() =>
+	providedScrollContainer ? providedScrollContainer.value : feed.value,
+);
</file context>
Fix with cubic

@n8n-assistant n8n-assistant Bot added the n8n team Authored by the n8n team label Aug 24, 2026
Cap native note resizing to the popover's available viewport height so actions remain reachable.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cla-signed n8n team Authored by the n8n team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant