@@ -64,29 +64,31 @@ export const BaseContainer = ({
6464
6565 // cn() is needed here because border-color classes from getStatusBorder,
6666 // hover, and selection states intentionally override the base `border-border`.
67- const className = useMemo (
68- ( ) =>
69- cn (
70- 'relative flex items-center cursor-pointer bg-surface-overlay border border-border' ,
71- 'w-(--node-w) h-(--node-h) rounded-(--node-radius)' ,
72- 'shadow-(--canvas-node-shadow-rest) outline-offset-0 transition-[box-shadow,border-color] duration-150' ,
73- shape === 'rectangle'
74- ? 'flex-row justify-start gap-3 p-(--node-gap)'
75- : 'flex-col justify-center' ,
76- hasFooter && 'flex-wrap' ,
77- getStatusBorder ( activeStatus ) ,
78- isHovered && 'shadow-(--canvas-node-shadow-hover) border-border-hover' ,
79- isSelected && 'outline outline-2 outline-foreground-accent-muted' ,
80- interactionState === 'disabled' && 'opacity-50 cursor-not-allowed' ,
81- interactionState === 'drag' && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)' ,
82- // Decorative stacked layer for drillable / collapsed nodes. Purely visual:
83- // a ::before pseudo inherits the container's radius/size, sits behind at
84- // -z-10, and is offset down so only a thin arc peeks out below the card.
85- isStacked &&
86- 'before:content-[""] before:absolute before:inset-x-0 before:top-0 before:h-full before:rounded-[inherit] before:bg-surface-overlay before:border before:border-brand before:translate-y-[6px] before:-z-10 before:pointer-events-none'
87- ) ,
88- [ shape , hasFooter , activeStatus , isSelected , isHovered , isStacked , interactionState ]
89- ) ;
67+ const className = useMemo ( ( ) => {
68+ const statusBorder = getStatusBorder ( activeStatus ) ;
69+ const hasStatusBorder = statusBorder . length > 0 ;
70+
71+ return cn (
72+ 'relative flex items-center cursor-pointer bg-surface-overlay border border-border' ,
73+ 'w-(--node-w) h-(--node-h) rounded-(--node-radius)' ,
74+ 'shadow-(--canvas-node-shadow-rest) outline-offset-0 transition-[box-shadow,border-color] duration-150' ,
75+ shape === 'rectangle'
76+ ? 'flex-row justify-start gap-3 p-(--node-gap)'
77+ : 'flex-col justify-center' ,
78+ hasFooter && 'flex-wrap' ,
79+ statusBorder ,
80+ isHovered && 'shadow-(--canvas-node-shadow-hover)' ,
81+ isHovered && ! hasStatusBorder && 'border-border-hover' ,
82+ isSelected && 'outline outline-2 outline-foreground-accent-muted' ,
83+ interactionState === 'disabled' && 'opacity-50 cursor-not-allowed' ,
84+ interactionState === 'drag' && 'cursor-grabbing shadow-(--canvas-node-shadow-lifted)' ,
85+ // Decorative stacked layer for drillable / collapsed nodes. Purely visual:
86+ // a ::before pseudo inherits the container's radius/size, sits behind at
87+ // -z-10, and is offset down so only a thin arc peeks out below the card.
88+ isStacked &&
89+ 'before:content-[""] before:absolute before:inset-x-0 before:top-0 before:h-full before:rounded-[inherit] before:bg-surface-overlay before:border before:border-brand before:translate-y-[6px] before:-z-10 before:pointer-events-none'
90+ ) ;
91+ } , [ shape , hasFooter , activeStatus , isSelected , isHovered , isStacked , interactionState ] ) ;
9092
9193 return (
9294 < div
0 commit comments