@pixldocs/canvas-renderer 0.5.283 → 0.5.285

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.
@@ -10476,10 +10476,6 @@ const SELECTION_PRIMARY = "hsl(217, 91%, 60%)";
10476
10476
  const SELECTION_BORDER_SCALE = 2;
10477
10477
  let ensureCanvaControlRenders = () => {
10478
10478
  };
10479
- const shouldLogGroupMove = () => {
10480
- if (typeof window === "undefined") return false;
10481
- return window.__pixldocsDebugGroupMove !== false;
10482
- };
10483
10479
  try {
10484
10480
  const InteractiveBase = fabric.InteractiveFabricObject ?? fabric.Object;
10485
10481
  if ((InteractiveBase == null ? void 0 : InteractiveBase.prototype) && !InteractiveBase.prototype.__pixldocsCenteredSelectionBorder) {
@@ -10929,31 +10925,20 @@ try {
10929
10925
  } catch (e) {
10930
10926
  }
10931
10927
  };
10932
- const tryPatchFactory = (target, key, bindTarget = target) => {
10933
- try {
10934
- if (!target || typeof target[key] !== "function") return;
10935
- const descriptor = Object.getOwnPropertyDescriptor(target, key);
10936
- if (descriptor && descriptor.writable === false && !descriptor.set) return;
10937
- const original = target[key].bind(bindTarget);
10938
- target[key] = () => installPillRenders(original());
10939
- } catch {
10940
- }
10941
- };
10942
- tryPatchFactory(cu, "createObjectDefaultControls");
10943
- tryPatchFactory(cu, "createTextboxDefaultControls");
10928
+ const origObj = cu.createObjectDefaultControls.bind(cu);
10929
+ cu.createObjectDefaultControls = () => installPillRenders(origObj());
10930
+ if (typeof cu.createTextboxDefaultControls === "function") {
10931
+ const origTb = cu.createTextboxDefaultControls.bind(cu);
10932
+ cu.createTextboxDefaultControls = () => installPillRenders(origTb());
10933
+ }
10944
10934
  const wrapClassCreateControls = (Klass) => {
10945
- try {
10946
- if (!Klass || typeof Klass.createControls !== "function") return;
10947
- const descriptor = Object.getOwnPropertyDescriptor(Klass, "createControls");
10948
- if (descriptor && descriptor.writable === false && !descriptor.set) return;
10949
- const orig = Klass.createControls.bind(Klass);
10950
- Klass.createControls = () => {
10951
- const res = orig();
10952
- if (res && res.controls) installPillRenders(res.controls);
10953
- return res;
10954
- };
10955
- } catch {
10956
- }
10935
+ if (!Klass || typeof Klass.createControls !== "function") return;
10936
+ const orig = Klass.createControls.bind(Klass);
10937
+ Klass.createControls = () => {
10938
+ const res = orig();
10939
+ if (res && res.controls) installPillRenders(res.controls);
10940
+ return res;
10941
+ };
10957
10942
  };
10958
10943
  wrapClassCreateControls(fabric.InteractiveFabricObject);
10959
10944
  wrapClassCreateControls(fabric.FabricObject);
@@ -10976,7 +10961,8 @@ try {
10976
10961
  };
10977
10962
  }
10978
10963
  }
10979
- } catch {
10964
+ } catch (e) {
10965
+ console.warn("[PageCanvas] Failed to install Canva-style control handles:", e);
10980
10966
  }
10981
10967
  const scaleTextPathConfig = (textPath, sx, sy, uniform) => {
10982
10968
  if (!textPath || typeof textPath !== "object") return textPath;
@@ -11009,9 +10995,9 @@ const scaleUpdateNumber = (updates, source, key, factor) => {
11009
10995
  const value = Number(source == null ? void 0 : source[key]);
11010
10996
  if (Number.isFinite(value)) updates[key] = value * factor;
11011
10997
  };
11012
- const bakeTextboxScaleIntoTypography = (obj, sourceElement, scaleOverride) => {
11013
- const sx = Math.abs((scaleOverride == null ? void 0 : scaleOverride.scaleX) ?? obj.scaleX ?? 1) || 1;
11014
- const sy = Math.abs((scaleOverride == null ? void 0 : scaleOverride.scaleY) ?? obj.scaleY ?? 1) || 1;
10998
+ const bakeTextboxScaleIntoTypography = (obj, sourceElement) => {
10999
+ const sx = Math.abs(obj.scaleX ?? 1) || 1;
11000
+ const sy = Math.abs(obj.scaleY ?? 1) || 1;
11015
11001
  if (Math.abs(sx - 1) < 1e-3 && Math.abs(sy - 1) < 1e-3) return null;
11016
11002
  const isUniform = Math.abs(sx - sy) < 0.01;
11017
11003
  const fontScale = isUniform ? (sx + sy) / 2 : Math.abs(sy - 1) > 1e-3 ? sy : 1;
@@ -11207,6 +11193,7 @@ const PageCanvas = forwardRef(
11207
11193
  const skipActiveSelectionBakeOnClearRef = useRef(false);
11208
11194
  const preserveEditingScopeOnSelectionClearRef = useRef(false);
11209
11195
  const preserveActiveSelectionAfterTransformRef = useRef(null);
11196
+ const recentGroupSelectionRestoreRef = useRef(null);
11210
11197
  const pendingGroupPromotionRef = useRef(null);
11211
11198
  const pendingGroupDrillInRef = useRef(null);
11212
11199
  const imageReloadRequestSeqRef = useRef(/* @__PURE__ */ new Map());
@@ -11227,7 +11214,6 @@ const PageCanvas = forwardRef(
11227
11214
  useRef(null);
11228
11215
  const lastTextEditDimensionsRef = useRef(null);
11229
11216
  const lastResizeScaleTargetRef = useRef(null);
11230
- const lastResizeScaleCornerRef = useRef(null);
11231
11217
  const preserveSelectionAfterTransformIdRef = useRef(null);
11232
11218
  const groupSelectionTransformStartRef = useRef(null);
11233
11219
  const activeSelectionMoveStartRef = useRef(null);
@@ -11555,7 +11541,6 @@ const PageCanvas = forwardRef(
11555
11541
  fc.__isUserTransforming = true;
11556
11542
  didTransformRef.current = true;
11557
11543
  lastResizeScaleTargetRef.current = target;
11558
- lastResizeScaleCornerRef.current = corner;
11559
11544
  const targetId = getObjectId(target);
11560
11545
  if (targetId && targetId !== "__background__") {
11561
11546
  preserveSelectionAfterTransformIdRef.current = targetId;
@@ -12039,9 +12024,6 @@ const PageCanvas = forwardRef(
12039
12024
  selectionLeft: rect.left,
12040
12025
  selectionTop: rect.top
12041
12026
  };
12042
- if (active.__pixldocsGroupSelection) {
12043
- prepareGroupSelectionTransformStart(active);
12044
- }
12045
12027
  }
12046
12028
  if (fabricCanvas._currentTransform) {
12047
12029
  fabricCanvas.__isUserTransforming = true;
@@ -12482,8 +12464,11 @@ const PageCanvas = forwardRef(
12482
12464
  if (shouldRestoreGroupSelection) restorePreservedGroupSelectionSoon(preservedGroupSelection);
12483
12465
  return;
12484
12466
  }
12485
- if (editLockRef.current || syncLockedRef.current || didTransformRef.current || preserveSelectionAfterTransformIdRef.current || shouldRestoreGroupSelection) {
12467
+ const recentGroupSelectionRestore = recentGroupSelectionRestoreRef.current;
12468
+ const shouldReassertRecentGroupSelection = !!((recentGroupSelectionRestore == null ? void 0 : recentGroupSelectionRestore.groupSelectionId) && recentGroupSelectionRestore.expiresAt > Date.now());
12469
+ if (editLockRef.current || syncLockedRef.current || didTransformRef.current || preserveSelectionAfterTransformIdRef.current || shouldRestoreGroupSelection || shouldReassertRecentGroupSelection) {
12486
12470
  if (shouldRestoreGroupSelection) restorePreservedGroupSelectionSoon(preservedGroupSelection);
12471
+ else if (shouldReassertRecentGroupSelection) restorePreservedGroupSelectionSoon(recentGroupSelectionRestore);
12487
12472
  return;
12488
12473
  }
12489
12474
  restoreSuppressedGroupBorders();
@@ -12718,9 +12703,7 @@ const PageCanvas = forwardRef(
12718
12703
  const selection = new fabric.ActiveSelection(members, { canvas: fc });
12719
12704
  restoreGroupSelectionVisualState(selection, groupId);
12720
12705
  fc.setActiveObject(selection);
12721
- if (!selection.getObjects().every((obj) => !(obj instanceof fabric.Group))) {
12722
- selection.setCoords();
12723
- }
12706
+ selection.setCoords();
12724
12707
  fc.requestRenderAll();
12725
12708
  } finally {
12726
12709
  requestAnimationFrame(() => {
@@ -12909,9 +12892,6 @@ const PageCanvas = forwardRef(
12909
12892
  fabricCanvas.on("mouse:down:before", (opt) => {
12910
12893
  var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
12911
12894
  const activeBeforeMouseDown = fabricCanvas.getActiveObject();
12912
- if (activeBeforeMouseDown instanceof fabric.ActiveSelection && activeBeforeMouseDown.__pixldocsGroupSelection) {
12913
- prepareGroupSelectionTransformStart(activeBeforeMouseDown);
12914
- }
12915
12895
  if (editLockRef.current) {
12916
12896
  const active = fabricCanvas.getActiveObject();
12917
12897
  if (active && (((_a2 = active._ct) == null ? void 0 : _a2.isCropGroup) || active.__cropGroup)) {
@@ -13026,14 +13006,7 @@ const PageCanvas = forwardRef(
13026
13006
  pendingGroupDrillInRef.current = null;
13027
13007
  } else if (drillGroup && !drillGroup.backgroundColor && !targetIsInCrop && alreadyThisGroup && !isMultiSelectKey && effectiveTarget !== activeNow) {
13028
13008
  pendingGroupPromotionRef.current = null;
13029
- const pointer = fabricCanvas.getPointer(opt.e);
13030
- pendingGroupDrillInRef.current = {
13031
- groupId: drillGroup.id,
13032
- childId: effectiveTargetId,
13033
- target: effectiveTarget,
13034
- startX: pointer.x,
13035
- startY: pointer.y
13036
- };
13009
+ pendingGroupDrillInRef.current = { groupId: drillGroup.id, childId: effectiveTargetId, target: effectiveTarget };
13037
13010
  if (effectiveTarget instanceof fabric.Textbox) {
13038
13011
  suppressTextEditForClick(effectiveTarget);
13039
13012
  }
@@ -13180,7 +13153,7 @@ const PageCanvas = forwardRef(
13180
13153
  o.__lockScaleDuringCrop = false;
13181
13154
  });
13182
13155
  fabricCanvas.on("mouse:up", (e) => {
13183
- var _a2, _b2, _c, _d;
13156
+ var _a2, _b2, _c;
13184
13157
  clearTransforming();
13185
13158
  setGuides([]);
13186
13159
  setRotationLabel(null);
@@ -13190,21 +13163,7 @@ const PageCanvas = forwardRef(
13190
13163
  dragStarted = false;
13191
13164
  const pendingDrillIn = pendingGroupDrillInRef.current;
13192
13165
  pendingGroupDrillInRef.current = null;
13193
- let movedPendingDrillPointer = false;
13194
- if (pendingDrillIn && pendingDrillIn.startX !== void 0 && pendingDrillIn.startY !== void 0) {
13195
- try {
13196
- const pointer = fabricCanvas.getPointer(e == null ? void 0 : e.e);
13197
- const zoom3 = ((_a2 = fabricCanvas.getZoom) == null ? void 0 : _a2.call(fabricCanvas)) || 1;
13198
- const dragThreshold = Math.max(2, 4 / zoom3);
13199
- movedPendingDrillPointer = Math.hypot(pointer.x - pendingDrillIn.startX, pointer.y - pendingDrillIn.startY) > dragThreshold;
13200
- } catch {
13201
- movedPendingDrillPointer = false;
13202
- }
13203
- }
13204
- if (movedPendingDrillPointer) {
13205
- didTransformRef.current = true;
13206
- }
13207
- if (pendingDrillIn && (didTransformRef.current || movedPendingDrillPointer)) {
13166
+ if (pendingDrillIn && didTransformRef.current) {
13208
13167
  const activeNow = fabricCanvas.getActiveObject();
13209
13168
  fabricCanvas.__activeEditingGroupId = null;
13210
13169
  setDrilledGroupBounds(null);
@@ -13234,7 +13193,7 @@ const PageCanvas = forwardRef(
13234
13193
  fabricCanvas.__activeEditingGroupId = pendingDrillIn.groupId;
13235
13194
  delete pendingDrillIn.target.__pixldocsGroupSelection;
13236
13195
  delete pendingDrillIn.target.__pixldocsLogicalGroupIds;
13237
- (_c = (_b2 = pendingDrillIn.target).set) == null ? void 0 : _c.call(_b2, { selectable: true, evented: true, hasBorders: true, hasControls: true });
13196
+ (_b2 = (_a2 = pendingDrillIn.target).set) == null ? void 0 : _b2.call(_a2, { selectable: true, evented: true, hasBorders: true, hasControls: true });
13238
13197
  fabricCanvas.setActiveObject(pendingDrillIn.target);
13239
13198
  pendingDrillIn.target.setCoords();
13240
13199
  if (pendingDrillIn.target instanceof fabric.Textbox) {
@@ -13287,7 +13246,7 @@ const PageCanvas = forwardRef(
13287
13246
  }
13288
13247
  }
13289
13248
  const activeObj = fabricCanvas.getActiveObject();
13290
- if (activeObj && (activeObj.__cropGroup || ((_d = activeObj._ct) == null ? void 0 : _d.isCropGroup))) {
13249
+ if (activeObj && (activeObj.__cropGroup || ((_c = activeObj._ct) == null ? void 0 : _c.isCropGroup))) {
13291
13250
  activeObj.__lockScaleDuringCrop = false;
13292
13251
  if (activeObj.__cropDrag) {
13293
13252
  delete activeObj.__cropDrag;
@@ -13305,9 +13264,7 @@ const PageCanvas = forwardRef(
13305
13264
  syncLockedRef.current = false;
13306
13265
  }, 50);
13307
13266
  }
13308
- requestAnimationFrame(() => {
13309
- didTransformRef.current = false;
13310
- });
13267
+ didTransformRef.current = false;
13311
13268
  setTimeout(() => {
13312
13269
  if (!fabricCanvas._currentTransform) {
13313
13270
  editLockRef.current = false;
@@ -13385,11 +13342,10 @@ const PageCanvas = forwardRef(
13385
13342
  fabricCanvas.on("selection:cleared", () => {
13386
13343
  });
13387
13344
  fabricCanvas.on("object:scaling", (e) => {
13388
- var _a2, _b2;
13345
+ var _a2;
13389
13346
  if (!isActiveRef.current) return;
13390
13347
  const t = e.target;
13391
13348
  if (t) lastResizeScaleTargetRef.current = t;
13392
- lastResizeScaleCornerRef.current = ((_a2 = e.transform) == null ? void 0 : _a2.corner) ?? null;
13393
13349
  prepareGroupSelectionTransformStart(t);
13394
13350
  markTransforming(t);
13395
13351
  didTransformRef.current = true;
@@ -13707,17 +13663,16 @@ const PageCanvas = forwardRef(
13707
13663
  setGuides(gridGuidesForScale.length ? [...scaleGuides, ...gridGuidesForScale] : scaleGuides);
13708
13664
  if (drilledGroupIdRef.current) {
13709
13665
  try {
13710
- (_b2 = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _b2.call(fabricCanvas);
13666
+ (_a2 = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _a2.call(fabricCanvas);
13711
13667
  } catch {
13712
13668
  }
13713
13669
  }
13714
13670
  });
13715
13671
  fabricCanvas.on("object:resizing", (e) => {
13716
- var _a2, _b2;
13672
+ var _a2;
13717
13673
  if (!isActiveRef.current) return;
13718
13674
  const t = e.target;
13719
13675
  if (t) lastResizeScaleTargetRef.current = t;
13720
- lastResizeScaleCornerRef.current = ((_a2 = e.transform) == null ? void 0 : _a2.corner) ?? null;
13721
13676
  markTransforming(t);
13722
13677
  didTransformRef.current = true;
13723
13678
  const transformTargetId = t ? getObjectId(t) : null;
@@ -13793,7 +13748,7 @@ const PageCanvas = forwardRef(
13793
13748
  setGuides(gridGuidesForTextResize.length ? [...scaleGuides, ...gridGuidesForTextResize] : scaleGuides);
13794
13749
  if (drilledGroupIdRef.current) {
13795
13750
  try {
13796
- (_b2 = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _b2.call(fabricCanvas);
13751
+ (_a2 = fabricCanvas.__updateDrilledGroupOutline) == null ? void 0 : _a2.call(fabricCanvas);
13797
13752
  } catch {
13798
13753
  }
13799
13754
  }
@@ -13837,26 +13792,19 @@ const PageCanvas = forwardRef(
13837
13792
  const activeDuringMove = fabricCanvas.getActiveObject();
13838
13793
  const movingLogicalGroupId = activeDuringMove instanceof fabric.ActiveSelection ? activeDuringMove.__pixldocsGroupSelection : void 0;
13839
13794
  const pendingMoveDrill = pendingGroupDrillInRef.current;
13840
- const groupIdToKeep = movingLogicalGroupId ?? (pendingMoveDrill == null ? void 0 : pendingMoveDrill.groupId);
13841
13795
  if (movingLogicalGroupId || pendingMoveDrill) {
13796
+ const groupIdToKeep = movingLogicalGroupId ?? (pendingMoveDrill == null ? void 0 : pendingMoveDrill.groupId);
13842
13797
  pendingGroupDrillInRef.current = null;
13843
13798
  fabricCanvas.__activeEditingGroupId = null;
13844
13799
  setDrilledGroupBounds(null);
13845
13800
  drilledGroupIdRef.current = null;
13846
13801
  if (activeDuringMove instanceof fabric.ActiveSelection && groupIdToKeep) {
13847
13802
  restoreGroupSelectionVisualState(activeDuringMove, groupIdToKeep);
13848
- const memberIds = activeDuringMove.getObjects().map((obj2) => getObjectId(obj2)).filter((id) => !!id && id !== "__background__");
13849
- if (memberIds.length > 1) {
13850
- preserveActiveSelectionAfterTransformRef.current = { memberIds, groupSelectionId: groupIdToKeep, expiresAt: Date.now() + 1200 };
13851
- }
13852
- preserveSelectionAfterTransformIdRef.current = groupIdToKeep;
13853
13803
  }
13854
13804
  }
13855
13805
  if (e.target) e.target.__pixldocsDragMoved = true;
13856
13806
  const moveTargetId = e.target ? getObjectId(e.target) : null;
13857
- if (groupIdToKeep) {
13858
- preserveSelectionAfterTransformIdRef.current = groupIdToKeep;
13859
- } else if (moveTargetId && moveTargetId !== "__background__") {
13807
+ if (moveTargetId && moveTargetId !== "__background__") {
13860
13808
  preserveSelectionAfterTransformIdRef.current = moveTargetId;
13861
13809
  }
13862
13810
  if (!dragStarted) {
@@ -13903,34 +13851,10 @@ const PageCanvas = forwardRef(
13903
13851
  }
13904
13852
  });
13905
13853
  let cropGroupSaveTimer = null;
13906
- let objectModifiedInFlight = false;
13907
13854
  fabricCanvas.on("object:modified", (e) => {
13908
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
13909
- if (objectModifiedInFlight) {
13910
- if (shouldLogGroupMove()) {
13911
- console.log("[GRP-MOVE] object:modified re-entry skipped", {
13912
- targetType: (_b2 = (_a2 = e.target) == null ? void 0 : _a2.constructor) == null ? void 0 : _b2.name
13913
- });
13914
- }
13915
- return;
13916
- }
13917
- objectModifiedInFlight = true;
13855
+ var _a2, _b2, _c, _d, _e, _f, _g;
13918
13856
  try {
13919
13857
  dragStarted = false;
13920
- if (shouldLogGroupMove()) {
13921
- const t = e.target;
13922
- console.log("[GRP-MOVE] object:modified fired", {
13923
- targetType: (_c = t == null ? void 0 : t.constructor) == null ? void 0 : _c.name,
13924
- isActiveSelection: t instanceof fabric.ActiveSelection,
13925
- groupSelectionId: t ? t.__pixldocsGroupSelection : null,
13926
- memberIds: t instanceof fabric.ActiveSelection ? t.getObjects().map((o) => getObjectId(o)) : [getObjectId(t)],
13927
- targetLeft: t == null ? void 0 : t.left,
13928
- targetTop: t == null ? void 0 : t.top,
13929
- scaleX: t == null ? void 0 : t.scaleX,
13930
- scaleY: t == null ? void 0 : t.scaleY,
13931
- angle: t == null ? void 0 : t.angle
13932
- });
13933
- }
13934
13858
  setGuides([]);
13935
13859
  setGroupOverlayLiveBoundsRef.current(null);
13936
13860
  objectResizeActiveSnapRef.current = null;
@@ -13972,7 +13896,7 @@ const PageCanvas = forwardRef(
13972
13896
  const active = fabricCanvas.getActiveObject();
13973
13897
  const activeId = active ? getObjectId(active) : null;
13974
13898
  if (active && activeId && activeId !== "__background__" && !(active instanceof fabric.Group)) {
13975
- const pageChildrenForParent = ((_d = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
13899
+ const pageChildrenForParent = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
13976
13900
  const parentGroup = findParentGroup(pageChildrenForParent, activeId);
13977
13901
  if (parentGroup && isGroup(parentGroup) && parentGroup.backgroundColor) {
13978
13902
  let fabricSectionGroup = active.group && active.group instanceof fabric.Group ? active.group : null;
@@ -14054,7 +13978,7 @@ const PageCanvas = forwardRef(
14054
13978
  useEditorStore.getState().reflowStackGroupInPage(pageId, groupId);
14055
13979
  }
14056
13980
  const stateAfter = useEditorStore.getState();
14057
- const pageAfter = ((_e = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
13981
+ const pageAfter = ((_b2 = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
14058
13982
  const groupNodeAfter = findNodeById(pageAfter, groupId);
14059
13983
  if (groupNodeAfter) {
14060
13984
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -14116,7 +14040,7 @@ const PageCanvas = forwardRef(
14116
14040
  }
14117
14041
  if (active && active instanceof fabric.Group && active.__docuforgeSectionGroup && getObjectId(active)) {
14118
14042
  const groupId = getObjectId(active);
14119
- const pageChildrenSec = ((_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
14043
+ const pageChildrenSec = ((_c = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c.children) ?? [];
14120
14044
  const modifiedTarget2 = e == null ? void 0 : e.target;
14121
14045
  const resizeScaleTarget = lastResizeScaleTargetRef.current;
14122
14046
  lastResizeScaleTargetRef.current = null;
@@ -14147,7 +14071,7 @@ const PageCanvas = forwardRef(
14147
14071
  const node = findNodeById(pageChildrenSec, groupId);
14148
14072
  if (isChildModified && node && !groupMoved) {
14149
14073
  const stateAfter = useEditorStore.getState();
14150
- const pageAfter = ((_g = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _g.children) ?? [];
14074
+ const pageAfter = ((_d = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
14151
14075
  const groupNodeAfter = findNodeById(pageAfter, groupId);
14152
14076
  if (groupNodeAfter) {
14153
14077
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -14163,7 +14087,7 @@ const PageCanvas = forwardRef(
14163
14087
  }
14164
14088
  if (active && active instanceof fabric.Group && !(active instanceof fabric.ActiveSelection) && getObjectId(active)) {
14165
14089
  const groupId = getObjectId(active);
14166
- const pageChildren3 = ((_h = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _h.children) ?? [];
14090
+ const pageChildren3 = ((_e = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
14167
14091
  const w = (active.width ?? 0) * (active.scaleX ?? 1);
14168
14092
  const h = (active.height ?? 0) * (active.scaleY ?? 1);
14169
14093
  const centerX = active.left ?? 0;
@@ -14185,7 +14109,7 @@ const PageCanvas = forwardRef(
14185
14109
  }
14186
14110
  const activeObj = fabricCanvas.getActiveObject();
14187
14111
  let activeObjects = fabricCanvas.getActiveObjects();
14188
- const activeSelectionMoveStart = activeObj instanceof fabric.ActiveSelection && ((_i = activeSelectionMoveStartRef.current) == null ? void 0 : _i.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
14112
+ const activeSelectionMoveStart = activeObj instanceof fabric.ActiveSelection && ((_f = activeSelectionMoveStartRef.current) == null ? void 0 : _f.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
14189
14113
  const activeSelectionDelta = activeObj instanceof fabric.ActiveSelection && activeSelectionMoveStart ? (() => {
14190
14114
  const rect = activeObj.getBoundingRect();
14191
14115
  return {
@@ -14276,22 +14200,6 @@ const PageCanvas = forwardRef(
14276
14200
  return memberIds.every((mid) => selectedSet.has(mid));
14277
14201
  })();
14278
14202
  const groupToMove = candidateIsStack || allMembersSelected ? candidateGroup : null;
14279
- if (shouldLogGroupMove()) {
14280
- console.log("[GRP-MOVE] entry", {
14281
- selectedElementIds,
14282
- isActiveSelection,
14283
- activeSelectionGroupId: activeObj instanceof fabric.ActiveSelection ? activeObj.__pixldocsGroupSelection : null,
14284
- parentGroupIds: parentGroups.map((g) => g.id),
14285
- sameDirectParent,
14286
- commonAncestorId: commonAncestor == null ? void 0 : commonAncestor.id,
14287
- candidateGroupId: candidateGroup == null ? void 0 : candidateGroup.id,
14288
- candidateIsStack,
14289
- allMembersSelected,
14290
- groupToMoveId: (groupToMove == null ? void 0 : groupToMove.id) ?? null,
14291
- activeSelectionHadTransform,
14292
- selectedLogicalGroupIds
14293
- });
14294
- }
14295
14203
  if (groupToMove) {
14296
14204
  const activeGroupSelectionId = activeObj instanceof fabric.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
14297
14205
  const transformStart = activeGroupSelectionId === groupToMove.id ? groupSelectionTransformStartRef.current : null;
@@ -14349,18 +14257,6 @@ const PageCanvas = forwardRef(
14349
14257
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14350
14258
  const newLeft = (groupToMove.left ?? 0) + deltaX;
14351
14259
  const newTop = (groupToMove.top ?? 0) + deltaY;
14352
- const __dbg = shouldLogGroupMove();
14353
- if (__dbg) {
14354
- console.log("[GRP-MOVE] commit", {
14355
- groupId: groupToMove.id,
14356
- groupAbs,
14357
- movedGroup: { left: movedGroupLeft, top: movedGroupTop },
14358
- delta: { x: deltaX, y: deltaY },
14359
- newStored: { left: newLeft, top: newTop },
14360
- activeSelectionAngle: isActiveSelection && activeObj ? activeObj.angle : null,
14361
- hasGroupSelectionId: !!(isActiveSelection && activeObj instanceof fabric.ActiveSelection && activeObj.__pixldocsGroupSelection)
14362
- });
14363
- }
14364
14260
  updateNodeStore(groupToMove.id, { left: newLeft, top: newTop }, { recordHistory: false, skipLayoutRecalc: true });
14365
14261
  commitHistoryStore();
14366
14262
  pendingGroupDrillInRef.current = null;
@@ -14386,11 +14282,13 @@ const PageCanvas = forwardRef(
14386
14282
  }
14387
14283
  setTimeout(() => modifiedIdsThisRound.forEach((id) => justModifiedIdsRef.current.delete(id)), 150);
14388
14284
  groupSelectionTransformStartRef.current = null;
14389
- activeSelectionMoveStartRef.current = null;
14390
- restorePreservedGroupSelectionSoon({
14285
+ const restoreSnapshot = {
14391
14286
  memberIds: targetObjects.map((obj) => getObjectId(obj)).filter((id) => !!id && id !== "__background__"),
14392
- groupSelectionId
14393
- });
14287
+ groupSelectionId,
14288
+ expiresAt: Date.now() + 1200
14289
+ };
14290
+ recentGroupSelectionRestoreRef.current = restoreSnapshot;
14291
+ restorePreservedGroupSelectionSoon(restoreSnapshot);
14394
14292
  unlockEditsSoon();
14395
14293
  return;
14396
14294
  }
@@ -14558,8 +14456,6 @@ const PageCanvas = forwardRef(
14558
14456
  } else if (obj instanceof fabric.Textbox && isActiveSelection && (Math.abs((decomposed.scaleX ?? 1) - 1) > 1e-3 || Math.abs((decomposed.scaleY ?? 1) - 1) > 1e-3)) {
14559
14457
  const sx = Math.abs(decomposed.scaleX || 1);
14560
14458
  const sy = Math.abs(decomposed.scaleY || 1);
14561
- const lastCorner = lastResizeScaleCornerRef.current ?? "";
14562
- const isCornerGroupScale = lastCorner === "tl" || lastCorner === "tr" || lastCorner === "bl" || lastCorner === "br";
14563
14459
  const bakedWidth = Math.max(20, intrinsicWidth * sx);
14564
14460
  const bakedHeight = Math.max(1, intrinsicHeight * sy);
14565
14461
  finalWidth = bakedWidth;
@@ -14567,13 +14463,8 @@ const PageCanvas = forwardRef(
14567
14463
  finalScaleX = 1;
14568
14464
  finalScaleY = 1;
14569
14465
  try {
14570
- if (isCornerGroupScale) {
14571
- bakeTextboxScaleIntoTypography(obj, sourceElement, { scaleX: sx, scaleY: sy });
14572
- } else {
14573
- obj.set({ width: bakedWidth, scaleX: 1, scaleY: 1 });
14574
- obj.minBoxHeight = bakedHeight;
14575
- obj.initDimensions();
14576
- }
14466
+ obj.set({ width: bakedWidth, scaleX: 1, scaleY: 1 });
14467
+ obj.initDimensions();
14577
14468
  obj.setCoords();
14578
14469
  } catch {
14579
14470
  }
@@ -14652,7 +14543,7 @@ const PageCanvas = forwardRef(
14652
14543
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
14653
14544
  obj.setCoords();
14654
14545
  }
14655
- const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
14546
+ const pageChildrenForReflow = ((_g = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _g.children) ?? [];
14656
14547
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
14657
14548
  for (const id of modifiedIdsThisRound) {
14658
14549
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -14714,15 +14605,11 @@ const PageCanvas = forwardRef(
14714
14605
  }
14715
14606
  groupSelectionTransformStartRef.current = null;
14716
14607
  activeSelectionMoveStartRef.current = null;
14717
- lastResizeScaleCornerRef.current = null;
14718
14608
  setTimeout(() => modifiedIdsThisRound.forEach((id) => justModifiedIdsRef.current.delete(id)), 150);
14719
14609
  commitHistory();
14720
14610
  unlockEditsSoon();
14721
14611
  } catch (e2) {
14722
- lastResizeScaleCornerRef.current = null;
14723
14612
  unlockEditsSoon();
14724
- } finally {
14725
- objectModifiedInFlight = false;
14726
14613
  }
14727
14614
  });
14728
14615
  fabricCanvas.on("before:selection:cleared", (e) => {
@@ -14980,14 +14867,13 @@ const PageCanvas = forwardRef(
14980
14867
  visibilityUpdateInProgressRef.current = false;
14981
14868
  }
14982
14869
  doSyncRef.current = () => {
14983
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i;
14870
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
14984
14871
  const shouldSkipUpdates2 = syncLockedRef.current || editLockRef.current;
14985
14872
  const state = useEditorStore.getState();
14986
- const storePage = state.canvas.pages.find((p) => p.id === pageId);
14987
- const pageTree = isPreviewMode && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren ?? [] : (storePage == null ? void 0 : storePage.children) ?? [];
14988
- const elementsToSync = isPreviewMode ? elements : pageTree.length ? flattenChildren(pageTree) : elements;
14873
+ const elementsToSync = elements;
14989
14874
  elementsRef.current = elementsToSync;
14990
- const selectedIdsFromStore = new Set(((_a2 = state.canvas) == null ? void 0 : _a2.selectedIds) ?? []);
14875
+ const pageTree = isPreviewMode && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren ?? [] : ((_a2 = state.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
14876
+ const selectedIdsFromStore = new Set(((_b2 = state.canvas) == null ? void 0 : _b2.selectedIds) ?? []);
14991
14877
  isRebuildingRef.current = true;
14992
14878
  const allElementIds = new Set(elementsToSync.map((el) => el.id));
14993
14879
  const sectionGroups = pageTree.filter(
@@ -15015,7 +14901,7 @@ const PageCanvas = forwardRef(
15015
14901
  const activeObjId = activeObj ? getObjectId(activeObj) : null;
15016
14902
  const isTextBeingEdited = activeObjId && editingTextIdRef.current === activeObjId;
15017
14903
  const isMultiSelect = activeObj instanceof fabric.ActiveSelection;
15018
- if (activeObj && isMultiSelect && !(((_b2 = activeObj._ct) == null ? void 0 : _b2.isCropGroup) || activeObj.__cropGroup) && !isTextBeingEdited) {
14904
+ if (activeObj && isMultiSelect && !(((_c = activeObj._ct) == null ? void 0 : _c.isCropGroup) || activeObj.__cropGroup) && !isTextBeingEdited) {
15019
14905
  fc.discardActiveObject();
15020
14906
  }
15021
14907
  }
@@ -15052,7 +14938,7 @@ const PageCanvas = forwardRef(
15052
14938
  fc.requestRenderAll();
15053
14939
  }
15054
14940
  } else if (!skipRestoreSelection && restoreTarget && !isActiveTextBeingEdited) {
15055
- const isCropGroup2 = ((_c = restoreTarget._ct) == null ? void 0 : _c.isCropGroup) || restoreTarget.__cropGroup;
14941
+ const isCropGroup2 = ((_d = restoreTarget._ct) == null ? void 0 : _d.isCropGroup) || restoreTarget.__cropGroup;
15056
14942
  const isSectionGroup = activeId && sectionGroupIds.has(activeId);
15057
14943
  if ((isCropGroup2 || !shouldSkipUpdates2) && !isSectionGroup) {
15058
14944
  fc.setActiveObject(restoreTarget);
@@ -15157,42 +15043,9 @@ const PageCanvas = forwardRef(
15157
15043
  };
15158
15044
  fc.add(sectionGroup);
15159
15045
  }
15160
- const getActiveSelectionContainingObject = (obj) => {
15161
- const active = fc.getActiveObject();
15162
- return active instanceof fabric.ActiveSelection && active.getObjects().includes(obj) ? active : null;
15163
- };
15164
- const shouldPreserveActiveSelectionMemberPosition = (obj) => {
15165
- if (syncTriggeredByPanelRef.current) return false;
15166
- const activeSelection = getActiveSelectionContainingObject(obj);
15167
- if (!activeSelection) return false;
15168
- const logicalActiveSelection = activeSelection;
15169
- const logicalGroupId = logicalActiveSelection.__pixldocsGroupSelection;
15170
- const logicalGroupIds = logicalActiveSelection.__pixldocsLogicalGroupIds;
15171
- if (logicalGroupId || Array.isArray(logicalGroupIds)) return true;
15172
- const id = getObjectId(obj);
15173
- const preserved = preserveActiveSelectionAfterTransformRef.current;
15174
- return !!(id && (preserved == null ? void 0 : preserved.memberIds.includes(id)) && (!preserved.expiresAt || preserved.expiresAt > Date.now()));
15175
- };
15176
- const getObjectSyncComparePosition = (obj) => {
15177
- const activeSelection = getActiveSelectionContainingObject(obj);
15178
- if (!activeSelection) return { left: obj.left ?? 0, top: obj.top ?? 0 };
15179
- const point = fabric.util.transformPoint({ x: obj.left ?? 0, y: obj.top ?? 0 }, activeSelection.calcTransformMatrix());
15180
- let left = point.x;
15181
- let top = point.y;
15182
- const cropObj = obj;
15183
- if (obj instanceof fabric.Group && cropObj.__cropGroup) {
15184
- const ct = cropObj.__cropData;
15185
- left -= ((ct == null ? void 0 : ct.frameW) ?? obj.width ?? 0) * Math.abs(obj.scaleX ?? 1) / 2;
15186
- top -= ((ct == null ? void 0 : ct.frameH) ?? obj.height ?? 0) * Math.abs(obj.scaleY ?? 1) / 2;
15187
- } else if (obj instanceof fabric.FabricImage && (obj.originX === "center" || obj.originY === "center")) {
15188
- left -= (obj.width ?? 0) * Math.abs(obj.scaleX ?? 1) / 2;
15189
- top -= (obj.height ?? 0) * Math.abs(obj.scaleY ?? 1) / 2;
15190
- }
15191
- return { left, top };
15192
- };
15193
15046
  for (const element of elementsToSync) {
15194
15047
  if (sectionDescendantIds.has(element.id)) continue;
15195
- const existingObj = currentFabricObjects.get(element.id);
15048
+ let existingObj = currentFabricObjects.get(element.id);
15196
15049
  const isHidden = !element.visible;
15197
15050
  if (existingObj) {
15198
15051
  const isBeingTransformed = transformingIdsRef.current.has(element.id);
@@ -15213,7 +15066,7 @@ const PageCanvas = forwardRef(
15213
15066
  const sourceUrlChanged = currentUrlNormalized !== storedUrlNormalized;
15214
15067
  const newFadeKey = edgeFadeKey(element);
15215
15068
  const oldFadeKey = isCropGroup2 ? existingObj.__edgeFadeInputKey || "" : existingObj.__edgeFadeKey || "";
15216
- const innerImg = (_d = existingObj == null ? void 0 : existingObj.__cropData) == null ? void 0 : _d._img;
15069
+ const innerImg = (_e = existingObj == null ? void 0 : existingObj.__cropData) == null ? void 0 : _e._img;
15217
15070
  const innerOldKey = isCropGroup2 ? oldFadeKey : innerImg ? innerImg.__edgeFadeKey || "" : oldFadeKey;
15218
15071
  const cropFadeRendererMissing = isCropGroup2 && Boolean(newFadeKey) && !existingObj.__edgeFadeRenderConfig;
15219
15072
  const fadeKeyChanged = newFadeKey !== oldFadeKey || newFadeKey !== innerOldKey || cropFadeRendererMissing;
@@ -15221,14 +15074,14 @@ const PageCanvas = forwardRef(
15221
15074
  const needsCropGroupFadeUpdate = isCropGroup2 && fadeKeyChanged;
15222
15075
  const hadUrlBefore = storedImageUrl && String(storedImageUrl).trim() !== "";
15223
15076
  if (!hasUrl && hadUrlBefore) {
15224
- const resolvedSizeImg = pageTree.length ? getNodeBounds(element, pageTree) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15077
+ const resolvedSizeImg = (pageChildren == null ? void 0 : pageChildren.length) ? getNodeBounds(element, pageChildren) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15225
15078
  const hasExplicitSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
15226
15079
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
15227
15080
  const nextWidth = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.width) || 200);
15228
15081
  const nextHeight = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.height) || 50);
15229
- const storePosImg = pageTree.length ? (() => {
15230
- const node = findNodeById(pageTree, element.id);
15231
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
15082
+ const storePosImg = pageChildren ? (() => {
15083
+ const node = findNodeById(pageChildren, element.id);
15084
+ return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
15232
15085
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
15233
15086
  const elementForPlaceholder = { ...element, width: nextWidth, height: nextHeight };
15234
15087
  const placeholder = isCropGroup2 ? createImagePlaceholderForGroup(elementForPlaceholder) : createImagePlaceholder(elementForPlaceholder);
@@ -15251,8 +15104,8 @@ const PageCanvas = forwardRef(
15251
15104
  fc.requestRenderAll();
15252
15105
  continue;
15253
15106
  }
15254
- const imageFitForReplace = element.imageFit || ((_e = element.style) == null ? void 0 : _e.imageFit) || "cover";
15255
- const clipShapeForReplace = element.clipShape ?? ((_f = element.style) == null ? void 0 : _f.imageFrameShape) ?? (isPreviewMode ? "rectangle" : "none");
15107
+ const imageFitForReplace = element.imageFit || ((_f = element.style) == null ? void 0 : _f.imageFit) || "cover";
15108
+ const clipShapeForReplace = element.clipShape ?? ((_g = element.style) == null ? void 0 : _g.imageFrameShape) ?? (isPreviewMode ? "rectangle" : "none");
15256
15109
  const needCropGroupForElement = imageFitForReplace !== "fill" || clipShapeForReplace && clipShapeForReplace !== "none";
15257
15110
  const plainImageNeedsCropGroup = hasUrl && !isCropGroup2 && existingObj instanceof fabric.FabricImage && needCropGroupForElement;
15258
15111
  if (hasUrl && (needsReload || isPlaceholder || plainImageNeedsCropGroup || needsCropGroupFadeUpdate)) {
@@ -15289,9 +15142,9 @@ const PageCanvas = forwardRef(
15289
15142
  }
15290
15143
  ct.rx = rxRatio;
15291
15144
  }
15292
- const cropPos = pageTree.length ? (() => {
15293
- const node = findNodeById(pageTree, element.id);
15294
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
15145
+ const cropPos = pageChildren ? (() => {
15146
+ const node = findNodeById(pageChildren, element.id);
15147
+ return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
15295
15148
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
15296
15149
  const cropCenterX = cropPos.left + (ct.frameW ?? 0) / 2;
15297
15150
  const cropCenterY = cropPos.top + (ct.frameH ?? 0) / 2;
@@ -15388,7 +15241,7 @@ const PageCanvas = forwardRef(
15388
15241
  continue;
15389
15242
  }
15390
15243
  } else if (!hasUrl && !isPlaceholder) {
15391
- const resolvedSizeImg = pageTree.length ? getNodeBounds(element, pageTree) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15244
+ const resolvedSizeImg = (pageChildren == null ? void 0 : pageChildren.length) ? getNodeBounds(element, pageChildren) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15392
15245
  const hasExplicitSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
15393
15246
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
15394
15247
  const elementForPlaceholder = {
@@ -15418,11 +15271,11 @@ const PageCanvas = forwardRef(
15418
15271
  placeholder.__imageSrc = void 0;
15419
15272
  } else if (!isBeingTransformed && !isBeingTextEdited && !shouldSkipUpdates2) {
15420
15273
  if (isPlaceholderGroup) {
15421
- const storePosImg = pageTree.length ? (() => {
15422
- const node = findNodeById(pageTree, element.id);
15423
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
15274
+ const storePosImg = pageChildren ? (() => {
15275
+ const node = findNodeById(pageChildren, element.id);
15276
+ return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
15424
15277
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
15425
- const resolvedSizeImg = pageTree.length ? getNodeBounds(element, pageTree) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15278
+ const resolvedSizeImg = (pageChildren == null ? void 0 : pageChildren.length) ? getNodeBounds(element, pageChildren) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
15426
15279
  const hasExplicitSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
15427
15280
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
15428
15281
  const nextWidth = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.width) || 200);
@@ -15482,13 +15335,11 @@ const PageCanvas = forwardRef(
15482
15335
  const previousVisible = previousVisibilityRef.current.get(element.id) ?? true;
15483
15336
  const currentVisible = element.visible !== false;
15484
15337
  const visibilityChanged = previousVisible !== currentVisible;
15485
- const storePosForImg = pageTree.length ? (() => {
15486
- const node = findNodeById(pageTree, element.id);
15487
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
15338
+ const storePosForImg = pageChildren ? (() => {
15339
+ const node = findNodeById(pageChildren, element.id);
15340
+ return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
15488
15341
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
15489
- const comparePosForImg = getObjectSyncComparePosition(existingObj);
15490
- const preserveSelectionMemberPosition = shouldPreserveActiveSelectionMemberPosition(existingObj);
15491
- const positionChanged = !preserveSelectionMemberPosition && (Math.abs(comparePosForImg.left - storePosForImg.left) > 0.1 || Math.abs(comparePosForImg.top - storePosForImg.top) > 0.1);
15342
+ const positionChanged = Math.abs((existingObj.left ?? 0) - storePosForImg.left) > 0.1 || Math.abs((existingObj.top ?? 0) - storePosForImg.top) > 0.1;
15492
15343
  if (visibilityChanged && !positionChanged || visibilityUpdateInProgressRef.current) {
15493
15344
  const isDynamicField = dynamicFieldIds.includes(element.id);
15494
15345
  const canBeEvented = isEditorMode || isPreviewMode && isDynamicField;
@@ -15503,7 +15354,7 @@ const PageCanvas = forwardRef(
15503
15354
  previousVisibilityRef.current.set(element.id, currentVisible);
15504
15355
  } else {
15505
15356
  if (!visibilityUpdateInProgressRef.current) {
15506
- updateFabricObject(existingObj, element, wasJustModified || preserveSelectionMemberPosition);
15357
+ updateFabricObject(existingObj, element, wasJustModified);
15507
15358
  }
15508
15359
  const isDynamicField = dynamicFieldIds.includes(element.id);
15509
15360
  const canBeEvented = isEditorMode || isPreviewMode && isDynamicField;
@@ -15525,19 +15376,17 @@ const PageCanvas = forwardRef(
15525
15376
  if (!isBeingTransformed && !isBeingTextEdited && !shouldSkipUpdates2) {
15526
15377
  previousVisibilityRef.current.get(element.id) ?? true;
15527
15378
  const currentVisible = element.visible !== false;
15528
- const comparePos = getObjectSyncComparePosition(existingObj);
15529
- const fabricLeft = comparePos.left;
15530
- const fabricTop = comparePos.top;
15531
- const storePos = pageTree.length ? (() => {
15532
- const node = findNodeById(pageTree, element.id);
15533
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
15379
+ const fabricLeft = existingObj.left ?? 0;
15380
+ const fabricTop = existingObj.top ?? 0;
15381
+ const storePos = pageChildren ? (() => {
15382
+ const node = findNodeById(pageChildren, element.id);
15383
+ return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
15534
15384
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
15535
15385
  const storeLeft = storePos.left;
15536
15386
  const storeTop = storePos.top;
15537
15387
  const deltaX = Math.abs(fabricLeft - storeLeft);
15538
15388
  const deltaY = Math.abs(fabricTop - storeTop);
15539
- const preserveSelectionMemberPosition = shouldPreserveActiveSelectionMemberPosition(existingObj);
15540
- let positionChanged = !preserveSelectionMemberPosition && (deltaX > 0.1 || deltaY > 0.1);
15389
+ let positionChanged = deltaX > 0.1 || deltaY > 0.1;
15541
15390
  const activeObj = fc.getActiveObject();
15542
15391
  const isInActiveSelection = activeObj && (activeObj instanceof fabric.ActiveSelection ? activeObj.getObjects().includes(existingObj) : activeObj === existingObj);
15543
15392
  const isInSelectedIds = selectedIdsFromStore.has(element.id);
@@ -15545,7 +15394,7 @@ const PageCanvas = forwardRef(
15545
15394
  if (positionChanged && isSelected && (wasJustModified || isBeingTransformed)) {
15546
15395
  positionChanged = false;
15547
15396
  }
15548
- const resolvedSizeForCompare = pageTree.length ? getNodeBounds(element, pageTree) : { width: typeof element.width === "number" ? element.width : 0, height: typeof element.height === "number" ? element.height : 0 };
15397
+ const resolvedSizeForCompare = (pageChildren == null ? void 0 : pageChildren.length) ? getNodeBounds(element, pageChildren) : { width: typeof element.width === "number" ? element.width : 0, height: typeof element.height === "number" ? element.height : 0 };
15549
15398
  const fabricText = existingObj.text ?? "";
15550
15399
  const storeText = element.text ?? "";
15551
15400
  const otherPropsChanged = Math.abs((existingObj.width ?? 0) - resolvedSizeForCompare.width) > 0.1 || Math.abs((existingObj.height ?? 0) - resolvedSizeForCompare.height) > 0.1 || Math.abs((existingObj.angle ?? 0) - (element.angle ?? 0)) > 0.1 || Math.abs((existingObj.scaleX ?? 1) - (element.scaleX ?? 1)) > 0.01 || Math.abs((existingObj.scaleY ?? 1) - (element.scaleY ?? 1)) > 0.01 || (existingObj.flipX ?? false) !== (element.flipX ?? false) || (existingObj.flipY ?? false) !== (element.flipY ?? false) || fabricText !== storeText || existingObj.fill !== (element.fill ?? "") || existingObj.stroke !== (element.stroke ?? "") || Math.abs((existingObj.strokeWidth ?? 0) - (element.strokeWidth ?? 0)) > 0.01 || Math.abs((existingObj.opacity ?? 1) - (element.opacity ?? 1)) > 0.01 || (existingObj.fontSize ?? 0) !== (element.fontSize ?? 0) || (existingObj.fontFamily ?? "") !== (element.fontFamily ?? "") || // Vertical alignment & min box height: panel-driven changes must trigger a re-apply
@@ -15589,28 +15438,8 @@ const PageCanvas = forwardRef(
15589
15438
  });
15590
15439
  previousVisibilityRef.current.set(element.id, currentVisible);
15591
15440
  } else {
15592
- const skipPositionBecauseSelection = preserveSelectionMemberPosition || isSelected && (deltaX > 0.1 || deltaY > 0.1) && (wasJustModified || isBeingTransformed);
15441
+ const skipPositionBecauseSelection = isSelected && (deltaX > 0.1 || deltaY > 0.1) && (wasJustModified || isBeingTransformed);
15593
15442
  const anyChange = positionChanged || otherPropsChanged || forceApplyFromPanel;
15594
- if (shouldLogGroupMove() && (preserveSelectionMemberPosition || (deltaX > 0.1 || deltaY > 0.1))) {
15595
- console.log("[GRP-MOVE] doSync-member", {
15596
- id: element.id,
15597
- type: element.type,
15598
- fabric: { left: fabricLeft, top: fabricTop },
15599
- store: { left: storeLeft, top: storeTop },
15600
- delta: { x: deltaX, y: deltaY },
15601
- flags: {
15602
- preserveSelectionMemberPosition,
15603
- isSelected,
15604
- wasJustModified,
15605
- isBeingTransformed,
15606
- positionChanged,
15607
- otherPropsChanged,
15608
- skipPositionBecauseSelection,
15609
- anyChange,
15610
- syncTriggeredByPanel: syncTriggeredByPanelRef.current
15611
- }
15612
- });
15613
- }
15614
15443
  if (!visibilityUpdateInProgressRef.current) {
15615
15444
  if (anyChange && !skipPositionBecauseSelection) {
15616
15445
  updateFabricObject(existingObj, element, wasJustModified);
@@ -15706,7 +15535,7 @@ const PageCanvas = forwardRef(
15706
15535
  fc.add(placeholder);
15707
15536
  fc.bringObjectToFront(placeholder);
15708
15537
  const activeObj = fc.getActiveObject();
15709
- if (activeObj && (((_g = activeObj._ct) == null ? void 0 : _g.isCropGroup) || activeObj.__cropGroup)) {
15538
+ if (activeObj && (((_h = activeObj._ct) == null ? void 0 : _h.isCropGroup) || activeObj.__cropGroup)) {
15710
15539
  fc.setActiveObject(activeObj);
15711
15540
  }
15712
15541
  placeholder.dirty = true;
@@ -15746,7 +15575,7 @@ const PageCanvas = forwardRef(
15746
15575
  fc.add(obj);
15747
15576
  fc.bringObjectToFront(obj);
15748
15577
  const activeObj = fc.getActiveObject();
15749
- if (activeObj && (((_h = activeObj._ct) == null ? void 0 : _h.isCropGroup) || activeObj.__cropGroup)) {
15578
+ if (activeObj && (((_i = activeObj._ct) == null ? void 0 : _i.isCropGroup) || activeObj.__cropGroup)) {
15750
15579
  fc.setActiveObject(activeObj);
15751
15580
  }
15752
15581
  obj.dirty = true;
@@ -15776,18 +15605,10 @@ const PageCanvas = forwardRef(
15776
15605
  });
15777
15606
  allFabricObjects.forEach((obj) => fc.bringObjectToFront(obj));
15778
15607
  }
15779
- const activeAfterObjectSync = fc.getActiveObject();
15780
- if (activeAfterObjectSync instanceof fabric.ActiveSelection) {
15781
- const groupSelectionId = activeAfterObjectSync.__pixldocsGroupSelection;
15782
- if (groupSelectionId) {
15783
- applyLogicalGroupSelectionVisualState(activeAfterObjectSync, groupSelectionId);
15784
- activeAfterObjectSync.setCoords();
15785
- }
15786
- }
15787
15608
  isRebuildingRef.current = false;
15788
15609
  fc.requestRenderAll();
15789
15610
  if (activeBeforeSync && fc.getObjects().includes(activeBeforeSync)) {
15790
- const isCropGroup2 = ((_i = activeBeforeSync._ct) == null ? void 0 : _i.isCropGroup) || activeBeforeSync.__cropGroup;
15611
+ const isCropGroup2 = ((_j = activeBeforeSync._ct) == null ? void 0 : _j.isCropGroup) || activeBeforeSync.__cropGroup;
15791
15612
  if (isCropGroup2) {
15792
15613
  fc.setActiveObject(activeBeforeSync);
15793
15614
  fc.requestRenderAll();
@@ -15840,9 +15661,7 @@ const PageCanvas = forwardRef(
15840
15661
  applyLogicalGroupSelectionVisualState(newSel, activeSelectionSnapshot.groupSelectionId);
15841
15662
  }
15842
15663
  fc.setActiveObject(newSel);
15843
- if (!(activeSelectionSnapshot.groupSelectionId && newSel.getObjects().every((obj) => !(obj instanceof fabric.Group)))) {
15844
- newSel.setCoords();
15845
- }
15664
+ newSel.setCoords();
15846
15665
  fc.requestRenderAll();
15847
15666
  } finally {
15848
15667
  isSyncingSelectionToFabricRef.current = false;
@@ -16146,6 +15965,7 @@ const PageCanvas = forwardRef(
16146
15965
  });
16147
15966
  if (isPureSingleGroupSelection) {
16148
15967
  active.hasBorders = true;
15968
+ active.setCoords();
16149
15969
  applyWarpAwareSelectionBorders(active);
16150
15970
  }
16151
15971
  }
@@ -16214,7 +16034,7 @@ const PageCanvas = forwardRef(
16214
16034
  if (fc && isTransforming(fc)) {
16215
16035
  return;
16216
16036
  }
16217
- const currentPageTree = (isPreviewMode && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
16037
+ const currentPageTree = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
16218
16038
  const fabricPos = currentPageTree.length > 0 ? (() => {
16219
16039
  const node = findNodeById(currentPageTree, element.id);
16220
16040
  return node ? getAbsoluteBounds(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
@@ -17282,7 +17102,7 @@ const PageCanvas = forwardRef(
17282
17102
  if (imageFit === "fill" && !needCropGroup2) {
17283
17103
  const finalScaleX = baseScaleX * (element.scaleX ?? 1);
17284
17104
  const finalScaleY = baseScaleY * (element.scaleY ?? 1);
17285
- const pageTreeForCreate = ((isPreviewMode || isExportMode) && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
17105
+ const pageTreeForCreate = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
17286
17106
  const createPos = pageTreeForCreate.length > 0 ? (() => {
17287
17107
  const node = findNodeById(pageTreeForCreate, element.id);
17288
17108
  return node ? getAbsoluteBounds(node, pageTreeForCreate) : { left: element.left ?? 0, top: element.top ?? 0 };
@@ -17332,7 +17152,7 @@ const PageCanvas = forwardRef(
17332
17152
  const needCropGroup = imageFitFinal !== "fill" || clipShapeFinal && clipShapeFinal !== "none";
17333
17153
  let finalObject = img;
17334
17154
  if (needCropGroup) {
17335
- const pageTreeForCropResolve = ((isPreviewMode || isExportMode) && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_i = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _i.children) ?? [];
17155
+ const pageTreeForCropResolve = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_i = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _i.children) ?? [];
17336
17156
  const nodeForSize = pageTreeForCropResolve.length ? findNodeById(pageTreeForCropResolve, element.id) : null;
17337
17157
  const w = nodeForSize && isElement(nodeForSize) ? nodeForSize.width : element.width;
17338
17158
  const h = nodeForSize && isElement(nodeForSize) ? nodeForSize.height : element.height;
@@ -17376,7 +17196,7 @@ const PageCanvas = forwardRef(
17376
17196
  }
17377
17197
  const isDynamicField = dynamicFieldIds.includes(element.id);
17378
17198
  const canBeEvented = isEditorMode || isPreviewMode && isDynamicField;
17379
- const pageTreeForCrop = ((isPreviewMode || isExportMode) && (pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_n = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _n.children) ?? [];
17199
+ const pageTreeForCrop = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_n = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _n.children) ?? [];
17380
17200
  const createPosForCrop = pageTreeForCrop.length > 0 ? (() => {
17381
17201
  const node = findNodeById(pageTreeForCrop, element.id);
17382
17202
  return node ? getAbsoluteBounds(node, pageTreeForCrop) : { left: element.left ?? 0, top: element.top ?? 0 };
@@ -23792,9 +23612,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
23792
23612
  }
23793
23613
  return svgString;
23794
23614
  }
23795
- const resolvedPackageVersion = "0.5.283";
23615
+ const resolvedPackageVersion = "0.5.285";
23796
23616
  const PACKAGE_VERSION = resolvedPackageVersion;
23797
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.283";
23617
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.285";
23798
23618
  const roundParityValue = (value) => {
23799
23619
  if (typeof value !== "number") return value;
23800
23620
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -24608,7 +24428,7 @@ class PixldocsRenderer {
24608
24428
  await this.waitForCanvasScene(container, cloned, i);
24609
24429
  }
24610
24430
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
24611
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-DwiSa6HT.js");
24431
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-B0C--0iz.js");
24612
24432
  const prepared = preparePagesForExport(
24613
24433
  cloned.pages,
24614
24434
  canvasWidth,
@@ -26928,7 +26748,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
26928
26748
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
26929
26749
  sanitizeSvgTreeForPdf(svgToDraw);
26930
26750
  try {
26931
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-DwiSa6HT.js");
26751
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-B0C--0iz.js");
26932
26752
  try {
26933
26753
  await logTextMeasurementDiagnostic(svgToDraw);
26934
26754
  } catch {
@@ -27328,4 +27148,4 @@ export {
27328
27148
  buildTeaserBlurFlatKeys as y,
27329
27149
  collectFontDescriptorsFromConfig as z
27330
27150
  };
27331
- //# sourceMappingURL=index-DZrJdP7E.js.map
27151
+ //# sourceMappingURL=index-3k0uE4wB.js.map