@pixldocs/canvas-renderer 0.5.337 → 0.5.339

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.
@@ -11360,10 +11360,20 @@ const PageCanvas = react.forwardRef(
11360
11360
  const [ready, setReady] = react.useState(false);
11361
11361
  const [unlockRequestId, setUnlockRequestId] = react.useState(0);
11362
11362
  const applyLogicalGroupSelectionVisualState = react.useCallback((selection, groupId) => {
11363
- var _a2;
11363
+ var _a2, _b2;
11364
11364
  selection.__pixldocsGroupSelection = groupId;
11365
11365
  delete selection.__pixldocsLogicalGroupIds;
11366
11366
  selection.hasBorders = true;
11367
+ try {
11368
+ const pageChildren2 = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
11369
+ const groupNode = findNodeById(pageChildren2, groupId);
11370
+ const groupAngle = groupNode && isGroup(groupNode) ? Number(groupNode.angle ?? 0) : 0;
11371
+ if (Number.isFinite(groupAngle) && Math.abs(groupAngle) > 0.01) {
11372
+ selection.set({ angle: groupAngle, scaleX: 1, scaleY: 1, skewX: 0, skewY: 0 });
11373
+ selection.setCoords();
11374
+ }
11375
+ } catch {
11376
+ }
11367
11377
  const members = selection.getObjects();
11368
11378
  for (const prev of suppressGroupMemberBordersRef.current) {
11369
11379
  if (members.includes(prev)) continue;
@@ -11387,7 +11397,7 @@ const PageCanvas = react.forwardRef(
11387
11397
  if (m.__pixldocsOrigHasControls === void 0) m.__pixldocsOrigHasControls = m.hasControls;
11388
11398
  m.hasBorders = false;
11389
11399
  m.hasControls = false;
11390
- if (m.__cropGroup || ((_a2 = m._ct) == null ? void 0 : _a2.isCropGroup)) {
11400
+ if (m.__cropGroup || ((_b2 = m._ct) == null ? void 0 : _b2.isCropGroup)) {
11391
11401
  if (m.__pixldocsOrigLockScalingX === void 0) {
11392
11402
  m.__pixldocsOrigLockScalingX = m.lockScalingX;
11393
11403
  m.__pixldocsOrigLockScalingY = m.lockScalingY;
@@ -11397,7 +11407,7 @@ const PageCanvas = react.forwardRef(
11397
11407
  }
11398
11408
  }
11399
11409
  applyWarpAwareSelectionBorders(selection);
11400
- }, []);
11410
+ }, [pageId]);
11401
11411
  const pageBoundsOptions = react.useMemo(
11402
11412
  () => ({ pageContentWidth: canvasWidth, pageContentHeight: canvasHeight }),
11403
11413
  [canvasWidth, canvasHeight]
@@ -13583,6 +13593,7 @@ const PageCanvas = react.forwardRef(
13583
13593
  });
13584
13594
  const markSimpleTransform = (e) => {
13585
13595
  if (!isActiveRef.current) return;
13596
+ prepareGroupSelectionTransformStart(e.target);
13586
13597
  markTransforming(e.target);
13587
13598
  };
13588
13599
  const getObjectFrameBoundsInSelection = (selection, obj, frameWidth, frameHeight) => {
@@ -14840,6 +14851,11 @@ const PageCanvas = react.forwardRef(
14840
14851
  }
14841
14852
  }
14842
14853
  const isActiveSelectionSideResize = isActiveSelection && (activeSelectionResizeHandle === "ml" || activeSelectionResizeHandle === "mr" || activeSelectionResizeHandle === "mt" || activeSelectionResizeHandle === "mb");
14854
+ const normalizeAngle = (angle) => (angle % 360 + 360) % 360;
14855
+ const shortestAngleDelta = (a, b) => {
14856
+ const diff = Math.abs(normalizeAngle(a) - normalizeAngle(b));
14857
+ return Math.min(diff, 360 - diff);
14858
+ };
14843
14859
  if (selectedElementIds.length > 0) {
14844
14860
  const firstObj = activeObjects[0];
14845
14861
  const firstId = getObjectId(firstObj);
@@ -14903,12 +14919,9 @@ const PageCanvas = react.forwardRef(
14903
14919
  const deltaY = movedGroupTop - groupAbs.top;
14904
14920
  const hadResizeHandle = isActiveSelection && !!activeSelectionResizeHandle;
14905
14921
  const hadScale = isActiveSelection && activeObj && (hadResizeHandle || Math.abs((activeObj.scaleX ?? 1) - 1) > 0.01 || Math.abs((activeObj.scaleY ?? 1) - 1) > 0.01);
14906
- const startSelAngle = (((transformStart == null ? void 0 : transformStart.selectionAngle) ?? 0) % 360 + 360) % 360;
14907
- const currentSelAngle = isActiveSelection && activeObj ? ((activeObj.angle ?? 0) % 360 + 360) % 360 : 0;
14908
- const angleDelta = Math.min(
14909
- Math.abs(currentSelAngle - startSelAngle),
14910
- 360 - Math.abs(currentSelAngle - startSelAngle)
14911
- );
14922
+ const startSelAngle = normalizeAngle((transformStart == null ? void 0 : transformStart.selectionAngle) ?? 0);
14923
+ const currentSelAngle = isActiveSelection && activeObj ? normalizeAngle(activeObj.angle ?? 0) : 0;
14924
+ const angleDelta = shortestAngleDelta(currentSelAngle, startSelAngle);
14912
14925
  const hadRotation = isActiveSelection && activeObj && angleDelta > 0.01;
14913
14926
  if (!isActiveSelectionSideResize && !hadScale && !hadRotation && (Math.abs(deltaX) > 0.1 || Math.abs(deltaY) > 0.1)) {
14914
14927
  const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
@@ -14951,6 +14964,35 @@ const PageCanvas = react.forwardRef(
14951
14964
  unlockEditsSoon();
14952
14965
  return;
14953
14966
  }
14967
+ if (activeGroupSelectionId === groupToMove.id && hadRotation && !hadScale && !activeSelectionResizeHandle && activeObj instanceof fabric__namespace.ActiveSelection) {
14968
+ const { updateNode: updateNodeStore, commitHistory: commitHistoryStore, getCurrentElements } = useEditorStore.getState();
14969
+ const nextAngle = currentSelAngle;
14970
+ updateNodeStore(groupToMove.id, { angle: nextAngle }, { recordHistory: false, skipLayoutRecalc: true });
14971
+ commitHistoryStore();
14972
+ const groupSelectionId = activeGroupSelectionId;
14973
+ elementsRef.current = getCurrentElements();
14974
+ for (const obj of activeObjects) {
14975
+ const objId = getObjectId(obj);
14976
+ if (objId && objId !== "__background__") {
14977
+ justModifiedIdsRef.current.add(objId);
14978
+ modifiedIdsThisRound.add(objId);
14979
+ }
14980
+ }
14981
+ setTimeout(() => modifiedIdsThisRound.forEach((id) => justModifiedIdsRef.current.delete(id)), 150);
14982
+ groupSelectionTransformStartRef.current = null;
14983
+ activeSelectionMoveStartRef.current = null;
14984
+ activeSelectionResizeHandleRef.current = null;
14985
+ const rotateRestoreSnapshot = {
14986
+ memberIds: activeObjects.map((obj) => getObjectId(obj)).filter((id) => !!id && id !== "__background__"),
14987
+ groupSelectionId,
14988
+ expiresAt: Date.now() + 1200
14989
+ };
14990
+ recentGroupSelectionRestoreRef.current = rotateRestoreSnapshot;
14991
+ preserveActiveSelectionAfterTransformRef.current = rotateRestoreSnapshot;
14992
+ fabricCanvas.requestRenderAll();
14993
+ unlockEditsSoon();
14994
+ return;
14995
+ }
14954
14996
  }
14955
14997
  }
14956
14998
  const pendingCropGroupFrameBakes = [];
@@ -15466,7 +15508,8 @@ const PageCanvas = react.forwardRef(
15466
15508
  for (const gid of stackGroupsToReflow) {
15467
15509
  useEditorStore.getState().reflowStackGroupInPage(pageId, gid);
15468
15510
  }
15469
- if (activeObj instanceof fabric__namespace.ActiveSelection && activeObjects.length > 0) {
15511
+ const shouldRebuildActiveSelectionAfterPersist = activeObj instanceof fabric__namespace.ActiveSelection && (!!activeSelectionResizeHandle || pendingCropGroupFrameBakes.length > 0 || Math.abs((activeObj.scaleX ?? 1) - 1) > 1e-3 || Math.abs((activeObj.scaleY ?? 1) - 1) > 1e-3);
15512
+ if (activeObj instanceof fabric__namespace.ActiveSelection && activeObjects.length > 0 && shouldRebuildActiveSelectionAfterPersist) {
15470
15513
  const wasGroupSel = activeObj.__pixldocsGroupSelection;
15471
15514
  const membersToReselect = activeObjects.filter((o) => {
15472
15515
  const oid = getObjectId(o);
@@ -24595,9 +24638,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
24595
24638
  }
24596
24639
  return svgString;
24597
24640
  }
24598
- const resolvedPackageVersion = "0.5.337";
24641
+ const resolvedPackageVersion = "0.5.339";
24599
24642
  const PACKAGE_VERSION = resolvedPackageVersion;
24600
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.337";
24643
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.339";
24601
24644
  const roundParityValue = (value) => {
24602
24645
  if (typeof value !== "number") return value;
24603
24646
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25411,7 +25454,7 @@ class PixldocsRenderer {
25411
25454
  await this.waitForCanvasScene(container, cloned, i);
25412
25455
  }
25413
25456
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25414
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-11EJIk-M.cjs"));
25457
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-Dh2REogs.cjs"));
25415
25458
  const prepared = preparePagesForExport(
25416
25459
  cloned.pages,
25417
25460
  canvasWidth,
@@ -27731,7 +27774,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
27731
27774
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
27732
27775
  sanitizeSvgTreeForPdf(svgToDraw);
27733
27776
  try {
27734
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-11EJIk-M.cjs"));
27777
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-Dh2REogs.cjs"));
27735
27778
  try {
27736
27779
  await logTextMeasurementDiagnostic(svgToDraw);
27737
27780
  } catch {
@@ -28128,4 +28171,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
28128
28171
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
28129
28172
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
28130
28173
  exports.warmTemplateFromForm = warmTemplateFromForm;
28131
- //# sourceMappingURL=index-Ze4pswgN.cjs.map
28174
+ //# sourceMappingURL=index-BLwO7N0h.cjs.map