diff --git a/src/components/MultiSelectToolbar.tsx b/src/components/MultiSelectToolbar.tsx
index 1f8ab7cc..f20f4a49 100644
--- a/src/components/MultiSelectToolbar.tsx
+++ b/src/components/MultiSelectToolbar.tsx
@@ -17,13 +17,18 @@ const STACK_GAP = 20;
export function MultiSelectToolbar() {
const { t } = useI18n();
const { nodes, onNodesChange, createGroup, removeNodesFromGroup } = useWorkflowStore();
- const { getViewport } = useReactFlow();
+ const { flowToScreenPosition, getNodesBounds } = useReactFlow();
const selectedNodes = useMemo(
() => nodes.filter((node) => node.selected),
[nodes]
);
+ const hasSelectedGroupNode = useMemo(
+ () => selectedNodes.some((node) => node.type === "group"),
+ [selectedNodes]
+ );
+
// Check if any selected nodes are in a group
const selectedNodeGroups = useMemo(() => {
const groupIds = new Set(selectedNodes.map((n) => n.groupId).filter(Boolean));
@@ -36,27 +41,14 @@ export function MultiSelectToolbar() {
const toolbarPosition = useMemo(() => {
if (selectedNodes.length < 2) return null;
- const viewport = getViewport();
-
- // Find bounding box of selected nodes
- let minX = Infinity;
- let minY = Infinity;
- let maxX = -Infinity;
-
- selectedNodes.forEach((node) => {
- const nodeWidth = (node.style?.width as number) || node.measured?.width || 220;
- minX = Math.min(minX, node.position.x);
- minY = Math.min(minY, node.position.y);
- maxX = Math.max(maxX, node.position.x + nodeWidth);
+ const bounds = getNodesBounds(selectedNodes.map((node) => node.id));
+ const topCenter = flowToScreenPosition({
+ x: bounds.x + bounds.width / 2,
+ y: bounds.y,
});
- // Convert flow coordinates to screen coordinates
- const centerX = (minX + maxX) / 2;
- const screenX = centerX * viewport.zoom + viewport.x;
- const screenY = minY * viewport.zoom + viewport.y - 50; // 50px above the top
-
- return { x: screenX, y: screenY };
- }, [selectedNodes, getViewport]);
+ return { x: topCenter.x, y: topCenter.y - 50 };
+ }, [flowToScreenPosition, getNodesBounds, selectedNodes]);
const handleStackHorizontally = () => {
if (selectedNodes.length < 2) return;
@@ -260,7 +252,7 @@ export function MultiSelectToolbar() {
{/* Group/Ungroup buttons */}
- {someInGroup ? (
+ {someInGroup && !hasSelectedGroupNode ? (