Browse Source

feat: add inheritance overlay to EaseCurveControls in ControlPanel

When a child EaseCurve node inherits settings from a parent via an
easeCurve handle connection, the ControlPanel now shows a semi-transparent
overlay indicating inheritance with a "Control manually" button to break
the connection and restore manual editing.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
handoff-20260429-1057
shrimbly 4 months ago
parent
commit
3c9dcb0ebc
  1. 29
      src/components/nodes/ControlPanel.tsx

29
src/components/nodes/ControlPanel.tsx

@ -864,9 +864,24 @@ function EaseCurveControls({ node }: { node: Node }) {
const updateNodeData = useWorkflowStore((state) => state.updateNodeData); const updateNodeData = useWorkflowStore((state) => state.updateNodeData);
const regenerateNode = useWorkflowStore((state) => state.regenerateNode); const regenerateNode = useWorkflowStore((state) => state.regenerateNode);
const isRunning = useWorkflowStore((state) => state.isRunning); const isRunning = useWorkflowStore((state) => state.isRunning);
const edges = useWorkflowStore((state) => state.edges);
const removeEdge = useWorkflowStore((state) => state.removeEdge);
const [showPresets, setShowPresets] = useState(false); const [showPresets, setShowPresets] = useState(false);
const presetsButtonRef = useRef<HTMLButtonElement>(null); const presetsButtonRef = useRef<HTMLButtonElement>(null);
const inheritedEdge = useMemo(() => {
return edges.find((e) => e.target === node.id && e.targetHandle === "easeCurve") || null;
}, [edges, node.id]);
const isInherited = !!inheritedEdge;
const handleBreakInheritance = useCallback(() => {
if (inheritedEdge) {
removeEdge(inheritedEdge.id);
updateNodeData(node.id, { inheritedFrom: null });
}
}, [inheritedEdge, removeEdge, node.id, updateNodeData]);
const handleBezierChange = useCallback( const handleBezierChange = useCallback(
(value: [number, number, number, number]) => { (value: [number, number, number, number]) => {
updateNodeData(node.id, { bezierHandles: value, easingPreset: null }); updateNodeData(node.id, { bezierHandles: value, easingPreset: null });
@ -907,7 +922,19 @@ function EaseCurveControls({ node }: { node: Node }) {
}, []); }, []);
return ( return (
<div className="space-y-3"> <div className="space-y-3 relative">
{isInherited && (
<div className="absolute inset-0 flex flex-col items-center justify-center bg-neutral-900/80 backdrop-blur-sm rounded z-10">
<p className="text-sm text-neutral-200 font-medium">Settings inherited</p>
<p className="text-[11px] text-neutral-400 mt-1">Break connection to edit manually</p>
<button
className="nodrag nopan mt-3 px-3 py-1.5 bg-white/10 hover:bg-white/20 border border-white/20 rounded text-xs text-neutral-200 transition-colors"
onClick={handleBreakInheritance}
>
Control manually
</button>
</div>
)}
<div> <div>
<div className="flex items-center justify-between mb-1"> <div className="flex items-center justify-between mb-1">
<label className="block text-xs font-medium text-neutral-300">Easing Function</label> <label className="block text-xs font-medium text-neutral-300">Easing Function</label>

Loading…
Cancel
Save