Skip to content

Conversation

@viva-jinyi
Copy link
Member

@viva-jinyi viva-jinyi commented Jan 6, 2026

Summary

Changes

  • What:
  1. Move duration chips from CardTop top-left to CardBottom (commented out for now)
  2. Move output count button from CardTop top-right to CardBottom right side
  3. Change CardBottom to justify-between layout (left: filename+metadata, right: output count)
  4. Show action buttons only on hover/selected/playing states
  5. Update MediaTitle to display 2 lines with ellipsis handling

Review Focus

Screenshots (if applicable)

Before
스크린샷 2026-01-06 오후 2 17 54

After
스크린샷 2026-01-06 오후 2 17 16

┆Issue is synchronized with this Notion page by Unito

@viva-jinyi viva-jinyi requested a review from a team as a code owner January 6, 2026 05:16
@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Jan 6, 2026
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 6, 2026

Warning

Rate limit exceeded

@viva-jinyi has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 20 minutes and 24 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 6bad040 and 7d29498.

📒 Files selected for processing (9)
  • src/components/button/IconGroup.vue
  • src/components/ui/button/button.variants.ts
  • src/locales/en/main.json
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📝 Walkthrough

Walkthrough

Removed four per-media bottom components and reworked MediaAssetCard: the card now uses an integrated top preview with an actions overlay and a consolidated bottom area; MediaTitle markup and prop handling simplified; new localization keys for action labels added.

Changes

Cohort / File(s) Summary
Removed per-media bottom components
src/platform/assets/components/Media3DBottom.vue, src/platform/assets/components/MediaAudioBottom.vue, src/platform/assets/components/MediaImageBottom.vue, src/platform/assets/components/MediaVideoBottom.vue
Deleted four Vue SFCs. Each removed component's asset: AssetMeta prop, filename computations, template rendering (MediaTitle plus size/dimensions/metadata) and exports were removed.
Media card layout
src/platform/assets/components/MediaAssetCard.vue
Replaced CardContainer/CardTop/CardBottom composition with a custom wrapper and distinct top (dynamic preview) and bottom (metadata) sections. Added action overlay (zoom, more options), loading skeletons, computed fileName and metaInfo, centralized showActionsOverlay logic, and removed unused imports. Layout and class structure reworked.
Title component
src/platform/assets/components/MediaTitle.vue
Swapped h3p, increased line clamp and adjusted typography, removed truncation/display computed helpers, now accepts fileName prop directly. Prop signature unchanged.
Localization
src/locales/en/main.json
Added translation keys: assets.actions.zoom, assets.actions.moreOptions, and duplicated keys under mediaAsset.asset.actions with values "Zoom in" and "More options".
Manifest (documented)
package.json (referenced)
Mentioned in manifest notes (no code changes described beyond inclusion).

Possibly related PRs


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

❤️ Share

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

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/08/2026, 12:33:10 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 01/08/2026, 12:38:34 AM UTC

📈 Summary

  • Total Tests: 513
  • Passed: 504 ✅
  • Failed: 0
  • Flaky: 1 ⚠️
  • Skipped: 8 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 494 / ❌ 0 / ⚠️ 0 / ⏭️ 8
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 7 / ❌ 0 / ⚠️ 1 / ⏭️ 0

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

@github-actions
Copy link

github-actions bot commented Jan 6, 2026

Bundle Size Report

Summary

  • Raw size: 17.5 MB baseline 17.5 MB — 🟢 -8.54 kB
  • Gzip: 3.57 MB baseline 3.58 MB — 🟢 -3.85 kB
  • Brotli: 2.72 MB baseline 2.72 MB — 🟢 -3.45 kB
  • Bundles: 94 current • 99 baseline • 51 added / 56 removed

Category Glance
App Entry Points 🟢 -8.57 kB (3.24 MB) · Graph Workspace 🔴 +7.01 kB (1.01 MB) · Other 🟢 -6.06 kB (3.5 MB) · UI Components 🟢 -897 B (197 kB) · Vendor & Third-Party 🟢 -23 B (9.19 MB) · Panels & Settings ⚪ 0 B (300 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.24 MB (baseline 3.25 MB) • 🟢 -8.57 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-Difx92En.js (removed) 3.05 MB 🟢 -3.05 MB 🟢 -641 kB 🟢 -487 kB
assets/index-CS6iiBd1.js (new) 3.05 MB 🔴 +3.05 MB 🔴 +640 kB 🔴 +486 kB
assets/index-a0MfhUBu.js (new) 194 kB 🔴 +194 kB 🔴 +42.3 kB 🔴 +35.1 kB
assets/index-B0OZdl4X.js (removed) 194 kB 🟢 -194 kB 🟢 -42.3 kB 🟢 -35.2 kB
assets/index-_l8FzQXj.js (removed) 345 B 🟢 -345 B 🟢 -246 B 🟢 -236 B
assets/index-BORHme4e.js (new) 345 B 🔴 +345 B 🔴 +244 B 🔴 +237 B

Status: 3 added / 3 removed

Graph Workspace — 1.01 MB (baseline 1.01 MB) • 🔴 +7.01 kB

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-CkBz80c2.js (new) 1.01 MB 🔴 +1.01 MB 🔴 +197 kB 🔴 +150 kB
assets/GraphView-DcUZgmex.js (removed) 1.01 MB 🟢 -1.01 MB 🟢 -196 kB 🟢 -149 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-C6lVyXyc.js (new) 6.63 kB 🔴 +6.63 kB 🔴 +2.14 kB 🔴 +1.9 kB
assets/UserSelectView-D_syxeB9.js (removed) 6.63 kB 🟢 -6.63 kB 🟢 -2.14 kB 🟢 -1.89 kB

Status: 1 added / 1 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-D-qfJeLT.js (removed) 22.7 kB 🟢 -22.7 kB 🟢 -5.25 kB 🟢 -4.6 kB
assets/LegacyCreditsPanel-QTp8ekcp.js (new) 22.7 kB 🔴 +22.7 kB 🔴 +5.25 kB 🔴 +4.6 kB
assets/KeybindingPanel-DkZOjUhH.js (new) 14.8 kB 🔴 +14.8 kB 🔴 +3.57 kB 🔴 +3.13 kB
assets/KeybindingPanel-VKE_xm1u.js (removed) 14.8 kB 🟢 -14.8 kB 🟢 -3.57 kB 🟢 -3.12 kB
assets/ExtensionPanel-ChI2OLIc.js (removed) 11.1 kB 🟢 -11.1 kB 🟢 -2.62 kB 🟢 -2.29 kB
assets/ExtensionPanel-ZOxpMWNj.js (new) 11.1 kB 🔴 +11.1 kB 🔴 +2.61 kB 🔴 +2.29 kB
assets/AboutPanel-DCX_JvyU.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-GD4mbCbo.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.22 kB
assets/ServerConfigPanel-2HlNV2B-.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +2.04 kB 🔴 +1.8 kB
assets/ServerConfigPanel-DzxPDudV.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -2.04 kB 🟢 -1.8 kB
assets/UserPanel-B4_fYPJ_.js (removed) 6.88 kB 🟢 -6.88 kB 🟢 -1.79 kB 🟢 -1.57 kB
assets/UserPanel-DIBDuPl4.js (new) 6.88 kB 🔴 +6.88 kB 🔴 +1.79 kB 🔴 +1.57 kB
assets/settings-BhbWhsRg.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BIdKi-OT.js 26.2 kB 26.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Bu3OR-lX.js 24.6 kB 24.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-ByL6gy5c.js 25.4 kB 25.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CjlRFMdL.js 32.8 kB 32.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DkGwvylK.js 26.9 kB 26.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Dyd027Dx.js 24.7 kB 24.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-MzsBgiwB.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-wwBxqLH5.js 21.3 kB 21.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-xx2Yb6R2.js 23.8 kB 23.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 197 kB (baseline 198 kB) • 🟢 -897 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LazyImage.vue_vue_type_script_setup_true_lang-BDwwbVQ1.js (removed) 63 kB 🟢 -63 kB 🟢 -12.9 kB 🟢 -11.2 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-BgTtHERP.js (new) 63 kB 🔴 +63 kB 🔴 +12.9 kB 🔴 +11.2 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-Bq3AKJQj.js (new) 56 kB 🔴 +56 kB 🔴 +8.76 kB 🔴 +7.52 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-Cj_HUeNN.js (removed) 56 kB 🟢 -56 kB 🟢 -8.75 kB 🟢 -7.51 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BPllnp0J.js (new) 49 kB 🔴 +49 kB 🔴 +10.5 kB 🔴 +9.13 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-gEgGVd4X.js (removed) 49 kB 🟢 -49 kB 🟢 -10.5 kB 🟢 -9.14 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-COyO3jGg.js (removed) 10.9 kB 🟢 -10.9 kB 🟢 -2.89 kB 🟢 -2.55 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-DxTxUdmC.js (new) 10.9 kB 🔴 +10.9 kB 🔴 +2.89 kB 🔴 +2.55 kB
assets/ComfyQueueButton-BDi1glKR.js (new) 8.83 kB 🔴 +8.83 kB 🔴 +2.57 kB 🔴 +2.3 kB
assets/ComfyQueueButton-DQFVccGx.js (removed) 8.83 kB 🟢 -8.83 kB 🟢 -2.58 kB 🟢 -2.28 kB
assets/WidgetWithControl.vue_vue_type_script_setup_true_lang-BSMQOTWK.js (removed) 3.72 kB 🟢 -3.72 kB 🟢 -1.45 kB 🟢 -1.31 kB
assets/WidgetWithControl.vue_vue_type_script_setup_true_lang-DHE6qlaO.js (new) 3.72 kB 🔴 +3.72 kB 🔴 +1.45 kB 🔴 +1.31 kB
assets/WidgetButton-45ORdROZ.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +993 B 🔴 +870 B
assets/WidgetButton-ClDJzvU2.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -996 B 🟢 -894 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Cf4R1txU.js (removed) 2.14 kB 🟢 -2.14 kB 🟢 -889 B 🟢 -763 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-DT0T3wHh.js (new) 2.14 kB 🔴 +2.14 kB 🔴 +888 B 🔴 +770 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-D2sFSC5I.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -688 B 🟢 -596 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-PtsQiccS.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +685 B 🔴 +597 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-nGNzEjgJ.js (removed) 897 B 🟢 -897 B 🟢 -502 B 🟢 -434 B

Status: 9 added / 10 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-CJDq_ocr.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.57 kB
assets/keybindingService-DYK6Uy7_.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.57 kB
assets/serverConfigStore-C7L6OKtS.js (new) 2.83 kB 🔴 +2.83 kB 🔴 +907 B 🔴 +789 B
assets/serverConfigStore-vzHjAhYO.js (removed) 2.83 kB 🟢 -2.83 kB 🟢 -909 B 🟢 -797 B
assets/audioService-CKponG3U.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -961 B 🟢 -829 B
assets/audioService-CPlt36nF.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +960 B 🔴 +821 B

Status: 3 added / 3 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-DDv3nJ8D.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -650 B 🟢 -542 B
assets/audioUtils-s7Ate-gM.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +648 B 🔴 +550 B

Status: 1 added / 1 removed

Vendor & Third-Party — 9.19 MB (baseline 9.19 MB) • 🟢 -23 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-B0-E2a1W.js (removed) 3.9 MB 🟢 -3.9 MB 🟢 -848 kB 🟢 -678 kB
assets/vendor-other-CtqoBnhc.js (new) 3.9 MB 🔴 +3.9 MB 🔴 +848 kB 🔴 +678 kB
assets/vendor-three-Boac8LtY.js (new) 2.08 MB 🔴 +2.08 MB 🔴 +430 kB 🔴 +308 kB
assets/vendor-three-U-rzyCAc.js (removed) 2.08 MB 🟢 -2.08 MB 🟢 -430 kB 🟢 -308 kB
assets/vendor-primevue-8yyuhoFO.js (removed) 1.95 MB 🟢 -1.95 MB 🟢 -333 kB 🟢 -201 kB
assets/vendor-primevue-B1YbLmDP.js (new) 1.95 MB 🔴 +1.95 MB 🔴 +333 kB 🔴 +201 kB
assets/vendor-chart-CAFSFyru.js (new) 452 kB 🔴 +452 kB 🔴 +99 kB 🔴 +81 kB
assets/vendor-chart-DKN42gM5.js (removed) 452 kB 🟢 -452 kB 🟢 -99 kB 🟢 -81 kB
assets/vendor-tiptap-B8SQZ7yI.js (removed) 232 kB 🟢 -232 kB 🟢 -45.7 kB 🟢 -37.7 kB
assets/vendor-tiptap-DxCePpNw.js (new) 232 kB 🔴 +232 kB 🔴 +45.7 kB 🔴 +37.7 kB
assets/vendor-vue-B7S_YYz9.js (removed) 160 kB 🟢 -160 kB 🟢 -37 kB 🟢 -31.3 kB
assets/vendor-vue-Btw3Hy_q.js (new) 160 kB 🔴 +160 kB 🔴 +37 kB 🔴 +31.3 kB
assets/vendor-xterm-BF8peZ5_.js 420 kB 420 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

Other — 3.5 MB (baseline 3.5 MB) • 🟢 -6.06 kB

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscriptionRequiredDialogContent-CMeqx4JD.js (new) 29.3 kB 🔴 +29.3 kB 🔴 +6.5 kB 🔴 +5.64 kB
assets/SubscriptionRequiredDialogContent-FzrxE9xe.js (removed) 29.3 kB 🟢 -29.3 kB 🟢 -6.51 kB 🟢 -5.64 kB
assets/WidgetRecordAudio-6ZuNUOgj.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.24 kB 🟢 -4.63 kB
assets/WidgetRecordAudio-BIMvZOtk.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.23 kB 🔴 +4.63 kB
assets/AudioPreviewPlayer-DSAEzyUM.js (new) 13.3 kB 🔴 +13.3 kB 🔴 +3.34 kB 🔴 +2.99 kB
assets/AudioPreviewPlayer-muiHpRtT.js (removed) 13.3 kB 🟢 -13.3 kB 🟢 -3.35 kB 🟢 -2.99 kB
assets/ValueControlPopover-_sxRXvZy.js (new) 5.49 kB 🔴 +5.49 kB 🔴 +1.7 kB 🔴 +1.52 kB
assets/ValueControlPopover-1mD7tiCI.js (removed) 5.49 kB 🟢 -5.49 kB 🟢 -1.71 kB 🟢 -1.52 kB
assets/WidgetGalleria-BsYZf7R7.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.45 kB 🟢 -1.3 kB
assets/WidgetGalleria-D4c_0Nu8.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.44 kB 🔴 +1.3 kB
assets/WidgetColorPicker-CzKhnd6c.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetColorPicker-DXl_rv6y.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetImageCompare-DlNxYBJ7.js (removed) 3.18 kB 🟢 -3.18 kB 🟢 -1.1 kB 🟢 -952 B
assets/WidgetImageCompare-gJXsKU9X.js (new) 3.18 kB 🔴 +3.18 kB 🔴 +1.1 kB 🔴 +982 B
assets/WidgetTextarea-BqOpqSVn.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.22 kB 🟢 -1.07 kB
assets/WidgetTextarea-DxB76Hzn.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.21 kB 🔴 +1.08 kB
assets/WidgetMarkdown-Bf--vpLL.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.27 kB 🔴 +1.13 kB
assets/WidgetMarkdown-BWoaxPGu.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.13 kB
assets/WidgetAudioUI-C4rlifCm.js (new) 2.89 kB 🔴 +2.89 kB 🔴 +1.16 kB 🔴 +1.06 kB
assets/WidgetAudioUI-DYCJfsYY.js (removed) 2.89 kB 🟢 -2.89 kB 🟢 -1.17 kB 🟢 -1.06 kB
assets/MediaVideoTop-B297IpwP.js (removed) 2.65 kB 🟢 -2.65 kB 🟢 -1.02 kB 🟢 -870 B
assets/MediaVideoTop-Bm4APiyx.js (new) 2.65 kB 🔴 +2.65 kB 🔴 +1.01 kB 🔴 +868 B
assets/WidgetChart-Bpup_F4s.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +928 B 🔴 +819 B
assets/WidgetChart-Du6foKGb.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -931 B 🟢 -816 B
assets/WidgetInputText-BRy0a5V3.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -921 B 🟢 -859 B
assets/WidgetInputText-hr4OCWAW.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +918 B 🔴 +848 B
assets/WidgetToggleSwitch-_jRNeL89.js (removed) 1.76 kB 🟢 -1.76 kB 🟢 -833 B 🟢 -728 B
assets/WidgetToggleSwitch-DUVO6F0X.js (new) 1.76 kB 🔴 +1.76 kB 🔴 +832 B 🔴 +733 B
assets/MediaImageTop-BaBlYZTy.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -840 B 🟢 -719 B
assets/MediaImageTop-CceP_k47.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +840 B 🔴 +716 B
assets/MediaImageBottom-CbIKqoWA.js (removed) 1.55 kB 🟢 -1.55 kB 🟢 -734 B 🟢 -642 B
assets/MediaAudioBottom-BZaaBYOS.js (removed) 1.51 kB 🟢 -1.51 kB 🟢 -733 B 🟢 -644 B
assets/Media3DBottom-MX9yewqU.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -732 B 🟢 -649 B
assets/MediaVideoBottom-CAdSW3Xb.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -733 B 🟢 -646 B
assets/Media3DTop-CbKqf__j.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -764 B 🟢 -652 B
assets/Media3DTop-DZWalol3.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +762 B 🔴 +653 B
assets/MediaAudioTop-Cig_KuEt.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +738 B 🔴 +619 B
assets/MediaAudioTop-D6xQ7BTZ.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -738 B 🟢 -620 B
assets/WidgetSelect-3Y7Koqr1.js (new) 733 B 🔴 +733 B 🔴 +360 B 🔴 +313 B
assets/WidgetSelect-CqIDqyZ5.js (removed) 733 B 🟢 -733 B 🟢 -362 B 🟢 -332 B
assets/WidgetInputNumber-B7T4lMKQ.js (new) 673 B 🔴 +673 B 🔴 +345 B 🔴 +295 B
assets/WidgetInputNumber-w7gVod3e.js (removed) 673 B 🟢 -673 B 🟢 -349 B 🟢 -289 B
assets/Load3D-Dvowjsg_.js (new) 424 B 🔴 +424 B 🔴 +264 B 🔴 +222 B
assets/Load3D-oW9JXFSa.js (removed) 424 B 🟢 -424 B 🟢 -268 B 🟢 -222 B
assets/WidgetLegacy-CKnF9bTR.js (new) 364 B 🔴 +364 B 🔴 +235 B 🔴 +193 B
assets/WidgetLegacy-r91I_BZL.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -231 B
assets/commands-bTEY9Mp6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWp4HdfU.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CcfGaui5.js 14.4 kB 14.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CisfgZf5.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CkU12Foh.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CoH2DJa6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-COSt-Bjx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DalfIW5f.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DfTl0eCm.js 13.5 kB 13.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwSJL865.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bdc58rJq.js 97.1 kB 97.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C9ZJBRdI.js 81.5 kB 81.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CAL83XT3.js 84.6 kB 84.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CHLLfvpG.js 82.4 kB 82.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DDqR5EuX.js 71.3 kB 71.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DLHyaEcz.js 92.1 kB 92.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-JzWMbEh0.js 91.2 kB 91.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-O7KfJeMO.js 79.9 kB 79.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-OzGsrlqJ.js 112 kB 112 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-aW9En70v.js 260 kB 260 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BDbge6_f.js 279 kB 279 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BIckSVgU.js 273 kB 273 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BiYpVi7D.js 263 kB 263 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bw_Jitw_.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CCEXtYfM.js 243 kB 243 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CvmVDWYd.js 323 kB 323 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-D_wreoPJ.js 267 kB 267 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dz-0ZIBN.js 297 kB 297 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-VZsNmhG7.js 264 kB 264 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2Worker-GDlTeC1j.js 4.69 kB 4.69 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 21 added / 25 removed

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

Caution

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

⚠️ Outside diff range comments (1)
src/platform/assets/components/MediaAudioBottom.vue (1)

1-27: Consider extracting shared metadata display logic.

All four bottom components (MediaVideoBottom, MediaAudioBottom, Media3DBottom, and MediaImageBottom) now share nearly identical template structures for displaying formattedTime and size/dimensions. Consider extracting the common metadata row into a shared component or composable to reduce duplication.

Example shared component approach
<!-- MediaMetadataRow.vue -->
<template>
  <div class="flex gap-1.5 text-xs text-zinc-400">
    <span v-if="formattedTime">{{ formattedTime }}</span>
    <slot />
  </div>
</template>

<script setup lang="ts">
defineProps<{
  formattedTime?: string
}>()
</script>

Then each bottom component would use:

<MediaMetadataRow :formatted-time="formattedTime">
  <span v-if="asset.size">{{ formatSize(asset.size) }}</span>
</MediaMetadataRow>
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 10feb1f and 195ae39.

📒 Files selected for processing (6)
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
🧰 Additional context used
📓 Path-based instructions (9)
src/**/*.vue

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

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3.5+ with TypeScript in .vue files, exclusively using Composition API with <script setup lang="ts"> syntax
Use Tailwind 4 for styling in Vue components; avoid <style> blocks
Name Vue components using PascalCase (e.g., MenuHamburger.vue)
Use Vue 3.5 TypeScript-style default prop declaration with reactive props destructuring; do not use withDefaults or runtime props declaration
Prefer computed() over ref with watch when deriving values
Prefer useModel over separately defining prop and emit for two-way binding
Use vue-i18n in composition API for string literals; place new translation entries in src/locales/en/main.json
Use cn() utility function from @/utils/tailwindUtil for merging Tailwind class names; do not use :class="[]" syntax
Do not use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Do not use !important or the ! important prefix for Tailwind classes; find and correct interfering !important classes instead
Avoid new usage of PrimeVue components; use VueUse, shadcn/vue, or Reka UI instead
Leverage VueUse functions for performance-enhancing styles in Vue components
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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
🧠 Learnings (10)
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Chips component with AutoComplete with multiple enabled

Applied to files:

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.vue : Use `cn()` utility function from `@/utils/tailwindUtil` for merging Tailwind class names; do not use `:class="[]"` syntax

Applied to files:

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

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-16T22:26:49.463Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.vue:17-17
Timestamp: 2025-12-16T22:26:49.463Z
Learning: In Vue 3.5+ with <script setup>, when using defineProps<Props>() with partial destructuring (e.g., const { as = 'button', class: customClass = '' } = defineProps<Props>() ), props that are not destructured (e.g., variant, size) stay accessible by name in the template scope. This pattern is valid: you can destructure only a subset of props for convenience while referencing the remaining props directly in template expressions. Apply this guideline to Vue components across the codebase (all .vue files).

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-22T21:36:08.369Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/platform/cloud/subscription/components/PricingTable.vue:185-201
Timestamp: 2025-12-22T21:36:08.369Z
Learning: In Vue components, avoid creating single-use variants for common UI components (e.g., Button and other shared components). Aim for reusable variants that cover multiple use cases. It’s acceptable to temporarily mix variant props with inline Tailwind classes when a styling need is unique to one place, but plan and consolidate into shared, reusable variants as patterns emerge across the codebase.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-18T02:07:38.870Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7598
File: src/components/sidebar/tabs/AssetsSidebarTab.vue:131-131
Timestamp: 2025-12-18T02:07:38.870Z
Learning: Tailwind CSS v4 safe utilities (e.g., items-center-safe, justify-*-safe, place-*-safe) are allowed in Vue components under src/ and in story files. Do not flag these specific safe variants as invalid when reviewing code in src/**/*.vue or related stories.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-18T21:15:46.862Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7603
File: src/components/queue/QueueOverlayHeader.vue:49-59
Timestamp: 2025-12-18T21:15:46.862Z
Learning: In the ComfyUI_frontend repository, for Vue components, do not add aria-label to buttons that have visible text content (e.g., buttons containing <span> text). The visible text provides the accessible name. Use aria-label only for elements without visible labels (e.g., icon-only buttons). If a button has no visible label, provide a clear aria-label or associate with an aria-labelledby describing its action.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
📚 Learning: 2025-12-21T01:06:02.786Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/components/graph/selectionToolbox/ColorPickerButton.vue:15-18
Timestamp: 2025-12-21T01:06:02.786Z
Learning: In Comfy-Org/ComfyUI_frontend, in Vue component files, when a filled icon is required (e.g., 'pi pi-circle-fill'), you may mix PrimeIcons with Lucide icons since Lucide lacks filled variants. This mixed usage is acceptable when one icon library does not provide an equivalent filled icon. Apply consistently across Vue components in the src directory where icons are used, and document the rationale when a mixed approach is chosen.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: test
  • GitHub Check: collect
  • GitHub Check: lint-and-format
  • GitHub Check: setup
🔇 Additional comments (10)
src/platform/assets/components/MediaTitle.vue (2)

2-7: Semantic change from heading to paragraph is appropriate for card context.

The change from h3 to p removes this element from the document heading hierarchy. This is typically appropriate for media asset cards where the title is presentational rather than a true document section heading. The implementation is clean:

  • line-clamp-2 with title attribute ensures truncated filenames are still accessible via tooltip
  • break-all is the right choice for technical filenames that may lack natural word boundaries
  • text-base-foreground follows the semantic theming guidelines

11-13: Excellent use of Vue 3.5 reactive props destructuring.

The props declaration correctly follows the Vue 3.5 pattern as specified in the coding guidelines. The simplified approach removing computed properties in favor of direct prop usage makes the component cleaner and easier to maintain.

src/platform/assets/components/MediaVideoBottom.vue (1)

1-27: LGTM!

The component correctly follows Vue 3.5 patterns with TypeScript-style prop declaration and destructuring. The optional formattedTime prop is well-integrated, and the conditional rendering logic is clean. Layout uses Tailwind CSS inline classes appropriately.

src/platform/assets/components/Media3DBottom.vue (1)

1-27: LGTM!

The implementation is consistent with the other bottom components. Vue 3.5 patterns and Tailwind styling are correctly applied.

src/platform/assets/components/MediaImageBottom.vue (1)

1-28: LGTM!

The component correctly adapts the shared pattern for images by displaying dimensions instead of file size. Vue 3.5 patterns and conditional rendering are properly implemented.

src/platform/assets/components/MediaAssetCard.vue (4)

51-59: LGTM!

The action overlay visibility logic correctly includes the selected state, improving UX by showing actions when an asset is selected. Button components are used appropriately.


68-80: LGTM!

The loading skeleton correctly mirrors the new two-column layout structure, providing consistent visual feedback during loading states.


85-109: LGTM!

The two-column layout is well-structured. The formatted-time prop is correctly passed to child components, and the output count button appropriately uses visible text for accessibility. The flex-shrink-0 on the right column ensures the button maintains its size.


275-279: LGTM!

The updated computed correctly includes the selected state, ensuring action overlays remain visible on selected cards. The logic properly handles the prop reference without .value since it's accessed directly from props.

src/platform/assets/components/MediaAudioBottom.vue (1)

1-27: LGTM!

The component correctly follows the same pattern as the other bottom components. Vue 3.5 patterns and Tailwind styling are properly applied.

@viva-jinyi viva-jinyi assigned viva-jinyi and unassigned viva-jinyi Jan 6, 2026
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Fix all issues with AI Agents
In @src/platform/assets/components/MediaAssetCard.vue:
- Around line 82-85: Replace the hard-coded Tailwind color class used in the
MediaAssetCard component: change the usage of "text-zinc-400" on the div that
renders formattedDuration/metaInfo to the appropriate semantic token from our
theme (e.g., "text-muted-foreground" or the project's approved semantic class);
update the class string in MediaAssetCard.vue (the div containing
formattedDuration and metaInfo) so it uses the semantic token instead of the
direct color class to keep styling consistent with theme tokens.
- Around line 46-53: The two icon-only Button components inside
MediaAssetCard.vue (the ones calling handleZoomClick and handleContextMenu
within the IconGroup) need aria-label attributes for screen readers; update
those Button tags to include appropriate aria-label bindings that use new i18n
keys (e.g., mediaAsset.zoom and mediaAsset.moreOptions) and then add the
corresponding entries to src/locales/en/main.json so the labels are localized
and available to the template.
📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 195ae39 and d502f03.

📒 Files selected for processing (5)
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaVideoBottom.vue
💤 Files with no reviewable changes (4)
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaVideoBottom.vue
🧰 Additional context used
📓 Path-based instructions (9)
src/**/*.vue

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

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

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

Files:

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

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/assets/components/MediaAssetCard.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/assets/components/MediaAssetCard.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3.5+ with TypeScript in .vue files, exclusively using Composition API with <script setup lang="ts"> syntax
Use Tailwind 4 for styling in Vue components; avoid <style> blocks
Name Vue components using PascalCase (e.g., MenuHamburger.vue)
Use Vue 3.5 TypeScript-style default prop declaration with reactive props destructuring; do not use withDefaults or runtime props declaration
Prefer computed() over ref with watch when deriving values
Prefer useModel over separately defining prop and emit for two-way binding
Use vue-i18n in composition API for string literals; place new translation entries in src/locales/en/main.json
Use cn() utility function from @/utils/tailwindUtil for merging Tailwind class names; do not use :class="[]" syntax
Do not use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Do not use !important or the ! important prefix for Tailwind classes; find and correct interfering !important classes instead
Avoid new usage of PrimeVue components; use VueUse, shadcn/vue, or Reka UI instead
Leverage VueUse functions for performance-enhancing styles in Vue components
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/assets/components/MediaAssetCard.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

  • src/platform/assets/components/MediaAssetCard.vue
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • src/platform/assets/components/MediaAssetCard.vue
🧠 Learnings (17)
📚 Learning: 2025-12-18T21:15:46.862Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7603
File: src/components/queue/QueueOverlayHeader.vue:49-59
Timestamp: 2025-12-18T21:15:46.862Z
Learning: In the ComfyUI_frontend repository, for Vue components, do not add aria-label to buttons that have visible text content (e.g., buttons containing <span> text). The visible text provides the accessible name. Use aria-label only for elements without visible labels (e.g., icon-only buttons). If a button has no visible label, provide a clear aria-label or associate with an aria-labelledby describing its action.

Applied to files:

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.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 : Implement computed() for derived state in Vue 3 Composition API

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.vue : Leverage VueUse functions for performance-enhancing styles in Vue components

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.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/platform/assets/components/MediaAssetCard.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 Suspense for async components

Applied to files:

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

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-16T22:26:49.463Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.vue:17-17
Timestamp: 2025-12-16T22:26:49.463Z
Learning: In Vue 3.5+ with <script setup>, when using defineProps<Props>() with partial destructuring (e.g., const { as = 'button', class: customClass = '' } = defineProps<Props>() ), props that are not destructured (e.g., variant, size) stay accessible by name in the template scope. This pattern is valid: you can destructure only a subset of props for convenience while referencing the remaining props directly in template expressions. Apply this guideline to Vue components across the codebase (all .vue files).

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-22T21:36:08.369Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/platform/cloud/subscription/components/PricingTable.vue:185-201
Timestamp: 2025-12-22T21:36:08.369Z
Learning: In Vue components, avoid creating single-use variants for common UI components (e.g., Button and other shared components). Aim for reusable variants that cover multiple use cases. It’s acceptable to temporarily mix variant props with inline Tailwind classes when a styling need is unique to one place, but plan and consolidate into shared, reusable variants as patterns emerge across the codebase.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-18T02:07:38.870Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7598
File: src/components/sidebar/tabs/AssetsSidebarTab.vue:131-131
Timestamp: 2025-12-18T02:07:38.870Z
Learning: Tailwind CSS v4 safe utilities (e.g., items-center-safe, justify-*-safe, place-*-safe) are allowed in Vue components under src/ and in story files. Do not flag these specific safe variants as invalid when reviewing code in src/**/*.vue or related stories.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-21T01:06:02.786Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/components/graph/selectionToolbox/ColorPickerButton.vue:15-18
Timestamp: 2025-12-21T01:06:02.786Z
Learning: In Comfy-Org/ComfyUI_frontend, in Vue component files, when a filled icon is required (e.g., 'pi pi-circle-fill'), you may mix PrimeIcons with Lucide icons since Lucide lacks filled variants. This mixed usage is acceptable when one icon library does not provide an equivalent filled icon. Apply consistently across Vue components in the src directory where icons are used, and document the rationale when a mixed approach is chosen.

Applied to files:

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

2-18: LGTM!

The root element properly implements button semantics with role="button", dynamic aria-label using i18n, and conditional tabindex based on loading state. Event handling with .stop and .prevent modifiers is appropriate for card interactions.


139-150: LGTM!

The defineAsyncComponent pattern for lazy-loading media type-specific components is well-structured and appropriate for code splitting. The fallback to image component in getTopComponent provides a sensible default.


152-168: LGTM!

Props are defined using Vue 3.5 TypeScript-style with reactive destructuring, following the coding guidelines. All props are appropriately typed as optional.


206-222: LGTM!

The adaptedAsset computed property cleanly adapts the new AssetItem schema to the legacy format expected by existing media components. The conditional duration parsing handles undefined values correctly.


273-298: LGTM!

Event handlers are concise and follow proper patterns. The whenever hook from VueUse elegantly handles context menu coordination between multiple cards.


197-199: The type cast is safe and unnecessary—remove it or improve the type definition upstream.

The getMediaTypeFromFilename function always returns one of 'image', 'video', 'audio', or '3D', which exactly matches the MediaKind union. The function implementation guarantees it cannot return any value outside this set, making the as MediaKind cast safe. However, the cast is redundant—ideally, the utility function should be typed to return MediaKind directly to avoid the cast entirely.

Likely an incorrect or invalid review comment.

Comment on lines +34 to +46
@view="handleZoomClick"
@download="actions.downloadAsset()"
@video-playing-state-changed="isVideoPlaying = $event"
@video-controls-changed="showVideoControls = $event"
@image-loaded="handleImageLoaded"
Copy link
Contributor

Choose a reason for hiding this comment

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

It still feels wrong to me to have these handlers always present when only a subset would ever be active at a time.

@DrJKL DrJKL self-assigned this Jan 6, 2026
DrJKL
DrJKL previously approved these changes Jan 6, 2026
Copy link
Contributor

@DrJKL DrJKL left a comment

Choose a reason for hiding this comment

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

Looking cleaner, I like it.
Will the Top components get removed next?

Left all optional comments, though I'd really like the aria-labels and semantic token ones that the rabbit beat me to.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 40dcbe5 and 6bad040.

📒 Files selected for processing (7)
  • src/locales/en/main.json
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaTitle.vue
  • src/platform/assets/components/MediaVideoBottom.vue
💤 Files with no reviewable changes (4)
  • src/platform/assets/components/MediaAudioBottom.vue
  • src/platform/assets/components/Media3DBottom.vue
  • src/platform/assets/components/MediaImageBottom.vue
  • src/platform/assets/components/MediaVideoBottom.vue
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{ts,tsx,vue,js,jsx,json,css}

📄 CodeRabbit inference engine (AGENTS.md)

Apply Prettier formatting with 2-space indentation, single quotes, no trailing semicolons, and 80-character line width

Files:

  • src/locales/en/main.json
  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

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

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3.5+ with TypeScript in .vue files, exclusively using Composition API with <script setup lang="ts"> syntax
Use Tailwind 4 for styling in Vue components; avoid <style> blocks
Name Vue components using PascalCase (e.g., MenuHamburger.vue)
Use Vue 3.5 TypeScript-style default prop declaration with reactive props destructuring; do not use withDefaults or runtime props declaration
Prefer computed() over ref with watch when deriving values
Prefer useModel over separately defining prop and emit for two-way binding
Use vue-i18n in composition API for string literals; place new translation entries in src/locales/en/main.json
Use cn() utility function from @/utils/tailwindUtil for merging Tailwind class names; do not use :class="[]" syntax
Do not use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Do not use !important or the ! important prefix for Tailwind classes; find and correct interfering !important classes instead
Avoid new usage of PrimeVue components; use VueUse, shadcn/vue, or Reka UI instead
Leverage VueUse functions for performance-enhancing styles in Vue components
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/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,tsx,vue}: Use TypeScript exclusively; do not write new JavaScript code
Use sorted and grouped imports organized by plugin/source
Enforce ESLint rules including Vue + TypeScript rules, disallow floating promises, disallow unused imports, and restrict i18n raw text in templates
Do not use any type or as any type assertions; fix the underlying type issue instead
Write code that is expressive and self-documenting; avoid redundant comments and clean as you go
Keep functions short and functional; minimize nesting and follow the arrow anti-pattern
Avoid mutable state; prefer immutability and assignment at point of declaration
Use function declarations instead of function expressions when possible
Use es-toolkit for utility functions
Implement proper error handling in code

Files:

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

Applied to files:

  • src/locales/en/main.json
📚 Learning: 2025-12-18T21:15:46.862Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7603
File: src/components/queue/QueueOverlayHeader.vue:49-59
Timestamp: 2025-12-18T21:15:46.862Z
Learning: In the ComfyUI_frontend repository, for Vue components, do not add aria-label to buttons that have visible text content (e.g., buttons containing <span> text). The visible text provides the accessible name. Use aria-label only for elements without visible labels (e.g., icon-only buttons). If a button has no visible label, provide a clear aria-label or associate with an aria-labelledby describing its action.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
📚 Learning: 2025-12-11T03:55:57.926Z
Learnt from: simula-r
Repo: Comfy-Org/ComfyUI_frontend PR: 7252
File: src/renderer/extensions/vueNodes/components/ImagePreview.vue:151-158
Timestamp: 2025-12-11T03:55:57.926Z
Learning: In src/renderer/extensions/vueNodes/components/ImagePreview.vue and LGraphNode.vue, keyboard navigation for image galleries should respond to node-level focus (via keyEvent injection from LGraphNode), not require focus within the image preview wrapper itself. This allows users to navigate the gallery with arrow keys immediately when the node is focused/selected.

Applied to files:

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

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.vue : Do not use the `dark:` Tailwind variant; use semantic values from the `style.css` theme instead (e.g., `bg-node-component-surface`)

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-01T23:41:16.238Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7084
File: src/renderer/extensions/vueNodes/components/SlotConnectionDot.vue:23-26
Timestamp: 2025-12-01T23:41:16.238Z
Learning: Tailwind CSS automatically sets `content: ""` for `::before` and `::after` pseudo-elements when using the `before:` and `after:` variants. No explicit `before:content-['']` or `after:content-['']` is needed.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.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/platform/assets/components/MediaAssetCard.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/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-18T02:07:38.870Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7598
File: src/components/sidebar/tabs/AssetsSidebarTab.vue:131-131
Timestamp: 2025-12-18T02:07:38.870Z
Learning: Tailwind CSS v4 safe utilities (e.g., items-center-safe, justify-*-safe, place-*-safe) are allowed in Vue components under src/ and in story files. Do not flag these specific safe variants as invalid when reviewing code in src/**/*.vue or related stories.

Applied to files:

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.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 : Implement computed() for derived state in Vue 3 Composition API

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-21T06:04:12.562Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-21T06:04:12.562Z
Learning: Applies to **/*.vue : Leverage VueUse functions for performance-enhancing styles in Vue components

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

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

Applied to files:

  • src/platform/assets/components/MediaAssetCard.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/platform/assets/components/MediaAssetCard.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 Suspense for async components

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
📚 Learning: 2025-12-16T22:26:49.463Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7537
File: src/components/ui/button/Button.vue:17-17
Timestamp: 2025-12-16T22:26:49.463Z
Learning: In Vue 3.5+ with <script setup>, when using defineProps<Props>() with partial destructuring (e.g., const { as = 'button', class: customClass = '' } = defineProps<Props>() ), props that are not destructured (e.g., variant, size) stay accessible by name in the template scope. This pattern is valid: you can destructure only a subset of props for convenience while referencing the remaining props directly in template expressions. Apply this guideline to Vue components across the codebase (all .vue files).

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
📚 Learning: 2025-12-22T21:36:08.369Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/platform/cloud/subscription/components/PricingTable.vue:185-201
Timestamp: 2025-12-22T21:36:08.369Z
Learning: In Vue components, avoid creating single-use variants for common UI components (e.g., Button and other shared components). Aim for reusable variants that cover multiple use cases. It’s acceptable to temporarily mix variant props with inline Tailwind classes when a styling need is unique to one place, but plan and consolidate into shared, reusable variants as patterns emerge across the codebase.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
📚 Learning: 2025-12-11T12:25:15.470Z
Learnt from: christian-byrne
Repo: Comfy-Org/ComfyUI_frontend PR: 7358
File: src/components/dialog/content/signin/SignUpForm.vue:45-54
Timestamp: 2025-12-11T12:25:15.470Z
Learning: This repository uses CI automation to format code (pnpm format). Do not include manual formatting suggestions in code reviews for Comfy-Org/ComfyUI_frontend. If formatting issues are detected, rely on the CI formatter or re-run pnpm format. Focus reviews on correctness, readability, performance, accessibility, and maintainability rather than style formatting.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
📚 Learning: 2025-12-21T01:06:02.786Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7649
File: src/components/graph/selectionToolbox/ColorPickerButton.vue:15-18
Timestamp: 2025-12-21T01:06:02.786Z
Learning: In Comfy-Org/ComfyUI_frontend, in Vue component files, when a filled icon is required (e.g., 'pi pi-circle-fill'), you may mix PrimeIcons with Lucide icons since Lucide lacks filled variants. This mixed usage is acceptable when one icon library does not provide an equivalent filled icon. Apply consistently across Vue components in the src directory where icons are used, and document the rationale when a mixed approach is chosen.

Applied to files:

  • src/platform/assets/components/MediaAssetCard.vue
  • src/platform/assets/components/MediaTitle.vue
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (11)
  • GitHub Check: playwright-tests-chromium-sharded (5, 8)
  • GitHub Check: playwright-tests-chromium-sharded (7, 8)
  • GitHub Check: playwright-tests-chromium-sharded (6, 8)
  • GitHub Check: playwright-tests-chromium-sharded (4, 8)
  • GitHub Check: playwright-tests-chromium-sharded (8, 8)
  • GitHub Check: playwright-tests-chromium-sharded (1, 8)
  • GitHub Check: playwright-tests-chromium-sharded (3, 8)
  • GitHub Check: playwright-tests-chromium-sharded (2, 8)
  • GitHub Check: playwright-tests (chromium-2x)
  • GitHub Check: playwright-tests (mobile-chrome)
  • GitHub Check: playwright-tests (chromium-0.5x)
🔇 Additional comments (5)
src/platform/assets/components/MediaTitle.vue (1)

1-14: LGTM!

The simplified component follows Vue 3.5+ conventions correctly with TypeScript-style props definition. The line-clamp-2 with break-all properly handles long filenames, and the semantic color token text-base-foreground aligns with theme guidelines.

src/locales/en/main.json (1)

2376-2377: LGTM!

The new localization keys zoom and moreOptions correctly support the accessible labels for the icon-only action buttons in MediaAssetCard.vue. Based on learnings, only the English locale file needs manual updates.

src/platform/assets/components/MediaAssetCard.vue (3)

135-168: Good use of async components and composition patterns.

The use of defineAsyncComponent for lazy-loading media type components is appropriate for performance. The component mapping pattern in getTopComponent is clean and extensible.


219-277: Well-structured computed properties.

The fileName, metaInfo, and showActionsOverlay computed properties follow best practices:

  • fileName extracts from utility function cleanly
  • metaInfo handles different file kinds with appropriate fallbacks
  • showActionsOverlay consolidates the display logic for hover, selected, and playing states

2-26: Proper accessibility implementation.

The container element correctly implements:

  • role="button" for semantic meaning
  • Dynamic aria-label with i18n for both loaded and loading states
  • Conditional tabindex based on loading state
  • Semantic color tokens for styling

@viva-jinyi viva-jinyi force-pushed the feat/media-asset-card-tweak branch 3 times, most recently from 87cda9f to 2085cd3 Compare January 8, 2026 00:14
cn(
'flex justify-center items-center shrink-0 outline-hidden border-none p-0 rounded-lg bg-secondary-background shadow-sm transition-all duration-200 cursor-pointer'
'flex justify-center items-center shrink-0 outline-hidden border-none p-0 rounded-lg shadow-sm transition-all duration-200 cursor-pointer',
backgroundClass || 'bg-secondary-background'
Copy link
Contributor

Choose a reason for hiding this comment

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

Nit: cn has an implicit "last item takes precedence", so if you put the background in the base classes and follow up with an optional class that class would apply iff it isn't falsy.

Copy link
Member Author

Choose a reason for hiding this comment

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

I'll fix it in other PR

@viva-jinyi viva-jinyi merged commit dc64e16 into main Jan 8, 2026
28 checks passed
@viva-jinyi viva-jinyi deleted the feat/media-asset-card-tweak branch January 8, 2026 01:21
@viva-jinyi viva-jinyi mentioned this pull request Jan 8, 2026
Copy link
Collaborator

@comfydesigner comfydesigner left a comment

Choose a reason for hiding this comment

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

Aside from the hover color of the output count button matching the hover color of the card, everything else looks good to me

christian-byrne pushed a commit that referenced this pull request Jan 8, 2026
## Summary

<!-- One sentence describing what changed and why. -->
#7871
#7858
I refactored the code based on the reviews I received on those two PRs.

## Changes

- **What**: 

1. Updated IconGroup to address the backgroundClass handling.
2. Replaced text-gold-600 with a semantic color token.
3. Replaced PrimeVue Icon with a lucide icon.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-7893-Refactor-code-reivew-2e26d73d365081e68a44e89ed1163062)
by [Unito](https://www.unito.io)

---------

Co-authored-by: Alexander Brown <drjkl@comfy.org>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: GitHub Action <action@github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants