@pixldocs/canvas-renderer 0.5.348 → 0.5.350

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.
@@ -10500,6 +10500,102 @@ function bakeEdgeFade(source, fade) {
10500
10500
  }
10501
10501
  return canvas;
10502
10502
  }
10503
+ const normalizeSignedAngle = (angle) => (angle % 360 + 540) % 360 - 180;
10504
+ const rotatedTopLeftToCenter = (left, top, width, height, angleDeg = 0) => {
10505
+ const angle = angleDeg * Math.PI / 180;
10506
+ const cos = Math.cos(angle);
10507
+ const sin = Math.sin(angle);
10508
+ return {
10509
+ x: left + width / 2 * cos - height / 2 * sin,
10510
+ y: top + width / 2 * sin + height / 2 * cos
10511
+ };
10512
+ };
10513
+ const centerToRotatedTopLeft = (centerX, centerY, width, height, angleDeg = 0) => {
10514
+ const angle = angleDeg * Math.PI / 180;
10515
+ const cos = Math.cos(angle);
10516
+ const sin = Math.sin(angle);
10517
+ return {
10518
+ left: centerX - width / 2 * cos + height / 2 * sin,
10519
+ top: centerY - width / 2 * sin - height / 2 * cos
10520
+ };
10521
+ };
10522
+ const getGroupTransformFrame = (group, pageChildren, options) => {
10523
+ const bounds = getNodeBounds(group, pageChildren);
10524
+ const width = Math.max(1, Number(group.width ?? bounds.width) || bounds.width || 1);
10525
+ const height = Math.max(1, Number(group.height ?? bounds.height) || bounds.height || 1);
10526
+ return {
10527
+ left: Number(group.left ?? bounds.left ?? 0) || 0,
10528
+ top: Number(group.top ?? bounds.top ?? 0) || 0,
10529
+ width,
10530
+ height,
10531
+ angle: Number(group.angle ?? 0) || 0
10532
+ };
10533
+ };
10534
+ const getGroupLocalToParentMatrix = (group, pageChildren, options) => {
10535
+ const frame = getGroupTransformFrame(group, pageChildren);
10536
+ const rad = frame.angle * Math.PI / 180;
10537
+ const cos = Math.cos(rad);
10538
+ const sin = Math.sin(rad);
10539
+ return [
10540
+ cos,
10541
+ sin,
10542
+ -sin,
10543
+ cos,
10544
+ frame.left,
10545
+ frame.top
10546
+ ];
10547
+ };
10548
+ const getAncestorGroupTransform = (nodeId, pageChildren, fabric2, options) => {
10549
+ let matrix = [1, 0, 0, 1, 0, 0];
10550
+ let angle = 0;
10551
+ const chain = [];
10552
+ let currentId = nodeId;
10553
+ for (let guard = 0; guard < 32; guard++) {
10554
+ const parent = findParentGroup(pageChildren, currentId);
10555
+ if (!parent) break;
10556
+ chain.unshift(parent);
10557
+ currentId = parent.id;
10558
+ }
10559
+ for (const group of chain) {
10560
+ matrix = fabric2.util.multiplyTransformMatrices(
10561
+ matrix,
10562
+ getGroupLocalToParentMatrix(group, pageChildren)
10563
+ );
10564
+ angle += Number(group.angle ?? 0) || 0;
10565
+ }
10566
+ return { matrix, angle: normalizeSignedAngle(angle) };
10567
+ };
10568
+ const getElementFabricPlacement$1 = (element, pageChildren, fabric2, options) => {
10569
+ if (!pageChildren.length) {
10570
+ return { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
10571
+ }
10572
+ const ancestor = getAncestorGroupTransform(element.id, pageChildren, fabric2);
10573
+ const point = fabric2.util.transformPoint(
10574
+ new fabric2.Point(element.left ?? 0, element.top ?? 0),
10575
+ ancestor.matrix
10576
+ );
10577
+ return {
10578
+ left: point.x,
10579
+ top: point.y,
10580
+ angle: normalizeSignedAngle(ancestor.angle + Number(element.angle ?? 0))
10581
+ };
10582
+ };
10583
+ const getGroupAbsoluteTransformFrame$1 = (group, pageChildren, fabric2, options) => {
10584
+ const frame = getGroupTransformFrame(group, pageChildren);
10585
+ const ancestor = getAncestorGroupTransform(group.id, pageChildren, fabric2);
10586
+ const centerLocal = rotatedTopLeftToCenter(frame.left, frame.top, frame.width, frame.height, frame.angle);
10587
+ const center = fabric2.util.transformPoint(new fabric2.Point(centerLocal.x, centerLocal.y), ancestor.matrix);
10588
+ const topLeft = fabric2.util.transformPoint(new fabric2.Point(frame.left, frame.top), ancestor.matrix);
10589
+ return {
10590
+ left: topLeft.x,
10591
+ top: topLeft.y,
10592
+ width: frame.width,
10593
+ height: frame.height,
10594
+ centerX: center.x,
10595
+ centerY: center.y,
10596
+ angle: normalizeSignedAngle(ancestor.angle + frame.angle)
10597
+ };
10598
+ };
10503
10599
  const SELECTION_PRIMARY = "hsl(217, 91%, 60%)";
10504
10600
  const SELECTION_BORDER_SCALE = 2;
10505
10601
  let ensureCanvaControlRenders = () => {
@@ -10953,12 +11049,18 @@ try {
10953
11049
  } catch (e) {
10954
11050
  }
10955
11051
  };
10956
- const origObj = cu.createObjectDefaultControls.bind(cu);
10957
- cu.createObjectDefaultControls = () => installPillRenders(origObj());
10958
- if (typeof cu.createTextboxDefaultControls === "function") {
10959
- const origTb = cu.createTextboxDefaultControls.bind(cu);
10960
- cu.createTextboxDefaultControls = () => installPillRenders(origTb());
10961
- }
11052
+ const wrapControlsFactory = (key) => {
11053
+ if (typeof cu[key] !== "function") return;
11054
+ const descriptor = Object.getOwnPropertyDescriptor(cu, key);
11055
+ if (descriptor && descriptor.writable === false && !descriptor.set) return;
11056
+ const original = cu[key].bind(cu);
11057
+ try {
11058
+ cu[key] = () => installPillRenders(original());
11059
+ } catch {
11060
+ }
11061
+ };
11062
+ wrapControlsFactory("createObjectDefaultControls");
11063
+ wrapControlsFactory("createTextboxDefaultControls");
10962
11064
  const wrapClassCreateControls = (Klass) => {
10963
11065
  if (!Klass || typeof Klass.createControls !== "function") return;
10964
11066
  const orig = Klass.createControls.bind(Klass);
@@ -11199,15 +11301,8 @@ const bakeTextboxScaleIntoTypography = (obj, sourceElement) => {
11199
11301
  };
11200
11302
  return updates;
11201
11303
  };
11202
- const rotatedTopLeftToCenter = (left, top, width, height, angleDeg = 0) => {
11203
- const angle = angleDeg * Math.PI / 180;
11204
- const cos = Math.cos(angle);
11205
- const sin = Math.sin(angle);
11206
- return {
11207
- x: left + width / 2 * cos - height / 2 * sin,
11208
- y: top + width / 2 * sin + height / 2 * cos
11209
- };
11210
- };
11304
+ const getElementFabricPlacement = (element, pageChildren, options) => getElementFabricPlacement$1(element, pageChildren, fabric);
11305
+ const getGroupAbsoluteTransformFrame = (group, pageChildren, options) => getGroupAbsoluteTransformFrame$1(group, pageChildren, fabric);
11211
11306
  function applyWarpAwareSelectionBorders(selection) {
11212
11307
  var _a2;
11213
11308
  if (selection.__pixldocsOrigASHasBorders !== void 0) {
@@ -11356,13 +11451,13 @@ const PageCanvas = forwardRef(
11356
11451
  ));
11357
11452
  const pageChildren2 = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
11358
11453
  const groupNode = findNodeById(pageChildren2, groupId);
11359
- const groupAngle = groupNode && isGroup(groupNode) ? Number(groupNode.angle ?? 0) : 0;
11360
- const groupAbs = groupNode && isGroup(groupNode) ? getAbsoluteBounds(groupNode, pageChildren2) : null;
11454
+ const groupFrame = groupNode && isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2, pageBoundsOptions) : null;
11455
+ const groupAngle = groupFrame ? groupFrame.angle : 0;
11361
11456
  if (Number.isFinite(groupAngle)) {
11362
11457
  selection.set({ angle: groupAngle, scaleX: 1, scaleY: 1, skewX: 0, skewY: 0 });
11363
- if (groupAbs) {
11458
+ if (groupFrame) {
11364
11459
  selection.setPositionByOrigin(
11365
- new fabric.Point(groupAbs.left + groupAbs.width / 2, groupAbs.top + groupAbs.height / 2),
11460
+ new fabric.Point(groupFrame.centerX, groupFrame.centerY),
11366
11461
  "center",
11367
11462
  "center"
11368
11463
  );
@@ -12335,7 +12430,6 @@ const PageCanvas = forwardRef(
12335
12430
  fabricCanvas.__fontCleanup = fontCleanup;
12336
12431
  fabricCanvas.__isUserTransforming = false;
12337
12432
  fabricCanvas.on("mouse:down", () => {
12338
- groupSelectionTransformStartRef.current = null;
12339
12433
  activeSelectionMoveStartRef.current = null;
12340
12434
  activeSelectionResizeHandleRef.current = null;
12341
12435
  const active = fabricCanvas.getActiveObject();
@@ -12848,7 +12942,8 @@ const PageCanvas = forwardRef(
12848
12942
  const pageChildren2 = ((_b2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
12849
12943
  const groupNode = findNodeById(pageChildren2, groupId);
12850
12944
  if (!groupNode) return;
12851
- const groupAbs = getAbsoluteBounds(groupNode, pageChildren2);
12945
+ const groupFrame = isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2) : null;
12946
+ const groupAbs = groupFrame ?? getAbsoluteBounds(groupNode, pageChildren2);
12852
12947
  const rect = active.getBoundingRect();
12853
12948
  const center = active.getCenterPoint();
12854
12949
  groupSelectionTransformStartRef.current = {
@@ -12862,7 +12957,7 @@ const PageCanvas = forwardRef(
12862
12957
  groupTop: groupAbs.top,
12863
12958
  groupWidth: groupAbs.width,
12864
12959
  groupHeight: groupAbs.height,
12865
- selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
12960
+ selectionAngle: (((groupFrame == null ? void 0 : groupFrame.angle) ?? active.angle ?? 0) % 360 + 360) % 360
12866
12961
  };
12867
12962
  };
12868
12963
  const restoreGroupSelectionVisualState = (selection, groupId) => {
@@ -14832,7 +14927,14 @@ const PageCanvas = forwardRef(
14832
14927
  const node = findNodeById(pageChildren2, id);
14833
14928
  return !!(node && isGroup(node));
14834
14929
  });
14835
- const activeSelectionHadTransform = activeObj instanceof fabric.ActiveSelection && (Math.abs((activeObj.scaleX ?? 1) - 1) > 0.01 || Math.abs((activeObj.scaleY ?? 1) - 1) > 0.01 || Math.abs((activeObj.angle ?? 0) % 360) > 0.01);
14930
+ const activeSelectionHadTransform = activeObj instanceof fabric.ActiveSelection && (Math.abs((activeObj.scaleX ?? 1) - 1) > 0.01 || Math.abs((activeObj.scaleY ?? 1) - 1) > 0.01 || (() => {
14931
+ var _a3;
14932
+ const normAngle = (angle) => (angle % 360 + 360) % 360;
14933
+ const startAngle = ((_a3 = groupSelectionTransformStartRef.current) == null ? void 0 : _a3.selection) === activeObj ? groupSelectionTransformStartRef.current.selectionAngle : 0;
14934
+ const currentAngle = normAngle(activeObj.angle ?? 0);
14935
+ const diff = Math.abs(currentAngle - normAngle(startAngle));
14936
+ return Math.min(diff, 360 - diff) > 1;
14937
+ })());
14836
14938
  if (!anyCropGroup && activeSelectionDelta && !activeSelectionHadTransform && selectedLogicalGroupIds.length > 0) {
14837
14939
  const selectedStoreIds = useEditorStore.getState().canvas.selectedIds ?? [];
14838
14940
  const groupMemberIds = /* @__PURE__ */ new Set();
@@ -14947,7 +15049,7 @@ const PageCanvas = forwardRef(
14947
15049
  const storedGroupAngle = normalizeAngle(Number(groupToMove.angle ?? 0));
14948
15050
  const effectiveStartAngle = transformStart ? startSelAngle : storedGroupAngle;
14949
15051
  const angleDelta = shortestAngleDelta(currentSelAngle, effectiveStartAngle);
14950
- const hadRotation = isActiveSelection && activeObj && angleDelta > 0.01;
15052
+ const hadRotation = isActiveSelection && activeObj && angleDelta > 1;
14951
15053
  if (activeGroupSelectionId === groupToMove.id && hadRotation && !hadScale && !activeSelectionResizeHandle && activeObj instanceof fabric.ActiveSelection) {
14952
15054
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14953
15055
  const center = activeObj.getCenterPoint();
@@ -15034,7 +15136,7 @@ const PageCanvas = forwardRef(
15034
15136
  const logicalGroupSelectionId = activeObj instanceof fabric.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
15035
15137
  const isLogicalGroupAS = !!logicalGroupSelectionId && !(activeObj == null ? void 0 : activeObj.__cropGroup) && !(activeObj == null ? void 0 : activeObj.__docuforgeSectionGroup);
15036
15138
  const logicalGroupNodeForBake = logicalGroupSelectionId ? findNodeById(pageChildren2, logicalGroupSelectionId) : null;
15037
- const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number((logicalGroupNodeForBake == null ? void 0 : logicalGroupNodeForBake.angle) ?? activeObj.angle ?? 0)) : 0;
15139
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number(activeObj.angle ?? 0)) : 0;
15038
15140
  const logicalGroupFinalFrame = (() => {
15039
15141
  var _a3;
15040
15142
  if (!isLogicalGroupAS || !logicalGroupSelectionId || !(activeObj instanceof fabric.ActiveSelection)) return null;
@@ -15042,10 +15144,11 @@ const PageCanvas = forwardRef(
15042
15144
  const localWidth = Math.max(1, (activeObj.width ?? (baseline == null ? void 0 : baseline.groupWidth) ?? 1) * Math.abs(activeObj.scaleX ?? 1));
15043
15145
  const localHeight = Math.max(1, (activeObj.height ?? (baseline == null ? void 0 : baseline.groupHeight) ?? 1) * Math.abs(activeObj.scaleY ?? 1));
15044
15146
  const center = activeObj.getCenterPoint();
15147
+ const topLeft = centerToRotatedTopLeft(center.x, center.y, localWidth, localHeight, asAngleForBake);
15045
15148
  return {
15046
15149
  groupId: logicalGroupSelectionId,
15047
- left: center.x - localWidth / 2,
15048
- top: center.y - localHeight / 2,
15150
+ left: topLeft.left,
15151
+ top: topLeft.top,
15049
15152
  width: localWidth,
15050
15153
  height: localHeight,
15051
15154
  centerX: center.x,
@@ -15107,16 +15210,15 @@ const PageCanvas = forwardRef(
15107
15210
  modifiedIdsThisRound.add(objId);
15108
15211
  let absoluteLeft;
15109
15212
  let absoluteTop;
15110
- if (isActiveSelection && activeObj) {
15111
- const selectionMatrix = activeObj.calcTransformMatrix();
15112
- const relativePoint = { x: obj.left ?? 0, y: obj.top ?? 0 };
15113
- const absolutePoint = fabric.util.transformPoint(relativePoint, selectionMatrix);
15114
- absoluteLeft = absolutePoint.x;
15115
- absoluteTop = absolutePoint.y;
15116
- } else {
15117
- absoluteLeft = obj.left ?? 0;
15118
- absoluteTop = obj.top ?? 0;
15119
- }
15213
+ const initialTopLeft = centerToRotatedTopLeft(
15214
+ decomposed.translateX ?? (obj.left ?? 0),
15215
+ decomposed.translateY ?? (obj.top ?? 0),
15216
+ intrinsicWidth * Math.abs(decomposed.scaleX || 1),
15217
+ intrinsicHeight * Math.abs(decomposed.scaleY || 1),
15218
+ decomposed.angle ?? 0
15219
+ );
15220
+ absoluteLeft = initialTopLeft.left;
15221
+ absoluteTop = initialTopLeft.top;
15120
15222
  if (obj instanceof fabric.Group && obj.__cropGroup) {
15121
15223
  const ct = obj.__cropData;
15122
15224
  if (isActiveSelection && activeObj instanceof fabric.ActiveSelection) {
@@ -16200,7 +16302,7 @@ const PageCanvas = forwardRef(
16200
16302
  const nextHeight = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.height) || 50);
16201
16303
  const storePosImg = pageChildren ? (() => {
16202
16304
  const node = findNodeById(pageChildren, element.id);
16203
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16305
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16204
16306
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16205
16307
  const elementForPlaceholder = { ...element, width: nextWidth, height: nextHeight };
16206
16308
  const placeholder = isCropGroup2 ? createImagePlaceholderForGroup(elementForPlaceholder) : createImagePlaceholder(elementForPlaceholder);
@@ -16263,14 +16365,14 @@ const PageCanvas = forwardRef(
16263
16365
  }
16264
16366
  const cropPos = pageChildren ? (() => {
16265
16367
  const node = findNodeById(pageChildren, element.id);
16266
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16267
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16268
- const cropCenter = rotatedTopLeftToCenter(cropPos.left, cropPos.top, ct.frameW ?? 0, ct.frameH ?? 0, element.angle ?? 0);
16368
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16369
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16370
+ const cropCenter = rotatedTopLeftToCenter(cropPos.left, cropPos.top, ct.frameW ?? 0, ct.frameH ?? 0, cropPos.angle ?? element.angle ?? 0);
16269
16371
  const cropCenterX = cropCenter.x;
16270
16372
  const cropCenterY = cropCenter.y;
16271
16373
  if (element.left !== void 0) existingObj.set({ left: cropCenterX });
16272
16374
  if (element.top !== void 0) existingObj.set({ top: cropCenterY });
16273
- if (element.angle !== void 0) existingObj.set({ angle: element.angle });
16375
+ existingObj.set({ angle: cropPos.angle ?? element.angle ?? 0 });
16274
16376
  existingObj.set({
16275
16377
  flipX: element.flipX ?? false,
16276
16378
  flipY: element.flipY ?? false
@@ -16393,8 +16495,8 @@ const PageCanvas = forwardRef(
16393
16495
  if (isPlaceholderGroup) {
16394
16496
  const storePosImg = pageChildren ? (() => {
16395
16497
  const node = findNodeById(pageChildren, element.id);
16396
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16397
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16498
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16499
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16398
16500
  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 };
16399
16501
  const hasExplicitSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
16400
16502
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
@@ -16408,7 +16510,7 @@ const PageCanvas = forwardRef(
16408
16510
  top: storePosImg.top + nextHeight / 2,
16409
16511
  originX: "center",
16410
16512
  originY: "center",
16411
- angle: element.angle ?? 0,
16513
+ angle: storePosImg.angle ?? element.angle ?? 0,
16412
16514
  opacity: isHidden ? 0 : element.opacity ?? 1,
16413
16515
  flipX: element.flipX ?? false,
16414
16516
  flipY: element.flipY ?? false,
@@ -16457,8 +16559,8 @@ const PageCanvas = forwardRef(
16457
16559
  const visibilityChanged = previousVisible !== currentVisible;
16458
16560
  const storePosForImg = pageChildren ? (() => {
16459
16561
  const node = findNodeById(pageChildren, element.id);
16460
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16461
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16562
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16563
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16462
16564
  const positionChanged = Math.abs((existingObj.left ?? 0) - storePosForImg.left) > 0.1 || Math.abs((existingObj.top ?? 0) - storePosForImg.top) > 0.1;
16463
16565
  if (visibilityChanged && !positionChanged || visibilityUpdateInProgressRef.current) {
16464
16566
  const isDynamicField = dynamicFieldIds.includes(element.id);
@@ -16500,7 +16602,7 @@ const PageCanvas = forwardRef(
16500
16602
  const fabricTop = existingObj.top ?? 0;
16501
16603
  const storePos = pageChildren ? (() => {
16502
16604
  const node = findNodeById(pageChildren, element.id);
16503
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16605
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16504
16606
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16505
16607
  const storeLeft = storePos.left;
16506
16608
  const storeTop = storePos.top;
@@ -16627,7 +16729,7 @@ const PageCanvas = forwardRef(
16627
16729
  setObjectData(placeholder, element.id);
16628
16730
  const absPosImg = pageTree.length > 0 ? (() => {
16629
16731
  const node = findNodeById(pageTree, element.id);
16630
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16732
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16631
16733
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16632
16734
  const placeholderWidth = Number((placeholder.width ?? 0) * (placeholder.scaleX ?? 1));
16633
16735
  const placeholderHeight = Number((placeholder.height ?? 0) * (placeholder.scaleY ?? 1));
@@ -16676,7 +16778,7 @@ const PageCanvas = forwardRef(
16676
16778
  if (obj) {
16677
16779
  const absPos = pageTree.length > 0 ? (() => {
16678
16780
  const node = findNodeById(pageTree, element.id);
16679
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16781
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16680
16782
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16681
16783
  obj.set({ left: absPos.left, top: absPos.top });
16682
16784
  obj.setCoords();
@@ -17164,8 +17266,8 @@ const PageCanvas = forwardRef(
17164
17266
  const currentPageTree = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
17165
17267
  const fabricPos = currentPageTree.length > 0 ? (() => {
17166
17268
  const node = findNodeById(currentPageTree, element.id);
17167
- return node ? getAbsoluteBounds(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
17168
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
17269
+ return node && isElement(node) ? getElementFabricPlacement(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17270
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17169
17271
  const resolvedSize = currentPageTree.length > 0 ? getNodeBounds(element, currentPageTree) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
17170
17272
  const shouldPreserveSmallSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
17171
17273
  const minVisible = shouldPreserveSmallSize ? 1 : 20;
@@ -18234,14 +18336,14 @@ const PageCanvas = forwardRef(
18234
18336
  const pageTreeForCreate = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
18235
18337
  const createPos = pageTreeForCreate.length > 0 ? (() => {
18236
18338
  const node = findNodeById(pageTreeForCreate, element.id);
18237
- return node ? getAbsoluteBounds(node, pageTreeForCreate) : { left: element.left ?? 0, top: element.top ?? 0 };
18238
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
18339
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCreate, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18340
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18239
18341
  img.set({
18240
18342
  left: createPos.left,
18241
18343
  top: createPos.top,
18242
18344
  scaleX: finalScaleX,
18243
18345
  scaleY: finalScaleY,
18244
- angle: element.angle ?? 0,
18346
+ angle: createPos.angle ?? element.angle ?? 0,
18245
18347
  skewX: element.skewX ?? 0,
18246
18348
  skewY: element.skewY ?? 0,
18247
18349
  flipX: element.flipX ?? false,
@@ -18328,8 +18430,8 @@ const PageCanvas = forwardRef(
18328
18430
  const pageTreeForCrop = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_n = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _n.children) ?? [];
18329
18431
  const createPosForCrop = pageTreeForCrop.length > 0 ? (() => {
18330
18432
  const node = findNodeById(pageTreeForCrop, element.id);
18331
- return node ? getAbsoluteBounds(node, pageTreeForCrop) : { left: element.left ?? 0, top: element.top ?? 0 };
18332
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
18433
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCrop, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18434
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18333
18435
  const nodeForCreate = pageTreeForCrop.length ? findNodeById(pageTreeForCrop, element.id) : null;
18334
18436
  const createW = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.width : elementWidth;
18335
18437
  const createH = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.height : elementHeight;
@@ -18337,8 +18439,9 @@ const PageCanvas = forwardRef(
18337
18439
  const createSy = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.scaleY ?? 1 : element.scaleY ?? 1;
18338
18440
  const frameW = Math.max(1, Number(createW) || 200) * createSx;
18339
18441
  const frameH = Math.max(1, Number(createH) || 50) * createSy;
18340
- const createCenterX = createPosForCrop.left + frameW / 2;
18341
- const createCenterY = createPosForCrop.top + frameH / 2;
18442
+ const createCenter = rotatedTopLeftToCenter(createPosForCrop.left, createPosForCrop.top, frameW, frameH, createPosForCrop.angle ?? element.angle ?? 0);
18443
+ const createCenterX = createCenter.x;
18444
+ const createCenterY = createCenter.y;
18342
18445
  const cropGroup = await createMaskedImageElement({
18343
18446
  image: img,
18344
18447
  frameW,
@@ -18351,7 +18454,7 @@ const PageCanvas = forwardRef(
18351
18454
  strokeWidth: 0,
18352
18455
  left: createCenterX,
18353
18456
  top: createCenterY,
18354
- angle: element.angle ?? 0,
18457
+ angle: createPosForCrop.angle ?? element.angle ?? 0,
18355
18458
  opacity: isHidden ? 0 : element.opacity ?? 1,
18356
18459
  selectable: allowSelection && !isHidden,
18357
18460
  evented: canBeEvented && !isHidden,
@@ -24741,9 +24844,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24741
24844
  }
24742
24845
  return svgString;
24743
24846
  }
24744
- const resolvedPackageVersion = "0.5.348";
24847
+ const resolvedPackageVersion = "0.5.350";
24745
24848
  const PACKAGE_VERSION = resolvedPackageVersion;
24746
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.348";
24849
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.350";
24747
24850
  const roundParityValue = (value) => {
24748
24851
  if (typeof value !== "number") return value;
24749
24852
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25557,7 +25660,7 @@ class PixldocsRenderer {
25557
25660
  await this.waitForCanvasScene(container, cloned, i);
25558
25661
  }
25559
25662
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25560
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-CXxYlE0-.js");
25663
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-Do4oLw96.js");
25561
25664
  const prepared = preparePagesForExport(
25562
25665
  cloned.pages,
25563
25666
  canvasWidth,
@@ -27877,7 +27980,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27877
27980
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27878
27981
  sanitizeSvgTreeForPdf(svgToDraw);
27879
27982
  try {
27880
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-CXxYlE0-.js");
27983
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-Do4oLw96.js");
27881
27984
  try {
27882
27985
  await logTextMeasurementDiagnostic(svgToDraw);
27883
27986
  } catch {
@@ -28277,4 +28380,4 @@ export {
28277
28380
  buildTeaserBlurFlatKeys as y,
28278
28381
  collectFontDescriptorsFromConfig as z
28279
28382
  };
28280
- //# sourceMappingURL=index-BbbkWYa_.js.map
28383
+ //# sourceMappingURL=index-kSwmRnZP.js.map