@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.
@@ -12327,6 +12327,7 @@ const PageCanvas = forwardRef(
12327
12327
  selectionLeft: rect.left,
12328
12328
  selectionTop: rect.top
12329
12329
  };
12330
+ prepareGroupSelectionTransformStart(active);
12330
12331
  }
12331
12332
  if (fabricCanvas._currentTransform) {
12332
12333
  fabricCanvas.__isUserTransforming = true;
@@ -14462,7 +14463,7 @@ const PageCanvas = forwardRef(
14462
14463
  });
14463
14464
  let cropGroupSaveTimer = null;
14464
14465
  fabricCanvas.on("object:modified", (e) => {
14465
- var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j;
14466
+ var _a2, _b2, _c, _d, _e, _f, _g, _h, _i, _j, _k;
14466
14467
  try {
14467
14468
  dragStarted = false;
14468
14469
  setGuides([]);
@@ -14970,9 +14971,8 @@ const PageCanvas = forwardRef(
14970
14971
  }
14971
14972
  if (!isActiveSelectionSideResize && !hadScale && !hadRotation && (Math.abs(deltaX) > 0.1 || Math.abs(deltaY) > 0.1)) {
14972
14973
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14973
- const newLeft = (groupToMove.left ?? 0) + deltaX;
14974
- const newTop = (groupToMove.top ?? 0) + deltaY;
14975
- updateNodeStore(groupToMove.id, { left: newLeft, top: newTop }, { recordHistory: false, skipLayoutRecalc: true });
14974
+ const storePos = absoluteToStorePosition(movedGroupLeft, movedGroupTop, groupToMove.id, pageChildren2);
14975
+ updateNodeStore(groupToMove.id, { left: storePos.left, top: storePos.top }, { recordHistory: false, skipLayoutRecalc: true });
14976
14976
  commitHistoryStore();
14977
14977
  pendingGroupDrillInRef.current = null;
14978
14978
  fabricCanvas.__activeEditingGroupId = null;
@@ -15012,6 +15012,37 @@ 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 logicalGroupNodeForBake = logicalGroupSelectionId ? findNodeById(pageChildren2, logicalGroupSelectionId) : null;
15018
+ const asAngleForBake = isLogicalGroupAS && activeObj ? normalizeAngle(Number((logicalGroupNodeForBake == null ? void 0 : logicalGroupNodeForBake.angle) ?? activeObj.angle ?? 0)) : 0;
15019
+ const logicalGroupFinalFrame = (() => {
15020
+ var _a3;
15021
+ if (!isLogicalGroupAS || !logicalGroupSelectionId || !(activeObj instanceof fabric.ActiveSelection)) return null;
15022
+ const baseline = ((_a3 = groupSelectionTransformStartRef.current) == null ? void 0 : _a3.groupId) === logicalGroupSelectionId ? groupSelectionTransformStartRef.current : null;
15023
+ const localWidth = Math.max(1, (activeObj.width ?? (baseline == null ? void 0 : baseline.groupWidth) ?? 1) * Math.abs(activeObj.scaleX ?? 1));
15024
+ const localHeight = Math.max(1, (activeObj.height ?? (baseline == null ? void 0 : baseline.groupHeight) ?? 1) * Math.abs(activeObj.scaleY ?? 1));
15025
+ const center = activeObj.getCenterPoint();
15026
+ return {
15027
+ groupId: logicalGroupSelectionId,
15028
+ left: center.x - localWidth / 2,
15029
+ top: center.y - localHeight / 2,
15030
+ width: localWidth,
15031
+ height: localHeight,
15032
+ centerX: center.x,
15033
+ centerY: center.y,
15034
+ angle: asAngleForBake,
15035
+ matrix: fabric.util.composeMatrix({
15036
+ translateX: center.x,
15037
+ translateY: center.y,
15038
+ angle: asAngleForBake,
15039
+ scaleX: 1,
15040
+ scaleY: 1,
15041
+ skewX: 0,
15042
+ skewY: 0
15043
+ })
15044
+ };
15045
+ })();
15015
15046
  for (const obj of activeObjects) {
15016
15047
  const objId = getObjectId(obj);
15017
15048
  if (!objId || objId === "__background__") continue;
@@ -15102,6 +15133,7 @@ const PageCanvas = forwardRef(
15102
15133
  let finalAngle = decomposed.angle;
15103
15134
  let finalSkewX = decomposed.skewX;
15104
15135
  let finalSkewY = decomposed.skewY;
15136
+ let finalAngleFromDecomposed = true;
15105
15137
  if (obj instanceof fabric.Group && obj.__cropGroup) {
15106
15138
  const ct = obj.__cropData;
15107
15139
  if (ct) {
@@ -15164,6 +15196,7 @@ const PageCanvas = forwardRef(
15164
15196
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15165
15197
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15166
15198
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15199
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15167
15200
  }
15168
15201
  obj.set({ scaleX: 1, scaleY: 1 });
15169
15202
  const newSrc = renderSmartElementToDataUri(sourceElement.smartElementType, sourceElement.smartProps, bakedW, bakedH);
@@ -15231,6 +15264,7 @@ const PageCanvas = forwardRef(
15231
15264
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15232
15265
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15233
15266
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15267
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15234
15268
  }
15235
15269
  try {
15236
15270
  const angleRad = (finalAngle ?? 0) * Math.PI / 180;
@@ -15296,6 +15330,7 @@ const PageCanvas = forwardRef(
15296
15330
  finalAngle = (sourceElement == null ? void 0 : sourceElement.angle) ?? obj.angle ?? decomposed.angle;
15297
15331
  finalSkewX = (sourceElement == null ? void 0 : sourceElement.skewX) ?? obj.skewX ?? 0;
15298
15332
  finalSkewY = (sourceElement == null ? void 0 : sourceElement.skewY) ?? obj.skewY ?? 0;
15333
+ if ((sourceElement == null ? void 0 : sourceElement.angle) !== void 0 || obj.angle !== void 0) finalAngleFromDecomposed = false;
15299
15334
  }
15300
15335
  } else if (obj instanceof fabric.Textbox && isActiveSelection && (Math.abs((decomposed.scaleX ?? 1) - 1) > 1e-3 || Math.abs((decomposed.scaleY ?? 1) - 1) > 1e-3)) {
15301
15336
  const sx = Math.abs(decomposed.scaleX || 1);
@@ -15451,7 +15486,21 @@ const PageCanvas = forwardRef(
15451
15486
  const state = useEditorStore.getState();
15452
15487
  const page = state.canvas.pages.find((p) => p.id === pageId);
15453
15488
  const pageChildrenForSave = (page == null ? void 0 : page.children) ?? [];
15454
- const storePos = absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15489
+ const storePos = (logicalGroupFinalFrame == null ? void 0 : logicalGroupFinalFrame.groupId) === logicalGroupSelectionId ? (() => {
15490
+ const localCenter = fabric.util.transformPoint(
15491
+ new fabric.Point(decomposed.translateX ?? 0, decomposed.translateY ?? 0),
15492
+ fabric.util.invertTransform(logicalGroupFinalFrame.matrix)
15493
+ );
15494
+ const localAngle = finalAngleFromDecomposed ? ((Number(finalAngle ?? 0) - asAngleForBake) % 360 + 540) % 360 - 180 : Number(finalAngle ?? 0);
15495
+ const localAngleRad = localAngle * Math.PI / 180;
15496
+ return {
15497
+ left: localCenter.x - finalWidth / 2 * Math.cos(localAngleRad) + finalHeight / 2 * Math.sin(localAngleRad) + logicalGroupFinalFrame.width / 2,
15498
+ top: localCenter.y - finalWidth / 2 * Math.sin(localAngleRad) - finalHeight / 2 * Math.cos(localAngleRad) + logicalGroupFinalFrame.height / 2
15499
+ };
15500
+ })() : absoluteToStorePosition(absoluteLeft, absoluteTop, objId, pageChildrenForSave);
15501
+ if (isLogicalGroupAS && finalAngleFromDecomposed && typeof finalAngle === "number") {
15502
+ finalAngle = ((finalAngle - asAngleForBake) % 360 + 540) % 360 - 180;
15503
+ }
15455
15504
  const isLineObj = obj instanceof fabric.Line;
15456
15505
  const isAutoShrinkText = (sourceElement == null ? void 0 : sourceElement.type) === "text" && sourceElement.overflowPolicy === "auto-shrink";
15457
15506
  const autoShrinkStoredHeight = isAutoShrinkText ? sourceElement.height : void 0;
@@ -15513,7 +15562,25 @@ const PageCanvas = forwardRef(
15513
15562
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15514
15563
  obj.setCoords();
15515
15564
  }
15516
- const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15565
+ if (isLogicalGroupAS && logicalGroupSelectionId && activeObj instanceof fabric.ActiveSelection) {
15566
+ try {
15567
+ const pageChildrenForGroup = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15568
+ const groupNode = findNodeById(pageChildrenForGroup, logicalGroupSelectionId);
15569
+ if (groupNode && logicalGroupFinalFrame) {
15570
+ const storePosGroup = absoluteToStorePosition(logicalGroupFinalFrame.left, logicalGroupFinalFrame.top, logicalGroupSelectionId, pageChildrenForGroup);
15571
+ useEditorStore.getState().updateNode(logicalGroupSelectionId, {
15572
+ left: storePosGroup.left,
15573
+ top: storePosGroup.top,
15574
+ width: logicalGroupFinalFrame.width,
15575
+ height: logicalGroupFinalFrame.height,
15576
+ angle: logicalGroupFinalFrame.angle
15577
+ }, { recordHistory: false, skipLayoutRecalc: true });
15578
+ }
15579
+ } catch (err) {
15580
+ console.warn("[Pixldocs] logical-group envelope persist failed", err);
15581
+ }
15582
+ }
15583
+ const pageChildrenForReflow = ((_k = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _k.children) ?? [];
15517
15584
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15518
15585
  for (const id of modifiedIdsThisRound) {
15519
15586
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -24654,9 +24721,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24654
24721
  }
24655
24722
  return svgString;
24656
24723
  }
24657
- const resolvedPackageVersion = "0.5.344";
24724
+ const resolvedPackageVersion = "0.5.346";
24658
24725
  const PACKAGE_VERSION = resolvedPackageVersion;
24659
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.344";
24726
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.346";
24660
24727
  const roundParityValue = (value) => {
24661
24728
  if (typeof value !== "number") return value;
24662
24729
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25470,7 +25537,7 @@ class PixldocsRenderer {
25470
25537
  await this.waitForCanvasScene(container, cloned, i);
25471
25538
  }
25472
25539
  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");
25540
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-Bbi4foK-.js");
25474
25541
  const prepared = preparePagesForExport(
25475
25542
  cloned.pages,
25476
25543
  canvasWidth,
@@ -27790,7 +27857,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27790
27857
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27791
27858
  sanitizeSvgTreeForPdf(svgToDraw);
27792
27859
  try {
27793
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-C2_f1pzv.js");
27860
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-Bbi4foK-.js");
27794
27861
  try {
27795
27862
  await logTextMeasurementDiagnostic(svgToDraw);
27796
27863
  } catch {
@@ -28190,4 +28257,4 @@ export {
28190
28257
  buildTeaserBlurFlatKeys as y,
28191
28258
  collectFontDescriptorsFromConfig as z
28192
28259
  };
28193
- //# sourceMappingURL=index-C-BVebqn.js.map
28260
+ //# sourceMappingURL=index-Jiw7-9ee.js.map