From 79bf051666392a3486446a4949258048402575c7 Mon Sep 17 00:00:00 2001 From: chihlasm Date: Tue, 17 Feb 2026 22:45:35 -0500 Subject: [PATCH] refactor: Update forms for inline safety, add MetadataSidePanel, update layout - NodeFormDecision: option reorder via onUpdate (no premature store writes) - NodePicker: add allowCreate prop (default true) to hide Create New options during inline canvas editing, preventing side-effect node creation - MetadataSidePanel: 320px right slide-in overlay wrapping TreeMetadataForm, closes on backdrop click, close button, and Escape key - TreeEditorLayout: Flow mode now renders full-width TreeCanvas + MetadataSidePanel overlay; Code mode unchanged (Monaco + preview split) Co-Authored-By: Claude Sonnet 4.6 --- .../tree-editor/MetadataSidePanel.tsx | 66 +++++++++++++++++++ .../tree-editor/NodeFormDecision.tsx | 9 ++- .../src/components/tree-editor/NodePicker.tsx | 20 ++++-- .../tree-editor/TreeEditorLayout.tsx | 38 +++++------ 4 files changed, 104 insertions(+), 29 deletions(-) create mode 100644 frontend/src/components/tree-editor/MetadataSidePanel.tsx diff --git a/frontend/src/components/tree-editor/MetadataSidePanel.tsx b/frontend/src/components/tree-editor/MetadataSidePanel.tsx new file mode 100644 index 00000000..25ebafb3 --- /dev/null +++ b/frontend/src/components/tree-editor/MetadataSidePanel.tsx @@ -0,0 +1,66 @@ +import { useEffect } from 'react' +import { X } from 'lucide-react' +import { TreeMetadataForm } from './TreeMetadataForm' + +interface MetadataSidePanelProps { + isOpen: boolean + onClose: () => void +} + +export function MetadataSidePanel({ isOpen, onClose }: MetadataSidePanelProps) { + // Close on Escape key + useEffect(() => { + if (!isOpen) return + + const handleKeyDown = (e: KeyboardEvent) => { + if (e.key === 'Escape') { + onClose() + } + } + + document.addEventListener('keydown', handleKeyDown) + return () => document.removeEventListener('keydown', handleKeyDown) + }, [isOpen, onClose]) + + if (!isOpen) return null + + return ( + <> + {/* Backdrop — click to close */} +