Skip to content

[style] Update error/subgraph node footer design with layered overlay approach#9360

Merged
christian-byrne merged 26 commits intomainfrom
style/subgraph-error-node-design
Mar 7, 2026
Merged

[style] Update error/subgraph node footer design with layered overlay approach#9360
christian-byrne merged 26 commits intomainfrom
style/subgraph-error-node-design

Conversation

@jaeone94
Copy link
Collaborator

@jaeone94 jaeone94 commented Mar 3, 2026

Summary

Refactors the error and subgraph node footer UI by extracting a dedicated NodeFooter component and replacing the CSS outline approach with a layered border overlay for selection/executing state indicators.

Changes

  • What: Extracted NodeFooter.vue from LGraphNode.vue to encapsulate the footer tab logic (subgraph enter, error, advanced inputs). Replaced CSS outline with an absolutely-positioned border overlay div for selection and executing state. Added a separate root border overlay div for the node body border. Removed unused isTransparent function from colorUtil.ts.
  • Dependencies: None

Review Focus

  • The layered overlay approach (absolute -inset-[3px] border-3) for selection/executing outlines vs the previous outline-3 approach — ensures the outline renders outside the node bounds correctly including the footer area
  • NodeFooter handles 4 cases: subgraph+error (dual tabs), error only, subgraph only, advanced inputs — verify edge cases render correctly
  • Resize handle bottom offset adjustments for nodes with footers (hasFooter)

Screenshots

image image

┆Issue is synchronized with this Notion page by Unito

@jaeone94 jaeone94 requested a review from a team as a code owner March 3, 2026 17:35
@jaeone94 jaeone94 added enhancement New feature or request area:subgraph area:nodes area:ui General user interface and experience improvements labels Mar 3, 2026
@dosubot dosubot bot added the size:XL This PR changes 500-999 lines, ignoring generated files. label Mar 3, 2026
@github-actions
Copy link

github-actions bot commented Mar 3, 2026

🎨 Storybook: ✅ Built — View Storybook

Details

⏰ Completed at: 03/07/2026, 01:12:40 AM UTC

Links

@github-actions
Copy link

github-actions bot commented Mar 3, 2026

🎭 Playwright: ✅ 553 passed, 0 failed · 3 flaky

📊 Browser Reports
  • chromium: View Report (✅ 540 / ❌ 0 / ⚠️ 3 / ⏭️ 10)
  • chromium-2x: View Report (✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • chromium-0.5x: View Report (✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0)
  • mobile-chrome: View Report (✅ 10 / ❌ 0 / ⚠️ 0 / ⏭️ 0)

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Mar 3, 2026

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (25)
  • browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-after-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-before-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-after-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-before-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts-snapshots/vue-node-bypassed-state-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png is excluded by !**/*.png

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 47ec68a0-5ba8-439f-8014-40f0f8fdc8cc

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a new NodeFooter component and integrates overlay-driven selection/execution outlines in LGraphNode; updates unit and browser tests to locator-based selectors and new outline classes; adjusts enter-subgraph click positioning; removes isTransparent from color utilities.

Changes

Cohort / File(s) Summary
Node component + footer
src/renderer/extensions/vueNodes/components/LGraphNode.vue, src/renderer/extensions/vueNodes/components/NodeFooter.vue
Added NodeFooter.vue and integrated it into LGraphNode.vue; moved inline border/outline logic to overlay-driven elements and new computed classes (hasFooter, rootBorderShapeClass, selectionShapeClass, bodyRoundingClass); exposed footer props/events for subgraph/errors/advanced controls.
Unit tests
src/renderer/extensions/vueNodes/components/LGraphNode.test.ts
Added mocks for rootGraph/canvas and graphTraversalUtil; updated assertions to expect new selection/execution outline classes and verify presence of data-testid="node-state-outline-overlay".
Browser tests & helpers
browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts, browser_tests/tests/vueNodes/nodeStates/error.spec.ts, browser_tests/fixtures/VueNodeHelpers.ts
Replaced title-based node lookups with [data-node-id] locator chains plus getByTestId('node-inner-wrapper'); updated expected error CSS to /ring-destructive-background/; enterSubgraph click now targets a specific offset inside the element bounding box.
Utilities
src/utils/colorUtil.ts
Removed exported isTransparent(color: string) helper (transparent-color detection removed).
Small UI tweak
src/components/rightSidePanel/errors/MissingNodeCard.vue
Adjusted code block corner radius classes from rounded to rounded-sm (styling only).

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant LGraphNode
    participant NodeFooter
    participant GraphCanvas
    User->>LGraphNode: click / select / drag
    LGraphNode->>NodeFooter: render(props: isSubgraph, hasAnyError, shape, headerColor)
    NodeFooter->>LGraphNode: emit enterSubgraph / openErrors / toggleAdvanced
    LGraphNode->>GraphCanvas: update selection/execution state / navigate
    GraphCanvas->>LGraphNode: notify execution/selection changes
    LGraphNode->>NodeFooter: update overlays / outline classes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 I stitched a footer, neat and bright,
Overlay moons and outlines light,
Buttons tap and routes unfurl,
Nodes tumble, hop, then twirl,
I nibble tests and code with delight.

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: refactoring the node footer UI with a layered overlay approach instead of CSS outlines.
Description check ✅ Passed The description covers all required sections: Summary, Changes (What and Dependencies), Review Focus with critical design decisions, and includes relevant screenshots demonstrating the UI changes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch style/subgraph-error-node-design

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Mar 3, 2026

⚡ Performance Report

ℹ️ Collecting baseline variance data (0/5 runs). Significance will appear after 2 main branch runs.

Metric Baseline PR Δ
canvas-idle: style recalcs 125 122 -2%
canvas-idle: layouts 0 0 -100%
canvas-idle: task duration 394ms 375ms -5%
canvas-mouse-sweep: style recalcs 177 178 +1%
canvas-mouse-sweep: layouts 12 12 +0%
canvas-mouse-sweep: task duration 915ms 931ms +2%
dom-widget-clipping: style recalcs 43 43 +0%
dom-widget-clipping: layouts 0 1 +200%
dom-widget-clipping: task duration 360ms 358ms -0%
subgraph-dom-widget-clipping: style recalcs 74 72 -3%
subgraph-dom-widget-clipping: layouts 0 0 -100%
subgraph-dom-widget-clipping: task duration 411ms 394ms -4%
subgraph-idle: style recalcs 120 121 +1%
subgraph-idle: layouts 0 0
subgraph-idle: task duration 374ms 369ms -1%
subgraph-mouse-sweep: style recalcs 154 166 +8%
subgraph-mouse-sweep: layouts 16 16 +0%
subgraph-mouse-sweep: task duration 711ms 877ms +23%
Raw data
{
  "timestamp": "2026-03-07T01:15:52.362Z",
  "gitSha": "74b0d0722562a243e0ab2891edf404d23c5f53a7",
  "branch": "style/subgraph-error-node-design",
  "measurements": [
    {
      "name": "canvas-idle",
      "durationMs": 2017.0609999999556,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 15.827,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 360.076,
      "heapDeltaBytes": -2473228
    },
    {
      "name": "canvas-idle",
      "durationMs": 2020.2370000000087,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 19.544999999999998,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 382.14300000000003,
      "heapDeltaBytes": -2616296
    },
    {
      "name": "canvas-idle",
      "durationMs": 2011.3570000000323,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 18.238,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 381.333,
      "heapDeltaBytes": -599784
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2041.5849999999978,
      "styleRecalcs": 183,
      "styleRecalcDurationMs": 51.504999999999995,
      "layouts": 12,
      "layoutDurationMs": 3.5719999999999996,
      "taskDurationMs": 1003.3050000000001,
      "heapDeltaBytes": -809712
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 1904.291999999998,
      "styleRecalcs": 170,
      "styleRecalcDurationMs": 47.87,
      "layouts": 12,
      "layoutDurationMs": 3.165,
      "taskDurationMs": 839.605,
      "heapDeltaBytes": -1200000
    },
    {
      "name": "canvas-mouse-sweep",
      "durationMs": 2024.19900000001,
      "styleRecalcs": 180,
      "styleRecalcDurationMs": 47.992,
      "layouts": 12,
      "layoutDurationMs": 2.902,
      "taskDurationMs": 951.1800000000002,
      "heapDeltaBytes": -795016
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 557.4970000000121,
      "styleRecalcs": 42,
      "styleRecalcDurationMs": 17.668000000000003,
      "layouts": 1,
      "layoutDurationMs": 0.29100000000000004,
      "taskDurationMs": 359.24999999999994,
      "heapDeltaBytes": 7547160
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 570.2739999999835,
      "styleRecalcs": 44,
      "styleRecalcDurationMs": 15.024000000000003,
      "layouts": 1,
      "layoutDurationMs": 0.201,
      "taskDurationMs": 357.352,
      "heapDeltaBytes": 8546632
    },
    {
      "name": "dom-widget-clipping",
      "durationMs": 572.6129999999898,
      "styleRecalcs": 44,
      "styleRecalcDurationMs": 16.061,
      "layouts": 1,
      "layoutDurationMs": 0.1730000000000001,
      "taskDurationMs": 358.34700000000004,
      "heapDeltaBytes": 8457296
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 574.4779999999992,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 13.783999999999999,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 391.276,
      "heapDeltaBytes": -7497644
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 576.5799999999786,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 13.801,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 398.393,
      "heapDeltaBytes": -7292304
    },
    {
      "name": "subgraph-dom-widget-clipping",
      "durationMs": 565.0029999999902,
      "styleRecalcs": 72,
      "styleRecalcDurationMs": 14.434,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 392.604,
      "heapDeltaBytes": 15961128
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1998.4299999999848,
      "styleRecalcs": 121,
      "styleRecalcDurationMs": 18.566,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 358.452,
      "heapDeltaBytes": -2861636
    },
    {
      "name": "subgraph-idle",
      "durationMs": 1991.0899999999856,
      "styleRecalcs": 120,
      "styleRecalcDurationMs": 19.144000000000002,
      "layouts": 0,
      "layoutDurationMs": 0,
      "taskDurationMs": 364.54200000000003,
      "heapDeltaBytes": -2783776
    },
    {
      "name": "subgraph-idle",
      "durationMs": 2007.0259999999962,
      "styleRecalcs": 123,
      "styleRecalcDurationMs": 21.996000000000002,
      "layouts": 1,
      "layoutDurationMs": 0.27099999999999996,
      "taskDurationMs": 383.729,
      "heapDeltaBytes": -822592
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1980.9359999999856,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 56.249,
      "layouts": 16,
      "layoutDurationMs": 4.515,
      "taskDurationMs": 976.06,
      "heapDeltaBytes": -4296632
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1989.9859999999876,
      "styleRecalcs": 172,
      "styleRecalcDurationMs": 52.689,
      "layouts": 16,
      "layoutDurationMs": 4.062,
      "taskDurationMs": 940.8159999999999,
      "heapDeltaBytes": -3139064
    },
    {
      "name": "subgraph-mouse-sweep",
      "durationMs": 1714.7079999999733,
      "styleRecalcs": 155,
      "styleRecalcDurationMs": 45.088,
      "layouts": 16,
      "layoutDurationMs": 4.179,
      "taskDurationMs": 714.681,
      "heapDeltaBytes": -5058772
    }
  ]
}

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
src/renderer/extensions/vueNodes/components/LGraphNode.vue (1)

185-187: Hoist useRightSidePanelStore() out of the template handler.

Calling useRightSidePanelStore() inline in the template hides the dependency and makes the event path harder to test. Prefer a setup-scoped store + named handler.

♻️ Proposed refactor
-      `@open-errors`="useRightSidePanelStore().openPanel('errors')"
+      `@open-errors`="handleOpenErrors"
const rightSidePanelStore = useRightSidePanelStore()

function handleOpenErrors() {
  rightSidePanelStore.openPanel('errors')
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue` around lines 185
- 187, Hoist the inline call to useRightSidePanelStore() out of the template by
creating a setup-scoped variable (e.g., rightSidePanelStore =
useRightSidePanelStore()) and a named handler (e.g., handleOpenErrors()) that
calls rightSidePanelStore.openPanel('errors'); then replace the template binding
`@open-errors`="useRightSidePanelStore().openPanel('errors')" with
`@open-errors`="handleOpenErrors" so the dependency and event path are explicit
and testable (ensure handleOpenErrors is returned from setup).
src/renderer/extensions/vueNodes/components/NodeFooter.vue (2)

113-118: Use template $t when i18n is template-only.

useI18n is only used to expose t for template text. Prefer $t directly in template and remove the script import/destructure to reduce setup surface.

Based on learnings: In Vue single-file components where the i18n t function is only used within the template, prefer using built-in $t in the template instead of importing useI18n.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue` around lines 113
- 118, The code imports useI18n and destructures t in NodeFooter.vue but t is
only used in the template; remove the import and the const { t } = useI18n()
from the script setup, and change any template usages of t(...) to the global
$t(...) call instead (keep component imports like Button, RenderShape, cn
intact); this reduces setup surface by relying on Vue's built-in $t in the
template rather than the useI18n symbol.

139-150: Follow the static string pattern from LGraphNode.vue for consistency.

Lines 147 and 149 use runtime template literals (rounded-br-${radius}) that make intent less clear. LGraphNode.vue (lines 573–585) handles the same logic with explicit static strings in a conditional, which is clearer and matches the codebase convention. Refactor to:

const footerRadiusClass = computed(() => {
  const isExpanded = props.hasAnyError

  switch (props.shape) {
    case RenderShape.BOX:
      return 'rounded-none'
    case RenderShape.CARD:
      return isExpanded
        ? 'rounded-bl-none rounded-br-[20px]'
        : 'rounded-bl-none rounded-br-2xl'
    default:
      return isExpanded ? 'rounded-b-[20px]' : 'rounded-b-2xl'
  }
})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue` around lines 139
- 150, Refactor the computed footerRadiusClass to avoid runtime template
literals and follow the static string pattern used in LGraphNode.vue: remove the
radius variable and use props.hasAnyError to choose between explicit static
classes for each RenderShape case (for RenderShape.CARD return either
'rounded-bl-none rounded-br-[20px]' or 'rounded-bl-none rounded-br-2xl'; for
default return either 'rounded-b-[20px]' or 'rounded-b-2xl'), keeping the
RenderShape.BOX branch returning 'rounded-none' and leaving the computed name
footerRadiusClass and props.shape/props.hasAnyError checks intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.test.ts`:
- Around line 204-225: The tests in LGraphNode.test.ts are asserting Tailwind
utility classes (e.g., 'outline-node-component-outline',
'border-node-component-outline', 'border-3', 'outline-node-stroke-executing',
'border-node-stroke-executing') which couples behavior tests to styling; update
the two test cases that set mockData.mockExecuting and mountLGraphNode({
nodeData: mockNodeData }) to assert semantic behavior instead — for example
check for a data-state or aria attribute on the root node, or assert that the
progress indicator component/element exists (e.g., find by test id or component
name) and that the node's executing flag is reflected in emitted events or DOM
attributes, rather than checking Tailwind utility classes; reference the wrapper
returned by mountLGraphNode, mockNodeData/mockExecuting, and the overlay query
so you replace those class-based expects with attribute/component-based expects.

---

Nitpick comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Around line 185-187: Hoist the inline call to useRightSidePanelStore() out of
the template by creating a setup-scoped variable (e.g., rightSidePanelStore =
useRightSidePanelStore()) and a named handler (e.g., handleOpenErrors()) that
calls rightSidePanelStore.openPanel('errors'); then replace the template binding
`@open-errors`="useRightSidePanelStore().openPanel('errors')" with
`@open-errors`="handleOpenErrors" so the dependency and event path are explicit
and testable (ensure handleOpenErrors is returned from setup).

In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue`:
- Around line 113-118: The code imports useI18n and destructures t in
NodeFooter.vue but t is only used in the template; remove the import and the
const { t } = useI18n() from the script setup, and change any template usages of
t(...) to the global $t(...) call instead (keep component imports like Button,
RenderShape, cn intact); this reduces setup surface by relying on Vue's built-in
$t in the template rather than the useI18n symbol.
- Around line 139-150: Refactor the computed footerRadiusClass to avoid runtime
template literals and follow the static string pattern used in LGraphNode.vue:
remove the radius variable and use props.hasAnyError to choose between explicit
static classes for each RenderShape case (for RenderShape.CARD return either
'rounded-bl-none rounded-br-[20px]' or 'rounded-bl-none rounded-br-2xl'; for
default return either 'rounded-b-[20px]' or 'rounded-b-2xl'), keeping the
RenderShape.BOX branch returning 'rounded-none' and leaving the computed name
footerRadiusClass and props.shape/props.hasAnyError checks intact.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ab2aaa3 and c225e8d.

📒 Files selected for processing (4)
  • src/renderer/extensions/vueNodes/components/LGraphNode.test.ts
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/components/NodeFooter.vue
  • src/utils/colorUtil.ts
💤 Files with no reviewable changes (1)
  • src/utils/colorUtil.ts

@github-actions
Copy link

github-actions bot commented Mar 4, 2026

📦 Bundle: 4.53 MB gzip 🔴 +1.13 kB

Details

Summary

  • Raw size: 21.2 MB baseline 21.2 MB — 🔴 +6.62 kB
  • Gzip: 4.53 MB baseline 4.53 MB — 🔴 +1.13 kB
  • Brotli: 3.5 MB baseline 3.5 MB — 🔴 +921 B
  • Bundles: 233 current • 233 baseline • 2 added / 2 removed

Category Glance
Graph Workspace 🔴 +6.62 kB (947 kB) · Vendor & Third-Party ⚪ 0 B (8.88 MB) · Other ⚪ 0 B (7.93 MB) · Data & Services ⚪ 0 B (2.76 MB) · Panels & Settings ⚪ 0 B (436 kB) · Editors & Dialogs ⚪ 0 B (76.6 kB) · + 5 more

App Entry Points — 28.9 kB (baseline 28.9 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Cue26E_Z.js (new) 28.9 kB 🔴 +28.9 kB 🔴 +11.4 kB 🔴 +9.32 kB
assets/index-DGEbOS9g.js (removed) 28.9 kB 🟢 -28.9 kB 🟢 -11.4 kB 🟢 -9.33 kB

Status: 1 added / 1 removed

Graph Workspace — 947 kB (baseline 940 kB) • 🔴 +6.62 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-D25uEeot.js (new) 947 kB 🔴 +947 kB 🔴 +200 kB 🔴 +152 kB
assets/GraphView-DCsiFd98.js (removed) 940 kB 🟢 -940 kB 🟢 -199 kB 🟢 -151 kB

Status: 1 added / 1 removed

Views & Navigation — 72.4 kB (baseline 72.4 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudAuthTimeoutView-Bm1G1qHK.js 4.96 kB 4.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudForgotPasswordView-KTxAPVYU.js 5.59 kB 5.59 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLayoutView-DJ6xBd0b.js 6.47 kB 6.47 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudLoginView-CoqkB1_T.js 11.5 kB 11.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSignupView-CRxoQPlA.js 9.41 kB 9.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSorryContactSupportView-kf2atGXo.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSubscriptionRedirectView-DQdQWN0i.js 4.78 kB 4.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudSurveyView-DvHDtoQo.js 15.5 kB 15.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-C7XcDoLd.js 296 B 296 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserCheckView-DUQkaEws.js 8.42 kB 8.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserSelectView-SmecgAPL.js 4.5 kB 4.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Panels & Settings — 436 kB (baseline 436 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AboutPanel-FCACjZlA.js 9.79 kB 9.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudRemoteConfig-SeXe06Z1.js 1.48 kB 1.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/config-CH_cdA2N.js 996 B 996 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ExtensionPanel-CuV5I722.js 9.42 kB 9.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/KeybindingPanel-ecF9Xq06.js 12.3 kB 12.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LegacyCreditsPanel-6xloSpUo.js 20.7 kB 20.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/refreshRemoteConfig-CvThet5I.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SecretsPanel-BalWtNcW.js 21.5 kB 21.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ServerConfigPanel-BcUd1KD9.js 6.49 kB 6.49 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-71sPPmDw.js 32.4 kB 32.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B4se7HWo.js 28.8 kB 28.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B7IP4XTb.js 23.9 kB 23.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BntF-aiB.js 29.9 kB 29.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BnWq3fMI.js 24.5 kB 24.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BsTYoQcE.js 27.8 kB 27.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bwt_U2hc.js 34.2 kB 34.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CFCCJ6bh.js 30.5 kB 30.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CiXfim_M.js 38.5 kB 38.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DKOsOORk.js 27.9 kB 27.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-LhJVbur1.js 28.7 kB 28.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanel-BrSLvwcQ.js 18.7 kB 18.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserPanel-DWagNKgZ.js 6.2 kB 6.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
User & Accounts — 16.1 kB (baseline 16.1 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-DF0xvds_.js 3.4 kB 3.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auth-UE5FkwxE.js 357 B 357 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/firebaseAuthStore-DMfarpUX.js 831 B 831 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/PasswordFields-B4903XLX.js 4.51 kB 4.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignUpForm-D_BAX6ew.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UpdatePasswordContent-DZuoQEgI.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspaceProfilePic-CssIUQnt.js 1.57 kB 1.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Editors & Dialogs — 76.6 kB (baseline 76.6 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useShareDialog-Dd2pTWtu.js 75.8 kB 75.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useSubscriptionDialog-2BFsCx9p.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
UI Components — 50.9 kB (baseline 50.9 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Button-BJstg3ww.js 3.17 kB 3.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudBadge-CXz10wN-.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudFeedbackTopbarButton-DCDXvQa9.js 1.64 kB 1.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-BTE9cBvu.js 8.02 kB 8.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyQueueButton-Ca6QoLRu.js 836 B 836 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FormSearchInput-CCyXrnmF.js 3.73 kB 3.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ScrubableNumberInput-D9mzvn0z.js 5.95 kB 5.95 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeButton-D6-E0zN7.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/toggle-group-C6BH2eSy.js 3.83 kB 3.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/TopbarBadge-CEVxj-GC.js 7.39 kB 7.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-B9_AHnQI.js 1.17 kB 1.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useTerminalTabs-B4ckmPuX.js 9.87 kB 9.87 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-6NjG6jwg.js 1.84 kB 1.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Data & Services — 2.76 MB (baseline 2.76 MB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/api-MvWeAOF5.js 693 kB 693 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioService-C2f9NShx.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/bootstrapStore-CPTOntEg.js 2.08 kB 2.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-BqBxy4S2.js 768 B 768 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/dialogService-CbzXXNF-.js 1.92 MB 1.92 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/extensionStore-D1YvU1Ix.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/keybindingService-DfbWH2RG.js 7.16 kB 7.16 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3dService-NDAffo0t.js 91.1 kB 91.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-Bm8x8aJ_.js 7.96 kB 7.96 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/releaseStore-CH9CPzYg.js 803 B 803 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/serverConfigStore-gMFb9Bxl.js 2.32 kB 2.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settingStore-DsONs_Io.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/userStore-76yT2xKT.js 1.85 kB 1.85 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowDraftStore-Bqif-SBe.js 779 B 779 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/workflowShareService-ehjfCG-q.js 13.1 kB 13.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Utilities & Hooks — 57.3 kB (baseline 57.3 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/_plugin-vue_export-helper-ralzwvFM.js 315 B 315 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/audioUtils-CVYyByta.js 858 B 858 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-DskRKiYG.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/envUtil-CC-l-L9z.js 466 B 466 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-DOdPeMQc.js 1.56 kB 1.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SkeletonUtils-udjgEG1T.js 133 B 133 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/subscriptionCheckoutUtil-Yf88qMkQ.js 2.53 kB 2.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCopyToClipboard-CzbmDnoK.js 944 B 944 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useCurrentUser-V0GJMevq.js 765 B 765 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useErrorHandling-BOohh_Fj.js 1.5 kB 1.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useExternalLink-BpHmwCZG.js 1.66 kB 1.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useFeatureFlags-5Z6BcpzV.js 4.86 kB 4.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-BiQZWSxc.js 902 B 902 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3d-CjDJCcvT.js 14.6 kB 14.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-BTo9hkSl.js 881 B 881 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useLoad3dViewer-Cj9lkeBq.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceSwitch-CK9YwjmU.js 1.25 kB 1.25 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/useWorkspaceUI-Ie4B95Kn.js 3 kB 3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Vendor & Third-Party — 8.88 MB (baseline 8.88 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-axios-Cp6hch1I.js 70.7 kB 70.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-chart-D1OJsayB.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-firebase-BvMr43CG.js 836 kB 836 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-i18n-DccD0mxo.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-markdown-D5S6AC80.js 103 kB 103 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CHuqBC10.js 1.54 MB 1.54 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-CKBhLh4j.js 1.73 MB 1.73 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-C-tDe-KL.js 399 kB 399 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-sentry-SQwstEKc.js 182 kB 182 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-fZJTFMbU.js 1.8 MB 1.8 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-DTO2QA4Q.js 634 kB 634 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-core-CmHHRvL9.js 311 kB 311 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vueuse-CH_Hqnyl.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CWHPCody.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-yjs-CP_4YO8u.js 143 kB 143 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-zod-DcCUUPIi.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 7.93 MB (baseline 7.93 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/AnimationControls-CbgPNiwn.js 4.61 kB 4.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ApiNodesSignInContent-DLRfVA0E.js 2.69 kB 2.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/AudioPreviewPlayer-D7-JJ2iK.js 11 kB 11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/auto-Mr7ZnDOO.js 1.7 kB 1.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/BaseViewTemplate-6VJcY26s.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CancelSubscriptionDialogContent-BJFCk0ag.js 4.83 kB 4.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-B1gQZW1y.js 800 B 800 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/changeTracker-CLoFF3Ki.js 9.44 kB 9.44 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudBadges-C3n9ylg7.js 1.41 kB 1.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CloudRunButtonWrapper-DxLzyDWm.js 1.72 kB 1.72 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSessionCookie-KTpByuoH.js 3.14 kB 3.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/cloudSubscription-zU941KsE.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/comfy-logo-single-C9H6LVPO.js 198 B 198 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ComfyOrgHeader-BiqY9Lcy.js 910 B 910 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BbyDu2gv.js 16.1 kB 16.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BEB4P0rH.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-Bfucg9mP.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BMLsYxKd.js 19 kB 19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CAkQMSj_.js 15.4 kB 15.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CCml88sK.js 17.1 kB 17.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CXLXD2h2.js 16.3 kB 16.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DbC3OFpW.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DSqCRthz.js 15.2 kB 15.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DstS1-8g.js 16.9 kB 16.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DZFUlDVf.js 17.7 kB 17.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/constants-Cl4K4L4H.js 579 B 579 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/core-DHC1wgmn.js 73.8 kB 73.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CreateWorkspaceDialogContent-DNDoUj0E.js 5.56 kB 5.56 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/CurrentUserPopoverWorkspace-DrGrVixY.js 20.5 kB 20.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/DeleteWorkspaceDialogContent-BO7-foqy.js 4.26 kB 4.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/EditWorkspaceDialogContent-CPh-nEdj.js 5.36 kB 5.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/FreeTierDialogContent-CaogFdLF.js 5.42 kB 5.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/GlobalToast-BO73aQVR.js 2.91 kB 2.91 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/graphHasMissingNodes-CxYtZIVO.js 761 B 761 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/groupNode-HFWTvsF9.js 71.8 kB 71.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-0QKBs1LT.js 199 B 199 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/i18n-BcovuvZN.js 542 kB 542 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberDialogContent-Cy-L8zZI.js 7.41 kB 7.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/InviteMemberUpsellDialogContent-DJkfyZNk.js 3.86 kB 3.86 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LeaveWorkspaceDialogContent-DIWPIvoM.js 4.09 kB 4.09 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-CF1vFShN.js 16.2 kB 16.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/load3d-D9_OmDU8.js 14.8 kB 14.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3D-iVfHSMvD.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DConfiguration-B6l0JPeS.js 6.27 kB 6.27 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3DControls-D3yAa76g.js 30.9 kB 30.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-BiRw2XrA.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Load3dViewerContent-CG0qS78D.js 23 kB 23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Loader-CW1-OX64.js 1.14 kB 1.14 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BBaUZnpF.js 181 kB 181 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BdDSvujx.js 151 kB 151 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BgdDDyHY.js 211 kB 211 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CBswMsc-.js 150 kB 150 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CYHSDXJ3.js 188 kB 188 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DA1wOx7a.js 156 kB 156 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DxMfC0Xk.js 132 kB 132 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DXtzF5oy.js 159 kB 159 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-HANZ9FZw.js 153 kB 153 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ivx1LSmO.js 173 kB 173 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-k8ICB470.js 133 kB 133 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-0x8HaYIi.js 1.83 kB 1.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-Cg7hEqmq.js 1.43 kB 1.43 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CsGpbloy.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaOtherTop-BnLYn-y9.js 1.02 kB 1.02 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaTextTop-lRCQfO0C.js 1.01 kB 1.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-GUUbKzSN.js 2.78 kB 2.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nightlyBadges-DO0oZqpd.js 1.04 kB 1.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-3ypc2-io.js 397 kB 397 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-B8OsAZ59.js 450 kB 450 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bv39sqP1.js 451 kB 451 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CJPZB8jl.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ck_RbOds.js 492 kB 492 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Ct4I98dt.js 400 kB 400 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D1QSnvAe.js 416 kB 416 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DK4i8jfV.js 404 kB 404 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DRNH3qAO.js 364 kB 364 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DWeE5stC.js 368 kB 368 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-mLZFEWZZ.js 392 kB 392 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeTemplates-C6yBR0-l.js 9.34 kB 9.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/onboardingCloudRoutes-DF-VBpC2.js 5.51 kB 5.51 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Popover-D7ciZgWh.js 3.65 kB 3.65 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Preview3d-D6Y1neKF.js 4.89 kB 4.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-D0NX1Fci.js 1.39 kB 1.39 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RemoveMemberDialogContent-DCseNXo8.js 4.08 kB 4.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/RevokeInviteDialogContent-G9j4nDB_.js 3.99 kB 3.99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-DLICfi3-.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/saveMesh-CBD_iAb0.js 3.42 kB 3.42 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SelectValue-DTlZN9Iz.js 8.94 kB 8.94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SignInContent-0N72tzxR.js 18.9 kB 18.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/signInSchema-Bb1IiPdE.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Da9q2um5.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/src-LCL7cak3.js 251 B 251 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscribeToRun-80s85fDZ.js 2.06 kB 2.06 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionBenefits-D1DueXTw.js 2.01 kB 2.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-BUONyLnr.js 22 kB 22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionPanelContentWorkspace-BZngjiDk.js 963 B 963 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContent-Bd-OCpCg.js 25.6 kB 25.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/SubscriptionRequiredDialogContentWorkspace-C3ZKufb-.js 46.3 kB 46.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/telemetry-zZf2dHJ2.js 226 B 226 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Textarea-h5LgL2vk.js 1.37 kB 1.37 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tierBenefits-C3tzosIr.js 3.66 kB 3.66 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/types-DT3N7am7.js 204 B 204 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/ValueControlPopover-DqI1imAp.js 4.93 kB 4.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/VideoPlayOverlay-BciYDrIq.js 1.35 kB 1.35 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-DIRwAHBY.js 3.01 kB 3.01 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BuNtsXKX.js 283 B 283 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-DE2u52Vf.js 3.19 kB 3.19 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-BiI2RQCJ.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-DPuMBxG1.js 2.9 kB 2.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetCurve-CcAQLD_P.js 9.36 kB 9.36 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-Do6cgqtI.js 3.6 kB 3.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-Dn8c01L9.js 7 kB 7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCrop-BEzz81N9.js 22.2 kB 22.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputNumber-CQSdyEr3.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-CTH3BU4p.js 2.89 kB 2.89 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BZhqi3N7.js 1.98 kB 1.98 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLegacy-DD16O69f.js 787 B 787 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-CFDJ6vK7.js 2.93 kB 2.93 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetPainter-frxzi1eh.js 32.9 kB 32.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DWqMK-RY.js 1.11 kB 1.11 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetRecordAudio-ByNTdWc5.js 17.4 kB 17.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetSelect-C-ugBTev.js 58.3 kB 58.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-D2YqIQuf.js 4.26 kB 4.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B_kNaRoH.js 3.54 kB 3.54 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetTypes-DYLaC2lj.js 393 B 393 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetWithControl-D2k9-KMy.js 4.17 kB 4.17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WorkspacePanelContent-DjPUPeyW.js 29.3 kB 29.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

@jaeone94 jaeone94 added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 4, 2026
@github-actions
Copy link

github-actions bot commented Mar 4, 2026

Updating Playwright Expectations

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 4, 2026
- Add pointer-events-auto to NodeFooter tab buttons so Playwright can
  reliably click absolutely-positioned footer elements
- Update error.spec.ts: target inner wrapper div and check
  ring-destructive-background instead of root div border-node-stroke-error
- Update bypass.spec.ts: target inner wrapper div for before:bg-bypass/60
  class check, reflecting the class moving from root to inner div
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Mar 4, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
browser_tests/tests/vueNodes/nodeStates/error.spec.ts (1)

21-24: ⚠️ Potential issue | 🟠 Major

Same selector brittleness issue as bypass tests—please centralize.

This repeats the [data-node-id] + nth-child(2) pattern, which is brittle under DOM changes and should be replaced with centralized TestIds/shared selector helpers.

As per coding guidelines, "Use the centralized TestIds from browser_tests/fixtures/selectors.ts for test element selection."

Also applies to: 35-38

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/tests/vueNodes/nodeStates/error.spec.ts` around lines 21 - 24,
The locator construction for unknownNode (and the similar selector at lines
35-38) uses a brittle '[data-node-id]' + '> div:nth-child(2)' pattern; replace
these ad-hoc selectors with the centralized TestIds/selector helpers from
browser_tests/fixtures/selectors.ts (e.g., use the exported test id constant for
UNKNOWN_NODE and the helper locator function provided by comfyPage or the
selectors module) so the test references a stable test id instead of positional
child selectors; update the unknownNode assignment to use the selectors.ts
constant/helper and do the same for the other occurrence.
🧹 Nitpick comments (2)
src/renderer/extensions/vueNodes/components/NodeFooter.vue (2)

113-119: Optional: use template $t when translations are template-only.

useI18n is only used to expose t for template bindings; this can be simplified by using $t directly in the template and removing the script wiring.

Based on learnings, in Vue components where translation is used only in template, prefer template $t over importing useI18n.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue` around lines 113
- 119, The component imports and calls useI18n and destructures t at
module-level (useI18n, t in NodeFooter.vue) only for template translations;
remove the useI18n import and the const { t } = useI18n() line and update the
template to call $t(...) instead of t(...) so the component uses the global
template helper, reducing script wiring and avoiding unnecessary composition API
usage.

84-87: Make advanced footer radius shape-aware for consistency.

The advanced footer hardcodes rounded-b-2xl, while other footer cases derive radius from shape via footerRadiusClass. This can produce inconsistent corners for non-default shapes.

♻️ Proposed refactor
-  <div
-    v-else-if="showAdvancedInputsButton || showAdvancedState"
-    class="flex w-full h-7 rounded-b-2xl -z-1 text-xs rounded-t-none overflow-hidden divide-x divide-component-node-border relative -mt-5"
-  >
+  <div
+    v-else-if="showAdvancedInputsButton || showAdvancedState"
+    :class="
+      cn(
+        'flex w-full h-7 -z-1 text-xs rounded-t-none overflow-hidden divide-x divide-component-node-border relative -mt-5',
+        footerRadiusClass
+      )
+    "
+  >
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue` around lines 84 -
87, The advanced footer div is using a hardcoded rounded-b-2xl which can
conflict with shape-specific radii; update the element rendered when
v-else-if="showAdvancedInputsButton || showAdvancedState" to use the computed
footerRadiusClass (same one other footer branches use) instead of the static
rounded-b-2xl so the corner radius honors the node shape; locate the div in
NodeFooter.vue containing that v-else-if and replace the hardcoded class with
footerRadiusClass while preserving the other classes (flex w-full h-7 ...
divide-x divide-component-node-border relative -mt-5).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts`:
- Around line 25-29: The locator uses fragile DOM-indexed traversal (the '>
div:nth-child(2)' chain) to find the "Load Checkpoint" node; replace this with
the centralized TestIds selector from browser_tests/fixtures/selectors.ts and
the shared helper used for node selection so tests don't depend on child
ordering: stop using the inline locator chain that produces checkpointNode and
instead call the shared helper (the project’s node-selection helper) with the
TestId for nodes and the visible label "Load Checkpoint", then assert that the
returned element has class BYPASS_CLASS (keep BYPASS_CLASS as-is); apply the
same replacement for the duplicate case around lines 46-53.

---

Duplicate comments:
In `@browser_tests/tests/vueNodes/nodeStates/error.spec.ts`:
- Around line 21-24: The locator construction for unknownNode (and the similar
selector at lines 35-38) uses a brittle '[data-node-id]' + '> div:nth-child(2)'
pattern; replace these ad-hoc selectors with the centralized TestIds/selector
helpers from browser_tests/fixtures/selectors.ts (e.g., use the exported test id
constant for UNKNOWN_NODE and the helper locator function provided by comfyPage
or the selectors module) so the test references a stable test id instead of
positional child selectors; update the unknownNode assignment to use the
selectors.ts constant/helper and do the same for the other occurrence.

---

Nitpick comments:
In `@src/renderer/extensions/vueNodes/components/NodeFooter.vue`:
- Around line 113-119: The component imports and calls useI18n and destructures
t at module-level (useI18n, t in NodeFooter.vue) only for template translations;
remove the useI18n import and the const { t } = useI18n() line and update the
template to call $t(...) instead of t(...) so the component uses the global
template helper, reducing script wiring and avoiding unnecessary composition API
usage.
- Around line 84-87: The advanced footer div is using a hardcoded rounded-b-2xl
which can conflict with shape-specific radii; update the element rendered when
v-else-if="showAdvancedInputsButton || showAdvancedState" to use the computed
footerRadiusClass (same one other footer branches use) instead of the static
rounded-b-2xl so the corner radius honors the node shape; locate the div in
NodeFooter.vue containing that v-else-if and replace the hardcoded class with
footerRadiusClass while preserving the other classes (flex w-full h-7 ...
divide-x divide-component-node-border relative -mt-5).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 18e3803a-a0f8-453f-b6dd-7ce8d7364346

📥 Commits

Reviewing files that changed from the base of the PR and between 5b357b5 and 7ab6182.

⛔ Files ignored due to path filters (28)
  • browser_tests/tests/interaction.spec.ts-snapshots/dragged-node1-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/loadWorkflowInMedia.spec.ts-snapshots/no-workflow-webp-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/nodeSearchBox.spec.ts-snapshots/added-node-no-connection-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/saveImageAndWebp.spec.ts-snapshots/save-image-and-webm-preview-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-create-group-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/groups/groups.spec.ts-snapshots/vue-groups-fit-to-contents-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/pan.spec.ts-snapshots/vue-nodes-paned-with-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/canvas/zoom.spec.ts-snapshots/zoomed-in-ctrl-shift-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-dragging-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-ctrl-alt-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-input-drag-reuses-origin-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-input-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-reroute-output-shift-drag-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-shift-output-multi-link-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/links/linkInteraction.spec.ts-snapshots/vue-node-snap-to-slot-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-after-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-overlapped-before-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-after-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/bringToFront.spec.ts-snapshots/bring-to-front-widget-overlapped-before-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/imagePreview.spec.ts-snapshots/vue-node-multiple-promoted-previews-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/interactions/node/move.spec.ts-snapshots/vue-node-moved-node-touch-mobile-chrome-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-color-blue-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-dark-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/colors.spec.ts-snapshots/vue-node-custom-colors-light-all-colors-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/vueNodes/nodeStates/mute.spec.ts-snapshots/vue-node-muted-state-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (3)
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts
  • browser_tests/tests/vueNodes/nodeStates/error.spec.ts
  • src/renderer/extensions/vueNodes/components/NodeFooter.vue

- Add data-testid='node-inner-wrapper' to LGraphNode's main content div
  to enable stable targeting regardless of selection state
- Update bypass.spec.ts: replace fragile > div:nth-child(2) with
  getByTestId('node-inner-wrapper') to handle DOM order change when
  node is selected (SelectionOutline div is inserted before the wrapper)
- Update error.spec.ts: replace nth-child(2) with getByTestId and update
  ERROR_CLASS to ring-destructive-background (moved from root to inner div)
- Use { force: true } in VueNodeHelpers.enterSubgraph() to bypass
  Playwright hit-test interception from overlapping node body div
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
browser_tests/fixtures/VueNodeHelpers.ts (1)

175-175: Remove force: true from the shared enterSubgraph helper to catch visibility regressions.

The subgraph enter button should be clickable without forcing actionability checks. Shared test helpers should be strict to avoid masking real issues. The force click currently applies to every enterSubgraph call (used in 2 tests), which can hide overlay or visibility regressions. If specific test scenarios require force, apply it at the call site instead.

Proposed change
  async enterSubgraph(nodeId?: string): Promise<void> {
    const locator = nodeId ? this.getNodeLocator(nodeId) : this.page
    const editButton = locator.getByTestId(TestIds.widgets.subgraphEnterButton)
-   await editButton.click({ force: true })
+   const target = editButton.first()
+   await target.waitFor({ state: 'visible' })
+   await target.click()
  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@browser_tests/fixtures/VueNodeHelpers.ts` at line 175, The shared helper
enterSubgraph currently forces clicks and can mask visibility regressions; in
the enterSubgraph helper remove the { force: true } option from the await
editButton.click(...) call so the click goes through normal
actionability/visibility checks, and if any specific test truly needs a forced
click, apply { force: true } at that test's enterSubgraph call site instead;
locate the editButton.click invocation inside the enterSubgraph function and
delete the force option to make the helper strict.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/renderer/extensions/vueNodes/components/LGraphNode.vue`:
- Around line 576-602: rootBorderShapeClass and selectionShapeClass only handle
RenderShape.BOX and RenderShape.CARD and rely on the default for other
RenderShape variants, causing overlay geometry mismatches; update both computed
properties (rootBorderShapeClass and selectionShapeClass in LGraphNode.vue) to
include explicit cases for RenderShape.ROUND, RenderShape.CIRCLE,
RenderShape.HollowCircle, RenderShape.ARROW, and RenderShape.GRID, returning the
correct tailorable class strings that match the canvas rendering logic used
elsewhere (e.g., the hollow-circle and circle radii/rounding used by
litegraphService.ts and default ROUND behavior), so each shape has a
deterministic overlay class instead of falling back to the generic default.

---

Nitpick comments:
In `@browser_tests/fixtures/VueNodeHelpers.ts`:
- Line 175: The shared helper enterSubgraph currently forces clicks and can mask
visibility regressions; in the enterSubgraph helper remove the { force: true }
option from the await editButton.click(...) call so the click goes through
normal actionability/visibility checks, and if any specific test truly needs a
forced click, apply { force: true } at that test's enterSubgraph call site
instead; locate the editButton.click invocation inside the enterSubgraph
function and delete the force option to make the helper strict.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 00bc9f7e-3ec2-4773-b1b4-11ba0b54108d

📥 Commits

Reviewing files that changed from the base of the PR and between 7ab6182 and a6bd6a8.

📒 Files selected for processing (4)
  • browser_tests/fixtures/VueNodeHelpers.ts
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts
  • browser_tests/tests/vueNodes/nodeStates/error.spec.ts
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
🚧 Files skipped from review as they are similar to previous changes (2)
  • browser_tests/tests/vueNodes/nodeStates/bypass.spec.ts
  • browser_tests/tests/vueNodes/nodeStates/error.spec.ts

@jaeone94 jaeone94 added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 6, 2026
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 6, 2026
@jaeone94 jaeone94 added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 6, 2026
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 6, 2026
@dosubot dosubot bot added size:M This PR changes 30-99 lines, ignoring generated files. and removed size:XL This PR changes 500-999 lines, ignoring generated files. labels Mar 6, 2026
AustinMroz
AustinMroz previously approved these changes Mar 6, 2026
Copy link
Collaborator

@AustinMroz AustinMroz left a comment

Choose a reason for hiding this comment

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

Looks like test failures are flakes

viva-jinyi
viva-jinyi previously approved these changes Mar 6, 2026
@jaeone94 jaeone94 dismissed stale reviews from viva-jinyi and AustinMroz via b53158e March 6, 2026 23:44
@dosubot dosubot bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Mar 6, 2026
@jaeone94 jaeone94 added the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 7, 2026
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Mar 7, 2026
@christian-byrne christian-byrne merged commit 8bfd939 into main Mar 7, 2026
31 checks passed
@christian-byrne christian-byrne deleted the style/subgraph-error-node-design branch March 7, 2026 01:51
@jaeone94 jaeone94 restored the style/subgraph-error-node-design branch March 7, 2026 02:30
@jaeone94 jaeone94 deleted the style/subgraph-error-node-design branch March 9, 2026 12:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:nodes area:subgraph area:ui General user interface and experience improvements enhancement New feature or request size:XL This PR changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants