@pixldocs/canvas-renderer 0.5.428 → 0.5.430

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.
@@ -5039,7 +5039,13 @@ function updateCoverLayout(g) {
5039
5039
  scaleX: finalScale,
5040
5040
  scaleY: finalScale,
5041
5041
  originX: "center",
5042
- originY: "center"
5042
+ originY: "center",
5043
+ // Always keep inner bitmap axis-aligned within the frame; the parent
5044
+ // crop group owns the rotation. See createMaskedImageElement for the
5045
+ // full rationale.
5046
+ angle: 0,
5047
+ skewX: 0,
5048
+ skewY: 0
5043
5049
  });
5044
5050
  const dispW = iw * finalScale;
5045
5051
  const dispH = ih * finalScale;
@@ -5475,6 +5481,16 @@ async function createMaskedImageElement({
5475
5481
  evented: false,
5476
5482
  opacity: 1,
5477
5483
  // CRITICAL: Always 1 for child - group handles opacity
5484
+ // Force the inner bitmap's angle to 0 so it inherits ONLY the parent
5485
+ // crop group's rotation. Some image sources (e.g. previously-rotated
5486
+ // FabricImage objects, EXIF-baked PNGs, or drop-replacement payloads
5487
+ // that carried a stale `angle` from a logical group) arrive here with
5488
+ // a non-zero local angle. Without this reset the bitmap renders at
5489
+ // (groupAngle + imgAngle) after reload, while the frame only carries
5490
+ // groupAngle — making the photo look mis-rotated inside its frame.
5491
+ angle: 0,
5492
+ skewX: 0,
5493
+ skewY: 0,
5478
5494
  // Preserve image-level caching settings if they exist
5479
5495
  objectCaching: img.objectCaching ?? false,
5480
5496
  noScaleCache: img.noScaleCache ?? true
@@ -16497,6 +16513,25 @@ const PageCanvas = react.forwardRef(
16497
16513
  }
16498
16514
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
16499
16515
  obj.setCoords();
16516
+ try {
16517
+ const isImg = obj instanceof fabric__namespace.FabricImage || obj.__cropGroup;
16518
+ if (isImg) {
16519
+ console.log("[Pixldocs:rotation-persist]", {
16520
+ objId,
16521
+ fabricType: obj.type,
16522
+ isCropGroup: !!obj.__cropGroup,
16523
+ isActiveSelection,
16524
+ objAngle: obj.angle,
16525
+ activeAngle: activeObj == null ? void 0 : activeObj.angle,
16526
+ decomposedAngle: decomposed == null ? void 0 : decomposed.angle,
16527
+ persistedAngle: elementUpdate.angle,
16528
+ persistedLeft: elementUpdate.left,
16529
+ persistedTop: elementUpdate.top,
16530
+ sourceElementAngle: sourceElement == null ? void 0 : sourceElement.angle
16531
+ });
16532
+ }
16533
+ } catch {
16534
+ }
16500
16535
  }
16501
16536
  const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
16502
16537
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
@@ -16668,7 +16703,7 @@ const PageCanvas = react.forwardRef(
16668
16703
  }
16669
16704
  });
16670
16705
  fabricCanvas.on("mouse:dblclick", (e) => {
16671
- var _a2, _b2;
16706
+ var _a2, _b2, _c2;
16672
16707
  if (!isActiveRef.current || !allowEditing) return;
16673
16708
  let target = e.target;
16674
16709
  if (!target) {
@@ -16680,6 +16715,16 @@ const PageCanvas = react.forwardRef(
16680
16715
  const innerImg = ct == null ? void 0 : ct._img;
16681
16716
  const innerSrc = ((_a2 = innerImg == null ? void 0 : innerImg.getSrc) == null ? void 0 : _a2.call(innerImg)) || ((_b2 = innerImg == null ? void 0 : innerImg._originalElement) == null ? void 0 : _b2.src) || (innerImg == null ? void 0 : innerImg.src) || "";
16682
16717
  const isPlaceholder = !innerSrc || innerSrc === EMPTY_IMAGE_PLACEHOLDER_DATA_URL;
16718
+ const targetId = getObjectId(target);
16719
+ const pageChildrenForCrop = ((_c2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c2.children) ?? [];
16720
+ const parentForCrop = targetId ? findParentGroup(pageChildrenForCrop, targetId) : null;
16721
+ const isInsideGroup = !!parentForCrop;
16722
+ if (isInsideGroup) {
16723
+ sonner.toast.info("Ungroup to crop this image", {
16724
+ description: "Crop mode is disabled for images inside a group. Select the group and ungroup first."
16725
+ });
16726
+ return;
16727
+ }
16683
16728
  if (innerImg && !isPlaceholder && !isCropGroupInCropMode(target)) {
16684
16729
  enterCropMode(target);
16685
16730
  return;
@@ -25706,9 +25751,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
25706
25751
  }
25707
25752
  return svgString;
25708
25753
  }
25709
- const resolvedPackageVersion = "0.5.428";
25754
+ const resolvedPackageVersion = "0.5.430";
25710
25755
  const PACKAGE_VERSION = resolvedPackageVersion;
25711
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.428";
25756
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.430";
25712
25757
  const roundParityValue = (value) => {
25713
25758
  if (typeof value !== "number") return value;
25714
25759
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -26522,7 +26567,7 @@ class PixldocsRenderer {
26522
26567
  await this.waitForCanvasScene(container, cloned, i);
26523
26568
  }
26524
26569
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
26525
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-DrbrYFkJ.cjs"));
26570
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-CTWkNuBw.cjs"));
26526
26571
  const prepared = preparePagesForExport(
26527
26572
  cloned.pages,
26528
26573
  canvasWidth,
@@ -28842,7 +28887,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
28842
28887
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
28843
28888
  sanitizeSvgTreeForPdf(svgToDraw);
28844
28889
  try {
28845
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-DrbrYFkJ.cjs"));
28890
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-CTWkNuBw.cjs"));
28846
28891
  try {
28847
28892
  await logTextMeasurementDiagnostic(svgToDraw);
28848
28893
  } catch {
@@ -29239,4 +29284,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
29239
29284
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
29240
29285
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
29241
29286
  exports.warmTemplateFromForm = warmTemplateFromForm;
29242
- //# sourceMappingURL=index-Dk0BUnsP.cjs.map
29287
+ //# sourceMappingURL=index-lW4vxeRT.cjs.map