diff --git a/frontend/src/components/nodes/RenderingNode.tsx b/frontend/src/components/nodes/RenderingNode.tsx
index 3868247..474ff26 100644
--- a/frontend/src/components/nodes/RenderingNode.tsx
+++ b/frontend/src/components/nodes/RenderingNode.tsx
@@ -1,4 +1,4 @@
-import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
+import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'
import nunjucks from 'nunjucks'
import CodeMirror from '@uiw/react-codemirror'
import { javascript } from '@codemirror/lang-javascript'
@@ -19,7 +19,8 @@ import {
BaseNodeHeaderRow,
} from '../base/BaseNode'
import { getDefaultDataForType, getNextNodeId } from '../../lib/flowUtils'
-import { getDefaultStyle } from '../../lib/nodeRegistry'
+import FlowContext from '../../lib/flowContext'
+import { getDefaultStyle, getNodeType } from '../../lib/nodeRegistry'
import { NodeFooterEdgeIndicators } from '../base/NodeFooterEdgeIndicators'
import { NodeHeaderTitle } from '../base/NodeHeaderTitle'
import { NodeMenubar } from '../base/NodeMenubar'
@@ -47,6 +48,9 @@ type Props = AbstractNodeProps
type ViewMode = 'preview' | 'raw'
function RenderingNodeComponent({ id, data, width, height, selected }: Props) {
+ const flowContext = useContext(FlowContext)
+ const setFullscreenNodeId = flowContext?.setFullscreenNodeId
+ const supportsFullscreen = getNodeType('render')?.supportsFullscreen
const [renderedContent, setRenderedContent] = useState(null)
const [resolvedContent, setResolvedContent] = useState(null)
const [error, setError] = useState(null)
@@ -675,6 +679,7 @@ function RenderingNodeComponent({ id, data, width, height, selected }: Props) {
}
title={}
+ onHeaderDoubleClick={supportsFullscreen && setFullscreenNodeId ? () => setFullscreenNodeId(id) : undefined}
right={
incomingIds.length > 0 ? (
,
- React.ComponentPropsWithoutRef
->(({ className, children, ...props }, ref) => (
+ React.ComponentPropsWithoutRef & { hideCloseButton?: boolean }
+>(({ className, children, hideCloseButton, ...props }, ref) => (
{children}
-
-
- Close
-
+ {!hideCloseButton && (
+
+
+ Close
+
+ )}
))
diff --git a/frontend/src/lib/flowContext.tsx b/frontend/src/lib/flowContext.tsx
index 7afb3c3..5777fbc 100644
--- a/frontend/src/lib/flowContext.tsx
+++ b/frontend/src/lib/flowContext.tsx
@@ -22,6 +22,9 @@ export type FlowContextValue = {
isValidConnection: (connection: Connection) => boolean
/** Set by FlowKeyboardShortcuts so Node menubar can trigger paste / fit view. */
flowActionsRef: React.MutableRefObject
+ /** When set, graph centers on this node and a fullscreen dialog shows the node. Cleared on close. */
+ fullscreenNodeId: string | null
+ setFullscreenNodeId: (id: string | null) => void
}
const FlowContext = React.createContext(null)
diff --git a/frontend/src/lib/nodeRegistry.ts b/frontend/src/lib/nodeRegistry.ts
index 0e3343f..ce1569c 100644
--- a/frontend/src/lib/nodeRegistry.ts
+++ b/frontend/src/lib/nodeRegistry.ts
@@ -45,6 +45,8 @@ export type NodeTypeDescriptor = {
getResetData?: (nodeId?: string) => Record
/** Optional: label shown on edge when this type is the target (e.g. "render", "add input"). */
connectionLabel?: string
+ /** When true, double-clicking the node header opens a fullscreen dialog for this node. */
+ supportsFullscreen?: boolean
}
const registry = new Map()
diff --git a/frontend/src/lib/registerBuiltinNodes.tsx b/frontend/src/lib/registerBuiltinNodes.tsx
index c49933e..a0ed80e 100644
--- a/frontend/src/lib/registerBuiltinNodes.tsx
+++ b/frontend/src/lib/registerBuiltinNodes.tsx
@@ -42,6 +42,7 @@ export function registerBuiltinNodes(): void {
title: nodeId ?? '',
}),
connectionLabel: 'adding input',
+ supportsFullscreen: true,
})
registerNodeType({
@@ -58,6 +59,7 @@ export function registerBuiltinNodes(): void {
menuLabel: 'Renderer',
menuIcon: ,
connectionLabel: 'rendering',
+ supportsFullscreen: true,
})
registerNodeType({
@@ -75,6 +77,7 @@ export function registerBuiltinNodes(): void {
menuLabel: 'Agent',
menuIcon: ,
connectionLabel: 'prompt/context',
+ supportsFullscreen: true,
})
registerNodeType({
@@ -128,5 +131,6 @@ export function registerBuiltinNodes(): void {
menuIcon: ,
getResetData: () => ({ body: '' }),
connectionLabel: 'adding input',
+ supportsFullscreen: true,
})
}