@octaviaflow/core 3.0.18-beta.10 → 3.0.18-beta.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/chunk-5ARKSRED.js +2951 -0
  2. package/dist/chunk-5ARKSRED.js.map +1 -0
  3. package/dist/chunk-5OSGSJMM.js +2981 -0
  4. package/dist/chunk-5OSGSJMM.js.map +1 -0
  5. package/dist/chunk-5YQQMEF3.js +2981 -0
  6. package/dist/chunk-5YQQMEF3.js.map +1 -0
  7. package/dist/chunk-A6KMO4JV.js +2949 -0
  8. package/dist/chunk-A6KMO4JV.js.map +1 -0
  9. package/dist/chunk-B7FTWSTM.js +2938 -0
  10. package/dist/chunk-B7FTWSTM.js.map +1 -0
  11. package/dist/chunk-BCO6M26F.js +2940 -0
  12. package/dist/chunk-BCO6M26F.js.map +1 -0
  13. package/dist/chunk-HDOTOZNA.js +2936 -0
  14. package/dist/chunk-HDOTOZNA.js.map +1 -0
  15. package/dist/chunk-IUIICQU5.js +2946 -0
  16. package/dist/chunk-IUIICQU5.js.map +1 -0
  17. package/dist/chunk-J2UYZI6D.js +2946 -0
  18. package/dist/chunk-J2UYZI6D.js.map +1 -0
  19. package/dist/chunk-K2H7JLQW.js +2952 -0
  20. package/dist/chunk-K2H7JLQW.js.map +1 -0
  21. package/dist/chunk-KUXYBP66.js +2953 -0
  22. package/dist/chunk-KUXYBP66.js.map +1 -0
  23. package/dist/chunk-MMXL343D.js +2974 -0
  24. package/dist/chunk-MMXL343D.js.map +1 -0
  25. package/dist/chunk-NTMEYB7B.js +2949 -0
  26. package/dist/chunk-NTMEYB7B.js.map +1 -0
  27. package/dist/chunk-SLVDAZSX.js +2946 -0
  28. package/dist/chunk-SLVDAZSX.js.map +1 -0
  29. package/dist/chunk-UXMNBS22.js +2955 -0
  30. package/dist/chunk-UXMNBS22.js.map +1 -0
  31. package/dist/chunk-ZRAM6FXB.js +2949 -0
  32. package/dist/chunk-ZRAM6FXB.js.map +1 -0
  33. package/dist/index.cjs +60 -15
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/workflow/components/FlowCanvas/FlowCanvas.d.ts +8 -0
  37. package/dist/workflow/components/FlowCanvas/FlowCanvas.d.ts.map +1 -1
  38. package/dist/workflow/utils/parenting.d.ts +5 -3
  39. package/dist/workflow/utils/parenting.d.ts.map +1 -1
  40. package/dist/workflow.cjs +60 -15
  41. package/dist/workflow.cjs.map +1 -1
  42. package/dist/workflow.js +1 -1
  43. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ import {
6
6
  applyNodeChanges,
7
7
  buildEdgePath,
8
8
  useViewportOrNull
9
- } from "./chunk-4ZALUTZS.js";
9
+ } from "./chunk-5OSGSJMM.js";
10
10
  import {
11
11
  __export,
12
12
  cn
@@ -139,6 +139,14 @@ export interface FlowCanvasProps {
139
139
  * `autoResizeContainers` recomputes a container's frame. Default 32.
140
140
  */
141
141
  containerAutoResizePadding?: number;
142
+ /**
143
+ * Floor size for `autoResizeContainers`. A container that fits its
144
+ * children in less than this stops shrinking here — it never collapses
145
+ * below the size a freshly-dropped (empty) container would have.
146
+ * Defaults: 320 × 200.
147
+ */
148
+ containerMinWidth?: number;
149
+ containerMinHeight?: number;
142
150
  height?: number | string;
143
151
  width?: number | string;
144
152
  className?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FlowCanvas.d.ts","sourceRoot":"","sources":["../../../../src/workflow/components/FlowCanvas/FlowCanvas.tsx"],"names":[],"mappings":"AAeA,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,YAAY,EACjB,KAAK,SAAS,EAOf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,eAAe,EACf,UAAU,EACV,kBAAkB,EAClB,UAAU,EACV,UAAU,EAEV,QAAQ,EACR,YAAY,EACZ,YAAY,EACb,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,KAAK,YAAY,EAAuB,MAAM,qBAAqB,CAAC;AAe7E,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAErF,OAAO,EAAE,KAAK,eAAe,EAAsB,MAAM,UAAU,CAAC;AASpE,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAChD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAGhD,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,eAAe,CAAC,EAAE,QAAQ,CAAC;IAC3B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAGnF,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAG7B,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAC7C,cAAc,CAAC,EAAE,CACf,KAAK,EAAE,YAAY,GAAG,UAAU,CAAC,YAAY,EAC7C,MAAM,EAAE,kBAAkB,KACvB,IAAI,CAAC;IACV,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,GAAG,UAAU,CAAC,YAAY,EAAE,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC/F,iBAAiB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC;IAGxD,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE;QAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAAC,KAAK,EAAE,YAAY,EAAE,CAAA;KAAE,KAAK,IAAI,CAAC;IAC1F,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;IACzB,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C;gEAC4D;IAC5D,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxD;4EACwE;IACxE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1C;;iCAE6B;IAC7B,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE;QACxB,KAAK,EAAE,YAAY,EAAE,CAAC;QACtB,KAAK,EAAE,YAAY,EAAE,CAAC;KACvB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjC;qCACiC;IACjC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1E,8BAA8B;IAC9B,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC1E,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,IAAI,CAAC;IAGtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;;;;;;;;;;;OAaG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,OAAO,CAAC;IACxC;+EAC2E;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;;;OASG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;IAGnC,mDAAmD;IACnD,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;IACjD,2EAA2E;IAC3E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;;;;;;;;OAUG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;;OAGG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAGpC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,UAAU,CAAC,EAAE,SAAS,CAAC;CACxB;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAoyChD;AAqJD,YAAY,EAAE,eAAe,EAAE,CAAC"}
1
+ {"version":3,"file":"FlowCanvas.d.ts","sourceRoot":"","sources":["../../../../src/workflow/components/FlowCanvas/FlowCanvas.tsx"],"names":[],"mappings":"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"}
@@ -20,9 +20,11 @@ export declare function findAncestor(node: WorkflowNode, nodes: WorkflowNode[],
20
20
  */
21
21
  export declare function clampToParentExtent(node: WorkflowNode, proposed: Position, nodes: WorkflowNode[]): Position;
22
22
  /**
23
- * Hit-test which group node (if any) currently contains the given point.
24
- * Used by Alt-drop to re-parent a node into a group, and by drop-to-add
25
- * to scope a new node.
23
+ * Hit-test which container node (if any) currently contains the given
24
+ * point. Used by drag-to-reparent and by drop-to-add to scope a new
25
+ * node. Both `group` AND `forEach` are containers — a `forEach` holds
26
+ * its iteration body the same way a `group` holds its members, so the
27
+ * hit-test must accept either.
26
28
  */
27
29
  export declare function findContainingGroup(point: Position, nodes: WorkflowNode[], exclude?: string[]): WorkflowNode | undefined;
28
30
  //# sourceMappingURL=parenting.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"parenting.d.ts","sourceRoot":"","sources":["../../../src/workflow/utils/parenting.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGxD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CA0BnF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GACtC,YAAY,GAAG,SAAS,CAY1B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,EAAE,GACpB,QAAQ,CAgBV;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,GAAG,SAAS,CAqB1B"}
1
+ {"version":3,"file":"parenting.d.ts","sourceRoot":"","sources":["../../../src/workflow/utils/parenting.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAGxD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CA0BnF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,YAAY,EAAE,EACrB,SAAS,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,GACtC,YAAY,GAAG,SAAS,CAY1B;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,YAAY,EAAE,GACpB,QAAQ,CAgBV;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,QAAQ,EACf,KAAK,EAAE,YAAY,EAAE,EACrB,OAAO,GAAE,MAAM,EAAO,GACrB,YAAY,GAAG,SAAS,CAqB1B"}
package/dist/workflow.cjs CHANGED
@@ -1144,7 +1144,7 @@ function findContainingGroup(point, nodes, exclude = []) {
1144
1144
  for (let i = nodes.length - 1; i >= 0; i--) {
1145
1145
  const n = nodes[i];
1146
1146
  if (exclude.includes(n.id)) continue;
1147
- if (n.type !== "group") continue;
1147
+ if (n.type !== "group" && n.type !== "forEach") continue;
1148
1148
  if (n.data && typeof n.data === "object" && n.data.collapsed) {
1149
1149
  continue;
1150
1150
  }
@@ -2477,6 +2477,8 @@ function FlowCanvas(props) {
2477
2477
  reparentOnDrag = false,
2478
2478
  autoResizeContainers = false,
2479
2479
  containerAutoResizePadding = 32,
2480
+ containerMinWidth = 320,
2481
+ containerMinHeight = 200,
2480
2482
  height = "100%",
2481
2483
  width = "100%",
2482
2484
  className,
@@ -2613,7 +2615,9 @@ function FlowCanvas(props) {
2613
2615
  id: d.id,
2614
2616
  startPosition: d.position
2615
2617
  }));
2616
- const wantsReparent = altKey || reparentOnDragRef.current;
2618
+ const evaluateReparent = altKey || reparentOnDragRef.current;
2619
+ const hasParent = !!node.parentId;
2620
+ const skipClamp = altKey || reparentOnDragRef.current && !hasParent;
2617
2621
  dragRef.current = {
2618
2622
  pointerId,
2619
2623
  nodeId,
@@ -2621,7 +2625,8 @@ function FlowCanvas(props) {
2621
2625
  startClientY: clientY,
2622
2626
  startPosition: node.position,
2623
2627
  descendants: kids,
2624
- altDetach: wantsReparent,
2628
+ skipClamp,
2629
+ evaluateReparent,
2625
2630
  rafScheduled: false,
2626
2631
  nextDelta: null
2627
2632
  };
@@ -2681,6 +2686,8 @@ function FlowCanvas(props) {
2681
2686
  const reparentOnDragRef = (0, import_react15.useRef)(reparentOnDrag);
2682
2687
  const autoResizeContainersRef = (0, import_react15.useRef)(autoResizeContainers);
2683
2688
  const containerAutoResizePaddingRef = (0, import_react15.useRef)(containerAutoResizePadding);
2689
+ const containerMinWidthRef = (0, import_react15.useRef)(containerMinWidth);
2690
+ const containerMinHeightRef = (0, import_react15.useRef)(containerMinHeight);
2684
2691
  (0, import_react15.useEffect)(() => {
2685
2692
  edgesRef.current = edges;
2686
2693
  }, [edges]);
@@ -2714,6 +2721,12 @@ function FlowCanvas(props) {
2714
2721
  (0, import_react15.useEffect)(() => {
2715
2722
  containerAutoResizePaddingRef.current = containerAutoResizePadding;
2716
2723
  }, [containerAutoResizePadding]);
2724
+ (0, import_react15.useEffect)(() => {
2725
+ containerMinWidthRef.current = containerMinWidth;
2726
+ }, [containerMinWidth]);
2727
+ (0, import_react15.useEffect)(() => {
2728
+ containerMinHeightRef.current = containerMinHeight;
2729
+ }, [containerMinHeight]);
2717
2730
  const onNodesChangeRef = (0, import_react15.useRef)(onNodesChange);
2718
2731
  const onConnectRef = (0, import_react15.useRef)(onConnect);
2719
2732
  const onConnectEndRef = (0, import_react15.useRef)(onConnectEnd);
@@ -2758,7 +2771,7 @@ function FlowCanvas(props) {
2758
2771
  x: d.startPosition.x + delta.dx,
2759
2772
  y: d.startPosition.y + delta.dy
2760
2773
  };
2761
- const clamped = d.altDetach ? proposed : clampToParentExtent(dragNode, proposed, nodesRef.current);
2774
+ const clamped = d.skipClamp ? proposed : clampToParentExtent(dragNode, proposed, nodesRef.current);
2762
2775
  const isContainer = dragNode.type === "group" || dragNode.type === "forEach";
2763
2776
  const gap = isContainer ? subflowCollisionGapRef.current : nodeCollisionGapRef.current;
2764
2777
  const excludeIds = /* @__PURE__ */ new Set([d.nodeId, ...d.descendants.map((kid) => kid.id)]);
@@ -2810,7 +2823,7 @@ function FlowCanvas(props) {
2810
2823
  y: Math.round(proposed.y / g) * g
2811
2824
  };
2812
2825
  }
2813
- const clamped = drag.altDetach ? proposed : clampToParentExtent(dragNode, proposed, nodesRef.current);
2826
+ const clamped = drag.skipClamp ? proposed : clampToParentExtent(dragNode, proposed, nodesRef.current);
2814
2827
  const isContainer = dragNode.type === "group" || dragNode.type === "forEach";
2815
2828
  const gap = isContainer ? subflowCollisionGapRef.current : nodeCollisionGapRef.current;
2816
2829
  const excludeIds = /* @__PURE__ */ new Set([
@@ -2833,7 +2846,7 @@ function FlowCanvas(props) {
2833
2846
  )
2834
2847
  );
2835
2848
  }
2836
- if (drag.altDetach) {
2849
+ if (drag.evaluateReparent) {
2837
2850
  const targetGroup = findContainingGroup(
2838
2851
  {
2839
2852
  x: finalPos.x + (dragNode.width ?? 0) / 2,
@@ -2848,8 +2861,10 @@ function FlowCanvas(props) {
2848
2861
  ...dragNode,
2849
2862
  position: finalPos,
2850
2863
  parentId: nextParentId,
2851
- // Preserve extent only when staying in a group.
2852
- extent: nextParentId ? dragNode.extent : void 0
2864
+ // Adopting into a container always pins the child with
2865
+ // `extent: 'parent'` so it's clamped from the next drag
2866
+ // on. Detaching clears it.
2867
+ extent: nextParentId ? "parent" : void 0
2853
2868
  };
2854
2869
  changes.push(change.node.replace(drag.nodeId, updated));
2855
2870
  }
@@ -2860,7 +2875,9 @@ function FlowCanvas(props) {
2860
2875
  // Projected children: apply the position + reparent
2861
2876
  // changes we just built before measuring bboxes.
2862
2877
  changes,
2863
- containerAutoResizePaddingRef.current
2878
+ containerAutoResizePaddingRef.current,
2879
+ containerMinWidthRef.current,
2880
+ containerMinHeightRef.current
2864
2881
  );
2865
2882
  for (const c2 of containerChanges) changes.push(c2);
2866
2883
  }
@@ -2946,6 +2963,25 @@ function FlowCanvas(props) {
2946
2963
  window.removeEventListener("pointercancel", onPointerCancel);
2947
2964
  };
2948
2965
  }, [store]);
2966
+ (0, import_react15.useEffect)(() => {
2967
+ if (!autoResizeContainers || draggingId) return;
2968
+ const resizeChanges = computeContainerAutoResize(
2969
+ nodes,
2970
+ [],
2971
+ containerAutoResizePadding,
2972
+ containerMinWidth,
2973
+ containerMinHeight
2974
+ );
2975
+ if (resizeChanges.length > 0) onNodesChange?.(resizeChanges);
2976
+ }, [
2977
+ nodes,
2978
+ draggingId,
2979
+ autoResizeContainers,
2980
+ containerAutoResizePadding,
2981
+ containerMinWidth,
2982
+ containerMinHeight,
2983
+ onNodesChange
2984
+ ]);
2949
2985
  const panRef = (0, import_react15.useRef)(null);
2950
2986
  const onCanvasPointerDown = (e) => {
2951
2987
  if (e.button !== 0) return;
@@ -3408,7 +3444,9 @@ function FlowCanvas(props) {
3408
3444
  function onEdgesChangeRef(id, cb) {
3409
3445
  cb?.([change.edge.remove(id)]);
3410
3446
  }
3411
- function computeContainerAutoResize(nodes, pending, padding) {
3447
+ var CONTAINER_DROP_HEADROOM_W = 220;
3448
+ var CONTAINER_DROP_HEADROOM_H = 2 * 128;
3449
+ function computeContainerAutoResize(nodes, pending, padding, minWidth, minHeight) {
3412
3450
  const projected = /* @__PURE__ */ new Map();
3413
3451
  for (const n of nodes) projected.set(n.id, n);
3414
3452
  for (const c of pending) {
@@ -3429,7 +3467,14 @@ function computeContainerAutoResize(nodes, pending, padding) {
3429
3467
  for (const n of projected.values()) {
3430
3468
  if (n.parentId === parent.id) children.push(n);
3431
3469
  }
3432
- if (children.length === 0) continue;
3470
+ if (children.length === 0) {
3471
+ const curW2 = parent.width ?? 480;
3472
+ const curH2 = parent.height ?? 240;
3473
+ if (curW2 !== minWidth || curH2 !== minHeight) {
3474
+ out.push(change.node.dimensions(parent.id, { width: minWidth, height: minHeight }));
3475
+ }
3476
+ continue;
3477
+ }
3433
3478
  let minX = Number.POSITIVE_INFINITY;
3434
3479
  let minY = Number.POSITIVE_INFINITY;
3435
3480
  let maxX = Number.NEGATIVE_INFINITY;
@@ -3444,12 +3489,12 @@ function computeContainerAutoResize(nodes, pending, padding) {
3444
3489
  }
3445
3490
  const targetX = minX - padding;
3446
3491
  const targetY = minY - padding - HEADER;
3447
- const targetW = maxX - minX + padding * 2;
3448
- const targetH = maxY - minY + padding * 2 + HEADER;
3449
3492
  const curW = parent.width ?? 480;
3450
3493
  const curH = parent.height ?? 240;
3451
- const nextW = Math.max(curW, targetW);
3452
- const nextH = Math.max(curH, targetH);
3494
+ const fitW = maxX - minX + padding * 2 + CONTAINER_DROP_HEADROOM_W;
3495
+ const fitH = maxY - minY + padding * 2 + HEADER + CONTAINER_DROP_HEADROOM_H;
3496
+ const nextW = Math.max(minWidth, fitW);
3497
+ const nextH = Math.max(minHeight, fitH);
3453
3498
  const positionDirty = parent.position.x !== targetX || parent.position.y !== targetY;
3454
3499
  const sizeDirty = curW !== nextW || curH !== nextH;
3455
3500
  if (positionDirty) {