@pixldocs/canvas-renderer 0.5.407 → 0.5.409

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.
@@ -4947,7 +4947,7 @@ function getLocalDeltaStable(target, eventData) {
4947
4947
  target.__lastPointerForCrop = p;
4948
4948
  const dx = p.x - last.x;
4949
4949
  const dy = p.y - last.y;
4950
- const angle = fabric.util.degreesToRadians(target.angle || 0);
4950
+ const angle = fabric.util.degreesToRadians(getWorldAngleDeg(target));
4951
4951
  const cos = Math.cos(-angle);
4952
4952
  const sin = Math.sin(-angle);
4953
4953
  return {
@@ -4973,8 +4973,40 @@ function localDeltaToWorld(dx, dy, angleDeg) {
4973
4973
  y: dx * sin + dy * cos
4974
4974
  };
4975
4975
  }
4976
- function getOppositeAnchor(aCoords, corner) {
4977
- return corner === "br" ? aCoords.tl : corner === "bl" ? aCoords.tr : corner === "tr" ? aCoords.bl : aCoords.br;
4976
+ function getWorldAngleDeg(obj) {
4977
+ var _a2;
4978
+ try {
4979
+ if (typeof obj.getTotalAngle === "function") return obj.getTotalAngle() || 0;
4980
+ const matrix = (_a2 = obj.calcTransformMatrix) == null ? void 0 : _a2.call(obj);
4981
+ return matrix ? fabric.util.qrDecompose(matrix).angle || 0 : obj.angle || 0;
4982
+ } catch {
4983
+ return obj.angle || 0;
4984
+ }
4985
+ }
4986
+ function getWorldCenter(obj) {
4987
+ var _a2;
4988
+ try {
4989
+ const matrix = (_a2 = obj.calcTransformMatrix) == null ? void 0 : _a2.call(obj);
4990
+ if (matrix) {
4991
+ const decomposed = fabric.util.qrDecompose(matrix);
4992
+ return { x: decomposed.translateX || 0, y: decomposed.translateY || 0 };
4993
+ }
4994
+ } catch {
4995
+ }
4996
+ return { x: obj.left || 0, y: obj.top || 0 };
4997
+ }
4998
+ function setCenterFromWorld(obj, worldX, worldY) {
4999
+ const parent = obj.group;
5000
+ if (parent && typeof parent.calcTransformMatrix === "function") {
5001
+ try {
5002
+ const invParent = fabric.util.invertTransform(parent.calcTransformMatrix());
5003
+ const parentPoint = fabric.util.transformPoint({ x: worldX, y: worldY }, invParent);
5004
+ obj.set({ left: parentPoint.x, top: parentPoint.y, originX: "center", originY: "center" });
5005
+ return;
5006
+ } catch {
5007
+ }
5008
+ }
5009
+ obj.set({ left: worldX, top: worldY, originX: "center", originY: "center" });
4978
5010
  }
4979
5011
  function getCornerDefaultSigns(corner) {
4980
5012
  switch (corner) {
@@ -5018,44 +5050,50 @@ function resizeFrameFromCornerUniform(eventData, transform, _x, _y) {
5018
5050
  if (!canvas) return false;
5019
5051
  const e = getDomEvent(eventData);
5020
5052
  if (!e) return false;
5021
- const pointer = canvas.getPointer(e);
5022
- g.setCoords();
5023
- const a = g.aCoords;
5024
- if (!a) return false;
5025
5053
  const corner = transform.corner;
5026
- const anchor = getOppositeAnchor(a, corner);
5027
5054
  const defaultSigns = getCornerDefaultSigns(corner);
5028
5055
  const MIN_SIZE = 20;
5029
- const baseW = Math.max(MIN_SIZE, ct.frameW || g.width || 1);
5030
- const baseH = Math.max(MIN_SIZE, ct.frameH || g.height || 1);
5031
- const angle = g.angle || 0;
5032
- const deltaWorldX = pointer.x - anchor.x;
5033
- const deltaWorldY = pointer.y - anchor.y;
5034
- const localDelta = worldDeltaToLocal(deltaWorldX, deltaWorldY, angle);
5035
- const signX = Math.abs(localDelta.x) < 1e-3 ? defaultSigns.x : localDelta.x >= 0 ? 1 : -1;
5036
- const signY = Math.abs(localDelta.y) < 1e-3 ? defaultSigns.y : localDelta.y >= 0 ? 1 : -1;
5056
+ const pointer = canvas.getPointer(e);
5057
+ const angle = getWorldAngleDeg(g);
5058
+ const snapshot = g.__cornerResizeStart && g.__cornerResizeStart.corner === corner && g.__cornerResizeStart.transform === transform ? g.__cornerResizeStart : (() => {
5059
+ const center = getWorldCenter(g);
5060
+ const baseW = Math.max(MIN_SIZE, ct.frameW || g.width || 1);
5061
+ const baseH = Math.max(MIN_SIZE, ct.frameH || g.height || 1);
5062
+ const anchorLocal = { x: -defaultSigns.x * baseW / 2, y: -defaultSigns.y * baseH / 2 };
5063
+ const anchorWorld = localDeltaToWorld(anchorLocal.x, anchorLocal.y, angle);
5064
+ const snap = {
5065
+ corner,
5066
+ transform,
5067
+ angle,
5068
+ baseW,
5069
+ baseH,
5070
+ anchorX: center.x + anchorWorld.x,
5071
+ anchorY: center.y + anchorWorld.y,
5072
+ signX: defaultSigns.x,
5073
+ signY: defaultSigns.y
5074
+ };
5075
+ g.__cornerResizeStart = snap;
5076
+ return snap;
5077
+ })();
5078
+ const localDelta = worldDeltaToLocal(pointer.x - snapshot.anchorX, pointer.y - snapshot.anchorY, snapshot.angle);
5079
+ const signX = snapshot.signX;
5080
+ const signY = snapshot.signY;
5037
5081
  const rawW = Math.max(MIN_SIZE, Math.abs(localDelta.x));
5038
5082
  const rawH = Math.max(MIN_SIZE, Math.abs(localDelta.y));
5039
- const scaleFromW = rawW / baseW;
5040
- const scaleFromH = rawH / baseH;
5083
+ const scaleFromW = rawW / snapshot.baseW;
5084
+ const scaleFromH = rawH / snapshot.baseH;
5041
5085
  const s = Math.min(scaleFromW, scaleFromH);
5042
- const newW = Math.max(MIN_SIZE, baseW * s);
5043
- const newH = Math.max(MIN_SIZE, baseH * s);
5086
+ const newW = Math.max(MIN_SIZE, snapshot.baseW * s);
5087
+ const newH = Math.max(MIN_SIZE, snapshot.baseH * s);
5044
5088
  ct.frameW = newW;
5045
5089
  ct.frameH = newH;
5046
5090
  const centerLocal = {
5047
5091
  x: signX * (newW / 2),
5048
5092
  y: signY * (newH / 2)
5049
5093
  };
5050
- const centerWorld = localDeltaToWorld(centerLocal.x, centerLocal.y, angle);
5051
- g.set({
5052
- left: anchor.x + centerWorld.x,
5053
- top: anchor.y + centerWorld.y,
5054
- originX: "center",
5055
- originY: "center",
5056
- width: newW,
5057
- height: newH
5058
- });
5094
+ const centerWorld = localDeltaToWorld(centerLocal.x, centerLocal.y, snapshot.angle);
5095
+ setCenterFromWorld(g, snapshot.anchorX + centerWorld.x, snapshot.anchorY + centerWorld.y);
5096
+ g.set({ width: newW, height: newH });
5059
5097
  updateCoverLayout(g);
5060
5098
  canvas.requestRenderAll();
5061
5099
  return true;
@@ -5065,8 +5103,9 @@ function resizeFrameFromSide(g, side, localDx, localDy) {
5065
5103
  if (!ct) return;
5066
5104
  const minSize = 30;
5067
5105
  const moveCenterAlongLocalAxis = (obj, localX, localY) => {
5068
- const worldDelta = localDeltaToWorld(localX, localY, obj.angle || 0);
5069
- obj.set({ left: (obj.left || 0) + worldDelta.x, top: (obj.top || 0) + worldDelta.y });
5106
+ const center = getWorldCenter(obj);
5107
+ const worldDelta = localDeltaToWorld(localX, localY, getWorldAngleDeg(obj));
5108
+ setCenterFromWorld(obj, center.x + worldDelta.x, center.y + worldDelta.y);
5070
5109
  };
5071
5110
  if (side === "mr") {
5072
5111
  ct.frameW = Math.max(minSize, ct.frameW + localDx);
@@ -5101,6 +5140,7 @@ function installCanvaMaskControls(g) {
5101
5140
  };
5102
5141
  g.set(controlStyle);
5103
5142
  const notifyResizeSnap = (target, corner) => {
5143
+ if (target.group instanceof fabric.ActiveSelection) return;
5104
5144
  const handler = target.__resizeSnapHandler;
5105
5145
  if (typeof handler === "function") handler(target, corner);
5106
5146
  };
@@ -13251,19 +13291,13 @@ const PageCanvas = forwardRef(
13251
13291
  const liveDeltaY = Math.abs(rawScaleY / originalScaleY);
13252
13292
  const hasResidualOriginal = Math.abs(Math.abs(originalScaleX) - 1) > 1e-4 || Math.abs(Math.abs(originalScaleY) - 1) > 1e-4;
13253
13293
  const hasNoLiveDragDelta = Math.abs(liveDeltaX - 1) < 5e-4 && Math.abs(liveDeltaY - 1) < 5e-4;
13254
- const canBakeResidual = (ct == null ? void 0 : ct.target) === active ? hasResidualOriginal && hasNoLiveDragDelta : Math.abs(Math.abs(rawScaleX) - 1) > 1e-4 || Math.abs(Math.abs(rawScaleY) - 1) > 1e-4;
13255
- if (canBakeResidual) {
13256
- const asScaleX = Math.abs((ct == null ? void 0 : ct.target) === active ? originalScaleX : rawScaleX);
13257
- const asScaleY = Math.abs((ct == null ? void 0 : ct.target) === active ? originalScaleY : rawScaleY);
13258
- const newW = Math.max(1, (active.width ?? 0) * asScaleX);
13259
- const newH = Math.max(1, (active.height ?? 0) * asScaleY);
13260
- active.set({ width: newW, height: newH, scaleX: 1, scaleY: 1 });
13294
+ const canNormalize = (ct == null ? void 0 : ct.target) === active ? hasResidualOriginal && hasNoLiveDragDelta : Math.abs(Math.abs(rawScaleX) - 1) > 1e-4 || Math.abs(Math.abs(rawScaleY) - 1) > 1e-4;
13295
+ if (canNormalize) {
13296
+ active.set({ scaleX: 1, scaleY: 1 });
13261
13297
  active.setCoords();
13262
13298
  if (ct && ct.target === active && ct.original) {
13263
13299
  ct.original.scaleX = 1;
13264
13300
  ct.original.scaleY = 1;
13265
- ct.original.width = newW;
13266
- ct.original.height = newH;
13267
13301
  }
13268
13302
  }
13269
13303
  } catch {
@@ -14109,6 +14143,9 @@ const PageCanvas = forwardRef(
14109
14143
  if (activeObj.__lastPointerForCrop) {
14110
14144
  delete activeObj.__lastPointerForCrop;
14111
14145
  }
14146
+ if (activeObj.__cornerResizeStart) {
14147
+ delete activeObj.__cornerResizeStart;
14148
+ }
14112
14149
  }
14113
14150
  if (!didTransformRef.current) {
14114
14151
  editLockRef.current = false;
@@ -25167,9 +25204,9 @@ function captureFabricCanvasSvgForPdf(fabricInstance, canvasWidth, canvasHeight)
25167
25204
  }
25168
25205
  return svgString;
25169
25206
  }
25170
- const resolvedPackageVersion = "0.5.407";
25207
+ const resolvedPackageVersion = "0.5.409";
25171
25208
  const PACKAGE_VERSION = resolvedPackageVersion;
25172
- const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.407";
25209
+ const DEPLOYMENT_VERSION_MARKER = "__PIXLDOCS_CANVAS_RENDERER_VERSION__:0.5.409";
25173
25210
  const roundParityValue = (value) => {
25174
25211
  if (typeof value !== "number") return value;
25175
25212
  return Number.isFinite(value) ? Number(value.toFixed(3)) : value;
@@ -25983,7 +26020,7 @@ class PixldocsRenderer {
25983
26020
  await this.waitForCanvasScene(container, cloned, i);
25984
26021
  }
25985
26022
  console.log(`[canvas-renderer][pdf-unified] mounted ${cloned.pages.length} page(s), handing off to client exportMultiPagePdf`);
25986
- const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-DuXVrbKW.js");
26023
+ const { exportMultiPagePdf, preparePagesForExport } = await import("./vectorPdfExport-BZbppXw8.js");
25987
26024
  const prepared = preparePagesForExport(
25988
26025
  cloned.pages,
25989
26026
  canvasWidth,
@@ -28303,7 +28340,7 @@ async function prepareLiveCanvasSvgForPdf(rawSvg, pageWidth, pageHeight, pageKey
28303
28340
  if (options == null ? void 0 : options.stripPageBackground) stripRootPageBackgroundFromSvg(svgToDraw);
28304
28341
  sanitizeSvgTreeForPdf(svgToDraw);
28305
28342
  try {
28306
- const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-DuXVrbKW.js");
28343
+ const { bakeTextAnchorPositionsFromLiveSvg, logTextMeasurementDiagnostic } = await import("./vectorPdfExport-BZbppXw8.js");
28307
28344
  try {
28308
28345
  await logTextMeasurementDiagnostic(svgToDraw);
28309
28346
  } catch {
@@ -28703,4 +28740,4 @@ export {
28703
28740
  buildTeaserBlurFlatKeys as y,
28704
28741
  collectFontDescriptorsFromConfig as z
28705
28742
  };
28706
- //# sourceMappingURL=index-Dxlbnksl.js.map
28743
+ //# sourceMappingURL=index-DAOxGNQt.js.map