Skip to content

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Dec 8, 2025

Summary

See what it looks like. How it feels. What do you think?

  • Also was able to unify down to a single SearchBox component.

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 8, 2025

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (22)
  • browser_tests/tests/interaction.spec.ts-snapshots/prompt-dialog-closed-text-chromium-linux.png is excluded by !**/*.png
  • browser_tests/tests/nodeSearchBox.spec.ts-snapshots/link-release-context-menu-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/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
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-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.

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

📝 Walkthrough

Walkthrough

SearchBox was refactored and moved from src/components/inputsrc/components/common, switching to an internal v-model (defineModel) with watchDebounced and replacing update:modelValue emits with search. Imports across the repo were updated; several sidebar and node UI templates had class/padding tweaks. Design-system CSS theme tokens were adjusted.

Changes

Cohort / File(s) Change Summary
SearchBox refactor & relocation
src/components/common/SearchBox.vue, src/components/input/SearchBox.vue
Removed old input/SearchBox.vue; added/refactored common/SearchBox.vue using defineModel + watchDebounced, internal v-model, layout changes, removed update:modelValue emit, added showBorder & size props.
Tests & stories updated for SearchBox
src/components/common/SearchBox.test.ts, src/components/common/SearchBox.stories.ts, tests-ui/.../AssetBrowserModal.test.ts, src/components/widget/layout/BaseModalLayout.stories.ts
Updated imports to new path, tests now expect search emit and use async timer helpers, story typing/argTypes and default args adjusted.
SearchBox import usages updated
src/components/custom/widget/WorkflowTemplateSelectorDialog.vue, src/components/input/MultiSelect.vue, src/components/widget/SampleModelSelector.vue, src/platform/assets/components/AssetBrowserModal.vue, src/platform/assets/components/MediaAssetFilterBar.vue
Replaced imports from @/components/input/SearchBox.vue@/components/common/SearchBox.vue; removed one size="lg" prop and appended "..." to a placeholder binding.
Sidebar tab layout & padding changes
src/components/sidebar/tabs/AssetsSidebarTab.vue, src/components/sidebar/tabs/ModelLibrarySidebarTab.vue, src/components/sidebar/tabs/NodeLibrarySidebarTab.vue, src/components/sidebar/tabs/WorkflowsSidebarTab.vue, src/components/sidebar/tabs/SidebarTabTemplate.vue
Moved padding into wrapper divs, added/relocated TabList into a tool-buttons slot, inserted Divider in body, and increased toolbar min-height min-h-15.5min-h-16.
Node UI class and layout tweaks
src/renderer/.../InputSlot.vue, .../LGraphNode.vue, .../NodeHeader.vue, .../NodeWidgets.vue, .../OutputSlot.vue, .../widgets/components/layout/WidgetLayoutField.vue
Consolidated computed class logic into inline cn(...) bindings, adjusted Tailwind utilities (text size, alignment, flex/span), removed unused helpers, simplified template handlers.
Design system CSS theme updates
packages/design-system/src/css/style.css
Removed global root mapping for --color-comfy-menu-secondary; added --color-comfy-input and --color-comfy-input-foreground; reintroduced --color-comfy-menu-secondary inside the @theme inline block.
Localization tweak
src/locales/en/main.json
sideToolbar.searchAssets changed from "Search assets..." → "Search Assets".

Possibly related PRs

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch drjkl/reverse-shrink-ray

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

@github-actions
Copy link

github-actions bot commented Dec 8, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 12/11/2025, 08:11:50 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Dec 8, 2025

🎭 Playwright Test Results

Some tests failed

⏰ Completed at: 12/11/2025, 08:27:47 AM UTC

📈 Summary

  • Total Tests: 456
  • Passed: 403 ✅
  • Failed: 33 ❌
  • Flaky: 11 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 398 / ❌ 31 / ⚠️ 11 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 2 / ❌ 2 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 6479bac to 30f9668 Compare December 8, 2025 06:43
@DrJKL DrJKL force-pushed the drjkl/consistency-is-inter branch 2 times, most recently from d2ebe0f to b702361 Compare December 8, 2025 19:49
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 25bf976 to b0476bd Compare December 8, 2025 20:11
@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 8, 2025
@github-actions
Copy link

github-actions bot commented Dec 8, 2025

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 Dec 8, 2025
@DrJKL DrJKL force-pushed the drjkl/consistency-is-inter branch 3 times, most recently from b1f64a6 to b7d26e9 Compare December 9, 2025 01:28
Base automatically changed from drjkl/consistency-is-inter to main December 9, 2025 02:48
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 8197219 to bc7d097 Compare December 9, 2025 18:15
@github-actions
Copy link

github-actions bot commented Dec 9, 2025

Bundle Size Report

Summary

  • Raw size: 17.1 MB baseline 17.1 MB — 🟢 -1.5 kB
  • Gzip: 3.39 MB baseline 3.39 MB — 🟢 -1.39 kB
  • Brotli: 2.6 MB baseline 2.6 MB — 🔴 +121 B
  • Bundles: 97 current • 97 baseline • 52 added / 52 removed

Category Glance
App Entry Points 🟢 -1.58 kB (3.23 MB) · Vendor & Third-Party 🔴 +418 B (8.56 MB) · UI Components 🟢 -323 B (178 kB) · Graph Workspace 🟢 -7 B (991 kB) · Panels & Settings 🟢 -2 B (298 kB) · Other ⚪ 0 B (3.81 MB) · + 3 more

Per-category breakdown
App Entry Points — 3.23 MB (baseline 3.23 MB) • 🟢 -1.58 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-D4S6aCXE.js (removed) 3 MB 🟢 -3 MB 🟢 -625 kB 🟢 -475 kB
assets/index-C_B6q2S_.js (new) 3 MB 🔴 +3 MB 🔴 +625 kB 🔴 +475 kB
assets/index-BL0y8LEr.js (removed) 224 kB 🟢 -224 kB 🟢 -47.7 kB 🟢 -39.4 kB
assets/index-DaCQ0VnK.js (new) 224 kB 🔴 +224 kB 🔴 +47.7 kB 🔴 +39.4 kB
assets/index-BRgA2C4r.js (removed) 345 B 🟢 -345 B 🟢 -247 B 🟢 -203 B
assets/index-gXXXIg_S.js (new) 345 B 🔴 +345 B 🔴 +246 B 🔴 +203 B

Status: 3 added / 3 removed

Graph Workspace — 991 kB (baseline 991 kB) • 🟢 -7 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-BtZRj59p.js (removed) 991 kB 🟢 -991 kB 🟢 -192 kB 🟢 -146 kB
assets/GraphView-BZcjucQM.js (new) 991 kB 🔴 +991 kB 🔴 +192 kB 🔴 +146 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-CNRRwRha.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.14 kB 🔴 +1.89 kB
assets/UserSelectView-CtnhGqSQ.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.91 kB

Status: 1 added / 1 removed

Panels & Settings — 298 kB (baseline 298 kB) • 🟢 -2 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-BNP83LRh.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.16 kB 🔴 +4.5 kB
assets/LegacyCreditsPanel-BQHn5qFx.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.16 kB 🟢 -4.5 kB
assets/KeybindingPanel-D85kSoET.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/KeybindingPanel-ixl2gzcN.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3 kB
assets/ExtensionPanel-Dk8s6tW7.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.26 kB
assets/ExtensionPanel-D-Q0Cv59.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.58 kB 🔴 +2.26 kB
assets/AboutPanel-CjgJaNxo.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-I5zl5h9s.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-5WLNI-BH.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.84 kB 🔴 +1.63 kB
assets/ServerConfigPanel-7AYZ5xU5.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/UserPanel-D5GlGj9F.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/UserPanel-UT57QT-_.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.51 kB
assets/settings-BhbWhsRg.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 178 kB (baseline 178 kB) • 🟢 -323 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-BUvI_0_b.js (removed) 53.7 kB 🟢 -53.7 kB 🟢 -8.49 kB 🟢 -7.29 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-DZ5i7RsO.js (new) 53.7 kB 🔴 +53.7 kB 🔴 +8.49 kB 🔴 +7.29 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-B5wcZodC.js (removed) 48.1 kB 🟢 -48.1 kB 🟢 -10.4 kB 🟢 -8.98 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BADVpmOB.js (new) 48.1 kB 🔴 +48.1 kB 🔴 +10.4 kB 🔴 +8.99 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-B2l-ylPW.js (removed) 48 kB 🟢 -48 kB 🟢 -10.7 kB 🟢 -9.32 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-DilLagFP.js (new) 48 kB 🔴 +48 kB 🔴 +10.7 kB 🔴 +9.33 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-Di9CgFt4.js (removed) 12.9 kB 🟢 -12.9 kB 🟢 -3.37 kB 🟢 -2.97 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-LylYz7U2.js (new) 12.9 kB 🔴 +12.9 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/ComfyQueueButton-gSMMRnDl.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.48 kB 🔴 +2.21 kB
assets/ComfyQueueButton-qvUfP7oP.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.48 kB 🟢 -2.21 kB
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-i8Rp-pZT.js (removed) 2.47 kB 🟢 -2.47 kB 🟢 -936 B 🟢 -808 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-DLWQTElM.js (new) 2.15 kB 🔴 +2.15 kB 🔴 +896 B 🔴 +773 B
assets/WidgetButton-B5VIUbUe.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +930 B 🔴 +812 B
assets/WidgetButton-DF5qH0wo.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -931 B 🟢 -813 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-Cwpu8HZY.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -689 B 🟢 -596 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-vjZUFrl5.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +688 B 🔴 +595 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-D90zbgHl.js (new) 897 B 🔴 +897 B 🔴 +501 B 🔴 +438 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-DP5OgE7a.js (removed) 897 B 🟢 -897 B 🟢 -505 B 🟢 -441 B

Status: 9 added / 9 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-BZ1oKkeQ.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.84 kB 🔴 +1.58 kB
assets/keybindingService-DL-mBCoV.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/serverConfigStore-BHXc4r-I.js (removed) 2.83 kB 🟢 -2.83 kB 🟢 -911 B 🟢 -794 B
assets/serverConfigStore-lZUrJXbd.js (new) 2.83 kB 🔴 +2.83 kB 🔴 +907 B 🔴 +789 B
assets/audioService-BMG72-IF.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -964 B 🟢 -829 B
assets/audioService-BUFXUQjq.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +963 B 🔴 +823 B

Status: 3 added / 3 removed

Utilities & Hooks — 3.18 kB (baseline 3.18 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-1Ihz8zCu.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -652 B 🟢 -546 B
assets/audioUtils-CJryCBe3.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +651 B 🔴 +547 B
assets/mathUtil-CD4DsosH.js 1.32 kB 1.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Vendor & Third-Party — 8.56 MB (baseline 8.56 MB) • 🔴 +418 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-DTTVAq37.js (removed) 3.98 MB 🟢 -3.98 MB 🟢 -843 kB 🟢 -673 kB
assets/vendor-other-DJH2inmD.js (new) 3.98 MB 🔴 +3.98 MB 🔴 +843 kB 🔴 +673 kB
assets/vendor-primevue-DIZg6Vf-.js (new) 1.96 MB 🔴 +1.96 MB 🔴 +335 kB 🔴 +202 kB
assets/vendor-primevue-BOn_1tHb.js (removed) 1.96 MB 🟢 -1.96 MB 🟢 -336 kB 🟢 -202 kB
assets/vendor-chart-BVgd94ns.js (new) 452 kB 🔴 +452 kB 🔴 +99.1 kB 🔴 +81 kB
assets/vendor-chart-CLbS5yW5.js (removed) 452 kB 🟢 -452 kB 🟢 -99.1 kB 🟢 -81 kB
assets/vendor-tiptap-BZFjjO4N.js (new) 232 kB 🔴 +232 kB 🔴 +45.7 kB 🔴 +37.8 kB
assets/vendor-tiptap-CvMnMneH.js (removed) 232 kB 🟢 -232 kB 🟢 -45.7 kB 🟢 -37.7 kB
assets/vendor-vue-C5KrCLZ4.js (removed) 160 kB 🟢 -160 kB 🟢 -37.3 kB 🟢 -31.6 kB
assets/vendor-vue-DCmTGKGz.js (new) 160 kB 🔴 +160 kB 🔴 +37.3 kB 🔴 +31.6 kB
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Other — 3.81 MB (baseline 3.81 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-btF244La.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.62 kB
assets/WidgetRecordAudio-C5ir19Oc.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.23 kB 🟢 -4.63 kB
assets/AudioPreviewPlayer-CpUvKhU6.js (new) 13.4 kB 🔴 +13.4 kB 🔴 +3.37 kB 🔴 +3.01 kB
assets/AudioPreviewPlayer-ZXt0LhNM.js (removed) 13.4 kB 🟢 -13.4 kB 🟢 -3.37 kB 🟢 -3.01 kB
assets/WidgetGalleria-CQ4arCuk.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.45 kB 🔴 +1.31 kB
assets/WidgetGalleria-DhLEkupm.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.45 kB 🟢 -1.31 kB
assets/WidgetColorPicker-D7_S2xNa.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetColorPicker-ZBuHSjBA.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetTextarea-1FAP91Tt.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.21 kB 🔴 +1.07 kB
assets/WidgetTextarea-BHlo9KG7.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.22 kB 🟢 -1.1 kB
assets/WidgetMarkdown-CZNhdn4Z.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetMarkdown-D10Gpt9S.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/WidgetAudioUI-C27vTn92.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.16 kB 🟢 -1.06 kB
assets/WidgetAudioUI-CmCJ7ltF.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/MediaVideoTop-DPTn18Gu.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.02 kB 🟢 -872 B
assets/MediaVideoTop-pJ0J5HN0.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.02 kB 🔴 +875 B
assets/WidgetChart-BAE_xj62.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -932 B 🟢 -815 B
assets/WidgetChart-CM1aFmv_.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +932 B 🔴 +817 B
assets/WidgetImageCompare-Cgv109_J.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +748 B 🔴 +664 B
assets/WidgetImageCompare-CoEHTkmg.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -748 B 🟢 -661 B
assets/WidgetInputText-D4ieRpYq.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -917 B 🟢 -828 B
assets/WidgetInputText-Di3FBEvt.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +920 B 🔴 +848 B
assets/WidgetToggleSwitch-A5Y4W-8W.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -835 B 🟢 -728 B
assets/WidgetToggleSwitch-CvBm4oM5.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +837 B 🔴 +733 B
assets/MediaImageTop-Dv8etOwH.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -843 B 🟢 -718 B
assets/MediaImageTop-FsRL1Y-z.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +842 B 🔴 +720 B
assets/MediaImageBottom-BIVU6B5L.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -733 B 🟢 -644 B
assets/MediaImageBottom-Cr0WAXVF.js (new) 1.55 kB 🔴 +1.55 kB 🔴 +737 B 🔴 +639 B
assets/MediaAudioBottom-Bu0XzhNe.js (new) 1.51 kB 🔴 +1.51 kB 🔴 +734 B 🔴 +652 B
assets/MediaAudioBottom-CNtyf9K1.js (removed) 1.51 kB 🟢 -1.51 kB 🟢 -734 B 🟢 -652 B
assets/Media3DBottom-CrR71ivY.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -732 B 🟢 -651 B
assets/Media3DBottom-CVQShCjP.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +733 B 🔴 +649 B
assets/MediaVideoBottom-B2UDxl-5.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -731 B 🟢 -653 B
assets/MediaVideoBottom-DhDykU16.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +733 B 🔴 +648 B
assets/Media3DTop-DNImqdA3.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +765 B 🔴 +654 B
assets/Media3DTop-DnWwG6xu.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -766 B 🟢 -653 B
assets/MediaAudioTop-DBM2-uF8.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -739 B 🟢 -619 B
assets/MediaAudioTop-SwNWQno8.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +740 B 🔴 +619 B
assets/WidgetSelect-BsnNkCZw.js (new) 655 B 🔴 +655 B 🔴 +343 B 🔴 +286 B
assets/WidgetSelect-DohYaf-r.js (removed) 655 B 🟢 -655 B 🟢 -343 B 🟢 -286 B
assets/WidgetInputNumber-B4eWoDAU.js (new) 595 B 🔴 +595 B 🔴 +331 B 🔴 +272 B
assets/WidgetInputNumber-pRdKuhFS.js (removed) 595 B 🟢 -595 B 🟢 -330 B 🟢 -281 B
assets/Load3D-BFRUGqxz.js (removed) 424 B 🟢 -424 B 🟢 -268 B 🟢 -228 B
assets/Load3D-DWYsuuK2.js (new) 424 B 🔴 +424 B 🔴 +266 B 🔴 +225 B
assets/WidgetLegacy-C5QMlPZU.js (removed) 364 B 🟢 -364 B 🟢 -240 B 🟢 -194 B
assets/WidgetLegacy-Cp8NwRmi.js (new) 364 B 🔴 +364 B 🔴 +237 B 🔴 +195 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWp4HdfU.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BMi-Aksj.js 99 kB 99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CqR8skJT.js 73.1 kB 73.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DcRHAFEy.js 81.7 kB 81.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DdFdLxku.js 72.2 kB 72.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DJAtuVu5.js 84.3 kB 84.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DK8I9Rk3.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-gP_ssnMb.js 83.4 kB 83.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-nxXY9vGp.js 94 kB 94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ycd3gqkA.js 86.5 kB 86.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BC3OlaIn.js 342 kB 342 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BsqN8-W1.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bw_Jitw_.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK2saYDx.js 307 kB 307 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cm5kR4Hi.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CMrh-uxB.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DlUIOit1.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DNu_xoP2.js 282 kB 282 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DpcvlpZe.js 303 kB 303 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-IyjOYIl-.js 317 kB 317 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 23 added / 23 removed

@DrJKL DrJKL changed the title Style: prototype with larger node text Style: Larger Node Text, More Sidebar Alignment Dec 9, 2025
@DrJKL DrJKL added Design Used to request Product feedback on design decisions New Browser Test Expectations New browser test screenshot should be set by github action labels Dec 9, 2025
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from ae7fa98 to e258e03 Compare December 9, 2025 22:55
@DrJKL DrJKL added New Browser Test Expectations New browser test screenshot should be set by github action and removed New Browser Test Expectations New browser test screenshot should be set by github action labels Dec 9, 2025
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 9, 2025
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 6745b42 to 71a25cc Compare December 11, 2025 00:47
@DrJKL DrJKL marked this pull request as ready for review December 11, 2025 02:07
@DrJKL DrJKL requested a review from Yorha4D as a code owner December 11, 2025 02:07
@DrJKL DrJKL requested a review from viva-jinyi as a code owner December 11, 2025 02:07
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Dec 11, 2025
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 1cd5ed3 to 45ea979 Compare December 11, 2025 02:11
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: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/components/common/SearchBox.vue (1)

119-129: Style block should be removed when migrating away from PrimeVue.

Per guidelines, <style> blocks should be avoided in favor of Tailwind utility classes. The current style block exists primarily for PrimeVue component overrides (:deep(.p-inputtext)). When the PrimeVue components are migrated to shadcn/vue or Reka UI alternatives, this block should be eliminated in favor of utility classes or component props.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 62f9e91 and 1cd5ed3.

⛔ Files ignored due to path filters (20)
  • 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/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
  • browser_tests/tests/vueNodes/widgets/load/uploadWidgets.spec.ts-snapshots/vue-nodes-upload-widgets-chromium-linux.png is excluded by !**/*.png
📒 Files selected for processing (24)
  • packages/design-system/src/css/style.css (1 hunks)
  • src/components/common/SearchBox.stories.ts (2 hunks)
  • src/components/common/SearchBox.test.ts (4 hunks)
  • src/components/common/SearchBox.vue (2 hunks)
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue (1 hunks)
  • src/components/input/MultiSelect.vue (1 hunks)
  • src/components/input/SearchBox.vue (0 hunks)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue (4 hunks)
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue (2 hunks)
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue (1 hunks)
  • src/components/sidebar/tabs/SidebarTabTemplate.vue (1 hunks)
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue (1 hunks)
  • src/components/widget/SampleModelSelector.vue (1 hunks)
  • src/components/widget/layout/BaseModalLayout.stories.ts (1 hunks)
  • src/locales/en/main.json (1 hunks)
  • src/platform/assets/components/AssetBrowserModal.vue (1 hunks)
  • src/platform/assets/components/MediaAssetFilterBar.vue (2 hunks)
  • src/renderer/extensions/vueNodes/components/InputSlot.vue (2 hunks)
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue (1 hunks)
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue (4 hunks)
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue (2 hunks)
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue (1 hunks)
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue (1 hunks)
  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/input/SearchBox.vue
🧰 Additional context used
📓 Path-based instructions (15)
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
src/components/**/*.vue

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.vue: Use setup() function in Vue 3 Composition API
Destructure props using Vue 3.5 style in Vue components
Use ref/reactive for state management in Vue 3 Composition API
Implement computed() for derived state in Vue 3 Composition API
Use provide/inject for dependency injection in Vue components
Prefer emit/@event-name for state changes over other communication patterns
Use defineExpose only for imperative operations (such as form.validate(), modal.open())
Replace PrimeVue Dropdown component with Select
Replace PrimeVue OverlayPanel component with Popover
Replace PrimeVue Calendar component with DatePicker
Replace PrimeVue InputSwitch component with ToggleSwitch
Replace PrimeVue Sidebar component with Drawer
Replace PrimeVue Chips component with AutoComplete with multiple enabled
Replace PrimeVue TabMenu component with Tabs without panels
Replace PrimeVue Steps component with Stepper without panels
Replace PrimeVue InlineMessage component with Message
Extract complex conditionals to computed properties
Implement cleanup for async operations in Vue components
Use lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API
Use Teleport/Suspense when needed for component rendering
Define proper props and emits definitions in Vue components

Vue component file names must use PascalCase; for example, MenuHamburger.vue

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,css}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,css}: Use Tailwind CSS only for styling (no custom CSS)
Use the correct tokens from style.css in the design system package

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,ts,js}

📄 CodeRabbit inference engine (src/components/CLAUDE.md)

src/components/**/*.{vue,ts,js}: Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners
Use useIntersectionObserver for visibility detection instead of custom scroll handlers
Use vue-i18n for ALL UI strings

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/components/common/SearchBox.test.ts
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs (Single File Components) with Composition API only; do not use Options API
Vue components must use <script setup lang="ts"> for component logic
Use Vue 3.5 TypeScript style for default prop declaration with reactive props destructuring; do not use withDefaults or runtime props declaration
Prefer useModel to separately defining a prop and emit
Use Tailwind 4 utility classes for styling; avoid using <style> blocks in Vue components
Use semantic Tailwind values from style.css theme instead of the dark: variant; for example, use bg-node-component-surface instead of dark: prefixes
Always use cn() utility from @/utils/tailwindUtil to merge Tailwind class names; do not use :class="[]" syntax
Use ref for reactive state in Vue Composition API components
Implement computed properties with computed() from Vue; avoid using a ref with a watch if a computed would work instead
Use watch and watchEffect for side effects in Vue components
Implement lifecycle hooks using onMounted, onUpdated, and other Vue lifecycle functions
Use provide/inject for dependency injection; do not use dependency injection if a Store or shared composable would be simpler
Do not import Vue macros unnecessarily; only use when needed
Be judicious with addition of new refs or other state: prefer props, avoid redundant computed, and prefer computed over watch
Use VueUse functions for performance-enhancing styles
In Vue Components, implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Implement proper error handling in Vue components
Follow Vue 3 style guide and naming conventions
Use vue-i18n in composition API for any string literals; place new translation entries in src/locales/en/main.json
Avoid new usage of PrimeVue components; prefer shadcn/vue or Reka UI instead

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/*.{ts,tsx,js,jsx,vue,json}

📄 CodeRabbit inference engine (AGENTS.md)

Code style: Use 2-space indentation, single quotes, no trailing semicolons, and 80-character line width (see .prettierrc)

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Imports must be sorted and grouped by plugin; run pnpm format before committing
Use TypeScript for type safety; never use any type - use proper TypeScript types
Never use as any type assertions; fix the underlying type issue instead
Use es-toolkit for utility functions
Write code that is expressive and self-documenting; avoid comments unless absolutely necessary; do not add or retain redundant comments
Keep functions short and functional
Minimize nesting in code (e.g., deeply nested if or for statements); apply the Arrow Anti-Pattern principle
Avoid mutable state; prefer immutability and assignment at point of declaration
Favor pure functions, especially testable ones

Files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/common/SearchBox.stories.ts
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
tests-ui/**/*.test.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (tests-ui/CLAUDE.md)

tests-ui/**/*.test.{js,ts,jsx,tsx}: Write tests for new features
Follow existing test patterns in the codebase
Use existing test utilities rather than writing custom utilities
Mock external dependencies in tests
Always prefer vitest mock functions over writing verbose manual mocks

Files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
**/*.test.ts

📄 CodeRabbit inference engine (AGENTS.md)

**/*.test.ts: Write tests for all changes, especially bug fixes to catch future regressions
Unit/component test files must be named **/*.test.ts or in tests-ui/ directory
Do not write change detector tests that just assert default values
Do not write tests dependent on non-behavioral features like utility classes or styles
Be parsimonious in testing; do not write redundant tests; see composable tests approach
Follow 'Don't Mock What You Don't Own' principle - avoid mocking external dependencies
Do not write tests that just test the mocks; ensure tests fail when code behaves unexpectedly
Leverage Vitest's mocking utilities where possible for test mocking
Keep module mocks contained in test files; do not use global mutable state within test files; use vi.hoisted() if necessary
For Component testing, use Vue Test Utils and follow advice about making components easy to test
Aim for behavioral coverage of critical and new features in unit tests

Files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Minimize the surface area (exported values) of each module and composable

Files:

  • src/components/common/SearchBox.test.ts
  • src/components/common/SearchBox.stories.ts
  • src/components/widget/layout/BaseModalLayout.stories.ts
🧠 Learnings (68)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Dropdown component with Select

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Chips component with AutoComplete with multiple enabled

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/components/common/SearchBox.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/{components,composables}/**/*.{ts,tsx,vue} : Use vue-i18n for ALL user-facing strings by adding them to `src/locales/en/main.json`

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/locales/en/main.json
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InlineMessage component with Message

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use vue-i18n for ALL UI strings

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/common/SearchBox.test.ts
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Calendar component with DatePicker

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Implement computed() for derived state in Vue 3 Composition API

Applied to files:

  • src/components/input/MultiSelect.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Extract complex conditionals to computed properties

Applied to files:

  • src/components/input/MultiSelect.vue
📚 Learning: 2025-12-09T03:49:52.828Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/platform/updates/components/WhatsNewPopup.vue:5-13
Timestamp: 2025-12-09T03:49:52.828Z
Learning: In Vue files across the ComfyUI_frontend repo, when a button is needed, prefer the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) over plain HTML <button> elements. These components wrap PrimeVue with the project’s design system styling. Use only the common button components for consistency and theming, and import them from src/components/button/ as needed.

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Implement computed properties with computed()

Applied to files:

  • src/components/input/MultiSelect.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Leverage VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Implement computed properties with `computed()` from Vue; avoid using a `ref` with a `watch` if a `computed` would work instead

Applied to files:

  • src/components/input/MultiSelect.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.{vue,ts} : Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T21:40:12.361Z
Learnt from: benceruleanlu
Repo: Comfy-Org/ComfyUI_frontend PR: 7297
File: src/components/actionbar/ComfyActionbar.vue:33-43
Timestamp: 2025-12-09T21:40:12.361Z
Learning: In Vue single-file components, allow inline Tailwind CSS class strings for static classes and avoid extracting them into computed properties solely for readability. Prefer keeping static class names inline for simplicity and performance. For dynamic or conditional classes, use Vue bindings (e.g., :class) to compose classes.

Applies to all Vue files in the repository (e.g., src/**/*.vue) where Tailwind utilities are used for static styling.

Applied to files:

  • src/components/input/MultiSelect.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/components/NodeWidgets.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/renderer/extensions/vueNodes/components/NodeHeader.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/common/SearchBox.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use Tailwind 4 utility classes for styling; avoid using `<style>` blocks in Vue components

Applied to files:

  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use semantic Tailwind values from `style.css` theme instead of the `dark:` variant; for example, use `bg-node-component-surface` instead of `dark:` prefixes

Applied to files:

  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use Tailwind CSS for styling

Applied to files:

  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use Tailwind CSS only for styling (no custom CSS)

Applied to files:

  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Always use `cn()` utility from `@/utils/tailwindUtil` to merge Tailwind class names; do not use `:class="[]"` syntax

Applied to files:

  • src/renderer/extensions/vueNodes/components/LGraphNode.vue
  • src/renderer/extensions/vueNodes/components/InputSlot.vue
📚 Learning: 2025-12-09T04:35:43.971Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/locales/en/main.json:774-780
Timestamp: 2025-12-09T04:35:43.971Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, locale files other than `src/locales/en/main.json` are generated automatically on every release. Developers only need to add English (en) key/values in `src/locales/en/main.json` when making PRs; manual updates to other locale files (fr, ja, ko, ru, zh, zh-TW, es, ar, tr, etc.) are not required and should not be suggested in reviews.

Applied to files:

  • src/locales/en/main.json
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Vue components must use `<script setup lang="ts">` for component logic

Applied to files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue OverlayPanel component with Popover

Applied to files:

  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/widget/SampleModelSelector.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package

Applied to files:

  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
  • src/platform/assets/components/AssetBrowserModal.vue
  • packages/design-system/src/css/style.css
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/renderer/extensions/vueNodes/components/OutputSlot.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use provide/inject for dependency injection in Vue components

Applied to files:

  • src/components/custom/widget/WorkflowTemplateSelectorDialog.vue
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Prefer `useModel` to separately defining a prop and emit

Applied to files:

  • src/components/widget/SampleModelSelector.vue
  • src/components/common/SearchBox.vue
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Check assets/ directory for test data when writing tests

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Mock external dependencies in tests

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.test.ts : Keep module mocks contained in test files; do not use global mutable state within test files; use `vi.hoisted()` if necessary

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Always prefer vitest mock functions over writing verbose manual mocks

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Test user workflows in browser tests

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.test.ts : Leverage Vitest's mocking utilities where possible for test mocking

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.test.ts : For Component testing, use Vue Test Utils and follow advice about making components easy to test

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
  • src/components/common/SearchBox.stories.ts
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Mocks should be cleanly written and easy to understand, with reusable mocks where possible

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
📚 Learning: 2025-12-09T03:39:54.501Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7169
File: src/platform/remote/comfyui/jobs/jobTypes.ts:1-107
Timestamp: 2025-12-09T03:39:54.501Z
Learning: In the ComfyUI_frontend project, Zod is on v3.x. Do not suggest Zod v4 standalone validators (z.uuid, z.ulid, z.cuid2, z.nanoid) until an upgrade to Zod 4 is performed. When reviewing TypeScript files (e.g., src/platform/remote/comfyui/jobs/jobTypes.ts) validate against Zod 3 capabilities and avoid introducing v4-specific features; flag any proposal to upgrade or incorporate v4-only validators and propose staying with compatible 3.x patterns.

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
  • src/components/common/SearchBox.stories.ts
  • src/components/widget/layout/BaseModalLayout.stories.ts
📚 Learning: 2025-12-10T03:09:13.807Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7303
File: src/components/topbar/CurrentUserPopover.test.ts:199-205
Timestamp: 2025-12-10T03:09:13.807Z
Learning: In test files, prefer selecting or asserting on accessible properties (text content, aria-label, role, accessible name) over data-testid attributes. This ensures tests validate actual user-facing behavior and accessibility, reducing reliance on implementation details like test IDs.

Applied to files:

  • tests-ui/platform/assets/components/AssetBrowserModal.test.ts
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use vue-i18n in composition API for any string literals; place new translation entries in `src/locales/en/main.json`

Applied to files:

  • src/platform/assets/components/AssetBrowserModal.vue
  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:48:09.318Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .cursor/rules/unit-test.mdc:0-0
Timestamp: 2025-11-24T19:48:09.318Z
Learning: Applies to test/**/*.{test,spec}.{js,ts,jsx,tsx} : Prefer the use of `test.extend` over loose variables; import `test as baseTest` from `vitest`

Applied to files:

  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Follow naming conventions for browser tests

Applied to files:

  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.test.ts : Write tests for all changes, especially bug fixes to catch future regressions

Applied to files:

  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to browser_tests/**/*.spec.ts : Do not use `waitForTimeout` in Playwright tests; use Locator actions and retrying assertions instead

Applied to files:

  • src/components/common/SearchBox.test.ts
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Define proper props and emits definitions in Vue components

Applied to files:

  • src/components/common/SearchBox.stories.ts
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{vue,ts,tsx} : Follow Vue 3 composition API style guide

Applied to files:

  • src/components/common/SearchBox.stories.ts
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue components; prefer shadcn/vue or Reka UI instead

Applied to files:

  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use `ref` for reactive state in Vue Composition API components

Applied to files:

  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize ref and reactive for reactive state

Applied to files:

  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use ref/reactive for state management in Vue 3 Composition API

Applied to files:

  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.{ts,tsx,vue} : Use es-toolkit for utility functions

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use `provide`/`inject` for dependency injection; do not use dependency injection if a Store or shared composable would be simpler

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize provide/inject for dependency injection

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Use es-toolkit for utility functions instead of other utility libraries

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use useIntersectionObserver for visibility detection instead of custom scroll handlers

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use VueUse functions for performance-enhancing styles

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-09T03:50:03.127Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/platform/updates/components/WhatsNewPopup.vue:5-13
Timestamp: 2025-12-09T03:50:03.127Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, when avoiding PrimeVue components, prefer using the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) rather than plain HTML buttons. These components wrap PrimeVue with custom design system styling.

Applied to files:

  • src/components/widget/layout/BaseModalLayout.stories.ts

@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 11, 2025
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 11, 2025
@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from d6c36bc to 550bad6 Compare December 11, 2025 08:00
@DrJKL DrJKL added the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 11, 2025
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: 6

♻️ Duplicate comments (1)
src/components/common/SearchBox.vue (1)

104-116: Size prop is still ignored when showBorder is true.

The wrapperStyle computed returns early when showBorder is true, which means the size prop has no effect in that case. If both props should work independently, apply size classes regardless of border state.

 const wrapperStyle = computed(() => {
+  const sizeClasses = {
+    md: 'h-8 px-2 py-1.5',
+    lg: 'h-10 px-4 py-2'
+  }[size]
+
   if (showBorder) {
-    return cn('rounded p-2 border border-solid border-border-default')
+    return cn('rounded border border-solid border-border-default', sizeClasses)
   }
 
-  // Size-specific classes matching button sizes for consistency
-  const sizeClasses = {
-    md: 'h-8 px-2 py-1.5', // Matches button sm size
-    lg: 'h-10 px-4 py-2' // Matches button md size
-  }[size]
-
   return cn('rounded-lg', sizeClasses)
 })


<script setup lang="ts" generic="TFilter extends SearchFilter">
import { debounce } from 'es-toolkit/compat'
import { cn } from '@comfyorg/tailwind-utils'
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

# Check which cn import sources are used across the codebase
echo "=== cn imports from @comfyorg/tailwind-utils ==="
rg "from ['\"]@comfyorg/tailwind-utils['\"]" --type vue -c

echo ""
echo "=== cn imports from @/utils/tailwindUtil ==="
rg "from ['\"]@/utils/tailwindUtil['\"]" --type vue -c

echo ""
echo "=== Check if @/utils/tailwindUtil file exists ==="
find . -path "*@/utils/tailwindUtil*" -o -name "tailwindUtil*" | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 360


🏁 Script executed:

#!/bin/bash

# Verify the actual SearchBox.vue import on line 49
echo "=== SearchBox.vue line 49 ==="
sed -n '49p' src/components/common/SearchBox.vue

echo ""
echo "=== Verify InputSlot.vue import of cn ==="
rg "import.*cn.*from" src/components/node/InputSlot.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 279


🏁 Script executed:

#!/bin/bash

# Check if @comfyorg/tailwind-utils is a legitimate package
echo "=== Check for @comfyorg packages in the codebase ==="
rg "@comfyorg" --type vue --type ts --type json | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 167


🏁 Script executed:

#!/bin/bash

# Search for cn imports without file type restrictions
echo "=== All cn imports from @comfyorg/tailwind-utils ==="
rg "from ['\"]@comfyorg/tailwind-utils['\"]" -c

echo ""
echo "=== All cn imports from @/utils/tailwindUtil ==="
rg "from ['\"]@/utils/tailwindUtil['\"]" -c

echo ""
echo "=== Check @/utils/tailwindUtil.ts contents ==="
cat -n src/utils/tailwindUtil.ts | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4438


🏁 Script executed:

#!/bin/bash

# Check all imports in SearchBox.vue
echo "=== SearchBox.vue imports (first 20 lines) ==="
head -60 src/components/common/SearchBox.vue | cat -n

echo ""
echo "=== Search for all @comfyorg usage in entire codebase ==="
rg "@comfyorg" | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4596


Use the local cn import from @/utils/tailwindUtil instead of directly importing from @comfyorg/tailwind-utils.

The cn utility should be imported from @/utils/tailwindUtil, which re-exports it from the package. This follows the project's coding guidelines and matches the pattern used throughout the codebase.

-import { cn } from '@comfyorg/tailwind-utils'
+import { cn } from '@/utils/tailwindUtil'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { cn } from '@comfyorg/tailwind-utils'
import { cn } from '@/utils/tailwindUtil'
🤖 Prompt for AI Agents
In src/components/common/SearchBox.vue around line 49, the file imports cn
directly from '@comfyorg/tailwind-utils' instead of using the project's local
re-export; change the import to use '@/utils/tailwindUtil' so the component
imports cn from the local utility module (replace the existing import statement
with one that imports cn from '@/utils/tailwindUtil').

cn(
'bg-component-node-background lg-node absolute pb-1',
'bg-component-node-background lg-node absolute pb-1 text-sm',
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Verify text-sm aligns with "Larger Node Text" PR objective.

The PR title indicates "Larger Node Text," but adding the text-sm class typically sets a smaller text size (0.875rem in standard Tailwind). Confirm that:

  1. This establishes a baseline where previously there was no explicit text size
  2. The text-sm value is larger than the previous implicit browser default
  3. Or this change is intentional and the "larger text" refers to other components

If the goal is truly larger text, consider whether text-base or no explicit size class would be more appropriate for node content.

🤖 Prompt for AI Agents
In src/renderer/extensions/vueNodes/components/LGraphNode.vue around line 11,
the class list adds text-sm which actually reduces text size relative to
Tailwind's base; verify whether the PR's "Larger Node Text" objective intended a
larger font — if so remove text-sm or replace it with text-base (or the
appropriate larger class) to restore/increase size, and confirm by checking the
previous CSS/no-explicit-size baseline and running the component to ensure node
labels match the intended larger typography.

:node-id="nodeData?.id != null ? String(nodeData.id) : ''"
:node-type="nodeType"
class="flex-1 col-span-2"
class="col-span-2"
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Verify widget sizing after removing flex-1.

Removing the flex-1 class changes the widget from flexible growth (filling available space) to fixed width based on the grid column. This could affect the appearance of widgets that previously relied on flexible sizing. Verify that all widget types render correctly with this fixed-width behavior, especially longer widgets like text inputs or sliders.

🤖 Prompt for AI Agents
In src/renderer/extensions/vueNodes/components/NodeWidgets.vue around line 60,
removing the flex-1 class and replacing it with class="col-span-2" changes
widgets from flexible growth to fixed grid width; verify and restore correct
sizing by: check all widget variants (text inputs, sliders, toggles, long
labels) in different container widths and states, if any overflow or truncation
occurs either reintroduce flex-1 alongside col-span-2 for those specific widget
wrappers or adjust grid column spans / add responsive utility classes (e.g.,
sm:col-span-? or min-w-?) to allow flexible growth where necessary, and update
snapshots/styles accordingly.

v-if="!dotOnly"
class="text-xs font-normal truncate text-node-component-slot-text"
>
<span v-if="!dotOnly" class="truncate text-node-component-slot-text">
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Find style.css files in the repository
fd "style\.css" -t f

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 176


🏁 Script executed:

# Search for the design token in all style.css files
rg "text-node-component-slot-text" apps/desktop-ui/src/assets/css/style.css packages/design-system/src/css/style.css src/assets/css/style.css

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Check the design system style.css file content
cat packages/design-system/src/css/style.css | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2394


🏁 Script executed:

# Search full design-system style.css for the token
rg "text-node-component-slot-text" packages/design-system/src/css/style.css

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Read OutputSlot.vue to verify the actual code at line 6
sed -n '1,15p' src/renderer/extensions/vueNodes/components/OutputSlot.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 668


🏁 Script executed:

# Search for any text-node-* tokens in style.css to see naming pattern
rg "text-node" packages/design-system/src/css/style.css

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Search for typography/text tokens in design-system style.css
rg "^  --text" packages/design-system/src/css/style.css | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 378


Remove undefined design token text-node-component-slot-text and use valid typography tokens.

The class text-node-component-slot-text does not exist in the design system's style.css. The design system defines tokens like --text-xxs, --text-primary, and --text-secondary, but no text-node-component-slot-text token. This results in no typography styling being applied to the slot name. Replace with an appropriate existing design token or restore the working classes (text-xs font-normal).

🤖 Prompt for AI Agents
In src/renderer/extensions/vueNodes/components/OutputSlot.vue around line 6, the
span uses a nonexistent design token class "text-node-component-slot-text", so
no typography is applied; replace that class with a valid design-system token or
restore working utility classes. Update the span to use an existing token such
as a typography variable (e.g. --text-primary/--text-secondary) or standard
classes like "text-xs font-normal" so the slot name receives proper styling;
ensure the chosen class/token exists in style.css and remove the invalid class.

<div
v-if="!hideLayoutField"
class="relative flex h-full min-w-0 items-center"
class="relative flow-root min-w-0 truncate content-center-safe w-full"
Copy link
Contributor

@coderabbitai coderabbitai bot Dec 11, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

# Search for content-center-safe definition in the codebase
rg -n "content-center-safe" -g "*.css" -g "*.scss" -g "*.ts" -g "*.tsx" -g "*.vue" -g "*.json"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 230


🏁 Script executed:

# Check style.css and theme configuration
fd -e css -e scss | head -20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 415


🏁 Script executed:

# Read the specific file to understand context
cat -n "src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1572


🏁 Script executed:

# Check src/assets/css/style.css for content-center-safe or similar
cat "src/assets/css/style.css" | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 118


🏁 Script executed:

# Search for any content-center pattern in CSS files
rg -n "content-center" -g "*.css"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Search for similar utility definitions in style.css
rg -n "\.content-" -g "*.css"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

# Check if packages/design-system exists and search there
fd -e css "packages/design-system" | xargs cat 2>/dev/null | rg -n "content-center"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 463


🏁 Script executed:

# Search for any recent changes or git history of this file
git log --oneline -20 "src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue" 2>/dev/null || echo "Git history not available"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 94


🏁 Script executed:

# Check if content-center-safe might be a typo - search for similar classes
rg -n "content-" src/assets/css/ packages/design-system/src/css/ 2>/dev/null || rg -n "safe" -g "*.css"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 729


🏁 Script executed:

cat "packages/design-system/src/css/style.css" | grep -A 5 -B 5 "content-center" || echo "No content-center found"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 93


🏁 Script executed:

# Check for any utility class definitions that might include content-center-safe
rg -n "@apply|content-center-safe" packages/design-system/src/css/style.css

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


Remove or replace the undefined content-center-safe class

The class content-center-safe used on line 23 does not exist in the codebase—it is neither a standard Tailwind v4 utility nor a custom class defined in src/assets/css/style.css or the design system. This will result in no styling being applied.

The layout also changed from flex h-full items-center to flow-root, which fundamentally alters how child elements are positioned and sized. Verify that:

  • The content-center-safe class is either defined in your design system or replaced with a valid utility (e.g., flex items-center if vertical centering is still needed)
  • The flow-root layout change is intentional and preserves the required vertical alignment behavior
  • Removing h-full does not break the component's height constraints
🤖 Prompt for AI Agents
In
src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
around line 23, the class "content-center-safe" is undefined and "flow-root"
plus removal of "flex h-full items-center" changed layout behavior; replace
"content-center-safe" with a valid utility (e.g., use "flex items-center" if you
need vertical centering), or define the class in the design system if it was
intentional, and restore "h-full" if the component relied on full-height
constraints (ensure switching from "flow-root" back to a flex-based layout if
child alignment is required); verify the change preserves previous
sizing/alignment and update snapshot/style tests accordingly.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Copy link
Contributor

Choose a reason for hiding this comment

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

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Fetch the content from the Tailwind CSS source to verify content-center-safe
curl -s "https://raw.githubusercontent.com/tailwindlabs/tailwindcss/5065de4f9e0012bd99756a5317623885d2ae6cd6/packages/tailwindcss/src/utilities.ts" | sed -n '1970,1985p'

Length of output: 957


@DrJKL, you're absolutely right! I apologize for the incorrect review comment.

The source code confirms that content-center-safe is indeed a valid Tailwind CSS v4 utility that maps to align-content: safe center. The "safe" keyword is a CSS alignment feature that prevents overflow when the aligned content is larger than its container, which is exactly what you need here for proper widget label alignment.

Thank you for providing the reference—I've noted this for future reviews.

🐰✨


🧠 Learnings used
Learnt from: benceruleanlu
Repo: Comfy-Org/ComfyUI_frontend PR: 7297
File: src/components/actionbar/ComfyActionbar.vue:33-43
Timestamp: 2025-12-09T21:40:19.792Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, inline Tailwind CSS class strings, even when long, are acceptable and preferred over extracting them to computed properties when the classes are static. This is a common Tailwind pattern and doesn't need to be flagged as a readability issue.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:42:30.894Z
Learning: In the ComfyUI frontend codebase, Tailwind CSS is configured with Preflight enabled (default), which automatically provides `content: ''` for pseudo-elements when using `after:` or `before:` variants - no need to explicitly add `after:content-['']`.

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use Tailwind 4 utility classes for styling; avoid using `<style>` blocks in Vue components

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Always use `cn()` utility from `@/utils/tailwindUtil` to merge Tailwind class names; do not use `:class="[]"` syntax

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:45:28.610Z
Learning: Tailwind CSS supports arbitrary fractional width utilities beyond the common predefined ones. For example, `w-5/2` is valid syntax that represents 250% width (5÷2 = 2.5 = 250%). This applies to all utility variants including pseudo-elements like `after:w-5/2`.

Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:2-4
Timestamp: 2025-12-04T22:01:48.135Z
Learning: In Tailwind CSS v4, z-index utilities support direct numeric values without brackets. For example, `z-999` generates `z-index: 999;` automatically. This is different from v3 which required bracket syntax `z-[999]` for arbitrary values.

Comment on lines +38 to +37
@pointerdown.stop
@pointermove.stop
@pointerup.stop
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

LGTM – Cleaner event handler syntax

Removing the noop function and using just the .stop modifier is more idiomatic Vue and eliminates the unnecessary import. The .stop modifier alone prevents event propagation without needing a no-op handler function.

🤖 Prompt for AI Agents
In
src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
around lines 38-40, the template currently attaches event handlers that call a
no-op function; remove the noop usage and rely solely on the Vue .stop modifier
(as shown: @pointerdown.stop, @pointermove.stop, @pointerup.stop), then delete
any corresponding noop method definition and its import/reference so there are
no unused functions or imports left in the component.

@DrJKL DrJKL force-pushed the drjkl/reverse-shrink-ray branch from 550bad6 to 5d570fb Compare December 11, 2025 08:10
@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Dec 11, 2025
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

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 550bad6 and 5d570fb.

📒 Files selected for processing (1)
  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue (2 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
src/**/*.vue

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.vue: Use the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)
Use setup() function for component logic
Utilize ref and reactive for reactive state
Implement computed properties with computed()
Use watch and watchEffect for side effects
Implement lifecycle hooks with onMounted, onUpdated, etc.
Utilize provide/inject for dependency injection
Use vue 3.5 style of default prop declaration
Use Tailwind CSS for styling
Implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
src/**/{composables,components}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Clean up subscriptions in state management to prevent memory leaks

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
src/**/{components,composables}/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Use vue-i18n for ALL user-facing strings by adding them to src/locales/en/main.json

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs (Single File Components) with Composition API only; do not use Options API
Vue components must use <script setup lang="ts"> for component logic
Use Vue 3.5 TypeScript style for default prop declaration with reactive props destructuring; do not use withDefaults or runtime props declaration
Prefer useModel to separately defining a prop and emit
Use Tailwind 4 utility classes for styling; avoid using <style> blocks in Vue components
Use semantic Tailwind values from style.css theme instead of the dark: variant; for example, use bg-node-component-surface instead of dark: prefixes
Always use cn() utility from @/utils/tailwindUtil to merge Tailwind class names; do not use :class="[]" syntax
Use ref for reactive state in Vue Composition API components
Implement computed properties with computed() from Vue; avoid using a ref with a watch if a computed would work instead
Use watch and watchEffect for side effects in Vue components
Implement lifecycle hooks using onMounted, onUpdated, and other Vue lifecycle functions
Use provide/inject for dependency injection; do not use dependency injection if a Store or shared composable would be simpler
Do not import Vue macros unnecessarily; only use when needed
Be judicious with addition of new refs or other state: prefer props, avoid redundant computed, and prefer computed over watch
Use VueUse functions for performance-enhancing styles
In Vue Components, implement proper props and emits definitions
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Implement proper error handling in Vue components
Follow Vue 3 style guide and naming conventions
Use vue-i18n in composition API for any string literals; place new translation entries in src/locales/en/main.json
Avoid new usage of PrimeVue components; prefer shadcn/vue or Reka UI instead

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
**/*.{ts,tsx,js,jsx,vue,json}

📄 CodeRabbit inference engine (AGENTS.md)

Code style: Use 2-space indentation, single quotes, no trailing semicolons, and 80-character line width (see .prettierrc)

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Imports must be sorted and grouped by plugin; run pnpm format before committing
Use TypeScript for type safety; never use any type - use proper TypeScript types
Never use as any type assertions; fix the underlying type issue instead
Use es-toolkit for utility functions
Write code that is expressive and self-documenting; avoid comments unless absolutely necessary; do not add or retain redundant comments
Keep functions short and functional
Minimize nesting in code (e.g., deeply nested if or for statements); apply the Arrow Anti-Pattern principle
Avoid mutable state; prefer immutability and assignment at point of declaration
Favor pure functions, especially testable ones

Files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
🧠 Learnings (18)
📓 Common learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Dropdown component with Select
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Chips component with AutoComplete with multiple enabled
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/{components,composables}/**/*.{ts,tsx,vue} : Use vue-i18n for ALL user-facing strings by adding them to `src/locales/en/main.json`
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/platform/updates/components/WhatsNewPopup.vue:5-13
Timestamp: 2025-12-09T03:50:03.127Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, when avoiding PrimeVue components, prefer using the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) rather than plain HTML buttons. These components wrap PrimeVue with custom design system styling.
📚 Learning: 2025-12-09T21:40:12.361Z
Learnt from: benceruleanlu
Repo: Comfy-Org/ComfyUI_frontend PR: 7297
File: src/components/actionbar/ComfyActionbar.vue:33-43
Timestamp: 2025-12-09T21:40:12.361Z
Learning: In Vue single-file components, allow inline Tailwind CSS class strings for static classes and avoid extracting them into computed properties solely for readability. Prefer keeping static class names inline for simplicity and performance. For dynamic or conditional classes, use Vue bindings (e.g., :class) to compose classes.

Applies to all Vue files in the repository (e.g., src/**/*.vue) where Tailwind utilities are used for static styling.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-01T23:42:30.894Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:42:30.894Z
Learning: In the ComfyUI frontend codebase, Tailwind CSS is configured with Preflight enabled (default), which automatically provides `content: ''` for pseudo-elements when using `after:` or `before:` variants - no need to explicitly add `after:content-['']`.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use Tailwind 4 utility classes for styling; avoid using `<style>` blocks in Vue components

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,ts,js} : Use existing VueUse composables (such as useElementHover) instead of manually managing event listeners

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-01T23:45:28.610Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:45:28.610Z
Learning: Tailwind CSS supports arbitrary fractional width utilities beyond the common predefined ones. For example, `w-5/2` is valid syntax that represents 250% width (5÷2 = 2.5 = 250%). This applies to all utility variants including pseudo-elements like `after:w-5/2`.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-04T22:01:48.135Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:2-4
Timestamp: 2025-12-04T22:01:48.135Z
Learning: In Tailwind CSS v4, z-index utilities support direct numeric values without brackets. For example, `z-999` generates `z-index: 999;` automatically. This is different from v3 which required bracket syntax `z-[999]` for arbitrary values.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Always use `cn()` utility from `@/utils/tailwindUtil` to merge Tailwind class names; do not use `:class="[]"` syntax

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Vue components must use `<script setup lang="ts">` for component logic

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.{ts,tsx,vue} : Use es-toolkit for utility functions

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use setup() function in Vue 3 Composition API

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use `provide`/`inject` for dependency injection; do not use dependency injection if a Store or shared composable would be simpler

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize provide/inject for dependency injection

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T20:22:23.620Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.test.ts : For Component testing, use Vue Test Utils and follow advice about making components easy to test

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Use setup() function for component logic

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-11-24T19:47:34.324Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:34.324Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Use es-toolkit for utility functions instead of other utility libraries

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-09T03:49:52.828Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 6300
File: src/platform/updates/components/WhatsNewPopup.vue:5-13
Timestamp: 2025-12-09T03:49:52.828Z
Learning: In Vue files across the ComfyUI_frontend repo, when a button is needed, prefer the repo's common button components from src/components/button/ (IconButton.vue, TextButton.vue, IconTextButton.vue) over plain HTML <button> elements. These components wrap PrimeVue with the project’s design system styling. Use only the common button components for consistency and theming, and import them from src/components/button/ as needed.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
📚 Learning: 2025-12-11T03:55:51.755Z
Learnt from: simula-r
Repo: Comfy-Org/ComfyUI_frontend PR: 7252
File: src/renderer/extensions/vueNodes/components/ImagePreview.vue:151-158
Timestamp: 2025-12-11T03:55:51.755Z
Learning: In Vue components under src/renderer/extensions/vueNodes (e.g., ImagePreview.vue and LGraphNode.vue), implement image gallery keyboard navigation so that it responds to the node's focus state rather than requiring focus inside the image preview wrapper. Achieve this by wiring keyEvent handling at the node focus level and injecting or propagating key events (arrow keys) to the gallery when the node is focused/selected. This improves accessibility and aligns navigation with node-level focus behavior.

Applied to files:

  • src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: test
  • GitHub Check: collect
🔇 Additional comments (1)
src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue (1)

19-19: The text-node-component-slot-text Tailwind utility class does not exist in the design system and will not apply any styling.

The CSS custom property --node-component-slot-text exists in the design system, but Tailwind requires a corresponding --text-node-component-slot-text in the @theme block to generate the text-node-component-slot-text utility class. Currently, only --text-xxs and --text-xxxs are defined in the @theme block for text utilities. Use text-[color:var(--node-component-slot-text)] as an arbitrary value, or add --text-node-component-slot-text to the design system @theme block in packages/design-system/src/css/style.css.

⛔ Skipped due to learnings
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use Tailwind 4 utility classes for styling; avoid using `<style>` blocks in Vue components
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package
Learnt from: benceruleanlu
Repo: Comfy-Org/ComfyUI_frontend PR: 7297
File: src/components/actionbar/ComfyActionbar.vue:33-43
Timestamp: 2025-12-09T21:40:19.792Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, inline Tailwind CSS class strings, even when long, are acceptable and preferred over extracting them to computed properties when the classes are static. This is a common Tailwind pattern and doesn't need to be flagged as a readability issue.
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T20:22:23.620Z
Learning: Applies to **/*.vue : Use semantic Tailwind values from `style.css` theme instead of the `dark:` variant; for example, use `bg-node-component-surface` instead of `dark:` prefixes
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:42:30.894Z
Learning: In the ComfyUI frontend codebase, Tailwind CSS is configured with Preflight enabled (default), which automatically provides `content: ''` for pseudo-elements when using `after:` or `before:` variants - no need to explicitly add `after:content-['']`.

Comment on lines +21 to +24
<div v-if="!hideLayoutField" class="truncate content-center-safe">
<template v-if="widget.name">
{{ widget.label || widget.name }}
</p>
</template>
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Verify the conditional rendering logic for widget label.

The v-if="widget.name" condition means the label won't render when widget.name is falsy, even if widget.label exists. This changes the previous behavior where the element would always render.

Consider whether the condition should check for either field:

-    <div v-if="!hideLayoutField" class="truncate content-center-safe">
-      <template v-if="widget.name">
+    <div v-if="!hideLayoutField" class="truncate content-center-safe">
+      <template v-if="widget.name || widget.label">
        {{ widget.label || widget.name }}
      </template>
    </div>

Alternatively, if widgets always have a name property (even if empty string should be treated as "no label to show"), the current logic may be intentional.

🤖 Prompt for AI Agents
In
src/renderer/extensions/vueNodes/widgets/components/layout/WidgetLayoutField.vue
around lines 21-24, the current v-if="widget.name" prevents rendering when
widget.name is falsy even if widget.label exists; update the conditional to
check either field (e.g., v-if="widget.label || widget.name") so the label shows
when either label or name is present, or remove the v-if entirely if the element
should always render.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Design Used to request Product feedback on design decisions size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants