@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.
@@ -10518,6 +10518,102 @@ function bakeEdgeFade(source, fade) {
10518
10518
  }
10519
10519
  return canvas;
10520
10520
  }
10521
+ const normalizeSignedAngle = (angle) => (angle % 360 + 540) % 360 - 180;
10522
+ const rotatedTopLeftToCenter = (left, top, width, height, angleDeg = 0) => {
10523
+ const angle = angleDeg * Math.PI / 180;
10524
+ const cos = Math.cos(angle);
10525
+ const sin = Math.sin(angle);
10526
+ return {
10527
+ x: left + width / 2 * cos - height / 2 * sin,
10528
+ y: top + width / 2 * sin + height / 2 * cos
10529
+ };
10530
+ };
10531
+ const centerToRotatedTopLeft = (centerX, centerY, width, height, angleDeg = 0) => {
10532
+ const angle = angleDeg * Math.PI / 180;
10533
+ const cos = Math.cos(angle);
10534
+ const sin = Math.sin(angle);
10535
+ return {
10536
+ left: centerX - width / 2 * cos + height / 2 * sin,
10537
+ top: centerY - width / 2 * sin - height / 2 * cos
10538
+ };
10539
+ };
10540
+ const getGroupTransformFrame = (group, pageChildren, options) => {
10541
+ const bounds = getNodeBounds(group, pageChildren);
10542
+ const width = Math.max(1, Number(group.width ?? bounds.width) || bounds.width || 1);
10543
+ const height = Math.max(1, Number(group.height ?? bounds.height) || bounds.height || 1);
10544
+ return {
10545
+ left: Number(group.left ?? bounds.left ?? 0) || 0,
10546
+ top: Number(group.top ?? bounds.top ?? 0) || 0,
10547
+ width,
10548
+ height,
10549
+ angle: Number(group.angle ?? 0) || 0
10550
+ };
10551
+ };
10552
+ const getGroupLocalToParentMatrix = (group, pageChildren, options) => {
10553
+ const frame = getGroupTransformFrame(group, pageChildren);
10554
+ const rad = frame.angle * Math.PI / 180;
10555
+ const cos = Math.cos(rad);
10556
+ const sin = Math.sin(rad);
10557
+ return [
10558
+ cos,
10559
+ sin,
10560
+ -sin,
10561
+ cos,
10562
+ frame.left,
10563
+ frame.top
10564
+ ];
10565
+ };
10566
+ const getAncestorGroupTransform = (nodeId, pageChildren, fabric2, options) => {
10567
+ let matrix = [1, 0, 0, 1, 0, 0];
10568
+ let angle = 0;
10569
+ const chain = [];
10570
+ let currentId = nodeId;
10571
+ for (let guard = 0; guard < 32; guard++) {
10572
+ const parent = findParentGroup(pageChildren, currentId);
10573
+ if (!parent) break;
10574
+ chain.unshift(parent);
10575
+ currentId = parent.id;
10576
+ }
10577
+ for (const group of chain) {
10578
+ matrix = fabric2.util.multiplyTransformMatrices(
10579
+ matrix,
10580
+ getGroupLocalToParentMatrix(group, pageChildren)
10581
+ );
10582
+ angle += Number(group.angle ?? 0) || 0;
10583
+ }
10584
+ return { matrix, angle: normalizeSignedAngle(angle) };
10585
+ };
10586
+ const getElementFabricPlacement$1 = (element, pageChildren, fabric2, options) => {
10587
+ if (!pageChildren.length) {
10588
+ return { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
10589
+ }
10590
+ const ancestor = getAncestorGroupTransform(element.id, pageChildren, fabric2);
10591
+ const point = fabric2.util.transformPoint(
10592
+ new fabric2.Point(element.left ?? 0, element.top ?? 0),
10593
+ ancestor.matrix
10594
+ );
10595
+ return {
10596
+ left: point.x,
10597
+ top: point.y,
10598
+ angle: normalizeSignedAngle(ancestor.angle + Number(element.angle ?? 0))
10599
+ };
10600
+ };
10601
+ const getGroupAbsoluteTransformFrame$1 = (group, pageChildren, fabric2, options) => {
10602
+ const frame = getGroupTransformFrame(group, pageChildren);
10603
+ const ancestor = getAncestorGroupTransform(group.id, pageChildren, fabric2);
10604
+ const centerLocal = rotatedTopLeftToCenter(frame.left, frame.top, frame.width, frame.height, frame.angle);
10605
+ const center = fabric2.util.transformPoint(new fabric2.Point(centerLocal.x, centerLocal.y), ancestor.matrix);
10606
+ const topLeft = fabric2.util.transformPoint(new fabric2.Point(frame.left, frame.top), ancestor.matrix);
10607
+ return {
10608
+ left: topLeft.x,
10609
+ top: topLeft.y,
10610
+ width: frame.width,
10611
+ height: frame.height,
10612
+ centerX: center.x,
10613
+ centerY: center.y,
10614
+ angle: normalizeSignedAngle(ancestor.angle + frame.angle)
10615
+ };
10616
+ };
10521
10617
  const SELECTION_PRIMARY = "hsl(217, 91%, 60%)";
10522
10618
  const SELECTION_BORDER_SCALE = 2;
10523
10619
  let ensureCanvaControlRenders = () => {
@@ -10971,12 +11067,18 @@ try {
10971
11067
  } catch (e) {
10972
11068
  }
10973
11069
  };
10974
- const origObj = cu.createObjectDefaultControls.bind(cu);
10975
- cu.createObjectDefaultControls = () => installPillRenders(origObj());
10976
- if (typeof cu.createTextboxDefaultControls === "function") {
10977
- const origTb = cu.createTextboxDefaultControls.bind(cu);
10978
- cu.createTextboxDefaultControls = () => installPillRenders(origTb());
10979
- }
11070
+ const wrapControlsFactory = (key) => {
11071
+ if (typeof cu[key] !== "function") return;
11072
+ const descriptor = Object.getOwnPropertyDescriptor(cu, key);
11073
+ if (descriptor && descriptor.writable === false && !descriptor.set) return;
11074
+ const original = cu[key].bind(cu);
11075
+ try {
11076
+ cu[key] = () => installPillRenders(original());
11077
+ } catch {
11078
+ }
11079
+ };
11080
+ wrapControlsFactory("createObjectDefaultControls");
11081
+ wrapControlsFactory("createTextboxDefaultControls");
10980
11082
  const wrapClassCreateControls = (Klass) => {
10981
11083
  if (!Klass || typeof Klass.createControls !== "function") return;
10982
11084
  const orig = Klass.createControls.bind(Klass);
@@ -11217,15 +11319,8 @@ const bakeTextboxScaleIntoTypography = (obj, sourceElement) => {
11217
11319
  };
11218
11320
  return updates;
11219
11321
  };
11220
- const rotatedTopLeftToCenter = (left, top, width, height, angleDeg = 0) => {
11221
- const angle = angleDeg * Math.PI / 180;
11222
- const cos = Math.cos(angle);
11223
- const sin = Math.sin(angle);
11224
- return {
11225
- x: left + width / 2 * cos - height / 2 * sin,
11226
- y: top + width / 2 * sin + height / 2 * cos
11227
- };
11228
- };
11322
+ const getElementFabricPlacement = (element, pageChildren, options) => getElementFabricPlacement$1(element, pageChildren, fabric__namespace);
11323
+ const getGroupAbsoluteTransformFrame = (group, pageChildren, options) => getGroupAbsoluteTransformFrame$1(group, pageChildren, fabric__namespace);
11229
11324
  function applyWarpAwareSelectionBorders(selection) {
11230
11325
  var _a2;
11231
11326
  if (selection.__pixldocsOrigASHasBorders !== void 0) {
@@ -11374,13 +11469,13 @@ const PageCanvas = react.forwardRef(
11374
11469
  ));
11375
11470
  const pageChildren2 = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
11376
11471
  const groupNode = findNodeById(pageChildren2, groupId);
11377
- const groupAngle = groupNode && isGroup(groupNode) ? Number(groupNode.angle ?? 0) : 0;
11378
- const groupAbs = groupNode && isGroup(groupNode) ? getAbsoluteBounds(groupNode, pageChildren2) : null;
11472
+ const groupFrame = groupNode && isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2, pageBoundsOptions) : null;
11473
+ const groupAngle = groupFrame ? groupFrame.angle : 0;
11379
11474
  if (Number.isFinite(groupAngle)) {
11380
11475
  selection.set({ angle: groupAngle, scaleX: 1, scaleY: 1, skewX: 0, skewY: 0 });
11381
- if (groupAbs) {
11476
+ if (groupFrame) {
11382
11477
  selection.setPositionByOrigin(
11383
- new fabric__namespace.Point(groupAbs.left + groupAbs.width / 2, groupAbs.top + groupAbs.height / 2),
11478
+ new fabric__namespace.Point(groupFrame.centerX, groupFrame.centerY),
11384
11479
  "center",
11385
11480
  "center"
11386
11481
  );
@@ -12353,7 +12448,6 @@ const PageCanvas = react.forwardRef(
12353
12448
  fabricCanvas.__fontCleanup = fontCleanup;
12354
12449
  fabricCanvas.__isUserTransforming = false;
12355
12450
  fabricCanvas.on("mouse:down", () => {
12356
- groupSelectionTransformStartRef.current = null;
12357
12451
  activeSelectionMoveStartRef.current = null;
12358
12452
  activeSelectionResizeHandleRef.current = null;
12359
12453
  const active = fabricCanvas.getActiveObject();
@@ -12866,7 +12960,8 @@ const PageCanvas = react.forwardRef(
12866
12960
  const pageChildren2 = ((_b2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
12867
12961
  const groupNode = findNodeById(pageChildren2, groupId);
12868
12962
  if (!groupNode) return;
12869
- const groupAbs = getAbsoluteBounds(groupNode, pageChildren2);
12963
+ const groupFrame = isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2) : null;
12964
+ const groupAbs = groupFrame ?? getAbsoluteBounds(groupNode, pageChildren2);
12870
12965
  const rect = active.getBoundingRect();
12871
12966
  const center = active.getCenterPoint();
12872
12967
  groupSelectionTransformStartRef.current = {
@@ -12880,7 +12975,7 @@ const PageCanvas = react.forwardRef(
12880
12975
  groupTop: groupAbs.top,
12881
12976
  groupWidth: groupAbs.width,
12882
12977
  groupHeight: groupAbs.height,
12883
- selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
12978
+ selectionAngle: (((groupFrame == null ? void 0 : groupFrame.angle) ?? active.angle ?? 0) % 360 + 360) % 360
12884
12979
  };
12885
12980
  };
12886
12981
  const restoreGroupSelectionVisualState = (selection, groupId) => {
@@ -14850,7 +14945,14 @@ const PageCanvas = react.forwardRef(
14850
14945
  const node = findNodeById(pageChildren2, id);
14851
14946
  return !!(node && isGroup(node));
14852
14947
  });
14853
- const activeSelectionHadTransform = activeObj instanceof fabric__namespace.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);
14948
+ const activeSelectionHadTransform = activeObj instanceof fabric__namespace.ActiveSelection && (Math.abs((activeObj.scaleX ?? 1) - 1) > 0.01 || Math.abs((activeObj.scaleY ?? 1) - 1) > 0.01 || (() => {
14949
+ var _a3;
14950
+ const normAngle = (angle) => (angle % 360 + 360) % 360;
14951
+ const startAngle = ((_a3 = groupSelectionTransformStartRef.current) == null ? void 0 : _a3.selection) === activeObj ? groupSelectionTransformStartRef.current.selectionAngle : 0;
14952
+ const currentAngle = normAngle(activeObj.angle ?? 0);
14953
+ const diff = Math.abs(currentAngle - normAngle(startAngle));
14954
+ return Math.min(diff, 360 - diff) > 1;
14955
+ })());
14854
14956
  if (!anyCropGroup && activeSelectionDelta && !activeSelectionHadTransform && selectedLogicalGroupIds.length > 0) {
14855
14957
  const selectedStoreIds = useEditorStore.getState().canvas.selectedIds ?? [];
14856
14958
  const groupMemberIds = /* @__PURE__ */ new Set();
@@ -14965,7 +15067,7 @@ const PageCanvas = react.forwardRef(
14965
15067
  const storedGroupAngle = normalizeAngle(Number(groupToMove.angle ?? 0));
14966
15068
  const effectiveStartAngle = transformStart ? startSelAngle : storedGroupAngle;
14967
15069
  const angleDelta = shortestAngleDelta(currentSelAngle, effectiveStartAngle);
14968
- const hadRotation = isActiveSelection && activeObj && angleDelta > 0.01;
15070
+ const hadRotation = isActiveSelection && activeObj && angleDelta > 1;
14969
15071
  if (activeGroupSelectionId === groupToMove.id && hadRotation && !hadScale && !activeSelectionResizeHandle && activeObj instanceof fabric__namespace.ActiveSelection) {
14970
15072
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14971
15073
  const center = activeObj.getCenterPoint();
@@ -15052,7 +15154,7 @@ const PageCanvas = react.forwardRef(
15052
15154
  const logicalGroupSelectionId = activeObj instanceof fabric__namespace.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
15053
15155
  const isLogicalGroupAS = !!logicalGroupSelectionId && !(activeObj == null ? void 0 : activeObj.__cropGroup) && !(activeObj == null ? void 0 : activeObj.__docuforgeSectionGroup);
15054
15156
  const logicalGroupNodeForBake = logicalGroupSelectionId ? findNodeById(pageChildren2, logicalGroupSelectionId) : null;
15055
- const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number((logicalGroupNodeForBake == null ? void 0 : logicalGroupNodeForBake.angle) ?? activeObj.angle ?? 0)) : 0;
15157
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number(activeObj.angle ?? 0)) : 0;
15056
15158
  const logicalGroupFinalFrame = (() => {
15057
15159
  var _a3;
15058
15160
  if (!isLogicalGroupAS || !logicalGroupSelectionId || !(activeObj instanceof fabric__namespace.ActiveSelection)) return null;
@@ -15060,10 +15162,11 @@ const PageCanvas = react.forwardRef(
15060
15162
  const localWidth = Math.max(1, (activeObj.width ?? (baseline == null ? void 0 : baseline.groupWidth) ?? 1) * Math.abs(activeObj.scaleX ?? 1));
15061
15163
  const localHeight = Math.max(1, (activeObj.height ?? (baseline == null ? void 0 : baseline.groupHeight) ?? 1) * Math.abs(activeObj.scaleY ?? 1));
15062
15164
  const center = activeObj.getCenterPoint();
15165
+ const topLeft = centerToRotatedTopLeft(center.x, center.y, localWidth, localHeight, asAngleForBake);
15063
15166
  return {
15064
15167
  groupId: logicalGroupSelectionId,
15065
- left: center.x - localWidth / 2,
15066
- top: center.y - localHeight / 2,
15168
+ left: topLeft.left,
15169
+ top: topLeft.top,
15067
15170
  width: localWidth,
15068
15171
  height: localHeight,
15069
15172
  centerX: center.x,
@@ -15125,16 +15228,15 @@ const PageCanvas = react.forwardRef(
15125
15228
  modifiedIdsThisRound.add(objId);
15126
15229
  let absoluteLeft;
15127
15230
  let absoluteTop;
15128
- if (isActiveSelection && activeObj) {
15129
- const selectionMatrix = activeObj.calcTransformMatrix();
15130
- const relativePoint = { x: obj.left ?? 0, y: obj.top ?? 0 };
15131
- const absolutePoint = fabric__namespace.util.transformPoint(relativePoint, selectionMatrix);
15132
- absoluteLeft = absolutePoint.x;
15133
- absoluteTop = absolutePoint.y;
15134
- } else {
15135
- absoluteLeft = obj.left ?? 0;
15136
- absoluteTop = obj.top ?? 0;
15137
- }
15231
+ const initialTopLeft = centerToRotatedTopLeft(
15232
+ decomposed.translateX ?? (obj.left ?? 0),
15233
+ decomposed.translateY ?? (obj.top ?? 0),
15234
+ intrinsicWidth * Math.abs(decomposed.scaleX || 1),
15235
+ intrinsicHeight * Math.abs(decomposed.scaleY || 1),
15236
+ decomposed.angle ?? 0
15237
+ );
15238
+ absoluteLeft = initialTopLeft.left;
15239
+ absoluteTop = initialTopLeft.top;
15138
15240
  if (obj instanceof fabric__namespace.Group && obj.__cropGroup) {
15139
15241
  const ct = obj.__cropData;
15140
15242
  if (isActiveSelection && activeObj instanceof fabric__namespace.ActiveSelection) {
@@ -16218,7 +16320,7 @@ const PageCanvas = react.forwardRef(
16218
16320
  const nextHeight = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.height) || 50);
16219
16321
  const storePosImg = pageChildren ? (() => {
16220
16322
  const node = findNodeById(pageChildren, element.id);
16221
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16323
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16222
16324
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16223
16325
  const elementForPlaceholder = { ...element, width: nextWidth, height: nextHeight };
16224
16326
  const placeholder = isCropGroup2 ? createImagePlaceholderForGroup(elementForPlaceholder) : createImagePlaceholder(elementForPlaceholder);
@@ -16281,14 +16383,14 @@ const PageCanvas = react.forwardRef(
16281
16383
  }
16282
16384
  const cropPos = pageChildren ? (() => {
16283
16385
  const node = findNodeById(pageChildren, element.id);
16284
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16285
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16286
- const cropCenter = rotatedTopLeftToCenter(cropPos.left, cropPos.top, ct.frameW ?? 0, ct.frameH ?? 0, element.angle ?? 0);
16386
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16387
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16388
+ const cropCenter = rotatedTopLeftToCenter(cropPos.left, cropPos.top, ct.frameW ?? 0, ct.frameH ?? 0, cropPos.angle ?? element.angle ?? 0);
16287
16389
  const cropCenterX = cropCenter.x;
16288
16390
  const cropCenterY = cropCenter.y;
16289
16391
  if (element.left !== void 0) existingObj.set({ left: cropCenterX });
16290
16392
  if (element.top !== void 0) existingObj.set({ top: cropCenterY });
16291
- if (element.angle !== void 0) existingObj.set({ angle: element.angle });
16393
+ existingObj.set({ angle: cropPos.angle ?? element.angle ?? 0 });
16292
16394
  existingObj.set({
16293
16395
  flipX: element.flipX ?? false,
16294
16396
  flipY: element.flipY ?? false
@@ -16411,8 +16513,8 @@ const PageCanvas = react.forwardRef(
16411
16513
  if (isPlaceholderGroup) {
16412
16514
  const storePosImg = pageChildren ? (() => {
16413
16515
  const node = findNodeById(pageChildren, element.id);
16414
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16415
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16516
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16517
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16416
16518
  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 };
16417
16519
  const hasExplicitSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
16418
16520
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
@@ -16426,7 +16528,7 @@ const PageCanvas = react.forwardRef(
16426
16528
  top: storePosImg.top + nextHeight / 2,
16427
16529
  originX: "center",
16428
16530
  originY: "center",
16429
- angle: element.angle ?? 0,
16531
+ angle: storePosImg.angle ?? element.angle ?? 0,
16430
16532
  opacity: isHidden ? 0 : element.opacity ?? 1,
16431
16533
  flipX: element.flipX ?? false,
16432
16534
  flipY: element.flipY ?? false,
@@ -16475,8 +16577,8 @@ const PageCanvas = react.forwardRef(
16475
16577
  const visibilityChanged = previousVisible !== currentVisible;
16476
16578
  const storePosForImg = pageChildren ? (() => {
16477
16579
  const node = findNodeById(pageChildren, element.id);
16478
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16479
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
16580
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16581
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16480
16582
  const positionChanged = Math.abs((existingObj.left ?? 0) - storePosForImg.left) > 0.1 || Math.abs((existingObj.top ?? 0) - storePosForImg.top) > 0.1;
16481
16583
  if (visibilityChanged && !positionChanged || visibilityUpdateInProgressRef.current) {
16482
16584
  const isDynamicField = dynamicFieldIds.includes(element.id);
@@ -16518,7 +16620,7 @@ const PageCanvas = react.forwardRef(
16518
16620
  const fabricTop = existingObj.top ?? 0;
16519
16621
  const storePos = pageChildren ? (() => {
16520
16622
  const node = findNodeById(pageChildren, element.id);
16521
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16623
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16522
16624
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16523
16625
  const storeLeft = storePos.left;
16524
16626
  const storeTop = storePos.top;
@@ -16645,7 +16747,7 @@ const PageCanvas = react.forwardRef(
16645
16747
  setObjectData(placeholder, element.id);
16646
16748
  const absPosImg = pageTree.length > 0 ? (() => {
16647
16749
  const node = findNodeById(pageTree, element.id);
16648
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16750
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16649
16751
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16650
16752
  const placeholderWidth = Number((placeholder.width ?? 0) * (placeholder.scaleX ?? 1));
16651
16753
  const placeholderHeight = Number((placeholder.height ?? 0) * (placeholder.scaleY ?? 1));
@@ -16694,7 +16796,7 @@ const PageCanvas = react.forwardRef(
16694
16796
  if (obj) {
16695
16797
  const absPos = pageTree.length > 0 ? (() => {
16696
16798
  const node = findNodeById(pageTree, element.id);
16697
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16799
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16698
16800
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16699
16801
  obj.set({ left: absPos.left, top: absPos.top });
16700
16802
  obj.setCoords();
@@ -17182,8 +17284,8 @@ const PageCanvas = react.forwardRef(
17182
17284
  const currentPageTree = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
17183
17285
  const fabricPos = currentPageTree.length > 0 ? (() => {
17184
17286
  const node = findNodeById(currentPageTree, element.id);
17185
- return node ? getAbsoluteBounds(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
17186
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
17287
+ return node && isElement(node) ? getElementFabricPlacement(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17288
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17187
17289
  const resolvedSize = currentPageTree.length > 0 ? getNodeBounds(element, currentPageTree) : { width: typeof element.width === "number" ? element.width : 200, height: typeof element.height === "number" ? element.height : 50 };
17188
17290
  const shouldPreserveSmallSize = typeof element.width === "number" && Number.isFinite(element.width) && element.width > 0 && typeof element.height === "number" && Number.isFinite(element.height) && element.height > 0;
17189
17291
  const minVisible = shouldPreserveSmallSize ? 1 : 20;
@@ -18252,14 +18354,14 @@ const PageCanvas = react.forwardRef(
18252
18354
  const pageTreeForCreate = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
18253
18355
  const createPos = pageTreeForCreate.length > 0 ? (() => {
18254
18356
  const node = findNodeById(pageTreeForCreate, element.id);
18255
- return node ? getAbsoluteBounds(node, pageTreeForCreate) : { left: element.left ?? 0, top: element.top ?? 0 };
18256
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
18357
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCreate, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18358
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18257
18359
  img.set({
18258
18360
  left: createPos.left,
18259
18361
  top: createPos.top,
18260
18362
  scaleX: finalScaleX,
18261
18363
  scaleY: finalScaleY,
18262
- angle: element.angle ?? 0,
18364
+ angle: createPos.angle ?? element.angle ?? 0,
18263
18365
  skewX: element.skewX ?? 0,
18264
18366
  skewY: element.skewY ?? 0,
18265
18367
  flipX: element.flipX ?? false,
@@ -18346,8 +18448,8 @@ const PageCanvas = react.forwardRef(
18346
18448
  const pageTreeForCrop = ((pageChildren == null ? void 0 : pageChildren.length) ? pageChildren : (_n = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _n.children) ?? [];
18347
18449
  const createPosForCrop = pageTreeForCrop.length > 0 ? (() => {
18348
18450
  const node = findNodeById(pageTreeForCrop, element.id);
18349
- return node ? getAbsoluteBounds(node, pageTreeForCrop) : { left: element.left ?? 0, top: element.top ?? 0 };
18350
- })() : { left: element.left ?? 0, top: element.top ?? 0 };
18451
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCrop, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18452
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18351
18453
  const nodeForCreate = pageTreeForCrop.length ? findNodeById(pageTreeForCrop, element.id) : null;
18352
18454
  const createW = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.width : elementWidth;
18353
18455
  const createH = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.height : elementHeight;
@@ -18355,8 +18457,9 @@ const PageCanvas = react.forwardRef(
18355
18457
  const createSy = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.scaleY ?? 1 : element.scaleY ?? 1;
18356
18458
  const frameW = Math.max(1, Number(createW) || 200) * createSx;
18357
18459
  const frameH = Math.max(1, Number(createH) || 50) * createSy;
18358
- const createCenterX = createPosForCrop.left + frameW / 2;
18359
- const createCenterY = createPosForCrop.top + frameH / 2;
18460
+ const createCenter = rotatedTopLeftToCenter(createPosForCrop.left, createPosForCrop.top, frameW, frameH, createPosForCrop.angle ?? element.angle ?? 0);
18461
+ const createCenterX = createCenter.x;
18462
+ const createCenterY = createCenter.y;
18360
18463
  const cropGroup = await createMaskedImageElement({
18361
18464
  image: img,
18362
18465
  frameW,
@@ -18369,7 +18472,7 @@ const PageCanvas = react.forwardRef(
18369
18472
  strokeWidth: 0,
18370
18473
  left: createCenterX,
18371
18474
  top: createCenterY,
18372
- angle: element.angle ?? 0,
18475
+ angle: createPosForCrop.angle ?? element.angle ?? 0,
18373
18476
  opacity: isHidden ? 0 : element.opacity ?? 1,
18374
18477
  selectable: allowSelection && !isHidden,
18375
18478
  evented: canBeEvented && !isHidden,
@@ -24759,9 +24862,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24759
24862
  }
24760
24863
  return svgString;
24761
24864
  }
24762
- const resolvedPackageVersion = "0.5.348";
24865
+ const resolvedPackageVersion = "0.5.350";
24763
24866
  const PACKAGE_VERSION = resolvedPackageVersion;
24764
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.348";
24867
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.350";
24765
24868
  const roundParityValue = (value) => {
24766
24869
  if (typeof value !== "number") return value;
24767
24870
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25575,7 +25678,7 @@ class PixldocsRenderer {
25575
25678
  await this.waitForCanvasScene(container, cloned, i);
25576
25679
  }
25577
25680
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25578
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-IeTP9Bi1.cjs"));
25681
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-CsJ_SHet.cjs"));
25579
25682
  const prepared = preparePagesForExport(
25580
25683
  cloned.pages,
25581
25684
  canvasWidth,
@@ -27895,7 +27998,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27895
27998
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27896
27999
  sanitizeSvgTreeForPdf(svgToDraw);
27897
28000
  try {
27898
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-IeTP9Bi1.cjs"));
28001
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-CsJ_SHet.cjs"));
27899
28002
  try {
27900
28003
  await logTextMeasurementDiagnostic(svgToDraw);
27901
28004
  } catch {
@@ -28292,4 +28395,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
28292
28395
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
28293
28396
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
28294
28397
  exports.warmTemplateFromForm = warmTemplateFromForm;
28295
- //# sourceMappingURL=index-CaQvuDpL.cjs.map
28398
+ //# sourceMappingURL=index-D53PnA7c.cjs.map