@pixldocs/canvas-renderer 0.5.402 → 0.5.404

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.
@@ -11502,8 +11502,8 @@ function applyWarpAwareSelectionBorders(selection) {
11502
11502
  let targetAngle = null;
11503
11503
  const isLogicalGroupSelection = !!selection.__pixldocsGroupSelection;
11504
11504
  const frozenGroupAngle = selection.__pixldocsFrozenGroupAngle;
11505
- if (isLogicalGroupSelection && typeof frozenGroupAngle === "number" && Math.abs(frozenGroupAngle) > 0.5) {
11506
- targetAngle = frozenGroupAngle;
11505
+ if (isLogicalGroupSelection) {
11506
+ targetAngle = typeof frozenGroupAngle === "number" ? frozenGroupAngle : 0;
11507
11507
  }
11508
11508
  if (targetAngle == null && dominant && Math.abs(dominant.angle) > 0.5 && // Canva-style: a *logical group* bbox is authoritative from the
11509
11509
  // persisted group.angle only. Individual child rotations must not
@@ -13237,7 +13237,7 @@ const PageCanvas = forwardRef(
13237
13237
  transformingIdsRef.current.clear();
13238
13238
  };
13239
13239
  const prepareGroupSelectionTransformStart = (target) => {
13240
- var _a2, _b2;
13240
+ var _a2, _b2, _c2;
13241
13241
  const active = target instanceof fabric.ActiveSelection ? target : fabricCanvas.getActiveObject();
13242
13242
  if (!(active instanceof fabric.ActiveSelection)) return;
13243
13243
  if (!activeSelectionMoveStartRef.current || activeSelectionMoveStartRef.current.selection !== active) {
@@ -13256,6 +13256,8 @@ const PageCanvas = forwardRef(
13256
13256
  if (!groupNode) return;
13257
13257
  const groupAbs = getAbsoluteBounds(groupNode, pageChildren2);
13258
13258
  const rect = active.getBoundingRect();
13259
+ const currentTransform = fabricCanvas._currentTransform;
13260
+ const originalSelectionAngle = (currentTransform == null ? void 0 : currentTransform.target) === active && typeof ((_c2 = currentTransform == null ? void 0 : currentTransform.original) == null ? void 0 : _c2.angle) === "number" ? currentTransform.original.angle : active.angle ?? 0;
13259
13261
  groupSelectionTransformStartRef.current = {
13260
13262
  groupId,
13261
13263
  selection: active,
@@ -13263,7 +13265,8 @@ const PageCanvas = forwardRef(
13263
13265
  selectionTop: rect.top,
13264
13266
  groupLeft: groupAbs.left,
13265
13267
  groupTop: groupAbs.top,
13266
- selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
13268
+ selectionAngle: (originalSelectionAngle % 360 + 360) % 360,
13269
+ groupAngle: isGroup(groupNode) ? groupNode.angle ?? 0 : 0
13267
13270
  };
13268
13271
  logRotDriftSelectionSnapshot("transform-start", active, {
13269
13272
  time: Math.round(performance.now()),
@@ -13696,6 +13699,7 @@ const PageCanvas = forwardRef(
13696
13699
  fabricCanvas.__isUserTransforming = true;
13697
13700
  syncLockedRef.current = true;
13698
13701
  lockEdits();
13702
+ prepareGroupSelectionTransformStart(opt.target ?? null);
13699
13703
  }
13700
13704
  let target = opt.target;
13701
13705
  let targetId = target ? getObjectId(target) : null;
@@ -14387,6 +14391,14 @@ const PageCanvas = forwardRef(
14387
14391
  const asRect0 = obj.getBoundingRect();
14388
14392
  let didReflowTextChild = false;
14389
14393
  for (const child of obj.getObjects()) {
14394
+ const childLocalAngle = child.__asLiveOrigAngle != null ? child.__asLiveOrigAngle : child.angle ?? 0;
14395
+ const isRotatedChild = Math.abs((childLocalAngle % 360 + 360) % 360) > 0.5 && Math.abs((childLocalAngle % 360 + 360) % 360 - 360) > 0.5;
14396
+ if (isRotatedChild) {
14397
+ if (child.__asLiveOrigAngle == null) {
14398
+ child.__asLiveOrigAngle = child.angle ?? 0;
14399
+ }
14400
+ continue;
14401
+ }
14390
14402
  if (child instanceof fabric.Group && (child.__cropGroup || ((_f = child._ct) == null ? void 0 : _f.isCropGroup))) {
14391
14403
  const ct = child.__cropData;
14392
14404
  if (!ct) continue;
@@ -14809,6 +14821,7 @@ const PageCanvas = forwardRef(
14809
14821
  markSimpleTransform(e);
14810
14822
  didTransformRef.current = true;
14811
14823
  const tr = e.target;
14824
+ prepareGroupSelectionTransformStart(tr);
14812
14825
  if (shouldLogRotDriftLiveTick(tr, "rotating")) {
14813
14826
  logRotDriftSelectionSnapshot("rotating", tr, {
14814
14827
  time: Math.round(performance.now()),
@@ -14921,7 +14934,7 @@ const PageCanvas = forwardRef(
14921
14934
  });
14922
14935
  let cropGroupSaveTimer = null;
14923
14936
  fabricCanvas.on("object:modified", (e) => {
14924
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j;
14937
+ var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k;
14925
14938
  try {
14926
14939
  if (suppressObjectModifiedDuringInternalReselectRef.current) return;
14927
14940
  dragStarted = false;
@@ -14947,13 +14960,16 @@ const PageCanvas = forwardRef(
14947
14960
  const t = e.target;
14948
14961
  if (t instanceof fabric.ActiveSelection) {
14949
14962
  const gid = t.__pixldocsGroupSelection;
14950
- const delta = ((t.angle ?? 0) + 360) % 360;
14963
+ const transformStart = gid && ((_a2 = groupSelectionTransformStartRef.current) == null ? void 0 : _a2.groupId) === gid && groupSelectionTransformStartRef.current.selection === t ? groupSelectionTransformStartRef.current : null;
14964
+ const current = ((t.angle ?? 0) % 360 + 360) % 360;
14965
+ const start = (((transformStart == null ? void 0 : transformStart.selectionAngle) ?? (transformStart == null ? void 0 : transformStart.groupAngle) ?? 0) % 360 + 360) % 360;
14966
+ const delta = ((current - start) % 360 + 360) % 360;
14951
14967
  const deltaSigned = delta > 180 ? delta - 360 : delta;
14952
14968
  if (gid && Math.abs(deltaSigned) > 0.01) {
14953
14969
  const pageNow = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId);
14954
14970
  const node = pageNow ? findNodeById(pageNow.children ?? [], gid) : null;
14955
14971
  if (node && isGroup(node)) {
14956
- const prev = node.angle ?? 0;
14972
+ const prev = (transformStart == null ? void 0 : transformStart.groupAngle) ?? (node.angle ?? 0);
14957
14973
  const next = ((prev + deltaSigned) % 360 + 360) % 360;
14958
14974
  const nextSigned = next > 180 ? next - 360 : next;
14959
14975
  useEditorStore.getState().updateNode(
@@ -14992,7 +15008,7 @@ const PageCanvas = forwardRef(
14992
15008
  const active = fabricCanvas.getActiveObject();
14993
15009
  const activeId = active ? getObjectId(active) : null;
14994
15010
  if (active && activeId && activeId !== "__background__" && !(active instanceof fabric.Group)) {
14995
- const pageChildrenForParent = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
15011
+ const pageChildrenForParent = ((_b2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
14996
15012
  const parentGroup = findParentGroup(pageChildrenForParent, activeId);
14997
15013
  if (parentGroup && isGroup(parentGroup) && parentGroup.backgroundColor) {
14998
15014
  let fabricSectionGroup = active.group && active.group instanceof fabric.Group ? active.group : null;
@@ -15074,7 +15090,7 @@ const PageCanvas = forwardRef(
15074
15090
  useEditorStore.getState().reflowStackGroupInPage(pageId, groupId);
15075
15091
  }
15076
15092
  const stateAfter = useEditorStore.getState();
15077
- const pageAfter = ((_b2 = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
15093
+ const pageAfter = ((_c2 = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c2.children) ?? [];
15078
15094
  const groupNodeAfter = findNodeById(pageAfter, groupId);
15079
15095
  if (groupNodeAfter) {
15080
15096
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -15136,7 +15152,7 @@ const PageCanvas = forwardRef(
15136
15152
  }
15137
15153
  if (active && active instanceof fabric.Group && active.__docuforgeSectionGroup && getObjectId(active)) {
15138
15154
  const groupId = getObjectId(active);
15139
- const pageChildrenSec = ((_c2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c2.children) ?? [];
15155
+ const pageChildrenSec = ((_d = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
15140
15156
  const modifiedTarget2 = e == null ? void 0 : e.target;
15141
15157
  const resizeScaleTarget = lastResizeScaleTargetRef.current;
15142
15158
  lastResizeScaleTargetRef.current = null;
@@ -15167,7 +15183,7 @@ const PageCanvas = forwardRef(
15167
15183
  const node = findNodeById(pageChildrenSec, groupId);
15168
15184
  if (isChildModified && node && !groupMoved) {
15169
15185
  const stateAfter = useEditorStore.getState();
15170
- const pageAfter = ((_d = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
15186
+ const pageAfter = ((_e = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
15171
15187
  const groupNodeAfter = findNodeById(pageAfter, groupId);
15172
15188
  if (groupNodeAfter) {
15173
15189
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -15183,7 +15199,7 @@ const PageCanvas = forwardRef(
15183
15199
  }
15184
15200
  if (active && active instanceof fabric.Group && !(active instanceof fabric.ActiveSelection) && getObjectId(active)) {
15185
15201
  const groupId = getObjectId(active);
15186
- const pageChildren3 = ((_e = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
15202
+ const pageChildren3 = ((_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
15187
15203
  const w = (active.width ?? 0) * (active.scaleX ?? 1);
15188
15204
  const h = (active.height ?? 0) * (active.scaleY ?? 1);
15189
15205
  const centerX = active.left ?? 0;
@@ -15205,7 +15221,7 @@ const PageCanvas = forwardRef(
15205
15221
  }
15206
15222
  const activeObj = fabricCanvas.getActiveObject();
15207
15223
  let activeObjects = fabricCanvas.getActiveObjects();
15208
- const activeSelectionMoveStart = activeObj instanceof fabric.ActiveSelection && ((_f = activeSelectionMoveStartRef.current) == null ? void 0 : _f.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
15224
+ const activeSelectionMoveStart = activeObj instanceof fabric.ActiveSelection && ((_g = activeSelectionMoveStartRef.current) == null ? void 0 : _g.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
15209
15225
  const activeSelectionDelta = activeObj instanceof fabric.ActiveSelection && activeSelectionMoveStart ? (() => {
15210
15226
  const rect = activeObj.getBoundingRect();
15211
15227
  return {
@@ -15597,7 +15613,7 @@ const PageCanvas = forwardRef(
15597
15613
  const localScaleX = 1 / sx;
15598
15614
  const localScaleY = 1 / sy;
15599
15615
  obj.set({ scaleX: localScaleX, scaleY: localScaleY });
15600
- const selectionMatrix = (_g = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _g.call(activeObj);
15616
+ const selectionMatrix = (_h = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _h.call(activeObj);
15601
15617
  const localCenter = selectionMatrix ? fabric.util.transformPoint(preBakeCenter, fabric.util.invertTransform(selectionMatrix)) : preBakeCenter;
15602
15618
  const localWidth = bakedW * localScaleX;
15603
15619
  const localHeight = bakedH * localScaleY;
@@ -15722,7 +15738,7 @@ const PageCanvas = forwardRef(
15722
15738
  const localScaleX = 1 / sx;
15723
15739
  const localScaleY = 1 / sy;
15724
15740
  obj.set({ scaleX: localScaleX, scaleY: localScaleY });
15725
- const selectionMatrix = (_h = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _h.call(activeObj);
15741
+ const selectionMatrix = (_i = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _i.call(activeObj);
15726
15742
  const localCenter = selectionMatrix ? fabric.util.transformPoint(preBakeCenter, fabric.util.invertTransform(selectionMatrix)) : preBakeCenter;
15727
15743
  const localWidth = bakedWidth * localScaleX;
15728
15744
  const localHeight = (obj.height ?? intrinsicHeight) * localScaleY;
@@ -15930,7 +15946,7 @@ const PageCanvas = forwardRef(
15930
15946
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15931
15947
  obj.setCoords();
15932
15948
  }
15933
- const pageChildrenForReflow = ((_i = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _i.children) ?? [];
15949
+ const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15934
15950
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15935
15951
  for (const id of modifiedIdsThisRound) {
15936
15952
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -16009,7 +16025,7 @@ const PageCanvas = forwardRef(
16009
16025
  }
16010
16026
  fabricCanvas.setActiveObject(newSel);
16011
16027
  try {
16012
- (_j = newSel.triggerLayout) == null ? void 0 : _j.call(newSel);
16028
+ (_k = newSel.triggerLayout) == null ? void 0 : _k.call(newSel);
16013
16029
  } catch {
16014
16030
  }
16015
16031
  try {
@@ -25119,9 +25135,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
25119
25135
  }
25120
25136
  return svgString;
25121
25137
  }
25122
- const resolvedPackageVersion = "0.5.402";
25138
+ const resolvedPackageVersion = "0.5.404";
25123
25139
  const PACKAGE_VERSION = resolvedPackageVersion;
25124
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.402";
25140
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.404";
25125
25141
  const roundParityValue = (value) => {
25126
25142
  if (typeof value !== "number") return value;
25127
25143
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25935,7 +25951,7 @@ class PixldocsRenderer {
25935
25951
  await this.waitForCanvasScene(container, cloned, i);
25936
25952
  }
25937
25953
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25938
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-Bo_XOpSd.js");
25954
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-CWHd6dnp.js");
25939
25955
  const prepared = preparePagesForExport(
25940
25956
  cloned.pages,
25941
25957
  canvasWidth,
@@ -28255,7 +28271,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
28255
28271
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
28256
28272
  sanitizeSvgTreeForPdf(svgToDraw);
28257
28273
  try {
28258
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-Bo_XOpSd.js");
28274
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-CWHd6dnp.js");
28259
28275
  try {
28260
28276
  await logTextMeasurementDiagnostic(svgToDraw);
28261
28277
  } catch {
@@ -28655,4 +28671,4 @@ export {
28655
28671
  buildTeaserBlurFlatKeys as y,
28656
28672
  collectFontDescriptorsFromConfig as z
28657
28673
  };
28658
- //# sourceMappingURL=index-CF2nx5LE.js.map
28674
+ //# sourceMappingURL=index-FljS6ssY.js.map