@pixldocs/canvas-renderer 0.5.348 → 0.5.349

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.
@@ -11208,6 +11208,95 @@ const rotatedTopLeftToCenter = (left, top, width, height, angleDeg = 0) => {
11208
11208
  y: top + width / 2 * sin + height / 2 * cos
11209
11209
  };
11210
11210
  };
11211
+ const normalizeSignedAngle = (angle) => (angle % 360 + 540) % 360 - 180;
11212
+ const getGroupTransformFrame = (group, pageChildren, options) => {
11213
+ const bounds = getNodeBounds(group, pageChildren);
11214
+ const width = Math.max(1, Number(group.width ?? bounds.width) || bounds.width || 1);
11215
+ const height = Math.max(1, Number(group.height ?? bounds.height) || bounds.height || 1);
11216
+ return {
11217
+ left: Number(group.left ?? bounds.left ?? 0) || 0,
11218
+ top: Number(group.top ?? bounds.top ?? 0) || 0,
11219
+ width,
11220
+ height,
11221
+ angle: Number(group.angle ?? 0) || 0
11222
+ };
11223
+ };
11224
+ const getGroupLocalToParentMatrix = (group, pageChildren, options) => {
11225
+ const frame = getGroupTransformFrame(group, pageChildren);
11226
+ const rad = frame.angle * Math.PI / 180;
11227
+ const cos = Math.cos(rad);
11228
+ const sin = Math.sin(rad);
11229
+ const centerX = frame.left + frame.width / 2;
11230
+ const centerY = frame.top + frame.height / 2;
11231
+ return [
11232
+ cos,
11233
+ sin,
11234
+ -sin,
11235
+ cos,
11236
+ centerX - cos * frame.width / 2 + sin * frame.height / 2,
11237
+ centerY - sin * frame.width / 2 - cos * frame.height / 2
11238
+ ];
11239
+ };
11240
+ const getAncestorGroupTransform = (nodeId, pageChildren, options) => {
11241
+ let matrix = [1, 0, 0, 1, 0, 0];
11242
+ let angle = 0;
11243
+ const chain = [];
11244
+ let currentId = nodeId;
11245
+ for (let guard = 0; guard < 32; guard++) {
11246
+ const parent = findParentGroup(pageChildren, currentId);
11247
+ if (!parent) break;
11248
+ chain.unshift(parent);
11249
+ currentId = parent.id;
11250
+ }
11251
+ for (const group of chain) {
11252
+ matrix = fabric.util.multiplyTransformMatrices(
11253
+ matrix,
11254
+ getGroupLocalToParentMatrix(group, pageChildren)
11255
+ );
11256
+ angle += Number(group.angle ?? 0) || 0;
11257
+ }
11258
+ return { matrix, angle: normalizeSignedAngle(angle) };
11259
+ };
11260
+ const getElementFabricPlacement = (element, pageChildren, options) => {
11261
+ if (!pageChildren.length) {
11262
+ return { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
11263
+ }
11264
+ const ancestor = getAncestorGroupTransform(element.id, pageChildren);
11265
+ const point = fabric.util.transformPoint(
11266
+ new fabric.Point(element.left ?? 0, element.top ?? 0),
11267
+ ancestor.matrix
11268
+ );
11269
+ return {
11270
+ left: point.x,
11271
+ top: point.y,
11272
+ angle: normalizeSignedAngle(ancestor.angle + Number(element.angle ?? 0))
11273
+ };
11274
+ };
11275
+ const centerToRotatedTopLeft = (centerX, centerY, width, height, angleDeg = 0) => {
11276
+ const angle = angleDeg * Math.PI / 180;
11277
+ const cos = Math.cos(angle);
11278
+ const sin = Math.sin(angle);
11279
+ return {
11280
+ left: centerX - width / 2 * cos + height / 2 * sin,
11281
+ top: centerY - width / 2 * sin - height / 2 * cos
11282
+ };
11283
+ };
11284
+ const getGroupAbsoluteTransformFrame = (group, pageChildren, options) => {
11285
+ const frame = getGroupTransformFrame(group, pageChildren);
11286
+ const ancestor = getAncestorGroupTransform(group.id, pageChildren);
11287
+ const centerLocal = rotatedTopLeftToCenter(frame.left, frame.top, frame.width, frame.height, frame.angle);
11288
+ const center = fabric.util.transformPoint(new fabric.Point(centerLocal.x, centerLocal.y), ancestor.matrix);
11289
+ const topLeft = fabric.util.transformPoint(new fabric.Point(frame.left, frame.top), ancestor.matrix);
11290
+ return {
11291
+ left: topLeft.x,
11292
+ top: topLeft.y,
11293
+ width: frame.width,
11294
+ height: frame.height,
11295
+ centerX: center.x,
11296
+ centerY: center.y,
11297
+ angle: normalizeSignedAngle(ancestor.angle + frame.angle)
11298
+ };
11299
+ };
11211
11300
  function applyWarpAwareSelectionBorders(selection) {
11212
11301
  var _a2;
11213
11302
  if (selection.__pixldocsOrigASHasBorders !== void 0) {
@@ -11356,13 +11445,13 @@ const PageCanvas = forwardRef(
11356
11445
  ));
11357
11446
  const pageChildren2 = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
11358
11447
  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;
11448
+ const groupFrame = groupNode && isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2, pageBoundsOptions) : null;
11449
+ const groupAngle = groupFrame ? groupFrame.angle : 0;
11361
11450
  if (Number.isFinite(groupAngle)) {
11362
11451
  selection.set({ angle: groupAngle, scaleX: 1, scaleY: 1, skewX: 0, skewY: 0 });
11363
- if (groupAbs) {
11452
+ if (groupFrame) {
11364
11453
  selection.setPositionByOrigin(
11365
- new fabric.Point(groupAbs.left + groupAbs.width / 2, groupAbs.top + groupAbs.height / 2),
11454
+ new fabric.Point(groupFrame.centerX, groupFrame.centerY),
11366
11455
  "center",
11367
11456
  "center"
11368
11457
  );
@@ -12848,9 +12937,10 @@ const PageCanvas = forwardRef(
12848
12937
  const pageChildren2 = ((_b2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
12849
12938
  const groupNode = findNodeById(pageChildren2, groupId);
12850
12939
  if (!groupNode) return;
12851
- const groupAbs = getAbsoluteBounds(groupNode, pageChildren2);
12940
+ const groupFrame = isGroup(groupNode) ? getGroupAbsoluteTransformFrame(groupNode, pageChildren2) : null;
12941
+ const groupAbs = groupFrame ?? getAbsoluteBounds(groupNode, pageChildren2);
12852
12942
  const rect = active.getBoundingRect();
12853
- const center = active.getCenterPoint();
12943
+ const center = groupFrame ? new fabric.Point(groupFrame.centerX, groupFrame.centerY) : active.getCenterPoint();
12854
12944
  groupSelectionTransformStartRef.current = {
12855
12945
  groupId,
12856
12946
  selection: active,
@@ -12862,7 +12952,7 @@ const PageCanvas = forwardRef(
12862
12952
  groupTop: groupAbs.top,
12863
12953
  groupWidth: groupAbs.width,
12864
12954
  groupHeight: groupAbs.height,
12865
- selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
12955
+ selectionAngle: (((groupFrame == null ? void 0 : groupFrame.angle) ?? active.angle ?? 0) % 360 + 360) % 360
12866
12956
  };
12867
12957
  };
12868
12958
  const restoreGroupSelectionVisualState = (selection, groupId) => {
@@ -15034,7 +15124,7 @@ const PageCanvas = forwardRef(
15034
15124
  const logicalGroupSelectionId = activeObj instanceof fabric.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
15035
15125
  const isLogicalGroupAS = !!logicalGroupSelectionId && !(activeObj == null ? void 0 : activeObj.__cropGroup) && !(activeObj == null ? void 0 : activeObj.__docuforgeSectionGroup);
15036
15126
  const logicalGroupNodeForBake = logicalGroupSelectionId ? findNodeById(pageChildren2, logicalGroupSelectionId) : null;
15037
- const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number((logicalGroupNodeForBake == null ? void 0 : logicalGroupNodeForBake.angle) ?? activeObj.angle ?? 0)) : 0;
15127
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number(activeObj.angle ?? 0)) : 0;
15038
15128
  const logicalGroupFinalFrame = (() => {
15039
15129
  var _a3;
15040
15130
  if (!isLogicalGroupAS || !logicalGroupSelectionId || !(activeObj instanceof fabric.ActiveSelection)) return null;
@@ -15042,10 +15132,11 @@ const PageCanvas = forwardRef(
15042
15132
  const localWidth = Math.max(1, (activeObj.width ?? (baseline == null ? void 0 : baseline.groupWidth) ?? 1) * Math.abs(activeObj.scaleX ?? 1));
15043
15133
  const localHeight = Math.max(1, (activeObj.height ?? (baseline == null ? void 0 : baseline.groupHeight) ?? 1) * Math.abs(activeObj.scaleY ?? 1));
15044
15134
  const center = activeObj.getCenterPoint();
15135
+ const topLeft = centerToRotatedTopLeft(center.x, center.y, localWidth, localHeight, asAngleForBake);
15045
15136
  return {
15046
15137
  groupId: logicalGroupSelectionId,
15047
- left: center.x - localWidth / 2,
15048
- top: center.y - localHeight / 2,
15138
+ left: topLeft.left,
15139
+ top: topLeft.top,
15049
15140
  width: localWidth,
15050
15141
  height: localHeight,
15051
15142
  centerX: center.x,
@@ -15107,16 +15198,15 @@ const PageCanvas = forwardRef(
15107
15198
  modifiedIdsThisRound.add(objId);
15108
15199
  let absoluteLeft;
15109
15200
  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
- }
15201
+ const initialTopLeft = centerToRotatedTopLeft(
15202
+ decomposed.translateX ?? (obj.left ?? 0),
15203
+ decomposed.translateY ?? (obj.top ?? 0),
15204
+ intrinsicWidth * Math.abs(decomposed.scaleX || 1),
15205
+ intrinsicHeight * Math.abs(decomposed.scaleY || 1),
15206
+ decomposed.angle ?? 0
15207
+ );
15208
+ absoluteLeft = initialTopLeft.left;
15209
+ absoluteTop = initialTopLeft.top;
15120
15210
  if (obj instanceof fabric.Group && obj.__cropGroup) {
15121
15211
  const ct = obj.__cropData;
15122
15212
  if (isActiveSelection && activeObj instanceof fabric.ActiveSelection) {
@@ -16200,7 +16290,7 @@ const PageCanvas = forwardRef(
16200
16290
  const nextHeight = Math.max(minVisiblePlaceholder, Number(resolvedSizeImg.height) || 50);
16201
16291
  const storePosImg = pageChildren ? (() => {
16202
16292
  const node = findNodeById(pageChildren, element.id);
16203
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16293
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16204
16294
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16205
16295
  const elementForPlaceholder = { ...element, width: nextWidth, height: nextHeight };
16206
16296
  const placeholder = isCropGroup2 ? createImagePlaceholderForGroup(elementForPlaceholder) : createImagePlaceholder(elementForPlaceholder);
@@ -16263,14 +16353,14 @@ const PageCanvas = forwardRef(
16263
16353
  }
16264
16354
  const cropPos = pageChildren ? (() => {
16265
16355
  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);
16356
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16357
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16358
+ const cropCenter = rotatedTopLeftToCenter(cropPos.left, cropPos.top, ct.frameW ?? 0, ct.frameH ?? 0, cropPos.angle ?? element.angle ?? 0);
16269
16359
  const cropCenterX = cropCenter.x;
16270
16360
  const cropCenterY = cropCenter.y;
16271
16361
  if (element.left !== void 0) existingObj.set({ left: cropCenterX });
16272
16362
  if (element.top !== void 0) existingObj.set({ top: cropCenterY });
16273
- if (element.angle !== void 0) existingObj.set({ angle: element.angle });
16363
+ existingObj.set({ angle: cropPos.angle ?? element.angle ?? 0 });
16274
16364
  existingObj.set({
16275
16365
  flipX: element.flipX ?? false,
16276
16366
  flipY: element.flipY ?? false
@@ -16393,8 +16483,8 @@ const PageCanvas = forwardRef(
16393
16483
  if (isPlaceholderGroup) {
16394
16484
  const storePosImg = pageChildren ? (() => {
16395
16485
  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 };
16486
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16487
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16398
16488
  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
16489
  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
16490
  const minVisiblePlaceholder = hasExplicitSize ? 1 : 20;
@@ -16408,7 +16498,7 @@ const PageCanvas = forwardRef(
16408
16498
  top: storePosImg.top + nextHeight / 2,
16409
16499
  originX: "center",
16410
16500
  originY: "center",
16411
- angle: element.angle ?? 0,
16501
+ angle: storePosImg.angle ?? element.angle ?? 0,
16412
16502
  opacity: isHidden ? 0 : element.opacity ?? 1,
16413
16503
  flipX: element.flipX ?? false,
16414
16504
  flipY: element.flipY ?? false,
@@ -16457,8 +16547,8 @@ const PageCanvas = forwardRef(
16457
16547
  const visibilityChanged = previousVisible !== currentVisible;
16458
16548
  const storePosForImg = pageChildren ? (() => {
16459
16549
  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 };
16550
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16551
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
16462
16552
  const positionChanged = Math.abs((existingObj.left ?? 0) - storePosForImg.left) > 0.1 || Math.abs((existingObj.top ?? 0) - storePosForImg.top) > 0.1;
16463
16553
  if (visibilityChanged && !positionChanged || visibilityUpdateInProgressRef.current) {
16464
16554
  const isDynamicField = dynamicFieldIds.includes(element.id);
@@ -16500,7 +16590,7 @@ const PageCanvas = forwardRef(
16500
16590
  const fabricTop = existingObj.top ?? 0;
16501
16591
  const storePos = pageChildren ? (() => {
16502
16592
  const node = findNodeById(pageChildren, element.id);
16503
- return node ? getAbsoluteBounds(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16593
+ return node && isElement(node) ? getElementFabricPlacement(node, pageChildren) : { left: element.left ?? 0, top: element.top ?? 0 };
16504
16594
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16505
16595
  const storeLeft = storePos.left;
16506
16596
  const storeTop = storePos.top;
@@ -16627,7 +16717,7 @@ const PageCanvas = forwardRef(
16627
16717
  setObjectData(placeholder, element.id);
16628
16718
  const absPosImg = pageTree.length > 0 ? (() => {
16629
16719
  const node = findNodeById(pageTree, element.id);
16630
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16720
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16631
16721
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16632
16722
  const placeholderWidth = Number((placeholder.width ?? 0) * (placeholder.scaleX ?? 1));
16633
16723
  const placeholderHeight = Number((placeholder.height ?? 0) * (placeholder.scaleY ?? 1));
@@ -16676,7 +16766,7 @@ const PageCanvas = forwardRef(
16676
16766
  if (obj) {
16677
16767
  const absPos = pageTree.length > 0 ? (() => {
16678
16768
  const node = findNodeById(pageTree, element.id);
16679
- return node ? getAbsoluteBounds(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16769
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTree) : { left: element.left ?? 0, top: element.top ?? 0 };
16680
16770
  })() : { left: element.left ?? 0, top: element.top ?? 0 };
16681
16771
  obj.set({ left: absPos.left, top: absPos.top });
16682
16772
  obj.setCoords();
@@ -17164,8 +17254,8 @@ const PageCanvas = forwardRef(
17164
17254
  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
17255
  const fabricPos = currentPageTree.length > 0 ? (() => {
17166
17256
  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 };
17257
+ return node && isElement(node) ? getElementFabricPlacement(node, currentPageTree) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17258
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
17169
17259
  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
17260
  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
17261
  const minVisible = shouldPreserveSmallSize ? 1 : 20;
@@ -18234,14 +18324,14 @@ const PageCanvas = forwardRef(
18234
18324
  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
18325
  const createPos = pageTreeForCreate.length > 0 ? (() => {
18236
18326
  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 };
18327
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCreate, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18328
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18239
18329
  img.set({
18240
18330
  left: createPos.left,
18241
18331
  top: createPos.top,
18242
18332
  scaleX: finalScaleX,
18243
18333
  scaleY: finalScaleY,
18244
- angle: element.angle ?? 0,
18334
+ angle: createPos.angle ?? element.angle ?? 0,
18245
18335
  skewX: element.skewX ?? 0,
18246
18336
  skewY: element.skewY ?? 0,
18247
18337
  flipX: element.flipX ?? false,
@@ -18328,8 +18418,8 @@ const PageCanvas = forwardRef(
18328
18418
  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
18419
  const createPosForCrop = pageTreeForCrop.length > 0 ? (() => {
18330
18420
  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 };
18421
+ return node && isElement(node) ? getElementFabricPlacement(node, pageTreeForCrop, pageBoundsOptions) : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18422
+ })() : { left: element.left ?? 0, top: element.top ?? 0, angle: element.angle ?? 0 };
18333
18423
  const nodeForCreate = pageTreeForCrop.length ? findNodeById(pageTreeForCrop, element.id) : null;
18334
18424
  const createW = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.width : elementWidth;
18335
18425
  const createH = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.height : elementHeight;
@@ -18337,8 +18427,9 @@ const PageCanvas = forwardRef(
18337
18427
  const createSy = nodeForCreate && isElement(nodeForCreate) ? nodeForCreate.scaleY ?? 1 : element.scaleY ?? 1;
18338
18428
  const frameW = Math.max(1, Number(createW) || 200) * createSx;
18339
18429
  const frameH = Math.max(1, Number(createH) || 50) * createSy;
18340
- const createCenterX = createPosForCrop.left + frameW / 2;
18341
- const createCenterY = createPosForCrop.top + frameH / 2;
18430
+ const createCenter = rotatedTopLeftToCenter(createPosForCrop.left, createPosForCrop.top, frameW, frameH, createPosForCrop.angle ?? element.angle ?? 0);
18431
+ const createCenterX = createCenter.x;
18432
+ const createCenterY = createCenter.y;
18342
18433
  const cropGroup = await createMaskedImageElement({
18343
18434
  image: img,
18344
18435
  frameW,
@@ -18351,7 +18442,7 @@ const PageCanvas = forwardRef(
18351
18442
  strokeWidth: 0,
18352
18443
  left: createCenterX,
18353
18444
  top: createCenterY,
18354
- angle: element.angle ?? 0,
18445
+ angle: createPosForCrop.angle ?? element.angle ?? 0,
18355
18446
  opacity: isHidden ? 0 : element.opacity ?? 1,
18356
18447
  selectable: allowSelection && !isHidden,
18357
18448
  evented: canBeEvented && !isHidden,
@@ -24741,9 +24832,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24741
24832
  }
24742
24833
  return svgString;
24743
24834
  }
24744
- const resolvedPackageVersion = "0.5.348";
24835
+ const resolvedPackageVersion = "0.5.349";
24745
24836
  const PACKAGE_VERSION = resolvedPackageVersion;
24746
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.348";
24837
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.349";
24747
24838
  const roundParityValue = (value) => {
24748
24839
  if (typeof value !== "number") return value;
24749
24840
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25557,7 +25648,7 @@ class PixldocsRenderer {
25557
25648
  await this.waitForCanvasScene(container, cloned, i);
25558
25649
  }
25559
25650
  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");
25651
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-B8sTK3Ew.js");
25561
25652
  const prepared = preparePagesForExport(
25562
25653
  cloned.pages,
25563
25654
  canvasWidth,
@@ -27877,7 +27968,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27877
27968
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27878
27969
  sanitizeSvgTreeForPdf(svgToDraw);
27879
27970
  try {
27880
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-CXxYlE0-.js");
27971
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-B8sTK3Ew.js");
27881
27972
  try {
27882
27973
  await logTextMeasurementDiagnostic(svgToDraw);
27883
27974
  } catch {
@@ -28277,4 +28368,4 @@ export {
28277
28368
  buildTeaserBlurFlatKeys as y,
28278
28369
  collectFontDescriptorsFromConfig as z
28279
28370
  };
28280
- //# sourceMappingURL=index-BbbkWYa_.js.map
28371
+ //# sourceMappingURL=index-wt6naIdE.js.map