From 0f4bceafdd4c731c42a5c4b26f112ae84112d5f6 Mon Sep 17 00:00:00 2001 From: pythongosssss <125205205+pythongosssss@users.noreply.github.com> Date: Mon, 23 Feb 2026 18:05:52 +0000 Subject: [PATCH] App mode - App mode toolbar - 3 (#9025) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary Adds a new toolbar for app mode ## Changes - **What**: Adds new toolbar with builder mode disabled ## Screenshots (if applicable) image ┆Issue is synchronized with this [Notion page](https://www.notion.so/PR-9025-App-mode-App-mode-toolbar-3-30d6d73d365081549af6fdd1937b098f) by [Unito](https://www.unito.io) --- src/components/appMode/AppModeToolbar.vue | 126 ++++++++++++++++++ src/locales/en/main.json | 4 + .../extensions/linearMode/LinearControls.vue | 13 +- src/stores/appModeStore.ts | 2 + src/views/LinearView.vue | 42 +++--- 5 files changed, 160 insertions(+), 27 deletions(-) create mode 100644 src/components/appMode/AppModeToolbar.vue diff --git a/src/components/appMode/AppModeToolbar.vue b/src/components/appMode/AppModeToolbar.vue new file mode 100644 index 000000000..919c84115 --- /dev/null +++ b/src/components/appMode/AppModeToolbar.vue @@ -0,0 +1,126 @@ + + + diff --git a/src/locales/en/main.json b/src/locales/en/main.json index f834679a7..4d908a547 100644 --- a/src/locales/en/main.json +++ b/src/locales/en/main.json @@ -2946,6 +2946,10 @@ "layout": "On the left, you'll see your generated images, videos, and outputs. On the right, just the controls you need. Everything complex stays out of sight.", "sharing": "Sharing is easy: create your workflow, open App Mode, right-click the tab, and export. When others open your file, it launches straight into this clean view. You can share powerful workflows as simple tools without anyone needing to understand node graphs.", "widget": "If you want to control which settings appear, convert your top-level nodes into a subgraph, then use widget promotion in the toolbox above it to choose what's exposed." + }, + "appModeToolbar": { + "appBuilder": "App builder", + "apps": "Apps" } }, "missingNodes": { diff --git a/src/renderer/extensions/linearMode/LinearControls.vue b/src/renderer/extensions/linearMode/LinearControls.vue index dfe30f72f..f65fcceff 100644 --- a/src/renderer/extensions/linearMode/LinearControls.vue +++ b/src/renderer/extensions/linearMode/LinearControls.vue @@ -39,7 +39,6 @@ const appModeStore = useAppModeStore() const props = defineProps<{ toastTo?: string | HTMLElement - notesTo?: string | HTMLElement mobile?: boolean }>() @@ -194,11 +193,10 @@ defineExpose({ runButtonClick })
diff --git a/src/stores/appModeStore.ts b/src/stores/appModeStore.ts index 364c9eae0..320cade8a 100644 --- a/src/stores/appModeStore.ts +++ b/src/stores/appModeStore.ts @@ -7,6 +7,7 @@ export const useAppModeStore = defineStore('appMode', () => { const mode = ref('graph') const builderSaving = ref(false) const hasOutputs = ref(true) + const enableAppBuilder = ref(false) const isBuilderMode = computed( () => mode.value === 'builder:select' || mode.value === 'builder:arrange' @@ -23,6 +24,7 @@ export const useAppModeStore = defineStore('appMode', () => { return { mode: readonly(mode), + enableAppBuilder: readonly(enableAppBuilder), isBuilderMode, isAppMode, isGraphMode, diff --git a/src/views/LinearView.vue b/src/views/LinearView.vue index fc73a6cb2..41daf981c 100644 --- a/src/views/LinearView.vue +++ b/src/views/LinearView.vue @@ -10,10 +10,9 @@ import SplitterPanel from 'primevue/splitterpanel' import { computed, ref, useTemplateRef } from 'vue' import { useI18n } from 'vue-i18n' +import AppModeToolbar from '@/components/appMode/AppModeToolbar.vue' import ExtensionSlot from '@/components/common/ExtensionSlot.vue' -import WorkflowActionsDropdown from '@/components/common/WorkflowActionsDropdown.vue' import ModeToggle from '@/components/sidebar/ModeToggle.vue' -import SideToolbar from '@/components/sidebar/SideToolbar.vue' import TopbarBadges from '@/components/topbar/TopbarBadges.vue' import WorkflowTabs from '@/components/topbar/WorkflowTabs.vue' import TypeformPopoverButton from '@/components/ui/TypeformPopoverButton.vue' @@ -25,15 +24,26 @@ import MobileMenu from '@/renderer/extensions/linearMode/MobileMenu.vue' import { useNodeOutputStore } from '@/stores/imagePreviewStore' import type { ResultItemImpl } from '@/stores/queueStore' import { useWorkspaceStore } from '@/stores/workspaceStore' +import { useAppModeStore } from '@/stores/appModeStore' const { t } = useI18n() const nodeOutputStore = useNodeOutputStore() const settingStore = useSettingStore() const workspaceStore = useWorkspaceStore() +const appModeStore = useAppModeStore() const mobileDisplay = useBreakpoints(breakpointsTailwind).smaller('md') const activeTab = computed(() => workspaceStore.sidebarTab.activeSidebarTab) +const sidebarOnLeft = computed( + () => settingStore.get('Comfy.Sidebar.Location') === 'left' +) +const hasLeftPanel = computed( + () => (sidebarOnLeft.value && activeTab.value) || !sidebarOnLeft.value +) +const hasRightPanel = computed( + () => sidebarOnLeft.value || (!sidebarOnLeft.value && activeTab.value) +) const hasPreview = ref(false) whenever( @@ -45,8 +55,6 @@ const selectedItem = ref() const selectedOutput = ref() const canShowPreview = ref(true) -const topLeftRef = useTemplateRef('topLeftRef') -const topRightRef = useTemplateRef('topRightRef') const bottomLeftRef = useTemplateRef('bottomLeftRef') const bottomRightRef = useTemplateRef('bottomRightRef') const linearWorkflowRef = useTemplateRef('linearWorkflowRef') @@ -93,28 +101,27 @@ const linearWorkflowRef = useTemplateRef('linearWorkflowRef') @resizestart="({ originalEvent }) => originalEvent.preventDefault()" >
- - +
- +
+
-
-
- - +
+