Skip to content

Conversation

@christian-byrne
Copy link
Contributor

@christian-byrne christian-byrne commented Oct 26, 2025

Summary

Migrated help center and release notification components from hardcoded colors to semantic design tokens for automatic light/dark theme support.

Selection_2298 Selection_2265 Screenshot from 2025-10-25 21-46-11 Screenshot from 2025-10-25 21-46-25

Changes

  • What: Replaced hardcoded hex/rgb colors with semantic tokens in HelpCenterMenuContent, WhatsNewPopup, and ReleaseNotificationToast components
  • Design System: Added --interface-menu-surface and --interface-menu-stroke tokens to style.css for consistent menu theming
  • UX: Updated help center menu structure - added "Give Feedback" button, renamed "Help & Feedback" to "Help & Support", switched to Lucide icons (except Discord brand logo), added external-link icons

┆Issue is synchronized with this Notion page by Unito

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Oct 26, 2025
@github-actions
Copy link

github-actions bot commented Oct 26, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 12/09/2025, 05:08:51 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Oct 26, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 12/09/2025, 05:18:11 AM UTC

📈 Summary

  • Total Tests: 490
  • Passed: 471 ✅
  • Failed: 0
  • Flaky: 9 ⚠️
  • Skipped: 10 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 462 / ❌ 0 / ⚠️ 9 / ⏭️ 10
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

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

@github-actions
Copy link

github-actions bot commented Oct 26, 2025

Bundle Size Report

Summary

  • Raw size: 17.1 MB baseline 17.1 MB — 🔴 +4.44 kB
  • Gzip: 3.38 MB baseline 3.38 MB — 🔴 +974 B
  • Brotli: 2.59 MB baseline 2.59 MB — 🔴 +761 B
  • Bundles: 97 current • 97 baseline • 37 added / 37 removed

Category Glance
Graph Workspace 🔴 +3.94 kB (982 kB) · App Entry Points 🔴 +502 B (3.21 MB) · Vendor & Third-Party ⚪ 0 B (8.56 MB) · Other ⚪ 0 B (3.81 MB) · Panels & Settings ⚪ 0 B (298 kB) · UI Components ⚪ 0 B (177 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.21 MB (baseline 3.21 MB) • 🔴 +502 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Cgaz0JN6.js (new) 2.98 MB 🔴 +2.98 MB 🔴 +621 kB 🔴 +472 kB
assets/index-BehRm1uc.js (removed) 2.98 MB 🟢 -2.98 MB 🟢 -621 kB 🟢 -472 kB
assets/index-CqMe4Zqv.js (removed) 223 kB 🟢 -223 kB 🟢 -47.6 kB 🟢 -39.2 kB
assets/index-kNJ-0Z1L.js (new) 223 kB 🔴 +223 kB 🔴 +47.6 kB 🔴 +39.2 kB
assets/index-Bdnwea1_.js (new) 345 B 🔴 +345 B 🔴 +245 B 🔴 +210 B
assets/index-BziHRe4-.js (removed) 345 B 🟢 -345 B 🟢 -243 B 🟢 -238 B

Status: 3 added / 3 removed

Graph Workspace — 982 kB (baseline 978 kB) • 🔴 +3.94 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-De2XMBH2.js (new) 982 kB 🔴 +982 kB 🔴 +190 kB 🔴 +145 kB
assets/GraphView-CokVAKAC.js (removed) 978 kB 🟢 -978 kB 🟢 -189 kB 🟢 -144 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-CBJbWo6c.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/UserSelectView-CqsCqVDv.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.14 kB 🔴 +1.9 kB

Status: 1 added / 1 removed

Panels & Settings — 298 kB (baseline 298 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-BsNTCHub.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.15 kB 🔴 +4.5 kB
assets/CreditsPanel-C7NRYNY2.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.5 kB
assets/KeybindingPanel--zrkhL2Z.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.01 kB
assets/KeybindingPanel-BkM5lgAC.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/ExtensionPanel-BtnmLlMg.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.58 kB 🔴 +2.26 kB
assets/ExtensionPanel-Iw_9PYgh.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.26 kB
assets/AboutPanel-Bvj1ZgmK.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-C7mXc4pu.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.2 kB
assets/ServerConfigPanel-BkGR7LY_.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.63 kB
assets/ServerConfigPanel-DNLddLmW.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/UserPanel-CeeaX21P.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.5 kB
assets/UserPanel-Ck8YM22U.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.5 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 — 177 kB (baseline 177 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-Cy9fcdgJ.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.32 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-I2cl3rCB.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.32 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-Cg9wCDkG.js (new) 48.1 kB 🔴 +48.1 kB 🔴 +10.4 kB 🔴 +9.02 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-CRryxtKg.js (removed) 48.1 kB 🟢 -48.1 kB 🟢 -10.4 kB 🟢 -8.99 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-BDGLHkbr.js (new) 47.3 kB 🔴 +47.3 kB 🔴 +10.6 kB 🔴 +9.29 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-CB0-lwnf.js (removed) 47.3 kB 🟢 -47.3 kB 🟢 -10.6 kB 🟢 -9.29 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-C9IrrJtj.js (new) 12.9 kB 🔴 +12.9 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-CbtFdlLF.js (removed) 12.9 kB 🟢 -12.9 kB 🟢 -3.37 kB 🟢 -2.96 kB
assets/ComfyQueueButton-Bq8wBXEt.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.48 kB 🔴 +2.2 kB
assets/ComfyQueueButton-f-lTKnin.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.47 kB 🟢 -2.2 kB
assets/MediaTitle.vue_vue_type_script_setup_true_lang-0VFcqZVB.js (new) 897 B 🔴 +897 B 🔴 +503 B 🔴 +430 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-BU7MjmYc.js (removed) 897 B 🟢 -897 B 🟢 -500 B 🟢 -430 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-BPGmgVoN.js 1.34 kB 1.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-CFWrwaAG.js 2.04 kB 2.04 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-6ZIklFyS.js 2.26 kB 2.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 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-BlPl7Dop.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/keybindingService-DNNkoKm1.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/audioService--9LZXobD.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +964 B 🔴 +826 B
assets/audioService-BdzExx0l.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -960 B 🟢 -821 B
assets/serverConfigStore-L3qzi_1Z.js 2.83 kB 2.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 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-DFjBh3u9.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -650 B 🟢 -543 B
assets/audioUtils-itUS5DLc.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +650 B 🔴 +540 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) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-DJFoH6N_.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-BZV8aGUB.js 3.98 MB 3.98 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DUTcKlCc.js 1.96 MB 1.96 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Cmu0_BY4.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Bz22sFex.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
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-Q_35zIvk.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.23 kB 🟢 -4.63 kB
assets/WidgetRecordAudio-tRwA-naE.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.24 kB 🔴 +4.63 kB
assets/AudioPreviewPlayer-CVAzmVn-.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.04 kB
assets/AudioPreviewPlayer-DDs-pkFA.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.04 kB
assets/WidgetGalleria-CTtR9CqN.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.44 kB 🟢 -1.31 kB
assets/WidgetGalleria-U0aN0K8C.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.45 kB 🔴 +1.3 kB
assets/WidgetColorPicker-B8YYSjTH.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetColorPicker-DfH3vXmL.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.37 kB 🟢 -1.23 kB
assets/WidgetMarkdown-BPJVh0cv.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetMarkdown-Cb7gCe-_.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetTextarea-De1cyu5s.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.16 kB 🟢 -1.03 kB
assets/WidgetTextarea-Dxu5FFkx.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.17 kB 🔴 +1.03 kB
assets/WidgetAudioUI-4UM3GqLZ.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.16 kB 🔴 +1.06 kB
assets/WidgetAudioUI-Td9Olu4c.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.16 kB 🟢 -1.05 kB
assets/WidgetInputText-Bihj7AOf.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +916 B 🔴 +851 B
assets/WidgetInputText-DWx0Tb-j.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -914 B 🟢 -825 B
assets/MediaImageBottom-O6nUpEkw.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +742 B 🔴 +647 B
assets/MediaImageBottom-oO7Lrgyr.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -739 B 🟢 -648 B
assets/MediaAudioBottom-B4rmumBB.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -736 B 🟢 -655 B
assets/MediaAudioBottom-mNQ6bmK2.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +741 B 🔴 +657 B
assets/MediaVideoBottom-BSzvAT-T.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -740 B 🟢 -654 B
assets/MediaVideoBottom-BZKBmSSK.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +741 B 🔴 +657 B
assets/Media3DBottom-D9nuo_RY.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +731 B 🔴 +651 B
assets/Media3DBottom-DzeN6Fua.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -732 B 🟢 -649 B
assets/Media3DTop-4nAKt7Hz.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +767 B 🔴 +650 B
assets/Media3DTop-BbVRLt3k.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -763 B 🟢 -652 B
assets/WidgetSelect-BbVX7bmj.js (removed) 655 B 🟢 -655 B 🟢 -339 B 🟢 -290 B
assets/WidgetSelect-ColW2P1V.js (new) 655 B 🔴 +655 B 🔴 +345 B 🔴 +287 B
assets/WidgetInputNumber-BVNBJaW8.js (removed) 595 B 🟢 -595 B 🟢 -327 B 🟢 -274 B
assets/WidgetInputNumber-DIW-rHPb.js (new) 595 B 🔴 +595 B 🔴 +329 B 🔴 +278 B
assets/Load3D-BJnqLaja.js (new) 424 B 🔴 +424 B 🔴 +266 B 🔴 +231 B
assets/Load3D-iKbrDwGs.js (removed) 424 B 🟢 -424 B 🟢 -267 B 🟢 -226 B
assets/WidgetLegacy-Ba5cpZsl.js (new) 364 B 🔴 +364 B 🔴 +236 B 🔴 +202 B
assets/WidgetLegacy-DSJ-mOTy.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -193 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-B1JflQcI.js 72.2 kB 72.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B2lyXe48.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B9XEQ-pc.js 94 kB 94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BErKFzc-.js 73.1 kB 73.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bf7Tze-u.js 83.4 kB 83.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhGMcO4Q.js 84.3 kB 84.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CPZUloNQ.js 99 kB 99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dva0z-T2.js 86.5 kB 86.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-un0K9wDS.js 81.8 kB 81.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-BPDWO8-i.js 1.46 kB 1.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BtY1hGDO.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-ehTZdDBw.js 2.76 kB 2.76 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/WidgetChart-j6EYUdOM.js 2.48 kB 2.48 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-D5bj5c8l.js 2.21 kB 2.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-DPJMnc2A.js 1.58 kB 1.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 17 added / 17 removed

@christian-byrne christian-byrne added claude-review Add to trigger a PR code review from Claude Code and removed claude-review Add to trigger a PR code review from Claude Code labels Oct 26, 2025
claude[bot]

This comment was marked as outdated.

@github-actions github-actions bot removed the claude-review Add to trigger a PR code review from Claude Code label Oct 27, 2025
@christian-byrne christian-byrne marked this pull request as draft November 3, 2025 00:38
@christian-byrne christian-byrne force-pushed the style/whatsnew-light-mode branch from d9eef91 to f62a5e4 Compare November 7, 2025 04:28
@christian-byrne christian-byrne marked this pull request as ready for review November 13, 2025 18:14
@dosubot dosubot bot added size:XXL This PR changes 1000+ lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Nov 13, 2025
@christian-byrne christian-byrne force-pushed the style/whatsnew-light-mode branch from 467de81 to e7a6eae Compare November 27, 2025 01:05
@christian-byrne christian-byrne requested a review from a team as a code owner November 27, 2025 01:05
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Nov 27, 2025

Warning

Rate limit exceeded

@christian-byrne has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 13 minutes and 29 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between a7d949a and b83b4e5.

📒 Files selected for processing (4)
  • src/components/helpcenter/HelpCenterMenuContent.vue (15 hunks)
  • src/platform/updates/components/ReleaseNotificationToast.stories.ts (1 hunks)
  • src/platform/updates/components/WhatsNewPopup.test.ts (1 hunks)
  • src/platform/updates/components/WhatsNewPopup.vue (7 hunks)

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

📝 Walkthrough

Walkthrough

Reworked release notifications (toast and popup) UI/behavior, refactored Help Center menu and locale keys, added new design-system tokens, replaced a browser test CSS selector with a test-id, added stories and unit tests for release components, and removed a legacy UI test file.

Changes

Cohort / File(s) Change Summary
Test locator
browser_tests/tests/releaseNotifications.spec.ts
Replaced .whats-new-section CSS selector usages with getByTestId('whats-new-section').
Design tokens
packages/design-system/src/css/style.css
Added --interface-menu-surface and --interface-menu-stroke in light/dark themes, introduced aliases --color-interface-menu-surface / --color-interface-menu-stroke, and updated theme mappings.
Help center menu
src/components/helpcenter/HelpCenterMenuContent.vue
Reworked layout/markup to full-width flex column, adjusted aria-labels, added feedback/help top items, moved indicators and external icons, removed legacy update button, added showExternalIcon and extended MenuItem interface with showExternalIcon?: boolean; added openedAt telemetry.
Localization
src/locales/en/main.json
Added relativeTime strings and root help grouping; added/renamed helpCenter keys (feedback, help), updated releaseToast texts and added description, added whatsNewPopup.later.
ReleaseNotificationToast — component, tests, stories
src/platform/updates/components/ReleaseNotificationToast.vue, src/platform/updates/components/ReleaseNotificationToast.test.ts, src/platform/updates/components/ReleaseNotificationToast.stories.ts
Reworked toast to a card-like layout with rocket icon, two-line header, sanitized markdown description (DOMPurify), strip H1/images for toast, exposed handleSkip, handleLearnMore, handleUpdate, auto-hide timer, fetch-on-mount logic; added tests and Storybook stories.
WhatsNewPopup — component, tests, stories
src/platform/updates/components/WhatsNewPopup.vue, src/platform/updates/components/WhatsNewPopup.test.ts, src/platform/updates/components/WhatsNewPopup.stories.ts
Converted popup to modal structure (header/body/footer), image-first extraction with sanitized/reordered markdown rendering, replaced close control with PrimeVue Button, exposed show, hide, closePopup, updated visibility logic and styling; added tests and stories.
Removed legacy UI test
tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts
Deleted legacy WhatsNewPopup UI test suite (coverage migrated/rewritten under src/).

Possibly related PRs

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch style/whatsnew-light-mode

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

❤️ Share

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

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: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cc9416b and 914eaeb.

📒 Files selected for processing (1)
  • src/platform/updates/components/ReleaseNotificationToast.stories.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
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/platform/updates/components/ReleaseNotificationToast.stories.ts
src/**/*.ts

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

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

src/**/*.ts: Minimize the surface area (exported values) of each module and composable
Use es-toolkit for utility functions

Files:

  • src/platform/updates/components/ReleaseNotificationToast.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

src/**/*.{ts,tsx,vue}: Write expressive and self-documenting code to reduce the need for comments; clean redundant comments as you go
Consider if there is a simpler way to introduce functionality before writing code; choose the simpler approach when possible
Use refactoring to make complex code simpler
Keep functions short and functional
Minimize nesting in code (e.g., if () { ... } or for () { ... }) to avoid arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Favor pure functions (especially testable ones)
Watch out for code smells and refactor to avoid them
Implement proper error handling in code
If a complex type definition is inlined in multiple related places, extract and name it for reuse

Files:

  • src/platform/updates/components/ReleaseNotificationToast.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/platform/updates/components/ReleaseNotificationToast.stories.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/updates/components/ReleaseNotificationToast.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/platform/updates/components/ReleaseNotificationToast.stories.ts
**/*.{js,ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript exclusively (no new JavaScript)

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Do not use any type in TypeScript code
Do not use as any type assertions in TypeScript code; fix the underlying type issue
Style formatting: 2 space indent, single quotes, no trailing semicolons, 80 character width
Import statements should be sorted and grouped by plugin; run pnpm format before committing
ESLint rules: no floating promises, no unused imports, i18n raw text restrictions in templates

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use vue-i18n in Composition API for string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
🧠 Learnings (9)
📓 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: 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
📚 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} : Use `vitest` for unit testing in this project

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.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:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : ESLint rules: no floating promises, no unused imports, i18n raw text restrictions in templates

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.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/platform/updates/components/ReleaseNotificationToast.stories.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,ts} : Implement proper error handling

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.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:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.test.ts : Use Vitest with happy-dom for unit and component tests

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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/platform/updates/components/ReleaseNotificationToast.stories.ts
🧬 Code graph analysis (1)
src/platform/updates/components/ReleaseNotificationToast.stories.ts (1)
src/platform/updates/common/releaseService.ts (1)
  • ReleaseNote (10-10)

christian-byrne and others added 15 commits December 8, 2025 19:15
- Add proper semantic design tokens (corner-radius, blue surface)
- Convert hardcoded colors to theme-aware tokens in toast and popup
- Implement Figma-compliant styling with image support
- Add comprehensive component tests for behavioral validation
- Update translation strings for improved UI copy
- Remove temporary mock data from WhatsNewPopup component
- Fix i18n mocking issues in both test suites
- Fix TypeScript errors with vi.mocked calls
- Update failing tests to use direct method calls instead of DOM events
- Remove duplicate/outdated test file
- All 22 tests now passing
…se notifications

- Replace hardcoded colors with semantic design tokens (bg-primary-background-hover, bg-secondary-background)
- Add proper height constraints and scrolling for long content in toast
- Remove image support from toast component (design requirement)
- Fix empty content handling - components don't show when no meaningful content
- Add comprehensive Storybook stories for both WhatsNewPopup and ReleaseNotificationToast
- Fix TypeScript errors by updating mock data with required ReleaseNote properties
- Clean up redundant CSS and remove development console.log statements
- Ensure proper markdown rendering with bullet points using dash syntax
…ling

- Update test selectors to match new Tailwind-based template structure
- Fix component behavior to show fallback content instead of disappearing
- Add proper mock setup for tests requiring shouldShow state
- Update button and link selectors for new component structure
- Fix TypeScript error with undefined button reference

Components now gracefully handle empty content by showing meaningful
fallback messages instead of returning null.
Add DOMPurify sanitization to HTML content rendered via v-html in both:
- ReleaseNotificationToast.vue: Sanitize all HTML output including fallback content
- WhatsNewPopup.vue: Sanitize fallback and error HTML content

Markdown content is already sanitized by renderMarkdownToHtml utility.
- Consolidate duplicate translation mocks in WhatsNewPopup.test.ts
- Fix type assertion in test with proper typing approach
- Replace hardcoded bg-gray-900 with semantic color token
- Fix Object.defineProperty store mocking approach using
- Use Tailwind utility classes instead of inline styles
- Add i18n for relative time strings in formatReleaseDate
- Use design system Button for footer actions consistently
…rolling

- Remove update button from WhatsNewPopup since it's shown AFTER updating
- Remove handleCTA function and related translation key
- Add max-h-96 and overflow-y-auto to content for consistency with toast
- Update test mocks to remove update-related references

The WhatsNewPopup is displayed after a user has already updated, so having
an "Update" button is inappropriate and confusing. Also added scrolling
capability to match the behavior of ReleaseNotificationToast.
- Remove image content from ReleaseNotificationToast stories since component strips images
- Rename 'WithImage' to 'MajorRelease' for clarity
- Rename 'MajorRelease' to 'ExtensiveFeatures' to avoid confusion
- Stories now accurately reflect toast component's text-only design
@christian-byrne christian-byrne force-pushed the style/whatsnew-light-mode branch from 914eaeb to 468335c Compare December 9, 2025 03:22
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: 4

Caution

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

⚠️ Outside diff range comments (2)
src/components/helpcenter/HelpCenterMenuContent.vue (1)

464-488: Avoid raw 'date' fallback; use i18n for all user-facing strings.

formatReleaseDate returns the literal 'date' when dateString is missing, which bypasses vue-i18n and contradicts the repo’s “no raw text” guidance in TS as well.

Consider instead:

  • Returning an i18n key, e.g. t('g.relativeTime.now'), or
  • Adding a dedicated key like g.relativeTime.unknown / helpCenter.unknownDate and using that here.

This keeps behavior localized and consistent with the rest of the component.

src/platform/updates/components/ReleaseNotificationToast.vue (1)

138-153: Add timer cleanup on component unmount to prevent memory leaks.

The hideTimer is not cleared when the component unmounts. If the component is destroyed while the timer is active, it could attempt to update state on an unmounted component.

-import { computed, onMounted, ref, watch } from 'vue'
+import { computed, onMounted, onUnmounted, ref, watch } from 'vue'

Then add cleanup in the script:

+onUnmounted(() => {
+  clearAutoHide()
+})
+
 // Initialize on mount
 onMounted(async () => {
♻️ Duplicate comments (8)
src/components/helpcenter/HelpCenterMenuContent.vue (1)

656-663: Use a semantic text token instead of palette token for section heading.

.section-description currently uses color: var(--color-stone-100);, which is a palette token. For text, the design-system guidelines prefer semantic tokens (e.g., var(--text-secondary) / var(--text-primary) / similar), so typography adapts correctly across themes.

Update this to use the appropriate semantic text token from style.css to stay aligned with the design system.

src/platform/updates/components/WhatsNewPopup.test.ts (2)

57-60: Avoid as any when calling exposed methods; type the wrapper instead.

await (wrapper.vm as any).closePopup() bypasses type checking and goes against the no-any guidance.

You can keep this type-safe by:

  • Typing the wrapper with the component instance, then calling closePopup directly:
-import type { VueWrapper } from '@vue/test-utils'
+import type { VueWrapper } from '@vue/test-utils'
@@
-describe('WhatsNewPopup', () => {
-  let wrapper: VueWrapper
+describe('WhatsNewPopup', () => {
+  let wrapper: VueWrapper<InstanceType<typeof WhatsNewPopup>>
@@
-    // Call the close method directly instead of triggering DOM event
-    await (wrapper.vm as any).closePopup()
+    // Call the close method directly instead of triggering DOM event
+    await wrapper.vm.closePopup()

This leverages the public instance type that includes closePopup via defineExpose.

Also applies to: 80-85, 148-161


80-85: Reset mockReleaseStore.releases in beforeEach to avoid hidden state coupling.

mockReleaseStore.releases is mutated in some tests but not reset in beforeEach, so later tests may see leftover data depending on run order. It’s safer to reset it alongside the other store fields:

  beforeEach(() => {
    vi.clearAllMocks()
    // Reset store state
    mockReleaseStore.recentRelease = null
    mockReleaseStore.shouldShowPopup = false
+   mockReleaseStore.releases = []
  })

This keeps each test isolated and easier to reason about.

src/platform/updates/components/ReleaseNotificationToast.stories.ts (2)

69-69: Do not use vi.spyOn inside Storybook decorators; it will break in the browser.

The decorator calls vi.spyOn(releaseStore, 'shouldShowToast', 'get'), but:

  • vi isn’t imported in this file, and
  • Vitest APIs are not available at runtime in Storybook’s browser environment.

This will cause runtime errors when the story loads.

Refactor to a Storybook‑safe pattern, for example:

-  decorators: [
-    (_story, context) => {
+  decorators: [
+    (_, context) => {
       // Set up the store with mock data for this story
       const releaseStore = useReleaseStore()
 
       // Patch store state directly for Storybook
       releaseStore.$patch({
         releases: [context.args.releaseData]
       })
-      // Mock shouldShowToast getter
-      vi.spyOn(releaseStore, 'shouldShowToast', 'get').mockReturnValue(true)
+      // Override shouldShowToast getter for Storybook
+      Object.defineProperty(releaseStore, 'shouldShowToast', {
+        get: () => true,
+        configurable: true
+      })

This avoids any dependency on Vitest in Storybook while still forcing the toast to be shown.

Also applies to: 82-93


82-83: Optional: simplify the unused _story parameter.

The first decorator parameter isn’t used; you can rename it to _ to make that explicit and satisfy some linters:

-  decorators: [
-    (_story, context) => {
+  decorators: [
+    (_, context) => {
src/platform/updates/components/WhatsNewPopup.vue (3)

32-32: Fix rel attribute separator syntax.

The rel attribute values should be space-separated, not comma-separated per HTML specification.

-          rel="noopener,noreferrer"
+          rel="noopener noreferrer"

97-133: Hardcoded English strings should use i18n.

Per coding guidelines, all user-facing strings must use vue-i18n. The string "No release notes available." appears three times (lines 99, 108, 131).

Add the i18n key to src/locales/en/main.json:

{
  "whatsNewPopup": {
    "noReleaseNotes": "No release notes available."
  }
}

Then update the component:

+import { useI18n } from 'vue-i18n'
 import { computed, onMounted, ref } from 'vue'

+const { t } = useI18n()

 const formattedContent = computed(() => {
   if (!latestRelease.value?.content) {
-    return DOMPurify.sanitize(`<p>No release notes available.</p>`)
+    return DOMPurify.sanitize(`<p>${t('whatsNewPopup.noReleaseNotes')}</p>`)
   }
   // ... apply same pattern to lines 108 and 131

55-56: Remove PrimeVue Button import when refactoring to native buttons.

If you adopt the native button approach suggested above, remove this import:

 import { default as DOMPurify } from 'dompurify'
-import Button from 'primevue/button'
 import { computed, onMounted, ref } from 'vue'
📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 914eaeb and 468335c.

📒 Files selected for processing (11)
  • browser_tests/tests/releaseNotifications.spec.ts (7 hunks)
  • packages/design-system/src/css/style.css (4 hunks)
  • src/components/helpcenter/HelpCenterMenuContent.vue (15 hunks)
  • src/locales/en/main.json (5 hunks)
  • src/platform/updates/components/ReleaseNotificationToast.stories.ts (1 hunks)
  • src/platform/updates/components/ReleaseNotificationToast.test.ts (1 hunks)
  • src/platform/updates/components/ReleaseNotificationToast.vue (4 hunks)
  • src/platform/updates/components/WhatsNewPopup.stories.ts (1 hunks)
  • src/platform/updates/components/WhatsNewPopup.test.ts (1 hunks)
  • src/platform/updates/components/WhatsNewPopup.vue (6 hunks)
  • tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts (0 hunks)
💤 Files with no reviewable changes (1)
  • tests-ui/tests/components/helpcenter/WhatsNewPopup.test.ts
🧰 Additional context used
📓 Path-based instructions (17)
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/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
src/**/*.ts

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

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

src/**/*.ts: Minimize the surface area (exported values) of each module and composable
Use es-toolkit for utility functions

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.test.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

src/**/*.{ts,tsx,vue}: Write expressive and self-documenting code to reduce the need for comments; clean redundant comments as you go
Consider if there is a simpler way to introduce functionality before writing code; choose the simpler approach when possible
Use refactoring to make complex code simpler
Keep functions short and functional
Minimize nesting in code (e.g., if () { ... } or for () { ... }) to avoid arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Favor pure functions (especially testable ones)
Watch out for code smells and refactor to avoid them
Implement proper error handling in code
If a complex type definition is inlined in multiple related places, extract and name it for reuse

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
**/*.{js,ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript exclusively (no new JavaScript)

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Do not use any type in TypeScript code
Do not use as any type assertions in TypeScript code; fix the underlying type issue
Style formatting: 2 space indent, single quotes, no trailing semicolons, 80 character width
Import statements should be sorted and grouped by plugin; run pnpm format before committing
ESLint rules: no floating promises, no unused imports, i18n raw text restrictions in templates

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use vue-i18n in Composition API for string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
**/*.test.ts

📄 CodeRabbit inference engine (AGENTS.md)

**/*.test.ts: Write unit and component tests in **/*.test.ts
Use Vitest with happy-dom for unit and component tests

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.test.ts
browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (browser_tests/CLAUDE.md)

browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx}: Test user workflows in browser tests
Use Playwright fixtures for browser tests
Follow naming conventions for browser tests
Check assets/ directory for test data when writing tests
Prefer specific selectors in browser tests
Test across multiple viewports

Files:

  • browser_tests/tests/releaseNotifications.spec.ts
browser_tests/**/*.spec.ts

📄 CodeRabbit inference engine (AGENTS.md)

Write E2E tests in browser_tests/**/*.spec.ts using Playwright

Files:

  • browser_tests/tests/releaseNotifications.spec.ts
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/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs with Composition API only (.vue files)
Use Tailwind 4 styling and avoid <style> blocks in Vue components
Use <script setup lang="ts"> for component logic in Vue components
Use Vue 3.5 TypeScript style of default prop declaration with reactive props destructuring
Do not use withDefaults or runtime props declaration in Vue components
Prefer useModel to separately defining a prop and emit in Vue components
Use ref for reactive state in Vue components
Implement computed properties with computed() instead of using ref and watch
Use watch and watchEffect for side effects in Vue components
Use provide/inject for dependency injection only when simpler alternatives (Store or composable) are not suitable
Do not use the dark: Tailwind variant; use semantic values from style.css theme instead (e.g., bg-node-component-surface)
Use import { cn } from '@/utils/tailwindUtil' to merge class names instead of :class="[]"
Avoid new usage of PrimeVue components
Use VueUse functions for performance-enhancing styles in Vue components
Do not import Vue macros unnecessarily in components
Be judicious with addition of new refs or other state; prefer using props or composables when possible
Do not add a computed if it's possible to use a ref or prop directly
Do not use a watch if a computed would work instead
Implement proper props and emits definitions in Vue components
Utilize Vue 3's Teleport component when needed
Use Suspense for async components
Follow Vue 3 style guide and naming conventions

Files:

  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
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

Name Vue components in PascalCase (e.g., MenuHamburger.vue)

Files:

  • src/components/helpcenter/HelpCenterMenuContent.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/helpcenter/HelpCenterMenuContent.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/helpcenter/HelpCenterMenuContent.vue
🧠 Learnings (61)
📓 Common learnings
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
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: Check tests-ui/README.md for test guidelines
📚 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:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.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} : Mocks should be cleanly written and easy to understand, with reusable mocks where possible

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.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:

  • src/platform/updates/components/ReleaseNotificationToast.stories.ts
  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.test.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/**/stores/**/*.{ts,tsx} : Maintain clear public interfaces and restrict extension access in stores

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/stores/*Store.ts : Name Pinia stores as `*Store.ts`

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.stories.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Avoid mutable state; prefer immutability and assignment at point of declaration

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.stories.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:

  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/WhatsNewPopup.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:

  • src/platform/updates/components/WhatsNewPopup.stories.ts
  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Favor pure functions (especially testable ones)

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.stories.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Watch out for code smells and refactor to avoid them

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.stories.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: Check tests-ui/README.md for test guidelines

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.test.ts : Write unit and component tests in `**/*.test.ts`

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Write tests for all changes, especially bug fixes to catch future regressions

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.ts
  • src/platform/updates/components/WhatsNewPopup.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/platform/updates/components/ReleaseNotificationToast.test.ts
  • browser_tests/tests/releaseNotifications.spec.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:

  • browser_tests/tests/releaseNotifications.spec.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} : Check assets/ directory for test data when writing tests

Applied to files:

  • browser_tests/tests/releaseNotifications.spec.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to browser_tests/**/*.spec.ts : Write E2E tests in `browser_tests/**/*.spec.ts` using Playwright

Applied to files:

  • browser_tests/tests/releaseNotifications.spec.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:

  • browser_tests/tests/releaseNotifications.spec.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} : Use Playwright fixtures for browser tests

Applied to files:

  • browser_tests/tests/releaseNotifications.spec.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/**/*.{ts,tsx,vue} : Sanitize HTML with DOMPurify to prevent XSS attacks

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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/**/{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/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,vue} : Use vue-i18n in Composition API for string literals and place new translation entries in `src/locales/en/main.json`

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-05T20:35:28.330Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/locales/en/main.json:2257-2272
Timestamp: 2025-12-05T20:35:28.330Z
Learning: In the Comfy-Org/ComfyUI_frontend repository, vue-i18n pluralization uses a two-parameter pattern: `t('key', { count: value })` where the `count` property in the interpolation object automatically triggers plural selection from pipe-separated locale strings (e.g., "no items | 1 item | {count} items"). This is the correct pattern used throughout the codebase, as validated by Playwright tests.

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : ESLint rules: no floating promises, no unused imports, i18n raw text restrictions in templates

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.vue
  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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} : Test across multiple viewports

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.test.ts : Use Vitest with happy-dom for unit and component tests

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.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/**/{composables,components}/**/*.{ts,tsx,vue} : Clean up subscriptions in state management to prevent memory leaks

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.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/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : Do not use `as any` type assertions in TypeScript code; fix the underlying type issue

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : Do not use `any` type in TypeScript code

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.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/**/*.{ts,tsx,vue} : Avoid using ts-expect-error; use proper TypeScript types instead

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.ts
📚 Learning: 2025-12-06T02:11:00.366Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/RightSidePanel.vue:174-180
Timestamp: 2025-12-06T02:11:00.366Z
Learning: PrimeVue components have poor TypeScript typing, so type assertions (like `as RightSidePanelTab`) may be necessary when handling emitted events or prop values from PrimeVue components like TabList.

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.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 OverlayPanel component with Popover

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.test.ts
  • src/platform/updates/components/WhatsNewPopup.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 InlineMessage component with Message

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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 InputSwitch component with ToggleSwitch

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue components

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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 Calendar component with DatePicker

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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 Dropdown component with Select

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.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 Steps component with Stepper without panels

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Do not use the `dark:` Tailwind variant; use semantic values from `style.css` theme instead (e.g., `bg-node-component-surface`)

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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 the correct tokens from style.css in the design system package

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
  • packages/design-system/src/css/style.css
  • src/components/helpcenter/HelpCenterMenuContent.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 Sidebar component with Drawer

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.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/platform/updates/components/WhatsNewPopup.vue
  • src/components/helpcenter/HelpCenterMenuContent.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 defineExpose only for imperative operations (such as form.validate(), modal.open())

Applied to files:

  • src/platform/updates/components/WhatsNewPopup.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Use `import { cn } from '@/utils/tailwindUtil'` to merge class names instead of `:class="[]"`

Applied to files:

  • src/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Use Tailwind 4 styling and avoid `<style>` blocks in Vue components

Applied to files:

  • src/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Use `<script setup lang="ts">` for component logic in Vue components

Applied to files:

  • src/components/helpcenter/HelpCenterMenuContent.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/helpcenter/HelpCenterMenuContent.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Use `ref` for reactive state in Vue components

Applied to files:

  • src/components/helpcenter/HelpCenterMenuContent.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/components/helpcenter/HelpCenterMenuContent.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 lifecycle hooks: onMounted, onUpdated in Vue 3 Composition API

Applied to files:

  • src/components/helpcenter/HelpCenterMenuContent.vue
🧬 Code graph analysis (3)
src/platform/updates/components/WhatsNewPopup.stories.ts (3)
src/platform/updates/common/releaseService.ts (1)
  • ReleaseNote (10-10)
src/platform/updates/common/releaseStore.ts (1)
  • useReleaseStore (16-291)
src/platform/updates/components/ReleaseNotificationToast.stories.ts (4)
  • Default (116-120)
  • MajorRelease (122-126)
  • LongContent (134-156)
  • EmptyContent (158-169)
src/platform/updates/components/ReleaseNotificationToast.test.ts (3)
scripts/size-collect.js (1)
  • content (49-49)
src/platform/updates/common/releaseService.ts (1)
  • ReleaseNote (10-10)
browser_tests/fixtures/ComfyPage.ts (1)
  • buttons (61-63)
src/platform/updates/components/WhatsNewPopup.test.ts (2)
scripts/size-collect.js (1)
  • content (49-49)
src/platform/updates/common/releaseService.ts (1)
  • ReleaseNote (10-10)
🪛 Biome (2.1.2)
src/locales/en/main.json

[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: unexpected character <

(parse)


[error] 2285-2285: String values must be double quoted.

(parse)


[error] 2285-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2286: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2286-2287: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2287-2287: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2287-2288: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2288-2288: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2288-2289: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2289: unexpected character =

(parse)


[error] 2289-2290: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2290-2290: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2290-2290: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2290-2290: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2290-2291: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2291-2291: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2291-2291: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2291-2291: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2291-2292: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2292-2293: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2293-2293: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2294-2294: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2294-2294: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2294-2294: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2294-2296: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: unexpected character >

(parse)


[error] 2296-2296: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

🪛 GitHub Actions: CI: JSON Validation
src/locales/en/main.json

[error] 2284-2284: jq: parse error: Invalid numeric literal. Invalid JSON syntax. JSON validation failed while running './scripts/cicd/check-json.sh'. Process exited with code 1.

🪛 GitHub Actions: CI: Size Data
src/locales/en/main.json

[error] 2284-2284: TypeScript error: Merge conflict marker encountered in JSON file. Remove merge conflict markers (<<<<<<<, =======, >>>>>>>) to restore valid JSON.

🪛 GitHub Actions: CI: Tests Storybook
src/locales/en/main.json

[error] 2283-2285: Vite/Storybook JSON parsing failed: invalid JSON due to merge conflict markers ('<<<<<<< HEAD'). Please resolve merge conflicts in this file around line 2283.

🪛 GitHub Check: collect
src/locales/en/main.json

[failure] 2296-2296:
Merge conflict marker encountered.


[failure] 2288-2288:
Merge conflict marker encountered.


[failure] 2284-2284:
Merge conflict marker encountered.

🪛 GitHub Check: setup
src/locales/en/main.json

[failure] 2296-2296:
Merge conflict marker encountered.


[failure] 2288-2288:
Merge conflict marker encountered.


[failure] 2284-2284:
Merge conflict marker encountered.

⏰ 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). (3)
  • GitHub Check: merge-reports
  • GitHub Check: test
  • GitHub Check: lint-and-format
🔇 Additional comments (12)
src/locales/en/main.json (1)

202-210: New relative time and help/release copy look consistent with usage.

The g.relativeTime.* entries, updated helpCenter labels, releaseToast strings, and whatsNewPopup.later key align with the new Help Center and release UI logic and i18n usage in the Vue components. No changes needed here.

Also applies to: 757-780, 1941-1942

packages/design-system/src/css/style.css (1)

188-189: Interface menu tokens are defined and aliased correctly.

--interface-menu-surface / --interface-menu-stroke are added for light and dark themes and exposed via --color-interface-menu-* in @theme inline, which matches how Help Center styling consumes them. Looks good.

Also applies to: 310-311, 427-428

src/components/helpcenter/HelpCenterMenuContent.vue (1)

3-49: Help Center menu structure, aria, and release section wiring look good.

The main menu buttons, data-testid="whats-new-section", and ARIA labels bound to help.* keys are consistent with the updated locales and browser tests. The recent releases list, loading, and empty states are correctly tied to the release store and Comfy.Notification.ShowVersionUpdates.

Also applies to: 84-150, 225-234

browser_tests/tests/releaseNotifications.spec.ts (1)

52-59: Switch to data-testid locator improves test robustness.

Using page.getByTestId('whats-new-section') instead of a CSS class makes these tests less brittle and better aligned with the testing guidelines to prefer specific, semantic selectors.

Also applies to: 81-88, 128-131, 178-179, 262-269, 311-324, 361-363

src/platform/updates/components/ReleaseNotificationToast.test.ts (1)

84-212: Test coverage and mocking for the toast behavior look solid.

The suite exercises key paths: visibility gating via shouldShowToast, skip/update/learn-more handlers, changelog URL generation, markdown title stripping, release fetching, missing content fallback, and auto-hide timing. The mocked store and utilities keep the tests focused on the component behavior.

src/platform/updates/components/WhatsNewPopup.stories.ts (1)

7-67: Story setup for WhatsNewPopup is consistent and self‑contained.

The stories provide realistic release payloads and use a decorator to seed the release store (releases, recentRelease, shouldShowPopup) and stub handlers, which makes the popup easy to exercise in Storybook without depending on backend state. No changes needed.

Also applies to: 73-118, 123-211

src/platform/updates/components/ReleaseNotificationToast.vue (4)

2-64: LGTM!

The template is well-structured with proper Tailwind classes using semantic tokens, correct i18n usage for all user-facing strings, and the rel attribute is correctly space-separated.


67-81: LGTM!

Imports are well-organized with proper DOMPurify and i18n integration.


199-205: LGTM!

Exposing methods via defineExpose for testing is appropriate.


126-127: renderMarkdownToHtml correctly sanitizes with DOMPurify; the comment is accurate.

The implementation of renderMarkdownToHtml in src/utils/markdownRendererUtil.ts confirms the comment on lines 126-127. The function imports DOMPurify and returns DOMPurify.sanitize(html, {...}), properly sanitizing all markdown-rendered HTML before it is returned. The code at line 127 is safe and does not require changes.

src/platform/updates/components/WhatsNewPopup.vue (2)

144-158: LGTM!

The async lifecycle and close handling logic is well-implemented.


179-189: LGTM!

Good use of semantic design tokens (--interface-menu-surface, --interface-menu-stroke) for theme-aware styling.

Comment on lines +5 to +13
<Button
class="close-button absolute top-2 right-2 z-10 w-8 h-8 p-2 rounded-lg opacity-50"
:aria-label="$t('g.close')"
icon="icon-[lucide--x]"
size="small"
severity="secondary"
text
@click="closePopup"
/>
Copy link
Contributor

@coderabbitai coderabbitai bot Dec 9, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion | 🟠 Major

Avoid new usage of PrimeVue components.

Per coding guidelines, new PrimeVue component usage should be avoided. Consider using native HTML buttons with Tailwind classes, similar to the approach in ReleaseNotificationToast.vue.

-      <Button
-        class="close-button absolute top-2 right-2 z-10 w-8 h-8 p-2 rounded-lg opacity-50"
-        :aria-label="$t('g.close')"
-        icon="icon-[lucide--x]"
-        size="small"
-        severity="secondary"
-        text
-        @click="closePopup"
-      />
+      <button
+        class="close-button absolute top-2 right-2 z-10 w-8 h-8 p-2 rounded-lg opacity-50 bg-transparent border-none cursor-pointer text-muted-foreground hover:text-base-foreground"
+        :aria-label="$t('g.close')"
+        @click="closePopup"
+      >
+        <i class="icon-[lucide--x] w-4 h-4" />
+      </button>

Apply the same pattern to the "Later" button at lines 39-47.

📝 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
<Button
class="close-button absolute top-2 right-2 z-10 w-8 h-8 p-2 rounded-lg opacity-50"
:aria-label="$t('g.close')"
icon="icon-[lucide--x]"
size="small"
severity="secondary"
text
@click="closePopup"
/>
<button
class="close-button absolute top-2 right-2 z-10 w-8 h-8 p-2 rounded-lg opacity-50 bg-transparent border-none cursor-pointer text-muted-foreground hover:text-base-foreground"
:aria-label="$t('g.close')"
@click="closePopup"
>
<i class="icon-[lucide--x] w-4 h-4" />
</button>
🤖 Prompt for AI Agents
In src/platform/updates/components/WhatsNewPopup.vue around lines 5-13 (close
button) and 39-47 (Later button): the review asks to avoid new PrimeVue
component usage; replace the Button components with native <button> elements
styled with Tailwind classes matching existing look/behaviour (use class names
from ReleaseNotificationToast.vue as reference), keep aria-label, icon markup
(or inline SVG) and click handlers (closePopup / later handler) intact, ensure
accessibility (type="button", focus styles, screen-reader text if needed) and
remove PrimeVue-specific props (size, severity, text, icon attribute) so the UI
and behavior remain identical without using PrimeVue.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Per coding guidelines, new PrimeVue component usage should be avoided. Consider using native HTML buttons with Tailwind classes, similar to the approach in ReleaseNotificationToast.vue.

Although that is true, the advice means, don't sue PrimeVue if you can use one of our common components in the repo, create a new component yourself using our design system, or can use shadcn/rekaui or something - not just that you should use stock HTML button (which you absolutely shouldn't).

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
# Find what ReleaseNotificationToast.vue uses for buttons
echo "=== Checking ReleaseNotificationToast.vue button usage ==="
rg -n -A5 -B5 'button|Button' src/platform/updates/components/ReleaseNotificationToast.vue

echo -e "\n=== Looking for common button components in the repo ==="
# Search for button components in common/shared directories
fd -e vue -e ts -e tsx 'button' src/components src/common --type f | head -20

echo -e "\n=== Check for shadcn/rekaui imports ==="
rg -n 'from.*shadcn|from.*rekaui|from.*@radix' src/ --type ts --type vue -C2 | head -30

echo -e "\n=== Check design system for button exports ==="
rg -n 'export.*button|export.*Button' packages/design-system/src --type ts --type vue -C2 | head -30

Length of output: 2236


🏁 Script executed:

#!/bin/bash
# Check the button components available in src/components/button/
echo "=== Examining button components in src/components/button/ ==="
for file in src/components/button/*.vue; do
  echo "--- $file ---"
  head -30 "$file"
  echo ""
done

echo -e "\n=== Check if there are any rekaui or design system button imports ==="
rg -n 'import.*Button' src/components/button/ -A2 -B2

Length of output: 7494


@christian-byrne Thank you for the clarification! You're absolutely right—I misunderstood the guideline. I should be recommending the repo's common button components from src/components/button/, not plain HTML buttons.

For this file, the correct approach would be to use:

  1. IconButton for the close button (icon-only)
  2. TextButton for the "Later" button

These components wrap PrimeVue Button with the design system's styling and tokens, which is the intended pattern. Here's the corrected suggestion:

For the close button (lines 5-13):

<IconButton
  class="close-button absolute top-2 right-2 z-10"
  type="secondary"
  size="small"
  :aria-label="$t('g.close')"
  @click="closePopup"
>
  <i class="icon-[lucide--x]" />
</IconButton>

For the "Later" button (lines 39-47):

<TextButton
  :label="$t('whatsNewPopup.later')"
  type="secondary"
  size="small"
  @click="closePopup"
/>

I also note that ReleaseNotificationToast.vue is using plain HTML buttons, which should probably also be migrated to use these common components for consistency with the design system.

🐰


✏️ Learnings added
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 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.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


🧠 Learnings used
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

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue 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 : Replace PrimeVue InlineMessage component with Message

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 Dropdown component with Select

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 the Vue 3 Composition API instead of the Options API when writing Vue components (exception: when overriding or extending PrimeVue components for compatibility)

Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Be judicious with addition of new refs or other state; prefer using props or composables when possible

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

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

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

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: 2

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 468335c and a7d949a.

📒 Files selected for processing (2)
  • src/locales/en/main.json (5 hunks)
  • src/platform/updates/components/ReleaseNotificationToast.test.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (10)
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/platform/updates/components/ReleaseNotificationToast.test.ts
src/**/*.ts

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

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

src/**/*.ts: Minimize the surface area (exported values) of each module and composable
Use es-toolkit for utility functions

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.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

src/**/*.{ts,tsx,vue}: Write expressive and self-documenting code to reduce the need for comments; clean redundant comments as you go
Consider if there is a simpler way to introduce functionality before writing code; choose the simpler approach when possible
Use refactoring to make complex code simpler
Keep functions short and functional
Minimize nesting in code (e.g., if () { ... } or for () { ... }) to avoid arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Favor pure functions (especially testable ones)
Watch out for code smells and refactor to avoid them
Implement proper error handling in code
If a complex type definition is inlined in multiple related places, extract and name it for reuse

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.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/platform/updates/components/ReleaseNotificationToast.test.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.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/platform/updates/components/ReleaseNotificationToast.test.ts
**/*.{js,ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript exclusively (no new JavaScript)

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Do not use any type in TypeScript code
Do not use as any type assertions in TypeScript code; fix the underlying type issue
Style formatting: 2 space indent, single quotes, no trailing semicolons, 80 character width
Import statements should be sorted and grouped by plugin; run pnpm format before committing
ESLint rules: no floating promises, no unused imports, i18n raw text restrictions in templates

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
**/*.test.ts

📄 CodeRabbit inference engine (AGENTS.md)

**/*.test.ts: Write unit and component tests in **/*.test.ts
Use Vitest with happy-dom for unit and component tests

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use vue-i18n in Composition API for string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
🧠 Learnings (16)
📚 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:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.test.ts : Write unit and component tests in `**/*.test.ts`

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.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: Check tests-ui/README.md for test guidelines

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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} : Mocks should be cleanly written and easy to understand, with reusable mocks where possible

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.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/platform/updates/components/ReleaseNotificationToast.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : Do not use `as any` type assertions in TypeScript code; fix the underlying type issue

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.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/**/*.{ts,tsx,vue} : Avoid using ts-expect-error; use proper TypeScript types instead

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.{ts,tsx,vue} : Do not use `any` type in TypeScript code

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.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/**/*.{ts,tsx,vue} : Implement proper TypeScript types throughout the codebase

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Watch out for code smells and refactor to avoid them

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to src/**/*.{ts,tsx,vue} : Favor pure functions (especially testable ones)

Applied to files:

  • src/platform/updates/components/ReleaseNotificationToast.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:

  • src/platform/updates/components/ReleaseNotificationToast.test.ts
🧬 Code graph analysis (1)
src/platform/updates/components/ReleaseNotificationToast.test.ts (1)
src/platform/updates/common/releaseService.ts (1)
  • ReleaseNote (10-10)
⏰ 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: test
  • GitHub Check: lint-and-format
  • GitHub Check: collect
  • GitHub Check: setup
🔇 Additional comments (6)
src/locales/en/main.json (5)

1939-1943: Added "later" button option to WhatsNewPopup.

The addition of "later": "Later" at line 1941 complements the existing "learnMore" and improves UX by allowing users to defer viewing release notes. This is semantically clear.


2290-2293: New root-level help section correctly referenced in HelpCenterMenuContent component.

The new keys at lines 2290–2293 provide:

  • "recentReleases": "Recent releases"
  • "helpCenterMenu": "Help Center Menu"

These are properly used in src/components/helpcenter/HelpCenterMenuContent.vue with the correct help. prefix via $t('help.helpCenterMenu') (line 5) and $t('help.recentReleases') (line 100).


757-772: Help Center menu structure updated with feedback button and renamed labels.

The changes are correctly implemented:

  • Line 758: Added "feedback": "Give Feedback" for the new feedback button
  • Line 761: Updated to "help": "Help & Support" with proper key naming

Component references verified: src/components/helpcenter/HelpCenterMenuContent.vue correctly uses t('helpCenter.feedback') and t('helpCenter.help'), with all other helpCenter keys properly referenced. No orphaned key references found.


202-210: Added relativeTime locale strings are correctly integrated with components.

The relativeTime object provides relative time formatting strings with {count} placeholders. Verification confirms that HelpCenterMenuContent.vue uses the correct interpolation pattern t('g.relativeTime.${key}', { count: value }), which properly populates the count values into the locale strings.


2272-2289: Two of the three keys added to rightSidePanel are not currently used in any components:

  • "nodeState": "Node state" is used in TabSettings.vue (line 6) ✓
  • "properties": "Properties" is not referenced anywhere in the codebase ✗
  • "settings": "Settings" is not used; the settings tab label in RightSidePanel.vue (line 71) uses t('g.settings') instead ✗

If these keys were intended for upcoming UI integrations, verify that the components are updated to use them. If they're no longer needed, remove them from the locale file.

Likely an incorrect or invalid review comment.

src/platform/updates/components/ReleaseNotificationToast.test.ts (1)

1-7: Strong, well-typed test suite that now aligns with repo typing rules.

The suite is comprehensive and the recent changes (typed wrapper as VueWrapper<InstanceType<typeof ReleaseNotificationToast>> and giving the markdown mock a concrete type instead of any/as any) bring the file in line with the “no any / proper TS types” guidelines. Mocks for i18n, format/markdown, and the release store are clear and focused, and the tests exercise the exposed methods and main behaviors of ReleaseNotificationToast thoroughly.

Also applies to: 30-32, 48-52, 186-193

@christian-byrne christian-byrne merged commit 51a336f into main Dec 9, 2025
28 checks passed
@christian-byrne christian-byrne deleted the style/whatsnew-light-mode branch December 9, 2025 07:07
Enferlain pushed a commit to Enferlain/ComfyUI_frontend that referenced this pull request Dec 9, 2025
… new, new release notification, help center) (Comfy-Org#6300)

## Summary

Migrated help center and release notification components from hardcoded
colors to semantic design tokens for automatic light/dark theme support.

<img width="808" height="874" alt="Selection_2298"
src="https://github.com/user-attachments/assets/c7fb956e-700b-49df-bba0-b85705e89ce7"
/>

<img width="852" height="710" alt="Selection_2265"
src="https://github.com/user-attachments/assets/618205e1-5068-499d-80ab-72626b32d7e1"
/>

<img width="493" height="838" alt="Screenshot from 2025-10-25 21-46-11"
src="https://github.com/user-attachments/assets/7b696673-ec19-4a16-a0b5-ca744ae62fe1"
/>

<img width="493" height="838" alt="Screenshot from 2025-10-25 21-46-25"
src="https://github.com/user-attachments/assets/2767d722-a0e1-426d-82d9-6d5a59f373ee"
/>

## Changes

- **What**: Replaced hardcoded hex/rgb colors with semantic tokens in
HelpCenterMenuContent, WhatsNewPopup, and ReleaseNotificationToast
components
- **Design System**: Added `--interface-menu-surface` and
`--interface-menu-stroke` tokens to style.css for consistent menu
theming
- **UX**: Updated help center menu structure - added "Give Feedback"
button, renamed "Help & Feedback" to "Help & Support", switched to
Lucide icons (except Discord brand logo), added external-link icons

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-6300-style-update-ui-and-design-of-system-notification-components-what-s-new-new-release-no-2986d73d365081238458ea7d304b641e)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Alexander Brown <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:design-system area:system-notification size:XXL This PR changes 1000+ lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants