Skip to content

feat: add maxColumns prop to VirtualGrid for responsive column capping#8210

Merged
DrJKL merged 1 commit intomainfrom
drjkl/virtualgrid-improvements
Jan 21, 2026
Merged

feat: add maxColumns prop to VirtualGrid for responsive column capping#8210
DrJKL merged 1 commit intomainfrom
drjkl/virtualgrid-improvements

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Jan 21, 2026

Summary

Add maxColumns prop to VirtualGrid for responsive column capping.

Changes

  • VirtualGrid: Add maxColumns prop to cap grid columns; refactor inline styles to Tailwind classes; extract spacer height computation to helper function
  • AssetGrid: Use useBreakpoints to set responsive maxColumns (1-5 based on Tailwind breakpoints)

Review Focus

  • maxColumns behavior when Infinity vs finite: does gridTemplateColumns override work correctly?
  • Tailwind scrollbar classes replacing scoped CSS

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Jan 21, 2026

📝 Walkthrough

Walkthrough

VirtualGrid.vue refactored to use computed spacer styles instead of inline height calculations, with a new maxColumns prop for column limiting and updated prop typing. AssetGrid.vue integrated responsive breakpoint logic using VueUse to compute column counts based on screen size.

Changes

Cohort / File(s) Summary
VirtualGrid rendering refactor
src/components/common/VirtualGrid.vue
Replaced inline height calculations with top/bottom spacer divs using computed styles; introduced maxColumns prop to cap columns dynamically; updated gridStyle prop type from Partial<CSSProperties> to CSSProperties; added mergedGridStyle for conditional grid layout application; reorganized container and item wrapper structure with transition classes
AssetGrid responsive breakpoints
src/platform/assets/components/AssetGrid.vue
Integrated VueUse breakpoint utilities (breakpointsTailwind, useBreakpoints) to compute maxColumns across responsive breakpoints (5, 4, 3, 2, 1 columns); computed responsive breakpoint booleans (2xl, xl, lg, md); extended gridStyle with additional padding property; internal logic additions without public API changes

Possibly related PRs

Suggested reviewers

  • AustinMroz
  • viva-jinyi
  • PabloWiedemann

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 21, 2026

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 01/21/2026, 06:17:35 AM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Jan 21, 2026

🎭 Playwright Tests: ✅ Passed

Results: 507 passed, 0 failed, 0 flaky, 8 skipped (Total: 515)

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

@DrJKL DrJKL force-pushed the drjkl/virtualgrid-improvements branch from 99ac511 to 0103c93 Compare January 21, 2026 06:16
@github-actions
Copy link

github-actions bot commented Jan 21, 2026

Bundle Size Report

Summary

  • Raw size: 21.4 MB baseline 21.4 MB — 🔴 +857 B
  • Gzip: 4.44 MB baseline 4.44 MB — 🔴 +360 B
  • Brotli: 3.29 MB baseline 3.29 MB — 🔴 +254 B
  • Bundles: 155 current • 155 baseline • 65 added / 65 removed

Category Glance
Data & Services 🔴 +857 B (3.05 MB) · Vendor & Third-Party ⚪ 0 B (10.4 MB) · Other ⚪ 0 B (6.28 MB) · Graph Workspace ⚪ 0 B (1.02 MB) · Panels & Settings ⚪ 0 B (430 kB) · Views & Navigation ⚪ 0 B (80.7 kB) · + 5 more

Per-category breakdown
App Entry Points — 22.4 kB (baseline 22.4 kB) • ⚪ 0 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CylsvibX.js (new) 22.4 kB 🔴 +22.4 kB 🔴 +6.74 kB 🔴 +5.92 kB
assets/index-De7tgzGl.js (removed) 22.4 kB 🟢 -22.4 kB 🟢 -6.74 kB 🟢 -5.91 kB

Status: 1 added / 1 removed

Graph Workspace — 1.02 MB (baseline 1.02 MB) • ⚪ 0 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-Cn7As3-M.js (new) 1.02 MB 🔴 +1.02 MB 🔴 +201 kB 🔴 +153 kB
assets/GraphView-GJItB-k5.js (removed) 1.02 MB 🟢 -1.02 MB 🟢 -201 kB 🟢 -153 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CloudSurveyView-BsX_S2f-.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -3.6 kB 🟢 -3.05 kB
assets/CloudSurveyView-ByPYULbt.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +3.61 kB 🔴 +3.05 kB
assets/CloudLoginView-BIEEeH65.js (removed) 11.8 kB 🟢 -11.8 kB 🟢 -3.09 kB 🟢 -2.72 kB
assets/CloudLoginView-CS3hCMH8.js (new) 11.8 kB 🔴 +11.8 kB 🔴 +3.09 kB 🔴 +2.71 kB
assets/UserCheckView-Bxo4XB2W.js (removed) 10.5 kB 🟢 -10.5 kB 🟢 -2.44 kB 🟢 -2.13 kB
assets/UserCheckView-CrIr00ne.js (new) 10.5 kB 🔴 +10.5 kB 🔴 +2.44 kB 🔴 +2.13 kB
assets/CloudLayoutView-BEm8YWXU.js (new) 8.54 kB 🔴 +8.54 kB 🔴 +2.25 kB 🔴 +1.96 kB
assets/CloudLayoutView-CECvRYdg.js (removed) 8.54 kB 🟢 -8.54 kB 🟢 -2.25 kB 🟢 -1.96 kB
assets/CloudSignupView-DF_DbLBO.js (removed) 8.18 kB 🟢 -8.18 kB 🟢 -2.33 kB 🟢 -2.02 kB
assets/CloudSignupView-TWqGfLbs.js (new) 8.18 kB 🔴 +8.18 kB 🔴 +2.33 kB 🔴 +2.03 kB
assets/CloudForgotPasswordView-D7nZUuHA.js (new) 6.26 kB 🔴 +6.26 kB 🔴 +1.93 kB 🔴 +1.69 kB
assets/CloudForgotPasswordView-S22zjYs3.js (removed) 6.26 kB 🟢 -6.26 kB 🟢 -1.92 kB 🟢 -1.69 kB
assets/UserSelectView-9s0nw0eO.js (removed) 5.28 kB 🟢 -5.28 kB 🟢 -1.76 kB 🟢 -1.57 kB
assets/UserSelectView-DH1y9FeK.js (new) 5.28 kB 🔴 +5.28 kB 🔴 +1.76 kB 🔴 +1.57 kB
assets/CloudSubscriptionRedirectView-B2-dqQWA.js (new) 5.27 kB 🔴 +5.27 kB 🔴 +1.73 kB 🔴 +1.54 kB
assets/CloudSubscriptionRedirectView-DH-9uUdq.js (removed) 5.27 kB 🟢 -5.27 kB 🟢 -1.73 kB 🟢 -1.54 kB
assets/CloudAuthTimeoutView-BlPsILTT.js (new) 5.24 kB 🔴 +5.24 kB 🔴 +1.71 kB 🔴 +1.48 kB
assets/CloudAuthTimeoutView-DXAlZGX2.js (removed) 5.24 kB 🟢 -5.24 kB 🟢 -1.71 kB 🟢 -1.49 kB
assets/CloudSorryContactSupportView-41RMhsFA.js 1.97 kB 1.97 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/layout-DT-CUejm.js 500 B 500 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 9 added / 9 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/LegacyCreditsPanel-Dc16Ol7T.js (new) 23.8 kB 🔴 +23.8 kB 🔴 +5.95 kB 🔴 +5.24 kB
assets/LegacyCreditsPanel-KcYBtApj.js (removed) 23.8 kB 🟢 -23.8 kB 🟢 -5.95 kB 🟢 -5.23 kB
assets/SubscriptionPanel-BeJTeMqz.js (new) 20.6 kB 🔴 +20.6 kB 🔴 +5 kB 🔴 +4.38 kB
assets/SubscriptionPanel-DqeU3Kxi.js (removed) 20.6 kB 🟢 -20.6 kB 🟢 -4.99 kB 🟢 -4.39 kB
assets/KeybindingPanel-C9EyquxY.js (removed) 14.2 kB 🟢 -14.2 kB 🟢 -3.74 kB 🟢 -3.32 kB
assets/KeybindingPanel-CauMUD3x.js (new) 14.2 kB 🔴 +14.2 kB 🔴 +3.73 kB 🔴 +3.32 kB
assets/AboutPanel-C5S0mlfj.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.68 kB 🟢 -2.42 kB
assets/AboutPanel-uFtYVhqg.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.68 kB 🔴 +2.42 kB
assets/ExtensionPanel-CTxuHNH3.js (removed) 10.2 kB 🟢 -10.2 kB 🟢 -2.71 kB 🟢 -2.4 kB
assets/ExtensionPanel-Lu4Ufdtt.js (new) 10.2 kB 🔴 +10.2 kB 🔴 +2.71 kB 🔴 +2.4 kB
assets/ServerConfigPanel-9Kkly9Qv.js (new) 7.23 kB 🔴 +7.23 kB 🔴 +2.16 kB 🔴 +1.94 kB
assets/ServerConfigPanel-BSANaOFo.js (removed) 7.23 kB 🟢 -7.23 kB 🟢 -2.16 kB 🟢 -1.94 kB
assets/UserPanel-BHUuEhTg.js (new) 6.58 kB 🔴 +6.58 kB 🔴 +1.91 kB 🔴 +1.67 kB
assets/UserPanel-Yof_j-qN.js (removed) 6.58 kB 🟢 -6.58 kB 🟢 -1.9 kB 🟢 -1.67 kB
assets/cloudRemoteConfig-B1nIDqs6.js (new) 1.82 kB 🔴 +1.82 kB 🔴 +768 B 🔴 +665 B
assets/cloudRemoteConfig-BPeGavCg.js (removed) 1.82 kB 🟢 -1.82 kB 🟢 -768 B 🟢 -655 B
assets/remoteConfig-BEkdBLxH.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/remoteConfig-D_gf6SLU.js 188 B 188 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-6DVADt2n.js 34.3 kB 34.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-B0j03ezr.js 38.3 kB 38.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BHe-AJJN.js 29.6 kB 29.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BT2lfy0S.js 29.5 kB 29.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-Cp0lF2Mp.js 31.2 kB 31.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CwdesOpm.js 32.1 kB 32.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D3SeHgho.js 28.6 kB 28.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-D42m_JEJ.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-FF_vLB0C.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-reUMVWRn.js 30.4 kB 30.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-s7kHNBdQ.js 28.9 kB 28.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 removed

User & Accounts — 3.94 kB (baseline 3.94 kB) • ⚪ 0 B

Authentication, profile, and account management bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/auth-b2opw4pv.js (removed) 3.54 kB 🟢 -3.54 kB 🟢 -1.23 kB 🟢 -1.06 kB
assets/auth-gHZxcM21.js (new) 3.54 kB 🔴 +3.54 kB 🔴 +1.24 kB 🔴 +1.06 kB
assets/firebaseAuthStore-C18lrypx.js (new) 217 B 🔴 +217 B 🔴 +138 B 🔴 +122 B
assets/firebaseAuthStore-Ij3h5VHK.js (removed) 217 B 🟢 -217 B 🟢 -138 B 🟢 -122 B
assets/auth-BIwBGXC2.js (removed) 178 B 🟢 -178 B 🟢 -141 B 🟢 -129 B
assets/auth-EaqPBsb5.js (new) 178 B 🔴 +178 B 🔴 +142 B 🔴 +131 B

Status: 3 added / 3 removed

Editors & Dialogs — 2.8 kB (baseline 2.8 kB) • ⚪ 0 B

Modals, dialogs, drawers, and in-app editors

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useSubscriptionDialog-BF1hR5GI.js (new) 2.62 kB 🔴 +2.62 kB 🔴 +1.24 kB 🔴 +1.09 kB
assets/useSubscriptionDialog-DY-GuC5Y.js (removed) 2.62 kB 🟢 -2.62 kB 🟢 -1.24 kB 🟢 -1.09 kB
assets/useSubscriptionDialog-C3u2AKmk.js (removed) 179 B 🟢 -179 B 🟢 -110 B 🟢 -103 B
assets/useSubscriptionDialog-dfsGILgC.js (new) 179 B 🔴 +179 B 🔴 +110 B 🔴 +96 B

Status: 2 added / 2 removed

UI Components — 32.8 kB (baseline 32.8 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/SubscribeButton-B5iIRv_n.js (removed) 12.5 kB 🟢 -12.5 kB 🟢 -3 kB 🟢 -2.69 kB
assets/SubscribeButton-Dw-dZFFq.js (new) 12.5 kB 🔴 +12.5 kB 🔴 +3 kB 🔴 +2.69 kB
assets/ComfyQueueButton-B4gI7aky.js (removed) 9.52 kB 🟢 -9.52 kB 🟢 -2.69 kB 🟢 -2.42 kB
assets/ComfyQueueButton-Cjn4Fn2S.js (new) 9.52 kB 🔴 +9.52 kB 🔴 +2.69 kB 🔴 +2.42 kB
assets/CloudBadge-at4F-a8N.js (removed) 1.85 kB 🟢 -1.85 kB 🟢 -725 B 🟢 -646 B
assets/CloudBadge-DPLjhjVa.js (new) 1.85 kB 🔴 +1.85 kB 🔴 +729 B 🔴 +648 B
assets/cloudFeedbackTopbarButton-B8quotuC.js (removed) 866 B 🟢 -866 B 🟢 -523 B 🟢 -438 B
assets/cloudFeedbackTopbarButton-biLMWw39.js (new) 866 B 🔴 +866 B 🔴 +524 B 🔴 +440 B
assets/ComfyQueueButton-Boit9l06.js (removed) 181 B 🟢 -181 B 🟢 -118 B 🟢 -113 B
assets/ComfyQueueButton-DjFFZsMT.js (new) 181 B 🔴 +181 B 🔴 +118 B 🔴 +110 B
assets/Button-CKxdX0Yq.js 3.75 kB 3.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/UserAvatar-Bj7TTp1S.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetButton-DZ-mX5uq.js 2.41 kB 2.41 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Data & Services — 3.05 MB (baseline 3.04 MB) • 🔴 +857 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/dialogService-Dk-ZisFF.js (new) 1.87 MB 🔴 +1.87 MB 🔴 +398 kB 🔴 +304 kB
assets/dialogService-Baha47jh.js (removed) 1.87 MB 🟢 -1.87 MB 🟢 -397 kB 🟢 -304 kB
assets/api-_x4Z5UoM.js (new) 1.15 MB 🔴 +1.15 MB 🔴 +240 kB 🔴 +186 kB
assets/api-BdP84C-d.js (removed) 1.15 MB 🟢 -1.15 MB 🟢 -240 kB 🟢 -186 kB
assets/releaseStore-BF3w-okz.js (removed) 8.91 kB 🟢 -8.91 kB 🟢 -2.41 kB 🟢 -2.13 kB
assets/releaseStore-ButIkao9.js (new) 8.91 kB 🔴 +8.91 kB 🔴 +2.41 kB 🔴 +2.12 kB
assets/keybindingService-DDbhCPk-.js (new) 6.78 kB 🔴 +6.78 kB 🔴 +1.74 kB 🔴 +1.51 kB
assets/keybindingService-qptuAKK3.js (removed) 6.78 kB 🟢 -6.78 kB 🟢 -1.75 kB 🟢 -1.52 kB
assets/userStore-DxFV65gw.js (removed) 2.16 kB 🟢 -2.16 kB 🟢 -814 B 🟢 -728 B
assets/userStore-JkpkFWOo.js (new) 2.16 kB 🔴 +2.16 kB 🔴 +814 B 🔴 +727 B
assets/audioService-91qNbLMJ.js (new) 2.03 kB 🔴 +2.03 kB 🔴 +932 B 🔴 +817 B
assets/audioService-CXuShcAd.js (removed) 2.03 kB 🟢 -2.03 kB 🟢 -928 B 🟢 -819 B
assets/releaseStore-CwVyNDzU.js (removed) 140 B 🟢 -140 B 🟢 -106 B 🟢 -103 B
assets/releaseStore-D9piv3Co.js (new) 140 B 🔴 +140 B 🔴 +106 B 🔴 +105 B
assets/serverConfigStore-sopnD88s.js 2.64 kB 2.64 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 7 added / 7 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/useErrorHandling-BPUUz3nj.js (new) 5.08 kB 🔴 +5.08 kB 🔴 +1.5 kB 🔴 +1.3 kB
assets/useErrorHandling-DQm3y0Ah.js (removed) 5.08 kB 🟢 -5.08 kB 🟢 -1.5 kB 🟢 -1.31 kB
assets/subscriptionCheckoutUtil-4USBYEtu.js (new) 1.98 kB 🔴 +1.98 kB 🔴 +862 B 🔴 +752 B
assets/subscriptionCheckoutUtil-bjl5AqQn.js (removed) 1.98 kB 🟢 -1.98 kB 🟢 -859 B 🟢 -748 B
assets/audioUtils-BU4Yqw56.js (removed) 1.24 kB 🟢 -1.24 kB 🟢 -620 B 🟢 -521 B
assets/audioUtils-DmVyyjrS.js (new) 1.24 kB 🔴 +1.24 kB 🔴 +619 B 🔴 +524 B
assets/useCurrentUser-D81-_U6U.js (new) 145 B 🔴 +145 B 🔴 +114 B 🔴 +104 B
assets/useCurrentUser-DHeVgxfb.js (removed) 145 B 🟢 -145 B 🟢 -114 B 🟢 -101 B
assets/_plugin-vue_export-helper-xVPqUhAl.js 467 B 467 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/colorUtil-BTZOs5h9.js 7.2 kB 7.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/markdownRendererUtil-B9qvfWYq.js 1.78 kB 1.78 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-BUCOyXf2.js 421 B 421 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/tailwindUtil-DTv34axN.js 487 B 487 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 4 added / 4 removed

Vendor & Third-Party — 10.4 MB (baseline 10.4 MB) • ⚪ 0 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-chart-Dr8GmMlH.js 408 kB 408 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-CpOC_out.js 3.92 MB 3.92 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-primevue-DvjPM_Lx.js 3.04 MB 3.04 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-reka-ui-BRjoKiJi.js 172 kB 172 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-Dqb1VEds.js 1.83 MB 1.83 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-BxNhpyUI.js 650 kB 650 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-7XRCqLaG.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-CArXWFIl.js 398 kB 398 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
Other — 6.28 MB (baseline 6.28 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/core-CF9gvVyy.js (new) 177 kB 🔴 +177 kB 🔴 +42.8 kB 🔴 +35.7 kB
assets/core-dupKzsFS.js (removed) 177 kB 🟢 -177 kB 🟢 -42.8 kB 🟢 -35.8 kB
assets/Load3D-C1V_3BBT.js (new) 55.7 kB 🔴 +55.7 kB 🔴 +9.18 kB 🔴 +7.92 kB
assets/Load3D-DXMQVyeG.js (removed) 55.7 kB 🟢 -55.7 kB 🟢 -9.18 kB 🟢 -7.91 kB
assets/WidgetSelect-B8RHThMD.js (removed) 50.5 kB 🟢 -50.5 kB 🟢 -11.1 kB 🟢 -9.69 kB
assets/WidgetSelect-D8nvUZe6.js (new) 50.5 kB 🔴 +50.5 kB 🔴 +11.1 kB 🔴 +9.69 kB
assets/SubscriptionRequiredDialogContent-DB36EROp.js (new) 28.7 kB 🔴 +28.7 kB 🔴 +6.78 kB 🔴 +5.91 kB
assets/SubscriptionRequiredDialogContent-U5sMEKfa.js (removed) 28.7 kB 🟢 -28.7 kB 🟢 -6.78 kB 🟢 -5.91 kB
assets/WidgetRecordAudio-ChVoB5Fc.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.96 kB 🟢 -4.43 kB
assets/WidgetRecordAudio-CK5S34BA.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.96 kB 🔴 +4.43 kB
assets/WidgetInputNumber-DvLZwADh.js (new) 18.2 kB 🔴 +18.2 kB 🔴 +4.49 kB 🔴 +4 kB
assets/WidgetInputNumber-uH72SPwv.js (removed) 18.2 kB 🟢 -18.2 kB 🟢 -4.49 kB 🟢 -4 kB
assets/WidgetImageCrop-BRlI-kcq.js (removed) 17.1 kB 🟢 -17.1 kB 🟢 -4.14 kB 🟢 -3.62 kB
assets/WidgetImageCrop-BupTBet7.js (new) 17.1 kB 🔴 +17.1 kB 🔴 +4.13 kB 🔴 +3.62 kB
assets/PanelTemplate-DwXGhgSl.js (new) 16.2 kB 🔴 +16.2 kB 🔴 +5.45 kB 🔴 +4.79 kB
assets/PanelTemplate-eqNHRJqe.js (removed) 16.2 kB 🟢 -16.2 kB 🟢 -5.45 kB 🟢 -4.79 kB
assets/AudioPreviewPlayer-DbB7g11n.js (new) 12.7 kB 🔴 +12.7 kB 🔴 +3.47 kB 🔴 +3.13 kB
assets/AudioPreviewPlayer-DgyNJlCO.js (removed) 12.7 kB 🟢 -12.7 kB 🟢 -3.47 kB 🟢 -3.11 kB
assets/WidgetWithControl-BT5fJZY7.js (removed) 8.02 kB 🟢 -8.02 kB 🟢 -2.65 kB 🟢 -2.38 kB
assets/WidgetWithControl-Dof5Qd7D.js (new) 8.02 kB 🔴 +8.02 kB 🔴 +2.65 kB 🔴 +2.38 kB
assets/ValueControlPopover-BWpodvIe.js (new) 4.86 kB 🔴 +4.86 kB 🔴 +1.55 kB 🔴 +1.37 kB
assets/ValueControlPopover-Cpc0lA94.js (removed) 4.86 kB 🟢 -4.86 kB 🟢 -1.55 kB 🟢 -1.37 kB
assets/WidgetAudioUI-D4NtxPX6.js (removed) 3.22 kB 🟢 -3.22 kB 🟢 -1.19 kB 🟢 -1.09 kB
assets/WidgetAudioUI-DalAziiM.js (new) 3.22 kB 🔴 +3.22 kB 🔴 +1.19 kB 🔴 +1.06 kB
assets/GlobalToast-Di2R65bB.js (new) 3.05 kB 🔴 +3.05 kB 🔴 +1.1 kB 🔴 +941 B
assets/GlobalToast-dRzp1WEU.js (removed) 3.05 kB 🟢 -3.05 kB 🟢 -1.1 kB 🟢 -942 B
assets/SubscribeToRun-BTv9SX2a.js (removed) 2.96 kB 🟢 -2.96 kB 🟢 -1.15 kB 🟢 -1.01 kB
assets/SubscribeToRun-Bw9coz0w.js (new) 2.96 kB 🔴 +2.96 kB 🔴 +1.15 kB 🔴 +1.01 kB
assets/cloudSessionCookie-B-I77RQA.js (new) 2.9 kB 🔴 +2.9 kB 🔴 +918 B 🔴 +795 B
assets/cloudSessionCookie-lIvLQCgm.js (removed) 2.9 kB 🟢 -2.9 kB 🟢 -916 B 🟢 -794 B
assets/BaseViewTemplate-DUpkRB9h.js (removed) 2.42 kB 🟢 -2.42 kB 🟢 -1.04 kB 🟢 -945 B
assets/BaseViewTemplate-NQz-WHsq.js (new) 2.42 kB 🔴 +2.42 kB 🔴 +1.04 kB 🔴 +946 B
assets/CloudRunButtonWrapper-B79B2sTS.js (new) 1.79 kB 🔴 +1.79 kB 🔴 +641 B 🔴 +558 B
assets/CloudRunButtonWrapper-Ch3aJwfc.js (removed) 1.79 kB 🟢 -1.79 kB 🟢 -642 B 🟢 -559 B
assets/cloudBadges-BLFXhknY.js (new) 1.08 kB 🔴 +1.08 kB 🔴 +537 B 🔴 +479 B
assets/cloudBadges-BMbMW_n9.js (removed) 1.08 kB 🟢 -1.08 kB 🟢 -536 B 🟢 -483 B
assets/graphHasMissingNodes-DC_I4Qb7.js (new) 1.06 kB 🔴 +1.06 kB 🔴 +460 B 🔴 +426 B
assets/graphHasMissingNodes-DpcPDO2w.js (removed) 1.06 kB 🟢 -1.06 kB 🟢 -459 B 🟢 -432 B
assets/cloudSubscription-jrujNQxg.js (removed) 976 B 🟢 -976 B 🟢 -456 B 🟢 -396 B
assets/cloudSubscription-Y_t9iJf9.js (new) 976 B 🔴 +976 B 🔴 +457 B 🔴 +394 B
assets/AudioPreviewPlayer-DM2DM_Q0.js (removed) 191 B 🟢 -191 B 🟢 -120 B 🟢 -118 B
assets/AudioPreviewPlayer-uRqjpqGK.js (new) 191 B 🔴 +191 B 🔴 +120 B 🔴 +121 B
assets/WidgetInputNumber-BXMbei0x.js (removed) 186 B 🟢 -186 B 🟢 -119 B 🟢 -110 B
assets/WidgetInputNumber-C7RvZglX.js (new) 186 B 🔴 +186 B 🔴 +119 B 🔴 +121 B
assets/WidgetLegacy-CtHkkDzg.js (new) 164 B 🔴 +164 B 🔴 +125 B 🔴 +109 B
assets/WidgetLegacy-WKVLViUQ.js (removed) 164 B 🟢 -164 B 🟢 -125 B 🟢 -114 B
assets/WidgetSelect-B7Q1Zz9J.js (removed) 161 B 🟢 -161 B 🟢 -113 B 🟢 -114 B
assets/WidgetSelect-Cs2gNhoM.js (new) 161 B 🔴 +161 B 🔴 +113 B 🔴 +107 B
assets/Load3D-DpC02kTL.js (removed) 131 B 🟢 -131 B 🟢 -107 B 🟢 -108 B
assets/Load3D-zkh7YLo6.js (new) 131 B 🔴 +131 B 🔴 +107 B 🔴 +107 B
assets/auto-Bv9cmrEd.js 1.73 kB 1.73 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-6dIwsSNi.js 17.2 kB 17.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BahwM9ZP.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BoJZgy7S.js 17 kB 17 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BQtdp20P.js 20.6 kB 20.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CEMgeOuO.js 18.5 kB 18.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CnxND6sZ.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-coXkrooi.js 18 kB 18 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CZcHDaAg.js 18.8 kB 18.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DDPGTXy9.js 17.9 kB 17.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DsGC6118.js 17.8 kB 17.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-yZ2AjT4s.js 19.3 kB 19.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/LazyImage-DHuYMTZW.js 14.1 kB 14.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B_sPkRkB.js 121 kB 121 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BAkXMjmM.js 141 kB 141 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BENvLtOF.js 117 kB 117 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BNsn8_Lr.js 120 kB 120 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-C9XUWxrh.js 105 kB 105 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Ch4S7NKM.js 105 kB 105 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DqG_JuMY.js 161 kB 161 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DSqO9eB5.js 124 kB 124 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-F6Zr8qmN.js 118 kB 118 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-kF4hEjF-.js 145 kB 145 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-KWKxelma.js 134 kB 134 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Media3DTop-DEJN4gIz.js 2.38 kB 2.38 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-D39-6tpk.js 2 kB 2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-CVYh1Dta.js 2.34 kB 2.34 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-D7WAsNtO.js 2.84 kB 2.84 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/mixpanel.module-DaKz7N-R.js 143 B 143 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-42NP799-.js 358 kB 358 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-5Wl7kJtq.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bfo_nHET.js 361 kB 361 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BIaHseXE.js 334 kB 334 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BqTE0tnV.js 437 kB 437 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CkFt94jg.js 365 kB 365 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-COXALCSv.js 374 kB 374 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cuv6XdUW.js 332 kB 332 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CyylrXT5.js 355 kB 355 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DN_FfVrO.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Dxwvr4db.js 403 kB 403 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/OBJLoader2WorkerModule-DTMpvldF.js 109 kB 109 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/preservedQueryNamespaces-BsMrb3S_.js 3.23 kB 3.23 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/previousFullPath-DZ1Jt5wB.js 838 B 838 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/rolldown-runtime-CqTjxoQm.js 1.53 kB 1.53 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/Slider-Buvb2eP-.js 4.21 kB 4.21 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widget-Dneex3J5.js 518 B 518 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BRX2wHPg.js 4.71 kB 4.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetBoundingBox-BttrDPHP.js 186 B 186 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetChart-Cw5Ye8UP.js 2.79 kB 2.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetColorPicker-Dv0MELOX.js 3.71 kB 3.71 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetGalleria-BwLByoy7.js 4.57 kB 4.57 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetImageCompare-BpLJ-dSO.js 3.79 kB 3.79 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetInputText-C57tLR52.js 2.58 kB 2.58 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetLayoutField-BmL9OHU7.js 2.61 kB 2.61 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetMarkdown-B4aB3N7S.js 3.22 kB 3.22 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-DfR_ZXyS.js 1.31 kB 1.31 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetTextarea-CZnm93Po.js 3.52 kB 3.52 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/WidgetToggleSwitch-B0EfCU8u.js 3.08 kB 3.08 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 25 added / 25 removed

@DrJKL DrJKL marked this pull request as ready for review January 21, 2026 06:28
@DrJKL DrJKL requested a review from a team as a code owner January 21, 2026 06:28
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Jan 21, 2026
@coderabbitai coderabbitai bot requested a review from PabloWiedemann January 21, 2026 06:29
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

🤖 Fix all issues with AI agents
In `@src/components/common/VirtualGrid.vue`:
- Around line 104-112: The helper rowsToHeight is misleading because it takes an
item count and divides by cols; rename it (e.g., itemsCountToHeight or
countToHeight) and its parameter from rows to count to make intent clear, then
update both call sites in topSpacerStyle and bottomSpacerStyle to use the new
name; ensure the function signature (e.g., function countToHeight(count:
number): string) and its internal formula remain the same and adjust any type
annotations if needed.

Comment on lines +104 to +112
function rowsToHeight(rows: number): string {
return `${(rows / cols.value) * itemHeight.value}px`
}
const topSpacerStyle = computed<CSSProperties>(() => ({
height: rowsToHeight(state.value.start)
}))
const bottomSpacerStyle = computed<CSSProperties>(() => ({
height: rowsToHeight(items.length - state.value.end)
}))
Copy link
Contributor

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial

Consider renaming rowsToHeight for clarity.

The function accepts an item count (not rows), converts to rows by dividing by cols, then computes pixel height. The name rowsToHeight is misleading.

♻️ Suggested rename
-function rowsToHeight(rows: number): string {
-  return `${(rows / cols.value) * itemHeight.value}px`
+function itemCountToHeight(itemCount: number): string {
+  return `${(itemCount / cols.value) * itemHeight.value}px`
 }
 const topSpacerStyle = computed<CSSProperties>(() => ({
-  height: rowsToHeight(state.value.start)
+  height: itemCountToHeight(state.value.start)
 }))
 const bottomSpacerStyle = computed<CSSProperties>(() => ({
-  height: rowsToHeight(items.length - state.value.end)
+  height: itemCountToHeight(items.length - state.value.end)
 }))
📝 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
function rowsToHeight(rows: number): string {
return `${(rows / cols.value) * itemHeight.value}px`
}
const topSpacerStyle = computed<CSSProperties>(() => ({
height: rowsToHeight(state.value.start)
}))
const bottomSpacerStyle = computed<CSSProperties>(() => ({
height: rowsToHeight(items.length - state.value.end)
}))
function itemCountToHeight(itemCount: number): string {
return `${(itemCount / cols.value) * itemHeight.value}px`
}
const topSpacerStyle = computed<CSSProperties>(() => ({
height: itemCountToHeight(state.value.start)
}))
const bottomSpacerStyle = computed<CSSProperties>(() => ({
height: itemCountToHeight(items.length - state.value.end)
}))
🤖 Prompt for AI Agents
In `@src/components/common/VirtualGrid.vue` around lines 104 - 112, The helper
rowsToHeight is misleading because it takes an item count and divides by cols;
rename it (e.g., itemsCountToHeight or countToHeight) and its parameter from
rows to count to make intent clear, then update both call sites in
topSpacerStyle and bottomSpacerStyle to use the new name; ensure the function
signature (e.g., function countToHeight(count: number): string) and its internal
formula remain the same and adjust any type annotations if needed.

Copy link
Member

@viva-jinyi viva-jinyi left a comment

Choose a reason for hiding this comment

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

LGTM

@DrJKL DrJKL merged commit e503482 into main Jan 21, 2026
32 checks passed
@DrJKL DrJKL deleted the drjkl/virtualgrid-improvements branch January 21, 2026 07:17
@DrJKL DrJKL added needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch cloud/1.37 Backport PRs for cloud 1.37 labels Jan 22, 2026
github-actions bot pushed a commit that referenced this pull request Jan 22, 2026
#8210)

## Summary

Add `maxColumns` prop to VirtualGrid for responsive column capping.

## Changes

- **VirtualGrid**: Add `maxColumns` prop to cap grid columns; refactor
inline styles to Tailwind classes; extract spacer height computation to
helper function
- **AssetGrid**: Use `useBreakpoints` to set responsive `maxColumns`
(1-5 based on Tailwind breakpoints)

## Review Focus

- `maxColumns` behavior when `Infinity` vs finite: does
`gridTemplateColumns` override work correctly?
- Tailwind scrollbar classes replacing scoped CSS
@comfy-pr-bot
Copy link
Member

@DrJKL Successfully backported to #8232

@github-actions github-actions bot removed the needs-backport Fix/change that needs to be cherry-picked to the current feature freeze branch label Jan 22, 2026
DrJKL added a commit that referenced this pull request Jan 22, 2026
…sponsive column capping (#8232)

Backport of #8210 to `cloud/1.37`

Automatically created by backport workflow.

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-8232-backport-cloud-1-37-feat-add-maxColumns-prop-to-VirtualGrid-for-responsive-column-capp-2f06d73d36508149bdc2fdec700debac)
by [Unito](https://www.unito.io)

Co-authored-by: Alexander Brown <drjkl@comfy.org>
godwiniheuwa pushed a commit to godwiniheuwa/ComfyUI_frontend that referenced this pull request Jan 22, 2026
Comfy-Org#8210)

## Summary

Add `maxColumns` prop to VirtualGrid for responsive column capping.

## Changes

- **VirtualGrid**: Add `maxColumns` prop to cap grid columns; refactor
inline styles to Tailwind classes; extract spacer height computation to
helper function
- **AssetGrid**: Use `useBreakpoints` to set responsive `maxColumns`
(1-5 based on Tailwind breakpoints)

## Review Focus

- `maxColumns` behavior when `Infinity` vs finite: does
`gridTemplateColumns` override work correctly?
- Tailwind scrollbar classes replacing scoped CSS
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

cloud/1.37 Backport PRs for cloud 1.37 size:M This PR changes 30-99 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants