From 1c9715de4eb5cefa0b8c4645f4b9cca7f41bced5 Mon Sep 17 00:00:00 2001 From: orkhanart <88044120+orkhanart@users.noreply.github.com> Date: Fri, 28 Nov 2025 20:59:59 -0800 Subject: [PATCH] feat(ui): Enhanced bottom bar modal with expandable view, sidebar, and standardized cards MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add expand mode for bottom bar modal (half-page size) - Add collapsible left sidebar with category navigation - Standardize all cards to square aspect ratio across all tabs - Set canvas default zoom to 75% with auto-center on load - Add sidebar toggle button in modal header - Dynamic category lists per tab (Models, Workflows, Assets, Templates, Packages) - Unified card component styles with hover effects - Responsive grid columns (4 normal, 6 extended) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- ComfyUI_vibe/src/components.d.ts | 31 + .../common/sidebar/SidebarGridCard.vue | 42 + .../common/sidebar/SidebarSearchBox.vue | 43 + .../common/sidebar/SidebarTreeCategory.vue | 40 + .../common/sidebar/SidebarTreeItem.vue | 64 ++ .../common/sidebar/SidebarViewToggle.vue | 26 + .../src/components/common/sidebar/index.ts | 5 + .../v1/sidebar/LibraryBrandKitSection.vue | 106 ++ .../v1/sidebar/LibraryModelsSection.vue | 98 ++ .../v1/sidebar/LibraryNodesSection.vue | 103 ++ .../v1/sidebar/LibraryWorkflowsSection.vue | 87 ++ .../v1/sidebar/V1SidebarAssetsTab.vue | 22 + .../v1/sidebar/V1SidebarIconBar.vue | 55 ++ .../v1/sidebar/V1SidebarModelsTab.vue | 81 ++ .../v1/sidebar/V1SidebarNodesTab.vue | 71 ++ .../components/v1/sidebar/V1SidebarPanel.vue | 192 ++++ .../v1/sidebar/V1SidebarTemplatesTab.vue | 85 ++ .../v1/sidebar/V1SidebarWorkflowsTab.vue | 57 ++ .../src/components/v1/sidebar/index.ts | 7 + .../components/v2/canvas/CanvasBottomBar.vue | 513 ++++++++-- .../v2/canvas/CanvasLeftSidebar.vue | 909 +----------------- .../components/v2/canvas/CanvasLogoMenu.vue | 110 +++ .../src/components/v2/canvas/CanvasTabBar.vue | 514 +--------- .../src/components/v2/canvas/CanvasTabs.vue | 72 ++ .../components/v2/canvas/LibrarySidebar.vue | 270 ++++++ .../v2/canvas/NodePropertiesPanel.vue | 104 ++ .../src/components/v2/nodes/FlowNode.vue | 134 +-- .../components/v2/nodes/FlowNodeMinimized.vue | 169 ++++ .../src/components/v2/sidebar/V2NodePanel.vue | 198 ++++ .../v2/workspace/CreateProjectDialog.vue | 105 ++ .../v2/workspace/WorkspaceEmptyState.vue | 35 + .../v2/workspace/WorkspaceSearchInput.vue | 23 + .../v2/workspace/WorkspaceSortSelect.vue | 30 + .../v2/workspace/WorkspaceViewHeader.vue | 37 + .../v2/workspace/WorkspaceViewToggle.vue | 38 + .../src/components/v2/workspace/index.ts | 6 + ComfyUI_vibe/src/data/linearTemplates.ts | 433 +++++++++ ComfyUI_vibe/src/data/sidebarMockData.ts | 460 +++++++++ ComfyUI_vibe/src/data/workflowMockData.ts | 166 ++++ ComfyUI_vibe/src/stores/linearModeStore.ts | 349 +++++++ ComfyUI_vibe/src/stores/uiStore.ts | 10 +- ComfyUI_vibe/src/types/linear.ts | 176 ++++ ComfyUI_vibe/src/views/v2/CanvasView.vue | 278 +----- .../src/views/v2/workspace/CanvasesView.vue | 151 +-- .../src/views/v2/workspace/ProjectsView.vue | 208 +--- 45 files changed, 4601 insertions(+), 2112 deletions(-) create mode 100644 ComfyUI_vibe/src/components/common/sidebar/SidebarGridCard.vue create mode 100644 ComfyUI_vibe/src/components/common/sidebar/SidebarSearchBox.vue create mode 100644 ComfyUI_vibe/src/components/common/sidebar/SidebarTreeCategory.vue create mode 100644 ComfyUI_vibe/src/components/common/sidebar/SidebarTreeItem.vue create mode 100644 ComfyUI_vibe/src/components/common/sidebar/SidebarViewToggle.vue create mode 100644 ComfyUI_vibe/src/components/common/sidebar/index.ts create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/LibraryBrandKitSection.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/LibraryModelsSection.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/LibraryNodesSection.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/LibraryWorkflowsSection.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarAssetsTab.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarIconBar.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarModelsTab.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarNodesTab.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarPanel.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarTemplatesTab.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/V1SidebarWorkflowsTab.vue create mode 100644 ComfyUI_vibe/src/components/v1/sidebar/index.ts create mode 100644 ComfyUI_vibe/src/components/v2/canvas/CanvasLogoMenu.vue create mode 100644 ComfyUI_vibe/src/components/v2/canvas/CanvasTabs.vue create mode 100644 ComfyUI_vibe/src/components/v2/canvas/LibrarySidebar.vue create mode 100644 ComfyUI_vibe/src/components/v2/canvas/NodePropertiesPanel.vue create mode 100644 ComfyUI_vibe/src/components/v2/nodes/FlowNodeMinimized.vue create mode 100644 ComfyUI_vibe/src/components/v2/sidebar/V2NodePanel.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/CreateProjectDialog.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/WorkspaceEmptyState.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/WorkspaceSearchInput.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/WorkspaceSortSelect.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/WorkspaceViewHeader.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/WorkspaceViewToggle.vue create mode 100644 ComfyUI_vibe/src/components/v2/workspace/index.ts create mode 100644 ComfyUI_vibe/src/data/linearTemplates.ts create mode 100644 ComfyUI_vibe/src/data/sidebarMockData.ts create mode 100644 ComfyUI_vibe/src/data/workflowMockData.ts create mode 100644 ComfyUI_vibe/src/stores/linearModeStore.ts create mode 100644 ComfyUI_vibe/src/types/linear.ts diff --git a/ComfyUI_vibe/src/components.d.ts b/ComfyUI_vibe/src/components.d.ts index e87a907a1..22181b20c 100644 --- a/ComfyUI_vibe/src/components.d.ts +++ b/ComfyUI_vibe/src/components.d.ts @@ -7,25 +7,56 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { + AssetsTab: typeof import('./components/v2/workspace/AssetsTab.vue')['default'] CanvasBottomBar: typeof import('./components/v2/canvas/CanvasBottomBar.vue')['default'] CanvasLeftSidebar: typeof import('./components/v2/canvas/CanvasLeftSidebar.vue')['default'] + CanvasLogoMenu: typeof import('./components/v2/canvas/CanvasLogoMenu.vue')['default'] CanvasTabBar: typeof import('./components/v2/canvas/CanvasTabBar.vue')['default'] + CanvasTabs: typeof import('./components/v2/canvas/CanvasTabs.vue')['default'] + CreateProjectDialog: typeof import('./components/v2/workspace/CreateProjectDialog.vue')['default'] FlowNode: typeof import('./components/v2/nodes/FlowNode.vue')['default'] FlowNodeMinimized: typeof import('./components/v2/nodes/FlowNodeMinimized.vue')['default'] + LibraryBrandKitSection: typeof import('./components/v1/sidebar/LibraryBrandKitSection.vue')['default'] + LibraryModelsSection: typeof import('./components/v1/sidebar/LibraryModelsSection.vue')['default'] + LibraryNodesSection: typeof import('./components/v1/sidebar/LibraryNodesSection.vue')['default'] + LibrarySidebar: typeof import('./components/v2/canvas/LibrarySidebar.vue')['default'] + LibraryWorkflowsSection: typeof import('./components/v1/sidebar/LibraryWorkflowsSection.vue')['default'] + ModelsTab: typeof import('./components/v2/workspace/ModelsTab.vue')['default'] NodeHeader: typeof import('./components/v2/nodes/NodeHeader.vue')['default'] + NodePropertiesPanel: typeof import('./components/v2/canvas/NodePropertiesPanel.vue')['default'] NodeSlots: typeof import('./components/v2/nodes/NodeSlots.vue')['default'] NodeWidgets: typeof import('./components/v2/nodes/NodeWidgets.vue')['default'] + PackagesTab: typeof import('./components/v2/workspace/PackagesTab.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + SidebarGridCard: typeof import('./components/common/sidebar/SidebarGridCard.vue')['default'] + SidebarSearchBox: typeof import('./components/common/sidebar/SidebarSearchBox.vue')['default'] + SidebarTreeCategory: typeof import('./components/common/sidebar/SidebarTreeCategory.vue')['default'] + SidebarTreeItem: typeof import('./components/common/sidebar/SidebarTreeItem.vue')['default'] + SidebarViewToggle: typeof import('./components/common/sidebar/SidebarViewToggle.vue')['default'] SlotDot: typeof import('./components/v2/nodes/SlotDot.vue')['default'] + V1SidebarAssetsTab: typeof import('./components/v1/sidebar/V1SidebarAssetsTab.vue')['default'] + V1SidebarIconBar: typeof import('./components/v1/sidebar/V1SidebarIconBar.vue')['default'] + V1SidebarModelsTab: typeof import('./components/v1/sidebar/V1SidebarModelsTab.vue')['default'] + V1SidebarNodesTab: typeof import('./components/v1/sidebar/V1SidebarNodesTab.vue')['default'] + V1SidebarPanel: typeof import('./components/v1/sidebar/V1SidebarPanel.vue')['default'] + V1SidebarTemplatesTab: typeof import('./components/v1/sidebar/V1SidebarTemplatesTab.vue')['default'] + V1SidebarWorkflowsTab: typeof import('./components/v1/sidebar/V1SidebarWorkflowsTab.vue')['default'] + V2NodePanel: typeof import('./components/v2/sidebar/V2NodePanel.vue')['default'] WidgetColor: typeof import('./components/v2/nodes/widgets/WidgetColor.vue')['default'] WidgetNumber: typeof import('./components/v2/nodes/widgets/WidgetNumber.vue')['default'] WidgetSelect: typeof import('./components/v2/nodes/widgets/WidgetSelect.vue')['default'] WidgetSlider: typeof import('./components/v2/nodes/widgets/WidgetSlider.vue')['default'] WidgetText: typeof import('./components/v2/nodes/widgets/WidgetText.vue')['default'] WidgetToggle: typeof import('./components/v2/nodes/widgets/WidgetToggle.vue')['default'] + WorkflowsTab: typeof import('./components/v2/workspace/WorkflowsTab.vue')['default'] + WorkspaceEmptyState: typeof import('./components/v2/workspace/WorkspaceEmptyState.vue')['default'] WorkspaceLayout: typeof import('./components/v2/layout/WorkspaceLayout.vue')['default'] + WorkspaceSearchInput: typeof import('./components/v2/workspace/WorkspaceSearchInput.vue')['default'] WorkspaceSidebar: typeof import('./components/v2/layout/WorkspaceSidebar.vue')['default'] + WorkspaceSortSelect: typeof import('./components/v2/workspace/WorkspaceSortSelect.vue')['default'] + WorkspaceViewHeader: typeof import('./components/v2/workspace/WorkspaceViewHeader.vue')['default'] + WorkspaceViewToggle: typeof import('./components/v2/workspace/WorkspaceViewToggle.vue')['default'] } export interface ComponentCustomProperties { Tooltip: typeof import('primevue/tooltip')['default'] diff --git a/ComfyUI_vibe/src/components/common/sidebar/SidebarGridCard.vue b/ComfyUI_vibe/src/components/common/sidebar/SidebarGridCard.vue new file mode 100644 index 000000000..b5ca248e7 --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/SidebarGridCard.vue @@ -0,0 +1,42 @@ + + + diff --git a/ComfyUI_vibe/src/components/common/sidebar/SidebarSearchBox.vue b/ComfyUI_vibe/src/components/common/sidebar/SidebarSearchBox.vue new file mode 100644 index 000000000..fb0339466 --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/SidebarSearchBox.vue @@ -0,0 +1,43 @@ + + + diff --git a/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeCategory.vue b/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeCategory.vue new file mode 100644 index 000000000..9955153cf --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeCategory.vue @@ -0,0 +1,40 @@ + + + diff --git a/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeItem.vue b/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeItem.vue new file mode 100644 index 000000000..994742949 --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/SidebarTreeItem.vue @@ -0,0 +1,64 @@ + + + diff --git a/ComfyUI_vibe/src/components/common/sidebar/SidebarViewToggle.vue b/ComfyUI_vibe/src/components/common/sidebar/SidebarViewToggle.vue new file mode 100644 index 000000000..23167dd8c --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/SidebarViewToggle.vue @@ -0,0 +1,26 @@ + + + diff --git a/ComfyUI_vibe/src/components/common/sidebar/index.ts b/ComfyUI_vibe/src/components/common/sidebar/index.ts new file mode 100644 index 000000000..2a8ade635 --- /dev/null +++ b/ComfyUI_vibe/src/components/common/sidebar/index.ts @@ -0,0 +1,5 @@ +export { default as SidebarTreeCategory } from './SidebarTreeCategory.vue' +export { default as SidebarTreeItem } from './SidebarTreeItem.vue' +export { default as SidebarGridCard } from './SidebarGridCard.vue' +export { default as SidebarViewToggle } from './SidebarViewToggle.vue' +export { default as SidebarSearchBox } from './SidebarSearchBox.vue' diff --git a/ComfyUI_vibe/src/components/v1/sidebar/LibraryBrandKitSection.vue b/ComfyUI_vibe/src/components/v1/sidebar/LibraryBrandKitSection.vue new file mode 100644 index 000000000..bac8edce4 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/LibraryBrandKitSection.vue @@ -0,0 +1,106 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/LibraryModelsSection.vue b/ComfyUI_vibe/src/components/v1/sidebar/LibraryModelsSection.vue new file mode 100644 index 000000000..e7ca9ab14 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/LibraryModelsSection.vue @@ -0,0 +1,98 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/LibraryNodesSection.vue b/ComfyUI_vibe/src/components/v1/sidebar/LibraryNodesSection.vue new file mode 100644 index 000000000..804759d30 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/LibraryNodesSection.vue @@ -0,0 +1,103 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/LibraryWorkflowsSection.vue b/ComfyUI_vibe/src/components/v1/sidebar/LibraryWorkflowsSection.vue new file mode 100644 index 000000000..3d9eb1ee4 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/LibraryWorkflowsSection.vue @@ -0,0 +1,87 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarAssetsTab.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarAssetsTab.vue new file mode 100644 index 000000000..5427f2ef8 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarAssetsTab.vue @@ -0,0 +1,22 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarIconBar.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarIconBar.vue new file mode 100644 index 000000000..ff11f7a55 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarIconBar.vue @@ -0,0 +1,55 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarModelsTab.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarModelsTab.vue new file mode 100644 index 000000000..134eee377 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarModelsTab.vue @@ -0,0 +1,81 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarNodesTab.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarNodesTab.vue new file mode 100644 index 000000000..f0340ac04 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarNodesTab.vue @@ -0,0 +1,71 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarPanel.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarPanel.vue new file mode 100644 index 000000000..59c10d129 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarPanel.vue @@ -0,0 +1,192 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarTemplatesTab.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarTemplatesTab.vue new file mode 100644 index 000000000..c00d231f9 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarTemplatesTab.vue @@ -0,0 +1,85 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarWorkflowsTab.vue b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarWorkflowsTab.vue new file mode 100644 index 000000000..3124d3b04 --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/V1SidebarWorkflowsTab.vue @@ -0,0 +1,57 @@ + + + diff --git a/ComfyUI_vibe/src/components/v1/sidebar/index.ts b/ComfyUI_vibe/src/components/v1/sidebar/index.ts new file mode 100644 index 000000000..3202451dc --- /dev/null +++ b/ComfyUI_vibe/src/components/v1/sidebar/index.ts @@ -0,0 +1,7 @@ +export { default as V1SidebarPanel } from './V1SidebarPanel.vue' +export { default as V1SidebarIconBar } from './V1SidebarIconBar.vue' +export { default as V1SidebarNodesTab } from './V1SidebarNodesTab.vue' +export { default as V1SidebarModelsTab } from './V1SidebarModelsTab.vue' +export { default as V1SidebarWorkflowsTab } from './V1SidebarWorkflowsTab.vue' +export { default as V1SidebarAssetsTab } from './V1SidebarAssetsTab.vue' +export { default as V1SidebarTemplatesTab } from './V1SidebarTemplatesTab.vue' diff --git a/ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue b/ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue index a451a1909..1cadb4622 100644 --- a/ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue +++ b/ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue @@ -1,5 +1,5 @@ @@ -47,116 +146,298 @@ const mockTemplates = [
- -
- - {{ BOTTOM_BAR_TABS.find(t => t.id === activeBottomTab)?.label }} - -
- - -
-
- - + +
+
+
Categories
+
+
+
- -
- -
-
-
{{ model.name }}
-
{{ model.type }}
+ +
+ +
+
+ + +
+ + {{ BOTTOM_BAR_TABS.find(t => t.id === activeBottomTab)?.label }} + + + +
+
+ + + +
+ +
- -
-
-
{{ workflow.name }}
-
{{ workflow.date }}
+ +
+ +
+ + + ⌘K +
+ + +
+ Sort: +
- -
-
+
+ +
+ + +
+
Recents
+
+
- -
+ +
+
-
- + - -
- - Bookmarked items will appear here + + + + + + + + + + + +
+ + +
+ + No bookmarks yet + Bookmarked items will appear here +
-
+