Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
9056052
wip: right side panel
LittleSound Nov 21, 2025
2f2f65a
feat: outer layout
LittleSound Nov 24, 2025
cd3e809
feat: switch tabs
LittleSound Nov 24, 2025
c1bbb7b
feat: collapsible section
LittleSound Nov 24, 2025
fd6defc
feat: parameters + search + subgraph editor tab + multiple choice + i…
LittleSound Nov 24, 2025
1677667
feat: appearance
LittleSound Nov 24, 2025
7e9ece2
feat: search enhancement
LittleSound Nov 25, 2025
ff1b9ad
feat: widget field layout
LittleSound Nov 25, 2025
2c33757
feat: info tab
LittleSound Nov 25, 2025
464c9b2
feat: subgraph editor
LittleSound Nov 25, 2025
828c836
Merge branch 'main' into rizumu/feat/right-side-panel
LittleSound Nov 26, 2025
d47af09
fix: update placeholder text in SidePanelSearch component to use tran…
LittleSound Nov 26, 2025
56f8f29
fix: underline
LittleSound Nov 28, 2025
8370166
fix: tab settings
LittleSound Nov 28, 2025
f2fcdd5
fix: widget item layout
LittleSound Nov 28, 2025
e10a0b9
fix: font size 12px to 14px on top tablist
LittleSound Nov 28, 2025
0159622
fix: node state select button
LittleSound Nov 28, 2025
4be493c
fix: color select
LittleSound Nov 28, 2025
aa429ee
fix: subgraph button + chevron style + splitter style
LittleSound Nov 28, 2025
3774b6c
chore: clean subgraph code
LittleSound Nov 28, 2025
d7fa9a9
chore: rename components
LittleSound Nov 28, 2025
cc34422
[automated] Update test expectations
invalid-email-address Nov 30, 2025
952f4a1
refactor: update splitter key and state management for right panel vi…
LittleSound Dec 2, 2025
560339b
Merge branch 'main' into rizumu/feat/right-side-panel
LittleSound Dec 3, 2025
0a22d28
[automated] Update test expectations
invalid-email-address Dec 3, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
44 changes: 41 additions & 3 deletions src/components/LiteGraphCanvasSplitterOverlay.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,10 @@
</div>

<Splitter
key="main-splitter-stable"
:key="splitterRefreshKey"
class="splitter-overlay flex-1 overflow-hidden"
:pt:gutter="sidebarPanelVisible ? '' : 'hidden'"
:state-key="sidebarStateKey || 'main-splitter'"
:pt:gutter="getSplitterGutterClasses"
:state-key="sidebarStateKey"
state-storage="local"
Comment on lines 16 to 21
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n src/components/LiteGraphCanvasSplitterOverlay.vue | head -100

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 3799


🏁 Script executed:

# Search for splitterRefreshKey, getSplitterGutterClasses, and sidebarStateKey definitions
rg -n "splitterRefreshKey|getSplitterGutterClasses|sidebarStateKey" src/components/LiteGraphCanvasSplitterOverlay.vue -A 3

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 757


🏁 Script executed:

# Check the rightSidePanelVisible state usage
rg -n "rightSidePanelVisible" src/components/LiteGraphCanvasSplitterOverlay.vue -B 2 -A 2

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 686


🏁 Script executed:

# Look for any rightSidePanelStore usage
rg -n "rightSidePanelStore" src/components/LiteGraphCanvasSplitterOverlay.vue -B 2 -A 2

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 825


🏁 Script executed:

# Search for other Splitter usage patterns with state-key
rg -n "state-key.*splitter|Splitter.*state-key" --type vue -B 2 -A 2

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 97


🏁 Script executed:

# Look for any dynamic panel handling or state reset logic
rg -n "stateKey|stateStorage" src/components/ --type vue -B 1 -A 1

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 97


🏁 Script executed:

# Check rightSidePanelStore implementation for isOpen property
cat -n src/stores/workspace/rightSidePanelStore.ts 2>/dev/null || echo "File may not exist yet"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1629


🏁 Script executed:

# Search for PrimeVue Splitter package.json or docs reference
fd -t f "package.json" | xargs grep -l "primevue" | head -1 | xargs cat | grep -A 5 "primevue"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 362


🏁 Script executed:

# Search for any comments or error handling related to splitter state mismatch
rg -n "splitter|state.*panel|panel.*state" src/components/LiteGraphCanvasSplitterOverlay.vue -i

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1752


🏁 Script executed:

# Check if there's any logic that resets or handles stale state
rg -n "localStorage|stateStorage" src/ -i --type ts --type vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 97


🏁 Script executed:

# Look for PrimeVue Splitter API documentation or type definitions
fd -name "*.d.ts" -o -name "*.ts" | xargs grep -l "Splitter" | head -5 | xargs cat | grep -A 10 "state-key\|stateKey" | head -30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 300


🏁 Script executed:

# Check if there's any migration or reset logic when panel visibility changes
rg -n "rightSidePanelVisible|splitterRefreshKey" src/components/LiteGraphCanvasSplitterOverlay.vue -B 5 -A 5

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1543


🏁 Script executed:

# Get the full sidebarStateKey computation to verify it doesn't reference rightSidePanelVisible
rg -n "sidebarStateKey" src/components/LiteGraphCanvasSplitterOverlay.vue -A 8

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 625


🏁 Script executed:

# Search for how PrimeVue Splitter handles state persistence to understand the risk
rg -n "state.*storage\|stateStorage" src/ --type ts

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


Include rightSidePanelVisible in the sidebarStateKey to prevent localStorage state mismatch when the right panel opens/closes.

When rightSidePanelVisible changes, splitterRefreshKey forces a Splitter remount, but sidebarStateKey remains unchanged (derived only from unifiedWidth and activeSidebarTabId). The Splitter then loads saved sizes from localStorage using the same state-key, even though the panel configuration has changed (3 panels → 4 panels, or vice versa). This causes PrimeVue to apply sizes saved for the old layout to the new layout, resulting in misaligned widths.

Consider:

  • Adding rightSidePanelVisible to the sidebarStateKey computation so each configuration has its own persisted state, or
  • Using a separate state-key when the right panel is present

Also, getSplitterGutterClasses returns an empty string; this could be simplified to a literal "" unless you expect to add dynamic classes later.

🤖 Prompt for AI Agents
In src/components/LiteGraphCanvasSplitterOverlay.vue around lines 16 to 21, the
Splitter's persisted state-key only uses unifiedWidth and activeSidebarTabId so
when rightSidePanelVisible toggles the panel count changes but the same
localStorage key is reused causing size mismatches; update the computation of
sidebarStateKey to include rightSidePanelVisible (or switch to a different
state-key when the right panel is present) so each layout configuration has its
own persisted sizes, and simplify getSplitterGutterClasses to return a literal
"" if no dynamic classes are needed.

>
<SplitterPanel
Expand Down Expand Up @@ -80,6 +80,16 @@
name="side-bar-panel"
/>
</SplitterPanel>

<!-- Right Side Panel - independent of sidebar -->
<SplitterPanel
v-if="rightSidePanelVisible"
class="right-side-panel pointer-events-auto"
:min-size="15"
:size="20"
>
<slot name="right-side-panel" />
</SplitterPanel>
Comment on lines +84 to +92
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

find src -name "LiteGraphCanvasSplitterOverlay.vue" -type f

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 119


🏁 Script executed:

wc -l src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 123


🏁 Script executed:

cat -n src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 7416


🏁 Script executed:

head -n 220 src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 7416


🏁 Script executed:

cat src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 5988


🏁 Script executed:

sed -n '170,185p' src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 338


🏁 Script executed:

sed -n '60,180p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 4310


🏁 Script executed:

sed -n '1,100p' src/components/LiteGraphCanvasSplitterOverlay.vue | tail -n 50

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1545


🏁 Script executed:

grep -n "sidebarLocation" src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 613


🏁 Script executed:

sed -n '1,65p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2581


🏁 Script executed:

grep -n "topPositionedSidebar\|leftPositionedSidebar\|rightPositionedSidebar" src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

grep -rn "sidebarLocation.*right\|right.*sidebar" src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 377


🏁 Script executed:

sed -n '1,65p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2581


🏁 Script executed:

head -n 70 src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2293


🏁 Script executed:

grep -A5 -B5 "topPositionedSidebar\|leftPositionedSidebar" src/components/LiteGraphCanvasSplitterOverlay.vue | head -n 30

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

sed -n '20,45p' src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 886


🏁 Script executed:

sed -n '15,50p' src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1206


🏁 Script executed:

grep -A3 "sidebarLocation" src/components/LiteGraphCanvasSplitterOverlay.vue | head -n 10

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 377


🏁 Script executed:

python3 << 'EOF'
with open('src/components/LiteGraphCanvasSplitterOverlay.vue', 'r') as f:
    content = f.read()
    
# Find the props section
import re
props_match = re.search(r'defineProps.*?\{.*?\}(?=\s*[\n);])', content, re.DOTALL)
if props_match:
    print(props_match.group(0)[:1500])
EOF

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 156


🏁 Script executed:

ast-grep --pattern 'defineProps<$_>()'

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

grep -n "computed" src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 553


🏁 Script executed:

sed -n '20,65p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1878


🏁 Script executed:

grep -rn "sidebarLocation.*=.*['\"]right" src/ --include="*.vue" --include="*.ts" | head -n 20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1420


🏁 Script executed:

grep -rn "sidebarLocation" src/ --include="*.vue" --include="*.ts" | grep -E "(type|interface|as const|enum)" | head -n 20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

find src -name "*store*" -o -name "*settings*" | grep -E "\.(ts|js|vue)$"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 96


🏁 Script executed:

grep -rn "sidebarLocation" src/stores src/composables --include="*.ts" 2>/dev/null | head -n 20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

find . -name "*.test.*" -o -name "*.spec.*" | grep -i "LiteGraphCanvasSplitterOverlay\|splitter"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 52


🏁 Script executed:

find . -path "*/node_modules" -prune -o -type f -name "*.spec.*" -print | head -n 20

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 920


🏁 Script executed:

sed -n '60,120p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2309


🏁 Script executed:

sed -n '84,120p' src/components/LiteGraphCanvasSplitterOverlay.vue | cat -n

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 1502


🏁 Script executed:

find src/components -name "*Sidebar*" -o -name "*sidebar*" | head -n 10

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 534


🏁 Script executed:

ls -la src/components/ | grep -i sidebar

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 127


🏁 Script executed:

grep -rn "LiteGraphCanvasSplitterOverlay" src/ --include="*.vue" --include="*.ts" | grep -v "import"

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 240


🏁 Script executed:

grep -rn "LiteGraphCanvasSplitterOverlay" src/ --include="*.vue" -A5 -B2 | head -n 40

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 2044


🏁 Script executed:

grep -n "rightPositionedSidebar\|const.*sidebar\|computed.*sidebar" src/components/LiteGraphCanvasSplitterOverlay.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 217


Right-side panel can coexist with right-positioned sidebar, creating layout constraints

When sidebarLocation === 'right' and rightSidePanelVisible === true, both panels appear in the same horizontal splitter:

  • Center panel (size: 80) + right sidebar (size: 20, min-size: 10) + right-side-panel (size: 20, min-size: 15) = potential overflow

Test this layout on smaller viewports to verify the main canvas remains usable and gutter handles discoverable when both right-side panels are visible. Consider whether adaptive sizing or constraints are needed when both panels are enabled.

🤖 Prompt for AI Agents
In src/components/LiteGraphCanvasSplitterOverlay.vue around lines 84-92, the
template unconditionally renders a separate right-side-panel splitter when
rightSidePanelVisible is true, which conflicts with a right-positioned sidebar
(sidebarLocation === 'right') and can overflow on small viewports; change the
rendering logic so that when sidebarLocation === 'right' you do one of: 1)
render the right-side-panel inside the sidebar slot instead of as a separate
splitter, or 2) compute adaptive :size and :min-size values so the sum of center
+ sidebar + right-side-panel never exceeds 100 (e.g. reduce right-side-panel
size/min-size when sidebar is right or viewport width is small), and ensure the
computed sizes enforce a minimum center panel width and discoverable gutter
handles; implement this by adding a small computed property that returns
size/min-size for the right-side-panel based on sidebarLocation and window width
and use that instead of hardcoded 20/15, or move the slot rendering into the
sidebar conditional when sidebarLocation === 'right'.

</Splitter>
</div>
</div>
Expand All @@ -92,9 +102,11 @@ import { computed } from 'vue'
import { useSettingStore } from '@/platform/settings/settingStore'
import { useBottomPanelStore } from '@/stores/workspace/bottomPanelStore'
import { useRightSidePanelStore } from '@/stores/workspace/rightSidePanelStore'
import { useSidebarTabStore } from '@/stores/workspace/sidebarTabStore'
const settingStore = useSettingStore()
const rightSidePanelStore = useRightSidePanelStore()
const sidebarLocation = computed<'left' | 'right'>(() =>
settingStore.get('Comfy.Sidebar.Location')
)
Expand All @@ -109,6 +121,7 @@ const sidebarPanelVisible = computed(
const bottomPanelVisible = computed(
() => useBottomPanelStore().bottomPanelVisible
)
const rightSidePanelVisible = computed(() => rightSidePanelStore.isOpen)
const activeSidebarTabId = computed(
() => useSidebarTabStore().activeSidebarTabId
)
Expand All @@ -120,6 +133,21 @@ const sidebarStateKey = computed(() => {
// When no tab is active, use a default key to maintain state
return activeSidebarTabId.value ?? 'default-sidebar'
})
/**
* Force refresh the splitter when right panel visibility changes to recalculate the width
*/
const splitterRefreshKey = computed(() => {
return rightSidePanelVisible.value
? 'main-splitter-with-right-panel'
: 'main-splitter'
})
// Gutter visibility should be controlled by CSS targeting specific gutters
const getSplitterGutterClasses = computed(() => {
// Empty string - let individual gutter styles handle visibility
return ''
})
</script>

<style scoped>
Expand All @@ -135,10 +163,20 @@ const sidebarStateKey = computed(() => {
background-color: var(--p-primary-color);
}
/* Hide sidebar gutter when sidebar is not visible */
:deep(.side-bar-panel[style*='display: none'] + .p-splitter-gutter),
:deep(.p-splitter-gutter + .side-bar-panel[style*='display: none']) {
display: none;
}
.side-bar-panel {
background-color: var(--bg-color);
}
.right-side-panel {
background-color: var(--bg-color);
}
.bottom-panel {
background-color: var(--comfy-menu-bg);
border: 1px solid var(--p-panel-border-color);
Expand Down
26 changes: 26 additions & 0 deletions src/components/TopMenuSection.vue
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,20 @@
</IconButton>
<CurrentUserButton v-if="isLoggedIn" class="shrink-0" />
<LoginButton v-else-if="isDesktop" />
<IconButton
v-if="!isRightSidePanelOpen"
v-tooltip.bottom="rightSidePanelTooltipConfig"
type="transparent"
size="sm"
class="mr-2 transition-colors duration-200 ease-in-out hover:bg-secondary-background-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-background"
:aria-pressed="isRightSidePanelOpen"
:aria-label="t('rightSidePanel.togglePanel')"
@click="toggleRightSidePanel"
>
<i
class="icon-[lucide--panel-right] block size-4 text-muted-foreground"
/>
</IconButton>
Comment on lines +47 to +60
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Remove aria-pressed or keep button always visible for consistency.

The button is only rendered when the panel is closed (v-if="!isRightSidePanelOpen"), which means aria-pressed will always be false when the button is visible. This doesn't follow accessibility best practices for toggle buttons.

Consider one of these approaches:

  1. Recommended: Remove the aria-pressed attribute since the button's visibility already indicates state
  2. Alternative: Keep the button always visible (like the queue history button on lines 23-44) and toggle aria-pressed between true/false

Apply this diff to remove the unnecessary aria-pressed attribute:

         <IconButton
           v-if="!isRightSidePanelOpen"
           v-tooltip.bottom="rightSidePanelTooltipConfig"
           type="transparent"
           size="sm"
           class="mr-2 transition-colors duration-200 ease-in-out hover:bg-secondary-background-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-background"
-          :aria-pressed="isRightSidePanelOpen"
           :aria-label="t('rightSidePanel.togglePanel')"
           @click="toggleRightSidePanel"
         >
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<IconButton
v-if="!isRightSidePanelOpen"
v-tooltip.bottom="rightSidePanelTooltipConfig"
type="transparent"
size="sm"
class="mr-2 transition-colors duration-200 ease-in-out hover:bg-secondary-background-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-background"
:aria-pressed="isRightSidePanelOpen"
:aria-label="t('rightSidePanel.togglePanel')"
@click="toggleRightSidePanel"
>
<i
class="icon-[lucide--panel-right] block size-4 text-muted-foreground"
/>
</IconButton>
<IconButton
v-if="!isRightSidePanelOpen"
v-tooltip.bottom="rightSidePanelTooltipConfig"
type="transparent"
size="sm"
class="mr-2 transition-colors duration-200 ease-in-out hover:bg-secondary-background-hover focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-background"
:aria-label="t('rightSidePanel.togglePanel')"
@click="toggleRightSidePanel"
>
<i
class="icon-[lucide--panel-right] block size-4 text-muted-foreground"
/>
</IconButton>
🤖 Prompt for AI Agents
In src/components/TopMenuSection.vue around lines 47 to 60, the IconButton is
conditionally rendered only when the right side panel is closed so aria-pressed
will always be false; remove the unnecessary :aria-pressed binding to avoid a
misleading toggle attribute, keeping the rest of the props and event handler
intact (or alternatively render the button unconditionally and keep
:aria-pressed toggling if you prefer the always-visible pattern).

</div>
<QueueProgressOverlay
v-model:expanded="isQueueOverlayExpanded"
Expand All @@ -68,10 +82,12 @@ import { useCurrentUser } from '@/composables/auth/useCurrentUser'
import { buildTooltipConfig } from '@/composables/useTooltipConfig'
import { app } from '@/scripts/app'
import { useQueueStore } from '@/stores/queueStore'
import { useRightSidePanelStore } from '@/stores/workspace/rightSidePanelStore'
import { useWorkspaceStore } from '@/stores/workspaceStore'
import { isElectron } from '@/utils/envUtil'
const workspaceStore = useWorkspaceStore()
const rightSidePanelStore = useRightSidePanelStore()
const { isLoggedIn } = useCurrentUser()
const isDesktop = isElectron()
const { t } = useI18n()
Expand All @@ -88,6 +104,16 @@ const queueHistoryButtonBackgroundClass = computed(() =>
: 'bg-secondary-background'
)
// Right side panel toggle
const isRightSidePanelOpen = computed(() => rightSidePanelStore.isOpen)
const rightSidePanelTooltipConfig = computed(() =>
buildTooltipConfig(t('rightSidePanel.togglePanel'))
)
const toggleRightSidePanel = () => {
rightSidePanelStore.togglePanel()
}
// Maintain support for legacy topbar elements attached by custom scripts
const legacyCommandsContainerRef = ref<HTMLElement>()
onMounted(() => {
Expand Down
4 changes: 4 additions & 0 deletions src/components/graph/GraphCanvas.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@
<template v-if="showUI" #bottom-panel>
<BottomPanel />
</template>
<template v-if="showUI" #right-side-panel>
<NodePropertiesPanel />
</template>
<template #graph-canvas-panel>
<GraphCanvasMenu v-if="canvasMenuEnabled" class="pointer-events-auto" />
<MiniMap
Expand Down Expand Up @@ -110,6 +113,7 @@ import NodeTooltip from '@/components/graph/NodeTooltip.vue'
import SelectionToolbox from '@/components/graph/SelectionToolbox.vue'
import TitleEditor from '@/components/graph/TitleEditor.vue'
import NodeOptions from '@/components/graph/selectionToolbox/NodeOptions.vue'
import NodePropertiesPanel from '@/components/rightSidePanel/RightSidePanel.vue'
import NodeSearchboxPopover from '@/components/searchbox/NodeSearchBoxPopover.vue'
import SideToolbar from '@/components/sidebar/SideToolbar.vue'
import TopbarBadges from '@/components/topbar/TopbarBadges.vue'
Expand Down
10 changes: 8 additions & 2 deletions src/components/graph/selectionToolbox/ConfigureSubgraph.vue
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,17 @@
severity="secondary"
text
icon="icon-[lucide--settings-2]"
@click="showSubgraphNodeDialog"
@click="handleClick"
/>
</template>
<script setup lang="ts">
import Button from 'primevue/button'
import { showSubgraphNodeDialog } from '@/core/graph/subgraph/useSubgraphNodeDialog'
import { useRightSidePanelStore } from '@/stores/workspace/rightSidePanelStore'
const rightSidePanelStore = useRightSidePanelStore()
const handleClick = () => {
rightSidePanelStore.openPanel('subgraph')
}
</script>
Loading