11<script setup lang="ts">
22import { remove } from ' es-toolkit'
3- import { computed , ref , toValue } from ' vue'
3+ import { computed , provide , ref , toValue } from ' vue'
44import type { MaybeRef } from ' vue'
55import { useI18n } from ' vue-i18n'
66
77import DraggableList from ' @/components/common/DraggableList.vue'
88import IoItem from ' @/components/builder/IoItem.vue'
99import PropertiesAccordionItem from ' @/components/rightSidePanel/layout/PropertiesAccordionItem.vue'
10+ import WidgetItem from ' @/components/rightSidePanel/parameters/WidgetItem.vue'
1011import Button from ' @/components/ui/button/Button.vue'
1112import { LiteGraph } from ' @/lib/litegraph/src/litegraph'
1213import type { LGraphNode , NodeId } from ' @/lib/litegraph/src/LGraphNode'
@@ -23,9 +24,11 @@ import TransformPane from '@/renderer/core/layout/transform/TransformPane.vue'
2324import { app } from ' @/scripts/app'
2425import { DOMWidgetImpl } from ' @/scripts/domWidget'
2526import { useDialogService } from ' @/services/dialogService'
27+ import { useAppMode } from ' @/composables/useAppMode'
2628import { useAppModeStore } from ' @/stores/appModeStore'
2729import { getNodeByLocatorId } from ' @/utils/graphTraversalUtil'
2830import { cn } from ' @/utils/tailwindUtil'
31+ import { HideLayoutFieldKey } from ' @/types/widgetTypes'
2932
3033type BoundStyle = { top: string ; left: string ; width: string ; height: string }
3134
@@ -37,10 +40,24 @@ const workflowStore = useWorkflowStore()
3740const { t } = useI18n ()
3841const canvas: LGraphCanvas = canvasStore .getCanvas ()
3942
43+ const { isSelectMode, isArrangeMode } = useAppMode ()
4044const hoveringSelectable = ref (false )
4145
46+ provide (HideLayoutFieldKey , true )
47+
4248workflowStore .activeWorkflow ?.changeTracker ?.reset ()
4349
50+ const arrangeInputs = computed (() =>
51+ appModeStore .selectedInputs
52+ .map (([nodeId , widgetName ]) => {
53+ const node = app .rootGraph .getNodeById (nodeId )
54+ const widget = node ?.widgets ?.find ((w ) => w .name === widgetName )
55+ if (! node || ! widget ) return null
56+ return { nodeId , widgetName , node , widget }
57+ })
58+ .filter ((item ): item is NonNullable <typeof item > => item !== null )
59+ )
60+
4461const inputsWithState = computed (() =>
4562 appModeStore .selectedInputs .map (([nodeId , widgetName ]) => {
4663 const node = getNodeByLocatorId (app .rootGraph , String (nodeId ))
@@ -180,12 +197,36 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
180197 </script >
181198<template >
182199 <div class =" flex font-bold p-2 border-border-subtle border-b items-center" >
183- {{ t('linearMode.builder.title') }}
200+ {{
201+ isArrangeMode ? t('nodeHelpPage.inputs') : t('linearMode.builder.title')
202+ }}
184203 <Button class =" ml-auto" @click =" appModeStore.exitBuilder" >
185204 {{ t('linearMode.builder.exit') }}
186205 </Button >
187206 </div >
207+ <DraggableList
208+ v-if =" isArrangeMode"
209+ v-slot =" { dragClass }"
210+ v-model =" appModeStore.selectedInputs"
211+ >
212+ <div
213+ v-for =" { nodeId, widgetName, node, widget } in arrangeInputs"
214+ :key =" `${nodeId}: ${widgetName}`"
215+ :class =" cn(dragClass, 'p-2 my-2 pointer-events-auto')"
216+ :aria-label =" `${widget.label ?? widgetName} — ${node.title}`"
217+ >
218+ <div class =" pointer-events-none" inert >
219+ <WidgetItem
220+ :widget =" widget"
221+ :node =" node"
222+ show-node-name
223+ hidden-widget-actions
224+ />
225+ </div >
226+ </div >
227+ </DraggableList >
188228 <PropertiesAccordionItem
229+ v-else
189230 :label =" t('nodeHelpPage.inputs')"
190231 enable-empty-state
191232 :disabled =" !appModeStore.selectedInputs.length"
@@ -234,6 +275,7 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
234275 </DraggableList >
235276 </PropertiesAccordionItem >
236277 <PropertiesAccordionItem
278+ v-if =" !isArrangeMode"
237279 :label =" t('nodeHelpPage.outputs')"
238280 enable-empty-state
239281 :disabled =" !appModeStore.selectedOutputs.length"
@@ -277,7 +319,10 @@ const renderedInputs = computed<[string, MaybeRef<BoundStyle> | undefined][]>(
277319 </DraggableList >
278320 </PropertiesAccordionItem >
279321
280- <Teleport v-if =" !settingStore.get('Comfy.VueNodes.Enabled')" to =" body" >
322+ <Teleport
323+ v-if =" isSelectMode && !settingStore.get('Comfy.VueNodes.Enabled')"
324+ to =" body"
325+ >
281326 <div
282327 :class ="
283328 cn(
0 commit comments