@pixldocs/canvas-renderer 0.5.401 → 0.5.403

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.
@@ -11520,15 +11520,17 @@ function applyWarpAwareSelectionBorders(selection) {
11520
11520
  let targetAngle = null;
11521
11521
  const isLogicalGroupSelection = !!selection.__pixldocsGroupSelection;
11522
11522
  const frozenGroupAngle = selection.__pixldocsFrozenGroupAngle;
11523
- if (isLogicalGroupSelection && typeof frozenGroupAngle === "number" && Math.abs(frozenGroupAngle) > 0.5) {
11524
- targetAngle = frozenGroupAngle;
11525
- }
11526
- if (targetAngle == null && dominant && Math.abs(dominant.angle) > 0.5 && // Dominant-angle alignment is required to keep side-handle resize
11527
- // shear-free on rotated children. Without it, Fabric's AS drags
11528
- // along world X/Y while rotated children render in their local
11529
- // frame visible skew. Frozen group angle (when persisted) takes
11530
- // priority above; otherwise fall back to dominant.
11531
- (isLogicalGroupSelection || kids.length === 1 || dominant.count >= 2 || dominant.count === kids.length)) {
11523
+ if (isLogicalGroupSelection) {
11524
+ targetAngle = typeof frozenGroupAngle === "number" ? frozenGroupAngle : 0;
11525
+ }
11526
+ if (targetAngle == null && dominant && Math.abs(dominant.angle) > 0.5 && // Canva-style: a *logical group* bbox is authoritative from the
11527
+ // persisted group.angle only. Individual child rotations must not
11528
+ // drift the group's selection bbox angle. The per-child rotation-
11529
+ // aware reflow (S^-1·R(θ) decomposition) keeps side-handle drags
11530
+ // shear-free on rotated text/image/crop-group kids without needing
11531
+ // the AS itself to tilt.
11532
+ // Ad-hoc multi-select (non-logical) still aligns to dominant.
11533
+ (!isLogicalGroupSelection && (kids.length === 1 || dominant.count >= 2 || dominant.count === kids.length))) {
11532
11534
  targetAngle = dominant.angle;
11533
11535
  }
11534
11536
  if (targetAngle != null) {
@@ -13253,7 +13255,7 @@ const PageCanvas = react.forwardRef(
13253
13255
  transformingIdsRef.current.clear();
13254
13256
  };
13255
13257
  const prepareGroupSelectionTransformStart = (target) => {
13256
- var _a2, _b2;
13258
+ var _a2, _b2, _c2;
13257
13259
  const active = target instanceof fabric__namespace.ActiveSelection ? target : fabricCanvas.getActiveObject();
13258
13260
  if (!(active instanceof fabric__namespace.ActiveSelection)) return;
13259
13261
  if (!activeSelectionMoveStartRef.current || activeSelectionMoveStartRef.current.selection !== active) {
@@ -13272,6 +13274,8 @@ const PageCanvas = react.forwardRef(
13272
13274
  if (!groupNode) return;
13273
13275
  const groupAbs = getAbsoluteBounds(groupNode, pageChildren2);
13274
13276
  const rect = active.getBoundingRect();
13277
+ const currentTransform = fabricCanvas._currentTransform;
13278
+ 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;
13275
13279
  groupSelectionTransformStartRef.current = {
13276
13280
  groupId,
13277
13281
  selection: active,
@@ -13279,7 +13283,8 @@ const PageCanvas = react.forwardRef(
13279
13283
  selectionTop: rect.top,
13280
13284
  groupLeft: groupAbs.left,
13281
13285
  groupTop: groupAbs.top,
13282
- selectionAngle: ((active.angle ?? 0) % 360 + 360) % 360
13286
+ selectionAngle: (originalSelectionAngle % 360 + 360) % 360,
13287
+ groupAngle: isGroup(groupNode) ? groupNode.angle ?? 0 : 0
13283
13288
  };
13284
13289
  logRotDriftSelectionSnapshot("transform-start", active, {
13285
13290
  time: Math.round(performance.now()),
@@ -13712,6 +13717,7 @@ const PageCanvas = react.forwardRef(
13712
13717
  fabricCanvas.__isUserTransforming = true;
13713
13718
  syncLockedRef.current = true;
13714
13719
  lockEdits();
13720
+ prepareGroupSelectionTransformStart(opt.target ?? null);
13715
13721
  }
13716
13722
  let target = opt.target;
13717
13723
  let targetId = target ? getObjectId(target) : null;
@@ -14825,6 +14831,7 @@ const PageCanvas = react.forwardRef(
14825
14831
  markSimpleTransform(e);
14826
14832
  didTransformRef.current = true;
14827
14833
  const tr = e.target;
14834
+ prepareGroupSelectionTransformStart(tr);
14828
14835
  if (shouldLogRotDriftLiveTick(tr, "rotating")) {
14829
14836
  logRotDriftSelectionSnapshot("rotating", tr, {
14830
14837
  time: Math.round(performance.now()),
@@ -14937,7 +14944,7 @@ const PageCanvas = react.forwardRef(
14937
14944
  });
14938
14945
  let cropGroupSaveTimer = null;
14939
14946
  fabricCanvas.on("object:modified", (e) => {
14940
- var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j;
14947
+ var _a2, _b2, _c2, _d, _e, _f, _g, _h, _i, _j, _k;
14941
14948
  try {
14942
14949
  if (suppressObjectModifiedDuringInternalReselectRef.current) return;
14943
14950
  dragStarted = false;
@@ -14963,13 +14970,16 @@ const PageCanvas = react.forwardRef(
14963
14970
  const t = e.target;
14964
14971
  if (t instanceof fabric__namespace.ActiveSelection) {
14965
14972
  const gid = t.__pixldocsGroupSelection;
14966
- const delta = ((t.angle ?? 0) + 360) % 360;
14973
+ const transformStart = gid && ((_a2 = groupSelectionTransformStartRef.current) == null ? void 0 : _a2.groupId) === gid && groupSelectionTransformStartRef.current.selection === t ? groupSelectionTransformStartRef.current : null;
14974
+ const current = ((t.angle ?? 0) % 360 + 360) % 360;
14975
+ const start = (((transformStart == null ? void 0 : transformStart.selectionAngle) ?? (transformStart == null ? void 0 : transformStart.groupAngle) ?? 0) % 360 + 360) % 360;
14976
+ const delta = ((current - start) % 360 + 360) % 360;
14967
14977
  const deltaSigned = delta > 180 ? delta - 360 : delta;
14968
14978
  if (gid && Math.abs(deltaSigned) > 0.01) {
14969
14979
  const pageNow = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId);
14970
14980
  const node = pageNow ? findNodeById(pageNow.children ?? [], gid) : null;
14971
14981
  if (node && isGroup(node)) {
14972
- const prev = node.angle ?? 0;
14982
+ const prev = (transformStart == null ? void 0 : transformStart.groupAngle) ?? (node.angle ?? 0);
14973
14983
  const next = ((prev + deltaSigned) % 360 + 360) % 360;
14974
14984
  const nextSigned = next > 180 ? next - 360 : next;
14975
14985
  useEditorStore.getState().updateNode(
@@ -15008,7 +15018,7 @@ const PageCanvas = react.forwardRef(
15008
15018
  const active = fabricCanvas.getActiveObject();
15009
15019
  const activeId = active ? getObjectId(active) : null;
15010
15020
  if (active && activeId && activeId !== "__background__" && !(active instanceof fabric__namespace.Group)) {
15011
- const pageChildrenForParent = ((_a2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _a2.children) ?? [];
15021
+ const pageChildrenForParent = ((_b2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
15012
15022
  const parentGroup = findParentGroup(pageChildrenForParent, activeId);
15013
15023
  if (parentGroup && isGroup(parentGroup) && parentGroup.backgroundColor) {
15014
15024
  let fabricSectionGroup = active.group && active.group instanceof fabric__namespace.Group ? active.group : null;
@@ -15090,7 +15100,7 @@ const PageCanvas = react.forwardRef(
15090
15100
  useEditorStore.getState().reflowStackGroupInPage(pageId, groupId);
15091
15101
  }
15092
15102
  const stateAfter = useEditorStore.getState();
15093
- const pageAfter = ((_b2 = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _b2.children) ?? [];
15103
+ const pageAfter = ((_c2 = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c2.children) ?? [];
15094
15104
  const groupNodeAfter = findNodeById(pageAfter, groupId);
15095
15105
  if (groupNodeAfter) {
15096
15106
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -15152,7 +15162,7 @@ const PageCanvas = react.forwardRef(
15152
15162
  }
15153
15163
  if (active && active instanceof fabric__namespace.Group && active.__docuforgeSectionGroup && getObjectId(active)) {
15154
15164
  const groupId = getObjectId(active);
15155
- const pageChildrenSec = ((_c2 = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _c2.children) ?? [];
15165
+ const pageChildrenSec = ((_d = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
15156
15166
  const modifiedTarget2 = e == null ? void 0 : e.target;
15157
15167
  const resizeScaleTarget = lastResizeScaleTargetRef.current;
15158
15168
  lastResizeScaleTargetRef.current = null;
@@ -15183,7 +15193,7 @@ const PageCanvas = react.forwardRef(
15183
15193
  const node = findNodeById(pageChildrenSec, groupId);
15184
15194
  if (isChildModified && node && !groupMoved) {
15185
15195
  const stateAfter = useEditorStore.getState();
15186
- const pageAfter = ((_d = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _d.children) ?? [];
15196
+ const pageAfter = ((_e = stateAfter.canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
15187
15197
  const groupNodeAfter = findNodeById(pageAfter, groupId);
15188
15198
  if (groupNodeAfter) {
15189
15199
  const abs = getAbsoluteBounds(groupNodeAfter, pageAfter);
@@ -15199,7 +15209,7 @@ const PageCanvas = react.forwardRef(
15199
15209
  }
15200
15210
  if (active && active instanceof fabric__namespace.Group && !(active instanceof fabric__namespace.ActiveSelection) && getObjectId(active)) {
15201
15211
  const groupId = getObjectId(active);
15202
- const pageChildren3 = ((_e = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _e.children) ?? [];
15212
+ const pageChildren3 = ((_f = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _f.children) ?? [];
15203
15213
  const w = (active.width ?? 0) * (active.scaleX ?? 1);
15204
15214
  const h = (active.height ?? 0) * (active.scaleY ?? 1);
15205
15215
  const centerX = active.left ?? 0;
@@ -15221,7 +15231,7 @@ const PageCanvas = react.forwardRef(
15221
15231
  }
15222
15232
  const activeObj = fabricCanvas.getActiveObject();
15223
15233
  let activeObjects = fabricCanvas.getActiveObjects();
15224
- const activeSelectionMoveStart = activeObj instanceof fabric__namespace.ActiveSelection && ((_f = activeSelectionMoveStartRef.current) == null ? void 0 : _f.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
15234
+ const activeSelectionMoveStart = activeObj instanceof fabric__namespace.ActiveSelection && ((_g = activeSelectionMoveStartRef.current) == null ? void 0 : _g.selection) === activeObj ? activeSelectionMoveStartRef.current : null;
15225
15235
  const activeSelectionDelta = activeObj instanceof fabric__namespace.ActiveSelection && activeSelectionMoveStart ? (() => {
15226
15236
  const rect = activeObj.getBoundingRect();
15227
15237
  return {
@@ -15613,7 +15623,7 @@ const PageCanvas = react.forwardRef(
15613
15623
  const localScaleX = 1 / sx;
15614
15624
  const localScaleY = 1 / sy;
15615
15625
  obj.set({ scaleX: localScaleX, scaleY: localScaleY });
15616
- const selectionMatrix = (_g = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _g.call(activeObj);
15626
+ const selectionMatrix = (_h = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _h.call(activeObj);
15617
15627
  const localCenter = selectionMatrix ? fabric__namespace.util.transformPoint(preBakeCenter, fabric__namespace.util.invertTransform(selectionMatrix)) : preBakeCenter;
15618
15628
  const localWidth = bakedW * localScaleX;
15619
15629
  const localHeight = bakedH * localScaleY;
@@ -15738,7 +15748,7 @@ const PageCanvas = react.forwardRef(
15738
15748
  const localScaleX = 1 / sx;
15739
15749
  const localScaleY = 1 / sy;
15740
15750
  obj.set({ scaleX: localScaleX, scaleY: localScaleY });
15741
- const selectionMatrix = (_h = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _h.call(activeObj);
15751
+ const selectionMatrix = (_i = activeObj == null ? void 0 : activeObj.calcTransformMatrix) == null ? void 0 : _i.call(activeObj);
15742
15752
  const localCenter = selectionMatrix ? fabric__namespace.util.transformPoint(preBakeCenter, fabric__namespace.util.invertTransform(selectionMatrix)) : preBakeCenter;
15743
15753
  const localWidth = bakedWidth * localScaleX;
15744
15754
  const localHeight = (obj.height ?? intrinsicHeight) * localScaleY;
@@ -15946,7 +15956,7 @@ const PageCanvas = react.forwardRef(
15946
15956
  updateElement(objId, elementUpdate, { recordHistory: false, skipLayoutRecalc: true });
15947
15957
  obj.setCoords();
15948
15958
  }
15949
- const pageChildrenForReflow = ((_i = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _i.children) ?? [];
15959
+ const pageChildrenForReflow = ((_j = useEditorStore.getState().canvas.pages.find((p) => p.id === pageId)) == null ? void 0 : _j.children) ?? [];
15950
15960
  const stackGroupsToReflow = /* @__PURE__ */ new Set();
15951
15961
  for (const id of modifiedIdsThisRound) {
15952
15962
  const parent = findParentGroup(pageChildrenForReflow, id);
@@ -16025,7 +16035,7 @@ const PageCanvas = react.forwardRef(
16025
16035
  }
16026
16036
  fabricCanvas.setActiveObject(newSel);
16027
16037
  try {
16028
- (_j = newSel.triggerLayout) == null ? void 0 : _j.call(newSel);
16038
+ (_k = newSel.triggerLayout) == null ? void 0 : _k.call(newSel);
16029
16039
  } catch {
16030
16040
  }
16031
16041
  try {
@@ -25135,9 +25145,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
25135
25145
  }
25136
25146
  return svgString;
25137
25147
  }
25138
- const resolvedPackageVersion = "0.5.401";
25148
+ const resolvedPackageVersion = "0.5.403";
25139
25149
  const PACKAGE_VERSION = resolvedPackageVersion;
25140
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.401";
25150
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.403";
25141
25151
  const roundParityValue = (value) => {
25142
25152
  if (typeof value !== "number") return value;
25143
25153
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25951,7 +25961,7 @@ class PixldocsRenderer {
25951
25961
  await this.waitForCanvasScene(container, cloned, i);
25952
25962
  }
25953
25963
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25954
- const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-B25ym_AP.cjs"));
25964
+ const { exportMultiPagePdf, preparePagesForExport } = await Promise.resolve().then(() => require("./vectorPdfExport-BevFDNWQ.cjs"));
25955
25965
  const prepared = preparePagesForExport(
25956
25966
  cloned.pages,
25957
25967
  canvasWidth,
@@ -28271,7 +28281,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
28271
28281
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
28272
28282
  sanitizeSvgTreeForPdf(svgToDraw);
28273
28283
  try {
28274
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-B25ym_AP.cjs"));
28284
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await Promise.resolve().then(() => require("./vectorPdfExport-BevFDNWQ.cjs"));
28275
28285
  try {
28276
28286
  await logTextMeasurementDiagnostic(svgToDraw);
28277
28287
  } catch {
@@ -28668,4 +28678,4 @@ exports.setAutoShrinkDebug = setAutoShrinkDebug;
28668
28678
  exports.setBundledAssetPrefixes = setBundledAssetPrefixes;
28669
28679
  exports.warmResolvedTemplateForPreview = warmResolvedTemplateForPreview;
28670
28680
  exports.warmTemplateFromForm = warmTemplateFromForm;
28671
- //# sourceMappingURL=index-DqOy3Wio.cjs.map
28681
+ //# sourceMappingURL=index-Bp9XxxF8.cjs.map