From 67af6178680ddedb8da3cf474d097eb10a2882c8 Mon Sep 17 00:00:00 2001 From: orkhanart <88044120+orkhanart@users.noreply.github.com> Date: Fri, 28 Nov 2025 18:23:26 -0800 Subject: [PATCH] feat(ui): Implement experimental UI layer with versioned architecture - Reorganize components into v1/v2 versioned structure - Add common components for shared UI elements - Introduce composables for reusable logic - Restructure views into v1/v2 directories - Remove old component structure in favor of versioned approach - Update router and UI store for new architecture --- ComfyUI_vibe/CLAUDE.md | 61 +++++++++++++++---- ComfyUI_vibe/src/components.d.ts | 35 +++++------ ComfyUI_vibe/src/components/common/.gitkeep | 0 .../src/components/v1/canvas/.gitkeep | 0 .../src/components/v1/dialogs/.gitkeep | 0 .../src/components/v1/layout/.gitkeep | 0 ComfyUI_vibe/src/components/v1/nodes/.gitkeep | 0 .../src/components/v1/nodes/widgets/.gitkeep | 0 .../src/components/v1/workspace/.gitkeep | 0 .../{ => v2}/canvas/CanvasBottomBar.vue | 0 .../{ => v2}/canvas/CanvasLeftSidebar.vue | 0 .../{ => v2}/canvas/CanvasTabBar.vue | 37 +++++++++++ .../{ => v2}/layout/WorkspaceLayout.vue | 0 .../{ => v2}/layout/WorkspaceSidebar.vue | 0 .../components/{ => v2}/nodes/FlowNode.vue | 0 .../components/{ => v2}/nodes/NodeHeader.vue | 0 .../components/{ => v2}/nodes/NodeSlots.vue | 0 .../components/{ => v2}/nodes/NodeWidgets.vue | 0 .../src/components/{ => v2}/nodes/SlotDot.vue | 0 .../src/components/{ => v2}/nodes/index.ts | 0 .../{ => v2}/nodes/widgets/WidgetColor.vue | 0 .../{ => v2}/nodes/widgets/WidgetNumber.vue | 0 .../{ => v2}/nodes/widgets/WidgetSelect.vue | 0 .../{ => v2}/nodes/widgets/WidgetSlider.vue | 0 .../{ => v2}/nodes/widgets/WidgetText.vue | 0 .../{ => v2}/nodes/widgets/WidgetToggle.vue | 0 ComfyUI_vibe/src/composables/common/.gitkeep | 0 ComfyUI_vibe/src/composables/v1/.gitkeep | 0 ComfyUI_vibe/src/composables/v2/.gitkeep | 0 ComfyUI_vibe/src/router.ts | 33 ++++++---- ComfyUI_vibe/src/stores/uiStore.ts | 22 +++++-- ComfyUI_vibe/src/views/v1/.gitkeep | 0 ComfyUI_vibe/src/views/{ => v2}/AuthView.vue | 0 .../src/views/{ => v2}/CanvasView.vue | 40 ++---------- ComfyUI_vibe/src/views/{ => v2}/HomeView.vue | 0 .../src/views/{ => v2}/WorkspaceView.vue | 2 +- .../views/{ => v2}/workspace/AssetsView.vue | 0 .../views/{ => v2}/workspace/CanvasesView.vue | 0 .../{ => v2}/workspace/DashboardView.vue | 0 .../views/{ => v2}/workspace/ModelsView.vue | 0 .../{ => v2}/workspace/ProjectDetailView.vue | 0 .../views/{ => v2}/workspace/ProjectsView.vue | 0 .../views/{ => v2}/workspace/SettingsView.vue | 0 .../{ => v2}/workspace/WorkflowsView.vue | 0 44 files changed, 147 insertions(+), 83 deletions(-) create mode 100644 ComfyUI_vibe/src/components/common/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/canvas/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/dialogs/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/layout/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/nodes/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/nodes/widgets/.gitkeep create mode 100644 ComfyUI_vibe/src/components/v1/workspace/.gitkeep rename ComfyUI_vibe/src/components/{ => v2}/canvas/CanvasBottomBar.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/canvas/CanvasLeftSidebar.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/canvas/CanvasTabBar.vue (90%) rename ComfyUI_vibe/src/components/{ => v2}/layout/WorkspaceLayout.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/layout/WorkspaceSidebar.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/FlowNode.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/NodeHeader.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/NodeSlots.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/NodeWidgets.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/SlotDot.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/index.ts (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetColor.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetNumber.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetSelect.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetSlider.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetText.vue (100%) rename ComfyUI_vibe/src/components/{ => v2}/nodes/widgets/WidgetToggle.vue (100%) create mode 100644 ComfyUI_vibe/src/composables/common/.gitkeep create mode 100644 ComfyUI_vibe/src/composables/v1/.gitkeep create mode 100644 ComfyUI_vibe/src/composables/v2/.gitkeep create mode 100644 ComfyUI_vibe/src/views/v1/.gitkeep rename ComfyUI_vibe/src/views/{ => v2}/AuthView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/CanvasView.vue (87%) rename ComfyUI_vibe/src/views/{ => v2}/HomeView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/WorkspaceView.vue (80%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/AssetsView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/CanvasesView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/DashboardView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/ModelsView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/ProjectDetailView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/ProjectsView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/SettingsView.vue (100%) rename ComfyUI_vibe/src/views/{ => v2}/workspace/WorkflowsView.vue (100%) diff --git a/ComfyUI_vibe/CLAUDE.md b/ComfyUI_vibe/CLAUDE.md index 3c9deacd2..549ad6345 100644 --- a/ComfyUI_vibe/CLAUDE.md +++ b/ComfyUI_vibe/CLAUDE.md @@ -165,19 +165,58 @@ const stats = SystemStatsSchema.parse(response.data) ### 9. File Organization +This project supports **two parallel interface versions**: +- **Interface 1.0 (v1)**: Legacy UI/UX - compatible with current ComfyUI +- **Interface 2.0 (v2)**: Experimental UI/UX - new design patterns + ``` src/ -├── components/ # Reusable Vue components -│ ├── common/ # Generic components (buttons, inputs) -│ ├── layout/ # Layout components (sidebar, header) -│ └── [feature]/ # Feature-specific components -├── composables/ # Vue composition functions -├── services/ # API clients and external services -├── stores/ # Pinia stores -├── types/ # TypeScript type definitions -├── utils/ # Pure utility functions -├── views/ # Page/route components -└── assets/ # Static assets and CSS +├── components/ +│ ├── common/ # Shared components across both versions +│ ├── v1/ # Interface 1.0 components +│ │ ├── canvas/ # Canvas components +│ │ ├── layout/ # Layout components +│ │ └── [feature]/ # Feature-specific components +│ └── v2/ # Interface 2.0 components (experimental) +│ ├── canvas/ # Canvas components +│ ├── dialogs/ # Dialog components +│ ├── layout/ # Layout components +│ ├── nodes/ # Node components +│ │ └── widgets/ # Widget components +│ └── workspace/ # Workspace components +├── composables/ +│ ├── common/ # Shared composables +│ ├── v1/ # V1-specific composables +│ └── v2/ # V2-specific composables +├── services/ # API clients (shared) +├── stores/ # Pinia stores (shared) +├── types/ # TypeScript types (shared) +├── utils/ # Utility functions (shared) +├── data/ # Static data files +├── views/ +│ ├── v1/ # Interface 1.0 views +│ └── v2/ # Interface 2.0 views +│ ├── workspace/ # Workspace sub-views +│ └── project/ # Project sub-views +└── assets/ + └── css/ # Stylesheets +``` + +**Import Patterns:** +```typescript +// V2 components +import CanvasView from '@/components/v2/canvas/CanvasView.vue' + +// V1 components +import CanvasView from '@/components/v1/canvas/CanvasView.vue' + +// Common/shared components +import Button from '@/components/common/Button.vue' + +// Shared services, stores, types (version-agnostic) +import { useComfyStore } from '@/stores/comfyStore' +import { comfyApi } from '@/services/comfyApi' +import type { NodeDefinition } from '@/types/node' ``` ### 10. Naming Conventions diff --git a/ComfyUI_vibe/src/components.d.ts b/ComfyUI_vibe/src/components.d.ts index 1bbdad317..16cc73667 100644 --- a/ComfyUI_vibe/src/components.d.ts +++ b/ComfyUI_vibe/src/components.d.ts @@ -7,26 +7,23 @@ export {} /* prettier-ignore */ declare module 'vue' { export interface GlobalComponents { - CanvasBottomBar: typeof import('./components/canvas/CanvasBottomBar.vue')['default'] - CanvasLeftSidebar: typeof import('./components/canvas/CanvasLeftSidebar.vue')['default'] - CanvasTabBar: typeof import('./components/canvas/CanvasTabBar.vue')['default'] - FlowNode: typeof import('./components/nodes/FlowNode.vue')['default'] - NodeHeader: typeof import('./components/nodes/NodeHeader.vue')['default'] - NodeSlots: typeof import('./components/nodes/NodeSlots.vue')['default'] - NodeWidgets: typeof import('./components/nodes/NodeWidgets.vue')['default'] + CanvasBottomBar: typeof import('./components/v2/canvas/CanvasBottomBar.vue')['default'] + CanvasLeftSidebar: typeof import('./components/v2/canvas/CanvasLeftSidebar.vue')['default'] + CanvasTabBar: typeof import('./components/v2/canvas/CanvasTabBar.vue')['default'] + FlowNode: typeof import('./components/v2/nodes/FlowNode.vue')['default'] + NodeHeader: typeof import('./components/v2/nodes/NodeHeader.vue')['default'] + NodeSlots: typeof import('./components/v2/nodes/NodeSlots.vue')['default'] + NodeWidgets: typeof import('./components/v2/nodes/NodeWidgets.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - SlotDot: typeof import('./components/nodes/SlotDot.vue')['default'] - WidgetColor: typeof import('./components/nodes/widgets/WidgetColor.vue')['default'] - WidgetNumber: typeof import('./components/nodes/widgets/WidgetNumber.vue')['default'] - WidgetSelect: typeof import('./components/nodes/widgets/WidgetSelect.vue')['default'] - WidgetSlider: typeof import('./components/nodes/widgets/WidgetSlider.vue')['default'] - WidgetText: typeof import('./components/nodes/widgets/WidgetText.vue')['default'] - WidgetToggle: typeof import('./components/nodes/widgets/WidgetToggle.vue')['default'] - WorkspaceLayout: typeof import('./components/layout/WorkspaceLayout.vue')['default'] - WorkspaceSidebar: typeof import('./components/layout/WorkspaceSidebar.vue')['default'] - } - export interface ComponentCustomProperties { - Tooltip: typeof import('primevue/tooltip')['default'] + SlotDot: typeof import('./components/v2/nodes/SlotDot.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'] + WorkspaceLayout: typeof import('./components/v2/layout/WorkspaceLayout.vue')['default'] + WorkspaceSidebar: typeof import('./components/v2/layout/WorkspaceSidebar.vue')['default'] } } diff --git a/ComfyUI_vibe/src/components/common/.gitkeep b/ComfyUI_vibe/src/components/common/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/canvas/.gitkeep b/ComfyUI_vibe/src/components/v1/canvas/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/dialogs/.gitkeep b/ComfyUI_vibe/src/components/v1/dialogs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/layout/.gitkeep b/ComfyUI_vibe/src/components/v1/layout/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/nodes/.gitkeep b/ComfyUI_vibe/src/components/v1/nodes/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/nodes/widgets/.gitkeep b/ComfyUI_vibe/src/components/v1/nodes/widgets/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/v1/workspace/.gitkeep b/ComfyUI_vibe/src/components/v1/workspace/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/ComfyUI_vibe/src/components/canvas/CanvasBottomBar.vue b/ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue similarity index 100% rename from ComfyUI_vibe/src/components/canvas/CanvasBottomBar.vue rename to ComfyUI_vibe/src/components/v2/canvas/CanvasBottomBar.vue diff --git a/ComfyUI_vibe/src/components/canvas/CanvasLeftSidebar.vue b/ComfyUI_vibe/src/components/v2/canvas/CanvasLeftSidebar.vue similarity index 100% rename from ComfyUI_vibe/src/components/canvas/CanvasLeftSidebar.vue rename to ComfyUI_vibe/src/components/v2/canvas/CanvasLeftSidebar.vue diff --git a/ComfyUI_vibe/src/components/canvas/CanvasTabBar.vue b/ComfyUI_vibe/src/components/v2/canvas/CanvasTabBar.vue similarity index 90% rename from ComfyUI_vibe/src/components/canvas/CanvasTabBar.vue rename to ComfyUI_vibe/src/components/v2/canvas/CanvasTabBar.vue index 4dfd30648..20daccbc2 100644 --- a/ComfyUI_vibe/src/components/canvas/CanvasTabBar.vue +++ b/ComfyUI_vibe/src/components/v2/canvas/CanvasTabBar.vue @@ -1,6 +1,7 @@