@pixldocs/canvas-renderer 0.5.344 → 0.5.346

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.
@@ -12345,6 +12345,7 @@ const PageCanvas = react.forwardRef(
12345
12345
  selectionLeft: rect.left,
12346
12346
  selectionTop: rect.top
12347
12347
  };
12348
+ prepareGroupSelectionTransformStart(active);
12348
12349
  }
12349
12350
  if (fabricCanvas._currentTransform) {
12350
12351
  fabricCanvas.__isUserTransforming = true;
@@ -14480,7 +14481,7 @@ const PageCanvas = react.forwardRef(
14480
14481
  });
14481
14482
  let cropGroupSaveTimer = null;
14482
14483
  fabricCanvas.on("object:modified", (e) => {
14483
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
14484
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k;
14484
14485
  try {
14485
14486
  dragStarted = false;
14486
14487
  setGuides([]);
@@ -14988,9 +14989,8 @@ const PageCanvas = react.forwardRef(
14988
14989
  }
14989
14990
  if (!isActiveSelectionSideResize && !hadScale && !hadRotation && (Math.abs(deltaX) > 0.1 || Math.abs(deltaY) > 0.1)) {
14990
14991
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14991
- const newLeft = (groupToMove.left ?? 0) + deltaX;
14992
- const newTop = (groupToMove.top ?? 0) + deltaY;
14993
- updateNodeStore(groupToMove.id, { left: newLeft, top: newTop }, { recordHistory: false, skipLayoutRecalc: true });
14992
+ const storePos = absoluteToStorePosition(movedGroupLeft, movedGroupTop, groupToMove.id, pageChildren2);
14993
+ updateNodeStore(groupToMove.id, { left: storePos.left, top: storePos.top }, { recordHistory: false, skipLayoutRecalc: true });
14994
14994
  commitHistoryStore();
14995
14995
  pendingGroupDrillInRef.current = null;
14996
14996
  fabricCanvas.__activeEditingGroupId = null;
@@ -15030,6 +15030,37 @@ const PageCanvas = react.forwardRef(
15030
15030
  }
15031
15031
  }
15032
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 logicalGroupNodeForBake = logicalGroupSelectionId ? findNodeById(pageChildren2, logicalGroupSelectionId) : null;
15036
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number((logicalGroupNodeForBake == null ? void 0 : logicalGroupNodeForBake.angle) ?? activeObj.angle ?? 0)) : 0;
15037
+ const logicalGroupFinalFrame = (() => {
15038
+ var _a3;
15039
+ if (!isLogicalGroupAS || !logicalGroupSelectionId || !(activeObj instanceof fabric__namespace.ActiveSelection)) return null;
15040
+ const baseline = ((_a3 = groupSelectionTransformStartRef.current) == null ? void 0 : _a3.groupId) === logicalGroupSelectionId ? groupSelectionTransformStartRef.current : null;
15041
+ const localWidth = Math.max(1, (activeObj.width ?? (baseline == null ? void 0 : baseline.groupWidth) ?? 1) * Math.abs(activeObj.scaleX ?? 1));
15042
+ const localHeight = Math.max(1, (activeObj.height ?? (baseline == null ? void 0 : baseline.groupHeight) ?? 1) * Math.abs(activeObj.scaleY ?? 1));
15043
+ const center = activeObj.getCenterPoint();
15044
+ return {
15045
+ groupId: logicalGroupSelectionId,
15046
+ left: center.x - localWidth / 2,
15047
+ top: center.y - localHeight / 2,
15048
+ width: localWidth,
15049
+ height: localHeight,
15050
+ centerX: center.x,
15051
+ centerY: center.y,
15052
+ angle: asAngleForBake,
15053
+ matrix: fabric__namespace.util.composeMatrix({
15054
+ translateX: center.x,
15055
+ translateY: center.y,
15056
+ angle: asAngleForBake,
15057
+ scaleX: 1,
15058
+ scaleY: 1,
15059
+ skewX: 0,
15060
+ skewY: 0
15061
+ })
15062
+ };
15063
+ })();
15033
15064
  for (const obj of activeObjects) {
15034
15065
  const objId = getObjectId(obj);
15035
15066
  if (!objId || objId === "__background__") continue;
@@ -15120,6 +15151,7 @@ const PageCanvas = react.forwardRef(
15120
15151
  let finalAngle = decomposed.angle;
15121
15152
  let finalSkewX = decomposed.skewX;
15122
15153
  let finalSkewY = decomposed.skewY;
15154
+ let finalAngleFromDecomposed = true;
15123
15155
  if (obj instanceof fabric__namespace.Group && obj.__cropGroup) {
15124
15156
  const ct = obj.__cropData;
15125
15157
  if (ct) {
@@ -15182,6 +15214,7 @@ const PageCanvas = react.forwardRef(
15182
15214
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15183
15215
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15184
15216
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15217
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15185
15218
  }
15186
15219
  obj.set({ scaleX: 1, scaleY: 1 });
15187
15220
  const newSrc = renderSmartElementToDataUri(sourceElement.smartElementType, sourceElement.smartProps, bakedW, bakedH);
@@ -15249,6 +15282,7 @@ const PageCanvas = react.forwardRef(
15249
15282
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15250
15283
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15251
15284
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15285
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15252
15286
  }
15253
15287
  try {
15254
15288
  const angleRad = (finalAngle ?? 0) * Math.PI / 180;
@@ -15314,6 +15348,7 @@ const PageCanvas = react.forwardRef(
15314
15348
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15315
15349
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15316
15350
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15351
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15317
15352
  }
15318
15353
  } else if (obj instanceof fabric__namespace.Textbox && isActiveSelection && (Math.abs((decomposed.scaleX ?? 1) - 1) > 1e-3 || Math.abs((decomposed.scaleY ?? 1) - 1) > 1e-3)) {
15319
15354
  const sx = Math.abs(decomposed.scaleX || 1);
@@ -15469,7 +15504,21 @@ const PageCanvas = react.forwardRef(
15469
15504
  const state = useEditorStore.getState();
15470
15505
  const page = state.canvas.pages.find((p) => p.id === pageId);
15471
15506
  const pageChildrenForSave = (page == null ? void 0 : page.children) ?? [];
15472
- const storePos = absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15507
+ const storePos = (logicalGroupFinalFrame == null ? void 0 : logicalGroupFinalFrame.groupId) === logicalGroupSelectionId ? (() => {
15508
+ const localCenter = fabric__namespace.util.transformPoint(
15509
+ new fabric__namespace.Point(decomposed.translateX ?? 0, decomposed.translateY ?? 0),
15510
+ fabric__namespace.util.invertTransform(logicalGroupFinalFrame.matrix)
15511
+ );
15512
+ const localAngle = finalAngleFromDecomposed ? ((Number(finalAngle ?? 0) - asAngleForBake) % 360 + 540) % 360 - 180 : Number(finalAngle ?? 0);
15513
+ const localAngleRad = localAngle * Math.PI / 180;
15514
+ return {
15515
+ left: localCenter.x - finalWidth / 2 * Math.cos(localAngleRad) + finalHeight / 2 * Math.sin(localAngleRad) + logicalGroupFinalFrame.width / 2,
15516
+ top: localCenter.y - finalWidth / 2 * Math.sin(localAngleRad) - finalHeight / 2 * Math.cos(localAngleRad) + logicalGroupFinalFrame.height / 2
15517
+ };
15518
+ })() : absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15519
+ if (isLogicalGroupAS && finalAngleFromDecomposed && typeof finalAngle === "number") {
15520
+ finalAngle = ((finalAngle - asAngleForBake) % 360 + 540) % 360 - 180;
15521
+ }
15473
15522
  const isLineObj = obj instanceof fabric__namespace.Line;
15474
15523
  const isAutoShrinkText = (sourceElement == null ? void 0 : sourceElement.type) === "text" && sourceElement.overflowPolicy === "auto-shrink";
15475
15524
  const autoShrinkStoredHeight = isAutoShrinkText ? sourceElement.height : void 0;
@@ -15531,7 +15580,25 @@ const PageCanvas = react.forwardRef(
15531
15580
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15532
15581
  obj.setCoords();
15533
15582
  }
15534
- const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15583
+ if (isLogicalGroupAS && logicalGroupSelectionId && activeObj instanceof fabric__namespace.ActiveSelection) {
15584
+ try {
15585
+ const pageChildrenForGroup = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15586
+ const groupNode = findNodeById(pageChildrenForGroup, logicalGroupSelectionId);
15587
+ if (groupNode && logicalGroupFinalFrame) {
15588
+ const storePosGroup = absoluteToStorePosition(logicalGroupFinalFrame.left, logicalGroupFinalFrame.top, logicalGroupSelectionId, pageChildrenForGroup);
15589
+ useEditorStore.getState().updateNode(logicalGroupSelectionId, {
15590
+ left: storePosGroup.left,
15591
+ top: storePosGroup.top,
15592
+ width: logicalGroupFinalFrame.width,
15593
+ height: logicalGroupFinalFrame.height,
15594
+ angle: logicalGroupFinalFrame.angle
15595
+ }, { recordHistory: false, skipLayoutRecalc: true });
15596
+ }
15597
+ } catch (err) {
15598
+ console.warn("[Pixldocs] logical-group envelope persist failed", err);
15599
+ }
15600
+ }
15601
+ const pageChildrenForReflow = ((_k = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _k.children) ?? [];
15535
15602
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15536
15603
  for (const id of modifiedIdsThisRound) {
15537
15604
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -24672,9 +24739,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24672
24739
  }
24673
24740
  return svgString;
24674
24741
  }
24675
- const resolvedPackageVersion = "0.5.344";
24742
+ const resolvedPackageVersion = "0.5.346";
24676
24743
  const PACKAGE_VERSION = resolvedPackageVersion;
24677
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.344";
24744
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.346";
24678
24745
  const roundParityValue = (value) => {
24679
24746
  if (typeof value !== "number") return value;
24680
24747
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25488,7 +25555,7 @@ class PixldocsRenderer {
25488
25555
  await this.waitForCanvasScene(container, cloned, i);
25489
25556
  }
25490
25557
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25491
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-DslpfbFV.cjs"));
25558
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-DRpVTciP.cjs"));
25492
25559
  const prepared = preparePagesForExport(
25493
25560
  cloned.pages,
25494
25561
  canvasWidth,
@@ -27808,7 +27875,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27808
27875
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27809
27876
  sanitizeSvgTreeForPdf(svgToDraw);
27810
27877
  try {
27811
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-DslpfbFV.cjs"));
27878
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-DRpVTciP.cjs"));
27812
27879
  try {
27813
27880
  await logTextMeasurementDiagnostic(svgToDraw);
27814
27881
  } catch {
@@ -28205,4 +28272,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
28205
28272
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
28206
28273
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
28207
28274
  exports.warmTemplateFromForm = warmTemplateFromForm;
28208
- //# sourceMappingURL=index-Byw3hiCQ.cjs.map
28275
+ //# sourceMappingURL=index-C6VMQJMY.cjs.map