Skip to content

Conversation

@DrJKL
Copy link
Contributor

@DrJKL DrJKL commented Dec 7, 2025

Summary

Unify the current sidebar tabs, structurally and aesthetically.

Changes

  • Removes the Assets only Layout
  • Standardizes the title styling and spacing across the tabs.

Review Focus

Screenshots (if applicable)

┆Issue is synchronized with this Notion page by Unito

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Dec 7, 2025

📝 Walkthrough

Walkthrough

Removed AssetSidebarTemplate; migrated AssetsSidebarTab to use SidebarTabTemplate with a new alt-title slot and header/spacing adjustments; SidebarTabTemplate header/title rendering changed; removed top padding from MediaAssetFilterBar; multiple components received typography/background class tweaks; assetBrowser locale keys were reorganized and expanded.

Changes

Cohort / File(s) Summary
Component Removal
src/components/sidebar/tabs/AssetSidebarTemplate.vue
Deleted the AssetSidebarTemplate component (template, script-setup, imports, and slot-based rendering removed).
Template Migration
src/components/sidebar/tabs/AssetsSidebarTab.vue
Replaced AssetSidebarTemplate with SidebarTabTemplate; added alt-title slot for folder view (Job ID, short prompt, copy button, execution time); title empty in-folder; adjusted header/tab/filter spacing to px-2 2xl:px-4; removed mb-1 from copy icon; updated imports.
Template Enhancement
src/components/sidebar/tabs/SidebarTabTemplate.vue
Reworked header into a flex column with gap; increased toolbar min-height and horizontal padding; title no longer uppercased (renders bold); added named slot alt-title; preserved end/tool-button slot behavior.
Filter Bar Spacing
src/platform/assets/components/MediaAssetFilterBar.vue
Removed top padding by changing root class from flex gap-3 pt-2 to flex gap-3.
Locale updates
src/locales/en/main.json
Reorganized and added many assetBrowser localization keys (new error/status, civitai, model/library, sorting, upload-related keys); removed/condensed older asset-related strings.
Styling / Typography & Background tweaks
src/components/bottomPanel/BottomPanel.vue, src/components/common/TreeExplorer.vue, src/components/rightSidePanel/RightSidePanel.vue, src/components/sidebar/tabs/ModelLibrarySidebarTab.vue, src/components/sidebar/tabs/NodeLibrarySidebarTab.vue, src/components/sidebar/tabs/WorkflowsSidebarTab.vue, src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue, src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
Added font-inter to various Tab/container elements; removed or adjusted background utility classes (e.g., bg-(--p-tree-background)) in several sidebar/tab components; minor class updates for spacing and transparency without logic changes.

Possibly related PRs

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

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5705103 and 4da80bb.

📒 Files selected for processing (10)
  • src/components/bottomPanel/BottomPanel.vue (1 hunks)
  • src/components/common/TreeExplorer.vue (1 hunks)
  • src/components/rightSidePanel/RightSidePanel.vue (1 hunks)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue (5 hunks)
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue (1 hunks)
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue (0 hunks)
  • src/components/sidebar/tabs/SidebarTabTemplate.vue (1 hunks)
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue (1 hunks)
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue (1 hunks)
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/sidebar/tabs/NodeLibrarySidebarTab.vue
🧰 Additional context used
📓 Path-based instructions (13)
src/**/*.vue

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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.vue

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

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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.{vue,css}

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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.{vue,ts,js}

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

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.{js,ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

Use TypeScript exclusively (no new JavaScript)

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
🧠 Learnings (17)
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Do not use the `dark:` Tailwind variant; use semantic values from `style.css` theme instead (e.g., `bg-node-component-surface`)

Applied to files:

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

Applied to files:

  • src/components/common/TreeExplorer.vue
  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

  • src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue
  • src/components/bottomPanel/BottomPanel.vue
  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
📚 Learning: 2025-12-06T02:11:00.366Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/rightSidePanel/RightSidePanel.vue:174-180
Timestamp: 2025-12-06T02:11:00.366Z
Learning: PrimeVue components have poor TypeScript typing, so type assertions (like `as RightSidePanelTab`) may be necessary when handling emitted events or prop values from PrimeVue components like TabList.

Applied to files:

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

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Sidebar component with Drawer

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/WorkflowsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue InputSwitch component with ToggleSwitch

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-04T21:47:07.812Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:43-43
Timestamp: 2025-12-04T21:47:07.812Z
Learning: In Vue SFCs with a build step (pre-compilation), kebab-case attribute names in templates are automatically converted to camelCase, so `:sidebar-panel-visible` as a shorthand binding correctly resolves to a variable named `sidebarPanelVisible`. The `.camel` modifier is only needed when using in-DOM templates without a build step.

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/ModelLibrarySidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.{vue,css} : Use the correct tokens from style.css in the design system package

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.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 : Follow Vue 3 style guide and naming conventions

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue Steps component with Stepper without panels

Applied to files:

  • src/components/rightSidePanel/RightSidePanel.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-09T02:44:38.234Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-09T02:44:38.234Z
Learning: Applies to **/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use Teleport/Suspense when needed for component rendering

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.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: collect
  • GitHub Check: test
🔇 Additional comments (12)
src/components/sidebar/tabs/ModelLibrarySidebarTab.vue (1)

2-2: LGTM: Background class removal aligns with tab styling standardization.

The removal of the bg-(--p-tree-background) class is consistent with the PR's objective to unify sidebar tab styling. This change simplifies the visual presentation by relying on the base SidebarTabTemplate styling.

src/components/common/TreeExplorer.vue (1)

5-5: LGTM: Background transparency supports unified tab styling.

Adding bg-transparent allows the Tree component to inherit its parent's background styling, supporting the PR's goal of consistent visual presentation across sidebar tabs.

src/components/bottomPanel/BottomPanel.vue (1)

13-18: LGTM: Inter font application standardizes tab typography.

The addition of font-inter to both the container and individual Tab elements ensures consistent typography across the bottom panel tabs, aligning with the broader font standardization in this PR.

src/components/rightSidePanel/RightSidePanel.vue (1)

185-185: LGTM: Inter font application maintains typography consistency.

Adding font-inter to the Tab class ensures consistent typography across the right side panel, matching the font standardization applied to other tab components in this PR.

src/workbench/extensions/manager/components/manager/infoPanel/InfoTabs.vue (1)

5-20: LGTM: Inter font application completes typography standardization.

The addition of font-inter to all three tabs (warning, description, nodes) ensures consistent typography across the info panel, completing the font standardization effort for tab components in this PR.

src/components/sidebar/tabs/nodeLibrary/NodeHelpPage.vue (1)

2-2: LGTM: Background class removal simplifies styling.

Removing the bg-(--p-tree-background) class is consistent with the broader simplification of background styling across sidebar tab components in this PR.

src/components/sidebar/tabs/WorkflowsSidebarTab.vue (1)

4-4: LGTM: Background class removal maintains styling consistency.

The removal of bg-(--p-tree-background) from the class attribute aligns with the standardized approach to sidebar tab styling applied across multiple tab components in this PR.

src/components/sidebar/tabs/SidebarTabTemplate.vue (1)

6-24: LGTM: Template enhancements support unified sidebar styling.

The structural improvements to SidebarTabTemplate align well with the PR's objectives:

  1. Flexible header layout: The flex-col gap-2 structure enables vertical stacking of header elements.
  2. Typography improvement: Rendering the title as bold text without uppercase transformation provides a cleaner, more modern appearance.
  3. Alt-title slot addition: The new named slot extends the public API to support alternative header content (e.g., for folder view in AssetsSidebarTab).
  4. Responsive spacing: The px-2 2xl:px-4 pattern provides appropriate padding across viewport sizes.
  5. Preserved tool-button behavior: The show-on-hover wrapper remains intact, maintaining the existing UX.

These changes successfully standardize the tab template while adding flexibility for component-specific customization.

src/components/sidebar/tabs/AssetsSidebarTab.vue (4)

28-47: Folder header vs. tab header split and typography updates look correct

The conditional folder header (backToAssets button) vs. TabList header, plus the shared font-inter px-2 2xl:px-4 classes, cleanly separate the two modes and keep typography consistent with the rest of the sidebar tabs. No functional issues spotted.


49-55: Filter bar padding change aligns with updated header spacing

Updating MediaAssetFilterBar to class="pb-1 px-2 2xl:px-4" keeps it visually aligned with the new header/tab padding without affecting behavior. Looks good.


168-168: Switch to SidebarTabTemplate wrapper is consistent with the shared tab layout

Closing the new <SidebarTabTemplate> wrapper here matches the updated structure and keeps the ResultGallery sibling unchanged. The overall template hierarchy remains valid for Vue 3 multi-root templates.


187-187: Import of SidebarTabTemplate matches new usage

The import path @/components/sidebar/tabs/SidebarTabTemplate.vue is consistent with the component usage in the template and with the shared sidebar tab pattern introduced in this PR. No type or import-order issues apparent.


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 Dec 7, 2025

🎨 Storybook Build Status

Build completed successfully!

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

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Dec 7, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 12/09/2025, 07:19:43 AM UTC

📈 Summary

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

📊 Test Reports by Browser

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

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

@github-actions
Copy link

github-actions bot commented Dec 7, 2025

Bundle Size Report

Summary

  • Raw size: 17.1 MB baseline 17.1 MB — 🟢 -1.16 kB
  • Gzip: 3.38 MB baseline 3.38 MB — 🟢 -395 B
  • Brotli: 2.59 MB baseline 2.59 MB — 🔴 +9 B
  • Bundles: 97 current • 97 baseline • 43 added / 43 removed

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

Per-category breakdown
App Entry Points — 3.21 MB (baseline 3.21 MB) • 🟢 -1.2 kB

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CRm11uzx.js (removed) 2.98 MB 🟢 -2.98 MB 🟢 -621 kB 🟢 -471 kB
assets/index-CxwxRbxJ.js (new) 2.98 MB 🔴 +2.98 MB 🔴 +620 kB 🔴 +471 kB
assets/index-BTbymbkz.js (removed) 223 kB 🟢 -223 kB 🟢 -47.6 kB 🟢 -39.2 kB
assets/index-CDeveEw9.js (new) 223 kB 🔴 +223 kB 🔴 +47.6 kB 🔴 +39.2 kB
assets/index-d-wY3lrq.js (removed) 345 B 🟢 -345 B 🟢 -244 B 🟢 -199 B
assets/index-Di_7HQvm.js (new) 345 B 🔴 +345 B 🔴 +244 B 🔴 +231 B

Status: 3 added / 3 removed

Graph Workspace — 982 kB (baseline 982 kB) • 🔴 +33 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-b2rxKABb.js (new) 982 kB 🔴 +982 kB 🔴 +190 kB 🔴 +145 kB
assets/GraphView-DOfUQ-JZ.js (removed) 982 kB 🟢 -982 kB 🟢 -190 kB 🟢 -144 kB

Status: 1 added / 1 removed

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

Top-level views, pages, and routed surfaces

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

Status: 1 added / 1 removed

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

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-CSdXlXP2.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.5 kB
assets/CreditsPanel-D2qGjsca.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.15 kB 🔴 +4.5 kB
assets/KeybindingPanel-2GKewauE.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3 kB
assets/KeybindingPanel-Di1Lnive.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.01 kB
assets/ExtensionPanel-B3BJfofA.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.26 kB
assets/ExtensionPanel-UZgN5nuo.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.58 kB 🔴 +2.26 kB
assets/AboutPanel-DmjeJUPP.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.46 kB 🔴 +2.21 kB
assets/AboutPanel-SnoDm7XN.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-BCwdzrMi.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.63 kB
assets/ServerConfigPanel-CZoxday-.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.63 kB
assets/UserPanel-B7Qe7yNU.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.5 kB
assets/UserPanel-Bn6ZeXGF.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/settings-BhbWhsRg.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

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

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-Dr7Z6pHY.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.31 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-Dyk354UY.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.32 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-D3ugSggL.js (new) 48.1 kB 🔴 +48.1 kB 🔴 +10.4 kB 🔴 +8.99 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-DLvNq-Yt.js (removed) 48.1 kB 🟢 -48.1 kB 🟢 -10.4 kB 🟢 -8.99 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-I5xbaUM1.js (new) 47.3 kB 🔴 +47.3 kB 🔴 +10.6 kB 🔴 +9.29 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-Ob4Zsys2.js (removed) 47.3 kB 🟢 -47.3 kB 🟢 -10.6 kB 🟢 -9.29 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-Du1uw4H9.js (new) 12.9 kB 🔴 +12.9 kB 🔴 +3.37 kB 🔴 +2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-TZy5mfta.js (removed) 12.9 kB 🟢 -12.9 kB 🟢 -3.37 kB 🟢 -2.97 kB
assets/ComfyQueueButton-ByktnqO7.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.48 kB 🔴 +2.21 kB
assets/ComfyQueueButton-xlBfeGV1.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.48 kB 🟢 -2.21 kB
assets/WidgetButton-CFWrwaAG.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -926 B 🟢 -812 B
assets/WidgetButton-CMkR1knv.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +926 B 🔴 +813 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-BkTMAMst.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +688 B 🔴 +595 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-BPGmgVoN.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -687 B 🟢 -596 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-Br7mdhBI.js (new) 897 B 🔴 +897 B 🔴 +502 B 🔴 +439 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-CAObqAnu.js (removed) 897 B 🟢 -897 B 🟢 -501 B 🟢 -444 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-6ZIklFyS.js 2.26 kB 2.26 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 8 added / 8 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-BmSkBf6T.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.83 kB 🟢 -1.58 kB
assets/keybindingService-Cy8YVWrm.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.83 kB 🔴 +1.58 kB
assets/audioService-776muPRD.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -963 B 🟢 -827 B
assets/audioService-CM6lHYK0.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +964 B 🔴 +830 B
assets/serverConfigStore-L3qzi_1Z.js 2.83 kB 2.83 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 2 added / 2 removed

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

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-BxYuJZxC.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +651 B 🔴 +546 B
assets/audioUtils-DnERnHB2.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -650 B 🟢 -543 B
assets/mathUtil-CD4DsosH.js 1.32 kB 1.32 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

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

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-primevue-CkvDSSUa.js (new) 1.96 MB 🔴 +1.96 MB 🔴 +336 kB 🔴 +202 kB
assets/vendor-primevue-DUTcKlCc.js (removed) 1.96 MB 🟢 -1.96 MB 🟢 -336 kB 🟢 -202 kB
assets/vendor-chart-DJFoH6N_.js 452 kB 452 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-other-BZV8aGUB.js 3.98 MB 3.98 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-tiptap-Cmu0_BY4.js 232 kB 232 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-vue-Bz22sFex.js 160 kB 160 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

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

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-CWy8-E7x.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.24 kB 🔴 +4.63 kB
assets/WidgetRecordAudio-PIpFucBd.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.24 kB 🟢 -4.63 kB
assets/AudioPreviewPlayer-BrHa6doW.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.04 kB
assets/AudioPreviewPlayer-CxFWrV-F.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.04 kB
assets/WidgetGalleria-4S4yKeB0.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.44 kB 🟢 -1.3 kB
assets/WidgetGalleria-sGiMxX_r.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.44 kB 🔴 +1.3 kB
assets/WidgetColorPicker-DfpLlfoP.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetColorPicker-DGK03fP3.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetMarkdown-CpO97fxq.js (new) 3.08 kB 🔴 +3.08 kB 🔴 +1.28 kB 🔴 +1.12 kB
assets/WidgetMarkdown-DtrziLDa.js (removed) 3.08 kB 🟢 -3.08 kB 🟢 -1.28 kB 🟢 -1.12 kB
assets/WidgetTextarea-BxWs0l6e.js (new) 2.93 kB 🔴 +2.93 kB 🔴 +1.17 kB 🔴 +1.06 kB
assets/WidgetTextarea-CI6qw0RV.js (removed) 2.93 kB 🟢 -2.93 kB 🟢 -1.17 kB 🟢 -1.03 kB
assets/WidgetAudioUI-BJQbu0gW.js (removed) 2.85 kB 🟢 -2.85 kB 🟢 -1.16 kB 🟢 -1.06 kB
assets/WidgetAudioUI-DQD9-oEL.js (new) 2.85 kB 🔴 +2.85 kB 🔴 +1.16 kB 🔴 +1.05 kB
assets/WidgetChart-DhnqAfj7.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +932 B 🔴 +817 B
assets/WidgetChart-j6EYUdOM.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -932 B 🟢 -819 B
assets/WidgetImageCompare-D5bj5c8l.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -748 B 🟢 -659 B
assets/WidgetImageCompare-DFci1T8T.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +748 B 🔴 +660 B
assets/WidgetInputText-BO_gaxFh.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -915 B 🟢 -852 B
assets/WidgetInputText-uavP-d-D.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +917 B 🔴 +844 B
assets/WidgetToggleSwitch-D6b0vE-q.js (new) 1.58 kB 🔴 +1.58 kB 🔴 +758 B 🔴 +668 B
assets/WidgetToggleSwitch-DPJMnc2A.js (removed) 1.58 kB 🟢 -1.58 kB 🟢 -759 B 🟢 -663 B
assets/MediaImageBottom-35sUNFqZ.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -743 B 🟢 -645 B
assets/MediaImageBottom-CJ_td04X.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +740 B 🔴 +644 B
assets/MediaAudioBottom-kL9vhH_S.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -744 B 🟢 -656 B
assets/MediaAudioBottom-sOu35IHM.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +742 B 🔴 +658 B
assets/MediaVideoBottom-BjZ_rULc.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -740 B 🟢 -652 B
assets/MediaVideoBottom-C5iaUKeN.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +738 B 🔴 +659 B
assets/Media3DBottom-BvjD4k0s.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +734 B 🔴 +652 B
assets/Media3DBottom-DN5WxPLa.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -732 B 🟢 -652 B
assets/Media3DTop-B4AM_Pf4.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +764 B 🔴 +651 B
assets/Media3DTop-BCxkj56T.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -764 B 🟢 -652 B
assets/WidgetSelect-BjlPhbZd.js (new) 655 B 🔴 +655 B 🔴 +344 B 🔴 +290 B
assets/WidgetSelect-DaSttPYn.js (removed) 655 B 🟢 -655 B 🟢 -342 B 🟢 -289 B
assets/WidgetInputNumber-BTqJZzF6.js (removed) 595 B 🟢 -595 B 🟢 -329 B 🟢 -277 B
assets/WidgetInputNumber-CYu3Dgwl.js (new) 595 B 🔴 +595 B 🔴 +330 B 🔴 +278 B
assets/Load3D-Bur0ticK.js (new) 424 B 🔴 +424 B 🔴 +267 B 🔴 +225 B
assets/Load3D-DkG69n09.js (removed) 424 B 🟢 -424 B 🟢 -266 B 🟢 -223 B
assets/WidgetLegacy-DzctseRp.js (new) 364 B 🔴 +364 B 🔴 +236 B 🔴 +193 B
assets/WidgetLegacy-SbN2lDY7.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -195 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BWp4HdfU.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B1JflQcI.js 72.2 kB 72.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B2lyXe48.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-B9XEQ-pc.js 94 kB 94 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BErKFzc-.js 73.1 kB 73.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Bf7Tze-u.js 83.4 kB 83.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BhGMcO4Q.js 84.3 kB 84.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CPZUloNQ.js 99 kB 99 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Cw9RZWRY.js 89 B 89 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Dva0z-T2.js 86.5 kB 86.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-un0K9wDS.js 81.8 kB 81.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaAudioTop-BPDWO8-i.js 1.46 kB 1.46 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaImageTop-BtY1hGDO.js 1.75 kB 1.75 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/MediaVideoTop-ehTZdDBw.js 2.76 kB 2.76 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BC3OlaIn.js 342 kB 342 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BsqN8-W1.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Bw_Jitw_.js 101 B 101 B ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CK2saYDx.js 307 kB 307 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-Cm5kR4Hi.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CMrh-uxB.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DlUIOit1.js 369 kB 369 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DNu_xoP2.js 282 kB 282 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DpcvlpZe.js 303 kB 303 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-IyjOYIl-.js 317 kB 317 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 20 added / 20 removed

@DrJKL DrJKL force-pushed the drjkl/assets-classes branch 2 times, most recently from bd012d1 to 9f3f5c8 Compare December 8, 2025 17:59
@DrJKL DrJKL changed the title WIP: Sidebar Tabs component and style alignment Cleanup: Sidebar Tabs component and style alignment Dec 8, 2025
@DrJKL DrJKL marked this pull request as ready for review December 8, 2025 19:21
@DrJKL DrJKL requested a review from a team as a code owner December 8, 2025 19:21
@dosubot dosubot bot added the size:M This PR changes 30-99 lines, ignoring generated files. label Dec 8, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8c5584c and c1424e8.

📒 Files selected for processing (4)
  • src/components/sidebar/tabs/AssetSidebarTemplate.vue (0 hunks)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue (7 hunks)
  • src/components/sidebar/tabs/SidebarTabTemplate.vue (1 hunks)
  • src/platform/assets/components/MediaAssetFilterBar.vue (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/sidebar/tabs/AssetSidebarTemplate.vue
🧰 Additional context used
📓 Path-based instructions (12)
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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs with Composition API only (use <script setup lang="ts">, not Options API)
Avoid using <style> blocks; use Tailwind 4 for all styling
Use defineProps with TypeScript style default declaration; do not use withDefaults or runtime props declaration
Prefer useModel over separately defining a prop and emit
Use computed instead of a ref and watch if possible
Avoid using ref if a prop would accomplish the design goals; avoid using computed if a ref or prop directly would work
Do not import Vue macros unnecessarily
Never use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Never use :class="[]" to merge class names; always use cn() from @/utils/tailwindUtil (e.g., <div :class="cn('text-node-component-header-icon', hasError && 'text-danger')" />)
Leverage VueUse functions for performance-enhancing styles
Avoid new usage of PrimeVue components
Use Vue 3 Teleport component when needed
Use Vue 3 Suspense for async components

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,vue}: Use camelCase for variable and function names
Indent with 2 spaces (see .prettierrc)
Use single quotes for strings (see .prettierrc)
No trailing semicolons (see .prettierrc)
Maximum line width of 80 characters (see .prettierrc)
Sort and group imports by plugin (run pnpm format before committing)
Never use any type; use proper TypeScript types instead
Never use as any type assertions; fix the underlying type issue instead
Avoid code comments unless absolutely necessary; write expressive, self-documenting code instead
When writing new code, ask if there is a simpler way to introduce the same functionality; if yes, choose the simpler approach
Use refactoring to make complex code simpler
Use es-toolkit for utility functions
Use Vite for fast development and building
Implement proper error handling
Write tests for all changes, especially bug fixes to catch future regressions

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/components/**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.vue

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

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

Files:

  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,css}

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

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

Files:

  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,ts,js}

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

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

Files:

  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.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 TabMenu component with Tabs without panels

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/SidebarTabTemplate.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-04T21:47:07.812Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:43-43
Timestamp: 2025-12-04T21:47:07.812Z
Learning: In Vue SFCs with a build step (pre-compilation), kebab-case attribute names in templates are automatically converted to camelCase, so `:sidebar-panel-visible` as a shorthand binding correctly resolves to a variable named `sidebarPanelVisible`. The `.camel` modifier is only needed when using in-DOM templates without a build step.

Applied to files:

  • src/components/sidebar/tabs/SidebarTabTemplate.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 Vue 3's Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use Vue 3 Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use Teleport/Suspense when needed for component rendering

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue components

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.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). (1)
  • GitHub Check: setup
🔇 Additional comments (3)
src/platform/assets/components/MediaAssetFilterBar.vue (1)

2-2: Root spacing change is consistent with parent-controlled padding

Dropping pt-2 here and letting callers (e.g., AssetsSidebarTab) supply padding via class keeps this filter bar layout-agnostic and aligns with the new sidebar spacing scheme. No logic impact.

src/components/sidebar/tabs/AssetsSidebarTab.vue (2)

2-4: Migration to SidebarTabTemplate with alt-title slot looks correct

Swapping to SidebarTabTemplate and driving the header via:

  • :title="isInFolderView ? '' : $t('sideToolbar.mediaAssets.title')" and
  • the new alt-title slot for the folder view (Job ID + execution time)

is consistent with the new sidebar template API. In folder view, the empty title plus populated alt-title keeps the header focused on job metadata, while non-folder view still shows the translated media assets title. The updated import matches this usage. I don’t see any logic regressions here.

Also applies to: 5-25, 164-164, 183-183


28-51: Header/tab/filter padding alignment is coherent with the new sidebar layout

Normalizing paddings to px-2 2xl:px-4 on the folder header container, the TabList, and adding pb-1 px-2 2xl:px-4 to MediaAssetFilterBar should tighten vertical rhythm and ensure the tab strip and filters align with the new toolbar height. This is a purely layout-level change; reactive behavior and bindings remain intact.

@DrJKL DrJKL force-pushed the drjkl/assets-classes branch 2 times, most recently from f035c4d to 7c33dc2 Compare December 8, 2025 20:02
@DrJKL DrJKL force-pushed the drjkl/assets-classes branch from 7c33dc2 to 104e095 Compare December 9, 2025 01:04
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

Caution

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

⚠️ Outside diff range comments (1)
src/components/sidebar/tabs/SidebarTabTemplate.vue (1)

43-52: Consider migrating PrimeVue internal styles to Tailwind or utility classes.

The <style scoped> block uses :deep() selectors to style PrimeVue component internals. Per coding guidelines, styles should use Tailwind 4 only. If these deep styles are necessary for PrimeVue integration, consider whether:

  1. PrimeVue Toolbar styling can be achieved via Tailwind's arbitrary variants
  2. A wrapper component could encapsulate these styles
  3. This represents a necessary exception for third-party component integration

As per coding guidelines: "Avoid using <style> blocks; use Tailwind 4 for all styling"

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f035c4d and 104e095.

📒 Files selected for processing (4)
  • src/components/sidebar/tabs/AssetSidebarTemplate.vue (0 hunks)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue (7 hunks)
  • src/components/sidebar/tabs/SidebarTabTemplate.vue (1 hunks)
  • src/platform/assets/components/MediaAssetFilterBar.vue (1 hunks)
💤 Files with no reviewable changes (1)
  • src/components/sidebar/tabs/AssetSidebarTemplate.vue
🧰 Additional context used
📓 Path-based instructions (12)
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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs with Composition API only (use <script setup lang="ts">, not Options API)
Avoid using <style> blocks; use Tailwind 4 for all styling
Use defineProps with TypeScript style default declaration; do not use withDefaults or runtime props declaration
Prefer useModel over separately defining a prop and emit
Use computed instead of a ref and watch if possible
Avoid using ref if a prop would accomplish the design goals; avoid using computed if a ref or prop directly would work
Do not import Vue macros unnecessarily
Never use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Never use :class="[]" to merge class names; always use cn() from @/utils/tailwindUtil (e.g., <div :class="cn('text-node-component-header-icon', hasError && 'text-danger')" />)
Leverage VueUse functions for performance-enhancing styles
Avoid new usage of PrimeVue components
Use Vue 3 Teleport component when needed
Use Vue 3 Suspense for async components

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,vue}: Use camelCase for variable and function names
Indent with 2 spaces (see .prettierrc)
Use single quotes for strings (see .prettierrc)
No trailing semicolons (see .prettierrc)
Maximum line width of 80 characters (see .prettierrc)
Sort and group imports by plugin (run pnpm format before committing)
Never use any type; use proper TypeScript types instead
Never use as any type assertions; fix the underlying type issue instead
Avoid code comments unless absolutely necessary; write expressive, self-documenting code instead
When writing new code, ask if there is a simpler way to introduce the same functionality; if yes, choose the simpler approach
Use refactoring to make complex code simpler
Use es-toolkit for utility functions
Use Vite for fast development and building
Implement proper error handling
Write tests for all changes, especially bug fixes to catch future regressions

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
**/components/**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/platform/assets/components/MediaAssetFilterBar.vue
  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.vue

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.{vue,css}

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.vue
src/components/**/*.{vue,ts,js}

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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 TabMenu component with Tabs without panels

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
  • src/components/sidebar/tabs/SidebarTabTemplate.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 Vue 3's Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use Vue 3 Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use Teleport/Suspense when needed for component rendering

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue components

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-04T21:47:07.812Z
Learnt from: DrJKL
Repo: Comfy-Org/ComfyUI_frontend PR: 7137
File: src/components/LiteGraphCanvasSplitterOverlay.vue:43-43
Timestamp: 2025-12-04T21:47:07.812Z
Learning: In Vue SFCs with a build step (pre-compilation), kebab-case attribute names in templates are automatically converted to camelCase, so `:sidebar-panel-visible` as a shorthand binding correctly resolves to a variable named `sidebarPanelVisible`. The `.camel` modifier is only needed when using in-DOM templates without a build step.

Applied to files:

  • src/components/sidebar/tabs/SidebarTabTemplate.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: setup
  • GitHub Check: collect
  • GitHub Check: lint-and-format
🔇 Additional comments (7)
src/components/sidebar/tabs/SidebarTabTemplate.vue (2)

6-14: LGTM: Header restructuring and alt-title slot addition.

The header restructuring (flex column with gap, updated toolbar dimensions, and standardized title styling) aligns well with the PR's goal to unify sidebar tabs aesthetically. The new alt-title slot effectively supports the folder view use case in AssetsSidebarTab.


17-21: Tool-button transition behavior preserved.

The show-on-hover/focus behavior for tool buttons is still present with the motion-safe:w-0 motion-safe:opacity-0 transitions. This addresses the concern raised in the previous review about potential behavior loss.

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

2-2: LGTM: Padding adjustment aligns with template refactor.

Removing the top padding from the filter bar aligns with the new SidebarTabTemplate structure, where spacing is now managed at the parent level. This maintains consistent vertical rhythm across sidebar tabs.

src/components/sidebar/tabs/AssetsSidebarTab.vue (4)

2-4: LGTM: Clean template migration with conditional title.

The migration to SidebarTabTemplate with a conditional title prop elegantly handles the dual-mode header (normal view vs. folder view). This aligns with the PR's objective to unify sidebar tab structure.


13-19: LGTM: Copy button implementation.

The copy button structure and implementation (with the copyJobId handler at lines 464-483) follow best practices, including proper error handling and toast notifications.


28-28: LGTM: Consistent spacing standardization.

The uniform application of px-2 2xl:px-4 padding across the header, tab list, and filter bar creates visual consistency and aligns with the PR's goal to standardize spacing across sidebar tabs.

Also applies to: 40-40, 49-49


164-164: Template migration complete and consistent.

The closing tag and import statement are properly updated to match the new SidebarTabTemplate component.

Also applies to: 183-183

@DrJKL DrJKL requested review from a team, KarryCharon, Yorha4D and shinshin86 as code owners December 9, 2025 01:18
@dosubot dosubot bot added size:L This PR changes 100-499 lines, ignoring generated files. and removed size:M This PR changes 30-99 lines, ignoring generated files. labels Dec 9, 2025
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

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

⚠️ Outside diff range comments (1)
src/components/sidebar/tabs/AssetsSidebarTab.vue (1)

5-25: Add an accessible label to the copy Job ID button

The icon-only copy button in the alt-title block has no accessible label. Reuse the existing i18n key so screen reader users get a clear action description.

Suggested change:

-          <button
-            class="m-0 cursor-pointer border-0 bg-transparent p-0 outline-0"
-            role="button"
-            @click="copyJobId"
-          >
+          <button
+            class="m-0 cursor-pointer border-0 bg-transparent p-0 outline-0"
+            :aria-label="$t('mediaAsset.actions.copyJobId')"
+            @click="copyJobId"
+          >

This keeps the visual design the same while improving accessibility, and it uses an existing translation key.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: ASSERTIVE

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 104e095 and cdd33c1.

📒 Files selected for processing (2)
  • src/components/sidebar/tabs/AssetsSidebarTab.vue (6 hunks)
  • src/locales/en/main.json (2 hunks)
🧰 Additional context used
📓 Path-based instructions (13)
src/**/*.vue

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/**/*.{vue,ts}

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.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/components/sidebar/tabs/AssetsSidebarTab.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/components/sidebar/tabs/AssetsSidebarTab.vue
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.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/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.vue

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,css}

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/components/**/*.{vue,ts,js}

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

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

**/*.vue: Use Vue 3 SFCs with Composition API only (use <script setup lang="ts">, not Options API)
Avoid using <style> blocks; use Tailwind 4 for all styling
Use defineProps with TypeScript style default declaration; do not use withDefaults or runtime props declaration
Prefer useModel over separately defining a prop and emit
Use computed instead of a ref and watch if possible
Avoid using ref if a prop would accomplish the design goals; avoid using computed if a ref or prop directly would work
Do not import Vue macros unnecessarily
Never use the dark: Tailwind variant; use semantic values from the style.css theme instead (e.g., bg-node-component-surface)
Never use :class="[]" to merge class names; always use cn() from @/utils/tailwindUtil (e.g., <div :class="cn('text-node-component-header-icon', hasError && 'text-danger')" />)
Leverage VueUse functions for performance-enhancing styles
Avoid new usage of PrimeVue components
Use Vue 3 Teleport component when needed
Use Vue 3 Suspense for async components

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/*.{ts,vue}

📄 CodeRabbit inference engine (AGENTS.md)

**/*.{ts,vue}: Use camelCase for variable and function names
Indent with 2 spaces (see .prettierrc)
Use single quotes for strings (see .prettierrc)
No trailing semicolons (see .prettierrc)
Maximum line width of 80 characters (see .prettierrc)
Sort and group imports by plugin (run pnpm format before committing)
Never use any type; use proper TypeScript types instead
Never use as any type assertions; fix the underlying type issue instead
Avoid code comments unless absolutely necessary; write expressive, self-documenting code instead
When writing new code, ask if there is a simpler way to introduce the same functionality; if yes, choose the simpler approach
Use refactoring to make complex code simpler
Use es-toolkit for utility functions
Use Vite for fast development and building
Implement proper error handling
Write tests for all changes, especially bug fixes to catch future regressions

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
**/components/**/*.vue

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
src/locales/**/*.json

📄 CodeRabbit inference engine (AGENTS.md)

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

Files:

  • src/locales/en/main.json
🧠 Learnings (9)
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Replace PrimeVue TabMenu component with Tabs without panels

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:02.860Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-11-24T19:47:02.860Z
Learning: Applies to src/**/*.vue : Utilize Vue 3's Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Use Vue 3 Teleport component when needed

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-11-24T19:47:45.616Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/components/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:45.616Z
Learning: Applies to src/components/**/*.vue : Use Teleport/Suspense when needed for component rendering

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.vue
📚 Learning: 2025-12-06T00:52:35.750Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: AGENTS.md:0-0
Timestamp: 2025-12-06T00:52:35.750Z
Learning: Applies to **/*.vue : Avoid new usage of PrimeVue components

Applied to files:

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

Applied to files:

  • src/components/sidebar/tabs/AssetsSidebarTab.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: setup
  • GitHub Check: lint-and-format
🔇 Additional comments (2)
src/components/sidebar/tabs/AssetsSidebarTab.vue (2)

2-4: SidebarTabTemplate migration looks correct

Using SidebarTabTemplate with a conditional title and the existing header/body/footer slots preserves structure and keeps folder view using the alt-title slot properly. Import path and closing tag align with the new template.

Also applies to: 164-164, 183-183


28-49: Header/tab/filter spacing adjustments are safe

The padding changes on the folder header container, TabList, and MediaAssetFilterBar are purely presentational and do not alter behavior. They align with the shared sidebar layout and keep bindings and reactive logic untouched.

Comment on lines +2085 to 2151
"allCategory": "All {category}",
"allModels": "All Models",
"assetCollection": "Asset collection",
"checkpoints": "Checkpoints",
"assets": "Assets",
"baseModels": "Base models",
"browseAssets": "Browse Assets",
"noAssetsFound": "No assets found",
"tryAdjustingFilters": "Try adjusting your search or filters",
"loadingModels": "Loading {type}...",
"connectionError": "Please check your connection and try again",
"failedToCreateNode": "Failed to create node. Please try again or check console for details.",
"noModelsInFolder": "No {type} available in this folder",
"uploadModel": "Import",
"uploadModelFromCivitai": "Import a model from Civitai",
"uploadModelFailedToRetrieveMetadata": "Failed to retrieve metadata. Please check the link and try again.",
"onlyCivitaiUrlsSupported": "Only Civitai URLs are supported",
"uploadModelDescription1": "Paste a Civitai model download link to add it to your library.",
"uploadModelDescription2": "Only links from <a href=\"https://civitai.com\" target=\"_blank\" class=\"text-muted-foreground\">https://civitai.com</a> are supported at the moment",
"uploadModelDescription3": "Max file size: <strong>1 GB</strong>",
"checkpoints": "Checkpoints",
"civitaiLinkExample": "<strong>Example:</strong> <a href=\"https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor\" target=\"_blank\" class=\"text-muted-foreground\">https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor</a>",
"civitaiLinkLabel": "Civitai model <span class=\"font-bold italic\">download</span> link",
"civitaiLinkPlaceholder": "Paste link here",
"civitaiLinkExample": "<strong>Example:</strong> <a href=\"https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor\" target=\"_blank\" class=\"text-muted-foreground\">https://civitai.com/api/download/models/833921?type=Model&format=SafeTensor</a>",
"confirmModelDetails": "Confirm Model Details",
"connectionError": "Please check your connection and try again",
"errorFileTooLarge": "File exceeds the maximum allowed size limit",
"errorFormatNotAllowed": "Only SafeTensor format is allowed",
"errorModelTypeNotSupported": "This model type is not supported",
"errorUnknown": "An unexpected error occurred",
"errorUnsafePickleScan": "CivitAI detected potentially unsafe code in this file",
"errorUnsafeVirusScan": "CivitAI detected malware or suspicious content in this file",
"errorUploadFailed": "Failed to import asset. Please try again.",
"failedToCreateNode": "Failed to create node. Please try again or check console for details.",
"fileFormats": "File formats",
"fileName": "File Name",
"fileSize": "File Size",
"filterBy": "Filter by",
"findInLibrary": "Find it in the {type} section of the models library.",
"finish": "Finish",
"jobId": "Job ID",
"loadingModels": "Loading {type}...",
"modelAssociatedWithLink": "The model associated with the link you provided:",
"modelName": "Model Name",
"modelNamePlaceholder": "Enter a name for this model",
"tags": "Tags",
"tagsPlaceholder": "e.g., models, checkpoint",
"tagsHelp": "Separate tags with commas",
"upload": "Import",
"uploadingModel": "Importing model...",
"uploadSuccess": "Model imported successfully!",
"uploadFailed": "Import failed",
"uploadModelHelpVideo": "Upload Model Help Video",
"uploadModelHowDoIFindThis": "How do I find this?",
"modelAssociatedWithLink": "The model associated with the link you provided:",
"modelTypeSelectorLabel": "What type of model is this?",
"modelTypeSelectorPlaceholder": "Select model type",
"selectModelType": "Select model type",
"notSureLeaveAsIs": "Not sure? Just leave this as is",
"modelUploaded": "Model imported! 🎉",
"findInLibrary": "Find it in the {type} section of the models library.",
"finish": "Finish",
"upgradeToUnlockFeature": "Upgrade to unlock this feature",
"upgradeFeatureDescription": "This feature is only available with Creator or Pro plans.",
"allModels": "All Models",
"allCategory": "All {category}",
"unknown": "Unknown",
"fileFormats": "File formats",
"baseModels": "Base models",
"filterBy": "Filter by",
"sortBy": "Sort by",
"sortAZ": "A-Z",
"sortZA": "Z-A",
"sortRecent": "Recent",
"sortPopular": "Popular",
"noAssetsFound": "No assets found",
"noModelsInFolder": "No {type} available in this folder",
"notSureLeaveAsIs": "Not sure? Just leave this as is",
"onlyCivitaiUrlsSupported": "Only Civitai URLs are supported",
"selectFrameworks": "Select Frameworks",
"selectModelType": "Select model type",
"selectProjects": "Select Projects",
"sortAZ": "A-Z",
"sortBy": "Sort by",
"sortingType": "Sorting Type",
"errorFileTooLarge": "File exceeds the maximum allowed size limit",
"errorFormatNotAllowed": "Only SafeTensor format is allowed",
"errorUnsafePickleScan": "CivitAI detected potentially unsafe code in this file",
"errorUnsafeVirusScan": "CivitAI detected malware or suspicious content in this file",
"errorModelTypeNotSupported": "This model type is not supported",
"errorUnknown": "An unexpected error occurred",
"errorUploadFailed": "Failed to import asset. Please try again.",
"sortPopular": "Popular",
"sortRecent": "Recent",
"sortZA": "Z-A",
"tags": "Tags",
"tagsHelp": "Separate tags with commas",
"tagsPlaceholder": "e.g., models, checkpoint",
"tryAdjustingFilters": "Try adjusting your search or filters",
"unknown": "Unknown",
"upgradeFeatureDescription": "This feature is only available with Creator or Pro plans.",
"upgradeToUnlockFeature": "Upgrade to unlock this feature",
"upload": "Import",
"uploadFailed": "Import failed",
"uploadingModel": "Importing model...",
"uploadModel": "Import",
"uploadModelDescription1": "Paste a Civitai model download link to add it to your library.",
"uploadModelDescription2": "Only links from <a href=\"https://civitai.com\" target=\"_blank\" class=\"text-muted-foreground\">https://civitai.com</a> are supported at the moment",
"uploadModelDescription3": "Max file size: <strong>1 GB</strong>",
"uploadModelFailedToRetrieveMetadata": "Failed to retrieve metadata. Please check the link and try again.",
"uploadModelFromCivitai": "Import a model from Civitai",
"uploadModelHelpVideo": "Upload Model Help Video",
"uploadModelHowDoIFindThis": "How do I find this?",
"uploadSuccess": "Model imported successfully!",
"ariaLabel": {
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

assetBrowser i18n additions look consistent; ensure HTML strings are sanitized on render

The new assetBrowser keys (sorting/filtering, upload/import, Civitai link helpers, jobId, etc.) are well-namespaced and match existing naming patterns, and assetBrowser.jobId cleanly supports the updated Assets sidebar UI.

One caution: civitaiLinkExample embeds HTML (including an <a> tag). Wherever this key is rendered, make sure it's passed through your existing DOMPurify-based HTML sanitization helper rather than bound directly with raw v-html, to stay aligned with the XSS protection guidelines.

🤖 Prompt for AI Agents
In src/locales/en/main.json around lines 2085-2151 the civitaiLinkExample value
contains inline HTML; locate all places this key is rendered in the UI and
replace any direct raw HTML binding (e.g., v-html or innerHTML) with the
project's HTML-sanitization helper that uses DOMPurify (or wrap the string
through DOMPurify.sanitize) before injecting into the DOM; ensure the sanitizer
is configured to allow the minimal tags/attributes needed (anchor, strong,
class, target) and add/update a quick test or assertion that the rendered output
comes from the sanitized string rather than raw user input.

@DrJKL DrJKL force-pushed the drjkl/assets-classes branch from cdd33c1 to 5705103 Compare December 9, 2025 03:35
Copy link
Contributor

@christian-byrne christian-byrne left a comment

Choose a reason for hiding this comment

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

Nice, LGTM!

@christian-byrne christian-byrne merged commit 5b91434 into main Dec 9, 2025
27 of 28 checks passed
@christian-byrne christian-byrne deleted the drjkl/assets-classes branch December 9, 2025 07:33
Enferlain pushed a commit to Enferlain/ComfyUI_frontend that referenced this pull request Dec 9, 2025
## Summary

Unify the current sidebar tabs, structurally and aesthetically.

## Changes

- Removes the Assets only Layout
- Standardizes the title styling and spacing across the tabs.

## Review Focus

<!-- Critical design decisions or edge cases that need attention -->

<!-- If this PR fixes an issue, uncomment and update the line below -->
<!-- Fixes #ISSUE_NUMBER -->

## Screenshots (if applicable)

<!-- Add screenshots or video recording to help explain your changes -->

┆Issue is synchronized with this [Notion
page](https://www.notion.so/PR-7215-WIP-Sidebar-Tabs-component-and-style-alignment-2c26d73d3650817193bfd752e0d0bbde)
by [Unito](https://www.unito.io)
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