@pixldocs/canvas-renderer 0.5.343 → 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.
@@ -14480,7 +14480,7 @@ const PageCanvas = react.forwardRef(
14480
14480
  });
14481
14481
  let cropGroupSaveTimer = null;
14482
14482
  fabricCanvas.on("object:modified", (e) => {
14483
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
14483
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
14484
14484
  try {
14485
14485
  dragStarted = false;
14486
14486
  setGuides([]);
@@ -14942,13 +14942,15 @@ const PageCanvas = react.forwardRef(
14942
14942
  const hadScale = isActiveSelection && activeObj && (hadResizeHandle || Math.abs((activeObj.scaleX ?? 1) - 1) > 0.01 || Math.abs((activeObj.scaleY ?? 1) - 1) > 0.01);
14943
14943
  const startSelAngle = normalizeAngle((transformStart == null ? void 0 : transformStart.selectionAngle) ?? 0);
14944
14944
  const currentSelAngle = isActiveSelection && activeObj ? normalizeAngle(activeObj.angle ?? 0) : 0;
14945
- const angleDelta = shortestAngleDelta(currentSelAngle, startSelAngle);
14945
+ const storedGroupAngle = normalizeAngle(Number(groupToMove.angle ?? 0));
14946
+ const effectiveStartAngle = transformStart ? startSelAngle : storedGroupAngle;
14947
+ const angleDelta = shortestAngleDelta(currentSelAngle, effectiveStartAngle);
14946
14948
  const hadRotation = isActiveSelection && activeObj && angleDelta > 0.01;
14947
14949
  if (activeGroupSelectionId === groupToMove.id && hadRotation && !hadScale && !activeSelectionResizeHandle && activeObj instanceof fabric__namespace.ActiveSelection) {
14948
14950
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14949
14951
  const center = activeObj.getCenterPoint();
14950
- const baseCenterX = (transformStart == null ? void 0 : transformStart.selectionCenterX) ?? center.x;
14951
- const baseCenterY = (transformStart == null ? void 0 : transformStart.selectionCenterY) ?? center.y;
14952
+ const baseCenterX = (transformStart == null ? void 0 : transformStart.selectionCenterX) ?? groupAbs.left + groupAbs.width / 2;
14953
+ const baseCenterY = (transformStart == null ? void 0 : transformStart.selectionCenterY) ?? groupAbs.top + groupAbs.height / 2;
14952
14954
  const nextAbsLeft = groupAbs.left + (center.x - baseCenterX);
14953
14955
  const nextAbsTop = groupAbs.top + (center.y - baseCenterY);
14954
14956
  const storePos = absoluteToStorePosition(nextAbsLeft, nextAbsTop, groupToMove.id, pageChildren2);
@@ -15028,6 +15030,9 @@ const PageCanvas = react.forwardRef(
15028
15030
  }
15029
15031
  }
15030
15032
  const pendingCropGroupFrameBakes = [];
15033
+ const logicalGroupSelectionId = activeObj instanceof fabric__namespace.ActiveSelection ? activeObj.__pixldocsGroupSelection : void 0;
15034
+ const isLogicalGroupAS = !!logicalGroupSelectionId && !(activeObj == null ? void 0 : activeObj.__cropGroup) && !(activeObj == null ? void 0 : activeObj.__docuforgeSectionGroup);
15035
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(activeObj.angle ?? 0) : 0;
15031
15036
  for (const obj of activeObjects) {
15032
15037
  const objId = getObjectId(obj);
15033
15038
  if (!objId || objId === "__background__") continue;
@@ -15118,6 +15123,7 @@ const PageCanvas = react.forwardRef(
15118
15123
  let finalAngle = decomposed.angle;
15119
15124
  let finalSkewX = decomposed.skewX;
15120
15125
  let finalSkewY = decomposed.skewY;
15126
+ let finalAngleFromDecomposed = true;
15121
15127
  if (obj instanceof fabric__namespace.Group && obj.__cropGroup) {
15122
15128
  const ct = obj.__cropData;
15123
15129
  if (ct) {
@@ -15180,6 +15186,7 @@ const PageCanvas = react.forwardRef(
15180
15186
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15181
15187
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15182
15188
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15189
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15183
15190
  }
15184
15191
  obj.set({ scaleX: 1, scaleY: 1 });
15185
15192
  const newSrc = renderSmartElementToDataUri(sourceElement.smartElementType, sourceElement.smartProps, bakedW, bakedH);
@@ -15247,6 +15254,7 @@ const PageCanvas = react.forwardRef(
15247
15254
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15248
15255
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15249
15256
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15257
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15250
15258
  }
15251
15259
  try {
15252
15260
  const angleRad = (finalAngle ?? 0) * Math.PI / 180;
@@ -15312,6 +15320,7 @@ const PageCanvas = react.forwardRef(
15312
15320
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15313
15321
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15314
15322
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15323
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15315
15324
  }
15316
15325
  } else if (obj instanceof fabric__namespace.Textbox && isActiveSelection && (Math.abs((decomposed.scaleX ?? 1) - 1) > 1e-3 || Math.abs((decomposed.scaleY ?? 1) - 1) > 1e-3)) {
15317
15326
  const sx = Math.abs(decomposed.scaleX || 1);
@@ -15468,6 +15477,9 @@ const PageCanvas = react.forwardRef(
15468
15477
  const page = state.canvas.pages.find((p) => p.id === pageId);
15469
15478
  const pageChildrenForSave = (page == null ? void 0 : page.children) ?? [];
15470
15479
  const storePos = absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15480
+ if (isLogicalGroupAS && finalAngleFromDecomposed && typeof finalAngle === "number") {
15481
+ finalAngle = ((finalAngle - asAngleForBake) % 360 + 540) % 360 - 180;
15482
+ }
15471
15483
  const isLineObj = obj instanceof fabric__namespace.Line;
15472
15484
  const isAutoShrinkText = (sourceElement == null ? void 0 : sourceElement.type) === "text" && sourceElement.overflowPolicy === "auto-shrink";
15473
15485
  const autoShrinkStoredHeight = isAutoShrinkText ? sourceElement.height : void 0;
@@ -15529,7 +15541,32 @@ const PageCanvas = react.forwardRef(
15529
15541
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15530
15542
  obj.setCoords();
15531
15543
  }
15532
- const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15544
+ if (isLogicalGroupAS && logicalGroupSelectionId && activeObj instanceof fabric__namespace.ActiveSelection) {
15545
+ try {
15546
+ const pageChildrenForGroup = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15547
+ const groupNode = findNodeById(pageChildrenForGroup, logicalGroupSelectionId);
15548
+ if (groupNode) {
15549
+ const baseline = ((_k = groupSelectionTransformStartRef.current) == null ? void 0 : _k.groupId) === logicalGroupSelectionId ? groupSelectionTransformStartRef.current : null;
15550
+ const center = activeObj.getCenterPoint();
15551
+ const prevAbs = getAbsoluteBounds(groupNode, pageChildrenForGroup, pageBoundsOptions);
15552
+ const baseCenterX = (baseline == null ? void 0 : baseline.selectionCenterX) ?? prevAbs.left + prevAbs.width / 2;
15553
+ const baseCenterY = (baseline == null ? void 0 : baseline.selectionCenterY) ?? prevAbs.top + prevAbs.height / 2;
15554
+ const baseLeft = (baseline == null ? void 0 : baseline.groupLeft) ?? prevAbs.left;
15555
+ const baseTop = (baseline == null ? void 0 : baseline.groupTop) ?? prevAbs.top;
15556
+ const newAbsLeft = baseLeft + (center.x - baseCenterX);
15557
+ const newAbsTop = baseTop + (center.y - baseCenterY);
15558
+ const storePosGroup = absoluteToStorePosition(newAbsLeft, newAbsTop, logicalGroupSelectionId, pageChildrenForGroup);
15559
+ useEditorStore.getState().updateNode(logicalGroupSelectionId, {
15560
+ left: storePosGroup.left,
15561
+ top: storePosGroup.top,
15562
+ angle: asAngleForBake
15563
+ }, { recordHistory: false, skipLayoutRecalc: true });
15564
+ }
15565
+ } catch (err) {
15566
+ console.warn("[Pixldocs] logical-group envelope persist failed", err);
15567
+ }
15568
+ }
15569
+ const pageChildrenForReflow = ((_l = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _l.children) ?? [];
15533
15570
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15534
15571
  for (const id of modifiedIdsThisRound) {
15535
15572
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -24670,9 +24707,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24670
24707
  }
24671
24708
  return svgString;
24672
24709
  }
24673
- const resolvedPackageVersion = "0.5.343";
24710
+ const resolvedPackageVersion = "0.5.345";
24674
24711
  const PACKAGE_VERSION = resolvedPackageVersion;
24675
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.343";
24712
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.345";
24676
24713
  const roundParityValue = (value) => {
24677
24714
  if (typeof value !== "number") return value;
24678
24715
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25486,7 +25523,7 @@ class PixldocsRenderer {
25486
25523
  await this.waitForCanvasScene(container, cloned, i);
25487
25524
  }
25488
25525
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25489
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-CdDnoHs2.cjs"));
25526
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-Mhjrus5I.cjs"));
25490
25527
  const prepared = preparePagesForExport(
25491
25528
  cloned.pages,
25492
25529
  canvasWidth,
@@ -27806,7 +27843,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27806
27843
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27807
27844
  sanitizeSvgTreeForPdf(svgToDraw);
27808
27845
  try {
27809
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-CdDnoHs2.cjs"));
27846
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-Mhjrus5I.cjs"));
27810
27847
  try {
27811
27848
  await logTextMeasurementDiagnostic(svgToDraw);
27812
27849
  } catch {
@@ -28203,4 +28240,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
28203
28240
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
28204
28241
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
28205
28242
  exports.warmTemplateFromForm = warmTemplateFromForm;
28206
- //# sourceMappingURL=index-BVDxgitP.cjs.map
28243
+ //# sourceMappingURL=index-D4xGj5W4.cjs.map