@pixldocs/canvas-renderer 0.5.344 → 0.5.345

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.
@@ -14462,7 +14462,7 @@ const PageCanvas = forwardRef(
14462
14462
  });
14463
14463
  let cropGroupSaveTimer = null;
14464
14464
  fabricCanvas.on("object:modified", (e) => {
14465
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
14465
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
14466
14466
  try {
14467
14467
  dragStarted = false;
14468
14468
  setGuides([]);
@@ -15012,6 +15012,9 @@ const PageCanvas = forwardRef(
15012
15012
  }
15013
15013
  }
15014
15014
  const pendingCropGroupFrameBakes = [];
15015
+ const logicalGroupSelectionId = activeObj instanceof fabric.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
15016
+ const isLogicalGroupAS = !!logicalGroupSelectionId && !(activeObj == null ? void 0 : activeObj.__cropGroup) && !(activeObj == null ? void 0 : activeObj.__docuforgeSectionGroup);
15017
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(activeObj.angle ?? 0) : 0;
15015
15018
  for (const obj of activeObjects) {
15016
15019
  const objId = getObjectId(obj);
15017
15020
  if (!objId || objId === "__background__") continue;
@@ -15102,6 +15105,7 @@ const PageCanvas = forwardRef(
15102
15105
  let finalAngle = decomposed.angle;
15103
15106
  let finalSkewX = decomposed.skewX;
15104
15107
  let finalSkewY = decomposed.skewY;
15108
+ let finalAngleFromDecomposed = true;
15105
15109
  if (obj instanceof fabric.Group && obj.__cropGroup) {
15106
15110
  const ct = obj.__cropData;
15107
15111
  if (ct) {
@@ -15164,6 +15168,7 @@ const PageCanvas = forwardRef(
15164
15168
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15165
15169
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15166
15170
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15171
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15167
15172
  }
15168
15173
  obj.set({ scaleX: 1, scaleY: 1 });
15169
15174
  const newSrc = renderSmartElementToDataUri(sourceElement.smartElementType, sourceElement.smartProps, bakedW, bakedH);
@@ -15231,6 +15236,7 @@ const PageCanvas = forwardRef(
15231
15236
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15232
15237
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15233
15238
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15239
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15234
15240
  }
15235
15241
  try {
15236
15242
  const angleRad = (finalAngle ?? 0) * Math.PI / 180;
@@ -15296,6 +15302,7 @@ const PageCanvas = forwardRef(
15296
15302
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15297
15303
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15298
15304
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15305
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15299
15306
  }
15300
15307
  } else if (obj instanceof fabric.Textbox && isActiveSelection && (Math.abs((decomposed.scaleX ?? 1) - 1) > 1e-3 || Math.abs((decomposed.scaleY ?? 1) - 1) > 1e-3)) {
15301
15308
  const sx = Math.abs(decomposed.scaleX || 1);
@@ -15452,6 +15459,9 @@ const PageCanvas = forwardRef(
15452
15459
  const page = state.canvas.pages.find((p) => p.id === pageId);
15453
15460
  const pageChildrenForSave = (page == null ? void 0 : page.children) ?? [];
15454
15461
  const storePos = absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15462
+ if (isLogicalGroupAS && finalAngleFromDecomposed && typeof finalAngle === "number") {
15463
+ finalAngle = ((finalAngle - asAngleForBake) % 360 + 540) % 360 - 180;
15464
+ }
15455
15465
  const isLineObj = obj instanceof fabric.Line;
15456
15466
  const isAutoShrinkText = (sourceElement == null ? void 0 : sourceElement.type) === "text" && sourceElement.overflowPolicy === "auto-shrink";
15457
15467
  const autoShrinkStoredHeight = isAutoShrinkText ? sourceElement.height : void 0;
@@ -15513,7 +15523,32 @@ const PageCanvas = forwardRef(
15513
15523
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15514
15524
  obj.setCoords();
15515
15525
  }
15516
- const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15526
+ if (isLogicalGroupAS && logicalGroupSelectionId && activeObj instanceof fabric.ActiveSelection) {
15527
+ try {
15528
+ const pageChildrenForGroup = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15529
+ const groupNode = findNodeById(pageChildrenForGroup, logicalGroupSelectionId);
15530
+ if (groupNode) {
15531
+ const baseline = ((_k = groupSelectionTransformStartRef.current) == null ? void 0 : _k.groupId) === logicalGroupSelectionId ? groupSelectionTransformStartRef.current : null;
15532
+ const center = activeObj.getCenterPoint();
15533
+ const prevAbs = getAbsoluteBounds(groupNode, pageChildrenForGroup, pageBoundsOptions);
15534
+ const baseCenterX = (baseline == null ? void 0 : baseline.selectionCenterX) ?? prevAbs.left + prevAbs.width / 2;
15535
+ const baseCenterY = (baseline == null ? void 0 : baseline.selectionCenterY) ?? prevAbs.top + prevAbs.height / 2;
15536
+ const baseLeft = (baseline == null ? void 0 : baseline.groupLeft) ?? prevAbs.left;
15537
+ const baseTop = (baseline == null ? void 0 : baseline.groupTop) ?? prevAbs.top;
15538
+ const newAbsLeft = baseLeft + (center.x - baseCenterX);
15539
+ const newAbsTop = baseTop + (center.y - baseCenterY);
15540
+ const storePosGroup = absoluteToStorePosition(newAbsLeft, newAbsTop, logicalGroupSelectionId, pageChildrenForGroup);
15541
+ useEditorStore.getState().updateNode(logicalGroupSelectionId, {
15542
+ left: storePosGroup.left,
15543
+ top: storePosGroup.top,
15544
+ angle: asAngleForBake
15545
+ }, { recordHistory: false, skipLayoutRecalc: true });
15546
+ }
15547
+ } catch (err) {
15548
+ console.warn("[Pixldocs] logical-group envelope persist failed", err);
15549
+ }
15550
+ }
15551
+ const pageChildrenForReflow = ((_l = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _l.children) ?? [];
15517
15552
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15518
15553
  for (const id of modifiedIdsThisRound) {
15519
15554
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -24654,9 +24689,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24654
24689
  }
24655
24690
  return svgString;
24656
24691
  }
24657
- const resolvedPackageVersion = "0.5.344";
24692
+ const resolvedPackageVersion = "0.5.345";
24658
24693
  const PACKAGE_VERSION = resolvedPackageVersion;
24659
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.344";
24694
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.345";
24660
24695
  const roundParityValue = (value) => {
24661
24696
  if (typeof value !== "number") return value;
24662
24697
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25470,7 +25505,7 @@ class PixldocsRenderer {
25470
25505
  await this.waitForCanvasScene(container, cloned, i);
25471
25506
  }
25472
25507
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25473
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-C2_f1pzv.js");
25508
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-rFbeCudV.js");
25474
25509
  const prepared = preparePagesForExport(
25475
25510
  cloned.pages,
25476
25511
  canvasWidth,
@@ -27790,7 +27825,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27790
27825
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27791
27826
  sanitizeSvgTreeForPdf(svgToDraw);
27792
27827
  try {
27793
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-C2_f1pzv.js");
27828
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-rFbeCudV.js");
27794
27829
  try {
27795
27830
  await logTextMeasurementDiagnostic(svgToDraw);
27796
27831
  } catch {
@@ -28190,4 +28225,4 @@ export {
28190
28225
  buildTeaserBlurFlatKeys as y,
28191
28226
  collectFontDescriptorsFromConfig as z
28192
28227
  };
28193
- //# sourceMappingURL=index-C-BVebqn.js.map
28228
+ //# sourceMappingURL=index-wiw1EUl-.js.map